sheleg-design-skill 1.55.0 → 1.56.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 +59 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/plugins/sheleg-design/.claude-plugin/plugin.json +1 -1
- package/plugins/sheleg-design/skills/sheleg-design/MOTION_DOCTRINE.md +4 -0
- package/plugins/sheleg-design/skills/sheleg-design/MOTION_PRODUCTION.md +194 -0
- package/plugins/sheleg-design/skills/sheleg-design/SKILL.md +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,65 @@ follow [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.56.0] - 2026-08-30
|
|
10
|
+
|
|
11
|
+
### The render seam — what changes when motion stops being a page
|
|
12
|
+
|
|
13
|
+
New companion document, `MOTION_PRODUCTION.md`. `MOTION_DOCTRINE.md` decides whether a
|
|
14
|
+
thing on a page may move and how; this one starts at the question it never answered —
|
|
15
|
+
what happens when the motion has to become a **file**, and what that costs.
|
|
16
|
+
|
|
17
|
+
**The position it takes first, before naming any tool: a rendered asset is not page
|
|
18
|
+
motion with a different extension.** Four things are given up and a page should give
|
|
19
|
+
them up on purpose — the reduced-motion contract (a file has no user preference to
|
|
20
|
+
read, so the obligation moves to the embedding page: no autoplay under the reduce
|
|
21
|
+
query, a real poster frame, a control), the theme (every pack declares `Themes:` and a
|
|
22
|
+
baked frame answers only one of them), the text (unselectable, untranslatable,
|
|
23
|
+
unindexable), and the first frame's decode. The document states what a rendered asset
|
|
24
|
+
is genuinely for — a surface you do not control, a piece with audio, a piece that must
|
|
25
|
+
look identical everywhere — and carries the refusal phrase for the rest.
|
|
26
|
+
|
|
27
|
+
**Two programmatic-video tools, measured on 2026-08-30 rather than characterised.**
|
|
28
|
+
Both seek a headless browser frame by frame and encode with FFmpeg; they differ in the
|
|
29
|
+
language the composition is written in and in what using them costs.
|
|
30
|
+
|
|
31
|
+
- **Remotion** — the composition is a React component reading `useCurrentFrame()`. Its
|
|
32
|
+
licence is its own two-tier one, not an OSI licence: free for individuals, for-profit
|
|
33
|
+
organizations **with up to 3 employees**, non-profits and evaluation, and a paid
|
|
34
|
+
Company License above that. On `remotion` 4.0.518 after six years; FFmpeg bundled
|
|
35
|
+
since v4.0; `@remotion/player` is a React component that takes props.
|
|
36
|
+
- **HyperFrames** — the composition is an HTML document with `data-start` /
|
|
37
|
+
`data-duration` timing and a seekable runtime (GSAP, CSS, WAAPI, Lottie, Three.js).
|
|
38
|
+
**Apache-2.0.** On `hyperframes` 0.8.20 and **pre-1.0**, which is stated as a real
|
|
39
|
+
risk rather than a footnote; requires Node 22+ and a separate FFmpeg. Its player is a
|
|
40
|
+
web component in an isolated iframe.
|
|
41
|
+
|
|
42
|
+
**The recommendation is HyperFrames, and the reason is this library's own rule.** A
|
|
43
|
+
pack's `styles/tokens/<pack>.css` is a `:root` block; in an HTML composition it is
|
|
44
|
+
`<link>`ed in **unmodified** — the same file the site ships, which is the
|
|
45
|
+
copy-never-transcribe rule the kits already follow, holding across the render seam. Two
|
|
46
|
+
supporting reasons: Apache-2.0 removes a seat question that has nothing to do with
|
|
47
|
+
design, and its determinism rules are the doctrine's anti-drift rules restated for a
|
|
48
|
+
renderer.
|
|
49
|
+
|
|
50
|
+
**Three conditions reverse it, and they are named rather than hedged:** motion driven
|
|
51
|
+
by application state in the page (the Remotion player is a React component; the
|
|
52
|
+
HyperFrames one is an iframe by design), a product that is a video pipeline rather
|
|
53
|
+
than a page, and a team that cannot carry a pre-1.0 dependency. Where a brief hits none
|
|
54
|
+
of them and the licence threshold is not close, the document says to use whichever the
|
|
55
|
+
operator already knows instead of manufacturing a reason.
|
|
56
|
+
|
|
57
|
+
### Also in this release
|
|
58
|
+
|
|
59
|
+
- The token seam per tool, with the three families that need a decision the page never
|
|
60
|
+
forced: durations converted once at the edge (`frames = seconds × fps`, the token
|
|
61
|
+
staying the source), the reduced-motion branch that correctly fires on neither side
|
|
62
|
+
of a render, and webfonts, which are assets and must resolve before frame 0.
|
|
63
|
+
- A ten-item pre-flight for a rendered asset, ending on the check that separates a tool
|
|
64
|
+
problem from a composition problem: a byte-identical re-render from the same input.
|
|
65
|
+
- `MOTION_DOCTRINE.md` §10 gains the routing line, and states nothing itself — the
|
|
66
|
+
DOCMAP's single-home rule.
|
|
67
|
+
|
|
9
68
|
## [1.55.0] - 2026-08-30
|
|
10
69
|
|
|
11
70
|
### 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.56.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"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "sheleg-design",
|
|
3
3
|
"displayName": "SHELEG Design",
|
|
4
4
|
"description": "SHELEG Design methodology: cinematic scroll-driven landing pages (single scroll clock, layered degrade-to-calm motion, WebGL particle formations), a motion doctrine that decides whether to animate before it decides how, and thirty-nine pluggable visual style packs — instrument-console (dark console), editorial-luxury (warm editorial), workbench (light/dark product UI for dashboards and tools), briefing-room (dark 16:9 deck), atrium (warm consumer health), orchard, outrank, babylove (friendly consumer biotech), patchbay (a dark live schematic: one mint-cyan, 8% hairlines and no shadow, and an architecture diagram whose cords carry SMIL particles), field-notes (warm paper for dev tools sold on auditability), cyclorama (a pastel field on a 32s cycle), showroom (the product as the exhibit), blueprint (a drawing sheet, zero radius), prism (one iridescent wash over mono body), maquette (cream axonometric models on a dark table), scoreboard (warm paper, pixel numerals, a dark ledger of results), datasheet (an off-white spec sheet whose live instrument goes dark when it detects the reader is hiding), manpage (a developer landing page set in the reader's own system monospace on cream paper, with coral label chips that are real headings and a dark code frame as the argument), pigeonhole (a white sorting wall whose nine pastel categories are a filing scheme rather than a mood, each a two-layer chip whose label word is mandatory), roster (a white field in a faint grid of squares whose argument is other people's marks — client logotypes in pill-labelled industry columns, an engine's wordmark inside the headline — where the proof is a name rather than a number), ora (a warm coal field with cream ink and no third hue — the accent is the inverted field — a serif carrying every human sentence over a monospace carrying every machine fact, a terminal surface cut below the page, and a six-step verdict ramp, for products whose output is a machine's verdict about the reader), tenor (warm paper with zero radius and zero shadow, one hairline weight, an orange that exists only on hover and on focus, a sans tracked negative against a mono tracked positive, display at a line-height below one in an eight-to-twelve-character measure, and product proof delivered as silent looping video, for products arguing that a new kind of thing must be managed like an existing organisation), paperclip (neutral coal with no functional colour at all — every control monochrome and elevation made of hairlines, with the whole chromatic budget spent on a curtain of gradient capsules and twelve gradient section badges that cannot be clicked — for products that ask a person to run something that runs itself: agent teams, autonomous back-office, schedulers and budget-governed compute), ledger (warm cream paper ruled by a hairline at 12% ink and no shadow on any card, radius 15 nested concentrically, an ink primary button and a terracotta accent that never fills a control — it labels, as a 10px monospace uppercase kicker — with a seal on every card stating how its number is known, for the console of a product that answers questions about data: AI analysts, BI surfaces, query workspaces), router (a near-white field with a trace of blue and white cards standing on it, hairline seams instead of shadows anywhere, body at 14px and weight 450, and a status triplet in which the colour you paint with is not the colour you write with, for product consoles and the landing pages that have to look like them), daylight (a cool near-white portal field with generous radii and one very large soft shadow spent on a single object per screen, for client portals), notation (a near-white page drawn entirely in hairlines with a light serif over a monospace, no bold anywhere and an ink primary, for developer products sold on restraint), almanac (oatmeal paper with 2px seams and no 1px anywhere, a display set below a line-height of one, and mono tags notched through drawn boxes, for pages that assert a category), vitrine (a white hairline field with a serif display, an ink primary and one framed record carrying the evidence, for the front door of a product sold on trust). Ships the sheleg-design skill, the architecture reference, the motion doctrine, the Figma and Claude Design bridges, AI-surface patterns, style packs with ready-made token CSS, and the /sheleg-design command, and awning (a white forecourt where the accent is black and no hue reaches the chrome at all, a pill whose radius is a declared component token, one variable grotesque at 420/550 with no 700, and a single three-layer shadow, for commerce and platform front doors), and proscenium (a white field carrying two cool acts and one deep indigo act at the middle, an electric violet filling a control that stays nearly square at 4px against cards at 16, one family at nine weights, and a framed product panel the fold cuts off, for product-led marketing front doors whose argument is a demonstration), and bulletin (warm cream paper cut by flat pastel bands, every card and control a 1px ink outline standing on a hard zero-blur ink offset it travels into when pressed, a display face at 800 inside controls and 700 in the headline, and no tracking at any size, for front doors whose argument is breadth), and nameplate (a cool near-white slab under a page that is square on 87% of its elements, where the one round shape is reserved for a white 1px-bordered pill carrying somebody else's publication name as type, one family with the body at weight 500, and two uppercase registers tracked 0.06em and 0.175em, for pages whose argument is that named third parties will vouch for you: press placement, trust marks, certification and review aggregation), and rimlight (a white field with a cool grey act separator and one near-black act, a grotesque for every sentence and a monospace for every piece of chrome, square on 84% of its elements and tracked negative at every size, whose only elevation is a sixteen-layer coloured light rig — six layers lit and ten held at alpha 0, thrown from below-left — for a studio's own front door and the pages that sell what it makes), and onionskin (a white technical sheet at 96.5% zero radius — the squarest page in the library — where two bases do all the work and everything quiet is one of them at an alpha: text dims through the ink, structure dims through a navy that is never a word, over a dot grid with dashed hairlines and three faces at an 11px working size, for developer and AI infrastructure whose front page is a working document), deskmate, test-drive, surveyor, and chorus (warm off-white paper under a faint construction grid with a crosshair at every intersection, where the set piece is somebody else's question in a cut-corner bubble — 24px on three corners and 0 on the top right — over near-black slabs cut into the sheet, one coral that fills but never writes, and a periwinkle that only exists inside a gradient, for AI-search visibility, brand monitoring and community marketing whose proof is other people's conversations) (a warm beige working day lit from one source above the top edge, where a single four-stop ramp — peach, lilac, violet, deep navy — washes the field, fills a panel and fills one word of a heading, everything a hand touches is a pill at 56px and everything else a 32px slab, elevation is a field step with two shadows on a 10,211px page, and the set piece is a framed transcript whose quoted chat client keeps its own face, ink and status colours under a --quoted-* namespace, for products sold as a colleague rather than a tool: AI employees and chat-native agents).",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.56.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -305,6 +305,10 @@ Before calling motion done:
|
|
|
305
305
|
- [ ] `markers` removed.
|
|
306
306
|
- [ ] Reduced motion tested by actually turning it on.
|
|
307
307
|
- [ ] The page still looks like the pack (§8).
|
|
308
|
+
- [ ] Nothing in the diff is a rendered video standing in for page motion. If a file
|
|
309
|
+
IS the right answer, the obligations move with it —
|
|
310
|
+
[`MOTION_PRODUCTION.md`](./MOTION_PRODUCTION.md) owns that seam, including where
|
|
311
|
+
this section's contract lands once there is no user to read a media query.
|
|
308
312
|
|
|
309
313
|
---
|
|
310
314
|
|
|
@@ -0,0 +1,194 @@
|
|
|
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
|
+
## The boundary
|
|
13
|
+
|
|
14
|
+
| The motion is… | It belongs to | Read |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| in the page, driven by scroll, hover, focus or state | the page | `MOTION_DOCTRINE.md`, then `SHELEG_DESIGN.md` |
|
|
17
|
+
| in the page, but authored as a timeline and played back | the page | `MOTION_DOCTRINE.md` §6 and §9 still bind |
|
|
18
|
+
| a file the page embeds, or a file that never touches the page | **this document** | below |
|
|
19
|
+
| a Lottie or a Figma export dropped into the page | the page | `MOTION_DOCTRINE.md` §7 |
|
|
20
|
+
|
|
21
|
+
**Refusal phrase: "no render."** A brief that says *animate the hero* is page motion
|
|
22
|
+
and stays page motion. Reaching for a rendered file there is a downgrade, and the
|
|
23
|
+
next section prices it.
|
|
24
|
+
|
|
25
|
+
## Before the tool: what a rendered asset costs
|
|
26
|
+
|
|
27
|
+
A video in a hero looks like a shortcut and is a trade. Four things are given up, and
|
|
28
|
+
a page should only give them up on purpose.
|
|
29
|
+
|
|
30
|
+
1. **The reduced-motion contract.** A rendered file has no
|
|
31
|
+
`prefers-reduced-motion`. The doctrine's rule does not stop applying because the
|
|
32
|
+
motion moved into an MP4 — it moves to the **embedding page**, which owes a poster
|
|
33
|
+
frame, `autoplay` withheld under the reduce query, and a control. A hero video that
|
|
34
|
+
autoplays regardless is a doctrine violation wearing a different file extension.
|
|
35
|
+
2. **The theme.** A pack's token layer answers a dark surface; a rendered frame cannot.
|
|
36
|
+
Every pack in this library declares `Themes:`, and a video baked against one of them
|
|
37
|
+
is wrong on the other. Either the surface behind it is fixed, or the asset is
|
|
38
|
+
rendered per theme, or the motion stays in the page.
|
|
39
|
+
3. **The text.** Type in a rendered frame is not selectable, not translatable, not
|
|
40
|
+
readable by a screen reader and not indexable. A headline that matters is DOM.
|
|
41
|
+
4. **The weight and the first frame.** The page's opening viewport now depends on a
|
|
42
|
+
decode. `frontend-performance` owns that number; this document only records that
|
|
43
|
+
the cost exists and lands on LCP.
|
|
44
|
+
|
|
45
|
+
**What a rendered asset is genuinely for:** a surface you do not control (a social
|
|
46
|
+
timeline, an app store, an ad slot, an email), a piece longer than an interaction, a
|
|
47
|
+
piece with an audio track, and anything that must look identical on every machine.
|
|
48
|
+
That last one is the whole reason both tools below exist.
|
|
49
|
+
|
|
50
|
+
## The two tools, measured
|
|
51
|
+
|
|
52
|
+
Both turn code into a deterministic MP4 by seeking a headless browser frame by frame
|
|
53
|
+
and encoding the result. They differ in the language the composition is written in and
|
|
54
|
+
in what using them costs. Read on 2026-08-30; version numbers and prices move, so
|
|
55
|
+
re-read before quoting them.
|
|
56
|
+
|
|
57
|
+
| | **Remotion** | **HyperFrames** |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| The composition is | a React component reading `useCurrentFrame()` | an HTML document with `data-start` / `data-duration` timing attributes and a seekable animation runtime |
|
|
60
|
+
| Licence | its own two-tier licence, **not** an OSI one | **Apache-2.0** |
|
|
61
|
+
| Free for | individuals, for-profit organizations **with up to 3 employees**, non-profits, and evaluation | everyone |
|
|
62
|
+
| 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 |
|
|
63
|
+
| First release | 2020 | 2026 |
|
|
64
|
+
| Version on npm at the reading | `remotion` 4.0.518 | `hyperframes` 0.8.20 — **pre-1.0** |
|
|
65
|
+
| FFmpeg | bundled since v4.0; no separate install | **required separately**, plus Node 22+ |
|
|
66
|
+
| In-page playback | `@remotion/player`, a React component that takes props | `@hyperframes/player`, a web component that loads the composition in an **isolated iframe** |
|
|
67
|
+
| Distributed rendering | AWS Lambda, Node SSR, Vercel, Cloud Run | AWS Lambda, Google Cloud Run, the vendor's managed cloud |
|
|
68
|
+
| Agent surface | a skill set plus a documentation MCP | 20 skills behind one `/hyperframes` router, and a `/remotion-to-hyperframes` porting skill |
|
|
69
|
+
|
|
70
|
+
Two asymmetries decide most briefs, and they point in opposite directions.
|
|
71
|
+
|
|
72
|
+
- **Licence.** A studio of four people must pay to use Remotion commercially and may
|
|
73
|
+
use HyperFrames without asking anyone. There is no reading of the Remotion licence
|
|
74
|
+
under which a 4-person for-profit is free; the threshold is written into it.
|
|
75
|
+
- **Maturity.** Remotion is on 4.0.518 after six years. HyperFrames has not shipped a
|
|
76
|
+
1.0. Everything below that number is allowed to move, and a composition written
|
|
77
|
+
today may need editing after a minor bump. That risk is real and is not cancelled by
|
|
78
|
+
the licence being friendlier.
|
|
79
|
+
|
|
80
|
+
## The recommendation, and the three conditions that reverse it
|
|
81
|
+
|
|
82
|
+
**Default to HyperFrames** for the work this skill is about — a designed page that
|
|
83
|
+
occasionally needs a rendered motion asset. Three reasons, in order of weight:
|
|
84
|
+
|
|
85
|
+
1. **The composition is written in the language the pack already speaks.** A pack's
|
|
86
|
+
`styles/tokens/<pack>.css` is a `:root` block of custom properties. In HyperFrames
|
|
87
|
+
it is `<link>`ed into the composition **unmodified** — the same file the site ships,
|
|
88
|
+
byte for byte, which is exactly the rule the kits already follow. In Remotion the
|
|
89
|
+
composition is React, and the token layer becomes a stylesheet imported into a
|
|
90
|
+
component tree: workable, and one translation step where a value can drift. This
|
|
91
|
+
library's entire position is that a token layer is copied and never transcribed, and
|
|
92
|
+
one of the two tools lets that hold across the render seam.
|
|
93
|
+
2. **The licence removes a question that has nothing to do with design.** Apache-2.0
|
|
94
|
+
over a seat count.
|
|
95
|
+
3. **The determinism rules are the doctrine's rules.** No wall clock, no unseeded
|
|
96
|
+
randomness, no fetch mid-frame, a locked output size, a finite length — the same
|
|
97
|
+
discipline `MOTION_DOCTRINE.md` §8 already demands of a page, restated for a
|
|
98
|
+
renderer. An author who has followed the doctrine has already followed this.
|
|
99
|
+
|
|
100
|
+
**Reach for Remotion instead when any one of these is true.**
|
|
101
|
+
|
|
102
|
+
- **The motion must be driven by application state in the page.** `@remotion/player` is
|
|
103
|
+
a React component: props go in, the composition re-renders, the page owns it. The
|
|
104
|
+
HyperFrames player is an iframe by design, which is excellent isolation and a wall
|
|
105
|
+
between your state and the timeline. A configurator, a live preview of a
|
|
106
|
+
user's edit, a chart the visitor drives — Remotion.
|
|
107
|
+
- **The product is a video pipeline, not a page.** Prompt-to-video, per-customer
|
|
108
|
+
renders, template farms at volume. Remotion has six years of Lambda operations behind
|
|
109
|
+
it and a price per render, which is a business model rather than an obstacle.
|
|
110
|
+
- **The team cannot carry a pre-1.0 dependency.** If a broken minor bump is a real cost
|
|
111
|
+
— a long-lived pipeline, a regulated client, a repository nobody will revisit for a
|
|
112
|
+
year — take the mature one and pay for it.
|
|
113
|
+
|
|
114
|
+
**A brief that hits none of those and the licence threshold is not close** — one
|
|
115
|
+
person, one landing page, one launch clip — can use either, and the tie-break is which
|
|
116
|
+
one the operator already knows. Say so rather than manufacturing a reason.
|
|
117
|
+
|
|
118
|
+
## The token seam
|
|
119
|
+
|
|
120
|
+
Whatever the tool, the rule is the library's existing one and it does not relax:
|
|
121
|
+
**a pack's token layer is copied, never transcribed**, and no colour literal appears
|
|
122
|
+
outside it. The seam differs only in mechanism.
|
|
123
|
+
|
|
124
|
+
**HyperFrames.** The composition is a document, so the token layer is a stylesheet:
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<head>
|
|
128
|
+
<link rel="stylesheet" href="./tokens/<pack>.css" />
|
|
129
|
+
</head>
|
|
130
|
+
<div data-composition-id="launch" data-width="1920" data-height="1080">
|
|
131
|
+
<h1 class="clip" data-start="0.4" data-duration="4">…</h1>
|
|
132
|
+
</div>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Everything after that consumes `var(--…)`, exactly as a kit does.
|
|
136
|
+
|
|
137
|
+
**Remotion.** Import the same file once at the composition root and consume the same
|
|
138
|
+
custom properties from `style` objects or CSS modules. Do **not** rebuild the palette
|
|
139
|
+
as a TypeScript object: two homes for one colour is the defect the DOCMAP's
|
|
140
|
+
single-home rule exists to prevent, and it is invisible until the site and the video
|
|
141
|
+
disagree in a screenshot.
|
|
142
|
+
|
|
143
|
+
Three token families need a decision the page never forced:
|
|
144
|
+
|
|
145
|
+
- **Durations.** A pack's `--dur-*` are page clocks in seconds. A renderer thinks in
|
|
146
|
+
frames. Convert at the edge — `frames = seconds × fps` — and keep the token as the
|
|
147
|
+
source. A duration typed twice is a duration that will drift.
|
|
148
|
+
- **The reduced-motion branch.** Every token layer in this library carries one. It
|
|
149
|
+
**does not fire in a render**, because a renderer has no user preference. See below.
|
|
150
|
+
- **Type.** A rendered frame has no font fallback worth the name: if the face has not
|
|
151
|
+
loaded before frame 0, the frame is wrong and stays wrong. Both tools require every
|
|
152
|
+
asset resolved before the first frame; a webfont is an asset.
|
|
153
|
+
|
|
154
|
+
## Reduced motion, on the other side of the render
|
|
155
|
+
|
|
156
|
+
This is the part neither tool does for you, and it is the doctrine's clause that most
|
|
157
|
+
often gets dropped at this seam.
|
|
158
|
+
|
|
159
|
+
- A rendered file **has no reduced-motion state**. The `@media (prefers-reduced-motion:
|
|
160
|
+
reduce)` block in the pack's token layer collapses nothing during a render, and that
|
|
161
|
+
is correct — there is no user there.
|
|
162
|
+
- Therefore the obligation moves **to the page that embeds the file**, and it is
|
|
163
|
+
concrete: no `autoplay` under the reduce query, a poster frame that is a real frame
|
|
164
|
+
of the piece rather than a title card, a visible control, and no `loop` on anything a
|
|
165
|
+
reader has to read past.
|
|
166
|
+
- If the asset exists *only* in a surface you do not control, say so in the pack's or
|
|
167
|
+
the project's notes. An unstated exemption reads as an oversight to the next reader,
|
|
168
|
+
which is how the clause quietly stops being followed.
|
|
169
|
+
- **A JavaScript-driven reveal has the same shape and is easier to miss.** A media
|
|
170
|
+
query cannot stop a transform a script sets. Where a composition's motion is scripted,
|
|
171
|
+
the script reads the preference itself. `styles/chorus.md` carries the worked case —
|
|
172
|
+
a reference with zero reduced-motion rules and 383 script-set transforms.
|
|
173
|
+
|
|
174
|
+
## Pre-flight for a rendered asset
|
|
175
|
+
|
|
176
|
+
Run this before the render, not after. It is the doctrine's §10 with the four items a
|
|
177
|
+
file adds.
|
|
178
|
+
|
|
179
|
+
- [ ] The brief actually wants a file. Page motion was considered and rejected for a
|
|
180
|
+
stated reason.
|
|
181
|
+
- [ ] The pack is chosen and its token layer is linked, not retyped.
|
|
182
|
+
- [ ] Output size, fps and duration are fixed and written down. Nothing reads a clock.
|
|
183
|
+
- [ ] Every asset — fonts, images, audio, video — resolves before frame 0.
|
|
184
|
+
- [ ] No `Date.now()`, no `requestAnimationFrame`, no unseeded `Math.random()` anywhere
|
|
185
|
+
in the composition.
|
|
186
|
+
- [ ] Durations came from the pack's tokens and were converted once.
|
|
187
|
+
- [ ] The theme the asset is baked against is stated, and the surface behind it matches.
|
|
188
|
+
- [ ] Any text that carries meaning is either also in the DOM, or its absence is a
|
|
189
|
+
deliberate, recorded choice.
|
|
190
|
+
- [ ] The embedding page withholds autoplay under `prefers-reduced-motion: reduce`,
|
|
191
|
+
ships a poster and a control.
|
|
192
|
+
- [ ] A byte-identical re-render was produced from the same input. If two runs differ,
|
|
193
|
+
something in the composition is reading the machine — pin the environment
|
|
194
|
+
(a container) before blaming the tool.
|
|
@@ -3,7 +3,7 @@ name: sheleg-design
|
|
|
3
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 include "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" / "презентация". Not for structure, copy or backend behavior.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.56.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# SHELEG Design
|
|
@@ -38,6 +38,9 @@ duration ceiling, the forbidden forms, and the reduced-motion contract.
|
|
|
38
38
|
- AI product surfaces: chat and agent UI, streaming output, run logs, model errors,
|
|
39
39
|
generated-content and confirmation states ([`AI_PRODUCT_PATTERNS.md`](./AI_PRODUCT_PATTERNS.md))
|
|
40
40
|
- Moving a visual system across the Figma border either way ([`FIGMA_BRIDGE.md`](./FIGMA_BRIDGE.md))
|
|
41
|
+
- Motion that has to leave the page as a rendered file — a launch video, a feature
|
|
42
|
+
loop, a social cut ([`MOTION_PRODUCTION.md`](./MOTION_PRODUCTION.md)), which also
|
|
43
|
+
names the two programmatic-video tools and which one to reach for
|
|
41
44
|
|
|
42
45
|
**Never apply the cinematic motion layer to:** product UI, docs sites, static content
|
|
43
46
|
sites — or any page whose visual system or copy isn't finished yet. Product UI takes
|