cueframe 0.9.4 → 0.11.3
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/README.md +39 -30
- package/dist/analyze-C3MSCON6.js +2 -0
- package/dist/chunk-OAJBHFAJ.js +18 -0
- package/dist/cueframe.js +55 -54
- package/dist/skills/add-music-bed/SKILL.md +5 -23
- package/dist/skills/brand-reel/SKILL.md +5 -28
- package/dist/skills/clip-a-talking-head/SKILL.md +2 -20
- package/dist/skills/composing-video/SKILL.md +36 -424
- package/dist/skills/composing-video/references/acceptance-template.md +21 -0
- package/dist/skills/composing-video/references/audio-design.md +125 -0
- package/dist/skills/composing-video/references/card-and-motion-runtime.md +49 -0
- package/dist/skills/composing-video/references/craft-principles.md +25 -0
- package/dist/skills/composing-video/references/film-planning.md +37 -0
- package/dist/skills/composing-video/references/format-decisions.md +17 -0
- package/dist/skills/composing-video/references/format-playbooks.md +96 -0
- package/dist/skills/composing-video/references/motion-design.md +25 -0
- package/dist/skills/composing-video/references/project-policy.md +18 -0
- package/dist/skills/composing-video/references/sfx-pack.md +69 -0
- package/dist/skills/composing-video/references/sound-and-timing.md +15 -0
- package/dist/skills/composing-video/references/tool-map.md +43 -0
- package/dist/skills/cueframe-brand-demo/SKILL.md +2 -8
- package/dist/skills/cueframe-cli/SKILL.md +73 -59
- package/dist/skills/cueframe-component-authoring/SKILL.md +20 -169
- package/dist/skills/cueframe-component-authoring/references/authoring-paths.md +72 -0
- package/dist/skills/cueframe-component-authoring/references/forking-and-layout.md +35 -0
- package/dist/skills/cueframe-component-authoring/references/native-component-workflows.md +98 -0
- package/dist/skills/cueframe-component-authoring/references/native-source-contract.md +54 -0
- package/dist/skills/cueframe-component-authoring/references/parented-device-card.json +13 -0
- package/dist/skills/cueframe-component-authoring/references/parented-motion.md +25 -0
- package/dist/skills/cueframe-component-authoring/references/retired-projects.md +26 -0
- package/dist/skills/cueframe-compose-loop/SKILL.md +14 -112
- package/dist/skills/cueframe-compose-loop/references/convergence-loop.md +128 -0
- package/dist/skills/cueframe-compose-loop/references/preview-workflow.md +7 -3
- package/dist/skills/cueframe-connect/SKILL.md +4 -9
- package/dist/skills/cueframe-connect/references/tools.md +146 -0
- package/dist/skills/cueframe-product-video/SKILL.md +9 -14
- package/dist/skills/cueframe-reference-video/SKILL.md +30 -0
- package/dist/skills/cueframe-reference-video/references/measurement-and-comparison.md +45 -0
- package/dist/skills/cueframe-reference-video/scripts/motion-grid.sh +116 -0
- package/dist/skills/cueframe-scene-shot/SKILL.md +2 -8
- package/dist/skills/cueframe-storyboard/SKILL.md +1 -7
- package/dist/skills/every-format-from-one-edit/SKILL.md +3 -19
- package/dist/skills/extracting-brand-kits/SKILL.md +1 -7
- package/dist/skills/launch-video/SKILL.md +6 -26
- package/dist/skills/make-a-social-reel/SKILL.md +7 -26
- package/dist/skills/rebrand-a-video/SKILL.md +2 -19
- package/dist/skills/video-craft-standards/SKILL.md +20 -103
- package/dist/skills/video-craft-standards/references/format-standards.md +118 -0
- package/package.json +12 -11
- package/dist/analyze-XP2BESVX.js +0 -2
- package/dist/chunk-RSOHINDT.js +0 -18
|
@@ -5,13 +5,7 @@ description: Use when editing, clipping, or rendering video via the CueFrame CLI
|
|
|
5
5
|
|
|
6
6
|
# CueFrame CLI
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
|
|
11
|
-
|
|
12
|
-
Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
|
|
13
|
-
|
|
14
|
-
For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
|
|
8
|
+
Use the [project and capability policy](../composing-video/references/project-policy.md) for scope, current state and metered work.
|
|
15
9
|
|
|
16
10
|
## MCP is the primary surface — read this before using the CLI
|
|
17
11
|
|
|
@@ -31,11 +25,11 @@ both MCP and this CLI exist so you do not have to.
|
|
|
31
25
|
|
|
32
26
|
## Overview
|
|
33
27
|
|
|
34
|
-
The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `npx -y cueframe@0.
|
|
28
|
+
The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `npx -y cueframe@0.11 describe --json`.
|
|
35
29
|
|
|
36
|
-
**Run it as `npx -y cueframe@0.
|
|
30
|
+
**Run it as `npx -y cueframe@0.11 …` — every command in this skill is written that way, and
|
|
37
31
|
that form is executable verbatim.** There is no `cueframe` on your PATH unless you put it
|
|
38
|
-
there: `npx -y cueframe@0.
|
|
32
|
+
there: `npx -y cueframe@0.11 install` wires the MCP server and drops these skills, but npx
|
|
39
33
|
unpacks to an ephemeral cache, so it installs no binary. `npx` re-resolves the current
|
|
40
34
|
version on each call (~0.5s warm, ~5s cold), which also means these commands never go
|
|
41
35
|
stale. If you are running many in a row and want to skip that, `npm i -g cueframe` once
|
|
@@ -46,9 +40,9 @@ the documented path.
|
|
|
46
40
|
**The framework is three verbs:** `upload` (register media) → `composition put` (author the timeline) → `render` (→ MP4). The `Composition` is the contract — render takes the saved composition, nothing else. Everything domain-specific (AI clip suggestions, FCPXML/Premiere export) is a **use-case on-ramp** layered on top, not part of the core.
|
|
47
41
|
|
|
48
42
|
**Core principle — discover, don't guess.** Never author a composition from the
|
|
49
|
-
examples below alone. The live contract is `npx -y cueframe@0.
|
|
43
|
+
examples below alone. The live contract is `npx -y cueframe@0.11 schema composition` (prints
|
|
50
44
|
the real wire schema the server enforces); confirm any draft with
|
|
51
|
-
`npx -y cueframe@0.
|
|
45
|
+
`npx -y cueframe@0.11 composition validate -b @file.json` BEFORE you render. Validation is
|
|
52
46
|
free and instant; a render is neither. The examples here are orientation — the
|
|
53
47
|
schema is the source of truth.
|
|
54
48
|
|
|
@@ -65,44 +59,62 @@ Validate first, then use `preview_card` / `preview_component` for isolated graph
|
|
|
65
59
|
MCP tools or the CLI's `api` escape hatch with the live request contract. Full `render` is for
|
|
66
60
|
delivery, not checking each edit. CLI validation does not replace visual evidence.
|
|
67
61
|
|
|
62
|
+
To compare a certified reference frame with an existing saved preview, use `compare`:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npx -y cueframe@0.11 compare <projectId> --reference-media <mediaId> --reference-representation <identity> --reference-frame 117 --candidate-job <jobId> --candidate-artifact <artifactId> --out ./comparison --json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The command calls the shared comparison operation; it does not rerender the composition. `--views overlay,difference` selects diagnostics and `--crop x,y,width,height` uses one common-coordinate crop. NDJSON contains source identities and image receipts, never base64 payloads. `--out` saves verified PNGs; without it, image receipts explicitly say `metadata_only`. Inspect those images and relevant motion before judging the film.
|
|
69
|
+
|
|
68
70
|
```bash
|
|
69
71
|
# 0. Always use --json for agent-driven runs (NDJSON to stdout, no spinners).
|
|
70
72
|
# Commands run against production; auth is stored in ~/.cueframe/auth.json.
|
|
71
73
|
|
|
72
74
|
# 1. Register media (one or many — mixed video / image / audio).
|
|
73
|
-
npx -y cueframe@0.
|
|
75
|
+
npx -y cueframe@0.11 upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
|
|
74
76
|
|
|
75
77
|
# 2. Create a project (sets aspect/format).
|
|
76
|
-
npx -y cueframe@0.
|
|
78
|
+
npx -y cueframe@0.11 project create -n "promo" -a 9:16 --json # → projectId
|
|
77
79
|
|
|
78
80
|
# 3. Author the composition: tracks of clips (per-clip reframe/trim), optional
|
|
79
81
|
# captions (captions.segments), brandKitId. The composition is the SSOT.
|
|
80
82
|
# Discover the live schema, then validate the draft BEFORE saving/rendering:
|
|
81
|
-
npx -y cueframe@0.
|
|
82
|
-
npx -y cueframe@0.
|
|
83
|
-
npx -y cueframe@0.
|
|
83
|
+
npx -y cueframe@0.11 schema composition # → live wire schema
|
|
84
|
+
npx -y cueframe@0.11 composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
|
|
85
|
+
npx -y cueframe@0.11 composition get <projectId> --json # → etag (not found = no composition yet)
|
|
86
|
+
npx -y cueframe@0.11 composition put <projectId> -b @composition.json --if-match <etag>
|
|
87
|
+
# --if-match is required: a save made since your `get` fails with 409 stale_etag
|
|
88
|
+
# instead of being overwritten. Re-`get`, re-apply your edit, retry. Use --create
|
|
89
|
+
# only for the first composition of a project (refused 409 if one exists).
|
|
84
90
|
|
|
85
91
|
# 4. Render the saved composition to MP4. SSE-watches + downloads when done.
|
|
86
|
-
npx -y cueframe@0.
|
|
92
|
+
npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
|
|
87
93
|
# → render_queued → render_progress* → render_complete
|
|
88
94
|
#
|
|
89
95
|
# `render` takes ONLY a projectId and renders the SAVED composition (tracks +
|
|
90
|
-
# captions). A clip suggestion is NOT required.
|
|
96
|
+
# captions). A clip suggestion is NOT required. Re-running the same command on an
|
|
97
|
+
# unchanged composition replays the same render (the Idempotency-Key hashes the
|
|
98
|
+
# project, the composition ETag and the request: --aspect/--fps/--resolution/
|
|
99
|
+
# --priority/--intent); editing the composition or changing a flag starts a new one.
|
|
100
|
+
# Without --aspect it renders the composition's own format. --aspect must match the
|
|
101
|
+
# composition's aspect (a new aspect is a `derive_composition`, not a render flag);
|
|
102
|
+
# pass it with --resolution hd|fhd|4k to change only the output resolution.
|
|
91
103
|
# Captions: render reads composition.captions — put caption words there to caption
|
|
92
104
|
# a hand-authored composition; if absent, the clip is rendered without captions.
|
|
93
105
|
|
|
94
106
|
# Reattach to an in-flight render later (e.g. after disconnect):
|
|
95
|
-
npx -y cueframe@0.
|
|
107
|
+
npx -y cueframe@0.11 render watch <renderId> -p <projectId> -o ./out.mp4 --json
|
|
96
108
|
```
|
|
97
109
|
|
|
98
110
|
## Anatomy of a composition.json
|
|
99
111
|
|
|
100
112
|
This section orients you to the shape; the authoritative contract is
|
|
101
|
-
`npx -y cueframe@0.
|
|
102
|
-
unclear, and `npx -y cueframe@0.
|
|
113
|
+
`npx -y cueframe@0.11 schema composition` (the live wire schema) — run it when a field is
|
|
114
|
+
unclear, and `npx -y cueframe@0.11 composition validate -b @file.json` to check a draft.
|
|
103
115
|
|
|
104
|
-
`composition put` takes the **bare** `Composition` object (no wrapper; the CLI
|
|
105
|
-
the `@file` verbatim
|
|
116
|
+
`composition put` takes the **bare** `Composition` object (no wrapper; the CLI PUTs
|
|
117
|
+
the `@file` verbatim with your `--if-match` ETag). Minimal valid shape:
|
|
106
118
|
|
|
107
119
|
```json
|
|
108
120
|
{
|
|
@@ -166,18 +178,18 @@ the composition yourself (above).
|
|
|
166
178
|
|
|
167
179
|
```bash
|
|
168
180
|
# 1. Upload + chain the AI clip pass.
|
|
169
|
-
npx -y cueframe@0.
|
|
170
|
-
# (or run it explicitly: npx -y cueframe@0.
|
|
181
|
+
npx -y cueframe@0.11 upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
|
|
182
|
+
# (or run it explicitly: npx -y cueframe@0.11 analyze <mediaItemId> --wait --json)
|
|
171
183
|
|
|
172
184
|
# 2. List clip suggestions (publicId sug_…, title, startMs/endMs, score).
|
|
173
|
-
npx -y cueframe@0.
|
|
185
|
+
npx -y cueframe@0.11 clips <mediaItemId> --json
|
|
174
186
|
|
|
175
187
|
# 3. Create a project AND author its composition from the chosen suggestion.
|
|
176
|
-
npx -y cueframe@0.
|
|
177
|
-
# (or, on an existing project: npx -y cueframe@0.
|
|
188
|
+
npx -y cueframe@0.11 project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
|
|
189
|
+
# (or, on an existing project: npx -y cueframe@0.11 composition from-suggestion <projectId> -s <sug_…>)
|
|
178
190
|
|
|
179
191
|
# 4. Render — same framework verb as above.
|
|
180
|
-
npx -y cueframe@0.
|
|
192
|
+
npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
|
|
181
193
|
```
|
|
182
194
|
|
|
183
195
|
Both flows converge on `composition put` → `render`; the on-ramp just authors the
|
|
@@ -185,59 +197,61 @@ composition from a suggestion instead of you hand-writing it.
|
|
|
185
197
|
|
|
186
198
|
Pipe `--json` output through `jq -c 'select(.event=="…")'` to grab specific lifecycle events.
|
|
187
199
|
|
|
188
|
-
## Component authoring
|
|
200
|
+
## Component authoring: scaffold your own
|
|
189
201
|
|
|
190
|
-
Own the motion-graphics components you render (shadcn-style):
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
202
|
+
Own the motion-graphics components you render (shadcn-style): scaffold a native component as
|
|
203
|
+
editable source, customize it, and render it on CueFrame. The source lives in your repo under
|
|
204
|
+
version control; CueFrame bakes it to a transparent video and composites it (the shared
|
|
205
|
+
renderer never runs your code). The CLI does not fork built-ins: the maintained builtin
|
|
206
|
+
presets and recipes are placed as they are (list them with `list_catalog`
|
|
207
|
+
projection `component-library`).
|
|
194
208
|
|
|
195
209
|
```bash
|
|
196
210
|
# 1. Scaffold a workspace (writes cueframe.json + cueframe/components/). Idempotent.
|
|
197
|
-
npx -y cueframe@0.
|
|
211
|
+
npx -y cueframe@0.11 init --json
|
|
198
212
|
|
|
199
213
|
# 2a. Scaffold a component in cueframe/components/<id>/ as owned, editable source.
|
|
200
|
-
npx -y cueframe@0.
|
|
214
|
+
npx -y cueframe@0.11 new component my-badge --category ui-blocks --json
|
|
201
215
|
|
|
202
216
|
# The scaffold is a native (version 4) source: template.html + definition.json, with its
|
|
203
|
-
# manifest in cueframe.json.
|
|
217
|
+
# manifest in cueframe.json.
|
|
204
218
|
|
|
205
219
|
# 3. Edit cueframe/components/<id>/template.html (one HyperFrames sub-composition ending in
|
|
206
220
|
# __cfScene.mount(...)) and definition.json (inputs, defaults, timing, capabilities).
|
|
207
221
|
|
|
208
222
|
# 4. Publish to CueFrame so it can render (the server admits the source or names the rule it breaks).
|
|
209
|
-
npx -y cueframe@0.
|
|
210
|
-
npx -y cueframe@0.
|
|
223
|
+
npx -y cueframe@0.11 push my-badge --json # one component
|
|
224
|
+
npx -y cueframe@0.11 sync --json # every component in the workspace
|
|
211
225
|
|
|
212
226
|
# 5. Reference the component id in your composition as a {kind:'component', componentId, props}
|
|
213
227
|
# clip, then render with the same verb. Preview a single component first via the MCP
|
|
214
228
|
# preview_component loop.
|
|
215
|
-
npx -y cueframe@0.
|
|
229
|
+
npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
|
|
216
230
|
```
|
|
217
231
|
|
|
218
232
|
## Quick reference
|
|
219
233
|
|
|
220
234
|
| Need to… | Command |
|
|
221
235
|
|---|---|
|
|
222
|
-
| See every command + flags | `npx -y cueframe@0.
|
|
223
|
-
| Install/refresh managed skills | `npx -y cueframe@0.
|
|
224
|
-
| List projects | `npx -y cueframe@0.
|
|
225
|
-
| List your media | `npx -y cueframe@0.
|
|
226
|
-
| Discover the live composition schema | `npx -y cueframe@0.
|
|
227
|
-
| Validate a draft (no save, no render) | `npx -y cueframe@0.
|
|
228
|
-
| Read composition + ETag | `npx -y cueframe@0.
|
|
229
|
-
| Write composition | `npx -y cueframe@0.
|
|
230
|
-
| Export to Final Cut | `npx -y cueframe@0.
|
|
231
|
-
| Export to Premiere | `npx -y cueframe@0.
|
|
232
|
-
| Anything not wrapped | `npx -y cueframe@0.
|
|
233
|
-
| Validate a composition without mutating | `npx -y cueframe@0.
|
|
236
|
+
| See every command + flags | `npx -y cueframe@0.11 describe --json` |
|
|
237
|
+
| Install/refresh managed skills | `npx -y cueframe@0.11 install` (shared `~/.agents/skills` and Claude `~/.claude/skills`; locally changed or untracked packages are preserved and reported) |
|
|
238
|
+
| List projects | `npx -y cueframe@0.11 list -n 50` |
|
|
239
|
+
| List your media | `npx -y cueframe@0.11 clips` (no mediaId arg) |
|
|
240
|
+
| Discover the live composition schema | `npx -y cueframe@0.11 schema composition` |
|
|
241
|
+
| Validate a draft (no save, no render) | `npx -y cueframe@0.11 composition validate -b @plan.json` |
|
|
242
|
+
| Read composition + ETag | `npx -y cueframe@0.11 composition get <projectId> --json` |
|
|
243
|
+
| Write composition | `npx -y cueframe@0.11 composition put <projectId> -b @plan.json --if-match <etag>` (`--create` for the first composition) |
|
|
244
|
+
| Export to Final Cut | `npx -y cueframe@0.11 export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
|
|
245
|
+
| Export to Premiere | `npx -y cueframe@0.11 export premiere <projectId> -s <sug> --wait -o cut.zip` |
|
|
246
|
+
| Anything not wrapped | `npx -y cueframe@0.11 api GET /v1/... -i` (escape hatch, like `gh api`) |
|
|
247
|
+
| Validate a composition without mutating | `npx -y cueframe@0.11 composition validate -b @plan.json` |
|
|
234
248
|
|
|
235
249
|
## Auth
|
|
236
250
|
|
|
237
251
|
Commands run against production. Authenticate once:
|
|
238
252
|
|
|
239
|
-
- `npx -y cueframe@0.
|
|
240
|
-
- `npx -y cueframe@0.
|
|
253
|
+
- `npx -y cueframe@0.11 login` — OAuth device flow (laptops).
|
|
254
|
+
- `npx -y cueframe@0.11 auth <cf_live_… key>` — save a static API key (CI / headless).
|
|
241
255
|
|
|
242
256
|
Creds are stored in `~/.cueframe/auth.json`; the key can also come from the `CUEFRAME_API_KEY` env var.
|
|
243
257
|
|
|
@@ -255,11 +269,11 @@ Errors come as `{"event":"error", "phase":"<step>", "message":"...", "code":"...
|
|
|
255
269
|
|
|
256
270
|
| Mistake | Reality |
|
|
257
271
|
|---|---|
|
|
258
|
-
| Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.
|
|
259
|
-
| Polling for render completion with a sleep loop | `npx -y cueframe@0.
|
|
272
|
+
| Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.11 api METHOD /v1/...` — same auth, same JSON pipeline. |
|
|
273
|
+
| Polling for render completion with a sleep loop | `npx -y cueframe@0.11 render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
|
|
260
274
|
| Skipping `--json` and trying to parse human output | Human output is for humans. Agents always use `--json`. |
|
|
261
|
-
| Hand-editing the composition without an ETag | `composition put`
|
|
262
|
-
| Calling `npx -y cueframe@0.
|
|
275
|
+
| Hand-editing the composition without an ETag | `composition put` refuses without `--if-match <etag>` from the `composition get` your edit started from. Don't fetch a fresh ETag right before the put: that overwrites anyone who saved in between. `--create` is only for a project's first composition; there is no unconditional overwrite. |
|
|
276
|
+
| Calling `npx -y cueframe@0.11 render <projectId> <suggestionId>` (old two-positional shape) | `render` takes ONLY a projectId; commander rejects the extra arg. It renders the SAVED composition — author it first via `composition put` (hand-author) or `project create --from-suggestion <sug>` (clip-finder on-ramp). |
|
|
263
277
|
| Assuming `render` needs a clip suggestion / that captions only come from a suggestion | No — `render` renders the saved composition directly; a suggestion is optional. Captions come from `composition.captions` (author them in the `put` JSON). The clip-suggestion on-ramp just fills those captions for you by slicing the transcript at author time. |
|
|
264
278
|
|
|
265
279
|
## When this skill applies (routing)
|
|
@@ -1,187 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cueframe-component-authoring
|
|
3
|
-
description: Use when authoring, forking
|
|
3
|
+
description: "Use when authoring, forking or customizing CueFrame HTML cards, motion-graphics primitives or reusable native components, including a fork of an exact catalog source. Covers cloud MCP, local desktop and CLI project paths using complete versioned source snapshots. For scene-shot devices and cameras use cueframe-scene-shot. Triggers on \"customize the parallax look\", \"make my own animated lower-third\", \"fork a CueFrame template and edit it\", \"author a custom graphic and render it\". Use before hand-writing a component from scratch: forking a built-in is usually the faster start."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# CueFrame
|
|
6
|
+
# CueFrame graphic authoring
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Use the [project and capability policy](../composing-video/references/project-policy.md). Preserve the current project and source identities; make the intended visual behavior inspectable and editable.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## Choose the representation
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
- **HTML card:** authored typography, UI, diagrams and 2D motion with deterministic CSS. It can depict perspective, but does not provide the scene renderer's physical camera, lighting or occlusion.
|
|
13
|
+
- **Whole-clip keyframes:** position, scale, rotation and opacity when the entire card or layer moves together. Read the current `clip.setKeyframes` schema; times are relative to the clip.
|
|
14
|
+
- **Scene shot:** supported groups, devices, pages, world text, surfaces and cameras. Use `cueframe-scene-shot` and its current schema; author JSON, not the generated wrapper.
|
|
15
|
+
- **Native component:** reusable version-4 media-tile scenes with declared inputs, assets and deterministic rendering. Discover a near-fit definition before writing one. Read the [native source contract](references/native-source-contract.md), then the applicable [MCP, CLI or desktop workflow](references/native-component-workflows.md). This is not an arbitrary browser application runtime.
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
A definition, preset and recipe are different catalog items. Preserve the selected item's exact scoped identity. A builtin source read needs `componentId`, `sourceVersionId` and `builtinCollection`; unavailable pins do not authorize a different source. Keep the complete template, manifest and definition when forking.
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
to select hosted or local evidence and separate iteration from final delivery.
|
|
19
|
+
## Cards: geometry, clock and controls
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
effects, transitions and layouts). Discover the current catalog; fork an exact definition, customize it,
|
|
21
|
-
and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
|
|
22
|
-
component code; CueFrame is the reliable engine that renders it.
|
|
21
|
+
A card source is `{kind:"card", html, tokens}`. Each token key `x` becomes the CSS property `--cf-x`; read `var(--cf-x)`. Keys have no leading dashes. Missing variables silently invalidate CSS, so inspect returned warnings and actual output. Use literal or supported whole-string brand references and do not overwrite reserved motion variables.
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
**scene shot** — validated JSON with `scene.add` / `scene.update`, not a component you author.
|
|
26
|
-
See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
|
|
27
|
-
you need behaviour the scene contract does not express.
|
|
23
|
+
The host injects a clip-local clock each frame: `--cf-frame`, `--cf-t` (seconds), `--cf-fps`, `--cf-duration` (frames), `--cf-progress`, `--cf-ease`, `--cf-enter` and `--cf-exit`. CSS animations, transitions and timers are not the render clock. The built-in entrance/exit ramps span up to 18 frames; use explicit event times when the brief needs other choreography.
|
|
28
24
|
|
|
29
|
-
|
|
30
|
-
- New and changed components are native (source version 4): `{version:4, componentId, template,
|
|
31
|
-
manifest, definition}`. `template` is one HyperFrames sub-composition whose script ends in one
|
|
32
|
-
`__cfScene.mount(...)`; the manifest is `{version:4, runtime:'hyperframes', hfContract:1,
|
|
33
|
-
kind:'scene', assets, graphics, alphaPolicy}`. The definition declares input schema, defaults,
|
|
34
|
-
timing, brand/media bindings and capabilities. The server instructions' Component Contract has
|
|
35
|
-
the full rules. Version-3 TSX sources are retired and refused as `component_source_retired`.
|
|
36
|
-
- Neither renderer runs authored source in the editor process. Local and hosted execution
|
|
37
|
-
use isolated render processes and exact immutable source revisions.
|
|
25
|
+
Use flex/grid for text and UI reflow, and coordinate-based nested transforms for spatial animation. Parent mounted contents to their object: a moving phone should carry its bezel, screen mask and controls. Use a separate local transform only when that part really moves relative to the object. The [parented motion recipe](references/parented-motion.md) includes a complete editable card with a shared pose and named pointer-contact/response times.
|
|
38
26
|
|
|
39
|
-
|
|
27
|
+
Expose likely revisions as meaningful inputs rather than unrelated constants. A card's text token used by CSS `content` needs a quoted CSS string. Preserve the current token values when changing its HTML. The native component definition declares defaults and input controls; its placement binds media in `execution.assets`, separately from `params`.
|
|
40
28
|
|
|
41
|
-
|
|
29
|
+
## Iterate on the saved result
|
|
42
30
|
|
|
43
|
-
|
|
44
|
-
`projection: "component-library", origin: "builtin", libraryKind: "definition"`.
|
|
45
|
-
Select the intended card and preserve its complete scoped source reference. Call
|
|
46
|
-
`get_component_source` with that reference's `componentId`, `sourceVersionId`,
|
|
47
|
-
`builtinCollection` (its scope collection).
|
|
48
|
-
ID-only builtin reads are unsupported. An unavailable exact pin is a refusal; never
|
|
49
|
-
retry another scope or an unpinned head.
|
|
50
|
-
2. **Author/own it:** edit the complete native `sourceSnapshot`; use your chosen owned ID
|
|
51
|
-
consistently in its `componentId` and the request. Send it as `body.source` to
|
|
52
|
-
`create_component`, with required metadata. Preserve its definition, capability
|
|
53
|
-
declarations, manifest and source format. For an existing component, keep its ID and
|
|
54
|
-
use `update_component` with the complete source. Do not send an old pin as the identity
|
|
55
|
-
of changed source: saving produces a new immutable source version.
|
|
56
|
-
3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
|
|
57
|
-
preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
|
|
58
|
-
verified artifact produced by the same bundle contract used by final render. A failed
|
|
59
|
-
`component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
|
|
60
|
-
(same id, in place), and preview again.
|
|
61
|
-
**Repin only the requested scope:** for all matching placements in one composition, use
|
|
62
|
-
`update_component({ componentId, body: { source: editedSnapshot, projectId, compositionId? } })`
|
|
63
|
-
with the observed revision and dependency guards. A placed clip
|
|
64
|
-
renders the exact version it pins; only the composition you name moves to the new version in the
|
|
65
|
-
same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
|
|
66
|
-
version, and `placementsPinnedToPrevious` counts them. For a single placement, update the
|
|
67
|
-
source without `projectId`, then change only that clip to the returned exact source pin
|
|
68
|
-
using the observed concurrency guards.
|
|
69
|
-
Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
|
|
70
|
-
duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
|
|
71
|
-
4. **Check integration:** add it as a `{kind:'component', componentId, props:{},
|
|
72
|
-
execution:{version:4,componentId,sourceVersionId,params,seed,assets}, placement:{version:3,kind:'clip'}}` clip
|
|
73
|
-
(`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
|
|
74
|
-
placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
|
|
75
|
-
finished MP4, not per tweak.
|
|
31
|
+
Keep the same owned component ID while updating its complete source. Saving creates a new immutable source version; existing placements keep their old pins unless explicitly repinned in the intended composition. An isolated preview is not a saved timeline edit. The workflow reference explains scoped repinning and local preview commits.
|
|
76
32
|
|
|
77
|
-
|
|
33
|
+
Use [cueframe-compose-loop](../cueframe-compose-loop/SKILL.md) for isolated, integrated and final evidence. Preserve production duration when previewing duration-dependent motion. Check the relationship that could fail, including screen corners, overlap, pointer contact and the complete ending, rather than only a pleasing middle still. For `needsUpgrade`, use [retired-source recovery](references/retired-projects.md) and replace only the reported clips.
|
|
78
34
|
|
|
79
|
-
|
|
80
|
-
template locally, push to render.
|
|
35
|
+
## Detailed guidance
|
|
81
36
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
npx -y cueframe@0.9 new component my-badge --category ui-blocks --json # scaffold a component in the workspace
|
|
85
|
-
# New scaffolds contain template.html and definition.json (native source, version 4).
|
|
86
|
-
# …edit cueframe/components/<id>/template.html and definition.json in your editor…
|
|
87
|
-
npx -y cueframe@0.9 push my-badge --json # send the native source; the server admits it
|
|
88
|
-
# or: npx -y cueframe@0.9 sync --json # push every component in the workspace
|
|
89
|
-
# reference the component id in your composition, then render:
|
|
90
|
-
npx -y cueframe@0.9 render <projectId> -o ./out.mp4 --json
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
The CLI writes `template.html` and `definition.json` (input schema, defaults, timing and
|
|
94
|
-
capabilities). `cueframe.json` → `components.<id>` holds the version-4 `manifest` and the catalog
|
|
95
|
-
`name` and `category`, which `push` requires; it refuses a component missing either.
|
|
96
|
-
`push`/`sync` send these as one native `source`, checked against the contract's source schema;
|
|
97
|
-
the server's admission (template lint, determinism, declarations) refuses with a named rule.
|
|
98
|
-
For a builtin fork, copy **all three parts** from the selected `sourceSnapshot`: template,
|
|
99
|
-
definition and manifest. A workspace component that still has a version-3 `index.tsx` is
|
|
100
|
-
refused as `component_source_retired` before any API call; author it again as a native template. To preview before
|
|
101
|
-
a full render, push it and use the appropriate component preview loop.
|
|
102
|
-
|
|
103
|
-
## Path C — Director editing a local desktop project (project-embedded source)
|
|
104
|
-
|
|
105
|
-
When `get_context` reports the project lane as local, motion does not need an account or an org
|
|
106
|
-
component. Components here are native (source version 4) too:
|
|
107
|
-
- **New component:** open a draft with `open_component_preview`, passing `template`,
|
|
108
|
-
`component_manifest` (`{version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets,
|
|
109
|
-
graphics, alphaPolicy}`) and `component_definition`.
|
|
110
|
-
- **Existing component:** pass `component_id` instead, to start from the clip's pinned version or
|
|
111
|
-
the library version.
|
|
112
|
-
|
|
113
|
-
The draft is admitted in full: template lint, determinism and the variable declaration.
|
|
114
|
-
`data-composition-variables` must equal the definition's projection (its scalar inputSchema
|
|
115
|
-
properties, then the manifest's slots).
|
|
116
|
-
|
|
117
|
-
Edit the draft with `update_component_preview` (exact-text `{oldText, newText, replaceAll?}`
|
|
118
|
-
edits). Check exact frames with `render_component_preview_frame`, and inspect playback for motion.
|
|
119
|
-
`commit_component_preview` publishes the checked source to the library and pins the clip, with a
|
|
120
|
-
fresh ETag. `read_component` and `edit_component` read and edit the library directly. Close the
|
|
121
|
-
preview when finished.
|
|
122
|
-
|
|
123
|
-
Media slots are image or video, declared in `component_manifest.assets` and bound to project
|
|
124
|
-
media ids in `component_assets`. The template passes them to `MediaTileScene` as
|
|
125
|
-
`streams: { hero: { asset: assets.hero } }`. Declare `alphaPolicy` explicitly:
|
|
126
|
-
`requires-transparency` for overlays, `allows-opaque` for full-frame plates.
|
|
127
|
-
|
|
128
|
-
Every frame must be a pure function of `render.frame`, params and `render.seed`. Timers, `Date`,
|
|
129
|
-
network, imports, other globals and CSS animation are refused at admission. The timeline and final
|
|
130
|
-
export render the exact committed version. Use `create_component` only for a reusable org-catalog
|
|
131
|
-
component on a reachable cloud lane.
|
|
132
|
-
|
|
133
|
-
## Upgrading an old project
|
|
134
|
-
|
|
135
|
-
`get_composition` returns `needsUpgrade` only when clips from before the native cutover remain:
|
|
136
|
-
`[{clipId, kind, componentId?, sourceVersionId?, primitiveId?, successorComponentId?,
|
|
137
|
-
successorSourceVersionId?}]`. Saves and renders refuse those clips. A retired component is
|
|
138
|
-
refused with `component_source_retired`, and a retired
|
|
139
|
-
primitive with `render_unknown_primitive`. Upgrade only the listed clips. Keep every other clip,
|
|
140
|
-
timing, track and brand-kit binding as it is.
|
|
141
|
-
|
|
142
|
-
- **Any entry with a `successorSourceVersionId`:** call `repin_component` with its clip ids. It
|
|
143
|
-
moves them to the native successor and keeps their saved inputs.
|
|
144
|
-
- **`v3-component` with no successor** (a custom pre-cutover component): read its source, params,
|
|
145
|
-
timing and placement, and author a native replacement with `create_component` as a version-4
|
|
146
|
-
template following the server instructions' Component Contract.
|
|
147
|
-
- **`unpinned-component`:** the clip carries a `retired` record (what was stored before the cutover), with its
|
|
148
|
-
props preserved. Re-author it from those props the same way.
|
|
149
|
-
- **`retired-primitive`:** rebuild what `primitiveId` drew from the clip's params, as a card or
|
|
150
|
-
a native component.
|
|
151
|
-
|
|
152
|
-
For each replacement, use `apply_composition` to replace only that clip at the same start,
|
|
153
|
-
duration, track and placement, pinned to the new exact `sourceVersionId`. Map the old params
|
|
154
|
-
onto the new inputs; do not invent new content. Verify each clip with `preview_frame` at a time
|
|
155
|
-
inside its window and confirm `needsUpgrade` is gone. Only then render (`create_render`).
|
|
156
|
-
|
|
157
|
-
## Choosing what to fork
|
|
158
|
-
Use the `component-library` projection to choose a definition, inspect its input schema and
|
|
159
|
-
capabilities, then fetch its exact scoped source as described in Path A. Presets and recipes
|
|
160
|
-
are different card kinds: follow their exact definition/document references rather than treating
|
|
161
|
-
those IDs as source IDs. Inspect appropriate previews before judging visual behavior.
|
|
162
|
-
|
|
163
|
-
## Layout inside a component — CSS flex/grid
|
|
164
|
-
|
|
165
|
-
When several cells must share space (a feature grid, a fixed rail beside fluid content, a cast of
|
|
166
|
-
objects next to type), lay them out with CSS flex or grid in the HTML, not hand-placed pixels.
|
|
167
|
-
Use the template of a native component, or a `card`:
|
|
168
|
-
|
|
169
|
-
```html
|
|
170
|
-
<div style="display:grid; grid-template-columns: 520px 1fr 3fr; gap:16px; width:100%; height:100%">
|
|
171
|
-
<div class="rail"></div><div class="type"></div><div class="art"></div>
|
|
172
|
-
</div>
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
- Fixed tracks (`520px`) hold content-sized cells. Fractions (`1fr`, `3fr`) share what is left.
|
|
176
|
-
- Animate a reflow from the frame, never from time: in a card, drive `grid-template-columns`
|
|
177
|
-
or `flex-basis` from `var(--cf-progress)` (or `--cf-enter`/`--cf-exit`); in a native template,
|
|
178
|
-
derive it from `render.frame`.
|
|
179
|
-
- Size the container to its region instead of CSS-`scale()`-ing the layout, which resamples.
|
|
180
|
-
Use `object-fit` for media in a cell.
|
|
181
|
-
|
|
182
|
-
## Don't
|
|
183
|
-
- Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
|
|
184
|
-
`assets` and `render` bags for media and frame state.
|
|
185
|
-
- When a built-in fits the request, fork its exact snapshot using Path A. Never discard its
|
|
186
|
-
definition by copying only its template; preserve the definition and manifest too.
|
|
187
|
-
- Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
|
|
37
|
+
- [Authoring paths](references/authoring-paths.md): the MCP path step by step, when no filesystem is available.
|
|
38
|
+
- [Forking and layout](references/forking-and-layout.md): what to fork, flex and grid inside a component, and what to avoid.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Authoring paths
|
|
2
|
+
|
|
3
|
+
Defaults, examples and detail for this topic. The [skill](../SKILL.md) and the [project and capability policy](../../composing-video/references/project-policy.md) take precedence where they differ, and the current tool schemas are authoritative.
|
|
4
|
+
|
|
5
|
+
## Scope and capability policy
|
|
6
|
+
|
|
7
|
+
User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
|
|
8
|
+
|
|
9
|
+
Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
|
|
10
|
+
|
|
11
|
+
For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../../cueframe-compose-loop/references/preview-workflow.md).
|
|
12
|
+
|
|
13
|
+
Use `cueframe-compose-loop`'s [preview workflow](../../cueframe-compose-loop/references/preview-workflow.md)
|
|
14
|
+
to select hosted or local evidence and separate iteration from final delivery.
|
|
15
|
+
|
|
16
|
+
CueFrame ships built-in motion-graphics definitions (titles, lower-thirds, captions,
|
|
17
|
+
effects, transitions and layouts). Discover the current catalog; fork an exact definition, customize it,
|
|
18
|
+
and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
|
|
19
|
+
component code; CueFrame is the reliable engine that renders it.
|
|
20
|
+
|
|
21
|
+
**Before you hand-write 3D:** a device mockup or a screenshot floating in a lit 3D scene is a
|
|
22
|
+
**scene shot** — validated JSON with `scene.add` / `scene.update`, not a component you author.
|
|
23
|
+
See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
|
|
24
|
+
you need behaviour the scene contract does not express.
|
|
25
|
+
|
|
26
|
+
**Source format matters:**
|
|
27
|
+
- New and changed components are native (source version 4): `{version:4, componentId, template,
|
|
28
|
+
manifest, definition}`. `template` is one HyperFrames sub-composition whose script ends in one
|
|
29
|
+
`__cfScene.mount(...)`; the manifest is `{version:4, runtime:'hyperframes', hfContract:1,
|
|
30
|
+
kind:'scene', assets, graphics, alphaPolicy}`. The definition declares input schema, defaults,
|
|
31
|
+
timing, brand/media bindings and capabilities. The server instructions' Component Contract has
|
|
32
|
+
the full rules. Version-3 TSX sources are retired and refused as `component_source_retired`.
|
|
33
|
+
- Neither renderer runs authored source in the editor process. Local and hosted execution
|
|
34
|
+
use isolated render processes and exact immutable source revisions.
|
|
35
|
+
|
|
36
|
+
## Path A — MCP agent (no filesystem; source lives server-side)
|
|
37
|
+
|
|
38
|
+
Use the live tool schema for request envelopes; hosted write fields are normally under `body`.
|
|
39
|
+
|
|
40
|
+
1. **Discover and read a built-in:** call `list_catalog` with
|
|
41
|
+
`projection: "component-library", origin: "builtin", libraryKind: "definition"`.
|
|
42
|
+
Select the intended card and preserve its complete scoped source reference. Call
|
|
43
|
+
`get_component_source` with that reference's `componentId`, `sourceVersionId`,
|
|
44
|
+
`builtinCollection` (its scope collection).
|
|
45
|
+
ID-only builtin reads are unsupported. An unavailable exact pin is a refusal; never
|
|
46
|
+
retry another scope or an unpinned head.
|
|
47
|
+
2. **Author/own it:** edit the complete native `sourceSnapshot`; use your chosen owned ID
|
|
48
|
+
consistently in its `componentId` and the request. Send it as `body.source` to
|
|
49
|
+
`create_component`, with required metadata. Preserve its definition, capability
|
|
50
|
+
declarations, manifest and source format. For an existing component, keep its ID and
|
|
51
|
+
use `update_component` with the complete source. Do not send an old pin as the identity
|
|
52
|
+
of changed source: saving produces a new immutable source version.
|
|
53
|
+
3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
|
|
54
|
+
preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
|
|
55
|
+
verified artifact produced by the same bundle contract used by final render. A failed
|
|
56
|
+
`component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
|
|
57
|
+
(same id, in place), and preview again.
|
|
58
|
+
**Repin only the requested scope:** for all matching placements in one composition, use
|
|
59
|
+
`update_component({ componentId, body: { source: editedSnapshot, projectId, compositionId? } })`
|
|
60
|
+
with the observed revision and dependency guards. A placed clip
|
|
61
|
+
renders the exact version it pins; only the composition you name moves to the new version in the
|
|
62
|
+
same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
|
|
63
|
+
version, and `placementsPinnedToPrevious` counts them. For a single placement, update the
|
|
64
|
+
source without `projectId`, then change only that clip to the returned exact source pin
|
|
65
|
+
using the observed concurrency guards.
|
|
66
|
+
Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
|
|
67
|
+
duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
|
|
68
|
+
4. **Check integration:** add it as a `{kind:'component', componentId, props:{},
|
|
69
|
+
execution:{version:4,componentId,sourceVersionId,params,seed,assets}, placement:{version:3,kind:'clip'}}` clip
|
|
70
|
+
(`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
|
|
71
|
+
placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
|
|
72
|
+
finished MP4, not per tweak.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Forking and layout
|
|
2
|
+
|
|
3
|
+
Defaults, examples and detail for this topic. The [skill](../SKILL.md) and the [project and capability policy](../../composing-video/references/project-policy.md) take precedence where they differ, and the current tool schemas are authoritative.
|
|
4
|
+
|
|
5
|
+
## Choosing what to fork
|
|
6
|
+
Use the `component-library` projection to choose a definition, inspect its input schema and
|
|
7
|
+
capabilities, then fetch its exact scoped source as described in Path A. Presets and recipes
|
|
8
|
+
are different card kinds: follow their exact definition/document references rather than treating
|
|
9
|
+
those IDs as source IDs. Inspect appropriate previews before judging visual behavior.
|
|
10
|
+
|
|
11
|
+
## Layout inside a component — CSS flex/grid
|
|
12
|
+
|
|
13
|
+
When several cells must share space (a feature grid, a fixed rail beside fluid content, a cast of
|
|
14
|
+
objects next to type), lay them out with CSS flex or grid in the HTML, not hand-placed pixels.
|
|
15
|
+
Use the template of a native component, or a `card`:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<div style="display:grid; grid-template-columns: 520px 1fr 3fr; gap:16px; width:100%; height:100%">
|
|
19
|
+
<div class="rail"></div><div class="type"></div><div class="art"></div>
|
|
20
|
+
</div>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- Fixed tracks (`520px`) hold content-sized cells. Fractions (`1fr`, `3fr`) share what is left.
|
|
24
|
+
- Animate a reflow from the frame, never from time: in a card, drive `grid-template-columns`
|
|
25
|
+
or `flex-basis` from `var(--cf-progress)` (or `--cf-enter`/`--cf-exit`); in a native template,
|
|
26
|
+
derive it from `render.frame`.
|
|
27
|
+
- Size the container to its region instead of CSS-`scale()`-ing the layout, which resamples.
|
|
28
|
+
Use `object-fit` for media in a cell.
|
|
29
|
+
|
|
30
|
+
## Don't
|
|
31
|
+
- Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
|
|
32
|
+
`assets` and `render` bags for media and frame state.
|
|
33
|
+
- When a built-in fits the request, fork its exact snapshot using Path A. Never discard its
|
|
34
|
+
definition by copying only its template; preserve the definition and manifest too.
|
|
35
|
+
- Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
|