sheleg-design-skill 1.35.0 → 1.36.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
@@ -4,6 +4,68 @@ 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.36.1] - 2026-08-16
8
+
9
+ **1.36.0 added two traps and left the sentence above them saying six.** The Gotchas section
10
+ of `awning` opened with "Six traps" over a list of eight, because the edit that added them
11
+ matched on a guessed line wrap and the header replacement silently did not apply. Every gate
12
+ passed: the repository's counted-claims check counts **packs and kits**, not the things a
13
+ pack says about itself.
14
+
15
+ ### Fixed
16
+
17
+ - The header now reads "Eight traps" and names which five are the reference's — and which
18
+ **two of those five were found only by rendering**.
19
+
20
+ ### Added
21
+
22
+ - **`validate.py` now checks a pack's stated trap count against its own list.** No other
23
+ pack in the library disagreed, measured; the class was simply ungated.
24
+ - **And the check's first draft could not fail.** `NUMBER_WORDS` is keyed lowercase, the pack
25
+ writes "Eight" capitalised, so the lookup returned `None` and every pack was skipped in
26
+ silence — a gate that passes everything, which is precisely the defect it exists to catch.
27
+ Caught by planting the defect and watching for a failure that never came. `.lower()` added,
28
+ re-planted, and watched failing before being kept. 2653 → **2657** checks.
29
+
30
+ ## [1.36.0] - 2026-08-16
31
+
32
+ **`awning` shipped as a specification and had never been rendered.** Asked whether the
33
+ design itself had been done, the answer was no: a pack, a token layer and a nine-component
34
+ kit that typechecks, and not one pixel looked at. A page was built in the kit and
35
+ photographed, and it produced three findings the token layer could not — two of them
36
+ defects in the reference that survived the 1.35.0 release precisely because that release
37
+ was read rather than seen.
38
+
39
+ ### Fixed — in `awning`
40
+
41
+ - **A secondary control's border misses the contrast floor for a control boundary.**
42
+ `--line-strong` `#d4d4d8` is **1.48:1** on white against WCAG's **3:1** for a UI component
43
+ boundary — short by half. It matters more here than it would anywhere else, because a
44
+ secondary button in this system is `transparent` at rest, hover, active *and* disabled: the
45
+ border is not decoration around the control, it **is** the control. `--shade-40` does not
46
+ reach the floor either (2.56:1). **New `--control-border`** `#71717a`, 4.83:1, the first
47
+ step on the ramp that clears it. Found by looking at a "Talk to sales" button beside a
48
+ black pill and seeing it nearly disappear.
49
+ - **The second field is declared and a page built from the pack will not use it.**
50
+ `--bg-deep` existed from the first release and the first page rendered ran fifteen sections
51
+ on pure white without touching it, because nothing forces the alternation and white is the
52
+ default of everything. A front door in this register is long; a long page on one field
53
+ reads as one endless scroll. Recorded as a trap with the instruction to alternate by
54
+ section and to spend the change where the argument changes.
55
+ - **A `Stat`'s label and its sub were the same grey**, so the number read as sandwiched
56
+ between two equal lines rather than as the thing the block is about. The sub drops to
57
+ `--ink-faint`; the constraint that comes with it — 4.40:1 on `--bg-deep`, so a Stat on the
58
+ second field moves its sub back to `--ink-soft` — is written beside it.
59
+ - **A `FeatureRow`'s mono index was top-aligned** against a title set larger, and floated
60
+ free of the line it belongs to. It takes the title's leading now.
61
+
62
+ ### Note
63
+
64
+ Gotchas went from six to eight, and the header now says which of them were found by
65
+ rendering rather than by reading. That distinction is the point of this release: the pack
66
+ passed three validators, both `--strict` runs and a typecheck at 1.35.0 with two
67
+ accessibility defects in it, and neither was reachable without building a page.
68
+
7
69
  ## [1.35.0] - 2026-08-15
8
70
 
9
71
  **The twenty-first pack, and two counts that had been wrong for eight releases.**
@@ -51,6 +51,14 @@
51
51
  the lighter one between rows and the heavier one around a control. */
52
52
  --line: var(--shade-20); /* 1.27:1 on --bg */
53
53
  --line-strong: var(--shade-30); /* 1.48:1 on --bg */
54
+ /* DERIVED, and it exists because rendering the pack found the reference short.
55
+ A secondary control here is transparent in every state, so its border IS the
56
+ control — and WCAG's floor for a UI component boundary is 3:1, which
57
+ --line-strong misses by half. --shade-40 does not reach it either (2.56:1).
58
+ --control-border is 4.83:1 on --bg, the first step on the ramp that clears
59
+ the floor. Use --line-strong for a decorative edge and this for anything a
60
+ reader is meant to press. See Gotcha 7. */
61
+ --control-border: var(--shade-50);
54
62
 
55
63
  /* ── THE accent, and it is black ─────────────────────────────────────────
56
64
  Not a stylistic absence — a resolved chain. `--color-component-button-
@@ -232,7 +240,7 @@ strong, b { font-weight: var(--weight-bold); }
232
240
  .aw-btn--primary:disabled { background: var(--accent-disabled); color: var(--accent-ink-disabled); cursor: default; }
233
241
 
234
242
  /* Transparent at every state — the border and the label carry the whole control. */
235
- .aw-btn--secondary { background: transparent; color: var(--ink); border-color: var(--line-strong); }
243
+ .aw-btn--secondary { background: transparent; color: var(--ink); border-color: var(--control-border); }
236
244
  .aw-btn--secondary:hover:not(:disabled) { border-color: var(--accent-hover); }
237
245
  .aw-btn--secondary:active:not(:disabled) { border-color: var(--accent-active); color: var(--accent-active); }
238
246
  .aw-btn--secondary:disabled { border-color: var(--accent-disabled); color: var(--accent-ink-disabled); cursor: default; }
@@ -303,7 +311,11 @@ strong, b { font-weight: var(--weight-bold); }
303
311
  font-weight: var(--weight-bold); color: var(--ink);
304
312
  font-variant-numeric: tabular-nums;
305
313
  }
306
- .aw-stat__sub { font-size: var(--fs-b5); line-height: var(--lh-b5); color: var(--ink-soft); }
314
+ /* --ink-faint, not --ink-soft: rendered, the label above and the sub below were
315
+ the same grey and the number read as sandwiched between two equal lines. This
316
+ is 4.83:1 on --bg. A Stat placed on --bg-deep must move its sub to --ink-soft,
317
+ where --ink-faint drops to 4.40:1 (Gotcha 1). */
318
+ .aw-stat__sub { font-size: var(--fs-b5); line-height: var(--lh-b5); color: var(--ink-faint); }
307
319
 
308
320
  /* ---- ProductFrame: colourless chrome around full-colour content --------- */
309
321
  .aw-frame {
@@ -348,6 +360,9 @@ strong, b { font-weight: var(--weight-bold); }
348
360
  .aw-feature__index {
349
361
  flex: none; min-width: 2.5rem;
350
362
  font-family: var(--mono); font-size: var(--fs-b5);
363
+ /* The title's cap-height, not the row's top — rendered, a top-aligned index
364
+ floats above a line set at a larger size and reads as unattached. */
365
+ line-height: var(--lh-t6);
351
366
  color: var(--ink-faint);
352
367
  }
353
368
  .aw-feature__body { display: flex; flex-direction: column; gap: var(--space-xs); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "1.35.0",
3
+ "version": "1.36.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 twenty-two locked style packs with ready-made design tokens — instrument-console, editorial-luxury, workbench, briefing-room, atrium, orchard, field-notes, cyclorama, showroom, blueprint, prism, maquette, scoreboard, datasheet, manpage, pigeonhole, roster, ora, tenor, paperclip and ledger. 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 twenty-two 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), 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). 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).",
5
- "version": "1.35.0",
5
+ "version": "1.36.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 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.35.0
6
+ version: 1.36.1
7
7
  ---
8
8
 
9
9
  # SHELEG Design
@@ -68,7 +68,8 @@ file verbatim instead of transcribing this table.
68
68
  | `--ink-soft` | `#52525b` | **prose** — the value that holds on both fields | 7.73:1 |
69
69
  | `--ink-faint` | `#71717a` | meta and non-text marks — **not prose**, see Gotcha 1 | 4.83:1 |
70
70
  | `--line` | `#e4e4e7` | between rows | 1.27:1 |
71
- | `--line-strong` | `#d4d4d8` | around a control | 1.48:1 |
71
+ | `--line-strong` | `#d4d4d8` | a decorative edge | 1.48:1 |
72
+ | `--control-border` | `#71717a` | **derived** — the boundary of a pressable control | 4.83:1 |
72
73
  | `--accent` | `#000000` | every primary action | 21.00:1 |
73
74
  | `--accent-ink` | `#ffffff` | text ON the accent | — |
74
75
  | `--good` | `#0b6b3a` | **derived** — success on a product surface | 6.61:1 |
@@ -235,8 +236,9 @@ costs a dropped declaration.
235
236
 
236
237
  ## Gotchas
237
238
 
238
- Six traps, measured on 2026-08-15. Three are defects in the reference, which is
239
- why a copy inherits them.
239
+ Eight traps, measured on 2026-08-15 and 2026-08-16. Five are defects in the
240
+ reference, which is why a copy inherits them — and **two of those five were
241
+ found only by rendering a page in this pack**, not by reading its token layer.
240
242
 
241
243
  1. **`--ink-faint` does not clear AA on the system's own second field.** At
242
244
  `#71717a` it is **4.83:1** on `#ffffff` and **4.40:1** on `#f4f4f5`, and the
@@ -257,19 +259,37 @@ why a copy inherits them.
257
259
  lands in the exact moment after a click when the reader is watching hardest.
258
260
  The reference ships it as a token, which makes reaching for it easy; keep it
259
261
  for something leaving the screen entirely, and prefer `ease-in-out` even then.
260
- 4. **The shade ramp is Tailwind's `zinc`, renamed.** `#f4f4f5`, `#e4e4e7`,
262
+ 4. **A secondary control's border misses the floor for a control boundary.**
263
+ `--line-strong` `#d4d4d8` is **1.48:1** on white, and WCAG's floor for a UI
264
+ component boundary is **3:1** — so it fails by half. This matters more here
265
+ than it would in most packs, because a secondary button in this system is
266
+ `transparent` at rest, hover, active *and* disabled: the border is not
267
+ decoration around the control, it **is** the control. `--shade-40` does not
268
+ reach the floor either (2.56:1). `--control-border` `#71717a` is the first
269
+ step on the ramp that clears it, at 4.83:1. Found by rendering a page in the
270
+ pack and looking at a "Talk to sales" button beside a black pill, where it
271
+ nearly disappeared — not by reading the token layer, which is why it survived
272
+ the first release.
273
+ 5. **The second field exists and a page built from this pack will not use it.**
274
+ `--bg-deep` is declared, and the first page rendered in this pack ran fifteen
275
+ sections on pure white without touching it — because nothing in the token
276
+ layer forces the alternation and white is the default of everything. A front
277
+ door in this register is long and sectioned, and a long page on one field
278
+ reads as one endless scroll. **Alternate the field by section**, and use the
279
+ change to mark where the argument changes, not decoratively.
280
+ 6. **The shade ramp is Tailwind's `zinc`, renamed.** `#f4f4f5`, `#e4e4e7`,
261
281
  `#d4d4d8`, `#a1a1aa`, `#71717a`, `#52525b`, `#3f3f46`, `#18181b` are that
262
282
  palette exactly. This is not a criticism — a bought ramp used deliberately,
263
283
  with semantic roles layered over it, is a different thing from a bought theme
264
284
  used by default. But it matters when someone asks whether the greys are
265
285
  "yours": they are chosen, not authored, and a second product on the same ramp
266
286
  will look related whether or not you meant it.
267
- 5. **The token layer is three tiers deep and a copy usually flattens it.**
287
+ 7. **The token layer is three tiers deep and a copy usually flattens it.**
268
288
  `--color-component-button-primary-bg` → `--color-theme-bg-cta` → `#000` is
269
289
  three lookups to reach one colour, and it is worth every one of them: the theme
270
290
  tier is where a co-brand or a locale swaps in. Flatten the chain when copying
271
291
  and the system still renders, having lost the only seam it was built around.
272
- 6. **The delivered CSS is 542 KB and most of it is a utility bundle.** Counting
292
+ 8. **The delivered CSS is 542 KB and most of it is a utility bundle.** Counting
273
293
  `border-radius` across the whole payload returns nineteen values and counting
274
294
  transitions returns twenty-five, which reads as sprawl. It is not: the *system*
275
295
  is `--radius-*` (four values plus full), one shadow and three weights, and the
@@ -51,6 +51,14 @@
51
51
  the lighter one between rows and the heavier one around a control. */
52
52
  --line: var(--shade-20); /* 1.27:1 on --bg */
53
53
  --line-strong: var(--shade-30); /* 1.48:1 on --bg */
54
+ /* DERIVED, and it exists because rendering the pack found the reference short.
55
+ A secondary control here is transparent in every state, so its border IS the
56
+ control — and WCAG's floor for a UI component boundary is 3:1, which
57
+ --line-strong misses by half. --shade-40 does not reach it either (2.56:1).
58
+ --control-border is 4.83:1 on --bg, the first step on the ramp that clears
59
+ the floor. Use --line-strong for a decorative edge and this for anything a
60
+ reader is meant to press. See Gotcha 7. */
61
+ --control-border: var(--shade-50);
54
62
 
55
63
  /* ── THE accent, and it is black ─────────────────────────────────────────
56
64
  Not a stylistic absence — a resolved chain. `--color-component-button-