motionrender 0.2.1 → 0.2.3

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 (69) hide show
  1. package/dist/cli.js +2872 -582
  2. package/dist/index.js +270 -43
  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/index.d.ts +2 -2
  24. package/dist/types/packages/core/src/review.d.ts +24 -0
  25. package/dist/types/packages/ffmpeg/src/auto-install.d.ts +12 -0
  26. package/dist/types/packages/ffmpeg/src/index.d.ts +2 -0
  27. package/dist/types/packages/jobs/src/queue.d.ts +2 -2
  28. package/dist/types/packages/jobs/src/redis.d.ts +2 -2
  29. package/dist/types/packages/react/src/components.d.ts +166 -0
  30. package/dist/types/packages/react/src/index.d.ts +54 -2
  31. package/dist/types/packages/react/src/springs.d.ts +25 -0
  32. package/dist/types/packages/renderer/src/index.d.ts +3 -0
  33. package/dist/types/packages/schema/src/captions.d.ts +2 -0
  34. package/dist/types/packages/schema/src/index.d.ts +66 -66
  35. package/dist/types/scripts/eval-briefs.d.ts +67 -0
  36. package/package.json +1 -1
  37. package/skills/ove/SKILL.md +40 -2
  38. package/skills/ove-agent/SKILL.md +144 -0
  39. package/skills/ove-code-video/SKILL.md +17 -9
  40. package/skills/ove-motion-graphics/SKILL.md +113 -0
  41. package/skills/ove-react-video/SKILL.md +212 -0
  42. package/skills/ove-remotion/SKILL.md +122 -0
  43. package/studio/assets/index-DmZj9wTZ.css +1 -0
  44. package/studio/assets/index-n3DJI_GV.js +10 -0
  45. package/studio/index.html +2 -2
  46. package/templates/case-study/composition.json +25 -10
  47. package/templates/event-invite/composition.json +12 -2
  48. package/templates/explainer-square/composition.json +1 -1
  49. package/templates/keynote-wide/composition.json +2 -2
  50. package/templates/kinetic-reel/composition.json +73 -0
  51. package/templates/kinetic-reel/composition.schema.json +9295 -0
  52. package/templates/kinetic-reel/template.json +17 -0
  53. package/templates/kinetic-reel/video.bundle.js +72 -0
  54. package/templates/kinetic-reel/video.tsx +283 -0
  55. package/templates/product-card/composition.json +7 -2
  56. package/templates/product-wide/composition.json +1 -1
  57. package/templates/quote-card/composition.json +6 -1
  58. package/templates/saas-launch/composition.json +70 -0
  59. package/templates/saas-launch/composition.schema.json +9295 -0
  60. package/templates/saas-launch/template.json +16 -0
  61. package/templates/saas-launch/video.bundle.js +72 -0
  62. package/templates/saas-launch/video.tsx +217 -0
  63. package/templates/sale-promo/composition.json +16 -1
  64. package/templates/showcase-tall/composition.json +4 -4
  65. package/templates/slideshow/composition.json +1 -1
  66. package/templates/social-reel/composition.json +19 -4
  67. package/templates/story-tall/composition.json +1 -1
  68. package/studio/assets/index-CzOvWv9w.css +0 -1
  69. package/studio/assets/index-J_fvKgng.js +0 -11
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: ove-remotion
3
+ description: Run and build Remotion compositions directly with Open Video Engine. Use when migrating from Remotion, adapting Claude video skills, or building video components with Remotion compatibility.
4
+ ---
5
+
6
+ # Remotion Compatibility in Open Video Engine
7
+
8
+ Open Video Engine natively supports Remotion video syntax, allowing you to run, build, and render compositions created for Remotion or Claude Remotion skills without changing imports or rewriting code.
9
+
10
+ ---
11
+
12
+ ## 1. Zero-Config Portability
13
+
14
+ You can import directly from `'remotion'`, `'@remotion/core'`, or `'@ove/react'`:
15
+
16
+ ```tsx
17
+ import {
18
+ AbsoluteFill,
19
+ Sequence,
20
+ Series,
21
+ interpolate,
22
+ spring,
23
+ useCurrentFrame,
24
+ useVideoConfig,
25
+ Easing,
26
+ Loop,
27
+ Freeze,
28
+ staticFile,
29
+ Audio,
30
+ Video,
31
+ Img,
32
+ Composition
33
+ } from 'remotion';
34
+ ```
35
+
36
+ Open Video Engine automatically aliases `remotion`, `@remotion/core`, and `@remotion/media` to `@ove/react` during `ove build` and `ove render`.
37
+
38
+ ---
39
+
40
+ ## 2. Supported Patterns
41
+
42
+ ### Pattern A: Modern Open Video Engine Export
43
+ ```tsx
44
+ export const config = {
45
+ id: 'my-video',
46
+ width: 1920,
47
+ height: 1080,
48
+ fps: 30,
49
+ durationInFrames: 150,
50
+ };
51
+
52
+ export default function MyVideo() {
53
+ const frame = useCurrentFrame();
54
+ return <AbsoluteFill style={{ background: '#000', color: '#fff' }}>Hello</AbsoluteFill>;
55
+ }
56
+ ```
57
+
58
+ ### Pattern B: Remotion Root & Composition
59
+ ```tsx
60
+ import { Composition } from 'remotion';
61
+
62
+ export const RemotionRoot = () => {
63
+ return (
64
+ <Composition
65
+ id="MyVideo"
66
+ component={MyVideo}
67
+ durationInFrames={150}
68
+ fps={30}
69
+ width={1920}
70
+ height={1080}
71
+ />
72
+ );
73
+ };
74
+
75
+ export const MyVideo = () => {
76
+ return <AbsoluteFill style={{ background: '#0a0a0a', color: '#fff' }}>Remotion on OVE</AbsoluteFill>;
77
+ };
78
+ ```
79
+
80
+ Both styles work out of the box with `ove render`, `ove build`, and `ove review`.
81
+
82
+ ---
83
+
84
+ ## 3. Spring Physics & Animations
85
+
86
+ OVE supports both flat options and Remotion's nested `config` object:
87
+
88
+ ```tsx
89
+ // Remotion-style spring with nested config:
90
+ const scale = spring({
91
+ frame,
92
+ fps,
93
+ config: {
94
+ damping: 12,
95
+ stiffness: 120,
96
+ mass: 0.8,
97
+ },
98
+ from: 0,
99
+ to: 1,
100
+ });
101
+
102
+ // Or using @ove/react presets:
103
+ import { springValue } from '@ove/react';
104
+
105
+ const opacity = springValue({ frame, fps, delay: 10, preset: 'snappy' });
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 4. Commands
111
+
112
+ - **Preview still frame**:
113
+ `ove review video.tsx --output preview.png`
114
+
115
+ - **Build to bundled JSON composition**:
116
+ `ove build video.tsx`
117
+
118
+ - **Render directly to MP4**:
119
+ `ove render video.tsx --output out.mp4`
120
+
121
+ - **Launch autonomous video AI agent**:
122
+ `ove agent --prompt "Create a 9:16 viral motion graphic reel for a developer tool"`
@@ -0,0 +1 @@
1
+ :root{--bg: #090a0f;--surface: #11131c;--surface-2: #161926;--hover: #1e2233;--border: #23283b;--border-strong: #38405d;--text: #f3f5f9;--muted: #9ba3be;--faint: #656d8a;--inverse: #090a0f;--indigo: #6366f1;--blue: #3b82f6;--cyan: #06b6d4;--green: #10b981;--red: #ef4444;--amber: #f59e0b;--purple: #a855f7;--brand-gradient: linear-gradient(135deg, #6366f1 0%, #3b82f6 50%, #06b6d4 100%);--brand-glow: rgba(99, 102, 241, .28);--radius-sm: 6px;--radius: 10px;--radius-lg: 16px;--font: "Geist", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--mono: "Geist Mono", "SF Mono", Consolas, Menlo, monospace;color-scheme:dark}:root[data-theme=light]{--bg: #f8fafc;--surface: #ffffff;--surface-2: #f1f5f9;--hover: #e2e8f0;--border: #e2e8f0;--border-strong: #cbd5e1;--text: #0f172a;--muted: #64748b;--faint: #94a3b8;--inverse: #ffffff;--blue: #2563eb;--green: #059669;--red: #dc2626;--amber: #d97706;--purple: #9333ea;--brand-gradient: linear-gradient(135deg, #4f46e5 0%, #2563eb 50%, #0891b2 100%);--brand-glow: rgba(79, 70, 229, .16);color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 var(--font);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:var(--text);text-decoration:none}h1,h2,h3,h4{margin:0;letter-spacing:-.025em;font-weight:600;color:var(--text)}h1{font-size:28px;line-height:1.25}h2{font-size:19px;line-height:1.35}h3{font-size:15px}::selection{background:color-mix(in srgb,var(--indigo) 35%,transparent)}.shell{height:100%;display:flex;flex-direction:column}.topbar{flex:none;display:flex;align-items:center;gap:12px;height:60px;padding:0 24px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--bg) 85%,transparent);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);position:sticky;top:0;z-index:30}.brand,.navtabs a,.topbar .btn{white-space:nowrap}.brand{display:flex;align-items:center;gap:10px;font-weight:600;letter-spacing:-.02em;font-size:15px;margin-right:14px}.brand-symbol{display:flex;align-items:center;justify-content:center;filter:drop-shadow(0 0 10px var(--brand-glow))}.brand-title{display:flex;align-items:center;gap:6px}.brand-badge{font-size:10.5px;font-weight:700;letter-spacing:.06em;padding:1px 6px;border-radius:4px;background:var(--brand-gradient);color:#fff;text-transform:uppercase}.navtabs{display:flex;gap:4px;height:100%}.navtabs a{display:flex;align-items:center;gap:6px;padding:0 14px;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px;font-size:13.5px;font-weight:500;transition:color .15s,border-color .15s}.navtabs a:hover{color:var(--text)}.navtabs a.on{color:var(--text);border-bottom-color:var(--indigo)}.grow{flex:1}.busy{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:13px;max-width:340px;margin-right:10px;background:var(--surface);border:1px solid var(--border);padding:5px 12px;border-radius:999px}.busy span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main{flex:1;min-height:0;overflow:auto}.main.fixed{overflow:hidden}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:inherit;font-weight:500;cursor:pointer;border-radius:var(--radius-sm);border:1px solid transparent;white-space:nowrap;transition:all .15s ease;user-select:none}.btn:active:not(:disabled){transform:scale(.98)}.btn.md{height:36px;padding:0 14px;font-size:13.5px}.btn.sm{height:30px;padding:0 10px;font-size:12.5px}.btn.lg{height:42px;padding:0 20px;font-size:14.5px;border-radius:var(--radius)}.btn.primary{background:var(--brand-gradient);color:#fff;box-shadow:0 2px 10px var(--brand-glow)}.btn.primary:hover:not(:disabled){opacity:.94;box-shadow:0 4px 16px var(--brand-glow)}.btn.secondary{background:var(--surface);color:var(--text);border-color:var(--border)}.btn.secondary:hover:not(:disabled){background:var(--hover);border-color:var(--border-strong)}.btn.ghost{background:transparent;color:var(--muted)}.btn.ghost:hover:not(:disabled){background:var(--hover);color:var(--text)}.btn.danger{background:var(--surface);color:var(--red);border-color:var(--border)}.btn.danger:hover:not(:disabled){background:color-mix(in srgb,var(--red) 12%,var(--surface));border-color:var(--red)}.btn.glow{background:var(--surface);color:var(--text);border:1px solid color-mix(in srgb,var(--indigo) 40%,var(--border));box-shadow:0 0 14px var(--brand-glow)}.btn.glow:hover:not(:disabled){background:var(--hover);border-color:var(--indigo)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible,.input:focus-visible,.tile:focus-visible{outline:2px solid var(--indigo);outline-offset:2px}.btn-icon{display:inline-flex;align-items:center;justify-content:center}.input,textarea.input,select.input{width:100%;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 12px;font:inherit;transition:border-color .15s,box-shadow .15s}.input:hover{border-color:var(--border-strong)}.input:focus{border-color:var(--indigo);box-shadow:0 0 0 3px color-mix(in srgb,var(--indigo) 20%,transparent);outline:none}textarea.input{resize:vertical;min-height:84px;line-height:1.55}input[type=color].input{padding:3px;height:36px;width:64px;cursor:pointer;border-radius:6px}input[type=range]{accent-color:var(--indigo)}.field{display:block;margin-bottom:20px}.field .label{display:block;font-size:13px;font-weight:500;margin-bottom:6px;color:var(--text)}.field .hint{display:block;color:var(--muted);font-size:12px;margin-top:6px}.check{display:flex;align-items:center;gap:10px;margin-bottom:12px;cursor:pointer;font-size:13.5px;color:var(--text);user-select:none}.check input{width:16px;height:16px;accent-color:var(--indigo);cursor:pointer}.spinner{width:14px;height:14px;border:2px solid var(--border-strong);border-top-color:var(--indigo);border-radius:50%;animation:spin .7s linear infinite;flex:none;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.badge{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 9px;border-radius:999px;font-size:12px;font-weight:500;border:1px solid var(--border);color:var(--muted);background:var(--surface)}.badge-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.badge.blue{color:var(--blue);border-color:color-mix(in srgb,var(--blue) 35%,transparent);background:color-mix(in srgb,var(--blue) 8%,var(--surface))}.badge.green{color:var(--green);border-color:color-mix(in srgb,var(--green) 35%,transparent);background:color-mix(in srgb,var(--green) 8%,var(--surface))}.badge.amber{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 35%,transparent);background:color-mix(in srgb,var(--amber) 8%,var(--surface))}.badge.red{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,transparent);background:color-mix(in srgb,var(--red) 8%,var(--surface))}.badge.purple{color:var(--purple);border-color:color-mix(in srgb,var(--purple) 35%,transparent);background:color-mix(in srgb,var(--purple) 8%,var(--surface))}.notice{border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;margin:16px 0;font-size:13.5px;color:var(--muted);background:var(--surface)}.notice-title{display:block;font-size:13.5px;margin-bottom:4px;color:var(--text)}.notice.error{color:var(--red);border-color:color-mix(in srgb,var(--red) 45%,transparent);background:color-mix(in srgb,var(--red) 8%,var(--bg))}.notice.warn{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,transparent);background:color-mix(in srgb,var(--amber) 8%,var(--bg))}.notice.success{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,transparent);background:color-mix(in srgb,var(--green) 8%,var(--bg))}.empty{text-align:center;border:1px dashed var(--border-strong);border-radius:var(--radius-lg);padding:64px 24px;color:var(--muted);background:color-mix(in srgb,var(--surface) 40%,transparent)}.empty-icon{margin-bottom:16px;color:var(--faint);display:flex;justify-content:center}.empty h3{color:var(--text);font-size:18px;margin-bottom:8px}.empty .btn{margin-top:18px}.skeleton{display:inline-block;background:linear-gradient(90deg,var(--surface) 0%,var(--hover) 50%,var(--surface) 100%);background-size:200% 100%;animation:shimmer 1.5s infinite}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.page{max-width:1200px;margin:0 auto;padding:40px 24px 80px}.page.narrow{max-width:720px}.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:30px}.page-actions{display:flex;gap:10px;align-items:center}.sub{color:var(--muted);margin:6px 0 0;font-size:14px}.toolbar{display:flex;gap:10px;margin-bottom:22px}.toolbar .input{max-width:340px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:18px}.card{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);overflow:hidden;display:flex;flex-direction:column;transition:transform .2s ease,border-color .2s ease,box-shadow .2s ease}.card:hover{transform:translateY(-2px);border-color:var(--border-strong);box-shadow:0 12px 28px -10px #0006}.thumb{aspect-ratio:16 / 10;background:#000;display:flex;align-items:center;justify-content:center;cursor:pointer;border-bottom:1px solid var(--border);overflow:hidden;position:relative}.thumb img{width:100%;height:100%;object-fit:contain;display:block;transition:transform .25s ease}.thumb:hover img{transform:scale(1.02)}.thumb .ph{color:var(--faint);font-size:13px}.card-body{padding:14px 16px 8px}.card-body b{display:block;font-weight:600;font-size:14.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em}.meta{color:var(--muted);font-size:12.5px;margin-top:4px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}.card-foot{display:flex;gap:8px;padding:10px 14px 14px;margin-top:auto;border-top:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.section-title{margin:36px 0 16px;font-size:12.5px;font-weight:600;color:var(--faint);text-transform:uppercase;letter-spacing:.08em}.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:22px}.tile{text-align:left;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--text);padding:14px;cursor:pointer;font:inherit;transition:all .15s ease}.tile:hover{border-color:var(--border-strong);background:var(--hover)}.tile b{display:block;font-weight:600;font-size:14px}.tile span{color:var(--muted);font-size:12.5px;margin-top:2px;display:block}.tile.on{border-color:var(--indigo);background:color-mix(in srgb,var(--indigo) 10%,var(--surface));box-shadow:0 0 0 1px var(--indigo)}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 22px}.chip{border:1px solid var(--border);background:var(--surface);color:var(--muted);border-radius:999px;padding:5px 14px;font:inherit;font-size:12.5px;cursor:pointer;transition:all .12s ease}.chip:hover{color:var(--text);border-color:var(--border-strong);background:var(--hover)}.drop{border:1px dashed var(--border-strong);border-radius:var(--radius);padding:24px;text-align:center;color:var(--muted);background:var(--surface);transition:border-color .15s,background .15s}.drop.over{border-color:var(--indigo);background:color-mix(in srgb,var(--indigo) 8%,var(--surface));color:var(--text)}.drop a{color:var(--blue);cursor:pointer;text-decoration:underline;text-underline-offset:3px}.files{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.files span{border:1px solid var(--border);border-radius:6px;padding:4px 10px;font-size:12.5px;cursor:pointer;background:var(--surface-2);display:inline-flex;align-items:center;gap:6px;transition:border-color .12s,color .12s}.files span:hover{border-color:var(--red);color:var(--red)}.two{display:grid;grid-template-columns:1fr 1fr;gap:14px}details{margin:6px 0 22px}summary{cursor:pointer;color:var(--muted);padding:6px 0;font-weight:500;font-size:13.5px;user-select:none}summary:hover{color:var(--text)}details[open] summary{margin-bottom:16px}.center{max-width:560px;margin:80px auto;text-align:center;padding:0 24px}.center .spinner{width:32px;height:32px;border-width:3px;margin-bottom:24px}.log{text-align:left;background:#000;border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 14px;font:12px/1.6 var(--mono);color:var(--muted);max-height:200px;overflow:auto;white-space:pre-wrap;margin-top:16px}.swatches{display:flex;height:28px;border-radius:6px;overflow:hidden;margin-bottom:8px;border:1px solid var(--border)}.swatches i{flex:1}.kv{display:grid;grid-template-columns:180px 1fr;gap:6px 16px;padding:14px 0;border-bottom:1px solid var(--border)}.kv code{font:12.5px var(--mono);color:var(--muted);word-break:break-all}.pipeline-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:28px 24px;margin-top:24px;text-align:left;box-shadow:0 20px 40px -15px #0006}.pipeline-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px}.pipeline-step{display:flex;align-items:center;gap:14px;padding:12px 0;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.pipeline-step:last-child{border-bottom:0}.step-circle{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;border:1px solid var(--border);color:var(--muted);background:var(--surface-2)}.pipeline-step.active .step-circle{border-color:var(--indigo);background:var(--brand-gradient);color:#fff;box-shadow:0 0 12px var(--brand-glow)}.pipeline-step.done .step-circle{border-color:var(--green);background:var(--green);color:#fff}.step-content b{display:block;font-size:13.5px;color:var(--text)}.step-content small{color:var(--muted);font-size:12px}.editor{height:100%;display:grid;grid-template-columns:minmax(0,1fr) 420px}.stage{min-width:0;min-height:0;overflow:auto;padding:20px 24px;display:flex;flex-direction:column;gap:14px;background:color-mix(in srgb,var(--bg) 92%,#000)}.etop{display:flex;align-items:center;gap:10px}.etop .input.title{border-color:transparent;background:transparent;font-weight:600;font-size:16px;width:auto;min-width:240px;padding:5px 10px;border-radius:6px}.etop .input.title:hover{border-color:var(--border);background:var(--surface)}.etop .input.title:focus{border-color:var(--indigo);background:var(--surface)}.saved{color:var(--muted);font-size:13px}.screen{background:#000;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:flex;justify-content:center;align-items:center;min-height:220px;box-shadow:0 16px 36px -12px #0009}.screen .ove-player{margin:0 auto}.screen canvas{max-height:56vh;width:auto!important;max-width:100%;margin:0 auto}.xport{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--border);padding:8px 14px;border-radius:var(--radius)}.xport input[type=range]{flex:1}.xport .time{color:var(--muted);font:12.5px var(--mono);min-width:96px;text-align:right}.scenes{display:flex;gap:8px;overflow:auto;padding-bottom:2px}.scenes button{flex:none;display:flex;flex-direction:column;align-items:flex-start;gap:1px;border:1px solid var(--border);background:var(--surface);color:var(--text);padding:7px 14px;border-radius:8px;font:inherit;font-size:13px;cursor:pointer;transition:border-color .15s,background .15s}.scenes button:hover{border-color:var(--border-strong);background:var(--hover)}.scenes small{color:var(--muted);font-size:11.5px}.side{border-left:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;min-height:0}.tabs{display:flex;padding:0 12px;border-bottom:1px solid var(--border);flex:none;background:color-mix(in srgb,var(--bg) 50%,var(--surface))}.tabs button{background:none;border:0;border-bottom:2px solid transparent;margin-bottom:-1px;color:var(--muted);padding:14px 12px;font:inherit;font-size:13.5px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:color .15s}.tabs button:hover{color:var(--text)}.tabs button.on{color:var(--text);border-bottom-color:var(--indigo)}.pane{padding:22px;overflow:auto;flex:1;min-height:0}.pane h2{font-size:16px;margin-bottom:4px}.pane .sub{margin:0 0 20px;font-size:13px}.row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 0;border-top:1px solid var(--border)}.row small{display:block;color:var(--muted);font-size:12px}.row b{font-weight:500;font-size:13.5px}.themes{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-bottom:10px}.theme{text-align:left;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2);color:var(--text);padding:10px;font:inherit;cursor:pointer;transition:all .12s ease}.theme:hover:not(:disabled){border-color:var(--border-strong);background:var(--hover)}.theme:disabled{opacity:.45;cursor:not-allowed}.theme b{font-weight:500;font-size:13px}.result{margin-top:20px;padding:16px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-2)}.result video,.result img{width:100%;border:1px solid var(--border);border-radius:var(--radius-sm);background:#000;margin-top:10px}.toasts{position:fixed;bottom:24px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;gap:8px;z-index:50;align-items:center}.toast{background:var(--surface);color:var(--text);border:1px solid var(--border-strong);padding:10px 18px;border-radius:999px;font-size:13.5px;font-weight:500;box-shadow:0 12px 32px #00000073;max-width:80vw;display:flex;align-items:center;gap:8px;backdrop-filter:blur(12px)}.toast.error{background:var(--red);color:#fff;border-color:transparent}.toast.success{background:var(--green);color:#fff;border-color:transparent}.overlay{position:fixed;inset:0;background:#000000a6;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:40}.dialog{width:min(440px,92vw);background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:24px;box-shadow:0 24px 64px #0009}.dialog h3{margin-bottom:14px;font-size:17px;line-height:1.4}.dialog-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:22px}@media(max-width:640px){.brand .slash,.brand span:last-child,.theme .lbl{display:none}.navtabs a{padding:0 8px}.topbar{gap:6px;padding:0 12px}.page-head{flex-direction:column;align-items:flex-start}}@media(max-width:900px){.editor{grid-template-columns:1fr;height:auto}.side{border-left:0;border-top:1px solid var(--border)}.main.fixed{overflow:auto}.topbar{padding:0 14px}.busy{display:none}.two{grid-template-columns:1fr}.page{padding-top:24px}}.link{color:var(--blue);cursor:pointer}