// ============================================================ // Tribeca Lisboa — PRE-LAUNCH LANDING (standalone page) // Independent of the main site chrome. Reuses i18n + Primitives // (Logo, IconInstagram, TertiaryButton, Reveal) + RNewsletter. // Bilingual EN/PT. No primary navigation. // ============================================================ const { useState: useStateLP, useEffect: useEffectLP, useRef: useRefLP } = React; const AB = 'uploads/about'; const TICKETS_URL = 'https://sic.bol.pt/Comprar/Bilhetes/169974-a_bronx_tale_one_man_show_by_chazz%20_palminteri-sic_sociedade_independente_de_comunicacao_s_a'; // IG_URL + openExt + LpLang/LpHeader/LpFooter are shared from LandingChrome.jsx // reveal-on-scroll (window scroll) — toggles .ab-rev → .in function useLpReveal(rootRef) { useEffectLP(() => { const root = rootRef.current; if (!root) return; const els = root.querySelectorAll('.ab-rev'); if (window.PREFERS_REDUCED) { els.forEach(e => e.classList.add('in')); return; } const vh = () => window.innerHeight || document.documentElement.clientHeight; const check = () => els.forEach(el => { if (!el.classList.contains('in')) { const r = el.getBoundingClientRect(); if (r.top < vh() - 40 && r.bottom > 0) el.classList.add('in'); } }); let frames = 0, raf, alive = true; const burst = () => { if (!alive) return; check(); if (frames++ < 16) raf = requestAnimationFrame(burst); }; const onScroll = () => check(); window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); burst(); const t1 = setTimeout(check, 300), t2 = setTimeout(check, 800); return () => { alive = false; cancelAnimationFrame(raf); clearTimeout(t1); clearTimeout(t2); window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); }; }, []); } // ---- Header (logo + lang + Instagram + SIC, no nav) → LandingChrome.jsx --- // ---- Hero (homepage hero design: video + bottom-left badge/H1/sub) --- function LpHero() { const lang = React.useContext(LangContext); return (
{tt(lang, '9–13 DEC 2026', '9–13 DEZ 2026')}

{tt(lang, 'Tribeca Lisboa is back', 'O Tribeca Lisboa está de volta')}

{tt(lang, 'The future of culture lives in Lisbon, on Avenida da Liberdade, during the most magical time of the year.', 'O futuro da cultura vive em Lisboa na Avenida da Liberdade durante a época mais mágica do ano.')}

); } // ---- 00 — About hub ----------------------------------------- function LpAbout() { const lang = React.useContext(LangContext); const disc = lang === 'EN' ? ['Film', 'Music', 'Entertainment', 'Talent', 'Creativity'] : ['Cinema', 'Música', 'Entretenimento', 'Talento', 'Criatividade']; return (
{tt(lang, '00 — About · Tribeca Festival Lisboa', '00 — Sobre · Tribeca Festival Lisboa')}

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

{disc.map((d, i) => ( {d}{i < disc.length - 1 && ·} ))}

{tt(lang, 'Tribeca Festival Lisboa is much more than a festival. It is a year-round platform dedicated to contemporary storytelling. From film to podcasts, from music to television, creators, talent, and creativity come together in Lisbon through ideas and immersive formats that shape the culture of today and tomorrow.', 'O Tribeca Festival Lisboa é muito mais que um festival. É uma plataforma que durante todo o ano se dedica ao storytelling contemporâneo. Do cinema aos podcasts, da música à televisão, criadores, talento e criatividade reúnem-se em Lisboa, com ideias e formatos imersivos que moldam a cultura hoje e do futuro.')}

); } // ---- 01 — Origins (split, NY) ------------------------------- function LpOrigins() { const lang = React.useContext(LangContext); return (
{tt(lang, '01 — Origins', '01 — Origens')}

{tt(lang, 'From New York to the world', 'De Nova Iorque para o mundo')}

{tt(lang, 'A cultural platform born from transformation', 'Uma plataforma cultural nascida da transformação')}

{tt(lang, "Tribeca was founded in New York with a simple ambition: to bring people, culture, and creativity back to the heart of the city that never sleeps after September 11. What began as a film festival has become one of the world's most relevant cultural platforms, following the evolution of storytelling across film, music, technology, and entertainment for more than 25 years.", 'O Tribeca foi fundado em Nova Iorque com uma ambição simples: trazer pessoas, cultura e criatividade ao coração da cidade que nunca dorme, após o 11 de setembro. O que começou como um festival de cinema tornou-se uma das plataformas culturais mais relevantes do mundo, acompanhando a transformação do storytelling no cinema, na música, na tecnologia e no entretenimento há mais de 25 anos.')}

New York
); } // ---- 02 — Legacy (indigo, 25 years) ------------------------- function LpLegacy() { const lang = React.useContext(LangContext); return (
{tt(lang, '02 — Legacy', '02 — Legado')}

{tt(lang, '25 years shaping culture', '25 anos a moldar a cultura')}

{tt(lang, 'Much more than a festival.', 'Muito mais do que um festival.')}

{tt(lang, 'For 25 years, Tribeca has been a stage for new voices, championing emerging talent and paving the way for innovative forms of storytelling through a constant reinvention of culture and creativity.', 'Há 25 anos que o Tribeca tem sido um palco para novas vozes, impulsionando o talento emergente e abrindo caminho a formas inovadoras de storytelling, numa constante reinvenção da cultura e da criatividade.')}

{tt(lang, 'By bringing together different creative communities, it has become much more than a festival: a meeting point where filmmakers, artists, platforms, brands, startups, media, and creators share ideas, challenge conventions, and build the future of storytelling.', 'Ao unir diferentes comunidades criativas, tornou-se muito mais do que um festival: um ponto de encontro onde realizadores, artistas, plataformas, marcas, startups, media e criadores partilham ideias, desafiam convenções e constroem o futuro do storytelling.')}

{tt(lang, "Over the past two and a half decades, Tribeca has launched award-winning works, introduced some of today's most influential filmmakers, and propelled previously undiscovered talent, establishing itself as a benchmark platform for those shaping what comes next.", 'Ao longo destas duas décadas e meia, o Tribeca lançou obras premiadas, revelou alguns dos mais influentes cineastas da atualidade e impulsionou talentos ainda desconhecidos, afirmando-se como uma plataforma de referência para quem está a definir o que vem a seguir.')}

); } // ---- 03 — Impact (keyword list, visual-led) ----------------- function LpImpact() { const lang = React.useContext(LangContext); const keys = lang === 'EN' ? ['Film', 'Music', 'Entertainment', 'Talent', 'Creativity'] : ['Cinema', 'Música', 'Entretenimento', 'Talento', 'Criatividade']; return (
{tt(lang, '03 — Impact', '03 — Impacto')}

{tt(lang, 'A platform at the scale of culture', 'Uma plataforma à escala da cultura')}

{keys.map((k, i) => (
{String(i + 1).padStart(2, '0')} {k}
))}
Times Square, New York
); } // ---- 04 — The Bridge (NY ↔ Lisbon) -------------------------- function LpBridge() { const lang = React.useContext(LangContext); return (
{tt(lang, '04 — The Bridge', '04 — A Ponte')}

{tt(lang, 'Portugal as a bridge for global creativity', 'Portugal enquanto ponte para a criatividade global')}

New York
{tt(lang, 'Origin', 'Origem')}{tt(lang, 'New York', 'Nova Iorque')}
Lisboa
{tt(lang, 'Home', 'Casa')}Lisboa

{tt(lang, "Lisbon has become one of Europe's most dynamic cultural and creative capitals. Tribeca Festival Lisboa was created to build a lasting cultural bridge between Lisbon and New York, connecting Portuguese talent, creators, media, and industry with international audiences, opportunities, and cultural conversations.", 'Lisboa tornou-se uma das capitais culturais e criativas mais dinâmicas da Europa. O Tribeca Festival Lisboa foi criado para construir uma ponte cultural duradoura entre Lisboa e Nova Iorque, ligando o talento, os criadores, os media e a indústria portuguesa a audiências, oportunidades e conversas culturais internacionais.')}

{tt(lang, 'A new hub for storytelling in Europe is born, with its eyes on the future and the world.', 'Nasce assim um novo hub para o storytelling na Europa, de olhos postos no futuro e no mundo.')}

); } // ---- 05 — Tribeca Festival Lisboa (manifesto close) --------- function LpClose() { const lang = React.useContext(LangContext); return (
{tt(lang, '05 — Tribeca Festival Lisboa', '05 — Tribeca Festival Lisboa')}

{tt(lang, 'More than a festival, Tribeca Festival Lisboa is a platform for exchange, collaboration, and cultural discovery, connecting Lisbon and New York — two cities shaped by culture.', 'More than a festival, o Tribeca Festival Lisboa é uma plataforma de intercâmbio, colaboração e descoberta cultural, que liga Lisboa e Nova Iorque — duas cidades moldadas pela cultura.')}

{tt(lang, 'More than hosting a festival, Lisbon becomes part of a global conversation about the future of culture, creativity, and entertainment. Here, we celebrate the stories that shaped us, amplify the stories being told today, and launch the stories that will define tomorrow.', 'Mais do que receber um festival, Lisboa entra numa conversa global sobre o futuro da cultura, criatividade e entretenimento. Aqui celebram-se as histórias que nos moldaram, amplificam-se as que se contam hoje e lançam-se as que vão definir o futuro.')}

{tt(lang, 'While some cities host culture,', 'Enquanto algumas cidades acolhem a cultura,')}
{tt(lang, 'others shape it.', 'outras moldam-na.')}

); } // ---- NEWS — single full article (white) --------------------- function LpNews() { const lang = React.useContext(LangContext); return (
Chazz Palminteri
News

{tt(lang, 'Tribeca Festival Lisboa and Ageas present: “A Bronx Tale: One Man Show”', 'Tribeca Festival Lisboa e Ageas apresentam: “A Bronx Tale: One Man Show”')}

{tt(lang, 'Chazz Palminteri’s acclaimed one-man show arrives in Lisbon on June 10.', 'O espetáculo de Chazz Palminteri que conquistou Hollywood chega a Lisboa a 10 de junho.')}

{tt(lang, 'After conquering Hollywood and Broadway, “A Bronx Tale: One Man Show” arrives at Cinema São Jorge in Lisbon on June 10. Written and performed by Chazz Palminteri, this autobiographical show recounts his childhood in the Bronx and the dilemmas of loyalty, family, and morality. On stage, Palminteri brings 18 characters to life in a remarkable performance that has sold out more than 1,100 shows across the United States and was named Best Show of the Year in Las Vegas. A powerful, moving, and deeply personal true story that promises to inspire and captivate Portuguese audiences.', 'Depois de conquistar Hollywood e a Broadway, “A Bronx Tale: One Man Show” chega a 10 de junho, ao Cinema São Jorge, em Lisboa. Escrito e interpretado por Chazz Palminteri, este espetáculo autobiográfico retrata a infância no Bronx e os dilemas entre lealdade, família e moralidade. Palminteri dá vida a 18 personagens numa performance brilhante que já esgotou mais de 1.100 sessões nos EUA e foi eleita Melhor Espetáculo do Ano em Las Vegas. Uma história real, intensa e emocionante que promete inspirar e emocionar o público português.')}

{tt(lang, '“A true and moving story.”', '“Uma história verdadeira e emocionante.”')} {tt(lang, '— The New York Times', '– The New York Times')}
openExt(e, TICKETS_URL)} style={{ textDecoration: 'none' }}> {tt(lang, 'Buy Tickets', 'Comprar Bilhetes')}
); } // ---- From the feed (image-led, clickable → Instagram) ------- // Local copies of the @tribecalisboa feed (see uploads/tribeca_instagram_images/posts.json). const LP_FEED_DIR = 'uploads/tribeca_instagram_images'; const LP_FEED = [ { img: `${LP_FEED_DIR}/18412759585178612.webp`, url: 'https://www.instagram.com/p/DZF3-fjDu53/' }, { img: `${LP_FEED_DIR}/18591411106012367.webp`, url: 'https://www.instagram.com/p/DZDRnTjuoeB/' }, { img: `${LP_FEED_DIR}/18003678386923648.webp`, url: 'https://www.instagram.com/p/DZDRgtlujBm/' }, { img: `${LP_FEED_DIR}/17963649332938054.webp`, url: 'https://www.instagram.com/p/DZDQ9s8Oatr/' }, { img: `${LP_FEED_DIR}/18086503313620653.webp`, url: 'https://www.instagram.com/p/DYzBij1uJm0/' }, { img: `${LP_FEED_DIR}/18426205777121836.webp`, url: 'https://www.instagram.com/p/DYP216Lu3yh/' }, { img: `${LP_FEED_DIR}/18053843006480488.webp`, url: 'https://www.instagram.com/reel/DVtU_9RjVC2/' }, { img: `${LP_FEED_DIR}/18091637834107737.webp`, url: 'https://www.instagram.com/p/DVjNdyODRwa/' }, { img: `${LP_FEED_DIR}/18059995355353302.webp`, url: 'https://www.instagram.com/reel/DVf7V_aDZaj/' }, { img: `${LP_FEED_DIR}/18096167057072614.webp`, url: 'https://www.instagram.com/p/DVbfFWcjYRj/' }, ]; function LpFeed() { const lang = React.useContext(LangContext); return (

{FIX('From the feed')}

openExt(e, IG_URL)} style={{ color: '#fff', display: 'flex' }} aria-label="Instagram"> openExt(e, IG_URL)} style={{ textDecoration: 'none' }}> {tt(lang, 'follow @tribecalisboa', 'seguir @tribecalisboa')}
{LP_FEED.map((p, i) => ( openExt(e, p.url)} aria-label={`Instagram post ${i + 1}`}> ))}
); } // ---- Footer → LandingChrome.jsx ----------------------------- // ---- App ---------------------------------------------------- function Landing() { const [lang] = useLang(); const rootRef = useRefLP(null); useLpReveal(rootRef); return (
); } ReactDOM.createRoot(document.getElementById('root')).render();