{floor.av === 0
? 'Nivel completamente ocupado.'
: floor.av === 1
? <>Solo un espacio disponible de {floor.tot}.>
: <>{floor.av} de {floor.tot} disponibles.>}
{floor.av <= 1 ? 'Los espacios se están llenando. Una vez rentado, el nivel queda cerrado.'
: floor.av <= 2 ? 'Los espacios se están llenando. Agenda la visita esta semana.'
: 'Buena disponibilidad. Elige el espacio que mejor se adapte a tu empresa.'}
);
}
function OfficeHierarchy({ floor }) {
const eco = ZONES[floor.zone]?.eco || 'corporativo';
const types = TYPE_META[eco] || {};
// Retail = single planta libre
if (eco === 'retail') {
const o = floor.offices[0];
const meta = types['Planta libre'];
return (
);
}
// Group by type letter
const groupByType = (letter) => floor.offices.filter(o => typeKey(o) === letter);
const anchors = groupByType('C');
const mids = groupByType('B');
const boutiqs = groupByType('A');
return (
);
}
function LevelPage({ floor }) {
const z = ZONES[floor.zone];
return (
{/* HERO */}
{floor.sh}
{floor.eyebrow}
{floor.name}
{floor.desc}
Desde
{floor.pMin === floor.pMax ? FMT(floor.pMin) : `${FMT(floor.pMin)} – ${FMT(floor.pMax)}`}
/ mes · obra gris
{/* 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 TABLE */}
02 / Los tres tamaños
Una lógica de ancla.
Cada nivel se compone de tres tamaños. El espacio ancla (137 m²) define la imagen del nivel y atrae el flujo principal. Los de consolidación (120 m²) acompañan. Los boutique (85 m²) se benefician del clúster que el ancla construye.
{/* 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).