sheleg-design-skill 1.15.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,44 @@ All notable changes to this project are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions
5
5
  follow [SemVer](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.16.0] - 2026-08-12
8
+
9
+ The five findings T5 and T6 left on the board, actioned.
10
+
11
+ ### Fixed
12
+
13
+ - **`instrument-console`'s palette table declared no base, so none of its ratios
14
+ were checked.** `validate_stated_ratios` reads the comparison base out of a
15
+ table header; with none, the library's default dark infrastructure pack was its
16
+ **least-covered**, and the one automated fact about it was `--ink` on `--bg`. The
17
+ table now declares `| On \`--base\` |` and every number in it is recomputed on
18
+ each run — the palette gate goes 596 → **603 checks**, which is the size of the
19
+ hole.
20
+ - **`--accent-ink` was stated at 6.0:1 in two places and computes 6.17.** From the
21
+ unrounded colour rather than the shipped hex, the same way four `scoreboard`
22
+ ratios were wrong in 1.13.0. Conservative in direction, wrong in kind.
23
+ - **`workbench`'s reference kit had no selected row.** The pack mandates
24
+ `--accent-weak` plus a 2px accent inset for selected; `Chip` implemented it and
25
+ `DataTable` did not — the one atom on an admin dashboard that most needs
26
+ selection was the one that lacked it. `DataTableRow` gains `selected`, with
27
+ `aria-selected` on the row.
28
+ - **`workbench` stated its type scale and its 4px grid in prose and shipped
29
+ neither as tokens**, which made the craft bar's *"no ad-hoc font size anywhere
30
+ in the diff"* unachievable in this pack specifically — and its own kit wrote
31
+ **twenty** raw `font-size` declarations because there was nothing to reference.
32
+ `--t-chip` … `--t-page` and `--space-1` … `--space-6` now ship; every value was
33
+ lifted from the pack's own Type section, none was chosen. The kit is down to
34
+ zero raw sizes.
35
+
36
+ ### Changed
37
+
38
+ - **`test/scenarios.md` says out loud that it cannot be blind.** Every scenario
39
+ states its pass condition a paragraph from its brief, so an agent with
40
+ repository access can find its own exam — T5's run reported exactly that, after
41
+ selecting the right pack anyway. Runs are now pointed at an **installed** bundle,
42
+ which carries no `test/` directory. A run against the checkout still yields
43
+ findings; its verdict is not blind and must not be recorded as if it were.
44
+
7
45
  ## [1.15.0] - 2026-08-12
8
46
 
9
47
  Two of the eight unrun scenarios were run. Both passed, and between them they
@@ -13,7 +13,7 @@
13
13
  --accent: #3392ff;
14
14
  --accent-dim: #1f5fb0;
15
15
  --accent-bright: #6bb3ff;
16
- --accent-ink: #0a0e14; /* text ON the accent — 6.0:1. White on #3392ff fails AA. */
16
+ --accent-ink: #0a0e14; /* text ON the accent — 6.17:1. White on #3392ff is 3.14 and fails. */
17
17
  --accent-glow: rgba(51, 146, 255, 0.18);
18
18
  --ok: #46d39a;
19
19
  --warn: #e0a030;
@@ -46,6 +46,7 @@
46
46
  cross-pack document can name them truthfully. Alias, never a new colour. */
47
47
  --bg: var(--base); /* role alias -> --base, this pack's field */
48
48
  }
49
+
49
50
  /* ── components ── */
50
51
 
51
52
  /* Everything below consumes var(--…) only. Colour never appears as a literal.
@@ -7,7 +7,7 @@ uppercase, hairline row dividers, and numeric columns right-aligned in the data
7
7
  face with tabular figures so digits line up down the column. Mark a column
8
8
  `numeric` whenever it holds a quantity — that flag is the whole reason the table
9
9
  reads at a glance. Cells take nodes, so a `StatusDot` or a `Chip` drops straight
10
- in. Rows hover to `--panel-2`; nothing else moves.
10
+ in. Rows hover to `--panel-2` and a selected row takes `--accent-weak` with a 2px accent inset, as the pack mandates; nothing else moves.
11
11
 
12
12
  ```tsx
13
13
  <DataTable
@@ -11,6 +11,13 @@ export interface DataTableColumn {
11
11
  export interface DataTableRow {
12
12
  id: string;
13
13
  cells: Record<string, ReactNode>;
14
+ /**
15
+ * The pack mandates `--accent-weak` plus a 2px accent inset for the selected
16
+ * state, and this component shipped without one until 1.16.0 — the single
17
+ * atom on an admin dashboard that most needs selection was the one that
18
+ * lacked it, while `Chip` implemented the same state correctly.
19
+ */
20
+ selected?: boolean;
14
21
  }
15
22
 
16
23
  export interface DataTableProps {
@@ -46,7 +53,16 @@ export function DataTable({ columns, rows, caption, className }: DataTableProps)
46
53
  </thead>
47
54
  <tbody>
48
55
  {rows.map((row) => (
49
- <tr key={row.id} className="wb-table__row">
56
+ <tr
57
+ key={row.id}
58
+ className={[
59
+ 'wb-table__row',
60
+ row.selected === true ? 'wb-table__row--selected' : undefined,
61
+ ]
62
+ .filter(Boolean)
63
+ .join(' ')}
64
+ aria-selected={row.selected === true ? true : undefined}
65
+ >
50
66
  {columns.map((column) => (
51
67
  <td
52
68
  key={column.key}
@@ -34,6 +34,27 @@
34
34
  --font-ui: -apple-system, "SF Pro", "Segoe UI", sans-serif;
35
35
  --font-data: ui-monospace, "SF Mono", Menlo, monospace;
36
36
 
37
+ /* The scale the pack has always stated in prose, tokenised in 1.16.0. It was
38
+ prose-only for five releases, which made the craft bar's "no ad-hoc font
39
+ size anywhere in the diff" unachievable in this pack specifically — its own
40
+ reference kit wrote twenty raw font-size declarations because there was
41
+ nothing to reference. No value changed; they were lifted from the pack's
42
+ Type section, not chosen. */
43
+ --t-chip: 11px; /* chips, meta */
44
+ --t-label: 12px; /* uppercase labels, tracked .1em */
45
+ --t-body: 13px; /* body and dense UI — the workhorse */
46
+ --t-card: 15px; /* card titles */
47
+ --t-section: 20px; /* section headings */
48
+ --t-page: 28px; /* page title */
49
+
50
+ /* The 4px grid, likewise stated and not shipped. */
51
+ --space-1: 4px;
52
+ --space-2: 8px;
53
+ --space-3: 12px;
54
+ --space-4: 16px;
55
+ --space-5: 24px;
56
+ --space-6: 32px;
57
+
37
58
  background-color: var(--bg);
38
59
  color: var(--ink);
39
60
  color-scheme: light; /* the theme is explicit — never let the UA pick */
@@ -86,18 +107,18 @@
86
107
  text-wrap: balance;
87
108
  }
88
109
  .wb-heading--1 {
89
- font-size: 28px;
110
+ font-size: var(--t-page);
90
111
  font-weight: 700;
91
112
  line-height: 1.2;
92
113
  letter-spacing: -0.01em;
93
114
  }
94
115
  .wb-heading--2 {
95
- font-size: 20px;
116
+ font-size: var(--t-section);
96
117
  font-weight: 700;
97
118
  line-height: 1.3;
98
119
  }
99
120
  .wb-heading--3 {
100
- font-size: 15px;
121
+ font-size: var(--t-card);
101
122
  font-weight: 600;
102
123
  line-height: 1.4;
103
124
  }
@@ -142,17 +163,17 @@
142
163
  .wb-btn--sm {
143
164
  min-height: 26px;
144
165
  padding: 4px 10px;
145
- font-size: 12px;
166
+ font-size: var(--t-label);
146
167
  }
147
168
  .wb-btn--md {
148
169
  min-height: 32px;
149
170
  padding: 6px 12px;
150
- font-size: 13px;
171
+ font-size: var(--t-body);
151
172
  }
152
173
  .wb-btn--lg {
153
174
  min-height: 40px;
154
175
  padding: 8px 16px;
155
- font-size: 15px;
176
+ font-size: var(--t-card);
156
177
  }
157
178
  .wb-btn--primary {
158
179
  background: var(--accent);
@@ -217,7 +238,7 @@
217
238
  border: 1px solid var(--border);
218
239
  border-radius: var(--r-card);
219
240
  font-family: var(--font-ui);
220
- font-size: 13px;
241
+ font-size: var(--t-body);
221
242
  line-height: 1.5;
222
243
  color: var(--ink);
223
244
  }
@@ -230,13 +251,13 @@
230
251
  }
231
252
  .wb-card__title {
232
253
  margin: 0;
233
- font-size: 15px;
254
+ font-size: var(--t-card);
234
255
  font-weight: 600;
235
256
  color: var(--ink);
236
257
  }
237
258
  .wb-card__meta {
238
259
  font-family: var(--font-data);
239
- font-size: 11px;
260
+ font-size: var(--t-chip);
240
261
  color: var(--muted);
241
262
  font-variant-numeric: tabular-nums;
242
263
  white-space: nowrap;
@@ -253,7 +274,7 @@
253
274
  box-sizing: border-box;
254
275
  padding: 2px 8px;
255
276
  font-family: var(--font-data);
256
- font-size: 11px;
277
+ font-size: var(--t-chip);
257
278
  line-height: 1.45;
258
279
  font-variant-numeric: tabular-nums;
259
280
  background: var(--panel);
@@ -290,7 +311,7 @@
290
311
  }
291
312
  .wb-stat__label {
292
313
  font-family: var(--font-ui);
293
- font-size: 12px;
314
+ font-size: var(--t-label);
294
315
  font-weight: 600;
295
316
  letter-spacing: 0.1em;
296
317
  text-transform: uppercase;
@@ -298,7 +319,7 @@
298
319
  }
299
320
  .wb-stat__value {
300
321
  font-family: var(--font-data);
301
- font-size: 28px;
322
+ font-size: var(--t-page);
302
323
  font-weight: 600;
303
324
  line-height: 1.1;
304
325
  font-variant-numeric: tabular-nums;
@@ -306,7 +327,7 @@
306
327
  }
307
328
  .wb-stat__source {
308
329
  font-family: var(--font-ui);
309
- font-size: 11px;
330
+ font-size: var(--t-chip);
310
331
  line-height: 1.4;
311
332
  color: var(--muted);
312
333
  }
@@ -317,7 +338,7 @@
317
338
  align-items: center;
318
339
  gap: 8px;
319
340
  font-family: var(--font-ui);
320
- font-size: 12px;
341
+ font-size: var(--t-label);
321
342
  color: var(--ink);
322
343
  }
323
344
  .wb-status__dot {
@@ -361,14 +382,14 @@
361
382
  border-collapse: separate;
362
383
  border-spacing: 0;
363
384
  font-family: var(--font-ui);
364
- font-size: 13px;
385
+ font-size: var(--t-body);
365
386
  color: var(--ink);
366
387
  }
367
388
  .wb-table__caption {
368
389
  caption-side: top;
369
390
  padding: 12px 12px 8px;
370
391
  text-align: left;
371
- font-size: 12px;
392
+ font-size: var(--t-label);
372
393
  font-weight: 600;
373
394
  letter-spacing: 0.1em;
374
395
  text-transform: uppercase;
@@ -381,7 +402,7 @@
381
402
  height: 34px;
382
403
  padding: 0 12px;
383
404
  text-align: left;
384
- font-size: 12px;
405
+ font-size: var(--t-label);
385
406
  font-weight: 600;
386
407
  letter-spacing: 0.1em;
387
408
  text-transform: uppercase;
@@ -400,6 +421,7 @@
400
421
  .wb-table__row:hover .wb-table__td {
401
422
  background: var(--panel-2);
402
423
  }
424
+ .wb-table__row--selected { background-color: var(--accent-weak); box-shadow: inset 2px 0 0 0 var(--accent); }
403
425
  .wb-table__th--num,
404
426
  .wb-table__td--num {
405
427
  text-align: right;
@@ -414,7 +436,7 @@
414
436
  flex-direction: column;
415
437
  gap: 6px;
416
438
  font-family: var(--font-ui);
417
- font-size: 12px;
439
+ font-size: var(--t-label);
418
440
  color: var(--muted);
419
441
  }
420
442
  .wb-progress__head {
@@ -472,7 +494,7 @@
472
494
  .wb-seg__opt {
473
495
  padding: 4px 12px;
474
496
  font-family: var(--font-ui);
475
- font-size: 12px;
497
+ font-size: var(--t-label);
476
498
  font-weight: 600;
477
499
  background: transparent;
478
500
  border: 1px solid transparent;
@@ -510,7 +532,7 @@
510
532
  margin: 0;
511
533
  max-width: 65ch;
512
534
  font-family: var(--font-ui);
513
- font-size: 13px;
535
+ font-size: var(--t-body);
514
536
  line-height: 1.5;
515
537
  color: var(--muted);
516
538
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.15.0",
3
+ "version": "1.16.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 thirteen locked style packs with ready-made design tokens — instrument-console, editorial-luxury, workbench, briefing-room, atrium, orchard, field-notes, cyclorama, showroom, blueprint, prism, maquette and scoreboard. 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 thirteen 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 (friendly consumer biotech), 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). 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.",
5
- "version": "1.15.0",
5
+ "version": "1.16.0",
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 building or upgrading a cinematic scroll-driven landing page, marketing site or hero (particle/WebGL background, scroll-linked animation, parallax, scrubbed sections) — when such a page feels busy or janky or its motion layers drift out of sync — or when styling product UI with its style packs - dashboards, admin panels, internal/dev tools, mobile app screens, design tokens, light/dark themes - or when carrying a visual system across the Figma border (publishing tokens as variables, implementing a design without importing raw values). Triggers - "cinematic landing" / "кинематографичный лендинг", "scroll animation" / "скролл-анимация", "dashboard style" / "стиль дашборда", "design tokens" / "дизайн-токены", "light/dark theme" / "светлая/тёмная тема", "figma variables / figma to code" / "переменные фигмы, фигма в код", "chat/agent UI" / "интерфейс чата или агента", "streaming output" / "стриминг ответа", "mobile screen" / "мобильный экран".
4
4
  license: MIT
5
5
  metadata:
6
- version: 1.15.0
6
+ version: 1.16.0
7
7
  ---
8
8
 
9
9
  # SHELEG Design
@@ -39,18 +39,27 @@ answers *what is this made of*.**
39
39
  Ready-made token layer: [`tokens/instrument-console.css`](./tokens/instrument-console.css)
40
40
  — copy it verbatim instead of transcribing this table.
41
41
 
42
- | Token | Value | Role |
43
- |---|---|---|
44
- | `--base` | `#05070a` | page field (near-black) |
45
- | `--surface-1/2/3` | `#0a0e14` / `#10151d` / `#161c26` | ascending raised panels |
46
- | `--hairline` / `-strong` | `#1e2630` / `#2b3542` | panel seams, rules |
47
- | `--ink` | `#eef2f7` | primary text |
48
- | `--ink-muted` / `-faint` | `#9aa7b6` / `#5f6b7a` | secondary / captions |
49
- | `--accent` | `#3392ff` | THE electric-blue signal (CTA, links, particles) |
50
- | `--accent-dim` / `-bright` | `#1f5fb0` / `#6bb3ff` | pressed / highlighted signal |
51
- | `--accent-ink` | `#0a0e14` | text **on** the accent — 6.0:1; white on `#3392ff` fails AA |
52
- | `--accent-glow` | `rgba(51,146,255,0.18)` | the only permitted glow |
53
- | `--ok` / `--warn` | `#46d39a` / `#e0a030` | status semantics only |
42
+ **This table declares its base**, which until 1.16.0 it did not — and the
43
+ consequence was not cosmetic: `validate_stated_ratios` reads the base out of a
44
+ table header, so with none declared, **not one of this pack's per-token ratios
45
+ was gate-covered.** The library's default dark infrastructure pack was its least
46
+ checked. Every number below is now recomputed from `tokens/instrument-console.css`
47
+ on each run.
48
+
49
+ | Token | Value | Role | On `--base` |
50
+ |---|---|---|---|
51
+ | `--base` | `#05070a` | page field (near-black) | — |
52
+ | `--surface-1` / `-2` / `-3` | `#0a0e14` / `#10151d` / `#161c26` | ascending raised panels | 1.04 / 1.10 / 1.18 — steps, not contrast |
53
+ | `--hairline` / `-strong` | `#1e2630` / `#2b3542` | panel seams, rules | 1.32 / 1.62 — rules, never text |
54
+ | `--ink` | `#eef2f7` | primary text | **17.94:1** |
55
+ | `--ink-muted` | `#9aa7b6` | secondary text | **8.24:1** |
56
+ | `--ink-faint` | `#5f6b7a` | captions — see Gotchas | 3.72:1 |
57
+ | `--accent` | `#3392ff` | THE electric-blue signal (CTA, links, particles) | **6.43:1** |
58
+ | `--accent-dim` | `#1f5fb0` | pressed signal | 3.19:1 — a fill, not a label |
59
+ | `--accent-bright` | `#6bb3ff` | highlighted signal | **9.14:1** |
60
+ | `--accent-ink` | `#0a0e14` | text **on** the accent — 6.17:1 there; white on `#3392ff` is 3.14 and fails | 1.04 |
61
+ | `--accent-glow` | `rgba(51,146,255,0.18)` | the only permitted glow | — |
62
+ | `--ok` / `--warn` | `#46d39a` / `#e0a030` | status semantics only | **10.61:1** / **8.87:1** |
54
63
 
55
64
  The particle field, progress rail, and all instruments are tinted with
56
65
  `--accent` only — energy per scene changes brightness, never hue.
@@ -13,7 +13,7 @@
13
13
  --accent: #3392ff;
14
14
  --accent-dim: #1f5fb0;
15
15
  --accent-bright: #6bb3ff;
16
- --accent-ink: #0a0e14; /* text ON the accent — 6.0:1. White on #3392ff fails AA. */
16
+ --accent-ink: #0a0e14; /* text ON the accent — 6.17:1. White on #3392ff is 3.14 and fails. */
17
17
  --accent-glow: rgba(51, 146, 255, 0.18);
18
18
  --ok: #46d39a;
19
19
  --warn: #e0a030;
@@ -34,6 +34,27 @@
34
34
  --font-ui: -apple-system, "SF Pro", "Segoe UI", sans-serif;
35
35
  --font-data: ui-monospace, "SF Mono", Menlo, monospace;
36
36
 
37
+ /* The scale the pack has always stated in prose, tokenised in 1.16.0. It was
38
+ prose-only for five releases, which made the craft bar's "no ad-hoc font
39
+ size anywhere in the diff" unachievable in this pack specifically — its own
40
+ reference kit wrote twenty raw font-size declarations because there was
41
+ nothing to reference. No value changed; they were lifted from the pack's
42
+ Type section, not chosen. */
43
+ --t-chip: 11px; /* chips, meta */
44
+ --t-label: 12px; /* uppercase labels, tracked .1em */
45
+ --t-body: 13px; /* body and dense UI — the workhorse */
46
+ --t-card: 15px; /* card titles */
47
+ --t-section: 20px; /* section headings */
48
+ --t-page: 28px; /* page title */
49
+
50
+ /* The 4px grid, likewise stated and not shipped. */
51
+ --space-1: 4px;
52
+ --space-2: 8px;
53
+ --space-3: 12px;
54
+ --space-4: 16px;
55
+ --space-5: 24px;
56
+ --space-6: 32px;
57
+
37
58
  background-color: var(--bg);
38
59
  color: var(--ink);
39
60
  color-scheme: light; /* the theme is explicit — never let the UA pick */
@@ -76,8 +76,14 @@ hue.
76
76
  - Data face: `ui-monospace / SF Mono` for ALL data — ids, metrics,
77
77
  timestamps, counters, chips, logs; `font-variant-numeric: tabular-nums`
78
78
  wherever digits align.
79
- - Compact scale: 11px chips/meta · 12px labels (uppercase, tracked .1em) ·
80
- 13px body/dense UI · 15px card titles · 20px sections · 28px page title.
79
+ - Compact scale, **and it ships as tokens** (`--t-chip` 11px chips/meta ·
80
+ `--t-label` 12px labels, uppercase, tracked .1em · `--t-body` 13px body and
81
+ dense UI · `--t-card` 15px card titles · `--t-section` 20px sections ·
82
+ `--t-page` 28px page title). It was prose-only until 1.16.0, which made the
83
+ craft bar's *"no ad-hoc font size anywhere in the diff"* unachievable in this
84
+ pack — there was nothing to reference, and this pack's own reference kit wrote
85
+ twenty raw declarations because of it. No value changed in the tokenising.
86
+ - The 4px grid likewise: `--space-1` … `--space-6` = 4 / 8 / 12 / 16 / 24 / 32.
81
87
  - Running text ≤65ch; headings `text-wrap: balance`.
82
88
 
83
89
  ## Texture & surface