import Image from 'next/image'; import { CheckCircle, Link as LinkIcon, MessageSquare, Mic, PenTool } from 'lucide-react'; import type { VisualVariant } from '@/lib/marketing/comparison-types'; interface ProductVisualProps { variant: VisualVariant; } export function ProductVisual({ variant }: ProductVisualProps) { if (variant === 'landing-compare') { return (
OpenFrame side-by-side version compare
); } if (variant === 'landing-dashboard') { return (
OpenFrame video review dashboard
); } if (variant === 'version-compare') { return (
{['V2', 'V3'].map((version) => (
{version} Compare mode

{version === 'V2' ? '00:01:12 color too cool' : '00:01:12 warmed up +2'}

))}
); } if (variant === 'approval-workflow') { return (

Client Cut V3

Approval requests

2 of 3 approved
{[ { name: 'Client Producer', status: 'Approved', tone: 'text-emerald-300' }, { name: 'Brand Manager', status: 'Approved', tone: 'text-emerald-300' }, { name: 'Legal Review', status: 'Pending', tone: 'text-amber-300' }, ].map((item) => (
{item.name} {item.status}
))}
); } if (variant === 'guest-review') { return (

open-frame.net/watch/share-7f3a

Client opens the link, enters a name, and reviews in the browser. No account required.

Client note at 00:02:14

Lower the music under the VO here.

); } if (variant === 'voice-notes') { return (
C

Client

00:03:45

{Array.from({ length: 36 }).map((_, index) => ( ))}

Voice note pinned to the exact frame—no more typing long explanations.

); } return (

00:01:48

Move the lower third up one line so it clears the subject.

); }