mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(videos): add X Launch scenes 5-7 (Privacy, Features, CTA)
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
import type React from "react";
|
||||||
|
import { AbsoluteFill } from "remotion";
|
||||||
|
import { FeaturePill } from "@/components/FeaturePill";
|
||||||
|
|
||||||
|
const FEATURES = [
|
||||||
|
{ label: "Batch Processing", x: 340, y: 380, from: "left" as const },
|
||||||
|
{ label: "Pipeline Automation", x: 560, y: 380, from: "right" as const },
|
||||||
|
{ label: "REST API", x: 340, y: 440, from: "left" as const },
|
||||||
|
{ label: "55+ Input Formats", x: 560, y: 440, from: "right" as const },
|
||||||
|
{ label: "Image Editor", x: 340, y: 500, from: "left" as const },
|
||||||
|
{ label: "One Container", x: 560, y: 500, from: "right" as const },
|
||||||
|
{ label: "Multi-arch", x: 340, y: 560, from: "left" as const },
|
||||||
|
{ label: "15 AI Models", x: 560, y: 560, from: "right" as const },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const FeatureBurstScene: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<AbsoluteFill>
|
||||||
|
{FEATURES.map((f, i) => (
|
||||||
|
<FeaturePill
|
||||||
|
key={f.label}
|
||||||
|
label={f.label}
|
||||||
|
enterFrame={i * 8}
|
||||||
|
targetX={f.x}
|
||||||
|
targetY={f.y}
|
||||||
|
fromDirection={f.from}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</AbsoluteFill>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import type React from "react";
|
||||||
|
import { AbsoluteFill } from "remotion";
|
||||||
|
import { GitHubCTA } from "@/components/GitHubCTA";
|
||||||
|
|
||||||
|
export const GitHubCTAScene: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<AbsoluteFill>
|
||||||
|
<GitHubCTA labelFrame={5} logoFrame={20} taglineFrame={40} ctaFrame={60} urlFrame={75} />
|
||||||
|
</AbsoluteFill>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import type React from "react";
|
||||||
|
import { AbsoluteFill } from "remotion";
|
||||||
|
import { RotatingTaglines } from "@/components/RotatingTaglines";
|
||||||
|
import { COLOR } from "@/lib/colors";
|
||||||
|
|
||||||
|
const TAGLINES = [
|
||||||
|
"No uploads to the cloud. Ever.",
|
||||||
|
"100% local processing.",
|
||||||
|
"Works fully offline.",
|
||||||
|
"Air-gapped ready.",
|
||||||
|
];
|
||||||
|
|
||||||
|
export const PrivacyBeatScene: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<AbsoluteFill>
|
||||||
|
<RotatingTaglines
|
||||||
|
lines={TAGLINES}
|
||||||
|
startFrame={0}
|
||||||
|
framesPerLine={30}
|
||||||
|
fontSize={36}
|
||||||
|
color={COLOR.accent}
|
||||||
|
/>
|
||||||
|
</AbsoluteFill>
|
||||||
|
);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user