greenlight-motion 0.1.3 → 0.1.5
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 +14 -11
- package/dist/bundle-inputs.json +2 -0
- package/dist/greenlight-motion-script.mjs +1 -1
- package/dist/greenlight-motion.js +609 -609
- package/dist/greenlight-motion.mjs +31573 -31199
- package/package.json +2 -2
- package/skill/SKILL.md +10 -10
- package/skill/references/video-design.md +5 -0
- package/skill/references/video-text.md +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "greenlight-motion",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "GreenLight Motion Engine: AI agents make motion-design videos (3D, camera, effects, transitions, text animation, particles, motion blur) with the GreenLight Dash Video Editor's own engine, in the user's browser.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"video",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"greenlight-motion": "cli/index.mjs"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
|
-
"prepack": "npm --prefix ../frontend run build
|
|
34
|
+
"prepack": "npm --prefix ../frontend run build"
|
|
35
35
|
},
|
|
36
36
|
"main": "dist/greenlight-motion.mjs",
|
|
37
37
|
"exports": {
|
package/skill/SKILL.md
CHANGED
|
@@ -18,7 +18,7 @@ You never write UI or animation code. If something is not in the format, it is n
|
|
|
18
18
|
## Setup (once per machine)
|
|
19
19
|
|
|
20
20
|
```
|
|
21
|
-
npx greenlight-motion@0.1.
|
|
21
|
+
npx greenlight-motion@0.1.5 doctor
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
It checks Node 18+, Chrome or Edge, WebGPU and H.264 encoding, and prints a fix for anything missing. Do not install
|
|
@@ -32,7 +32,7 @@ animation presets (the same converter the GreenLight Motion connector uses in Cl
|
|
|
32
32
|
keyframes rarely look as good. The format, the design rules and the catalogues: `skill/references/scene-script.md`.
|
|
33
33
|
|
|
34
34
|
```
|
|
35
|
-
npx greenlight-motion@0.1.
|
|
35
|
+
npx greenlight-motion@0.1.5 script <folder> --from scenes.json # or write <folder>/script.json, then: script <folder>
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
Then `check` and `stills` (below), fix the SCRIPT and run `script` again — it rewrites `project.json`. For what a
|
|
@@ -41,14 +41,14 @@ workflow below and stop running `script` (it refuses to overwrite a project edit
|
|
|
41
41
|
|
|
42
42
|
## Workflow
|
|
43
43
|
|
|
44
|
-
1. `npx greenlight-motion@0.1.
|
|
44
|
+
1. `npx greenlight-motion@0.1.5 init <folder>` — starts from a working example (title, subtitle, accent line, four
|
|
45
45
|
options). `--from file.json` starts from a project you have (for example one exported from GreenLight Dash).
|
|
46
46
|
2. Edit `<folder>/project.json` — for changes to an EXISTING project prefer `apply` (below): it checks every edit and
|
|
47
47
|
applies all or nothing. Put pictures, video, sound and fonts in `<folder>/assets/` and refer to them as
|
|
48
48
|
`"asset:<file>"` (e.g. `"url": "asset:product.png"`).
|
|
49
|
-
3. `npx greenlight-motion@0.1.
|
|
49
|
+
3. `npx greenlight-motion@0.1.5 check <folder>` — fix everything it lists (missing files, template mistakes, blank
|
|
50
50
|
frames, page errors). `--json` for machine output.
|
|
51
|
-
4. `npx greenlight-motion@0.1.
|
|
51
|
+
4. `npx greenlight-motion@0.1.5 stills <folder>` — renders frames and **a labelled contact sheet**. Open and look at
|
|
52
52
|
it before you go on: layout, readability, timing. Fix and repeat. `--at 0.5,1.2,3` for exact times.
|
|
53
53
|
5. Hand it over: tell the user to open `<folder>/index.html` (Chrome or Edge), or `pack` it into one file, or
|
|
54
54
|
`render` the MP4 yourself (`--fps 60 --motion-blur` for fast motion).
|
|
@@ -113,7 +113,7 @@ editor's own normalizer), so write only what you mean.
|
|
|
113
113
|
Full references (generated from the editor's own docs; ignore the `/api/` routes they mention):
|
|
114
114
|
`skill/references/` — video-design, scene-script, video-projects, video-text, video-text-kinetic, video-text-presets, video-shapes, video-keyframes,
|
|
115
115
|
video-camera, video-3d, video-effects, video-transitions, video-particles, video-paths, video-backgrounds, video-grid.
|
|
116
|
-
Machine-readable lists: `npx greenlight-motion@0.1.
|
|
116
|
+
Machine-readable lists: `npx greenlight-motion@0.1.5 schema effects | transitions | easings | paths | expressions`.
|
|
117
117
|
|
|
118
118
|
## Template
|
|
119
119
|
|
|
@@ -160,7 +160,7 @@ an absolute moment; `align` `sync` (default) / `start` / `end`; `offset` seconds
|
|
|
160
160
|
|
|
161
161
|
The library is 77 hand-picked sounds in categories (whooshes and swooshes, transitions, clicks, pop-ups and
|
|
162
162
|
notifications, data blips, typing and writing, foley, bubbles, impacts and bass drops, camera, gears, voice clips).
|
|
163
|
-
`npx greenlight-motion@0.1.
|
|
163
|
+
`npx greenlight-motion@0.1.5 schema sounds` lists every one with its `category`, `use` (what it is for), `duration`
|
|
164
164
|
and `sync`. Pick by `category` and `use`, then by name.
|
|
165
165
|
|
|
166
166
|
- **Where the files come from:** the GreenLight sound CDN. `build` downloads each sound a cue uses into
|
|
@@ -176,7 +176,7 @@ The page has **Notes**: the user marks what should change right on the frame (a
|
|
|
176
176
|
and writes a note for each mark. Every note carries the moment (seconds and frame), the mark in composition pixels
|
|
177
177
|
and the layers under it (item ids in project.json), so you change exactly that and nothing else.
|
|
178
178
|
|
|
179
|
-
- **They review on this computer:** run `npx greenlight-motion@0.1.
|
|
179
|
+
- **They review on this computer:** run `npx greenlight-motion@0.1.5 review <folder>` and give them the URL it prints
|
|
180
180
|
(it keeps running; `--open` opens their browser, only when they ask). Their notes land in `<folder>/review/`: read
|
|
181
181
|
`review/NOTES.md`, look at the `at-<t>s.png` pictures (the marks are numbered), make the changes (`apply`), `build`
|
|
182
182
|
again and tell them to reload the page.
|
|
@@ -205,11 +205,11 @@ that fails (`plugin`); look at `stills` for the look. A package that carries its
|
|
|
205
205
|
|
|
206
206
|
The same project opens in GreenLight Dash (the desktop editor this engine comes from) for full editing: the page's
|
|
207
207
|
edit note offers **Open in GreenLight Dash** (it imports the folder as a new project on the open board; a page with
|
|
208
|
-
changes saves a `.glvideo`). `npx greenlight-motion@0.1.
|
|
208
|
+
changes saves a `.glvideo`). `npx greenlight-motion@0.1.5 pack <folder> --glvideo` writes that file yourself: ONE
|
|
209
209
|
`.glvideo` (the project + its files) that opens in GreenLight Dash on a double-click, or dropped on its board. Hand it
|
|
210
210
|
over when the user wants to keep editing in the app. A
|
|
211
211
|
GreenLight Dash project comes the other way through the app's **Export for agents** — a ready folder like the one
|
|
212
|
-
`init` makes, with the options the author ticked. `npx greenlight-motion@0.1.
|
|
212
|
+
`init` makes, with the options the author ticked. `npx greenlight-motion@0.1.5 init <folder> --from <its project.json>`
|
|
213
213
|
starts from one too. Never tell the user they must install it: the page plays, changes options and renders on its own.
|
|
214
214
|
|
|
215
215
|
## Files
|
|
@@ -15,6 +15,11 @@ and check every version against them.
|
|
|
15
15
|
|
|
16
16
|
- One headline per scene; supporting text much smaller. Hierarchy comes from size and weight, not colour alone.
|
|
17
17
|
- One accent colour and strong contrast.
|
|
18
|
+
- **No text shadows unless the user asks for one.** A shadow under type reads as a stock default and softens the
|
|
19
|
+
letter edges. When text has to read over footage or a busy picture, get the contrast from the design instead: a
|
|
20
|
+
calmer or darker part of the frame, a caption bar (`textBgEnabled`), or a shape behind the text. So no
|
|
21
|
+
`textShadowX` / `textShadowY` / `textShadowBlur` / `textShadowSpread` on a text layer, no `shadow` property in a
|
|
22
|
+
Text Animator and no `longShadow` effect on text. A shadow already in the user's project stays.
|
|
18
23
|
- Keep text inside the middle 80 % of the frame (in a project: |panX| and |panY| ≤ 40): players and feeds crop the
|
|
19
24
|
edges.
|
|
20
25
|
|
|
@@ -60,7 +60,7 @@ Any field you omit is filled with the default below, so a caption item only need
|
|
|
60
60
|
| `panX` | `0` | **Horizontal position**, % of the frame WIDTH from center (±50 = the frame edge; no limit, beyond that is off-frame). + = right. |
|
|
61
61
|
| `panY` | `0` | **Vertical position**, % of the frame HEIGHT from center (±50 = the frame edge; no limit). **+ = down**, − = up. Bottom caption ≈ **`panY: 35`** (≈ `38` sits lower). |
|
|
62
62
|
|
|
63
|
-
Text extras: `textBgEnabled` + `textBgColor` + `textBgPadding` draw a caption-style background bar behind each text line (padding in px — the "spacing" around the text). `textBgPaddingX` / `textBgPaddingY` (px, 0–200) set the horizontal and vertical spacing separately — the panel's **Spacing H / Spacing V** — and each falls back to `textBgPadding` when omitted or `null`, so setting only the legacy field still moves both axes. The same bar can carry a border: `textBorderEnabled: true` + `textBorderColor` (default `"#ffffff"`, rgba allowed) + `textBorderWidth` (px, 0.5–40, default 2) + `textBorderStyle` (`"solid"` default, `"dashed"`, `"dotted"`). The border is its own toggle — a bar can be outline-only (`textBorderEnabled` without `textBgEnabled`) — and is stroked INSIDE the bar's bounds, so width never grows the bar. `textBgRadius` (px, 0–200) sets the bar's corner radius for both fill and border; omit it (or `null`) for the automatic radius (the padding, capped at 40% of the font size and 40px). The bar can animate instead of appearing instantly: `textBgInType` / `textBgOutType` pick the reveal — `"none"` (default), `"fade"`, `"mask-right"`, `"mask-left"`, `"mask-down"`, `"mask-up"`, `"center-h"`, `"center-v"`. Mask names give the direction the motion travels for In and Out alike (In `"mask-right"` sweeps the bar on left→right, Out `"mask-right"` sweeps it away left→right, so the same value both ways reads as one continuous pass); `center-*` grow/shrink each bar about its middle. `textBgInStyle` / `textBgOutStyle` are `"wipe"` (default — the finished bar is clipped by a rectangle, so the leading edge is flat), `"slide"` (the fill slides behind a mask fixed at the bar's final shape; `mask-*` only) or `"grow"` (**Grow Shape** — the bar's own rounded geometry scales from the anchored edge, so the corner radius is preserved throughout; pick this for pill-shaped bars). `center-*` take `wipe` or `grow`. Grow Shape extends a **seed** sitting at the anchored edge: the seed is `textBgInGrowStart` / `textBgOutGrowStart` (px, 0–600, default 0) when set, otherwise the pill's diameter when the bar has a radius (a circle), otherwise a hairline caret — so the fill really starts at ~0 width. Grow Shape can also give the seed its own appearance: `textBgInGrowAppear` / `textBgOutGrowAppear` — `"none"` (default: the seed is there from the first frame and extends), `"fade"` (alphas in while extending), `"scale-in"` (the seed zooms from a dot **at the start point** — dot → caret line, or dot → circle with a radius — and only then extends along the direction; the two run one after the other, so the total In takes appear-duration + duration) or `"scale-down"` (settles from 150% about the start point while fading in) — with `textBgInGrowAppearDuration` / `textBgOutGrowAppearDuration` (s, 0.05–4, default 0.4) and `textBgInGrowAppearEasing` / `textBgOutGrowAppearEasing` (easing display values, defaults `"Ease Out"` / `"Ease In"`). Nothing scales about the moving box centre, so the shape never drifts. Out mirrors everything (retract to the seed, then the seed zooms away). Ignored unless the slot's style is `"grow"`. `textBgInDuration` / `textBgOutDuration` are seconds (0.05–4, defaults 0.5 / 0.4); In plays over the item's first seconds, Out over its last. `textBgInDelay` (s, 0–4, default 0) holds the bar off-screen for that long before the In reveal starts — use it when the bar should land after the words have begun animating. The reveal (and the delay) applies to the border-only bar too. `textBgInEasing` / `textBgOutEasing` take an easing **display value** such as `"Ease Out"`, `"Expo Out"`, `"Back Out"` — the same values as `transitionInEasing` (defaults `"Ease Out"` in, `"Ease In"` out). Also: `textShadowX`/`textShadowY`/`textShadowBlur`/`textShadowColor` add a text shadow (defaults 0 / `rgba(0,0,0,0.75)`; off while offset and blur are all 0), with `textShadowSpread` (px, 0–50, default 0) thickening it before the blur. `textLetterCase` re-cases the rendered glyphs without touching `textContent` — `"none"` (default), `"uppercase"`, `"lowercase"` or `"capitalize"`, so a caption can shout without the stored text shouting. `textDecoration` is `"none"` (default), `"underline"`, `"line-through"` or `"overline"`. `textClipMask: true` turns the layer into a clipping mask so footage below plays inside the letters — see **Clipping masks** in the shapes section.
|
|
63
|
+
Text extras: `textBgEnabled` + `textBgColor` + `textBgPadding` draw a caption-style background bar behind each text line (padding in px — the "spacing" around the text). `textBgPaddingX` / `textBgPaddingY` (px, 0–200) set the horizontal and vertical spacing separately — the panel's **Spacing H / Spacing V** — and each falls back to `textBgPadding` when omitted or `null`, so setting only the legacy field still moves both axes. The same bar can carry a border: `textBorderEnabled: true` + `textBorderColor` (default `"#ffffff"`, rgba allowed) + `textBorderWidth` (px, 0.5–40, default 2) + `textBorderStyle` (`"solid"` default, `"dashed"`, `"dotted"`). The border is its own toggle — a bar can be outline-only (`textBorderEnabled` without `textBgEnabled`) — and is stroked INSIDE the bar's bounds, so width never grows the bar. `textBgRadius` (px, 0–200) sets the bar's corner radius for both fill and border; omit it (or `null`) for the automatic radius (the padding, capped at 40% of the font size and 40px). The bar can animate instead of appearing instantly: `textBgInType` / `textBgOutType` pick the reveal — `"none"` (default), `"fade"`, `"mask-right"`, `"mask-left"`, `"mask-down"`, `"mask-up"`, `"center-h"`, `"center-v"`. Mask names give the direction the motion travels for In and Out alike (In `"mask-right"` sweeps the bar on left→right, Out `"mask-right"` sweeps it away left→right, so the same value both ways reads as one continuous pass); `center-*` grow/shrink each bar about its middle. `textBgInStyle` / `textBgOutStyle` are `"wipe"` (default — the finished bar is clipped by a rectangle, so the leading edge is flat), `"slide"` (the fill slides behind a mask fixed at the bar's final shape; `mask-*` only) or `"grow"` (**Grow Shape** — the bar's own rounded geometry scales from the anchored edge, so the corner radius is preserved throughout; pick this for pill-shaped bars). `center-*` take `wipe` or `grow`. Grow Shape extends a **seed** sitting at the anchored edge: the seed is `textBgInGrowStart` / `textBgOutGrowStart` (px, 0–600, default 0) when set, otherwise the pill's diameter when the bar has a radius (a circle), otherwise a hairline caret — so the fill really starts at ~0 width. Grow Shape can also give the seed its own appearance: `textBgInGrowAppear` / `textBgOutGrowAppear` — `"none"` (default: the seed is there from the first frame and extends), `"fade"` (alphas in while extending), `"scale-in"` (the seed zooms from a dot **at the start point** — dot → caret line, or dot → circle with a radius — and only then extends along the direction; the two run one after the other, so the total In takes appear-duration + duration) or `"scale-down"` (settles from 150% about the start point while fading in) — with `textBgInGrowAppearDuration` / `textBgOutGrowAppearDuration` (s, 0.05–4, default 0.4) and `textBgInGrowAppearEasing` / `textBgOutGrowAppearEasing` (easing display values, defaults `"Ease Out"` / `"Ease In"`). Nothing scales about the moving box centre, so the shape never drifts. Out mirrors everything (retract to the seed, then the seed zooms away). Ignored unless the slot's style is `"grow"`. `textBgInDuration` / `textBgOutDuration` are seconds (0.05–4, defaults 0.5 / 0.4); In plays over the item's first seconds, Out over its last. `textBgInDelay` (s, 0–4, default 0) holds the bar off-screen for that long before the In reveal starts — use it when the bar should land after the words have begun animating. The reveal (and the delay) applies to the border-only bar too. `textBgInEasing` / `textBgOutEasing` take an easing **display value** such as `"Ease Out"`, `"Expo Out"`, `"Back Out"` — the same values as `transitionInEasing` (defaults `"Ease Out"` in, `"Ease In"` out). Also: `textShadowX`/`textShadowY`/`textShadowBlur`/`textShadowColor` add a text shadow (defaults 0 / `rgba(0,0,0,0.75)`; off while offset and blur are all 0), with `textShadowSpread` (px, 0–50, default 0) thickening it before the blur. Set them only when the user asks for a text shadow ([video-design.md](video-design.md#hierarchy)). `textLetterCase` re-cases the rendered glyphs without touching `textContent` — `"none"` (default), `"uppercase"`, `"lowercase"` or `"capitalize"`, so a caption can shout without the stored text shouting. `textDecoration` is `"none"` (default), `"underline"`, `"line-through"` or `"overline"`. `textClipMask: true` turns the layer into a clipping mask so footage below plays inside the letters — see **Clipping masks** in the shapes section.
|
|
64
64
|
|
|
65
65
|
**Fill style / outline type.** `textFillMode` is `"fill"` (default, solid glyphs), `"outline"` (hollow glyphs — the glyph boundary only) or `"both"`. `textOutlineWidth` is the stroke width in px on the text canvas (0–60, default 2; outline modes never go below a 0.5px hairline). `textOutlineColor` is optional — **omit it and the outline uses `textColor`**, so switching mode never silently changes the layer's colour; set it for a contrasting rim in `"both"` mode. Gradients work on the outline exactly as they do on the fill.
|
|
66
66
|
|
|
@@ -211,7 +211,7 @@ Rules the sanitizer enforces (anything else is dropped or clamped on load): `aid
|
|
|
211
211
|
| `hue` | `hue` 180°, `saturation` 0, `brightness` 0 % | rotates whatever colour the unit has at that point |
|
|
212
212
|
| `stroke` | `color` `#ffffff`, `width` 4 px, `outline` false | outline around the glyphs; `outline: true` fades the fill out |
|
|
213
213
|
| `glow` | `color` `#5ef2ff`, `size` 30 px, `strength` 120 % | soft light around the glyphs |
|
|
214
|
-
| `shadow` | `color` `#000000`, `x` 0, `y` 18, `blur` 20 px, `opacity` 70 % | offset shadow |
|
|
214
|
+
| `shadow` | `color` `#000000`, `x` 0, `y` 18, `blur` 20 px, `opacity` 70 % | offset shadow; only when the user asks for a text shadow |
|
|
215
215
|
| `blur` | `amount` 18 px | defocus |
|
|
216
216
|
| `box` | `color` `#33efab`, `behind` `selected`\|`revealed`, `shape` `line`\|`unit`\|`block`, `padX` 12, `padY` 4, `radius` 10 px, `opacity` 100 %, `grow` true, `withText` false | `line`: one bar behind each run of selected units in a row; `unit`: a bar behind each selected unit of `basedOn` (a whole word even when drawn by letters), as bright as its amount; `block`: one shape around all of it. `behind: revealed` = behind what this animator lets through (a typing animator grows its box). `grow` makes a moving span sweep it like a marker. `withText` (`unit` only): each bar is as visible as its unit — every animator's opacity included — so a word that has not appeared yet has no bar |
|
|
217
217
|
| `caret` | `style` `bar`\|`underscore`\|`block`, `ownColor` false, `color`, `width` 0 (auto) px, `blink` 1.1/s, `hide` false, `hideAfter` 0 s | a text cursor at this animator's reveal edge (what an Opacity 0 on the same range lets through): on an `in` animator it types with the text; solid while typing, blinking otherwise, gone when an `out` starts or `hideAfter` s after the typing ends |
|