From ccf4653b96c7aa97a82fe5c05a62d0b6889fb47a Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Fri, 8 May 2026 16:43:54 +0800 Subject: [PATCH] feat(videos): add X Launch scenes 1-4 (Hook, Terminal, ToolGrid, AI) --- .../x-launch/scenes/AiShowcaseScene.tsx | 142 ++++++++++++++++++ .../x-launch/scenes/HookScene.tsx | 36 +++++ .../x-launch/scenes/TerminalInstallScene.tsx | 37 +++++ .../x-launch/scenes/ToolGridRevealScene.tsx | 47 ++++++ 4 files changed, 262 insertions(+) create mode 100644 apps/videos/src/compositions/x-launch/scenes/AiShowcaseScene.tsx create mode 100644 apps/videos/src/compositions/x-launch/scenes/HookScene.tsx create mode 100644 apps/videos/src/compositions/x-launch/scenes/TerminalInstallScene.tsx create mode 100644 apps/videos/src/compositions/x-launch/scenes/ToolGridRevealScene.tsx diff --git a/apps/videos/src/compositions/x-launch/scenes/AiShowcaseScene.tsx b/apps/videos/src/compositions/x-launch/scenes/AiShowcaseScene.tsx new file mode 100644 index 00000000..01a4b9b0 --- /dev/null +++ b/apps/videos/src/compositions/x-launch/scenes/AiShowcaseScene.tsx @@ -0,0 +1,142 @@ +import type React from "react"; +import { AbsoluteFill, interpolate, Sequence, useCurrentFrame } from "remotion"; +import { BeforeAfter } from "@/components/BeforeAfter"; +import { ClipReveal } from "@/components/ClipReveal"; +import { PhotoPlaceholder } from "@/components/PhotoPlaceholder"; +import { COLOR } from "@/lib/colors"; +import { FONT } from "@/lib/fonts"; + +const Checkerboard: React.FC<{ width: number; height: number }> = ({ width, height }) => ( +
+); + +const BgRemovalDemo: React.FC = () => ( + } + after={ +
+ +
+
+ } + scanStartFrame={5} + scanDuration={40} + width={400} + height={300} + /> +); + +const UpscaleDemo: React.FC = () => { + const frame = useCurrentFrame(); + return ( +
+
+ {Array.from({ length: 16 }).map((_, i) => ( +
+ ))} +
+ + 4x + + +
+ ); +}; + +export const AiShowcaseScene: React.FC = () => { + return ( + + + + + + + + + + + + + + + + + +
+
+ } + after={} + scanStartFrame={5} + scanDuration={40} + width={400} + height={300} + /> +
+
+ +
+ 15 AI models. Your hardware. No cloud. +
+
+ ); +}; diff --git a/apps/videos/src/compositions/x-launch/scenes/HookScene.tsx b/apps/videos/src/compositions/x-launch/scenes/HookScene.tsx new file mode 100644 index 00000000..0841eca4 --- /dev/null +++ b/apps/videos/src/compositions/x-launch/scenes/HookScene.tsx @@ -0,0 +1,36 @@ +import type React from "react"; +import { AbsoluteFill, interpolate, useCurrentFrame } from "remotion"; +import { ClipReveal } from "@/components/ClipReveal"; +import { COLOR } from "@/lib/colors"; +import { TEXT } from "@/lib/fonts"; + +export const HookScene: React.FC = () => { + const frame = useCurrentFrame(); + const glowOpacity = Math.sin(frame * 0.08) * 0.03 + 0.08; + + return ( + +
+ +
+ + Your images. + +
+ + Stay yours. + +
+ + ); +}; diff --git a/apps/videos/src/compositions/x-launch/scenes/TerminalInstallScene.tsx b/apps/videos/src/compositions/x-launch/scenes/TerminalInstallScene.tsx new file mode 100644 index 00000000..74eb6c76 --- /dev/null +++ b/apps/videos/src/compositions/x-launch/scenes/TerminalInstallScene.tsx @@ -0,0 +1,37 @@ +import type React from "react"; +import { AbsoluteFill } from "remotion"; +import { Terminal } from "@/components/Terminal"; + +const COMMAND = [ + { text: "docker", color: "#ff7b72" }, + { text: " run ", color: "#e6edf3" }, + { text: "-p ", color: "#79c0ff" }, + { text: "3000:3000", color: "#a5d6ff" }, + { text: " ", color: "#e6edf3" }, + { text: "snapotter/snapotter", color: "#7ee787" }, +]; + +const OUTPUT = [ + { text: "v2.4.0", color: "#f59e0b", delay: 0 }, + { text: "49 tools loaded", color: "#7ee787", delay: 3 }, + { text: "15 AI models ready", color: "#7ee787", delay: 6 }, + { text: "✓ Server running on :3000", color: "#3fb950", delay: 9 }, +]; + +export const TerminalInstallScene: React.FC = () => { + return ( + + + + ); +}; diff --git a/apps/videos/src/compositions/x-launch/scenes/ToolGridRevealScene.tsx b/apps/videos/src/compositions/x-launch/scenes/ToolGridRevealScene.tsx new file mode 100644 index 00000000..0b1db34e --- /dev/null +++ b/apps/videos/src/compositions/x-launch/scenes/ToolGridRevealScene.tsx @@ -0,0 +1,47 @@ +import type React from "react"; +import { AbsoluteFill, interpolate, useCurrentFrame } from "remotion"; +import { Counter } from "@/components/Counter"; +import { ToolGrid } from "@/components/ToolGrid"; +import { COLOR } from "@/lib/colors"; +import { TEXT } from "@/lib/fonts"; + +export const ToolGridRevealScene: React.FC = () => { + const frame = useCurrentFrame(); + + const gridOpacity = interpolate(frame, [0, 20], [0, 1], { + extrapolateLeft: "clamp", + extrapolateRight: "clamp", + }); + + return ( + +
+ +
+ +
+ +
+
+ ); +};