motionrender 0.2.0 → 0.2.2

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 (66) hide show
  1. package/dist/cli.js +2634 -528
  2. package/dist/index.js +46 -1
  3. package/dist/player.js +13 -13
  4. package/dist/react.js +704 -9
  5. package/dist/types/packages/ai/src/agent.d.ts +57 -0
  6. package/dist/types/packages/ai/src/brand-scraper.d.ts +35 -0
  7. package/dist/types/packages/ai/src/captions.d.ts +11 -0
  8. package/dist/types/packages/ai/src/compose.d.ts +2 -0
  9. package/dist/types/packages/ai/src/edit.d.ts +69 -0
  10. package/dist/types/packages/ai/src/index.d.ts +8 -1
  11. package/dist/types/packages/ai/src/plan.d.ts +42 -0
  12. package/dist/types/packages/ai/src/prompt.d.ts +18 -0
  13. package/dist/types/packages/ai/src/providers.d.ts +35 -2
  14. package/dist/types/packages/ai/src/registry.d.ts +81 -0
  15. package/dist/types/packages/ai/src/retime.d.ts +7 -0
  16. package/dist/types/packages/ai/src/shorts.d.ts +75 -0
  17. package/dist/types/packages/cli/src/agent-cli.d.ts +15 -0
  18. package/dist/types/packages/cli/src/ai-studio-page.d.ts +1 -1
  19. package/dist/types/packages/cli/src/ai.d.ts +1 -1
  20. package/dist/types/packages/cli/src/build.d.ts +2 -0
  21. package/dist/types/packages/cli/src/templates.d.ts +13 -4
  22. package/dist/types/packages/contracts/src/index.d.ts +12 -12
  23. package/dist/types/packages/core/src/review.d.ts +24 -0
  24. package/dist/types/packages/ffmpeg/src/index.d.ts +1 -0
  25. package/dist/types/packages/jobs/src/queue.d.ts +2 -2
  26. package/dist/types/packages/jobs/src/redis.d.ts +2 -2
  27. package/dist/types/packages/react/src/components.d.ts +166 -0
  28. package/dist/types/packages/react/src/index.d.ts +54 -2
  29. package/dist/types/packages/react/src/springs.d.ts +25 -0
  30. package/dist/types/packages/schema/src/captions.d.ts +2 -0
  31. package/dist/types/packages/schema/src/index.d.ts +66 -66
  32. package/dist/types/scripts/eval-briefs.d.ts +67 -0
  33. package/package.json +1 -1
  34. package/skills/ove/SKILL.md +40 -2
  35. package/skills/ove-agent/SKILL.md +144 -0
  36. package/skills/ove-code-video/SKILL.md +17 -9
  37. package/skills/ove-motion-graphics/SKILL.md +113 -0
  38. package/skills/ove-react-video/SKILL.md +212 -0
  39. package/skills/ove-remotion/SKILL.md +122 -0
  40. package/studio/assets/index-DmZj9wTZ.css +1 -0
  41. package/studio/assets/index-n3DJI_GV.js +10 -0
  42. package/studio/index.html +2 -2
  43. package/templates/case-study/composition.json +25 -10
  44. package/templates/event-invite/composition.json +12 -2
  45. package/templates/explainer-square/composition.json +1 -1
  46. package/templates/keynote-wide/composition.json +2 -2
  47. package/templates/kinetic-reel/composition.json +73 -0
  48. package/templates/kinetic-reel/composition.schema.json +9295 -0
  49. package/templates/kinetic-reel/template.json +17 -0
  50. package/templates/kinetic-reel/video.bundle.js +72 -0
  51. package/templates/kinetic-reel/video.tsx +283 -0
  52. package/templates/product-card/composition.json +7 -2
  53. package/templates/product-wide/composition.json +1 -1
  54. package/templates/quote-card/composition.json +6 -1
  55. package/templates/saas-launch/composition.json +70 -0
  56. package/templates/saas-launch/composition.schema.json +9295 -0
  57. package/templates/saas-launch/template.json +16 -0
  58. package/templates/saas-launch/video.bundle.js +72 -0
  59. package/templates/saas-launch/video.tsx +217 -0
  60. package/templates/sale-promo/composition.json +16 -1
  61. package/templates/showcase-tall/composition.json +4 -4
  62. package/templates/slideshow/composition.json +1 -1
  63. package/templates/social-reel/composition.json +19 -4
  64. package/templates/story-tall/composition.json +1 -1
  65. package/studio/assets/index-CzOvWv9w.css +0 -1
  66. package/studio/assets/index-J_fvKgng.js +0 -11
@@ -0,0 +1,283 @@
1
+ import {
2
+ AbsoluteFill,
3
+ AmbientGlow,
4
+ Audio,
5
+ Badge,
6
+ DeviceFrame,
7
+ GlassCard,
8
+ KineticText,
9
+ NumberTicker,
10
+ ProgressBar,
11
+ Sequence,
12
+ springValue,
13
+ useCurrentFrame,
14
+ useVideoConfig,
15
+ } from '@ove/react';
16
+
17
+ export const config = {
18
+ id: 'kinetic-reel',
19
+ name: 'Viral Motion Graphics Reel (9:16)',
20
+ width: 1080,
21
+ height: 1920,
22
+ fps: 30,
23
+ durationInFrames: 180, // 6.0 seconds
24
+ background: '#070a12',
25
+ props: {
26
+ kicker: 'CLAUDE MOTION GRAPHICS',
27
+ headline: 'Stop Making Boring Videos',
28
+ subtitle: 'Code-driven motion graphics with real spring physics, glassmorphism, and instant rendering.',
29
+ metric: 10,
30
+ metricUnit: 'x',
31
+ metricLabel: 'Higher Audience Retention',
32
+ codeSnippet: 'const reel = await ove.render();',
33
+ ctaText: 'Start Building in React',
34
+ handle: '@openvideo.dev',
35
+ },
36
+ };
37
+
38
+ export default function KineticReel({
39
+ kicker,
40
+ headline,
41
+ subtitle,
42
+ metric,
43
+ metricUnit,
44
+ metricLabel,
45
+ codeSnippet,
46
+ ctaText,
47
+ handle,
48
+ }: typeof config.props) {
49
+ const frame = useCurrentFrame();
50
+ const { fps } = useVideoConfig();
51
+
52
+ // Subtle continuous camera drift so the video is never static
53
+ const driftZoom = 1.0 + (frame / 180) * 0.05;
54
+
55
+ return (
56
+ <AbsoluteFill
57
+ style={{
58
+ color: '#f8fafc',
59
+ fontFamily: 'Inter, system-ui, -apple-system, sans-serif',
60
+ overflow: 'hidden',
61
+ transform: `scale(${driftZoom.toFixed(4)})`,
62
+ transformOrigin: 'center center',
63
+ }}
64
+ >
65
+ {/* 1. Atmospheric Ambient Lighting: Neon Violet & Cyan Glow */}
66
+ <AmbientGlow
67
+ blur={120}
68
+ orbs={[
69
+ { x: '25%', y: '15%', size: 650, color: '#6366f1', opacity: 0.32, speed: 0.02 },
70
+ { x: '80%', y: '50%', size: 700, color: '#ec4899', opacity: 0.22, speed: 0.025 },
71
+ { x: '40%', y: '85%', size: 750, color: '#06b6d4', opacity: 0.28, speed: 0.018 },
72
+ ]}
73
+ />
74
+
75
+ {/* 2. Sleek Modern Dot-Grid Texture */}
76
+ <div
77
+ style={{
78
+ position: 'absolute',
79
+ inset: 0,
80
+ backgroundImage: 'radial-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 1px)',
81
+ backgroundSize: '48px 48px',
82
+ opacity: 0.6,
83
+ pointerEvents: 'none',
84
+ }}
85
+ />
86
+
87
+ {/* SCENE 1: High-Impact Hook (Frames 0 to 65) */}
88
+ <Sequence from={0} durationInFrames={65}>
89
+ <Audio src="sfx:whoosh" volume={0.65} />
90
+ <AbsoluteFill
91
+ style={{
92
+ display: 'flex',
93
+ flexDirection: 'column',
94
+ justifyContent: 'center',
95
+ alignItems: 'center',
96
+ padding: '0 72px',
97
+ gap: 36,
98
+ textAlign: 'center',
99
+ }}
100
+ >
101
+ <Badge dotColor="#38bdf8" delay={4}>
102
+ {kicker}
103
+ </Badge>
104
+
105
+ <h1
106
+ style={{
107
+ fontSize: 104,
108
+ fontWeight: 900,
109
+ letterSpacing: '-0.04em',
110
+ lineHeight: 1.05,
111
+ margin: 0,
112
+ }}
113
+ >
114
+ <KineticText text={headline} delay={8} staggerDelay={3} preset="bouncy" />
115
+ </h1>
116
+
117
+ <p
118
+ style={{
119
+ fontSize: 32,
120
+ color: '#94a3b8',
121
+ lineHeight: 1.5,
122
+ margin: 0,
123
+ maxWidth: 820,
124
+ opacity: springValue({ frame, fps, delay: 24, from: 0, to: 1, preset: 'smooth' }),
125
+ transform: `translateY(${(1 - springValue({ frame, fps, delay: 24, from: 0, to: 1, preset: 'smooth' })) * 30}px)`,
126
+ }}
127
+ >
128
+ {subtitle}
129
+ </p>
130
+ </AbsoluteFill>
131
+ </Sequence>
132
+
133
+ {/* SCENE 2: Bento Metrics & Code (Frames 65 to 125) */}
134
+ <Sequence from={65} durationInFrames={60}>
135
+ <Audio src="sfx:pop" volume={0.6} />
136
+ <AbsoluteFill
137
+ style={{
138
+ display: 'flex',
139
+ flexDirection: 'column',
140
+ justifyContent: 'center',
141
+ alignItems: 'center',
142
+ padding: '0 64px',
143
+ gap: 32,
144
+ }}
145
+ >
146
+ <Badge dotColor="#10b981" delay={4}>
147
+ PERFORMANCE & ARCHITECTURE
148
+ </Badge>
149
+
150
+ {/* Metric Bento Card */}
151
+ <GlassCard
152
+ delay={6}
153
+ preset="bouncy"
154
+ style={{
155
+ width: '100%',
156
+ padding: 48,
157
+ display: 'flex',
158
+ flexDirection: 'column',
159
+ gap: 16,
160
+ }}
161
+ >
162
+ <span style={{ fontSize: 20, color: '#94a3b8', fontWeight: 600, letterSpacing: '0.04em' }}>
163
+ ENGAGEMENT SPIKE
164
+ </span>
165
+ <div style={{ fontSize: 130, fontWeight: 900, color: '#38bdf8', letterSpacing: '-0.04em', lineHeight: 1 }}>
166
+ <NumberTicker value={metric} decimals={0} suffix={metricUnit} delay={10} preset="bouncy" />
167
+ </div>
168
+ <span style={{ fontSize: 28, color: '#e2e8f0', fontWeight: 700 }}>
169
+ {metricLabel}
170
+ </span>
171
+ <ProgressBar value={0.92} color="#38bdf8" delay={14} height={10} />
172
+ </GlassCard>
173
+
174
+ {/* Code Bento Card */}
175
+ <GlassCard
176
+ delay={14}
177
+ preset="snappy"
178
+ style={{
179
+ width: '100%',
180
+ padding: 36,
181
+ display: 'flex',
182
+ flexDirection: 'column',
183
+ gap: 16,
184
+ background: 'rgba(15, 23, 42, 0.65)',
185
+ }}
186
+ >
187
+ <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
188
+ <span style={{ width: 12, height: 12, borderRadius: '50%', background: '#ef4444' }} />
189
+ <span style={{ width: 12, height: 12, borderRadius: '50%', background: '#f59e0b' }} />
190
+ <span style={{ width: 12, height: 12, borderRadius: '50%', background: '#10b981' }} />
191
+ <span style={{ fontSize: 16, color: '#64748b', marginLeft: 8, fontFamily: 'monospace' }}>
192
+ video.tsx
193
+ </span>
194
+ </div>
195
+ <div
196
+ style={{
197
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
198
+ fontSize: 26,
199
+ color: '#38bdf8',
200
+ background: 'rgba(0, 0, 0, 0.4)',
201
+ padding: '20px 24px',
202
+ borderRadius: 12,
203
+ border: '1px solid rgba(255, 255, 255, 0.08)',
204
+ }}
205
+ >
206
+ <code>{codeSnippet}</code>
207
+ </div>
208
+ </GlassCard>
209
+ </AbsoluteFill>
210
+ </Sequence>
211
+
212
+ {/* SCENE 3: Device Frame & Final Punchy CTA (Frames 125 to 180) */}
213
+ <Sequence from={125} durationInFrames={55}>
214
+ <Audio src="sfx:ding" volume={0.65} />
215
+ <AbsoluteFill
216
+ style={{
217
+ display: 'flex',
218
+ flexDirection: 'column',
219
+ justifyContent: 'center',
220
+ alignItems: 'center',
221
+ padding: '0 64px',
222
+ gap: 40,
223
+ textAlign: 'center',
224
+ }}
225
+ >
226
+ <DeviceFrame url="openvideo.dev/reels" delay={4} style={{ width: '100%', height: 480 }}>
227
+ <div
228
+ style={{
229
+ width: '100%',
230
+ height: '100%',
231
+ display: 'flex',
232
+ flexDirection: 'column',
233
+ alignItems: 'center',
234
+ justifyContent: 'center',
235
+ gap: 20,
236
+ background: 'linear-gradient(180deg, #090e1a 0%, #030712 100%)',
237
+ padding: 32,
238
+ }}
239
+ >
240
+ <Badge dotColor="#a855f7">FRAME-ACCURATE</Badge>
241
+ <div style={{ fontSize: 44, fontWeight: 800, letterSpacing: '-0.03em' }}>
242
+ Build Viral Reels With Code
243
+ </div>
244
+ <div style={{ fontSize: 22, color: '#94a3b8' }}>
245
+ No After Effects. Pure React.
246
+ </div>
247
+ </div>
248
+ </DeviceFrame>
249
+
250
+ <div
251
+ style={{
252
+ display: 'flex',
253
+ flexDirection: 'column',
254
+ alignItems: 'center',
255
+ gap: 16,
256
+ opacity: springValue({ frame, fps, delay: 18, from: 0, to: 1, preset: 'bouncy' }),
257
+ transform: `scale(${springValue({ frame, fps, delay: 18, from: 0.85, to: 1, preset: 'bouncy' }).toFixed(3)})`,
258
+ }}
259
+ >
260
+ <div
261
+ style={{
262
+ background: 'linear-gradient(135deg, #38bdf8 0%, #818cf8 100%)',
263
+ color: '#04111d',
264
+ padding: '24px 64px',
265
+ borderRadius: 9999,
266
+ fontSize: 32,
267
+ fontWeight: 800,
268
+ boxShadow: '0 20px 40px rgba(56, 189, 248, 0.4)',
269
+ letterSpacing: '-0.02em',
270
+ }}
271
+ >
272
+ {ctaText}
273
+ </div>
274
+ <span style={{ fontSize: 24, color: '#94a3b8', fontWeight: 600 }}>
275
+ {handle}
276
+ </span>
277
+ </div>
278
+ </AbsoluteFill>
279
+ </Sequence>
280
+ </AbsoluteFill>
281
+ );
282
+ }
283
+
@@ -29,6 +29,11 @@
29
29
  "name": "Product",
30
30
  "startFrame": 0,
31
31
  "durationFrames": 240,
32
+ "camera": {
33
+ "animations": [
34
+ { "property": "zoom", "keyframes": [{ "frame": 0, "value": 1 }, { "frame": 240, "value": 1.08, "easing": "drift" }] }
35
+ ]
36
+ },
32
37
  "transitionIn": { "type": "fade", "durationFrames": 10 },
33
38
  "transitionOut": { "type": "fade", "durationFrames": 10 },
34
39
  "layers": [
@@ -182,9 +187,9 @@
182
187
  "id": "mark",
183
188
  "type": "text",
184
189
  "content": "OVE",
185
- "x": 990,
190
+ "x": 915,
186
191
  "y": 954,
187
- "fontSize": 26,
192
+ "fontSize": 30,
188
193
  "fontWeight": 700,
189
194
  "letterSpacing": 6,
190
195
  "textAlign": "right",
@@ -1059,7 +1059,7 @@
1059
1059
  "id": "label-{{index}}",
1060
1060
  "type": "text",
1061
1061
  "content": "{{it.label}}",
1062
- "fontSize": "{{round(min(canvas.width, canvas.height) * 0.046)}}",
1062
+ "fontSize": "{{round(min(canvas.width, canvas.height) * 0.05)}}",
1063
1063
  "color": "{{text}}",
1064
1064
  "fontWeight": 700,
1065
1065
  "maxWidth": "{{canvas.width > canvas.height ? round(canvas.width * 0.24) : round(canvas.width * 0.6)}}",
@@ -28,6 +28,11 @@
28
28
  "name": "Quote",
29
29
  "startFrame": 0,
30
30
  "durationFrames": 270,
31
+ "camera": {
32
+ "animations": [
33
+ { "property": "zoom", "keyframes": [{ "frame": 0, "value": 1 }, { "frame": 270, "value": 1.08, "easing": "drift" }] }
34
+ ]
35
+ },
31
36
  "transitionIn": { "type": "fade", "durationFrames": 12 },
32
37
  "transitionOut": { "type": "fade", "durationFrames": 12 },
33
38
  "layers": [
@@ -50,7 +55,7 @@
50
55
  "content": "“",
51
56
  "x": 92,
52
57
  "y": 52,
53
- "fontSize": 300,
58
+ "fontSize": 270,
54
59
  "fontWeight": 800,
55
60
  "lineHeight": 1,
56
61
  "color": "{{accent}}",
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "./composition.schema.json",
3
+ "version": "1.0",
4
+ "id": "saas-launch",
5
+ "name": "Modern SaaS Launch (React)",
6
+ "width": 1920,
7
+ "height": 1080,
8
+ "fps": 30,
9
+ "durationFrames": 180,
10
+ "background": "#080c14",
11
+ "scenes": [
12
+ {
13
+ "id": "main",
14
+ "name": "Main",
15
+ "startFrame": 0,
16
+ "durationFrames": 180,
17
+ "layers": [
18
+ {
19
+ "id": "react",
20
+ "type": "react",
21
+ "src": "video.bundle.js",
22
+ "width": 1920,
23
+ "height": 1080,
24
+ "durationInFrames": 180,
25
+ "props": {
26
+ "badge": "AI ENGINE 2.0",
27
+ "title": "Design Videos in React",
28
+ "subtitle": "Frame-accurate motion graphics, spring physics, and headless render speed.",
29
+ "metric": 10,
30
+ "metricLabel": "Faster Video Rendering",
31
+ "url": "openvideo.dev/engine"
32
+ }
33
+ },
34
+ {
35
+ "id": "audio-1",
36
+ "type": "audio",
37
+ "startFrame": 0,
38
+ "endFrame": 75,
39
+ "src": "sfx:whoosh",
40
+ "trimStart": 0,
41
+ "volume": 0.6,
42
+ "playbackRate": 1,
43
+ "loop": false
44
+ },
45
+ {
46
+ "id": "audio-2",
47
+ "type": "audio",
48
+ "startFrame": 75,
49
+ "endFrame": 135,
50
+ "src": "sfx:pop",
51
+ "trimStart": 0,
52
+ "volume": 0.5,
53
+ "playbackRate": 1,
54
+ "loop": false
55
+ },
56
+ {
57
+ "id": "audio-3",
58
+ "type": "audio",
59
+ "startFrame": 135,
60
+ "endFrame": 180,
61
+ "src": "sfx:ding",
62
+ "trimStart": 0,
63
+ "volume": 0.5,
64
+ "playbackRate": 1,
65
+ "loop": false
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ }