sheleg-design-skill 1.35.0 → 1.36.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,45 @@ 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.0] - 2026-08-16
8
+
9
+ **`awning` shipped as a specification and had never been rendered.** Asked whether the
10
+ design itself had been done, the answer was no: a pack, a token layer and a nine-component
11
+ kit that typechecks, and not one pixel looked at. A page was built in the kit and
12
+ photographed, and it produced three findings the token layer could not — two of them
13
+ defects in the reference that survived the 1.35.0 release precisely because that release
14
+ was read rather than seen.
15
+
16
+ ### Fixed — in `awning`
17
+
18
+ - **A secondary control's border misses the contrast floor for a control boundary.**
19
+ `--line-strong` `#d4d4d8` is **1.48:1** on white against WCAG's **3:1** for a UI component
20
+ boundary — short by half. It matters more here than it would anywhere else, because a
21
+ secondary button in this system is `transparent` at rest, hover, active *and* disabled: the
22
+ border is not decoration around the control, it **is** the control. `--shade-40` does not
23
+ reach the floor either (2.56:1). **New `--control-border`** `#71717a`, 4.83:1, the first
24
+ step on the ramp that clears it. Found by looking at a "Talk to sales" button beside a
25
+ black pill and seeing it nearly disappear.
26
+ - **The second field is declared and a page built from the pack will not use it.**
27
+ `--bg-deep` existed from the first release and the first page rendered ran fifteen sections
28
+ on pure white without touching it, because nothing forces the alternation and white is the
29
+ default of everything. A front door in this register is long; a long page on one field
30
+ reads as one endless scroll. Recorded as a trap with the instruction to alternate by
31
+ section and to spend the change where the argument changes.
32
+ - **A `Stat`'s label and its sub were the same grey**, so the number read as sandwiched
33
+ between two equal lines rather than as the thing the block is about. The sub drops to
34
+ `--ink-faint`; the constraint that comes with it — 4.40:1 on `--bg-deep`, so a Stat on the
35
+ second field moves its sub back to `--ink-soft` — is written beside it.
36
+ - **A `FeatureRow`'s mono index was top-aligned** against a title set larger, and floated
37
+ free of the line it belongs to. It takes the title's leading now.
38
+
39
+ ### Note
40
+
41
+ Gotchas went from six to eight, and the header now says which of them were found by
42
+ rendering rather than by reading. That distinction is the point of this release: the pack
43
+ passed three validators, both `--strict` runs and a typecheck at 1.35.0 with two
44
+ accessibility defects in it, and neither was reachable without building a page.
45
+
7
46
  ## [1.35.0] - 2026-08-15
8
47
 
9
48
  **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.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 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.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.35.0
6
+ version: 1.36.0
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 |
@@ -257,19 +258,37 @@ why a copy inherits them.
257
258
  lands in the exact moment after a click when the reader is watching hardest.
258
259
  The reference ships it as a token, which makes reaching for it easy; keep it
259
260
  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`,
261
+ 4. **A secondary control's border misses the floor for a control boundary.**
262
+ `--line-strong` `#d4d4d8` is **1.48:1** on white, and WCAG's floor for a UI
263
+ component boundary is **3:1** — so it fails by half. This matters more here
264
+ than it would in most packs, because a secondary button in this system is
265
+ `transparent` at rest, hover, active *and* disabled: the border is not
266
+ decoration around the control, it **is** the control. `--shade-40` does not
267
+ reach the floor either (2.56:1). `--control-border` `#71717a` is the first
268
+ step on the ramp that clears it, at 4.83:1. Found by rendering a page in the
269
+ pack and looking at a "Talk to sales" button beside a black pill, where it
270
+ nearly disappeared — not by reading the token layer, which is why it survived
271
+ the first release.
272
+ 5. **The second field exists and a page built from this pack will not use it.**
273
+ `--bg-deep` is declared, and the first page rendered in this pack ran fifteen
274
+ sections on pure white without touching it — because nothing in the token
275
+ layer forces the alternation and white is the default of everything. A front
276
+ door in this register is long and sectioned, and a long page on one field
277
+ reads as one endless scroll. **Alternate the field by section**, and use the
278
+ change to mark where the argument changes, not decoratively.
279
+ 6. **The shade ramp is Tailwind's `zinc`, renamed.** `#f4f4f5`, `#e4e4e7`,
261
280
  `#d4d4d8`, `#a1a1aa`, `#71717a`, `#52525b`, `#3f3f46`, `#18181b` are that
262
281
  palette exactly. This is not a criticism — a bought ramp used deliberately,
263
282
  with semantic roles layered over it, is a different thing from a bought theme
264
283
  used by default. But it matters when someone asks whether the greys are
265
284
  "yours": they are chosen, not authored, and a second product on the same ramp
266
285
  will look related whether or not you meant it.
267
- 5. **The token layer is three tiers deep and a copy usually flattens it.**
286
+ 7. **The token layer is three tiers deep and a copy usually flattens it.**
268
287
  `--color-component-button-primary-bg` → `--color-theme-bg-cta` → `#000` is
269
288
  three lookups to reach one colour, and it is worth every one of them: the theme
270
289
  tier is where a co-brand or a locale swaps in. Flatten the chain when copying
271
290
  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
291
+ 8. **The delivered CSS is 542 KB and most of it is a utility bundle.** Counting
273
292
  `border-radius` across the whole payload returns nineteen values and counting
274
293
  transitions returns twenty-five, which reads as sprawl. It is not: the *system*
275
294
  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-