"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 { SALES_EMAIL } from "@/lib/plans"; const FEATURE_LABELS = [ "Infrastructure", "Limit", "Batch mode", "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: "14 videos / 12 hours · 720p", "Batch mode": "Limited batch · up to 3 files", "File type": "MP3", Playlists: "Not included", "API support": "Not included", "ID3 tags": "Auto-fill title & metadata from MP3 tags", Support: "Community", Watermark: "Optional · support badge", }, infrastructureChips: ["cloud"], watermarkNote: "Show \"Uploaded through Songs2YT.com\" 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", "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: "Fully customizable · remove completely", }, infrastructureChips: ["cloud"], cta: { type: "disabled", label: "Coming soon" }, 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", "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: "Fully customizable · remove completely", }, infrastructureChips: ["cloud", "self-hosted"], cta: { type: "mailto", label: "Contact Sales", email: SALES_EMAIL, subject: "Songs2YT 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 for getting started, Pro for creators, or Enterprise for teams.

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

*Pro is a monthly subscription with included quota (extensions via support). Self-hosted open-source deployments have no quotas.

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

); }