/* Torre Auro — Level page (editorial) */ function AvailabilityStrip({ floor }) { const z = ZONES[floor.zone]; const rentedCount = floor.tot - floor.av; const urgent = floor.av === 1; return (
{Array.from({ length: floor.tot }).map((_, j) => { const rented = j < rentedCount; const cls = `av-strip-dot ${!rented && urgent ? 'urgent' : ''}`; return (
); })}
{floor.av === 0 ? 'Nivel completamente ocupado.' : floor.av === 1 ? <>Solo un espacio disponible de {floor.tot}. : <>{floor.av} de {floor.tot} disponibles.}
{floor.av === 0 ? 'Este nivel ya completó su ecosistema de inquilinos.' : floor.av === 1 ? 'Queda un espacio para completar el ecosistema de este nivel.' : 'Elige el espacio que mejor se integre a tu operación.'}
); } function OfficeDirectory({ floor }) { const eco = ZONES[floor.zone]?.eco || 'corporativo'; const types = TYPE_META[eco] || {}; const z = ZONES[floor.zone]; if (eco === 'retail') { const o = floor.offices[0]; return (
); } const groupByType = (letter) => floor.offices.filter(o => typeKey(o) === letter); const tiers = [ { key:'C', label:'Ancla', sub:'137 m²', cls:'ancla', list:groupByType('C') }, { key:'B', label:'Consolidación', sub:'120 m²', cls:'mid', list:groupByType('B') }, { key:'A', label:'Boutique', sub:'85 m²', cls:'boutique', list:groupByType('A') }, ]; return (
{tiers.map(t => t.list.length > 0 && (
{t.label} Tipo {t.key} · {t.sub} · {t.list.filter(o=>o.ok).length} disp.
{t.list.map(o => ( ))}
))}
); } function OfficeCardCompact({ office, meta, floor, tier }) { const z = ZONES[floor.zone]; const isAvail = office.ok; const isAnchor = tier === 'ancla'; return (
navigate(`/${floor.id}/${office.code}`)} role="button" tabIndex={0} style={isAnchor && isAvail ? { borderTopColor: z.accHex } : {}} >
{meta?.letter} {isAvail ? 'Disponible' : 'Rentado'}
{office.code}
{office.m2} m² · {office.type}
{isAnchor &&

{meta?.tagline}

}
{FMT(office.price)}/mes Ver oficina
); } function Faq({ items }) { const [open, setOpen] = useState(new Set([0])); const refs = useRef({}); function toggle(i) { setOpen(prev => { const next = new Set(prev); if (next.has(i)) next.delete(i); else next.add(i); return next; }); } return (
{items.map((f, i) => { const isOp = open.has(i); const h = refs.current[i]?.scrollHeight || 0; return (
{ refs.current[i] = el; }} >
{f.a}
); })}
); } function LevelPage({ floor }) { const z = ZONES[floor.zone]; return (
{/* HERO */}
{/* AVAILABILITY */} {/* INFO */}
01 / La propuesta del nivel

Por qué este nivel, y para quién.

01 · Argumentos

Por qué este nivel

{floor.bens.map((b, i) => (
/ {pad2(i + 1)} {b}
))}
02 · Buyer persona

Perfecto para

{floor.personas.map((p, i) => (
{pad2(i + 1)}
{p.name}
{p.desc}
))}
{/* OFFICE DIRECTORY */}
02 / Los espacios

Elige tu oficina.

Tres tamaños por nivel. Toca una oficina para ver su detalle, plano y disponibilidad.

{/* THE PLAN */} {floor.planClass && (
03 / El plano

La distribución del nivel.

Plano arquitectónico del nivel {floor.sh}. La franja de color en la elevación lateral indica la posición del nivel en el edificio. En la planta se identifican las oficinas A (boutique), B (consolidación) y C (ancla).

Sección {floor.sh}
Ancla · C 137.45 m²
Consolidación · B 120.00 m²
Boutique · A 3 × 85.00 m²
Orientación Av. Tiburón · Ruiz Cortines
)} {/* NICHE COMPETITION MAP */} {/* FAQ */}
05 / Preguntas frecuentes

Dudas sobre este nivel.

{/* CTA */} openChat(floor.id)} onSecondary={() => openChat(floor.id + '-planos')} /> {/* NEXT LEVEL */}
04 / Continuar el recorrido
navigate('/' + floor.next.id)}>
{FLOOR_BY_ID[floor.next.id]?.sh}
{floor.next.sub}
{floor.next.label.split('—')[0]}— {floor.next.label.split('—')[1]?.trim()}
{FLOOR_BY_ID[floor.next.id]?.av ?? 0}/{FLOOR_BY_ID[floor.next.id]?.tot ?? 0} disponibles · desde {FMT(FLOOR_BY_ID[floor.next.id]?.pMin ?? 0)}/mes
); } Object.assign(window, { LevelPage });