sheleg-design-skill 1.64.0 → 1.64.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
@@ -1,3 +1,29 @@
1
+ ## 1.64.2 — derived palette facts and explicit calm fallback
2
+
3
+ - Dark theme documentation now includes source-derived tables for almanac,
4
+ daylight, notation, outrank, proscenium, router, test-drive and vitrine. The
5
+ palette guard checks their values and required markers; four existing tables
6
+ retain a presence check. `scripts/sync-dark-palettes.py` refreshes marked tables.
7
+ - Colour-distance disclosures name one pair per sentence and an explicit
8
+ qualifier. Unbound disclosure figures now fail the palette gate.
9
+ - Reduced-motion guidance documents the existing keep-with-reason contract;
10
+ prism's point-cloud guidance names a static fallback and frame-loop shutdown.
11
+ - Validation runs nightly and on deliberate ready-for-review promotion, with
12
+ manual dispatch retained for diagnostics. No push/synchronize trigger.
13
+ - No CSS colour values or runtime installation changed; publication is a separate gate.
14
+ Evidence: [FW05 receipt](docs/evidence/runs/2026-10-13-fw05-design-facts.md).
15
+
16
+ ## 1.64.1 — a lightweight tag cannot publish a release
17
+
18
+ - **The release refuses a lightweight tag.** `release.yml` gains one step, right after
19
+ checkout and before any gate: `git cat-file -t` on the tag must print `tag`; a `commit`
20
+ fails the job with the remedy (`git tag -a <tag> -m '<release>'` at the same commit)
21
+ before anything is published. `git describe` and `git submodule status` see annotated
22
+ tags only, and the 2026-10-09 family wave cut four lightweight member tags that the
23
+ umbrella then read as each member's previous release. The step is identical across the
24
+ family (umbrella plan 2026-10-10, T5 / REQ-6). Published tags are not re-cut.
25
+ - No skill, reference or installer change.
26
+
1
27
  ## 1.64.0 — a published variable names its token, the family has one tier model, and a redesign starts from a capture
2
28
 
3
29
  A 2026-10-08 read of Figma's own guidance — *Claude Code for designers*, the MCP
package/README.md CHANGED
@@ -336,6 +336,12 @@ These run **in a clone of this repository**. The published npm package ships no
336
336
  python3 test/validate.py # or: npm test
337
337
  ```
338
338
 
339
+ Marked dark-palette tables resolve their values from the shipped CSS graph.
340
+ `python3 scripts/sync-dark-palettes.py --check` reports drift; `--write` refreshes
341
+ the marked canonical tables and their Cursor mirror. The palette gate also
342
+ requires every full theme twin to have a populated dark table and refuses
343
+ unbound multi-pair disclosure figures. These are source checks, not render tests.
344
+
339
345
  `npm test` is **several gates**, not one, and `validate.py` alone is about a
340
346
  third of the contract:
341
347
 
@@ -183,8 +183,10 @@ Frequency decides before taste gets a vote. (Full doctrine:
183
183
  - **Reduced motion is a contract, not a feature.** Anything beyond a colour
184
184
  change honours `prefers-reduced-motion: reduce`; loops, parallax and springs
185
185
  collapse to static or instant, never to "slower"; an opacity or colour change that
186
- carries state may stay. Shipping an animation without that branch is a bug, not a
187
- polish item.
186
+ carries state may stay. Every time-valued token appears in that branch: collapse it
187
+ or re-declare it with a `KEPT` / `ON PURPOSE` / `deliberate` CSS reason and verify
188
+ the consumer stops (atrium removes its canvas; roster pauses its float animations).
189
+ Shipping an animation without that branch is a bug, not a polish item.
188
190
  - This section is adapted from `emilkowalski/skills` (MIT License, Copyright (c) 2026
189
191
  Emil Kowalski); the full notice ships in the skill's `KNOWLEDGE_PROVENANCE.md` and
190
192
  at https://github.com/emilkowalski/skills/blob/e8a175de22ae1e49370fc144c1f3bb9aeedf988d/LICENSE.
@@ -354,10 +354,10 @@
354
354
  --focus-color: var(--accent); /* 4.82:1 on --bg — over the mark floor */
355
355
 
356
356
  /* DERIVED the way the light set was: each hue held, lightness raised until it
357
- writes on both dark fields. The tight pairs move with the physics: --good and
358
- --warn sit 7.2 apart under protanopia, --good and --danger 3.8 under
359
- deuteranopia, --good and --info 4.0 under tritanopia — and the rule does not
360
- change: a state is told apart by the word beside it, not by hue. */
357
+ writes on both dark fields. The tight pairs move with the physics. In dark, --good and
358
+ --warn sit 7.2 apart under protanopia. In dark, --good and --danger sit
359
+ 3.8 under deuteranopia. In dark, --good and --info sit 4.0 under tritanopia.
360
+ A state is told apart by the word beside it, not by hue. */
361
361
  --good: #3ddc97; /* 9.33:1 on --bg, 8.56:1 on --surface */
362
362
  --warn: #ffd05c; /* 11.33:1 on --bg, 10.40:1 on --surface */
363
363
  --danger: #ff8095; /* 6.89:1 on --bg, 6.32:1 on --surface */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.64.0",
3
+ "version": "1.64.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, 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 \u2014 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"
@@ -3,7 +3,7 @@
3
3
  "name": "sheleg-design",
4
4
  "displayName": "SHELEG Design",
5
5
  "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.",
6
- "version": "1.64.0",
6
+ "version": "1.64.2",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -323,6 +323,15 @@ Not a feature. A contract.
323
323
  state. In CSS, put motion behind `@media (prefers-reduced-motion: no-preference)`.
324
324
  - WebGL and canvas scenes degrade to their CSS or SVG still.
325
325
 
326
+ **Every time-valued token answers the reduced-motion branch.** Collapse it, or
327
+ re-declare its existing value in that branch with a CSS comment marked `KEPT`,
328
+ `ON PURPOSE` or `deliberate` that names why it cannot move anything there.
329
+ `atrium` keeps its flute durations because the canvas is removed and its still
330
+ is displayed; `roster` keeps the float durations while the component layer sets
331
+ `animation-play-state: paused`. Neither permits a slower moving alternative.
332
+ Verify the promised removal or pause at the consuming component; a duration
333
+ comment alone cannot stop a loop. State-carrying fades follow the exception above.
334
+
326
335
  **Shipping an animation without a reduced-motion path is a bug, not a polish
327
336
  item.** It fails review the same way a crash does.
328
337
 
@@ -4,7 +4,7 @@ description: Use when deciding how something LOOKS or MOVES — landing/hero pag
4
4
  license: MIT
5
5
  compatibility: Kit/lane commands need node>=16, npx, network. Optional siblings — dataviz, shadcn, migrate-radix-to-base. Each has an in-text fallback when absent or unreachable.
6
6
  metadata:
7
- version: 1.64.0
7
+ version: 1.64.2
8
8
  ---
9
9
 
10
10
  # SHELEG Design
@@ -94,6 +94,31 @@ measured **6.4 apart at full colour** against the palette gate's hard floor of
94
94
  It is moved along the hue until it separates, and the token layer marks it
95
95
  derived at the declaration.
96
96
 
97
+ ### Dark theme — values from the token layer
98
+
99
+ This table resolves the dark theme's core colour roles from the shipped token
100
+ layer, including aliases and inherited values. It is checked against that source;
101
+ copy the CSS rather than transcribing this table. It is a source-value check,
102
+ not a rendered contrast or accessibility result.
103
+
104
+ <!-- dark-palette:derived -->
105
+ | Token | Dark value |
106
+ |---|---|
107
+ | `--bg` | `#15140f` |
108
+ | `--panel` | `#1e1c15` |
109
+ | `--panel-2` | `#26241b` |
110
+ | `--ink` | `#f0efe3` |
111
+ | `--muted` | `#b3b0a2` |
112
+ | `--border` | `#3c3a31` |
113
+ | `--edge` | `#6f6d64` |
114
+ | `--accent` | `#3392ff` |
115
+ | `--accent-ink` | `#15140f` |
116
+ | `--ok` | `#46d39a` |
117
+ | `--warn` | `#fa6838` |
118
+ | `--danger` | `#ff6f9a` |
119
+ | `--info` | `#3392ff` |
120
+ <!-- /dark-palette:derived -->
121
+
97
122
  ## Type
98
123
 
99
124
  Two families, and one of them only ever shouts in capitals.
@@ -143,7 +143,7 @@ Three rules carry this palette.
143
143
  orange in this palette.
144
144
  - **Status is never by colour alone.** `--good` and `--danger` separate by 14.0
145
145
  at full colour but **7.2 under protanopia and 5.9 under deuteranopia**;
146
- `--warning` and `--danger` by 14.8. Every status renders as a mark **plus its
146
+ `--warning` and `--danger` separate by 14.8 at full colour. Every status renders as a mark **plus its
147
147
  word** — which is a measurement of the reference, not a licence: its status
148
148
  pill reads `● Listening`, and every comparison row pairs its dot with a text
149
149
  phrase. A dot alone is a bug in this pack.
@@ -85,6 +85,31 @@ red was authored to clear AA on the field, the panel and its own tint (6.09 /
85
85
  less than the palette gate's hard floor, and "running" is this product's own
86
86
  signal rather than a new colour.
87
87
 
88
+ ### Dark theme — values from the token layer
89
+
90
+ This table resolves the dark theme's core colour roles from the shipped token
91
+ layer, including aliases and inherited values. It is checked against that source;
92
+ copy the CSS rather than transcribing this table. It is a source-value check,
93
+ not a rendered contrast or accessibility result.
94
+
95
+ <!-- dark-palette:derived -->
96
+ | Token | Dark value |
97
+ |---|---|
98
+ | `--bg` | `#0b0f14` |
99
+ | `--panel` | `#161b23` |
100
+ | `--panel-2` | `#1b2430` |
101
+ | `--ink` | `#eef2f7` |
102
+ | `--muted` | `#a3adbb` |
103
+ | `--border` | `#1c2531` |
104
+ | `--edge` | `#5b6675` |
105
+ | `--accent` | `#3392ff` |
106
+ | `--accent-ink` | `#0e1218` |
107
+ | `--ok` | `#46d39a` |
108
+ | `--warn` | `#e0a030` |
109
+ | `--danger` | `#ff7b72` |
110
+ | `--info` | `#3392ff` |
111
+ <!-- /dark-palette:derived -->
112
+
88
113
  ## Type
89
114
 
90
115
  Two families, and the split is the pack.
@@ -71,9 +71,9 @@ is to mark what can be **pressed**. Swapping them is the single change that
71
71
  stops this pack working.
72
72
 
73
73
  **Status is never by colour alone.** Every state is a dot or an icon **plus a
74
- word**. Under deuteranopia `--danger` and `--warn` separate by 1.6 and `--ok`
75
- and `--warn` by 7.9 — no palette solves the green/amber/red triple, so the word
76
- carries the meaning.
74
+ word**. In light, `--danger` and `--warn` separate by 1.6 under deuteranopia.
75
+ In dark, `--ok` and `--warn` separate by 7.9 under deuteranopia. The word carries
76
+ the meaning when hue cannot separate these states.
77
77
 
78
78
  **`--danger` is derived, not measured**, and the token layer says so at the
79
79
  declaration: the reference paints no error state, so a red was authored to clear
@@ -82,6 +82,31 @@ AA on the field, the panel and its own tint (6.54 / 6.26 / 5.50).
82
82
  **`--info` is the accent value**, because a second blue would separate from
83
83
  `--ok` by less than the palette gate's hard floor.
84
84
 
85
+ ### Dark theme — values from the token layer
86
+
87
+ This table resolves the dark theme's core colour roles from the shipped token
88
+ layer, including aliases and inherited values. It is checked against that source;
89
+ copy the CSS rather than transcribing this table. It is a source-value check,
90
+ not a rendered contrast or accessibility result.
91
+
92
+ <!-- dark-palette:derived -->
93
+ | Token | Dark value |
94
+ |---|---|
95
+ | `--bg` | `#141414` |
96
+ | `--panel` | `#1c1c1c` |
97
+ | `--panel-2` | `#242424` |
98
+ | `--ink` | `#f2f2f2` |
99
+ | `--muted` | `#a0a0a0` |
100
+ | `--border` | `#2b2b2b` |
101
+ | `--edge` | `#686868` |
102
+ | `--accent` | `#3392ff` |
103
+ | `--accent-ink` | `#141414` |
104
+ | `--ok` | `#46d39a` |
105
+ | `--warn` | `#e0a030` |
106
+ | `--danger` | `#ff7b72` |
107
+ | `--info` | `#3392ff` |
108
+ <!-- /dark-palette:derived -->
109
+
85
110
  ## Type
86
111
 
87
112
  Three families, and each has exactly one job.
@@ -76,6 +76,28 @@ Motion ceiling: **2**. Measured, not chosen — the entire site's motion budget
76
76
  4.5 on both fields. The reference's warning `#FF642D` measures **2.95:1**, under
77
77
  even the non-text floor; `#E5511B` is the smallest darkening that clears it.
78
78
 
79
+ ### Dark theme — values from the token layer
80
+
81
+ This table resolves the dark theme's core colour roles from the shipped token
82
+ layer, including aliases and inherited values. It is checked against that source;
83
+ copy the CSS rather than transcribing this table. It is a source-value check,
84
+ not a rendered contrast or accessibility result.
85
+
86
+ <!-- dark-palette:derived -->
87
+ | Token | Dark value |
88
+ |---|---|
89
+ | `--bg` | `#191b23` |
90
+ | `--surface` | `#1d232a` |
91
+ | `--ink` | `#ffffff` |
92
+ | `--ink-soft` | `#a6adba` |
93
+ | `--accent` | `#ab6cfe` |
94
+ | `--on-accent` | `#220358` |
95
+ | `--success` | `#009f81` |
96
+ | `--warning` | `#c2740a` |
97
+ | `--danger` | `#ff4953` |
98
+ | `--info` | `#008ff8` |
99
+ <!-- /dark-palette:derived -->
100
+
79
101
  ## Type
80
102
 
81
103
  Two families, and the split is the whole typographic idea: **Plus Jakarta Sans**
@@ -200,9 +222,9 @@ sits above every metric on the page.
200
222
  - **Status is never by colour alone.** Every state in this pack carries a word or
201
223
  an icon beside the hue — which is what the reference does: its category chips
202
224
  are iconned, its wins feed is checked, its at-risk rows are flagged. Measured
203
- under simulated CVD, `--info` and `--success` separate by only 6.9 under
204
- tritanopia and `--accent` and `--info` by 2.9 under deuteranopia, so the hue is
205
- the second signal here and never the first.
225
+ under simulated CVD, `--info` and `--success` separate by 6.9 under
226
+ tritanopia in both themes. In dark, `--accent` and `--info` separate by
227
+ 2.9 under deuteranopia. Hue is the second signal here and never the first.
206
228
  - **No second brand hue.** One violet. The status four are states, not brand.
207
229
  - **No skeleton, no spinner** on a surface that has a previous value — stamp it.
208
230
  - **No serif, anywhere.** Two sans families and no third.
@@ -170,9 +170,10 @@ the 3:1 non-text floor, so there they are bar fills, dots and chip tints and the
170
170
  status pill is a coloured chip **with the state written in it** (`In Progress`),
171
171
  its trace lines are `passed` / `done` / `running` in words, and its org node
172
172
  announces itself with an `Active` chip rather than a green ring alone. The
173
- measured separations that make this mandatory rather than stylistic: `--good`
174
- and `--warn` separate by 6.2–6.4 under protanopia and `--good` and `--info` by
175
- 6.7 under tritanopia, all below the 8.0 dichromacy floor. The word is not
173
+ measured separations make this mandatory: `--good` and `--warn` separate by
174
+ 6.2 under protanopia in dark and 6.4 under protanopia in light. In dark,
175
+ `--good` and `--info` separate by 6.7 under tritanopia. These measurements are
176
+ below the 8.0 dichromacy floor. The word is not
176
177
  decoration on those pairs; it is the message.
177
178
 
178
179
  **The chromatic layer is ornament, and the rule is one sentence.** Twelve badge
@@ -150,10 +150,9 @@ The thirty-six tint tokens are not listed here: a table of them would be a
150
150
  transcription, and `styles/tokens/pigeonhole.css` is the copy to take. What the
151
151
  table above is for is the functional half — the tokens a component names by hand.
152
152
 
153
- **Status is never by colour alone.** The four status tokens are close under
154
- dichromacy — the gate measures `--danger`/`--good` at ΔE 3.4 and `--good`/`--warn`
155
- at 5.0 under deuteranopia — so every status in this pack carries a word, an icon
156
- or a position as well as a hue. That is not a mitigation bolted on afterwards; it
153
+ **Status is never by colour alone.** The gate measures `--danger` and `--good`
154
+ at 3.4 under deuteranopia. It measures `--good` and `--warn` at 5.0 under
155
+ deuteranopia. Every status carries a word, an icon or a position as well as a hue. That is not a mitigation bolted on afterwards; it
157
156
  is the same rule the taxonomy below is built on.
158
157
 
159
158
  ### The taxonomy — the reason this pack exists
@@ -269,7 +269,11 @@ at `--dur-base` on the one curve, translate 10px and opacity.
269
269
  The ambient layer, if there is one, is a **point cloud in the accent** at low
270
270
  opacity inside the hero only — points, not particles, and they must die at the
271
271
  wash's bottom edge along with everything else. Nothing generative appears on the
272
- white.
272
+ white. Under `prefers-reduced-motion: reduce`, coarse pointer or no WebGL,
273
+ render a fixed CSS or SVG point pattern clipped to the same hero boundary; never
274
+ start the point cloud's requestAnimationFrame loop. On a preference change, cancel
275
+ the scheduled frame and show that still. The static wash, text and controls remain
276
+ visible, and no point moves or waits for a scroll event to appear.
273
277
 
274
278
  The wash is layer 1 in the depth model and it is `pointer-events: none`. It is
275
279
  never put on a scroller, never parallaxed, and never faded — it ends where the
@@ -112,6 +112,31 @@ blue.
112
112
  laid behind the field at low opacity. They never carry state, never sit under
113
113
  text that has to be read, and never appear in a chart.
114
114
 
115
+ ### Dark theme — values from the token layer
116
+
117
+ This table resolves the dark theme's core colour roles from the shipped token
118
+ layer, including aliases and inherited values. It is checked against that source;
119
+ copy the CSS rather than transcribing this table. It is a source-value check,
120
+ not a rendered contrast or accessibility result.
121
+
122
+ <!-- dark-palette:derived -->
123
+ | Token | Dark value |
124
+ |---|---|
125
+ | `--bg` | `#07061d` |
126
+ | `--panel` | `#18143a` |
127
+ | `--panel-2` | `#0c0a26` |
128
+ | `--ink` | `#f7f6ff` |
129
+ | `--muted` | `#a9a6c8` |
130
+ | `--border` | `#262159` |
131
+ | `--edge` | `#6f6aa0` |
132
+ | `--accent` | `#8f7dff` |
133
+ | `--accent-ink` | `#07061d` |
134
+ | `--ok` | `#4fd39b` |
135
+ | `--warn` | `#e0a63c` |
136
+ | `--danger` | `#ff8177` |
137
+ | `--info` | `#8f7dff` |
138
+ <!-- /dark-palette:derived -->
139
+
115
140
  ## Type
116
141
 
117
142
  **One family, and that is the pack.** The reference loads Inter at nine weights
@@ -125,6 +125,31 @@ instead, to `#4d8dff` at 5.73.
125
125
  and a danger chip is exactly where the word most needs to be read. Lifted until
126
126
  it clears the tint it sits on: 5.13.
127
127
 
128
+ ### Dark theme — values from the token layer
129
+
130
+ This table resolves the dark theme's core colour roles from the shipped token
131
+ layer, including aliases and inherited values. It is checked against that source;
132
+ copy the CSS rather than transcribing this table. It is a source-value check,
133
+ not a rendered contrast or accessibility result.
134
+
135
+ <!-- dark-palette:derived -->
136
+ | Token | Dark value |
137
+ |---|---|
138
+ | `--bg` | `#10151d` |
139
+ | `--panel` | `#181d25` |
140
+ | `--panel-2` | `#20252c` |
141
+ | `--ink` | `#f5f7f9` |
142
+ | `--muted` | `#a0a3a7` |
143
+ | `--border` | `#20242c` |
144
+ | `--edge` | `#606369` |
145
+ | `--accent` | `#4d8dff` |
146
+ | `--accent-ink` | `#10151d` |
147
+ | `--ok` | `#34dfaa` |
148
+ | `--warn` | `#e5a000` |
149
+ | `--danger` | `#ff5470` |
150
+ | `--info` | `#4d8dff` |
151
+ <!-- /dark-palette:derived -->
152
+
128
153
  ## Type
129
154
 
130
155
  Two families and no third.
@@ -158,6 +158,26 @@ under colour-vision deficiency are stated at the declaration, and every state ca
158
158
  a word or a glyph beside its colour — the reference's own dashboard writes the
159
159
  percentage next to every delta arrow.
160
160
 
161
+ ### Dark theme — values from the token layer
162
+
163
+ This table resolves the dark theme's core colour roles from the shipped token
164
+ layer, including aliases and inherited values. It is checked against that source;
165
+ copy the CSS rather than transcribing this table. It is a source-value check,
166
+ not a rendered contrast or accessibility result.
167
+
168
+ <!-- dark-palette:derived -->
169
+ | Token | Dark value |
170
+ |---|---|
171
+ | `--bg` | `#1f1f1f` |
172
+ | `--surface` | `#262626` |
173
+ | `--ink` | `#dedddc` |
174
+ | `--accent` | `#e16540` |
175
+ | `--good` | `#3ddc97` |
176
+ | `--warn` | `#ffd05c` |
177
+ | `--danger` | `#ff8095` |
178
+ | `--info` | `#63c1ff` |
179
+ <!-- /dark-palette:derived -->
180
+
161
181
  ## Type
162
182
 
163
183
  One working face and one hand — the second is the voice, not a display face.
@@ -354,10 +354,10 @@
354
354
  --focus-color: var(--accent); /* 4.82:1 on --bg — over the mark floor */
355
355
 
356
356
  /* DERIVED the way the light set was: each hue held, lightness raised until it
357
- writes on both dark fields. The tight pairs move with the physics: --good and
358
- --warn sit 7.2 apart under protanopia, --good and --danger 3.8 under
359
- deuteranopia, --good and --info 4.0 under tritanopia — and the rule does not
360
- change: a state is told apart by the word beside it, not by hue. */
357
+ writes on both dark fields. The tight pairs move with the physics. In dark, --good and
358
+ --warn sit 7.2 apart under protanopia. In dark, --good and --danger sit
359
+ 3.8 under deuteranopia. In dark, --good and --info sit 4.0 under tritanopia.
360
+ A state is told apart by the word beside it, not by hue. */
361
361
  --good: #3ddc97; /* 9.33:1 on --bg, 8.56:1 on --surface */
362
362
  --warn: #ffd05c; /* 11.33:1 on --bg, 10.40:1 on --surface */
363
363
  --danger: #ff8095; /* 6.89:1 on --bg, 6.32:1 on --surface */
@@ -80,6 +80,31 @@ carries the meaning and the colour reinforces it.
80
80
  one pack of the five ported from live references whose reference paints an error
81
81
  state, so nothing in its semantic set is derived.
82
82
 
83
+ ### Dark theme — values from the token layer
84
+
85
+ This table resolves the dark theme's core colour roles from the shipped token
86
+ layer, including aliases and inherited values. It is checked against that source;
87
+ copy the CSS rather than transcribing this table. It is a source-value check,
88
+ not a rendered contrast or accessibility result.
89
+
90
+ <!-- dark-palette:derived -->
91
+ | Token | Dark value |
92
+ |---|---|
93
+ | `--bg` | `#101112` |
94
+ | `--panel` | `#17191b` |
95
+ | `--panel-2` | `#17191b` |
96
+ | `--ink` | `#f7f8f9` |
97
+ | `--muted` | `#b8c0cb` |
98
+ | `--border` | `#26292d` |
99
+ | `--edge` | `#60656d` |
100
+ | `--accent` | `#3392ff` |
101
+ | `--accent-ink` | `#101112` |
102
+ | `--ok` | `#3fcf7f` |
103
+ | `--warn` | `#ffb020` |
104
+ | `--danger` | `#ff7b72` |
105
+ | `--info` | `#3392ff` |
106
+ <!-- /dark-palette:derived -->
107
+
83
108
  ## Type
84
109
 
85
110
  Three families, each with one job.