// SONARA — Manager Dashboard sections const MgrIcons = window.SonaraIcons; const PlayIc = ({ size = 12 }) => ; const ChevIc = ({ size = 14 }) => ; const StarIc = ({ size = 12, filled = true }) => ; const ArrIc = ({ size = 14 }) => ; const UpIc = ({ size = 12 }) => ; /* ─────────── ROSTER overview ─────────── */ const ROSTER = [ { id: "luca", handle: "@lucabianchi", name: "Luca Bianchi", init: "LB", genres: "Cantautorato · indie", city: "Milano", relation: "Esclusiva", since: "8 mesi", activity: { kind: "offers", text: "5 offerte sulla richiesta Mix EP 'Restami'", time: "2h fa", urgent: true, accent: "violet" }, action: "Vedi offerte", }, { id: "martina", handle: "@martinarey", name: "Martina Rey", init: "MR", genres: "Alt-pop · R&B", city: "Bologna", relation: "Non-esclusiva", since: "3 settimane", activity: { kind: "done", text: "Master completato con Studio Riva · 5★", time: "1g fa", accent: "success" }, action: "Apri profilo", }, { id: "giada", handle: "@giadaverdi", name: "Giada Verdi", init: "GV", genres: "Trap · drill", city: "Roma", relation: "Esclusiva", since: "1 anno · 4 mesi", activity: { kind: "open", text: "Cerca beat trap dark · 8 offerte ricevute", time: "3g fa", accent: "violet" }, action: "Apri profilo", }, { id: "edo", handle: "@edopalma", name: "Edoardo Palma", init: "EP", genres: "Indie · folk", city: "Torino", relation: "Esclusiva", since: "2 anni", activity: { kind: "stale", text: "Nessuna attività negli ultimi 30 giorni", time: "—", accent: "neutral", warn: true }, action: "Scrivigli", }, { id: "kaya", handle: "@kayalow", name: "Kaya Low", init: "KL", genres: "R&B · neo-soul", city: "Milano", relation: "Project-based", since: "6 settimane", activity: { kind: "new", text: "Caricata nuova showcase track 'Mira'", time: "ieri", accent: "violet" }, action: "Ascolta", }, ]; function RosterCard() { const urgent = ROSTER.filter(a => a.activity.urgent).length; return (
Il tuo roster {ROSTER.length} attivi {urgent > 0 && ( {urgent} richiede attenzione )}
Vedi tutto
{ROSTER.map(a => ( {a.init}
{a.name} {a.handle} · {a.relation}
{a.genres} · {a.city} · Da {a.since}
{a.activity.text} {a.activity.time}
))}
); } /* ─────────── PENDING INVITES ─────────── */ function PendingInvites() { const items = [ { id: "i1", to: "@simonecaruso", name: "Simone Caruso", init: "SC", sent: "3gg fa", expires: "tra 27gg", relation: "Esclusiva", genres: "Alt-pop · Torino" }, { id: "i2", to: "@noahmiles", name: "Noah Miles", init: "NM", sent: "1 sett fa", expires: "tra 23gg", relation: "Non-esclusiva", genres: "Indie · Milano" }, ]; return (
Inviti al roster in attesa {items.length}
Tutti
{items.map(it => (
{it.name} · {it.to}
{it.genres} · Inviato {it.sent} · Scade {it.expires} · {it.relation}
))}
); } /* ─────────── MESSAGES (manager) ─────────── */ function MessagesCard() { const msgs = [ { who: "Giulia Wave", init: "GW", verified: false, preview: "Ciao Andrea, ti scrivo perché ho visto il tuo profilo…", time: "8m", unread: true, role: "Artista" }, { who: "Studio Riva", init: "SR", verified: true, preview: "Confermato: posso lavorare con Luca Bianchi sull'EP a partire da lunedì.", time: "1h", unread: true, role: "Producer" }, { who: "Martina Rey", init: "MR", verified: true, preview: "Grazie ancora per l'invito! Quando ci sentiamo per parlare di strategie?", time: "3h", unread: true, role: "Roster" }, { who: "Diego K.", init: "DK", verified: true, preview: "Bel lavoro con Giada, te la rubo per un featuring 😎", time: "Ieri", unread: false, role: "Producer" }, { who: "Nico Vega", init: "NV", verified: true, preview: "Confermo, mando i preventivi entro stasera.", time: "Lun", unread: false, role: "Producer" }, ]; return (
Messaggi 3 da leggere
Apri chat
{msgs.map((m, i) => ( {m.init}
{m.who} {m.verified && } {m.role}
{m.preview}
{m.time} {m.unread && }
))}
); } /* ─────────── QUICK ACTIONS ─────────── */ function QuickActions() { const actions = [ { primary: true, t: "Esplora artisti", s: "Scopri talenti emergenti in linea con i tuoi generi gestiti.", ic: , href: "Esplora.html" }, { t: "Cerca producer", s: "Costruisci la tua rete: producer per i tuoi artisti.", ic: , href: "Esplora.html#producer" }, { t: "Aggiorna profilo", s: "Bio, aree di competenza, link e disponibilità.", ic: , href: "Profilo.html" }, { t: "Vedi roster", s: "Activity feed degli artisti che gestisci.", ic: , href: "Roster.html" }, ]; return (
Azioni rapide
{actions.map((a, i) => (
{a.ic}
{a.t}
{a.s}
Apri
))}
); } /* ─────────── DISCOVER TALENTS (carousel) ─────────── */ const TALENTS = [ { id: "t1", name: "Simone Caruso", handle: "@simonecaruso", init: "SC", city: "Torino", genres: ["alt-pop","indie"], match: 92, looking: true, completed: 3, badge: "Active" }, { id: "t2", name: "Aïda L.", handle: "@aidalow", init: "AL", city: "Milano", genres: ["R&B","neo-soul"], match: 88, looking: true, completed: 8, badge: "Verified" }, { id: "t3", name: "Theo Marini", handle: "@theomarini", init: "TM", city: "Napoli", genres: ["cantautorato"], match: 84, looking: false, completed: 5, badge: "Active" }, { id: "t4", name: "Noah Miles", handle: "@noahmiles", init: "NM", city: "Milano", genres: ["indie","alt-pop"], match: 81, looking: false, completed: 12, badge: "Verified" }, { id: "t5", name: "Vale Frey", handle: "@valefrey", init: "VF", city: "Bologna", genres: ["pop","cantautorato"], match: 78, looking: true, completed: 4, badge: null }, { id: "t6", name: "Kai Russo", handle: "@kairusso", init: "KR", city: "Roma", genres: ["trap","drill"], match: 76, looking: false, completed: 7, badge: "Active" }, ]; function DiscoverTalents() { // Pull a curated subset from ESPLORA_ARTISTS if available; fallback to local TALENTS const fromEsplora = window.ESPLORA_ARTISTS ? window.ESPLORA_ARTISTS.slice(0, 6).map((a, i) => ({ id: a.id, name: a.name, handle: a.handle, init: a.init, city: a.city, genres: a.genres, match: 92 - i*3, looking: a.looking, completed: a.collabs, badge: a.badge, })) : TALENTS; return (
Talenti da scoprire match sui tuoi generi
Vai a Esplora
); } /* ─────────── PROFILE STATS ─────────── */ function ProfileStats() { const stats = [ { l: "Visite profilo", v: "87", d: "+24%", up: true, sub: "ultimi 7gg" }, { l: "Salvataggi", v: "12", d: "+3", up: true, sub: "nuovi" }, { l: "DM ricevuti", v: "4", d: "questa sett.", flat: true }, { l: "Ranking IT", v: "Top 8%", d: "manager alt-pop", flat: true, highlight: true }, ]; return (
Stats profilo ultimi 7gg
Report
{stats.map((s, i) => (
{s.l}
{s.v}
{s.up && } {s.d}
{s.sub &&
{s.sub}
}
))}
); } /* ─────────── PROFILE COMPLETENESS ─────────── */ function ProfileCompleteness() { const items = [ { l: "Foto profilo", done: true, pts: 15 }, { l: "Bio professionale", done: true, pts: 20 }, { l: "Aree di competenza", done: true, pts: 15 }, { l: "Generi gestiti", done: true, pts: 10 }, { l: "Anni esperienza", done: true, pts: 5 }, { l: "Link LinkedIn", done: false, pts: 5 }, { l: "Carica un case study", done: false, pts: 15 }, { l: "Verifica documento (KYC)", done: false, pts: 15 }, ]; const pct = items.reduce((n, i) => n + (i.done ? i.pts : 0), 0); const C = 2 * Math.PI * 24; const off = C - (pct / 100) * C; return (
{pct}%
Completa il profilo
Profili pieni ricevono il 3× più visite e appaiono prima nei suggerimenti.
); } Object.assign(window, { RosterCard, PendingInvites, MessagesCard, QuickActions, DiscoverTalents, ProfileStats, ProfileCompleteness, ROSTER, TALENTS, });