// ============================================================ // Tribeca Lisboa — EVENT DETAIL app (responsive, bilingual) // Uses shared SiteHeader / SiteMenuDrawer + global lang. // ============================================================ const { useState: useStateA, useRef: useRefA } = React; function EdToast({ msg, icon, show }) { return
{icon && }{msg}
; } function EdShareSheet({ open, onClose, onCopied, lang }) { const opts = [ { name: 'Instagram', icon: 'ig' }, { name: 'WhatsApp', icon: 'wa' }, { name: 'X', icon: 'xlogo' }, { name: tt(lang, 'Copy link', 'Copiar link'), icon: 'link', copy: true }, ]; return (

{tt(lang, 'Share', 'Partilhar')}

{opts.map(o => ( ))}
); } function EventDetailInner() { const lang = React.useContext(LangContext); const rootRef = useRefA(null); const [menu, setMenu] = useStateA(false); const [share, setShare] = useStateA(false); const [toast, setToast] = useStateA(null); const toastTimer = useRefA(null); useReveal(rootRef); const flashToast = (msg, icon) => { setToast({ msg, icon }); clearTimeout(toastTimer.current); toastTimer.current = setTimeout(() => setToast(null), 2200); }; return (
setMenu(true)} /> flashToast(tt(lang, 'Added to calendar', 'Adicionado ao calendário'), 'check')} onShare={() => setShare(true)} /> {/* TEMPORARILY HIDDEN — restore on request: */}
{/* persistent ticket CTA — no pricing, availability + action only */}
{tt(lang, EVENT.availabilityEn, EVENT.availability)}
setShare(false)} onCopied={() => { setShare(false); flashToast(tt(lang, 'Link copied', 'Link copiado'), 'check'); }} /> setMenu(false)} />
); } function EventDetail() { const [lang] = useLang(); return ( ); } ReactDOM.createRoot(document.getElementById('root')).render();