/* 08 Eventos + 09 Historias + 10 Mi perfil */ const EVENTS = [ { id:'e1', title:'Cruce · Sónar Barcelona', kind:'Festival', city:'Barcelona', date:'14 · JUN', when:'Sáb 14 junio · 20:00 → 03:00', venue:'Recinto Fira Gran Vía', price:'Miembros Club: 45€ · Signature: gratis', spots:'12 plazas libres', hot: true, accent: 'r', desc:'Nuestro punto de encuentro más viral del año. Zona Cruce privada, DJ set y presentaciones con IA en directo.', tags:['Techno','Zona VIP','21+'] }, { id:'e2', title:'Vermut & Match · Madrid', kind:'Cita en grupo', city:'Madrid', date:'22 · MAY', when:'Sáb 22 mayo · 13:00 → 16:00', venue:'Terraza Círculo de Bellas Artes', price:'Miembros Club: 25€', spots:'8 plazas libres', accent: 'g', desc:'6 chicas + 6 chicos con >85% de afinidad entre sí. Vermut, tapas y una tarde larga para ver qué pasa.', tags:['Grupo pequeño','Curado por Cruce'] }, { id:'e3', title:'Cena a ciegas · Sevilla', kind:'Cita 1:1', city:'Sevilla', date:'05 · JUN', when:'Jue 5 junio · 21:30', venue:'Ubicación revelada 24h antes', price:'Signature: incluido', spots:'Sólo Signature', accent: 'gold', desc:'Te presentamos a una persona. Sin fotos previas. Reserva restaurante nuestra. El resto lo escribís vosotros.', tags:['1:1','Exclusivo Signature'] }, { id:'e4', title:'Cruce en Primavera Sound', kind:'Festival', city:'Barcelona', date:'30 · MAY', when:'Vie–Dom · 30 mayo → 1 junio', venue:'Parc del Fòrum', price:'Miembros Club: 60€ activación', spots:'34 plazas libres', accent: 'r', desc:'Rutas guiadas para encontraros dentro del festival. Punto de encuentro Cruce, pulseras IR-friendly, staff a tu disposición.', tags:['Festival','3 días','Grupo grande'] }, ]; function Events({ go }) { const [city, setCity] = useState('Todas'); const [selected, setSelected] = useState(null); const list = city === 'Todas' ? EVENTS : EVENTS.filter(e => e.city === city); return (
Zona de eventos · presenciales

Cara a cara. Como en la calle.

Cruce nace en la calle y vuelve a ella. Cenas, vermuts, festivales curados con IA — para reencontraros donde empezó todo. Aforo limitado, siempre.

{['Todas','Madrid','Barcelona','Sevilla','Valencia','Bilbao'].map(c => ( ))}
setSelected(EVENTS[0])}/>
{list.slice(1).map(e => ( setSelected(e)}/> ))}
{selected && setSelected(null)}/>}
); } function FeaturedEvent({ event, onOpen }) { return (
{['lucia','mateo','carmen','diego','nerea'].map((k,i) => (
))}
{event.date}
{event.kind}
{event.hot && Hot}

{event.title}

{event.desc}

{event.when}
{event.venue}
{event.spots}
); } function EventCard({ event, onOpen }) { const accent = event.accent === 'r' ? 'var(--red)' : event.accent === 'g' ? 'var(--sage)' : 'var(--gold)'; return (
{event.date}
{event.kind}
{event.city.toUpperCase()}

{event.title}

{event.desc}

{event.venue}
{event.when}
{event.price}
{event.tags.map(t => {t})}
); } function EventModal({ event, onClose }) { return (
e.stopPropagation()}>
{event.date}
{event.kind}

{event.title}

{event.desc}

} label="Cuándo" value={event.when}/> } label="Dónde" value={event.venue}/> } label="Precio" value={event.price}/> } label="Aforo" value={event.spots}/>
MATCHES CONFIRMADOS
{['lucia','mateo','nerea','diego','javier','carmen'].map((k,i) => (
))}
+18 personas irán · 8 con >85% afinidad contigo
); } function Meta({ico, label, value}) { return (
{ico}
{label.toUpperCase()}
{value}
); } /* ============ STORIES ============ */ const STORIES = [ {a:'lucia', b:'mateo', title:'"Nos escaneó una IA. Nos casó Madrid."', names:'Lucía & Mateo', tagline:'8 meses juntos · viven en Chamberí', city:'Madrid', quote:'Al 3er café ya sabía. Al 5º, se lo dije. Un año más tarde, entré a un piso que ya era nuestro. Y todo empezó porque una cámara nos paró en la Gran Vía.', video:'CRUCE · EP 24', duration:'2:14'}, {a:'carmen', b:'javier', title:'"Yo no creía. Él, tampoco."', names:'Carmen & Javier', tagline:'1 año · a caballo Sevilla ↔ Barcelona', city:'Sevilla', quote:'Ambos veníamos de rupturas duras. Cruce nos emparejó con 84%. Ninguno le dio importancia. Hasta que, dos meses después, cogimos un AVE y ya no lo dejamos.', video:'CRUCE · EP 18', duration:'1:56'}, {a:'nerea', b:'diego', title:'"Cruzamos miradas en el Sónar."', names:'Nerea & Diego', tagline:'4 meses · comparten piso en Poblenou', city:'Barcelona', quote:'Yo iba con amigas. Él, en el DJ set. Nos escanearon en la puerta y nos apuntamos a la zona Cruce. A la tercera canción, ya era tarde para no enamorarme.', video:'CRUCE · EP 31', duration:'1:42'}, {a:'alba', b:'pablo', title:'"Un debate sobre el amor de dos horas."', names:'Alba & Pablo', tagline:'6 meses · Valencia', city:'Valencia', quote:'Discutimos sobre Barthes durante toda la primera cita. Salimos peleados. Nos llamamos al día siguiente. Nunca hemos vuelto a estar solos desde entonces.', video:'CRUCE · EP 12', duration:'2:31'}, ]; function Stories({ go }) { const [active, setActive] = useState(0); const s = STORIES[active]; return (
Cruce
HISTORIAS · {String(active+1).padStart(2,'0')} / {String(STORIES.length).padStart(2,'0')}
Historia verificada

{s.title.split('.')[0]}.

"{s.quote}"

Testimonio validado
{s.names}
{s.tagline}
×
{s.video} · {s.duration}
Vídeo original en YouTube Shorts
Y muchas más

Más historias reales que se cruzaron.

{STORIES.map((s, i) => ( ))}

¿Y la tuya?

Empezar es gratis. Verificarse tarda 90 segundos. El match puede tardar menos.

); } /* ============ MI PERFIL ============ */ function Me({ go }) { // Fase 1b: sesión real + derechos RGPD funcionando const [session, setSession] = useState(() => (window.CruceAPI && window.CruceAPI.Session.get()) || null); const [msg, setMsg] = useState(''); const user = session && session.user; async function exportData() { setMsg('Preparando tu archivo…'); try { const data = await window.CruceAPI.gdprExport(); const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'cruce-mis-datos.json'; a.click(); setMsg('Descargado. Revisa tu carpeta de descargas.'); } catch (e) { setMsg(e.message || 'Error al exportar.'); } } async function deleteAccount() { if (!window.CruceAPI) return; const ok = window.confirm('¿Eliminar tu cuenta de forma permanente? Esta acción no se puede deshacer. Se anonimizarán tus datos en 72 h.'); if (!ok) return; try { await window.CruceAPI.gdprDelete(); window.CruceAPI.Session.clear(); setSession(null); setMsg('Cuenta eliminada. Gracias por haber estado.'); setTimeout(()=>go('landing'), 1200); } catch (e) { setMsg(e.message || 'Error al eliminar.'); } } function logout() { window.CruceAPI.Session.clear(); setSession(null); go('landing'); } return (

Alba, 30

Perfil verificado
Cruce Club
Valencia · Bióloga marina · ID: CR-ALBA-2026
Mi cuenta {user ? {user.email} : go('signup')}>Entrar}
{user ? (
{user.name}{user.age ? ', ' + user.age : ''}{user.city ? ' · ' + user.city : ''}
Miembro desde {user.created_at ? new Date(user.created_at).toLocaleDateString('es-ES') : '—'} · Plan {user.plan || 'free'}
) : (
Esta demo muestra un perfil de ejemplo. Entra con tu cuenta para ver tus datos reales, exportarlos o eliminarlos (RGPD).
)}
Membresía Cruce Club · activa
29€ / mes
Se renueva el 12 · sept · 2026
{['Chat cifrado','Videollamada','Matches ilimitados','Prioridad en eventos'].map(f => (
{f}
))}
Test de afinidad Actualizado hace 12 días
83%
Perfil completo al 83%.
Añade 2 respuestas más para mejorar tus matches.
Privacidad e IA
{[ {t:'Uso de IA en test de afinidad', v:true, d:'Necesario para calcular matches.'}, {t:'Compartir mi % con otros usuarios', v:true, d:'Ellos ven tu score de afinidad.'}, {t:'Aparecer en muros de otros', v:true, d:'Puedes ocultarte 7 días.'}, {t:'Recibir invitaciones a eventos', v:true, d:'Solo eventos de tu ciudad.'}, ].map((r,i) => (
{r.t}
{r.d}
))}
Descargar mis datos
Todo lo que tenemos de ti, en JSON (Art. 20 RGPD).
Eliminar mi cuenta
Anonimización permanente en 72h (Art. 17 RGPD).
{msg &&
{msg}
}
Cruce no comparte tus datos con terceros con fines comerciales. Ver{' '} Política de Privacidad.
); } window.Events = Events; window.Stories = Stories; window.Me = Me;