@makeitvisible/cli 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.
@@ -0,0 +1,716 @@
1
+ import { registerRoot, Composition, useVideoConfig, Sequence, useCurrentFrame, interpolate, AbsoluteFill, spring } from 'remotion';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/video/remotion/index.tsx
5
+
6
+ // src/video/remotion/theme.ts
7
+ var colors = {
8
+ // Backgrounds
9
+ background: "#0A0A0B",
10
+ card: "#141415",
11
+ popover: "#1C1C1E",
12
+ // Text
13
+ foreground: "#FAFAFA",
14
+ mutedForeground: "#A1A1A6",
15
+ // Accent colors
16
+ primary: "#10B981",
17
+ // Green
18
+ primaryForeground: "#FAFAFA",
19
+ // Secondary
20
+ secondary: "#27272A",
21
+ secondaryForeground: "#FAFAFA",
22
+ // Destructive
23
+ destructive: "#EF4444",
24
+ // Border
25
+ border: "#27272A",
26
+ // Chart colors
27
+ chart: {
28
+ 3: "#0EA5E9"}
29
+ };
30
+ var typography = {
31
+ fontFamily: {
32
+ sans: 'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
33
+ mono: 'JetBrains Mono, "Fira Code", Monaco, Consolas, monospace'
34
+ },
35
+ fontSize: {
36
+ xs: 12,
37
+ sm: 14,
38
+ base: 16,
39
+ lg: 18,
40
+ xl: 20,
41
+ "2xl": 24,
42
+ "3xl": 30,
43
+ "4xl": 36,
44
+ "5xl": 48},
45
+ fontWeight: {
46
+ medium: 500,
47
+ semibold: 600,
48
+ bold: 700
49
+ },
50
+ lineHeight: {
51
+ relaxed: 1.625
52
+ }
53
+ };
54
+ var spacing = {
55
+ 1: 4,
56
+ 2: 8,
57
+ 3: 12,
58
+ 4: 16,
59
+ 6: 24,
60
+ 8: 32,
61
+ 10: 40,
62
+ 12: 48,
63
+ 16: 64};
64
+ var borderRadius = {
65
+ sm: 4,
66
+ md: 6,
67
+ lg: 8,
68
+ full: 9999
69
+ };
70
+ var animation = {
71
+ duration: {
72
+ fast: 8,
73
+ normal: 15}
74
+ };
75
+ var dimensions = {
76
+ "1080p": { width: 1920, height: 1080 },
77
+ "720p": { width: 1280, height: 720 },
78
+ square: { width: 1080, height: 1080 },
79
+ vertical: { width: 1080, height: 1920 }
80
+ };
81
+ var Main = ({ storyboard }) => {
82
+ const { width, height } = useVideoConfig();
83
+ let currentFrame = 0;
84
+ return /* @__PURE__ */ jsx("div", { style: { width, height, position: "relative", overflow: "hidden" }, children: storyboard.scenes.map((scene, index) => {
85
+ const startFrame = currentFrame;
86
+ currentFrame += scene.durationInFrames;
87
+ return /* @__PURE__ */ jsx(
88
+ Sequence,
89
+ {
90
+ from: startFrame,
91
+ durationInFrames: scene.durationInFrames,
92
+ name: `${scene.type}-${index}`,
93
+ children: /* @__PURE__ */ jsx(SceneRenderer, { scene, storyboard })
94
+ },
95
+ scene.id
96
+ );
97
+ }) });
98
+ };
99
+ var SceneRenderer = ({
100
+ scene,
101
+ storyboard
102
+ }) => {
103
+ const { artifact } = storyboard;
104
+ switch (scene.type) {
105
+ case "title":
106
+ return /* @__PURE__ */ jsx(
107
+ TitleScene,
108
+ {
109
+ title: scene.title,
110
+ description: scene.content,
111
+ keywords: scene.props?.keywords,
112
+ sourceType: artifact.source.type
113
+ }
114
+ );
115
+ case "overview":
116
+ return /* @__PURE__ */ jsx(
117
+ OverviewScene,
118
+ {
119
+ title: scene.title,
120
+ summary: scene.content,
121
+ componentCount: scene.props?.componentCount || 0,
122
+ breakingChanges: scene.props?.breakingChanges || false
123
+ }
124
+ );
125
+ case "walkthrough":
126
+ return /* @__PURE__ */ jsx(
127
+ WalkthroughScene,
128
+ {
129
+ title: scene.title,
130
+ steps: scene.props?.steps || [scene.content],
131
+ stepIndex: scene.props?.stepIndex || 0
132
+ }
133
+ );
134
+ case "code":
135
+ return /* @__PURE__ */ jsx(
136
+ CodeScene,
137
+ {
138
+ title: scene.title,
139
+ files: scene.props?.files || [],
140
+ totalFiles: scene.props?.totalFiles || 0
141
+ }
142
+ );
143
+ case "code-highlight":
144
+ return /* @__PURE__ */ jsx(
145
+ CodeHighlightScene,
146
+ {
147
+ title: scene.title,
148
+ snippets: scene.props?.snippets || []
149
+ }
150
+ );
151
+ case "ui":
152
+ return /* @__PURE__ */ jsx(
153
+ UIScene,
154
+ {
155
+ title: scene.title,
156
+ componentName: scene.props?.componentName || "Component",
157
+ description: scene.content,
158
+ jsx: scene.props?.jsx,
159
+ pattern: scene.props?.pattern
160
+ }
161
+ );
162
+ case "outro":
163
+ return /* @__PURE__ */ jsx(
164
+ OutroScene,
165
+ {
166
+ title: scene.title,
167
+ content: scene.content,
168
+ guidelines: scene.props?.guidelines || []
169
+ }
170
+ );
171
+ default:
172
+ return /* @__PURE__ */ jsx(DefaultScene, { title: scene.title, content: scene.content });
173
+ }
174
+ };
175
+ var TitleScene = ({ title, description, keywords = [], sourceType }) => {
176
+ const frame = useCurrentFrame();
177
+ const { fps, durationInFrames } = useVideoConfig();
178
+ const logoScale = spring({ frame, fps, config: { damping: 12, stiffness: 100 } });
179
+ const titleOpacity = interpolate(frame, [15, 30], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
180
+ const titleY = interpolate(frame, [15, 30], [30, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
181
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
182
+ return /* @__PURE__ */ jsxs(
183
+ AbsoluteFill,
184
+ {
185
+ style: {
186
+ backgroundColor: colors.background,
187
+ display: "flex",
188
+ flexDirection: "column",
189
+ alignItems: "center",
190
+ justifyContent: "center",
191
+ padding: spacing[16],
192
+ opacity: fadeOut,
193
+ fontFamily: typography.fontFamily.sans
194
+ },
195
+ children: [
196
+ /* @__PURE__ */ jsx("div", { style: { marginBottom: spacing[12], transform: `scale(${logoScale})` }, children: /* @__PURE__ */ jsx(Logo, {}) }),
197
+ sourceType && /* @__PURE__ */ jsx("div", { style: { marginBottom: spacing[4], opacity: titleOpacity }, children: /* @__PURE__ */ jsx(Badge, { children: formatSourceType(sourceType) }) }),
198
+ /* @__PURE__ */ jsx("div", { style: { opacity: titleOpacity, transform: `translateY(${titleY}px)`, textAlign: "center", maxWidth: 1200 }, children: /* @__PURE__ */ jsx("h1", { style: { color: colors.foreground, fontSize: typography.fontSize["5xl"], fontWeight: typography.fontWeight.bold, margin: 0 }, children: title }) }),
199
+ /* @__PURE__ */ jsx("div", { style: { marginTop: spacing[6], opacity: titleOpacity, textAlign: "center", maxWidth: 900 }, children: /* @__PURE__ */ jsx("p", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.lg, margin: 0, lineHeight: typography.lineHeight.relaxed }, children: description }) }),
200
+ keywords.length > 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: spacing[8], display: "flex", gap: spacing[2], opacity: interpolate(frame, [45, 60], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" }) }, children: keywords.slice(0, 5).map((kw, i) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: kw }, i)) })
201
+ ]
202
+ }
203
+ );
204
+ };
205
+ var OverviewScene = ({ title, summary, componentCount, breakingChanges }) => {
206
+ const frame = useCurrentFrame();
207
+ const { fps, durationInFrames } = useVideoConfig();
208
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
209
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
210
+ const cardScale = spring({ frame: frame - 15, fps, config: { damping: 12, stiffness: 100 } });
211
+ return /* @__PURE__ */ jsxs(
212
+ AbsoluteFill,
213
+ {
214
+ style: {
215
+ backgroundColor: colors.background,
216
+ display: "flex",
217
+ flexDirection: "column",
218
+ alignItems: "center",
219
+ justifyContent: "center",
220
+ padding: spacing[16],
221
+ opacity: fadeIn * fadeOut,
222
+ fontFamily: typography.fontFamily.sans
223
+ },
224
+ children: [
225
+ /* @__PURE__ */ jsx("h2", { style: { color: colors.primary, fontSize: typography.fontSize["4xl"], fontWeight: typography.fontWeight.bold, marginBottom: spacing[8] }, children: title }),
226
+ /* @__PURE__ */ jsx("div", { style: { transform: `scale(${Math.max(0, cardScale)})`, width: "100%", maxWidth: 900 }, children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx("p", { style: { color: colors.foreground, fontSize: typography.fontSize.lg, lineHeight: typography.lineHeight.relaxed, margin: 0 }, children: summary }) }) }),
227
+ /* @__PURE__ */ jsxs("div", { style: { marginTop: spacing[10], display: "flex", gap: spacing[8], opacity: interpolate(frame, [30, 45], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" }) }, children: [
228
+ /* @__PURE__ */ jsx(MetricCard, { label: "Files Changed", value: String(componentCount) }),
229
+ /* @__PURE__ */ jsx(MetricCard, { label: "Breaking Changes", value: breakingChanges ? "Yes" : "No", variant: breakingChanges ? "destructive" : "default" })
230
+ ] })
231
+ ]
232
+ }
233
+ );
234
+ };
235
+ var WalkthroughScene = ({ title, steps, stepIndex }) => {
236
+ const frame = useCurrentFrame();
237
+ const { durationInFrames } = useVideoConfig();
238
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
239
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
240
+ return /* @__PURE__ */ jsxs(
241
+ AbsoluteFill,
242
+ {
243
+ style: {
244
+ backgroundColor: colors.background,
245
+ display: "flex",
246
+ flexDirection: "column",
247
+ padding: spacing[16],
248
+ opacity: fadeIn * fadeOut,
249
+ fontFamily: typography.fontFamily.sans
250
+ },
251
+ children: [
252
+ /* @__PURE__ */ jsx("h2", { style: { color: colors.primary, fontSize: typography.fontSize["3xl"], fontWeight: typography.fontWeight.bold, marginBottom: spacing[10] }, children: title }),
253
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: spacing[4] }, children: steps.map((step, i) => /* @__PURE__ */ jsx(StepItem, { step, number: stepIndex * 3 + i + 1, delay: 20 + i * 15, frame }, i)) })
254
+ ]
255
+ }
256
+ );
257
+ };
258
+ var StepItem = ({ step, number, delay, frame }) => {
259
+ const opacity = interpolate(frame, [delay, delay + animation.duration.normal], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
260
+ const translateX = interpolate(frame, [delay, delay + animation.duration.normal], [-30, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
261
+ return /* @__PURE__ */ jsxs(
262
+ "div",
263
+ {
264
+ style: {
265
+ display: "flex",
266
+ gap: spacing[4],
267
+ alignItems: "flex-start",
268
+ opacity,
269
+ transform: `translateX(${translateX}px)`,
270
+ padding: spacing[4],
271
+ backgroundColor: colors.card,
272
+ borderRadius: borderRadius.lg,
273
+ border: `1px solid ${colors.border}`
274
+ },
275
+ children: [
276
+ /* @__PURE__ */ jsx(
277
+ "div",
278
+ {
279
+ style: {
280
+ width: 40,
281
+ height: 40,
282
+ borderRadius: borderRadius.full,
283
+ backgroundColor: colors.primary,
284
+ display: "flex",
285
+ alignItems: "center",
286
+ justifyContent: "center",
287
+ flexShrink: 0,
288
+ color: colors.primaryForeground,
289
+ fontWeight: typography.fontWeight.bold
290
+ },
291
+ children: number
292
+ }
293
+ ),
294
+ /* @__PURE__ */ jsx("p", { style: { color: colors.foreground, fontSize: typography.fontSize.base, lineHeight: typography.lineHeight.relaxed, margin: 0, paddingTop: spacing[2] }, children: step })
295
+ ]
296
+ }
297
+ );
298
+ };
299
+ var CodeScene = ({ title, files, totalFiles }) => {
300
+ const frame = useCurrentFrame();
301
+ const { durationInFrames } = useVideoConfig();
302
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
303
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
304
+ return /* @__PURE__ */ jsxs(
305
+ AbsoluteFill,
306
+ {
307
+ style: {
308
+ backgroundColor: colors.background,
309
+ display: "flex",
310
+ flexDirection: "column",
311
+ padding: spacing[16],
312
+ opacity: fadeIn * fadeOut,
313
+ fontFamily: typography.fontFamily.sans
314
+ },
315
+ children: [
316
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: spacing[4], marginBottom: spacing[8] }, children: [
317
+ /* @__PURE__ */ jsx(FolderIcon, {}),
318
+ /* @__PURE__ */ jsx("h2", { style: { color: colors.primary, fontSize: typography.fontSize["3xl"], fontWeight: typography.fontWeight.bold, margin: 0 }, children: title }),
319
+ /* @__PURE__ */ jsxs("span", { style: { marginLeft: "auto", color: colors.mutedForeground, fontSize: typography.fontSize.xl }, children: [
320
+ totalFiles,
321
+ " file",
322
+ totalFiles !== 1 ? "s" : ""
323
+ ] })
324
+ ] }),
325
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: spacing[2] }, children: [
326
+ files.map((file, i) => /* @__PURE__ */ jsx(FileItem, { file, index: i, frame }, file)),
327
+ totalFiles > files.length && /* @__PURE__ */ jsxs("div", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.sm, padding: spacing[2] }, children: [
328
+ "+",
329
+ totalFiles - files.length,
330
+ " more files"
331
+ ] })
332
+ ] })
333
+ ]
334
+ }
335
+ );
336
+ };
337
+ var FileItem = ({ file, index, frame }) => {
338
+ const delay = index * 5;
339
+ const opacity = interpolate(frame, [delay, delay + animation.duration.fast], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
340
+ const translateX = interpolate(frame, [delay, delay + animation.duration.fast], [-20, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
341
+ return /* @__PURE__ */ jsxs(
342
+ "div",
343
+ {
344
+ style: {
345
+ display: "flex",
346
+ alignItems: "center",
347
+ gap: spacing[3],
348
+ padding: `${spacing[2]}px ${spacing[3]}px`,
349
+ backgroundColor: colors.popover,
350
+ borderRadius: borderRadius.md,
351
+ border: `1px solid ${colors.border}`,
352
+ opacity,
353
+ transform: `translateX(${translateX}px)`
354
+ },
355
+ children: [
356
+ /* @__PURE__ */ jsx(FileIcon, {}),
357
+ /* @__PURE__ */ jsx("span", { style: { fontFamily: typography.fontFamily.mono, fontSize: typography.fontSize.sm, color: colors.foreground }, children: file })
358
+ ]
359
+ }
360
+ );
361
+ };
362
+ var CodeHighlightScene = ({ title, snippets }) => {
363
+ const frame = useCurrentFrame();
364
+ const { durationInFrames } = useVideoConfig();
365
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
366
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
367
+ return /* @__PURE__ */ jsxs(
368
+ AbsoluteFill,
369
+ {
370
+ style: {
371
+ backgroundColor: colors.background,
372
+ display: "flex",
373
+ flexDirection: "column",
374
+ padding: spacing[12],
375
+ opacity: fadeIn * fadeOut,
376
+ fontFamily: typography.fontFamily.sans
377
+ },
378
+ children: [
379
+ /* @__PURE__ */ jsx("h3", { style: { color: colors.primary, fontSize: typography.fontSize["2xl"], fontWeight: typography.fontWeight.semibold, marginBottom: spacing[6] }, children: title }),
380
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, display: "flex", gap: spacing[4] }, children: snippets.map((snippet, i) => /* @__PURE__ */ jsx(CodeSnippetCard, { snippet, index: i, frame }, i)) })
381
+ ]
382
+ }
383
+ );
384
+ };
385
+ var CodeSnippetCard = ({ snippet, index, frame }) => {
386
+ const delay = 15 + index * 10;
387
+ const opacity = interpolate(frame, [delay, delay + animation.duration.normal], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
388
+ const accentColor = snippet.changeType === "added" ? colors.primary : snippet.changeType === "deleted" ? colors.destructive : colors.chart[3];
389
+ return /* @__PURE__ */ jsxs(
390
+ "div",
391
+ {
392
+ style: {
393
+ flex: 1,
394
+ display: "flex",
395
+ flexDirection: "column",
396
+ backgroundColor: colors.card,
397
+ borderRadius: borderRadius.lg,
398
+ border: `1px solid ${colors.border}`,
399
+ overflow: "hidden",
400
+ opacity
401
+ },
402
+ children: [
403
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: spacing[2], padding: `${spacing[2]}px ${spacing[4]}px`, backgroundColor: colors.popover, borderBottom: `1px solid ${colors.border}` }, children: [
404
+ /* @__PURE__ */ jsx("div", { style: { width: 8, height: 8, borderRadius: borderRadius.full, backgroundColor: accentColor } }),
405
+ /* @__PURE__ */ jsx("span", { style: { fontSize: typography.fontSize.sm, fontFamily: typography.fontFamily.mono, color: colors.foreground }, children: snippet.file })
406
+ ] }),
407
+ snippet.description && /* @__PURE__ */ jsx("div", { style: { padding: `${spacing[2]}px ${spacing[4]}px`, borderBottom: `1px solid ${colors.border}` }, children: /* @__PURE__ */ jsx("span", { style: { fontSize: typography.fontSize.sm, color: colors.mutedForeground }, children: snippet.description }) }),
408
+ /* @__PURE__ */ jsx("pre", { style: { flex: 1, padding: spacing[4], margin: 0, fontFamily: typography.fontFamily.mono, fontSize: typography.fontSize.sm, color: colors.foreground, overflow: "hidden", whiteSpace: "pre-wrap" }, children: snippet.code })
409
+ ]
410
+ }
411
+ );
412
+ };
413
+ var UIScene = ({ title, componentName, description, jsx: jsx3, pattern }) => {
414
+ const frame = useCurrentFrame();
415
+ const { fps, durationInFrames } = useVideoConfig();
416
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
417
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
418
+ const uiScale = spring({ frame: frame - 10, fps, config: { damping: 15, stiffness: 100 } });
419
+ return /* @__PURE__ */ jsxs(
420
+ AbsoluteFill,
421
+ {
422
+ style: {
423
+ backgroundColor: colors.background,
424
+ display: "flex",
425
+ flexDirection: "column",
426
+ padding: spacing[10],
427
+ opacity: fadeIn * fadeOut,
428
+ fontFamily: typography.fontFamily.sans
429
+ },
430
+ children: [
431
+ /* @__PURE__ */ jsxs("div", { style: { marginBottom: spacing[6] }, children: [
432
+ /* @__PURE__ */ jsx("h3", { style: { color: colors.primary, fontSize: typography.fontSize["2xl"], fontWeight: typography.fontWeight.semibold, margin: 0 }, children: title }),
433
+ /* @__PURE__ */ jsx("p", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.sm, marginTop: spacing[1] }, children: description })
434
+ ] }),
435
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", transform: `scale(${Math.max(0, uiScale)})` }, children: /* @__PURE__ */ jsx(BrowserFrame, { title: componentName, children: jsx3 ? /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: convertJsxToHtml(jsx3) } }) : /* @__PURE__ */ jsx(PlaceholderUI, { pattern, name: componentName }) }) }),
436
+ /* @__PURE__ */ jsx("div", { style: { position: "absolute", bottom: spacing[6], right: spacing[6] }, children: /* @__PURE__ */ jsxs("code", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: borderRadius.md, padding: `${spacing[1]}px ${spacing[3]}px`, fontSize: typography.fontSize.xs, color: colors.mutedForeground, fontFamily: typography.fontFamily.mono }, children: [
437
+ "<",
438
+ componentName,
439
+ " />"
440
+ ] }) })
441
+ ]
442
+ }
443
+ );
444
+ };
445
+ var BrowserFrame = ({ title, children }) => /* @__PURE__ */ jsxs("div", { style: { backgroundColor: colors.card, borderRadius: borderRadius.lg, border: `1px solid ${colors.border}`, boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.5)", overflow: "hidden", maxWidth: "90%", maxHeight: "80%" }, children: [
446
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: spacing[2], padding: `${spacing[2]}px ${spacing[4]}px`, backgroundColor: colors.popover, borderBottom: `1px solid ${colors.border}` }, children: [
447
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 6 }, children: [
448
+ /* @__PURE__ */ jsx("div", { style: { width: 10, height: 10, borderRadius: "50%", backgroundColor: "#FF5F56" } }),
449
+ /* @__PURE__ */ jsx("div", { style: { width: 10, height: 10, borderRadius: "50%", backgroundColor: "#FFBD2E" } }),
450
+ /* @__PURE__ */ jsx("div", { style: { width: 10, height: 10, borderRadius: "50%", backgroundColor: "#27CA40" } })
451
+ ] }),
452
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, marginLeft: spacing[4], backgroundColor: colors.background, borderRadius: borderRadius.sm, padding: `${spacing[1]}px ${spacing[3]}px`, fontSize: typography.fontSize.xs, color: colors.mutedForeground }, children: [
453
+ "localhost:3000/",
454
+ title.toLowerCase()
455
+ ] })
456
+ ] }),
457
+ /* @__PURE__ */ jsx("div", { style: { padding: spacing[8], backgroundColor: colors.background, minWidth: 600, minHeight: 300 }, children })
458
+ ] });
459
+ var PlaceholderUI = ({ pattern, name }) => /* @__PURE__ */ jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", height: "100%", color: colors.mutedForeground }, children: /* @__PURE__ */ jsxs("span", { children: [
460
+ pattern ? `${pattern}: ` : "",
461
+ name
462
+ ] }) });
463
+ var OutroScene = ({ title, content, guidelines }) => {
464
+ const frame = useCurrentFrame();
465
+ const { fps } = useVideoConfig();
466
+ const logoScale = spring({ frame, fps, config: { damping: 12, stiffness: 100 } });
467
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
468
+ return /* @__PURE__ */ jsxs(
469
+ AbsoluteFill,
470
+ {
471
+ style: {
472
+ backgroundColor: colors.background,
473
+ display: "flex",
474
+ flexDirection: "column",
475
+ alignItems: "center",
476
+ justifyContent: "center",
477
+ padding: spacing[16],
478
+ opacity: fadeIn,
479
+ fontFamily: typography.fontFamily.sans
480
+ },
481
+ children: [
482
+ /* @__PURE__ */ jsx("div", { style: { marginBottom: spacing[8], transform: `scale(${logoScale})` }, children: /* @__PURE__ */ jsx(Logo, { size: 60 }) }),
483
+ /* @__PURE__ */ jsx("h2", { style: { color: colors.primary, fontSize: typography.fontSize["3xl"], fontWeight: typography.fontWeight.bold, marginBottom: spacing[4] }, children: title }),
484
+ /* @__PURE__ */ jsx("p", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.lg, textAlign: "center", maxWidth: 800 }, children: content }),
485
+ guidelines.length > 0 && /* @__PURE__ */ jsxs(Card, { style: { marginTop: spacing[10], maxWidth: 700 }, children: [
486
+ /* @__PURE__ */ jsx("span", { style: { fontSize: typography.fontSize.xs, color: colors.mutedForeground, textTransform: "uppercase", letterSpacing: "0.05em" }, children: "Key Takeaways" }),
487
+ /* @__PURE__ */ jsx("div", { style: { marginTop: spacing[3], display: "flex", flexDirection: "column", gap: spacing[2] }, children: guidelines.slice(0, 3).map((g, i) => /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "flex-start", gap: spacing[2] }, children: [
488
+ /* @__PURE__ */ jsx(CheckIcon, {}),
489
+ /* @__PURE__ */ jsx("span", { style: { color: colors.foreground, fontSize: typography.fontSize.sm }, children: g })
490
+ ] }, i)) })
491
+ ] }),
492
+ /* @__PURE__ */ jsxs("div", { style: { position: "absolute", bottom: spacing[8], display: "flex", alignItems: "center", gap: spacing[2] }, children: [
493
+ /* @__PURE__ */ jsx("span", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.sm }, children: "Generated with" }),
494
+ /* @__PURE__ */ jsx("span", { style: { color: colors.primary, fontSize: typography.fontSize.sm, fontWeight: typography.fontWeight.semibold }, children: "Visible" })
495
+ ] })
496
+ ]
497
+ }
498
+ );
499
+ };
500
+ var DefaultScene = ({ title, content }) => {
501
+ const frame = useCurrentFrame();
502
+ const { durationInFrames } = useVideoConfig();
503
+ const fadeIn = interpolate(frame, [0, 15], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
504
+ const fadeOut = interpolate(frame, [durationInFrames - 15, durationInFrames], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
505
+ return /* @__PURE__ */ jsxs(
506
+ AbsoluteFill,
507
+ {
508
+ style: {
509
+ backgroundColor: colors.background,
510
+ display: "flex",
511
+ flexDirection: "column",
512
+ alignItems: "center",
513
+ justifyContent: "center",
514
+ padding: spacing[16],
515
+ opacity: fadeIn * fadeOut,
516
+ fontFamily: typography.fontFamily.sans
517
+ },
518
+ children: [
519
+ /* @__PURE__ */ jsx("h2", { style: { color: colors.foreground, fontSize: typography.fontSize["4xl"], fontWeight: typography.fontWeight.bold }, children: title }),
520
+ /* @__PURE__ */ jsx("p", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.lg, textAlign: "center", maxWidth: 800 }, children: content })
521
+ ]
522
+ }
523
+ );
524
+ };
525
+ var Card = ({ children, style }) => /* @__PURE__ */ jsx("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: borderRadius.lg, padding: spacing[6], ...style }, children });
526
+ var Badge = ({ children, variant = "default" }) => /* @__PURE__ */ jsx(
527
+ "span",
528
+ {
529
+ style: {
530
+ display: "inline-flex",
531
+ alignItems: "center",
532
+ fontSize: typography.fontSize.xs,
533
+ fontWeight: typography.fontWeight.medium,
534
+ padding: `${spacing[1]}px ${spacing[2]}px`,
535
+ borderRadius: borderRadius.full,
536
+ backgroundColor: variant === "secondary" ? colors.secondary : `${colors.primary}22`,
537
+ color: variant === "secondary" ? colors.secondaryForeground : colors.primary,
538
+ border: variant === "default" ? "none" : `1px solid ${colors.border}`
539
+ },
540
+ children
541
+ }
542
+ );
543
+ var MetricCard = ({ label, value, variant = "default" }) => {
544
+ const accentColor = variant === "destructive" ? colors.destructive : colors.primary;
545
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", padding: spacing[6], backgroundColor: colors.card, borderRadius: borderRadius.lg, border: `1px solid ${colors.border}`, minWidth: 200 }, children: [
546
+ /* @__PURE__ */ jsx("span", { style: { color: accentColor, fontSize: typography.fontSize["2xl"], fontWeight: typography.fontWeight.bold }, children: value }),
547
+ /* @__PURE__ */ jsx("span", { style: { color: colors.mutedForeground, fontSize: typography.fontSize.sm, marginTop: spacing[1] }, children: label })
548
+ ] });
549
+ };
550
+ var Logo = ({ size = 80 }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 100 100", children: [
551
+ /* @__PURE__ */ jsx("circle", { cx: 50, cy: 50, r: 45, fill: colors.primary, opacity: 0.1 }),
552
+ /* @__PURE__ */ jsx("circle", { cx: 50, cy: 50, r: 35, fill: colors.primary, opacity: 0.2 }),
553
+ /* @__PURE__ */ jsx("ellipse", { cx: 50, cy: 50, rx: 25, ry: 15, fill: "none", stroke: colors.primary, strokeWidth: 3 }),
554
+ /* @__PURE__ */ jsx("circle", { cx: 50, cy: 50, r: 8, fill: colors.primary }),
555
+ /* @__PURE__ */ jsx("circle", { cx: 53, cy: 47, r: 3, fill: colors.foreground })
556
+ ] });
557
+ var FolderIcon = () => /* @__PURE__ */ jsx("svg", { width: 40, height: 40, viewBox: "0 0 24 24", fill: "none", stroke: colors.primary, strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" }) });
558
+ var FileIcon = () => /* @__PURE__ */ jsxs("svg", { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: colors.mutedForeground, strokeWidth: 2, children: [
559
+ /* @__PURE__ */ jsx("path", { d: "M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" }),
560
+ /* @__PURE__ */ jsx("polyline", { points: "14,2 14,8 20,8" })
561
+ ] });
562
+ var CheckIcon = () => /* @__PURE__ */ jsx("svg", { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: colors.primary, strokeWidth: 2, style: { flexShrink: 0, marginTop: 2 }, children: /* @__PURE__ */ jsx("polyline", { points: "20,6 9,17 4,12" }) });
563
+ function formatSourceType(type) {
564
+ const map = { pr: "Pull Request", commit: "Commit", "code-section": "Feature", repository: "Repository" };
565
+ return map[type] || type;
566
+ }
567
+ function convertJsxToHtml(jsx3) {
568
+ return jsx3.replace(/style=\{\{([^}]+)\}\}/g, (_, styles) => {
569
+ const cssString = styles.split(",").map((s) => {
570
+ const [key, value] = s.split(":").map((x) => x.trim());
571
+ if (!key || !value) return "";
572
+ const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
573
+ const cssValue = value.replace(/["']/g, "");
574
+ return `${cssKey}: ${cssValue}`;
575
+ }).filter(Boolean).join("; ");
576
+ return `style="${cssString}"`;
577
+ });
578
+ }
579
+ var defaultStoryboard = {
580
+ title: "Sample Feature",
581
+ totalDurationInFrames: 900,
582
+ scenes: [
583
+ {
584
+ id: "title",
585
+ type: "title",
586
+ title: "New Feature",
587
+ content: "A sample video composition",
588
+ durationInFrames: 120,
589
+ props: { keywords: ["sample", "demo"] }
590
+ },
591
+ {
592
+ id: "overview",
593
+ type: "overview",
594
+ title: "What Changed",
595
+ content: "This is a sample overview scene.",
596
+ durationInFrames: 180,
597
+ props: { componentCount: 5, breakingChanges: false }
598
+ },
599
+ {
600
+ id: "walkthrough",
601
+ type: "walkthrough",
602
+ title: "How It Works",
603
+ content: "Step by step explanation",
604
+ durationInFrames: 240,
605
+ props: { steps: ["Step 1: Initialize", "Step 2: Process", "Step 3: Complete"], stepIndex: 0 }
606
+ },
607
+ {
608
+ id: "code",
609
+ type: "code",
610
+ title: "Files Changed",
611
+ content: "5 files affected",
612
+ durationInFrames: 180,
613
+ props: { files: ["src/index.ts", "src/utils.ts", "src/components/App.tsx"], totalFiles: 5 }
614
+ },
615
+ {
616
+ id: "outro",
617
+ type: "outro",
618
+ title: "Summary",
619
+ content: "Learn more about this feature",
620
+ durationInFrames: 180,
621
+ props: { guidelines: ["Test thoroughly", "Update documentation"] }
622
+ }
623
+ ],
624
+ artifact: {
625
+ title: "Sample Feature",
626
+ description: "A sample feature for testing",
627
+ source: { type: "code-section", reference: "sample" },
628
+ context: {
629
+ summary: "This is a sample feature.",
630
+ technicalDetails: ["Detail 1", "Detail 2"],
631
+ affectedComponents: ["src/index.ts"],
632
+ breakingChanges: false,
633
+ keywords: ["sample"]
634
+ },
635
+ guidelines: ["Test thoroughly"]
636
+ },
637
+ theme: {
638
+ primaryColor: "#10B981",
639
+ backgroundColor: "#0A0A0B",
640
+ foregroundColor: "#FAFAFA",
641
+ accentColor: "#10B981",
642
+ mutedColor: "#A1A1A6",
643
+ cardColor: "#141415",
644
+ borderColor: "#27272A",
645
+ fontFamily: "Inter, system-ui, sans-serif"
646
+ }
647
+ };
648
+ var RemotionRoot = () => {
649
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
650
+ /* @__PURE__ */ jsx(
651
+ Composition,
652
+ {
653
+ id: "Main",
654
+ component: Main,
655
+ durationInFrames: 900,
656
+ fps: 30,
657
+ width: dimensions["1080p"].width,
658
+ height: dimensions["1080p"].height,
659
+ defaultProps: { storyboard: defaultStoryboard },
660
+ calculateMetadata: async ({ props }) => ({
661
+ durationInFrames: props.storyboard?.totalDurationInFrames || 900
662
+ })
663
+ }
664
+ ),
665
+ /* @__PURE__ */ jsx(
666
+ Composition,
667
+ {
668
+ id: "Main720p",
669
+ component: Main,
670
+ durationInFrames: 900,
671
+ fps: 30,
672
+ width: dimensions["720p"].width,
673
+ height: dimensions["720p"].height,
674
+ defaultProps: { storyboard: defaultStoryboard },
675
+ calculateMetadata: async ({ props }) => ({
676
+ durationInFrames: props.storyboard?.totalDurationInFrames || 900
677
+ })
678
+ }
679
+ ),
680
+ /* @__PURE__ */ jsx(
681
+ Composition,
682
+ {
683
+ id: "MainSquare",
684
+ component: Main,
685
+ durationInFrames: 900,
686
+ fps: 30,
687
+ width: dimensions.square.width,
688
+ height: dimensions.square.height,
689
+ defaultProps: { storyboard: defaultStoryboard },
690
+ calculateMetadata: async ({ props }) => ({
691
+ durationInFrames: props.storyboard?.totalDurationInFrames || 900
692
+ })
693
+ }
694
+ ),
695
+ /* @__PURE__ */ jsx(
696
+ Composition,
697
+ {
698
+ id: "MainVertical",
699
+ component: Main,
700
+ durationInFrames: 900,
701
+ fps: 30,
702
+ width: dimensions.vertical.width,
703
+ height: dimensions.vertical.height,
704
+ defaultProps: { storyboard: defaultStoryboard },
705
+ calculateMetadata: async ({ props }) => ({
706
+ durationInFrames: props.storyboard?.totalDurationInFrames || 900
707
+ })
708
+ }
709
+ )
710
+ ] });
711
+ };
712
+
713
+ // src/video/remotion/index.tsx
714
+ registerRoot(RemotionRoot);
715
+ //# sourceMappingURL=index.js.map
716
+ //# sourceMappingURL=index.js.map