remarque-tokens 0.15.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 +2 -0
- package/CHANGELOG.md +59 -0
- package/README.md +8 -4
- package/REMARQUE.md +165 -0
- package/broadsheet.css +441 -0
- package/package.json +4 -1
- package/print.css +30 -0
- package/tokens.d.ts +1 -1
- package/tokens.json +1 -1
package/AGENT_RULES.md
CHANGED
|
@@ -142,6 +142,7 @@ project/
|
|
|
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
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)
|
|
145
146
|
├── print.css # Print stylesheet (own subpath, NOT aggregated — import explicitly)
|
|
146
147
|
├── theme.css # Tailwind v4 adapter (@theme inline) — import after tailwindcss + tokens
|
|
147
148
|
├── tailwind.config.js # Tailwind v3 ONLY — v4 projects use theme.css instead
|
|
@@ -203,6 +204,7 @@ Before considering any implementation complete, verify:
|
|
|
203
204
|
- [ ] Every image has a 1px border and mono caption
|
|
204
205
|
- [ ] Every page maps to an archetype (Essay, Dossier, Notebook, Landing, Reference/Docs, Changelog, Gallery)
|
|
205
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`
|
|
206
208
|
- [ ] Mobile version is roomy — not a compressed desktop layout
|
|
207
209
|
- [ ] Mobile nav links have ≥44px touch targets
|
|
208
210
|
- [ ] No pure white or pure black backgrounds
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,65 @@ 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.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
|
+
|
|
7
66
|
## 0.15.0 — 2026-07-23
|
|
8
67
|
|
|
9
68
|
Essay module — sidenotes + sticky TOC rail, graduated from the flagship (closes #52).
|
package/README.md
CHANGED
|
@@ -133,9 +133,10 @@ 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
|
|
@@ -143,7 +144,10 @@ examples: measure compensation and the Gallery archetype graduated; the essay
|
|
|
143
144
|
sidenotes/sticky-TOC-rail pair graduated as an optional module
|
|
144
145
|
([#52](https://github.com/williamzujkowski/remarque/issues/52)); the theme deck was
|
|
145
146
|
re-scoped on the way up ([#56](https://github.com/williamzujkowski/remarque/issues/56));
|
|
146
|
-
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.
|
|
147
151
|
|
|
148
152
|
**Standing rulings** (ratified 3-0, 2026-07-23) on patterns the reviews kept re-flagging:
|
|
149
153
|
|
package/REMARQUE.md
CHANGED
|
@@ -556,6 +556,7 @@ The homepage or entry point. Sets the tone.
|
|
|
556
556
|
- Recent entries or updates (3–5 max)
|
|
557
557
|
- A brief "about" line
|
|
558
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
|
|
559
560
|
|
|
560
561
|
**Never includes:**
|
|
561
562
|
- Hero images or banners
|
|
@@ -774,6 +775,170 @@ applied so the next consumer doesn't rediscover it.
|
|
|
774
775
|
|
|
775
776
|
---
|
|
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
|
+
|
|
777
942
|
## Signature Moves
|
|
778
943
|
|
|
779
944
|
These are the repeatable visual tells that make a Remarque site recognizable:
|
package/broadsheet.css
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Remarque — Broadsheet Pattern (masthead, lead, entry list, post kicker)
|
|
3
|
+
* ────────────────────────────────────────────────────────────────────
|
|
4
|
+
* Four editorial-layout primitives for Landing/archive contexts — the
|
|
5
|
+
* typography-maximalist end of the system. Newspaper-broadsheet voice:
|
|
6
|
+
* a nameplate, a featured lead story, a numbered contents list, and a
|
|
7
|
+
* post-header kicker line, built entirely from tokens already shipped
|
|
8
|
+
* in tokens-core.css / tokens-palette.css.
|
|
9
|
+
*
|
|
10
|
+
* PROVENANCE — graduated, not invented here. Validated downstream on
|
|
11
|
+
* williamzujkowski.github.io (landing PR #213, archive/tag/post-header
|
|
12
|
+
* PR #214), ratified for upstreaming in issue #36. Source: `astro-site/
|
|
13
|
+
* src/components/BroadsheetEntry.astro` + `global.css`'s "Broadsheet
|
|
14
|
+
* layout" block. As with the essay module (#52), no site-specific
|
|
15
|
+
* literal was copied — every dimension below is re-derived from this
|
|
16
|
+
* package's own tokens; see the inline comments for the value-by-value
|
|
17
|
+
* mapping and the few places the re-expression corrects the source
|
|
18
|
+
* (`text-transform: uppercase` -> `font-variant-caps: all-small-caps`,
|
|
19
|
+
* per REMARQUE.md "Small Caps", predates that rule same as essay.css's
|
|
20
|
+
* TOC summary did) or simplifies it (font-weight 300 has no Remarque
|
|
21
|
+
* core token; the italic/lede treatments below lean on color + style
|
|
22
|
+
* alone rather than introduce an un-tokenized weight).
|
|
23
|
+
*
|
|
24
|
+
* Own subpath (remarque-tokens/broadsheet, remarque-tokens/broadsheet.css)
|
|
25
|
+
* — NOT included by the tokens.css aggregator: the Landing/archive
|
|
26
|
+
* pattern is opt-in, most Remarque pages want none of it. Import
|
|
27
|
+
* explicitly, after prose.css if both are in use:
|
|
28
|
+
* @import 'remarque-tokens/broadsheet.css';
|
|
29
|
+
* (string form — see AGENT_RULES.md Pitfall #6.)
|
|
30
|
+
*
|
|
31
|
+
* ─── MARKUP CONTRACT (summary — full version in REMARQUE.md) ──────────
|
|
32
|
+
*
|
|
33
|
+
* <header class="remarque-masthead">
|
|
34
|
+
* <p class="remarque-masthead-kicker"><span>Field Notes</span></p>
|
|
35
|
+
* <h1 class="remarque-masthead-title">Quiet <em>Signals</em></h1>
|
|
36
|
+
* <p class="remarque-masthead-dateline">
|
|
37
|
+
* <span class="remarque-rule" aria-hidden="true"></span>
|
|
38
|
+
* <span>July 23, 2026</span>
|
|
39
|
+
* <span class="remarque-rule" aria-hidden="true"></span>
|
|
40
|
+
* </p>
|
|
41
|
+
* </header>
|
|
42
|
+
*
|
|
43
|
+
* <article class="remarque-lead">
|
|
44
|
+
* <p class="remarque-lead-kicker">
|
|
45
|
+
* <span class="remarque-lead-section">Essay</span>
|
|
46
|
+
* <span class="remarque-dot" aria-hidden="true">·</span>
|
|
47
|
+
* <span>8 min read</span>
|
|
48
|
+
* <span class="remarque-dot" aria-hidden="true">·</span>
|
|
49
|
+
* <time datetime="2026-04-08">Apr 8, 2026</time>
|
|
50
|
+
* </p>
|
|
51
|
+
* <h2 class="remarque-lead-title"><a href="/writing/x">Title</a></h2>
|
|
52
|
+
* <p class="remarque-lead-lede">Lede paragraph...</p>
|
|
53
|
+
* </article>
|
|
54
|
+
*
|
|
55
|
+
* <ul class="remarque-entry-list">
|
|
56
|
+
* <li class="remarque-entry">
|
|
57
|
+
* <span class="remarque-entry-numeral" data-entry-number="2"
|
|
58
|
+
* aria-hidden="true"></span>
|
|
59
|
+
* <div class="remarque-entry-body">
|
|
60
|
+
* <p class="remarque-entry-kicker">...</p>
|
|
61
|
+
* <h3 class="remarque-entry-title"><a href="/writing/y">Title</a></h3>
|
|
62
|
+
* <p class="remarque-entry-excerpt">Excerpt...</p>
|
|
63
|
+
* </div>
|
|
64
|
+
* </li>
|
|
65
|
+
* </ul>
|
|
66
|
+
*
|
|
67
|
+
* <header class="remarque-post-header">
|
|
68
|
+
* <p class="remarque-post-kicker">
|
|
69
|
+
* <span class="remarque-post-kicker-section">Essay</span>
|
|
70
|
+
* <span class="remarque-dot" aria-hidden="true">·</span>
|
|
71
|
+
* <span>8 min read</span>
|
|
72
|
+
* <span class="remarque-dot" aria-hidden="true">·</span>
|
|
73
|
+
* <time datetime="2026-04-08">Apr 8, 2026</time>
|
|
74
|
+
* </p>
|
|
75
|
+
* <h1 class="text-display font-display">Post Title</h1>
|
|
76
|
+
* </header>
|
|
77
|
+
*
|
|
78
|
+
* `<ul>` (not `<ol>`), deliberately, for the entry list: the visual
|
|
79
|
+
* numeral is decorative (`aria-hidden`, generated from `data-entry-
|
|
80
|
+
* number` via `attr()` — see below), and an `<ol>` would have screen
|
|
81
|
+
* readers announce "1 of 2" alongside it, doubling up on the same
|
|
82
|
+
* information in two voices. Matches the flagship's own choice.
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
/* ─── Shared meta-voice bits ─────────────────────────────────────────
|
|
86
|
+
* Every kicker/dateline row below repeats these declarations rather
|
|
87
|
+
* than depending on `.text-label` as a mixin (tokens-core.css) — same
|
|
88
|
+
* non-mixin precedent as essay.css's TOC summary. All-small-caps, not
|
|
89
|
+
* `text-transform: uppercase` (REMARQUE.md "Small Caps": faux uppercase
|
|
90
|
+
* renders at cap-height with no optical correction; the flagship
|
|
91
|
+
* predates that rule and used `text-transform: uppercase` throughout
|
|
92
|
+
* this pattern). `--text-meta` (14px), not `--text-micro` (13px) — the
|
|
93
|
+
* words in a kicker ("Essay", "Field Notes") are read as content, not
|
|
94
|
+
* bare timestamps/fine print, the same distinction essay.css's sidenote
|
|
95
|
+
* marker already draws against the 13px floor. Tabular lining figures
|
|
96
|
+
* on every numeral here (dates, counts) per REMARQUE.md's Numerals
|
|
97
|
+
* rule — never mixed with the oldstyle register `.remarque-entry-
|
|
98
|
+
* numeral` uses below for the same reason `.text-meta` carries it.
|
|
99
|
+
*/
|
|
100
|
+
.remarque-masthead-kicker,
|
|
101
|
+
.remarque-masthead-dateline,
|
|
102
|
+
.remarque-lead-kicker,
|
|
103
|
+
.remarque-entry-kicker,
|
|
104
|
+
.remarque-post-kicker {
|
|
105
|
+
font-family: var(--font-mono);
|
|
106
|
+
font-size: var(--text-meta);
|
|
107
|
+
line-height: var(--leading-meta);
|
|
108
|
+
font-variant-caps: all-small-caps;
|
|
109
|
+
font-variant-numeric: tabular-nums lining-nums;
|
|
110
|
+
letter-spacing: var(--tracking-caps);
|
|
111
|
+
color: var(--color-muted);
|
|
112
|
+
margin: 0;
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
flex-wrap: wrap;
|
|
115
|
+
align-items: center;
|
|
116
|
+
gap: 0.5em;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.remarque-dot {
|
|
120
|
+
color: var(--color-border-bold);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.remarque-lead-section,
|
|
124
|
+
.remarque-entry-section,
|
|
125
|
+
.remarque-post-kicker-section {
|
|
126
|
+
color: var(--color-accent);
|
|
127
|
+
font-weight: var(--weight-medium);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Hairline flanking the masthead dateline — decorative only, so a
|
|
131
|
+
1px border-color rule (not -bold) is the right register; nothing
|
|
132
|
+
depends on it as a boundary. */
|
|
133
|
+
.remarque-rule {
|
|
134
|
+
display: inline-block;
|
|
135
|
+
width: var(--space-6);
|
|
136
|
+
height: var(--border-width);
|
|
137
|
+
background: var(--color-border-bold);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Hairline divider between broadsheet sections (masthead/lead/entry-list) */
|
|
141
|
+
.remarque-broadsheet-rule {
|
|
142
|
+
max-width: var(--content-reading);
|
|
143
|
+
margin: var(--space-6) auto;
|
|
144
|
+
border: 0;
|
|
145
|
+
border-top: var(--border-width) var(--border-style) var(--color-border);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* ─── 1. Masthead ─────────────────────────────────────────────────────
|
|
149
|
+
* The nameplate. Centered, oversized, the one place in Remarque a
|
|
150
|
+
* title outgrows `--text-display` (tokens-core.css's largest type-
|
|
151
|
+
* scale rung, clamp(2.75rem, 5.5vw, 5rem)) — a Landing masthead is a
|
|
152
|
+
* register above even a Landing page's own `<h1>`.
|
|
153
|
+
*
|
|
154
|
+
* FLUID-TYPE DECISION (issue #36's required call): the existing scale
|
|
155
|
+
* does not reach the flagship's validated clamp(3.5rem, 9vw, 7.5rem).
|
|
156
|
+
* Rather than assert those as bare literals (or add a new core
|
|
157
|
+
* `--text-masthead` token, which the issue explicitly rules out), this
|
|
158
|
+
* is a documented, file-scoped fluid exception whose min/max BOUNDS are
|
|
159
|
+
* arithmetic on core spacing tokens already in tokens-core.css — not
|
|
160
|
+
* new constants:
|
|
161
|
+
* min = --space-7 (3rem) + --space-2 (0.5rem) = 3.5rem
|
|
162
|
+
* max = --space-10 (8rem) - --space-2 (0.5rem) = 7.5rem
|
|
163
|
+
* both resolve to the exact flagship values that were already
|
|
164
|
+
* validated (contrast/gamut/font-floor audits + axe) downstream. The
|
|
165
|
+
* 9vw fluid rate is kept as-is: it continues the same escalating-per-
|
|
166
|
+
* tier vw progression tokens-core.css's own scale already uses
|
|
167
|
+
* (2.25vw section -> 3.5vw title -> 5.5vw display), one step further
|
|
168
|
+
* for a register one step past display. This custom property lives
|
|
169
|
+
* here, not in tokens-core.css — it is NOT a new core token, it is
|
|
170
|
+
* local arithmetic on existing ones, scoped to this opt-in pattern.
|
|
171
|
+
*/
|
|
172
|
+
.remarque-masthead {
|
|
173
|
+
--remarque-masthead-size: clamp(
|
|
174
|
+
calc(var(--space-7) + var(--space-2)),
|
|
175
|
+
9vw,
|
|
176
|
+
calc(var(--space-10) - var(--space-2))
|
|
177
|
+
);
|
|
178
|
+
max-width: var(--content-reading);
|
|
179
|
+
margin: var(--space-8) auto var(--space-6);
|
|
180
|
+
text-align: center;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.remarque-masthead-title {
|
|
184
|
+
font-family: var(--font-display);
|
|
185
|
+
font-size: var(--remarque-masthead-size);
|
|
186
|
+
/* Reuses --leading-display/--tracking-display rather than the
|
|
187
|
+
flagship's bespoke 0.92/-0.035em — a fully tokenized simplification
|
|
188
|
+
at a scale where the difference is not perceptible at normal
|
|
189
|
+
reading distance. */
|
|
190
|
+
line-height: var(--leading-display);
|
|
191
|
+
letter-spacing: var(--tracking-display);
|
|
192
|
+
/* Same --weight-display escape hatch .text-display/.text-title use
|
|
193
|
+
(tokens-core.css) — a palette can compensate thin serif hairlines
|
|
194
|
+
in dark mode (tokens-palette.css already does, 400 light / 500
|
|
195
|
+
dark) and the masthead picks that up for free. */
|
|
196
|
+
font-weight: var(--weight-display, var(--weight-regular));
|
|
197
|
+
color: var(--color-fg);
|
|
198
|
+
margin: 0;
|
|
199
|
+
font-feature-settings: "liga" 1, "kern" 1;
|
|
200
|
+
font-optical-sizing: auto;
|
|
201
|
+
font-synthesis: none;
|
|
202
|
+
text-wrap: balance;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.remarque-masthead-title em {
|
|
206
|
+
font-style: italic;
|
|
207
|
+
color: var(--color-fg-muted);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.remarque-masthead-dateline {
|
|
211
|
+
margin-block-start: var(--space-4);
|
|
212
|
+
justify-content: center;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* ─── 2. Lead Article ─────────────────────────────────────────────────
|
|
216
|
+
* The featured story below the masthead (or standing alone atop an
|
|
217
|
+
* archive). Title register: --text-display reaches close enough to
|
|
218
|
+
* the flagship's clamp(2.25rem, 4.5vw, 3.75rem) (2.75-5rem vs.
|
|
219
|
+
* 2.25-3.75rem) that no exception is needed here — "express via
|
|
220
|
+
* existing type tokens" (issue #36), the masthead above is the one
|
|
221
|
+
* register that genuinely doesn't fit.
|
|
222
|
+
*/
|
|
223
|
+
.remarque-lead {
|
|
224
|
+
max-width: var(--content-reading);
|
|
225
|
+
margin: var(--space-7) auto var(--space-6);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.remarque-lead-kicker {
|
|
229
|
+
margin-block-end: var(--space-3);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.remarque-lead-title {
|
|
233
|
+
font-family: var(--font-display);
|
|
234
|
+
font-size: var(--text-display);
|
|
235
|
+
line-height: var(--leading-display);
|
|
236
|
+
letter-spacing: var(--tracking-display);
|
|
237
|
+
font-weight: var(--weight-display, var(--weight-regular));
|
|
238
|
+
margin: 0 0 var(--space-4);
|
|
239
|
+
text-wrap: balance;
|
|
240
|
+
font-optical-sizing: auto;
|
|
241
|
+
font-synthesis: none;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.remarque-lead-title a,
|
|
245
|
+
.remarque-entry-title a {
|
|
246
|
+
color: var(--color-fg);
|
|
247
|
+
text-decoration: none;
|
|
248
|
+
/* Underline-grow hover (issue #36 "Findings"): AA-compliant, and
|
|
249
|
+
reduced-motion-safe for free — tokens-core.css zeroes
|
|
250
|
+
--motion-normal under prefers-reduced-motion, so this needs no
|
|
251
|
+
separate @media guard the way an opacity/transform animation
|
|
252
|
+
would. --motion-easing/--motion-normal replace the flagship's
|
|
253
|
+
hardcoded `220ms ease`. */
|
|
254
|
+
background-image: linear-gradient(var(--color-fg), var(--color-fg));
|
|
255
|
+
background-size: 0 1px;
|
|
256
|
+
background-repeat: no-repeat;
|
|
257
|
+
background-position: 0 95%;
|
|
258
|
+
transition: background-size var(--motion-normal) var(--motion-easing);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.remarque-lead-title a:hover,
|
|
262
|
+
.remarque-lead-title a:focus-visible,
|
|
263
|
+
.remarque-entry-title a:hover,
|
|
264
|
+
.remarque-entry-title a:focus-visible {
|
|
265
|
+
background-size: 100% 1px;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.remarque-lead-lede {
|
|
269
|
+
font-family: var(--font-display);
|
|
270
|
+
font-size: var(--text-body-lg);
|
|
271
|
+
line-height: var(--leading-body);
|
|
272
|
+
font-style: italic;
|
|
273
|
+
font-weight: var(--weight-regular);
|
|
274
|
+
color: var(--color-fg-muted);
|
|
275
|
+
margin: 0;
|
|
276
|
+
text-wrap: pretty;
|
|
277
|
+
hanging-punctuation: first last;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Drop cap on italic text needs an explicit ::first-letter override
|
|
281
|
+
(issue #36 "Findings") — it cannot just inherit italic from the
|
|
282
|
+
parent's font-style the way a roman-text drop cap can, since this
|
|
283
|
+
pseudo-element re-asserts every typographic property of its own.
|
|
284
|
+
Same mechanics/sizing as prose.css's `.remarque-prose--dropcap`
|
|
285
|
+
(3.5em / 0.85 line-height / initial-letter progressive enhancement)
|
|
286
|
+
for one consistent drop-cap voice across the system, rather than a
|
|
287
|
+
second bespoke number. */
|
|
288
|
+
.remarque-lead-lede::first-letter {
|
|
289
|
+
font-family: var(--font-display);
|
|
290
|
+
font-style: italic;
|
|
291
|
+
font-weight: var(--weight-display, var(--weight-regular));
|
|
292
|
+
font-size: 3.5em;
|
|
293
|
+
line-height: 0.85;
|
|
294
|
+
float: left;
|
|
295
|
+
padding: 0.08em 0.12em 0 0;
|
|
296
|
+
color: var(--color-fg);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
@supports (initial-letter: 4) or (-webkit-initial-letter: 4) {
|
|
300
|
+
.remarque-lead-lede::first-letter {
|
|
301
|
+
initial-letter: 3.5;
|
|
302
|
+
-webkit-initial-letter: 3.5;
|
|
303
|
+
float: none;
|
|
304
|
+
padding: 0 0.08em 0 0;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* ─── 3. Numbered Entry List ──────────────────────────────────────────
|
|
309
|
+
* `container-type: inline-size` — the 2-column/1-column collapse below
|
|
310
|
+
* responds to how much room the list itself has, not the viewport (a
|
|
311
|
+
* clean fit for a container query, matching the flagship's choice; it
|
|
312
|
+
* degrades correctly if this list is ever embedded in a narrower
|
|
313
|
+
* column than the page itself).
|
|
314
|
+
*/
|
|
315
|
+
.remarque-entry-list {
|
|
316
|
+
container-type: inline-size;
|
|
317
|
+
max-width: var(--content-reading);
|
|
318
|
+
margin: 0 auto;
|
|
319
|
+
padding: 0;
|
|
320
|
+
list-style: none;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.remarque-entry {
|
|
324
|
+
display: grid;
|
|
325
|
+
/* Numeral column sized in `ch` (intrinsic to the numeral glyphs
|
|
326
|
+
themselves), not an asserted rem literal — the flagship's
|
|
327
|
+
`minmax(3.5rem, 5rem)` re-expressed as "just wide enough for the
|
|
328
|
+
content," the more typographically disciplined choice per
|
|
329
|
+
REMARQUE.md's Decision Protocol when a core token doesn't already
|
|
330
|
+
cover a dimension. */
|
|
331
|
+
grid-template-columns: minmax(2.5ch, 4ch) 1fr;
|
|
332
|
+
gap: var(--space-4);
|
|
333
|
+
padding: var(--space-5) 0;
|
|
334
|
+
border-bottom: var(--border-width) var(--border-style) var(--color-border);
|
|
335
|
+
align-items: start;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.remarque-entry:last-child {
|
|
339
|
+
border-bottom: 0;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* Oldstyle italic numerals in the outer margin, generated from
|
|
343
|
+
`data-entry-number` via `attr()` — NOT CSS `counter()` (issue #36
|
|
344
|
+
"Findings": counter-generated content does not receive the OpenType
|
|
345
|
+
oldstyle-figure treatment reliably across Newsreader's weights, only
|
|
346
|
+
real text/attr() content does). `attr()` reads from the element the
|
|
347
|
+
pseudo-content is generated on, so `data-entry-number` lives on
|
|
348
|
+
`.remarque-entry-numeral` itself, not the parent `<li>`. Both
|
|
349
|
+
`font-variant-numeric: oldstyle-nums proportional-nums` AND
|
|
350
|
+
`font-feature-settings: "onum" 1, "pnum" 1` are required together
|
|
351
|
+
for reliable rendering across weights — either alone is
|
|
352
|
+
inconsistent (issue #36 "Findings"). */
|
|
353
|
+
.remarque-entry-numeral {
|
|
354
|
+
display: block;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.remarque-entry-numeral::before {
|
|
358
|
+
content: attr(data-entry-number);
|
|
359
|
+
font-family: var(--font-display);
|
|
360
|
+
font-style: italic;
|
|
361
|
+
font-size: var(--text-title);
|
|
362
|
+
line-height: 0.95;
|
|
363
|
+
color: var(--color-border-bold);
|
|
364
|
+
font-variant-numeric: oldstyle-nums proportional-nums;
|
|
365
|
+
font-feature-settings: "onum" 1, "pnum" 1;
|
|
366
|
+
text-align: right;
|
|
367
|
+
display: block;
|
|
368
|
+
padding-block-start: 0.1em;
|
|
369
|
+
user-select: none;
|
|
370
|
+
transition: color var(--motion-normal) var(--motion-easing);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.remarque-entry:hover .remarque-entry-numeral::before,
|
|
374
|
+
.remarque-entry:focus-within .remarque-entry-numeral::before {
|
|
375
|
+
color: var(--color-accent);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.remarque-entry-body {
|
|
379
|
+
min-width: 0; /* allow the grid child to shrink below its content's intrinsic width */
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.remarque-entry-kicker {
|
|
383
|
+
margin-block-end: var(--space-2);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.remarque-entry-title {
|
|
387
|
+
font-family: var(--font-display);
|
|
388
|
+
font-size: var(--text-section);
|
|
389
|
+
line-height: var(--leading-section);
|
|
390
|
+
letter-spacing: var(--tracking-title);
|
|
391
|
+
font-weight: var(--weight-medium);
|
|
392
|
+
margin: 0 0 var(--space-2);
|
|
393
|
+
text-wrap: balance;
|
|
394
|
+
font-optical-sizing: auto;
|
|
395
|
+
font-synthesis: none;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.remarque-entry-excerpt {
|
|
399
|
+
font-family: var(--font-body);
|
|
400
|
+
font-size: var(--text-body);
|
|
401
|
+
line-height: var(--leading-body);
|
|
402
|
+
color: var(--color-fg-muted);
|
|
403
|
+
margin: 0;
|
|
404
|
+
text-wrap: pretty;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* Collapse to one column on a narrow container — `40rem`, exactly
|
|
408
|
+
`--space-10` (8rem) x 5. Container-query conditions can't reference
|
|
409
|
+
custom properties or `calc()` (unlike a plain declaration value, the
|
|
410
|
+
condition itself is parsed before the cascade resolves custom
|
|
411
|
+
properties, and Lightning CSS's minifier rejects a `calc()` there
|
|
412
|
+
outright) so this is spelled as the literal it resolves to, with the
|
|
413
|
+
token-multiple noted here rather than in the syntax — matches the
|
|
414
|
+
flagship's own `640px` breakpoint exactly. */
|
|
415
|
+
@container (max-width: 40rem) {
|
|
416
|
+
.remarque-entry {
|
|
417
|
+
grid-template-columns: 1fr;
|
|
418
|
+
gap: var(--space-2);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.remarque-entry-numeral::before {
|
|
422
|
+
text-align: left;
|
|
423
|
+
font-size: var(--text-section);
|
|
424
|
+
padding-block-start: 0;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* ─── 4. Post-Header Kicker ───────────────────────────────────────────
|
|
429
|
+
* The mono "Section · Reading time · Date" line above an individual
|
|
430
|
+
* post's title — the same kicker voice as the lead/entry rows above,
|
|
431
|
+
* scaled down to a single-line header. Pair with any Remarque heading
|
|
432
|
+
* class (`.text-display`, `.text-title`); this rule only styles the
|
|
433
|
+
* kicker line itself, not the title beneath it.
|
|
434
|
+
*/
|
|
435
|
+
.remarque-post-header {
|
|
436
|
+
margin-block-end: var(--space-7);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.remarque-post-kicker {
|
|
440
|
+
margin-block-end: var(--space-3);
|
|
441
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remarque-tokens",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=18"
|
|
6
6
|
},
|
|
@@ -70,6 +70,8 @@
|
|
|
70
70
|
"./print.css": "./print.css",
|
|
71
71
|
"./essay": "./essay.css",
|
|
72
72
|
"./essay.css": "./essay.css",
|
|
73
|
+
"./broadsheet": "./broadsheet.css",
|
|
74
|
+
"./broadsheet.css": "./broadsheet.css",
|
|
73
75
|
"./agent-rules": "./AGENT_RULES.md",
|
|
74
76
|
"./spec": "./REMARQUE.md",
|
|
75
77
|
"./package.json": "./package.json"
|
|
@@ -95,6 +97,7 @@
|
|
|
95
97
|
"prose.css",
|
|
96
98
|
"print.css",
|
|
97
99
|
"essay.css",
|
|
100
|
+
"broadsheet.css",
|
|
98
101
|
"scripts/lib/css-tokens.mjs"
|
|
99
102
|
]
|
|
100
103
|
}
|
package/print.css
CHANGED
|
@@ -23,6 +23,13 @@
|
|
|
23
23
|
* promise above — the essay module's own default (non-`@media`) CSS
|
|
24
24
|
* already IS the narrow-viewport inline mode, so this rule only needs to
|
|
25
25
|
* cancel the `>= 80rem` float, not author a print-specific layout.
|
|
26
|
+
*
|
|
27
|
+
* Broadsheet pattern (remarque-tokens/broadsheet.css, issue #36): the
|
|
28
|
+
* masthead/lead/entry-list nameplate register is tuned for a screen
|
|
29
|
+
* nameplate, not a printed page — a `--remarque-masthead-size` up to
|
|
30
|
+
* 7.5rem would burn most of a sheet on one word. Capped in point sizes
|
|
31
|
+
* here, matching this file's existing `body { font-size: 11pt; }`
|
|
32
|
+
* convention, rather than left to inherit the fluid clamp on paper.
|
|
26
33
|
*/
|
|
27
34
|
|
|
28
35
|
@page {
|
|
@@ -113,6 +120,9 @@
|
|
|
113
120
|
.content-standard,
|
|
114
121
|
.content-wide,
|
|
115
122
|
.remarque-essay,
|
|
123
|
+
.remarque-masthead,
|
|
124
|
+
.remarque-lead,
|
|
125
|
+
.remarque-entry-list,
|
|
116
126
|
main {
|
|
117
127
|
max-width: 100% !important;
|
|
118
128
|
margin-inline: 0 !important;
|
|
@@ -122,6 +132,26 @@
|
|
|
122
132
|
display: block !important;
|
|
123
133
|
}
|
|
124
134
|
|
|
135
|
+
/* ─── Broadsheet: collapse the nameplate register ──────────────
|
|
136
|
+
* The fluid masthead/lead titles are a screen-only nameplate voice
|
|
137
|
+
* (issue #36) — cap them in points like the rest of this file's
|
|
138
|
+
* print type scale instead of printing at their full on-screen size. */
|
|
139
|
+
.remarque-masthead-title {
|
|
140
|
+
font-size: 28pt !important;
|
|
141
|
+
line-height: 1.15 !important;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.remarque-lead-title {
|
|
145
|
+
font-size: 18pt !important;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Entry numerals stay legible but no longer decorative-hover-scaled;
|
|
149
|
+
the hover-only accent color never applies in print anyway (no
|
|
150
|
+
pointer), this just guards the static color explicitly. */
|
|
151
|
+
.remarque-entry-numeral::before {
|
|
152
|
+
color: oklch(0.4 0 0) !important;
|
|
153
|
+
}
|
|
154
|
+
|
|
125
155
|
body {
|
|
126
156
|
font-size: 11pt;
|
|
127
157
|
line-height: 1.5;
|
package/tokens.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Remarque design tokens — GENERATED from tokens.json by
|
|
3
|
-
* scripts/tokens-json.mjs (v0.
|
|
3
|
+
* scripts/tokens-json.mjs (v0.16.0). Do not edit — the CSS
|
|
4
4
|
* (tokens-core.css + tokens-palette.css) is the source of truth;
|
|
5
5
|
* tokens.json is the intermediate machine-readable form this file is
|
|
6
6
|
* generated from. Regenerate with: node scripts/tokens-json.mjs
|
package/tokens.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
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
3
|
"$extensions": {
|
|
4
4
|
"remarque": {
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.16.0",
|
|
6
6
|
"tiers": {
|
|
7
7
|
"core": "immutable identity — overriding forks the system",
|
|
8
8
|
"palette": "sanctioned personalization surface — override freely, then run remarque-audit"
|