motionrender 0.2.7 → 0.2.9

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.
Binary file
Binary file
Binary file
Binary file
@@ -5,5 +5,6 @@ type Spec = {
5
5
  };
6
6
  export declare const commandSpecs: Record<string, Spec>;
7
7
  export declare const wantsHelp: (argv: string[]) => boolean;
8
+ export declare const wantsVersion: (argv: string[]) => boolean;
8
9
  export declare function checkArgs(argv: string[]): string[];
9
10
  export {};
@@ -5,6 +5,7 @@ export type ReviewIssue = {
5
5
  message: string;
6
6
  frame?: number;
7
7
  layer?: string;
8
+ suggestion?: Record<string, unknown>;
8
9
  };
9
10
  export type ReviewResult = {
10
11
  issues: ReviewIssue[];
@@ -31,6 +32,7 @@ export type ReviewOptions = {
31
32
  concurrency?: number;
32
33
  audio?: boolean;
33
34
  safeZone?: SafeZone;
35
+ showSafeZones?: boolean;
34
36
  onProgress?: (done: number, total: number) => void;
35
37
  };
36
38
  export type SafeZoneBand = {
@@ -8,6 +8,12 @@ export type Renderer = {
8
8
  contactSheet(frames: number[], options?: {
9
9
  columns?: number;
10
10
  width?: number;
11
+ safeBands?: {
12
+ x0: number;
13
+ y0: number;
14
+ x1: number;
15
+ y1: number;
16
+ }[];
11
17
  }): Promise<Buffer>;
12
18
  captureFrame(frame: number, output: string): Promise<void>;
13
19
  close(): Promise<void>;
@@ -222,7 +222,7 @@ export declare const spanSchema: z.ZodObject<{
222
222
  underline: z.ZodOptional<z.ZodBoolean>;
223
223
  }, z.core.$strip>;
224
224
  export declare const blendModes: readonly ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
225
- export declare const sfxNames: readonly ["click", "tick", "pop", "whoosh", "thump", "ding", "riser"];
225
+ export declare const sfxNames: readonly ["click", "tick", "pop", "whoosh", "thump", "ding", "riser", "shimmer", "sparkle", "impact", "ambient-pad"];
226
226
  export declare const isBuiltinSound: (src: string) => boolean;
227
227
  export declare const builtinSoundName: (src: string) => string;
228
228
  export declare const gradeLooks: readonly ["warm", "cool", "cinematic", "teal-orange", "noir", "vivid", "faded"];
@@ -69,6 +69,7 @@ export type LayerWindow = {
69
69
  layer: Layer;
70
70
  startFrame: number;
71
71
  endFrame: number;
72
+ scene?: Composition['scenes'][number];
72
73
  };
73
74
  export type AudioWindow = LayerWindow;
74
75
  export declare function layerWindows(composition: Composition, include: (layer: Layer) => boolean): LayerWindow[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "motionrender",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "JSON-first, frame-deterministic motion graphics video engine: render compositions to MP4, WebM, ProRes, GIF or PNG frames from Node or the command line.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -77,4 +77,4 @@
77
77
  "optional": true
78
78
  }
79
79
  }
80
- }
80
+ }
@@ -49,6 +49,7 @@ Effects are blocks named `fx-*`. `ove blocks` lists them under "Effects". They a
49
49
  | 34 Split reveal | `fx-split-reveal` | overlay |
50
50
  | 35 Gallery | `fx-gallery` | scene |
51
51
  | 36 CTA end card | `fx-cta-card` | scene; footage in a rounded window, not a cut-out |
52
+ | 37 Paper collage | `fx-paper-collage` | scene; editorial halftone cutout with cardstock backing and tape |
52
53
 
53
54
  ## Effects that need a matte
54
55
 
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: ove-paper-collage
3
+ description: Create editorial halftone paper-collage B-roll videos, stop-motion cutouts, torn-paper backgrounds, masking tape strips, and visual metaphors in MotionRender (openvideo). Use when the user wants editorial collage explainers, video essay b-roll, or Vox / Johnny Harris style visual cutouts.
4
+ ---
5
+
6
+ # Editorial Halftone Paper Collage B-roll
7
+
8
+ Create premium 5-second editorial stop-motion paper-collage B-roll clips (inspired by channels like Vox, Johnny Harris, MagnatesMedia, and the `gbro-collage-broll` workflow).
9
+
10
+ ## Core Aesthetic Identity
11
+ 1. **Paper Background**: Solid cardstock color (e.g. warm cream `#e8e0d5`, kraft brown, terracotta, olive green) with procedural film grain (`"grain": 0.12`).
12
+ 2. **Halftone Subject Cutouts**: High-contrast black-and-white photograph cutouts with CSS filters:
13
+ `"filter": "grayscale(1) contrast(1.75) brightness(1.05)"`
14
+ and drop shadows (`"shadow": { "color": "rgba(0,0,0,0.22)", "blur": 18, "offsetX": 5, "offsetY": 9 }`).
15
+ 3. **Paper Tape & Accents**: Translucent off-white or kraft tape strips (`rgba(240, 230, 210, 0.85)`) pinned at dynamic angles (`rotation: -15`).
16
+ 4. **Cardstock Backing Plate**: Rotated backing card (`rotation: -2.5`) sliding in with spring bounce (`easing: "easeOutBack"`).
17
+ 5. **Bold Label Kicker**: High-contrast highlight card (`#facc15` or theme accent) snapping in place over the subject.
18
+ 6. **Procedural SFX**: Synchronized sound design (`sfx:thump` on paper landing, `sfx:whoosh` on slide, `sfx:pop` on tape snap).
19
+
20
+ ---
21
+
22
+ ## 3-Gate Creation Workflow
23
+
24
+ To maintain high visual quality and editorial relevance:
25
+
26
+ ### Gate 1: Visual Metaphor Alignment
27
+ Identify the core message of the voiceover line and translate it into a physical paper object metaphor:
28
+ - Example: *"Interest rates soared overnight"* $\rightarrow$ A torn 1970s bank ledger with a soaring red paper arrow taped over it.
29
+ - Example: *"Silicon Valley poured billions into AI"* $\rightarrow$ A halftone vintage microchip cutout surrounded by stacked dollar band strips.
30
+
31
+ ### Gate 2: Asset Prep
32
+ - Ensure subject images have transparent backgrounds (using `rembg` or cutout masks).
33
+ - Apply high-contrast black-and-white halftone filter via layer `filter`.
34
+
35
+ ### Gate 3: MotionRender Assembly
36
+ Scaffold the project or add the effect block:
37
+
38
+ ```bash
39
+ # 1. Initialize a standalone 5-second collage B-roll project
40
+ mr init my-broll --template collage-broll
41
+
42
+ # 2. Or insert into an existing video composition
43
+ mr add fx-paper-collage video/composition.json --at 120 --frames 150 --set label="BREAKTHROUGH" --set headline="The inflection point"
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Example Composition Snippet
49
+
50
+ ```json
51
+ {
52
+ "id": "subject-cutout",
53
+ "type": "image",
54
+ "src": "assets/statue-head.png",
55
+ "x": 540,
56
+ "y": 860,
57
+ "width": 640,
58
+ "height": 640,
59
+ "rotation": 3,
60
+ "filter": "grayscale(1) contrast(1.75) brightness(1.05)",
61
+ "shadow": { "color": "rgba(0,0,0,0.25)", "blur": 20, "offsetX": 6, "offsetY": 10 },
62
+ "animations": [
63
+ {
64
+ "property": "scale",
65
+ "keyframes": [
66
+ { "frame": 10, "value": 0.4, "easing": "easeOutBack" },
67
+ { "frame": 24, "value": 1.0 }
68
+ ]
69
+ }
70
+ ]
71
+ }
72
+ ```
73
+
74
+ Validate and review the result with:
75
+ ```bash
76
+ mr review video/composition.json --show-safe-zones --output review.png
77
+ ```
78
+
@@ -0,0 +1,213 @@
1
+ {
2
+ "$schema": "./composition.schema.json",
3
+ "version": "1.0",
4
+ "id": "collage-broll",
5
+ "name": "Editorial Collage B-roll",
6
+ "width": 1080,
7
+ "height": 1920,
8
+ "fps": 30,
9
+ "durationFrames": 150,
10
+ "background": "#e8e0d5",
11
+ "grain": 0.12,
12
+ "variables": {
13
+ "label": {
14
+ "type": "string",
15
+ "default": "CRITICAL INSIGHT",
16
+ "description": "Punchy tag on paper tape"
17
+ },
18
+ "headline": {
19
+ "type": "string",
20
+ "default": "Built frame by frame",
21
+ "description": "Main editorial takeaway"
22
+ },
23
+ "accent": {
24
+ "type": "color",
25
+ "default": "#facc15",
26
+ "description": "Highlight tape colour"
27
+ }
28
+ },
29
+ "scenes": [
30
+ {
31
+ "id": "collage",
32
+ "name": "Collage",
33
+ "startFrame": 0,
34
+ "durationFrames": 150,
35
+ "camera": {
36
+ "zoom": 1.0,
37
+ "keyframes": [
38
+ { "frame": 0, "zoom": 1.0 },
39
+ { "frame": 150, "zoom": 1.05, "easing": "drift" }
40
+ ]
41
+ },
42
+ "transitionIn": { "type": "fade", "durationFrames": 12 },
43
+ "transitionOut": { "type": "fade", "durationFrames": 12 },
44
+ "layers": [
45
+ {
46
+ "id": "cardstock",
47
+ "type": "rect",
48
+ "x": 540,
49
+ "y": 920,
50
+ "width": 820,
51
+ "height": 1100,
52
+ "rotation": -2.5,
53
+ "fill": "#fcfbf7",
54
+ "radius": 4,
55
+ "shadow": {
56
+ "color": "rgba(0,0,0,0.18)",
57
+ "blur": 28,
58
+ "offsetX": 8,
59
+ "offsetY": 14
60
+ },
61
+ "animations": [
62
+ {
63
+ "property": "y",
64
+ "keyframes": [
65
+ { "frame": 0, "value": 2100, "easing": "easeOutBack" },
66
+ { "frame": 18, "value": 920 }
67
+ ]
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ "id": "photo-plate",
73
+ "type": "rect",
74
+ "x": 540,
75
+ "y": 860,
76
+ "width": 640,
77
+ "height": 640,
78
+ "rotation": 2.5,
79
+ "fill": "#18181b",
80
+ "radius": 6,
81
+ "stroke": "#ffffff",
82
+ "strokeWidth": 12,
83
+ "shadow": {
84
+ "color": "rgba(0,0,0,0.24)",
85
+ "blur": 20,
86
+ "offsetX": 6,
87
+ "offsetY": 10
88
+ },
89
+ "animations": [
90
+ {
91
+ "property": "scale",
92
+ "keyframes": [
93
+ { "frame": 10, "value": 0.4, "easing": "easeOutBack" },
94
+ { "frame": 24, "value": 1.0 }
95
+ ]
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "id": "photo-cutout-symbol",
101
+ "type": "text",
102
+ "content": "✂",
103
+ "fontSize": 180,
104
+ "color": "#facc15",
105
+ "x": 540,
106
+ "y": 830,
107
+ "rotation": 15,
108
+ "animations": [
109
+ {
110
+ "property": "scale",
111
+ "keyframes": [
112
+ { "frame": 12, "value": 0 },
113
+ { "frame": 26, "value": 1, "easing": "easeOutBack" }
114
+ ]
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "id": "tape-top",
120
+ "type": "rect",
121
+ "x": 400,
122
+ "y": 420,
123
+ "width": 240,
124
+ "height": 65,
125
+ "rotation": -15,
126
+ "fill": "rgba(240, 230, 210, 0.85)",
127
+ "startFrame": 20,
128
+ "shadow": {
129
+ "color": "rgba(0,0,0,0.08)",
130
+ "blur": 4,
131
+ "offsetX": 1,
132
+ "offsetY": 2
133
+ }
134
+ },
135
+ {
136
+ "id": "label-badge",
137
+ "type": "text",
138
+ "content": "{{label}}",
139
+ "fontFamily": "Inter",
140
+ "fontWeight": 900,
141
+ "fontSize": 44,
142
+ "color": "#111111",
143
+ "background": "{{accent}}",
144
+ "padding": 16,
145
+ "rotation": -3.5,
146
+ "x": 540,
147
+ "y": 1260,
148
+ "startFrame": 28,
149
+ "shadow": {
150
+ "color": "rgba(0,0,0,0.2)",
151
+ "blur": 12,
152
+ "offsetX": 4,
153
+ "offsetY": 6
154
+ },
155
+ "animations": [
156
+ {
157
+ "property": "y",
158
+ "keyframes": [
159
+ { "frame": 28, "value": 1380, "easing": "easeOutCubic" },
160
+ { "frame": 38, "value": 1260 }
161
+ ]
162
+ }
163
+ ]
164
+ },
165
+ {
166
+ "id": "headline-text",
167
+ "type": "text",
168
+ "content": "{{headline}}",
169
+ "fontFamily": "Inter",
170
+ "fontWeight": 700,
171
+ "fontSize": 48,
172
+ "color": "#18181b",
173
+ "maxWidth": 720,
174
+ "textAlign": "center",
175
+ "x": 540,
176
+ "y": 1380,
177
+ "startFrame": 36,
178
+ "animations": [
179
+ {
180
+ "property": "opacity",
181
+ "keyframes": [
182
+ { "frame": 36, "value": 0 },
183
+ { "frame": 46, "value": 1 }
184
+ ]
185
+ }
186
+ ]
187
+ },
188
+ {
189
+ "id": "sfx-paper-drop",
190
+ "type": "audio",
191
+ "src": "sfx:thump",
192
+ "startFrame": 14,
193
+ "volume": 0.85
194
+ },
195
+ {
196
+ "id": "sfx-subject-slide",
197
+ "type": "audio",
198
+ "src": "sfx:whoosh",
199
+ "startFrame": 18,
200
+ "volume": 0.6
201
+ },
202
+ {
203
+ "id": "sfx-tag-snap",
204
+ "type": "audio",
205
+ "src": "sfx:pop",
206
+ "startFrame": 28,
207
+ "volume": 0.65
208
+ }
209
+ ]
210
+ }
211
+ ]
212
+ }
213
+
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Editorial Collage B-roll",
3
+ "description": "A 5-second vertical stop-motion paper-collage B-roll scene: cardstock backing, halftone subject, tape strip, bold label tag, and procedural sound effects.",
4
+ "tags": ["collage", "9:16", "b-roll", "halftone", "editorial", "stop-motion", "social"],
5
+ "order": 14,
6
+ "previewFrame": 60,
7
+ "brief": "A 5-second 9:16 editorial paper-collage B-roll video: warm paper background with grain, cardstock backing, black-and-white halftone photograph cutout, masking tape accent, label tag, and sound effects."
8
+ }
9
+