/* eslint-disable react/prop-types */ /** * Impact · Sección 8 del Home · NUESTRO IMPACTO + Mapa interactivo. * Brief 1 §3.1 Sección 8. * * - Fondo blanco * - Header narrativo + 4 categorías en 2 columnas * - Mapa: siluetas SVG reales de México + USA + Centroamérica + Caribe + * Sudamérica norte, proyectadas Mercator desde Natural Earth (vía * world-atlas npm, dominio público). Marcadores cobre pulsantes en las * 28 ciudades donde Prosperia ha trabajado, con tooltip al hacer click. * - El JSON con los paths se carga de `/home/assets/map-data.json`. */ const { useState: uS_I, useRef: uR_I, useEffect: uE_I } = React; const CATEGORIES = [ { icon: 'people', title: 'Educación y Salud.', body: 'Distritos universitarios, escuelas, centros médicos de alta complejidad y hospitales.', }, { icon: 'spark', title: 'Innovación y Trabajo.', body: 'Polos tecnológicos, parques industriales y oficinas de nueva generación.', }, { icon: 'compass', title: 'Comercio y Entretenimiento.', body: 'Espacios que activan la vida urbana — y no mueren a las 7 PM.', }, { icon: 'building', title: 'Vivienda y Ciudad.', body: 'Comunidades planeadas, distritos residenciales, vivienda asequible y re-densificación de centros urbanos.', }, ]; /* Ruta al JSON con paths de países + ciudades proyectadas a Mercator. Como esta es la Home, el path es relativo. Otras páginas que importen este componente lo cargarán vía `../home/assets/map-data.json` por el resolver de fetch desde su propia ruta. */ function resolveMapDataUrl() { // Best-effort: la Home la carga de "assets/map-data.json". // Si el componente se reusara desde otra página, basta cambiar este string. const path = window.location.pathname; if (path.includes('/home/')) return 'assets/map-data.json'; return '../home/assets/map-data.json'; } function Impact() { const [activeCity, setActiveCity] = uS_I(null); const [mapData, setMapData] = uS_I(null); uE_I(() => { fetch(resolveMapDataUrl()) .then(r => r.json()) .then(setMapData) .catch(err => console.warn('[Impact] no se pudo cargar map-data.json:', err)); }, []); const CITIES = mapData?.cities || []; const COUNTRY_PATHS = mapData?.countries || {}; return (

NUESTRO IMPACTO

18 años, +1,900 proyectos, +40 distritos, +20 millones de m² desarrollados, +3 billones de dólares de valor inmobiliario originado, en 57 ciudades de 3 regiones. La mayor experiencia acumulada en Originación Inmobiliaria, en proyectos que cubren:

{CATEGORIES.map((c, i) => (
{c.title}
{c.body}
))}
{/* Mapa */}
MAPA INTERACTIVO {/* En producción, ArcGIS embed. Aquí: representación schematica con marcadores cobre pulsantes. */} 57 ciudades · 3 regiones · México · USA · Centro y Sudamérica
{/* Background grid sutil */} {/* Siluetas reales de países — Natural Earth (dominio público). México resaltado en cobre, resto en navy translúcido. */} {Object.entries(COUNTRY_PATHS).map(([name, d]) => { const isMexico = name === 'Mexico'; return ( ); })} {/* Markers */} {CITIES.map((c, i) => ( setActiveCity(c.name)} style={{ cursor: 'pointer' }}> ))} {/* Tooltip ciudad activa */} {activeCity && (() => { const c = CITIES.find(x => x.name === activeCity); if (!c) return null; return ( {c.name} {c.n} PROYECTOS ); })()}
Ciudad con +50 proyectos
Ciudad con proyectos activos
); } const impStyles = { section: { background: '#fff', paddingBlock: 'var(--space-3xl)', }, header: { maxWidth: 880, marginBottom: 64, }, title: { margin: 0, fontWeight: 800, fontSize: 'clamp(32px, 4.5vw, 56px)', lineHeight: 1.1, color: 'var(--color-navy-deep)', letterSpacing: '0.02em', }, desc: { margin: '24px 0 0', maxWidth: 760, fontSize: 'clamp(16px, 1.5vw, 19px)', lineHeight: 1.65, color: 'var(--color-navy-deep)', }, catGrid: { display: 'grid', gridTemplateColumns: '1fr', gap: 0, marginBottom: 64, borderTop: '1px solid rgba(33,52,64,0.10)', }, catRow: { display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '0 16px', padding: '28px 0', borderBottom: '1px solid rgba(33,52,64,0.10)', alignItems: 'start', }, catIcon: { gridRow: '1 / 3', color: 'var(--color-copper-fallback)', paddingTop: 2, }, catTitle: { fontWeight: 700, fontSize: 18, color: 'var(--color-copper-fallback)', }, catBody: { color: 'var(--color-navy-medium)', fontSize: 16, lineHeight: 1.6, marginTop: 6, }, mapWrap: { display: 'flex', flexDirection: 'column', gap: 16, }, mapNote: { display: 'flex', alignItems: 'baseline', gap: 16, flexWrap: 'wrap', }, mapInner: { position: 'relative', background: 'var(--color-cream-soft)', borderRadius: 4, height: 480, overflow: 'hidden', boxShadow: '0 8px 24px rgba(33, 52, 64, 0.06)', }, mapLegend: { position: 'absolute', bottom: 16, left: 16, background: 'rgba(255,255,255,0.92)', padding: '12px 16px', borderRadius: 2, display: 'flex', flexDirection: 'column', gap: 8, fontSize: 12, color: 'var(--color-navy-deep)', }, legendItem: { display: 'flex', alignItems: 'center', gap: 10 }, legendDot: { display: 'inline-block', borderRadius: 999, backgroundImage: 'url("assets/textures/cobre-patinado.svg")', backgroundSize: 'cover', }, }; const impMQ = document.createElement('style'); impMQ.textContent = ` @keyframes cityPulse { 0% { transform: scale(0.3); opacity: 0.9; } 100% { transform: scale(1.3); opacity: 0; } } @media (min-width: 900px) { section[data-screen-label="08 Impact"] .container > div:nth-of-type(2) { grid-template-columns: repeat(2, 1fr) !important; column-gap: 64px !important; } section[data-screen-label="08 Impact"] .container > div:nth-of-type(2) > div { grid-template-columns: auto minmax(180px, 240px) 1fr !important; gap: 0 24px !important; } } @media (min-width: 1024px) { section[data-screen-label="08 Impact"] > div > div:last-child > div:last-child { height: 600px !important; } } `; document.head.appendChild(impMQ); window.Impact = Impact;