// ============================================================ // Tribeca Lisboa — NEWS LISTING page (bilingual, responsive) // Featured hero (RNewsHighlight) + responsive grid of the // standard news card (RNewsCard). Reuses SiteHeader/RFooter. // All cards clickable → News Detail (?id). Newest first. // ============================================================ function NewsListingInner() { const lang = React.useContext(LangContext); const [menu, setMenu] = React.useState(false); const sorted = NEWS.slice(); // store order = newest first (n1 = most recent) const featured = sorted[0]; const rest = sorted.slice(1); return (
setMenu(true)} /> {/* page masthead */}
{tt(lang, 'The Journal', 'O Jornal')}

{tt(lang, 'News', 'Notícias')}

{tt(lang, 'Festival updates, announcements, interviews and cultural stories — the newsroom of Tribeca Festival Lisboa.', 'Atualizações do festival, anúncios, entrevistas e histórias de cultura — a redação do Tribeca Festival Lisboa.')}

{/* 1 — featured hero */}
{/* 2 — responsive grid of standard news cards */}
{rest.map((n) => )}
setMenu(false)} />
); } // Featured hero — large editorial card (extends the news-highlight pattern) function NewsFeature({ data }) { const lang = React.useContext(LangContext); const c = CAT[data.cat]; return (
{c.label} {tt(lang, data.dateEn, data.date)}

{tt(lang, data.titleEn, data.title)}

{tt(lang, data.excerptEn, data.excerpt)}

{tt(lang, 'Read story', 'Ler artigo')}
); } // Standard news card (grid) — image, tag, title, excerpt, date function NewsGridCard({ item }) { const lang = React.useContext(LangContext); const c = CAT[item.cat]; return (
{c.label} {tt(lang, item.dateEn, item.date)}

{tt(lang, item.titleEn, item.title)}

{tt(lang, item.excerptEn, item.excerpt)}

); } function NewsListing() { const [lang] = useLang(); return ( ); } ReactDOM.createRoot(document.getElementById('root')).render();