// In Progress + Messages + Quick Actions + Wallet mini const Icons = window.SonaraIcons; function InProgress() { const projects = [ { id: 3, kind: "master", kindIcon: , kindLabel: "Master", title: "'Skyline EP'", who: "Studio Riva", whoInit: "SR", meta: "Studio Riva ha consegnato il master finale", timeLabel: "Scade tra 6h", action: { label: "Approva ora", primary: true }, secondaryAction: { label: "Ascolta" }, urgent: true, progress: 95, }, { id: 1, kind: "mix", kindIcon: , kindLabel: "Mix", title: "'Notte Lunga'", who: "Marco Vitale", whoInit: "MV", meta: "v2 consegnata · 1 revisione rimasta", timeLabel: "Approva entro 2 giorni", action: { label: "Approva o revisiona", primary: true }, secondaryAction: { label: "Ascolta" }, progress: 80, }, { id: 2, kind: "beat", kindIcon: , kindLabel: "Beat custom", title: "'Trap dark'", who: "Yoshi", whoInit: "Y", meta: "Stems consegnati · revisione 0 di 2", timeLabel: "Producer lavora · consegna in 5gg", action: { label: "Vedi progresso" }, progress: 45, }, ]; const urgentCount = projects.filter(p => p.urgent).length; return (
Da revisionare {projects.length} {urgentCount > 0 && ( {urgentCount} urgente )} Vedi tutti
{projects.map(p => ( ))}
); } function Messages() { const msgs = [ { id: 1, name: "Yoshi", init: "Y", time: "12:14", verified: true, online: true, preview: "Ti ho mandato la v2 col kick più presente, dimmi che ne pensi.", unread: true }, { id: 2, name: "Marco Vitale", init: "MV", time: "11:02", verified: true, online: false, preview: "Mix pronto. Ho lasciato spazio in alto per la tua voce in coda.", unread: true }, { id: 3, name: "Sara · Riva Studio", init: "SR", time: "ieri", verified: false, online: true, preview: "Confermi master finale? Approvazione automatica fra 6h.", unread: true }, { id: 4, name: "Diego K.", init: "DK", time: "ieri", verified: true, online: false, preview: "Ricevuta. Mando un'offerta entro stasera 🔥", unread: false }, { id: 5, name: "Vale Frey", init: "VF", time: "lun", verified: false, online: false, preview: "Grazie per la collab! Ti recensisco oggi.", unread: false }, ]; return (
Messaggi 3 non letti Apri chat
); } function QuickActions() { const actions = [ { primary: true, t: "Pubblica richiesta", s: "Cerco un beat, un mix, un master — i producer fanno offerte a te.", hint: "Apri brief", icon: , href: "PubblicaRichiesta.html", }, { t: "Esplora beat", s: "Sfoglia 12.4k tracce dei migliori producer italiani.", hint: "Vai al catalogo", icon: , href: "Esplora.html", }, { t: "Cerca producer", s: "Filtra per genere, città, rating e tempo di risposta.", hint: "Apri directory", icon: , href: "Esplora.html#producer", }, { t: "Carica showcase", s: "Aggiungi i tuoi brani al profilo, fino a 6 tracce.", hint: "Carica audio", icon: , href: "Profilo.html", }, { t: "Pubblica un tuo servizio", s: "Vocalist, topline, songwriting: vendi le tue skill come faresti con un beat.", hint: "Apri brief", icon: , href: "PubblicaServizio.html", }, ]; return (
Azioni rapide
{actions.map((a, i) => ( {a.icon} {a.t} {a.s} {a.hint} ))}
); } function OpenRequest() { const requests = [ { id: 1, brief: "Cerco beat trap dark · 140 BPM", offers: 8, newOffers: 1, expires: "scade tra 22 giorni", }, ]; const newCount = requests.reduce((n, r) => n + r.newOffers, 0); return (
Richieste aperte {requests.length} {newCount > 0 && {newCount} nuova offerta} Tutte
{requests.map(r => (
"{r.brief}"
{r.offers} offerte {r.newOffers > 0 && +{r.newOffers} nuova} · {r.expires}
Vedi offerte
))}
); } Object.assign(window, { InProgress, Messages, QuickActions, OpenRequest });