);
}
// ---- Info strip + secondary actions -------------------------
function EdInfo({ onCalendar, onShare }) {
const lang = React.useContext(LangContext);
return (
{tt(lang, 'Date', 'Data')}
{tt(lang, EVENT.dateEn, EVENT.date)}
{tt(lang, 'Time · Duration', 'Hora · Duração')}
{EVENT.time} · {EVENT.duration}
{tt(lang, 'Venue', 'Local')}
{EVENT.venueName} · {EVENT.venueArea}
);
}
// ---- Description --------------------------------------------
function EdDescription() {
const lang = React.useContext(LangContext);
return (
{tt(lang, 'About the event', 'Sobre o evento')}
{tt(lang, EVENT.leadEn, EVENT.lead)}
{tt(lang, EVENT.bodyEn, EVENT.body)}
);
}
// ---- Program ------------------------------------------------
function EdProgram() {
const lang = React.useContext(LangContext);
return (
{tt(lang, 'The night, in detail', 'A noite, ao detalhe')}
{tt(lang, 'Programme', 'Programa')}
{PROGRAM.map((p, i) => (
{p.time}
{tt(lang, p.titleEn, p.title)}
{tt(lang, p.noteEn, p.note)}
))}
);
}
// ---- Guest / speaker card (shared component — reused by the
// News Article page for Related speakers; do not fork) ---------
function EdGuestCard({ g }) {
const lang = React.useContext(LangContext);
const linked = window.isConfirmedGuest ? isConfirmedGuest(g.id) : true; // only confirmed guests open a Talent page
const inner = (<>
{linked &&
}
{tt(lang, g.roleEn || g.role, g.role)}
{g.name}
>);
if (!linked) {
return
{inner}
;
}
return {inner};
}
// ---- Guests (editorial rail — no feature card) --------------
function EdGuests() {
const lang = React.useContext(LangContext);
return (