sheleg-design-skill 1.55.0 → 1.57.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 +124 -0
- package/README.md +1 -0
- package/package.json +3 -1
- package/plugins/sheleg-design/.claude-plugin/plugin.json +2 -2
- package/plugins/sheleg-design/skills/sheleg-design/AI_PRODUCT_PATTERNS.md +13 -0
- package/plugins/sheleg-design/skills/sheleg-design/DESIGN_SYNC_BRIDGE.md +10 -0
- package/plugins/sheleg-design/skills/sheleg-design/FIGMA_BRIDGE.md +7 -0
- package/plugins/sheleg-design/skills/sheleg-design/MOBILE_SURFACES.md +1 -1
- package/plugins/sheleg-design/skills/sheleg-design/MOTION_DOCTRINE.md +18 -0
- package/plugins/sheleg-design/skills/sheleg-design/MOTION_PRODUCTION.md +204 -0
- package/plugins/sheleg-design/skills/sheleg-design/SHELEG_DESIGN.md +19 -0
- package/plugins/sheleg-design/skills/sheleg-design/SKILL.md +21 -9
- package/plugins/sheleg-design/skills/sheleg-design/SURFACE_COMPOSITION.md +9 -3
- package/plugins/sheleg-design/skills/sheleg-design/styles/STYLE_PACK_TEMPLATE.md +18 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/almanac.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/atrium.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/awning.md +12 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/babylove.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/blueprint.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/briefing-room.md +12 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/bulletin.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/chorus.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/cyclorama.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/datasheet.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/daylight.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/deskmate.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/editorial-luxury.md +13 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/field-notes.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/instrument-console.md +13 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/ledger.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/manpage.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/maquette.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/nameplate.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/notation.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/onionskin.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/ora.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/orchard.md +13 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/outrank.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/paperclip.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/patchbay.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/pigeonhole.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/prism.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/proscenium.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/rimlight.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/roster.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/router.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/scoreboard.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/showroom.md +17 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/surveyor.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/tenor.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/test-drive.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/vitrine.md +16 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/workbench.md +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,130 @@ follow [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.57.0] - 2026-08-30
|
|
10
|
+
|
|
11
|
+
### The siblings are declared, the maps are derived, the descriptions stop scarring
|
|
12
|
+
|
|
13
|
+
Five closures from the family audit of 2026-08-29 (SHD-05, SHD-01, SHD-03, SHD-09,
|
|
14
|
+
SHD-11), one release.
|
|
15
|
+
|
|
16
|
+
**The three sibling skills are declared, and every one has a written absent-branch
|
|
17
|
+
(SHD-05, the audit's HIGH).** `SKILL.md` handed charts to a `dataviz` skill that
|
|
18
|
+
exists on no consumer machine this skill ships to, and asserted `shadcn` /
|
|
19
|
+
`migrate-radix-to-base` "are installed" — a promise this repository has no way to
|
|
20
|
+
keep. Three changes, none of them a removal:
|
|
21
|
+
|
|
22
|
+
- A `compatibility` front-matter line names all three as optional siblings with
|
|
23
|
+
in-text fallbacks — the Agent Skills field for environment expectations, spent on
|
|
24
|
+
the one expectation this skill actually has.
|
|
25
|
+
- The chart handoff is now conditional in both homes: where a `dataviz` skill is
|
|
26
|
+
installed it consumes the pack as its parameter set, and **where none is
|
|
27
|
+
installed, the role table in `SURFACE_COMPOSITION.md` IS the chart contract**,
|
|
28
|
+
applied by hand — which is what that table always was, stated instead of implied.
|
|
29
|
+
- The component-layer section says what absence costs: nothing. `npx shadcn@latest
|
|
30
|
+
add` does the adding without the skill, and the token mapping binds either way.
|
|
31
|
+
|
|
32
|
+
**Every long reference now carries a derived `## Contents` list (SHD-01).** The
|
|
33
|
+
authoring rule — a reference over 100 lines carries a map, because that is what a
|
|
34
|
+
partial read sees — held in 2 of 46 qualifying files. Hand-adding 44 lists creates
|
|
35
|
+
44 lists that rot, so the list is **derived**: `scripts/gen_contents.py` writes the
|
|
36
|
+
entries from the file's own `## ` headings (fenced code blocked out), `--write`
|
|
37
|
+
regenerates bundle + mirror + template source together, and
|
|
38
|
+
`validate_contents_lists()` refuses a file whose list is missing *or drifted* —
|
|
39
|
+
including the one pre-existing list whose entries had already wandered from the
|
|
40
|
+
headings they mapped (`MOBILE_SURFACES.md`). A new pack without a Contents list now
|
|
41
|
+
fails the gate with the remedy in the message.
|
|
42
|
+
|
|
43
|
+
**Both host-facing manifest descriptions are generated, never hand-appended
|
|
44
|
+
(SHD-03).** `plugin.json` and the plugin entry in `marketplace.json` had converged
|
|
45
|
+
to what per-release appending always produces: `patchbay` and `nameplate` glossed
|
|
46
|
+
twice, `deskmate` never glossed, and `chorus` carrying `deskmate`'s orphaned
|
|
47
|
+
parenthesis. Both descriptions are now derived from `STYLE_PACK_INDEX.md`'s
|
|
48
|
+
catalogue — the register and good-fit columns packs are already chosen by — via
|
|
49
|
+
`scripts/gen_manifest_descriptions.py` (`npm run gen-descriptions`), and
|
|
50
|
+
`validate_manifest_descriptions()` refuses a manifest that differs from the
|
|
51
|
+
derivation. The generator also refuses to run when the catalogue and `styles/`
|
|
52
|
+
disagree, so the index parity gate fires first, not silently.
|
|
53
|
+
|
|
54
|
+
**The deck trigger names the register it owns (SHD-09).** "investor deck" /
|
|
55
|
+
«презентация» was broad enough to catch every presentation request, including the
|
|
56
|
+
`.pptx` files the pptx/pitch-deck neighbours own. Now: *"investor deck as a web
|
|
57
|
+
page" / "веб-презентация"*, with the file-based register explicitly declined in the
|
|
58
|
+
description tail. The T1 carrier word `deck` survives, and the umbrella advertises
|
|
59
|
+
no presentation trigger for this skill, so no routing hook loses a word.
|
|
60
|
+
|
|
61
|
+
**The layout deviation is recorded where a retrofit would look (SHD-11).**
|
|
62
|
+
References at the skill root and tokens two levels deep predate the layout
|
|
63
|
+
guidance, and every deep link, the `.cursor` byte-mirror and `install.sh`'s file
|
|
64
|
+
list depend on them. CONTRIBUTING.md now records the deviation as deliberate so the
|
|
65
|
+
next standards pass reads a decision instead of an accident.
|
|
66
|
+
|
|
67
|
+
Gate: 5060 → 5598 checks (the floor moves with it); both new checks watched
|
|
68
|
+
failing against the real tree first — 46 references and 2 manifests red before the
|
|
69
|
+
regeneration, green after — and each ships a planted defect in the self-test. The
|
|
70
|
+
Contents gate's first live catch was the next release's own file: v1.56.0's
|
|
71
|
+
`MOTION_PRODUCTION.md` landed mid-flight without a list, and the rebase gate
|
|
72
|
+
refused it until `npm run gen-contents` wrote one.
|
|
73
|
+
|
|
74
|
+
## [1.56.0] - 2026-08-30
|
|
75
|
+
|
|
76
|
+
### The render seam — what changes when motion stops being a page
|
|
77
|
+
|
|
78
|
+
New companion document, `MOTION_PRODUCTION.md`. `MOTION_DOCTRINE.md` decides whether a
|
|
79
|
+
thing on a page may move and how; this one starts at the question it never answered —
|
|
80
|
+
what happens when the motion has to become a **file**, and what that costs.
|
|
81
|
+
|
|
82
|
+
**The position it takes first, before naming any tool: a rendered asset is not page
|
|
83
|
+
motion with a different extension.** Four things are given up and a page should give
|
|
84
|
+
them up on purpose — the reduced-motion contract (a file has no user preference to
|
|
85
|
+
read, so the obligation moves to the embedding page: no autoplay under the reduce
|
|
86
|
+
query, a real poster frame, a control), the theme (every pack declares `Themes:` and a
|
|
87
|
+
baked frame answers only one of them), the text (unselectable, untranslatable,
|
|
88
|
+
unindexable), and the first frame's decode. The document states what a rendered asset
|
|
89
|
+
is genuinely for — a surface you do not control, a piece with audio, a piece that must
|
|
90
|
+
look identical everywhere — and carries the refusal phrase for the rest.
|
|
91
|
+
|
|
92
|
+
**Two programmatic-video tools, measured on 2026-08-30 rather than characterised.**
|
|
93
|
+
Both seek a headless browser frame by frame and encode with FFmpeg; they differ in the
|
|
94
|
+
language the composition is written in and in what using them costs.
|
|
95
|
+
|
|
96
|
+
- **Remotion** — the composition is a React component reading `useCurrentFrame()`. Its
|
|
97
|
+
licence is its own two-tier one, not an OSI licence: free for individuals, for-profit
|
|
98
|
+
organizations **with up to 3 employees**, non-profits and evaluation, and a paid
|
|
99
|
+
Company License above that. On `remotion` 4.0.518 after six years; FFmpeg bundled
|
|
100
|
+
since v4.0; `@remotion/player` is a React component that takes props.
|
|
101
|
+
- **HyperFrames** — the composition is an HTML document with `data-start` /
|
|
102
|
+
`data-duration` timing and a seekable runtime (GSAP, CSS, WAAPI, Lottie, Three.js).
|
|
103
|
+
**Apache-2.0.** On `hyperframes` 0.8.20 and **pre-1.0**, which is stated as a real
|
|
104
|
+
risk rather than a footnote; requires Node 22+ and a separate FFmpeg. Its player is a
|
|
105
|
+
web component in an isolated iframe.
|
|
106
|
+
|
|
107
|
+
**The recommendation is HyperFrames, and the reason is this library's own rule.** A
|
|
108
|
+
pack's `styles/tokens/<pack>.css` is a `:root` block; in an HTML composition it is
|
|
109
|
+
`<link>`ed in **unmodified** — the same file the site ships, which is the
|
|
110
|
+
copy-never-transcribe rule the kits already follow, holding across the render seam. Two
|
|
111
|
+
supporting reasons: Apache-2.0 removes a seat question that has nothing to do with
|
|
112
|
+
design, and its determinism rules are the doctrine's anti-drift rules restated for a
|
|
113
|
+
renderer.
|
|
114
|
+
|
|
115
|
+
**Three conditions reverse it, and they are named rather than hedged:** motion driven
|
|
116
|
+
by application state in the page (the Remotion player is a React component; the
|
|
117
|
+
HyperFrames one is an iframe by design), a product that is a video pipeline rather
|
|
118
|
+
than a page, and a team that cannot carry a pre-1.0 dependency. Where a brief hits none
|
|
119
|
+
of them and the licence threshold is not close, the document says to use whichever the
|
|
120
|
+
operator already knows instead of manufacturing a reason.
|
|
121
|
+
|
|
122
|
+
### Also in this release
|
|
123
|
+
|
|
124
|
+
- The token seam per tool, with the three families that need a decision the page never
|
|
125
|
+
forced: durations converted once at the edge (`frames = seconds × fps`, the token
|
|
126
|
+
staying the source), the reduced-motion branch that correctly fires on neither side
|
|
127
|
+
of a render, and webfonts, which are assets and must resolve before frame 0.
|
|
128
|
+
- A ten-item pre-flight for a rendered asset, ending on the check that separates a tool
|
|
129
|
+
problem from a composition problem: a byte-identical re-render from the same input.
|
|
130
|
+
- `MOTION_DOCTRINE.md` §10 gains the routing line, and states nothing itself — the
|
|
131
|
+
DOCMAP's single-home rule.
|
|
132
|
+
|
|
9
133
|
## [1.55.0] - 2026-08-30
|
|
10
134
|
|
|
11
135
|
### The thirty-ninth pack — somebody else's question, on a sheet that never stops being ruled
|
package/README.md
CHANGED
|
@@ -176,6 +176,7 @@ skills.
|
|
|
176
176
|
| `SHELEG_DESIGN.md` | The full reference: architecture, layer-by-layer mechanics with code, the exact morph math, the DOM↔WebGL projection bridge, a build-from-scratch recipe, and why each piece works |
|
|
177
177
|
| `SURFACE_COMPOSITION.md` | Two decisions the pack layer does not make: the six depth layers of a scene, read before writing CSS for a cinematic page; and the handoff to `dataviz`, read before drawing a chart in any pack — token names are not uniform across the thirteen and an undefined custom property fails silently |
|
|
178
178
|
| `MOTION_DOCTRINE.md` | Whether to animate at all, before how: the frequency table that kills motion on high-repetition paths, the easing tree and the `ease-in` ban, the duration ceiling, the forbidden forms, and the reduced-motion contract. `SKILL.md` marks it required before any animation |
|
|
179
|
+
| `MOTION_PRODUCTION.md` | What changes when motion leaves the page as a file: the four things a rendered asset gives up, the two programmatic-video tools measured side by side with the licence threshold and the pre-1.0 risk stated, which one this library recommends and the three conditions that reverse it, how a pack's token layer crosses the render seam, and where the reduced-motion obligation lands once there is no user to read a media query |
|
|
179
180
|
| `DESIGN_SYNC_BRIDGE.md` | The Claude Design contract: what a pack sends to claude.ai/design and in what shape, the rule for each of the four reference types, and the border motion does not cross |
|
|
180
181
|
| `FIGMA_BRIDGE.md` | The design↔code contract: how a pack's tokens map onto Figma variable collections and modes, how to implement a design without importing raw values, and what cannot cross the border |
|
|
181
182
|
| `AI_PRODUCT_PATTERNS.md` | The surfaces a model drives: the five states of a call, streaming instead of spinners, latency, provenance and uncertainty, agent confirmations, and the bans that keep it honest |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sheleg-design-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.57.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 thirty-nine 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, 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"
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
"smoke": "node bin/cli.js --help",
|
|
25
25
|
"palette": "python3 test/validate_palette.py",
|
|
26
26
|
"sync-kits": "python3 scripts/sync-kit-tokens.py",
|
|
27
|
+
"gen-descriptions": "python3 scripts/gen_manifest_descriptions.py --write",
|
|
28
|
+
"gen-contents": "python3 scripts/gen_contents.py --write",
|
|
27
29
|
"sloplint": "python3 test/sloplint.py",
|
|
28
30
|
"selftest": "python3 test/validate.py --self-test && python3 test/validate_palette.py --self-test && python3 test/sloplint.py --self-test"
|
|
29
31
|
},
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sheleg-design",
|
|
3
3
|
"displayName": "SHELEG Design",
|
|
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-nine pluggable visual style packs — instrument-console (
|
|
5
|
-
"version": "1.
|
|
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-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.",
|
|
5
|
+
"version": "1.57.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -14,6 +14,19 @@ and states, not a palette. Every token named here is workbench's.
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## Contents
|
|
18
|
+
|
|
19
|
+
- 1. The five states of a model call
|
|
20
|
+
- 2. Streaming beats spinners
|
|
21
|
+
- 3. Latency has two numbers
|
|
22
|
+
- 4. Provenance and uncertainty
|
|
23
|
+
- 5. Agent actions: the confirm is the design
|
|
24
|
+
- 6. Empty states carry the capability
|
|
25
|
+
- 7. Chat is a shape, not the shape
|
|
26
|
+
- 8. Cost, quota and scope
|
|
27
|
+
- 9. Bans
|
|
28
|
+
- Evidence
|
|
29
|
+
|
|
17
30
|
## 1. The five states of a model call
|
|
18
31
|
|
|
19
32
|
Design all five before building any. Most AI UI ships state 2 and 3 only, then
|
|
@@ -15,6 +15,16 @@ agent that does not have it — the pack stands on its own and nothing below app
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## Contents
|
|
19
|
+
|
|
20
|
+
- 1. What crosses, and in what shape
|
|
21
|
+
- 2. Style packs — the pack is the source of truth
|
|
22
|
+
- 3. Figma — one border at a time
|
|
23
|
+
- 4. Reference sweeps (Lazyweb, Mobbin, Refero) — layout crosses, identity does not
|
|
24
|
+
- 5. Live-site extraction — the pack first, the sync second
|
|
25
|
+
- 6. What cannot cross
|
|
26
|
+
- 7. Round-trip discipline
|
|
27
|
+
|
|
18
28
|
## 1. What crosses, and in what shape
|
|
19
29
|
|
|
20
30
|
A kit ships **three layers**, and they are a stack rather than a menu:
|
|
@@ -15,6 +15,13 @@ stands on its own and nothing below applies.
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## Contents
|
|
19
|
+
|
|
20
|
+
- 1. Code → Figma (publish the pack as variables)
|
|
21
|
+
- 2. Figma → code (implement a design without importing slop)
|
|
22
|
+
- 3. What cannot cross
|
|
23
|
+
- 4. Round-trip discipline
|
|
24
|
+
|
|
18
25
|
## 1. Code → Figma (publish the pack as variables)
|
|
19
26
|
|
|
20
27
|
Use when a project has the pack in code and needs the design file to match — or
|
|
@@ -9,7 +9,7 @@ pack's `## Responsive` section covers that, and this file does not repeat it.
|
|
|
9
9
|
|
|
10
10
|
- What a pack decides here, and what it does not
|
|
11
11
|
- The six rules every pack already carries — and one no pack answers
|
|
12
|
-
- Reference sweeps
|
|
12
|
+
- Reference sweeps — structure crosses, identity does not
|
|
13
13
|
|
|
14
14
|
## What a pack decides here, and what it does not
|
|
15
15
|
|
|
@@ -8,6 +8,20 @@ Every number here is a decision someone else already paid for. Use them.
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## Contents
|
|
12
|
+
|
|
13
|
+
- 1. Should this animate at all?
|
|
14
|
+
- 2. Easing
|
|
15
|
+
- 3. Duration
|
|
16
|
+
- 4. Springs
|
|
17
|
+
- 5. Forbidden forms
|
|
18
|
+
- 6. Scroll motion
|
|
19
|
+
- 7. Motion that came from a design tool
|
|
20
|
+
- 8. Anti-drift
|
|
21
|
+
- 9. Reduced motion
|
|
22
|
+
- 10. Pre-flight
|
|
23
|
+
- How the calibration dials bind
|
|
24
|
+
|
|
11
25
|
## 1. Should this animate at all?
|
|
12
26
|
|
|
13
27
|
The first question is not "what animation" — it is "how often will a person see
|
|
@@ -305,6 +319,10 @@ Before calling motion done:
|
|
|
305
319
|
- [ ] `markers` removed.
|
|
306
320
|
- [ ] Reduced motion tested by actually turning it on.
|
|
307
321
|
- [ ] The page still looks like the pack (§8).
|
|
322
|
+
- [ ] Nothing in the diff is a rendered video standing in for page motion. If a file
|
|
323
|
+
IS the right answer, the obligations move with it —
|
|
324
|
+
[`MOTION_PRODUCTION.md`](./MOTION_PRODUCTION.md) owns that seam, including where
|
|
325
|
+
this section's contract lands once there is no user to read a media query.
|
|
308
326
|
|
|
309
327
|
---
|
|
310
328
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Motion production — when motion leaves the page as a file
|
|
2
|
+
|
|
3
|
+
[`MOTION_DOCTRINE.md`](./MOTION_DOCTRINE.md) decides whether a thing on a page may
|
|
4
|
+
move, and how. This document starts one step later, at the only question it does not
|
|
5
|
+
answer: **what happens when the motion has to become a file** — a launch video, a
|
|
6
|
+
feature loop, a social cut, an OG card that moves, a changelog clip, a deck that
|
|
7
|
+
plays.
|
|
8
|
+
|
|
9
|
+
That is a different medium with different physics, and treating it as "the same
|
|
10
|
+
animation, exported" is the mistake this document exists to prevent.
|
|
11
|
+
|
|
12
|
+
## Contents
|
|
13
|
+
|
|
14
|
+
- The boundary
|
|
15
|
+
- Before the tool: what a rendered asset costs
|
|
16
|
+
- The two tools, measured
|
|
17
|
+
- The recommendation, and the three conditions that reverse it
|
|
18
|
+
- The token seam
|
|
19
|
+
- Reduced motion, on the other side of the render
|
|
20
|
+
- Pre-flight for a rendered asset
|
|
21
|
+
|
|
22
|
+
## The boundary
|
|
23
|
+
|
|
24
|
+
| The motion is… | It belongs to | Read |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| in the page, driven by scroll, hover, focus or state | the page | `MOTION_DOCTRINE.md`, then `SHELEG_DESIGN.md` |
|
|
27
|
+
| in the page, but authored as a timeline and played back | the page | `MOTION_DOCTRINE.md` §6 and §9 still bind |
|
|
28
|
+
| a file the page embeds, or a file that never touches the page | **this document** | below |
|
|
29
|
+
| a Lottie or a Figma export dropped into the page | the page | `MOTION_DOCTRINE.md` §7 |
|
|
30
|
+
|
|
31
|
+
**Refusal phrase: "no render."** A brief that says *animate the hero* is page motion
|
|
32
|
+
and stays page motion. Reaching for a rendered file there is a downgrade, and the
|
|
33
|
+
next section prices it.
|
|
34
|
+
|
|
35
|
+
## Before the tool: what a rendered asset costs
|
|
36
|
+
|
|
37
|
+
A video in a hero looks like a shortcut and is a trade. Four things are given up, and
|
|
38
|
+
a page should only give them up on purpose.
|
|
39
|
+
|
|
40
|
+
1. **The reduced-motion contract.** A rendered file has no
|
|
41
|
+
`prefers-reduced-motion`. The doctrine's rule does not stop applying because the
|
|
42
|
+
motion moved into an MP4 — it moves to the **embedding page**, which owes a poster
|
|
43
|
+
frame, `autoplay` withheld under the reduce query, and a control. A hero video that
|
|
44
|
+
autoplays regardless is a doctrine violation wearing a different file extension.
|
|
45
|
+
2. **The theme.** A pack's token layer answers a dark surface; a rendered frame cannot.
|
|
46
|
+
Every pack in this library declares `Themes:`, and a video baked against one of them
|
|
47
|
+
is wrong on the other. Either the surface behind it is fixed, or the asset is
|
|
48
|
+
rendered per theme, or the motion stays in the page.
|
|
49
|
+
3. **The text.** Type in a rendered frame is not selectable, not translatable, not
|
|
50
|
+
readable by a screen reader and not indexable. A headline that matters is DOM.
|
|
51
|
+
4. **The weight and the first frame.** The page's opening viewport now depends on a
|
|
52
|
+
decode. `frontend-performance` owns that number; this document only records that
|
|
53
|
+
the cost exists and lands on LCP.
|
|
54
|
+
|
|
55
|
+
**What a rendered asset is genuinely for:** a surface you do not control (a social
|
|
56
|
+
timeline, an app store, an ad slot, an email), a piece longer than an interaction, a
|
|
57
|
+
piece with an audio track, and anything that must look identical on every machine.
|
|
58
|
+
That last one is the whole reason both tools below exist.
|
|
59
|
+
|
|
60
|
+
## The two tools, measured
|
|
61
|
+
|
|
62
|
+
Both turn code into a deterministic MP4 by seeking a headless browser frame by frame
|
|
63
|
+
and encoding the result. They differ in the language the composition is written in and
|
|
64
|
+
in what using them costs. Read on 2026-08-30; version numbers and prices move, so
|
|
65
|
+
re-read before quoting them.
|
|
66
|
+
|
|
67
|
+
| | **Remotion** | **HyperFrames** |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| The composition is | a React component reading `useCurrentFrame()` | an HTML document with `data-start` / `data-duration` timing attributes and a seekable animation runtime |
|
|
70
|
+
| Licence | its own two-tier licence, **not** an OSI one | **Apache-2.0** |
|
|
71
|
+
| Free for | individuals, for-profit organizations **with up to 3 employees**, non-profits, and evaluation | everyone |
|
|
72
|
+
| Paid when | a for-profit organization exceeds that size — Company License, read the current price from the vendor | never for the framework; the vendor's managed cloud render is a separate product |
|
|
73
|
+
| First release | 2020 | 2026 |
|
|
74
|
+
| Version on npm at the reading | `remotion` 4.0.518 | `hyperframes` 0.8.20 — **pre-1.0** |
|
|
75
|
+
| FFmpeg | bundled since v4.0; no separate install | **required separately**, plus Node 22+ |
|
|
76
|
+
| In-page playback | `@remotion/player`, a React component that takes props | `@hyperframes/player`, a web component that loads the composition in an **isolated iframe** |
|
|
77
|
+
| Distributed rendering | AWS Lambda, Node SSR, Vercel, Cloud Run | AWS Lambda, Google Cloud Run, the vendor's managed cloud |
|
|
78
|
+
| Agent surface | a skill set plus a documentation MCP | 20 skills behind one `/hyperframes` router, and a `/remotion-to-hyperframes` porting skill |
|
|
79
|
+
|
|
80
|
+
Two asymmetries decide most briefs, and they point in opposite directions.
|
|
81
|
+
|
|
82
|
+
- **Licence.** A studio of four people must pay to use Remotion commercially and may
|
|
83
|
+
use HyperFrames without asking anyone. There is no reading of the Remotion licence
|
|
84
|
+
under which a 4-person for-profit is free; the threshold is written into it.
|
|
85
|
+
- **Maturity.** Remotion is on 4.0.518 after six years. HyperFrames has not shipped a
|
|
86
|
+
1.0. Everything below that number is allowed to move, and a composition written
|
|
87
|
+
today may need editing after a minor bump. That risk is real and is not cancelled by
|
|
88
|
+
the licence being friendlier.
|
|
89
|
+
|
|
90
|
+
## The recommendation, and the three conditions that reverse it
|
|
91
|
+
|
|
92
|
+
**Default to HyperFrames** for the work this skill is about — a designed page that
|
|
93
|
+
occasionally needs a rendered motion asset. Three reasons, in order of weight:
|
|
94
|
+
|
|
95
|
+
1. **The composition is written in the language the pack already speaks.** A pack's
|
|
96
|
+
`styles/tokens/<pack>.css` is a `:root` block of custom properties. In HyperFrames
|
|
97
|
+
it is `<link>`ed into the composition **unmodified** — the same file the site ships,
|
|
98
|
+
byte for byte, which is exactly the rule the kits already follow. In Remotion the
|
|
99
|
+
composition is React, and the token layer becomes a stylesheet imported into a
|
|
100
|
+
component tree: workable, and one translation step where a value can drift. This
|
|
101
|
+
library's entire position is that a token layer is copied and never transcribed, and
|
|
102
|
+
one of the two tools lets that hold across the render seam.
|
|
103
|
+
2. **The licence removes a question that has nothing to do with design.** Apache-2.0
|
|
104
|
+
over a seat count.
|
|
105
|
+
3. **The determinism rules are the doctrine's rules.** No wall clock, no unseeded
|
|
106
|
+
randomness, no fetch mid-frame, a locked output size, a finite length — the same
|
|
107
|
+
discipline `MOTION_DOCTRINE.md` §8 already demands of a page, restated for a
|
|
108
|
+
renderer. An author who has followed the doctrine has already followed this.
|
|
109
|
+
|
|
110
|
+
**Reach for Remotion instead when any one of these is true.**
|
|
111
|
+
|
|
112
|
+
- **The motion must be driven by application state in the page.** `@remotion/player` is
|
|
113
|
+
a React component: props go in, the composition re-renders, the page owns it. The
|
|
114
|
+
HyperFrames player is an iframe by design, which is excellent isolation and a wall
|
|
115
|
+
between your state and the timeline. A configurator, a live preview of a
|
|
116
|
+
user's edit, a chart the visitor drives — Remotion.
|
|
117
|
+
- **The product is a video pipeline, not a page.** Prompt-to-video, per-customer
|
|
118
|
+
renders, template farms at volume. Remotion has six years of Lambda operations behind
|
|
119
|
+
it and a price per render, which is a business model rather than an obstacle.
|
|
120
|
+
- **The team cannot carry a pre-1.0 dependency.** If a broken minor bump is a real cost
|
|
121
|
+
— a long-lived pipeline, a regulated client, a repository nobody will revisit for a
|
|
122
|
+
year — take the mature one and pay for it.
|
|
123
|
+
|
|
124
|
+
**A brief that hits none of those and the licence threshold is not close** — one
|
|
125
|
+
person, one landing page, one launch clip — can use either, and the tie-break is which
|
|
126
|
+
one the operator already knows. Say so rather than manufacturing a reason.
|
|
127
|
+
|
|
128
|
+
## The token seam
|
|
129
|
+
|
|
130
|
+
Whatever the tool, the rule is the library's existing one and it does not relax:
|
|
131
|
+
**a pack's token layer is copied, never transcribed**, and no colour literal appears
|
|
132
|
+
outside it. The seam differs only in mechanism.
|
|
133
|
+
|
|
134
|
+
**HyperFrames.** The composition is a document, so the token layer is a stylesheet:
|
|
135
|
+
|
|
136
|
+
```html
|
|
137
|
+
<head>
|
|
138
|
+
<link rel="stylesheet" href="./tokens/<pack>.css" />
|
|
139
|
+
</head>
|
|
140
|
+
<div data-composition-id="launch" data-width="1920" data-height="1080">
|
|
141
|
+
<h1 class="clip" data-start="0.4" data-duration="4">…</h1>
|
|
142
|
+
</div>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Everything after that consumes `var(--…)`, exactly as a kit does.
|
|
146
|
+
|
|
147
|
+
**Remotion.** Import the same file once at the composition root and consume the same
|
|
148
|
+
custom properties from `style` objects or CSS modules. Do **not** rebuild the palette
|
|
149
|
+
as a TypeScript object: two homes for one colour is the defect the DOCMAP's
|
|
150
|
+
single-home rule exists to prevent, and it is invisible until the site and the video
|
|
151
|
+
disagree in a screenshot.
|
|
152
|
+
|
|
153
|
+
Three token families need a decision the page never forced:
|
|
154
|
+
|
|
155
|
+
- **Durations.** A pack's `--dur-*` are page clocks in seconds. A renderer thinks in
|
|
156
|
+
frames. Convert at the edge — `frames = seconds × fps` — and keep the token as the
|
|
157
|
+
source. A duration typed twice is a duration that will drift.
|
|
158
|
+
- **The reduced-motion branch.** Every token layer in this library carries one. It
|
|
159
|
+
**does not fire in a render**, because a renderer has no user preference. See below.
|
|
160
|
+
- **Type.** A rendered frame has no font fallback worth the name: if the face has not
|
|
161
|
+
loaded before frame 0, the frame is wrong and stays wrong. Both tools require every
|
|
162
|
+
asset resolved before the first frame; a webfont is an asset.
|
|
163
|
+
|
|
164
|
+
## Reduced motion, on the other side of the render
|
|
165
|
+
|
|
166
|
+
This is the part neither tool does for you, and it is the doctrine's clause that most
|
|
167
|
+
often gets dropped at this seam.
|
|
168
|
+
|
|
169
|
+
- A rendered file **has no reduced-motion state**. The `@media (prefers-reduced-motion:
|
|
170
|
+
reduce)` block in the pack's token layer collapses nothing during a render, and that
|
|
171
|
+
is correct — there is no user there.
|
|
172
|
+
- Therefore the obligation moves **to the page that embeds the file**, and it is
|
|
173
|
+
concrete: no `autoplay` under the reduce query, a poster frame that is a real frame
|
|
174
|
+
of the piece rather than a title card, a visible control, and no `loop` on anything a
|
|
175
|
+
reader has to read past.
|
|
176
|
+
- If the asset exists *only* in a surface you do not control, say so in the pack's or
|
|
177
|
+
the project's notes. An unstated exemption reads as an oversight to the next reader,
|
|
178
|
+
which is how the clause quietly stops being followed.
|
|
179
|
+
- **A JavaScript-driven reveal has the same shape and is easier to miss.** A media
|
|
180
|
+
query cannot stop a transform a script sets. Where a composition's motion is scripted,
|
|
181
|
+
the script reads the preference itself. `styles/chorus.md` carries the worked case —
|
|
182
|
+
a reference with zero reduced-motion rules and 383 script-set transforms.
|
|
183
|
+
|
|
184
|
+
## Pre-flight for a rendered asset
|
|
185
|
+
|
|
186
|
+
Run this before the render, not after. It is the doctrine's §10 with the four items a
|
|
187
|
+
file adds.
|
|
188
|
+
|
|
189
|
+
- [ ] The brief actually wants a file. Page motion was considered and rejected for a
|
|
190
|
+
stated reason.
|
|
191
|
+
- [ ] The pack is chosen and its token layer is linked, not retyped.
|
|
192
|
+
- [ ] Output size, fps and duration are fixed and written down. Nothing reads a clock.
|
|
193
|
+
- [ ] Every asset — fonts, images, audio, video — resolves before frame 0.
|
|
194
|
+
- [ ] No `Date.now()`, no `requestAnimationFrame`, no unseeded `Math.random()` anywhere
|
|
195
|
+
in the composition.
|
|
196
|
+
- [ ] Durations came from the pack's tokens and were converted once.
|
|
197
|
+
- [ ] The theme the asset is baked against is stated, and the surface behind it matches.
|
|
198
|
+
- [ ] Any text that carries meaning is either also in the DOM, or its absence is a
|
|
199
|
+
deliberate, recorded choice.
|
|
200
|
+
- [ ] The embedding page withholds autoplay under `prefers-reduced-motion: reduce`,
|
|
201
|
+
ships a poster and a control.
|
|
202
|
+
- [ ] A byte-identical re-render was produced from the same input. If two runs differ,
|
|
203
|
+
something in the composition is reading the machine — pin the environment
|
|
204
|
+
(a container) before blaming the tool.
|
|
@@ -26,6 +26,25 @@ build new sites on the same principles and understand *why* each piece works.
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
+
## Contents
|
|
30
|
+
|
|
31
|
+
- 0. The one-paragraph thesis
|
|
32
|
+
- 1. Architecture at a glance
|
|
33
|
+
- 2. Layer 1 — The scroll store (the single clock)
|
|
34
|
+
- 3. Layer 2 — Smooth scroll (one position per frame)
|
|
35
|
+
- 4. Layer 3 — The particle field (the scene-formation engine)
|
|
36
|
+
- 5. Layer 4 — The 2D fallback (SignalMesh)
|
|
37
|
+
- 6. Layer 5 — The projection bridge (fusing DOM and WebGL)
|
|
38
|
+
- 7. Layer 6 — DOM choreography
|
|
39
|
+
- 8. Layer 7 — Reveal primitives (act-themed entrances)
|
|
40
|
+
- 9. Layer 8 — Scrubbed instruments (GSAP recipe)
|
|
41
|
+
- 10. Cross-cutting rules
|
|
42
|
+
- 11. Recipe — build a new SHELEG site from scratch
|
|
43
|
+
- 12. Why it works (the deeper principles)
|
|
44
|
+
- 13. File map (one file per idea)
|
|
45
|
+
- Quick reference — each rule, and the failure it prevents
|
|
46
|
+
- Three looks that are defaults, not decisions
|
|
47
|
+
|
|
29
48
|
## 0. The one-paragraph thesis
|
|
30
49
|
|
|
31
50
|
A landing page feels "alive" not because it has many animations, but because a
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sheleg-design
|
|
3
|
-
description: Use when deciding how something LOOKS or MOVES — cinematic landing pages and hero sections, particle/WebGL backgrounds, scroll-linked or scrubbed motion, layers that drift, dashboards, admin or internal tools, mobile screens, chat or agent interfaces, tokens, themes, palettes, typography and the Figma border. Triggers
|
|
3
|
+
description: Use when deciding how something LOOKS or MOVES — cinematic landing pages and hero sections, particle/WebGL backgrounds, scroll-linked or scrubbed motion, layers that drift, dashboards, admin or internal tools, mobile screens, chat or agent interfaces, tokens, themes, palettes, typography and the Figma border. Triggers: "design a landing" / "дизайн лендинга", "build a landing page" / "сделай лендинг", "scroll animation" / "скролл-анимация", "dashboard style" / "стиль дашборда", "design tokens, style pack" / "дизайн-токены", "light/dark theme" / "светлая/тёмная тема", "figma variables" / "переменные фигмы, фигма в код", "mobile screen" / "мобильный экран", "palette, colors" / "палитра, цвета", "typography, font" / "типографика, шрифт", "how it looks, make it prettier" / "выглядит, красиво, красивее", "visual reference" / "визуальные референсы", "investor deck as a web page" / "веб-презентация". Not for structure, copy, backend behavior, or .pptx decks.
|
|
4
4
|
license: MIT
|
|
5
|
+
compatibility: Optional siblings — dataviz, shadcn, migrate-radix-to-base; each has an in-text fallback when absent.
|
|
5
6
|
metadata:
|
|
6
|
-
version: 1.
|
|
7
|
+
version: 1.57.0
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
# SHELEG Design
|
|
@@ -38,6 +39,9 @@ duration ceiling, the forbidden forms, and the reduced-motion contract.
|
|
|
38
39
|
- AI product surfaces: chat and agent UI, streaming output, run logs, model errors,
|
|
39
40
|
generated-content and confirmation states ([`AI_PRODUCT_PATTERNS.md`](./AI_PRODUCT_PATTERNS.md))
|
|
40
41
|
- Moving a visual system across the Figma border either way ([`FIGMA_BRIDGE.md`](./FIGMA_BRIDGE.md))
|
|
42
|
+
- Motion that has to leave the page as a rendered file — a launch video, a feature
|
|
43
|
+
loop, a social cut ([`MOTION_PRODUCTION.md`](./MOTION_PRODUCTION.md)), which also
|
|
44
|
+
names the two programmatic-video tools and which one to reach for
|
|
41
45
|
|
|
42
46
|
**Never apply the cinematic motion layer to:** product UI, docs sites, static content
|
|
43
47
|
sites — or any page whose visual system or copy isn't finished yet. Product UI takes
|
|
@@ -153,10 +157,14 @@ as a definition of done, in that order:
|
|
|
153
157
|
- **Scene depth — six layers** ([`SURFACE_COMPOSITION.md`](./SURFACE_COMPOSITION.md)),
|
|
154
158
|
before writing CSS for a cinematic page. A scene has planes; everything on one
|
|
155
159
|
plane is the failure no amount of easing repairs.
|
|
156
|
-
- **Charts —
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
- **Charts — the role contract in the same file, plus the `dataviz` handoff
|
|
161
|
+
where that skill exists**, before drawing a chart in any pack. Token names are
|
|
162
|
+
not uniform across the thirty-nine packs — only `--bg` and `--ink` resolve in
|
|
163
|
+
every one — and an undefined custom property does not error, it silently falls
|
|
164
|
+
back. Guessing one is the quietest way to ship a wrong chart. A `dataviz`
|
|
165
|
+
skill is an optional neighbour this skill does not ship: where none is
|
|
166
|
+
installed, the role table in `SURFACE_COMPOSITION.md` IS the chart contract,
|
|
167
|
+
applied by hand.
|
|
160
168
|
- **Mobile surfaces** ([`MOBILE_SURFACES.md`](./MOBILE_SURFACES.md)), when the
|
|
161
169
|
brief is a native app screen or a mobile-web view — not a desktop page whose
|
|
162
170
|
only mobile concern is collapse. Five mobile rules the packs each state alone,
|
|
@@ -229,9 +237,13 @@ there, the work is bespoke scroll and WebGL, and reaching for a component kit is
|
|
|
229
237
|
how a hero ends up looking like a settings screen.
|
|
230
238
|
|
|
231
239
|
**Who does the work.** This section decides *whether* and *against which tokens*.
|
|
232
|
-
|
|
233
|
-
`migrate-radix-to-base` handles the Radix→Base move; both are
|
|
234
|
-
|
|
240
|
+
Where the `shadcn` skill is installed it does the adding, searching and
|
|
241
|
+
composing, and `migrate-radix-to-base` handles the Radix→Base move; both are
|
|
242
|
+
**optional neighbours** this skill declares in its `compatibility` line and does
|
|
243
|
+
not ship, and they trigger on their own words where present. Where they are
|
|
244
|
+
absent nothing is blocked: the kit's own CLI (`npx shadcn@latest add
|
|
245
|
+
<component>`) does the adding, and the token mapping above binds either way. Do
|
|
246
|
+
not restate their component docs here.
|
|
235
247
|
|
|
236
248
|
## Optional — Figma (design ↔ code)
|
|
237
249
|
|
|
@@ -53,9 +53,15 @@ A pack that bans grain and blur leaves the slot empty rather than filling it —
|
|
|
53
53
|
|
|
54
54
|
## Charts and data — hand the pack to `dataviz`
|
|
55
55
|
|
|
56
|
-
Do not
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
Do not let a chart library pick its own colours. Where a `dataviz` skill is
|
|
57
|
+
installed, it owns chart form, colour roles and the runnable palette validation,
|
|
58
|
+
and a pack is the *parameter set* it consumes — hand it the values mapped below.
|
|
59
|
+
That skill is an **optional neighbour**: this skill declares it in its
|
|
60
|
+
`compatibility` front-matter and does not ship it, so its absence is an ordinary
|
|
61
|
+
state, not a broken install. **Where no dataviz skill is installed, the role
|
|
62
|
+
table below is the contract** — resolve each role from the chosen pack's token
|
|
63
|
+
layer by hand, and the status map and the two rules at the end of this section
|
|
64
|
+
bind exactly the same, with nobody to hand them to.
|
|
59
65
|
|
|
60
66
|
**Read the chosen pack's own token names before you write a single `var()`.**
|
|
61
67
|
This table is by *role*, not by token, because the names are not uniform across
|