sheleg-design-skill 1.2.0 → 1.3.2

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/CHANGELOG.md CHANGED
@@ -4,6 +4,59 @@ All notable changes to this project are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions
5
5
  follow [SemVer](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.3.2] - 2026-07-30
8
+
9
+ ### Changed
10
+
11
+ - **The licence is declared in both manifests** — SPDX `license: MIT` in the
12
+ `marketplace.json` plugin entry and in the skill's front matter (mirrored into
13
+ the `.cursor` copy, which the validator holds byte-identical). The `LICENSE`
14
+ file was always present and visible on neither surface a user actually reads.
15
+
16
+ ## [1.3.1] - 2026-07-30
17
+
18
+ ### Changed
19
+
20
+ - **README** — the family list gained `agent-sync`, and the install block now
21
+ carries all three family commands (`install`, `update`, `list`) with the
22
+ restart note; skills and hooks load at session start, so the session that
23
+ updates is not the session that gets the new ones. The registry copy of the
24
+ README is what most people read, and it only moves on a release.
25
+ - `CONTRIBUTING.md` — how to run `test/validate.py` and what a PR is checked
26
+ against.
27
+
28
+ ## [1.3.0] - 2026-07-29
29
+
30
+ ### Added
31
+
32
+ - **Fourth style pack: `briefing-room`** — a register the skill had no answer
33
+ for. Decks are among the most-requested things people ask an agent to build,
34
+ and the default output is bullet lists on a gradient. Extracted from a
35
+ production investor-deck site (2026) by reading its live token layer; the
36
+ source is **anonymized at the owner's request**, so the `Origin:` line says
37
+ what it is without naming it — the values are still extracted rather than
38
+ invented, which is the point of the rule.
39
+
40
+ What it encodes: a fixed **1280×720 canvas with `overflow: hidden`** (content
41
+ that does not fit becomes a second slide — never a smaller type ramp); the
42
+ first **OKLCH** token layer in the skill, where every neutral is the accent
43
+ hue `254` starved of chroma, so the palette cannot drift into two designs;
44
+ Inter at tight optical tracking against JetBrains Mono furniture at `+0.14em`
45
+ to `+0.18em`; a two-part veil that protects text over artwork **without**
46
+ fading the artwork; 1-bit dithered art as the only imagery; mono numbered
47
+ section headers; **the slide title is a claim, not a label**; one bespoke
48
+ diagram per slide instead of bullets; exactly one highlighted phrase per
49
+ deck; and every number carrying its source.
50
+
51
+ Its motion position is a deliberate inversion of the rest of the skill:
52
+ **slides never animate**, because the presenter's voice is the timeline.
53
+ `prefers-reduced-motion` is a no-op by construction rather than by neglect.
54
+
55
+ Two honest notes carried as Gotchas: a fixed canvas fails *silently* (clipped
56
+ content is invisible in review and obvious in the room), and the reference
57
+ shipped no print or reduced-motion branch — the pack requires both.
58
+ - `scenarios.md` gains T10 for the deck register. Gate: 194 → 220 checks.
59
+
7
60
  ## [1.2.0] - 2026-07-29
8
61
 
9
62
  Worked through Figma's *State of the Designer 2026* (NewtonX, 906 digital
package/README.md CHANGED
@@ -34,15 +34,18 @@ and collectively cinematic. One scroll "clock" feeds a WebGL particle field, a
34
34
  rail — each an independent, degrade-to-calm layer. Nothing crossfades; things
35
35
  *redeploy*.
36
36
 
37
- **Style packs** — the visual identity, pluggable per project. The `workbench`
38
- pack is meant to be used **standalone**, with none of the motion layer: quiet
39
- light/dark product UI for dashboards, admin panels, internal and dev tools.
37
+ **Style packs** — the visual identity, pluggable per project. Two of them are
38
+ meant to be used **standalone**, with none of the motion layer: `workbench`
39
+ (quiet light/dark product UI for dashboards, admin panels, internal and dev
40
+ tools) and `briefing-room` (a dark 16:9 presentation deck, where the presenter's
41
+ voice is the timeline and slides therefore never animate).
40
42
 
41
43
  | Pack | Look | Choose for |
42
44
  |---|---|---|
43
45
  | `instrument-console` | near-black aerospace console, one electric-blue signal, mono telemetry | technical / systems / infra |
44
46
  | `editorial-luxury` | warm cream + espresso ink, sage accent, Fraunces/Newsreader, dossier motifs | editorial / research / premium B2B |
45
47
  | `workbench` | neutral grays, borders as elevation, one blue accent, mono data, light + dark twins | dashboards, admin, internal & dev tools |
48
+ | `briefing-room` | dark 16:9 deck: one blue hue top to bottom (OKLCH), mono slide furniture, 1-bit dithered art, claims as titles | investor & board decks, technical briefings, talks published as a page |
46
49
 
47
50
  Each pack locks palette, type, texture, motion tokens, signature motifs and
48
51
  bans — and ships a `tokens/<pack>.css` to copy verbatim, so the agent never
@@ -212,13 +215,19 @@ Built by ssheleg — [sshlg.me](https://sshlg.me)
212
215
  - Telegram — [@sshlg](https://t.me/sshlg)
213
216
 
214
217
  Part of the [ssheleg skill family](https://github.com/ssheleg/sshlg-skills):
215
- `super-ux`, `task-pipeline`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
216
- One command installs all five for every agent you use:
218
+ `super-ux`, `task-pipeline`, `agent-sync`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
219
+ **The family installs and updates as one package**, for every agent you use — a bundle with one
220
+ member current and the rest stale is a combination nobody tested:
217
221
 
218
222
  ```bash
219
- npx sshlg-skills install
223
+ npx sshlg-skills install # nothing installed yet — the whole family, any agent
224
+ npx sshlg-skills update # installed but behind — updates everything
225
+ npx --yes sshlg-skills@latest list # what the current release of each member is
220
226
  ```
221
227
 
228
+ Restart your agent afterwards: skills and hooks load at session start, so the session that
229
+ updates is not the session that gets the new ones.
230
+
222
231
  ## License
223
232
 
224
233
  MIT © ssheleg
package/bin/cli.js CHANGED
@@ -115,10 +115,11 @@ ${c("bold", "What it installs")}
115
115
  SHELEG_DESIGN.md the full reference (architecture, recipes, why it works)
116
116
  FIGMA_BRIDGE.md the design↔code contract (tokens ⇄ Figma variables)
117
117
  AI_PRODUCT_PATTERNS.md chat / agent / streaming surfaces (honest state)
118
- styles/ three style packs — instrument-console (dark console),
118
+ styles/ four style packs — instrument-console (dark console),
119
119
  editorial-luxury (warm editorial), workbench (light/dark
120
- product UI, standalone) plus a ready-made token CSS
121
- per pack and STYLE_PACK_TEMPLATE.md for authoring more
120
+ product UI), briefing-room (dark 16:9 presentation deck)
121
+ plus a ready-made token CSS per pack and
122
+ STYLE_PACK_TEMPLATE.md for authoring more
122
123
  `);
123
124
  }
124
125
 
@@ -191,7 +192,7 @@ function main() {
191
192
  `\n${c("green", "✓")} ${c("bold", "SHELEG Design")} installed to ${c("blue", rel + "/")}\n` +
192
193
  ` ${c("dim", "SKILL.md")} the agent skill\n` +
193
194
  ` ${c("dim", "SHELEG_DESIGN.md")} the full reference\n` +
194
- ` ${c("dim", "styles/")} style packs + token CSS (instrument-console / editorial-luxury / workbench)\n\n` +
195
+ ` ${c("dim", "styles/")} style packs + token CSS (instrument-console / editorial-luxury / workbench / briefing-room)\n\n` +
195
196
  `Your Cursor / Claude agent can now discover the skill and build\n` +
196
197
  `cinematic, scroll-driven pages — or style product UI (dashboards,\n` +
197
198
  `admin, internal tools) from the workbench pack — on its principles.\n\n` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.2.0",
3
+ "version": "1.3.2",
4
4
  "description": "Design taste as an installable agent skill. Cinematic scroll-driven landing pages built on one scroll clock and layered degrade-to-calm motion, plus three locked style packs with ready-made design tokens — instrument-console (dark), editorial-luxury (warm), workbench (light/dark product UI for dashboards, admin and dev tools). Works with Cursor, Claude Code and any agent that reads a SKILL.md.",
5
5
  "bin": {
6
6
  "sheleg-design-skill": "bin/cli.js"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sheleg-design",
3
3
  "description": "SHELEG Design methodology: cinematic scroll-driven landing pages (single scroll clock, layered degrade-to-calm motion, WebGL particle formations) plus pluggable visual style packs — instrument-console (dark console), editorial-luxury (warm editorial), workbench (light/dark product UI for dashboards and tools). Ships the sheleg-design skill, the architecture reference, style packs with ready-made token CSS, and the /sheleg-design command.",
4
- "version": "1.2.0",
4
+ "version": "1.3.2",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: sheleg-design
3
3
  description: Use when building or upgrading a cinematic scroll-driven landing page, marketing site, or hero experience (particle/WebGL background, scroll-linked animation, parallax, scrubbed sections) — when such a page feels busy or janky or its motion layers drift out of sync — or when styling product UI with its style packs - dashboards, admin panels, internal/dev tools, design tokens, light/dark themes - or when carrying a visual system across the Figma border (publishing tokens as variables, implementing a design without importing raw values). Triggers - "cinematic landing" / "кинематографичный лендинг", "scroll animation" / "скролл-анимация", "particle landing" / "лендинг с частицами", "dashboard style" / "стиль дашборда", "design tokens" / "дизайн-токены", "light/dark theme" / "светлая/тёмная тема", "figma variables" / "переменные фигмы", "figma to code" / "фигма в код", "chat/agent UI" / "интерфейс чата или агента", "streaming output" / "стриминг ответа".
4
+ license: MIT
4
5
  ---
5
6
 
6
7
  # SHELEG Design
@@ -62,6 +63,7 @@ style pack in [`styles/`](./styles/):
62
63
  | [`instrument-console`](./styles/instrument-console.md) | near-black aerospace console, one electric-blue signal, mono telemetry | technical / systems / infra products |
63
64
  | [`editorial-luxury`](./styles/editorial-luxury.md) | warm cream + espresso ink, sage accent, Fraunces/Newsreader, dossier motifs | editorial / research / premium B2B |
64
65
  | [`workbench`](./styles/workbench.md) | quiet light/dark product UI: neutral grays, borders as elevation, one blue accent, mono data | dashboards / admin / internal & dev tools (standalone — no cinematic motion) |
66
+ | [`briefing-room`](./styles/briefing-room.md) | dark presentation deck on a fixed 16:9 canvas: one blue hue top to bottom (OKLCH), mono slide furniture, 1-bit dithered art | investor & board decks, technical briefings, talks published as a page (standalone — slides never animate) |
65
67
 
66
68
  Read the chosen pack in full before styling anything — it supplies the
67
69
  palette, type, texture, motion-token values, signature motifs, and bans.
@@ -0,0 +1,156 @@
1
+ # Style pack — Briefing Room
2
+
3
+ Origin: a production investor-deck site (2026); every value below was read off
4
+ its live token layer, not eyeballed. The source is **anonymized at the owner's
5
+ request** — the values are extracted from a real system, the name simply isn't
6
+ public. Near-black field tinted with a single blue hue, one electric accent,
7
+ mono slide furniture, 1-bit dithered artwork. It reads like a technical
8
+ briefing: the room is dark, one thing is lit.
9
+
10
+ ## Register
11
+
12
+ Choose this pack for **presentations rendered as a product**: investor and
13
+ board decks, technical briefings, launch memos, architecture walkthroughs,
14
+ conference talks published as a page. Used **standalone** — the SHELEG
15
+ cinematic motion layer does not apply, because a deck is *read at the
16
+ presenter's pace*, not scrolled. Single dark register; the accent carries all
17
+ emphasis.
18
+
19
+ The defining constraint is the canvas: a fixed **1280×720 (16:9) frame with
20
+ `overflow: hidden`**, not a flowing page. Everything below follows from that —
21
+ if content cannot fit the frame, the answer is a second slide, never a smaller
22
+ type ramp.
23
+
24
+ ## Palette
25
+
26
+ Ready-made token layer: [`tokens/briefing-room.css`](./tokens/briefing-room.css)
27
+ — copy it verbatim instead of transcribing this table.
28
+
29
+ | Token | Value | Role |
30
+ |---|---|---|
31
+ | `--bg` | `oklch(0.045 0.008 254)` | the room (near-black, blue-tinted) |
32
+ | `--panel` / `-2` | `oklch(0.145 0.008 254)` / `oklch(0.178 0.008 254)` | card / raised card |
33
+ | `--line` / `-2` | `oklch(0.231 0.006 254)` / `oklch(0.269 0.006 254)` | hairline / stronger edge |
34
+ | `--ink` | `oklch(0.985 0.004 254)` | display and primary text |
35
+ | `--ink-2` / `-3` / `-dim` | `oklch(0.80 …)` / `oklch(0.62 …)` / `oklch(0.56 0.006 254)` | body / muted / furniture |
36
+ | `--accent` | `oklch(0.643 0.195 254)` | THE signal — one per slide |
37
+ | `--accent-soft` / `-line` | `accent / 0.18` / `accent / 0.45` | chip fill / chip border |
38
+ | `--accent-ink` | `= --bg` | text **on** the accent (never white) |
39
+ | `--good` (`-soft`) | `oklch(0.824 0.151 148)` (`/0.30`) | the one positive semantic |
40
+
41
+ Two things make this palette cohere, and both are easy to lose:
42
+
43
+ - **One hue, top to bottom.** Every neutral carries hue `254` at chroma
44
+ 0.004–0.008. They are not gray — they are the accent, starved of chroma. Swap
45
+ in true neutrals and the deck immediately looks like two designs.
46
+ - **OKLCH, not hex.** Lightness is perceptual, so a ramp built by moving `L`
47
+ alone stays even; tints are the same color with an alpha, never a new swatch.
48
+ Ship a hex fallback layer only if you must support pre-2023 browsers.
49
+
50
+ Contrast: `--ink-dim` is for slide furniture (numbers, footers) at ≥10.5px mono
51
+ only — never body copy.
52
+
53
+ ## Type
54
+
55
+ - Display + body: **Inter** — weight 600 for display, 500 for slide titles,
56
+ 400 body. Tight optical tracking: `-0.04em` at display, `-0.03em` at title,
57
+ `-0.005em` at body.
58
+ - Furniture: **JetBrains Mono** at 10.5–13px, uppercase, tracked **`+0.14em`
59
+ to `+0.18em`** — section headers, footers, source lines, chip labels. The
60
+ wide tracking is doing the work here; mono at normal tracking reads as code,
61
+ not as instrumentation.
62
+ - Scale (fixed canvas, so fixed px): `128 / 96 / 64 / 36 / 24 / 17 / 14 / 13 /
63
+ 10.5`. Line height `1.02` display, `1.05` head, `1.5` lede, `1.55` body.
64
+ - `text-wrap: balance` on every display and title — on a fixed canvas a
65
+ one-word orphan is a visible defect, not a nuance.
66
+
67
+ ## Texture & surface
68
+
69
+ - Elevation is **surface step + hairline**, never a glow. One card shadow
70
+ exists (`0 28px 70px -28px rgba(0,0,0,0.85)`) and it is for lifted cards on
71
+ the dark field; a second, tighter one for popovers.
72
+ - Radii `4 / 6 / 12 / 18 / 24 / 999`. Chips and pills take 999; cards take
73
+ 12–18; the frame itself is square.
74
+ - 4px spacing grid **with deliberate half-steps** (18, 22, 36) — dense
75
+ information layouts need the in-between values, and inventing them per slide
76
+ is how a deck loses its rhythm.
77
+ - **Artwork is 1-bit dithered/halftone, never a photo or a 3D render.** A
78
+ single large dithered form per cover, in the accent, sitting under the text.
79
+ - Text over artwork is protected by a **two-part veil**: a directional
80
+ `linear-gradient(95deg, …)` from 0.85 to near-transparent, plus a radial
81
+ darkening in the corner where the text sits. Never lower the artwork's
82
+ opacity to fix legibility — veil the art, keep the art crisp.
83
+ - One radial accent glow per slide at most: `radial-gradient(58% 46% at 50%
84
+ 26%, var(--accent-soft), transparent 70%)`.
85
+
86
+ ## Motion tokens
87
+
88
+ - Durations `0.15s` / `0.2s`; ease `cubic-bezier(0.22, 1, 0.36, 1)`. That is
89
+ the whole set — this pack overrides the SHELEG default ease, same as
90
+ `editorial-luxury`.
91
+ - **Slides do not animate.** No transitions between slides, no build-in
92
+ sequences, no scroll-linked anything: the presenter's voice is the timeline,
93
+ and motion competes with it. Transitions exist only on interactive
94
+ affordances (links, focus).
95
+ - `prefers-reduced-motion` is a no-op here by construction — which is the
96
+ correct end state, not an excuse to skip the branch.
97
+
98
+ ## Signature motifs
99
+
100
+ - **The slide frame as furniture:** mono uppercase header (`[04] MARKET · WHY
101
+ NOW`), body, mono footer. Numbered sections make a 40-minute deck navigable
102
+ by voice ("go back to four").
103
+ - **The title is a claim, not a label.** Every slide's headline is a full
104
+ sentence asserting something ("Financial access is already global; the gap is
105
+ guidance") — never a noun like "Market". The claim is the argument; the
106
+ diagram below is its evidence.
107
+ - **One bespoke diagram per slide, never a bullet list.** The recurring set:
108
+ opposing poles with the gap named between them; a staged flow with hairline
109
+ connectors; a positioning map with two labeled axes and dot nodes; lanes or a
110
+ funnel for a money path; a comparison table with one column marked as *us*;
111
+ an allocation bar with a legend.
112
+ - **Highlight exactly one phrase per deck** — an accent-filled marker behind
113
+ the single sentence fragment the whole story hangs on, with `--accent-ink`
114
+ text on it. A second highlight halves the first.
115
+ - **Every number carries its source** in mono, directly beneath it. An
116
+ unsourced figure on an investor slide is a liability, and the source line is
117
+ also what makes the layout read as instrumentation.
118
+ - Chips (`999` radius, panel-2 fill, hairline border) for enumerations that
119
+ would otherwise become bullets.
120
+
121
+ ## Micro-interactions
122
+
123
+ - The deck is presented, so interaction is deliberately thin: hover only on
124
+ genuine links, focus-visible ring in `--accent`, no hover state on static
125
+ cards (a card that lifts under a cursor during a live presentation is noise).
126
+ - Keyboard navigation between slides is the one interaction worth building
127
+ well; the slide number in the footer is the position indicator.
128
+
129
+ ## Bans
130
+
131
+ - Bullet lists as the default slide layout; stock photography; illustrations
132
+ with a mascot; icon grids where a diagram belongs.
133
+ - Gradients as decoration (the veil and the one accent glow are the exceptions,
134
+ and they are functional).
135
+ - A second accent hue; true-neutral grays alongside the tinted ones; white text
136
+ on the accent fill.
137
+ - Animated slide transitions, build-ins, scroll-jacking, particle backgrounds —
138
+ wrong register entirely; that is what `instrument-console` is for.
139
+ - Numbers without sources; more than one highlighted phrase per deck; shrinking
140
+ the type ramp to fit content into a frame.
141
+
142
+ ## Gotchas
143
+
144
+ - **A fixed canvas fails silently.** `overflow: hidden` means overflowing
145
+ content is simply invisible — nobody sees it in review, everybody sees the
146
+ gap in the room. Check every slide at exactly 1280×720 before shipping, not
147
+ at whatever the browser window happens to be.
148
+ - **The reference shipped no print or reduced-motion branch.** A deck gets
149
+ exported to PDF and read on a phone; add a print stylesheet (one slide per
150
+ page, veil intact) and a narrow-viewport branch that reflows the frame rather
151
+ than scaling it into illegibility.
152
+ - OKLCH renders differently on wide-gamut displays than the sRGB hex you may be
153
+ comparing against — verify on the screen the deck will actually be presented
154
+ on, which is usually a projector with a narrower gamut than your laptop.
155
+ - Dithered artwork must be exported at 2× and left unscaled in CSS; resampling
156
+ a 1-bit image destroys the dither pattern and turns it into mud.
@@ -0,0 +1,118 @@
1
+ /* SHELEG Design — Briefing Room token layer (dark presentation deck).
2
+ Copy verbatim; consume only var(--…) in components.
3
+ Neutrals are the accent hue (254) starved of chroma — keep the hue when
4
+ editing, or the deck reads as two designs. */
5
+ :root {
6
+ --bg: oklch(0.045 0.008 254);
7
+ --panel: oklch(0.145 0.008 254);
8
+ --panel-2: oklch(0.178 0.008 254);
9
+ --line: oklch(0.231 0.006 254);
10
+ --line-2: oklch(0.269 0.006 254);
11
+
12
+ --ink: oklch(0.985 0.004 254);
13
+ --ink-2: oklch(0.8 0.006 254);
14
+ --ink-3: oklch(0.62 0.006 254);
15
+ --ink-dim: oklch(0.56 0.006 254); /* furniture only, ≥10.5px mono */
16
+
17
+ --accent: oklch(0.643 0.195 254);
18
+ --accent-soft: oklch(0.643 0.195 254 / 0.18); /* chip fill, glow */
19
+ --accent-line: oklch(0.643 0.195 254 / 0.45); /* chip border */
20
+ --accent-ink: var(--bg); /* text ON the accent — never white */
21
+ --good: oklch(0.824 0.151 148);
22
+ --good-soft: oklch(0.824 0.151 148 / 0.3);
23
+
24
+ --radius-xs: 4px;
25
+ --radius-sm: 6px;
26
+ --radius-md: 12px;
27
+ --radius-lg: 18px;
28
+ --radius-xl: 24px;
29
+ --radius-pill: 999px;
30
+
31
+ /* 4px grid with deliberate half-steps for dense slide layouts */
32
+ --space-1: 4px;
33
+ --space-2: 8px;
34
+ --space-3: 12px;
35
+ --space-4: 16px;
36
+ --space-4-5: 18px;
37
+ --space-5: 20px;
38
+ --space-5-5: 22px;
39
+ --space-6: 24px;
40
+ --space-8: 32px;
41
+ --space-9: 36px;
42
+ --space-10: 40px;
43
+ --space-12: 48px;
44
+ --space-14: 56px;
45
+ --space-16: 64px;
46
+ --space-20: 80px;
47
+
48
+ /* Fixed 16:9 canvas — content that does not fit becomes a second slide */
49
+ --slide-w: 1280px;
50
+ --slide-h: 720px;
51
+ --frame-pad-x: var(--space-20);
52
+ --frame-pad-y: var(--space-16);
53
+
54
+ --shadow-card: 0 28px 70px -28px rgba(0, 0, 0, 0.85);
55
+ --shadow-pop: 0 12px 32px -12px rgba(0, 0, 0, 0.7);
56
+ --glow-accent: radial-gradient(
57
+ 58% 46% at 50% 26%,
58
+ var(--accent-soft),
59
+ transparent 70%
60
+ );
61
+ /* Veil the artwork, never fade it: keeps the dither crisp under text */
62
+ --veil-left: linear-gradient(
63
+ 95deg,
64
+ oklch(0 0 0 / 0.85) 0%,
65
+ oklch(0 0 0 / 0.55) 38%,
66
+ oklch(0 0 0 / 0.2) 70%,
67
+ oklch(0 0 0 / 0.05) 100%
68
+ );
69
+
70
+ --font-sans: "Inter", "Helvetica Neue", Helvetica, Arial, sans-serif;
71
+ --font-mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
72
+
73
+ --t-display: 128px;
74
+ --t-h1: 96px;
75
+ --t-h2: 64px;
76
+ --t-h3: 36px;
77
+ --t-lede: 24px;
78
+ --t-body: 17px;
79
+ --t-meta: 14px;
80
+ --t-mono: 13px;
81
+ --t-mono-sm: 10.5px;
82
+
83
+ --track-display: -0.04em;
84
+ --track-h1: -0.035em;
85
+ --track-h2: -0.03em;
86
+ --track-h3: -0.02em;
87
+ --track-body: -0.005em;
88
+ --track-mono: 0.14em; /* mono without tracking reads as code, not telemetry */
89
+ --track-mono-wide: 0.18em;
90
+
91
+ --lh-display: 1.02;
92
+ --lh-head: 1.05;
93
+ --lh-tight: 1.1;
94
+ --lh-lede: 1.5;
95
+ --lh-body: 1.55;
96
+
97
+ --weight-regular: 400;
98
+ --weight-medium: 500;
99
+ --weight-semibold: 600;
100
+ --weight-bold: 700;
101
+
102
+ --motion-ease: cubic-bezier(0.22, 1, 0.36, 1);
103
+ --dur-fast: 0.15s;
104
+ --dur-base: 0.2s;
105
+
106
+ background-color: var(--bg);
107
+ color: var(--ink);
108
+ color-scheme: dark;
109
+ }
110
+
111
+ /* Slides never animate — the presenter is the timeline. This block should
112
+ have nothing to disable; if it does, the deck has motion it should not. */
113
+ @media (prefers-reduced-motion: reduce) {
114
+ :root {
115
+ --dur-fast: 0s;
116
+ --dur-base: 0s;
117
+ }
118
+ }