greenlight-motion 0.1.5 → 0.2.1
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 +9 -9
- package/dist/bundle-inputs.json +14 -0
- package/dist/greenlight-motion-script.mjs +3250 -274
- package/dist/greenlight-motion.js +703 -661
- package/dist/greenlight-motion.mjs +41156 -39509
- package/dist/script-inputs.json +8 -0
- package/package.json +2 -2
- package/schema/capabilities.json +1 -1
- package/skill/SKILL.md +43 -12
- package/skill/references/scene-script.md +48 -6
- package/skill/references/video-camera.md +106 -4
- package/skill/references/video-design.md +5 -0
- package/skill/references/video-effects.md +18 -0
- package/skill/references/video-paths.md +33 -2
- package/skill/references/video-projects.md +32 -3
- package/skill/references/video-text-presets.md +31 -1
- package/skill/references/video-text.md +36 -1
|
@@ -79,7 +79,7 @@ Type on Shape has no preferred preset: pick by the shape the text needs.
|
|
|
79
79
|
|
|
80
80
|
<!-- PRESETS:BEGIN (generated by tests/text-animators/skill_presets.mjs from presets.js — edit there) -->
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
49 recipes in 6 categories. **Lengths** to multiply by `textFontSize / 100`: `blur` `amount`; `box` `padX`, `padY`, `radius`; `glow` `size`; `position` `x`, `y`; `rotate3d` `perspective`; `stroke` `width`.
|
|
83
83
|
|
|
84
84
|
**A fade-out exit for an `in` recipe**, ending with the layer: append this animator with unused ids. Set its `basedOn` to the recipe's first animator's, and `stagger` to 0.015 for letters, 0.04 for words or 0.08 for lines.
|
|
85
85
|
|
|
@@ -93,6 +93,7 @@ Type on Shape has no preferred preset: pick by the shape the text needs.
|
|
|
93
93
|
|---|---|---|---|---|
|
|
94
94
|
| [Glide Text](#glide-text) | Sweep Reveal | Letters type in as the word glides left under a chasing blue band and settles, then it slides off to the left | letters | in, the first 1.3 s, then out at the end |
|
|
95
95
|
| [Glide Continuous](#glide-continuous) | Sweep Reveal | Letters type in under a chasing blue band as the word keeps gliding through the whole layer, slow in the middle, then slides off to the left | letters | in, the first 1.13 s (Glide in across the whole layer), then out at the end |
|
|
96
|
+
| [Smart Overshoot](#smart-overshoot) | Sweep Reveal | Words spring in out of a hot green glow and overshoot into place as the line recentres, and a key word stays lit | words | in, the first 1.8 s on a 5-word line |
|
|
96
97
|
| [Glide Soft Stop](#glide-soft-stop) | Sweep Reveal | The same typing and band, but the word glides through the whole layer and all but stops in the middle, then slides off to the left | letters | in, the first 1.13 s (Glide in across the whole layer), then out at the end |
|
|
97
98
|
| [Ember Type](#ember-type) | Sweep Reveal | Letters type in falling softly; a warm band trails behind the typing | letters | in, the first 3 s |
|
|
98
99
|
| [Molten Edge](#molten-edge) | Sweep Reveal | Letters land glowing hot at the typing edge and cool down behind it | letters | in, the first 2 s |
|
|
@@ -216,6 +217,35 @@ Letters type in under a chasing blue band as the word keeps gliding through the
|
|
|
216
217
|
}
|
|
217
218
|
```
|
|
218
219
|
|
|
220
|
+
### Smart Overshoot
|
|
221
|
+
|
|
222
|
+
Words spring in out of a hot green glow and overshoot into place as the line recentres, and a key word stays lit. Plays: in, the first 1.8 s on a 5-word line. Designed for a `#0c0e0d` background. Written for text like “Just the best stablecoin strategies”.
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"textAnimators": [
|
|
227
|
+
{ "aid": "a1", "name": "Recenter",
|
|
228
|
+
"range": {"basedOn": "words", "drive": "time", "animate": "in", "around": "all", "stagger": 0, "duration": 1.8, "curve": "Power3 Out"},
|
|
229
|
+
"effects": [{"pid": "p1", "type": "position", "x": 462.96, "y": 0}] },
|
|
230
|
+
{ "aid": "a2", "name": "Spring in",
|
|
231
|
+
"range": {"basedOn": "words", "drive": "time", "animate": "in", "around": "word", "stagger": 0.15, "duration": 1.1, "curve": "Overshoot"},
|
|
232
|
+
"effects": [{"pid": "p2", "type": "position", "x": 129.63, "y": 157.41}, {"pid": "p3", "type": "scale", "scale": 78}] },
|
|
233
|
+
{ "aid": "a3", "name": "Focus in",
|
|
234
|
+
"range": {"basedOn": "words", "drive": "time", "animate": "in", "around": "auto", "stagger": 0.15, "duration": 0.38, "curve": "Power2 Out"},
|
|
235
|
+
"effects": [{"pid": "p4", "type": "opacity", "opacity": 0}, {"pid": "p5", "type": "blur", "amount": 25.93}] },
|
|
236
|
+
{ "aid": "a4", "name": "Hot glow",
|
|
237
|
+
"range": {"basedOn": "words", "drive": "time", "animate": "in", "around": "auto", "stagger": 0.15, "duration": 0.65, "curve": "Sine Smooth"},
|
|
238
|
+
"effects": [{"pid": "p6", "type": "fill", "color": "#6dff86"}, {"pid": "p7", "type": "glow", "color": "#3dff6a", "size": 62.96, "strength": 230}] },
|
|
239
|
+
{ "aid": "a5", "name": "Soft glow",
|
|
240
|
+
"range": {"basedOn": "chars"},
|
|
241
|
+
"effects": [{"pid": "p8", "type": "glow", "color": "#b8ffc6", "size": 22.22, "strength": 30}] },
|
|
242
|
+
{ "aid": "a6", "name": "Key word",
|
|
243
|
+
"range": {"basedOn": "words", "start": 60, "end": 85, "smooth": 0},
|
|
244
|
+
"effects": [{"pid": "p9", "type": "fill", "color": "#6dff86"}, {"pid": "p10", "type": "stroke", "color": "#6dff86", "width": 2.41}, {"pid": "p11", "type": "glow", "color": "#3dff6a", "size": 29.63, "strength": 60}] }
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
219
249
|
### Glide Soft Stop
|
|
220
250
|
|
|
221
251
|
The same typing and band, but the word glides through the whole layer and all but stops in the middle, then slides off to the left. Plays: in, the first 1.13 s (Glide in across the whole layer), then out at the end. Designed for a `#05070a` background, left-aligned. Written for text like “External Storage”.
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
- [Text caption layers](video-text.md#text-caption-layers)
|
|
12
12
|
- [How a text layer is structured](video-text.md#how-a-text-layer-is-structured)
|
|
13
13
|
- [Text item fields (defaults from `sanitizeTimelineItem`)](video-text.md#text-item-fields-defaults-from-sanitizetimelineitem)
|
|
14
|
+
- [3D Text — real extruded letters (`text3d`)](video-text.md#3d-text--real-extruded-letters-text3d)
|
|
14
15
|
- [Dynamic text placeholders (counter, timer, word cycle, scramble, variables, markers, timecode)](video-text.md#dynamic-text-placeholders)
|
|
15
16
|
- [Advanced Animations — effects over a moving range of characters, words or lines](video-text.md#advanced-animations--effects-over-a-moving-range-of-characters-words-or-lines)
|
|
16
17
|
- [Worked example — add a bottom caption to an existing project](video-text.md#worked-example--add-a-bottom-caption-to-an-existing-project)
|
|
@@ -90,6 +91,39 @@ Field groups for the look around the text (the motion itself is `textAnimators`)
|
|
|
90
91
|
}
|
|
91
92
|
```
|
|
92
93
|
|
|
94
|
+
### 3D Text — real extruded letters (`text3d`)
|
|
95
|
+
|
|
96
|
+
A text layer can draw every letter as a real 3D solid: depth, rounded (bevelled) edges, a finish, light and
|
|
97
|
+
reflections, filmed by the project camera like a 3D model. Everything else stays the text layer's own — font,
|
|
98
|
+
size, wrapping, colours and the randomizer, Advanced Animations (Text Animators), Text on Path, keyframes and the
|
|
99
|
+
layer transform. **Rotate 3D in a Text Animator turns the letters for real**, showing their sides.
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
"text3d": {
|
|
103
|
+
"enabled": true,
|
|
104
|
+
"depth": 30, // extrusion, % of the font size (0–200)
|
|
105
|
+
"bevel": 18, // roundness: bevel size, % of the font size (0–40; capped per glyph by its stroke)
|
|
106
|
+
"bevelSegments": 5, // smoothness of the rounded edge (1–10)
|
|
107
|
+
"faceColor": null, // "#rrggbb" for every letter's face; null = the letter's own colour
|
|
108
|
+
"sideColor": null, // "#rrggbb" for the sides; null = the face colour darkened by sideShade
|
|
109
|
+
"sideShade": 35, // % darker for the derived side colour
|
|
110
|
+
"palette": ["#e8392f", "#2f6fe8", "#f5c518", "#2fb04a"], // optional: colours cycled per letter (toy look)
|
|
111
|
+
"material": "plastic",// plastic | matte | metal | glass
|
|
112
|
+
"light": "studio", // studio | soft | dramatic — only without a 3D Rig in the project
|
|
113
|
+
"envIntensity": 1 // reflections strength (0–3), only without a Rig
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- **Lighting.** With a Scene Rig (3D Rig layer) the letters join its shared world: its lights and environment light
|
|
118
|
+
them and they cast and receive its shadows. Without one, `light` picks a studio set and `envIntensity` the
|
|
119
|
+
reflections.
|
|
120
|
+
- **Fonts.** Each letter is traced from the font the layer really draws with, so Google, uploaded and system fonts
|
|
121
|
+
and any weight work. The face is the 2D glyph's exact outline; the bevel swells the sides outward.
|
|
122
|
+
- **Not in 3D:** the caption bar, outline stroke, text shadow and glow, blur and decorations are 2D paint and are not
|
|
123
|
+
drawn on 3D letters. A Text Animator's opacity and colour apply; its blur, glow, shadow and stroke do not.
|
|
124
|
+
- **Cost:** a glyph's geometry is built once per font, character, depth and bevel and shared; each frame poses the
|
|
125
|
+
letters and renders one 3D pass. `depth`, `bevel` and `bevelSegments` are not keyframable (they rebuild geometry).
|
|
126
|
+
|
|
93
127
|
### Dynamic text placeholders
|
|
94
128
|
|
|
95
129
|
`{{{TYPE:args}}}` tokens inside `textContent` make parts of an ordinary text layer (`mediaType: "text"`) dynamic while the rest stays typed text. Font, colour/gradient, outline, shadow, background bar, randomizer, text on path and Advanced Animations all apply. A token that doesn't parse — or a VAR with no value — stays visible as typed. Layer names and the timeline show a resolved value instead of the token.
|
|
@@ -185,7 +219,8 @@ Rules the sanitizer enforces (anything else is dropped or clamped on load): `aid
|
|
|
185
219
|
| `delay` | −60…600 s (0) | In: after the layer starts. Out: before it ends. Voice: after the word is spoken (negative = before). |
|
|
186
220
|
| `stagger` | 0…10 s (0.06) | Time: between one unit's turn and the next. |
|
|
187
221
|
| `duration` | 0…20 s (0.6) | How long each unit takes (0 = instant). For `active`/`stay` it is the fade-in. |
|
|
188
|
-
| `curve` | the app's easing names (`Ease Out`) | Each unit's own easing: `Linear`, `Ease In/Out`, `Smooth`, `Power1–4 In/Out/Smooth`, `Sine/Cubic/Expo/Circ/Back In/Out/Smooth`, `Bounce Out`, `Elastic`, `Overshoot`, `Smooth Overshoot`, `Impulse`, `Swing`, `Anticipate`, `Natural`, `Slow Down`, `AE In/Smooth/Out`. Back, Bounce, Elastic and the Overshoots land each unit past its rest and settle (transforms follow the overshoot, colours clamp). `Anticipate` is an exit: the unit winds back the other way (to −0.38 of the move at 58 %), then snaps through in the last frames. |
|
|
222
|
+
| `curve` | the app's easing names (`Ease Out`) | Each unit's own easing: `Linear`, `Ease In/Out`, `Smooth`, `Power1–4 In/Out/Smooth`, `Sine/Cubic/Expo/Circ/Back In/Out/Smooth`, `Bounce Out`, `Elastic`, `Overshoot`, `Smooth Overshoot`, `Impulse`, `Swing`, `Anticipate`, `Natural`, `Slow Down`, `AE In/Smooth/Out`. Back, Bounce, Elastic and the Overshoots land each unit past its rest and settle (transforms follow the overshoot, colours clamp). `Anticipate` is an exit: the unit winds back the other way (to −0.38 of the move at 58 %), then snaps through in the last frames. `Custom` plays `bezier`. |
|
|
223
|
+
| `bezier` | `[x1, y1, x2, y2]` or null (null) | The `Custom` curve's handles, the same shape as a keyframe's `bezier` (x 0…1, y −3…4; past 0…1 = overshoot). Write it together with `"curve": "Custom"`: a `Custom` without it plays `Ease Out`, and any named `curve` drops it. |
|
|
189
224
|
| `hold` | 0…600 s (0) | `active`: how long a unit stays lit; 0 = until the next unit's turn (voice: until the next word starts). |
|
|
190
225
|
| `fadeOut` | 0…20 s (0) | `active`: fade back down after `hold`. |
|
|
191
226
|
| `keepLast` | bool (false) | `active`: the last unit stays lit. |
|