"use client"; import Link from "next/link"; import { useRef } from "react"; import { ScrollReveal } from "@/components/ScrollReveal"; import { SectionScrollTitle } from "@/components/SectionScrollTitle"; import { SignInButton } from "@/components/SignInButton"; import { getVideoAttributionText } from "@/lib/branding"; import { SALES_EMAIL } from "@/lib/plans"; const FEATURE_LABELS = [ "Infrastructure", "Limit", "Batch mode", "Bulk image matching", "File type", "Playlists", "API support", "ID3 tags", "Support", "Watermark", ] as const; type PlanFeatures = Record<(typeof FEATURE_LABELS)[number], string>; type InfrastructureChip = "cloud" | "self-hosted"; type PlanConfig = { name: string; badge: string; price: string; priceNote: string; features: PlanFeatures; infrastructureChips: InfrastructureChip[]; watermarkNote?: string; cta: | { type: "signin" } | { type: "link"; label: string; href: string } | { type: "disabled"; label: string } | { type: "mailto"; label: string; email: string; subject: string }; highlighted: boolean; hover: string; accent: string; badgeClass: string; ctaClass?: string; }; const PLANS: PlanConfig[] = [ { name: "Bedroom Producer", badge: "Free", price: "€0", priceNote: "/ forever", features: { Infrastructure: "Cloud", Limit: "10 videos* / month · 720p · buy 1–15 extras (€0.25 each)", "Batch mode": "Limited batch · up to 3 files", "Bulk image matching": "1 static image only", "File type": "MP3", Playlists: "Not included", "API support": "Not included", "ID3 tags": "Auto-fill title & metadata from MP3 tags", Support: "Community", Watermark: "Optional Songs2VID badge · bottom-right", }, infrastructureChips: ["cloud"], watermarkNote: `Show "${getVideoAttributionText()}" to support open-source development - opt out anytime for a clean video.`, cta: { type: "signin" }, highlighted: false, hover: "hover:border-red-500/40 hover:bg-red-500/[0.04] hover:shadow-lg hover:shadow-red-500/15", accent: "text-red-400", badgeClass: "bg-gray-800 text-gray-400", }, { name: "Independent Artist", badge: "Pro", price: "€5", priceNote: "/ mo", features: { Infrastructure: "Cloud", Limit: "50 videos / month · 1080p", "Batch mode": "Full batch · up to 5 files", "Bulk image matching": "Unique image per track (PRO)", "File type": "MP3 / WAV / FLAC", Playlists: "Create & add uploads to YouTube playlists", "API support": "REST API · upload, batch & playlists", "ID3 tags": "Extended metadata support", Support: "E-Mail", Watermark: "Custom text/logo/fonts · art-track layouts + blur (PRO)", }, infrastructureChips: ["cloud"], cta: { type: "link", label: "Upgrade to Pro", href: "/dashboard/settings" }, highlighted: true, hover: "hover:border-accent/50 hover:bg-accent/[0.06] hover:shadow-lg hover:shadow-accent/20", accent: "text-accent", badgeClass: "bg-accent/15 text-accent", }, { name: "Record Label / Studio", badge: "Enterprise", price: "Custom", priceNote: "/ contact sales", features: { Infrastructure: "Cloud or self-hosted", Limit: "Unlimited 4K · zero limit", "Batch mode": "Unlimited synchronized batch processing", "Bulk image matching": "Unique image per track", "File type": "WAV / FLAC / lossless", Playlists: "Org-wide playlist workflows", "API support": "Full API access · custom integrations & SLAs", "ID3 tags": "Full metadata · custom mapping", Support: "Top-priority**", Watermark: "Custom branding · position studio", }, infrastructureChips: ["cloud", "self-hosted"], cta: { type: "mailto", label: "Contact Sales", email: SALES_EMAIL, subject: "Songs2VID Enterprise Inquiry", }, highlighted: false, hover: "hover:border-[#609926]/45 hover:bg-[#609926]/[0.06] hover:shadow-lg hover:shadow-[#609926]/20", accent: "text-[#609926]", badgeClass: "bg-[#609926]/15 text-[#609926]", ctaClass: "border-[#609926]/40 bg-[#609926]/10 text-[#609926] hover:border-[#609926]/60 hover:bg-[#609926]/20", }, ]; function FeatureValue({ value }: { value: string }) { return {value}; } function CloudIcon({ className }: { className?: string }) { return ( ); } function ServerIcon({ className }: { className?: string }) { return ( ); } function InfrastructureChips({ chips, }: { chips: InfrastructureChip[]; }) { return (
{chips.includes("cloud") && ( Cloud )} {chips.includes("self-hosted") && ( Self-hosted )}
); } function PricingCard({ plan }: { plan: PlanConfig }) { const { name, badge, price, priceNote, features, watermarkNote, infrastructureChips, cta, highlighted, hover, accent, badgeClass, ctaClass, } = plan; return (
{highlighted && ( Most popular )}

{name}

{badge}
{price} {priceNote}
{cta.type === "signin" && } {cta.type === "link" && ( {cta.label} )} {cta.type === "disabled" && ( )} {cta.type === "mailto" && ( {cta.label} )}
); } export function PricingSection() { const sectionRef = useRef(null); return (

Pricing

Free with optional extras, Pro at €5/month, or Enterprise for studios.

{PLANS.map((plan, index) => ( ))}

*Free includes 10 videos/month; buy 1–15 extras at €0.25 each (max 15 extras). After both are used, Pro (€5/mo · 50 videos) is required. Total balance capped at 30. Deduction order: monthly first, then extras.

**Technical support is strictly reserved for Managed Cloud and paid Professional Setup agreements; independent self-hosted deployments are community-supported.

); }