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