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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "greenlight-motion",
3
- "version": "0.1.3",
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:motion-package"
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.3 doctor
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.3 script <folder> --from scenes.json # or write <folder>/script.json, then: script <folder>
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.3 init <folder>` — starts from a working example (title, subtitle, accent line, four
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.3 check <folder>` — fix everything it lists (missing files, template mistakes, blank
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.3 stills <folder>` — renders frames and **a labelled contact sheet**. Open and look at
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.3 schema effects | transitions | easings | paths | expressions`.
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.3 schema sounds` lists every one with its `category`, `use` (what it is for), `duration`
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.3 review <folder>` and give them the URL it prints
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.3 pack <folder> --glvideo` writes that file yourself: ONE
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.3 init <folder> --from <its project.json>`
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 |