// 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
);
}
/* ─────────── 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
);
}
/* ─────────── 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 (
);
}
/* ─────────── 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 (
);
}
/* ─────────── 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 (
);
}
/* ─────────── 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 (
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,
});