@scenerok/sdk 0.27.0 → 0.28.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.
@@ -0,0 +1,111 @@
1
+ # Choosing tools for a beat
2
+
3
+ SceneRok's blocks, motion, transitions, filters and media are a repertoire,
4
+ not a checklist. Nothing is required, nothing is decoration by default: each
5
+ beat gets what its job calls for. `repertoire.md` says what every tool looks
6
+ like, what it is for, and what it fights. This file is how to use that.
7
+
8
+ ## The procedure
9
+
10
+ For each beat:
11
+
12
+ 1. **Name its job** with one word from the job list in `repertoire.md`
13
+ (announce, count, quote, code, prove, demo, establish, cta, ...), and the one
14
+ thing the viewer must take away.
15
+ 2. **Put the material on the table.** What do you actually have for this beat:
16
+ the source's photos, screenshots, footage, logo, the exact numbers and words?
17
+ You can only choose a picture you have looked at.
18
+ 3. **List the candidates** under that job in `repertoire.md` → Find tools by job.
19
+ Plain `text` and "nothing extra" are always candidates.
20
+ 4. **Drop what fights.** Read each candidate's *Fights* against your content
21
+ (length of the words, busyness of the picture), its neighbours (the beat
22
+ before and after, anything else moving) and the frame (9:16 or 16:9: read
23
+ *Fit*).
24
+ 5. **Choose by the look.** Read *Looks* for the survivors and pick the frame you
25
+ want the viewer to see. When two would do, take the simpler.
26
+ 6. **Write one line**: `<beat>: <tool> because <reason>`. If you can't finish
27
+ the sentence, choose something plainer.
28
+ 7. **Verify by looking.** After rendering, open a frame of that beat. If it
29
+ doesn't look like the *Looks* you chose for, the description or your
30
+ placement is wrong. Fix the placement, and report the description.
31
+
32
+ ## When plain text on a still frame is right, and when it is not
33
+
34
+ Right, when:
35
+
36
+ - the words are the content: a quote, a definition, a price, a command, a
37
+ legal line;
38
+ - the viewer needs reading time, and anything moving would compete;
39
+ - the design is typographic on purpose (a brand that speaks in type);
40
+ - there is no honest picture: an abstract claim, an internal change with no
41
+ UI. A stock or generated image would only pretend.
42
+
43
+ Wrong, when:
44
+
45
+ - the source has pictures that show the thing (a product page, an app, a repo
46
+ with a UI) and the beat's job is demo, prove or establish;
47
+ - several beats in a row are text on the same flat colour, so the video turns
48
+ into a slideshow;
49
+ - the text says what a picture could show ("sleek design", "easy to use").
50
+
51
+ The same goes for motion: a still frame is right when the eye should rest.
52
+ Motion is for arrival, emphasis and time passing, and one moving thing at a
53
+ time is easier to follow than three.
54
+
55
+ ## Worked choices
56
+
57
+ **Product promo, hook (9:16).** Job: establish. Material: three lifestyle
58
+ photos from the product page, a 500 px hero shot on white. Candidates: a page
59
+ photo, `xai.imagine`, `animations.liquid_glass_notification`, `text`.
60
+ Dropped: `xai.imagine` fights facts (it would invent a different robot); the
61
+ liquid-glass block is fixed artwork in rainbow colours. Chosen: the lifestyle
62
+ photo as a band over a blurred copy of itself, with a 3 s push, because a still
63
+ held for 3 s reads as a slide and the push gives it time. Headline: `text`
64
+ with `riseIn`.
65
+
66
+ **Customer review (any aspect).** Job: quote. Material: one two-sentence review
67
+ from the page. Candidates: `text_typewriter_quote`, `x_post`, `reddit_post`,
68
+ `text`. Dropped: `x_post` and `reddit_post` would dress the review as a post on
69
+ a platform it never appeared on; the typewriter takes three seconds to type
70
+ what a reader takes two to read. Chosen: plain `text` on a flat dark frame with
71
+ a muted attribution, no motion, held 5 s.
72
+
73
+ **Breaking change in release notes.** Job: announce. Material: one sentence
74
+ from the changelog. Chosen: plain `text`, no entrance, no grade change, held
75
+ 4 s. Gravity is the point; any flourish would make a warning read like
76
+ marketing. Nothing else was considered necessary, and that is a valid outcome
77
+ of step 3.
78
+
79
+ **A stat (9:16).** Job: count. Material: "12 bug fixes" counted from the
80
+ release body. Candidates: `text_counter_stat`, `apple_money_count`, `text` with
81
+ `popIn`. Dropped: `apple_money_count` is money on a white slab. Chosen:
82
+ `text_counter_stat` with `suffix: ""` (its default `+` would turn 12 into
83
+ "12+", which is false).
84
+
85
+ **Code in 9:16.** Job: code. Material: a five-line before/after. Candidates:
86
+ `code_typing`, `code_diff`, a `code_snippet_*` theme, `text` lines. Dropped:
87
+ `code_typing` (in 9:16 its code shrinks to about 17 px). Chosen: `code_diff`,
88
+ which has its own 9:16 layout and keeps the removed line on screen with
89
+ `keep_removed: true`, so the change reads as a before/after. Its *Looks* says it
90
+ sits in the upper half, so the beat's headline goes in the empty lower half
91
+ instead of on top of the code.
92
+
93
+ **Cut between two lifestyle shots in a calm promo.** Job: transition.
94
+ Candidates: every `tr.*`, and a hard cut. Dropped: everything whose *Fights*
95
+ says "calm or premium edits"; `flash` (flicker). Chosen: a hard cut, because
96
+ the shots differ enough to read as a new beat. `dissolve` only if the two shots
97
+ share a subject. A transition is a candidate, not a default.
98
+
99
+ **Talking head, key line.** Job: emphasize. Material: a 16:9 interview, the
100
+ line "it paid for itself". Candidates: a punch-in (scale the clip),
101
+ `text_kinetic_words`, `blend_caption`, `text_glitch_title`. Dropped: kinetic
102
+ words fight a sentence that must be read whole; glitch fights the tone.
103
+ Chosen: a punch-in on the speaker with a two-word caption card in the accent
104
+ colour.
105
+
106
+ ## Before you trust a description
107
+
108
+ The records come from the block source and the catalog previews. Some previews
109
+ predate a block's 9:16 layout, and a few are blank (see each record's *Fit*).
110
+ When a choice rests on a block you have never seen rendered, render a short
111
+ test or look at its preview before building the video around it.
@@ -58,13 +58,16 @@ than it predicts, so check the rendered frame before trusting a line to fit.
58
58
 
59
59
  ## Pictures
60
60
 
61
- Every beat has a picture under its type. In order of preference:
62
-
63
- 1. **Real**: product photos, logos, app screenshots, footage, screen recordings.
64
- 2. **Generated**: `xai.image`, `xai.imageToVideo` from a real photo, `xai.imagine`
65
- (`ai-models.md`; prompts forbid text).
61
+ Whether a beat gets a picture is a choice (`choosing.md`). When it does, the
62
+ sources rank like this:
63
+
64
+ 1. **Real**: product photos, logos, app screenshots, footage, screen
65
+ recordings. They prove things; nothing else does.
66
+ 2. **Generated**: `xai.image`, `xai.imageToVideo` from a real photo,
67
+ `xai.imagine` (`ai-models.md`; prompts forbid text). They set a mood and
68
+ invent everything else.
66
69
  3. **Made**: a brand-colour glow or gradient rendered with ffmpeg (recipes →
67
- Release notes), as a background behind real pictures, never as the only picture.
70
+ Release notes). Atmosphere without a subject.
68
71
 
69
72
  Placing stills in a frame of a different shape:
70
73
 
@@ -112,15 +115,17 @@ which needs no file.
112
115
 
113
116
  ## Motion
114
117
 
115
- | Phase | Use | Timing |
118
+ When you do use motion, these timings read well. What each primitive looks
119
+ like is in `repertoire.md`.
120
+
121
+ | Phase | Typical choice | Timing |
116
122
  | --- | --- | --- |
117
123
  | Entrance | `motion.riseIn(0.5s, 40-80)` for copy and cards, `motion.popIn(0.4-0.6s)` for prices, buttons, logos, `motion.typewriter` for code, `motion.fadeIn(0.4s)` for secondary lines | Stagger items 0.3-0.6 s apart |
118
- | Hold | Stills: a push `{ type: "scale", from: { scale: 1 }, to: { scale: 1.08 }, easing: "linear" }`. Logos and products: `motion.float(3s, 10-14)` | A static hold lasts 3 s at most |
119
- | Exit | `motion.fadeOut(0.3s)` on everything that leaves before the end | The last 0.3 s of the block |
124
+ | Hold | Nothing (rest the eye), or a push on a still `{ type: "scale", from: { scale: 1 }, to: { scale: 1.08 }, easing: "linear" }`, or `motion.float(3s, 10-14)` on a logo or product | A still hold beyond ~3 s should be one you meant: reading time, gravity |
125
+ | Exit | A cut, or `motion.fadeOut(0.3s)` when the element should leave softly | The last 0.3 s of the block |
120
126
 
121
- A push on a soft gradient doesn't count as motion: give it a still, footage,
122
- or a floating element to move. Fast moves can take `motion_blur:`
123
- (`editing-actions.md`).
127
+ A push on a soft gradient is invisible, so it adds nothing. Fast moves can take
128
+ `motion_blur:` (`editing-actions.md`).
124
129
 
125
130
  ## Pacing
126
131
 
@@ -129,11 +134,13 @@ or a floating element to move. Fast moves can take `motion_blur:`
129
134
  - One idea per beat: the hook, the product, three features, the price, and the call to action.
130
135
  - Close on the call to action for at least 2.5 s.
131
136
 
132
- ## What premium means here
137
+ ## What premium tends to mean
138
+
139
+ Tendencies, not requirements; each is a choice you can argue against.
133
140
 
134
- - A real picture fills or anchors every beat; no beat is text on a flat colour.
141
+ - Real pictures where the subject has them; type alone where the words are the point.
135
142
  - One accent, used sparingly; everything else is ink and muted on dark (or the reverse).
136
- - Big type with tight copy: 3-6 words a line, never a paragraph.
137
- - Every element arrives, holds with a little motion, and leaves.
138
- - One grade ties it together: `filter "cdl"` warmth or coolness plus a `vignette` of about 0.3.
139
- - Sound under all of it: a music bed, a voiceover, or both.
143
+ - Big type with tight copy: 3-6 words a line, rarely a paragraph.
144
+ - Restraint: one thing moving at a time, consistent entrances, stillness where the eye should rest.
145
+ - A grade only if the pictures need tying together: `filter "cdl"` warmth or coolness, a `vignette` of about 0.3.
146
+ - Sound that fits the use: many feeds play muted, so the picture must work without it.
@@ -7,10 +7,11 @@ cheaper than hand-composing. **Never assume which plugins exist** — discover
7
7
  them at run time; the catalog grows and changes.
8
8
 
9
9
  Plugins are the reuse-first path: check `intent-router.md` for the workflow
10
- match. A plugin's video must still pass the quality gate in `SKILL.md`. Draft
11
- first, read the filled script, and if a beat is text over a flat colour, add
12
- the pictures and motion from `recipes.md` before `render-draft`. Today that
13
- applies to the first-party `listing-promo` and `release-video` templates.
10
+ match. Review a plugin's video with the same questions as your own (`SKILL.md` →
11
+ Review). Draft first and read the filled script. Today the first-party
12
+ `listing-promo` and `release-video` templates set every beat as text over a
13
+ flat colour and leave the product images unused. When the request calls for
14
+ more, change those beats before `render-draft`.
14
15
 
15
16
  ## Workflow (MCP)
16
17
 
@@ -1,9 +1,9 @@
1
1
  # Recipes
2
2
 
3
- Three complete scripts that pass the quality gate in `SKILL.md`. Each uses
4
- the look system in `look-and-feel.md`. Copy the one that fits, then swap in
5
- your own assets, copy, and palette. Keep the structure: a picture under every
6
- beat, motion on everything, and a grade and sound over the whole video.
3
+ Three complete scripts, each rendered and reviewed. They show one set of
4
+ choices for one brief; the comments say why each tool is there, so you can tell
5
+ which choices carry over to yours and which don't. Choose for your own beats
6
+ with `choosing.md`.
7
7
 
8
8
  ## Product promo (9:16, 15 s)
9
9
 
@@ -38,7 +38,8 @@ input roomBg = "room-bg.jpg" # 1080x1920, same shot, blurred + darkened
38
38
  input closeBand = "closeup-band.jpg" # 1080x368
39
39
  input closeBg = "closeup-bg.jpg" # 1080x1920
40
40
 
41
- # Slow push-in for every still, so no frame is ever frozen.
41
+ # A slow push on the stills: these photos hold 3-4 s each, and a push keeps a held
42
+ # photo from reading as a slide.
42
43
  let push = { type: "scale", from: { scale: 1 }, to: { scale: 1.08 }, easing: "linear" }
43
44
 
44
45
  # 1. Hook (0-3 s): lifestyle shot; the headline lands in the first second.
@@ -164,9 +165,10 @@ output to "release.mp4", resolution: "1080x1920", fps: 30, background: "#0B0B0F"
164
165
 
165
166
  `validate` warns `crowded-text-overlays` and `too-many-animations` on the
166
167
  code card, because each code line counts as an overlay. Accept those two
167
- there; fix any other warning. The `code_*` catalog blocks are 1920x1080
168
- designs: use them in 16:9, where they fill the frame. In 9:16 they shrink to
169
- 56 % with empty bands above and below.
168
+ there; fix any other warning. This recipe builds its own code card so the
169
+ headline, card and caption can share one frame. The `code_snippet_*` themes and
170
+ `code_diff` also have 9:16 layouts of their own (see their records in
171
+ `repertoire.md`): reach for them when the code is the whole beat.
170
172
 
171
173
  ## Talking head with captions (9:16, 14 s)
172
174