sheleg-design-skill 1.57.0 → 1.58.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/CHANGELOG.md CHANGED
@@ -6,6 +6,92 @@ follow [SemVer](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.58.0] - 2026-08-30
10
+
11
+ ### The catalogue stops being the one surface nobody designed, and two blind reads land
12
+
13
+ **The site is now built from a pack.** The two generators behind
14
+ `ssheleg.github.io/sheleg-design-skill` carried **sixty-seven colour literals**
15
+ between them — a dark-only scheme that appears in no pack, answers no
16
+ `prefers-color-scheme`, and had never been through the contrast gate every pack must
17
+ pass. A library that ships thirty-nine measured token layers and paints its own
18
+ catalogue in an undocumented one is arguing against itself.
19
+
20
+ `tools/chrome.py` is the shell now: it inlines `styles/tokens/workbench.css`
21
+ **verbatim** and the site's own CSS consumes `var(--…)` and nothing else.
22
+ `workbench` for two checkable reasons — it is the library's stated default for
23
+ product UI, which is what a catalogue is, and it is one of only two packs shipping a
24
+ full `[data-theme="dark"]` twin, which a public page needs. The theme follows the
25
+ pack's own written instruction (*"keep one switch, never two sources of truth"*): a
26
+ `prefers-color-scheme` listener sets `data-theme`, and the two `theme-color` meta
27
+ tags are **derived** from the layer's `--bg` rather than typed. `no_literals()` runs
28
+ on every build and in `npm test`, so this cannot rot back.
29
+
30
+ The site's links honour the pack rather than override it: `--accent` is declared
31
+ `@role non-text` at 4.30:1, so a link is `--ink` wearing an accent underline, and
32
+ hover thickens the rule instead of recolouring the word.
33
+
34
+ **The front door had been publishing 39 blank cards.** `tools/gallery.py` parsed the
35
+ pack catalogue out of `SKILL.md` long after that table moved to
36
+ `STYLE_PACK_INDEX.md`. The regex matched nothing, `look` and `for` came back empty
37
+ for **every** pack, and the live site shipped *"Choose for"* followed by silence on
38
+ all thirty-nine — with the JSON-LD `ItemList` descriptions and the `llms.txt`
39
+ entries empty behind it. Nothing failed, because an empty string is a valid string.
40
+ Fixed, and the parse is now asserted: a run that finds no catalogue rows stops
41
+ instead of publishing a catalogue with no prose in it.
42
+
43
+ ### Scenario T37 ran, both branches passed, and cost 29 findings
44
+
45
+ Written on 2026-08-30 with its debt stated; run the same day once subagents were
46
+ available. Both branches blind against the bundle directory, both correct — `T37a`
47
+ reached `chorus` from a quoted-thread brief, `T37b` **stayed on `surveyor`** from an
48
+ enterprise-tracker brief, which is the failure a positive-only branch cannot detect.
49
+
50
+ **Twelve of `T37a`'s sixteen findings on `chorus` are fixed here.** The three that
51
+ mattered were invisible to every gate:
52
+
53
+ - `--on-status` stayed at its root white inside the slab block, putting **white on
54
+ the mint at 1.32:1** — in the one surface the pack invented the mint for. The
55
+ comment above that block said it owed "two tokens" while the block changed five.
56
+ It now re-declares six, and the count is stated.
57
+ - The slab's overrides **inherited into light descendants**: a white card nested in a
58
+ slab took a white hairline and re-admitted the mint the pack's own Bans forbid on
59
+ paper. A nested light surface takes its tokens back.
60
+ - The Responsive section's opening sentence contradicted its own table two lines
61
+ below: *"768 and 1440 differ only in the frame, not in the type"*, against a table
62
+ giving the display 40px at 768 and 56px at 1440.
63
+
64
+ Also: `--track-h2-sm` now exists for the narrow section head the Responsive table
65
+ asks for; the Delta chip's "wash" is two real tokens (`--good-weak`,
66
+ `--danger-weak`); the provenance legend names the family it actually uses
67
+ (**PACK DECISION**, and no SELECTED); one ratio was wrong (`--parchment` on `--bg` is
68
+ 1.14:1, not 1.15); "a factor of three" was 2.8; the eyebrow was two objects with two
69
+ sizes; three things were called a pill and none of them used `--r-pill`; and the
70
+ slab hook is now the library's own unprefixed `[data-surface="slab"]` — chorus had
71
+ been the only pack you could not A/B by swapping the token layer alone.
72
+
73
+ **One of `T37b`'s thirteen findings on `surveyor` is fixed here**, because it is an
74
+ accessibility hole with a one-token remedy: `--focus-color` is `--action`, and
75
+ `#0a7269` on the pack's own `--accent` closer panel measures **1.55:1** — under the
76
+ 3:1 mark floor, on the surface carrying the final CTA. `[data-surface="accent"]` now
77
+ re-declares the ring to the pack's `--bg` at 3.54:1. The other eight are verified and
78
+ filed as B-137 for the pack's author, per the B-134/B-135 precedent.
79
+
80
+ **Both branches found the same third-party defect, and neither pack could have
81
+ caught it.** `MOTION_DOCTRINE.md` called `bulletin` at 3 *"the lowest ceiling in the
82
+ library"* — false for four releases, while four packs pin **2**. Corrected, and
83
+ `validate_motion_ceiling_floor()` now recomputes both the minimum and the count from
84
+ the packs' own Register lines; it was watched failing against a planted 3 before it
85
+ went green.
86
+
87
+ ### Ledgers
88
+
89
+ B-136 closed. B-137 and B-138 opened with the verified remainder. `REQ-CHORUS-3`
90
+ moves off `never`, taking the ledger from two `never` rows to one. The `chorus`
91
+ acceptance record's REQ-10/11/12 are closed against receipts — including the one
92
+ that is only **partly** met and says so: the launcher's pin still names v1.54.0,
93
+ because that repository holds ~2,100 lines of another session's uncommitted work.
94
+
9
95
  ## [1.57.0] - 2026-08-30
10
96
 
11
97
  ### The siblings are declared, the maps are derived, the descriptions stop scarring
@@ -5,8 +5,10 @@ category: Surfaces
5
5
  The dark band cut into the paper: `--slab` at `--r-panel`, inset `--slab-inset` (30px,
6
6
  measured against the viewport rather than a parent), full width otherwise.
7
7
 
8
- It carries `data-chorus-surface="slab"`, which is what re-declares `--focus-color`,
9
- `--line` and the three status tokens inside it. That re-declaration is not decoration:
8
+ It carries `data-surface="slab"` the library's own unprefixed hook, so this pack
9
+ can be A/B'd against any other by swapping the token layer alone — and that
10
+ attribute is what re-declares the six tokens that would otherwise resolve to a
11
+ light-field value on a dark ground. That re-declaration is not decoration:
10
12
  the ink focus ring measures 1.00:1 against `--slab` and would vanish on the band that
11
13
  carries the closing CTA.
12
14
 
@@ -8,7 +8,7 @@ export interface SlabProps {
8
8
  export function Slab({ children, className }: SlabProps) {
9
9
  return (
10
10
  <section
11
- data-chorus-surface="slab"
11
+ data-surface="slab"
12
12
  className={['ch-slab', className].filter(Boolean).join(' ')}
13
13
  >
14
14
  {children}
@@ -39,10 +39,16 @@
39
39
 
40
40
  MEASURED — the literal was computed on the live page or read from an authored
41
41
  Framer token that the census confirmed paints.
42
- SELECTED — a value the reference ships in another role, taken because a floor
43
- forces the move; only the role changes.
44
42
  DERIVED — computed from a token here because the reference's own value fails a
45
43
  floor. Hue is held; lightness moves and chroma is clipped to gamut.
44
+ PACK DECISION — a value the reference does not carry at all, so there was
45
+ nothing to measure. Two of them, and both are named where they sit: the
46
+ mirrored cut corner, which the reference ships in one direction only, and the
47
+ state clock, because the reference's controls compute to 0s.
48
+
49
+ There is no SELECTED family here. The reference offers no darker step of its own
50
+ in any hue that fails, so every correction below had to be DERIVED — which is
51
+ the opposite of `surveyor`, whose whole remedy was its reference's own ladder.
46
52
 
47
53
  The corrections are in the pack's Gotchas, and there are six. */
48
54
 
@@ -150,6 +156,13 @@
150
156
  --danger: #d03950;
151
157
  --info: #1167f4;
152
158
  --on-status: #ffffff; /* 4.84:1 on --good, 4.79:1 on --danger, 4.92:1 on --info */
159
+ /* The delta chip's ground. The reference paints its rose at two alphas over the
160
+ field (10% and 15%); the green wash is the same construction at the same
161
+ alpha, which is a PACK DECISION stated rather than a measurement implied.
162
+ @role non-text: --good-weak, --danger-weak — a tint under a figure that
163
+ carries its own solid; nothing is written ON them. */
164
+ --good-weak: rgba(25, 132, 0, 0.1);
165
+ --danger-weak: rgba(208, 57, 80, 0.1);
153
166
 
154
167
  /* ---- Status on the slab: a separate ladder, and the mint lives only here */
155
168
  /* MEASURED on the dark wells. The mint is the identity of the reading — 36
@@ -215,7 +228,10 @@
215
228
  --focus-w: 2px;
216
229
  --focus-offset: 2px;
217
230
  --focus-color: var(--ink-strong);
218
- --focus-color-on-dark: var(--paper); /* 16.54:1 on --slab */
231
+ /* It points at the ink token rather than at --paper: a ring on the dark IS ink,
232
+ and two names for one value is what this file's own coral comment argues
233
+ against. The ratio it has to clear is the one --on-slab already states. */
234
+ --focus-color-on-dark: var(--on-slab);
219
235
 
220
236
  /* ---- Radii: a measured ladder, and one corner that is not there -------- */
221
237
  /* MEASURED across the census: 8px on a badge, 10px on a chip and eyebrow, 12px
@@ -240,8 +256,13 @@
240
256
  --r-bubble: 24px 0 24px 24px;
241
257
  --r-bubble-mirror: 0 24px 24px 24px;
242
258
 
243
- /* ---- Spacing: a 4-based ladder and a 100px section -------------------- */
244
- /* MEASURED. The card's padding is 32px and its internal gap is 32px, and
259
+ /* ---- Spacing: the measured steps, named by their step number ---------- */
260
+ /* The suffix is the ladder's INDEX, not the value in quarters `--space-10`
261
+ is the tenth step and it is 32px. That is worth stating because the values
262
+ are the reference's own measured gaps (4, 6, 8, 10, 12, 16, 24, 32, 40, 100)
263
+ and two of them are not multiples of four, so no arithmetic reading of the
264
+ name survives contact with the ladder. Read the comment, not the number.
265
+ MEASURED. The card's padding is 32px and its internal gap is 32px, and
245
266
  NEITHER CHANGES at 390 — the card keeps desktop padding on a 350px sheet,
246
267
  which is a deliberate property of the reference and is stated in Responsive.
247
268
  The section rhythm is 100px at desktop. */
@@ -310,6 +331,9 @@
310
331
  --track-display: -0.0625em; /* MEASURED — -3.5px at 56px */
311
332
  --track-display-sm: -0.025em; /* MEASURED — -1px at 40px; it RELAXES */
312
333
  --track-h2: -0.032em; /* MEASURED — -1.4px at 44px */
334
+ --track-h2-sm: -0.025em; /* MEASURED — -1px at 34px, the narrow section head.
335
+ It exists because the Responsive table asks for it: a size step with no
336
+ tracking token forces the literal this library bans everywhere else. */
313
337
  --track-quote: -0.02em; /* MEASURED — -0.48px at 24px */
314
338
 
315
339
  --weight-body: 400;
@@ -339,11 +363,21 @@
339
363
  line-height: var(--lh-body);
340
364
  }
341
365
 
342
- /* The slab is a surface, not a theme — the page never inverts. What it does owe
343
- is the two tokens that would fail silently on it: the focus ring, which is ink
344
- and therefore invisible #1b181c on #1b181c is 1.00:1 and the rule ink. */
366
+ /* The slab is a surface, not a theme — the page never inverts. The hook is the
367
+ library's own `[data-surface]`, unprefixed: every other surface-variant pack in
368
+ this collection uses that attribute, and the index's selection protocol says to
369
+ compare candidates by changing the token layer alone. A namespaced hook would
370
+ have made chorus the one pack you cannot A/B without editing the markup, which
371
+ is a cost paid by every reader to buy nothing. `.chorus-slab` is kept beside it
372
+ as an alias, because a class is what a component library reaches for.
373
+
374
+ What the block owes is every token that would otherwise resolve to a light-field
375
+ value on a dark ground. There are SIX, and the count is stated because the first
376
+ version of this block listed two, changed five, and left the sixth — --on-status
377
+ — at its root white, which put white on the mint at 1.32:1 inside the one
378
+ surface the pack invented the mint for. */
345
379
  .chorus-slab,
346
- [data-chorus-surface="slab"] {
380
+ [data-surface="slab"] {
347
381
  background-color: var(--slab);
348
382
  color: var(--on-slab);
349
383
  --focus-color: var(--focus-color-on-dark);
@@ -351,6 +385,24 @@
351
385
  --good: var(--good-on-dark);
352
386
  --danger: var(--danger-on-dark);
353
387
  --info: var(--info-on-dark);
388
+ /* The sixth. On the on-dark ladder the label is INK, not white: --slab on the
389
+ mint is 13.31:1, on the rose 6.01:1, on the periwinkle 7.40:1. White on those
390
+ three is 1.32:1, 2.93:1 and 2.38:1 — the first of them invisible. */
391
+ --on-status: var(--slab);
392
+ }
393
+
394
+ /* Custom properties inherit, and a slab is a section rather than a leaf: a white
395
+ card placed inside one would take the slab's white hairline and its mint, which
396
+ is the pack's own ban ("No mint on paper") arriving by inheritance. A light
397
+ surface nested in a slab therefore takes its tokens back. */
398
+ .chorus-slab :is(.ch-card, .ch-well--paper, [data-surface="paper"]),
399
+ [data-surface="slab"] :is(.ch-card, .ch-well--paper, [data-surface="paper"]) {
400
+ --focus-color: var(--ink-strong);
401
+ --line: rgba(70, 72, 77, 0.12);
402
+ --good: #198400;
403
+ --danger: #d03950;
404
+ --info: #1167f4;
405
+ --on-status: #ffffff;
354
406
  }
355
407
 
356
408
  /* The reference ships ZERO prefers-reduced-motion rules across 274KB. This block
@@ -152,6 +152,13 @@
152
152
  --focus-w: 2px;
153
153
  --focus-offset: 2px;
154
154
  --focus-color: var(--action);
155
+ /* The ring VANISHES on the one surface the pack fills with --accent: #0a7269 on
156
+ #0d9488 is 1.55:1, under the 3:1 mark floor, and the closer panel is where the
157
+ pack puts its final CTA. So the accent slab re-declares the ring in the pack's
158
+ own paper — #fff7f3 on #0d9488 is 3.54:1, over the floor. Found by a blind
159
+ read of the shipped pack, not by a gate: a token that resolves is a token the
160
+ gates accept, whatever it resolves to underneath. */
161
+ --focus-color-on-accent: var(--bg);
155
162
 
156
163
  /* ---- Radii: a 10px hand, a 24px card, a 32px panel ------------------- */
157
164
  /* MEASURED. The control is the se-uikit's own 10px on every button and
@@ -284,6 +291,13 @@ b {
284
291
  font-weight: var(--weight-heading);
285
292
  }
286
293
 
294
+ /* The closer panel is the pack's only saturated surface, and the only place the ink
295
+ ring cannot be seen. It is a SURFACE variant, not a theme: nothing else changes. */
296
+ [data-surface="accent"] {
297
+ background-color: var(--accent);
298
+ --focus-color: var(--focus-color-on-accent);
299
+ }
300
+
287
301
  /* ── components ── */
288
302
  /* Everything below consumes tokens only. The pack's rules in one place: the
289
303
  page is flat — elevation is a tint, the one shadow belongs to the detached
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.57.0",
3
+ "version": "1.58.0",
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, a motion doctrine that decides whether to animate before it decides how, three calibration dials, and thirty-nine locked style packs with ready-made design tokens — instrument-console, editorial-luxury, workbench, briefing-room, atrium, orchard, outrank, babylove, patchbay, nameplate, field-notes, cyclorama, showroom, blueprint, prism, maquette, scoreboard, datasheet, manpage, pigeonhole, roster, ora, tenor, paperclip, ledger, router, daylight, notation, almanac, vitrine, proscenium, awning, bulletin, rimlight, onionskin, deskmate, test-drive, surveyor and chorus. Colour, slop and fork-reciprocity gates run as scripts, not opinions. Works with Cursor, Claude Code and any agent that reads a SKILL.md.",
5
5
  "bin": {
6
6
  "sheleg-design-skill": "bin/cli.js"
@@ -19,7 +19,7 @@
19
19
  "node": ">=16"
20
20
  },
21
21
  "scripts": {
22
- "test": "python3 test/validate.py && python3 test/validate_palette.py && python3 test/sloplint.py && node --check bin/cli.js && node test/installer_test.js && npm run selftest",
22
+ "test": "python3 test/validate.py && python3 test/validate_palette.py && python3 test/sloplint.py && python3 tools/chrome.py && node --check bin/cli.js && node test/installer_test.js && npm run selftest",
23
23
  "validate": "python3 test/validate.py && python3 test/validate_palette.py && python3 test/sloplint.py",
24
24
  "smoke": "node bin/cli.js --help",
25
25
  "palette": "python3 test/validate_palette.py",
@@ -27,7 +27,9 @@
27
27
  "gen-descriptions": "python3 scripts/gen_manifest_descriptions.py --write",
28
28
  "gen-contents": "python3 scripts/gen_contents.py --write",
29
29
  "sloplint": "python3 test/sloplint.py",
30
- "selftest": "python3 test/validate.py --self-test && python3 test/validate_palette.py --self-test && python3 test/sloplint.py --self-test"
30
+ "selftest": "python3 test/validate.py --self-test && python3 test/validate_palette.py --self-test && python3 test/sloplint.py --self-test",
31
+ "site": "python3 tools/site.py --out _site",
32
+ "chrome": "python3 tools/chrome.py"
31
33
  },
32
34
  "keywords": [
33
35
  "skill",
@@ -2,7 +2,7 @@
2
2
  "name": "sheleg-design",
3
3
  "displayName": "SHELEG Design",
4
4
  "description": "SHELEG Design methodology: cinematic scroll-driven landing pages (single scroll clock, layered degrade-to-calm motion, WebGL particle formations), a motion doctrine that decides whether to animate before it decides how, and thirty-nine pluggable visual style packs, each with a ready-made token layer — instrument-console (near-black aerospace console; technical systems and infrastructure), editorial-luxury (cream and espresso; editorial, research, premium B2B), workbench (quiet light/dark UI; dashboards, admin, internal tools), briefing-room (dark 16:9 deck; investor and board presentations), atrium (cream daylight; consumer health and high-trust DTC), babylove (white with orange; SEO SaaS, long time-to-value, disconnected states), patchbay (black with mint-cyan; engines, buses, pipelines, OSS front doors), nameplate (cool slab with coral; press, certification and third-party trust), rimlight (white with blue light; studios, services and case studies), onionskin (white working sheet; developer and AI infrastructure), deskmate (warm beige with a dusk bleed; AI coworkers and chat-native agents), test-drive (warm paper with one coral; self-serve SaaS proven by the live product), surveyor (peach paper with teal and pink; visibility, monitoring and benchmark tools), chorus (warm paper under a crosshair grid, with a cut-corner bubble; AI-search visibility, brand monitoring and community marketing), outrank (white with violet; one brand across marketing and product), orchard (warm oat slabs; friendly biotech and wellness), field-notes (ruled green paper; auditable open-source developer tools), showroom (white gallery; product-led companies selling the app), blueprint (white technical stock; vector, storage and query infrastructure), prism (iridescent hard edge; command-first OSS infrastructure), maquette (near-black table; enterprise data infrastructure), cyclorama (looping pastel field; applied-AI consultancies), scoreboard (warm paper; growth, ads and accumulating metrics), datasheet (off-white specification; fraud, identity and device intelligence), manpage (cream manual; APIs, SDKs, CLIs and MCP servers), pigeonhole (filed white field; inbox, ticket and CRM triage), roster (faint square grid; platforms sold through who uses them), ora (warm coal; machine verdicts, audits and protocol traces), tenor (warm management paper; agent operations and autonomous back office), ledger (cream ruled console; analysts, BI and warehouse agents), paperclip (monochrome coal; orchestrators, schedulers and job runners), awning (white commerce forecourt; storefront, payroll and billing platforms), router (pale console with hairlines; dashboard, billing and inventory surfaces), daylight (bright portal with one shadow; client onboarding and service portals), notation (restrained technical hairlines; OSS, docs and developer workspaces), almanac (oatmeal editorial paper; manifestos and category-defining pages), vitrine (serif trust display; evaluated B2B, security and compliance), proscenium (white demo sequence; product tours and launch pages), bulletin (cheerful outlined bands; broad SMB and agency platforms). Ships the sheleg-design skill, the architecture reference, the motion doctrine, the Figma and Claude Design bridges, AI-surface patterns, the packs' token CSS, and the /sheleg-design command.",
5
- "version": "1.57.0",
5
+ "version": "1.58.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -353,10 +353,14 @@ parallax and `animation-timeline`; it keeps a sticky nav, which is the only diff
353
353
  **Four more standalone packs pin their own, and each states it in its own Register:**
354
354
  `ora` at **4**, `tenor` at **4**, `paperclip` at **5** — the last one higher because it
355
355
  is the only pack in the family that spends a native scroll-driven parallax —
356
- and `bulletin` at **3**, the lowest ceiling in the library, because its whole
357
- measured motion budget is an entrance fade, a 0.12s press and a 0.3s hover.
358
- Its depth is drawn as a hard ink offset rather than animated, and animating
359
- that offset is precisely what flattens it.
356
+ and `bulletin` at **3**, because its whole measured motion budget is an entrance
357
+ fade, a 0.12s press and a 0.3s hover. Its depth is drawn as a hard ink offset
358
+ rather than animated, and animating that offset is precisely what flattens it.
359
+ **The lowest ceiling in the library is 2**, and four of them pin it. This sentence
360
+ called `bulletin` the lowest for four releases while two others already sat under
361
+ it, which is why the number is now derived: `validate_motion_ceiling_floor()`
362
+ recomputes the minimum from the packs' own Register lines and fails when this
363
+ paragraph disagrees with them.
360
364
  `field-notes` is standalone **by default** and may opt into the cinematic layer — it carries a `## Motion flavor` section saying
361
365
  how — so it is the one standalone pack without a hard ceiling. Read that
362
366
  section before turning the dial up on it.
@@ -4,7 +4,7 @@ description: Use when deciding how something LOOKS or MOVES — cinematic landin
4
4
  license: MIT
5
5
  compatibility: Optional siblings — dataviz, shadcn, migrate-radix-to-base; each has an in-text fallback when absent.
6
6
  metadata:
7
- version: 1.57.0
7
+ version: 1.58.0
8
8
  ---
9
9
 
10
10
  # SHELEG Design
@@ -26,7 +26,7 @@ it.
26
26
 
27
27
  Contract: widened — all thirteen headings.
28
28
 
29
- Themes: light only — the dark slab is a SURFACE variant (`.chorus-slab`), not a theme twin; the page never inverts.
29
+ Themes: light only — the dark slab is a SURFACE variant (`[data-surface="slab"]`, with `.chorus-slab` as its class alias), not a theme twin; the page never inverts.
30
30
  Rank: unordered — 3 status role(s) and no severity ramp; a rank scale is yours.
31
31
 
32
32
  ## Contents
@@ -101,11 +101,13 @@ already talking. If the quoted words belong to your product, go there.
101
101
  Every value below is in
102
102
  [`tokens/chorus.css`](./tokens/chorus.css), which is the single home; this table
103
103
  documents roles. Provenance is marked per value in the token layer as MEASURED,
104
- SELECTED or DERIVED.
104
+ DERIVED or PACK DECISION. There is no SELECTED family here — the reference offers
105
+ no darker step of its own in any hue that fails, so every correction had to be
106
+ derived rather than promoted, which is the opposite of `surveyor`.
105
107
 
106
108
  | Token | Value | Role and the number that licenses it |
107
109
  |---|---|---|
108
- | `--bg` | `#fbfaf9` | The field. 16.99M px² of the census, the largest painted area by a factor of three. |
110
+ | `--bg` | `#fbfaf9` | The field. 16.99M px² of the census, 2.8× the next-largest painted area. |
109
111
  | `--surface` | `#ffffff` | Every card — 1.04:1 on `--bg`, which is the reference's entire card separation and the pack's first correction (see `--line`). |
110
112
  | `--paper` | `#faf8f0` | The cream well that holds a demo, and the 1050×682 hero deck. 1.06:1 on `--surface`. |
111
113
  | `--paper-deep` | `#f5f2e6` | The tinted 67px row. |
@@ -177,7 +179,7 @@ Three faces, and the display face has one job the others cannot take.
177
179
  | Body | `--font-sans` | 16px · 1.7 · 400, and the same size at 500 for emphasis |
178
180
  | Label | `--font-sans` | 14px · 1.4 · 400 or 500 |
179
181
  | Micro | `--font-sans` | 12px · 1.333 · 500 |
180
- | Eyebrow | `--font-mono` (DM Mono) | 13px · 1 · 500 · uppercase |
182
+ | Eyebrow, mono | `--font-mono` (DM Mono) | 13px · 1 · 500 · uppercase — the section label over a heading, and nothing else |
181
183
 
182
184
  **The display face carries the stranger's words.** Outfit sets exactly two things
183
185
  in the census: the hero, and the question inside every cut-corner bubble. Inter
@@ -245,14 +247,14 @@ failure; the pack keeps the value steps and adds `--line` to the card.
245
247
  | Primary button | `--on-coral` at 6.20:1 on `--coral` | `--coral` | `--r-control` | 36px tall, 8px/16px padding, 14px/500 label |
246
248
  | Secondary button | `--on-slab` at 16.54:1 on `--slab` | `--ink-strong` | `--r-control` | same metrics |
247
249
  | Tertiary button | `--ink-strong` at 17.59:1 on `--surface` | `--surface` | `--r-control` | 1px `--line`; icon in `--coral` |
248
- | Eyebrow chip | `--ink-body` at 9.15:1 on `--surface` | `--surface` | `--r-chip` | 1px `--line`, 8px/10px padding, 14px/500 |
250
+ | Eyebrow chip | `--ink-body` at 9.15:1 on `--surface` | `--surface` | `--r-chip` | 1px `--line`, 8px/10px padding, 14px/500 in `--font-sans` — it is not the mono eyebrow |
249
251
  | Nav item | `--ink-muted` at 5.36:1 on `--bg` | transparent | `--r-pill` | 6px/8px padding; hover fills `--line-quiet` |
250
252
  | Card | `--ink-body` at 9.15:1 on `--surface` | `--surface` | `--r-card` | **32px padding and 32px internal gap, unchanged at 390**; 1px `--line` |
251
253
  | Quote bubble | `--ink` at 18.88:1 on `--surface` | `--surface` | `--r-bubble` | 24px/600 in `--font-display`; `--shadow-bubble` |
252
254
  | Dark bubble | `--on-slab` at 16.54:1 on `--slab` | `--slab` | `--r-bubble` | the same object on the dark side of a pair |
253
255
  | Demo well | `--ink-body` at 8.61:1 on `--paper` | `--paper` | `--r-well` | sits inside a card, inset by the card's padding |
254
256
  | Product well | `--on-slab` at 17.76:1 on `--well` | `--well` | `--r-well` | the dark screen inside a light card |
255
- | Delta chip | its own solid, at the 4.5:1 body floor | `--good` or `--danger` wash | `--r-badge` | **arrow glyph and number, always both** |
257
+ | Delta chip | its own solid, at the 4.5:1 body floor | `--good-weak` or `--danger-weak` | `--r-badge` | **arrow glyph and number, always both** |
256
258
  | Metric chip (on slab) | `--good-on-dark` at 13.31:1 on `--slab` | `--slab-raised` | `--r-chip` | 12px/500 |
257
259
  | Section slab | `--on-slab` at 16.54:1 on `--slab` | `--slab` | `--r-panel` | 30px inset from the viewport; re-declares `--focus-color` |
258
260
 
@@ -266,6 +268,14 @@ On the slab, `--focus-color` resolves to the paper token instead, because the in
266
268
  ring would otherwise vanish — #1b181c on #1b181c is 1.00:1.
267
269
  `--focus-color-on-dark` is 16.54:1 on `--slab`.
268
270
 
271
+ **The nesting rule has one stated exception, and it is measured.** A nested box
272
+ normally takes the outer radius minus its inset. A well does not: the reference
273
+ draws a 24px well inside a 12px card at 32px of padding, so the inner corner is
274
+ *rounder* than the outer one and the subtraction would yield a negative number.
275
+ That is the reference's own geometry rather than a slip — the well reads as a
276
+ separate object dropped into the card, which is the point of it — so `--r-well` is
277
+ a free value by exception, and it is the only one in the pack.
278
+
269
279
  **Inputs.** The reference paints exactly one — a search field inside a demo well:
270
280
  `--surface` at `--r-control`, 1px `--line`, a 16px/400 value in `--ink-body`, the
271
281
  placeholder in `--ink-ghost`, a leading search glyph in `--ink-muted`, and a filled
@@ -299,17 +309,18 @@ frame:
299
309
 
300
310
  1. A full-bleed `--slab` announcement strip at radius 0, 43px tall, 16px/400 in
301
311
  `--on-slab`, one `--coral-hot` link at its end.
302
- 2. A floating navigation pill — `--surface`, `--r-panel`, `--shadow-nav`, inset
303
- from the frame rather than pinned to the viewport edge.
312
+ 2. The floating navigation bar — `--surface`, `--r-panel`, `--shadow-nav`, inset
313
+ from the frame rather than pinned to the viewport edge. It is not a pill:
314
+ `--r-pill` belongs to the nav *items* inside it, and to the capsule scatter.
304
315
  3. The display line, centred, in `--font-display` at 56px/600/−0.0625em, **with
305
316
  platform marks set inline as words**: rounded-square logo chips sitting on the
306
317
  baseline inside the sentence, at cap height. This is the hero's whole idea —
307
318
  the brands doing the mentioning are typeset into the claim.
308
319
  4. Behind it, pale routing lines in `--parchment` running from logo chips at the
309
320
  frame's left and right edges toward the centre — a wiring diagram in
310
- `--parchment` at 1.15:1 on `--bg`, which is texture rather than a mark.
321
+ `--parchment` at 1.14:1 on `--bg`, which is texture rather than a mark.
311
322
  5. Two CTAs side by side — `--coral` first, `--ink-strong` second — then one
312
- tertiary pill below, then a **stack of offset cream cards** peeking from behind
323
+ tertiary button below at `--r-control`, then a **stack of offset cream cards** peeking from behind
313
324
  one another under `--shadow-drift`.
314
325
 
315
326
  The lede is 18px/400 in `--ink-body`, two lines, centred, and never wider than the
@@ -317,8 +328,10 @@ The lede is 18px/400 in `--ink-body`, two lines, centred, and never wider than t
317
328
 
318
329
  ## Responsive
319
330
 
320
- One breakpoint does the work. Everything below 768 takes the narrow branch; 768
321
- and 1440 differ only in the frame, not in the type.
331
+ One breakpoint does the work, and it sits **above** 768: 390 and 768 take the same
332
+ narrow branch same display size, same section head, same card padding — and 1440
333
+ is the only width that differs from them. What separates 390 from 768 is the frame
334
+ alone.
322
335
 
323
336
  | | 390 | 768 | 1440 |
324
337
  |---|---|---|---|
@@ -384,8 +397,10 @@ animations.
384
397
  motion over the doctrine's ceiling; `--dur-state` carries hover instead, on the
385
398
  measured curve.
386
399
 
387
- Nothing lifts, scales or parallaxes. There is no scroll clock: no
388
- `animation-timeline`, no scroll-linked transform, and one sticky element.
400
+ Nothing lifts or scales **under interaction** no hover lift, no press scale, no
401
+ parallax. The one lift in the pack is the entrance above, which is a mount and
402
+ fires once. There is no scroll clock: no `animation-timeline`, no scroll-linked
403
+ transform, and one sticky element.
389
404
 
390
405
  ## Signature motifs
391
406
 
@@ -448,7 +463,8 @@ page has no stranger's words to put in it, the page does not want this pack.
448
463
  - **No italic anywhere** — the corpus has none, and `em, i` is pinned in the token
449
464
  layer.
450
465
  - **Nothing above weight 700**, and 700 only inside a running line.
451
- - **No lift, scale or parallax**, and no scroll clock.
466
+ - **No lift, scale or parallax under interaction**, and no scroll clock. The
467
+ entrance's single lift is the stated exception, and it fires once on mount.
452
468
  - **No second accent hue.** The periwinkle is a gradient stop and a dark-surface
453
469
  series line; promoting it to a second button colour makes a different pack.
454
470
  - **No tightening of display tracking at narrow widths.** It relaxes; that is
@@ -361,6 +361,13 @@ a page with two closers, or a closer that drops to body-size copy (white on
361
361
  - **Card hover: nothing. Portrait hover: nothing.** The survey does not fidget.
362
362
  - `@media (hover: hover)` gates the two hovers above.
363
363
 
364
+ **The ring on the closer panel is a second token, and it has to be.** `--focus-color`
365
+ is `--action`, which is correct everywhere the pack is paper — and invisible on the
366
+ one surface the pack fills with `--accent`: 1.55:1, under the 3:1 mark floor. The
367
+ closer is where the final CTA lives, so `[data-surface="accent"]` re-declares the
368
+ ring as `--focus-color-on-accent`, which is the pack's own `--bg` at 3.54:1 on the
369
+ accent. Nothing else about that surface changes.
370
+
364
371
  ## Bans
365
372
 
366
373
  - **No shadow on anything but the detached nav.** `#ffffff` cards on `#fff7f3`
@@ -39,10 +39,16 @@
39
39
 
40
40
  MEASURED — the literal was computed on the live page or read from an authored
41
41
  Framer token that the census confirmed paints.
42
- SELECTED — a value the reference ships in another role, taken because a floor
43
- forces the move; only the role changes.
44
42
  DERIVED — computed from a token here because the reference's own value fails a
45
43
  floor. Hue is held; lightness moves and chroma is clipped to gamut.
44
+ PACK DECISION — a value the reference does not carry at all, so there was
45
+ nothing to measure. Two of them, and both are named where they sit: the
46
+ mirrored cut corner, which the reference ships in one direction only, and the
47
+ state clock, because the reference's controls compute to 0s.
48
+
49
+ There is no SELECTED family here. The reference offers no darker step of its own
50
+ in any hue that fails, so every correction below had to be DERIVED — which is
51
+ the opposite of `surveyor`, whose whole remedy was its reference's own ladder.
46
52
 
47
53
  The corrections are in the pack's Gotchas, and there are six. */
48
54
 
@@ -150,6 +156,13 @@
150
156
  --danger: #d03950;
151
157
  --info: #1167f4;
152
158
  --on-status: #ffffff; /* 4.84:1 on --good, 4.79:1 on --danger, 4.92:1 on --info */
159
+ /* The delta chip's ground. The reference paints its rose at two alphas over the
160
+ field (10% and 15%); the green wash is the same construction at the same
161
+ alpha, which is a PACK DECISION stated rather than a measurement implied.
162
+ @role non-text: --good-weak, --danger-weak — a tint under a figure that
163
+ carries its own solid; nothing is written ON them. */
164
+ --good-weak: rgba(25, 132, 0, 0.1);
165
+ --danger-weak: rgba(208, 57, 80, 0.1);
153
166
 
154
167
  /* ---- Status on the slab: a separate ladder, and the mint lives only here */
155
168
  /* MEASURED on the dark wells. The mint is the identity of the reading — 36
@@ -215,7 +228,10 @@
215
228
  --focus-w: 2px;
216
229
  --focus-offset: 2px;
217
230
  --focus-color: var(--ink-strong);
218
- --focus-color-on-dark: var(--paper); /* 16.54:1 on --slab */
231
+ /* It points at the ink token rather than at --paper: a ring on the dark IS ink,
232
+ and two names for one value is what this file's own coral comment argues
233
+ against. The ratio it has to clear is the one --on-slab already states. */
234
+ --focus-color-on-dark: var(--on-slab);
219
235
 
220
236
  /* ---- Radii: a measured ladder, and one corner that is not there -------- */
221
237
  /* MEASURED across the census: 8px on a badge, 10px on a chip and eyebrow, 12px
@@ -240,8 +256,13 @@
240
256
  --r-bubble: 24px 0 24px 24px;
241
257
  --r-bubble-mirror: 0 24px 24px 24px;
242
258
 
243
- /* ---- Spacing: a 4-based ladder and a 100px section -------------------- */
244
- /* MEASURED. The card's padding is 32px and its internal gap is 32px, and
259
+ /* ---- Spacing: the measured steps, named by their step number ---------- */
260
+ /* The suffix is the ladder's INDEX, not the value in quarters `--space-10`
261
+ is the tenth step and it is 32px. That is worth stating because the values
262
+ are the reference's own measured gaps (4, 6, 8, 10, 12, 16, 24, 32, 40, 100)
263
+ and two of them are not multiples of four, so no arithmetic reading of the
264
+ name survives contact with the ladder. Read the comment, not the number.
265
+ MEASURED. The card's padding is 32px and its internal gap is 32px, and
245
266
  NEITHER CHANGES at 390 — the card keeps desktop padding on a 350px sheet,
246
267
  which is a deliberate property of the reference and is stated in Responsive.
247
268
  The section rhythm is 100px at desktop. */
@@ -310,6 +331,9 @@
310
331
  --track-display: -0.0625em; /* MEASURED — -3.5px at 56px */
311
332
  --track-display-sm: -0.025em; /* MEASURED — -1px at 40px; it RELAXES */
312
333
  --track-h2: -0.032em; /* MEASURED — -1.4px at 44px */
334
+ --track-h2-sm: -0.025em; /* MEASURED — -1px at 34px, the narrow section head.
335
+ It exists because the Responsive table asks for it: a size step with no
336
+ tracking token forces the literal this library bans everywhere else. */
313
337
  --track-quote: -0.02em; /* MEASURED — -0.48px at 24px */
314
338
 
315
339
  --weight-body: 400;
@@ -339,11 +363,21 @@
339
363
  line-height: var(--lh-body);
340
364
  }
341
365
 
342
- /* The slab is a surface, not a theme — the page never inverts. What it does owe
343
- is the two tokens that would fail silently on it: the focus ring, which is ink
344
- and therefore invisible #1b181c on #1b181c is 1.00:1 and the rule ink. */
366
+ /* The slab is a surface, not a theme — the page never inverts. The hook is the
367
+ library's own `[data-surface]`, unprefixed: every other surface-variant pack in
368
+ this collection uses that attribute, and the index's selection protocol says to
369
+ compare candidates by changing the token layer alone. A namespaced hook would
370
+ have made chorus the one pack you cannot A/B without editing the markup, which
371
+ is a cost paid by every reader to buy nothing. `.chorus-slab` is kept beside it
372
+ as an alias, because a class is what a component library reaches for.
373
+
374
+ What the block owes is every token that would otherwise resolve to a light-field
375
+ value on a dark ground. There are SIX, and the count is stated because the first
376
+ version of this block listed two, changed five, and left the sixth — --on-status
377
+ — at its root white, which put white on the mint at 1.32:1 inside the one
378
+ surface the pack invented the mint for. */
345
379
  .chorus-slab,
346
- [data-chorus-surface="slab"] {
380
+ [data-surface="slab"] {
347
381
  background-color: var(--slab);
348
382
  color: var(--on-slab);
349
383
  --focus-color: var(--focus-color-on-dark);
@@ -351,6 +385,24 @@
351
385
  --good: var(--good-on-dark);
352
386
  --danger: var(--danger-on-dark);
353
387
  --info: var(--info-on-dark);
388
+ /* The sixth. On the on-dark ladder the label is INK, not white: --slab on the
389
+ mint is 13.31:1, on the rose 6.01:1, on the periwinkle 7.40:1. White on those
390
+ three is 1.32:1, 2.93:1 and 2.38:1 — the first of them invisible. */
391
+ --on-status: var(--slab);
392
+ }
393
+
394
+ /* Custom properties inherit, and a slab is a section rather than a leaf: a white
395
+ card placed inside one would take the slab's white hairline and its mint, which
396
+ is the pack's own ban ("No mint on paper") arriving by inheritance. A light
397
+ surface nested in a slab therefore takes its tokens back. */
398
+ .chorus-slab :is(.ch-card, .ch-well--paper, [data-surface="paper"]),
399
+ [data-surface="slab"] :is(.ch-card, .ch-well--paper, [data-surface="paper"]) {
400
+ --focus-color: var(--ink-strong);
401
+ --line: rgba(70, 72, 77, 0.12);
402
+ --good: #198400;
403
+ --danger: #d03950;
404
+ --info: #1167f4;
405
+ --on-status: #ffffff;
354
406
  }
355
407
 
356
408
  /* The reference ships ZERO prefers-reduced-motion rules across 274KB. This block
@@ -152,6 +152,13 @@
152
152
  --focus-w: 2px;
153
153
  --focus-offset: 2px;
154
154
  --focus-color: var(--action);
155
+ /* The ring VANISHES on the one surface the pack fills with --accent: #0a7269 on
156
+ #0d9488 is 1.55:1, under the 3:1 mark floor, and the closer panel is where the
157
+ pack puts its final CTA. So the accent slab re-declares the ring in the pack's
158
+ own paper — #fff7f3 on #0d9488 is 3.54:1, over the floor. Found by a blind
159
+ read of the shipped pack, not by a gate: a token that resolves is a token the
160
+ gates accept, whatever it resolves to underneath. */
161
+ --focus-color-on-accent: var(--bg);
155
162
 
156
163
  /* ---- Radii: a 10px hand, a 24px card, a 32px panel ------------------- */
157
164
  /* MEASURED. The control is the se-uikit's own 10px on every button and
@@ -283,3 +290,10 @@ strong,
283
290
  b {
284
291
  font-weight: var(--weight-heading);
285
292
  }
293
+
294
+ /* The closer panel is the pack's only saturated surface, and the only place the ink
295
+ ring cannot be seen. It is a SURFACE variant, not a theme: nothing else changes. */
296
+ [data-surface="accent"] {
297
+ background-color: var(--accent);
298
+ --focus-color: var(--focus-color-on-accent);
299
+ }