This component no longer exists. It was in vanillasky’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-12 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Video config
vanillasky/video-configRemovedUtility
The stable data contract for a renderable VanillaSky video.
See it running
Open the demo on vanillasky
vanillasky.ai/docs/components/video-configInstall it
npx shadcn@latest add https://vanillasky.ai/r/video-config.jsonSource
1/**2 * VideoConfig — React template-based architecture.3 *4 * Every scene is a React template. Templates declare their variables via a schema,5 * and the Studio auto-generates input UI from it. AI picks templates by matching6 * descriptions to the user's prompt.7 */89// ─── Orientation & Dimensions ──────────────────────────────────1011export type Orientation = "portrait" | "landscape";1213export interface VideoDimensions {14 width: number;15 height: number;16 aspectRatio: string;17}1819export interface SafeZone {20 top: number;21 bottom: number;22 left: number;23 right: number;24}2526export function getDimensions(orientation: Orientation = "portrait"): VideoDimensions {27 return orientation === "landscape"28 ? { width: 1920, height: 1080, aspectRatio: "16 / 9" }29 : { width: 1080, height: 1920, aspectRatio: "9 / 16" };30}3132export function getSafeZone(orientation: Orientation = "portrait"): SafeZone {33 return orientation === "landscape"34 ? { top: 108, bottom: 108, left: 192, right: 192 } // SMPTE broadcast safe (10%)35 : { top: 100, bottom: 100, left: 60, right: 60 }; // Balanced safe zone — enough margin without eating content36}3738/**39 * Scale a safe zone's insets — the density dial's second lever.40 *41 * Every template receives `safeZone` and lays text out against it, so42 * widening it is the one way to add whitespace across all of them without43 * touching a template. Rounded to whole pixels so preview and the SVG export44 * path agree; a factor of 1 returns the insets unchanged.45 */46export function scaleSafeZone(zone: SafeZone, factor: number): SafeZone {47 if (factor === 1) return zone;48 return {49 top: Math.round(zone.top * factor),50 bottom: Math.round(zone.bottom * factor),51 left: Math.round(zone.left * factor),52 right: Math.round(zone.right * factor),53 };54}5556// ─── Core Config ───────────────────────────────────────────────5758export interface VideoConfig {59 orientation?: Orientation;60 audio?: AudioConfig;61 scenes: SceneConfig[];62 style: GlobalStyle;63 meta?: VideoMeta;64}6566// ─── Audio ─────────────────────────────────────────────────────6768export interface AudioConfig {69 trackId: string;70 audioUrl: string;71 duration: number;72// … truncated
