motionrender 0.0.0-stage → 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.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -2
  3. package/blocks/badge.json +68 -0
  4. package/blocks/big-stat.json +240 -0
  5. package/blocks/cta-end.json +283 -0
  6. package/blocks/feature-list.json +286 -0
  7. package/blocks/footage.json +43 -0
  8. package/blocks/fx-background-swap.json +170 -0
  9. package/blocks/fx-before-after.json +212 -0
  10. package/blocks/fx-captions.json +34 -0
  11. package/blocks/fx-chat.json +368 -0
  12. package/blocks/fx-checklist.json +609 -0
  13. package/blocks/fx-clone-wall.json +181 -0
  14. package/blocks/fx-color-pop.json +92 -0
  15. package/blocks/fx-command-bridge.json +358 -0
  16. package/blocks/fx-counter-hero.json +206 -0
  17. package/blocks/fx-cta-card.json +337 -0
  18. package/blocks/fx-day-to-night.json +174 -0
  19. package/blocks/fx-duo-title.json +245 -0
  20. package/blocks/fx-duotone.json +95 -0
  21. package/blocks/fx-extruded-title.json +309 -0
  22. package/blocks/fx-gallery.json +239 -0
  23. package/blocks/fx-glass-cards.json +921 -0
  24. package/blocks/fx-glitch-title.json +373 -0
  25. package/blocks/fx-grade-look.json +91 -0
  26. package/blocks/fx-highlighter.json +53 -0
  27. package/blocks/fx-icon-orbit.json +2694 -0
  28. package/blocks/fx-lens-flare.json +325 -0
  29. package/blocks/fx-letterbox.json +105 -0
  30. package/blocks/fx-light-leak.json +140 -0
  31. package/blocks/fx-map-journey.json +443 -0
  32. package/blocks/fx-neon-outline.json +743 -0
  33. package/blocks/fx-notifications.json +456 -0
  34. package/blocks/fx-progress-ring.json +143 -0
  35. package/blocks/fx-pull-out.json +68 -0
  36. package/blocks/fx-punch-in.json +81 -0
  37. package/blocks/fx-rgb-flash.json +166 -0
  38. package/blocks/fx-shake-hit.json +120 -0
  39. package/blocks/fx-split-reveal.json +110 -0
  40. package/blocks/fx-spotlight.json +1383 -0
  41. package/blocks/fx-stats-split.json +500 -0
  42. package/blocks/fx-step-tracker.json +528 -0
  43. package/blocks/fx-sticker-freeze.json +584 -0
  44. package/blocks/fx-strike-rewrite.json +79 -0
  45. package/blocks/fx-ticker.json +179 -0
  46. package/blocks/fx-timeline.json +1287 -0
  47. package/blocks/fx-tracked-label.json +167 -0
  48. package/blocks/fx-typewriter-quote.json +164 -0
  49. package/blocks/handle.json +43 -0
  50. package/blocks/icon-row.json +404 -0
  51. package/blocks/image-caption.json +248 -0
  52. package/blocks/lower-third.json +106 -0
  53. package/blocks/phone-mockup.json +459 -0
  54. package/blocks/progress-bar.json +51 -0
  55. package/blocks/quote.json +347 -0
  56. package/blocks/section-title.json +240 -0
  57. package/blocks/split-screen.json +283 -0
  58. package/blocks/stat-grid.json +315 -0
  59. package/blocks/steps.json +266 -0
  60. package/blocks/title-hero.json +287 -0
  61. package/dist/builder.d.ts +1 -0
  62. package/dist/builder.js +169 -0
  63. package/dist/cli.js +9301 -0
  64. package/dist/fonts/LICENSE-Inter.txt +93 -0
  65. package/dist/fonts/inter-cyrillic-ext-opsz-italic.woff2 +0 -0
  66. package/dist/fonts/inter-cyrillic-ext-opsz-normal.woff2 +0 -0
  67. package/dist/fonts/inter-cyrillic-opsz-italic.woff2 +0 -0
  68. package/dist/fonts/inter-cyrillic-opsz-normal.woff2 +0 -0
  69. package/dist/fonts/inter-greek-ext-opsz-italic.woff2 +0 -0
  70. package/dist/fonts/inter-greek-ext-opsz-normal.woff2 +0 -0
  71. package/dist/fonts/inter-greek-opsz-italic.woff2 +0 -0
  72. package/dist/fonts/inter-greek-opsz-normal.woff2 +0 -0
  73. package/dist/fonts/inter-latin-ext-opsz-italic.woff2 +0 -0
  74. package/dist/fonts/inter-latin-ext-opsz-normal.woff2 +0 -0
  75. package/dist/fonts/inter-latin-opsz-italic.woff2 +0 -0
  76. package/dist/fonts/inter-latin-opsz-normal.woff2 +0 -0
  77. package/dist/fonts/inter-vietnamese-opsz-italic.woff2 +0 -0
  78. package/dist/fonts/inter-vietnamese-opsz-normal.woff2 +0 -0
  79. package/dist/index.d.ts +2 -0
  80. package/dist/index.js +2330 -0
  81. package/dist/player.d.ts +1 -0
  82. package/dist/player.js +80 -0
  83. package/dist/react.d.ts +1 -0
  84. package/dist/react.js +140 -0
  85. package/dist/runtime/canvas-runtime.js +261 -0
  86. package/dist/runtime/lottie_light_canvas.min.js +1 -0
  87. package/dist/runtime/text-layout.js +50 -0
  88. package/dist/sfx/click.wav +0 -0
  89. package/dist/sfx/ding.wav +0 -0
  90. package/dist/sfx/pop.wav +0 -0
  91. package/dist/sfx/riser.wav +0 -0
  92. package/dist/sfx/thump.wav +0 -0
  93. package/dist/sfx/tick.wav +0 -0
  94. package/dist/sfx/whoosh.wav +0 -0
  95. package/dist/types/packages/ai/src/assets.d.ts +26 -0
  96. package/dist/types/packages/ai/src/batch.d.ts +19 -0
  97. package/dist/types/packages/ai/src/compose.d.ts +34 -0
  98. package/dist/types/packages/ai/src/history.d.ts +37 -0
  99. package/dist/types/packages/ai/src/image.d.ts +19 -0
  100. package/dist/types/packages/ai/src/index.d.ts +13 -0
  101. package/dist/types/packages/ai/src/json.d.ts +2 -0
  102. package/dist/types/packages/ai/src/narrate.d.ts +63 -0
  103. package/dist/types/packages/ai/src/patch.d.ts +15 -0
  104. package/dist/types/packages/ai/src/project.d.ts +27 -0
  105. package/dist/types/packages/ai/src/prompt.d.ts +30 -0
  106. package/dist/types/packages/ai/src/providers.d.ts +109 -0
  107. package/dist/types/packages/ai/src/template.d.ts +80 -0
  108. package/dist/types/packages/ai/src/voiceover.d.ts +49 -0
  109. package/dist/types/packages/animation/src/index.d.ts +27 -0
  110. package/dist/types/packages/assets/src/cache.d.ts +26 -0
  111. package/dist/types/packages/assets/src/index.d.ts +8 -0
  112. package/dist/types/packages/builder/src/index.d.ts +270 -0
  113. package/dist/types/packages/cli/src/ai-studio-page.d.ts +1 -0
  114. package/dist/types/packages/cli/src/ai-studio.d.ts +35 -0
  115. package/dist/types/packages/cli/src/ai.d.ts +3 -0
  116. package/dist/types/packages/cli/src/args.d.ts +9 -0
  117. package/dist/types/packages/cli/src/blocks-cli.d.ts +3 -0
  118. package/dist/types/packages/cli/src/blocks.d.ts +50 -0
  119. package/dist/types/packages/cli/src/build.d.ts +1 -0
  120. package/dist/types/packages/cli/src/dev-page.d.ts +1 -0
  121. package/dist/types/packages/cli/src/dev.d.ts +13 -0
  122. package/dist/types/packages/cli/src/index.d.ts +2 -0
  123. package/dist/types/packages/cli/src/init.d.ts +10 -0
  124. package/dist/types/packages/cli/src/serve.d.ts +2 -0
  125. package/dist/types/packages/cli/src/studio.d.ts +36 -0
  126. package/dist/types/packages/cli/src/templates.d.ts +63 -0
  127. package/dist/types/packages/cli/src/thumbnail.d.ts +20 -0
  128. package/dist/types/packages/cli/src/track.d.ts +35 -0
  129. package/dist/types/packages/cli/src/worker.d.ts +13 -0
  130. package/dist/types/packages/contracts/src/index.d.ts +377 -0
  131. package/dist/types/packages/core/src/audio.d.ts +14 -0
  132. package/dist/types/packages/core/src/distributed.d.ts +50 -0
  133. package/dist/types/packages/core/src/index.d.ts +63 -0
  134. package/dist/types/packages/core/src/media.d.ts +11 -0
  135. package/dist/types/packages/core/src/review.d.ts +29 -0
  136. package/dist/types/packages/ffmpeg/src/index.d.ts +68 -0
  137. package/dist/types/packages/graphics/src/fonts.d.ts +3 -0
  138. package/dist/types/packages/graphics/src/index.d.ts +121 -0
  139. package/dist/types/packages/graphics/src/runtime.d.ts +10 -0
  140. package/dist/types/packages/jobs/src/env.d.ts +78 -0
  141. package/dist/types/packages/jobs/src/handlers.d.ts +17 -0
  142. package/dist/types/packages/jobs/src/index.d.ts +5 -0
  143. package/dist/types/packages/jobs/src/input.d.ts +18 -0
  144. package/dist/types/packages/jobs/src/queue.d.ts +70 -0
  145. package/dist/types/packages/jobs/src/redis.d.ts +42 -0
  146. package/dist/types/packages/player/src/bundle.d.ts +4 -0
  147. package/dist/types/packages/player/src/canvas-runtime.d.ts +11 -0
  148. package/dist/types/packages/player/src/index.d.ts +29 -0
  149. package/dist/types/packages/react/src/index.d.ts +76 -0
  150. package/dist/types/packages/renderer/src/index.d.ts +35 -0
  151. package/dist/types/packages/renderer/src/pool.d.ts +7 -0
  152. package/dist/types/packages/renderer/src/video.d.ts +9 -0
  153. package/dist/types/packages/schema/src/captions.d.ts +24 -0
  154. package/dist/types/packages/schema/src/expression.d.ts +1 -0
  155. package/dist/types/packages/schema/src/index.d.ts +1213 -0
  156. package/dist/types/packages/schema/src/variables.d.ts +115 -0
  157. package/dist/types/packages/storage/src/index.d.ts +78 -0
  158. package/dist/types/packages/timeline/src/index.d.ts +104 -0
  159. package/package.json +78 -4
  160. package/skills/ove/SKILL.md +356 -0
  161. package/skills/ove-ai-compose/SKILL.md +36 -0
  162. package/skills/ove-batch-videos/SKILL.md +23 -0
  163. package/skills/ove-code-video/SKILL.md +68 -0
  164. package/skills/ove-effects/SKILL.md +65 -0
  165. package/skills/ove-make-reel/SKILL.md +30 -0
  166. package/skills/ove-voiceover-captions/SKILL.md +31 -0
  167. package/studio/assets/index-CzOvWv9w.css +1 -0
  168. package/studio/assets/index-J_fvKgng.js +11 -0
  169. package/studio/index.html +16 -0
  170. package/templates/case-study/composition.json +358 -0
  171. package/templates/case-study/template.json +8 -0
  172. package/templates/event-invite/composition.json +245 -0
  173. package/templates/event-invite/template.json +8 -0
  174. package/templates/explainer-square/composition.json +1335 -0
  175. package/templates/explainer-square/template.json +13 -0
  176. package/templates/keynote-wide/composition.json +1458 -0
  177. package/templates/keynote-wide/template.json +13 -0
  178. package/templates/launch-wide/composition.json +1306 -0
  179. package/templates/launch-wide/template.json +13 -0
  180. package/templates/product-card/composition.json +196 -0
  181. package/templates/product-card/data.example.json +5 -0
  182. package/templates/product-card/template.json +8 -0
  183. package/templates/product-wide/composition.json +1609 -0
  184. package/templates/product-wide/template.json +14 -0
  185. package/templates/quote-card/composition.json +123 -0
  186. package/templates/quote-card/template.json +8 -0
  187. package/templates/sale-promo/composition.json +290 -0
  188. package/templates/sale-promo/template.json +8 -0
  189. package/templates/showcase-tall/composition.json +1646 -0
  190. package/templates/showcase-tall/template.json +14 -0
  191. package/templates/slideshow/composition.json +167 -0
  192. package/templates/slideshow/template.json +8 -0
  193. package/templates/social-reel/composition.json +252 -0
  194. package/templates/social-reel/template.json +8 -0
  195. package/templates/starter/assets/logo.svg +4 -0
  196. package/templates/starter/composition.json +84 -0
  197. package/templates/story-tall/composition.json +1379 -0
  198. package/templates/story-tall/template.json +13 -0
  199. package/themes/espresso.json +15 -0
  200. package/themes/midnight.json +15 -0
  201. package/themes/neon.json +15 -0
  202. package/themes/paper.json +15 -0
  203. package/themes/signal.json +15 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Open Video Engine contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,62 @@
1
- # Temporary Holding Version
1
+ # motionrender
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A JSON-first, frame-deterministic motion graphics video engine. A video is one JSON composition: layers, animation, transitions, video and audio, text, drawing and templates with variables, lists and components. MotionRender renders it in headless Chromium and encodes it with FFmpeg to MP4 (H.264/H.265), WebM (VP9, with transparency), MOV (ProRes), GIF or a folder of PNG frames.
4
+
5
+ ## Requirements
6
+
7
+ - Node.js 22 or later.
8
+ - FFmpeg with ffprobe, on `PATH` (or set `OVE_FFMPEG_PATH` and `OVE_FFPROBE_PATH`).
9
+ - Chromium for Playwright: `npx playwright install chromium`. On Windows an installed Google Chrome is used if present; `OVE_CHROMIUM_EXECUTABLE` picks a specific browser.
10
+
11
+ ## Command line
12
+
13
+ ```sh
14
+ npm install motionrender
15
+ npx motionrender init my-video
16
+ npx motionrender dev my-video/composition.json
17
+ npx motionrender render my-video/composition.json --output out.mp4
18
+ ```
19
+
20
+ You can use `motionrender`, `mr`, or `ove` interchangeably:
21
+ `npx motionrender` lists every command: `init`, `schema`, `doctor`, `browser install`, `dev` (live preview with audio), `render` (formats, codecs, transparency, frame ranges, batch rendering), `ai` and `ai studio` (`motionrender ai studio`).
22
+
23
+ ## Node API
24
+
25
+ ```js
26
+ import { loadCompositionFile, renderMedia, renderStill } from 'motionrender';
27
+
28
+ const { composition, baseDir } = await loadCompositionFile('my-video/composition.json', { title: 'Hello from Node' });
29
+
30
+ await renderMedia(composition, {
31
+ baseDir,
32
+ output: 'out/hello.webm', // format follows the extension: .mp4 .webm .mov .gif, or no extension for PNG frames
33
+ transparent: true, // webm, mov and png only
34
+ frameRange: [0, 89], // optional, inclusive
35
+ onProgress: ({ rendered, total }) => console.log(`${rendered}/${total}`),
36
+ signal: AbortSignal.timeout(60_000),
37
+ });
38
+
39
+ const png = await renderStill(composition, { baseDir, frame: 45 }); // a Buffer
40
+ ```
41
+
42
+ ## React Videos & Builder
43
+
44
+ ```js
45
+ import { AbsoluteFill, Series, interpolate, spring, useCurrentFrame, useVideoConfig } from 'motionrender/react';
46
+ import { createVideo, text, rect, sample } from 'motionrender/builder';
47
+ ```
48
+
49
+ ## Player (browser)
50
+
51
+ ```js
52
+ import { createPlayer } from 'motionrender/player';
53
+ const player = await createPlayer(document.querySelector('#video'), { composition, assetBase: '/media/', controls: true });
54
+ ```
55
+
56
+ Plays a composition live in any page with sound, drawn by the same code as the renderer. `play`, `pause`, `seek`, `setValues`, `destroy`, and `frame`/`play`/`pause`/`ended`/`error` events.
57
+
58
+ ## Writing compositions
59
+
60
+ `ove init` creates a starter project with `composition.schema.json` for editor checks and an agent skill (`.claude/skills/ove/SKILL.md`) that documents the whole format for coding agents and people alike.
61
+
62
+ MIT licensed.
@@ -0,0 +1,68 @@
1
+ {
2
+ "id": "badge",
3
+ "name": "Badge",
4
+ "category": "overlay",
5
+ "kind": "overlay",
6
+ "durationFrames": 90,
7
+ "description": "A small highlighted label in the top left corner, such as NEW or LIVE.",
8
+ "params": {
9
+ "label": {
10
+ "type": "string",
11
+ "default": "NEW"
12
+ }
13
+ },
14
+ "layers": [
15
+ {
16
+ "id": "tag",
17
+ "type": "text",
18
+ "spans": [
19
+ {
20
+ "text": " {{label}} ",
21
+ "background": "{{accent}}",
22
+ "color": "{{bg}}",
23
+ "fontWeight": 800
24
+ }
25
+ ],
26
+ "x": "{{round(canvas.width * 0.06)}}",
27
+ "y": "{{round(canvas.height * 0.05)}}",
28
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.032)}}",
29
+ "letterSpacing": "{{round(min(canvas.width, canvas.height) * 0.003)}}",
30
+ "animations": [
31
+ {
32
+ "property": "opacity",
33
+ "keyframes": [
34
+ {
35
+ "frame": 0,
36
+ "value": 0
37
+ },
38
+ {
39
+ "frame": 10,
40
+ "value": 1
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "property": "scale",
46
+ "keyframes": [
47
+ {
48
+ "frame": 0,
49
+ "value": 0.8,
50
+ "easing": "pop"
51
+ },
52
+ {
53
+ "frame": 14,
54
+ "value": 1
55
+ }
56
+ ]
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ "id": "sfx-in",
62
+ "type": "audio",
63
+ "src": "sfx:pop",
64
+ "startFrame": 0,
65
+ "volume": 0.3
66
+ }
67
+ ]
68
+ }
@@ -0,0 +1,240 @@
1
+ {
2
+ "id": "big-stat",
3
+ "name": "Big stat",
4
+ "category": "data",
5
+ "kind": "scene",
6
+ "durationFrames": 90,
7
+ "transition": {
8
+ "type": "push",
9
+ "durationFrames": 16,
10
+ "direction": "left",
11
+ "easing": "glide"
12
+ },
13
+ "description": "One huge number with a line of context.",
14
+ "params": {
15
+ "value": {
16
+ "type": "string",
17
+ "default": "87%"
18
+ },
19
+ "label": {
20
+ "type": "string",
21
+ "default": "of viewers keep watching until the end"
22
+ }
23
+ },
24
+ "layers": [
25
+ {
26
+ "id": "bg",
27
+ "type": "rect",
28
+ "x": 0,
29
+ "y": 0,
30
+ "width": "{{canvas.width}}",
31
+ "height": "{{canvas.height}}",
32
+ "fill": "{{bg}}"
33
+ },
34
+ {
35
+ "id": "glow",
36
+ "type": "circle",
37
+ "x": "{{round(canvas.width * 0.1)}}",
38
+ "y": "{{round(canvas.height * 0.5)}}",
39
+ "width": "{{round(min(canvas.width, canvas.height) * 1.1)}}",
40
+ "fill": "{{accent}}",
41
+ "opacity": 0.12,
42
+ "blur": 120,
43
+ "animations": [
44
+ {
45
+ "property": "scale",
46
+ "keyframes": [
47
+ {
48
+ "frame": 0,
49
+ "value": 0.9
50
+ },
51
+ {
52
+ "frame": 150,
53
+ "value": 1.1,
54
+ "easing": "drift"
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "property": "x",
60
+ "keyframes": [
61
+ {
62
+ "frame": 0,
63
+ "value": "{{round(canvas.width * 0.1)}}"
64
+ },
65
+ {
66
+ "frame": 180,
67
+ "value": "{{round(canvas.width * 0)}}",
68
+ "easing": "drift"
69
+ }
70
+ ]
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "id": "glow2",
76
+ "type": "circle",
77
+ "x": "{{round(canvas.width * 0.9)}}",
78
+ "y": "{{round(canvas.height * 0.5)}}",
79
+ "width": "{{round(min(canvas.width, canvas.height) * 0.8)}}",
80
+ "fill": "{{accent2}}",
81
+ "opacity": 0.072,
82
+ "blur": 140,
83
+ "animations": [
84
+ {
85
+ "property": "y",
86
+ "keyframes": [
87
+ {
88
+ "frame": 0,
89
+ "value": "{{round(canvas.height * 0.5)}}"
90
+ },
91
+ {
92
+ "frame": 180,
93
+ "value": "{{round(canvas.height * 0.4)}}",
94
+ "easing": "drift"
95
+ }
96
+ ]
97
+ },
98
+ {
99
+ "property": "scale",
100
+ "keyframes": [
101
+ {
102
+ "frame": 0,
103
+ "value": 1.1
104
+ },
105
+ {
106
+ "frame": 150,
107
+ "value": 0.9,
108
+ "easing": "drift"
109
+ }
110
+ ]
111
+ }
112
+ ]
113
+ },
114
+ {
115
+ "id": "stack",
116
+ "type": "group",
117
+ "x": 0,
118
+ "y": 0,
119
+ "width": "{{canvas.width}}",
120
+ "height": "{{canvas.height}}",
121
+ "layout": {
122
+ "direction": "column",
123
+ "gap": "{{round(min(canvas.width, canvas.height) * 0.03)}}",
124
+ "align": "center",
125
+ "justify": "center"
126
+ },
127
+ "children": [
128
+ {
129
+ "id": "value",
130
+ "type": "text",
131
+ "content": "{{value}}",
132
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.3)}}",
133
+ "color": "{{accent}}",
134
+ "fontWeight": 900,
135
+ "textAlign": "center",
136
+ "maxWidth": "{{round(canvas.width * 0.9)}}",
137
+ "lineHeight": 1,
138
+ "animations": [
139
+ {
140
+ "property": "scale",
141
+ "keyframes": [
142
+ {
143
+ "frame": 0,
144
+ "value": 0.8,
145
+ "easing": "pop"
146
+ },
147
+ {
148
+ "frame": 22,
149
+ "value": 1
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "property": "opacity",
155
+ "keyframes": [
156
+ {
157
+ "frame": 0,
158
+ "value": 0
159
+ },
160
+ {
161
+ "frame": 10,
162
+ "value": 1
163
+ }
164
+ ]
165
+ }
166
+ ]
167
+ },
168
+ {
169
+ "id": "label",
170
+ "type": "text",
171
+ "content": "{{label}}",
172
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.05)}}",
173
+ "color": "{{text}}",
174
+ "textAlign": "center",
175
+ "maxWidth": "{{round(canvas.width * 0.72)}}",
176
+ "maxLines": 3,
177
+ "minFontSize": "{{round(min(canvas.width, canvas.height) * 0.032)}}",
178
+ "startFrame": 14,
179
+ "animations": [
180
+ {
181
+ "property": "opacity",
182
+ "keyframes": [
183
+ {
184
+ "frame": 0,
185
+ "value": 0
186
+ },
187
+ {
188
+ "frame": 14,
189
+ "value": 1,
190
+ "easing": "glide"
191
+ }
192
+ ]
193
+ },
194
+ {
195
+ "property": "y",
196
+ "keyframes": [
197
+ {
198
+ "frame": 0,
199
+ "value": 24,
200
+ "easing": "land"
201
+ },
202
+ {
203
+ "frame": 18,
204
+ "value": 0
205
+ }
206
+ ]
207
+ }
208
+ ]
209
+ }
210
+ ]
211
+ },
212
+ {
213
+ "id": "sfx-hit",
214
+ "type": "audio",
215
+ "src": "sfx:pop",
216
+ "startFrame": 4,
217
+ "volume": 0.5
218
+ }
219
+ ],
220
+ "scene": {
221
+ "camera": {
222
+ "animations": [
223
+ {
224
+ "property": "zoom",
225
+ "keyframes": [
226
+ {
227
+ "frame": 0,
228
+ "value": 1.1
229
+ },
230
+ {
231
+ "frame": 90,
232
+ "value": 1,
233
+ "easing": "drift"
234
+ }
235
+ ]
236
+ }
237
+ ]
238
+ }
239
+ }
240
+ }
@@ -0,0 +1,283 @@
1
+ {
2
+ "id": "cta-end",
3
+ "name": "Call to action",
4
+ "category": "cta",
5
+ "kind": "scene",
6
+ "durationFrames": 120,
7
+ "transition": {
8
+ "type": "push",
9
+ "durationFrames": 16,
10
+ "direction": "left",
11
+ "easing": "glide"
12
+ },
13
+ "description": "Closing scene: a headline, a button and a web address.",
14
+ "params": {
15
+ "headline": {
16
+ "type": "string",
17
+ "default": "Ready to start?"
18
+ },
19
+ "button": {
20
+ "type": "string",
21
+ "default": "Get started"
22
+ },
23
+ "url": {
24
+ "type": "string",
25
+ "default": "example.com"
26
+ }
27
+ },
28
+ "layers": [
29
+ {
30
+ "id": "bg",
31
+ "type": "rect",
32
+ "x": 0,
33
+ "y": 0,
34
+ "width": "{{canvas.width}}",
35
+ "height": "{{canvas.height}}",
36
+ "fill": "{{bg}}"
37
+ },
38
+ {
39
+ "id": "glow",
40
+ "type": "circle",
41
+ "x": "{{round(canvas.width * 0.5)}}",
42
+ "y": "{{round(canvas.height * 0.4)}}",
43
+ "width": "{{round(min(canvas.width, canvas.height) * 1.1)}}",
44
+ "fill": "{{accent}}",
45
+ "opacity": 0.16,
46
+ "blur": 120,
47
+ "animations": [
48
+ {
49
+ "property": "scale",
50
+ "keyframes": [
51
+ {
52
+ "frame": 0,
53
+ "value": 0.9
54
+ },
55
+ {
56
+ "frame": 150,
57
+ "value": 1.1,
58
+ "easing": "drift"
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "property": "x",
64
+ "keyframes": [
65
+ {
66
+ "frame": 0,
67
+ "value": "{{round(canvas.width * 0.5)}}"
68
+ },
69
+ {
70
+ "frame": 180,
71
+ "value": "{{round(canvas.width * 0.4)}}",
72
+ "easing": "drift"
73
+ }
74
+ ]
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "id": "glow2",
80
+ "type": "circle",
81
+ "x": "{{round(canvas.width * 0.5)}}",
82
+ "y": "{{round(canvas.height * 0.6)}}",
83
+ "width": "{{round(min(canvas.width, canvas.height) * 0.8)}}",
84
+ "fill": "{{accent2}}",
85
+ "opacity": 0.096,
86
+ "blur": 140,
87
+ "animations": [
88
+ {
89
+ "property": "y",
90
+ "keyframes": [
91
+ {
92
+ "frame": 0,
93
+ "value": "{{round(canvas.height * 0.6)}}"
94
+ },
95
+ {
96
+ "frame": 180,
97
+ "value": "{{round(canvas.height * 0.5)}}",
98
+ "easing": "drift"
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "property": "scale",
104
+ "keyframes": [
105
+ {
106
+ "frame": 0,
107
+ "value": 1.1
108
+ },
109
+ {
110
+ "frame": 150,
111
+ "value": 0.9,
112
+ "easing": "drift"
113
+ }
114
+ ]
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "id": "stack",
120
+ "type": "group",
121
+ "x": 0,
122
+ "y": 0,
123
+ "width": "{{canvas.width}}",
124
+ "height": "{{canvas.height}}",
125
+ "layout": {
126
+ "direction": "column",
127
+ "gap": "{{round(min(canvas.width, canvas.height) * 0.05)}}",
128
+ "align": "center",
129
+ "justify": "center"
130
+ },
131
+ "children": [
132
+ {
133
+ "id": "headline",
134
+ "type": "text",
135
+ "content": "{{headline}}",
136
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.1)}}",
137
+ "color": "{{text}}",
138
+ "fontWeight": "{{headWeight}}",
139
+ "textAlign": "center",
140
+ "maxWidth": "{{round(canvas.width * 0.84)}}",
141
+ "maxLines": 3,
142
+ "minFontSize": "{{round(min(canvas.width, canvas.height) * 0.06)}}",
143
+ "lineHeight": 1.05,
144
+ "split": {
145
+ "by": "words",
146
+ "stagger": 4,
147
+ "preset": "rise",
148
+ "duration": 18
149
+ }
150
+ },
151
+ {
152
+ "id": "btn",
153
+ "type": "group",
154
+ "width": "{{round(canvas.width * 0.42)}}",
155
+ "height": "{{round(min(canvas.width, canvas.height) * 0.13)}}",
156
+ "startFrame": 24,
157
+ "animations": [
158
+ {
159
+ "property": "scale",
160
+ "keyframes": [
161
+ {
162
+ "frame": 0,
163
+ "value": 0.85,
164
+ "easing": "pop"
165
+ },
166
+ {
167
+ "frame": 16,
168
+ "value": 1
169
+ }
170
+ ]
171
+ },
172
+ {
173
+ "property": "opacity",
174
+ "keyframes": [
175
+ {
176
+ "frame": 0,
177
+ "value": 0
178
+ },
179
+ {
180
+ "frame": 8,
181
+ "value": 1
182
+ }
183
+ ]
184
+ }
185
+ ],
186
+ "children": [
187
+ {
188
+ "id": "pill",
189
+ "type": "rect",
190
+ "x": 0,
191
+ "y": 0,
192
+ "width": "{{round(canvas.width * 0.42)}}",
193
+ "height": "{{round(min(canvas.width, canvas.height) * 0.13)}}",
194
+ "radius": "{{round(min(canvas.width, canvas.height) * 0.065)}}",
195
+ "fill": "{{accent}}"
196
+ },
197
+ {
198
+ "id": "label",
199
+ "type": "text",
200
+ "content": "{{button}}",
201
+ "x": "{{round(canvas.width * 0.21)}}",
202
+ "y": "{{round(min(canvas.width, canvas.height) * 0.065 - min(canvas.width, canvas.height) * 0.03)}}",
203
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.05)}}",
204
+ "fontWeight": 800,
205
+ "color": "{{bg}}",
206
+ "textAlign": "center",
207
+ "maxWidth": "{{round(canvas.width * 0.38)}}",
208
+ "maxLines": 1,
209
+ "minFontSize": "{{round(min(canvas.width, canvas.height) * 0.032)}}"
210
+ }
211
+ ]
212
+ },
213
+ {
214
+ "id": "url",
215
+ "type": "text",
216
+ "content": "{{url}}",
217
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.04)}}",
218
+ "color": "{{muted}}",
219
+ "textAlign": "center",
220
+ "maxWidth": "{{round(canvas.width * 0.8)}}",
221
+ "startFrame": 34,
222
+ "animations": [
223
+ {
224
+ "property": "opacity",
225
+ "keyframes": [
226
+ {
227
+ "frame": 0,
228
+ "value": 0
229
+ },
230
+ {
231
+ "frame": 14,
232
+ "value": 1,
233
+ "easing": "glide"
234
+ }
235
+ ]
236
+ },
237
+ {
238
+ "property": "y",
239
+ "keyframes": [
240
+ {
241
+ "frame": 0,
242
+ "value": 16,
243
+ "easing": "land"
244
+ },
245
+ {
246
+ "frame": 18,
247
+ "value": 0
248
+ }
249
+ ]
250
+ }
251
+ ]
252
+ }
253
+ ]
254
+ },
255
+ {
256
+ "id": "sfx-btn",
257
+ "type": "audio",
258
+ "src": "sfx:ding",
259
+ "startFrame": 24,
260
+ "volume": 0.45
261
+ }
262
+ ],
263
+ "scene": {
264
+ "camera": {
265
+ "animations": [
266
+ {
267
+ "property": "zoom",
268
+ "keyframes": [
269
+ {
270
+ "frame": 0,
271
+ "value": 1
272
+ },
273
+ {
274
+ "frame": 120,
275
+ "value": 1.06,
276
+ "easing": "drift"
277
+ }
278
+ ]
279
+ }
280
+ ]
281
+ }
282
+ }
283
+ }