sheleg-design-skill 1.48.0 → 1.48.1

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,84 @@ follow [SemVer](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.48.1] - 2026-08-24
10
+
11
+ ### The assembly rule is written down, and the render step earned its place within the hour
12
+
13
+ The procedure for adding a pack lived in three homes — `CONTRIBUTING.md`'s authoring
14
+ steps, `docs/DOCMAP.md`'s propagation row, and the release section — and three things
15
+ the `nameplate` run actually did were in none of them. They are now in the home that
16
+ already owns each, rather than in a fourth document, which `DOCMAP`'s single-homes
17
+ discipline forbids.
18
+
19
+ **`STYLE_PACK_TEMPLATE.md` gains rules 7 and 8**, and both ship inside the bundle so an
20
+ author holding only the installed skill sees them. Rule 7 is *read the render, not the
21
+ stylesheet*: a dead token reads as the brand, a gradient hides from a
22
+ `background-color` census because its element's is transparent, and vendor CSS
23
+ outnumbers authored CSS — three traps met in one run, each with the shipped pack that
24
+ met it. Rule 8 is *write a ratio so the gate can compute it*, with all four shapes that
25
+ fail: a line break between the number and its partner, a token whose name contains
26
+ another's (`--on-action` resolves as `--action`, a gradient that pairs with nothing), a
27
+ table row stating a bare ratio, and a line whose **only** token is the partner, so it
28
+ fills both slots and pairs with itself.
29
+
30
+ **`CONTRIBUTING.md` gains step 8: render the kit and check its computed values against
31
+ what the pack claims.** Not a screenshot for the eye — mount it on real content at
32
+ 1440, 768 and an emulated 390, then read `getComputedStyle` back. The step existed
33
+ only as a sentence in `bulletin`'s CHANGELOG entry, so whether it happened depended on
34
+ the next author reading that paragraph. **It caught a defect within the hour of being
35
+ written:** the `Mark` tile added in this same release rendered 60×60 against a declared
36
+ 50, because `.np-mark` was not in the kit's `border-box` list — the same defect as the
37
+ plate one release earlier, in the component added to close a different gap.
38
+
39
+ ### The mark set, and what measuring it changed
40
+
41
+ `nameplate`'s reference repeats one object per feature on the report surface it embeds:
42
+ a 50×50 tile at 16px radius wearing a **5px solid ring**, a wash at 9–12% alpha and a
43
+ glyph in the matching solid. Six hue pairs drive it and the pack carried none of them,
44
+ so an agent building the reference's own feature row would have invented six colours.
45
+
46
+ **Measuring them changed the answer from "carry six hues" to "carry a mechanism and a
47
+ ban".** The set does not separate from itself: seven of its fifteen pairs are tight,
48
+ and the reference's own indigo `#5b4bd4` and violet `#6c5ce7` are 5.58 OKLab units
49
+ apart at full colour — one colour wearing two names. So the hue is variety, never
50
+ meaning; it does not encode which feature this is; and the tokens are **numbered**
51
+ rather than named so nothing can misread them as semantic. That is the measured
52
+ difference from `pigeonhole`, whose hues *are* a taxonomy and whose label word is
53
+ therefore mandatory, and the fork is now written from both ends.
54
+
55
+ The sixth hue was dropped for a second measured reason: the reference's red `#d94558`
56
+ sits **2.92** units from `--action-to` and 1.12 under the worst dichromacy — the same
57
+ colour to every reader, not only to a colourblind one. A mark in the action's colour
58
+ reads as a control, so the coral stays with `--action` and the sixth slot takes
59
+ `--mark-neutral`. All six clear the 3:1 non-text floor on their own composited tile,
60
+ and none may carry a word: `--mark-4` is 3.89:1 on the slab, `--mark-2` is 4.27:1, and
61
+ the dropped red was 3.96:1.
62
+
63
+ Ships `Mark` as the kit's twelfth component, with `tone` as a number precisely because
64
+ it means nothing.
65
+
66
+ ### A claim that was wider than its evidence
67
+
68
+ The pack said *the reference has no dark band anywhere*, and what had been checked was
69
+ the home page at 1440. The authored stylesheets declare **eight** dark fills, and both
70
+ kinds were then checked: `.bg-header-blue` (`#231b66`) is dead CSS no served page uses,
71
+ and the one that renders (`#1f2937`) sits inside a **mock of another product's
72
+ interface** in the hero image. The claim holds in substance and now states the width it
73
+ was measured at, in the Bans and in the token layer's own comment. A claim wider than
74
+ its evidence is this repository's own defect class, and it does not get an exemption
75
+ for being ours.
76
+
77
+ ### Still open, and named rather than quietly dropped
78
+
79
+ `T31` is unrun — it needs fresh contexts reading blind. And 29% of the reference's
80
+ authored CSS is still unmeasured into the pack: the checkout (`order-form-cro.css`,
81
+ 66,546 B) and the report surface (71,302 B) of 500,051 B total. The pack describes a
82
+ front door and says nothing about the payment step. That is an extension to a second
83
+ surface, not a loose end.
84
+
85
+ Gates: 4617 → **4626**, 2659 → **2681**, 692 unchanged. Both palette ceilings held.
86
+
9
87
  ## [1.48.0] - 2026-08-24
10
88
 
11
89
  ### Nameplate, the thirty-third pack — the proof is a borrowed name
@@ -0,0 +1,24 @@
1
+ ---
2
+ category: Signature
3
+ ---
4
+
5
+ The report surface's one repeated object: a `--mark-tile` (50px) square at
6
+ `--mark-tile-r`, wearing a **5px solid ring** in `--mark-tile-ring` — not a hairline —
7
+ with a 1px `--mark-tile-edge` outside it, a wash background at 9–12% alpha and a glyph
8
+ in the matching solid.
9
+
10
+ **`tone` is variety, not meaning, and that is why it is a number.** The five hues do
11
+ not separate from each other — seven of their fifteen pairs are tight, and the
12
+ reference's own indigo and violet are 5.58 OKLab units apart at full colour — so no
13
+ reader can reliably tell two marks apart and nothing may require it. The icon and the
14
+ label carry which feature this is. `tone="neutral"` exists because the reference's
15
+ sixth hue was its red, 2.92 units from `--action-to`: a mark in the action's colour
16
+ reads as a control, so the coral stays with the action.
17
+
18
+ The glyph clears the 3:1 non-text floor on its own tile and nothing more. It is never
19
+ a word, and the tile is never a button.
20
+
21
+ ```tsx
22
+ <Mark tone={1} label="Distribution">{/* icon */}</Mark>
23
+ <Mark tone="neutral" label="Reporting">{/* icon */}</Mark>
24
+ ```
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export interface MarkProps {
4
+ /** The glyph. An icon, never a word — the hue clears only the non-text floor. */
5
+ children: ReactNode;
6
+ /** Decorative variety across a grid, 1–5, or the neutral. It carries no meaning:
7
+ * the set does not separate from itself, so nothing may depend on telling two
8
+ * marks apart. The icon and the label say which feature this is. */
9
+ tone?: 1 | 2 | 3 | 4 | 5 | 'neutral';
10
+ /** Accessible name for the tile, since the glyph inside is decorative. */
11
+ label?: string;
12
+ className?: string;
13
+ }
14
+
15
+ export function Mark({ children, tone = 1, label, className }: MarkProps) {
16
+ return (
17
+ <span
18
+ className={['np-mark', `np-mark--${tone}`, className].filter(Boolean).join(' ')}
19
+ role={label ? 'img' : undefined}
20
+ aria-label={label}
21
+ aria-hidden={label ? undefined : true}
22
+ >
23
+ {children}
24
+ </span>
25
+ );
26
+ }
@@ -23,3 +23,5 @@ export { Frame } from './Frame.js';
23
23
  export type { FrameProps } from './Frame.js';
24
24
  export { Eyebrow } from './Eyebrow.js';
25
25
  export type { EyebrowProps } from './Eyebrow.js';
26
+ export { Mark } from './Mark.js';
27
+ export type { MarkProps } from './Mark.js';
@@ -257,6 +257,50 @@
257
257
  --lift-sm: 1px;
258
258
  --reveal-y: 10px;
259
259
 
260
+ /* ---- Marks: decorative variety across a grid, NOT a taxonomy -------- */
261
+ /* MEASURED off the report showcase the home page embeds: a 50x50 icon tile at
262
+ 16px radius, a 5px solid ring in --mark-tile-ring, a 1px outer ring at 8%
263
+ ink, its background one tint at 9-12% alpha and its glyph the matching
264
+ solid. The reference ships six of these pairs and this pack ships five plus
265
+ a neutral, for two measured reasons.
266
+
267
+ FIRST, the sixth is the action. The reference's red mark #d94558 sits 2.92
268
+ OKLab units from --action-to and 1.12 under the worst dichromacy: the same
269
+ colour to everyone, not only to a colourblind reader. A mark in the action's
270
+ colour reads as a control, so the coral belongs to --action alone and the
271
+ sixth slot takes --mark-neutral.
272
+
273
+ SECOND, and this is why the tokens are numbered rather than named: the set
274
+ does NOT separate from itself. Seven of the fifteen pairs are tight, and the
275
+ reference's own indigo #5b4bd4 and violet #6c5ce7 are 5.58 apart at full
276
+ colour, which is one colour wearing two names. So the hue here is variety,
277
+ never meaning -- it does not encode WHICH feature this is, and nothing may
278
+ depend on telling two marks apart. The icon and the label carry that, and a
279
+ numbered token cannot be mistaken for a semantic one. */
280
+ --mark-tile-r: 16px; /* MEASURED */
281
+ --mark-tile: 50px; /* MEASURED */
282
+ --mark-tile-ring: #f7f8fc; /* MEASURED — a 5px solid ring, not a hairline */
283
+ --mark-tile-ring-w: 5px; /* MEASURED */
284
+ --mark-tile-edge: rgba(34, 36, 76, 0.08); /* MEASURED — 0 0 0 1px, outside the ring */
285
+
286
+ /* Each solid clears the 3:1 non-text floor on its own composited tile, which is
287
+ the only floor it owes: it is a glyph. None of them may carry a word — see
288
+ the pack's Bans, where three of the five miss AA on --field as text. */
289
+ --mark-1: #187c59; /* 4.53:1 on #ecf1f2, its own tile */
290
+ --mark-1-wash: rgba(31, 157, 107, 0.1); /* MEASURED */
291
+ --mark-2: #247cb0; /* 4.01:1 on #ecf0f7, its own tile */
292
+ --mark-2-wash: rgba(49, 144, 199, 0.1); /* MEASURED */
293
+ --mark-3: #5b4bd4; /* 5.36:1 on #eeeefa, its own tile */
294
+ --mark-3-wash: rgba(108, 92, 231, 0.1); /* MEASURED */
295
+ --mark-4: #b36b18; /* 3.69:1 on #f5f0ef, its own tile */
296
+ --mark-4-wash: rgba(227, 165, 60, 0.12); /* MEASURED — the one tint at 12% */
297
+ --mark-5: #6c5ce7; /* 4.26:1 on #efeffa, its own tile */
298
+ --mark-5-wash: rgba(108, 92, 231, 0.09); /* MEASURED — 9%, the lightest */
299
+ /* DERIVED, and it replaces the reference's red for the reason above. It is
300
+ --ink-mid, so a grid whose sixth block has no hue left still has a mark. */
301
+ --mark-neutral: #374151; /* 8.84:1 on #ecedf2, its own tile */
302
+ --mark-neutral-wash: rgba(55, 65, 81, 0.1);
303
+
260
304
  /* ---- Status: the action is red, so danger goes dark ----------------- */
261
305
  /* SELECTED, all four — a marketing site paints no error state — and each is a
262
306
  step of a hue the reference itself carries: its #187c59 green, its #b36b18
@@ -281,10 +325,13 @@
281
325
  font-weight: var(--weight-body);
282
326
  }
283
327
 
284
- /* No dark theme block, and that is a measurement rather than an omission: the
285
- page has no dark band anywhere. Its declared layer carries a #181b31 navy and
286
- a set of on-dark link colours, and nothing paints them the footer computes
287
- white. A pack that shipped a dark variant here would be inventing one. */
328
+ /* No dark theme block, and that is a measurement rather than an omission. No dark
329
+ band PAINTS on any served page: every full-bleed block was walked at 1440 and the
330
+ footer computes white. The authored stylesheets do declare eight dark fills, and
331
+ both kinds were checked -- .bg-header-blue (#231b66) is dead CSS no served page
332
+ uses, and the one that renders (#1f2937) sits inside a mock of another product's
333
+ interface in the hero image. The #181b31 navy and the on-dark link colours beside
334
+ it paint nothing. A pack that shipped a dark variant here would be inventing one. */
288
335
 
289
336
  /* The reference ships a real reduced-motion contract — 23 blocks across 7 of
290
337
  its 11 authored stylesheets — and, unusually, gets the important part right:
@@ -325,6 +372,7 @@
325
372
  .np-chip,
326
373
  .np-frame,
327
374
  .np-band,
375
+ .np-mark,
328
376
  .np-shell {
329
377
  box-sizing: border-box;
330
378
  }
@@ -760,3 +808,25 @@ a.np-plate:active {
760
808
  font-size: var(--t-sm);
761
809
  letter-spacing: var(--track-caps-control);
762
810
  }
811
+
812
+ /* ---- The mark tile: variety across a grid, never a control ------------- */
813
+
814
+ .np-mark {
815
+ display: grid;
816
+ place-items: center;
817
+ inline-size: var(--mark-tile);
818
+ block-size: var(--mark-tile);
819
+ border: var(--mark-tile-ring-w) solid var(--mark-tile-ring);
820
+ border-radius: var(--mark-tile-r);
821
+ box-shadow: 0 0 0 var(--line-w) var(--mark-tile-edge);
822
+ transition:
823
+ color var(--dur-base) var(--ease-out),
824
+ background-color var(--dur-base) var(--ease-out);
825
+ }
826
+
827
+ .np-mark--1 { background: var(--mark-1-wash); color: var(--mark-1); }
828
+ .np-mark--2 { background: var(--mark-2-wash); color: var(--mark-2); }
829
+ .np-mark--3 { background: var(--mark-3-wash); color: var(--mark-3); }
830
+ .np-mark--4 { background: var(--mark-4-wash); color: var(--mark-4); }
831
+ .np-mark--5 { background: var(--mark-5-wash); color: var(--mark-5); }
832
+ .np-mark--neutral { background: var(--mark-neutral-wash); color: var(--mark-neutral); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.48.0",
3
+ "version": "1.48.1",
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-three 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 and bulletin. 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"
@@ -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-three pluggable visual style packs — instrument-console (dark console), editorial-luxury (warm editorial), workbench (light/dark product UI for dashboards and tools), briefing-room (dark 16:9 deck), atrium (warm consumer health), orchard, outrank, babylove (friendly consumer biotech), patchbay (a dark live schematic: one mint-cyan, 8% hairlines and no shadow, and an architecture diagram whose cords carry SMIL particles), field-notes (warm paper for dev tools sold on auditability), cyclorama (a pastel field on a 32s cycle), showroom (the product as the exhibit), blueprint (a drawing sheet, zero radius), prism (one iridescent wash over mono body), maquette (cream axonometric models on a dark table), scoreboard (warm paper, pixel numerals, a dark ledger of results), datasheet (an off-white spec sheet whose live instrument goes dark when it detects the reader is hiding), manpage (a developer landing page set in the reader's own system monospace on cream paper, with coral label chips that are real headings and a dark code frame as the argument), pigeonhole (a white sorting wall whose nine pastel categories are a filing scheme rather than a mood, each a two-layer chip whose label word is mandatory), roster (a white field in a faint grid of squares whose argument is other people's marks — client logotypes in pill-labelled industry columns, an engine's wordmark inside the headline — where the proof is a name rather than a number), ora (a warm coal field with cream ink and no third hue — the accent is the inverted field — a serif carrying every human sentence over a monospace carrying every machine fact, a terminal surface cut below the page, and a six-step verdict ramp, for products whose output is a machine's verdict about the reader), tenor (warm paper with zero radius and zero shadow, one hairline weight, an orange that exists only on hover and on focus, a sans tracked negative against a mono tracked positive, display at a line-height below one in an eight-to-twelve-character measure, and product proof delivered as silent looping video, for products arguing that a new kind of thing must be managed like an existing organisation), paperclip (neutral coal with no functional colour at all — every control monochrome and elevation made of hairlines, with the whole chromatic budget spent on a curtain of gradient capsules and twelve gradient section badges that cannot be clicked — for products that ask a person to run something that runs itself: agent teams, autonomous back-office, schedulers and budget-governed compute), ledger (warm cream paper ruled by a hairline at 12% ink and no shadow on any card, radius 15 nested concentrically, an ink primary button and a terracotta accent that never fills a control — it labels, as a 10px monospace uppercase kicker — with a seal on every card stating how its number is known, for the console of a product that answers questions about data: AI analysts, BI surfaces, query workspaces), router (a near-white field with a trace of blue and white cards standing on it, hairline seams instead of shadows anywhere, body at 14px and weight 450, and a status triplet in which the colour you paint with is not the colour you write with, for product consoles and the landing pages that have to look like them), daylight (a cool near-white portal field with generous radii and one very large soft shadow spent on a single object per screen, for client portals), notation (a near-white page drawn entirely in hairlines with a light serif over a monospace, no bold anywhere and an ink primary, for developer products sold on restraint), almanac (oatmeal paper with 2px seams and no 1px anywhere, a display set below a line-height of one, and mono tags notched through drawn boxes, for pages that assert a category), vitrine (a white hairline field with a serif display, an ink primary and one framed record carrying the evidence, for the front door of a product sold on trust). Ships the sheleg-design skill, the architecture reference, the motion doctrine, the Figma and Claude Design bridges, AI-surface patterns, style packs with ready-made token CSS, and the /sheleg-design command, and awning (a white forecourt where the accent is black and no hue reaches the chrome at all, a pill whose radius is a declared component token, one variable grotesque at 420/550 with no 700, and a single three-layer shadow, for commerce and platform front doors), and proscenium (a white field carrying two cool acts and one deep indigo act at the middle, an electric violet filling a control that stays nearly square at 4px against cards at 16, one family at nine weights, and a framed product panel the fold cuts off, for product-led marketing front doors whose argument is a demonstration), and bulletin (warm cream paper cut by flat pastel bands, every card and control a 1px ink outline standing on a hard zero-blur ink offset it travels into when pressed, a display face at 800 inside controls and 700 in the headline, and no tracking at any size, for front doors whose argument is breadth), and nameplate (a cool near-white slab under a page that is square on 87% of its elements, where the one round shape is reserved for a white 1px-bordered pill carrying somebody else's publication name as type, one family with the body at weight 500, and two uppercase registers tracked 0.06em and 0.175em, for pages whose argument is that named third parties will vouch for you: press placement, trust marks, certification and review aggregation).",
5
- "version": "1.48.0",
5
+ "version": "1.48.1",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -3,7 +3,7 @@ name: sheleg-design
3
3
  description: Use when deciding how something LOOKS or MOVES. Cinematic scroll-driven landing pages and heroes — particle/WebGL backgrounds, scroll-linked animation, parallax, scrubbed sections — or when one feels busy or its motion drifts. Product UI through its style packs — dashboards, admin panels, internal tools, mobile screens, chat and agent interfaces. Design tokens, light/dark themes, palettes and colours, typography and fonts. Triggers - "design a landing" / "дизайн лендинга", "build a landing page" / "сделай лендинг", "scroll animation" / "скролл-анимация", "dashboard style" / "стиль дашборда", "design tokens" / "дизайн-токены", "light/dark theme" / "светлая/тёмная тема", "figma variables" / "переменные фигмы, фигма в код", "mobile screen" / "мобильный экран", "palette" / "палитра", "colors" / "цвета", "typography" / "типографика", "font" / "шрифт", "how it looks" / "выглядит", "make it prettier" / "красиво, красивее", "visual reference" / "визуальные референсы", "investor deck" / "презентация".
4
4
  license: MIT
5
5
  metadata:
6
- version: 1.48.0
6
+ version: 1.48.1
7
7
  ---
8
8
 
9
9
  # SHELEG Design
@@ -112,6 +112,55 @@ and no clone.
112
112
  headings, and the gate refused it in the same run, because the contract is
113
113
  thirteen headings.
114
114
 
115
+ 7. **Read the render, not the stylesheet — and separate the authored layer from
116
+ the vendor one.** A declared token is a claim; a computed value is what a
117
+ reader sees, and the two disagree often enough that measuring the wrong one is
118
+ the commonest way a pack ships a colour nobody paints. Three traps, each met
119
+ in a shipped run:
120
+
121
+ - **A dead token reads as the brand.** `nameplate`'s reference declares
122
+ `--primary` three times as a green nothing paints, while its real action is a
123
+ coral. Only the render says which.
124
+ - **A gradient hides from a colour census.** An element filled by
125
+ `background-image` has a *transparent* `background-color`, so a sweep of
126
+ `background-color` alone skips every gradient on the page — and on that
127
+ reference it returned a third-party cookie banner as the primary action.
128
+ Read `background-image` too.
129
+ - **Vendor CSS outnumbers authored CSS.** That same site loads Bootstrap, two
130
+ purchased themes and three Font Awesome versions against eleven files it
131
+ wrote itself; a frequency count over all of it yields Bootstrap's palette as
132
+ the brand's. Decide which files the site authors, count only those, and say
133
+ in `Origin:` which you counted.
134
+
135
+ State the method in `Origin:` alongside the address — viewports, element
136
+ counts, which stylesheets — so the next author can repeat the measurement
137
+ rather than trust it.
138
+
139
+ 8. **Write a ratio so the gate can compute it: subject and partner on the same
140
+ line.** `validate_stated_ratios` resolves the partner from an `on`/`over`/
141
+ `against` phrase and the subject from a token or a hex **on that line**. Split
142
+ either across a line break and the claim becomes unverifiable prose that still
143
+ reads as measured. Three shapes fail, all three met in one run:
144
+
145
+ - a line break between the number and its partner — *"1.34:1 composited over
146
+ white and 1.33:1 over"* / *"`--field`"* is two half-claims;
147
+ - a token whose own name contains another token's — `--on-action` resolves as
148
+ `--action`, which is a gradient and pairs with nothing, so state that one
149
+ against literals: `#ffffff on #d93b3b is 4.53:1`;
150
+ - a table row stating a bare ratio — name the partner in the cell, or declare
151
+ the base in the table's header, which covers every row at once.
152
+
153
+ - a line whose **only** token is the partner: the resolver prefers a token to a
154
+ hex for the subject, so `` `#d94558` was 3.96:1 on `--field` `` leaves
155
+ `--field` filling both slots and pairs with itself. Name the field by literal
156
+ too — `` on the slab `#f5f7fa` `` — and the pair computes.
157
+
158
+ Evidence for a **refusal** — the reference's own failing value — is worth
159
+ keeping, and it is cheaper to state it in the computable form than to file it
160
+ as unpairable: put the rejected hex on the line with its ratio and its field,
161
+ and where that field is one of your own tokens, write the field's literal
162
+ beside the ratio rather than the token.
163
+
115
164
  ## Register
116
165
 
117
166
  Choose this pack for <product kinds / registers>. State whether it rides
@@ -314,6 +314,28 @@ reference's own declared ladder confirmed against computed
314
314
  hairline.
315
315
  - **Two uppercase registers**, 0.06em on controls and 0.175em on micro-links.
316
316
 
317
+ ### The mark tile, and why its colours are numbered
318
+
319
+ The report surface the home page embeds repeats one object per feature: a 50×50 tile
320
+ at `--mark-tile-r` (16px) wearing a **5px solid ring** in `--mark-tile-ring` — not a
321
+ hairline — with a 1px `--mark-tile-edge` outside it, a tint background at 9–12% alpha
322
+ and a glyph in the matching solid. Five of them ship here plus `--mark-neutral`, and
323
+ both departures from the reference are measurements rather than taste.
324
+
325
+ **The sixth was the action.** The reference's red mark `#d94558` sits 2.92 OKLab
326
+ units from `--action-to` and 1.12 under the worst dichromacy — one colour, not two, to
327
+ every reader. A mark in the action's colour reads as a control, so the coral is
328
+ `--action`'s alone and the sixth slot takes the neutral.
329
+
330
+ **The hue is variety, not meaning, and that is why the tokens are numbered.** The set
331
+ does not separate from itself: seven of its fifteen pairs are tight, and the
332
+ reference's own indigo `#5b4bd4` and violet `#6c5ce7` are 5.58 apart at full colour —
333
+ one colour wearing two names. So a mark's hue never encodes *which* feature this is;
334
+ the icon and the label do. Nothing in a grid may require the reader to tell two marks
335
+ apart, and a numbered token cannot be misread as a semantic one — which is the whole
336
+ difference from [`pigeonhole`](./pigeonhole.md), whose hues **are** a taxonomy and
337
+ whose label word is therefore mandatory.
338
+
317
339
  ## Signature element
318
340
 
319
341
  **The plate band.** A wrapping row of white bordered pills, each carrying one
@@ -359,8 +381,20 @@ page — a second plate band is how the argument turns into wallpaper.
359
381
  loses the argument the moment it becomes art.
360
382
  - **No rounding for friendliness.** Every radius you add spends the plate's meaning.
361
383
  - **No `--shadow-frame` on a card or a control.** One object per screen.
362
- - **No dark variant.** The reference has no dark band anywhere; shipping one here is
363
- inventing, not extending.
384
+ - **A mark colour never fills a control and never carries a word.** It is a glyph on
385
+ its own tile and clears only the 3:1 non-text floor there. As text on the slab three
386
+ of them miss AA and each misses it on its own line:
387
+ `--mark-4` is 3.89:1 on `--field`;
388
+ `--mark-2` is 4.27:1 on `--field`;
389
+ and the red this pack dropped, `#d94558`, was 3.96:1 on the slab `#f5f7fa`.
390
+ A word in a mark colour is a word below the floor, and a mark on a button is a
391
+ button that looks like five other things.
392
+ - **No dark variant.** No dark band *paints* on any served page — checked by walking
393
+ every full-bleed block at 1440, where the footer computes white. The authored
394
+ stylesheets do declare eight dark fills: `.bg-header-blue` (`#231b66`) is dead CSS
395
+ used by no served page, and the one that renders (`#1f2937`) is inside a **mock of
396
+ another product's interface** in the hero image. So there is nothing here to extend,
397
+ and a dark theme would be invented.
364
398
  - **No horizontally scrolling plate band.** The count is the argument.
365
399
  - **No `ease-in`.**
366
400
 
@@ -49,6 +49,7 @@ marketing page a user lands on before the product they log into, which is
49
49
  way — one thing written here reaching twelve places out there — which is
50
50
  [`bulletin`](./bulletin.md): the pastel there is a full-bleed band dividing an
51
51
  act, where the pastel here is a chip naming a category.
52
+ A page whose coloured marks are **variety rather than a scheme** is [`nameplate`](./nameplate.md), and the difference is measurable rather than stylistic: this pack's hues separate from each other because each one names a category, so its label word is mandatory; that pack's five marks do not — seven of their fifteen pairs are tight — so its hue is forbidden from meaning anything and its tokens are numbered instead of named. If deleting the colour would destroy the filing scheme, stay here; if it would only make a grid quieter, go there.
52
53
 
53
54
  ### The fork against [`cyclorama`](./cyclorama.md), which is the one people get wrong
54
55
 
@@ -257,6 +257,50 @@
257
257
  --lift-sm: 1px;
258
258
  --reveal-y: 10px;
259
259
 
260
+ /* ---- Marks: decorative variety across a grid, NOT a taxonomy -------- */
261
+ /* MEASURED off the report showcase the home page embeds: a 50x50 icon tile at
262
+ 16px radius, a 5px solid ring in --mark-tile-ring, a 1px outer ring at 8%
263
+ ink, its background one tint at 9-12% alpha and its glyph the matching
264
+ solid. The reference ships six of these pairs and this pack ships five plus
265
+ a neutral, for two measured reasons.
266
+
267
+ FIRST, the sixth is the action. The reference's red mark #d94558 sits 2.92
268
+ OKLab units from --action-to and 1.12 under the worst dichromacy: the same
269
+ colour to everyone, not only to a colourblind reader. A mark in the action's
270
+ colour reads as a control, so the coral belongs to --action alone and the
271
+ sixth slot takes --mark-neutral.
272
+
273
+ SECOND, and this is why the tokens are numbered rather than named: the set
274
+ does NOT separate from itself. Seven of the fifteen pairs are tight, and the
275
+ reference's own indigo #5b4bd4 and violet #6c5ce7 are 5.58 apart at full
276
+ colour, which is one colour wearing two names. So the hue here is variety,
277
+ never meaning -- it does not encode WHICH feature this is, and nothing may
278
+ depend on telling two marks apart. The icon and the label carry that, and a
279
+ numbered token cannot be mistaken for a semantic one. */
280
+ --mark-tile-r: 16px; /* MEASURED */
281
+ --mark-tile: 50px; /* MEASURED */
282
+ --mark-tile-ring: #f7f8fc; /* MEASURED — a 5px solid ring, not a hairline */
283
+ --mark-tile-ring-w: 5px; /* MEASURED */
284
+ --mark-tile-edge: rgba(34, 36, 76, 0.08); /* MEASURED — 0 0 0 1px, outside the ring */
285
+
286
+ /* Each solid clears the 3:1 non-text floor on its own composited tile, which is
287
+ the only floor it owes: it is a glyph. None of them may carry a word — see
288
+ the pack's Bans, where three of the five miss AA on --field as text. */
289
+ --mark-1: #187c59; /* 4.53:1 on #ecf1f2, its own tile */
290
+ --mark-1-wash: rgba(31, 157, 107, 0.1); /* MEASURED */
291
+ --mark-2: #247cb0; /* 4.01:1 on #ecf0f7, its own tile */
292
+ --mark-2-wash: rgba(49, 144, 199, 0.1); /* MEASURED */
293
+ --mark-3: #5b4bd4; /* 5.36:1 on #eeeefa, its own tile */
294
+ --mark-3-wash: rgba(108, 92, 231, 0.1); /* MEASURED */
295
+ --mark-4: #b36b18; /* 3.69:1 on #f5f0ef, its own tile */
296
+ --mark-4-wash: rgba(227, 165, 60, 0.12); /* MEASURED — the one tint at 12% */
297
+ --mark-5: #6c5ce7; /* 4.26:1 on #efeffa, its own tile */
298
+ --mark-5-wash: rgba(108, 92, 231, 0.09); /* MEASURED — 9%, the lightest */
299
+ /* DERIVED, and it replaces the reference's red for the reason above. It is
300
+ --ink-mid, so a grid whose sixth block has no hue left still has a mark. */
301
+ --mark-neutral: #374151; /* 8.84:1 on #ecedf2, its own tile */
302
+ --mark-neutral-wash: rgba(55, 65, 81, 0.1);
303
+
260
304
  /* ---- Status: the action is red, so danger goes dark ----------------- */
261
305
  /* SELECTED, all four — a marketing site paints no error state — and each is a
262
306
  step of a hue the reference itself carries: its #187c59 green, its #b36b18
@@ -281,10 +325,13 @@
281
325
  font-weight: var(--weight-body);
282
326
  }
283
327
 
284
- /* No dark theme block, and that is a measurement rather than an omission: the
285
- page has no dark band anywhere. Its declared layer carries a #181b31 navy and
286
- a set of on-dark link colours, and nothing paints them the footer computes
287
- white. A pack that shipped a dark variant here would be inventing one. */
328
+ /* No dark theme block, and that is a measurement rather than an omission. No dark
329
+ band PAINTS on any served page: every full-bleed block was walked at 1440 and the
330
+ footer computes white. The authored stylesheets do declare eight dark fills, and
331
+ both kinds were checked -- .bg-header-blue (#231b66) is dead CSS no served page
332
+ uses, and the one that renders (#1f2937) sits inside a mock of another product's
333
+ interface in the hero image. The #181b31 navy and the on-dark link colours beside
334
+ it paint nothing. A pack that shipped a dark variant here would be inventing one. */
288
335
 
289
336
  /* The reference ships a real reduced-motion contract — 23 blocks across 7 of
290
337
  its 11 authored stylesheets — and, unusually, gets the important part right: