@depths/waves 0.1.0 → 0.3.0
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/README.md +2139 -300
- package/dist/chunk-QP54QRAP.mjs +552 -0
- package/dist/chunk-YYS6AVTN.mjs +3346 -0
- package/dist/cli.js +3624 -250
- package/dist/cli.mjs +218 -55
- package/dist/index.d.mts +40 -12
- package/dist/index.d.ts +40 -12
- package/dist/index.js +3382 -178
- package/dist/index.mjs +3 -5
- package/dist/registry-C6H9G0df.d.mts +204 -0
- package/dist/registry-C6H9G0df.d.ts +204 -0
- package/dist/remotion/index.d.mts +8 -3
- package/dist/remotion/index.d.ts +8 -3
- package/dist/remotion/index.js +3102 -123
- package/dist/remotion/index.mjs +49 -11
- package/package.json +19 -19
- package/dist/chunk-TGAL5RQN.mjs +0 -404
- package/dist/chunk-WGQITADJ.mjs +0 -284
- package/dist/registry-hVIyqwS6.d.mts +0 -355
- package/dist/registry-hVIyqwS6.d.ts +0 -355
|
@@ -0,0 +1,3346 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
// src/utils/json-schema.ts
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
function zodSchemaToJsonSchema(schema) {
|
|
11
|
+
return z.toJSONSchema(schema);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/ir/schema.ts
|
|
15
|
+
import { z as z2 } from "zod";
|
|
16
|
+
var TimingSpecSchema = z2.object({
|
|
17
|
+
from: z2.number().int().min(0).describe("Start frame (0-indexed)"),
|
|
18
|
+
durationInFrames: z2.number().int().positive().describe("Duration in frames")
|
|
19
|
+
});
|
|
20
|
+
var AssetPathSchema = z2.string().refine(
|
|
21
|
+
(path) => path.startsWith("/") || path.startsWith("http://") || path.startsWith("https://"),
|
|
22
|
+
"Asset path must be absolute (starting with /) or a full URL"
|
|
23
|
+
).describe("Path to asset file, either absolute path or URL");
|
|
24
|
+
var BackgroundSpecSchema = z2.discriminatedUnion("type", [
|
|
25
|
+
z2.object({
|
|
26
|
+
type: z2.literal("color"),
|
|
27
|
+
value: z2.string().regex(/^#[0-9A-Fa-f]{6}$/, "Must be valid hex color")
|
|
28
|
+
}),
|
|
29
|
+
z2.object({
|
|
30
|
+
type: z2.literal("image"),
|
|
31
|
+
value: AssetPathSchema
|
|
32
|
+
}),
|
|
33
|
+
z2.object({
|
|
34
|
+
type: z2.literal("video"),
|
|
35
|
+
value: AssetPathSchema
|
|
36
|
+
})
|
|
37
|
+
]);
|
|
38
|
+
var VideoConfigSchema = z2.object({
|
|
39
|
+
id: z2.string().default("main"),
|
|
40
|
+
width: z2.number().int().min(360).max(7680),
|
|
41
|
+
height: z2.number().int().min(360).max(4320),
|
|
42
|
+
fps: z2.number().int().min(1).max(120).default(30),
|
|
43
|
+
durationInFrames: z2.number().int().positive()
|
|
44
|
+
});
|
|
45
|
+
var AudioSpecSchema = z2.object({
|
|
46
|
+
background: AssetPathSchema.optional(),
|
|
47
|
+
volume: z2.number().min(0).max(1).default(0.5)
|
|
48
|
+
}).optional();
|
|
49
|
+
var TransitionSpecSchema = z2.object({
|
|
50
|
+
type: z2.string().min(1),
|
|
51
|
+
durationInFrames: z2.number().int().positive(),
|
|
52
|
+
props: z2.record(z2.string(), z2.unknown()).optional()
|
|
53
|
+
});
|
|
54
|
+
var ComponentNodeSchema = z2.lazy(
|
|
55
|
+
() => z2.object({
|
|
56
|
+
id: z2.string().min(1).max(100).describe("Unique component instance ID"),
|
|
57
|
+
type: z2.string().min(1).describe("Registered component type identifier"),
|
|
58
|
+
timing: TimingSpecSchema.optional().describe("Optional timing (frames)"),
|
|
59
|
+
props: z2.record(z2.string(), z2.unknown()).optional().describe("Component props object"),
|
|
60
|
+
metadata: z2.record(z2.string(), z2.unknown()).optional().describe("Optional metadata"),
|
|
61
|
+
children: z2.array(ComponentNodeSchema).optional().describe("Nested children nodes")
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
var SegmentSchema = z2.object({
|
|
65
|
+
id: z2.string().min(1).max(100),
|
|
66
|
+
durationInFrames: z2.number().int().positive(),
|
|
67
|
+
root: ComponentNodeSchema,
|
|
68
|
+
transitionToNext: TransitionSpecSchema.optional()
|
|
69
|
+
});
|
|
70
|
+
var VideoIRv2Schema = z2.object({
|
|
71
|
+
version: z2.literal("2.0").describe("IR schema version"),
|
|
72
|
+
video: VideoConfigSchema,
|
|
73
|
+
audio: AudioSpecSchema,
|
|
74
|
+
segments: z2.array(SegmentSchema).min(1).optional(),
|
|
75
|
+
timeline: z2.array(ComponentNodeSchema).min(1).optional()
|
|
76
|
+
}).superRefine((v, ctx) => {
|
|
77
|
+
const hasSegments = Array.isArray(v.segments);
|
|
78
|
+
const hasTimeline = Array.isArray(v.timeline);
|
|
79
|
+
if (hasSegments === hasTimeline) {
|
|
80
|
+
ctx.addIssue({
|
|
81
|
+
code: z2.ZodIssueCode.custom,
|
|
82
|
+
message: 'Exactly one of "segments" or "timeline" must be provided',
|
|
83
|
+
path: []
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
var VideoIRv2AuthoringSchema = z2.object({
|
|
88
|
+
version: z2.literal("2.0").describe("IR schema version"),
|
|
89
|
+
video: VideoConfigSchema,
|
|
90
|
+
audio: AudioSpecSchema,
|
|
91
|
+
segments: z2.array(SegmentSchema).min(1),
|
|
92
|
+
timeline: z2.never().optional()
|
|
93
|
+
}).describe("Preferred authoring format: sequential segments with optional transitions");
|
|
94
|
+
var VideoIRSchema = VideoIRv2Schema;
|
|
95
|
+
|
|
96
|
+
// src/core/registry.ts
|
|
97
|
+
var ComponentRegistry = class {
|
|
98
|
+
components = /* @__PURE__ */ new Map();
|
|
99
|
+
register(registration) {
|
|
100
|
+
if (this.components.has(registration.type)) {
|
|
101
|
+
throw new Error(`Component type "${registration.type}" is already registered`);
|
|
102
|
+
}
|
|
103
|
+
this.components.set(registration.type, registration);
|
|
104
|
+
}
|
|
105
|
+
get(type) {
|
|
106
|
+
return this.components.get(type);
|
|
107
|
+
}
|
|
108
|
+
getTypes() {
|
|
109
|
+
return Array.from(this.components.keys());
|
|
110
|
+
}
|
|
111
|
+
getTypesForLLM(options) {
|
|
112
|
+
const includeInternal = options?.includeInternal ?? false;
|
|
113
|
+
const out = [];
|
|
114
|
+
for (const [type, reg] of this.components) {
|
|
115
|
+
if (!includeInternal && reg.metadata.internal) continue;
|
|
116
|
+
out.push(type);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
has(type) {
|
|
121
|
+
return this.components.has(type);
|
|
122
|
+
}
|
|
123
|
+
getJSONSchemaForLLM(options) {
|
|
124
|
+
const includeInternal = options?.includeInternal ?? false;
|
|
125
|
+
const schemas = {};
|
|
126
|
+
for (const [type, registration] of this.components) {
|
|
127
|
+
if (!includeInternal && registration.metadata.internal) continue;
|
|
128
|
+
schemas[type] = {
|
|
129
|
+
schema: zodSchemaToJsonSchema(registration.propsSchema),
|
|
130
|
+
metadata: registration.metadata
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return schemas;
|
|
134
|
+
}
|
|
135
|
+
validateProps(type, props) {
|
|
136
|
+
const registration = this.components.get(type);
|
|
137
|
+
if (!registration) {
|
|
138
|
+
throw new Error(`Unknown component type: ${type}`);
|
|
139
|
+
}
|
|
140
|
+
const result = registration.propsSchema.safeParse(props);
|
|
141
|
+
if (result.success) {
|
|
142
|
+
return { success: true, data: result.data };
|
|
143
|
+
}
|
|
144
|
+
return { success: false, error: result.error };
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var globalRegistry = new ComponentRegistry();
|
|
148
|
+
|
|
149
|
+
// src/components/primitives/Audio.tsx
|
|
150
|
+
import { Audio as RemotionAudio, interpolate, staticFile, useCurrentFrame } from "remotion";
|
|
151
|
+
import { z as z3 } from "zod";
|
|
152
|
+
|
|
153
|
+
// src/utils/assets.ts
|
|
154
|
+
function isRemoteAssetPath(assetPath) {
|
|
155
|
+
return assetPath.startsWith("http://") || assetPath.startsWith("https://");
|
|
156
|
+
}
|
|
157
|
+
function staticFileInputFromAssetPath(assetPath) {
|
|
158
|
+
if (isRemoteAssetPath(assetPath)) {
|
|
159
|
+
throw new Error("Remote asset paths must not be passed to staticFile()");
|
|
160
|
+
}
|
|
161
|
+
return assetPath.startsWith("/") ? assetPath.slice(1) : assetPath;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// src/components/primitives/Audio.tsx
|
|
165
|
+
import { jsx } from "react/jsx-runtime";
|
|
166
|
+
var AudioPropsSchema = z3.object({
|
|
167
|
+
src: z3.string(),
|
|
168
|
+
volume: z3.number().min(0).max(1).default(1),
|
|
169
|
+
startFrom: z3.number().int().min(0).default(0),
|
|
170
|
+
fadeIn: z3.number().int().min(0).default(0),
|
|
171
|
+
fadeOut: z3.number().int().min(0).default(0)
|
|
172
|
+
});
|
|
173
|
+
var Audio = ({
|
|
174
|
+
src,
|
|
175
|
+
volume,
|
|
176
|
+
startFrom,
|
|
177
|
+
fadeIn,
|
|
178
|
+
fadeOut,
|
|
179
|
+
__wavesDurationInFrames
|
|
180
|
+
}) => {
|
|
181
|
+
const frame = useCurrentFrame();
|
|
182
|
+
const durationInFrames = __wavesDurationInFrames ?? Number.POSITIVE_INFINITY;
|
|
183
|
+
const fadeInFactor = fadeIn > 0 ? interpolate(frame, [0, fadeIn], [0, 1], {
|
|
184
|
+
extrapolateLeft: "clamp",
|
|
185
|
+
extrapolateRight: "clamp"
|
|
186
|
+
}) : 1;
|
|
187
|
+
const fadeOutStart = durationInFrames - fadeOut;
|
|
188
|
+
const fadeOutFactor = fadeOut > 0 ? interpolate(frame, [fadeOutStart, durationInFrames], [1, 0], {
|
|
189
|
+
extrapolateLeft: "clamp",
|
|
190
|
+
extrapolateRight: "clamp"
|
|
191
|
+
}) : 1;
|
|
192
|
+
const resolvedSrc = isRemoteAssetPath(src) ? src : staticFile(staticFileInputFromAssetPath(src));
|
|
193
|
+
return /* @__PURE__ */ jsx(
|
|
194
|
+
RemotionAudio,
|
|
195
|
+
{
|
|
196
|
+
src: resolvedSrc,
|
|
197
|
+
trimBefore: startFrom,
|
|
198
|
+
volume: volume * fadeInFactor * fadeOutFactor
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
};
|
|
202
|
+
var AudioComponentMetadata = {
|
|
203
|
+
kind: "primitive",
|
|
204
|
+
category: "media",
|
|
205
|
+
description: "Plays an audio file with optional trimming and fade in/out",
|
|
206
|
+
llmGuidance: "Use for background music or sound effects. Prefer short clips for SFX. Use fadeIn/fadeOut (in frames) for smoother audio starts/ends."
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// src/components/primitives/Box.tsx
|
|
210
|
+
import React from "react";
|
|
211
|
+
import { z as z4 } from "zod";
|
|
212
|
+
|
|
213
|
+
// src/remotion/Fill.tsx
|
|
214
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
215
|
+
var Fill = ({ style, children }) => {
|
|
216
|
+
return /* @__PURE__ */ jsx2(
|
|
217
|
+
"div",
|
|
218
|
+
{
|
|
219
|
+
style: {
|
|
220
|
+
width: "100%",
|
|
221
|
+
height: "100%",
|
|
222
|
+
position: "relative",
|
|
223
|
+
boxSizing: "border-box",
|
|
224
|
+
...style ?? {}
|
|
225
|
+
},
|
|
226
|
+
children
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// src/components/primitives/Box.tsx
|
|
232
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
233
|
+
var BoxPropsSchema = z4.object({
|
|
234
|
+
width: z4.number().positive().optional().describe("Width in pixels (optional)"),
|
|
235
|
+
height: z4.number().positive().optional().describe("Height in pixels (optional)"),
|
|
236
|
+
padding: z4.number().min(0).default(0).describe("Padding in pixels"),
|
|
237
|
+
backgroundColor: z4.string().optional().describe("CSS color (e.g. #RRGGBB, rgba())"),
|
|
238
|
+
borderRadius: z4.number().min(0).default(0).describe("Border radius in pixels"),
|
|
239
|
+
opacity: z4.number().min(0).max(1).default(1).describe("Opacity 0..1")
|
|
240
|
+
});
|
|
241
|
+
var Box = ({ width, height, padding, backgroundColor, borderRadius, opacity, children }) => {
|
|
242
|
+
const layers = React.Children.toArray(children);
|
|
243
|
+
return /* @__PURE__ */ jsx3(
|
|
244
|
+
Fill,
|
|
245
|
+
{
|
|
246
|
+
style: {
|
|
247
|
+
width,
|
|
248
|
+
height,
|
|
249
|
+
padding,
|
|
250
|
+
backgroundColor,
|
|
251
|
+
borderRadius,
|
|
252
|
+
opacity
|
|
253
|
+
},
|
|
254
|
+
children: layers.map((child, i) => /* @__PURE__ */ jsx3("div", { style: { position: "absolute", inset: 0 }, children: child }, i))
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
};
|
|
258
|
+
var BoxComponentMetadata = {
|
|
259
|
+
kind: "primitive",
|
|
260
|
+
category: "layout",
|
|
261
|
+
acceptsChildren: true,
|
|
262
|
+
description: "Flow container for layout and backgrounds (layout-safe)",
|
|
263
|
+
llmGuidance: "Use Box as a container inside Grid/Stack. Box participates in layout flow. For x/y positioning, use Frame."
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// src/components/primitives/Frame.tsx
|
|
267
|
+
import React2 from "react";
|
|
268
|
+
import { z as z5 } from "zod";
|
|
269
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
270
|
+
var FramePropsSchema = z5.object({
|
|
271
|
+
x: z5.number().default(0).describe("Left offset in pixels"),
|
|
272
|
+
y: z5.number().default(0).describe("Top offset in pixels"),
|
|
273
|
+
width: z5.number().positive().optional().describe("Width in pixels (optional)"),
|
|
274
|
+
height: z5.number().positive().optional().describe("Height in pixels (optional)"),
|
|
275
|
+
padding: z5.number().min(0).default(0).describe("Padding in pixels"),
|
|
276
|
+
backgroundColor: z5.string().optional().describe("CSS color (e.g. #RRGGBB, rgba())"),
|
|
277
|
+
borderRadius: z5.number().min(0).default(0).describe("Border radius in pixels"),
|
|
278
|
+
opacity: z5.number().min(0).max(1).default(1).describe("Opacity 0..1")
|
|
279
|
+
});
|
|
280
|
+
var Frame = ({
|
|
281
|
+
x,
|
|
282
|
+
y,
|
|
283
|
+
width,
|
|
284
|
+
height,
|
|
285
|
+
padding,
|
|
286
|
+
backgroundColor,
|
|
287
|
+
borderRadius,
|
|
288
|
+
opacity,
|
|
289
|
+
children
|
|
290
|
+
}) => {
|
|
291
|
+
const layers = React2.Children.toArray(children);
|
|
292
|
+
return /* @__PURE__ */ jsx4(
|
|
293
|
+
"div",
|
|
294
|
+
{
|
|
295
|
+
style: {
|
|
296
|
+
position: "absolute",
|
|
297
|
+
left: x,
|
|
298
|
+
top: y,
|
|
299
|
+
width,
|
|
300
|
+
height,
|
|
301
|
+
padding,
|
|
302
|
+
backgroundColor,
|
|
303
|
+
borderRadius,
|
|
304
|
+
opacity,
|
|
305
|
+
boxSizing: "border-box"
|
|
306
|
+
},
|
|
307
|
+
children: /* @__PURE__ */ jsx4(Fill, { children: layers.map((child, i) => /* @__PURE__ */ jsx4("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) })
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
};
|
|
311
|
+
var FrameComponentMetadata = {
|
|
312
|
+
kind: "primitive",
|
|
313
|
+
category: "layout",
|
|
314
|
+
acceptsChildren: true,
|
|
315
|
+
description: "Absolute-positioned container (x/y placement)",
|
|
316
|
+
llmGuidance: "Use Frame for precise pixel placement (x/y). Use Box for normal layout flow inside Grid/Stack."
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// src/components/primitives/Grid.tsx
|
|
320
|
+
import { z as z6 } from "zod";
|
|
321
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
322
|
+
var GridPropsSchema = z6.object({
|
|
323
|
+
columns: z6.number().int().min(1).max(12).default(2),
|
|
324
|
+
rows: z6.number().int().min(1).max(12).default(1),
|
|
325
|
+
gap: z6.number().min(0).default(24),
|
|
326
|
+
padding: z6.number().min(0).default(0),
|
|
327
|
+
align: z6.enum(["start", "center", "end", "stretch"]).default("stretch"),
|
|
328
|
+
justify: z6.enum(["start", "center", "end", "stretch"]).default("stretch")
|
|
329
|
+
});
|
|
330
|
+
var mapAlign = (a) => {
|
|
331
|
+
if (a === "start") return "start";
|
|
332
|
+
if (a === "end") return "end";
|
|
333
|
+
if (a === "center") return "center";
|
|
334
|
+
return "stretch";
|
|
335
|
+
};
|
|
336
|
+
var mapJustify = (j) => {
|
|
337
|
+
if (j === "start") return "start";
|
|
338
|
+
if (j === "end") return "end";
|
|
339
|
+
if (j === "center") return "center";
|
|
340
|
+
return "stretch";
|
|
341
|
+
};
|
|
342
|
+
var Grid = ({ columns, rows, gap, padding, align, justify, children }) => {
|
|
343
|
+
return /* @__PURE__ */ jsx5(
|
|
344
|
+
Fill,
|
|
345
|
+
{
|
|
346
|
+
style: {
|
|
347
|
+
display: "grid",
|
|
348
|
+
gridTemplateColumns: `repeat(${columns}, 1fr)`,
|
|
349
|
+
gridTemplateRows: `repeat(${rows}, 1fr)`,
|
|
350
|
+
gap,
|
|
351
|
+
padding,
|
|
352
|
+
alignItems: mapAlign(align),
|
|
353
|
+
justifyItems: mapJustify(justify),
|
|
354
|
+
boxSizing: "border-box"
|
|
355
|
+
},
|
|
356
|
+
children
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
};
|
|
360
|
+
var GridComponentMetadata = {
|
|
361
|
+
kind: "primitive",
|
|
362
|
+
category: "layout",
|
|
363
|
+
acceptsChildren: true,
|
|
364
|
+
description: "Grid layout container with configurable rows/columns",
|
|
365
|
+
llmGuidance: "Use Grid for photo collages and dashboards. Provide exactly rows*columns children when possible."
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
// src/components/primitives/Image.tsx
|
|
369
|
+
import { Img, staticFile as staticFile2 } from "remotion";
|
|
370
|
+
import { z as z7 } from "zod";
|
|
371
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
372
|
+
var ImagePropsSchema = z7.object({
|
|
373
|
+
src: z7.string().min(1),
|
|
374
|
+
fit: z7.enum(["cover", "contain"]).default("cover"),
|
|
375
|
+
borderRadius: z7.number().min(0).default(0),
|
|
376
|
+
opacity: z7.number().min(0).max(1).default(1)
|
|
377
|
+
});
|
|
378
|
+
var resolveAsset = (value) => isRemoteAssetPath(value) ? value : staticFile2(staticFileInputFromAssetPath(value));
|
|
379
|
+
var Image = ({ src, fit, borderRadius, opacity }) => {
|
|
380
|
+
return /* @__PURE__ */ jsx6(Fill, { style: { opacity }, children: /* @__PURE__ */ jsx6(
|
|
381
|
+
Img,
|
|
382
|
+
{
|
|
383
|
+
src: resolveAsset(src),
|
|
384
|
+
style: { width: "100%", height: "100%", objectFit: fit, borderRadius }
|
|
385
|
+
}
|
|
386
|
+
) });
|
|
387
|
+
};
|
|
388
|
+
var ImageComponentMetadata = {
|
|
389
|
+
kind: "primitive",
|
|
390
|
+
category: "image",
|
|
391
|
+
description: "Full-frame image with object-fit options",
|
|
392
|
+
llmGuidance: 'Use Image for pictures and backgrounds. Use fit="cover" for full-bleed, fit="contain" to avoid cropping.'
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
// src/components/primitives/Layer.tsx
|
|
396
|
+
import React3 from "react";
|
|
397
|
+
import { z as z8 } from "zod";
|
|
398
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
399
|
+
var LayerPropsSchema = z8.object({
|
|
400
|
+
zIndex: z8.number().int().default(0).describe("Higher zIndex renders on top"),
|
|
401
|
+
inset: z8.number().min(0).default(0).describe("Inset from all sides in pixels"),
|
|
402
|
+
opacity: z8.number().min(0).max(1).default(1),
|
|
403
|
+
pointerEvents: z8.enum(["none", "auto"]).default("none")
|
|
404
|
+
});
|
|
405
|
+
var Layer = ({ zIndex, inset, opacity, pointerEvents, children }) => {
|
|
406
|
+
const layers = React3.Children.toArray(children);
|
|
407
|
+
return /* @__PURE__ */ jsx7(
|
|
408
|
+
"div",
|
|
409
|
+
{
|
|
410
|
+
style: {
|
|
411
|
+
position: "absolute",
|
|
412
|
+
left: inset,
|
|
413
|
+
right: inset,
|
|
414
|
+
top: inset,
|
|
415
|
+
bottom: inset,
|
|
416
|
+
zIndex,
|
|
417
|
+
opacity,
|
|
418
|
+
pointerEvents,
|
|
419
|
+
boxSizing: "border-box"
|
|
420
|
+
},
|
|
421
|
+
children: /* @__PURE__ */ jsx7(Fill, { children: layers.map((child, i) => /* @__PURE__ */ jsx7("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) })
|
|
422
|
+
}
|
|
423
|
+
);
|
|
424
|
+
};
|
|
425
|
+
var LayerComponentMetadata = {
|
|
426
|
+
kind: "primitive",
|
|
427
|
+
category: "layout",
|
|
428
|
+
acceptsChildren: true,
|
|
429
|
+
minChildren: 1,
|
|
430
|
+
description: "One overlay layer with explicit zIndex inside Layers",
|
|
431
|
+
llmGuidance: "Use Layer inside Layers to control stacking. Put exactly one child in a Layer (recommended)."
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
// src/components/primitives/Layers.tsx
|
|
435
|
+
import { z as z9 } from "zod";
|
|
436
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
437
|
+
var LayersPropsSchema = z9.object({
|
|
438
|
+
overflow: z9.enum(["visible", "hidden"]).default("visible").describe("Clip layers to bounds")
|
|
439
|
+
});
|
|
440
|
+
var Layers = ({ overflow, children }) => {
|
|
441
|
+
return /* @__PURE__ */ jsx8(Fill, { style: { overflow }, children });
|
|
442
|
+
};
|
|
443
|
+
var LayersComponentMetadata = {
|
|
444
|
+
kind: "primitive",
|
|
445
|
+
category: "layout",
|
|
446
|
+
acceptsChildren: true,
|
|
447
|
+
minChildren: 1,
|
|
448
|
+
description: "Overlay container for stacking children (use Layer for zIndex)",
|
|
449
|
+
llmGuidance: "Use Layers to stack background/content/overlays. Prefer Layer children with explicit zIndex."
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
// src/components/primitives/Scene.tsx
|
|
453
|
+
import React4 from "react";
|
|
454
|
+
import { AbsoluteFill, Img as Img2, Video, staticFile as staticFile3 } from "remotion";
|
|
455
|
+
import { z as z10 } from "zod";
|
|
456
|
+
import { jsx as jsx9, jsxs } from "react/jsx-runtime";
|
|
457
|
+
var ScenePropsSchema = z10.object({
|
|
458
|
+
background: BackgroundSpecSchema
|
|
459
|
+
});
|
|
460
|
+
var resolveAsset2 = (value) => {
|
|
461
|
+
return isRemoteAssetPath(value) ? value : staticFile3(staticFileInputFromAssetPath(value));
|
|
462
|
+
};
|
|
463
|
+
var Scene = ({ background, children }) => {
|
|
464
|
+
const layers = React4.Children.toArray(children);
|
|
465
|
+
return /* @__PURE__ */ jsxs(AbsoluteFill, { children: [
|
|
466
|
+
background.type === "color" ? /* @__PURE__ */ jsx9(AbsoluteFill, { style: { backgroundColor: background.value } }) : background.type === "image" ? /* @__PURE__ */ jsx9(
|
|
467
|
+
Img2,
|
|
468
|
+
{
|
|
469
|
+
src: resolveAsset2(background.value),
|
|
470
|
+
style: { width: "100%", height: "100%", objectFit: "cover" }
|
|
471
|
+
}
|
|
472
|
+
) : /* @__PURE__ */ jsx9(
|
|
473
|
+
Video,
|
|
474
|
+
{
|
|
475
|
+
src: resolveAsset2(background.value),
|
|
476
|
+
style: { width: "100%", height: "100%", objectFit: "cover" }
|
|
477
|
+
}
|
|
478
|
+
),
|
|
479
|
+
/* @__PURE__ */ jsx9(AbsoluteFill, { children: layers.map((child, i) => /* @__PURE__ */ jsx9(AbsoluteFill, { children: child }, i)) })
|
|
480
|
+
] });
|
|
481
|
+
};
|
|
482
|
+
var SceneComponentMetadata = {
|
|
483
|
+
kind: "primitive",
|
|
484
|
+
category: "layout",
|
|
485
|
+
acceptsChildren: true,
|
|
486
|
+
description: "Scene container with a background and nested children",
|
|
487
|
+
llmGuidance: "Use Scene to define a segment of the video. Scene timings must be sequential with no gaps. Put Text and Audio as children."
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
// src/components/primitives/Segment.tsx
|
|
491
|
+
import { AbsoluteFill as AbsoluteFill2, interpolate as interpolate2, useCurrentFrame as useCurrentFrame2 } from "remotion";
|
|
492
|
+
import { z as z11 } from "zod";
|
|
493
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
494
|
+
var TransitionPropsSchema = z11.object({
|
|
495
|
+
type: z11.string().min(1),
|
|
496
|
+
durationInFrames: z11.number().int().positive(),
|
|
497
|
+
props: z11.record(z11.string(), z11.unknown()).optional()
|
|
498
|
+
});
|
|
499
|
+
var SegmentPropsSchema = z11.object({
|
|
500
|
+
enterTransition: TransitionPropsSchema.optional(),
|
|
501
|
+
exitTransition: TransitionPropsSchema.optional()
|
|
502
|
+
});
|
|
503
|
+
function getSlideOptions(raw) {
|
|
504
|
+
const parsed = z11.object({
|
|
505
|
+
direction: z11.enum(["left", "right", "up", "down"]).default("left"),
|
|
506
|
+
distance: z11.number().int().min(1).max(2e3).default(80)
|
|
507
|
+
}).safeParse(raw ?? {});
|
|
508
|
+
if (parsed.success) return parsed.data;
|
|
509
|
+
return { direction: "left", distance: 80 };
|
|
510
|
+
}
|
|
511
|
+
function getZoomOptions(raw) {
|
|
512
|
+
const parsed = z11.object({
|
|
513
|
+
type: z11.enum(["zoomIn", "zoomOut"]).default("zoomIn")
|
|
514
|
+
}).safeParse(raw ?? {});
|
|
515
|
+
if (parsed.success) return parsed.data;
|
|
516
|
+
return { type: "zoomIn" };
|
|
517
|
+
}
|
|
518
|
+
function getWipeOptions(raw) {
|
|
519
|
+
const parsed = z11.object({
|
|
520
|
+
direction: z11.enum(["left", "right", "up", "down", "diagonal"]).default("right"),
|
|
521
|
+
softEdge: z11.boolean().default(false)
|
|
522
|
+
}).safeParse(raw ?? {});
|
|
523
|
+
if (parsed.success) return parsed.data;
|
|
524
|
+
return { direction: "right", softEdge: false };
|
|
525
|
+
}
|
|
526
|
+
function clipFor(direction, p) {
|
|
527
|
+
if (direction === "left") return `inset(0 ${100 * (1 - p)}% 0 0)`;
|
|
528
|
+
if (direction === "right") return `inset(0 0 0 ${100 * (1 - p)}%)`;
|
|
529
|
+
if (direction === "up") return `inset(0 0 ${100 * (1 - p)}% 0)`;
|
|
530
|
+
if (direction === "down") return `inset(${100 * (1 - p)}% 0 0 0)`;
|
|
531
|
+
return `polygon(0 0, ${100 * p}% 0, 0 ${100 * p}%)`;
|
|
532
|
+
}
|
|
533
|
+
function getCircularOptions(raw) {
|
|
534
|
+
const parsed = z11.object({
|
|
535
|
+
direction: z11.enum(["open", "close"]).default("open"),
|
|
536
|
+
center: z11.object({
|
|
537
|
+
x: z11.number().min(0).max(1).default(0.5),
|
|
538
|
+
y: z11.number().min(0).max(1).default(0.5)
|
|
539
|
+
}).default({ x: 0.5, y: 0.5 })
|
|
540
|
+
}).safeParse(raw ?? {});
|
|
541
|
+
if (parsed.success) return parsed.data;
|
|
542
|
+
return { direction: "open", center: { x: 0.5, y: 0.5 } };
|
|
543
|
+
}
|
|
544
|
+
var Segment = ({ enterTransition, exitTransition, children, __wavesDurationInFrames }) => {
|
|
545
|
+
const frame = useCurrentFrame2();
|
|
546
|
+
const durationInFrames = __wavesDurationInFrames ?? 0;
|
|
547
|
+
let opacity = 1;
|
|
548
|
+
let translateX = 0;
|
|
549
|
+
let translateY = 0;
|
|
550
|
+
let scale = 1;
|
|
551
|
+
let clipPath;
|
|
552
|
+
let filter;
|
|
553
|
+
if (enterTransition) {
|
|
554
|
+
const d = enterTransition.durationInFrames;
|
|
555
|
+
if (enterTransition.type === "FadeTransition") {
|
|
556
|
+
opacity *= interpolate2(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
557
|
+
}
|
|
558
|
+
if (enterTransition.type === "SlideTransition") {
|
|
559
|
+
const opts = getSlideOptions(enterTransition.props);
|
|
560
|
+
const t = interpolate2(frame, [0, d], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
561
|
+
const delta = opts.distance * t;
|
|
562
|
+
if (opts.direction === "left") translateX += -delta;
|
|
563
|
+
if (opts.direction === "right") translateX += delta;
|
|
564
|
+
if (opts.direction === "up") translateY += -delta;
|
|
565
|
+
if (opts.direction === "down") translateY += delta;
|
|
566
|
+
opacity *= interpolate2(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
567
|
+
}
|
|
568
|
+
if (enterTransition.type === "ZoomTransition") {
|
|
569
|
+
const opts = getZoomOptions(enterTransition.props);
|
|
570
|
+
const fromScale = opts.type === "zoomIn" ? 1.2 : 0.85;
|
|
571
|
+
const t = interpolate2(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
572
|
+
scale *= fromScale + (1 - fromScale) * t;
|
|
573
|
+
opacity *= t;
|
|
574
|
+
}
|
|
575
|
+
if (enterTransition.type === "WipeTransition") {
|
|
576
|
+
const opts = getWipeOptions(enterTransition.props);
|
|
577
|
+
const t = interpolate2(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
578
|
+
clipPath = clipFor(opts.direction, t);
|
|
579
|
+
filter = opts.softEdge ? "blur(0.4px)" : void 0;
|
|
580
|
+
}
|
|
581
|
+
if (enterTransition.type === "CircularReveal") {
|
|
582
|
+
const opts = getCircularOptions(enterTransition.props);
|
|
583
|
+
const open = opts.direction === "open";
|
|
584
|
+
const t = interpolate2(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
585
|
+
const radiusPct = open ? 150 * t : 150 * (1 - t);
|
|
586
|
+
clipPath = `circle(${radiusPct}% at ${Math.round(opts.center.x * 100)}% ${Math.round(opts.center.y * 100)}%)`;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
if (exitTransition && durationInFrames > 0) {
|
|
590
|
+
const d = exitTransition.durationInFrames;
|
|
591
|
+
const start = Math.max(0, durationInFrames - d);
|
|
592
|
+
if (exitTransition.type === "FadeTransition") {
|
|
593
|
+
opacity *= interpolate2(frame, [start, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
594
|
+
}
|
|
595
|
+
if (exitTransition.type === "SlideTransition") {
|
|
596
|
+
const opts = getSlideOptions(exitTransition.props);
|
|
597
|
+
const t = interpolate2(frame, [start, durationInFrames], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
598
|
+
const delta = opts.distance * t;
|
|
599
|
+
if (opts.direction === "left") translateX += delta;
|
|
600
|
+
if (opts.direction === "right") translateX += -delta;
|
|
601
|
+
if (opts.direction === "up") translateY += delta;
|
|
602
|
+
if (opts.direction === "down") translateY += -delta;
|
|
603
|
+
opacity *= interpolate2(frame, [start, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
604
|
+
}
|
|
605
|
+
if (exitTransition.type === "ZoomTransition") {
|
|
606
|
+
const opts = getZoomOptions(exitTransition.props);
|
|
607
|
+
const toScale = opts.type === "zoomIn" ? 1.25 : 0.75;
|
|
608
|
+
const t = interpolate2(frame, [start, durationInFrames], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
609
|
+
scale *= 1 + (toScale - 1) * t;
|
|
610
|
+
opacity *= 1 - t;
|
|
611
|
+
}
|
|
612
|
+
if (exitTransition.type === "WipeTransition") {
|
|
613
|
+
const opts = getWipeOptions(exitTransition.props);
|
|
614
|
+
const t = interpolate2(frame, [start, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
615
|
+
clipPath = clipFor(opts.direction, t);
|
|
616
|
+
filter = opts.softEdge ? "blur(0.4px)" : void 0;
|
|
617
|
+
}
|
|
618
|
+
if (exitTransition.type === "CircularReveal") {
|
|
619
|
+
const opts = getCircularOptions(exitTransition.props);
|
|
620
|
+
const open = opts.direction === "open";
|
|
621
|
+
const t = interpolate2(frame, [start, durationInFrames], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
622
|
+
const radiusPct = open ? 150 * (1 - t) : 150 * t;
|
|
623
|
+
clipPath = `circle(${radiusPct}% at ${Math.round(opts.center.x * 100)}% ${Math.round(opts.center.y * 100)}%)`;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
const transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`;
|
|
627
|
+
return /* @__PURE__ */ jsx10(AbsoluteFill2, { style: { opacity, transform, clipPath, filter }, children });
|
|
628
|
+
};
|
|
629
|
+
var SegmentComponentMetadata = {
|
|
630
|
+
kind: "primitive",
|
|
631
|
+
category: "layout",
|
|
632
|
+
internal: true,
|
|
633
|
+
acceptsChildren: true,
|
|
634
|
+
minChildren: 1,
|
|
635
|
+
maxChildren: 1,
|
|
636
|
+
description: "Internal segment wrapper (used by v2 segments compiler)"
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
// src/components/primitives/Shape.tsx
|
|
640
|
+
import { z as z12 } from "zod";
|
|
641
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
642
|
+
var ShapePropsSchema = z12.object({
|
|
643
|
+
shape: z12.enum(["rect", "circle"]).default("rect"),
|
|
644
|
+
x: z12.number().default(0),
|
|
645
|
+
y: z12.number().default(0),
|
|
646
|
+
width: z12.number().positive().default(100),
|
|
647
|
+
height: z12.number().positive().default(100),
|
|
648
|
+
fill: z12.string().default("#FFFFFF"),
|
|
649
|
+
strokeColor: z12.string().optional(),
|
|
650
|
+
strokeWidth: z12.number().min(0).default(0),
|
|
651
|
+
opacity: z12.number().min(0).max(1).default(1)
|
|
652
|
+
});
|
|
653
|
+
var Shape = ({
|
|
654
|
+
shape,
|
|
655
|
+
x,
|
|
656
|
+
y,
|
|
657
|
+
width,
|
|
658
|
+
height,
|
|
659
|
+
fill,
|
|
660
|
+
strokeColor,
|
|
661
|
+
strokeWidth,
|
|
662
|
+
opacity
|
|
663
|
+
}) => {
|
|
664
|
+
return /* @__PURE__ */ jsx11(
|
|
665
|
+
"div",
|
|
666
|
+
{
|
|
667
|
+
style: {
|
|
668
|
+
position: "absolute",
|
|
669
|
+
left: x,
|
|
670
|
+
top: y,
|
|
671
|
+
width,
|
|
672
|
+
height,
|
|
673
|
+
backgroundColor: fill,
|
|
674
|
+
borderRadius: shape === "circle" ? 9999 : 0,
|
|
675
|
+
border: strokeWidth > 0 ? `${strokeWidth}px solid ${strokeColor ?? fill}` : void 0,
|
|
676
|
+
opacity
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
);
|
|
680
|
+
};
|
|
681
|
+
var ShapeComponentMetadata = {
|
|
682
|
+
kind: "primitive",
|
|
683
|
+
category: "layout",
|
|
684
|
+
description: "Simple rect/circle shape for UI accents",
|
|
685
|
+
llmGuidance: "Use Shape for lines, badges, and simple UI blocks. Use circle for dots and rings."
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
// src/components/primitives/Stack.tsx
|
|
689
|
+
import { z as z13 } from "zod";
|
|
690
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
691
|
+
var StackPropsSchema = z13.object({
|
|
692
|
+
direction: z13.enum(["row", "column"]).default("column"),
|
|
693
|
+
gap: z13.number().min(0).default(24),
|
|
694
|
+
padding: z13.number().min(0).default(0),
|
|
695
|
+
align: z13.enum(["start", "center", "end", "stretch"]).default("center"),
|
|
696
|
+
justify: z13.enum(["start", "center", "end", "between"]).default("center")
|
|
697
|
+
});
|
|
698
|
+
var mapAlign2 = (a) => {
|
|
699
|
+
if (a === "start") return "flex-start";
|
|
700
|
+
if (a === "end") return "flex-end";
|
|
701
|
+
if (a === "stretch") return "stretch";
|
|
702
|
+
return "center";
|
|
703
|
+
};
|
|
704
|
+
var mapJustify2 = (j) => {
|
|
705
|
+
if (j === "start") return "flex-start";
|
|
706
|
+
if (j === "end") return "flex-end";
|
|
707
|
+
if (j === "between") return "space-between";
|
|
708
|
+
return "center";
|
|
709
|
+
};
|
|
710
|
+
var Stack = ({ direction, gap, padding, align, justify, children }) => {
|
|
711
|
+
return /* @__PURE__ */ jsx12(
|
|
712
|
+
Fill,
|
|
713
|
+
{
|
|
714
|
+
style: {
|
|
715
|
+
display: "flex",
|
|
716
|
+
flexDirection: direction,
|
|
717
|
+
gap,
|
|
718
|
+
padding,
|
|
719
|
+
alignItems: mapAlign2(align),
|
|
720
|
+
justifyContent: mapJustify2(justify),
|
|
721
|
+
boxSizing: "border-box"
|
|
722
|
+
},
|
|
723
|
+
children
|
|
724
|
+
}
|
|
725
|
+
);
|
|
726
|
+
};
|
|
727
|
+
var StackComponentMetadata = {
|
|
728
|
+
kind: "primitive",
|
|
729
|
+
category: "layout",
|
|
730
|
+
acceptsChildren: true,
|
|
731
|
+
description: "Flexbox stack layout (row/column) with gap and alignment",
|
|
732
|
+
llmGuidance: "Use Stack to arrange child components in a row or column without manual positioning."
|
|
733
|
+
};
|
|
734
|
+
|
|
735
|
+
// src/components/primitives/Text.tsx
|
|
736
|
+
import { interpolate as interpolate3, useCurrentFrame as useCurrentFrame3 } from "remotion";
|
|
737
|
+
import { z as z14 } from "zod";
|
|
738
|
+
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
739
|
+
var TextPropsSchema = z14.object({
|
|
740
|
+
content: z14.string(),
|
|
741
|
+
fontSize: z14.number().default(48),
|
|
742
|
+
color: z14.string().default("#FFFFFF"),
|
|
743
|
+
fontFamily: z14.string().default("Inter"),
|
|
744
|
+
position: z14.enum(["top", "center", "bottom", "left", "right"]).default("center"),
|
|
745
|
+
animation: z14.enum(["none", "fade", "slide", "zoom"]).default("fade"),
|
|
746
|
+
maxWidthPct: z14.number().min(0.1).max(1).default(0.9),
|
|
747
|
+
safeInsetPct: z14.number().min(0).max(0.25).default(0.06),
|
|
748
|
+
textAlign: z14.enum(["left", "center", "right"]).default("center")
|
|
749
|
+
});
|
|
750
|
+
var getPositionStyles = (position, safeInsetPct) => {
|
|
751
|
+
const inset = `${(safeInsetPct * 100).toFixed(2)}%`;
|
|
752
|
+
const base = {
|
|
753
|
+
display: "flex",
|
|
754
|
+
justifyContent: "center",
|
|
755
|
+
alignItems: "center"
|
|
756
|
+
};
|
|
757
|
+
switch (position) {
|
|
758
|
+
case "top":
|
|
759
|
+
return { ...base, alignItems: "flex-start", paddingTop: inset };
|
|
760
|
+
case "bottom":
|
|
761
|
+
return { ...base, alignItems: "flex-end", paddingBottom: inset };
|
|
762
|
+
case "left":
|
|
763
|
+
return { ...base, justifyContent: "flex-start", paddingLeft: inset };
|
|
764
|
+
case "right":
|
|
765
|
+
return { ...base, justifyContent: "flex-end", paddingRight: inset };
|
|
766
|
+
default:
|
|
767
|
+
return base;
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
var getAnimationStyle = (frame, animation) => {
|
|
771
|
+
const animDuration = 30;
|
|
772
|
+
switch (animation) {
|
|
773
|
+
case "fade": {
|
|
774
|
+
const opacity = interpolate3(frame, [0, animDuration], [0, 1], {
|
|
775
|
+
extrapolateLeft: "clamp",
|
|
776
|
+
extrapolateRight: "clamp"
|
|
777
|
+
});
|
|
778
|
+
return { opacity };
|
|
779
|
+
}
|
|
780
|
+
case "slide": {
|
|
781
|
+
const translateY = interpolate3(frame, [0, animDuration], [50, 0], {
|
|
782
|
+
extrapolateLeft: "clamp",
|
|
783
|
+
extrapolateRight: "clamp"
|
|
784
|
+
});
|
|
785
|
+
const opacity = interpolate3(frame, [0, animDuration], [0, 1], {
|
|
786
|
+
extrapolateLeft: "clamp",
|
|
787
|
+
extrapolateRight: "clamp"
|
|
788
|
+
});
|
|
789
|
+
return { transform: `translateY(${translateY}px)`, opacity };
|
|
790
|
+
}
|
|
791
|
+
case "zoom": {
|
|
792
|
+
const scale = interpolate3(frame, [0, animDuration], [0.8, 1], {
|
|
793
|
+
extrapolateLeft: "clamp",
|
|
794
|
+
extrapolateRight: "clamp"
|
|
795
|
+
});
|
|
796
|
+
const opacity = interpolate3(frame, [0, animDuration], [0, 1], {
|
|
797
|
+
extrapolateLeft: "clamp",
|
|
798
|
+
extrapolateRight: "clamp"
|
|
799
|
+
});
|
|
800
|
+
return { transform: `scale(${scale})`, opacity };
|
|
801
|
+
}
|
|
802
|
+
default:
|
|
803
|
+
return {};
|
|
804
|
+
}
|
|
805
|
+
};
|
|
806
|
+
var Text = ({
|
|
807
|
+
content,
|
|
808
|
+
fontSize,
|
|
809
|
+
color,
|
|
810
|
+
fontFamily,
|
|
811
|
+
position,
|
|
812
|
+
animation,
|
|
813
|
+
maxWidthPct,
|
|
814
|
+
safeInsetPct,
|
|
815
|
+
textAlign
|
|
816
|
+
}) => {
|
|
817
|
+
const frame = useCurrentFrame3();
|
|
818
|
+
const positionStyles6 = getPositionStyles(position, safeInsetPct);
|
|
819
|
+
const animationStyles = getAnimationStyle(frame, animation);
|
|
820
|
+
return /* @__PURE__ */ jsx13(Fill, { style: positionStyles6, children: /* @__PURE__ */ jsx13(
|
|
821
|
+
"div",
|
|
822
|
+
{
|
|
823
|
+
style: {
|
|
824
|
+
fontSize,
|
|
825
|
+
color,
|
|
826
|
+
fontFamily,
|
|
827
|
+
fontWeight: 600,
|
|
828
|
+
textAlign,
|
|
829
|
+
maxWidth: `${Math.round(maxWidthPct * 100)}%`,
|
|
830
|
+
overflowWrap: "anywhere",
|
|
831
|
+
wordBreak: "break-word",
|
|
832
|
+
...animationStyles
|
|
833
|
+
},
|
|
834
|
+
children: content
|
|
835
|
+
}
|
|
836
|
+
) });
|
|
837
|
+
};
|
|
838
|
+
var TextComponentMetadata = {
|
|
839
|
+
kind: "primitive",
|
|
840
|
+
category: "text",
|
|
841
|
+
description: "Displays animated text with positioning and animation options",
|
|
842
|
+
llmGuidance: 'Use for titles, subtitles, captions. Keep content under 100 characters for readability. Position "center" works best for titles.',
|
|
843
|
+
examples: [
|
|
844
|
+
{
|
|
845
|
+
content: "Welcome to Waves",
|
|
846
|
+
fontSize: 72,
|
|
847
|
+
color: "#FFFFFF",
|
|
848
|
+
position: "center",
|
|
849
|
+
animation: "fade"
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
content: "Building the future of video",
|
|
853
|
+
fontSize: 36,
|
|
854
|
+
color: "#CCCCCC",
|
|
855
|
+
position: "bottom",
|
|
856
|
+
animation: "slide"
|
|
857
|
+
}
|
|
858
|
+
]
|
|
859
|
+
};
|
|
860
|
+
|
|
861
|
+
// src/components/primitives/Video.tsx
|
|
862
|
+
import { Video as RemotionVideo, staticFile as staticFile4 } from "remotion";
|
|
863
|
+
import { z as z15 } from "zod";
|
|
864
|
+
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
865
|
+
var VideoPropsSchema = z15.object({
|
|
866
|
+
src: z15.string().min(1),
|
|
867
|
+
fit: z15.enum(["cover", "contain"]).default("cover"),
|
|
868
|
+
borderRadius: z15.number().min(0).default(0),
|
|
869
|
+
opacity: z15.number().min(0).max(1).default(1),
|
|
870
|
+
muted: z15.boolean().default(true)
|
|
871
|
+
});
|
|
872
|
+
var resolveAsset3 = (value) => isRemoteAssetPath(value) ? value : staticFile4(staticFileInputFromAssetPath(value));
|
|
873
|
+
var Video2 = ({ src, fit, borderRadius, opacity, muted }) => {
|
|
874
|
+
return /* @__PURE__ */ jsx14(Fill, { style: { opacity }, children: /* @__PURE__ */ jsx14(
|
|
875
|
+
RemotionVideo,
|
|
876
|
+
{
|
|
877
|
+
src: resolveAsset3(src),
|
|
878
|
+
muted,
|
|
879
|
+
style: { width: "100%", height: "100%", objectFit: fit, borderRadius }
|
|
880
|
+
}
|
|
881
|
+
) });
|
|
882
|
+
};
|
|
883
|
+
var VideoComponentMetadata = {
|
|
884
|
+
kind: "primitive",
|
|
885
|
+
category: "media",
|
|
886
|
+
description: "Full-frame video with object-fit options",
|
|
887
|
+
llmGuidance: "Use Video for B-roll. Keep videos short and muted unless you intentionally want audio."
|
|
888
|
+
};
|
|
889
|
+
|
|
890
|
+
// src/components/composites/AnimatedCounter.tsx
|
|
891
|
+
import { interpolate as interpolate4, spring, useCurrentFrame as useCurrentFrame4, useVideoConfig } from "remotion";
|
|
892
|
+
import { z as z16 } from "zod";
|
|
893
|
+
import { jsx as jsx15, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
894
|
+
var AnimatedCounterPropsSchema = z16.object({
|
|
895
|
+
from: z16.number().default(0),
|
|
896
|
+
to: z16.number().default(100),
|
|
897
|
+
fontSize: z16.number().min(8).max(300).default(96),
|
|
898
|
+
color: z16.string().default("#FFFFFF"),
|
|
899
|
+
fontFamily: z16.string().default("Inter"),
|
|
900
|
+
fontWeight: z16.number().int().min(100).max(900).default(700),
|
|
901
|
+
icon: z16.string().optional(),
|
|
902
|
+
suffix: z16.string().optional(),
|
|
903
|
+
animationType: z16.enum(["spring", "linear"]).default("spring")
|
|
904
|
+
});
|
|
905
|
+
var AnimatedCounter = ({
|
|
906
|
+
from,
|
|
907
|
+
to,
|
|
908
|
+
fontSize,
|
|
909
|
+
color,
|
|
910
|
+
fontFamily,
|
|
911
|
+
fontWeight,
|
|
912
|
+
icon,
|
|
913
|
+
suffix,
|
|
914
|
+
animationType,
|
|
915
|
+
__wavesDurationInFrames
|
|
916
|
+
}) => {
|
|
917
|
+
const frame = useCurrentFrame4();
|
|
918
|
+
const { fps } = useVideoConfig();
|
|
919
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
920
|
+
const progress = animationType === "spring" ? spring({ frame, fps, config: { damping: 14, stiffness: 110, mass: 0.9 } }) : interpolate4(frame, [0, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
921
|
+
const value = from + (to - from) * Math.max(0, Math.min(1, progress));
|
|
922
|
+
const rounded = Math.round(value);
|
|
923
|
+
const label = `${rounded.toLocaleString()}${suffix ?? ""}`;
|
|
924
|
+
return /* @__PURE__ */ jsx15(Fill, { style: { display: "flex", alignItems: "center", justifyContent: "center" }, children: /* @__PURE__ */ jsxs2("div", { style: { textAlign: "center" }, children: [
|
|
925
|
+
icon ? /* @__PURE__ */ jsx15("div", { style: { fontSize: Math.round(fontSize * 0.5), marginBottom: 18 }, children: icon }) : null,
|
|
926
|
+
/* @__PURE__ */ jsx15("div", { style: { fontSize, color, fontFamily, fontWeight, lineHeight: 1 }, children: label })
|
|
927
|
+
] }) });
|
|
928
|
+
};
|
|
929
|
+
var AnimatedCounterComponentMetadata = {
|
|
930
|
+
kind: "composite",
|
|
931
|
+
category: "data",
|
|
932
|
+
description: "Animated numeric counter (spring or linear), optionally with an icon and suffix",
|
|
933
|
+
llmGuidance: 'Use for big stats. animationType="spring" feels natural. suffix for units (%, K, M).',
|
|
934
|
+
examples: [
|
|
935
|
+
{ from: 0, to: 100, suffix: "%", icon: "\u{1F4C8}" },
|
|
936
|
+
{ from: 0, to: 25e3, suffix: "+", animationType: "linear" }
|
|
937
|
+
]
|
|
938
|
+
};
|
|
939
|
+
|
|
940
|
+
// src/components/composites/BarChart.tsx
|
|
941
|
+
import { spring as spring2, useCurrentFrame as useCurrentFrame5, useVideoConfig as useVideoConfig2 } from "remotion";
|
|
942
|
+
import { z as z17 } from "zod";
|
|
943
|
+
import { jsx as jsx16, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
944
|
+
var BarChartPropsSchema = z17.object({
|
|
945
|
+
data: z17.array(z17.object({
|
|
946
|
+
label: z17.string().min(1),
|
|
947
|
+
value: z17.number(),
|
|
948
|
+
color: z17.string().optional()
|
|
949
|
+
})).min(2).max(8),
|
|
950
|
+
orientation: z17.enum(["horizontal", "vertical"]).default("vertical"),
|
|
951
|
+
showValues: z17.boolean().default(true),
|
|
952
|
+
showGrid: z17.boolean().default(false),
|
|
953
|
+
maxValue: z17.number().optional()
|
|
954
|
+
});
|
|
955
|
+
var BarChart = ({ data, orientation, showValues, showGrid, maxValue }) => {
|
|
956
|
+
const frame = useCurrentFrame5();
|
|
957
|
+
const { fps } = useVideoConfig2();
|
|
958
|
+
const max = maxValue ?? Math.max(...data.map((d) => d.value));
|
|
959
|
+
return /* @__PURE__ */ jsxs3(Fill, { style: { padding: 90, boxSizing: "border-box" }, children: [
|
|
960
|
+
showGrid ? /* @__PURE__ */ jsx16("div", { style: { position: "absolute", left: 90, right: 90, top: 90, bottom: 90, opacity: 0.15, backgroundImage: "linear-gradient(#fff 1px, transparent 1px)", backgroundSize: "100% 60px" } }) : null,
|
|
961
|
+
/* @__PURE__ */ jsx16(
|
|
962
|
+
"div",
|
|
963
|
+
{
|
|
964
|
+
style: {
|
|
965
|
+
display: "flex",
|
|
966
|
+
flexDirection: orientation === "vertical" ? "row" : "column",
|
|
967
|
+
gap: 24,
|
|
968
|
+
width: "100%",
|
|
969
|
+
height: "100%",
|
|
970
|
+
alignItems: orientation === "vertical" ? "flex-end" : "stretch",
|
|
971
|
+
justifyContent: "space-between"
|
|
972
|
+
},
|
|
973
|
+
children: data.map((d, i) => {
|
|
974
|
+
const p = spring2({ frame: frame - i * 4, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
975
|
+
const ratio = max === 0 ? 0 : d.value / max * p;
|
|
976
|
+
const color = d.color ?? "#0A84FF";
|
|
977
|
+
return /* @__PURE__ */ jsxs3("div", { style: { flex: 1, display: "flex", flexDirection: "column", alignItems: "center", gap: 10 }, children: [
|
|
978
|
+
orientation === "vertical" ? /* @__PURE__ */ jsx16("div", { style: { width: "100%", flex: 1, display: "flex", alignItems: "flex-end" }, children: /* @__PURE__ */ jsx16("div", { style: { width: "100%", height: `${Math.round(ratio * 100)}%`, backgroundColor: color, borderRadius: 12 } }) }) : /* @__PURE__ */ jsx16("div", { style: { width: "100%", display: "flex", alignItems: "center", gap: 12 }, children: /* @__PURE__ */ jsx16("div", { style: { flex: 1, height: 18, backgroundColor: "rgba(255,255,255,0.15)", borderRadius: 9999, overflow: "hidden" }, children: /* @__PURE__ */ jsx16("div", { style: { width: `${Math.round(ratio * 100)}%`, height: "100%", backgroundColor: color } }) }) }),
|
|
979
|
+
/* @__PURE__ */ jsx16("div", { style: { color: "#FFFFFF", fontWeight: 700, fontSize: 22, opacity: 0.9 }, children: d.label }),
|
|
980
|
+
showValues ? /* @__PURE__ */ jsx16("div", { style: { color: "#FFFFFF", fontWeight: 800, fontSize: 26 }, children: Math.round(d.value).toLocaleString() }) : null
|
|
981
|
+
] }, d.label);
|
|
982
|
+
})
|
|
983
|
+
}
|
|
984
|
+
)
|
|
985
|
+
] });
|
|
986
|
+
};
|
|
987
|
+
var BarChartComponentMetadata = {
|
|
988
|
+
kind: "composite",
|
|
989
|
+
category: "data",
|
|
990
|
+
description: "Animated bar chart (vertical or horizontal)",
|
|
991
|
+
llmGuidance: "Use 2-6 bars. Provide maxValue to lock scale across multiple charts."
|
|
992
|
+
};
|
|
993
|
+
|
|
994
|
+
// src/components/composites/CardStack.tsx
|
|
995
|
+
import { interpolate as interpolate5, spring as spring3, useCurrentFrame as useCurrentFrame6, useVideoConfig as useVideoConfig3 } from "remotion";
|
|
996
|
+
import { z as z18 } from "zod";
|
|
997
|
+
import { jsx as jsx17, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
998
|
+
var CardSchema = z18.object({
|
|
999
|
+
title: z18.string().min(1),
|
|
1000
|
+
content: z18.string().min(1),
|
|
1001
|
+
backgroundColor: z18.string().optional()
|
|
1002
|
+
});
|
|
1003
|
+
var CardStackPropsSchema = z18.object({
|
|
1004
|
+
cards: z18.array(CardSchema).min(2).max(5),
|
|
1005
|
+
transition: z18.enum(["flip", "slide", "fade"]).default("flip"),
|
|
1006
|
+
displayDuration: z18.number().int().min(30).max(150).default(90)
|
|
1007
|
+
});
|
|
1008
|
+
var CardStack = ({ cards, transition, displayDuration }) => {
|
|
1009
|
+
const frame = useCurrentFrame6();
|
|
1010
|
+
const { fps } = useVideoConfig3();
|
|
1011
|
+
const index = Math.min(cards.length - 1, Math.floor(frame / displayDuration));
|
|
1012
|
+
const local = frame - index * displayDuration;
|
|
1013
|
+
const p = spring3({ frame: local, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1014
|
+
const card = cards[index];
|
|
1015
|
+
const bg = card.backgroundColor ?? "rgba(255,255,255,0.1)";
|
|
1016
|
+
const opacity = transition === "fade" ? p : 1;
|
|
1017
|
+
const slideX = transition === "slide" ? interpolate5(p, [0, 1], [80, 0]) : 0;
|
|
1018
|
+
const rotateY = transition === "flip" ? interpolate5(p, [0, 1], [70, 0]) : 0;
|
|
1019
|
+
return /* @__PURE__ */ jsx17(Fill, { style: { display: "flex", justifyContent: "center", alignItems: "center" }, children: /* @__PURE__ */ jsxs4(
|
|
1020
|
+
"div",
|
|
1021
|
+
{
|
|
1022
|
+
style: {
|
|
1023
|
+
width: 980,
|
|
1024
|
+
height: 520,
|
|
1025
|
+
borderRadius: 28,
|
|
1026
|
+
padding: 60,
|
|
1027
|
+
boxSizing: "border-box",
|
|
1028
|
+
backgroundColor: bg,
|
|
1029
|
+
boxShadow: "0 30px 90px rgba(0,0,0,0.35)",
|
|
1030
|
+
color: "#FFFFFF",
|
|
1031
|
+
transform: `translateX(${slideX}px) rotateY(${rotateY}deg)`,
|
|
1032
|
+
transformStyle: "preserve-3d",
|
|
1033
|
+
opacity
|
|
1034
|
+
},
|
|
1035
|
+
children: [
|
|
1036
|
+
/* @__PURE__ */ jsx17("div", { style: { fontSize: 56, fontWeight: 900, marginBottom: 22 }, children: card.title }),
|
|
1037
|
+
/* @__PURE__ */ jsx17("div", { style: { fontSize: 30, fontWeight: 700, opacity: 0.9, lineHeight: 1.3 }, children: card.content })
|
|
1038
|
+
]
|
|
1039
|
+
}
|
|
1040
|
+
) });
|
|
1041
|
+
};
|
|
1042
|
+
var CardStackComponentMetadata = {
|
|
1043
|
+
kind: "composite",
|
|
1044
|
+
category: "layout",
|
|
1045
|
+
description: "Sequential stacked cards (2-5) with flip/slide/fade transitions",
|
|
1046
|
+
llmGuidance: "Use for steps/features. displayDuration is frames per card."
|
|
1047
|
+
};
|
|
1048
|
+
|
|
1049
|
+
// src/components/composites/CircularReveal.tsx
|
|
1050
|
+
import React5 from "react";
|
|
1051
|
+
import { interpolate as interpolate6, useCurrentFrame as useCurrentFrame7 } from "remotion";
|
|
1052
|
+
import { z as z19 } from "zod";
|
|
1053
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
1054
|
+
var CenterSchema = z19.object({
|
|
1055
|
+
x: z19.number().min(0).max(1).default(0.5),
|
|
1056
|
+
y: z19.number().min(0).max(1).default(0.5)
|
|
1057
|
+
});
|
|
1058
|
+
var CircularRevealPropsSchema = z19.object({
|
|
1059
|
+
durationInFrames: z19.number().int().min(10).max(60).default(30),
|
|
1060
|
+
direction: z19.enum(["open", "close"]).default("open"),
|
|
1061
|
+
center: CenterSchema.optional(),
|
|
1062
|
+
phase: z19.enum(["in", "out", "inOut"]).default("inOut")
|
|
1063
|
+
});
|
|
1064
|
+
var CircularReveal = ({
|
|
1065
|
+
durationInFrames,
|
|
1066
|
+
direction,
|
|
1067
|
+
center,
|
|
1068
|
+
phase,
|
|
1069
|
+
children,
|
|
1070
|
+
__wavesDurationInFrames
|
|
1071
|
+
}) => {
|
|
1072
|
+
const layers = React5.Children.toArray(children);
|
|
1073
|
+
const frame = useCurrentFrame7();
|
|
1074
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1075
|
+
const d = Math.min(durationInFrames, total);
|
|
1076
|
+
const c = center ?? { x: 0.5, y: 0.5 };
|
|
1077
|
+
const open = direction === "open";
|
|
1078
|
+
let radiusPct = open ? 0 : 150;
|
|
1079
|
+
if (phase === "in" || phase === "inOut") {
|
|
1080
|
+
const t = interpolate6(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1081
|
+
radiusPct = open ? 150 * t : 150 * (1 - t);
|
|
1082
|
+
}
|
|
1083
|
+
if (phase === "out" || phase === "inOut") {
|
|
1084
|
+
const start = Math.max(0, total - d);
|
|
1085
|
+
const t = interpolate6(frame, [start, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1086
|
+
radiusPct = open ? 150 * (1 - t) : 150 * t;
|
|
1087
|
+
}
|
|
1088
|
+
return /* @__PURE__ */ jsx18(Fill, { style: { clipPath: `circle(${radiusPct}% at ${Math.round(c.x * 100)}% ${Math.round(c.y * 100)}%)` }, children: layers.map((child, i) => /* @__PURE__ */ jsx18("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) });
|
|
1089
|
+
};
|
|
1090
|
+
var CircularRevealComponentMetadata = {
|
|
1091
|
+
kind: "composite",
|
|
1092
|
+
category: "transition",
|
|
1093
|
+
acceptsChildren: true,
|
|
1094
|
+
minChildren: 1,
|
|
1095
|
+
description: "Circular iris reveal/hide transition wrapper",
|
|
1096
|
+
llmGuidance: 'direction="open" reveals from center, direction="close" hides to a point. center controls origin.'
|
|
1097
|
+
};
|
|
1098
|
+
|
|
1099
|
+
// src/components/composites/CountUpText.tsx
|
|
1100
|
+
import { interpolate as interpolate7, spring as spring4, useCurrentFrame as useCurrentFrame8, useVideoConfig as useVideoConfig4 } from "remotion";
|
|
1101
|
+
import { z as z20 } from "zod";
|
|
1102
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
1103
|
+
var CountUpTextPropsSchema = z20.object({
|
|
1104
|
+
from: z20.number().default(0),
|
|
1105
|
+
to: z20.number().default(100),
|
|
1106
|
+
fontSize: z20.number().min(8).max(240).default(72),
|
|
1107
|
+
color: z20.string().default("#FFFFFF"),
|
|
1108
|
+
fontFamily: z20.string().default("Inter"),
|
|
1109
|
+
fontWeight: z20.number().int().min(100).max(900).default(700),
|
|
1110
|
+
position: z20.enum(["top", "center", "bottom"]).default("center"),
|
|
1111
|
+
format: z20.enum(["integer", "decimal", "currency", "percentage"]).default("integer"),
|
|
1112
|
+
decimals: z20.number().int().min(0).max(4).default(0),
|
|
1113
|
+
prefix: z20.string().optional(),
|
|
1114
|
+
suffix: z20.string().optional()
|
|
1115
|
+
});
|
|
1116
|
+
var positionStyles = (position) => {
|
|
1117
|
+
if (position === "top") return { justifyContent: "center", alignItems: "flex-start", paddingTop: 90 };
|
|
1118
|
+
if (position === "bottom") return { justifyContent: "center", alignItems: "flex-end", paddingBottom: 90 };
|
|
1119
|
+
return { justifyContent: "center", alignItems: "center" };
|
|
1120
|
+
};
|
|
1121
|
+
function formatValue(v, format, decimals) {
|
|
1122
|
+
if (format === "integer") return Math.round(v).toLocaleString();
|
|
1123
|
+
if (format === "decimal") return v.toFixed(decimals);
|
|
1124
|
+
if (format === "currency") return `$${v.toFixed(decimals).toLocaleString()}`;
|
|
1125
|
+
return `${(v * 100).toFixed(decimals)}%`;
|
|
1126
|
+
}
|
|
1127
|
+
var CountUpText = ({
|
|
1128
|
+
from,
|
|
1129
|
+
to,
|
|
1130
|
+
fontSize,
|
|
1131
|
+
color,
|
|
1132
|
+
fontFamily,
|
|
1133
|
+
fontWeight,
|
|
1134
|
+
position,
|
|
1135
|
+
format,
|
|
1136
|
+
decimals,
|
|
1137
|
+
prefix,
|
|
1138
|
+
suffix,
|
|
1139
|
+
__wavesDurationInFrames
|
|
1140
|
+
}) => {
|
|
1141
|
+
const frame = useCurrentFrame8();
|
|
1142
|
+
const { fps } = useVideoConfig4();
|
|
1143
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1144
|
+
const p = spring4({ frame, fps, config: { damping: 14, stiffness: 110, mass: 0.9 } });
|
|
1145
|
+
const progress = Math.max(0, Math.min(1, p));
|
|
1146
|
+
const value = from + (to - from) * progress;
|
|
1147
|
+
const fade = interpolate7(frame, [0, Math.min(12, total)], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1148
|
+
const label = `${prefix ?? ""}${formatValue(value, format, decimals)}${suffix ?? ""}`;
|
|
1149
|
+
return /* @__PURE__ */ jsx19(Fill, { style: { display: "flex", ...positionStyles(position) }, children: /* @__PURE__ */ jsx19("div", { style: { fontSize, color, fontFamily, fontWeight, opacity: fade, lineHeight: 1 }, children: label }) });
|
|
1150
|
+
};
|
|
1151
|
+
var CountUpTextComponentMetadata = {
|
|
1152
|
+
kind: "composite",
|
|
1153
|
+
category: "text",
|
|
1154
|
+
description: "Counts from a start value to an end value with formatting options",
|
|
1155
|
+
llmGuidance: 'Use for metrics. format="currency" adds $, format="percentage" multiplies by 100 and adds %.'
|
|
1156
|
+
};
|
|
1157
|
+
|
|
1158
|
+
// src/components/composites/FadeTransition.tsx
|
|
1159
|
+
import React6 from "react";
|
|
1160
|
+
import { interpolate as interpolate8, useCurrentFrame as useCurrentFrame9 } from "remotion";
|
|
1161
|
+
import { z as z21 } from "zod";
|
|
1162
|
+
import { jsx as jsx20 } from "react/jsx-runtime";
|
|
1163
|
+
var EasingSchema = z21.enum(["linear", "easeIn", "easeOut", "easeInOut"]);
|
|
1164
|
+
function ease(t, easing) {
|
|
1165
|
+
const x = Math.max(0, Math.min(1, t));
|
|
1166
|
+
if (easing === "linear") return x;
|
|
1167
|
+
if (easing === "easeIn") return x * x;
|
|
1168
|
+
if (easing === "easeOut") return 1 - (1 - x) * (1 - x);
|
|
1169
|
+
return x < 0.5 ? 2 * x * x : 1 - 2 * (1 - x) * (1 - x);
|
|
1170
|
+
}
|
|
1171
|
+
var FadeTransitionPropsSchema = z21.object({
|
|
1172
|
+
durationInFrames: z21.number().int().min(10).max(60).default(30),
|
|
1173
|
+
easing: EasingSchema.default("easeInOut"),
|
|
1174
|
+
phase: z21.enum(["in", "out", "inOut"]).default("inOut")
|
|
1175
|
+
});
|
|
1176
|
+
var FadeTransition = ({
|
|
1177
|
+
durationInFrames,
|
|
1178
|
+
easing,
|
|
1179
|
+
phase,
|
|
1180
|
+
children,
|
|
1181
|
+
__wavesDurationInFrames
|
|
1182
|
+
}) => {
|
|
1183
|
+
const layers = React6.Children.toArray(children);
|
|
1184
|
+
const frame = useCurrentFrame9();
|
|
1185
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1186
|
+
const d = Math.min(durationInFrames, total);
|
|
1187
|
+
let opacity = 1;
|
|
1188
|
+
if (phase === "in" || phase === "inOut") {
|
|
1189
|
+
const t = interpolate8(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1190
|
+
opacity *= ease(t, easing);
|
|
1191
|
+
}
|
|
1192
|
+
if (phase === "out" || phase === "inOut") {
|
|
1193
|
+
const start = Math.max(0, total - d);
|
|
1194
|
+
const t = interpolate8(frame, [start, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1195
|
+
opacity *= 1 - ease(t, easing);
|
|
1196
|
+
}
|
|
1197
|
+
return /* @__PURE__ */ jsx20(Fill, { style: { opacity }, children: layers.map((child, i) => /* @__PURE__ */ jsx20("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) });
|
|
1198
|
+
};
|
|
1199
|
+
var FadeTransitionComponentMetadata = {
|
|
1200
|
+
kind: "composite",
|
|
1201
|
+
category: "transition",
|
|
1202
|
+
acceptsChildren: true,
|
|
1203
|
+
minChildren: 1,
|
|
1204
|
+
description: "Fade in/out wrapper (used for segment transitions and overlays)",
|
|
1205
|
+
llmGuidance: "Use for gentle transitions. durationInFrames ~30 is standard."
|
|
1206
|
+
};
|
|
1207
|
+
|
|
1208
|
+
// src/components/composites/GlitchText.tsx
|
|
1209
|
+
import { useCurrentFrame as useCurrentFrame10 } from "remotion";
|
|
1210
|
+
import { z as z22 } from "zod";
|
|
1211
|
+
import { jsx as jsx21, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1212
|
+
var GlitchTextPropsSchema = z22.object({
|
|
1213
|
+
content: z22.string().max(100),
|
|
1214
|
+
fontSize: z22.number().min(8).max(240).default(72),
|
|
1215
|
+
color: z22.string().default("#FFFFFF"),
|
|
1216
|
+
fontFamily: z22.string().default("monospace"),
|
|
1217
|
+
position: z22.enum(["top", "center", "bottom"]).default("center"),
|
|
1218
|
+
intensity: z22.number().int().min(1).max(10).default(5),
|
|
1219
|
+
glitchDuration: z22.number().int().min(5).max(30).default(10)
|
|
1220
|
+
});
|
|
1221
|
+
var positionStyles2 = (position) => {
|
|
1222
|
+
if (position === "top") return { justifyContent: "center", alignItems: "flex-start", paddingTop: 90 };
|
|
1223
|
+
if (position === "bottom") return { justifyContent: "center", alignItems: "flex-end", paddingBottom: 90 };
|
|
1224
|
+
return { justifyContent: "center", alignItems: "center" };
|
|
1225
|
+
};
|
|
1226
|
+
function pseudoRandom(n) {
|
|
1227
|
+
const x = Math.sin(n * 12.9898) * 43758.5453;
|
|
1228
|
+
return x - Math.floor(x);
|
|
1229
|
+
}
|
|
1230
|
+
var GlitchText = ({
|
|
1231
|
+
content,
|
|
1232
|
+
fontSize,
|
|
1233
|
+
color,
|
|
1234
|
+
fontFamily,
|
|
1235
|
+
position,
|
|
1236
|
+
intensity,
|
|
1237
|
+
glitchDuration
|
|
1238
|
+
}) => {
|
|
1239
|
+
const frame = useCurrentFrame10();
|
|
1240
|
+
const active = frame < glitchDuration;
|
|
1241
|
+
const seed = frame + 1;
|
|
1242
|
+
const jitter = active ? (pseudoRandom(seed) - 0.5) * intensity * 6 : 0;
|
|
1243
|
+
const jitterY = active ? (pseudoRandom(seed + 99) - 0.5) * intensity * 3 : 0;
|
|
1244
|
+
const baseStyle = {
|
|
1245
|
+
position: "absolute",
|
|
1246
|
+
fontSize,
|
|
1247
|
+
fontFamily,
|
|
1248
|
+
fontWeight: 800,
|
|
1249
|
+
letterSpacing: 1,
|
|
1250
|
+
textTransform: "uppercase",
|
|
1251
|
+
textAlign: "center"
|
|
1252
|
+
};
|
|
1253
|
+
return /* @__PURE__ */ jsx21(Fill, { style: { display: "flex", ...positionStyles2(position) }, children: /* @__PURE__ */ jsxs5("div", { style: { position: "relative" }, children: [
|
|
1254
|
+
/* @__PURE__ */ jsx21("div", { style: { ...baseStyle, color, transform: `translate(${jitter}px, ${jitterY}px)` }, children: content }),
|
|
1255
|
+
/* @__PURE__ */ jsx21("div", { style: { ...baseStyle, color: "#FF3B30", transform: `translate(${jitter + 4}px, ${jitterY}px)`, mixBlendMode: "screen", opacity: active ? 0.9 : 0 }, children: content }),
|
|
1256
|
+
/* @__PURE__ */ jsx21("div", { style: { ...baseStyle, color: "#0A84FF", transform: `translate(${jitter - 4}px, ${jitterY}px)`, mixBlendMode: "screen", opacity: active ? 0.9 : 0 }, children: content })
|
|
1257
|
+
] }) });
|
|
1258
|
+
};
|
|
1259
|
+
var GlitchTextComponentMetadata = {
|
|
1260
|
+
kind: "composite",
|
|
1261
|
+
category: "text",
|
|
1262
|
+
description: "Cyberpunk-style glitch text with RGB split jitter",
|
|
1263
|
+
llmGuidance: "Use for tech/error moments. intensity 1-3 subtle, 7-10 extreme. glitchDuration is frames at start."
|
|
1264
|
+
};
|
|
1265
|
+
|
|
1266
|
+
// src/components/composites/GridLayout.tsx
|
|
1267
|
+
import { z as z23 } from "zod";
|
|
1268
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
1269
|
+
var GridLayoutPropsSchema = z23.object({
|
|
1270
|
+
columns: z23.number().int().min(1).max(4).default(2),
|
|
1271
|
+
rows: z23.number().int().min(1).max(4).default(2),
|
|
1272
|
+
gap: z23.number().min(0).max(50).default(20),
|
|
1273
|
+
padding: z23.number().min(0).max(100).default(40)
|
|
1274
|
+
});
|
|
1275
|
+
var GridLayout = ({ columns, rows, gap, padding, children }) => {
|
|
1276
|
+
return /* @__PURE__ */ jsx22(Fill, { style: { padding, boxSizing: "border-box" }, children: /* @__PURE__ */ jsx22(
|
|
1277
|
+
"div",
|
|
1278
|
+
{
|
|
1279
|
+
style: {
|
|
1280
|
+
display: "grid",
|
|
1281
|
+
gridTemplateColumns: `repeat(${columns}, 1fr)`,
|
|
1282
|
+
gridTemplateRows: `repeat(${rows}, 1fr)`,
|
|
1283
|
+
gap,
|
|
1284
|
+
width: "100%",
|
|
1285
|
+
height: "100%"
|
|
1286
|
+
},
|
|
1287
|
+
children
|
|
1288
|
+
}
|
|
1289
|
+
) });
|
|
1290
|
+
};
|
|
1291
|
+
var GridLayoutComponentMetadata = {
|
|
1292
|
+
kind: "composite",
|
|
1293
|
+
category: "layout",
|
|
1294
|
+
acceptsChildren: true,
|
|
1295
|
+
minChildren: 1,
|
|
1296
|
+
description: "Simple responsive grid layout for child components",
|
|
1297
|
+
llmGuidance: "Use for dashboards and collages. 2x2 is a good default for 4 items."
|
|
1298
|
+
};
|
|
1299
|
+
|
|
1300
|
+
// src/components/composites/ImageCollage.tsx
|
|
1301
|
+
import { Img as Img3, spring as spring5, staticFile as staticFile5, useCurrentFrame as useCurrentFrame11, useVideoConfig as useVideoConfig5 } from "remotion";
|
|
1302
|
+
import { z as z24 } from "zod";
|
|
1303
|
+
import { jsx as jsx23, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1304
|
+
var ImageCollagePropsSchema = z24.object({
|
|
1305
|
+
images: z24.array(z24.object({ src: z24.string().min(1), caption: z24.string().optional() })).min(2).max(9),
|
|
1306
|
+
layout: z24.enum(["grid", "stack", "scatter"]).default("grid"),
|
|
1307
|
+
stagger: z24.number().int().min(2).max(10).default(5)
|
|
1308
|
+
});
|
|
1309
|
+
var resolveAsset4 = (value) => isRemoteAssetPath(value) ? value : staticFile5(staticFileInputFromAssetPath(value));
|
|
1310
|
+
var ImageCollage = ({ images, layout, stagger }) => {
|
|
1311
|
+
const frame = useCurrentFrame11();
|
|
1312
|
+
const { fps } = useVideoConfig5();
|
|
1313
|
+
const n = images.length;
|
|
1314
|
+
const cols = Math.ceil(Math.sqrt(n));
|
|
1315
|
+
const rows = Math.ceil(n / cols);
|
|
1316
|
+
if (layout === "grid") {
|
|
1317
|
+
return /* @__PURE__ */ jsx23(Fill, { style: { padding: 80, boxSizing: "border-box" }, children: /* @__PURE__ */ jsx23(
|
|
1318
|
+
"div",
|
|
1319
|
+
{
|
|
1320
|
+
style: {
|
|
1321
|
+
display: "grid",
|
|
1322
|
+
gridTemplateColumns: `repeat(${cols}, 1fr)`,
|
|
1323
|
+
gridTemplateRows: `repeat(${rows}, 1fr)`,
|
|
1324
|
+
gap: 24,
|
|
1325
|
+
width: "100%",
|
|
1326
|
+
height: "100%"
|
|
1327
|
+
},
|
|
1328
|
+
children: images.map((img, i) => {
|
|
1329
|
+
const p = spring5({ frame: frame - i * stagger, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1330
|
+
return /* @__PURE__ */ jsxs6("div", { style: { position: "relative", overflow: "hidden", borderRadius: 18, opacity: p, transform: `scale(${0.92 + 0.08 * p})` }, children: [
|
|
1331
|
+
/* @__PURE__ */ jsx23(Img3, { src: resolveAsset4(img.src), style: { width: "100%", height: "100%", objectFit: "cover" } }),
|
|
1332
|
+
img.caption ? /* @__PURE__ */ jsx23("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, padding: 12, background: "linear-gradient(transparent, rgba(0,0,0,0.7))", color: "#fff", fontWeight: 700 }, children: img.caption }) : null
|
|
1333
|
+
] }, i);
|
|
1334
|
+
})
|
|
1335
|
+
}
|
|
1336
|
+
) });
|
|
1337
|
+
}
|
|
1338
|
+
return /* @__PURE__ */ jsx23(Fill, { children: images.map((img, i) => {
|
|
1339
|
+
const p = spring5({ frame: frame - i * stagger, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1340
|
+
const baseRotate = layout === "stack" ? (i - (n - 1) / 2) * 4 : i * 17 % 20 - 10;
|
|
1341
|
+
const baseX = layout === "scatter" ? i * 137 % 300 - 150 : 0;
|
|
1342
|
+
const baseY = layout === "scatter" ? (i + 3) * 89 % 200 - 100 : 0;
|
|
1343
|
+
return /* @__PURE__ */ jsx23(
|
|
1344
|
+
"div",
|
|
1345
|
+
{
|
|
1346
|
+
style: {
|
|
1347
|
+
position: "absolute",
|
|
1348
|
+
left: "50%",
|
|
1349
|
+
top: "50%",
|
|
1350
|
+
width: 520,
|
|
1351
|
+
height: 360,
|
|
1352
|
+
transform: `translate(-50%, -50%) translate(${baseX}px, ${baseY}px) rotate(${baseRotate}deg) scale(${0.85 + 0.15 * p})`,
|
|
1353
|
+
opacity: p,
|
|
1354
|
+
borderRadius: 18,
|
|
1355
|
+
overflow: "hidden",
|
|
1356
|
+
boxShadow: "0 20px 60px rgba(0,0,0,0.35)"
|
|
1357
|
+
},
|
|
1358
|
+
children: /* @__PURE__ */ jsx23(Img3, { src: resolveAsset4(img.src), style: { width: "100%", height: "100%", objectFit: "cover" } })
|
|
1359
|
+
},
|
|
1360
|
+
i
|
|
1361
|
+
);
|
|
1362
|
+
}) });
|
|
1363
|
+
};
|
|
1364
|
+
var ImageCollageComponentMetadata = {
|
|
1365
|
+
kind: "composite",
|
|
1366
|
+
category: "image",
|
|
1367
|
+
description: "Collage of multiple images in a grid/stack/scatter layout with staggered entrances",
|
|
1368
|
+
llmGuidance: 'Use 2-6 images for best results. layout="grid" is clean; "scatter" is energetic.'
|
|
1369
|
+
};
|
|
1370
|
+
|
|
1371
|
+
// src/components/composites/ImageReveal.tsx
|
|
1372
|
+
import { Img as Img4, interpolate as interpolate9, staticFile as staticFile6, useCurrentFrame as useCurrentFrame12 } from "remotion";
|
|
1373
|
+
import { z as z25 } from "zod";
|
|
1374
|
+
import { jsx as jsx24 } from "react/jsx-runtime";
|
|
1375
|
+
var ImageRevealPropsSchema = z25.object({
|
|
1376
|
+
src: z25.string().min(1),
|
|
1377
|
+
direction: z25.enum(["left", "right", "top", "bottom", "center"]).default("left"),
|
|
1378
|
+
revealType: z25.enum(["wipe", "expand", "iris"]).default("wipe")
|
|
1379
|
+
});
|
|
1380
|
+
var resolveAsset5 = (value) => isRemoteAssetPath(value) ? value : staticFile6(staticFileInputFromAssetPath(value));
|
|
1381
|
+
var ImageReveal = ({ src, direction, revealType, __wavesDurationInFrames }) => {
|
|
1382
|
+
const frame = useCurrentFrame12();
|
|
1383
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1384
|
+
const d = Math.min(30, total);
|
|
1385
|
+
const p = interpolate9(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1386
|
+
let clipPath;
|
|
1387
|
+
let transform = "none";
|
|
1388
|
+
let transformOrigin = "center center";
|
|
1389
|
+
if (revealType === "wipe") {
|
|
1390
|
+
if (direction === "left") clipPath = `inset(0 ${100 * (1 - p)}% 0 0)`;
|
|
1391
|
+
if (direction === "right") clipPath = `inset(0 0 0 ${100 * (1 - p)}%)`;
|
|
1392
|
+
if (direction === "top") clipPath = `inset(0 0 ${100 * (1 - p)}% 0)`;
|
|
1393
|
+
if (direction === "bottom") clipPath = `inset(${100 * (1 - p)}% 0 0 0)`;
|
|
1394
|
+
if (direction === "center") clipPath = `inset(${50 * (1 - p)}% ${50 * (1 - p)}% ${50 * (1 - p)}% ${50 * (1 - p)}%)`;
|
|
1395
|
+
}
|
|
1396
|
+
if (revealType === "expand") {
|
|
1397
|
+
const s = 0.85 + 0.15 * p;
|
|
1398
|
+
transform = `scale(${s})`;
|
|
1399
|
+
if (direction === "left") transformOrigin = "left center";
|
|
1400
|
+
if (direction === "right") transformOrigin = "right center";
|
|
1401
|
+
if (direction === "top") transformOrigin = "center top";
|
|
1402
|
+
if (direction === "bottom") transformOrigin = "center bottom";
|
|
1403
|
+
}
|
|
1404
|
+
if (revealType === "iris") {
|
|
1405
|
+
clipPath = `circle(${Math.round(150 * p)}% at 50% 50%)`;
|
|
1406
|
+
}
|
|
1407
|
+
const opacity = revealType === "expand" ? p : 1;
|
|
1408
|
+
return /* @__PURE__ */ jsx24(Fill, { children: /* @__PURE__ */ jsx24(
|
|
1409
|
+
Img4,
|
|
1410
|
+
{
|
|
1411
|
+
src: resolveAsset5(src),
|
|
1412
|
+
style: {
|
|
1413
|
+
width: "100%",
|
|
1414
|
+
height: "100%",
|
|
1415
|
+
objectFit: "cover",
|
|
1416
|
+
clipPath,
|
|
1417
|
+
transform,
|
|
1418
|
+
transformOrigin,
|
|
1419
|
+
opacity
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
) });
|
|
1423
|
+
};
|
|
1424
|
+
var ImageRevealComponentMetadata = {
|
|
1425
|
+
kind: "composite",
|
|
1426
|
+
category: "image",
|
|
1427
|
+
description: "Reveals an image with wipe/expand/iris entrance effects",
|
|
1428
|
+
llmGuidance: "Use wipe for directional reveals, expand for subtle pop-in, iris for circular mask openings."
|
|
1429
|
+
};
|
|
1430
|
+
|
|
1431
|
+
// src/components/composites/ImageSequence.tsx
|
|
1432
|
+
import { Img as Img5, staticFile as staticFile7, useCurrentFrame as useCurrentFrame13, useVideoConfig as useVideoConfig6 } from "remotion";
|
|
1433
|
+
import { z as z26 } from "zod";
|
|
1434
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
1435
|
+
var ImageSequencePropsSchema = z26.object({
|
|
1436
|
+
basePath: z26.string().min(1),
|
|
1437
|
+
frameCount: z26.number().int().positive(),
|
|
1438
|
+
filePattern: z26.string().default("frame_{frame}.png"),
|
|
1439
|
+
fps: z26.number().int().min(1).max(120).default(30)
|
|
1440
|
+
});
|
|
1441
|
+
function joinPath(base, file) {
|
|
1442
|
+
if (base.endsWith("/")) return `${base}${file}`;
|
|
1443
|
+
return `${base}/${file}`;
|
|
1444
|
+
}
|
|
1445
|
+
var resolveAsset6 = (value) => isRemoteAssetPath(value) ? value : staticFile7(staticFileInputFromAssetPath(value));
|
|
1446
|
+
var ImageSequence = ({ basePath, frameCount, filePattern, fps }) => {
|
|
1447
|
+
const frame = useCurrentFrame13();
|
|
1448
|
+
const { fps: compFps } = useVideoConfig6();
|
|
1449
|
+
const index = Math.min(frameCount - 1, Math.max(0, Math.floor(frame * fps / compFps)));
|
|
1450
|
+
const file = filePattern.replace("{frame}", String(index));
|
|
1451
|
+
const src = joinPath(basePath, file);
|
|
1452
|
+
return /* @__PURE__ */ jsx25(Fill, { children: /* @__PURE__ */ jsx25(Img5, { src: resolveAsset6(src), style: { width: "100%", height: "100%", objectFit: "cover" } }) });
|
|
1453
|
+
};
|
|
1454
|
+
var ImageSequenceComponentMetadata = {
|
|
1455
|
+
kind: "composite",
|
|
1456
|
+
category: "image",
|
|
1457
|
+
description: "Plays a numbered image sequence (frame-by-frame)",
|
|
1458
|
+
llmGuidance: "Use for exported sprite sequences. basePath can be /assets/seq and filePattern like img_{frame}.png."
|
|
1459
|
+
};
|
|
1460
|
+
|
|
1461
|
+
// src/components/composites/ImageWithCaption.tsx
|
|
1462
|
+
import { Img as Img6, interpolate as interpolate10, staticFile as staticFile8, useCurrentFrame as useCurrentFrame14 } from "remotion";
|
|
1463
|
+
import { z as z27 } from "zod";
|
|
1464
|
+
import { jsx as jsx26, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1465
|
+
var CaptionStyleSchema = z27.object({
|
|
1466
|
+
fontSize: z27.number().min(12).max(80).default(32),
|
|
1467
|
+
color: z27.string().default("#FFFFFF"),
|
|
1468
|
+
backgroundColor: z27.string().default("rgba(0,0,0,0.7)")
|
|
1469
|
+
});
|
|
1470
|
+
var ImageWithCaptionPropsSchema = z27.object({
|
|
1471
|
+
src: z27.string().min(1),
|
|
1472
|
+
caption: z27.string().max(200),
|
|
1473
|
+
captionPosition: z27.enum(["top", "bottom", "overlay"]).default("bottom"),
|
|
1474
|
+
captionStyle: CaptionStyleSchema.optional()
|
|
1475
|
+
});
|
|
1476
|
+
var resolveAsset7 = (value) => isRemoteAssetPath(value) ? value : staticFile8(staticFileInputFromAssetPath(value));
|
|
1477
|
+
var ImageWithCaption = ({ src, caption, captionPosition, captionStyle }) => {
|
|
1478
|
+
const frame = useCurrentFrame14();
|
|
1479
|
+
const p = interpolate10(frame, [8, 24], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1480
|
+
const style = captionStyle ?? { fontSize: 32, color: "#FFFFFF", backgroundColor: "rgba(0,0,0,0.7)" };
|
|
1481
|
+
const captionBox = /* @__PURE__ */ jsx26(
|
|
1482
|
+
"div",
|
|
1483
|
+
{
|
|
1484
|
+
style: {
|
|
1485
|
+
width: "100%",
|
|
1486
|
+
padding: 22,
|
|
1487
|
+
boxSizing: "border-box",
|
|
1488
|
+
backgroundColor: style.backgroundColor,
|
|
1489
|
+
color: style.color,
|
|
1490
|
+
fontWeight: 800,
|
|
1491
|
+
fontSize: style.fontSize,
|
|
1492
|
+
opacity: p
|
|
1493
|
+
},
|
|
1494
|
+
children: caption
|
|
1495
|
+
}
|
|
1496
|
+
);
|
|
1497
|
+
if (captionPosition === "top" || captionPosition === "bottom") {
|
|
1498
|
+
return /* @__PURE__ */ jsxs7(Fill, { style: { display: "flex", flexDirection: "column" }, children: [
|
|
1499
|
+
captionPosition === "top" ? captionBox : null,
|
|
1500
|
+
/* @__PURE__ */ jsx26("div", { style: { flex: 1, position: "relative" }, children: /* @__PURE__ */ jsx26(Img6, { src: resolveAsset7(src), style: { width: "100%", height: "100%", objectFit: "cover" } }) }),
|
|
1501
|
+
captionPosition === "bottom" ? captionBox : null
|
|
1502
|
+
] });
|
|
1503
|
+
}
|
|
1504
|
+
return /* @__PURE__ */ jsxs7(Fill, { children: [
|
|
1505
|
+
/* @__PURE__ */ jsx26(Img6, { src: resolveAsset7(src), style: { width: "100%", height: "100%", objectFit: "cover" } }),
|
|
1506
|
+
/* @__PURE__ */ jsx26("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0 }, children: captionBox })
|
|
1507
|
+
] });
|
|
1508
|
+
};
|
|
1509
|
+
var ImageWithCaptionComponentMetadata = {
|
|
1510
|
+
kind: "composite",
|
|
1511
|
+
category: "image",
|
|
1512
|
+
description: "Image with a caption strip (top/bottom) or overlay caption",
|
|
1513
|
+
llmGuidance: "Use overlay for quotes/testimonials over photos. Use bottom for standard captions."
|
|
1514
|
+
};
|
|
1515
|
+
|
|
1516
|
+
// src/components/composites/InstagramStory.tsx
|
|
1517
|
+
import { Audio as RemotionAudio2, Img as Img7, interpolate as interpolate11, staticFile as staticFile9, useCurrentFrame as useCurrentFrame15 } from "remotion";
|
|
1518
|
+
import { z as z28 } from "zod";
|
|
1519
|
+
import { jsx as jsx27, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1520
|
+
var InstagramStoryPropsSchema = z28.object({
|
|
1521
|
+
backgroundImage: z28.string().optional(),
|
|
1522
|
+
backgroundColor: z28.string().default("#000000"),
|
|
1523
|
+
profilePic: z28.string().optional(),
|
|
1524
|
+
username: z28.string().optional(),
|
|
1525
|
+
text: z28.string().max(100).optional(),
|
|
1526
|
+
sticker: z28.enum(["none", "poll", "question", "countdown"]).default("none"),
|
|
1527
|
+
musicTrack: z28.string().optional()
|
|
1528
|
+
});
|
|
1529
|
+
var resolveAsset8 = (value) => isRemoteAssetPath(value) ? value : staticFile9(staticFileInputFromAssetPath(value));
|
|
1530
|
+
var InstagramStory = ({
|
|
1531
|
+
backgroundImage,
|
|
1532
|
+
backgroundColor,
|
|
1533
|
+
profilePic,
|
|
1534
|
+
username,
|
|
1535
|
+
text,
|
|
1536
|
+
sticker,
|
|
1537
|
+
musicTrack
|
|
1538
|
+
}) => {
|
|
1539
|
+
const frame = useCurrentFrame15();
|
|
1540
|
+
const fade = interpolate11(frame, [0, 20], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1541
|
+
return /* @__PURE__ */ jsxs8(Fill, { style: { backgroundColor }, children: [
|
|
1542
|
+
musicTrack ? /* @__PURE__ */ jsx27(RemotionAudio2, { src: resolveAsset8(musicTrack), volume: 0.6 }) : null,
|
|
1543
|
+
backgroundImage ? /* @__PURE__ */ jsx27(Img7, { src: resolveAsset8(backgroundImage), style: { width: "100%", height: "100%", objectFit: "cover", opacity: fade } }) : null,
|
|
1544
|
+
/* @__PURE__ */ jsxs8(Fill, { style: { padding: 60, boxSizing: "border-box" }, children: [
|
|
1545
|
+
profilePic || username ? /* @__PURE__ */ jsxs8("div", { style: { display: "flex", alignItems: "center", gap: 18 }, children: [
|
|
1546
|
+
profilePic ? /* @__PURE__ */ jsx27(Img7, { src: resolveAsset8(profilePic), style: { width: 78, height: 78, borderRadius: 9999, objectFit: "cover" } }) : /* @__PURE__ */ jsx27("div", { style: { width: 78, height: 78, borderRadius: 9999, backgroundColor: "rgba(255,255,255,0.2)" } }),
|
|
1547
|
+
/* @__PURE__ */ jsx27("div", { style: { color: "#FFFFFF", fontWeight: 800, fontSize: 34 }, children: username ?? "username" })
|
|
1548
|
+
] }) : null,
|
|
1549
|
+
text ? /* @__PURE__ */ jsx27(
|
|
1550
|
+
"div",
|
|
1551
|
+
{
|
|
1552
|
+
style: {
|
|
1553
|
+
marginTop: 120,
|
|
1554
|
+
color: "#FFFFFF",
|
|
1555
|
+
fontSize: 54,
|
|
1556
|
+
fontWeight: 900,
|
|
1557
|
+
textShadow: "0 8px 30px rgba(0,0,0,0.6)",
|
|
1558
|
+
maxWidth: 900
|
|
1559
|
+
},
|
|
1560
|
+
children: text
|
|
1561
|
+
}
|
|
1562
|
+
) : null,
|
|
1563
|
+
sticker !== "none" ? /* @__PURE__ */ jsx27(
|
|
1564
|
+
"div",
|
|
1565
|
+
{
|
|
1566
|
+
style: {
|
|
1567
|
+
position: "absolute",
|
|
1568
|
+
left: 60,
|
|
1569
|
+
bottom: 180,
|
|
1570
|
+
width: 520,
|
|
1571
|
+
padding: 28,
|
|
1572
|
+
borderRadius: 22,
|
|
1573
|
+
backgroundColor: "rgba(255,255,255,0.9)",
|
|
1574
|
+
color: "#111",
|
|
1575
|
+
fontWeight: 900,
|
|
1576
|
+
fontSize: 30
|
|
1577
|
+
},
|
|
1578
|
+
children: sticker === "poll" ? "POLL" : sticker === "question" ? "QUESTION" : "COUNTDOWN"
|
|
1579
|
+
}
|
|
1580
|
+
) : null
|
|
1581
|
+
] })
|
|
1582
|
+
] });
|
|
1583
|
+
};
|
|
1584
|
+
var InstagramStoryComponentMetadata = {
|
|
1585
|
+
kind: "composite",
|
|
1586
|
+
category: "social",
|
|
1587
|
+
description: "Instagram story-style layout with profile header, text overlay, and optional sticker",
|
|
1588
|
+
llmGuidance: "Best with 1080x1920 (9:16). Use backgroundImage + short text + optional sticker for mobile-style content."
|
|
1589
|
+
};
|
|
1590
|
+
|
|
1591
|
+
// src/components/composites/IntroScene.tsx
|
|
1592
|
+
import { Audio as RemotionAudio3, Img as Img8, interpolate as interpolate12, spring as spring6, staticFile as staticFile10, useCurrentFrame as useCurrentFrame16, useVideoConfig as useVideoConfig7 } from "remotion";
|
|
1593
|
+
import { z as z29 } from "zod";
|
|
1594
|
+
import { jsx as jsx28, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1595
|
+
var IntroScenePropsSchema = z29.object({
|
|
1596
|
+
logoSrc: z29.string().min(1),
|
|
1597
|
+
companyName: z29.string().min(1),
|
|
1598
|
+
tagline: z29.string().optional(),
|
|
1599
|
+
backgroundColor: z29.string().default("#000000"),
|
|
1600
|
+
primaryColor: z29.string().default("#FFFFFF"),
|
|
1601
|
+
musicTrack: z29.string().optional()
|
|
1602
|
+
});
|
|
1603
|
+
var resolveAsset9 = (value) => isRemoteAssetPath(value) ? value : staticFile10(staticFileInputFromAssetPath(value));
|
|
1604
|
+
var IntroScene = ({
|
|
1605
|
+
logoSrc,
|
|
1606
|
+
companyName,
|
|
1607
|
+
tagline,
|
|
1608
|
+
backgroundColor,
|
|
1609
|
+
primaryColor,
|
|
1610
|
+
musicTrack,
|
|
1611
|
+
__wavesDurationInFrames
|
|
1612
|
+
}) => {
|
|
1613
|
+
const frame = useCurrentFrame16();
|
|
1614
|
+
const { fps } = useVideoConfig7();
|
|
1615
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1616
|
+
const logoP = spring6({ frame, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1617
|
+
const nameOpacity = interpolate12(frame, [20, 60], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1618
|
+
const taglineY = interpolate12(frame, [50, 80], [20, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1619
|
+
const outroFade = interpolate12(frame, [Math.max(0, total - 20), total], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1620
|
+
return /* @__PURE__ */ jsxs9(Fill, { style: { backgroundColor, display: "flex", justifyContent: "center", alignItems: "center" }, children: [
|
|
1621
|
+
musicTrack ? /* @__PURE__ */ jsx28(RemotionAudio3, { src: resolveAsset9(musicTrack), volume: 0.7 }) : null,
|
|
1622
|
+
/* @__PURE__ */ jsxs9("div", { style: { textAlign: "center", opacity: outroFade }, children: [
|
|
1623
|
+
/* @__PURE__ */ jsx28(
|
|
1624
|
+
Img8,
|
|
1625
|
+
{
|
|
1626
|
+
src: resolveAsset9(logoSrc),
|
|
1627
|
+
style: { width: 280, height: 280, objectFit: "contain", transform: `scale(${logoP})` }
|
|
1628
|
+
}
|
|
1629
|
+
),
|
|
1630
|
+
/* @__PURE__ */ jsx28("div", { style: { marginTop: 24, color: primaryColor, fontSize: 64, fontWeight: 900, opacity: nameOpacity }, children: companyName }),
|
|
1631
|
+
tagline ? /* @__PURE__ */ jsx28(
|
|
1632
|
+
"div",
|
|
1633
|
+
{
|
|
1634
|
+
style: {
|
|
1635
|
+
marginTop: 12,
|
|
1636
|
+
color: primaryColor,
|
|
1637
|
+
fontSize: 32,
|
|
1638
|
+
fontWeight: 700,
|
|
1639
|
+
opacity: nameOpacity,
|
|
1640
|
+
transform: `translateY(${taglineY}px)`
|
|
1641
|
+
},
|
|
1642
|
+
children: tagline
|
|
1643
|
+
}
|
|
1644
|
+
) : null
|
|
1645
|
+
] })
|
|
1646
|
+
] });
|
|
1647
|
+
};
|
|
1648
|
+
var IntroSceneComponentMetadata = {
|
|
1649
|
+
kind: "composite",
|
|
1650
|
+
category: "branding",
|
|
1651
|
+
description: "Branded intro scene (logo + company name + optional tagline)",
|
|
1652
|
+
llmGuidance: "Use as the first segment. Works best at 3-5 seconds. musicTrack can add ambience."
|
|
1653
|
+
};
|
|
1654
|
+
|
|
1655
|
+
// src/components/composites/KenBurnsImage.tsx
|
|
1656
|
+
import { Img as Img9, interpolate as interpolate13, staticFile as staticFile11, useCurrentFrame as useCurrentFrame17 } from "remotion";
|
|
1657
|
+
import { z as z30 } from "zod";
|
|
1658
|
+
import { jsx as jsx29 } from "react/jsx-runtime";
|
|
1659
|
+
var KenBurnsImagePropsSchema = z30.object({
|
|
1660
|
+
src: z30.string().min(1),
|
|
1661
|
+
startScale: z30.number().min(1).max(2).default(1),
|
|
1662
|
+
endScale: z30.number().min(1).max(2).default(1.2),
|
|
1663
|
+
panDirection: z30.enum(["none", "left", "right", "up", "down"]).default("none"),
|
|
1664
|
+
panAmount: z30.number().min(0).max(100).default(50)
|
|
1665
|
+
});
|
|
1666
|
+
var resolveAsset10 = (value) => isRemoteAssetPath(value) ? value : staticFile11(staticFileInputFromAssetPath(value));
|
|
1667
|
+
var KenBurnsImage = ({
|
|
1668
|
+
src,
|
|
1669
|
+
startScale,
|
|
1670
|
+
endScale,
|
|
1671
|
+
panDirection,
|
|
1672
|
+
panAmount,
|
|
1673
|
+
__wavesDurationInFrames
|
|
1674
|
+
}) => {
|
|
1675
|
+
const frame = useCurrentFrame17();
|
|
1676
|
+
const duration = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1677
|
+
const t = interpolate13(frame, [0, duration], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1678
|
+
const scale = startScale + (endScale - startScale) * t;
|
|
1679
|
+
const dx = panDirection === "left" ? -panAmount * t : panDirection === "right" ? panAmount * t : 0;
|
|
1680
|
+
const dy = panDirection === "up" ? -panAmount * t : panDirection === "down" ? panAmount * t : 0;
|
|
1681
|
+
return /* @__PURE__ */ jsx29(Fill, { children: /* @__PURE__ */ jsx29(
|
|
1682
|
+
Img9,
|
|
1683
|
+
{
|
|
1684
|
+
src: resolveAsset10(src),
|
|
1685
|
+
style: {
|
|
1686
|
+
width: "110%",
|
|
1687
|
+
height: "110%",
|
|
1688
|
+
objectFit: "cover",
|
|
1689
|
+
transform: `translate(${dx}px, ${dy}px) scale(${scale})`,
|
|
1690
|
+
transformOrigin: "center center"
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
) });
|
|
1694
|
+
};
|
|
1695
|
+
var KenBurnsImageComponentMetadata = {
|
|
1696
|
+
kind: "composite",
|
|
1697
|
+
category: "image",
|
|
1698
|
+
description: "Slow zoom and pan (Ken Burns effect) for a still image",
|
|
1699
|
+
llmGuidance: "Classic documentary-style motion. startScale 1 -> endScale 1.2 is subtle; add panDirection for extra movement."
|
|
1700
|
+
};
|
|
1701
|
+
|
|
1702
|
+
// src/components/composites/KineticTypography.tsx
|
|
1703
|
+
import { spring as spring7, useCurrentFrame as useCurrentFrame18, useVideoConfig as useVideoConfig8 } from "remotion";
|
|
1704
|
+
import { z as z31 } from "zod";
|
|
1705
|
+
import { jsx as jsx30 } from "react/jsx-runtime";
|
|
1706
|
+
var WordSchema = z31.object({
|
|
1707
|
+
text: z31.string().min(1),
|
|
1708
|
+
emphasis: z31.enum(["normal", "bold", "giant"]).default("normal")
|
|
1709
|
+
});
|
|
1710
|
+
var KineticTypographyPropsSchema = z31.object({
|
|
1711
|
+
words: z31.array(WordSchema).min(1).max(50),
|
|
1712
|
+
fontSize: z31.number().min(12).max(140).default(48),
|
|
1713
|
+
color: z31.string().default("#FFFFFF"),
|
|
1714
|
+
fontFamily: z31.string().default("Inter"),
|
|
1715
|
+
timing: z31.array(z31.number().int().min(0)).min(1).describe("Frame timing for each word"),
|
|
1716
|
+
transition: z31.enum(["fade", "scale", "slideLeft", "slideRight"]).default("scale")
|
|
1717
|
+
});
|
|
1718
|
+
var KineticTypography = ({
|
|
1719
|
+
words,
|
|
1720
|
+
fontSize,
|
|
1721
|
+
color,
|
|
1722
|
+
fontFamily,
|
|
1723
|
+
timing,
|
|
1724
|
+
transition
|
|
1725
|
+
}) => {
|
|
1726
|
+
const frame = useCurrentFrame18();
|
|
1727
|
+
const { fps } = useVideoConfig8();
|
|
1728
|
+
const starts = (() => {
|
|
1729
|
+
if (timing.length >= words.length) return timing.slice(0, words.length);
|
|
1730
|
+
const last = timing.length ? timing[timing.length - 1] : 0;
|
|
1731
|
+
const extra = Array.from({ length: words.length - timing.length }, () => last + 15);
|
|
1732
|
+
return [...timing, ...extra];
|
|
1733
|
+
})();
|
|
1734
|
+
let activeIndex = 0;
|
|
1735
|
+
for (let i = 0; i < words.length; i++) {
|
|
1736
|
+
if (frame >= (starts[i] ?? 0)) activeIndex = i;
|
|
1737
|
+
}
|
|
1738
|
+
const word = words[activeIndex];
|
|
1739
|
+
const start = starts[activeIndex] ?? 0;
|
|
1740
|
+
const p = spring7({ frame: frame - start, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1741
|
+
const progress = Math.max(0, Math.min(1, p));
|
|
1742
|
+
const scaleBase = word.emphasis === "giant" ? 2 : word.emphasis === "bold" ? 1.3 : 1;
|
|
1743
|
+
const opacity = transition === "fade" ? progress : 1;
|
|
1744
|
+
const scale = transition === "scale" ? (0.85 + 0.15 * progress) * scaleBase : 1 * scaleBase;
|
|
1745
|
+
const tx = transition === "slideLeft" ? 40 * (1 - progress) : transition === "slideRight" ? -40 * (1 - progress) : 0;
|
|
1746
|
+
return /* @__PURE__ */ jsx30(Fill, { style: { display: "flex", justifyContent: "center", alignItems: "center" }, children: /* @__PURE__ */ jsx30(
|
|
1747
|
+
"div",
|
|
1748
|
+
{
|
|
1749
|
+
style: {
|
|
1750
|
+
fontSize,
|
|
1751
|
+
color,
|
|
1752
|
+
fontFamily,
|
|
1753
|
+
fontWeight: word.emphasis === "normal" ? 800 : 900,
|
|
1754
|
+
textTransform: "uppercase",
|
|
1755
|
+
letterSpacing: 1,
|
|
1756
|
+
opacity,
|
|
1757
|
+
transform: `translateX(${tx}px) scale(${scale})`
|
|
1758
|
+
},
|
|
1759
|
+
children: word.text
|
|
1760
|
+
}
|
|
1761
|
+
) });
|
|
1762
|
+
};
|
|
1763
|
+
var KineticTypographyComponentMetadata = {
|
|
1764
|
+
kind: "composite",
|
|
1765
|
+
category: "text",
|
|
1766
|
+
description: "Rhythmic single-word kinetic typography driven by a timing array",
|
|
1767
|
+
llmGuidance: 'Provide timing frames for when each word appears. Use emphasis="giant" sparingly for impact.'
|
|
1768
|
+
};
|
|
1769
|
+
|
|
1770
|
+
// src/components/composites/LineGraph.tsx
|
|
1771
|
+
import { interpolate as interpolate14, useCurrentFrame as useCurrentFrame19 } from "remotion";
|
|
1772
|
+
import { z as z32 } from "zod";
|
|
1773
|
+
import { jsx as jsx31, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1774
|
+
var PointSchema = z32.object({ x: z32.number(), y: z32.number() });
|
|
1775
|
+
var LineGraphPropsSchema = z32.object({
|
|
1776
|
+
data: z32.array(PointSchema).min(2).max(50),
|
|
1777
|
+
color: z32.string().default("#00FF00"),
|
|
1778
|
+
strokeWidth: z32.number().min(1).max(10).default(3),
|
|
1779
|
+
showDots: z32.boolean().default(true),
|
|
1780
|
+
fillArea: z32.boolean().default(false),
|
|
1781
|
+
animate: z32.enum(["draw", "reveal"]).default("draw")
|
|
1782
|
+
});
|
|
1783
|
+
function normalize(data, w, h, pad) {
|
|
1784
|
+
const xs = data.map((d) => d.x);
|
|
1785
|
+
const ys = data.map((d) => d.y);
|
|
1786
|
+
const minX = Math.min(...xs);
|
|
1787
|
+
const maxX = Math.max(...xs);
|
|
1788
|
+
const minY = Math.min(...ys);
|
|
1789
|
+
const maxY = Math.max(...ys);
|
|
1790
|
+
return data.map((d) => ({
|
|
1791
|
+
x: pad + (maxX === minX ? (w - 2 * pad) / 2 : (d.x - minX) / (maxX - minX) * (w - 2 * pad)),
|
|
1792
|
+
y: pad + (maxY === minY ? (h - 2 * pad) / 2 : (1 - (d.y - minY) / (maxY - minY)) * (h - 2 * pad))
|
|
1793
|
+
}));
|
|
1794
|
+
}
|
|
1795
|
+
function toPath(points) {
|
|
1796
|
+
return points.reduce((acc, p, i) => i === 0 ? `M ${p.x} ${p.y}` : `${acc} L ${p.x} ${p.y}`, "");
|
|
1797
|
+
}
|
|
1798
|
+
var LineGraph = ({
|
|
1799
|
+
data,
|
|
1800
|
+
color,
|
|
1801
|
+
strokeWidth,
|
|
1802
|
+
showDots,
|
|
1803
|
+
fillArea,
|
|
1804
|
+
animate,
|
|
1805
|
+
__wavesDurationInFrames
|
|
1806
|
+
}) => {
|
|
1807
|
+
const frame = useCurrentFrame19();
|
|
1808
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
1809
|
+
const progress = interpolate14(frame, [0, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1810
|
+
const w = 1e3;
|
|
1811
|
+
const h = 520;
|
|
1812
|
+
const pad = 30;
|
|
1813
|
+
const pts = normalize(data, w, h, pad);
|
|
1814
|
+
const d = toPath(pts);
|
|
1815
|
+
const dash = 3e3;
|
|
1816
|
+
const dashOffset = dash * (1 - progress);
|
|
1817
|
+
return /* @__PURE__ */ jsx31(Fill, { style: { display: "flex", justifyContent: "center", alignItems: "center" }, children: /* @__PURE__ */ jsxs10("svg", { viewBox: `0 0 ${w} ${h}`, style: { width: "100%", height: "100%" }, children: [
|
|
1818
|
+
/* @__PURE__ */ jsx31("defs", { children: /* @__PURE__ */ jsx31("clipPath", { id: "waves-line-reveal", children: /* @__PURE__ */ jsx31("rect", { x: "0", y: "0", width: w * progress, height: h }) }) }),
|
|
1819
|
+
fillArea ? /* @__PURE__ */ jsx31(
|
|
1820
|
+
"path",
|
|
1821
|
+
{
|
|
1822
|
+
d: `${d} L ${pts[pts.length - 1].x} ${h - pad} L ${pts[0].x} ${h - pad} Z`,
|
|
1823
|
+
fill: color,
|
|
1824
|
+
opacity: 0.12,
|
|
1825
|
+
clipPath: animate === "reveal" ? "url(#waves-line-reveal)" : void 0
|
|
1826
|
+
}
|
|
1827
|
+
) : null,
|
|
1828
|
+
/* @__PURE__ */ jsx31(
|
|
1829
|
+
"path",
|
|
1830
|
+
{
|
|
1831
|
+
d,
|
|
1832
|
+
fill: "none",
|
|
1833
|
+
stroke: color,
|
|
1834
|
+
strokeWidth,
|
|
1835
|
+
strokeLinecap: "round",
|
|
1836
|
+
strokeLinejoin: "round",
|
|
1837
|
+
strokeDasharray: animate === "draw" ? dash : void 0,
|
|
1838
|
+
strokeDashoffset: animate === "draw" ? dashOffset : void 0,
|
|
1839
|
+
clipPath: animate === "reveal" ? "url(#waves-line-reveal)" : void 0
|
|
1840
|
+
}
|
|
1841
|
+
),
|
|
1842
|
+
showDots ? /* @__PURE__ */ jsx31("g", { clipPath: animate === "reveal" ? "url(#waves-line-reveal)" : void 0, children: pts.map((p, i) => /* @__PURE__ */ jsx31("circle", { cx: p.x, cy: p.y, r: 6, fill: color }, i)) }) : null
|
|
1843
|
+
] }) });
|
|
1844
|
+
};
|
|
1845
|
+
var LineGraphComponentMetadata = {
|
|
1846
|
+
kind: "composite",
|
|
1847
|
+
category: "data",
|
|
1848
|
+
description: "Animated line graph (SVG) with draw/reveal modes",
|
|
1849
|
+
llmGuidance: 'Use 5-20 points. animate="draw" traces the line; animate="reveal" wipes it left-to-right.'
|
|
1850
|
+
};
|
|
1851
|
+
|
|
1852
|
+
// src/components/composites/LogoReveal.tsx
|
|
1853
|
+
import { Audio as RemotionAudio4, Img as Img10, spring as spring8, staticFile as staticFile12, useCurrentFrame as useCurrentFrame20, useVideoConfig as useVideoConfig9 } from "remotion";
|
|
1854
|
+
import { z as z33 } from "zod";
|
|
1855
|
+
import { jsx as jsx32, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1856
|
+
var LogoRevealPropsSchema = z33.object({
|
|
1857
|
+
logoSrc: z33.string().min(1),
|
|
1858
|
+
effect: z33.enum(["fade", "scale", "rotate", "slide"]).default("scale"),
|
|
1859
|
+
backgroundColor: z33.string().default("#000000"),
|
|
1860
|
+
soundEffect: z33.string().optional()
|
|
1861
|
+
});
|
|
1862
|
+
var resolveAsset11 = (value) => isRemoteAssetPath(value) ? value : staticFile12(staticFileInputFromAssetPath(value));
|
|
1863
|
+
var LogoReveal = ({ logoSrc, effect, backgroundColor, soundEffect }) => {
|
|
1864
|
+
const frame = useCurrentFrame20();
|
|
1865
|
+
const { fps } = useVideoConfig9();
|
|
1866
|
+
const p = spring8({ frame, fps, config: { damping: 14, stiffness: 110, mass: 0.9 } });
|
|
1867
|
+
const opacity = effect === "fade" ? p : Math.min(1, Math.max(0, p));
|
|
1868
|
+
const scale = effect === "scale" ? p : 1;
|
|
1869
|
+
const rotate = effect === "rotate" ? (1 - p) * 360 : 0;
|
|
1870
|
+
const translateY = effect === "slide" ? -200 * (1 - p) : 0;
|
|
1871
|
+
return /* @__PURE__ */ jsxs11(Fill, { style: { backgroundColor, display: "flex", justifyContent: "center", alignItems: "center" }, children: [
|
|
1872
|
+
soundEffect ? /* @__PURE__ */ jsx32(RemotionAudio4, { src: resolveAsset11(soundEffect), volume: 1 }) : null,
|
|
1873
|
+
/* @__PURE__ */ jsx32(
|
|
1874
|
+
Img10,
|
|
1875
|
+
{
|
|
1876
|
+
src: resolveAsset11(logoSrc),
|
|
1877
|
+
style: {
|
|
1878
|
+
width: 320,
|
|
1879
|
+
height: 320,
|
|
1880
|
+
objectFit: "contain",
|
|
1881
|
+
opacity,
|
|
1882
|
+
transform: `translateY(${translateY}px) scale(${scale}) rotate(${rotate}deg)`
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
)
|
|
1886
|
+
] });
|
|
1887
|
+
};
|
|
1888
|
+
var LogoRevealComponentMetadata = {
|
|
1889
|
+
kind: "composite",
|
|
1890
|
+
category: "branding",
|
|
1891
|
+
description: "Logo intro animation (fade/scale/rotate/slide), optionally with a sound effect",
|
|
1892
|
+
llmGuidance: "Use for intros/outros. Keep the logo high-contrast and centered. soundEffect can be a short sting."
|
|
1893
|
+
};
|
|
1894
|
+
|
|
1895
|
+
// src/components/composites/OutroScene.tsx
|
|
1896
|
+
import { Img as Img11, spring as spring9, staticFile as staticFile13, useCurrentFrame as useCurrentFrame21, useVideoConfig as useVideoConfig10 } from "remotion";
|
|
1897
|
+
import { z as z34 } from "zod";
|
|
1898
|
+
import { jsx as jsx33, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1899
|
+
var CtaSchema = z34.object({ text: z34.string().min(1), icon: z34.string().optional() });
|
|
1900
|
+
var HandleSchema = z34.object({
|
|
1901
|
+
platform: z34.enum(["twitter", "instagram", "youtube", "linkedin"]),
|
|
1902
|
+
handle: z34.string().min(1)
|
|
1903
|
+
});
|
|
1904
|
+
var OutroScenePropsSchema = z34.object({
|
|
1905
|
+
logoSrc: z34.string().min(1),
|
|
1906
|
+
message: z34.string().default("Thank You"),
|
|
1907
|
+
ctaButtons: z34.array(CtaSchema).max(3).optional(),
|
|
1908
|
+
socialHandles: z34.array(HandleSchema).max(4).optional(),
|
|
1909
|
+
backgroundColor: z34.string().default("#000000")
|
|
1910
|
+
});
|
|
1911
|
+
var resolveAsset12 = (value) => isRemoteAssetPath(value) ? value : staticFile13(staticFileInputFromAssetPath(value));
|
|
1912
|
+
var OutroScene = ({ logoSrc, message, ctaButtons, socialHandles, backgroundColor }) => {
|
|
1913
|
+
const frame = useCurrentFrame21();
|
|
1914
|
+
const { fps } = useVideoConfig10();
|
|
1915
|
+
const logoP = spring9({ frame, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1916
|
+
const msgP = spring9({ frame: frame - 18, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1917
|
+
const ctaP = spring9({ frame: frame - 40, fps, config: { damping: 14, stiffness: 120, mass: 0.9 } });
|
|
1918
|
+
return /* @__PURE__ */ jsx33(Fill, { style: { backgroundColor, display: "flex", justifyContent: "center", alignItems: "center", padding: 80, boxSizing: "border-box" }, children: /* @__PURE__ */ jsxs12("div", { style: { textAlign: "center" }, children: [
|
|
1919
|
+
/* @__PURE__ */ jsx33(Img11, { src: resolveAsset12(logoSrc), style: { width: 220, height: 220, objectFit: "contain", transform: `scale(${logoP})` } }),
|
|
1920
|
+
/* @__PURE__ */ jsx33("div", { style: { marginTop: 24, color: "#FFFFFF", fontSize: 72, fontWeight: 1e3, opacity: msgP }, children: message }),
|
|
1921
|
+
ctaButtons?.length ? /* @__PURE__ */ jsx33("div", { style: { marginTop: 34, display: "flex", gap: 18, justifyContent: "center", opacity: ctaP }, children: ctaButtons.map((b, i) => /* @__PURE__ */ jsxs12(
|
|
1922
|
+
"div",
|
|
1923
|
+
{
|
|
1924
|
+
style: {
|
|
1925
|
+
padding: "18px 28px",
|
|
1926
|
+
borderRadius: 18,
|
|
1927
|
+
backgroundColor: "rgba(255,255,255,0.12)",
|
|
1928
|
+
color: "#FFFFFF",
|
|
1929
|
+
fontSize: 28,
|
|
1930
|
+
fontWeight: 900
|
|
1931
|
+
},
|
|
1932
|
+
children: [
|
|
1933
|
+
b.icon ? `${b.icon} ` : "",
|
|
1934
|
+
b.text
|
|
1935
|
+
]
|
|
1936
|
+
},
|
|
1937
|
+
i
|
|
1938
|
+
)) }) : null,
|
|
1939
|
+
socialHandles?.length ? /* @__PURE__ */ jsx33("div", { style: { marginTop: 50, display: "flex", flexDirection: "column", gap: 10, opacity: ctaP }, children: socialHandles.map((h, i) => /* @__PURE__ */ jsxs12("div", { style: { color: "rgba(255,255,255,0.85)", fontSize: 26, fontWeight: 800 }, children: [
|
|
1940
|
+
h.platform,
|
|
1941
|
+
": ",
|
|
1942
|
+
h.handle
|
|
1943
|
+
] }, i)) }) : null
|
|
1944
|
+
] }) });
|
|
1945
|
+
};
|
|
1946
|
+
var OutroSceneComponentMetadata = {
|
|
1947
|
+
kind: "composite",
|
|
1948
|
+
category: "branding",
|
|
1949
|
+
description: "End screen with logo, message, optional CTA buttons and social handles",
|
|
1950
|
+
llmGuidance: "Use as the last segment. Keep CTAs <=3 for clarity."
|
|
1951
|
+
};
|
|
1952
|
+
|
|
1953
|
+
// src/components/composites/OutlineText.tsx
|
|
1954
|
+
import { interpolate as interpolate15, useCurrentFrame as useCurrentFrame22 } from "remotion";
|
|
1955
|
+
import { z as z35 } from "zod";
|
|
1956
|
+
import { jsx as jsx34, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1957
|
+
var OutlineTextPropsSchema = z35.object({
|
|
1958
|
+
content: z35.string().max(50),
|
|
1959
|
+
fontSize: z35.number().min(8).max(240).default(96),
|
|
1960
|
+
outlineColor: z35.string().default("#FFFFFF"),
|
|
1961
|
+
fillColor: z35.string().default("#000000"),
|
|
1962
|
+
fontFamily: z35.string().default("Inter"),
|
|
1963
|
+
fontWeight: z35.number().int().min(100).max(900).default(800),
|
|
1964
|
+
position: z35.enum(["top", "center", "bottom"]).default("center"),
|
|
1965
|
+
animation: z35.enum(["draw", "fill"]).default("draw"),
|
|
1966
|
+
strokeWidth: z35.number().min(1).max(10).default(3)
|
|
1967
|
+
});
|
|
1968
|
+
var positionStyles3 = (position) => {
|
|
1969
|
+
if (position === "top") return { justifyContent: "center", alignItems: "flex-start", paddingTop: 90 };
|
|
1970
|
+
if (position === "bottom") return { justifyContent: "center", alignItems: "flex-end", paddingBottom: 90 };
|
|
1971
|
+
return { justifyContent: "center", alignItems: "center" };
|
|
1972
|
+
};
|
|
1973
|
+
var OutlineText = ({
|
|
1974
|
+
content,
|
|
1975
|
+
fontSize,
|
|
1976
|
+
outlineColor,
|
|
1977
|
+
fillColor,
|
|
1978
|
+
fontFamily,
|
|
1979
|
+
fontWeight,
|
|
1980
|
+
position,
|
|
1981
|
+
animation,
|
|
1982
|
+
strokeWidth
|
|
1983
|
+
}) => {
|
|
1984
|
+
const frame = useCurrentFrame22();
|
|
1985
|
+
const t = interpolate15(frame, [0, 24], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
1986
|
+
const strokeOpacity = animation === "draw" ? t : 1;
|
|
1987
|
+
const fillOpacity = animation === "fill" ? t : 0;
|
|
1988
|
+
return /* @__PURE__ */ jsxs13(Fill, { style: { display: "flex", ...positionStyles3(position) }, children: [
|
|
1989
|
+
/* @__PURE__ */ jsx34(
|
|
1990
|
+
"div",
|
|
1991
|
+
{
|
|
1992
|
+
style: {
|
|
1993
|
+
fontSize,
|
|
1994
|
+
fontFamily,
|
|
1995
|
+
fontWeight,
|
|
1996
|
+
color: fillColor,
|
|
1997
|
+
opacity: fillOpacity,
|
|
1998
|
+
WebkitTextStroke: `${strokeWidth}px ${outlineColor}`,
|
|
1999
|
+
textShadow: `0 0 1px ${outlineColor}`,
|
|
2000
|
+
textAlign: "center",
|
|
2001
|
+
lineHeight: 1
|
|
2002
|
+
},
|
|
2003
|
+
children: content
|
|
2004
|
+
}
|
|
2005
|
+
),
|
|
2006
|
+
/* @__PURE__ */ jsx34(
|
|
2007
|
+
"div",
|
|
2008
|
+
{
|
|
2009
|
+
style: {
|
|
2010
|
+
position: "absolute",
|
|
2011
|
+
fontSize,
|
|
2012
|
+
fontFamily,
|
|
2013
|
+
fontWeight,
|
|
2014
|
+
color: "transparent",
|
|
2015
|
+
opacity: strokeOpacity,
|
|
2016
|
+
WebkitTextStroke: `${strokeWidth}px ${outlineColor}`,
|
|
2017
|
+
textAlign: "center",
|
|
2018
|
+
lineHeight: 1
|
|
2019
|
+
},
|
|
2020
|
+
children: content
|
|
2021
|
+
}
|
|
2022
|
+
)
|
|
2023
|
+
] });
|
|
2024
|
+
};
|
|
2025
|
+
var OutlineTextComponentMetadata = {
|
|
2026
|
+
kind: "composite",
|
|
2027
|
+
category: "text",
|
|
2028
|
+
description: "Outlined title text with simple draw/fill animation",
|
|
2029
|
+
llmGuidance: 'Use for bold titles. animation="draw" emphasizes the outline; animation="fill" reveals the fill color.'
|
|
2030
|
+
};
|
|
2031
|
+
|
|
2032
|
+
// src/components/composites/ProgressBar.tsx
|
|
2033
|
+
import { interpolate as interpolate16, useCurrentFrame as useCurrentFrame23 } from "remotion";
|
|
2034
|
+
import { z as z36 } from "zod";
|
|
2035
|
+
import { jsx as jsx35, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2036
|
+
var ProgressBarPropsSchema = z36.object({
|
|
2037
|
+
label: z36.string().optional(),
|
|
2038
|
+
color: z36.string().default("#00FF00"),
|
|
2039
|
+
backgroundColor: z36.string().default("rgba(255,255,255,0.2)"),
|
|
2040
|
+
height: z36.number().min(5).max(50).default(10),
|
|
2041
|
+
position: z36.enum(["top", "bottom"]).default("bottom"),
|
|
2042
|
+
showPercentage: z36.boolean().default(true)
|
|
2043
|
+
});
|
|
2044
|
+
var ProgressBar = ({
|
|
2045
|
+
label,
|
|
2046
|
+
color,
|
|
2047
|
+
backgroundColor,
|
|
2048
|
+
height,
|
|
2049
|
+
position,
|
|
2050
|
+
showPercentage,
|
|
2051
|
+
__wavesDurationInFrames
|
|
2052
|
+
}) => {
|
|
2053
|
+
const frame = useCurrentFrame23();
|
|
2054
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2055
|
+
const p = interpolate16(frame, [0, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2056
|
+
const pct = Math.round(p * 100);
|
|
2057
|
+
const yStyle = position === "top" ? { top: 50 } : { bottom: 50 };
|
|
2058
|
+
return /* @__PURE__ */ jsx35(Fill, { children: /* @__PURE__ */ jsxs14("div", { style: { position: "absolute", left: 80, right: 80, ...yStyle }, children: [
|
|
2059
|
+
label || showPercentage ? /* @__PURE__ */ jsxs14("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: 10, color: "#FFFFFF", fontWeight: 700 }, children: [
|
|
2060
|
+
/* @__PURE__ */ jsx35("span", { children: label ?? "" }),
|
|
2061
|
+
/* @__PURE__ */ jsx35("span", { children: showPercentage ? `${pct}%` : "" })
|
|
2062
|
+
] }) : null,
|
|
2063
|
+
/* @__PURE__ */ jsx35("div", { style: { width: "100%", height, backgroundColor, borderRadius: 9999, overflow: "hidden" }, children: /* @__PURE__ */ jsx35("div", { style: { width: `${pct}%`, height: "100%", backgroundColor: color } }) })
|
|
2064
|
+
] }) });
|
|
2065
|
+
};
|
|
2066
|
+
var ProgressBarComponentMetadata = {
|
|
2067
|
+
kind: "composite",
|
|
2068
|
+
category: "data",
|
|
2069
|
+
description: "Animated progress bar that fills over the component duration",
|
|
2070
|
+
llmGuidance: "Use for loading/countdowns. showPercentage=true is helpful for clarity."
|
|
2071
|
+
};
|
|
2072
|
+
|
|
2073
|
+
// src/components/composites/ProgressRing.tsx
|
|
2074
|
+
import { interpolate as interpolate17, useCurrentFrame as useCurrentFrame24 } from "remotion";
|
|
2075
|
+
import { z as z37 } from "zod";
|
|
2076
|
+
import { jsx as jsx36, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2077
|
+
var ProgressRingPropsSchema = z37.object({
|
|
2078
|
+
percentage: z37.number().min(0).max(100),
|
|
2079
|
+
size: z37.number().min(100).max(500).default(200),
|
|
2080
|
+
strokeWidth: z37.number().min(5).max(50).default(20),
|
|
2081
|
+
color: z37.string().default("#00FF00"),
|
|
2082
|
+
backgroundColor: z37.string().default("rgba(255,255,255,0.2)"),
|
|
2083
|
+
showLabel: z37.boolean().default(true)
|
|
2084
|
+
});
|
|
2085
|
+
var ProgressRing = ({
|
|
2086
|
+
percentage,
|
|
2087
|
+
size,
|
|
2088
|
+
strokeWidth,
|
|
2089
|
+
color,
|
|
2090
|
+
backgroundColor,
|
|
2091
|
+
showLabel,
|
|
2092
|
+
__wavesDurationInFrames
|
|
2093
|
+
}) => {
|
|
2094
|
+
const frame = useCurrentFrame24();
|
|
2095
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2096
|
+
const p = interpolate17(frame, [0, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2097
|
+
const current = percentage * p;
|
|
2098
|
+
const r = (size - strokeWidth) / 2;
|
|
2099
|
+
const c = 2 * Math.PI * r;
|
|
2100
|
+
const dash = c;
|
|
2101
|
+
const offset = c - current / 100 * c;
|
|
2102
|
+
return /* @__PURE__ */ jsxs15(Fill, { style: { display: "flex", justifyContent: "center", alignItems: "center" }, children: [
|
|
2103
|
+
/* @__PURE__ */ jsxs15("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
2104
|
+
/* @__PURE__ */ jsx36(
|
|
2105
|
+
"circle",
|
|
2106
|
+
{
|
|
2107
|
+
cx: size / 2,
|
|
2108
|
+
cy: size / 2,
|
|
2109
|
+
r,
|
|
2110
|
+
stroke: backgroundColor,
|
|
2111
|
+
strokeWidth,
|
|
2112
|
+
fill: "transparent"
|
|
2113
|
+
}
|
|
2114
|
+
),
|
|
2115
|
+
/* @__PURE__ */ jsx36(
|
|
2116
|
+
"circle",
|
|
2117
|
+
{
|
|
2118
|
+
cx: size / 2,
|
|
2119
|
+
cy: size / 2,
|
|
2120
|
+
r,
|
|
2121
|
+
stroke: color,
|
|
2122
|
+
strokeWidth,
|
|
2123
|
+
fill: "transparent",
|
|
2124
|
+
strokeDasharray: dash,
|
|
2125
|
+
strokeDashoffset: offset,
|
|
2126
|
+
strokeLinecap: "round",
|
|
2127
|
+
transform: `rotate(-90 ${size / 2} ${size / 2})`
|
|
2128
|
+
}
|
|
2129
|
+
)
|
|
2130
|
+
] }),
|
|
2131
|
+
showLabel ? /* @__PURE__ */ jsxs15("div", { style: { position: "absolute", color: "#FFFFFF", fontWeight: 800, fontSize: Math.round(size * 0.22) }, children: [
|
|
2132
|
+
Math.round(current),
|
|
2133
|
+
"%"
|
|
2134
|
+
] }) : null
|
|
2135
|
+
] });
|
|
2136
|
+
};
|
|
2137
|
+
var ProgressRingComponentMetadata = {
|
|
2138
|
+
kind: "composite",
|
|
2139
|
+
category: "data",
|
|
2140
|
+
description: "Circular progress indicator (SVG) that animates from 0 to percentage over duration",
|
|
2141
|
+
llmGuidance: "Use for completion and goals. size 160-260 is typical. showLabel displays the percentage."
|
|
2142
|
+
};
|
|
2143
|
+
|
|
2144
|
+
// src/components/composites/SlideTransition.tsx
|
|
2145
|
+
import React7 from "react";
|
|
2146
|
+
import { interpolate as interpolate18, useCurrentFrame as useCurrentFrame25 } from "remotion";
|
|
2147
|
+
import { z as z38 } from "zod";
|
|
2148
|
+
import { jsx as jsx37 } from "react/jsx-runtime";
|
|
2149
|
+
var SlideTransitionPropsSchema = z38.object({
|
|
2150
|
+
durationInFrames: z38.number().int().min(10).max(60).default(30),
|
|
2151
|
+
direction: z38.enum(["left", "right", "up", "down"]).default("left"),
|
|
2152
|
+
distance: z38.number().int().min(1).max(2e3).default(160),
|
|
2153
|
+
phase: z38.enum(["in", "out", "inOut"]).default("inOut")
|
|
2154
|
+
});
|
|
2155
|
+
function translateFor(direction, delta) {
|
|
2156
|
+
if (direction === "left") return { x: -delta, y: 0 };
|
|
2157
|
+
if (direction === "right") return { x: delta, y: 0 };
|
|
2158
|
+
if (direction === "up") return { x: 0, y: -delta };
|
|
2159
|
+
return { x: 0, y: delta };
|
|
2160
|
+
}
|
|
2161
|
+
var SlideTransition = ({
|
|
2162
|
+
durationInFrames,
|
|
2163
|
+
direction,
|
|
2164
|
+
distance,
|
|
2165
|
+
phase,
|
|
2166
|
+
children,
|
|
2167
|
+
__wavesDurationInFrames
|
|
2168
|
+
}) => {
|
|
2169
|
+
const layers = React7.Children.toArray(children);
|
|
2170
|
+
const frame = useCurrentFrame25();
|
|
2171
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2172
|
+
const d = Math.min(durationInFrames, total);
|
|
2173
|
+
let opacity = 1;
|
|
2174
|
+
let tx = 0;
|
|
2175
|
+
let ty = 0;
|
|
2176
|
+
if (phase === "in" || phase === "inOut") {
|
|
2177
|
+
const t = interpolate18(frame, [0, d], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2178
|
+
const { x, y } = translateFor(direction, distance * t);
|
|
2179
|
+
tx += x;
|
|
2180
|
+
ty += y;
|
|
2181
|
+
opacity *= interpolate18(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2182
|
+
}
|
|
2183
|
+
if (phase === "out" || phase === "inOut") {
|
|
2184
|
+
const start = Math.max(0, total - d);
|
|
2185
|
+
const t = interpolate18(frame, [start, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2186
|
+
const opposite = direction === "left" ? "right" : direction === "right" ? "left" : direction === "up" ? "down" : "up";
|
|
2187
|
+
const { x, y } = translateFor(opposite, distance * t);
|
|
2188
|
+
tx += x;
|
|
2189
|
+
ty += y;
|
|
2190
|
+
opacity *= interpolate18(frame, [start, total], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2191
|
+
}
|
|
2192
|
+
return /* @__PURE__ */ jsx37(Fill, { style: { opacity, transform: `translate(${tx}px, ${ty}px)` }, children: layers.map((child, i) => /* @__PURE__ */ jsx37("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) });
|
|
2193
|
+
};
|
|
2194
|
+
var SlideTransitionComponentMetadata = {
|
|
2195
|
+
kind: "composite",
|
|
2196
|
+
category: "transition",
|
|
2197
|
+
acceptsChildren: true,
|
|
2198
|
+
minChildren: 1,
|
|
2199
|
+
description: "Slide in/out wrapper (used for segment transitions and overlays)",
|
|
2200
|
+
llmGuidance: "Use for more dynamic transitions. direction controls where content enters from."
|
|
2201
|
+
};
|
|
2202
|
+
|
|
2203
|
+
// src/components/composites/SplitScreen.tsx
|
|
2204
|
+
import React8 from "react";
|
|
2205
|
+
import { z as z39 } from "zod";
|
|
2206
|
+
import { jsx as jsx38, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2207
|
+
var SplitScreenPropsSchema = z39.object({
|
|
2208
|
+
orientation: z39.enum(["vertical", "horizontal"]).default("vertical"),
|
|
2209
|
+
split: z39.number().min(0.1).max(0.9).default(0.5),
|
|
2210
|
+
gap: z39.number().min(0).default(48),
|
|
2211
|
+
padding: z39.number().min(0).default(80),
|
|
2212
|
+
dividerColor: z39.string().optional()
|
|
2213
|
+
});
|
|
2214
|
+
var SplitScreen = ({
|
|
2215
|
+
orientation,
|
|
2216
|
+
split,
|
|
2217
|
+
gap,
|
|
2218
|
+
padding,
|
|
2219
|
+
dividerColor,
|
|
2220
|
+
children
|
|
2221
|
+
}) => {
|
|
2222
|
+
const items = React8.Children.toArray(children);
|
|
2223
|
+
const first = items[0] ?? null;
|
|
2224
|
+
const second = items[1] ?? null;
|
|
2225
|
+
const isVertical = orientation === "vertical";
|
|
2226
|
+
const flexDirection = isVertical ? "row" : "column";
|
|
2227
|
+
return /* @__PURE__ */ jsx38(Fill, { style: { padding, boxSizing: "border-box" }, children: /* @__PURE__ */ jsxs16("div", { style: { display: "flex", flexDirection, gap, width: "100%", height: "100%" }, children: [
|
|
2228
|
+
/* @__PURE__ */ jsx38("div", { style: { flex: split, position: "relative" }, children: first }),
|
|
2229
|
+
dividerColor ? /* @__PURE__ */ jsx38(
|
|
2230
|
+
"div",
|
|
2231
|
+
{
|
|
2232
|
+
style: {
|
|
2233
|
+
backgroundColor: dividerColor,
|
|
2234
|
+
width: isVertical ? 2 : "100%",
|
|
2235
|
+
height: isVertical ? "100%" : 2,
|
|
2236
|
+
opacity: 0.7
|
|
2237
|
+
}
|
|
2238
|
+
}
|
|
2239
|
+
) : null,
|
|
2240
|
+
/* @__PURE__ */ jsx38("div", { style: { flex: 1 - split, position: "relative" }, children: second })
|
|
2241
|
+
] }) });
|
|
2242
|
+
};
|
|
2243
|
+
var SplitScreenComponentMetadata = {
|
|
2244
|
+
kind: "composite",
|
|
2245
|
+
category: "layout",
|
|
2246
|
+
acceptsChildren: true,
|
|
2247
|
+
minChildren: 2,
|
|
2248
|
+
maxChildren: 2,
|
|
2249
|
+
description: "Two-panel split screen layout",
|
|
2250
|
+
llmGuidance: 'Provide exactly 2 children. Use orientation="vertical" for left/right and "horizontal" for top/bottom.'
|
|
2251
|
+
};
|
|
2252
|
+
|
|
2253
|
+
// src/components/composites/SplitText.tsx
|
|
2254
|
+
import { spring as spring10, useCurrentFrame as useCurrentFrame26, useVideoConfig as useVideoConfig11 } from "remotion";
|
|
2255
|
+
import { z as z40 } from "zod";
|
|
2256
|
+
import { jsx as jsx39 } from "react/jsx-runtime";
|
|
2257
|
+
var SplitTextPropsSchema = z40.object({
|
|
2258
|
+
content: z40.string().max(200),
|
|
2259
|
+
fontSize: z40.number().min(8).max(200).default(48),
|
|
2260
|
+
color: z40.string().default("#FFFFFF"),
|
|
2261
|
+
fontFamily: z40.string().default("Inter"),
|
|
2262
|
+
position: z40.enum(["top", "center", "bottom"]).default("center"),
|
|
2263
|
+
splitBy: z40.enum(["word", "letter"]).default("word"),
|
|
2264
|
+
stagger: z40.number().int().min(1).max(10).default(3),
|
|
2265
|
+
animation: z40.enum(["fade", "slideUp", "slideDown", "scale", "rotate"]).default("slideUp"),
|
|
2266
|
+
maxWidthPct: z40.number().min(0.1).max(1).default(0.9),
|
|
2267
|
+
safeInsetPct: z40.number().min(0).max(0.25).default(0.06)
|
|
2268
|
+
});
|
|
2269
|
+
var positionStyles4 = (position, safeInsetPct) => {
|
|
2270
|
+
const inset = `${(safeInsetPct * 100).toFixed(2)}%`;
|
|
2271
|
+
if (position === "top") return { justifyContent: "center", alignItems: "flex-start", paddingTop: inset };
|
|
2272
|
+
if (position === "bottom") return { justifyContent: "center", alignItems: "flex-end", paddingBottom: inset };
|
|
2273
|
+
return { justifyContent: "center", alignItems: "center" };
|
|
2274
|
+
};
|
|
2275
|
+
function getItemStyle(progress, animation) {
|
|
2276
|
+
const clamped = Math.max(0, Math.min(1, progress));
|
|
2277
|
+
switch (animation) {
|
|
2278
|
+
case "fade":
|
|
2279
|
+
return { opacity: clamped };
|
|
2280
|
+
case "slideDown":
|
|
2281
|
+
return { opacity: clamped, transform: `translateY(${-20 * (1 - clamped)}px)` };
|
|
2282
|
+
case "scale":
|
|
2283
|
+
return { opacity: clamped, transform: `scale(${0.9 + 0.1 * clamped})` };
|
|
2284
|
+
case "rotate":
|
|
2285
|
+
return { opacity: clamped, transform: `rotate(${(-10 * (1 - clamped)).toFixed(2)}deg)` };
|
|
2286
|
+
case "slideUp":
|
|
2287
|
+
default:
|
|
2288
|
+
return { opacity: clamped, transform: `translateY(${20 * (1 - clamped)}px)` };
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
var SplitText = ({
|
|
2292
|
+
content,
|
|
2293
|
+
fontSize,
|
|
2294
|
+
color,
|
|
2295
|
+
fontFamily,
|
|
2296
|
+
position,
|
|
2297
|
+
splitBy,
|
|
2298
|
+
stagger,
|
|
2299
|
+
animation,
|
|
2300
|
+
maxWidthPct,
|
|
2301
|
+
safeInsetPct
|
|
2302
|
+
}) => {
|
|
2303
|
+
const frame = useCurrentFrame26();
|
|
2304
|
+
const { fps } = useVideoConfig11();
|
|
2305
|
+
const items = splitBy === "letter" ? content.split("") : content.trim().split(/\s+/);
|
|
2306
|
+
return /* @__PURE__ */ jsx39(Fill, { style: { display: "flex", ...positionStyles4(position, safeInsetPct) }, children: /* @__PURE__ */ jsx39(
|
|
2307
|
+
"div",
|
|
2308
|
+
{
|
|
2309
|
+
style: {
|
|
2310
|
+
display: "flex",
|
|
2311
|
+
flexWrap: "wrap",
|
|
2312
|
+
justifyContent: "center",
|
|
2313
|
+
gap: splitBy === "letter" ? 0 : 12,
|
|
2314
|
+
maxWidth: `${Math.round(maxWidthPct * 100)}%`,
|
|
2315
|
+
fontSize,
|
|
2316
|
+
color,
|
|
2317
|
+
fontFamily,
|
|
2318
|
+
fontWeight: 700,
|
|
2319
|
+
textAlign: "center",
|
|
2320
|
+
overflowWrap: "anywhere",
|
|
2321
|
+
wordBreak: "break-word"
|
|
2322
|
+
},
|
|
2323
|
+
children: items.map((t, i) => {
|
|
2324
|
+
const progress = spring10({
|
|
2325
|
+
frame: frame - i * stagger,
|
|
2326
|
+
fps,
|
|
2327
|
+
config: { damping: 14, stiffness: 120, mass: 0.9 }
|
|
2328
|
+
});
|
|
2329
|
+
return /* @__PURE__ */ jsx39(
|
|
2330
|
+
"span",
|
|
2331
|
+
{
|
|
2332
|
+
style: {
|
|
2333
|
+
display: "inline-block",
|
|
2334
|
+
whiteSpace: t === " " ? "pre" : "pre-wrap",
|
|
2335
|
+
...getItemStyle(progress, animation)
|
|
2336
|
+
},
|
|
2337
|
+
children: splitBy === "word" ? `${t} ` : t
|
|
2338
|
+
},
|
|
2339
|
+
`${i}-${t}`
|
|
2340
|
+
);
|
|
2341
|
+
})
|
|
2342
|
+
}
|
|
2343
|
+
) });
|
|
2344
|
+
};
|
|
2345
|
+
var SplitTextComponentMetadata = {
|
|
2346
|
+
kind: "composite",
|
|
2347
|
+
category: "text",
|
|
2348
|
+
description: "Animated text where each word or letter enters with a staggered effect",
|
|
2349
|
+
llmGuidance: 'Use for titles. splitBy="word" is best for phrases; splitBy="letter" is dramatic for short words.',
|
|
2350
|
+
examples: [
|
|
2351
|
+
{ content: "Welcome to Waves", splitBy: "word", stagger: 3, animation: "slideUp" },
|
|
2352
|
+
{ content: "HELLO", splitBy: "letter", stagger: 2, animation: "scale" }
|
|
2353
|
+
]
|
|
2354
|
+
};
|
|
2355
|
+
|
|
2356
|
+
// src/components/composites/SubtitleText.tsx
|
|
2357
|
+
import { interpolate as interpolate19, useCurrentFrame as useCurrentFrame27 } from "remotion";
|
|
2358
|
+
import { z as z41 } from "zod";
|
|
2359
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
2360
|
+
var SubtitleTextPropsSchema = z41.object({
|
|
2361
|
+
text: z41.string().max(200),
|
|
2362
|
+
fontSize: z41.number().min(12).max(80).default(36),
|
|
2363
|
+
color: z41.string().default("#FFFFFF"),
|
|
2364
|
+
backgroundColor: z41.string().default("rgba(0,0,0,0.7)"),
|
|
2365
|
+
fontFamily: z41.string().default("Inter"),
|
|
2366
|
+
position: z41.enum(["top", "bottom"]).default("bottom"),
|
|
2367
|
+
maxWidth: z41.number().min(200).max(1200).default(800),
|
|
2368
|
+
padding: z41.number().min(0).max(80).default(20),
|
|
2369
|
+
highlightWords: z41.array(z41.string()).optional()
|
|
2370
|
+
});
|
|
2371
|
+
function normalizeWord(w) {
|
|
2372
|
+
return w.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
2373
|
+
}
|
|
2374
|
+
var SubtitleText = ({
|
|
2375
|
+
text,
|
|
2376
|
+
fontSize,
|
|
2377
|
+
color,
|
|
2378
|
+
backgroundColor,
|
|
2379
|
+
fontFamily,
|
|
2380
|
+
position,
|
|
2381
|
+
maxWidth,
|
|
2382
|
+
padding,
|
|
2383
|
+
highlightWords,
|
|
2384
|
+
__wavesDurationInFrames
|
|
2385
|
+
}) => {
|
|
2386
|
+
const frame = useCurrentFrame27();
|
|
2387
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2388
|
+
const inFade = interpolate19(frame, [0, 10], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2389
|
+
const outFade = interpolate19(frame, [Math.max(0, total - 10), total], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2390
|
+
const opacity = inFade * outFade;
|
|
2391
|
+
const highlights = new Set((highlightWords ?? []).map(normalizeWord));
|
|
2392
|
+
const tokens = text.split(/\s+/);
|
|
2393
|
+
const yStyle = position === "top" ? { top: 70 } : { bottom: 90 };
|
|
2394
|
+
return /* @__PURE__ */ jsx40(Fill, { children: /* @__PURE__ */ jsx40("div", { style: { position: "absolute", left: "50%", transform: "translateX(-50%)", maxWidth, width: "100%", ...yStyle }, children: /* @__PURE__ */ jsx40(
|
|
2395
|
+
"div",
|
|
2396
|
+
{
|
|
2397
|
+
style: {
|
|
2398
|
+
display: "inline-block",
|
|
2399
|
+
backgroundColor,
|
|
2400
|
+
padding,
|
|
2401
|
+
borderRadius: 18,
|
|
2402
|
+
opacity,
|
|
2403
|
+
color,
|
|
2404
|
+
fontSize,
|
|
2405
|
+
fontFamily,
|
|
2406
|
+
fontWeight: 800,
|
|
2407
|
+
lineHeight: 1.2,
|
|
2408
|
+
textAlign: "center"
|
|
2409
|
+
},
|
|
2410
|
+
children: tokens.map((t, i) => {
|
|
2411
|
+
const n = normalizeWord(t);
|
|
2412
|
+
const isHighlighted = highlights.has(n);
|
|
2413
|
+
return /* @__PURE__ */ jsx40("span", { style: { color: isHighlighted ? "#FFD60A" : color, marginRight: 8 }, children: t }, i);
|
|
2414
|
+
})
|
|
2415
|
+
}
|
|
2416
|
+
) }) });
|
|
2417
|
+
};
|
|
2418
|
+
var SubtitleTextComponentMetadata = {
|
|
2419
|
+
kind: "composite",
|
|
2420
|
+
category: "text",
|
|
2421
|
+
description: "Caption/subtitle box with fade in/out and optional highlighted words",
|
|
2422
|
+
llmGuidance: "Use for narration/captions. highlightWords helps emphasize key terms."
|
|
2423
|
+
};
|
|
2424
|
+
|
|
2425
|
+
// src/components/composites/TikTokCaption.tsx
|
|
2426
|
+
import { interpolate as interpolate20, useCurrentFrame as useCurrentFrame28 } from "remotion";
|
|
2427
|
+
import { z as z42 } from "zod";
|
|
2428
|
+
import { jsx as jsx41 } from "react/jsx-runtime";
|
|
2429
|
+
var TikTokCaptionPropsSchema = z42.object({
|
|
2430
|
+
text: z42.string().max(150),
|
|
2431
|
+
fontSize: z42.number().min(12).max(120).default(48),
|
|
2432
|
+
color: z42.string().default("#FFFFFF"),
|
|
2433
|
+
strokeColor: z42.string().default("#000000"),
|
|
2434
|
+
strokeWidth: z42.number().min(0).max(10).default(3),
|
|
2435
|
+
position: z42.enum(["center", "bottom"]).default("center"),
|
|
2436
|
+
highlightStyle: z42.enum(["word", "bounce", "none"]).default("word"),
|
|
2437
|
+
maxWidthPct: z42.number().min(0.1).max(1).default(0.92),
|
|
2438
|
+
safeInsetPct: z42.number().min(0).max(0.25).default(0.06)
|
|
2439
|
+
});
|
|
2440
|
+
var TikTokCaption = ({
|
|
2441
|
+
text,
|
|
2442
|
+
fontSize,
|
|
2443
|
+
color,
|
|
2444
|
+
strokeColor,
|
|
2445
|
+
strokeWidth,
|
|
2446
|
+
position,
|
|
2447
|
+
highlightStyle,
|
|
2448
|
+
maxWidthPct,
|
|
2449
|
+
safeInsetPct,
|
|
2450
|
+
__wavesDurationInFrames
|
|
2451
|
+
}) => {
|
|
2452
|
+
const frame = useCurrentFrame28();
|
|
2453
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2454
|
+
const p = interpolate20(frame, [0, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2455
|
+
const words = text.trim().split(/\s+/);
|
|
2456
|
+
const idx = highlightStyle === "none" ? -1 : Math.min(words.length - 1, Math.floor(p * words.length));
|
|
2457
|
+
const inset = `${(safeInsetPct * 100).toFixed(2)}%`;
|
|
2458
|
+
const yStyle = position === "bottom" ? { alignItems: "flex-end", paddingBottom: inset } : { alignItems: "center" };
|
|
2459
|
+
return /* @__PURE__ */ jsx41(Fill, { style: { display: "flex", justifyContent: "center", ...yStyle }, children: /* @__PURE__ */ jsx41("div", { style: { textAlign: "center", paddingLeft: inset, paddingRight: inset, maxWidth: `${Math.round(maxWidthPct * 100)}%`, fontWeight: 900, lineHeight: 1.1, overflowWrap: "anywhere", wordBreak: "break-word" }, children: words.map((w, i) => {
|
|
2460
|
+
const isActive = i === idx && highlightStyle !== "none";
|
|
2461
|
+
const bounce = isActive && highlightStyle === "bounce" ? interpolate20(frame % 18, [0, 9, 18], [1, 1.08, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" }) : 1;
|
|
2462
|
+
return /* @__PURE__ */ jsx41(
|
|
2463
|
+
"span",
|
|
2464
|
+
{
|
|
2465
|
+
style: {
|
|
2466
|
+
display: "inline-block",
|
|
2467
|
+
marginRight: 12,
|
|
2468
|
+
fontSize,
|
|
2469
|
+
color: isActive ? "#FFD60A" : color,
|
|
2470
|
+
WebkitTextStroke: `${strokeWidth}px ${strokeColor}`,
|
|
2471
|
+
transform: `scale(${bounce})`
|
|
2472
|
+
},
|
|
2473
|
+
children: w
|
|
2474
|
+
},
|
|
2475
|
+
`${i}-${w}`
|
|
2476
|
+
);
|
|
2477
|
+
}) }) });
|
|
2478
|
+
};
|
|
2479
|
+
var TikTokCaptionComponentMetadata = {
|
|
2480
|
+
kind: "composite",
|
|
2481
|
+
category: "social",
|
|
2482
|
+
description: "TikTok-style captions with stroke and optional word highlighting",
|
|
2483
|
+
llmGuidance: 'Always keep strokeWidth>=2 for readability. highlightStyle="word" or "bounce" makes captions feel dynamic.'
|
|
2484
|
+
};
|
|
2485
|
+
|
|
2486
|
+
// src/components/composites/ThirdLowerBanner.tsx
|
|
2487
|
+
import { Img as Img12, interpolate as interpolate21, staticFile as staticFile14, useCurrentFrame as useCurrentFrame29 } from "remotion";
|
|
2488
|
+
import { z as z43 } from "zod";
|
|
2489
|
+
import { jsx as jsx42, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2490
|
+
var ThirdLowerBannerPropsSchema = z43.object({
|
|
2491
|
+
name: z43.string().max(50),
|
|
2492
|
+
title: z43.string().max(100),
|
|
2493
|
+
backgroundColor: z43.string().default("rgba(0,0,0,0.8)"),
|
|
2494
|
+
primaryColor: z43.string().default("#FFFFFF"),
|
|
2495
|
+
secondaryColor: z43.string().default("#CCCCCC"),
|
|
2496
|
+
accentColor: z43.string().default("#FF0000"),
|
|
2497
|
+
showAvatar: z43.boolean().default(false),
|
|
2498
|
+
avatarSrc: z43.string().optional()
|
|
2499
|
+
});
|
|
2500
|
+
var resolveAsset13 = (value) => isRemoteAssetPath(value) ? value : staticFile14(staticFileInputFromAssetPath(value));
|
|
2501
|
+
var ThirdLowerBanner = ({
|
|
2502
|
+
name,
|
|
2503
|
+
title,
|
|
2504
|
+
backgroundColor,
|
|
2505
|
+
primaryColor,
|
|
2506
|
+
secondaryColor,
|
|
2507
|
+
accentColor,
|
|
2508
|
+
showAvatar,
|
|
2509
|
+
avatarSrc
|
|
2510
|
+
}) => {
|
|
2511
|
+
const frame = useCurrentFrame29();
|
|
2512
|
+
const slide = interpolate21(frame, [0, 18], [-600, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2513
|
+
const opacity = interpolate21(frame, [0, 10], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2514
|
+
const avatar = showAvatar && typeof avatarSrc === "string" && avatarSrc.length > 0 ? avatarSrc : null;
|
|
2515
|
+
return /* @__PURE__ */ jsx42(Fill, { children: /* @__PURE__ */ jsxs17(
|
|
2516
|
+
"div",
|
|
2517
|
+
{
|
|
2518
|
+
style: {
|
|
2519
|
+
position: "absolute",
|
|
2520
|
+
left: 80,
|
|
2521
|
+
bottom: 80,
|
|
2522
|
+
width: 980,
|
|
2523
|
+
height: 160,
|
|
2524
|
+
transform: `translateX(${slide}px)`,
|
|
2525
|
+
opacity,
|
|
2526
|
+
display: "flex",
|
|
2527
|
+
overflow: "hidden",
|
|
2528
|
+
borderRadius: 18,
|
|
2529
|
+
backgroundColor
|
|
2530
|
+
},
|
|
2531
|
+
children: [
|
|
2532
|
+
/* @__PURE__ */ jsx42("div", { style: { width: 10, backgroundColor: accentColor } }),
|
|
2533
|
+
avatar ? /* @__PURE__ */ jsx42("div", { style: { width: 160, display: "flex", alignItems: "center", justifyContent: "center" }, children: /* @__PURE__ */ jsx42(
|
|
2534
|
+
Img12,
|
|
2535
|
+
{
|
|
2536
|
+
src: resolveAsset13(avatar),
|
|
2537
|
+
style: { width: 110, height: 110, borderRadius: 9999, objectFit: "cover" }
|
|
2538
|
+
}
|
|
2539
|
+
) }) : null,
|
|
2540
|
+
/* @__PURE__ */ jsxs17("div", { style: { padding: "28px 36px", display: "flex", flexDirection: "column", justifyContent: "center" }, children: [
|
|
2541
|
+
/* @__PURE__ */ jsx42("div", { style: { color: primaryColor, fontSize: 54, fontWeight: 800, lineHeight: 1 }, children: name }),
|
|
2542
|
+
/* @__PURE__ */ jsx42("div", { style: { marginTop: 10, color: secondaryColor, fontSize: 28, fontWeight: 600 }, children: title })
|
|
2543
|
+
] })
|
|
2544
|
+
]
|
|
2545
|
+
}
|
|
2546
|
+
) });
|
|
2547
|
+
};
|
|
2548
|
+
var ThirdLowerBannerComponentMetadata = {
|
|
2549
|
+
kind: "composite",
|
|
2550
|
+
category: "layout",
|
|
2551
|
+
description: "Broadcast-style lower-third banner with name/title and optional avatar",
|
|
2552
|
+
llmGuidance: "Use for speaker introductions. name = big label, title = smaller subtitle. showAvatar + avatarSrc for profile image.",
|
|
2553
|
+
examples: [
|
|
2554
|
+
{ name: "Alex Chen", title: "Product Designer", accentColor: "#FF3B30" },
|
|
2555
|
+
{ name: "Depths AI", title: "Waves v0.2.0", showAvatar: false }
|
|
2556
|
+
]
|
|
2557
|
+
};
|
|
2558
|
+
|
|
2559
|
+
// src/components/composites/TypewriterText.tsx
|
|
2560
|
+
import { interpolate as interpolate22, useCurrentFrame as useCurrentFrame30 } from "remotion";
|
|
2561
|
+
import { z as z44 } from "zod";
|
|
2562
|
+
import { jsx as jsx43, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2563
|
+
var TypewriterTextPropsSchema = z44.object({
|
|
2564
|
+
content: z44.string().max(500),
|
|
2565
|
+
fontSize: z44.number().min(8).max(200).default(48),
|
|
2566
|
+
color: z44.string().default("#FFFFFF"),
|
|
2567
|
+
fontFamily: z44.string().default("Inter"),
|
|
2568
|
+
position: z44.enum(["top", "center", "bottom"]).default("center"),
|
|
2569
|
+
speed: z44.number().min(0.5).max(5).default(2),
|
|
2570
|
+
showCursor: z44.boolean().default(true),
|
|
2571
|
+
cursorColor: z44.string().default("#FFFFFF"),
|
|
2572
|
+
maxWidthPct: z44.number().min(0.1).max(1).default(0.9),
|
|
2573
|
+
safeInsetPct: z44.number().min(0).max(0.25).default(0.06)
|
|
2574
|
+
});
|
|
2575
|
+
var positionStyles5 = (position, safeInsetPct) => {
|
|
2576
|
+
const inset = `${(safeInsetPct * 100).toFixed(2)}%`;
|
|
2577
|
+
if (position === "top") return { justifyContent: "center", alignItems: "flex-start", paddingTop: inset };
|
|
2578
|
+
if (position === "bottom") return { justifyContent: "center", alignItems: "flex-end", paddingBottom: inset };
|
|
2579
|
+
return { justifyContent: "center", alignItems: "center" };
|
|
2580
|
+
};
|
|
2581
|
+
var TypewriterText = ({
|
|
2582
|
+
content,
|
|
2583
|
+
fontSize,
|
|
2584
|
+
color,
|
|
2585
|
+
fontFamily,
|
|
2586
|
+
position,
|
|
2587
|
+
speed,
|
|
2588
|
+
showCursor,
|
|
2589
|
+
cursorColor,
|
|
2590
|
+
maxWidthPct,
|
|
2591
|
+
safeInsetPct
|
|
2592
|
+
}) => {
|
|
2593
|
+
const frame = useCurrentFrame30();
|
|
2594
|
+
const charCount = Math.min(content.length, Math.max(0, Math.floor(frame * speed)));
|
|
2595
|
+
const shown = content.slice(0, charCount);
|
|
2596
|
+
const cursorVisible = showCursor && charCount < content.length ? frame % 30 < 15 : false;
|
|
2597
|
+
const cursorOpacity = cursorVisible ? 1 : 0;
|
|
2598
|
+
const cursorFade = interpolate22(frame % 30, [0, 5], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2599
|
+
return /* @__PURE__ */ jsx43(Fill, { style: { display: "flex", ...positionStyles5(position, safeInsetPct) }, children: /* @__PURE__ */ jsxs18("div", { style: { fontSize, color, fontFamily, fontWeight: 600, textAlign: "center", whiteSpace: "pre-wrap", maxWidth: `${Math.round(maxWidthPct * 100)}%`, overflowWrap: "anywhere", wordBreak: "break-word" }, children: [
|
|
2600
|
+
shown,
|
|
2601
|
+
showCursor ? /* @__PURE__ */ jsx43("span", { style: { color: cursorColor, opacity: cursorOpacity * cursorFade }, children: "|" }) : null
|
|
2602
|
+
] }) });
|
|
2603
|
+
};
|
|
2604
|
+
var TypewriterTextComponentMetadata = {
|
|
2605
|
+
kind: "composite",
|
|
2606
|
+
category: "text",
|
|
2607
|
+
description: "Character-by-character text reveal with optional blinking cursor",
|
|
2608
|
+
llmGuidance: "Use for dramatic reveals and terminal-style text. speed ~1-2 is readable; 3-5 is fast.",
|
|
2609
|
+
examples: [
|
|
2610
|
+
{ content: "Hello Waves", speed: 2, position: "center", fontSize: 72 },
|
|
2611
|
+
{ content: 'console.log("hi")', speed: 1.5, fontFamily: "monospace", position: "top" }
|
|
2612
|
+
]
|
|
2613
|
+
};
|
|
2614
|
+
|
|
2615
|
+
// src/components/composites/TwitterCard.tsx
|
|
2616
|
+
import { Img as Img13, staticFile as staticFile15 } from "remotion";
|
|
2617
|
+
import { z as z45 } from "zod";
|
|
2618
|
+
import { jsx as jsx44, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2619
|
+
var TwitterCardPropsSchema = z45.object({
|
|
2620
|
+
author: z45.string().min(1),
|
|
2621
|
+
handle: z45.string().min(1),
|
|
2622
|
+
avatarSrc: z45.string().optional(),
|
|
2623
|
+
tweet: z45.string().max(280),
|
|
2624
|
+
image: z45.string().optional(),
|
|
2625
|
+
timestamp: z45.string().optional(),
|
|
2626
|
+
verified: z45.boolean().default(false)
|
|
2627
|
+
});
|
|
2628
|
+
var resolveAsset14 = (value) => isRemoteAssetPath(value) ? value : staticFile15(staticFileInputFromAssetPath(value));
|
|
2629
|
+
var TwitterCard = ({ author, handle, avatarSrc, tweet, image, timestamp, verified }) => {
|
|
2630
|
+
return /* @__PURE__ */ jsx44(Fill, { style: { backgroundColor: "#0B0F14", display: "flex", justifyContent: "center", alignItems: "center" }, children: /* @__PURE__ */ jsxs19(
|
|
2631
|
+
"div",
|
|
2632
|
+
{
|
|
2633
|
+
style: {
|
|
2634
|
+
width: 1100,
|
|
2635
|
+
borderRadius: 28,
|
|
2636
|
+
backgroundColor: "#FFFFFF",
|
|
2637
|
+
padding: 48,
|
|
2638
|
+
boxSizing: "border-box",
|
|
2639
|
+
boxShadow: "0 30px 90px rgba(0,0,0,0.35)"
|
|
2640
|
+
},
|
|
2641
|
+
children: [
|
|
2642
|
+
/* @__PURE__ */ jsxs19("div", { style: { display: "flex", gap: 18, alignItems: "center" }, children: [
|
|
2643
|
+
avatarSrc ? /* @__PURE__ */ jsx44(Img13, { src: resolveAsset14(avatarSrc), style: { width: 78, height: 78, borderRadius: 9999, objectFit: "cover" } }) : /* @__PURE__ */ jsx44("div", { style: { width: 78, height: 78, borderRadius: 9999, backgroundColor: "#E5E7EB" } }),
|
|
2644
|
+
/* @__PURE__ */ jsxs19("div", { style: { display: "flex", flexDirection: "column" }, children: [
|
|
2645
|
+
/* @__PURE__ */ jsxs19("div", { style: { display: "flex", gap: 10, alignItems: "center" }, children: [
|
|
2646
|
+
/* @__PURE__ */ jsx44("div", { style: { fontSize: 34, fontWeight: 900, color: "#111827" }, children: author }),
|
|
2647
|
+
verified ? /* @__PURE__ */ jsx44("div", { style: { fontSize: 26, color: "#1D9BF0", fontWeight: 900 }, children: "\u2713" }) : null
|
|
2648
|
+
] }),
|
|
2649
|
+
/* @__PURE__ */ jsx44("div", { style: { fontSize: 26, color: "#6B7280", fontWeight: 800 }, children: handle })
|
|
2650
|
+
] })
|
|
2651
|
+
] }),
|
|
2652
|
+
/* @__PURE__ */ jsx44("div", { style: { marginTop: 28, fontSize: 36, lineHeight: 1.25, color: "#111827", fontWeight: 700 }, children: tweet }),
|
|
2653
|
+
image ? /* @__PURE__ */ jsx44("div", { style: { marginTop: 28, width: "100%", height: 520, overflow: "hidden", borderRadius: 22, backgroundColor: "#F3F4F6" }, children: /* @__PURE__ */ jsx44(Img13, { src: resolveAsset14(image), style: { width: "100%", height: "100%", objectFit: "cover" } }) }) : null,
|
|
2654
|
+
timestamp ? /* @__PURE__ */ jsx44("div", { style: { marginTop: 22, fontSize: 22, color: "#6B7280", fontWeight: 700 }, children: timestamp }) : null
|
|
2655
|
+
]
|
|
2656
|
+
}
|
|
2657
|
+
) });
|
|
2658
|
+
};
|
|
2659
|
+
var TwitterCardComponentMetadata = {
|
|
2660
|
+
kind: "composite",
|
|
2661
|
+
category: "social",
|
|
2662
|
+
description: "Twitter/X post card layout with author header and optional image",
|
|
2663
|
+
llmGuidance: "Use for announcements/testimonials. Keep tweet short for readability."
|
|
2664
|
+
};
|
|
2665
|
+
|
|
2666
|
+
// src/components/composites/Watermark.tsx
|
|
2667
|
+
import { Img as Img14, staticFile as staticFile16 } from "remotion";
|
|
2668
|
+
import { z as z46 } from "zod";
|
|
2669
|
+
import { jsx as jsx45 } from "react/jsx-runtime";
|
|
2670
|
+
var WatermarkPropsSchema = z46.object({
|
|
2671
|
+
type: z46.enum(["logo", "text"]).default("logo"),
|
|
2672
|
+
src: z46.string().optional(),
|
|
2673
|
+
text: z46.string().optional(),
|
|
2674
|
+
position: z46.enum(["topLeft", "topRight", "bottomLeft", "bottomRight"]).default("bottomRight"),
|
|
2675
|
+
opacity: z46.number().min(0.1).max(1).default(0.5),
|
|
2676
|
+
size: z46.number().min(30).max(150).default(60),
|
|
2677
|
+
color: z46.string().default("#FFFFFF")
|
|
2678
|
+
});
|
|
2679
|
+
var resolveAsset15 = (value) => isRemoteAssetPath(value) ? value : staticFile16(staticFileInputFromAssetPath(value));
|
|
2680
|
+
function posStyle(position) {
|
|
2681
|
+
const offset = 30;
|
|
2682
|
+
if (position === "topLeft") return { left: offset, top: offset };
|
|
2683
|
+
if (position === "topRight") return { right: offset, top: offset };
|
|
2684
|
+
if (position === "bottomLeft") return { left: offset, bottom: offset };
|
|
2685
|
+
return { right: offset, bottom: offset };
|
|
2686
|
+
}
|
|
2687
|
+
var Watermark = ({ type, src, text, position, opacity, size, color }) => {
|
|
2688
|
+
const style = {
|
|
2689
|
+
position: "absolute",
|
|
2690
|
+
...posStyle(position),
|
|
2691
|
+
opacity,
|
|
2692
|
+
pointerEvents: "none"
|
|
2693
|
+
};
|
|
2694
|
+
return /* @__PURE__ */ jsx45(Fill, { children: type === "text" ? /* @__PURE__ */ jsx45("div", { style: { ...style, fontSize: Math.round(size * 0.6), color, fontWeight: 700 }, children: text ?? "" }) : src ? /* @__PURE__ */ jsx45(
|
|
2695
|
+
Img14,
|
|
2696
|
+
{
|
|
2697
|
+
src: resolveAsset15(src),
|
|
2698
|
+
style: { ...style, width: size, height: size, objectFit: "contain" }
|
|
2699
|
+
}
|
|
2700
|
+
) : null });
|
|
2701
|
+
};
|
|
2702
|
+
var WatermarkComponentMetadata = {
|
|
2703
|
+
kind: "composite",
|
|
2704
|
+
category: "branding",
|
|
2705
|
+
description: "Persistent logo/text watermark in a corner",
|
|
2706
|
+
llmGuidance: "Use subtle opacity (0.3-0.6). bottomRight is standard.",
|
|
2707
|
+
examples: [
|
|
2708
|
+
{ type: "text", text: "@depths.ai", position: "bottomRight", opacity: 0.4, size: 60 },
|
|
2709
|
+
{ type: "logo", src: "/assets/logo.svg", position: "topLeft", opacity: 0.5, size: 70 }
|
|
2710
|
+
]
|
|
2711
|
+
};
|
|
2712
|
+
|
|
2713
|
+
// src/components/composites/WipeTransition.tsx
|
|
2714
|
+
import React9 from "react";
|
|
2715
|
+
import { interpolate as interpolate23, useCurrentFrame as useCurrentFrame31 } from "remotion";
|
|
2716
|
+
import { z as z47 } from "zod";
|
|
2717
|
+
import { jsx as jsx46 } from "react/jsx-runtime";
|
|
2718
|
+
var WipeTransitionPropsSchema = z47.object({
|
|
2719
|
+
durationInFrames: z47.number().int().min(10).max(60).default(30),
|
|
2720
|
+
direction: z47.enum(["left", "right", "up", "down", "diagonal"]).default("right"),
|
|
2721
|
+
softEdge: z47.boolean().default(false),
|
|
2722
|
+
phase: z47.enum(["in", "out", "inOut"]).default("inOut")
|
|
2723
|
+
});
|
|
2724
|
+
function clipFor2(direction, p) {
|
|
2725
|
+
if (direction === "left") return `inset(0 ${100 * (1 - p)}% 0 0)`;
|
|
2726
|
+
if (direction === "right") return `inset(0 0 0 ${100 * (1 - p)}%)`;
|
|
2727
|
+
if (direction === "up") return `inset(0 0 ${100 * (1 - p)}% 0)`;
|
|
2728
|
+
if (direction === "down") return `inset(${100 * (1 - p)}% 0 0 0)`;
|
|
2729
|
+
return `polygon(0 0, ${100 * p}% 0, 0 ${100 * p}%)`;
|
|
2730
|
+
}
|
|
2731
|
+
var WipeTransition = ({
|
|
2732
|
+
durationInFrames,
|
|
2733
|
+
direction,
|
|
2734
|
+
softEdge,
|
|
2735
|
+
phase,
|
|
2736
|
+
children,
|
|
2737
|
+
__wavesDurationInFrames
|
|
2738
|
+
}) => {
|
|
2739
|
+
const layers = React9.Children.toArray(children);
|
|
2740
|
+
const frame = useCurrentFrame31();
|
|
2741
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2742
|
+
const d = Math.min(durationInFrames, total);
|
|
2743
|
+
let clipPath;
|
|
2744
|
+
if (phase === "in" || phase === "inOut") {
|
|
2745
|
+
const t = interpolate23(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2746
|
+
clipPath = clipFor2(direction, t);
|
|
2747
|
+
}
|
|
2748
|
+
if (phase === "out" || phase === "inOut") {
|
|
2749
|
+
const start = Math.max(0, total - d);
|
|
2750
|
+
const t = interpolate23(frame, [start, total], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2751
|
+
clipPath = clipFor2(direction, t);
|
|
2752
|
+
}
|
|
2753
|
+
return /* @__PURE__ */ jsx46(Fill, { style: { clipPath, filter: softEdge ? "blur(0.4px)" : void 0 }, children: layers.map((child, i) => /* @__PURE__ */ jsx46("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) });
|
|
2754
|
+
};
|
|
2755
|
+
var WipeTransitionComponentMetadata = {
|
|
2756
|
+
kind: "composite",
|
|
2757
|
+
category: "transition",
|
|
2758
|
+
acceptsChildren: true,
|
|
2759
|
+
minChildren: 1,
|
|
2760
|
+
description: "Directional wipe reveal/hide wrapper transition",
|
|
2761
|
+
llmGuidance: "Use as a more stylized reveal. softEdge can make it feel less harsh."
|
|
2762
|
+
};
|
|
2763
|
+
|
|
2764
|
+
// src/components/composites/YouTubeThumbnail.tsx
|
|
2765
|
+
import { Img as Img15, staticFile as staticFile17 } from "remotion";
|
|
2766
|
+
import { z as z48 } from "zod";
|
|
2767
|
+
import { jsx as jsx47, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2768
|
+
var YouTubeThumbnailPropsSchema = z48.object({
|
|
2769
|
+
backgroundImage: z48.string().min(1),
|
|
2770
|
+
title: z48.string().max(60),
|
|
2771
|
+
subtitle: z48.string().max(40).optional(),
|
|
2772
|
+
thumbnailFace: z48.string().optional(),
|
|
2773
|
+
accentColor: z48.string().default("#FF0000"),
|
|
2774
|
+
style: z48.enum(["bold", "minimal", "dramatic"]).default("bold")
|
|
2775
|
+
});
|
|
2776
|
+
var resolveAsset16 = (value) => isRemoteAssetPath(value) ? value : staticFile17(staticFileInputFromAssetPath(value));
|
|
2777
|
+
var YouTubeThumbnail = ({
|
|
2778
|
+
backgroundImage,
|
|
2779
|
+
title,
|
|
2780
|
+
subtitle,
|
|
2781
|
+
thumbnailFace,
|
|
2782
|
+
accentColor,
|
|
2783
|
+
style
|
|
2784
|
+
}) => {
|
|
2785
|
+
return /* @__PURE__ */ jsxs20(Fill, { children: [
|
|
2786
|
+
/* @__PURE__ */ jsx47(Img15, { src: resolveAsset16(backgroundImage), style: { width: "100%", height: "100%", objectFit: "cover" } }),
|
|
2787
|
+
style === "dramatic" ? /* @__PURE__ */ jsx47("div", { style: { position: "absolute", inset: 0, backgroundColor: "rgba(0,0,0,0.35)" } }) : null,
|
|
2788
|
+
thumbnailFace ? /* @__PURE__ */ jsx47(
|
|
2789
|
+
Img15,
|
|
2790
|
+
{
|
|
2791
|
+
src: resolveAsset16(thumbnailFace),
|
|
2792
|
+
style: { position: "absolute", right: 60, bottom: 0, width: 520, height: 720, objectFit: "cover" }
|
|
2793
|
+
}
|
|
2794
|
+
) : null,
|
|
2795
|
+
/* @__PURE__ */ jsxs20("div", { style: { position: "absolute", left: 70, top: 90, width: 1100 }, children: [
|
|
2796
|
+
/* @__PURE__ */ jsx47(
|
|
2797
|
+
"div",
|
|
2798
|
+
{
|
|
2799
|
+
style: {
|
|
2800
|
+
fontSize: style === "minimal" ? 86 : 110,
|
|
2801
|
+
fontWeight: 1e3,
|
|
2802
|
+
color: "#FFFFFF",
|
|
2803
|
+
textTransform: "uppercase",
|
|
2804
|
+
lineHeight: 0.95,
|
|
2805
|
+
WebkitTextStroke: style === "minimal" ? "0px transparent" : "10px #000000",
|
|
2806
|
+
textShadow: style === "minimal" ? "0 10px 40px rgba(0,0,0,0.6)" : void 0
|
|
2807
|
+
},
|
|
2808
|
+
children: title
|
|
2809
|
+
}
|
|
2810
|
+
),
|
|
2811
|
+
subtitle ? /* @__PURE__ */ jsx47("div", { style: { marginTop: 26, fontSize: 52, fontWeight: 900, color: accentColor, textShadow: "0 10px 30px rgba(0,0,0,0.6)" }, children: subtitle }) : null
|
|
2812
|
+
] }),
|
|
2813
|
+
style !== "minimal" ? /* @__PURE__ */ jsx47("div", { style: { position: "absolute", left: 70, bottom: 80, width: 260, height: 18, backgroundColor: accentColor, borderRadius: 9999 } }) : null
|
|
2814
|
+
] });
|
|
2815
|
+
};
|
|
2816
|
+
var YouTubeThumbnailComponentMetadata = {
|
|
2817
|
+
kind: "composite",
|
|
2818
|
+
category: "social",
|
|
2819
|
+
description: "YouTube-style thumbnail layout (16:9) with bold title and optional face cutout",
|
|
2820
|
+
llmGuidance: 'Use 1280x720 video size. Keep title short and high-contrast. style="bold" is classic thumbnail.'
|
|
2821
|
+
};
|
|
2822
|
+
|
|
2823
|
+
// src/components/composites/VideoWithOverlay.tsx
|
|
2824
|
+
import { Img as Img16, Video as RemotionVideo2, interpolate as interpolate24, staticFile as staticFile18, useCurrentFrame as useCurrentFrame32 } from "remotion";
|
|
2825
|
+
import { z as z49 } from "zod";
|
|
2826
|
+
import { jsx as jsx48, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2827
|
+
var OverlaySchema = z49.object({
|
|
2828
|
+
type: z49.enum(["text", "logo", "gradient"]),
|
|
2829
|
+
content: z49.string().optional(),
|
|
2830
|
+
opacity: z49.number().min(0).max(1).default(0.3),
|
|
2831
|
+
position: z49.enum(["top", "bottom", "center", "full"]).default("bottom")
|
|
2832
|
+
});
|
|
2833
|
+
var VideoWithOverlayPropsSchema = z49.object({
|
|
2834
|
+
src: z49.string().min(1),
|
|
2835
|
+
overlay: OverlaySchema.optional(),
|
|
2836
|
+
volume: z49.number().min(0).max(1).default(1),
|
|
2837
|
+
playbackRate: z49.number().min(0.5).max(2).default(1)
|
|
2838
|
+
});
|
|
2839
|
+
var resolveAsset17 = (value) => isRemoteAssetPath(value) ? value : staticFile18(staticFileInputFromAssetPath(value));
|
|
2840
|
+
var VideoWithOverlay = ({ src, overlay, volume, playbackRate }) => {
|
|
2841
|
+
const frame = useCurrentFrame32();
|
|
2842
|
+
const fade = interpolate24(frame, [0, 20], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2843
|
+
const overlayFill = { position: "absolute", inset: 0 };
|
|
2844
|
+
const overlayNode = overlay ? overlay.type === "gradient" ? /* @__PURE__ */ jsx48(
|
|
2845
|
+
"div",
|
|
2846
|
+
{
|
|
2847
|
+
style: {
|
|
2848
|
+
...overlayFill,
|
|
2849
|
+
opacity: overlay.opacity,
|
|
2850
|
+
background: overlay.position === "top" ? "linear-gradient(rgba(0,0,0,0.85), transparent)" : overlay.position === "bottom" ? "linear-gradient(transparent, rgba(0,0,0,0.85))" : "linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6))"
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
) : overlay.type === "logo" && overlay.content ? /* @__PURE__ */ jsx48("div", { style: { ...overlayFill, display: "flex", justifyContent: "center", alignItems: "center", opacity: overlay.opacity }, children: /* @__PURE__ */ jsx48(Img16, { src: resolveAsset17(overlay.content), style: { width: 220, height: 220, objectFit: "contain" } }) }) : overlay.type === "text" && overlay.content ? /* @__PURE__ */ jsx48("div", { style: { ...overlayFill, display: "flex", justifyContent: "center", alignItems: "center", opacity: overlay.opacity }, children: /* @__PURE__ */ jsx48("div", { style: { color: "#FFFFFF", fontSize: 56, fontWeight: 900, textAlign: "center", padding: "0 80px" }, children: overlay.content }) }) : null : null;
|
|
2854
|
+
return /* @__PURE__ */ jsxs21(Fill, { children: [
|
|
2855
|
+
/* @__PURE__ */ jsx48(
|
|
2856
|
+
RemotionVideo2,
|
|
2857
|
+
{
|
|
2858
|
+
src: resolveAsset17(src),
|
|
2859
|
+
style: { width: "100%", height: "100%", objectFit: "cover", opacity: fade },
|
|
2860
|
+
muted: volume === 0,
|
|
2861
|
+
playbackRate
|
|
2862
|
+
}
|
|
2863
|
+
),
|
|
2864
|
+
overlayNode
|
|
2865
|
+
] });
|
|
2866
|
+
};
|
|
2867
|
+
var VideoWithOverlayComponentMetadata = {
|
|
2868
|
+
kind: "composite",
|
|
2869
|
+
category: "media",
|
|
2870
|
+
description: "Video background with an optional overlay (text/logo/gradient)",
|
|
2871
|
+
llmGuidance: "Use gradient overlay to improve text readability. Set volume=0 to mute."
|
|
2872
|
+
};
|
|
2873
|
+
|
|
2874
|
+
// src/components/composites/ZoomTransition.tsx
|
|
2875
|
+
import React10 from "react";
|
|
2876
|
+
import { interpolate as interpolate25, useCurrentFrame as useCurrentFrame33 } from "remotion";
|
|
2877
|
+
import { z as z50 } from "zod";
|
|
2878
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
2879
|
+
var ZoomTransitionPropsSchema = z50.object({
|
|
2880
|
+
durationInFrames: z50.number().int().min(10).max(60).default(30),
|
|
2881
|
+
type: z50.enum(["zoomIn", "zoomOut"]).default("zoomIn"),
|
|
2882
|
+
phase: z50.enum(["in", "out", "inOut"]).default("inOut")
|
|
2883
|
+
});
|
|
2884
|
+
var ZoomTransition = ({
|
|
2885
|
+
durationInFrames,
|
|
2886
|
+
type,
|
|
2887
|
+
phase,
|
|
2888
|
+
children,
|
|
2889
|
+
__wavesDurationInFrames
|
|
2890
|
+
}) => {
|
|
2891
|
+
const layers = React10.Children.toArray(children);
|
|
2892
|
+
const frame = useCurrentFrame33();
|
|
2893
|
+
const total = Math.max(1, __wavesDurationInFrames ?? 1);
|
|
2894
|
+
const d = Math.min(durationInFrames, total);
|
|
2895
|
+
let opacity = 1;
|
|
2896
|
+
let scale = 1;
|
|
2897
|
+
const enterFrom = type === "zoomIn" ? 1.2 : 0.85;
|
|
2898
|
+
const exitTo = type === "zoomIn" ? 1.25 : 0.75;
|
|
2899
|
+
if (phase === "in" || phase === "inOut") {
|
|
2900
|
+
const t = interpolate25(frame, [0, d], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2901
|
+
scale *= enterFrom + (1 - enterFrom) * t;
|
|
2902
|
+
opacity *= t;
|
|
2903
|
+
}
|
|
2904
|
+
if (phase === "out" || phase === "inOut") {
|
|
2905
|
+
const start = Math.max(0, total - d);
|
|
2906
|
+
const t = interpolate25(frame, [start, total], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
2907
|
+
scale *= 1 + (exitTo - 1) * t;
|
|
2908
|
+
opacity *= 1 - t;
|
|
2909
|
+
}
|
|
2910
|
+
return /* @__PURE__ */ jsx49(Fill, { style: { opacity, transform: `scale(${scale})` }, children: layers.map((child, i) => /* @__PURE__ */ jsx49("div", { style: { position: "absolute", inset: 0 }, children: child }, i)) });
|
|
2911
|
+
};
|
|
2912
|
+
var ZoomTransitionComponentMetadata = {
|
|
2913
|
+
kind: "composite",
|
|
2914
|
+
category: "transition",
|
|
2915
|
+
acceptsChildren: true,
|
|
2916
|
+
minChildren: 1,
|
|
2917
|
+
description: "Zoom in/out wrapper transition",
|
|
2918
|
+
llmGuidance: 'Use for energetic cuts. type="zoomIn" feels punchy; type="zoomOut" feels calmer.'
|
|
2919
|
+
};
|
|
2920
|
+
|
|
2921
|
+
// src/components/registry.ts
|
|
2922
|
+
function registerBuiltInComponents() {
|
|
2923
|
+
if (!globalRegistry.has("Segment")) {
|
|
2924
|
+
globalRegistry.register({
|
|
2925
|
+
type: "Segment",
|
|
2926
|
+
component: Segment,
|
|
2927
|
+
propsSchema: SegmentPropsSchema,
|
|
2928
|
+
metadata: SegmentComponentMetadata
|
|
2929
|
+
});
|
|
2930
|
+
}
|
|
2931
|
+
if (!globalRegistry.has("Box")) {
|
|
2932
|
+
globalRegistry.register({
|
|
2933
|
+
type: "Box",
|
|
2934
|
+
component: Box,
|
|
2935
|
+
propsSchema: BoxPropsSchema,
|
|
2936
|
+
metadata: BoxComponentMetadata
|
|
2937
|
+
});
|
|
2938
|
+
}
|
|
2939
|
+
if (!globalRegistry.has("Frame")) {
|
|
2940
|
+
globalRegistry.register({
|
|
2941
|
+
type: "Frame",
|
|
2942
|
+
component: Frame,
|
|
2943
|
+
propsSchema: FramePropsSchema,
|
|
2944
|
+
metadata: FrameComponentMetadata
|
|
2945
|
+
});
|
|
2946
|
+
}
|
|
2947
|
+
if (!globalRegistry.has("Stack")) {
|
|
2948
|
+
globalRegistry.register({
|
|
2949
|
+
type: "Stack",
|
|
2950
|
+
component: Stack,
|
|
2951
|
+
propsSchema: StackPropsSchema,
|
|
2952
|
+
metadata: StackComponentMetadata
|
|
2953
|
+
});
|
|
2954
|
+
}
|
|
2955
|
+
if (!globalRegistry.has("Grid")) {
|
|
2956
|
+
globalRegistry.register({
|
|
2957
|
+
type: "Grid",
|
|
2958
|
+
component: Grid,
|
|
2959
|
+
propsSchema: GridPropsSchema,
|
|
2960
|
+
metadata: GridComponentMetadata
|
|
2961
|
+
});
|
|
2962
|
+
}
|
|
2963
|
+
if (!globalRegistry.has("Layers")) {
|
|
2964
|
+
globalRegistry.register({
|
|
2965
|
+
type: "Layers",
|
|
2966
|
+
component: Layers,
|
|
2967
|
+
propsSchema: LayersPropsSchema,
|
|
2968
|
+
metadata: LayersComponentMetadata
|
|
2969
|
+
});
|
|
2970
|
+
}
|
|
2971
|
+
if (!globalRegistry.has("Layer")) {
|
|
2972
|
+
globalRegistry.register({
|
|
2973
|
+
type: "Layer",
|
|
2974
|
+
component: Layer,
|
|
2975
|
+
propsSchema: LayerPropsSchema,
|
|
2976
|
+
metadata: LayerComponentMetadata
|
|
2977
|
+
});
|
|
2978
|
+
}
|
|
2979
|
+
if (!globalRegistry.has("Image")) {
|
|
2980
|
+
globalRegistry.register({
|
|
2981
|
+
type: "Image",
|
|
2982
|
+
component: Image,
|
|
2983
|
+
propsSchema: ImagePropsSchema,
|
|
2984
|
+
metadata: ImageComponentMetadata
|
|
2985
|
+
});
|
|
2986
|
+
}
|
|
2987
|
+
if (!globalRegistry.has("Video")) {
|
|
2988
|
+
globalRegistry.register({
|
|
2989
|
+
type: "Video",
|
|
2990
|
+
component: Video2,
|
|
2991
|
+
propsSchema: VideoPropsSchema,
|
|
2992
|
+
metadata: VideoComponentMetadata
|
|
2993
|
+
});
|
|
2994
|
+
}
|
|
2995
|
+
if (!globalRegistry.has("Shape")) {
|
|
2996
|
+
globalRegistry.register({
|
|
2997
|
+
type: "Shape",
|
|
2998
|
+
component: Shape,
|
|
2999
|
+
propsSchema: ShapePropsSchema,
|
|
3000
|
+
metadata: ShapeComponentMetadata
|
|
3001
|
+
});
|
|
3002
|
+
}
|
|
3003
|
+
if (!globalRegistry.has("TypewriterText")) {
|
|
3004
|
+
globalRegistry.register({
|
|
3005
|
+
type: "TypewriterText",
|
|
3006
|
+
component: TypewriterText,
|
|
3007
|
+
propsSchema: TypewriterTextPropsSchema,
|
|
3008
|
+
metadata: TypewriterTextComponentMetadata
|
|
3009
|
+
});
|
|
3010
|
+
}
|
|
3011
|
+
if (!globalRegistry.has("SplitText")) {
|
|
3012
|
+
globalRegistry.register({
|
|
3013
|
+
type: "SplitText",
|
|
3014
|
+
component: SplitText,
|
|
3015
|
+
propsSchema: SplitTextPropsSchema,
|
|
3016
|
+
metadata: SplitTextComponentMetadata
|
|
3017
|
+
});
|
|
3018
|
+
}
|
|
3019
|
+
if (!globalRegistry.has("KenBurnsImage")) {
|
|
3020
|
+
globalRegistry.register({
|
|
3021
|
+
type: "KenBurnsImage",
|
|
3022
|
+
component: KenBurnsImage,
|
|
3023
|
+
propsSchema: KenBurnsImagePropsSchema,
|
|
3024
|
+
metadata: KenBurnsImageComponentMetadata
|
|
3025
|
+
});
|
|
3026
|
+
}
|
|
3027
|
+
if (!globalRegistry.has("FadeTransition")) {
|
|
3028
|
+
globalRegistry.register({
|
|
3029
|
+
type: "FadeTransition",
|
|
3030
|
+
component: FadeTransition,
|
|
3031
|
+
propsSchema: FadeTransitionPropsSchema,
|
|
3032
|
+
metadata: FadeTransitionComponentMetadata
|
|
3033
|
+
});
|
|
3034
|
+
}
|
|
3035
|
+
if (!globalRegistry.has("SlideTransition")) {
|
|
3036
|
+
globalRegistry.register({
|
|
3037
|
+
type: "SlideTransition",
|
|
3038
|
+
component: SlideTransition,
|
|
3039
|
+
propsSchema: SlideTransitionPropsSchema,
|
|
3040
|
+
metadata: SlideTransitionComponentMetadata
|
|
3041
|
+
});
|
|
3042
|
+
}
|
|
3043
|
+
if (!globalRegistry.has("SplitScreen")) {
|
|
3044
|
+
globalRegistry.register({
|
|
3045
|
+
type: "SplitScreen",
|
|
3046
|
+
component: SplitScreen,
|
|
3047
|
+
propsSchema: SplitScreenPropsSchema,
|
|
3048
|
+
metadata: SplitScreenComponentMetadata
|
|
3049
|
+
});
|
|
3050
|
+
}
|
|
3051
|
+
if (!globalRegistry.has("ThirdLowerBanner")) {
|
|
3052
|
+
globalRegistry.register({
|
|
3053
|
+
type: "ThirdLowerBanner",
|
|
3054
|
+
component: ThirdLowerBanner,
|
|
3055
|
+
propsSchema: ThirdLowerBannerPropsSchema,
|
|
3056
|
+
metadata: ThirdLowerBannerComponentMetadata
|
|
3057
|
+
});
|
|
3058
|
+
}
|
|
3059
|
+
if (!globalRegistry.has("AnimatedCounter")) {
|
|
3060
|
+
globalRegistry.register({
|
|
3061
|
+
type: "AnimatedCounter",
|
|
3062
|
+
component: AnimatedCounter,
|
|
3063
|
+
propsSchema: AnimatedCounterPropsSchema,
|
|
3064
|
+
metadata: AnimatedCounterComponentMetadata
|
|
3065
|
+
});
|
|
3066
|
+
}
|
|
3067
|
+
if (!globalRegistry.has("LogoReveal")) {
|
|
3068
|
+
globalRegistry.register({
|
|
3069
|
+
type: "LogoReveal",
|
|
3070
|
+
component: LogoReveal,
|
|
3071
|
+
propsSchema: LogoRevealPropsSchema,
|
|
3072
|
+
metadata: LogoRevealComponentMetadata
|
|
3073
|
+
});
|
|
3074
|
+
}
|
|
3075
|
+
if (!globalRegistry.has("Watermark")) {
|
|
3076
|
+
globalRegistry.register({
|
|
3077
|
+
type: "Watermark",
|
|
3078
|
+
component: Watermark,
|
|
3079
|
+
propsSchema: WatermarkPropsSchema,
|
|
3080
|
+
metadata: WatermarkComponentMetadata
|
|
3081
|
+
});
|
|
3082
|
+
}
|
|
3083
|
+
if (!globalRegistry.has("GlitchText")) {
|
|
3084
|
+
globalRegistry.register({
|
|
3085
|
+
type: "GlitchText",
|
|
3086
|
+
component: GlitchText,
|
|
3087
|
+
propsSchema: GlitchTextPropsSchema,
|
|
3088
|
+
metadata: GlitchTextComponentMetadata
|
|
3089
|
+
});
|
|
3090
|
+
}
|
|
3091
|
+
if (!globalRegistry.has("OutlineText")) {
|
|
3092
|
+
globalRegistry.register({
|
|
3093
|
+
type: "OutlineText",
|
|
3094
|
+
component: OutlineText,
|
|
3095
|
+
propsSchema: OutlineTextPropsSchema,
|
|
3096
|
+
metadata: OutlineTextComponentMetadata
|
|
3097
|
+
});
|
|
3098
|
+
}
|
|
3099
|
+
if (!globalRegistry.has("ImageReveal")) {
|
|
3100
|
+
globalRegistry.register({
|
|
3101
|
+
type: "ImageReveal",
|
|
3102
|
+
component: ImageReveal,
|
|
3103
|
+
propsSchema: ImageRevealPropsSchema,
|
|
3104
|
+
metadata: ImageRevealComponentMetadata
|
|
3105
|
+
});
|
|
3106
|
+
}
|
|
3107
|
+
if (!globalRegistry.has("ImageCollage")) {
|
|
3108
|
+
globalRegistry.register({
|
|
3109
|
+
type: "ImageCollage",
|
|
3110
|
+
component: ImageCollage,
|
|
3111
|
+
propsSchema: ImageCollagePropsSchema,
|
|
3112
|
+
metadata: ImageCollageComponentMetadata
|
|
3113
|
+
});
|
|
3114
|
+
}
|
|
3115
|
+
if (!globalRegistry.has("ProgressBar")) {
|
|
3116
|
+
globalRegistry.register({
|
|
3117
|
+
type: "ProgressBar",
|
|
3118
|
+
component: ProgressBar,
|
|
3119
|
+
propsSchema: ProgressBarPropsSchema,
|
|
3120
|
+
metadata: ProgressBarComponentMetadata
|
|
3121
|
+
});
|
|
3122
|
+
}
|
|
3123
|
+
if (!globalRegistry.has("ProgressRing")) {
|
|
3124
|
+
globalRegistry.register({
|
|
3125
|
+
type: "ProgressRing",
|
|
3126
|
+
component: ProgressRing,
|
|
3127
|
+
propsSchema: ProgressRingPropsSchema,
|
|
3128
|
+
metadata: ProgressRingComponentMetadata
|
|
3129
|
+
});
|
|
3130
|
+
}
|
|
3131
|
+
if (!globalRegistry.has("BarChart")) {
|
|
3132
|
+
globalRegistry.register({
|
|
3133
|
+
type: "BarChart",
|
|
3134
|
+
component: BarChart,
|
|
3135
|
+
propsSchema: BarChartPropsSchema,
|
|
3136
|
+
metadata: BarChartComponentMetadata
|
|
3137
|
+
});
|
|
3138
|
+
}
|
|
3139
|
+
if (!globalRegistry.has("InstagramStory")) {
|
|
3140
|
+
globalRegistry.register({
|
|
3141
|
+
type: "InstagramStory",
|
|
3142
|
+
component: InstagramStory,
|
|
3143
|
+
propsSchema: InstagramStoryPropsSchema,
|
|
3144
|
+
metadata: InstagramStoryComponentMetadata
|
|
3145
|
+
});
|
|
3146
|
+
}
|
|
3147
|
+
if (!globalRegistry.has("TikTokCaption")) {
|
|
3148
|
+
globalRegistry.register({
|
|
3149
|
+
type: "TikTokCaption",
|
|
3150
|
+
component: TikTokCaption,
|
|
3151
|
+
propsSchema: TikTokCaptionPropsSchema,
|
|
3152
|
+
metadata: TikTokCaptionComponentMetadata
|
|
3153
|
+
});
|
|
3154
|
+
}
|
|
3155
|
+
if (!globalRegistry.has("IntroScene")) {
|
|
3156
|
+
globalRegistry.register({
|
|
3157
|
+
type: "IntroScene",
|
|
3158
|
+
component: IntroScene,
|
|
3159
|
+
propsSchema: IntroScenePropsSchema,
|
|
3160
|
+
metadata: IntroSceneComponentMetadata
|
|
3161
|
+
});
|
|
3162
|
+
}
|
|
3163
|
+
if (!globalRegistry.has("CountUpText")) {
|
|
3164
|
+
globalRegistry.register({
|
|
3165
|
+
type: "CountUpText",
|
|
3166
|
+
component: CountUpText,
|
|
3167
|
+
propsSchema: CountUpTextPropsSchema,
|
|
3168
|
+
metadata: CountUpTextComponentMetadata
|
|
3169
|
+
});
|
|
3170
|
+
}
|
|
3171
|
+
if (!globalRegistry.has("KineticTypography")) {
|
|
3172
|
+
globalRegistry.register({
|
|
3173
|
+
type: "KineticTypography",
|
|
3174
|
+
component: KineticTypography,
|
|
3175
|
+
propsSchema: KineticTypographyPropsSchema,
|
|
3176
|
+
metadata: KineticTypographyComponentMetadata
|
|
3177
|
+
});
|
|
3178
|
+
}
|
|
3179
|
+
if (!globalRegistry.has("SubtitleText")) {
|
|
3180
|
+
globalRegistry.register({
|
|
3181
|
+
type: "SubtitleText",
|
|
3182
|
+
component: SubtitleText,
|
|
3183
|
+
propsSchema: SubtitleTextPropsSchema,
|
|
3184
|
+
metadata: SubtitleTextComponentMetadata
|
|
3185
|
+
});
|
|
3186
|
+
}
|
|
3187
|
+
if (!globalRegistry.has("ImageSequence")) {
|
|
3188
|
+
globalRegistry.register({
|
|
3189
|
+
type: "ImageSequence",
|
|
3190
|
+
component: ImageSequence,
|
|
3191
|
+
propsSchema: ImageSequencePropsSchema,
|
|
3192
|
+
metadata: ImageSequenceComponentMetadata
|
|
3193
|
+
});
|
|
3194
|
+
}
|
|
3195
|
+
if (!globalRegistry.has("ImageWithCaption")) {
|
|
3196
|
+
globalRegistry.register({
|
|
3197
|
+
type: "ImageWithCaption",
|
|
3198
|
+
component: ImageWithCaption,
|
|
3199
|
+
propsSchema: ImageWithCaptionPropsSchema,
|
|
3200
|
+
metadata: ImageWithCaptionComponentMetadata
|
|
3201
|
+
});
|
|
3202
|
+
}
|
|
3203
|
+
if (!globalRegistry.has("VideoWithOverlay")) {
|
|
3204
|
+
globalRegistry.register({
|
|
3205
|
+
type: "VideoWithOverlay",
|
|
3206
|
+
component: VideoWithOverlay,
|
|
3207
|
+
propsSchema: VideoWithOverlayPropsSchema,
|
|
3208
|
+
metadata: VideoWithOverlayComponentMetadata
|
|
3209
|
+
});
|
|
3210
|
+
}
|
|
3211
|
+
if (!globalRegistry.has("ZoomTransition")) {
|
|
3212
|
+
globalRegistry.register({
|
|
3213
|
+
type: "ZoomTransition",
|
|
3214
|
+
component: ZoomTransition,
|
|
3215
|
+
propsSchema: ZoomTransitionPropsSchema,
|
|
3216
|
+
metadata: ZoomTransitionComponentMetadata
|
|
3217
|
+
});
|
|
3218
|
+
}
|
|
3219
|
+
if (!globalRegistry.has("WipeTransition")) {
|
|
3220
|
+
globalRegistry.register({
|
|
3221
|
+
type: "WipeTransition",
|
|
3222
|
+
component: WipeTransition,
|
|
3223
|
+
propsSchema: WipeTransitionPropsSchema,
|
|
3224
|
+
metadata: WipeTransitionComponentMetadata
|
|
3225
|
+
});
|
|
3226
|
+
}
|
|
3227
|
+
if (!globalRegistry.has("CircularReveal")) {
|
|
3228
|
+
globalRegistry.register({
|
|
3229
|
+
type: "CircularReveal",
|
|
3230
|
+
component: CircularReveal,
|
|
3231
|
+
propsSchema: CircularRevealPropsSchema,
|
|
3232
|
+
metadata: CircularRevealComponentMetadata
|
|
3233
|
+
});
|
|
3234
|
+
}
|
|
3235
|
+
if (!globalRegistry.has("CardStack")) {
|
|
3236
|
+
globalRegistry.register({
|
|
3237
|
+
type: "CardStack",
|
|
3238
|
+
component: CardStack,
|
|
3239
|
+
propsSchema: CardStackPropsSchema,
|
|
3240
|
+
metadata: CardStackComponentMetadata
|
|
3241
|
+
});
|
|
3242
|
+
}
|
|
3243
|
+
if (!globalRegistry.has("GridLayout")) {
|
|
3244
|
+
globalRegistry.register({
|
|
3245
|
+
type: "GridLayout",
|
|
3246
|
+
component: GridLayout,
|
|
3247
|
+
propsSchema: GridLayoutPropsSchema,
|
|
3248
|
+
metadata: GridLayoutComponentMetadata
|
|
3249
|
+
});
|
|
3250
|
+
}
|
|
3251
|
+
if (!globalRegistry.has("LineGraph")) {
|
|
3252
|
+
globalRegistry.register({
|
|
3253
|
+
type: "LineGraph",
|
|
3254
|
+
component: LineGraph,
|
|
3255
|
+
propsSchema: LineGraphPropsSchema,
|
|
3256
|
+
metadata: LineGraphComponentMetadata
|
|
3257
|
+
});
|
|
3258
|
+
}
|
|
3259
|
+
if (!globalRegistry.has("YouTubeThumbnail")) {
|
|
3260
|
+
globalRegistry.register({
|
|
3261
|
+
type: "YouTubeThumbnail",
|
|
3262
|
+
component: YouTubeThumbnail,
|
|
3263
|
+
propsSchema: YouTubeThumbnailPropsSchema,
|
|
3264
|
+
metadata: YouTubeThumbnailComponentMetadata
|
|
3265
|
+
});
|
|
3266
|
+
}
|
|
3267
|
+
if (!globalRegistry.has("TwitterCard")) {
|
|
3268
|
+
globalRegistry.register({
|
|
3269
|
+
type: "TwitterCard",
|
|
3270
|
+
component: TwitterCard,
|
|
3271
|
+
propsSchema: TwitterCardPropsSchema,
|
|
3272
|
+
metadata: TwitterCardComponentMetadata
|
|
3273
|
+
});
|
|
3274
|
+
}
|
|
3275
|
+
if (!globalRegistry.has("OutroScene")) {
|
|
3276
|
+
globalRegistry.register({
|
|
3277
|
+
type: "OutroScene",
|
|
3278
|
+
component: OutroScene,
|
|
3279
|
+
propsSchema: OutroScenePropsSchema,
|
|
3280
|
+
metadata: OutroSceneComponentMetadata
|
|
3281
|
+
});
|
|
3282
|
+
}
|
|
3283
|
+
if (!globalRegistry.has("Scene")) {
|
|
3284
|
+
globalRegistry.register({
|
|
3285
|
+
type: "Scene",
|
|
3286
|
+
component: Scene,
|
|
3287
|
+
propsSchema: ScenePropsSchema,
|
|
3288
|
+
metadata: SceneComponentMetadata
|
|
3289
|
+
});
|
|
3290
|
+
}
|
|
3291
|
+
if (!globalRegistry.has("Text")) {
|
|
3292
|
+
globalRegistry.register({
|
|
3293
|
+
type: "Text",
|
|
3294
|
+
component: Text,
|
|
3295
|
+
propsSchema: TextPropsSchema,
|
|
3296
|
+
metadata: TextComponentMetadata
|
|
3297
|
+
});
|
|
3298
|
+
}
|
|
3299
|
+
if (!globalRegistry.has("Audio")) {
|
|
3300
|
+
globalRegistry.register({
|
|
3301
|
+
type: "Audio",
|
|
3302
|
+
component: Audio,
|
|
3303
|
+
propsSchema: AudioPropsSchema,
|
|
3304
|
+
metadata: AudioComponentMetadata
|
|
3305
|
+
});
|
|
3306
|
+
}
|
|
3307
|
+
}
|
|
3308
|
+
|
|
3309
|
+
// src/utils/errors.ts
|
|
3310
|
+
var WavesError = class _WavesError extends Error {
|
|
3311
|
+
constructor(message, context) {
|
|
3312
|
+
super(message);
|
|
3313
|
+
this.context = context;
|
|
3314
|
+
this.name = "WavesError";
|
|
3315
|
+
Object.setPrototypeOf(this, _WavesError.prototype);
|
|
3316
|
+
}
|
|
3317
|
+
};
|
|
3318
|
+
var WavesValidationError = class _WavesValidationError extends WavesError {
|
|
3319
|
+
constructor(message, context) {
|
|
3320
|
+
super(message, context);
|
|
3321
|
+
this.name = "WavesValidationError";
|
|
3322
|
+
Object.setPrototypeOf(this, _WavesValidationError.prototype);
|
|
3323
|
+
}
|
|
3324
|
+
};
|
|
3325
|
+
var WavesRenderError = class _WavesRenderError extends WavesError {
|
|
3326
|
+
constructor(message, context) {
|
|
3327
|
+
super(message, context);
|
|
3328
|
+
this.name = "WavesRenderError";
|
|
3329
|
+
Object.setPrototypeOf(this, _WavesRenderError.prototype);
|
|
3330
|
+
}
|
|
3331
|
+
};
|
|
3332
|
+
|
|
3333
|
+
export {
|
|
3334
|
+
__require,
|
|
3335
|
+
zodSchemaToJsonSchema,
|
|
3336
|
+
VideoIRv2Schema,
|
|
3337
|
+
VideoIRv2AuthoringSchema,
|
|
3338
|
+
VideoIRSchema,
|
|
3339
|
+
ComponentRegistry,
|
|
3340
|
+
globalRegistry,
|
|
3341
|
+
Fill,
|
|
3342
|
+
registerBuiltInComponents,
|
|
3343
|
+
WavesError,
|
|
3344
|
+
WavesValidationError,
|
|
3345
|
+
WavesRenderError
|
|
3346
|
+
};
|