← back to Prestige Car Wash Video
src/sections.ts
90 lines
import dims from './dims.json';
export const FPS = 30;
export const WIDTH = 1920;
export const HEIGHT = 1080;
export type Kind = 'card' | 'shot';
export interface Section {
kind: Kind;
id: string;
file?: string; // shots/<id>.png
w?: number;
h?: number;
act: string; // small eyebrow label
title: string;
sub: string;
url?: string; // fake browser address bar
frames: number;
accent: string;
}
const D: Record<string, { w: number; h: number }> = dims as any;
const CYAN = '#38bdf8';
const AMBER = '#f5b301';
const GREEN = '#34d399';
// ── Act 1: front-facing pages ────────────────────────────────
const front: Array<[string, string, string, string, number]> = [
// id, title, sub, url, seconds
['home', 'Home', 'The Prestige treatment — hand wash, detail & ceramic', 'prestigecarwash.com', 15],
['services', 'Services & Pricing', 'Eight packages from Express Wash to Ceramic Coating', 'prestigecarwash.com/services', 11],
['contact', 'Book / Contact', 'Lead-capture booking form + shop location', 'prestigecarwash.com/contact', 9],
];
// ── Act 2: admin growth center tabs ──────────────────────────
const admin: Array<[string, string, string, number]> = [
['overview', 'Overview', 'Live counts across the whole growth dataset', 10.5],
['competitors', 'Competitors', '12 rival washes in the San Fernando Valley', 10.5],
['best-post', 'Best Times to Post', 'When engagement peaks by channel', 10.5],
['best-market', 'Best Times to Market', 'When to spend to convert', 10.5],
['holidays', 'Holiday-Driven', 'Eight seasonal campaign hooks', 10.5],
['services', 'Services (Admin)', 'Editable service catalog behind the storefront', 10.5],
['suggestions', 'Grow the Business', 'Ten ranked growth plays with rationale', 10.5],
['ads', 'Online Ads', 'Platform-by-platform ad headlines', 10.5],
['directories', 'Groups · Directories', 'Nextdoor, local groups & listing sites', 10.5],
['google', 'Google Business', 'Places profile draft-update panel', 10.5],
['leads', 'Leads', 'Inbound booking requests from the site', 10.5],
['credentials', 'Credentials', 'Keys & access the build depends on', 10.5],
];
const sec = (s: number) => Math.round(s * FPS);
export const SECTIONS: Section[] = [
{
kind: 'card', id: 'intro', act: 'Product Walkthrough',
title: 'Prestige Car Wash', sub: 'Storefront + Growth Center · a guided tour',
frames: sec(6), accent: CYAN,
},
{
kind: 'card', id: 'act1', act: 'Act 1',
title: 'The Storefront', sub: 'What customers see',
frames: sec(3), accent: CYAN,
},
...front.map(([id, title, sub, url, s]): Section => ({
kind: 'shot', id, file: `shots/${id}.png`, w: D[id]?.w, h: D[id]?.h,
act: 'Front-facing', title, sub, url, frames: sec(s), accent: CYAN,
})),
{
kind: 'card', id: 'act2', act: 'Act 2',
title: 'The Growth Center', sub: 'Admin dashboard · click-through of every tab',
frames: sec(3), accent: AMBER,
},
...admin.map(([id, title, sub, s]): Section => {
const key = 'admin-' + id;
return {
kind: 'shot', id: key, file: `shots/${key}.png`, w: D[key]?.w, h: D[key]?.h,
act: 'Admin · Growth Center', title, sub, url: 'prestigecarwash.com/admin', frames: sec(s), accent: AMBER,
};
}),
{
kind: 'card', id: 'outro', act: 'Prestige Car Wash',
title: 'Storefront + Growth Center', sub: 'Built with Claude Code',
frames: sec(5), accent: GREEN,
},
];
export const TOTAL_FRAMES = SECTIONS.reduce((a, s) => a + s.frames, 0);