import React, { useState, useMemo } from 'react';
import {
TrendingUp,
DollarSign,
FileText,
Layers,
Users,
HelpCircle,
CheckCircle,
Lock,
Sliders,
Upload,
ArrowRight,
ShieldCheck,
Briefcase,
BarChart3,
Info,
Sparkles,
ChevronRight,
Download,
UserCheck,
RefreshCw,
Search,
Filter,
Tv,
Award,
AlertCircle,
Globe,
UserPlus,
Loader2,
BookOpen,
FileCheck
} from 'lucide-react';
// Pre-configured mock data for Agents/Catalogs to explore
const INITIAL_SUBMISSIONS = [
{
id: "CAT-8902",
catalogName: "Neon Nights - Synthwave Collection",
primaryArtist: "The Retro Vibe, Sunset Rider",
tracksCount: 42,
distributor: "DistroKid",
sharePercent: 100,
splitsCount: 2,
ltmIncome: 145000,
catalogAge: 5,
assetTypes: ["Master", "Streaming"],
status: "Underwriting",
submittedBy: "Marcus Vance",
email: "marcus@neonvibe.com",
date: "2026-05-20",
files: ["reports_2024_2025.csv", "split_sheets_signed.pdf"]
},
{
id: "CAT-4421",
catalogName: "Streamer Beats & Gaming Backgrounds Bundle",
primaryArtist: "HyperX Beats, LoFi Gamer",
tracksCount: 88,
distributor: "UnitedMasters",
sharePercent: 100,
splitsCount: 1,
ltmIncome: 74200,
catalogAge: 3,
assetTypes: ["Master", "Live Streaming (Twitch/Kick)"],
status: "Underwriting",
submittedBy: "Toby Henderson",
email: "toby@gamerbeats.media",
date: "2026-05-23",
files: ["twitch_earnings_24m.csv", "distributor_export.xlsx"]
},
{
id: "CAT-7411",
catalogName: "Acoustic Whispers (Publishing Share)",
primaryArtist: "Elena Rostova",
tracksCount: 18,
distributor: "Kobalt",
sharePercent: 50,
splitsCount: 3,
ltmIncome: 38200,
catalogAge: 6,
assetTypes: ["Publishing", "Mechanicals"],
status: "Offer Pending",
submittedBy: "Elena Rostova",
email: "elena@rostovamusic.co",
date: "2026-05-22",
files: ["royalties_24months_summary.xlsx"]
}
];
// Pre-configured Agent Applications
const INITIAL_APPLICATIONS = [
{
id: "REP-902",
fullName: "Amara Diop",
email: "amara.diop@westcoastmusic.sn",
whatsapp: "+221 77 123 4567",
territories: ["Central Africa", "France"],
languages: "French, Wolof, English",
networkDescription: "Manage a roster of 14 independent Afrobeat and Afro-house artists in Dakar and Brazzaville.",
marketIntel: "Thorough understanding of SACEM, neighboring performance structures, and local DSP distribution bottlenecks.",
estimatedDeals: "5-15 catalogs",
status: "Pending Review",
date: "2026-05-23"
},
{
id: "REP-412",
fullName: "Thiago Silva Santos",
email: "thiago@riocreative.br",
whatsapp: "+55 21 98765-4321",
territories: ["Brazil"],
languages: "Portuguese, Spanish, English",
networkDescription: "Direct relationships with prominent funk carioca producers and samba publishing administrators.",
marketIntel: "Expertise in Abramus/UBC split configurations and international master sync clearances.",
estimatedDeals: "15+ catalogs",
status: "Approved",
date: "2026-05-21"
}
];
// Robust Gemini LLM Caller incorporating exponential backoff
const callGeminiAPI = async (prompt, systemInstruction = "") => {
const apiKey = ""; // Provided automatically in premium preview runtime env
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`;
let delay = 1000;
for (let attempt = 0; attempt < 5; attempt++) {
try {
const response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
contents: [{ parts: [{ text: prompt }] }],
systemInstruction: systemInstruction ? { parts: [{ text: systemInstruction }] } : undefined
})
});
if (!response.ok) {
throw new Error(`API Connection Status: ${response.status}`);
}
const data = await response.json();
const textResult = data.candidates?.[0]?.content?.parts?.[0]?.text;
if (textResult) return textResult;
throw new Error("No response content generated by model.");
} catch (error) {
if (attempt === 4) {
throw new Error(`Underwriting Engine experienced an absolute timeout: ${error.message}`);
}
await new Promise(resolve => setTimeout(resolve, delay));
delay *= 2; // Exponential Backoff Delays: 1s, 2s, 4s, 8s
}
}
};
export default function App() {
// Navigation & Interactive Tabs
const [activeTab, setActiveTab] = useState('home'); // 'home', 'how-it-works', 'eligibility', 'get-started', 'trends', 'cases', 'login', 'agent-dashboard', 'join-agent'
// Custom Valuation Simulator State
const [simulatorLtm, setSimulatorLtm] = useState(150000); // starts at 150k as an elegant mid-range catalog value
const [selectedAssetTypes, setSelectedAssetTypes] = useState(['Master', 'Streaming']);
const [selectedGenre, setSelectedGenre] = useState('Pop/Hip-Hop');
const [catalogAge, setCatalogAge] = useState(4); // default age in years
const [isOtherGenreActive, setIsOtherGenreActive] = useState(false);
const [otherGenreSelection, setOtherGenreSelection] = useState('Latin / Reggaeton');
const [newsletterEmail, setNewsletterEmail] = useState('');
// AI Interactive State holders
const [aiProspectusLoading, setAiProspectusLoading] = useState(false);
const [aiProspectusResult, setAiProspectusResult] = useState("");
const [aiUnderwriterLoading, setAiUnderwriterLoading] = useState(false);
const [aiUnderwriterResult, setAiUnderwriterResult] = useState("");
const [aiAgentSourcingLoading, setAiAgentSourcingLoading] = useState(false);
const [aiAgentSourcingResult, setAiAgentSourcingResult] = useState("");
// New Lead / Onboarding State (KYC)
const [kycStep, setKycStep] = useState(1);
const [kycForm, setKycForm] = useState({
fullName: '',
email: '',
phone: '',
companyName: '',
catalogName: '',
primaryArtists: '',
tracksCount: '',
catalogAge: '3',
distributor: '',
sharePercent: '100',
splitsCount: '1',
ltmIncome: '',
rightsTypes: [],
uploadedFiles: [],
agreeToTerms: false
});
// Free Agent Application State
const [agentForm, setAgentForm] = useState({
fullName: '',
email: '',
whatsapp: '',
primaryTerritories: [],
languagesSpoken: '',
networkDescription: '',
marketIntelDescription: '',
estimatedDeals: '1-5 catalogs',
agreeToBrokerCode: false
});
const [agentStep, setAgentStep] = useState(1); // 1 = form, 2 = success
const [submittedLeads, setSubmittedLeads] = useState(INITIAL_SUBMISSIONS);
const [submittedAgents, setSubmittedAgents] = useState(INITIAL_APPLICATIONS);
const [showNotification, setShowNotification] = useState(null);
// Authentication State for Agent Portal
const [username, setUsername] = useState('admin');
const [password, setPassword] = useState('FodasPutas20+');
const [isAuthenticated, setIsAuthenticated] = useState(false);
const [loginError, setLoginError] = useState('');
// Agent Dashboard states
const [dashboardSearch, setDashboardSearch] = useState('');
const [selectedSubmission, setSelectedSubmission] = useState(null);
const [selectedAgentApp, setSelectedAgentApp] = useState(null);
const [dashboardFilterStatus, setDashboardFilterStatus] = useState('All');
const [dashboardSubTab, setDashboardSubTab] = useState('catalogs'); // 'catalogs', 'agent-applications'
// Trigger temporary notification helper
const triggerNotification = (message, type = 'success') => {
setShowNotification({ message, type });
setTimeout(() => setShowNotification(null), 4000);
};
// Determine if the current catalog is eligible/legitimate based on rules:
// "For advance catalog that have 2 years minimum and 10k/years income are legitme"
const isSimulatorLegitimate = useMemo(() => {
return catalogAge >= 2 && simulatorLtm >= 10000;
}, [catalogAge, simulatorLtm]);
// Calculate estimated multiplier ranges based on catalog age, asset types, and genre mix (Range: 4x to 11x)
const computedValuation = useMemo(() => {
let acqMinMult = 4.0;
let acqMaxMult = 11.0;
let advMinMult = 3.0;
let advMaxMult = 7.0;
const isPopOrHighValueGenre = [
'Pop/Hip-Hop',
'Electronic/Dance',
'Latin / Reggaeton',
'Afrobeat',
'R&B / Soul'
].includes(selectedGenre);
if (catalogAge <= 4) {
// Acquisitions are capped at max 6x
acqMinMult = 4.0;
acqMaxMult = Math.min(6.0, 3.5 + (catalogAge * 0.65));
// Advances are capped at a conservative 4.5x multiple
advMinMult = 3.0;
advMaxMult = Math.min(4.5, 2.5 + (catalogAge * 0.5));
} else {
// Older than 5 years: multiples for acquisitions starts at 6.0x up to 11.0x maximum
acqMinMult = 6.0;
let dynamicAcqMax = 8.0;
if (selectedAssetTypes.includes('Publishing')) dynamicAcqMax += 1.5;
if (selectedAssetTypes.includes('Neighboring Rights')) dynamicAcqMax += 0.5;
if (selectedAssetTypes.includes('Live Streaming (Twitch/Kick)')) dynamicAcqMax += 1.0;
if (isPopOrHighValueGenre) dynamicAcqMax += 1.0;
acqMaxMult = Math.min(11.0, dynamicAcqMax);
// Advances starts at 4.5x and cap at 7.0x max LTM for highly mature catalogs
advMinMult = 4.5;
let dynamicAdvMax = 5.2;
if (selectedAssetTypes.includes('Publishing')) dynamicAdvMax += 0.6;
if (selectedAssetTypes.includes('Live Streaming (Twitch/Kick)')) dynamicAdvMax += 0.6;
if (isPopOrHighValueGenre) dynamicAdvMax += 0.6;
advMaxMult = Math.min(7.0, dynamicAdvMax);
}
const minAcquisition = Math.round(simulatorLtm * acqMinMult);
const maxAcquisition = Math.round(simulatorLtm * acqMaxMult);
const minAdvance = Math.round(simulatorLtm * advMinMult);
const maxAdvance = Math.round(simulatorLtm * advMaxMult);
return {
acquisitionMin: minAcquisition,
acquisitionMax: maxAcquisition,
acquisitionMinMult: acqMinMult.toFixed(1),
acquisitionMaxMult: acqMaxMult.toFixed(1),
advanceMin: minAdvance,
advanceMax: maxAdvance,
advanceMinMult: advMinMult.toFixed(1),
advanceMaxMult: advMaxMult.toFixed(1)
};
}, [simulatorLtm, selectedAssetTypes, selectedGenre, catalogAge]);
// Dynamic AI Strategic Prospectus via Gemini API (For Creators)
const generateAiProspectus = async () => {
setAiProspectusLoading(true);
setAiProspectusResult("");
const systemPrompt = "You are a world-class Music Catalog Valuation Underwriter and Investment Banker at Luna x Catalog. You specialize in generating classic, executive-level private equity summaries for music assets.";
const userPrompt = `
Please write a comprehensive, classic, high-end Prospectus Valuation Analysis for our catalog with these characteristics:
- Last Twelve Months (LTM) Net Income: $${simulatorLtm.toLocaleString()} USD
- Catalog Age / Longevity: ${catalogAge} Years of active streaming history
- Music Genre: ${selectedGenre}
- Royalty Assets Included: ${selectedAssetTypes.join(', ')}
Format the output with these classic sections using elegant Markdown:
1. Executive Portfolio Overview
2. Strategic Valuation Analysis (incorporating why a catalog of ${catalogAge} years commands a buyout multiple estimation of ${computedValuation.acquisitionMinMult}x - ${computedValuation.acquisitionMaxMult}x and an advance multiple of ${computedValuation.advanceMinMult}x - ${computedValuation.advanceMaxMult}x)
3. Global Market Context (USA, France, Central Africa, Brazil)
4. Targeted Advisory & Optimization Strategy (Consolidating splits, platform expansion advice)
`;
try {
const responseText = await callGeminiAPI(userPrompt, systemPrompt);
setAiProspectusResult(responseText);
triggerNotification("AI Prospectus generated successfully!", "success");
} catch (err) {
setAiProspectusResult(`An issue occurred while calling the Underwriting System: ${err.message}. Please retry.`);
triggerNotification("Underwriting system busy. Retrying.", "error");
} finally {
setAiProspectusLoading(false);
}
};
// Dynamic AI Underwriting Analysis for Agency submissions (For Auditing Agents)
const generateAgentUnderwriterAnalysis = async (lead) => {
setAiUnderwriterLoading(true);
setAiUnderwriterResult("");
const systemPrompt = "You are the Head of Risk Management at Luna x Catalog. Your job is to draft formal risk parameters, transaction structures, and investor pitch pitches for music acquisitions.";
const userPrompt = `
Please analyze the client catalog submission and compile an internal Underwriting Audit Portfolio:
- Reference ID: ${lead.id}
- Catalog Name: ${lead.catalogName}
- Featured Artist: ${lead.primaryArtist}
- Active Longevity: ${lead.catalogAge} Years
- Track Count: ${lead.tracksCount}
- Distributor Source: ${lead.distributor}
- Client Share: ${lead.sharePercent}%
- Splits: ${lead.splitsCount}
- Sourced LTM Net Earnings: $${lead.ltmIncome.toLocaleString()}
- Included Royalty Types: ${lead.assetTypes.join(', ')}
Please generate:
1. Institutional Risk Tier rating (Conservative, Balanced, or Aggressive) with justifications.
2. Recommended Recoupable Advance structure (calculating maximum risk limits).
3. A professional outreach pitch template addressed to our 50+ prospective liquidity partners highlighting why this asset fits institutional acquisitions.
`;
try {
const responseText = await callGeminiAPI(userPrompt, systemPrompt);
setAiUnderwriterResult(responseText);
triggerNotification("Agent Risk Assessment compiled.", "success");
} catch (err) {
setAiUnderwriterResult(`Underwriting system timed out: ${err.message}`);
triggerNotification("Unable to process risk analysis.", "error");
} finally {
setAiUnderwriterLoading(false);
}
};
// AI Sourcing Strategy Blueprint (For Free Agents applying)
const generateAgentSourcingStrategy = async () => {
setAiAgentSourcingLoading(true);
setAiAgentSourcingResult("");
const systemPrompt = "You are the VP of Global Sourcing at Luna x Catalog. You specialize in training decentralized scouts and brokers on how to target indie creators starting at $10k/yearly.";
const userPrompt = `
Please write a high-fidelity, actionable Sourcing Playbook for a decentralized broker operating with these conditions:
- Preferred Territories: ${agentForm.primaryTerritories.join(', ')}
- Spoken Languages: ${agentForm.languagesSpoken}
- Targeted Catalog Target: Independent Artists & Labels starting at $10k/yearly LTM
Please structure your playbook using Montserrat-aligned Markdown:
1. Regional Scouting Strategy (Localizing networks in ${agentForm.primaryTerritories.join(', ')})
2. Local Licensing Rules (How collective management societies such as SACEM, soundExchange, or Brazil's Abramus/UBC operate)
3. Direct Pitch Script & Communication Strategy to target Indie Creators
`;
try {
const responseText = await callGeminiAPI(userPrompt, systemPrompt);
setAiAgentSourcingResult(responseText);
triggerNotification("AI Sourcing strategy formulated.", "success");
} catch (err) {
setAiAgentSourcingResult(`Failed to communicate with Risk Sourcing Engine: ${err.message}`);
} finally {
setAiAgentSourcingLoading(false);
}
};
// Handle Multi-step KYC Submission
const handleKycSubmit = (e) => {
e.preventDefault();
if (kycStep < 3) {
setKycStep(kycStep + 1);
return;
}
// Process ultimate submission
const newLead = {
id: `CAT-${Math.floor(1000 + Math.random() * 9000)}`,
catalogName: kycForm.catalogName || "Untitled Catalog",
primaryArtist: kycForm.primaryArtists || "Unknown Artist",
tracksCount: parseInt(kycForm.tracksCount) || 1,
distributor: kycForm.distributor || "Direct",
sharePercent: parseInt(kycForm.sharePercent) || 100,
splitsCount: parseInt(kycForm.splitsCount) || 1,
ltmIncome: parseFloat(kycForm.ltmIncome) || 0,
catalogAge: parseInt(kycForm.catalogAge) || 3,
assetTypes: kycForm.rightsTypes.length > 0 ? kycForm.rightsTypes : ["Master", "Streaming"],
status: "Received",
submittedBy: kycForm.fullName || "Anonymous Creator",
email: kycForm.email,
date: new Date().toISOString().split('T')[0],
files: kycForm.uploadedFiles.length > 0 ? kycForm.uploadedFiles : ["automated_generation.csv"]
};
setSubmittedLeads([newLead, ...submittedLeads]);
setKycStep(4); // Show success step
triggerNotification("Your catalog assessment & KYC has been safely submitted!", "success");
};
// Handle Agent Partner Onboarding Submission
const handleAgentSubmit = (e) => {
e.preventDefault();
const newAgent = {
id: `REP-${Math.floor(100 + Math.random() * 900)}`,
fullName: agentForm.fullName,
email: agentForm.email,
whatsapp: agentForm.whatsapp,
territories: agentForm.primaryTerritories.length > 0 ? agentForm.primaryTerritories : ["Global / Other"],
languages: agentForm.languagesSpoken || "English",
networkDescription: agentForm.networkDescription,
marketIntel: agentForm.marketIntelDescription,
estimatedDeals: agentForm.estimatedDeals,
status: "Pending Review",
date: new Date().toISOString().split('T')[0]
};
setSubmittedAgents([newAgent, ...submittedAgents]);
setAgentStep(2);
triggerNotification("Broker Application logged. Our executive office will connect shortly.", "success");
};
const handleFileUploadMock = (e) => {
const file = e.target.files[0];
if (file) {
setKycForm(prev => ({
...prev,
uploadedFiles: [...prev.uploadedFiles, file.name]
}));
triggerNotification(`Successfully attached: ${file.name}`, "info");
}
};
// Auth Handler
const handleLogin = (e) => {
e.preventDefault();
if (username === 'admin' && password === 'FodasPutas20+') {
setIsAuthenticated(true);
setActiveTab('agent-dashboard');
setLoginError('');
triggerNotification("Auditor Access Granted. Welcome back, Agent.", "success");
} else {
setLoginError("Invalid agency credentials. Please check details.");
}
};
const toggleRightsSelection = (type) => {
setKycForm(prev => {
const rights = prev.rightsTypes.includes(type)
? prev.rightsTypes.filter(t => t !== type)
: [...prev.rightsTypes, type];
return { ...prev, rightsTypes: rights };
});
};
const toggleTerritorySelection = (territory) => {
setAgentForm(prev => {
const list = prev.primaryTerritories.includes(territory)
? prev.primaryTerritories.filter(t => t !== territory)
: [...prev.primaryTerritories, territory];
return { ...prev, primaryTerritories: list };
});
};
const handleNewsletterSubmit = (e) => {
e.preventDefault();
if (newsletterEmail) {
triggerNotification("Successfully subscribed to L'Una Music Group Newsletter!", "success");
setNewsletterEmail('');
}
};
return (
{/* Montserrat Injection Stylesheet */}
{/* Toast Notification Container */}
{showNotification && (
{showNotification.message}
)}
{/* Premium Navigation */}
{/* Nav Items */}
{['how-it-works', 'eligibility', 'trends', 'cases', 'join-agent', 'get-started'].map((tab) => {
const labelMap = {
'how-it-works': 'How It Works',
'eligibility': 'Legibilidade',
'trends': 'Trends',
'cases': 'Cases',
'join-agent': 'Join as Agent',
'get-started': 'Request Consult'
};
const isRequestConsult = tab === 'get-started';
return (
{
if (tab === 'get-started') {
setKycStep(1);
setActiveTab('get-started');
} else if (tab === 'eligibility') {
setActiveTab('eligibility');
} else if (tab === 'join-agent') {
setAgentStep(1);
setActiveTab('join-agent');
} else {
setActiveTab(tab);
}
}}
className={`text-xs uppercase tracking-[0.2em] transition-all ${
isRequestConsult
? 'font-normal hover:text-orange-500 text-neutral-400'
: activeTab === tab
? 'text-orange-500 font-semibold'
: 'text-neutral-400 font-semibold'
}`}
>
{labelMap[tab]}
);
})}
{/* Action Buttons */}
{
if (isAuthenticated) {
setActiveTab('agent-dashboard');
} else {
setActiveTab('login');
}
}}
className="text-[10px] uppercase font-normal tracking-[0.15em] bg-neutral-900 border border-orange-500 text-neutral-300 px-4 py-2.5 rounded-sm hover:border-neutral-700 hover:text-white transition-all flex items-center gap-2"
>
{isAuthenticated ? 'Terminal' : 'Agent Login'}
{ setKycStep(1); setActiveTab('get-started'); }}
className="bg-orange-500 hover:bg-orange-400 text-neutral-950 text-xs font-bold uppercase tracking-[0.15em] px-5 py-2.5 rounded-sm transition-all shadow-lg shadow-orange-500/15 flex items-center gap-2"
>
Get Started
{/* Main Container */}
{/* TAB 1: HERO & HOME PAGE */}
{activeTab === 'home' && (
{/* Hero Section */}
Licensed Capital Agents & Brokers
Premium Advances & Complete Catalog Acquisitions
As highly experienced market agents and brokers, Luna x Catalog secures elite capital advances and direct acquisition pipelines for Master Royalties, Publishing Shares, and Live Streaming Rights. With over $25M USD closed in the last 3 years , our multilingual teams speak over 5 languages , advising portfolios across France, the USA, Central Africa, Brazil, and more . We structure liquidity for both major artists and independent creator catalogs starting at $10k/yearly .
{/* Combined Onboarding Router Section */}
{/* Creator Path Card */}
Creators & Labels
Apply for Capital
For artists, label owners, and copyright holders looking to estimate durability metrics, submit statements, and trigger direct buyout or advance structures.
{ setKycStep(1); setActiveTab('get-started'); }}
className="mt-6 text-[10px] font-bold uppercase tracking-widest text-orange-500 hover:text-white flex items-center gap-1.5 transition-colors group"
>
Submit Catalog
{/* Broker Path Card */}
Scouts & Brokers
Become a Free Agent
For experienced scouts, managers, and catalog brokers wishing to introduce clients, evaluate local networks, and earn premium transaction shares.
{ setAgentStep(1); setActiveTab('join-agent'); }}
className="mt-6 text-[10px] font-bold uppercase tracking-widest text-orange-500 hover:text-white flex items-center gap-1.5 transition-colors group"
>
Join Broker Roster
{/* Over 50 partners Trust Metric bar - UPDATED WITH LATEST STATS */}
Our Track Record & Global Representation
$25M+ USD
Closed (Last 3 Yrs)
GLOBAL
FR, USA, Central Africa, BR
5+ LANGUAGES
Fluent Client Advisory
$10K+
Indie Catalogs Accepted
{/* Interactive Valuation Calculator Widget */}
Instant Simulator
Estimate Your Catalog's Durability
Utilize our weighted variables to gauge how direct institutional acquirers structure cash-flow multipliers against your historical LTM revenue.
{/* Inputs */}
{/* LTM Slider */}
Last Twelve Months (LTM) Net Income
${simulatorLtm.toLocaleString()}
setSimulatorLtm(Number(e.target.value))}
className="w-full h-1 bg-neutral-800 rounded appearance-none cursor-pointer accent-orange-500"
/>
$10,000
$1,000,000
$2,000,000+
{/* Catalog Age (Longevity Selector) - MINIMUM 2 YEARS */}
Catalog Longevity (Years of active history)
{catalogAge === 5 ? '5+ Years' : `${catalogAge} Years`}
{[2, 3, 4, 5].map((year) => {
const isSelected = catalogAge === year;
return (
setCatalogAge(year)}
className={`py-3 rounded-sm border text-[10px] font-bold uppercase tracking-wider transition-all ${
isSelected
? 'bg-orange-500 text-neutral-950 border-orange-500'
: 'bg-neutral-900 border-neutral-855 text-neutral-400 hover:border-neutral-700'
}`}
>
{year === 5 ? '5+ Yrs' : `${year} Yrs`}
);
})}
* Catalogs under 4 years are capped at a maximum buyout multiple of 6.0x. For mature catalogs (5+ years), multiples start at a baseline of 6.0x and scale up to 11.0x.
{/* Rights Checkboxes */}
Primary Rights Assets Included
{['Master', 'Publishing', 'Streaming', 'Neighboring Rights', 'Live Streaming (Twitch/Kick)'].map((asset) => {
const isSelected = selectedAssetTypes.includes(asset);
return (
{
setSelectedAssetTypes(prev =>
prev.includes(asset) ? prev.filter(a => a !== asset) : [...prev, asset]
);
}}
className={`px-2 py-3 rounded-sm border text-[10px] font-semibold uppercase tracking-wider transition-all ${
isSelected
? 'bg-orange-500/10 border-orange-500 text-orange-500'
: 'bg-neutral-900 border-neutral-800 text-neutral-400 hover:border-neutral-700'
}`}
>
{asset}
);
})}
{/* Genre Selector with "Other" dropdown */}
Primary Music Genre Mix
{['Pop/Hip-Hop', 'Electronic/Dance', 'Rock/Alternative', 'Jazz/Classical', 'Lofi/Ambient'].map((g) => (
{
setSelectedGenre(g);
setIsOtherGenreActive(false);
}}
className={`px-4 py-2 rounded-sm text-[10px] font-bold uppercase tracking-wider transition-all ${
selectedGenre === g && !isOtherGenreActive
? 'bg-orange-500 text-neutral-950'
: 'bg-neutral-900 text-neutral-400 hover:bg-neutral-800'
}`}
>
{g}
))}
{
setIsOtherGenreActive(true);
setSelectedGenre(otherGenreSelection);
}}
className={`px-4 py-2 rounded-sm text-[10px] font-bold uppercase tracking-wider transition-all ${
isOtherGenreActive
? 'bg-orange-500 text-neutral-950'
: 'bg-neutral-900 text-neutral-400 hover:bg-neutral-800'
}`}
>
Other
{/* Interactive Other Genre Selection Dropdown */}
{isOtherGenreActive && (
Select Popular Genre Option
{
setSelectedGenre(e.target.value);
setOtherGenreSelection(e.target.value);
}}
className="bg-neutral-900 border border-neutral-800 rounded-sm text-xs px-4 py-3 text-white focus:outline-none focus:border-orange-500 transition-all font-semibold tracking-wide w-full sm:max-w-xs"
>
Latin / Reggaeton
Afrobeat
R&B / Soul
Country / Folk
Reggae
Soundtrack / Orchestral
Metal / Hardcore
K-Pop / J-Pop
)}
{/* Valuation Dashboard Display */}
Underwriting Performance
SCALE 4x - 11x
{/* Real-time Legitimacy Badge (Based on rules: min 2 years & 10k LTM) */}
{isSimulatorLegitimate ? (
✓ Validated Legitimacy Status
Meets the 2-Year minimum age & $10k/yr income standard for fast advance routing.
) : (
Asset Underqualified
Requires a minimum of 2 catalog years and $10,000 USD LTM income to claim upfront advance liquidity.
)}
{/* Differentiated Calculations display for Acquisition vs Advance */}
Recoupable Funding Advance
{computedValuation.advanceMinMult}x - {computedValuation.advanceMaxMult}x LTM
${(computedValuation.advanceMin).toLocaleString()} to ${(computedValuation.advanceMax).toLocaleString()}
Creators retain ultimate catalog copyright ownership.
Premium Buyout Assessment
{computedValuation.acquisitionMinMult}x - {computedValuation.acquisitionMaxMult}x LTM
${(computedValuation.acquisitionMin).toLocaleString()} to ${(computedValuation.acquisitionMax).toLocaleString()}
Perpetual transfer of rights streams at prime multiples.
{ setKycStep(1); setActiveTab('get-started'); }}
className="bg-orange-500 hover:bg-orange-400 text-neutral-950 mt-8 w-full font-bold uppercase tracking-[0.2em] text-xs py-4 rounded-sm transition-all flex items-center justify-center gap-2"
>
Lock Valuation Offer
{/* ✨ NEW FEATURE: Gemini API Creator Prospectus */}
Luna x AI Portfolio Strategist
Generate an executive Private Equity Prospectus specifically tailored to your current catalog configuration.
{aiProspectusLoading ? (
<>
✨ Analyzing Assets...
>
) : (
<>
✨ Generate AI Catalog Analysis
>
)}
{aiProspectusResult && (
{aiProspectusResult}
)}
{/* Services Overview Grid */}
Our Royalties Spectrum
Consolidated Streaming & Rights Assets
We secure optimal capital structures against all intellectual property royalty components.
{/* Streaming Master */}
Master & Streaming
Advances secured against Spotify, Apple Music, and direct digital distributor streams. Retain ownership or execute full buyouts.
{/* Publishing Share */}
Music Publishing
Acquisitions and funding on writer's share, publisher's share, mechanical royalties, and sync stream incomes managed by global PROs.
{/* Neighboring Rights */}
Neighboring Rights
Liquid cash flows for master performance rights collected through SoundExchange, PPL, GVL, and other collective organizations.
{/* Live Streaming & Twitch */}
Live Streaming & Twitch
Valuations and advances secured from background sync music, broadcaster licenses, content creator channels, Twitch, and TikTok.
)}
{/* TAB 2: HOW IT WORKS */}
{activeTab === 'how-it-works' && (
Interactive Guide (Coming Soon)
The Catalog Brokerage Flow
Secure upfront institutional capital using a structured, clear timeline.
Step 01
Onboard & Submit KYC Details
Provide credentials for your distributor/PRO, song splits, share percentages, and upload your last 24 months of earnings reports in CSV or Excel format.
Step 02
Multi-Partner Underwriting
We clean, verify, and structure your statements. Our automated platform presents anonymous catalog performance metrics to our 50+ prospective liquidity partners.
Step 03
Compare Liquidity Offers
We deliver the highest premium multiple offers generated by our ecosystem, showing fully transparent terms, schedules, and advance structures.
Step 04
Payout within 7 Days
Upon dynamic digital execution, premium capital routing settles directly into your designated accounts.
Ready to begin?
Attach your statement history to begin our automated analytics pipeline.
{ setKycStep(1); setActiveTab('get-started'); }}
className="mt-6 bg-amber-500 hover:bg-amber-400 text-neutral-950 font-bold uppercase tracking-[0.2em] text-xs px-6 py-3 rounded-sm transition-all inline-flex items-center gap-2"
>
Get Started
)}
{/* TAB 3: ELIGIBILITY ("LEGIBILIDADE") */}
{activeTab === 'eligibility' && (
Legibilidade criteria
Who Qualifies for Catalog Funding?
Review baseline operational metrics required for institutional capital placement.
{/* Special Highlight on 2-Year & 10k/year Legitimacy Rule */}
Official Legitimacy Standard
As experienced agents and brokers, we support both major rosters and indie catalogs starting at **$10,000 USD/year** in LTM income, operating globally with strong transaction expertise across France, USA, Central Africa, and Brazil.
{ setKycStep(1); setActiveTab('get-started'); }}
className="bg-emerald-500 hover:bg-emerald-400 text-neutral-950 font-bold uppercase tracking-[0.15em] text-[10px] py-3 px-6 rounded-sm transition-all whitespace-nowrap"
>
Check My Legitimacy
A minimum of **12 to 24 months of clear digital statement history** with cumulative LTM earnings exceeding **$10,000 USD** across streaming platforms. We specialize in launching independent assets with steady streaming patterns.
Valid statements from DistroKid, TuneCore, FUGA, Believe, AWAL, UnitedMasters, Stem, Symphonic, and direct publisher administration streams are accepted.
Legitimate title or contract validation ensuring authority to split or sell the respective Masters, Streaming, or Publishing shares.
Stable passive consumption patterns across Spotify editorial playlisting, search, sync placements, and streaming broadcasts.
Unsure of eligibility status?
Our onboarding teams review and verify all data structures individually.
{ setKycStep(1); setActiveTab('get-started'); }}
className="mt-6 bg-amber-500 hover:bg-amber-400 text-neutral-950 text-xs font-bold uppercase tracking-[0.15em] py-3 px-6 rounded-sm transition-all"
>
Onboard Free Review
)}
{/* TAB 4: GET STARTED (KYC & ONBOARDING FORM FOR LABELS/ARTISTS/OWNERS) */}
{activeTab === 'get-started' && (
{/* Steps Visual Indicator */}
Catalog Owner & Label Onboarding
Step {kycStep} of 3
{/* FORM CONTAINER */}
{kycStep < 4 && (
)}
{/* SUCCESS STATE */}
{kycStep === 4 && (
KYC Submitted Successfully
Our intake agents are working to compile reports for 50+ prospective institutional buyers. We will follow up via email at {kycForm.email} within 24 hours.
Reference ID
CAT-{Math.floor(1000 + Math.random() * 9000)}
Underwriting Assignment
Automated / Queue
{
setKycForm({
fullName: '',
email: '',
phone: '',
companyName: '',
catalogName: '',
primaryArtists: '',
tracksCount: '',
catalogAge: '3',
distributor: '',
sharePercent: '100',
splitsCount: '1',
ltmIncome: '',
rightsTypes: [],
uploadedFiles: [],
agreeToTerms: false
});
setKycStep(1);
setActiveTab('home');
}}
className="mt-12 bg-neutral-900 hover:bg-neutral-800 border border-neutral-800 text-white text-[10px] font-bold uppercase tracking-widest py-3 px-8 rounded-sm transition-all"
>
Return to Homepage
)}
)}
{/* TAB 5: TRENDS */}
{activeTab === 'trends' && (
Industry Valuations
Music Catalog Market Trends
Monitor modern multiple modifications across diverse creator rights classes.
Master Record Streaming
6.5x – 9.0x
• Fast liquid acquisitions for catalogs >2 years
• Premium valuations on platform editorial playlisting
Music Publishing Shares
9.5x – 14.0x
• High durability on mechanical performance flows
• Classic premium multiple valuations
Neighboring Performance Shares
5.0x – 7.5x
• Secured collections via SoundExchange
• Constant expansion driven by licensing adjustments
{/* Trending Insights Feed */}
Brokerage Insights
May 2026 Update
Live Stream Assets Show Significant Valuation Growth
Background music sync and creator portfolios are showing superior consistency profiles. Acquisition pools are prioritizing creator-owned catalogs.
April 2026 Update
Royalty Split Consolidation Prior to Underwriting
Consolidating split shares ahead of time increases transactional values significantly. Larger packages command modern buyout premiums.
)}
{/* TAB 6: CASES - EXTENDED WITH HIGH-PROFILE INTERNATIONAL & LOCAL TRANSACTIONS */}
{activeTab === 'cases' && (
Proven Liquidity Cases
Successful Catalog Transactions
Explore actual master, publishing, and live streaming rights transactions executed globally by our agents and brokers. Exact financial metrics are kept strictly confidential under partner non-disclosure agreements.
{/* Case 1: Mohombi (France, Sweden, Congo) */}
FRANCE / SWEDEN / CONGO
Mohombi
Master Recording & Publishing
Sourced and secured a global master and music publishing advance for international superstar Mohombi. Consolidated complex cross-border royalty streams across multiple societies to deliver accelerated upfront capital.
Territories
Europe & Central Africa
Structure
Advance
{/* Case 2: Klem Shen (France) */}
FRANCE
Klem Shen
Master Recording Rights on Streaming
Structured a custom non-recourse streaming royalty advance for French hip-hop pioneer Klem Shen. Calculated against consistent back-catalog digital streaming performance metrics, providing substantial liquidity while preserving 100% catalog copyright ownership.
Territories
France
Structure
Advance
{/* Case 3: Vessau Records (Central Africa) */}
CENTRAL AFRICA
Vessau Records
Master Catalog
Underwrote the master royalty portfolio for premier Central African master catalog Vessau Records. Structured an administrative advance securing immediate operational capital against regional streaming nodes to support strategic release slates.
Territories
Congo / Central Africa
Structure
Advance
{/* Case 4: Renaissance Records (USA) */}
UNITED STATES
Renaissance Records
Classic Rock, Jazz, Blues & Motown
Brokered the strategic royalty advance of a classic catalog containing iconic Rock, Jazz, Blues, and Motown recordings, providing rapid capital deployment for long-tail active portfolios.
Territories
North America
Structure
Advance
{/* Case 5: Trz (France) */}
FRANCE
Trz
Hip-Hop, Rap & Pop Master Rights for Streaming
Sourced and structured a streaming royalty advance against hip-hop, rap and pop master rights in France for innovator Trz, securing direct routes into active global digital streaming distribution networks.
Territories
France
Structure
Advance
)}
{/* NEW TAB: JOIN AS FREE AGENT FORM WITH AI Sourcing Strategy */}
{activeTab === 'join-agent' && (
{/* ... Agent Partner Program header ... */}
Partner Program
Become a Free Agent / Broker
Luna x Catalog operates worldwide. Apply to join our decentralized broker framework and earn premium advisory payouts on closed acquisition deals.
{agentStep === 1 && (
{/* Sourcing Strategy Results */}
{aiAgentSourcingResult && (
My Custom AI Sourcing Strategy
{aiAgentSourcingResult}
)}
)}
{agentStep === 2 && (
Agent Registration Succeeded
Thank you, {agentForm.fullName} . Our executive brokers are evaluating your territory network capabilities and market intelligence assessment. We will email you at {agentForm.email} to setup an onboarding verification call.
{
setAgentForm({
fullName: '',
email: '',
whatsapp: '',
primaryTerritories: [],
languagesSpoken: '',
networkDescription: '',
marketIntelDescription: '',
estimatedDeals: '1-5 catalogs',
agreeToBrokerCode: false
});
setAgentStep(1);
setActiveTab('home');
}}
className="mt-12 bg-neutral-900 hover:bg-neutral-850 border border-neutral-800 text-white text-[10px] font-bold uppercase tracking-widest py-3 px-8 rounded-sm transition-all font-semibold font-semibold"
>
Return to Homepage
)}
)}
{/* TAB 7: AGENT PORTAL LOGIN */}
{activeTab === 'login' && (
Auditor Terminal
Verify credentials to manage incoming valuation data.
{/* Notice Box with Demo credentials */}
📋 Auditor Validation Keys
User: admin
Pass: FodasPutas20+
Agency Username
setUsername(e.target.value)}
className="w-full bg-neutral-955 border border-neutral-900 rounded-sm px-4 py-3 text-xs text-white focus:outline-none focus:border-amber-500 transition-all font-semibold font-semibold"
/>
Agency Security Token
setPassword(e.target.value)}
className="w-full bg-neutral-955 border border-neutral-900 rounded-sm px-4 py-3 text-xs text-white focus:outline-none focus:border-[#dfc38a] transition-all font-semibold"
/>
{loginError && (
{loginError}
)}
Authenticate Terminal
)}
{/* TAB 8: AUTHENTICATED AGENT DASHBOARD */}
{activeTab === 'agent-dashboard' && isAuthenticated && (
{/* Upper Dashboard Meta Metrics */}
Live Intake CRM
Luna x Underwriting Hub
Review catalogs, download financial reports, and inspect Free Agent applications.
{
setIsAuthenticated(false);
setActiveTab('home');
triggerNotification("Logged out successfully.", "info");
}}
className="bg-neutral-900 hover:bg-neutral-800 text-[10px] uppercase font-bold tracking-widest px-4 py-2.5 border border-neutral-800 rounded-sm text-neutral-400 transition-all font-semibold font-semibold"
>
Secure Log Out
triggerNotification("Refreshed pipeline state.", "info")}
className="p-2.5 bg-neutral-900 hover:bg-neutral-800 border border-neutral-800 rounded-sm text-amber-500 transition-all"
>
{/* Sub Tabs Selection inside the terminal */}
{ setDashboardSubTab('catalogs'); setSelectedSubmission(null); }}
className={`pb-4 text-xs uppercase font-bold tracking-wider ${dashboardSubTab === 'catalogs' ? 'text-amber-500 border-b-2 border-amber-500 font-semibold' : 'text-neutral-500'}`}
>
Inflow Catalogs ({submittedLeads.length})
{ setDashboardSubTab('agent-applications'); setSelectedAgentApp(null); }}
className={`pb-4 text-xs uppercase font-bold tracking-wider ${dashboardSubTab === 'agent-applications' ? 'text-amber-500 border-b-2 border-amber-500 font-semibold' : 'text-neutral-500'}`}
>
Agent Applications ({submittedAgents.length})
{/* Quick Metrics Bar dynamically calculated */}
Total Sourced Revenue
${submittedLeads.reduce((acc, lead) => acc + lead.ltmIncome, 0).toLocaleString()}
Sourced Countries
FR, USA, CA, BR
Active Brokers/Agents
{submittedAgents.length} Active
Multi-lingual support
5+ Languages
{/* DYNAMIC PIPELINE CONTENT */}
{dashboardSubTab === 'catalogs' ? (
{/* TABLE PIPELINE */}
Catalog Reference
LTM Income
Split Details
Status
Actions
{submittedLeads
.filter(lead => {
const matchesSearch = lead.catalogName.toLowerCase().includes(dashboardSearch.toLowerCase()) ||
lead.primaryArtist.toLowerCase().includes(dashboardSearch.toLowerCase());
const matchesStatus = dashboardFilterStatus === 'All' || lead.status === dashboardFilterStatus;
return matchesSearch && matchesStatus;
})
.map((lead) => (
setSelectedSubmission(lead)}>
{lead.id}
{lead.catalogName}
{lead.primaryArtist}
${lead.ltmIncome.toLocaleString()}
{lead.sharePercent}% Share
{lead.tracksCount} Tracks / {lead.splitsCount} Splits
{lead.status}
e.stopPropagation()}>
setSelectedSubmission(lead)}
className="bg-neutral-950 hover:bg-neutral-800 border border-neutral-900 text-neutral-300 text-[10px] font-bold uppercase tracking-widest px-3 py-2 rounded-sm transition-all"
>
Review
))
}
{/* DETAILS PANEL PANEL WITH INTEGRATED ✨ AUDITOR AI ASSISTANT */}
{selectedSubmission ? (
{selectedSubmission.id}
{selectedSubmission.catalogName}
{selectedSubmission.primaryArtist}
{
setSelectedSubmission(null);
setAiUnderwriterResult("");
}}
className="text-neutral-500 hover:text-white text-[10px] font-bold uppercase tracking-widest"
>
[Close]
{/* AI Risk Assessment Action Box */}
generateAgentUnderwriterAnalysis(selectedSubmission)}
disabled={aiUnderwriterLoading}
className="w-full bg-neutral-900 hover:bg-neutral-855 text-amber-500 border border-amber-500/20 text-[10px] font-bold uppercase tracking-widest py-3 rounded-sm flex items-center justify-center gap-2"
>
{aiUnderwriterLoading ? (
<>
Structuring risk portfolio...
>
) : (
<>
✨ AI Underwriting Analysis
>
)}
{aiUnderwriterResult && (
{aiUnderwriterResult}
)}
{/* Metadata Specs */}
Client KYC Contact
{selectedSubmission.submittedBy}
{selectedSubmission.email}
Distributor
{selectedSubmission.distributor}
Submitted
{selectedSubmission.date}
{/* Underwriting Calculations Estimate */}
Calculated Valuations
Conservative Advance
${(selectedSubmission.ltmIncome * (selectedSubmission.catalogAge <= 4 ? 4.0 : 6.0)).toLocaleString()}
Acquisition Buyout
${(selectedSubmission.ltmIncome * (selectedSubmission.catalogAge <= 4 ? 6.0 : 10.0)).toLocaleString()}
{/* KYC Document / 24-Month Report Downloads */}
Submitted Reports (24-Mo Audit)
{selectedSubmission.files.map((file, i) => (
{file}
triggerNotification(`Downloading audit manifest: ${file}`, "info")}
className="text-amber-500 hover:text-amber-400 p-1 rounded-sm"
title="Download Report Statement"
>
))}
{/* Workflow State Update Simulator */}
Audit Underwriting Action
{
setSubmittedLeads(prev => prev.map(l => l.id === selectedSubmission.id ? { ...l, status: 'Underwriting' } : l));
setSelectedSubmission(prev => ({ ...prev, status: 'Underwriting' }));
triggerNotification("Catalog moved to Multi-Partner Underwriting queue.", "success");
}}
className="flex-1 bg-neutral-955 hover:bg-neutral-800 border border-neutral-900 text-[10px] font-bold uppercase tracking-widest py-3 rounded-sm transition-all"
>
Underwriting
{
setSubmittedLeads(prev => prev.map(l => l.id === selectedSubmission.id ? { ...l, status: 'Offer Pending' } : l));
setSelectedSubmission(prev => ({ ...prev, status: 'Offer Pending' }));
triggerNotification("Generated valuation sheets sent to 50+ Partners.", "success");
}}
className="flex-1 bg-amber-500 hover:bg-amber-400 text-neutral-950 text-[10px] font-bold uppercase tracking-widest py-3 rounded-sm transition-all"
>
Publish Offer
) : (
Select any submission column from the pipeline table on the left to initiate thorough auditing.
)}
) : (
/* AGENT APPLICATIONS INFLOW TERMINAL */
{/* APPLICATION PIPELINE LIST */}
Agent Reference / Name
Territories
Languages Spoken
Est. Sourcing Deals
Status
{submittedAgents.map((agentApp) => (
setSelectedAgentApp(agentApp)}
>
{agentApp.id}
{agentApp.fullName}
{agentApp.email}
{agentApp.territories.join(', ')}
{agentApp.languages}
{agentApp.estimatedDeals}
{agentApp.status}
))}
{/* APPLICATION DETAIL PANEL */}
{selectedAgentApp ? (
{selectedAgentApp.id}
{selectedSubmission?.fullName || selectedAgentApp.fullName}
{selectedAgentApp.email}
setSelectedAgentApp(null)}
className="text-neutral-500 hover:text-white text-[10px] font-bold uppercase tracking-widest"
>
[Close]
{/* Contact Metrics */}
WhatsApp / Contact
{selectedAgentApp.whatsapp}
Primary Territories
{selectedAgentApp.territories.join(', ')}
{/* Qualitative Questions Evaluation */}
Network & Sourcing Outreach
"{selectedAgentApp.networkDescription}"
Music Market Intel & Underwriting Experience
"{selectedAgentApp.marketIntel}"
{/* Approval Actions */}
Partner Status Action
{
setSubmittedAgents(prev => prev.map(a => a.id === selectedAgentApp.id ? { ...a, status: 'Approved' } : a));
setSelectedAgentApp(prev => ({ ...prev, status: 'Approved' }));
triggerNotification(`Broker ${selectedAgentApp.fullName} has been fully accredited!`, "success");
}}
className="flex-1 bg-amber-500 hover:bg-amber-400 text-neutral-955 text-[10px] font-bold uppercase tracking-widest py-3 rounded-sm transition-all font-semibold"
>
Approve Agency
) : (
Select any Agent Candidate column on the left to verify their localized network and catalog intelligence parameters.
)}
)}
)}
{/* Premium Corporate Footer (Fully Customized as requested) */}
);
}