"use client"; import Image from "next/image"; import { useEffect, useRef, useState } from "react"; import { ScrollReveal } from "@/components/ScrollReveal"; import { useInView } from "@/hooks/useInView"; import { useMockupProgress } from "@/hooks/useMockupProgress"; import { SectionScrollTitle } from "@/components/SectionScrollTitle"; function FilmStripIcon({ className }: { className?: string }) { return ( ); } function YouTubeIcon({ className }: { className?: string }) { return ( ); } function CoinsIcon({ className }: { className?: string }) { return ( ); } function PlaylistIcon({ className }: { className?: string }) { return ( ); } function NoteIcon({ className }: { className?: string }) { return ( ); } function WaveIcon({ className }: { className?: string }) { return ( ); } function GearsIcon({ className }: { className?: string }) { return ( ); } const BENEFITS = [ { title: "No editing required", desc: "Skip complex video editors. Just upload an image and audio, and Songs2YT handles the rest.", Icon: FilmStripIcon, }, { title: "YouTube-ready output", desc: "Videos are encoded and uploaded with the metadata you set, ready for your channel.", Icon: YouTubeIcon, }, { title: "Free tier included", desc: "Start creating with 14 videos every 12 hours at up to 720p. No credit card needed.", Icon: CoinsIcon, }, { title: "YouTube playlists", desc: "Independent Artist (Pro) can create YouTube playlists and add every upload from the dashboard or API.", Icon: PlaylistIcon, }, ] as const; const STOCK_THUMBS = [ "https://images.unsplash.com/photo-1511379938547-c1f69419868d?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1470225620780-dba8ba36b745?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1514320291840-2e0a9bf2a9ae?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1487180144351-b8472da7d491?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1598488035139-bdbb2231ce04?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1571330735066-03aaa9429d89?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1619983081563-430f63602796?w=120&h=120&fit=crop&auto=format", "https://images.unsplash.com/photo-1483412033650-1015ddeb83d1?w=120&h=120&fit=crop&auto=format", ] as const; function TypewriterText({ text }: { text: string }) { const [displayed, setDisplayed] = useState(""); const [done, setDone] = useState(false); useEffect(() => { let index = 0; const interval = setInterval(() => { index += 1; setDisplayed(text.slice(0, index)); if (index >= text.length) { clearInterval(interval); setDone(true); } }, 45); return () => clearInterval(interval); }, [text]); return ( {displayed} {!done && |} ); } function BenefitCard({ title, desc, Icon, }: { title: string; desc: string; Icon: typeof FilmStripIcon; }) { return (

{title}

{desc}

); } function CheckIcon({ className }: { className?: string }) { return ( ); } function MockupProgressRow({ initialWidth, midWidth, active, phaseOneMs = 3000, phaseTwoMs = 2000, }: { initialWidth: string; midWidth: string; active: boolean; phaseOneMs?: number; phaseTwoMs?: number; }) { const { phase, processed, transitionMs } = useMockupProgress(active, phaseOneMs, phaseTwoMs); const width = phase === 0 ? initialWidth : phase === 1 ? midWidth : "100%"; return (

{processed ? "Processed" : "Processing..."}

= 1 ? `width ${transitionMs}ms ease-out` : "none", }} />
); } function DashboardMockup() { const { ref, inView } = useInView(); const sidebarIcons = [NoteIcon, WaveIcon, GearsIcon] as const; return (
{sidebarIcons.map((Icon, i) => (
))}
Title
genre audio
Category Music ▾
); } function ProcessFlow() { return (
Process
Process
{STOCK_THUMBS.map((src) => (
))}

YouTube

DIRECT UPLOAD

); } function FlowInput({ label, icon }: { label: string; icon: "audio" | "image" }) { return (
{icon === "audio" ? ( ) : ( )}
{label}
); } function BenefitsVisual() { return (
); } function BenefitsScrollTitle({ sectionRef }: { sectionRef: React.RefObject }) { return ; } export function BenefitsSection() { const sectionRef = useRef(null); return (

Benefits

{BENEFITS.map((benefit, index) => ( ))}
); }