// ============================================================ // Tribeca Lisboa — RESPONSIVE sections (bilingual EN/PT) // Content selects language via LangContext + tt(). Fixed product // labels (More than a festival / What's new / Live & Soon / // From the feed) stay English via FIX(). // ============================================================ const { useState: useStateR } = React; const useCtx = React.useContext; const R_TABS = ['all', 'film', 'podcasts', 'talks', 'vibes', 'nightlive', 'immersive', 'awards', 'industry']; // event/news titles → EN fallback helper const evTitle = (lang, ev) => tt(lang, ev.titleEn || ev.title, ev.title); // ---- Hero --------------------------------------------------- function RHero() { const lang = useCtx(LangContext); return (
{tt(lang, '14-21 June • LISBON', '14-21 junho • LISBOA')}

{tt(lang, 'The European hub for storytelling', 'O hub europeu de storytelling')}

{tt(lang, 'Where stories become culture.', 'Onde as histórias se transformam em cultura.')}

{}}>{tt(lang, 'Learn more', 'Saber mais')}
); } // ---- More than a festival ----------------------------------- function RMoreThanFestival() { const lang = useCtx(LangContext); return (

More
than a festival

{tt(lang, 'A year-round cultural platform', 'Uma plataforma cultural durante todo o ano')}

{tt(lang, 'A European platform for contemporary storytelling where culture, entertainment, creativity and talent meet to explore the future of stories and culture.', 'Uma plataforma europeia de storytelling contemporâneo onde cultura, entretenimento, criatividade e talento se cruzam para explorar o futuro das histórias e da cultura.')}

Film · Podcasts · Talks · Vibes · Night Live · Immersive · Awards · Industry {tt(lang, 'discover more', 'descobrir mais')}
); } // ---- Event card + tabs + carousel --------------------------- function REventCard({ ev }) { const lang = useCtx(LangContext); const c = CAT[ev.cat] || CAT.film; return (
{ location.href = urlFor('event', ev.id); }}>

{evTitle(lang, ev)}

{ev.date}
{ev.venue}
{tt(lang, 'get tickets', 'comprar bilhetes')}
{tt(lang, 'see more +', 'ver mais +')}
); } function RCategoryTabs({ active, onChange }) { return (
{R_TABS.map((t) => { const sel = active === t; const c = CAT[t]; const bg = sel ? t === 'all' ? '#fff' : c.bg : 'transparent'; const border = sel ? t === 'all' ? '#fff' : c.bg : 'var(--fg-3)'; const markVariant = sel ? t === 'all' ? 'black' : 'hl' : 'grey'; return (
onChange(t)} style={{ background: bg, borderColor: border }}> {t}
); })}
); } function RWhatsNew() { const lang = useCtx(LangContext); const [active, setActive] = useStateR('all'); const list = active === 'all' ? EVENTS : EVENTS.filter((e) => e.cat === active); return (

{FIX('What’s new')}

{list.length ? list.map((ev) => ) : {tt(lang, 'Coming soon.', 'Em breve.')}}
); } // ---- Schedule ----------------------------------------------- function RScheduleList() { const lang = useCtx(LangContext); return (
{tt(lang, 'Today', 'Hoje')} • {FIX('Live & Soon')} 14/06
{SCHEDULE.map((it, i) =>
{ if (it.id) location.href = urlFor('event', it.id); }}>
{it.time}
{tt(lang, it.titleEn || it.title, it.title)}
{it.venue}
)}
); } // ---- Notícias / News ---------------------------------------- function RNewsHighlight({ data }) { const lang = useCtx(LangContext); return (
{ location.href = urlFor('news', data.id); }}>

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

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

{tt(lang, 'Read more', 'Ler mais')}
); } function RNewsCard({ item }) { const lang = useCtx(LangContext); return (
{ location.href = urlFor('news', item.id); }}>
{item.showTag &&
}

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

{tt(lang, 'read more', 'ler mais')}
); } function RNoticias() { const lang = useCtx(LangContext); return (

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

{NEWS.map((n, i) =>
)}
{tt(lang, 'all news', 'todas as notícias')}
); } // ---- From the feed ------------------------------------------ function RFromTheFeed() { const lang = useCtx(LangContext); return (

{FIX('From the feed')}

{tt(lang, 'follow @tribecalisboa', 'seguir @tribecalisboa')} {FEED.map((src, i) =>
)}
); } // ---- Newsletter --------------------------------------------- function RNewsletter() { const lang = useCtx(LangContext); const [email, setEmail] = useStateR(''); const [agree, setAgree] = useStateR(false); const [done, setDone] = useStateR(false); return (

{tt(lang, 'Subscribe to the newsletter', 'Subscrever newsletter')}

{done ?

{tt(lang, "Thank you! You're subscribed.", 'Obrigado! Estás subscrito.')}

:
setEmail(e.target.value)} placeholder={tt(lang, 'Your email', 'O teu email')} />
{if (email && agree) setDone(true);}}>{tt(lang, 'subscribe', 'subscrever')}
}
); } // ---- Footer (editorial nav + trust + partner + legal hub) --- function RFtXLogo() { return ( ); } function RFooter() { const lang = useCtx(LangContext); const year = new Date().getFullYear(); const nav = [ { label: tt(lang, 'Festival', 'Festival'), href: urlFor('soon', 'festival') }, { label: FIX('More than a festival'), href: urlFor('soon', 'mtf') }, { label: tt(lang, 'Full Program', 'Programa completo'), href: urlFor('soon', 'program') }, { label: tt(lang, 'Pillars', 'Pilares'), href: urlFor('soon', 'pillars') }, { label: FIX('What’s new'), href: urlFor('home') + '#whats-new', scroll: 'whats-new' }, { label: tt(lang, 'About Tribeca', 'Sobre a Tribeca'), href: urlFor('about') }, { label: tt(lang, 'News', 'Notícias'), href: urlFor('news_list') }, ]; const legal = [ { label: tt(lang, 'Privacy Policy', 'Política de Privacidade'), href: urlFor('legal', 'privacy') }, { label: tt(lang, 'Cookies Policy', 'Política de Cookies'), href: urlFor('legal', 'cookies') }, { label: tt(lang, 'Complaint Book', 'Livro de Reclamações'), href: 'https://www.livroreclamacoes.pt/Inicio/', ext: true }, { label: 'FAQs', href: null }, ]; const navLink = (n, i) => n.scroll ? handleScrollNav(e, n.scroll)}>{n.label} : n.href ? {n.label} : e.preventDefault()}>{n.label}; return ( ); } Object.assign(window, { RHero, RMoreThanFestival, REventCard, RCategoryTabs, RWhatsNew, RScheduleList, RNewsHighlight, RNewsCard, RNoticias, RFromTheFeed, RNewsletter, RFooter });