/* ========================================
   Inmuex — Architectural Editorial
   A warm, grounded palette that says
   "serious investment, handled beautifully"
   ======================================== */

/* --- Reset & Base --- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
    /* Clean blue palette — inspired by RealHomes Ultra */
    --ink: #1a1a2e;
    --ink-secondary: #3d3d5c;
    --ink-muted: #6b7280;
    --surface: #f7f8fc;
    --surface-warm: #eef3f9;
    --surface-card: #ffffff;
    --border: #e5e7eb;
    --border-strong: #d1d5db;

    /* Primary blue — trust & professionalism */
    --accent:       #1ea0e5;
    --accent-hover: #1789c9;
    --accent-light: #e8f4fd;
    --accent-subtle: #d1ecfa;

    /* Secondary — deep navy for contrast */
    --sage: #0b2545;
    --sage-light: #eef2f7;

    /* Functional */
    --venta: #e53e3e;
    --venta-bg: #fff5f5;
    --renta: var(--accent);
    --renta-bg: #e8f4fd;
    --whatsapp: #25d366;
    --whatsapp-hover: #1da851;

    /* Type — clean modern sans-serif */
    --font-display: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
    --font-body: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;

    /* Spacing scale */
    --space-xs: .5rem;
    --space-sm: .75rem;
    --space-md: 1rem;
    --space-lg: 1.5rem;
    --space-xl: 2.5rem;
    --space-2xl: 4rem;
    --space-3xl: 6rem;

    /* Radii — more rounded like RealHomes */
    --radius-sm: 6px;
    --radius: 8px;
    --radius-lg: 12px;

    /* Shadows — cool-tinted */
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, .05);
    --shadow: 0 2px 8px rgba(0, 0, 0, .06);
    --shadow-md: 0 4px 16px rgba(0, 0, 0, .08);
    --shadow-lg: 0 12px 32px rgba(0, 0, 0, .1);
    --shadow-card-hover: 0 8px 24px rgba(30, 160, 229, .12), 0 2px 6px rgba(0, 0, 0, .06);

    /* Elementos INVERTIDOS (fondo oscuro + texto claro en modo claro): píldora
       seleccionada, página actual, vista activa, botón de correo. Necesitan
       token propio porque venían pintados con --ink, que es el token del TEXTO:
       al voltear el tema, --ink se vuelve casi blanco y quedaba blanco sobre
       blanco. Aquí el fondo es un rol aparte del color de la tinta. */
    --inverse-bg: #1a1a2e;
    --inverse-ink: #ffffff;

    /* El footer es la única superficie que ya era oscura en modo claro. Mismo
       motivo: usaba --ink como fondo y se habría vuelto blanco. */
    --footer-bg: #1a1a2e;

    /* Tinta sobre VIDRIO: los controles que flotan encima de una foto (flechas
       del slider, herramientas de la ficha, contador de fotos) son pastillas
       blancas translúcidas en los DOS temas — una foto es una foto, no cambia
       con el tema. Su texto no puede usar --ink, que sí se voltea: quedaría
       blanco sobre blanco. Este token NO se redefine en oscuro, a propósito. */
    --on-glass: #1a1a2e;

    --max-width: 1200px;
    --header-h: 72px;
}

/* ============================================================
   TEMA OSCURO
   ============================================================
   Un solo bloque redefine los tokens y el sitio se voltea: nada de duplicar
   el CSS. Los valores son los MISMOS que ya usa el dashboard
   (`inmuex-dashboard/assets/css/tokens.css`) porque el portal y el panel
   tienen que sentirse UN producto — allá la correspondencia ya venía
   declarada ("match --surface", "match --ink"); aquí solo se honra.

   Lo que NO se voltea solo es el color escrito a mano en las reglas
   (#fff, rgba(...) fijos). Esos se van migrando a tokens por zonas; cada uno
   que quede es una mancha clara sobre fondo oscuro.
   ============================================================ */
[data-theme="dark"] {
    /* Superficies — el fondo baja y la tarjeta SUBE: en oscuro la elevación
       se lee por luz, al revés que en claro (tarjeta blanca sobre gris). */
    --surface: #0b0f14;
    --surface-warm: #1a2330;
    --surface-card: #121821;

    /* Tinta */
    --ink: #e6ecf3;
    --ink-secondary: #8595a8;
    --ink-muted: #5b6b80;

    /* Bordes */
    --border: #1f2937;
    --border-strong: #2a3a4f;

    /* Acento — el azul de inmuex aguanta sobre oscuro. El hover ACLARA en vez
       de oscurecer (oscurecer sobre fondo oscuro sería apagarlo), y los fondos
       suaves dejan de ser pintura sólida para ser un velo del propio acento:
       lo único que se ve bien sobre cualquier oscuro. */
    --accent:       #1ea0e5;
    --accent-hover: #3ab6f5;
    --accent-light: rgba(30, 160, 229, .12);
    --accent-subtle: rgba(30, 160, 229, .22);

    /* Navy secundario: en claro es TEXTO oscuro (--sage) y chip clarito
       (--sage-light). Invertidos, o el texto desaparece. */
    --sage: #cfe0f2;
    --sage-light: rgba(30, 160, 229, .14);

    /* Funcionales: el color de marca se queda (venta rojo, renta azul,
       WhatsApp verde); lo que cambia es su fondo, casi blanco en claro. */
    --venta-bg: rgba(229, 62, 62, .14);
    --renta-bg: rgba(30, 160, 229, .14);

    /* Sombras: sobre oscuro una sombra suave simplemente no existe. */
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, .30);
    --shadow: 0 2px 8px rgba(0, 0, 0, .32);
    --shadow-md: 0 4px 12px rgba(0, 0, 0, .35), 0 1px 2px rgba(0, 0, 0, .20);
    --shadow-lg: 0 12px 32px rgba(0, 0, 0, .45), 0 2px 6px rgba(0, 0, 0, .20);
    --shadow-card-hover: 0 8px 24px rgba(0, 0, 0, .45), 0 0 0 1px rgba(30, 160, 229, .25);

    /* Invertidos: en oscuro no pueden "invertirse a claro" (una píldora blanca
       gritaría más que el propio contenido). Se resuelven como pizarra elevada
       sobre el fondo casi negro — se leen igual de seleccionados, sin gritar. */
    --inverse-bg: #2a3a4f;
    --inverse-ink: #ffffff;

    /* El footer se queda como banda de chrome, igual que el header, para que
       siga siendo el piso de la página y no se funda con el contenido. */
    --footer-bg: #121821;

    /* Le dice al navegador que pinte SUS cosas en oscuro: scrollbars, selects,
       date pickers, autofill. Sin esto quedan parches blancos del sistema. */
    color-scheme: dark;
}

html { font-size: 16px; scroll-behavior: smooth; -webkit-font-smoothing: antialiased; }
body {
    font-family: var(--font-body);
    color: var(--ink-secondary);
    line-height: 1.65;
    background: var(--surface);
}
img { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
ul { list-style: none; }
input, select, textarea, button { font-family: inherit; font-size: inherit; }

.container { max-width: var(--max-width); margin: 0 auto; padding: 0 clamp(1.25rem, 4vw, 2rem); }

/* --- Typography --- */
h1, h2, h3, h4 { font-family: var(--font-display); color: var(--ink); line-height: 1.2; }

/* --- Buttons --- */
.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
    padding: .8rem 1.75rem; border-radius: var(--radius); font-weight: 600;
    /* Borde transparente, no `none`: con border-box el borde SUMA al alto, así
       que un .btn-outline (que sí lo tiene) quedaba 2px más alto que un
       .btn-whatsapp o .btn-primary puestos a su lado. Reservando el espacio
       aquí, todas las variantes miden igual. */
    border: 1.5px solid transparent; cursor: pointer; font-size: .9rem;
    letter-spacing: .01em;
    transition: background .2s, transform .15s, box-shadow .2s;
    text-decoration: none;
}
.btn:active { transform: scale(.98); }
.btn-primary {
    background: var(--accent); color: #fff;
    box-shadow: 0 1px 3px rgba(30, 160, 229, .3);
}
.btn-primary:hover {
    background: var(--accent-hover);
    box-shadow: 0 3px 10px rgba(30, 160, 229, .35);
}
.btn-outline {
    background: transparent; border-color: var(--border-strong); color: var(--ink-secondary);
}
.btn-outline:hover { border-color: var(--accent); color: var(--accent); }
.btn-white {
    background: var(--surface-card); color: var(--accent);
    box-shadow: var(--shadow);
}
.btn-white:hover { background: #fff; box-shadow: var(--shadow-md); }
.btn-whatsapp { background: var(--whatsapp); color: #fff; }
.btn-whatsapp:hover { background: var(--whatsapp-hover); }
.btn-ghost { background: transparent; color: var(--accent); padding: .5rem 0; }
.btn-ghost:hover { color: var(--accent-hover); }
.btn-lg { padding: 1rem 2.25rem; font-size: .95rem; }
.btn-block { display: flex; width: 100%; }
.btn + .btn { margin-top: .6rem; }
.main-nav .btn + .btn { margin-top: 0; }

/* --- Header (RealHomes Ultra style) --- */
.site-header {
    position: sticky; top: 0; z-index: 100;
    background: var(--surface-card);
    box-shadow: var(--shadow);
    /* En oscuro la sombra ya no separa (negro sobre negro): el borde es lo que
       despega el header del contenido. En claro es casi imperceptible. */
    border-bottom: 1px solid var(--border);
}
.header-inner {
    display: flex; align-items: center;
    height: var(--header-h);
    max-width: 100%;
    padding: 0 clamp(1.25rem, 3vw, 2.5rem);
}

/* Logo — icon + text like RealHomes */
.site-logo { display: flex; align-items: center; gap: .6rem; flex-shrink: 0; margin-right: 2rem; }
.logo-icon { display: flex; align-items: center; flex-shrink: 0; }
.logo-text {
    font-family: var(--font-display);
    font-size: 1.15rem; font-weight: 700; color: var(--ink);
    letter-spacing: .04em;
    line-height: 1.15;
}

/* Nav — left-aligned after logo, like RealHomes */
.main-nav { display: flex; align-items: center; }
.nav-list { display: flex; align-items: center; gap: .25rem; }
.nav-list li a {
    display: block;
    padding: .5rem 1rem;
    color: var(--ink-secondary);
    font-weight: 500; font-size: .95rem;
    transition: all .2s;
    border-radius: 50px;
    white-space: nowrap;
}
.nav-list li a:hover {
    color: var(--accent);
    background: var(--accent-light);
}
/* Active state — pill background like RealHomes "Home" */
.nav-list li.current-menu-item a,
.nav-list li.active a {
    color: var(--accent);
    background: var(--accent-light);
}

/* Right side — push to far right */
.header-actions {
    display: flex; align-items: center; gap: .6rem;
    flex-shrink: 0;
    margin-left: auto;
}

/* Entrar · Crear cuenta (1.45.0) — texto, no icono. El círculo con monito que
   había (copiado de RealHomes) es la convención de "tu perfil"; al anónimo no
   le decía ni que puede entrar ni que puede registrarse. Píldora partida en
   ghost: el único botón sólido del header sigue siendo Publicar (jerarquía:
   el visitante entra en fantasma, el asesor publica en primario). Tinta con
   `--ink` y borde `--border-strong` — ambos voltean en oscuro; el hover es
   tinte sobre superficie propia (uso correcto de `--accent-light`). */
.header-auth {
    display: inline-flex; align-items: stretch;
    border: 1.5px solid var(--border-strong);
    border-radius: 50px;
    overflow: hidden;
    flex-shrink: 0;
}
.header-auth__btn {
    background: transparent; border: none; cursor: pointer;
    padding: .5rem .95rem;
    font-family: var(--font-body); font-size: .85rem; font-weight: 600;
    line-height: 1.2;
    color: var(--ink);
    white-space: nowrap;
    transition: background .2s, color .2s;
}
.header-auth__btn + .header-auth__btn { border-left: 1.5px solid var(--border-strong); }
.header-auth__btn--alt { color: var(--accent); }
.header-auth__btn:hover { background: var(--accent-light); color: var(--accent); }

/* CTA button */
.header-cta {
    border-radius: 50px;
    padding: .55rem 1.4rem;
    font-size: .85rem;
    font-weight: 600;
    margin-top: 0;
    white-space: nowrap;
}

/* Claro/oscuro — círculo fantasma a la derecha de todo: es un ajuste, no una
   acción; relleno sólido competiría con el CTA primario que tiene al lado. */
.header-theme {
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px;
    padding: 0;
    background: transparent;
    border: 1px solid var(--border-strong);
    border-radius: 50%;
    color: var(--ink-muted);
    cursor: pointer;
    flex-shrink: 0;
    transition: color .2s, border-color .2s, background .2s;
}
.header-theme:hover {
    color: var(--accent);
    border-color: var(--accent);
    background: var(--accent-light);
}
/* Los dos iconos viven en el DOM y el CSS enseña el que toca — el icono anuncia
   A DÓNDE vas (en claro ves la luna), y al no pintarlo con JS no hay parpadeo. */
.header-theme .theme-icon-sun { display: none; }
.header-theme .theme-icon-moon { display: inline; }
[data-theme="dark"] .header-theme .theme-icon-sun { display: inline; }
[data-theme="dark"] .header-theme .theme-icon-moon { display: none; }

/* La banda apretada del header: 769–1024px.
   `.header-actions` solo se esconde a ≤768, así que en esta franja el header
   lleva marca + 5 pestañas + login + CTA + lunita en una sola fila. A 820px eso
   pedía 785px sobre 771 útiles y, con `flex-shrink: 0` en las acciones, no
   encogía: SE DESBORDABA — la página entera scrolleaba de lado 22px. Lo
   destapó la lunita (38px + su gap) al sumarse en el tema oscuro.

   Se recorta donde SOBRA —el nav gastaba 176px solo en padding y gaps— y no en
   el CTA ni en el interruptor, que son objetivos, no relleno.

   El rango va acotado con `min-width: 769px` a propósito: las reglas de ≤1024
   se heredan a ≤768, donde el nav ya es el de móvil, y esa herencia ya costó
   una ronda en el hero. */
@media (min-width: 769px) and (max-width: 1024px) {
    /* 1.45.0: "Entrar" (67px) reemplazó al círculo (38px) y a 769px volvió a
       desbordar 26px (medido: marca 172 + nav 344 + acciones 279 = 795). Se
       recorta otra vez donde sobra —padding de los tabs (era 9.6px × 10) y los
       gaps— y no en el CTA ni en la luna. Medido tras el recorte: 0 en 769. */
    .nav-list li a  { padding-left: .45rem; padding-right: .45rem; }
    .header-actions { gap: .45rem; }
    .header-cta     { padding-left: 1rem; padding-right: 1rem; }
    .header-auth__btn { padding-left: .75rem; padding-right: .75rem; }
    /* La píldora de cuenta se queda solo con "Entrar": "Crear cuenta" son ~95px
       que aquí no caben. El registro sigue a un toque (pestaña del modal). */
    .header-auth__btn--alt { display: none; }
}

/* Mobile toggle */
.header-lupa { display: none; }
.nav-drawer-head, .nav-drawer-foot, .nav-overlay { display: none; }
.menu-toggle { display: none; background: none; border: none; cursor: pointer; padding: .5rem; margin-left: .5rem; }
.menu-toggle span {
    display: block; width: 22px; height: 2px; background: var(--ink);
    margin: 5px 0; border-radius: 1px; transition: all .3s;
}

/* --- Hero Slider --- */
.hero {
    position: relative;
    min-height: 650px;
    overflow: hidden;
    background: #111;
}

/* Search over hero (top) */
.hero-search {
    position: absolute;
    top: 1rem;
    left: 0; right: 0;
    z-index: 5;
    animation: searchEntrance .6s ease .22s both;
}
@keyframes searchEntrance {
    from { opacity: 0; transform: translateY(-15px); }
    to   { opacity: 1; transform: translateY(0); }
}
.hero-slides { position: absolute; inset: 0; }
.hero-slide {
    position: absolute; inset: 0;
    opacity: 0;
    transition: opacity 1.4s cubic-bezier(.4, 0, .2, 1);
}
.slide-link {
    position: absolute; inset: 0; z-index: 2;
}
.hero-slide.active { opacity: 1; }
.slide-bg {
    position: absolute; inset: 0;
    background: center/cover no-repeat;
    transform: scale(1.08);
}
.hero-slide.active .slide-bg { animation: kenBurns 6s ease forwards; }
@keyframes kenBurns {
    from { transform: scale(1); }
    to   { transform: scale(1.08); }
}
.hero-slide::after {
    content: ''; position: absolute; inset: 0;
    background: linear-gradient(0deg, rgba(0,0,0,.55) 0%, rgba(0,0,0,.15) 50%, rgba(0,0,0,.05) 100%);
    z-index: 1;
}

/* Slide property info — bottom left */
.slide-info {
    position: absolute; bottom: 2rem; left: 2.5rem; right: 2.5rem;
    z-index: 2; color: #fff;
    display: flex; flex-direction: column; gap: .2rem;
}

/* Fila 1 — tags (estilo RealHomes Ultra) */
.slide-tags { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.slide-info .property-badge {
    position: static;
    background: #fff;
    color: #1a1a2e;
    border-radius: 40px;
    padding: 2.5px 10px;
    font-size: 13px;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
}
.slide-info .badge-venta,
.slide-info .badge-renta,
.slide-info .badge-tipo { background: #fff; color: #1a1a2e; }

/* Fila 2 — título + precio */
.slide-title-price {
    display: flex; align-items: center; gap: 12px;
    margin: 0; width: 100%;
}
.slide-info h2 {
    font-family: var(--font-display);
    font-size: clamp(1.4rem, 3vw, 1.9rem);
    font-weight: 700; color: #fff; line-height: 1.2;
    margin: 0;
    white-space: nowrap;
    text-shadow: 0 1px 4px rgba(0,0,0,.4);
}
.slide-info h2 a { color: #fff; }
.slide-info h2 a:hover { text-decoration: underline; }
.slide-price {
    background: var(--accent);
    color: #fff;
    font-family: var(--font-display);
    font-size: clamp(1.2rem, 2.5vw, 1.6rem);
    font-weight: 700;
    padding: 2px 14px;
    border-radius: 40px;
    white-space: nowrap;
    display: inline-block;
}

/* Fila 3 — dirección */
.slide-location {
    display: flex; align-items: center; gap: .35rem;
    font-size: .85rem; color: rgba(255,255,255,.85);
}

/* Hero overlay content — h1 + help banner below search */
.hero-content {
    position: absolute; bottom: 12rem; left: 0; right: 0;
    z-index: 3; pointer-events: none;
    max-width: 100%;
    padding-left: clamp(5rem, 8%, 8rem);
    padding-right: clamp(1.25rem, 8%, 8rem);
}
.hero-content > * { pointer-events: auto; }
.hero h1 {
    font-family: var(--font-display);
    font-size: clamp(2.5rem, 6vw, 4.2rem);
    font-weight: 700; line-height: 1.05;
    margin-bottom: .75rem; letter-spacing: -.02em;
    color: #fff;
    text-shadow: 0 2px 8px rgba(0,0,0,.3);
    max-width: 600px;
}
.rotating-word {
    display: inline-block;
    color: #ffd000;
    text-shadow: 0 3px 6px rgba(0,0,0,.5);
    transition: opacity .4s ease, transform .4s ease;
}
.rotating-word.fade-out {
    opacity: 0;
    transform: translateY(-8px);
}
.rotating-word.fade-in {
    opacity: 0;
    transform: translateY(8px);
}

/* Help banner */
.hero-help-banner {
    display: inline-flex;
    align-items: center;
    gap: .75rem;
    background: var(--accent);
    border-radius: 8px;
    padding: .5rem .5rem .5rem 1rem;
}
.help-text {
    color: #fff;
    font-size: .82rem;
    font-weight: 500;
}
.help-cta {
    background: #fff !important;
    color: var(--accent) !important;
    border-radius: 6px;
    padding: .4rem .85rem;
    font-size: .78rem;
    font-weight: 600;
    white-space: nowrap;
    box-shadow: none;
}
.help-cta:hover {
    /* Hex OPACO a propósito, no --accent-light: este botón flota sobre el
       mapa del hero y en oscuro el token es rgba al 12% — el botón blanco
       se ESFUMABA al hover (lo cachó Mike). Misma regla que --on-glass:
       pastilla clara en los dos temas, una foto es una foto. */
    background: #e8f4fd !important;
}

/* Slider arrows */
.hero-arrow {
    position: absolute; top: 50%; transform: translateY(-50%);
    z-index: 4; width: 44px; height: 44px;
    background: rgba(255,255,255,.9); border: none; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer; color: var(--on-glass);
    box-shadow: 0 2px 8px rgba(0,0,0,.15);
    transition: background .2s, transform .2s;
}
.hero-arrow:hover { background: #fff; transform: translateY(-50%) scale(1.08); }
.hero-prev { left: 1.25rem; animation: bounceInLeft .7s cubic-bezier(.34,1.56,.64,1) 1.22s both; }
.hero-next { right: 1.25rem; animation: bounceInRight .7s cubic-bezier(.34,1.56,.64,1) 1.22s both; }
@keyframes bounceInLeft {
    from { opacity: 0; transform: translateY(-50%) translateX(-60px); }
    to   { opacity: 1; transform: translateY(-50%) translateX(0); }
}
@keyframes bounceInRight {
    from { opacity: 0; transform: translateY(-50%) translateX(60px); }
    to   { opacity: 1; transform: translateY(-50%) translateX(0); }
}

/* Slider dots */
.hero-dots {
    position: absolute; bottom: 1.25rem; right: 2.5rem;
    z-index: 4; display: flex; align-items: center; gap: .5rem;
}
/* Grupo de dots con border colectivo */
.hero-dots-group {
    display: flex; align-items: center; gap: .4rem;
    border: 2px solid rgba(255,255,255,.7);
    border-radius: 20px;
    padding: 4px 6px;
}
.hero-dot {
    width: 10px; height: 10px; border-radius: 50%; border: 2px solid #fff;
    background: transparent; cursor: pointer; transition: background .2s;
    padding: 0; flex-shrink: 0;
}
.hero-dot.active { background: #fff; }
/* Botón pause */
.hero-pause {
    width: 18px; height: 18px; border-radius: 50%;
    border: 2px solid #fff; background: transparent;
    cursor: pointer; display: flex; align-items: center; justify-content: center;
    padding: 0; flex-shrink: 0; transition: background .2s;
}
.hero-pause:hover { background: rgba(255,255,255,.2); }

/* --- Search Box (single row) --- */
.search-box {
    background: var(--surface-card);
    border-radius: 50px;
    padding: .75rem;
    box-shadow: 0 4px 24px rgba(30, 160, 229, .1);
    border: 2px solid rgba(30, 160, 229, .22);
    overflow: visible;
    /* El buscador entero tiene que APILARSE sobre los resultados, y esto no es
       un capricho de número: `.search-box` corre `animation: searchEntrance`,
       cuyo transform CREA CONTEXTO DE APILAMIENTO. Eso encierra aquí adentro el
       `z-index: 20` de `.filter-dropdown`, que solo vale puertas adentro; hacia
       afuera compite el search box entero, y siendo `z-auto` y anterior a
       `.halfmap-results` en el DOM, las tarjetas se pintaban encima del
       desplegable abierto. Subirle el z-index al desplegable no habría hecho
       nada — hay que sacar de abajo al contenedor que crea el contexto. */
    position: relative;
    z-index: 5;
    transition: border-radius .3s ease;
    max-width: 900px;
    margin: 0 auto;
}

.search-row {
    display: flex;
    align-items: center;
    gap: 0;
}

.search-tabs { display: flex; gap: .25rem; flex-shrink: 0; }
.search-tab {
    padding: .5rem 1rem; border-radius: 50px; cursor: pointer;
    font-weight: 600; font-size: .82rem; color: var(--ink-muted);
    background: transparent; transition: all .2s;
    border: none;
}
.search-tab input { display: none; }
.search-tab.active, .search-tab:has(input:checked) {
    background: var(--accent); color: #fff;
}
.search-tab:not(.active):not(:has(input:checked)):hover {
    color: var(--accent);
}

.search-divider {
    width: 1px; height: 24px; background: var(--border);
    flex-shrink: 0; margin: 0 .5rem;
}

.search-select {
    border: none; background: transparent;
    color: var(--ink-secondary); font-size: .85rem;
    padding: .5rem .25rem; cursor: pointer;
    appearance: none; flex-shrink: 0;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M3 4.5L6 8l3-3.5'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right center;
    padding-right: 1.1rem;
}
.search-select:focus { outline: none; color: var(--ink); }

.search-keyword-wrap {
    position: relative;
    flex: 1; min-width: 0;
}
.search-keyword-wrap .search-icon {
    position: absolute;
    left: .5rem; top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
}
.search-keyword {
    width: 100%;
    padding: .5rem .5rem .5rem 2rem;
    border: none; border-radius: 50px;
    font-size: .88rem; color: var(--ink);
    background: transparent;
}
.search-keyword:focus { outline: none; }
.search-keyword::placeholder { color: var(--ink-muted); }

.btn-search {
    padding: .6rem 1.75rem;
    flex-shrink: 0;
    border-radius: 50px;
    font-size: .85rem;
    font-weight: 600;
}

/* Advanced search panel — inside box, slides open */
.search-advanced-panel {
    max-height: 0; overflow: hidden; opacity: 0;
    transition: max-height .4s ease, opacity .3s ease, margin .3s ease, padding .3s ease;
    margin: 0; padding: 0;
}
.search-advanced-panel.open {
    max-height: 400px; opacity: 1; overflow: visible;
    margin-top: .75rem; padding-top: .75rem;
    border-top: 1px solid var(--border);
}
.search-box:has(.search-advanced-panel.open) {
    border-radius: 30px;
    transition: border-radius .3s ease;
}
.adv-row {
    display: flex; gap: .5rem;
    margin-bottom: .5rem;
}
.adv-row:last-child { margin-bottom: 0; }
.adv-field {
    flex: 1 1 0; min-width: 0;
}
.adv-field label {
    display: block; font-size: .72rem; font-weight: 600;
    color: var(--ink-muted); margin-bottom: .2rem;
    text-transform: uppercase; letter-spacing: .03em;
}
.adv-field input,
.adv-field select {
    width: 100%; padding: .5rem .65rem;
    border: 1.5px solid var(--border); border-radius: 50px;
    font-size: .82rem; color: var(--ink);
    background: var(--surface); transition: border-color .2s;
}
.adv-field select {
    appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M3 4.5L6 8l3-3.5'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right .6rem center;
    padding-right: 1.75rem;
}
.adv-field input:focus,
.adv-field select:focus { border-color: var(--accent); outline: none; background: var(--surface-card); }

/* Filterable dropdown */
.filter-select {
    position: relative;
}
.filter-select select { display: none; }
.filter-trigger {
    display: flex; align-items: center; justify-content: space-between;
    width: 100%; padding: .5rem .65rem;
    border: 1.5px solid var(--border); border-radius: 50px;
    font-size: .82rem; color: var(--ink-secondary);
    background: var(--surface); cursor: pointer;
    transition: border-color .2s;
}
.filter-trigger::after {
    content: ''; width: 0; height: 0;
    border-left: 4px solid transparent; border-right: 4px solid transparent;
    border-top: 5px solid var(--ink-muted); flex-shrink: 0; margin-left: .5rem;
}
.filter-trigger.open { border-color: var(--accent); background: var(--surface-card); border-radius: 12px 12px 0 0; }

.filter-dropdown {
    display: none; position: absolute; top: 100%; left: 0; right: 0;
    /* SUPERFICIE, no tinte. Iba con `--accent-light`, que es un tinte de acento:
       en claro vale `#e8f4fd` (opaco) y funcionaba de casualidad, pero en oscuro
       es `rgba(30,160,229,.12)` — 12% — y el desplegable quedaba 88%
       transparente, con las fotos de los resultados asomándose por debajo.
       Un panel que FLOTA sobre otro contenido necesita superficie opaca; el
       tinte translúcido está bien en hovers, que se ven sobre el fondo de su
       propio contenedor. Además así empata con `.filter-trigger.open`. */
    background: var(--surface-card); border: 1.5px solid var(--accent); border-top: none;
    border-radius: 0 0 12px 12px;
    box-shadow: 0 8px 24px rgba(0,0,0,.12);
    z-index: 20; max-height: 220px; overflow: hidden;
}
.filter-dropdown.open { display: block; }

.filter-input {
    width: 100%; padding: .5rem .65rem; border: none;
    border-bottom: 1px solid var(--border);
    font-size: .82rem; color: var(--ink);
    background: transparent; outline: none;
}
.filter-input::placeholder { color: var(--ink-muted); }

.filter-options {
    max-height: 170px; overflow-y: auto;
}
.filter-option {
    padding: .45rem .65rem; font-size: .82rem;
    color: var(--ink-secondary); cursor: pointer;
    transition: background .15s, color .15s;
}
.filter-option:hover { background: var(--accent); color: #fff; }
.filter-option.selected { color: var(--accent); font-weight: 600; }
.filter-option.hidden { display: none; }
/* Dual range slider */
.adv-row-sliders { margin-top: .25rem; }
.adv-field-slider { flex: 1; min-width: 0; }
/* Precio tiene números mucho más largos ($21,850,000) que m² — le damos doble ancho */
.adv-field-slider--wide { flex: 2; }
/* Label de slider: caption uppercase arriba, rango en línea propia abajo (consistente
   con CUARTOS/BAÑOS/ESTACIONAMIENTOS). Evita la elipsis cuando los números crecen. */
.adv-field-slider label {
    display: flex; flex-direction: column; gap: 1px;
    white-space: nowrap; min-width: 0;
}
.adv-field-slider label span {
    display: block;
    font-weight: 500; font-size: .78rem; color: var(--accent);
    text-transform: none; letter-spacing: 0;
    overflow: hidden; text-overflow: ellipsis;
}
.range-slider {
    position: relative; height: 36px;
    display: flex; align-items: center;
}
.range-slider input[type="range"] {
    position: absolute; width: 100%; height: 6px;
    background: none; pointer-events: none;
    -webkit-appearance: none; appearance: none;
    margin: 0; padding: 0;
}
.range-slider input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    width: 18px; height: 18px; border-radius: 50%;
    background: var(--surface-card); border: 2px solid var(--accent);
    box-shadow: 0 1px 4px rgba(0,0,0,.15);
    pointer-events: all; cursor: pointer;
    position: relative; z-index: 2;
}
.range-slider input[type="range"]::-moz-range-thumb {
    width: 18px; height: 18px; border-radius: 50%;
    background: var(--surface-card); border: 2px solid var(--accent);
    box-shadow: 0 1px 4px rgba(0,0,0,.15);
    pointer-events: all; cursor: pointer;
}
.range-track {
    position: absolute; left: 0; right: 0; height: 4px;
    background: var(--border); border-radius: 2px;
    pointer-events: none;
}
.range-track::after {
    content: ''; position: absolute; height: 100%;
    background: var(--accent); border-radius: 2px;
    left: var(--range-left, 0%); right: var(--range-right, 0%);
}

.search-toggle-wrap {
    max-width: 900px;
    margin: 0 auto;
    padding-left: 50px;
}
.search-features-toggle {
    margin-top: -.1rem;
    display: inline-flex; align-items: center; gap: .35rem;
    background: var(--accent); color: #fff;
    border: none; border-radius: 0 0 20px 20px;
    padding: .45rem 1.1rem; font-size: .78rem; font-weight: 600;
    cursor: pointer; transition: background .2s;
}
.search-features-toggle:hover { background: var(--accent-hover); }
.search-features-toggle svg { transition: transform .3s; }
.search-features-toggle.open svg { transform: rotate(45deg); }

@media (max-width: 768px) {
    .search-box { border-radius: 20px; padding: .5rem; }
    .search-row { flex-wrap: wrap; gap: .35rem; }
    .search-tabs { width: 100%; justify-content: center; }
    .search-divider { display: none; }
    .search-select { width: 100%; padding: .5rem .75rem; }
    .search-keyword-wrap { width: 100%; }
    .search-keyword { padding: .5rem .5rem .5rem 2rem; }
    .btn-search { width: 100%; }
}

/* --- Section Layout --- */
.section-title {
    font-size: clamp(1.4rem, 3vw, 1.85rem);
    font-weight: 700; color: var(--ink);
    letter-spacing: -.02em;
}
.section-header {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: var(--space-lg);
}
.section-link {
    color: var(--accent); font-weight: 500; font-size: .9rem;
    border-bottom: 1px solid transparent;
    transition: border-color .2s;
}
.section-link:hover { border-color: var(--accent); }
.section-eyebrow {
    font-size: .75rem; font-weight: 600; text-transform: uppercase;
    letter-spacing: .1em; color: var(--accent); margin-bottom: .5rem;
}

/* --- Categories --- */
.categories { padding: var(--space-3xl) 0 var(--space-2xl); }
.categories-grid {
    display: grid; grid-template-columns: repeat(6, 1fr);
    gap: clamp(.6rem, 1.5vw, 1rem); margin-top: var(--space-lg);
}
.category-card {
    display: flex; flex-direction: column; align-items: center;
    padding: clamp(1.25rem, 2.5vw, 1.75rem) var(--space-md);
    border-radius: var(--radius-lg);
    background: var(--surface-card);
    border: 1.5px solid var(--border);
    transition: all .25s cubic-bezier(.4, 0, .2, 1);
    text-align: center; cursor: pointer; text-decoration: none;
    color: var(--ink-secondary);
}
.category-card:hover {
    border-color: var(--accent);
    box-shadow: var(--shadow-md);
    transform: translateY(-3px);
    background: var(--accent-light);
}
.category-card:hover .category-icon { color: var(--accent); }
.category-icon {
    width: 40px; height: 40px; color: var(--ink-muted);
    margin-bottom: .6rem; transition: color .25s;
}
.category-icon svg { width: 100%; height: 100%; }
.category-card h3 {
    font-family: var(--font-body);
    font-size: .9rem; font-weight: 600; color: var(--ink);
    margin-bottom: .15rem;
}
.category-count { font-size: .78rem; color: var(--ink-muted); }

/* --- Property Cards --- */
.properties-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-lg); }
.properties-grid.grid-2 { grid-template-columns: repeat(2, 1fr); }
/* Recién publicadas (portada): 8 tarjetas en 4×2 — SOLO ahí; los demás
   listados conservan sus 3. Se deshace explícito en cada breakpoint chico
   (regla del tema: lo del breakpoint grande se deshace en el chico). */
.featured .properties-grid { grid-template-columns: repeat(4, 1fr); }

.property-card {
    border-radius: var(--radius-lg); overflow: hidden;
    border: 1px solid var(--border);
    transition: all .3s cubic-bezier(.4, 0, .2, 1);
    display: block; text-decoration: none; color: var(--ink-secondary);
    background: var(--surface-card);
}
.property-card:hover {
    box-shadow: var(--shadow-card-hover);
    transform: translateY(-4px);
    border-color: transparent;
}
.property-card:hover .property-image img { transform: scale(1.04); }
.property-image {
    position: relative; aspect-ratio: 16/11; overflow: hidden;
    background: var(--surface-warm);
}
.property-image img {
    width: 100%; height: 100%; object-fit: cover;
    transition: transform .5s cubic-bezier(.4, 0, .2, 1);
}
.property-image-placeholder {
    width: 100%; height: 100%;
    background: linear-gradient(145deg, var(--surface-warm), var(--border));
}
.property-badge {
    position: absolute; top: .75rem; left: .75rem;
    padding: .3rem .7rem; border-radius: var(--radius-sm);
    font-size: .72rem; font-weight: 700; color: #fff;
    text-transform: uppercase; letter-spacing: .06em;
}
.badge-venta { background: var(--venta); }
.badge-renta { background: var(--renta); }
.property-info { padding: var(--space-md) var(--space-lg) var(--space-lg); }
.property-price {
    font-family: var(--font-display);
    font-size: 1.3rem; font-weight: 700; color: var(--ink);
    margin-bottom: .2rem; letter-spacing: -.02em;
}
.property-title {
    font-size: .88rem; color: var(--ink-secondary);
    margin-bottom: .6rem; line-height: 1.4;
}
.property-specs {
    display: flex; gap: .75rem; font-size: .8rem; color: var(--ink-muted);
    margin-bottom: .5rem; padding-top: .6rem;
    border-top: 1px solid var(--border);
}
.property-specs span { display: flex; align-items: center; gap: .2rem; }
.property-location { font-size: .8rem; color: var(--ink-muted); }

.property-card.placeholder .property-image {
    aspect-ratio: 16/11;
}
.property-card.placeholder .property-image img {
    width: 100%; height: 100%; object-fit: cover;
}

/* --- Featured --- */
.featured {
    padding: var(--space-2xl) 0 var(--space-3xl);
    background: var(--surface-warm);
}

/* --- CTA Publish --- */
.cta-publish {
    padding: var(--space-3xl) 0;
    background: linear-gradient(135deg, #0b2545 0%, #13395e 100%);
    position: relative; overflow: hidden;
}
.cta-publish::before {
    content: ''; position: absolute; inset: 0;
    background: radial-gradient(ellipse 70% 80% at 80% 50%, rgba(30, 160, 229, .15), transparent);
}
.cta-content { position: relative; text-align: center; color: #fff; }
.cta-content h2 {
    font-family: var(--font-display);
    font-size: clamp(1.6rem, 4vw, 2.2rem);
    font-weight: 700; margin-bottom: .75rem;
    letter-spacing: -.02em; color: #fff;
}
.cta-content p {
    font-size: 1.05rem; color: rgba(255,255,255,.65);
    margin-bottom: 2rem; max-width: 460px; margin-inline: auto;
}

/* --- Popular Zones --- */
.popular-zones { padding: var(--space-3xl) 0; }
.zones-grid {
    display: grid; grid-template-columns: repeat(3, 1fr);
    gap: var(--space-md); margin-top: var(--space-lg);
}
.zone-card {
    position: relative;
    padding: clamp(2rem, 4vw, 3rem) var(--space-lg);
    border-radius: var(--radius-lg);
    background: var(--inverse-bg) center/cover no-repeat;
    color: #fff; overflow: hidden;
    transition: all .3s cubic-bezier(.4, 0, .2, 1);
    text-decoration: none; display: block; text-align: left;
}
.zone-card::before {
    content: ''; position: absolute; inset: 0;
    background: linear-gradient(180deg, rgba(28,25,23,.3) 0%, rgba(28,25,23,.75) 100%);
    transition: opacity .3s;
}
.zone-overlay { position: absolute; inset: 0; }
.zone-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.zone-card:hover::before { opacity: .7; }
.zone-card h3 {
    font-family: var(--font-display);
    font-size: 1.15rem; font-weight: 600;
    margin-bottom: .2rem; position: relative; color: #fff;
}
.zone-card span { font-size: .82rem; opacity: .55; position: relative; }

/* --- Listing Page --- */
.listing-page { padding: var(--space-xl) 0 var(--space-3xl); }
.listing-header { margin-bottom: var(--space-xl); }
.breadcrumb {
    font-size: .82rem; color: var(--ink-muted);
    margin-bottom: var(--space-md);
}
.breadcrumb a { color: var(--accent); }
.breadcrumb a:hover { text-decoration: underline; }
.listing-meta { display: flex; justify-content: space-between; align-items: baseline; }
.listing-meta h1 {
    font-size: clamp(1.4rem, 3vw, 1.75rem); font-weight: 700;
    letter-spacing: -.02em;
}
.listing-count { color: var(--ink-muted); font-size: .9rem; }

.listing-layout { display: grid; grid-template-columns: 260px 1fr; gap: var(--space-xl); }

/* --- Filters Sidebar --- */
.listing-filters {
    position: sticky; top: calc(var(--header-h) + var(--space-md));
    align-self: start; padding: var(--space-lg);
    background: var(--surface-card);
    border: 1px solid var(--border); border-radius: var(--radius-lg);
}
.listing-filters h3 {
    font-family: var(--font-display);
    font-size: 1.05rem; font-weight: 700; color: var(--ink);
    margin-bottom: var(--space-lg);
    padding-bottom: var(--space-sm);
    border-bottom: 1px solid var(--border);
}
.filter-group { margin-bottom: var(--space-lg); }
.filter-group > label:first-child {
    display: block; font-weight: 600; font-size: .75rem;
    color: var(--ink-muted); margin-bottom: .4rem;
    text-transform: uppercase; letter-spacing: .08em;
}
.filter-radio, .filter-check {
    display: flex; align-items: center; gap: .5rem;
    padding: .3rem 0; font-size: .9rem; cursor: pointer;
}
.filter-range { display: flex; align-items: center; gap: .4rem; }
.filter-range input {
    flex: 1; padding: .55rem .7rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); width: 0; background: var(--surface);
    font-size: .85rem;
}
.filter-range input:focus { border-color: var(--accent); outline: none; }
.filter-pills { display: flex; gap: .4rem; flex-wrap: wrap; }
.pill {
    padding: .4rem .7rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); font-size: .82rem; cursor: pointer;
    transition: all .2s; background: var(--surface);
}
.pill input { display: none; }
.pill:has(input:checked) {
    background: var(--inverse-bg); color: var(--inverse-ink); border-color: var(--inverse-bg);
}
.pill:hover { border-color: var(--ink-muted); }
.listing-filters select {
    width: 100%; padding: .55rem .7rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); background: var(--surface); font-size: .9rem;
}

/* --- Listing Results --- */
.listing-sort { margin-bottom: var(--space-md); display: flex; justify-content: flex-end; }
.listing-sort select {
    padding: .5rem .75rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); background: var(--surface-card);
    font-size: .85rem;
}
.pagination { margin-top: var(--space-xl); text-align: center; }
.pagination .nav-links { display: flex; justify-content: center; gap: .35rem; }
.pagination a, .pagination span {
    padding: .5rem .9rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); font-size: .85rem;
    transition: all .2s;
}
.pagination a:hover { border-color: var(--accent); color: var(--accent); }
.pagination .current {
    background: var(--inverse-bg); color: var(--inverse-ink); border-color: var(--inverse-bg);
}
.no-results { text-align: center; padding: var(--space-3xl) 0; color: var(--ink-muted); }
.no-results h2 { color: var(--ink); margin-bottom: .5rem; }

/* ==============================================
   SINGLE PROPERTY — Full-Width Layout (sp-*)
   ============================================== */

/* Container wide (1400px) */
.container-wide { max-width: 1400px; margin: 0 auto; padding: 0 clamp(1rem, 3vw, 2rem); }

/* ---- Hero Gallery ---- */
/* La sección es el contenedor de `.sp-hero-stack` (absoluta en escritorio): la pila vive FUERA
   de .sp-hero-main desde 1.60.4, para poder fluir DEBAJO de la foto en móvil. */
.sp-hero { position: relative; }
.sp-hero-main {
    position: relative; overflow: hidden;
    height: clamp(580px, 92vh, 1040px);
    background: var(--surface-warm); cursor: pointer;
}
.sp-hero-img-wrap { position: absolute; inset: 0; }
.sp-hero-bg {
    position: absolute; inset: 0;
    background: center/cover no-repeat;
    opacity: 0;
    transition: opacity 1.2s cubic-bezier(.4, 0, .2, 1);
}
.sp-hero-bg.is-active { opacity: 1; }
.sp-hero-placeholder { width: 100%; height: 100%; background: linear-gradient(135deg, var(--surface-warm), var(--border-strong)); }

/* Virtual tour layer — stacked; se muestra al click del botón Paseo virtual */
.sp-hero-tour-layer {
    position: absolute; inset: 0; z-index: 2;
    background: #000;
    opacity: 0; pointer-events: none;
    transition: opacity .4s ease;
}
.sp-hero-main.show-tour .sp-hero-tour-layer { opacity: 1; pointer-events: auto; }
.sp-hero-main.show-tour .sp-hero-img-wrap { opacity: 0; transition: opacity .4s ease; }
.sp-hero-main.show-tour .sp-hero-overlay { opacity: 0; transition: opacity .3s; }
.sp-hero-tour-layer iframe { width: 100%; height: 100%; border: 0; display: block; }

/* Video layer — stacked; se muestra cuando la slide de video está activa */
.sp-hero-video-layer {
    position: absolute; inset: 0; z-index: 2;
    background: #000;
    opacity: 0; pointer-events: none;
    transition: opacity .35s ease;
}
.sp-hero-main.show-video .sp-hero-video-layer { opacity: 1; pointer-events: auto; }
.sp-hero-main.show-video .sp-hero-img-wrap { opacity: 0; transition: opacity .35s ease; }
.sp-hero-video-layer iframe,
.sp-hero-video-layer video {
    width: 100%; height: 100%; border: 0; display: block; object-fit: cover;
}

/* Play icon overlay en thumb de video */
.sp-vcar-thumb-video { position: relative; }
.sp-vcar-thumb-play {
    position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 32px; height: 32px; border-radius: 50%;
    background: rgba(0,0,0,.65); color: #fff;
    display: flex; align-items: center; justify-content: center;
    backdrop-filter: blur(4px);
    box-shadow: 0 2px 8px rgba(0,0,0,.4);
    pointer-events: none;
}
.sp-vcar-thumb-play svg { margin-left: 2px; /* óptico */ }

/* Map layer — stacked on top of images when toggled */
.sp-hero-map-layer {
    position: absolute; inset: 0;
    opacity: 0; pointer-events: none;
    transition: opacity .5s ease;
    z-index: 2;
}
.sp-hero-main.show-map .sp-hero-map-layer { opacity: 1; pointer-events: auto; }
.sp-hero-main.show-map .sp-hero-img-wrap { opacity: 0; transition: opacity .5s ease; }
.sp-hero-map-layer .leaflet-container { width: 100%; height: 100%; }
/* TODOS los mapas encerrados en su propio contexto de apilamiento (1.54.1). Leaflet trae
   z-index propios (panes 400, controles 1000) y, sin contexto en el contenedor, salen a
   competir con la página: la atribución «Leaflet | © OpenStreetMap» se pintaba ENCIMA de la
   invitación (900) — lo cazó Mike. Con isolation, el 1000 vale solo puertas adentro y el
   mapa entero queda debajo de header (100), mesa (850), invitación (900) y overlay (1000).
   Es la receta de siempre: no subir el z-index del que se hunde; encerrar al que se sale. */
.leaflet-container { isolation: isolate; }

/* Before/After compare slider — aparece al click de staging */
.sp-hero-compare {
    position: absolute; inset: 0; z-index: 2;
    opacity: 0; pointer-events: none;
    transition: opacity .4s ease;
    --cp: 50%;
    overflow: hidden;
}
.sp-hero-main.show-compare .sp-hero-compare { opacity: 1; pointer-events: auto; }
.sp-hero-main.show-compare .sp-hero-img-wrap { opacity: 0; transition: opacity .4s ease; }
.sp-hero-main.show-compare .sp-hero-overlay { opacity: 0; transition: opacity .3s; }

.sp-hero-cmp-before, .sp-hero-cmp-after {
    position: absolute; inset: 0;
    background: center/cover no-repeat;
}
/* After (amueblada) arriba, clipped desde la derecha hasta la posición del handle */
.sp-hero-cmp-after {
    clip-path: inset(0 calc(100% - var(--cp)) 0 0);
    -webkit-clip-path: inset(0 calc(100% - var(--cp)) 0 0);
}
.sp-hero-cmp-lbl {
    position: absolute; top: 1.5rem; z-index: 3;
    padding: .4rem .9rem; border-radius: 40px;
    background: rgba(0,0,0,.65); backdrop-filter: blur(8px);
    color: #fff; font-size: .72rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: .08em;
    pointer-events: none;
}
.sp-hero-cmp-lbl-before { right: 1.5rem; }
.sp-hero-cmp-lbl-after  { left: 1.5rem; background: var(--accent); }

.sp-hero-cmp-handle {
    position: absolute; top: 0; bottom: 0; left: var(--cp);
    width: 60px; transform: translateX(-50%);
    background: none; border: none; padding: 0;
    cursor: ew-resize; z-index: 4; touch-action: none;
}
.sp-hero-cmp-line {
    position: absolute; top: 0; bottom: 0; left: 50%;
    width: 3px; transform: translateX(-50%);
    background: #fff; box-shadow: 0 0 14px rgba(0,0,0,.55);
}
.sp-hero-cmp-grip {
    position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 52px; height: 52px; border-radius: 50%;
    background: #fff; box-shadow: 0 4px 14px rgba(0,0,0,.45);
    display: flex; align-items: center; justify-content: center;
    color: var(--on-glass); transition: transform .15s;
}
.sp-hero-cmp-handle:hover .sp-hero-cmp-grip,
.sp-hero-cmp-handle:active .sp-hero-cmp-grip { transform: translate(-50%, -50%) scale(1.08); }
.sp-hero-overlay {
    position: absolute; inset: 0; pointer-events: none;
    background: linear-gradient(to bottom, rgba(0,0,0,.38) 0%, transparent 28%, transparent 48%, rgba(0,0,0,.7) 100%);
}

/* Flechas discretas + contador del hero (1.61.0): vidrio como las del lightbox, más chicas.
   En escritorio asoman al pasar el mouse (la de atrás va a la derecha de la columna de
   miniaturas); en móvil siempre, semitransparentes. Con mapa, tour o video se esconden:
   ahí el hero es otra cosa. */
.sp-hero-nav {
    position: absolute; top: 50%; transform: translateY(-50%); z-index: 4;
    width: 36px; height: 36px; border-radius: 50%; border: 0; padding: 0; cursor: pointer;
    background: rgba(255,255,255,.18); backdrop-filter: blur(8px); color: #fff;
    display: flex; align-items: center; justify-content: center;
    opacity: 0; transition: opacity .2s, background .2s;
}
.sp-hero-nav--prev { left: calc(clamp(1rem, 2vw, 1.75rem) + 89px + .75rem); }
.sp-hero-nav--next { right: clamp(.75rem, 2vw, 1.5rem); }
.sp-hero-main:hover .sp-hero-nav, .sp-hero-nav:focus-visible { opacity: 1; }
.sp-hero-nav:hover { background: rgba(255,255,255,.32); }
.sp-hero-counter {
    position: absolute; right: clamp(1rem, 3vw, 2rem); bottom: 1.25rem; z-index: 3;
    padding: .25rem .6rem; border-radius: 999px; pointer-events: none;
    font-size: .74rem; font-weight: 600; letter-spacing: .02em; font-variant-numeric: tabular-nums;
    background: rgba(0,0,0,.45); color: #fff; backdrop-filter: blur(6px);
}
.sp-hero-counter:empty { display: none; }
.sp-hero-main.show-map .sp-hero-nav,     .sp-hero-main.show-tour .sp-hero-nav,     .sp-hero-main.show-video .sp-hero-nav,
.sp-hero-main.show-map .sp-hero-counter, .sp-hero-main.show-tour .sp-hero-counter, .sp-hero-main.show-video .sp-hero-counter { display: none; }

/* Top bar */
.sp-hero-topbar {
    position: absolute; top: 0; left: 0; right: 0; z-index: 3;
    display: flex; justify-content: space-between; align-items: center;
    padding: 1.25rem clamp(1rem, 3vw, 2rem);
}
.sp-breadcrumb {
    display: flex; align-items: center; gap: .35rem; flex-wrap: wrap;
    font-size: .78rem; color: rgba(255,255,255,.8);
}
.sp-breadcrumb a { color: rgba(255,255,255,.8); text-decoration: none; transition: color .15s; }
.sp-breadcrumb a:hover { color: #fff; text-decoration: underline; }
.sp-bc-sep { opacity: .5; }
.sp-hero-actions { display: flex; align-items: center; gap: .4rem; }
.sp-action-btn {
    display: inline-flex; align-items: center; gap: .3rem;
    padding: .45rem .8rem; border-radius: 40px; cursor: pointer;
    background: rgba(255,255,255,.15); backdrop-filter: blur(8px);
    border: 1px solid rgba(255,255,255,.28); color: #fff;
    font-size: .78rem; font-weight: 500; font-family: var(--font-body);
    transition: background .2s;
}
.sp-action-btn:hover { background: rgba(255,255,255,.27); }
.sp-fav-btn.active svg { fill: #ef4444; stroke: #ef4444; }
.sp-fav-count { font-weight: 700; margin-left: .1rem; }   /* el numerito del like en la ficha (1.47.0) */
.sp-fav-count[hidden] { display: none; }

/* Bottom info */
.sp-hero-foot {
    position: absolute; bottom: 0; left: 0; right: 0; z-index: 3;
    display: flex; justify-content: space-between; align-items: flex-end; gap: 1rem;
    padding: 1.5rem clamp(1rem, 3vw, 2rem) 1.5rem calc(clamp(1rem, 2vw, 1.75rem) + 89px + clamp(1rem, 2vw, 1.5rem));
}
.sp-hero-foot-left { flex: 1; min-width: 0; }
.sp-hero-foot-right { text-align: right; flex-shrink: 0; }
.sp-hero-tags { display: flex; flex-wrap: wrap; gap: .4rem; margin-bottom: .6rem; }
.sp-tag {
    display: inline-block; padding: .3rem .8rem;
    border-radius: 40px; font-size: .72rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: .08em; backdrop-filter: blur(6px);
}
.sp-tag-op { background: var(--accent); color: #fff; }
.sp-tag-tipo { background: var(--surface-warm); color: var(--ink-secondary); border: 1px solid var(--border); }
.sp-hero-title {
    font-family: var(--font-display);
    font-size: clamp(1.5rem, 3.5vw, 2.6rem); font-weight: 700;
    color: #fff; margin: 0; line-height: 1.15; letter-spacing: -.03em;
    text-shadow: 0 2px 16px rgba(0,0,0,.4);
}
.sp-hero-address {
    display: flex; align-items: center; gap: .3rem; margin-top: .45rem;
    font-size: .85rem; color: rgba(255,255,255,.78);
}
.sp-hero-address svg { flex-shrink: 0; opacity: .75; }
.sp-hero-price {
    font-family: var(--font-display); margin: 0;
    font-size: clamp(1.5rem, 3vw, 2.1rem); font-weight: 800;
    color: #fff; letter-spacing: -.03em; text-shadow: 0 2px 16px rgba(0,0,0,.4);
}
.sp-hero-price span { font-size: .7rem; font-weight: 400; opacity: .75; margin-left: .25rem; }
.sp-hero-price-m2 { display: block; font-size: .8rem; color: rgba(255,255,255,.7); margin-top: .2rem; }
.sp-photos-btn {
    display: inline-flex; align-items: center; gap: .3rem; margin-top: .5rem;
    padding: .4rem .9rem; background: rgba(0,0,0,.45); backdrop-filter: blur(8px);
    border: 1px solid rgba(255,255,255,.2); color: #fff; border-radius: 40px;
    font-size: .78rem; font-weight: 500; cursor: pointer; font-family: var(--font-body);
    transition: background .2s;
}
.sp-photos-btn:hover { background: rgba(0,0,0,.65); }

/* Hero tools — stack vertical debajo del carrusel */
.sp-hero-stack .sp-hero-tools {
    display: flex; flex-direction: column; gap: 8px;
}
.sp-hero-tool {
    width: calc(100% - 11px); height: 68px; margin: 0 auto;
    padding: 8px 0; border-radius: 7px; box-sizing: border-box;
    background: rgba(255,255,255,.95); backdrop-filter: blur(10px);
    border: none;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    color: var(--on-glass); cursor: pointer;
    font-family: var(--font-body); transition: background .2s, transform .15s;
}
.sp-hero-tool svg { width: 18px; height: 18px; color: var(--accent); margin-bottom: 2px; }
.sp-hero-tool:hover { background: #fff; transform: translateY(-2px); }
.sp-hero-tool.is-active { outline: 3px solid var(--accent); outline-offset: -3px; }
/* Disabled state when property has no tour/staging */
.sp-hero-tool.is-dim {
    background: rgba(255,255,255,.35); cursor: not-allowed;
    opacity: .75;
}
.sp-hero-tool.is-dim:hover { background: rgba(255,255,255,.35); transform: none; }
.sp-hero-tool.is-dim svg { color: rgba(0,0,0,.35); }
.sp-hero-tool.is-dim .sp-hero-tool-lbl { color: rgba(0,0,0,.45); opacity: .7; }
.sp-hero-tool-lbl {
    font-size: 11px; font-weight: 500; line-height: 1.1; text-align: center;
    margin-top: 2px; display: block; opacity: .7;
}

/* Stack izquierdo: mapa → 3D → staging → fotos (carrusel+count) */
.sp-hero-stack {
    position: absolute; left: clamp(1rem, 2vw, 1.75rem);
    bottom: 1.5rem; z-index: 3;
    width: 89px; display: flex; flex-direction: column;
    row-gap: 8px;
}
.sp-hero-stack .sp-vcar-mapbtn { order: 1; }
.sp-hero-stack .sp-hero-tools  { order: 2; }
.sp-hero-stack .sp-vcar        { order: 3; position: static; left: auto; bottom: auto; width: 100%; }

/* Vertical carousel (Slick) */
.sp-vcar {
    display: flex; flex-direction: column; row-gap: 8px;
}
/* Map toggle button — pegado arriba del carrusel */
.sp-vcar-mapbtn {
    width: calc(100% - 11px); margin: 0 auto;
    padding: 0; border: none; background: transparent; cursor: pointer;
    border-radius: 7px; overflow: hidden;
    box-shadow: 0 4px 10px rgba(0,0,0,.3);
    transition: transform .2s ease, box-shadow .2s ease;
}
.sp-vcar-mapbtn:hover { transform: scale(1.05); box-shadow: 0 6px 16px rgba(0,0,0,.4); }
.sp-vcar-mapbtn img { display: block; width: 100%; height: auto; }
.sp-vcar-mapbtn.is-active { outline: 3px solid var(--accent); outline-offset: -3px; }
.sp-vcar-box { width: 100%; }
/* Slick structure — no margins on track horizontal since we want vertical */
.sp-vcar-slick { margin: 0; }
.sp-vcar-slick .slick-list { overflow: hidden; }
.sp-vcar-slick .slick-track { display: block; }
.sp-vcar-thumb-box {
    padding: 0; margin: 4px 5.5px; /* 4px top+bottom = 8px entre thumbs consecutivos */
}
.sp-vcar-thumb {
    display: block; padding-top: 89%; /* aspect ratio */
    background-position: center; background-repeat: no-repeat; background-size: cover;
    cursor: pointer; border-radius: 6px;
    outline: 0 solid var(--accent); outline-offset: -5px;
    transition: outline-width .15s linear;
}
.sp-vcar-slick .slick-current .sp-vcar-thumb {
    outline-width: 5px;
    box-shadow: 0 6px 14px rgba(0,0,0,.35);
}
/* Count box */
.sp-vcar-count {
    width: calc(100% - 11px); min-width: auto; margin: 4px auto 0; box-sizing: border-box;
    background: rgba(255,255,255,.95); backdrop-filter: blur(10px);
    border-radius: 7px; padding: 8px 0; cursor: pointer;
    border: none; display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    color: var(--on-glass); font-family: var(--font-body);
    transition: background .2s;
    height: 68px;
}
.sp-vcar-count:hover { background: #fff; }
.sp-vcar-count svg { width: 14px; color: var(--accent); margin-bottom: 2px; }
.sp-vcar-count-num { font-family: var(--font-display); font-size: 18px; font-weight: 700; line-height: 1; display: block; }
.sp-vcar-count-lbl { font-size: 11px; font-weight: 500; display: block; margin-top: 2px; opacity: .7; }

/* ---- Main header (tags, título, dirección, precio — dentro del sp-main) ---- */
.sp-main-header { margin-bottom: var(--space-xl); }
.sp-mh-tags { display: flex; flex-wrap: wrap; gap: .4rem; margin-bottom: .6rem; }
.sp-mh-title-price {
    display: flex; justify-content: space-between; align-items: flex-start;
    gap: var(--space-md); flex-wrap: wrap;
}
.sp-mh-title-wrap { flex: 1; min-width: 0; }
.sp-mh-title {
    font-family: var(--font-display);
    font-size: clamp(1.4rem, 2.8vw, 2.1rem); font-weight: 700;
    color: var(--ink); margin: 0; line-height: 1.15; letter-spacing: -.02em;
}
.sp-mh-address {
    display: flex; align-items: center; gap: .3rem; margin: .4rem 0 0;
    font-size: .88rem; color: var(--ink-muted);
}
.sp-mh-address svg { flex-shrink: 0; color: var(--accent); opacity: .85; }
.sp-mh-price-wrap { text-align: right; flex-shrink: 0; }
.sp-mh-price {
    font-family: var(--font-display); margin: 0;
    font-size: clamp(1.3rem, 2.5vw, 1.8rem); font-weight: 800;
    color: var(--accent); letter-spacing: -.02em;
}
.sp-mh-price span { font-size: .65em; font-weight: 400; color: var(--ink-muted); margin-left: .25rem; }
.sp-mh-price-m2 { display: block; font-size: .8rem; color: var(--ink-muted); margin-top: .2rem; }

/* ---- Content area ---- */
.sp-content { padding: var(--space-xl) 0 var(--space-3xl); }

/* Specs bar */
.sp-specs-bar {
    display: flex; flex-wrap: wrap; gap: 0;
    background: var(--surface-card); border: 1px solid var(--border);
    border-radius: var(--radius-lg); margin-bottom: var(--space-xl); overflow: hidden;
}
.sp-spec {
    flex: 1; min-width: 110px; display: flex; flex-direction: column; align-items: center;
    padding: var(--space-md) var(--space-sm); text-align: center;
    border-right: 1px solid var(--border);
}
.sp-spec:last-child { border-right: none; }
.sp-spec-icon { color: var(--accent); margin-bottom: .35rem; }
.sp-spec-val { font-family: var(--font-display); font-size: 1.05rem; font-weight: 700; color: var(--ink); line-height: 1.2; }
.sp-spec-lbl { font-size: .68rem; color: var(--ink-muted); text-transform: uppercase; letter-spacing: .07em; margin-top: .15rem; }

/* 2-col layout.
   minmax(0, 1fr) + min-width: 0, no `1fr` pelón: un track `1fr` NO encoge bajo el
   min-content de su contenido. Con la barra de specs completa (6 datos) y un precio largo,
   `.sp-main` exigía 469px en un viewport de 390 y la página entera scrolleaba de lado
   (1.60.1, medido en /casa-en-condominio-en-venta-en-tamanche/). */
.sp-layout { display: grid; grid-template-columns: minmax(0, 1fr) 390px; gap: var(--space-xl); align-items: start; }
.sp-main, .sp-sidebar { min-width: 0; }

/* Sections */
.sp-section { margin-bottom: var(--space-2xl); }
.sp-heading {
    font-family: var(--font-display); font-size: 1.15rem; font-weight: 700;
    color: var(--ink); display: block; margin-bottom: var(--space-lg);
    padding-left: .85rem; border-left: 3px solid var(--accent);
}
.sp-description { color: var(--ink-secondary); line-height: 1.85; font-size: .95rem; }
.sp-amenities { display: flex; flex-wrap: wrap; gap: .5rem; }
.sp-amenity-tag {
    display: inline-flex; align-items: center; gap: .4rem;
    padding: .45rem .9rem; background: var(--surface-warm);
    border: 1px solid var(--border); color: var(--ink-secondary);
    border-radius: var(--radius); font-size: .82rem; font-weight: 500;
}
.sp-amenity-tag svg { color: var(--accent); flex-shrink: 0; }
.sp-address-full {
    display: flex; align-items: center; gap: .4rem;
    color: var(--ink-secondary); font-size: .92rem; margin-bottom: var(--space-md);
}
.sp-map {
    width: 100%; height: 300px; border-radius: var(--radius-lg);
    overflow: hidden; border: 1px solid var(--border);
}
.sp-map-placeholder {
    height: 200px; display: flex; flex-direction: column; align-items: center;
    justify-content: center; gap: .5rem; background: var(--surface-warm);
    border: 1px solid var(--border); border-radius: var(--radius-lg);
    color: var(--ink-muted); font-size: .85rem;
}

/* Calculator */
.sp-calc {
    background: var(--surface-warm); border: 1px solid var(--border);
    border-radius: var(--radius-lg); padding: var(--space-lg);
}

/* ---- Sidebar ---- */
.sp-sidebar { align-self: start; position: sticky; top: calc(var(--header-h) + 1rem); }
.sp-contact-card {
    background: var(--surface-card); border: 1px solid var(--border);
    border-radius: var(--radius-lg); padding: var(--space-lg);
    box-shadow: var(--shadow); margin-bottom: var(--space-md);
}
.sp-agent {
    display: flex; align-items: center; gap: .75rem;
    margin-bottom: var(--space-lg); padding-bottom: var(--space-md);
    border-bottom: 1px solid var(--border);
}
.sp-agent-avatar {
    width: 50px; height: 50px; border-radius: 50%; flex-shrink: 0;
    background: var(--accent-subtle); color: var(--accent);
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: 1.2rem; font-family: var(--font-display);
}
.sp-agent-name { font-weight: 600; color: var(--ink); font-size: .95rem; margin-bottom: .2rem; }
.sp-agent-badge {
    display: inline-block; font-size: .7rem; color: var(--sage);
    background: var(--sage-light); padding: .15rem .5rem;
    border-radius: var(--radius-sm); font-weight: 500;
}
/* Variante enlazada: el bloque entero lleva a /asesor/{slug}. */
.sp-agent-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }
.sp-agent--perfil { text-decoration: none; color: inherit; }
.sp-agent--perfil .sp-agent-name { transition: color .15s ease; }
.sp-agent--perfil:hover .sp-agent-name { color: var(--accent); }
.sp-agent-perfil { display: inline-block; font-size: .75rem; font-weight: 500; color: var(--accent); }
.sp-agent--perfil:focus-visible {
    outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--radius-sm);
}
/* La fila del asesor con su QR chico (1.53.0): el separador pasa a la fila; el bloque
   enlazado (→ perfil en el portal) sigue igual, y el QR (→ su tarjeta directa) va a la
   derecha, sobre blanco. 76px: a 60 no lo lee un teléfono con destello. Desde 1.60.2 también
   en móvil (Mike: «te enseño mi pantalla y tú la escaneas»); antes se ocultaba a ≤768. */
.sp-agent-row {
    display: flex; align-items: center; gap: var(--space-md);
    margin-bottom: var(--space-lg); padding-bottom: var(--space-md);
    border-bottom: 1px solid var(--border);
}
.sp-agent-row .sp-agent { flex: 1; min-width: 0; margin-bottom: 0; padding-bottom: 0; border-bottom: 0; }
.sp-agent-qr { flex-shrink: 0; width: 76px; text-align: center; }
.sp-agent-qr__codigo { background: #fff; border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 3px; }
.sp-agent-qr__codigo:empty { display: none; }
.sp-agent-qr__codigo svg { display: block; width: 100%; height: auto; }
.sp-agent-qr__pie { display: block; font-size: .66rem; color: var(--ink-muted); margin-top: .25rem; letter-spacing: .02em; }
/* «Llamar» solo en móvil (1.50.0): en escritorio `tel:` abre un diálogo del sistema y el
   botón sobra — ahí la única puerta es WhatsApp. Misma especificidad que .btn-block (flex);
   gana por ir después. El .sp-mini-form del single se retiró; .inmuex-lead-status sigue
   porque lo usan los forms de /contacto/ y del newsletter de la portada. */
@media (min-width: 769px) { .sp-btn-call { display: none; } }
.inmuex-lead-status { margin: .5rem 0 0; font-size: .82rem; line-height: 1.4; min-height: 1.1em; }
.inmuex-lead-status:empty { display: none; }
.inmuex-lead-status.is-success { color: #0e7c4a; }
.inmuex-lead-status.is-error   { color: #b42318; }
.sp-alert-card {
    background: var(--accent-light); border: 1px solid var(--accent-subtle);
    border-radius: var(--radius-lg); padding: var(--space-lg);
    text-align: center; margin-bottom: var(--space-sm);
}
.sp-alert-card svg { color: var(--accent); display: block; margin: 0 auto .45rem; }
.sp-alert-card p { font-size: .85rem; color: var(--ink-secondary); margin-bottom: var(--space-sm); }
.sp-alert-card p strong { color: var(--ink); font-weight: 600; }
/* Estado «guardado»: lo pinta saved-searches.js (dashboard) con las MISMAS clases del banner
   del archive (.hm-save-*), pero aquellas reglas viven bajo .halfmap-save-search — aquí se
   visten para la tarjeta: apilado, centrado, el verde de "listo" del archive. */
.sp-alert-card.is-saved {
    display: flex; flex-direction: column; align-items: center; gap: .4rem;
    background: rgba(34, 160, 107, .07); border-color: rgba(34, 160, 107, .3);
}
.sp-alert-card.is-saved .hm-save-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; border-radius: 50%;
    background: rgba(34, 160, 107, .14); color: #22a06b; font-weight: 700;
}
.sp-alert-card.is-saved .hm-save-text { font-size: .85rem; color: var(--ink-secondary); line-height: 1.35; }
.sp-alert-card.is-saved .hm-save-link { font-size: .82rem; font-weight: 600; color: var(--accent); text-decoration: none; }
.sp-alert-card.is-saved .hm-save-link:hover { text-decoration: underline; }
/* ---- Compártela (1.51.0) — mismas piezas que «Comparte mi tarjeta» del asesor ---- */
.sp-share-card {
    background: var(--surface-card); border: 1px solid var(--border);
    border-radius: var(--radius-lg); padding: var(--space-lg);
    text-align: center; margin-bottom: var(--space-sm);
}
.sp-share-title { font-weight: 600; font-size: .95rem; color: var(--ink); margin-bottom: .3rem; }
.sp-share-lead  { font-size: .82rem; color: var(--ink-secondary); line-height: 1.4; margin: 0 auto var(--space-md); max-width: 30ch; }
/* El QR se ve en TODAS las pantallas (1.60.2, Mike: «te enseño mi pantalla y tú la escaneas»),
   pero se habla distinto: en escritorio se imprime, en el celular se muestra para que OTRO lo
   escanee. Dos utilitarias para el verbo del lead y el pie del QR (ficha y perfil del asesor). */
.qr-solo-movil { display: none; }
/* El QR va SIEMPRE sobre blanco, también en el tema oscuro: los lectores fallan con
   módulos claros sobre fondo oscuro. */
.sp-qr {
    width: 200px; margin: 0 auto .5rem; padding: 4px;   /* «un poco más grande» (Mike) — mismo tamaño que el del asesor */
    background: #fff; border: 1px solid var(--border); border-radius: var(--radius-sm);
}
.sp-qr:empty { display: none; }
.sp-qr svg { display: block; width: 100%; height: auto; }
.sp-qr__pie { font-size: .78rem; color: var(--ink-muted); margin-bottom: .5rem; }
.sp-qr__descargar { margin-bottom: var(--space-md); }
.sp-share-redes { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; justify-content: center; }
/* Los círculos de compartir que son <button> (Copiar, Más opciones) y su aviso: UNA regla
   para la ficha y para el perfil del asesor — la misma pieza en los dos lados (1.54.0). */
button.asesor-red { border: 0; padding: 0; cursor: pointer; font: inherit; }
.asesor-red.is-listo { background: #22a06b; color: #fff; }
.sp-share-aviso, .asesor-compartir__aviso { font-size: .78rem; font-weight: 600; color: #22a06b; text-align: center; margin: .5rem 0 0; }
.sp-share-aviso:empty, .asesor-compartir__aviso:empty { display: none; }
/* Móvil: el QR se queda (antes se ocultaba aquí), un poco más chico, y cambia el verbo. */
@media (max-width: 768px) {
    .sp-qr { width: 160px; }
    .qr-solo-escritorio { display: none; }
    .qr-solo-movil { display: inline; }
}

.sp-published { font-size: .75rem; color: var(--ink-muted); text-align: center; margin-top: .5rem; }

/* ---- Similar ---- */
.sp-similar { padding: var(--space-3xl) 0; border-top: 1px solid var(--border); background: var(--surface-warm); }
.sp-similar-heading {
    font-family: var(--font-display); font-size: 1.4rem; font-weight: 700;
    color: var(--ink); letter-spacing: -.02em; margin-bottom: var(--space-xl);
}

/* ---- Lightbox ---- */
.sp-lightbox {
    position: fixed; inset: 0; z-index: 9999;
    background: rgba(0,0,0,.94); display: flex; align-items: center; justify-content: center;
}
.sp-lightbox[hidden] { display: none; }
.sp-lb-stage { max-width: 92vw; display: flex; flex-direction: column; align-items: center; }
.sp-lb-img { max-width: 100%; max-height: 82vh; object-fit: contain; border-radius: var(--radius); display: block; }
.sp-lb-counter { color: rgba(255,255,255,.55); font-size: .8rem; margin-top: .65rem; }
.sp-lb-close {
    position: fixed; top: 1.25rem; right: 1.25rem;
    width: 44px; height: 44px; border-radius: 50%; border: none; cursor: pointer;
    background: rgba(255,255,255,.15); backdrop-filter: blur(8px); color: #fff;
    display: flex; align-items: center; justify-content: center; transition: background .2s;
}
.sp-lb-close:hover { background: rgba(255,255,255,.28); }
.sp-lb-nav {
    position: fixed; top: 50%; transform: translateY(-50%);
    width: 50px; height: 50px; border-radius: 50%; border: none; cursor: pointer;
    background: rgba(255,255,255,.15); backdrop-filter: blur(8px); color: #fff;
    display: flex; align-items: center; justify-content: center; transition: background .2s;
}
.sp-lb-nav:hover { background: rgba(255,255,255,.28); }
.sp-lb-prev { left: 1.25rem; }
.sp-lb-next { right: 1.25rem; }

/* ---- Mini form shared ---- */
.mini-input {
    width: 100%; padding: .6rem .75rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); margin-bottom: .5rem; font-size: .85rem;
    background: var(--surface); transition: border-color .2s; font-family: var(--font-body);
    box-sizing: border-box;
}
.mini-input:focus { border-color: var(--accent); outline: none; }
textarea.mini-input { resize: vertical; }
.btn-sm { padding: .5rem 1rem; font-size: .82rem; }

/* ---- Mortgage Calculator ---- */
.calc-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-md); margin-bottom: var(--space-lg); }
.calc-field label { display: block; font-size: .75rem; font-weight: 600; color: var(--ink-muted); text-transform: uppercase; letter-spacing: .06em; margin-bottom: .3rem; }
.calc-field input, .calc-field select {
    width: 100%; padding: .6rem .75rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); font-size: .9rem; background: var(--surface-card);
}
.calc-field input:focus, .calc-field select:focus { border-color: var(--accent); outline: none; }
.calc-result { display: flex; flex-direction: column; gap: .5rem; }
.calc-result-item { display: flex; justify-content: space-between; align-items: center; padding: .5rem 0; }
.calc-result-item + .calc-result-item { border-top: 1px solid var(--border); }
.calc-label { font-size: .85rem; color: var(--ink-secondary); }
.calc-value { font-weight: 700; color: var(--ink); font-family: var(--font-display); }
.calc-result-main { background: var(--accent-light); margin: .5rem -.75rem -.25rem; padding: .75rem; border-radius: var(--radius); }
.calc-result-main .calc-value { color: var(--accent); font-size: 1.2rem; }
.calc-disclaimer { font-size: .72rem; color: var(--ink-muted); margin-top: var(--space-sm); }

/* --- Stats Bar --- */
.stats-bar { padding: var(--space-xl) 0; background: var(--surface-card); border-bottom: 1px solid var(--border); }
.stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-lg); text-align: center; }
.stat-item { }
.stat-number {
    display: block; font-family: var(--font-display);
    font-size: clamp(1.5rem, 3vw, 2rem); font-weight: 700;
    color: var(--ink); letter-spacing: -.02em;
}
.stat-label { font-size: .8rem; color: var(--ink-muted); margin-top: .15rem; }

/* --- Para los que buscan: cards INMERSIVAS con foto real (v2 tras el
   "más feo no lo pudiste hacer" de Mike). Foto de propiedad de fondo con zoom
   al hover, scrim cinematográfico, chips glass y CTA blanco sobre foto.
   Banda-foto: texto SIEMPRE claro fijo, igual en ambos temas. ------------- */
.para-buscadores { padding: var(--space-3xl) 0 var(--space-2xl); background: var(--surface); }
.pb-head { text-align: center; margin-bottom: var(--space-xl); }
.pb-titulo {
    font-family: var(--font-display);
    font-size: clamp(1.8rem, 3.4vw, 2.7rem);
    font-weight: 800; line-height: 1.12; letter-spacing: -.02em;
    color: var(--ink); margin-top: .4rem;
}
.pb-titulo span { color: var(--accent); }
/* La palabra rota con el mecanismo del hero (1.61.5) pero conserva el celeste y va sin sombra:
   aquí está sobre superficie, no sobre el mapa. */
.pb-titulo .rotating-word { color: var(--accent); text-shadow: none; }
/* Cuatro tarjetas desde 1.62.0 (Comprar · Rentar · Traspasos · Vender): 4 en fila en TODO
   escritorio (≥1025, Mike 1.62.2: «en desktop quiero 4 columnas»), una columna en ≤1024 (regla
   de abajo). Con tarjetas de 230–300px el cuerpo escala con el ancho — ver el bloque ≥1025 al
   FINAL de la sección (misma especificidad que las reglas base → va después, trampa #7). */
.pb-grid {
    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: var(--space-md);
}
.pb-card {
    position: relative; overflow: hidden; border-radius: 22px;
    min-height: 460px; display: flex; align-items: flex-end;
    text-decoration: none; isolation: isolate;
    box-shadow: 0 18px 44px rgba(6,10,16,.25);
    transition: transform .3s ease, box-shadow .3s ease;
}
.pb-card::before {
    content: ''; position: absolute; inset: 0; z-index: -2;
    background-image: var(--pb-foto);
    background-size: cover; background-position: center;
    transition: transform .6s cubic-bezier(.22,.8,.26,1);
}
.pb-card:hover { transform: translateY(-5px); box-shadow: 0 28px 60px rgba(6,10,16,.4); }
.pb-card:hover::before { transform: scale(1.07); }
.pb-scrim {
    position: absolute; inset: 0; z-index: -1;
    background: linear-gradient(180deg, rgba(6,10,16,.05) 30%, rgba(6,10,16,.62) 62%, rgba(6,10,16,.94) 100%);
}
.pb-body { padding: clamp(1.4rem, 3vw, 2.2rem); width: 100%; }
.pb-kicker {
    display: inline-block; padding: .35rem .9rem; border-radius: 999px;
    background: var(--accent); color: #fff;
    font-size: .72rem; font-weight: 800; letter-spacing: .09em; text-transform: uppercase;
    margin-bottom: .8rem;
}
.pb-kicker--renta { background: #8b5cf6; }
.pb-kicker--vender { background: #16a34a; }
.pb-kicker--traspaso { background: #f59e0b; color: #1a1a2e; }   /* ámbar: distinto del azul/violeta/verde */
.pb-card h3 {
    color: #fff; font-size: clamp(1.45rem, 2.4vw, 1.9rem);
    font-weight: 800; letter-spacing: -.01em; margin-bottom: .5rem;
    text-shadow: 0 2px 12px rgba(0,0,0,.35);
}
.pb-card p {
    color: rgba(255,255,255,.88); line-height: 1.6; font-size: .95rem;
    max-width: 46ch; margin-bottom: .95rem;
    text-shadow: 0 1px 8px rgba(0,0,0,.3);
}
.pb-chips { display: flex; flex-wrap: wrap; gap: .45rem; margin-bottom: 1.15rem; }
.pb-chips span {
    padding: .38rem .8rem; border-radius: 999px;
    background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.28);
    backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
    color: #fff; font-size: .78rem; font-weight: 600; white-space: nowrap;
}
.pb-cta {
    display: inline-flex; align-items: center; gap: .5rem;
    background: #fff; color: #0b2545;
    padding: .8rem 1.5rem; border-radius: 999px;
    font-weight: 700; font-size: .92rem;
    transition: gap .2s ease, background .2s ease, color .2s ease;
}
/* Hover OPACO (1.61.4): la píldora blanca se vuelve acento con texto blanco. Antes era
   `--accent-light`, que en oscuro es rgba al 12 % — sobre la foto quedaba una pastilla fantasma
   con el texto perdido (6.ª vez de la misma trampa: un hover que sustituye un fondo opaco
   sobre foto/mapa va con color opaco, nunca con un tinte). */
.pb-card:hover .pb-cta { gap: .85rem; background: var(--accent); color: #fff; }
.pb-flecha { font-size: 1.05rem; line-height: 1; }
/* Cuatro en fila en todo escritorio (≥1025, tarjetas de ~230px a 1025 y ~272px desde 1280): el
   cuerpo escala con el ancho de la ventana. Va DESPUÉS de las reglas base a propósito (misma
   especificidad, trampa #7).
   Bloques parejos entre las cuatro (1.62.1, Mike: «que queden alineadas, toma Comprar y Vender
   de referencia»): el contenido va anclado al fondo, así que cada bloque reserva su alto —título
   2 renglones, texto 4, chips 2 filas— y además se RECORTA a esos renglones (line-clamp) para que
   a 1025 un texto no crezca a 5 y desalinee; kicker, título, texto, chips y botón arrancan a la
   misma altura en las cuatro tarjetas. */
@media (min-width: 1025px) {
    .pb-body { padding: clamp(1.1rem, 1.7vw, 1.5rem); }
    .pb-card h3 {
        font-size: clamp(1.2rem, 1.6vw, 1.5rem); min-height: 2lh;
        display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    }
    .pb-card p {
        font-size: clamp(.82rem, 1vw, .9rem); min-height: 4lh; max-width: none;
        display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;
    }
    .pb-chips { min-height: 69px; align-content: flex-start; }   /* 2 filas de ~31px + gap */
    .pb-chips span { padding: .3rem .55rem; font-size: clamp(.68rem, .8vw, .74rem); }
    .pb-cta { padding: .65rem .9rem; font-size: clamp(.75rem, .85vw, .85rem); white-space: nowrap; }
}
/* Etiqueta corta del CTA: solo en el celular (abajo). */
.pb-cta__corto { display: none; }
/* Tablet (769–1024): 2 columnas con el contenido completo (tarjetas de ~350px). */
@media (max-width: 1024px) {
    .pb-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-md); }
    .pb-card { min-height: 380px; }
}
/* Celular (≤768): 2×2 (Mike, 1.62.3: «para móvil sí queremos 2 columnas»). A 390px cada tarjeta
   mide ~167px: la tarjeta se vuelve un mosaico compacto —foto, kicker, título y botón—; el
   párrafo y los chips no caben y se esconden, y el botón usa su etiqueta corta. El título reserva
   3 renglones para que las cuatro arranquen parejas. */
@media (max-width: 768px) {
    .pb-grid { gap: .75rem; }
    .pb-card { min-height: 236px; border-radius: 16px; }
    .pb-body { padding: .85rem; }
    .pb-kicker { font-size: .6rem; padding: .26rem .55rem; margin-bottom: .5rem; letter-spacing: .07em; }
    .pb-card h3 {
        font-size: 1rem; line-height: 1.2; margin-bottom: .65rem; min-height: 3lh;
        display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
    }
    .pb-card p, .pb-chips, .pb-cta__largo { display: none; }
    .pb-cta__corto { display: inline; }
    .pb-cta { padding: .55rem .85rem; font-size: .78rem; gap: .35rem; white-space: nowrap; }
}

/* --- Why Us --- */
.why-us { padding: var(--space-3xl) 0; background: var(--surface); }
.why-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-lg); margin-top: var(--space-lg); }
.why-card { padding: var(--space-lg); background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-lg); }
.why-icon { width: 40px; height: 40px; color: var(--accent); margin-bottom: var(--space-sm); }
.why-icon svg { width: 100%; height: 100%; }
.why-card h3 { font-family: var(--font-body); font-size: .95rem; font-weight: 600; color: var(--ink); margin-bottom: .4rem; }
.why-card p { font-size: .85rem; color: var(--ink-muted); line-height: 1.6; }

/* --- EL SISTEMA DEL ASESOR (portada) ---------------------------------------
   El aparador del producto real: sustituye al why-us genérico en front-page
   (las clases .why-* se quedan — el slider legado aún las usa). Todo por
   tokens: voltea solo con el tema. Las pastillas Antes/Después van FIJAS
   claras (regla del tema: lo que flota sobre foto no se tiñe). */
.sistema-asesor { padding: var(--space-3xl) 0; background: var(--surface-warm); }
.sa-sub { color: var(--ink-muted); margin-top: .5rem; max-width: 46ch; }
.sa-grid {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-lg); margin-top: var(--space-xl);
}
.sa-card {
    background: var(--surface-card); border: 1px solid var(--border);
    border-radius: var(--radius-lg); padding: var(--space-lg);
    display: flex; flex-direction: column; min-width: 0;
    transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.sa-card:hover { transform: translateY(-3px); border-color: var(--accent-subtle); box-shadow: 0 12px 28px rgba(11,37,69,.10); }
.sa-icon {
    width: 44px; height: 44px; border-radius: 11px;
    background: var(--accent-light); color: var(--accent);
    display: grid; place-items: center; margin-bottom: var(--space-sm);
}
.sa-icon svg { width: 23px; height: 23px; }
.sa-card h3 { font-family: var(--font-body); font-size: 1rem; font-weight: 700; color: var(--ink); margin-bottom: .45rem; }
.sa-card p { font-size: .875rem; color: var(--ink-muted); line-height: 1.65; }
.sa-card p strong { color: var(--ink-secondary); }
.sa-dato {
    margin-top: auto; padding-top: .7rem;
    font-weight: 600; color: var(--accent) !important; font-size: .8rem !important;
}
/* La card estrella: el antes/después REAL del Estudio, foto arriba a sangre */
.sa-card--estudio { grid-column: span 2; padding: 0; overflow: hidden; }
.sa-card--estudio .sa-card-body { padding: var(--space-lg); }
.sa-antes-despues { display: grid; grid-template-columns: 1fr 1fr; gap: 2px; background: var(--border); }
.sa-ad-half {
    position: relative; margin: 0; aspect-ratio: 16 / 9;
    background-size: cover; background-position: center;
}
/* Banda de cierre a lo ancho: icono a la izquierda, texto corrido */
.sa-card--wide {
    grid-column: 1 / -1;
    flex-direction: row; align-items: center; gap: var(--space-md);
}
.sa-card--wide .sa-icon { margin-bottom: 0; flex: 0 0 auto; }
.sa-card--wide p { max-width: 72ch; }
.sa-ad-half figcaption {
    position: absolute; left: .6rem; bottom: .6rem;
    background: rgba(255,255,255,.92); color: #0b2545;
    font-size: .7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
    padding: .22rem .55rem; border-radius: 999px;
}
.sa-ad-half + .sa-ad-half figcaption { background: var(--accent); color: #fff; }
.sa-cta {
    margin-top: var(--space-xl);
    display: flex; align-items: center; justify-content: center; gap: var(--space-lg); flex-wrap: wrap;
}
.sa-cta-link { color: var(--accent); font-weight: 600; font-size: .92rem; }
.sa-cta-link:hover { color: var(--accent-hover); }
@media (max-width: 1024px) {
    .sa-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
    .sa-grid { grid-template-columns: 1fr; }
    .sa-card--estudio { grid-column: auto; }
}

/* --- LA TARJETA — hero del producto (calco estructural del hero de a9ent.co,
   pedido de Mike 2026-08-13). Banda OSCURA AUTOCONTENIDA: colores explícitos,
   idéntica en tema claro y oscuro (misma regla que lo que flota sobre foto).
   El teléfono enseña la tarjeta REAL de Laura; las mini-cards son propiedades
   reales de la base. ------------------------------------------------------ */
.tarjeta-hero {
    background:
        radial-gradient(900px 480px at 82% 18%, rgba(30,160,229,.14), transparent 60%),
        linear-gradient(160deg, #0a0f16 0%, #0d141f 55%, #0a1018 100%);
    padding: var(--space-3xl) 0;
    overflow: hidden;
}
.th-grid {
    display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
    gap: var(--space-2xl); align-items: center;
}
.th-pill {
    display: inline-flex; align-items: center; gap: .45rem;
    padding: .45rem 1rem; border-radius: 999px;
    background: rgba(30,160,229,.10); border: 1px solid rgba(30,160,229,.45);
    color: #cfe9f9; font-size: .82rem; font-weight: 500;
}
.th-titulo {
    margin: 1.1rem 0 1rem;
    font-size: clamp(1.9rem, 3.6vw, 3rem);
    line-height: 1.12; font-weight: 800; letter-spacing: -.02em;
    color: var(--accent);
}
.th-lead { color: #b9c3d0; font-size: 1.02rem; line-height: 1.65; max-width: 56ch; }
.th-opciones {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-md); margin-top: var(--space-xl);
}
.th-opcion {
    display: flex; align-items: flex-start; gap: .85rem; text-align: left;
    background: rgba(255,255,255,.035); cursor: pointer;
    border: 1px solid rgba(255,255,255,.10); border-radius: 16px;
    padding: 1.1rem; font: inherit; min-width: 0;
    transition: transform .18s ease, border-color .18s ease, background .18s ease;
}
.th-opcion:hover { transform: translateY(-3px); background: rgba(255,255,255,.055); }
button.th-opcion:hover, .th-opcion:first-child:hover { border-color: rgba(30,160,229,.6); }
a.th-opcion:hover { border-color: rgba(139,92,246,.6); }
.th-opcion-icono {
    flex: 0 0 auto; width: 44px; height: 44px; border-radius: 11px;
    display: grid; place-items: center;
}
.th-opcion-icono svg { width: 22px; height: 22px; }
.th-opcion-icono--azul   { background: rgba(30,160,229,.16);  color: #4db8ee; }
.th-opcion-icono--morado { background: rgba(139,92,246,.16); color: #a78bfa; }
.th-opcion-body { min-width: 0; }
.th-opcion-body strong { display: block; color: #fff; font-size: .98rem; margin-bottom: .3rem; }
.th-opcion-body span { color: #9aa6b5; font-size: .82rem; line-height: 1.55; }
.th-opcion-flecha {
    margin-left: auto; flex: 0 0 auto; align-self: flex-end;
    width: 34px; height: 34px; border-radius: 50%;
    display: grid; place-items: center; font-size: 1rem; color: #fff;
}
.th-opcion-flecha--azul   { background: var(--accent); }
.th-opcion-flecha--morado { background: #8b5cf6; }
.th-nota {
    display: flex; align-items: center; gap: .5rem;
    margin-top: var(--space-lg); color: #8d99a8; font-size: .84rem;
}
/* El carrusel de tarjetas VIVAS (dibujo de Mike): la activa al centro con
   marco de teléfono; las vecinas — que vienen y se van — a los lados, más
   chicas y atenuadas. Cada slot es un iframe REAL de /{slug} escalado. */
.th-visual { position: relative; justify-self: center; width: 100%; }
.th-carrusel {
    position: relative; height: 500px;
    /* ADAPTABLE (pedido de Mike: "que se adapte a la columna para no estarle
       moviendo"): container queries — las laterales se calculan contra el ancho
       REAL de la columna. --th-off = del centro al borde menos la mitad de la
       lateral escalada (87px) menos 12px de aire. clamp: nunca se encimam de
       más (piso 40px) ni se despegan de la frontal (techo 249px = expuesta
       completa junto a la activa, para columnas anchísimas como tablet 1-col). */
    container-type: inline-size;
    --th-off: clamp(34px, calc(50cqw - 79px), 194px);
}
.th-slot {
    position: absolute; top: 50%; left: 50%;
    width: 230px; height: 477px;           /* compacto: abajo vive el desktop */
    margin: -239px 0 0 -115px;             /* centrado sin tocar transform */
    border-radius: 44px; border: 9px solid #232b38; background: #232b38;
    box-shadow: 0 40px 90px rgba(0,0,0,.55), 0 0 0 1px rgba(255,255,255,.06);
    overflow: hidden;
    transition: transform .8s cubic-bezier(.22,.8,.26,1), opacity .8s ease;
    will-change: transform, opacity;
}
.th-slot iframe {
    width: 390px; height: 844px; border: 0;
    transform: scale(.5436); transform-origin: 0 0;   /* 212/390: llena el marco */
    border-radius: 26px; pointer-events: none; background: #0d1420;
}
.th-slot.is-active { transform: none; opacity: 1; z-index: 3; }
/* Las laterales se pegan SOLAS al borde de su columna (--th-off, arriba):
   máxima exposición posible sin salirse, en cualquier ancho. */
.th-slot.is-left   { transform: translateX(calc(-1 * var(--th-off))) scale(.58); opacity: .35; z-index: 2; }
.th-slot.is-right  { transform: translateX(var(--th-off)) scale(.58); opacity: .35; z-index: 2; }
.th-slot.is-off    { transform: scale(.45); opacity: 0; z-index: 1; pointer-events: none; }
/* Arrastrable: el visitante también las gira con la mano */
.th-carrusel { cursor: grab; touch-action: pan-y; user-select: none; }
.th-carrusel.is-drag { cursor: grabbing; }
.th-carrusel.is-drag .th-slot { transition: none; }
/* Respaldo sin agentes públicos: el teléfono estático con la captura real */
.th-phone {
    width: min(300px, 72vw); border-radius: 44px;
    border: 9px solid #232b38; background: #232b38;
    box-shadow: 0 40px 90px rgba(0,0,0,.55), 0 0 0 1px rgba(255,255,255,.06);
    overflow: hidden; position: relative; z-index: 2; margin: 0 auto;
}
.th-phone img { display: block; width: 100%; height: auto; border-radius: 34px; }
/* La versión DESKTOP de la tarjeta del frente, en marco de navegador, abajo
   del abanico y SINCRONIZADA con él (crossfade). El scale del iframe de 1200
   lo pone el JS contra el ancho real del marco. */
.th-desktop {
    margin-top: 16px;
    border: 1px solid rgba(255,255,255,.10); border-radius: 12px;
    background: #0f1520; overflow: hidden;
    box-shadow: 0 24px 60px rgba(0,0,0,.45);
}
.th-desk-chrome {
    height: 28px; display: flex; align-items: center; gap: 6px;
    padding: 0 12px; background: #161d29;
    border-bottom: 1px solid rgba(255,255,255,.07);
}
.th-desk-chrome span { width: 9px; height: 9px; border-radius: 50%; background: #3a4556; }
.th-desk-chrome span:first-child { background: #e0655a; }
.th-desk-chrome span:nth-child(2) { background: #e0b25a; }
.th-desk-chrome span:nth-child(3) { background: #58bf6f; }
/* El alto lo reserva la proporción del iframe (1200×750) desde el primer pintado. El JS que escala el iframe
   (portada.js) va al pie desde 1.65.2; sin esto el marco medía 0 hasta que corría y empujaba lo de abajo. */
.th-desk-viewport { position: relative; overflow: hidden; aspect-ratio: 1200 / 750; }
.th-desk-slot { position: absolute; inset: 0; opacity: 0; transition: opacity .8s ease; }
.th-desk-slot.is-active { opacity: 1; }
.th-desk-slot iframe {
    width: 1200px; height: 750px; border: 0;
    transform-origin: 0 0; pointer-events: none; background: #0d1420;
}
@media (max-width: 1024px) {
    .th-grid { grid-template-columns: 1fr; gap: var(--space-xl); }
    .th-visual { margin-top: var(--space-md); }
}
@media (max-width: 640px) {
    .th-opciones { grid-template-columns: 1fr; }
    /* Sin reglas de carrusel aquí: --th-off es adaptable (cqw) y el abanico
       se acomoda solo a la columna del teléfono — misma composición. */
}

/* --- Blog Section --- */
.blog-section { padding: var(--space-3xl) 0; background: var(--surface-warm); }
/* Cuatro recursos (1.62.4, Mike): 4 en fila en escritorio, 2×2 en tablet (≤1024) y en el celular
   (≤768, regla al final del archivo — misma especificidad, va después). */
.blog-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-lg); margin-top: var(--space-lg); }
.blog-card {
    background: var(--surface-card); border: 1px solid var(--border);
    border-radius: var(--radius-lg); overflow: hidden; transition: all .25s;
    display: block; text-decoration: none; color: var(--ink-secondary);
}
.blog-card:hover { box-shadow: var(--shadow-md); transform: translateY(-3px); }
.blog-image { aspect-ratio: 16/10; overflow: hidden; background: var(--surface-warm); }
.blog-image img { width: 100%; height: 100%; object-fit: cover; }
.blog-image-placeholder { width: 100%; height: 100%; background: linear-gradient(145deg, var(--surface-warm), var(--border)); }
.blog-info { padding: var(--space-md) var(--space-lg) var(--space-lg); }
.blog-date { font-size: .72rem; color: var(--ink-muted); text-transform: uppercase; letter-spacing: .06em; font-weight: 600; }
.blog-info h3 { font-family: var(--font-display); font-size: 1rem; font-weight: 600; color: var(--ink); margin: .4rem 0; line-height: 1.3; }
.blog-info p { font-size: .85rem; color: var(--ink-muted); line-height: 1.5; }

/* --- Newsletter --- */
.newsletter { padding: var(--space-2xl) 0; }
.newsletter-inner {
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-xl);
    padding: var(--space-xl); background: var(--surface-card);
    border: 1px solid var(--border); border-radius: var(--radius-lg);
}
.newsletter-text h2 { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; color: var(--ink); letter-spacing: -.02em; }
.newsletter-text p { font-size: .88rem; color: var(--ink-muted); margin-top: .3rem; }
.newsletter-form { display: flex; gap: .5rem; flex-shrink: 0; }
.newsletter-form input {
    padding: .75rem 1rem; border: 1.5px solid var(--border); border-radius: var(--radius);
    width: 280px; font-size: .9rem; background: var(--surface);
}
.newsletter-form input:focus { border-color: var(--accent); outline: none; }

/* --- Card Favorite & Photo Count --- */
/* El corazón es un LIKE (1.47.0): con likes ≥ 1 la bolita se vuelve píldora y
   enseña el numerito (prueba social). Es VIDRIO SOBRE FOTO: blanco en los dos
   temas, así que la tinta va con `--on-glass` y no con `--ink-muted` — en oscuro
   ese token se vuelve claro y el corazón se esfumaba sobre el blanco (trampa #2). */
.card-favorite {
    position: absolute; top: .6rem; right: .6rem; z-index: 2;
    height: 34px; min-width: 34px; border-radius: 17px;
    padding: 0;
    background: rgba(255,255,255,.9); border: none; cursor: pointer;
    display: flex; align-items: center; justify-content: center; gap: .3rem;
    transition: all .2s; color: var(--on-glass);
    backdrop-filter: blur(4px);
}
.card-favorite.has-likes { padding: 0 .65rem 0 .55rem; }
.card-favorite:hover { background: #fff; color: var(--venta); }
.card-favorite.active { color: var(--venta); }
.card-favorite.active svg { fill: var(--venta); }
.card-likes { font-size: .76rem; font-weight: 700; line-height: 1; color: inherit; }
.card-likes[hidden] { display: none; }
.card-photo-count {
    position: absolute; bottom: .6rem; left: .6rem;
    display: inline-flex; align-items: center; gap: .25rem;
    padding: .25rem .55rem; background: rgba(28,25,23,.7);
    color: #fff; border-radius: var(--radius-sm); font-size: .72rem;
    font-weight: 500; backdrop-filter: blur(4px);
}
.property-price-m2 { display: block; font-size: .78rem; color: var(--ink-muted); margin-bottom: .3rem; }
.property-meta-bottom {
    display: flex; justify-content: space-between; align-items: center;
}
.property-age { font-size: .72rem; color: var(--ink-muted); }

/* --- Nav user (header) --- */

/* --- Listing Toolbar --- */
.listing-toolbar {
    display: flex; justify-content: space-between; align-items: center;
    margin-bottom: var(--space-md); padding-bottom: var(--space-sm);
    border-bottom: 1px solid var(--border);
}
.toolbar-left { display: flex; align-items: center; gap: .5rem; }
.toolbar-right { display: flex; align-items: center; gap: .75rem; }
.save-search-btn { font-size: .82rem; }
.view-toggles { display: flex; gap: .25rem; }
.view-toggle {
    width: 34px; height: 34px; border: 1px solid var(--border);
    border-radius: var(--radius); background: var(--surface-card);
    display: flex; align-items: center; justify-content: center;
    cursor: pointer; color: var(--ink-muted); transition: all .2s;
}
.view-toggle:hover { border-color: var(--ink-muted); }
.view-toggle.active { background: var(--inverse-bg); color: var(--inverse-ink); border-color: var(--inverse-bg); }
.sort-select {
    padding: .5rem .75rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); background: var(--surface-card);
    font-size: .85rem; color: var(--ink-secondary);
}

/* --- Footer Social --- */
.footer-social { display: flex; gap: .5rem; margin-top: var(--space-md); }
.footer-social a {
    width: 36px; height: 36px; border-radius: 50%;
    background: rgba(255,255,255,.08); color: rgba(255,255,255,.5);
    display: flex; align-items: center; justify-content: center;
    transition: all .2s;
}
.footer-social a:hover { background: var(--accent); color: #fff; }
.footer-app-badges { display: flex; gap: .5rem; margin-top: var(--space-md); }
.app-badge { transition: opacity .2s; }
.app-badge:hover { opacity: .8; }

/* --- Footer SEO --- */
.footer-seo {
    padding: var(--space-lg) 0; margin-bottom: var(--space-lg);
    border-top: 1px solid rgba(255,255,255,.08);
    border-bottom: 1px solid rgba(255,255,255,.08);
}
.footer-seo h4 {
    font-family: var(--font-body); color: rgba(255,255,255,.6);
    font-size: .72rem; text-transform: uppercase; letter-spacing: .08em;
    margin-bottom: var(--space-sm); font-weight: 600;
}
.seo-links { display: flex; flex-wrap: wrap; gap: .35rem; }
.seo-links a {
    font-size: .75rem; color: rgba(255,255,255,.35);
    padding: .2rem .5rem; border: 1px solid rgba(255,255,255,.08);
    border-radius: var(--radius-sm); transition: all .2s;
}
.seo-links a:hover { color: var(--accent); border-color: rgba(194,118,46,.3); }

/* --- Similar Properties --- */
.similar-properties {
    margin-top: var(--space-3xl); padding-top: var(--space-xl);
    border-top: 1px solid var(--border);
}
.similar-properties h2 {
    font-family: var(--font-display);
    font-size: 1.4rem; font-weight: 700;
    margin-bottom: var(--space-lg); letter-spacing: -.02em;
}

/* --- Contact Page --- */
.contact-page { padding: var(--space-2xl) 0 var(--space-3xl); }
.contact-page h1 {
    font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 700;
    margin-bottom: var(--space-xl); letter-spacing: -.02em;
}
.contact-layout { display: grid; grid-template-columns: 1fr 320px; gap: var(--space-2xl); }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-md); }
.form-group { margin-bottom: var(--space-lg); }
.form-group label {
    display: block; font-weight: 600; font-size: .82rem;
    color: var(--ink); margin-bottom: .35rem;
}
.form-group input, .form-group select, .form-group textarea {
    width: 100%; padding: .75rem .9rem; border: 1.5px solid var(--border);
    border-radius: var(--radius); transition: all .2s;
    background: var(--surface-card); font-size: .9rem;
}
.form-group input:focus, .form-group select:focus, .form-group textarea:focus {
    outline: none; border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-light);
}
.contact-info { align-self: start; }
.info-item {
    margin-bottom: var(--space-lg);
    padding-bottom: var(--space-lg);
    border-bottom: 1px solid var(--border);
}
.info-item:last-child { border-bottom: none; }
.info-item h3 {
    font-family: var(--font-body);
    font-size: .8rem; font-weight: 600; color: var(--ink-muted);
    text-transform: uppercase; letter-spacing: .06em;
    margin-bottom: .3rem;
}
.info-item p { color: var(--ink); font-weight: 500; }

/* --- Nav user menu --- */
.nav-user { position: relative; }
.nav-user-btn {
    display: flex; align-items: center; gap: .45rem;
    padding: .4rem .6rem .4rem .4rem;
    border: 1.5px solid var(--border); border-radius: 999px;
    background: var(--surface-card); cursor: pointer;
    font-family: var(--font-body); font-size: .85rem;
    color: var(--ink-secondary); transition: border-color .18s var(--ease-out-quart);
}
.nav-user-btn:hover { border-color: var(--accent); }
.nav-user-avatar {
    width: 28px; height: 28px; border-radius: 50%;
    background: var(--accent); color: #fff;
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: .8rem; flex-shrink: 0;
}
.nav-user-avatar--img { object-fit: cover; padding: 0; }
.nav-user-name { font-weight: 500; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nav-user-caret {
    color: var(--ink-muted);
    transition: transform .2s var(--ease-out-quart);
    flex-shrink: 0;
}
.nav-user:hover .nav-user-caret { transform: rotate(180deg); }
.nav-user-dropdown__head {
    padding: .6rem .75rem .5rem;
    border-bottom: 1px solid var(--border);
    margin-bottom: .25rem;
    display: flex; flex-direction: column; gap: 2px;
}
.nav-user-dropdown__head strong {
    font-size: .9rem;
    color: var(--ink);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nav-user-dropdown__head span {
    font-size: .75rem;
    color: var(--ink-muted);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nav-user-dropdown {
    position: absolute; top: calc(100% + .5rem); right: 0;
    min-width: 200px; background: var(--surface-card);
    border: 1px solid var(--border); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg); padding: .4rem;
    opacity: 0; visibility: hidden; transform: translateY(-6px);
    transition: opacity .2s var(--ease-out-quart), transform .2s var(--ease-out-quart), visibility .2s;
    z-index: 200;
}
.nav-user:hover .nav-user-dropdown,
.nav-user-btn:focus + .nav-user-dropdown {
    opacity: 1; visibility: visible; transform: translateY(0);
}
.nav-user-dropdown a {
    display: flex; align-items: center; gap: .6rem;
    padding: .6rem .75rem; border-radius: var(--radius);
    font-size: .875rem; color: var(--ink-secondary);
    transition: background .15s var(--ease-out-quart), color .15s;
}
.nav-user-dropdown a:hover { background: var(--surface-warm); color: var(--ink); }
.dropdown-divider { height: 1px; background: var(--border); margin: .35rem .25rem; }
.dropdown-logout { color: var(--venta) !important; }
.dropdown-logout:hover { background: var(--venta-bg) !important; }

/* --- Auth Modal --- */
.auth-overlay {
    position: fixed; inset: 0; z-index: 1000;
    background: rgba(28,25,23,.55);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    display: flex; align-items: center; justify-content: center;
    overflow-y: auto;
    padding: 1.25rem 1rem;
    opacity: 0; visibility: hidden;
    transition: opacity .28s var(--ease-out-quart), visibility .28s;
}
.auth-overlay.open {
    opacity: 1; visibility: visible;
}
.auth-modal {
    background: var(--surface-card);
    border-radius: var(--radius-lg);
    padding: clamp(1.75rem, 5vw, 2.5rem);
    width: 100%; max-width: 420px;
    margin: auto;
    position: relative;
    box-shadow: var(--shadow-lg);
    transform: translateY(12px) scale(.97);
    transition: transform .3s var(--ease-out-expo);
}
.auth-overlay.open .auth-modal {
    transform: translateY(0) scale(1);
}
.auth-close {
    position: absolute; top: 1rem; right: 1rem;
    width: 32px; height: 32px; border-radius: 50%;
    background: var(--surface-warm); border: none; cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    color: var(--ink-muted); transition: background .15s, color .15s;
}
.auth-close:hover { background: var(--border); color: var(--ink); }
.auth-logo {
    display: flex; align-items: center; justify-content: center; gap: .6rem;
    margin-bottom: 1.5rem;
}
.auth-logo .logo-icon { display: inline-flex; }
.auth-logo .logo-text {
    font-family: var(--font-display, var(--font-body));
    font-weight: 800;
    font-size: 1.25rem;
    letter-spacing: 0.5px;
    color: var(--ink);
}
.auth-logo img { max-height: 44px; width: auto; }

/* Invitación desde ARRIBA (1.46.0) — decisión de Mike: el modal se queda como
   estaba; lo que reconoce la acción interrumpida (corazón, campanita) es una
   tarjeta que BAJA del borde superior con el mensaje y "Crear cuenta" → modal.
   Flota sobre todo (z 900: encima del header 100, debajo del overlay 1000),
   así que va con SUPERFICIE (`--surface-card`), no con tinte — la regla del
   panel que flota. El `[hidden]` explícito: un `display` de clase le gana al
   atributo (ya pasó con el badge). El tinte del ícono sí es correcto: vive
   sobre la superficie de su propia tarjeta. */
.invite-banner {
    /* Bajo el header (sticky, siempre a la vista): encima tapaba el nav y la
       propia píldora "Crear cuenta". `--header-h` es 0 en la tarjeta del
       asesor (sin header) → ahí pega al borde, sin caso especial. */
    position: fixed; top: calc(var(--header-h) + .75rem); left: 0; right: 0; z-index: 900;
    display: flex; justify-content: center;
    padding: 0 1rem;
    pointer-events: none;
}
.invite-banner[hidden] { display: none; }
.invite-banner__card {
    pointer-events: auto;
    position: relative;
    display: flex; align-items: center; gap: .9rem;
    width: 100%; max-width: 580px;
    padding: .95rem 2.4rem .95rem 1.1rem;
    background: var(--surface-card);
    color: var(--ink);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    transform: translateY(calc(-100% - 1.5rem));
    opacity: 0;
    transition: transform .45s var(--ease-out-expo), opacity .3s;
}
.invite-banner.is-open .invite-banner__card { transform: none; opacity: 1; }
.invite-banner__icon {
    flex-shrink: 0; width: 42px; height: 42px; border-radius: 50%;
    display: grid; place-items: center;
    background: var(--accent-light); color: var(--accent);
}
.invite-banner__icon svg { width: 20px; height: 20px; }
.invite-banner__body { flex: 1; min-width: 0; }
.invite-banner__title {
    font-family: var(--font-display); font-weight: 700; font-size: .98rem;
    letter-spacing: -.01em; margin-bottom: .15rem;
}
.invite-banner__text { font-size: .83rem; line-height: 1.45; color: var(--ink-secondary); }
.invite-banner__text strong { color: var(--ink); font-weight: 600; }
.invite-banner__actions { display: flex; flex-direction: column; align-items: center; gap: .3rem; flex-shrink: 0; }
.invite-banner__cta {
    padding: .5rem 1.05rem; font-size: .82rem; border-radius: 50px;
    margin-top: 0; white-space: nowrap;
}
.invite-banner__alt {
    background: none; border: none; cursor: pointer; padding: 0;
    font-family: var(--font-body); font-size: .75rem; color: var(--ink-muted);
    text-decoration: underline; text-underline-offset: 2px;
}
.invite-banner__alt:hover { color: var(--accent); }
.invite-banner__close {
    position: absolute; top: .5rem; right: .5rem;
    width: 26px; height: 26px; border-radius: 50%;
    background: transparent; border: none; cursor: pointer;
    display: grid; place-items: center;
    color: var(--ink-muted);
    transition: background .15s, color .15s;
}
.invite-banner__close:hover { background: var(--surface-warm); color: var(--ink); }
@media (max-width: 768px) {
    .invite-banner { top: calc(var(--header-h) + .5rem); padding: 0 .6rem; }
    .invite-banner__card { flex-wrap: wrap; gap: .7rem .8rem; padding: .85rem 2.2rem .85rem .9rem; }
    /* Las acciones bajan a su propia fila, alineadas con el texto (no con el ícono) */
    .invite-banner__actions { flex-direction: row; align-items: center; gap: .9rem; width: 100%; padding-left: calc(42px + .8rem); }
}
@media (prefers-reduced-motion: reduce) {
    .invite-banner__card { transition: none; }
}

/* ------------------------------------------------
   La salida de /comparar/ (1.58.0) — cuadro al centro con cortina. Mike vio la
   tarjeta de arriba (1.57.0) y pidió MÁS: «en este caso sí lo necesito más
   intrusivo». Bloquea la página hasta que decida; misma familia visual que la
   invitación (tokens, radio, sombra). z 950: sobre el header (100) y la
   invitación (900), BAJO el modal de auth (1000) que abre su CTA. El markup lo
   arma comparar-invitar.js con nodos.
   ------------------------------------------------ */
.salida {
    position: fixed; inset: 0; z-index: 950;
    display: grid; place-items: center;
    padding: 1rem;
}
.salida[hidden] { display: none; }
.salida__velo {
    position: absolute; inset: 0;
    background: rgba(6, 12, 22, .72);
    backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
    opacity: 0; transition: opacity .3s;
}
.salida__card {
    position: relative;
    width: 100%; max-width: 460px;
    padding: 1.7rem 1.6rem 1.2rem;
    background: var(--surface-card);
    color: var(--ink);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    text-align: center;
    transform: translateY(18px) scale(.98); opacity: 0;
    transition: transform .45s var(--ease-out-expo), opacity .3s;
}
.salida.is-open .salida__velo { opacity: 1; }
.salida.is-open .salida__card { transform: none; opacity: 1; }
body.salida-abierta { overflow: hidden; }
.salida__fotos { display: flex; justify-content: center; margin-bottom: 1.1rem; }
.salida__fotos img {
    width: 66px; height: 66px; object-fit: cover; border-radius: 16px;
    border: 3px solid var(--surface-card); box-shadow: var(--shadow-lg);
    margin-left: -16px; background: var(--surface-warm);
}
.salida__fotos img:first-child { margin-left: 0; }
.salida__kicker {
    font-size: .72rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
    color: var(--accent); margin-bottom: .35rem;
}
.salida__titulo {
    font-family: var(--font-display); font-weight: 700; font-size: 1.5rem;
    letter-spacing: -.02em; line-height: 1.15; margin-bottom: .45rem;
}
.salida__texto { font-size: .92rem; color: var(--ink-secondary); margin-bottom: 1rem; }
.salida__lista { list-style: none; margin: 0 0 1.25rem; padding: 0; display: grid; gap: .6rem; text-align: left; }
.salida__lista li { display: flex; align-items: center; gap: .75rem; font-size: .9rem; line-height: 1.35; }
.salida__ico {
    flex-shrink: 0; width: 36px; height: 36px; border-radius: 50%;
    display: grid; place-items: center;
    background: var(--accent-light); color: var(--accent);
}
.salida__ico svg { width: 17px; height: 17px; }
.salida__acciones { display: grid; gap: .55rem; justify-items: center; }
.salida__cta { width: 100%; justify-content: center; padding: .85rem 1.2rem; font-size: .95rem; border-radius: 50px; margin-top: 0; }
.salida__alt, .salida__no {
    background: none; border: none; cursor: pointer; padding: 0;
    font-family: var(--font-body); color: var(--ink-muted);
    text-decoration: underline; text-underline-offset: 2px;
}
.salida__alt { font-size: .85rem; }
.salida__no { font-size: .78rem; margin-top: .25rem; }
.salida__alt:hover, .salida__no:hover { color: var(--accent); }
.salida__nota { font-size: .76rem; color: var(--ink-muted); margin-top: .8rem; }
.salida__close {
    position: absolute; top: .65rem; right: .65rem;
    width: 30px; height: 30px; border-radius: 50%;
    background: transparent; border: none; cursor: pointer;
    display: grid; place-items: center; color: var(--ink-muted);
    transition: background .15s, color .15s;
}
.salida__close:hover { background: var(--surface-warm); color: var(--ink); }
@media (max-width: 480px) {
    .salida { padding: .6rem; align-items: end; }
    .salida__card { padding: 1.4rem 1.15rem 1rem; }
    .salida__titulo { font-size: 1.35rem; }
}
@media (prefers-reduced-motion: reduce) {
    .salida__velo, .salida__card { transition: none; }
}

/* ---- LA MESA (1.48.1) — PESTAÑA pegada al borde derecho, a la altura de la vista ----
   El corazón ES la mesa: cada like sube la propiedad, caben 4. La 1.48.0 era una
   píldora navy en la esquina inferior derecha y Mike la vetó: «casi ni se ve». La
   de RealHomes se ve porque es una pestaña AZUL pegada al borde a 150px del techo,
   con esquinas redondeadas solo hacia adentro — copiada, y más grande. Abierta se
   invierte (superficie + tinta acento) y el panel CUELGA debajo de la pestaña. En
   móvil: barra inferior de ancho completo (también RealHomes) con el panel como
   hoja encima. Lo que flota va con SUPERFICIE, no tinte. z 850: sobre el header
   (100) y bajo la invitación (900) y el overlay (1000). */
/* A MEDIA altura, no a 150px como RealHomes: ahí tapaba el buscador del archive. */
.mesa { position: fixed; right: 0; top: 50%; transform: translateY(-50%); z-index: 850; }
.mesa[hidden] { display: none; }
.mesa__boton {
    display: inline-flex; align-items: center; gap: .55rem;
    padding: .85rem 1.15rem .85rem 1.25rem;
    border: 2px solid var(--accent); border-right: 0;
    border-radius: 28px 0 0 28px;
    background: var(--accent); color: #fff; cursor: pointer;
    font-family: var(--font-body); font-weight: 700; font-size: .95rem; letter-spacing: .01em;
    box-shadow: 0 6px 22px rgba(30, 160, 229, .38);
    transition: transform .2s, background .2s, color .2s, box-shadow .2s;
}
.mesa__boton svg { width: 22px; height: 22px; }
.mesa__boton:hover { transform: translateX(-3px); }
.mesa__boton.is-brinco { animation: mesaBrinco .5s var(--ease-out-expo); }
@keyframes mesaBrinco {
    0%   { transform: scale(1); }
    35%  { transform: scale(1.1) translateX(-5px); }
    70%  { transform: scale(.97); }
    100% { transform: scale(1); }
}
/* Cápsula como flex de alto fijo + line-height 1: con padding y line-height 1.3 la
   caja de línea quedaba centrada pero la TINTA de «3/4» (sin descendentes) caía un
   pelo abajo — lo cachó Mike en móvil y escritorio. */
.mesa__n {
    display: inline-flex; align-items: center; justify-content: center;
    height: 24px; min-width: 36px; padding: 0 .55rem;
    background: #fff; color: var(--accent); border-radius: 50px;
    font-size: .8rem; font-weight: 800; line-height: 1;
}
.mesa.is-abierta .mesa__boton {
    background: var(--surface-card); color: var(--accent);
    border-radius: 28px 0 0 0; box-shadow: none;
}
.mesa.is-abierta .mesa__n { background: var(--accent); color: #fff; }
.mesa__panel {
    position: absolute; right: 0; top: 100%;
    width: min(380px, calc(100vw - 1rem));
    background: var(--surface-card); color: var(--ink);
    border: 2px solid var(--accent); border-right: 0;
    border-radius: 16px 0 0 16px;
    box-shadow: var(--shadow-lg);
    padding: 1rem;
    max-height: calc(50vh - 2rem); overflow-y: auto;   /* cuelga de media altura: que no se salga por abajo */
}
.mesa__panel[hidden] { display: none; }
.mesa__cab { display: flex; align-items: center; justify-content: space-between; margin-bottom: .5rem; }
.mesa__cab strong { font-family: var(--font-display); font-size: .95rem; }
.mesa__cerrar {
    width: 26px; height: 26px; border-radius: 50%; border: none; background: transparent;
    color: var(--ink-muted); cursor: pointer; display: grid; place-items: center;
}
.mesa__cerrar:hover { background: var(--surface-warm); color: var(--ink); }
.mesa__aviso {
    font-size: .78rem; line-height: 1.4; color: var(--ink-secondary);
    background: var(--accent-light); border-radius: var(--radius-sm);
    padding: .45rem .6rem; margin-bottom: .55rem;
}
.mesa__aviso[hidden] { display: none; }
.mesa__lista { list-style: none; margin: 0 0 .75rem; padding: 0; display: flex; flex-direction: column; gap: .45rem; }
.mesa__item { display: flex; align-items: center; gap: .6rem; }
.mesa__foto {
    flex-shrink: 0; width: 52px; height: 40px; border-radius: var(--radius-sm);
    overflow: hidden; background: var(--surface-warm); display: block;
}
.mesa__foto img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mesa__titulo {
    flex: 1; min-width: 0; font-size: .82rem; font-weight: 600; color: var(--ink);
    text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.mesa__titulo:hover { color: var(--accent); }
.mesa__quitar {
    flex-shrink: 0; width: 24px; height: 24px; border-radius: 50%; border: none;
    background: transparent; color: var(--ink-muted); cursor: pointer;
    font-size: 1.15rem; line-height: 1;
}
.mesa__quitar:hover { background: var(--surface-warm); color: var(--venta); }
.mesa__cta { display: flex; justify-content: center; margin-top: 0; width: 100%; }
.mesa__cta.is-disabled { pointer-events: none; opacity: .55; }
@media (max-width: 768px) {
    /* Barra inferior de ancho completo (RealHomes): imposible no verla. El panel es
       una hoja que sube desde la barra. */
    /* transform: none — con el translate del escritorio, el panel `fixed` se
       ancla a la pestaña y no al viewport */
    .mesa { left: 0; right: 0; top: auto; bottom: 0; transform: none; }
    .mesa__boton {
        width: 100%; justify-content: center;
        border: 0; border-radius: 0; padding: .95rem 1rem;
        box-shadow: 0 -6px 22px rgba(0, 0, 0, .22);
    }
    .mesa.is-abierta .mesa__boton { border-radius: 0; border-top: 2px solid var(--accent); }
    .mesa__panel {
        position: fixed; left: 0; right: 0; top: auto; bottom: 56px; width: auto;
        border: 2px solid var(--accent); border-bottom: 0; border-radius: 16px 16px 0 0;
    }
}

/* ---- /comparar/ — la tabla lado a lado ---- */
.comparar { padding: var(--space-xl) 0 var(--space-2xl); }
.comparar-intro {
    display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
    gap: 1rem; margin-bottom: 1.5rem;
}
.comparar-intro h1 { font-size: clamp(1.6rem, 3vw, 2.2rem); margin-bottom: .35rem; }
.comparar-intro p { color: var(--ink-secondary); max-width: 62ch; line-height: 1.55; }
.comparar-compartir { display: flex; flex-wrap: wrap; gap: .5rem; }
/* `.btn + .btn` global es para botones APILADOS (mete margen arriba al 2.º): esta fila va plana */
.comparar-compartir .btn + .btn { margin-top: 0; }
.comparar-scroll {
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    border: 1px solid var(--border); border-radius: var(--radius-lg);
    background: var(--surface-card);
}
/* Sin min-width fijo: el ancho lo dan las columnas (min 200px c/u) — con 4 desborda y el
   contenedor desplaza; con 1 o 2 en móvil cabe sin scroll inútil */
.comparar-tabla { border-collapse: separate; border-spacing: 0; width: 100%; }
.comparar-tabla th, .comparar-tabla td {
    padding: .8rem .9rem; border-bottom: 1px solid var(--border);
    vertical-align: top; text-align: left; font-size: .9rem; color: var(--ink);
}
.comparar-tabla thead th { vertical-align: bottom; }
.comparar-tabla tbody tr:last-child th, .comparar-tabla tbody tr:last-child td { border-bottom: none; }
/* La columna de etiquetas se queda a la vista al desplazar en horizontal */
.comparar-eti {
    position: sticky; left: 0; z-index: 1;
    background: var(--surface-card); color: var(--ink-muted);
    font-size: .74rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
    white-space: nowrap; width: 150px;
    box-shadow: 1px 0 0 var(--border);
}
.comparar-col { min-width: 200px; }
/* Móvil — va DESPUÉS de la base de .comparar-eti (misma especificidad: gana la última).
   La etiqueta se parte («ESTACIONA-MIENTO» es una sola palabra); en nowrap la más larga
   imponía 168px de 390. */
@media (max-width: 768px) {
    .comparar-eti {
        width: 108px; min-width: 108px; max-width: 108px;
        white-space: normal; overflow-wrap: anywhere;
        font-size: .62rem; letter-spacing: .03em; line-height: 1.25;
        padding-left: .6rem; padding-right: .6rem;
    }
    .comparar-tabla th, .comparar-tabla td { padding: .65rem .7rem; font-size: .84rem; }
    .comparar-tabla .comparar-precio { font-size: 1.02rem; }   /* su base viene después: más especificidad */
}
/* Tope de alto: con 2 columnas la foto crecía a 340px y mandaba los números bajo el pliegue */
.comparar-foto {
    display: block; aspect-ratio: 4 / 3; max-height: 190px;
    border-radius: var(--radius); overflow: hidden;
    background: var(--surface-warm); margin-bottom: .6rem;
}
/* Solo para lectores de pantalla (el tema no lo tenía) */
.sr-only {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
.comparar-foto img { width: 100%; height: 100%; object-fit: cover; display: block; }
.comparar-titulo {
    display: block; font-family: var(--font-display); font-weight: 700; font-size: .95rem;
    color: var(--ink); text-decoration: none; line-height: 1.3;
}
.comparar-titulo:hover { color: var(--accent); }
.comparar-quitar {
    display: inline-block; margin-top: .4rem; font-size: .76rem; color: var(--ink-muted);
    text-decoration: underline; text-underline-offset: 2px;
}
.comparar-quitar:hover { color: var(--venta); }
.comparar-precio { font-family: var(--font-display); font-weight: 800; font-size: 1.15rem; }
.comparar-tabla small { color: var(--ink-muted); font-size: .72rem; }
.comparar-mejor { color: var(--accent); font-weight: 700; }
.comparar-mejor::after {
    content: 'mejor'; margin-left: .4rem; vertical-align: middle;
    font-size: .64rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
    background: var(--accent-light); color: var(--accent); border-radius: 50px; padding: .12rem .45rem;
}
.comparar-amen { display: flex; flex-wrap: wrap; gap: .3rem; }
.comparar-amen span {
    font-size: .74rem; background: var(--surface-warm); color: var(--ink-secondary);
    border-radius: 50px; padding: .15rem .55rem;
}
.comparar-asesor {
    display: inline-flex; align-items: center; gap: .5rem;
    color: var(--ink); text-decoration: none; font-weight: 600; font-size: .85rem;
}
.comparar-asesor:hover { color: var(--accent); }
.comparar-asesor img { width: 30px; height: 30px; border-radius: 50%; object-fit: cover; }
.comparar-likes { display: inline-flex; align-items: center; gap: .3rem; color: var(--venta); font-weight: 700; }
.comparar-ver { padding: .45rem .9rem; font-size: .8rem; margin-top: 0; }
.comparar-vacia {
    text-align: center; padding: 3rem 1rem;
    border: 1px dashed var(--border-strong); border-radius: var(--radius-lg);
    color: var(--ink-secondary);
}
.comparar-vacia h2 { font-size: 1.2rem; margin-bottom: .4rem; color: var(--ink); }
.comparar-vacia .btn { margin-top: 1rem; }
.auth-tabs {
    display: flex; gap: 0;
    background: var(--surface-warm); border-radius: var(--radius);
    padding: .2rem; margin-bottom: 1.75rem;
}
.auth-tab {
    flex: 1; padding: .55rem; border-radius: calc(var(--radius) - 2px);
    background: none; border: none; cursor: pointer;
    font-family: var(--font-body); font-size: .875rem; font-weight: 500;
    color: var(--ink-muted);
    transition: background .2s var(--ease-out-quart), color .2s, box-shadow .2s;
}
.auth-tab.active {
    background: var(--surface-card); color: var(--ink);
    box-shadow: var(--shadow-sm);
    font-weight: 600;
}
.auth-form { display: none; }
.auth-form.active { display: block; }
.auth-field { margin-bottom: 1.1rem; }
.auth-field label {
    display: flex; justify-content: space-between; align-items: center;
    font-size: .8rem; font-weight: 600; color: var(--ink);
    margin-bottom: .35rem;
}
.auth-forgot {
    font-weight: 400; font-size: .78rem; color: var(--accent);
}
.auth-forgot:hover { text-decoration: underline; }
.auth-input-wrap { position: relative; }
.auth-field input[type="text"],
.auth-field input[type="email"],
.auth-field input[type="password"] {
    width: 100%; padding: .75rem .9rem;
    border: 1.5px solid var(--border); border-radius: var(--radius);
    font-family: var(--font-body); font-size: .9rem;
    background: var(--surface); color: var(--ink);
    transition: border-color .18s var(--ease-out-quart), box-shadow .18s;
}
.auth-field input:focus {
    outline: none; border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-light);
}
.auth-field input.error { border-color: var(--venta); }
.auth-input-wrap input { padding-right: 2.75rem; }
.toggle-password {
    position: absolute; right: .75rem; top: 50%; transform: translateY(-50%);
    background: none; border: none; cursor: pointer;
    color: var(--ink-muted); padding: .2rem;
    transition: color .15s;
}
.toggle-password:hover { color: var(--ink); }
.auth-remember {
    display: flex; align-items: center; gap: .5rem;
    font-size: .85rem; color: var(--ink-secondary);
    cursor: pointer; margin-bottom: 1.25rem;
}
.auth-remember input { width: auto; accent-color: var(--accent); }
.auth-error {
    font-size: .82rem; color: var(--venta);
    background: var(--venta-bg); border-radius: var(--radius);
    padding: .6rem .75rem; margin-bottom: 1rem;
    display: none;
}
.auth-error.show { display: block; }
.auth-submit { margin-top: .25rem; }
.auth-terms {
    margin-top: 1rem; font-size: .75rem; color: var(--ink-muted);
    text-align: center; line-height: 1.5;
}
.auth-terms a { color: var(--accent); }
.auth-terms a:hover { text-decoration: underline; }

/* Campos del registro: teléfono, checkbox, hints. (El modal de upgrade y sus
   .role-option/.upgrade-* murieron en 1.46; CSS barrido en 1.49.0.) */
.auth-field input[type="tel"] {
    width: 100%; padding: .75rem .9rem;
    border: 1.5px solid var(--border); border-radius: var(--radius);
    font-family: var(--font-body); font-size: .9rem;
    background: var(--surface); color: var(--ink);
    transition: border-color .18s var(--ease-out-quart), box-shadow .18s;
}
.auth-field input[type="tel"]:focus {
    outline: none; border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-light);
}
.auth-field label.auth-checkbox {
    flex-direction: row; justify-content: flex-start; align-items: center; gap: .5rem;
    font-size: .82rem; font-weight: 500; color: var(--ink-secondary);
    cursor: pointer; margin: .55rem 0 0;
}
.auth-field label.auth-checkbox input { width: auto; accent-color: var(--accent); flex: none; }
.auth-field label.auth-checkbox a { color: var(--accent); }
.auth-field label.auth-checkbox a:hover { text-decoration: underline; }
.field-opt { font-weight: 400; font-size: .72rem; color: var(--ink-muted); }
.field-soon {
    font-weight: 600; font-size: .62rem; letter-spacing: .04em; text-transform: uppercase;
    color: var(--accent); background: var(--accent-light);
    padding: .15rem .45rem; border-radius: 999px;
}
.auth-field[aria-disabled="true"] { opacity: .55; }
.auth-hint { font-size: .78rem; color: var(--ink-muted); line-height: 1.5; margin: .15rem 0 0; }

/* Pantallas de poca altura: compactar el modal para que quepa SIN scroll.
   (El overflow del overlay queda solo como red de seguridad en alturas extremas.) */
@media (max-height: 780px) {
    .auth-overlay .auth-modal { padding: clamp(1.1rem, 3vw, 1.6rem); }
    .auth-overlay .auth-logo { margin-bottom: .8rem; }
    .auth-overlay .auth-logo img { max-height: 36px; }
    .auth-overlay .auth-logo .logo-icon svg { width: 36px; height: 36px; }
    .auth-overlay .auth-tabs { margin-bottom: 1rem; }
    .auth-overlay .auth-field { margin-bottom: .6rem; }
    .auth-overlay .auth-terms { margin-top: .6rem; }
}
@media (max-height: 640px) {
    .auth-overlay .auth-modal { padding: .8rem 1.05rem; }
    .auth-overlay .auth-logo { margin-bottom: .4rem; }
    .auth-overlay .auth-logo .logo-text { font-size: 1.05rem; }
    .auth-overlay .auth-tabs { margin-bottom: .65rem; }
    .auth-overlay .auth-field { margin-bottom: .45rem; }
    .auth-overlay .auth-field label { margin-bottom: .15rem; }
    .auth-overlay .auth-field input { padding: .5rem .7rem; }
    .auth-overlay .auth-hint { font-size: .72rem; margin-top: .1rem; line-height: 1.4; }
    .auth-overlay .auth-terms { font-size: .68rem; margin-top: .45rem; }
    .auth-overlay .password-strength { display: none; }
}

/* Password strength bar */
.password-strength {
    height: 3px; border-radius: 2px; margin-top: .4rem;
    background: var(--border); overflow: hidden;
}
.password-strength::after {
    content: ''; display: block; height: 100%;
    transition: width .3s var(--ease-out-quart), background .3s;
    width: var(--strength, 0%);
    background: var(--strength-color, var(--border));
}

/* Spinner animation */
@keyframes spin { to { transform: rotate(360deg); } }
.spin { animation: spin .7s linear infinite; }

/* --- Footer --- */
.site-footer {
    background: var(--footer-bg);
    color: rgba(255,255,255,.5);
    padding: var(--space-3xl) 0 var(--space-xl);
}
.footer-grid {
    display: grid; grid-template-columns: 1.8fr 1fr 1fr 1fr;
    gap: var(--space-xl); margin-bottom: var(--space-2xl);
}
.footer-logo {
    font-family: var(--font-display);
    font-size: 1.4rem; font-weight: 700; color: #fff;
    display: block; margin-bottom: .75rem;
    letter-spacing: -.02em;
}
.footer-desc { font-size: .88rem; line-height: 1.7; max-width: 300px; }
.footer-col h4 {
    font-family: var(--font-body);
    color: rgba(255,255,255,.8); font-size: .78rem;
    margin-bottom: var(--space-md); text-transform: uppercase;
    letter-spacing: .08em; font-weight: 600;
}
.footer-col ul li { margin-bottom: .45rem; }
.footer-col ul li a {
    font-size: .88rem; transition: color .2s;
    color: rgba(255,255,255,.45);
}
.footer-col ul li a:hover { color: var(--accent); }
.footer-bottom {
    border-top: 1px solid rgba(255,255,255,.1);
    padding-top: var(--space-lg); text-align: center;
    font-size: .8rem;
}

/* ========================================
   Responsive
   ======================================== */
@media (max-width: 1024px) {
    .categories-grid { grid-template-columns: repeat(3, 1fr); }
    .properties-grid,
    .featured .properties-grid { grid-template-columns: repeat(2, 1fr); }
    .footer-grid { grid-template-columns: repeat(2, 1fr); }
    .listing-layout { grid-template-columns: 230px 1fr; }
    .stats-grid { grid-template-columns: repeat(2, 1fr); }
    .why-grid { grid-template-columns: repeat(2, 1fr); }
    .blog-grid { grid-template-columns: repeat(2, 1fr); }
    .newsletter-inner { flex-direction: column; text-align: center; }
    .newsletter-form input { width: 100%; }
    /* Single property */
    .sp-layout { grid-template-columns: minmax(0, 1fr) 320px; }
    .sp-hero-main { height: clamp(440px, 70vh, 720px); }
}

@media (max-width: 768px) {
    .hero { min-height: 500px; }
    .hero h1 { font-size: clamp(1.5rem, 5vw, 2rem); }
    .hero-content { padding-left: 1.25rem; }
    .hero-search { top: .75rem; }
    .hero-content { bottom: 10rem; }
    .slide-info { left: 1.25rem; bottom: 1.25rem; }
    .hero-arrow { width: 36px; height: 36px; }
    .hero-prev { left: .75rem; }
    .hero-next { right: .75rem; }
    .hero-dots { right: 1.25rem; bottom: 1rem; }
    .hero-search .search-box { border-radius: 24px; padding: .75rem 1rem; }
    .search-fields { flex-direction: column; }
    .categories-grid { grid-template-columns: repeat(3, 1fr); }
    .properties-grid, .properties-grid.grid-2 { grid-template-columns: 1fr; }
    /* Recién publicadas en móvil: DOS columnas (pedido de Mike), con la misma
       receta compacta que el inventario del perfil del asesor — a ~170px la
       tarjeta de escritorio parte "2 rec." en dos renglones. */
    .featured .properties-grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-sm); }
    .featured .property-info { padding: .7rem; }
    .featured .property-price { font-size: 1.05rem; }
    .featured .property-price-m2 { font-size: .7rem; }
    .featured .property-title { font-size: .82rem; line-height: 1.35; }
    .featured .property-specs { gap: .5rem; font-size: .72rem; }
    .featured .property-specs > * { white-space: nowrap; }
    .featured .property-meta-bottom { font-size: .68rem; gap: .35rem; }
    .featured .property-location,
    .featured .property-age { white-space: nowrap; }
    .zones-grid { grid-template-columns: repeat(2, 1fr); }
    .footer-grid { grid-template-columns: 1fr; gap: var(--space-xl); }
    .listing-layout { grid-template-columns: 1fr; }
    .listing-filters { position: static; }
    .contact-layout { grid-template-columns: 1fr; }
    .form-row { grid-template-columns: 1fr; }
    .stats-grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-md); }
    .why-grid { grid-template-columns: 1fr; }
    /* Recursos en 2×2 también en el celular (1.62.4): tarjeta compacta, título y extracto a 2
       renglones reservados para que las cuatro queden parejas. */
    .blog-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; }
    .blog-info { padding: .75rem .85rem .95rem; }
    .blog-date { font-size: .64rem; }
    .blog-info h3 { font-size: .92rem; min-height: 2lh; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
    .blog-info p { font-size: .78rem; line-height: 1.45; min-height: 2lh; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
    .newsletter-form { flex-direction: column; width: 100%; }
    .newsletter-form input { width: 100%; }
    .calc-grid { grid-template-columns: 1fr; }
    .listing-toolbar { flex-direction: column; align-items: flex-start; gap: var(--space-sm); }
    /* Single property */
    .sp-layout { grid-template-columns: minmax(0, 1fr); }
    .sp-sidebar { position: static; }
    .sp-hero-main { height: clamp(300px, 56vw, 520px); }   /* la foto es el producto (ver ≤480) */
    .sp-hero-foot { flex-direction: column; align-items: flex-start; padding: 1.25rem; }
    .sp-hero-foot-right { text-align: left; }
    .sp-specs-bar { gap: 0; }
    .sp-spec { min-width: 80px; padding: .75rem .5rem; }
    .sp-hero-actions { flex-wrap: wrap; gap: .3rem; }
    .sp-lb-prev { left: .5rem; }
    .sp-lb-next { right: .5rem; }
    /* La pila del hero es una BANDA debajo de la foto (1.60.3 la puso al pie ENCIMA; 1.60.4 la
       saca: Mike, «¿qué caso tiene que estén sobre la imagen si no se puede ver?»): mapa ·
       miniaturas desplazables · «N Fotos», visibles desde el inicio y sin tapar nada. Antes era
       la columna de escritorio encimada arriba-izquierda —chocaba con Imprimir / Compartir /
       Me gusta— y los thumbs solo asomaban al tocar «Fotos». Escritorio no cambia. */
    .sp-hero-stack {
        position: static; width: auto;
        flex-direction: row; align-items: flex-end; column-gap: 8px; row-gap: 0;
        padding: 10px 1rem 0;
    }
    /* El hero se desliza con el dedo (1.61.0): pan-y deja pasar el scroll vertical y entrega
       completo el arrastre horizontal al pointerup. Flechas siempre visibles, discretas; la de
       atrás ya no tiene que esquivar la columna (en móvil la pila va debajo de la foto). */
    .sp-hero-main { touch-action: pan-y; cursor: default; }
    .sp-hero-nav { opacity: .85; width: 34px; height: 34px; }
    .sp-hero-nav--prev { left: .75rem; }
    .sp-hero-nav--next { right: .75rem; }
    .sp-hero-counter { right: .75rem; bottom: .75rem; }
    .sp-hero-stack .sp-vcar-mapbtn { width: 64px; margin: 0; flex: none; }
    .sp-hero-stack .sp-hero-tools  { flex: none; }
    .sp-hero-stack .sp-hero-tool   { width: 64px; height: 56px; margin: 0; }
    /* Sin paseo virtual no hay botón apagado ocupando la franja (ni su hueco). */
    .sp-hero-stack .sp-hero-tool.is-dim { display: none; }
    .sp-hero-stack .sp-hero-tools:not(:has(.sp-hero-tool:not(.is-dim))) { display: none; }
    .sp-hero-stack .sp-vcar {
        flex: 1; min-width: 0; width: auto;
        flex-direction: row; align-items: flex-end; column-gap: 8px; row-gap: 0;
    }
    .sp-vcar-box { flex: 1; min-width: 0; }
    .sp-vcar-thumb-box { margin: 0 4px; }
    .sp-vcar-count { width: 64px; height: 56px; margin: 0; flex: none; padding: 4px 0; }
    .sp-vcar-count svg { width: 12px; margin-bottom: 0; }
    .sp-vcar-count-num { font-size: 15px; }
    .sp-vcar-count-lbl { font-size: 10px; margin-top: 0; }
    /* Mobile nav — hamburguesa IZQ · logo CENTRO · lupita DER (Mike).
       El grid manda el orden sin tocar el DOM; main-nav es absolute y
       header-actions va oculto, así que no juegan en las columnas. */
    .header-inner { display: grid; grid-template-columns: 40px 1fr 40px; }
    .header-actions { display: none; }   /* en móvil solo hamburguesa·logo·lupa */
    .menu-toggle { display: block; grid-column: 1; grid-row: 1; justify-self: start; }
    .site-logo { grid-column: 2; grid-row: 1; justify-self: center; }
    .header-lupa {
        display: flex; grid-column: 3; grid-row: 1; justify-self: end;
        align-items: center; justify-content: center;
        width: 40px; height: 40px; border-radius: 10px;
        color: var(--ink);
    }
    .header-lupa:active { background: var(--surface-warm); }
    /* DRAWER off-canvas (patrón RealHomes, con nuestros tokens): panel
       lateral izquierdo + overlay + candado de scroll. Vive DENTRO del
       stacking context del header (sticky z100): 260/250 solo compiten ahí,
       y el modal de auth (z1000, en body) le sigue ganando al conjunto. */
    .main-nav {
        display: flex; flex-direction: column; justify-content: flex-start;
        align-items: stretch;   /* el base centra; el drawer va a lo ancho */
        position: fixed; top: 0; left: 0; bottom: 0;
        width: min(300px, 84vw); height: 100dvh;
        background: var(--surface-card);
        border-right: 1px solid var(--border);
        box-shadow: 0 0 60px rgba(8,12,20,.4);
        z-index: 260;
        transform: translateX(-103%);
        transition: transform .35s cubic-bezier(.22,.8,.26,1);
    }
    .main-nav.active { transform: translateX(0); }
    /* Quien pidió menos movimiento: el cajón aparece en su sitio, sin deslizar. */
    @media (prefers-reduced-motion: reduce) { .main-nav, .nav-overlay { transition: none; } }
    .nav-overlay {
        display: block; position: fixed; inset: 0;
        background: rgba(8,12,20,.55);
        opacity: 0; pointer-events: none; transition: opacity .3s ease;
        z-index: 250;
    }
    .nav-overlay.active { opacity: 1; pointer-events: auto; }
    body.nav-open { overflow: hidden; }
    .nav-drawer-head {
        display: flex; align-items: center; justify-content: space-between;
        padding: .95rem var(--space-md);
        border-bottom: 1px solid var(--border);
        color: var(--ink); font-weight: 600;
    }
    .nav-close {
        background: none; border: none; cursor: pointer;
        width: 36px; height: 36px; border-radius: 9px;
        display: grid; place-items: center; color: var(--ink);
    }
    .nav-close:active { background: var(--surface-warm); }
    .nav-list { flex-direction: column; width: 100%; padding: .35rem 0; overflow-y: auto; }
    .nav-list li { width: 100%; }
    .nav-list li a {
        display: block; padding: .95rem var(--space-md);
        border-bottom: 1px solid var(--border);
        color: var(--ink); font-weight: 500;
        text-align: left; border-radius: 0; background: none;
    }
    .nav-list li a::after { display: none; }
    .nav-drawer-foot {
        display: flex; flex-direction: column; gap: .65rem;
        margin-top: auto; padding: var(--space-md);
        border-top: 1px solid var(--border);
    }
    .nav-drawer-cta { width: 100%; text-align: center; }
    /* La cápsula «Entrar / Crear cuenta» del header, a lo ancho del pie del drawer (1.61.2):
       mismas clases, mitades iguales. */
    .nav-drawer-auth { display: flex; width: 100%; }
    .nav-drawer-auth .header-auth__btn { flex: 1; padding: .7rem 0; text-align: center; font-size: .9rem; }
    .nav-drawer-link {
        display: flex; align-items: center; gap: .55rem;
        background: none; border: none; cursor: pointer; font: inherit;
        color: var(--ink-secondary); padding: .45rem .1rem;
    }
    .header-actions { display: none; }
    .header-actions.mobile-show {
        display: flex; flex-direction: column; width: 100%;
        padding: var(--space-md); gap: var(--space-sm);
        position: absolute; top: var(--header-h); left: 0; right: 0;
        background: var(--surface-card); border-top: 1px solid var(--border);
    }
    .header-cta { width: 100%; text-align: center; }
}

@media (max-width: 480px) {
    .hero { padding: clamp(3rem, 8vw, 4rem) 0; }
    .categories-grid { grid-template-columns: repeat(2, 1fr); }
    .category-card { padding: var(--space-md) var(--space-sm); }
    .zones-grid { grid-template-columns: 1fr; }
    /* Single property mobile — la foto es el producto: ~300px en un teléfono (Mike sintió chico
       el hero de 240 al regresar la banda debajo; 1.61.0 conserva el alto de 1.60.3). */
    .sp-hero-main { height: clamp(300px, 78vw, 400px); }
    /* Specs: 3 por fila (6 datos = 2 filas parejas). Antes era una fila con scroll lateral
       y la barra escondida: sin pista de que había más, «Terreno» y «Antigüedad» quedaban
       fuera, y su min-content (flex-shrink: 0) era lo que desbordaba la página (1.60.1). */
    .sp-specs-bar { flex-wrap: wrap; }
    .sp-spec { flex: 1 1 33.333%; min-width: 0; }
    /* Título a lo ancho y el precio DEBAJO, a la izquierda: lado a lado, un precio largo
       dejaba el título en cuatro renglones apretados. Y un precio kilométrico se parte
       antes que desbordar. */
    .sp-mh-title-price { flex-direction: column; align-items: stretch; gap: .5rem; }
    .sp-mh-price-wrap { min-width: 0; max-width: 100%; text-align: left; }
    .sp-mh-price { overflow-wrap: anywhere; }
}

/* ========================================
   Animations & Motion
   ======================================== */

/* --- Easing tokens --- */
:root {
    --ease-out-expo:  cubic-bezier(0.16, 1, 0.3, 1);
    --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1);
    --ease-in-out:    cubic-bezier(0.4, 0, 0.2, 1);
}

/* --- Scroll reveal base --- */
.reveal {
    opacity: 0;
    transform: translateY(22px);
    transition: opacity .55s var(--ease-out-expo), transform .55s var(--ease-out-expo);
}
.reveal.revealed {
    opacity: 1;
    transform: translateY(0);
}

/* Stagger delays for grid children */
.reveal-stagger > *:nth-child(1)  { transition-delay: 0ms; }
.reveal-stagger > *:nth-child(2)  { transition-delay: 70ms; }
.reveal-stagger > *:nth-child(3)  { transition-delay: 140ms; }
.reveal-stagger > *:nth-child(4)  { transition-delay: 210ms; }
.reveal-stagger > *:nth-child(5)  { transition-delay: 280ms; }
.reveal-stagger > *:nth-child(6)  { transition-delay: 350ms; }
.reveal-stagger > *:nth-child(7)  { transition-delay: 420ms; }
.reveal-stagger > *:nth-child(8)  { transition-delay: 490ms; }
.reveal-stagger > *:nth-child(9)  { transition-delay: 560ms; }

/* --- Hero entrance --- */
@keyframes fadeUp {
    from { opacity: 0; transform: translateY(20px); }
    to   { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* --- Button press feedback --- */
@keyframes btnPress {
    0%   { transform: scale(1); }
    40%  { transform: scale(.95); }
    100% { transform: scale(1); }
}
.btn:active { animation: btnPress 200ms var(--ease-out-quart) both; }

/* --- Favorite heart burst --- */
@keyframes heartBurst {
    0%   { transform: scale(1); }
    30%  { transform: scale(1.35); }
    60%  { transform: scale(.88); }
    100% { transform: scale(1); }
}
.card-favorite.animate-heart,
.favorite-btn.animate-heart { animation: heartBurst 380ms var(--ease-out-expo) both; }

/* --- Newsletter success --- */
@keyframes checkSlide {
    from { transform: scaleX(0) translateX(-4px); opacity: 0; }
    to   { transform: scaleX(1) translateX(0);    opacity: 1; }
}
.newsletter-success {
    display: none; align-items: center; gap: .5rem;
    color: var(--sage); font-weight: 600; font-size: .95rem;
}
.newsletter-success.show {
    display: flex;
    animation: fadeIn 350ms var(--ease-out-quart) both;
}

/* --- Mobile menu slide --- */
/* `menuSlide` (fade con caída de 8px del menú desplegable viejo) se retiró en 1.61.1: el drawer
   se desliza con su propia transición de transform. */

/* --- Skeleton shimmer for loading states --- */
@keyframes shimmer {
    0%   { background-position: -600px 0; }
    100% { background-position:  600px 0; }
}

/* --- Reduced motion: disable all --- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        transition-delay: 0ms !important;
    }
    .reveal { opacity: 1; transform: none; }
}

/* --- Active animations (prefers motion) --- */
@media (prefers-reduced-motion: no-preference) {
    /* Hero entrance */
    .hero-content { animation: fadeUp .7s var(--ease-out-expo) .52s both; }
    .search-box    { animation: fadeUp .7s var(--ease-out-expo) .22s both; }

    /* Refined hover transitions */
    .property-card {
        transition: box-shadow .3s var(--ease-out-quart),
                    transform   .3s var(--ease-out-quart),
                    border-color .3s var(--ease-out-quart);
    }
    .category-card {
        transition: border-color .22s var(--ease-out-quart),
                    box-shadow   .22s var(--ease-out-quart),
                    transform    .22s var(--ease-out-quart),
                    background   .22s var(--ease-out-quart);
    }
    .zone-card {
        transition: transform .3s var(--ease-out-quart),
                    box-shadow .3s var(--ease-out-quart);
    }
    .zone-card:hover { transform: translateY(-4px) scale(1.01); }

    /* Zone card inner image subtle scale */
    .zone-card::after {
        content: ''; position: absolute; inset: 0;
        background: inherit; background-size: cover;
        transition: transform .5s var(--ease-out-quart);
        z-index: -1;
    }

    /* Blog card */
    .blog-card {
        transition: box-shadow .25s var(--ease-out-quart),
                    transform  .25s var(--ease-out-quart);
    }

    /* Buttons */
    .btn {
        transition: background .18s var(--ease-out-quart),
                    box-shadow  .18s var(--ease-out-quart),
                    transform   .15s var(--ease-out-quart),
                    border-color .18s var(--ease-out-quart),
                    color .18s var(--ease-out-quart);
    }

    /* (1.61.1) Aquí vivía `.main-nav.active { animation: menuSlide … }`, herencia de cuando el
       menú móvil era un desplegable: un fade con caída de 8px. Una `animation` que toca
       `transform` le gana a la transición del drawer, así que el cajón «aparecía» en lugar de
       deslizarse desde la izquierda (Mike). El deslizamiento es la transición de `.main-nav`
       en el bloque ≤768; no volver a animar `transform` aquí. */

    /* Card image zoom — smoother curve */
    .property-card:hover .property-image img {
        transform: scale(1.05);
        transition: transform .6s var(--ease-out-quart);
    }
    .property-image img { transition: transform .4s var(--ease-out-quart); }

    /* Search tab switch */
    .search-tab {
        transition: background .18s var(--ease-out-quart),
                    color .18s var(--ease-out-quart),
                    border-color .18s var(--ease-out-quart);
    }

    /* Header shadow on scroll — handled via JS class */
    .site-header { transition: box-shadow .3s var(--ease-out-quart); }
    .site-header.scrolled { box-shadow: 0 2px 20px rgba(28,25,23,.1); }

    /* Stat numbers pop in */
    .stat-number { transition: color .3s var(--ease-out-quart); }

    /* Favorite button states */
    .card-favorite {
        transition: background .18s var(--ease-out-quart),
                    color .18s var(--ease-out-quart);
    }

    /* Nav link hover */
    .nav-list li a {
        transition: color .15s var(--ease-out-quart),
                    background .15s var(--ease-out-quart);
    }

    /* Category icon color */
    .category-icon { transition: color .22s var(--ease-out-quart); }

    /* Footer social */
    .footer-social a {
        transition: background .18s var(--ease-out-quart),
                    color .18s var(--ease-out-quart);
    }

    /* Action buttons on single property */
    .action-btn {
        transition: border-color .15s var(--ease-out-quart),
                    color .15s var(--ease-out-quart),
                    background .15s var(--ease-out-quart);
    }

    /* Filter pills */
    .pill, .listing-filters select {
        transition: border-color .15s var(--ease-out-quart),
                    background .15s var(--ease-out-quart),
                    color .15s var(--ease-out-quart);
    }
}

/* ============================================================
   Half-Map Layout — search results
   ============================================================ */
.halfmap-page {
    display: flex; min-height: calc(100vh - 72px);
    margin-top: 72px; /* header height */
}

/* Map side — sticky */
.halfmap-map {
    flex: 0 0 50%; height: calc(100vh - 72px);
    position: sticky; top: 72px;
    z-index: 1;
}

/* List side — normal scroll */
.halfmap-list {
    flex: 0 0 50%;
    padding: 1.5rem 2rem;
    background: var(--surface);
}

/* Breadcrumb + title */
.halfmap-head { margin-bottom: 1rem; }
.halfmap-head .breadcrumb { font-size: .8rem; color: var(--ink-muted); margin-bottom: .25rem; }
.halfmap-head .breadcrumb a { color: var(--accent); }
.halfmap-head h1 { font-family: var(--font-display); font-size: 1.5rem; font-weight: 700; }

/* Filters row */
.halfmap-filters {
    display: flex; align-items: center; gap: .5rem;
    flex-wrap: wrap;
    background: var(--surface-card);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    padding: .75rem 1rem; margin-bottom: 1rem;
}
.hm-select {
    flex: 1; min-width: 100px;
    padding: .4rem .5rem; border: 1.5px solid var(--border);
    border-radius: 50px; font-size: .8rem;
    color: var(--ink-secondary); background: var(--surface);
    cursor: pointer;
}
.hm-select:focus { border-color: var(--accent); outline: none; }
.hm-price-range {
    display: flex; align-items: center; gap: .4rem; flex: 1.5; min-width: 180px;
}
.hm-price-label { font-size: .8rem; color: var(--ink-muted); white-space: nowrap; }
.hm-range {
    flex: 1; height: 4px; -webkit-appearance: none; appearance: none;
    background: var(--border); border-radius: 2px; cursor: pointer;
}
.hm-range::-webkit-slider-thumb {
    -webkit-appearance: none; width: 16px; height: 16px;
    background: var(--accent); border-radius: 50%;
    border: 2px solid #fff; box-shadow: 0 1px 4px rgba(0,0,0,.2);
    cursor: pointer;
}
.hm-price-value { font-size: .8rem; color: var(--accent); font-weight: 600; white-space: nowrap; }
.hm-search-btn { padding: .4rem 1.2rem; font-size: .8rem; border-radius: 50px; }

/* Toolbar */
.halfmap-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    padding: .5rem 0; margin-bottom: .75rem;
    border-bottom: 1px solid var(--border);
    font-size: .82rem; color: var(--ink-muted);
}
.hm-toolbar-right { display: flex; align-items: center; gap: .75rem; }
.hm-sort {
    padding: .3rem .5rem; border: 1px solid var(--border);
    border-radius: var(--radius); font-size: .78rem;
    color: var(--ink-secondary); background: var(--surface);
}
.hm-views { display: flex; gap: .25rem; }
.hm-view {
    width: 32px; height: 32px;
    display: flex; align-items: center; justify-content: center;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--surface); color: var(--ink-muted);
    cursor: pointer; transition: all .15s;
}
.hm-view.active,
.hm-view:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-light); }

/* Results — list view (default) */
.halfmap-results { display: flex; flex-direction: column; gap: .75rem; }

/* Card — list layout */
.hm-card {
    display: flex; gap: 1rem;
    background: var(--surface-card);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    overflow: hidden;
    transition: box-shadow .2s, border-color .2s;
}
.hm-card:hover {
    border-color: var(--accent);
    box-shadow: 0 4px 16px rgba(30,160,229,.12);
}

.hm-card-thumb {
    position: relative; flex: 0 0 240px; min-height: 180px;
    overflow: hidden; background: var(--surface-warm);
}
.hm-card-thumb img {
    width: 100%; height: 100%; object-fit: cover;
    transition: transform .4s ease;
}
.hm-card:hover .hm-card-thumb img { transform: scale(1.05); }
.hm-card-placeholder {
    width: 100%; height: 100%;
    background: var(--surface-warm);
}

.hm-card-badges {
    position: absolute; top: .5rem; left: .5rem;
    display: flex; gap: .3rem;
}
.hm-card-actions {
    position: absolute; bottom: .5rem; right: .5rem;
    display: flex; gap: .3rem;
}

.hm-card-body {
    flex: 1; padding: .75rem 1rem .75rem 0;
    display: flex; flex-direction: column; justify-content: center;
}
.hm-card-link { text-decoration: none; }
.hm-card-title {
    font-family: var(--font-display); font-size: 1rem;
    font-weight: 600; color: var(--ink); margin-bottom: .25rem;
    line-height: 1.3;
}
.hm-card-link:hover .hm-card-title { color: var(--accent); }

.hm-card-address {
    display: flex; align-items: center; gap: .3rem;
    font-size: .78rem; color: var(--ink-muted);
    margin-bottom: .5rem;
}
.hm-card-address svg { color: var(--accent); flex-shrink: 0; }

.hm-card-meta {
    display: flex; gap: .75rem; flex-wrap: wrap;
    font-size: .78rem; color: var(--ink-secondary);
    margin-bottom: .5rem;
}
.hm-card-meta span {
    display: flex; align-items: center; gap: .25rem;
}
.hm-card-meta svg { color: var(--ink-muted); }

.hm-card-bottom {
    display: flex; align-items: baseline; gap: .75rem;
    flex-wrap: wrap; margin-top: auto;
}
.hm-card-price {
    font-family: var(--font-display); font-size: 1.1rem;
    font-weight: 700; color: var(--accent);
}
.hm-card-year,
.hm-card-date {
    font-size: .75rem; color: var(--ink-muted);
}

/* Grid view */
.halfmap-results.hm-grid-view {
    display: grid; grid-template-columns: repeat(2, 1fr); gap: .75rem;
}
.hm-grid-view .hm-card {
    flex-direction: column;
}
.hm-grid-view .hm-card-thumb {
    flex: none; min-height: 160px; aspect-ratio: 16/10;
}
.hm-grid-view .hm-card-body {
    padding: .75rem;
}

/* Pagination */
/* El mapa manda (1.64.0): estado de la lista mientras sigue al mapa */
.hm-count-mode { font-style: normal; color: var(--ink-dim, #5b6b7a); }
.halfmap-results.is-loading { opacity: .55; pointer-events: none; transition: opacity .2s; }
.hm-no-results--mapa { padding: 40px 16px; }

.halfmap-pagination {
    padding: 1rem 0; text-align: center;
}
.halfmap-pagination .nav-links {
    display: flex; justify-content: center; gap: .3rem;
}
.halfmap-pagination .page-numbers {
    display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px;
    border: 1px solid var(--border); border-radius: var(--radius);
    font-size: .82rem; color: var(--ink-secondary);
    text-decoration: none; transition: all .15s;
}
.halfmap-pagination .page-numbers.current,
.halfmap-pagination .page-numbers:hover {
    background: var(--accent); color: #fff; border-color: var(--accent);
}

/* No results */
.hm-no-results {
    text-align: center; padding: 4rem 1rem; color: var(--ink-muted);
}
.hm-no-results h2 { color: var(--ink); margin: .75rem 0 .5rem; }

/* Leaflet tiles — sepia parcial preserva blancos, hue-rotate→azul, saturate amplifica */
.leaflet-tile-pane {
    filter: sepia(.5) hue-rotate(160deg) saturate(5) brightness(1.02) contrast(1.1);
}

/* Leaflet marker custom */
@keyframes marker-drop {
    0%   { transform: translateY(-50px); opacity: 0; }
    60%  { transform: translateY(5px);  opacity: 1; }
    80%  { transform: translateY(-3px); }
    100% { transform: translateY(0); }
}

.inmuex-marker {
    background: none !important; border: none !important;
}
.inmuex-marker svg {
    animation: marker-drop 0.4s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.inmuex-marker.marker-active svg path { fill: var(--accent-hover); }

/* Marker clusters */
.inmuex-cluster-wrap { background: none !important; border: none !important; }
.inmuex-cluster {
    width: 40px; height: 40px;
    background: var(--accent); color: #fff;
    border-radius: 50%; border: 3px solid #fff;
    box-shadow: 0 2px 8px rgba(0,0,0,.25);
    display: flex; align-items: center; justify-content: center;
    font-size: .85rem; font-weight: 700;
}

/* Popup estilizado */
.inmuex-popup-wrap .leaflet-popup-content-wrapper {
    border-radius: 10px; padding: 0; overflow: hidden;
    box-shadow: 0 4px 16px rgba(0,0,0,.15);
}
.inmuex-popup-wrap .leaflet-popup-content { margin: 0; min-width: 180px; }
.inmuex-popup-wrap .leaflet-popup-tip { border-top-color: #fff; }
.inmuex-popup img {
    width: 100%; height: 100px; object-fit: cover; display: block;
}
.inmuex-popup strong {
    display: block; padding: .4rem .6rem 0; font-size: .8rem;
    color: var(--ink); line-height: 1.3;
}
.inmuex-popup .popup-price {
    display: block; padding: .15rem .6rem .4rem;
    font-size: .85rem; font-weight: 700; color: var(--accent);
}

/* No header padding on half-map page */
.halfmap-page + .site-footer { margin-top: 0; }
body:has(.halfmap-page) .site-main { padding: 0; margin: 0; }
body:has(.sp-hero) .site-main { padding: 0; margin: 0; }
body:has(.halfmap-page) .site-header { position: fixed; width: 100%; z-index: 100; }

/* ---- Responsive half-map ---- */
@media (max-width: 900px) {
    .halfmap-page { flex-direction: column; height: auto; }
    .halfmap-map { flex: none; height: 300px; position: relative; top: 0; width: 100%; }
    .halfmap-list { flex: none; height: auto; padding: 1rem; margin-left: 0; }
    .hm-card-thumb { flex: 0 0 160px; min-height: 140px; }
    .halfmap-results.hm-grid-view { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
    .halfmap-filters { flex-direction: column; }
    .hm-select, .hm-price-range { width: 100%; }
    .hm-card { flex-direction: column; }
    .hm-card-thumb { flex: none; min-height: 180px; aspect-ratio: 16/10; }
    .hm-card-body { padding: .75rem; }
}

/* ---- Buscador compartido en el archive (template-parts/search-form, variant archive) ---- */
.halfmap-search { margin-bottom: 1rem; }
.halfmap-search .search-box--archive {
    max-width: 100%;
    border-radius: 24px;
    padding: .75rem 1rem;
}
.halfmap-search .search-box--archive .search-row { flex-wrap: wrap; gap: .5rem; row-gap: .6rem; }
.halfmap-search .search-box--archive .search-location-wrap { flex: 1 1 220px; }
.halfmap-search .search-box--archive .btn-search { margin-left: auto; }
.halfmap-search .search-box--archive:has(.search-advanced-panel.open) { border-radius: 20px; }
.halfmap-search .search-box--archive .adv-row { flex-wrap: wrap; }
.halfmap-search .search-box--archive .search-advanced-panel.open { max-height: 560px; }
.halfmap-search .search-toggle-wrap { margin-top: .5rem; text-align: right; }

/* Mapa del archive — MISMO look azul que la portada (pisa el hue-rotate global de .leaflet-tile-pane) */
.halfmap-map .leaflet-tile-pane { filter: url(#blue-map); }

/* Popup del mapa: link "Ver propiedad" */
.inmuex-popup .popup-link { display: block; margin-top: .35rem; font-size: .8rem; font-weight: 600; color: var(--accent); text-decoration: none; }
.inmuex-popup .popup-link:hover { text-decoration: underline; }

/* ---- Guardar búsqueda (campanita) — banner tras búsqueda activa en el archive ---- */
.halfmap-save-search {
    display: flex; align-items: center; gap: 12px;
    margin-bottom: 1rem; padding: 12px 16px;
    background: rgba(30, 160, 229, .06);
    border: 1px solid rgba(30, 160, 229, .25);
    border-radius: 12px;
    animation: hmSaveIn .35s ease;
}
@keyframes hmSaveIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
.halfmap-save-search .hm-save-icon {
    display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
    width: 36px; height: 36px; border-radius: 50%;
    background: rgba(30, 160, 229, .12); color: var(--accent, var(--accent));
    font-weight: 700;
}
.halfmap-save-search .hm-save-text { flex: 1; font-size: .85rem; color: var(--ink-secondary, #3d4b5c); line-height: 1.35; }
.halfmap-save-search .hm-save-btn {
    flex-shrink: 0; padding: .55rem 1.1rem; border: 0; border-radius: 50px;
    background: var(--accent, var(--accent)); color: #fff; font-weight: 600; font-size: .82rem;
    cursor: pointer; transition: filter .15s;
}
.halfmap-save-search .hm-save-btn:hover { filter: brightness(1.08); }
.halfmap-save-search .hm-save-btn:disabled { opacity: .6; cursor: default; }
.halfmap-save-search.is-saved { background: rgba(34, 160, 107, .07); border-color: rgba(34, 160, 107, .3); }
.halfmap-save-search.is-saved .hm-save-icon { background: rgba(34, 160, 107, .14); color: #22a06b; }
.halfmap-save-search .hm-save-link { flex-shrink: 0; font-size: .82rem; font-weight: 600; color: var(--accent, var(--accent)); text-decoration: none; }
.halfmap-save-search .hm-save-link:hover { text-decoration: underline; }

/* ==== Buscador compartido: tabs 2x2 + ubicación con autocomplete + dropdown Tipo ====
   (movido del inline del hero; scope .search-box → aplica en portada Y archive) ==== */
.search-box .search-tabs-2x2 {
    display: flex;
    gap: 4px;
    flex-shrink: 0;
}
.search-box .search-tabs-2x2 .search-tab {
    padding: 4px 12px;
    font-size: 11px;
    line-height: 1.2;
    text-align: center;
    white-space: nowrap;
}

/* Input de ubicación con autocomplete (estilo RE/MAX, cápsula) */
.search-box .search-location-wrap {
    position: relative;
    flex: 1 1 auto;
    min-width: 220px;
    display: flex;
    align-items: center;
    border: 1px solid var(--border, #e0e0e0);
    border-radius: 50px;
    background: var(--surface-card);
    transition: border-color .15s, background .15s;
}
.search-box .search-location-wrap:focus-within {
    border-color: var(--accent, var(--accent));
    background: rgba(30, 160, 229, .04);
}
.search-box .search-location-icon {
    position: absolute;
    left: 12px;
    color: var(--ink-muted);
    pointer-events: none;
}
.search-box .search-location-input {
    width: 100%;
    padding: .5rem 2.1rem .5rem 2rem; /* right: espacio para la tachita */
    border: 0;
    background: transparent;
    border-radius: 50px;
    font-size: .85rem;
    color: var(--ink, #0f1a26);
    outline: none;
}
.search-box .search-location-input::placeholder {
    color: var(--ink-muted);
}
/* Tachita: limpia la ubicación de un click (JS la muestra solo con texto) */
.search-box .search-location-clear {
    position: absolute;
    right: 8px;
    top: 50%;
    transform: translateY(-50%);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border: 0;
    border-radius: 50%;
    background: rgba(0, 0, 0, .06);
    color: var(--ink-muted);
    cursor: pointer;
    transition: background .15s, color .15s;
}
.search-box .search-location-clear:hover {
    background: rgba(30, 160, 229, .12);
    color: var(--accent, var(--accent));
}
.search-box .search-location-clear[hidden] {
    display: none;
}
.search-box .search-location-list {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    background: var(--surface-card);
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, .18);
    max-height: 320px;
    overflow-y: auto;
    z-index: 1100;
    padding: 6px 0;
}
.search-box .search-location-list[hidden] {
    display: none;
}
.search-box .search-location-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 14px;
    cursor: pointer;
    transition: background .12s;
}
.search-box .search-location-item:hover,
.search-box .search-location-item.is-active {
    background: rgba(30, 160, 229, .08);
}
.search-box .search-location-item-type {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    flex-shrink: 0;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .5px;
}
.search-box .search-location-item-type.t-pais {
    background: #ffe7d6;
    color: #b35c1f;
}
.search-box .search-location-item-type.t-estado {
    background: #e0f0ff;
    color: var(--accent);
}
.search-box .search-location-item-type.t-ciudad {
    background: #e8f5e9;
    color: #2e7d32;
}
.search-box .search-location-item-text {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
    min-width: 0;
}
.search-box .search-location-item-label {
    font-weight: 600;
    color: var(--ink);
    font-size: 13px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.search-box .search-location-item-context {
    color: var(--ink-muted);
    font-size: 11px;
    margin-top: 1px;
}
.search-box .search-location-empty {
    padding: 14px;
    text-align: center;
    color: var(--ink-muted);
    font-size: 12px;
}

/* === Dropdown de Tipo de Inmueble (estilo RE/MAX) === */
.search-box .search-tipo-wrap {
    position: relative;
    flex-shrink: 0;
}
.search-box .search-tipo-toggle {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: .5rem 1rem;
    border: 1px solid var(--border, #e0e0e0);
    border-radius: 50px;
    background: var(--surface-card);
    color: var(--ink, #0f1a26);
    font-size: .85rem;
    font-weight: 500;
    cursor: pointer;
    transition: border-color .15s, background .15s;
    white-space: nowrap;
}
.search-box .search-tipo-toggle:hover,
.search-box .search-tipo-toggle.is-open {
    border-color: var(--accent, var(--accent));
    background: rgba(30, 160, 229, .04);
}
.search-box .search-tipo-caret {
    color: var(--ink-muted);
    transition: transform .2s;
}
.search-box .search-tipo-toggle.is-open .search-tipo-caret {
    transform: rotate(180deg);
}
.search-box .search-tipo-panel {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    background: var(--surface-card);
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, .18);
    z-index: 1100;
    display: grid;
    grid-template-columns: 130px 220px;
    grid-template-rows: 1fr auto;
    overflow: hidden;
    min-width: 350px;
}
.search-box .search-tipo-panel[hidden] {
    display: none;
}
.search-box .search-tipo-cats {
    background: var(--surface);
    display: flex;
    flex-direction: column;
    padding: 6px 0;
    border-right: 1px solid var(--border);
    grid-row: 1;
}
.search-box .search-tipo-cat {
    background: transparent;
    border: 0;
    padding: 10px 14px;
    text-align: left;
    cursor: pointer;
    color: var(--ink-secondary);
    font-size: 13px;
    font-weight: 500;
    transition: background .12s, color .12s;
}
.search-box .search-tipo-cat:hover {
    color: var(--accent, var(--accent));
}
.search-box .search-tipo-cat.is-active {
    background: var(--surface-card);
    color: var(--accent, var(--accent));
    font-weight: 600;
    border-left: 3px solid var(--accent, var(--accent));
    padding-left: 11px;
}
.search-box .search-tipo-subs {
    padding: 8px 6px;
    max-height: 280px;
    overflow-y: auto;
    grid-row: 1;
}
.search-box .search-tipo-sub-group {
    display: none;
}
.search-box .search-tipo-sub-group.is-active {
    display: block;
}
.search-box .search-tipo-option {
    display: block;
    width: 100%;
    text-align: left;
    border: 0;
    background: transparent;
    padding: 8px 12px;
    cursor: pointer;
    border-radius: 6px;
    font-size: 13px;
    color: var(--ink);
    transition: background .12s, color .12s;
}
.search-box .search-tipo-option:hover {
    background: rgba(30, 160, 229, .08);
    color: var(--accent, var(--accent));
}
.search-box .search-tipo-option.is-selected {
    background: var(--accent, var(--accent));
    color: #fff;
    font-weight: 600;
}
.search-box .search-tipo-footer {
    grid-column: 1 / -1;
    grid-row: 2;
    display: flex;
    justify-content: space-between;
    padding: 10px 14px;
    border-top: 1px solid var(--border);
    background: var(--surface);
}
.search-box .search-tipo-clear,
.search-box .search-tipo-apply {
    background: transparent;
    border: 0;
    padding: 6px 12px;
    font-size: 12px;
    cursor: pointer;
    border-radius: 6px;
    transition: background .12s;
}
.search-box .search-tipo-clear {
    color: var(--ink-muted);
}
.search-box .search-tipo-clear:hover {
    color: var(--ink);
    background: rgba(0, 0, 0, .04);
}
.search-box .search-tipo-apply {
    color: var(--accent, var(--accent));
    font-weight: 600;
}
.search-box .search-tipo-apply:hover {
    background: rgba(30, 160, 229, .1);
}

/* ==== Tarjeta de propiedad en popups del mapa (portada Y archive) — movida del inline del hero ==== */
/* Click popup en markers — card clickable que navega al single */
.leaflet-popup.inmuex-marker-popup .leaflet-popup-content-wrapper {
    background: var(--surface-card);
    border-radius: 12px;
    padding: 0;
    overflow: hidden;
    box-shadow: 0 12px 32px rgba(15, 26, 38, 0.22), 0 2px 6px rgba(15, 26, 38, 0.1);
}
.leaflet-popup.inmuex-marker-popup .leaflet-popup-content {
    margin: 0;
    width: 240px !important;
    font-family: inherit;
}
.leaflet-popup.inmuex-marker-popup .leaflet-popup-tip { background: var(--surface-card); }
.inmuex-marker-card {
    display: block;
    text-decoration: none;
    color: var(--ink);
    transition: transform .15s ease;
    cursor: pointer;
}
.inmuex-marker-card:hover { transform: translateY(-2px); }
.inmuex-marker-card .tip-img {
    width: 100%;
    height: 130px;
    background-size: cover;
    background-position: center;
    background-color: var(--surface-warm);
}
.inmuex-marker-card .tip-img-empty {
    background: linear-gradient(135deg, var(--surface-warm) 0%, var(--border) 100%);
}
.inmuex-marker-card .tip-body { padding: 10px 14px 12px; }
.inmuex-marker-card .tip-price {
    color: var(--accent);
    font-weight: 700;
    font-size: 15px;
    margin-bottom: 4px;
}
.inmuex-marker-card .tip-title {
    font-size: 13px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1.3;
    margin-bottom: 6px;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.inmuex-marker-card .tip-meta {
    display: flex;
    gap: 6px;
    font-size: 11px;
    color: var(--ink-secondary);
    margin-bottom: 4px;
    text-transform: capitalize;
}
.inmuex-marker-card .tip-tipo::after {
    content: '·';
    margin-left: 6px;
    opacity: .5;
}
.inmuex-marker-card .tip-specs {
    font-size: 11px;
    color: var(--ink-secondary);
}

/* ---- Recuperar contraseña (modal auth) ---- */
button.auth-forgot { background: none; border: 0; padding: 0; color: var(--accent, var(--accent)); font-size: .78rem; cursor: pointer; font-weight: 500; }
button.auth-forgot:hover { text-decoration: underline; }
.auth-recovery-intro { font-size: .85rem; color: var(--ink-secondary, #3d4b5c); line-height: 1.45; margin: 0 0 14px; }
.auth-back-login { display: block; margin: 12px auto 0; background: none; border: 0; color: var(--ink-muted, #7a8794); font-size: .8rem; cursor: pointer; }
.auth-back-login:hover { color: var(--accent, var(--accent)); }
.auth-success { display: block; margin: 8px 0; font-size: .82rem; color: #22a06b; font-weight: 600; }

/* ============================================================
   PERFIL PÚBLICO DEL ASESOR  ·  /asesor/{slug}
   Desktop-first: dos columnas en escritorio, una en móvil.
   La rejilla usa auto-fill para APROVECHAR el ancho disponible
   en vez de fijar 3 columnas y truncar.
   ============================================================ */

/* Franja de regreso — el header DEL ASESOR dentro de su tarjeta.
   Pegajosa a propósito: sustituye a la navegación que no está, así que tiene que
   seguir al visitante. Su cara lo acompaña toda la visita, que es justo lo que
   compra un agente. */
.tarjeta-volver {
    position: sticky; top: 0; z-index: 100;
    display: flex; align-items: center; gap: .7rem;
    padding: .55rem clamp(1rem, 3vw, 2rem);
    background: rgba(255, 255, 255, .92);
    backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--border);
    color: var(--ink-secondary); font-size: .9rem;
    text-decoration: none;
}
.tarjeta-volver:hover { color: var(--ink); }
.tarjeta-volver__flecha { flex: none; transition: transform .15s ease; }
.tarjeta-volver:hover .tarjeta-volver__flecha { transform: translateX(-3px); }

.tarjeta-volver__avatar {
    width: 34px; height: 34px; flex: none;
    border-radius: 50%; overflow: hidden;
    background: var(--asesor-color, var(--accent)); color: #fff;
    display: grid; place-items: center;
    font-weight: 700; font-size: .85rem;
}
.tarjeta-volver__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tarjeta-volver__texto strong { color: var(--ink); font-weight: 600; }

@media (max-width: 560px) {
    /* En móvil el nombre basta; la frase completa parte el renglón. */
    .tarjeta-volver__texto { font-size: .82rem; }
    .tarjeta-volver__texto br { display: none; }
}

/* En modo tarjeta no se imprime el header, así que su alto deja de existir.
   `--header-h` está horneada en varias reglas (barras pegajosas, dropdowns);
   apagarla aquí las corrige todas de un golpe. */
body.inmuex-tarjeta { --header-h: 0px; }

/* El color del asesor (--asesor-color, en línea sobre .asesor) tiñe la portada
   y baja en degradado hasta fundirse con la página. */
.asesor {
    /* Alto de la portada en un token: el degradado del hero tiene que empezar
       EXACTAMENTE donde ella termina, y con dos números sueltos se desfasaban.
       Fluido: en pantallas anchas una banda baja se ve apretada. */
    --asesor-portada-h: clamp(240px, 24vw, 360px);

    /* EL COLOR A PLENA FUERZA EN LA BANDA DE IDENTIDAD.
       Un color diluido en blanco NO conserva su identidad: el #CC0000 de
       Keller Williams al 14% es rosa bebé, y subir el porcentaje solo da un
       rosa más fuerte. Rojo + blanco es rosa a cualquier dosis. Por eso el
       color va SIN diluir en la franja donde vive el asesor —su nombre, su
       empresa, sus botones— que es donde tiene que reconocerse, y el área de
       contenido se queda clara para que las fichas se lean.
       Es el reparto de a9ent: tema fuerte en la identidad, contenido legible. */
    --asesor-banda: var(--asesor-color);

    /* EL FONDO ES EL COLOR, completo. No diluido (salía pastel) ni neutro
       (entonces no se ve). Toda la página del asesor va de su color, y encima
       flotan los paneles y las fichas con su propia superficie — que es lo que
       las mantiene legibles sin quitarle presencia a la marca. */
    --asesor-fondo: var(--asesor-color);

    background: var(--asesor-fondo);
    min-height: 100vh;   /* el color llega hasta abajo aunque haya poco contenido */
}

/* ---- La banda de identidad: color pleno y tinta clara ------------------- */
.asesor-hero { background: var(--asesor-banda); }

/* Toda la tinta de la banda se invierte. Se usa currentColor y blancos
   translúcidos —no un gris fijo— para que funcione lo mismo sobre el rojo de
   Keller Williams que sobre el dorado de Century 21. */
.asesor-hero .asesor-nombre,
.asesor-hero .asesor-empresa,
.asesor-hero .asesor-stats strong { color: var(--asesor-tinta); }
.asesor-hero .asesor-stats { color: color-mix(in srgb, var(--asesor-tinta) 82%, transparent); }
.asesor-hero .asesor-desde  { color: color-mix(in srgb, var(--asesor-tinta) 62%, transparent); }
.asesor-hero .asesor-tipo {
    background: color-mix(in srgb, var(--asesor-tinta) 18%, transparent);
    color: var(--asesor-tinta);
}

/* Los botones sobre la banda: el color ya lo lleva el fondo, así que "Llamar"
   se invierte —fondo claro, texto del color del asesor— y los secundarios
   pasan a contorno de la misma tinta. */
.asesor-hero .asesor-acciones .btn-primary {
    background: var(--asesor-tinta);
    border-color: var(--asesor-tinta);
    color: var(--asesor-color);
}
.asesor-hero .asesor-acciones .btn-primary:hover {
    background: color-mix(in srgb, var(--asesor-tinta) 88%, #000);
    border-color: color-mix(in srgb, var(--asesor-tinta) 88%, #000);
}
.asesor-hero .asesor-acciones .btn-outline {
    color: var(--asesor-tinta);
    border-color: color-mix(in srgb, var(--asesor-tinta) 45%, transparent);
    background: transparent;
}
.asesor-hero .asesor-acciones .btn-outline:hover {
    background: color-mix(in srgb, var(--asesor-tinta) 14%, transparent);
    border-color: var(--asesor-tinta);
    color: var(--asesor-tinta);
}

.asesor-hero {
    /* Sin degradado propio: el fondo de la página YA es el color. Lo único que
       hace falta es el espacio bajo la portada. */
    padding-bottom: var(--space-lg);
    /* Contenedor del logo (1.53.3). Sin esto, el .asesor-logo absoluto se anclaba a
       la PÁGINA: en la tarjeta (sin header) coincidía por casualidad, pero en el
       perfil dentro del portal el hero arranca bajo el header sticky y el logo se
       quedaba 45px arriba, tapado y cortado (lo cazó Mike). Sin z-index a propósito:
       no crea contexto de apilamiento y el orden interno sigue igual. */
    position: relative;
}

.asesor-portada {
    position: relative;
    height: var(--asesor-portada-h);
    background: var(--asesor-color) center / cover no-repeat;
}

/* El degradado va SIEMPRE, haya foto o solo color: sin él la banda corta en
   seco contra la página y se ve la línea. Termina OPACO en el color exacto de
   lo que sigue —así lo hace la tarjeta de a9ent— en vez de quedarse a media
   opacidad, que es lo que dejaba el borde visible.
   Arranca al 35% para que la foto se lea completa arriba y solo su tercio
   bajo se disuelva. */
.asesor-portada::after {
    content: ''; position: absolute; inset: 0;
    background: linear-gradient(180deg, transparent 35%, var(--asesor-banda) 100%);
}

/* Logo de la inmobiliaria sobre la portada.
   Medido en la tarjeta de a9ent (captura detalle-temas-remax-century21): su
   logo ocupa ~61% del ancho, mide ~95px de alto y va DIRECTO sobre la foto,
   sin caja ni pastilla. La primera versión de aquí lo metía en un recuadro
   blanco de 38px y se veía como una calcomanía pegada. */
.asesor-logo {
    position: absolute;
    top: clamp(1rem, 2.5vw, 1.75rem);
    /* En escritorio a la DERECHA: la izquierda de la portada es donde sube el
       avatar y donde arranca el nombre, así que el logo ahí competía con la
       identidad del asesor. A la derecha respalda sin estorbar. */
    right: clamp(1.25rem, 3vw, 2.5rem);
    z-index: 2;                       /* encima del degradado (::after) */
    display: block;
    max-width: min(58%, 460px);
    /* La altura vive en un token porque el HALO se calcula a partir de ella:
       con radios fijos, los 20px que se ven bien sobre un logo de 96px pesan
       el doble sobre uno de 43px en móvil. */
    --logo-h: clamp(52px, 7vw, 96px);

    /* Intensidad del halo, en un solo número. Multiplica los tres radios a la
       vez, así que subirlo o bajarlo lo ajusta PAREJO en todos los tamaños y
       en todas las marcas, sin tocar seis valores sueltos. */
    --logo-glow-f: .46;
}
.asesor-logo img {
    display: block;
    height: var(--logo-h);
    width: auto;
    max-width: 100%;
    object-fit: contain;
    /* Sin caja, la legibilidad la da una sombra suave: separa el logo de la
       foto sin encerrarlo. Doble capa —una corta y opaca, otra larga y
       difusa— para que funcione igual sobre cielo claro que sobre fachada
       oscura, que es el rango real de las portadas. */
    filter: drop-shadow(0 1px 2px rgba(0,0,0,.28)) drop-shadow(0 6px 18px rgba(0,0,0,.22));
    transition: filter .25s var(--ease, ease);
}

/* HALO DE CONTRASTE. `--logo-glow` es blanco o negro —nunca el color del
   logo— y lo decide inmuex-core al subirlo, según si el logo es oscuro o
   claro. Un halo del mismo color no separa: el rojo de RE/MAX rodeado de rojo
   se sigue perdiendo sobre una fachada rojiza; lo que lo despega de cualquier
   foto es el contraste de LUZ.
   Es un drop-shadow sin desplazamiento, así que rodea la silueta real del PNG
   y no una caja. Tres capas: una pegada que perfila, una media y una amplia
   que da el resplandor. */
.asesor-logo--glow img {
    /* Radios PROPORCIONALES a la altura del logo, no en píxeles fijos: así el
       halo se ve igual de intenso en escritorio (96px → 2/8/20) que en móvil
       (43px → 1/4/9). Con valores fijos, el mismo halo ahogaba al logo chico. */
    filter:
        drop-shadow(0 0 calc(var(--logo-h) * .021 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .085 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .21  * var(--logo-glow-f)) var(--logo-glow));
}
/* Al pasar el cursor sube un punto — el logo es un sello de respaldo, no un
   botón, así que la reacción debe ser sutil. */
.asesor-logo--glow:hover img {
    filter:
        drop-shadow(0 0 calc(var(--logo-h) * .031 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .125 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .29  * var(--logo-glow-f)) var(--logo-glow));
}
@media (prefers-reduced-motion: reduce) {
    .asesor-logo img { transition: none; }
}

.asesor-hero__inner {
    display: grid;
    grid-template-columns: auto 1fr auto;
    align-items: center;
    gap: var(--space-xl);
    padding-top: var(--space-md);
    /* .asesor-portada está posicionada, así que sin esto se pinta ENCIMA del
       avatar y el encimado desaparece. */
    position: relative;
    z-index: 1;
}

.asesor-avatar {
    width: 140px; height: 140px;
    border-radius: 50%;
    overflow: hidden;
    flex: none;
    align-self: start;
    margin-top: -78px;           /* encima de la portada, como en la tarjeta */
    background: var(--asesor-color);
    display: grid; place-items: center;
    box-shadow: 0 0 0 5px #fff, var(--shadow);
}
.asesor-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.asesor-avatar__iniciales { font-size: 2.8rem; font-weight: 700; color: #fff; letter-spacing: .02em; }

.asesor-nombre { font-size: 2rem; line-height: 1.15; margin: 0 0 .35rem; color: var(--ink); }
.asesor-cargo { margin: 0 0 .5rem; display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }
.asesor-empresa { font-weight: 600; color: var(--ink); }
.asesor-tipo {
    font-size: .78rem; text-transform: uppercase; letter-spacing: .06em;
    background: var(--asesor-tinte); color: var(--ink);
    padding: .2rem .6rem; border-radius: 999px;
}
.asesor-stats { margin: 0; font-size: .92rem; color: var(--ink-secondary); }
.asesor-stats strong { color: var(--ink); font-size: 1.05rem; }
.asesor-desde { color: var(--ink-muted); }

/* Llamar solo y arriba: es la acción que busca quien llega a un perfil. */
/* Los cuatro botones en UNA fila y del mismo tamaño: Llamar se distingue por el
   color, no por ser más grande ni ir en un renglón aparte. */
.asesor-acciones { display: flex; flex-wrap: wrap; gap: var(--space-sm); justify-content: flex-end; }
/* `.btn + .btn { margin-top: .6rem }` es para botones APILADOS. En una fila
   horizontal ese margen empuja al 2º y 3er botón hacia abajo y, con el stretch
   del flex, los deja 9.6px más BAJOS que el primero — se ve como si WhatsApp
   fuera más alto. Mismo remedio que ya existe para `.main-nav`. */
.asesor-acciones .btn + .btn { margin-top: 0; }

/* "Llamar" lleva el color del asesor a PLENA intensidad, no el azul del
   portal. Es la única superficie grande donde su color aparece sin diluir: el
   fondo de la página va al 14% para que el texto se lea, así que sin esto un
   verde fuerte se percibe como menta y el asesor cree que no se guardó lo que
   eligió. Mismo criterio que a9ent, cuyos botones toman el color del tema.
   WhatsApp NO se toca: su verde es reconocimiento de marca, no decoración. */
.asesor-acciones .btn-primary {
    background: var(--asesor-color);
    border-color: var(--asesor-color);
}
.asesor-acciones .btn-primary:hover {
    /* Oscurecer un porcentaje del propio color funciona con cualquier tono
       elegido; un hex fijo solo serviría para el azul del portal. */
    background: color-mix(in srgb, var(--asesor-color) 85%, #000);
    border-color: color-mix(in srgb, var(--asesor-color) 85%, #000);
}

/* ---- cuerpo: ficha + inventario ---- */
.asesor-layout {
    display: grid;
    grid-template-columns: 320px 1fr;
    gap: var(--space-2xl);
    align-items: start;
    /* lg y no 2xl: con los 24px de padding-bottom del hero, 64px aquí dejaban
       88px muertos entre los botones y "Propiedades de…". */
    padding-top: var(--space-lg);
    padding-bottom: var(--space-3xl);
}

/* El descuento del header lo resuelve `body.inmuex-tarjeta { --header-h: 0px }`,
   así que aquí basta con respetar la variable. */
.asesor-ficha { position: sticky; top: calc(var(--header-h) + var(--space-md)); display: grid; gap: var(--space-lg); }
.asesor-bloque {
    background: var(--surface-card);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    padding: var(--space-lg);
}
.asesor-bloque__titulo { font-size: 1rem; margin: 0 0 var(--space-sm); color: var(--ink); }
.asesor-bio { color: var(--ink-secondary); font-size: .94rem; line-height: 1.65; }
.asesor-bio p:last-child { margin-bottom: 0; }

/* Redes con el color de su marca: se reconocen de un vistazo, que es justo lo
   que un enlace de texto no logra. El nombre queda para lectores de pantalla. */
.asesor-redes { list-style: none; margin: .9rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
.asesor-red {
    width: 38px; height: 38px; border-radius: 50%;
    display: grid; place-items: center;
    /* Base del botón social: círculo oscuro con icono claro. Las marcas
       (Facebook, WhatsApp…) lo pisan con su color; este es el default y el
       que usan las que no tienen color propio. */
    background: var(--inverse-bg); color: var(--inverse-ink);
    transition: transform .15s ease, filter .15s ease;
}
.asesor-red svg { width: 19px; height: 19px; display: block; }
.asesor-red:hover { transform: translateY(-2px); filter: brightness(1.1); }
.asesor-red__nombre {
    position: absolute; width: 1px; height: 1px;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}

.asesor-red--facebook  { background: #1877f2; }
.asesor-red--instagram { background: linear-gradient(45deg, #f09433, #e6683c, #dc2743, #cc2366, #bc1888); }
.asesor-red--linkedin  { background: #0a66c2; }
.asesor-red--youtube   { background: #ff0000; }
.asesor-red--tiktok    { background: #010101; }
.asesor-red--website   { background: var(--asesor-color); }
.asesor-red--whatsapp  { background: #25d366; }
.asesor-red--email     { background: var(--inverse-bg); }
.asesor-red--sms       { background: #34c759; }

/* Compartir el perfil ("Share my Card" del competidor): mismos círculos. */
.asesor-compartir__redes {
    list-style: none; margin: .3rem 0 0; padding: 0;
    display: flex; gap: .5rem; justify-content: center;
}

/* OJO: .btn-block ya existe arriba (Buttons) como flex. Aquí hubo un duplicado
   `display: block; text-align: center` que, por ir después, ganaba en TODO el
   sitio y dejaba los SVG de los botones (Llamar / WhatsApp / Enviar email del
   single) como inline sobre la línea base — íconos flotando arriba del texto. */

/* ---- inventario ---- */
.asesor-inventario__head {
    display: flex; flex-wrap: wrap; align-items: baseline;
    justify-content: space-between; gap: var(--space-md);
    margin-bottom: var(--space-lg);
}
.asesor-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.asesor-chip {
    font-size: .85rem; padding: .4rem .9rem; border-radius: 999px;
    border: 1px solid var(--border-strong); color: var(--ink-secondary);
    transition: all .15s ease;
}
.asesor-chip:hover { border-color: var(--accent); color: var(--accent); }
.asesor-chip.is-activo { background: var(--accent); border-color: var(--accent); color: #fff; }

/* Aprovecha el ancho: 2 columnas a 1440, 3 a 1920+, sin fijar nada. */
/* DOS columnas fijas, como el competidor — no auto-fill. auto-fill daba 2, 3 o
   4 tarjetas según el ancho de la ventana; aquí el inventario es la carne del
   perfil y se ve mejor con tarjetas grandes y un conteo estable. */
.asesor-grid { grid-template-columns: repeat(2, 1fr); }

.asesor-vacio { color: var(--ink-muted); padding: var(--space-2xl) 0; text-align: center; }

/* ---- Lo que va DIRECTO sobre el color del asesor ------------------------
   Los paneles y las fichas traen su propia superficie, así que se leen solos.
   Estos cuatro no: van sueltos sobre el fondo de color y necesitan la tinta
   que contrasta con la marca (blanca sobre Keller Williams, oscura sobre el
   dorado de Century 21). */
.asesor .section-title,
.asesor .asesor-vacio { color: var(--asesor-tinta); }

.asesor .asesor-chip {
    color: color-mix(in srgb, var(--asesor-tinta) 88%, transparent);
    border-color: color-mix(in srgb, var(--asesor-tinta) 40%, transparent);
}
.asesor .asesor-chip:hover {
    color: var(--asesor-tinta);
    border-color: var(--asesor-tinta);
    background: color-mix(in srgb, var(--asesor-tinta) 12%, transparent);
}
/* El chip activo se invierte: superficie clara con el color de la marca. */
.asesor .asesor-chip.is-activo {
    background: var(--asesor-tinta);
    border-color: var(--asesor-tinta);
    color: var(--asesor-color);
}

.asesor .asesor-paginacion a,
.asesor .asesor-paginacion span {
    color: color-mix(in srgb, var(--asesor-tinta) 85%, transparent);
    border-color: color-mix(in srgb, var(--asesor-tinta) 32%, transparent);
}
.asesor .asesor-paginacion .current {
    background: var(--asesor-tinta);
    border-color: var(--asesor-tinta);
    color: var(--asesor-color);
}

.asesor-paginacion { margin-top: var(--space-xl); }
.asesor-paginacion ul { list-style: none; display: flex; gap: .4rem; padding: 0; margin: 0; justify-content: center; }
.asesor-paginacion a, .asesor-paginacion span {
    display: grid; place-items: center; min-width: 40px; height: 40px; padding: 0 .6rem;
    border: 1px solid var(--border); border-radius: var(--radius); color: var(--ink-secondary);
}
.asesor-paginacion .current { background: var(--accent); border-color: var(--accent); color: #fff; }

@media (max-width: 1024px) {
    .asesor-layout { grid-template-columns: 1fr; gap: var(--space-xl); }
    /* Al apilarse, el inventario va PRIMERO —es a lo que viene quien abre un
       perfil— y la ficha (bio + compartir) se va hasta abajo. En escritorio la
       barra lateral no estorba; apilada, empujaría las propiedades fuera de la
       primera pantalla. */
    .asesor-inventario { order: 1; }
    .asesor-ficha { order: 2; position: static; }

    /* El hero también se reacomoda aquí. Con `auto 1fr auto` la columna de
       botones exige ~430px de max-content, y a 820px dejaba la identidad en
       107px: el nombre partido en una tira vertical, los datos en cuatro
       renglones y las redes en tres filas. Los botones pasan a su propio
       renglón, a todo lo ancho. */
    .asesor-hero__inner { grid-template-columns: auto 1fr; row-gap: var(--space-md); }
    /* El avatar ocupa las DOS filas y los botones quedan alineados bajo el
       nombre. Si los botones arrancan en la columna 1 (bajo el avatar), la fila
       de arriba se queda con un hueco a la derecha y el bloque se ve roto. */
    .asesor-avatar { grid-row: 1 / span 2; }
    .asesor-acciones { grid-column: 2; justify-content: flex-start; }
}

@media (max-width: 768px) {
    /* Dos columnas TAMBIÉN en móvil, igual que el competidor. A ~169px de ancho
       la tarjeta necesita su propia escala: con la de escritorio, "2 rec." se
       parte en dos renglones y queda "2 / rec.". Solo aplica dentro del perfil;
       la tarjeta del resto del sitio no se toca. */
    .asesor-grid { gap: var(--space-sm); }
    .asesor-grid .property-info { padding: .7rem; }
    .asesor-grid .property-price { font-size: 1.05rem; }
    .asesor-grid .property-price-m2 { font-size: .7rem; }
    .asesor-grid .property-title { font-size: .82rem; line-height: 1.35; }
    .asesor-grid .property-specs { gap: .5rem; font-size: .72rem; }
    .asesor-grid .property-specs > * { white-space: nowrap; }
    .asesor-grid .property-meta-bottom { font-size: .68rem; gap: .35rem; }
    .asesor-grid .property-location,
    .asesor-grid .property-age { white-space: nowrap; }
    /* En móvil también con aire: 140px dejaban una franja sin lugar para que
       el degradado ocurriera. Se toca el TOKEN, no la altura, para que el
       degradado del hero siga cuadrando con ella. */
    .asesor { --asesor-portada-h: 200px; }

    /* El logo se CENTRA: en móvil el avatar y el nombre también se centran
       (ver .asesor-hero__inner abajo), así que un logo pegado a un costado
       rompería el eje. Se anulan los anclajes laterales y se centra con
       translate, que no depende de saber su ancho. */
    .asesor-logo {
        left: 50%;
        right: auto;
        transform: translateX(-50%);
        max-width: 66%;
        /* Se cambia el TOKEN, no la altura: el halo se calcula a partir de él
           y así encoge en la misma proporción que el logo. */
        --logo-h: clamp(40px, 11vw, 64px);
    }
    .asesor-hero { padding-bottom: var(--space-lg); }
    .asesor-hero__inner {
        grid-template-columns: 1fr; justify-items: center; text-align: center;
        gap: var(--space-md); padding-top: 0;
    }
    .asesor-cargo, .asesor-redes { justify-content: center; }
    /* Hay que DESHACER lo del bloque de ≤1024: aquí la rejilla es de una sola
       columna, y un `grid-column: 2` heredado le inventa una segunda columna
       implícita que encajona todo a la derecha. */
    .asesor-avatar { grid-row: auto; }
    .asesor-acciones { grid-column: auto; }
    .asesor-avatar { width: 104px; height: 104px; margin-top: -52px; }
    .asesor-avatar__iniciales { font-size: 2rem; }
    .asesor-nombre { font-size: 1.5rem; }
    .asesor-acciones { width: 100%; justify-content: center; }
    .asesor-acciones .btn { flex: 1 1 auto; text-align: center; }
}

/* Pie mínimo del perfil — reemplaza al del portal (condicional en footer.php).
   Un renglón, como el competidor: marca discreta + el bucle de crecimiento. */
.asesor-pie {
    display: flex; align-items: center; justify-content: center;
    flex-wrap: wrap; gap: 1rem;
    padding: var(--space-xl) var(--space-md);
    border-top: 1px solid var(--border);
    font-size: .88rem;
}
.asesor-pie__marca { display: inline-flex; align-items: center; gap: .5rem; color: var(--ink-secondary); }
.asesor-pie__marca strong { color: var(--ink); letter-spacing: .06em; font-weight: 700; }
.asesor-pie__marca:hover strong { color: var(--accent); }

/* QR del perfil del asesor — mismo tamaño y misma caja que el de la propiedad (.sp-qr, 1.54.0):
   200px, sobre blanco también en oscuro, centrado. aspect-ratio evita el brinco mientras el JS
   lo pinta. */
.asesor-compartir { display: grid; gap: .6rem; }
.asesor-compartir__lead { font-size: .85rem; color: var(--ink-secondary); line-height: 1.45; margin: -.2rem 0 .1rem; }
.asesor-qr {
    width: 200px; margin: 0 auto; padding: 4px; aspect-ratio: 1;
    background: #fff;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
}
.asesor-qr svg { display: block; width: 100%; height: auto; }
.asesor-qr__pie { font-size: .8rem; color: var(--ink-muted); margin: 0 0 .2rem; text-align: center; }

/* ============================================================
   OSCURO — ajustes a medida
   ============================================================
   Lo que NO se resuelve volteando un token, porque su color no es una
   superficie ni tinta del sistema sino una señal propia. Van aquí, juntos y
   explicados, en vez de repartidos por el archivo.
   ============================================================ */

/* Chips de tipo de lugar en el autocompletado: en claro son pasteles sólidos
   (durazno / azul / verde). Sobre fondo casi negro un pastel sólido grita más
   que el propio resultado — se vuelven velo del mismo tono con la tinta clara. */
[data-theme="dark"] .search-box .search-location-item-type.t-pais {
    background: rgba(179, 92, 31, .20);
    color: #e0a26a;
}
[data-theme="dark"] .search-box .search-location-item-type.t-estado {
    background: rgba(30, 160, 229, .18);
}
[data-theme="dark"] .search-box .search-location-item-type.t-ciudad {
    background: rgba(46, 125, 50, .22);
    color: #7cc47f;
}

/* Avisos del formulario de contacto: los verdes y rojos oscuros están
   calibrados para leerse sobre blanco; sobre negro se apagan y el usuario no
   sabe si su mensaje salió. Se aclaran conservando el significado. */
[data-theme="dark"] .inmuex-lead-status.is-success { color: #3ddc97; }
[data-theme="dark"] .inmuex-lead-status.is-error   { color: #ff7a70; }
[data-theme="dark"] .auth-success                  { color: #3ddc97; }

/* Franja de regreso de la tarjeta del asesor: es vidrio esmerilado sobre el
   contenido. En claro es blanco translúcido; en oscuro tiene que ser oscuro
   translúcido o se vuelve una banda blanca encima de todo. */
[data-theme="dark"] .tarjeta-volver {
    background: rgba(18, 24, 33, .92);
}


/* ============================================================================
   DIRECTORIO DE ASESORES — /agentes/
   ============================================================================
   El muro es de MARCAS: cada ficha va del color del asesor, con su logo y su
   halo. Un directorio inmobiliario normal es una cuadrícula gris de fotos de
   cabeza; este se lee como producto, y de paso reusa entera la cara que ya se
   construyó para el perfil.

   Dos reglas heredadas del perfil, y las dos por algo:

   · El color de cada ficha NO voltea con el tema. Una marca es una marca —
     mismo criterio que los colores de las redes y el fondo del QR. Lo que
     voltea es el SUELO de la página.
   · La tinta de cada ficha sale de SU color (`--tinta`, que calcula
     `inmuex_tinta_sobre()` por luminancia), nunca de `--ink`. Pintar un rol
     con el token de otro es justo la trampa que dejó el footer blanco sobre
     blanco: aquí `--ink` en oscuro es casi blanco y sobre el dorado de
     Century 21 no se leería nada.
*/

.dir {
    padding: clamp(2rem, 5vw, 3.5rem) 0 clamp(3rem, 7vw, 5rem);
    background: var(--surface-warm);
}

.dir-intro { max-width: 640px; margin: 0 0 clamp(1.75rem, 4vw, 2.75rem); }
.dir-intro h1 {
    font-size: clamp(1.9rem, 5vw, 2.8rem); font-weight: 800;
    letter-spacing: -.02em; color: var(--ink); margin: 0 0 .6rem;
}
.dir-intro p { font-size: 1.02rem; line-height: 1.6; color: var(--ink-muted); margin: 0; }

/* Columnas por breakpoints EXPLÍCITOS, no `auto-fill`: con auto-fill el muro
   daba 2, 3 o 4 fichas según la ventana y el ritmo se perdía — es la misma
   decisión que ya se tomó en el inventario del perfil.
   Todo en `min-width` (mobile-first) para no caer en la herencia de ≤1024 → ≤768
   que ya costó una ronda en el hero. */
.dir-muro {
    display: grid;
    gap: clamp(1rem, 2vw, 1.5rem);
    grid-template-columns: 1fr;
}
@media (min-width: 600px)  { .dir-muro { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px)  { .dir-muro { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1320px) { .dir-muro { grid-template-columns: repeat(4, 1fr); } }

/* `container-type: inline-size` para poder medir en `cqw` (% del ancho de LA
   FICHA) y no en `vw`. No es lujo: el muro va de 4 columnas a 1, así que la
   ficha es MÁS ANCHA en móvil que en escritorio. Con `vw`, el logo y el avatar
   salían más chicos justo donde la ficha es más grande — al revés de lo que
   pide el ojo. */
.dir-ficha {
    --c: var(--accent);
    --tinta: #fff;
    container-type: inline-size;
    position: relative;
    display: flex; flex-direction: column;
    background: var(--c);
    color: var(--tinta);
    border-radius: var(--radius-lg);
    overflow: hidden;
    text-decoration: none;
    box-shadow: var(--shadow);
    transition: transform .28s var(--ease-out-quart, ease), box-shadow .28s;
}
.dir-ficha:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
.dir-ficha:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; }

/* La portada termina OPACA en el color de la ficha. Si el degradado muriera en
   transparente se vería la línea de corte — es el mismo pixel-peeping que ya se
   pagó en el perfil. */
.dir-ficha__portada {
    position: relative;
    height: clamp(108px, 44cqw, 142px);
    background: var(--c) center / cover no-repeat;
}
.dir-ficha__portada::after {
    content: ''; position: absolute; inset: 0;
    background: linear-gradient(
        to bottom,
        transparent 28%,
        color-mix(in srgb, var(--c) 55%, transparent) 68%,
        var(--c) 100%
    );
}

/* Halo con la MISMA fórmula del perfil: radios como fracción de --logo-h para
   que escale, y --logo-glow-f como única perilla. */
.dir-ficha__logo {
    position: absolute; top: .85rem; right: .95rem; z-index: 2;
    display: block; max-width: 46%;
    --logo-h: clamp(28px, 13cqw, 42px);
    --logo-glow-f: .46;
}
.dir-ficha__logo img {
    display: block; height: var(--logo-h); width: auto;
    max-width: 100%; object-fit: contain;
    filter: drop-shadow(0 1px 2px rgba(0,0,0,.28)) drop-shadow(0 6px 18px rgba(0,0,0,.22));
}
.dir-ficha--glow .dir-ficha__logo img {
    filter:
        drop-shadow(0 0 calc(var(--logo-h) * .021 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .085 * var(--logo-glow-f)) var(--logo-glow))
        drop-shadow(0 0 calc(var(--logo-h) * .21  * var(--logo-glow-f)) var(--logo-glow));
}

.dir-ficha__cuerpo {
    position: relative;
    padding: 0 clamp(1rem, 2.2vw, 1.35rem) clamp(1.1rem, 2.4vw, 1.4rem);
}

/* El avatar sube a montarse en la costura, igual que en el perfil. El anillo va
   del color de la ficha: contra la banda no se nota y contra la foto la corta,
   que es justo lo que se busca. */
.dir-ficha__avatar {
    --av: clamp(60px, 24cqw, 78px);
    position: relative; z-index: 2;
    display: grid; place-items: center;
    width: var(--av); height: var(--av);
    margin: calc(var(--av) / -2) 0 .7rem;
    border-radius: 50%; overflow: hidden;
    background: var(--c);
    border: 3px solid var(--c);
    box-shadow: 0 2px 10px rgba(16, 24, 40, .22);
    font-weight: 800; font-size: 1.05rem; color: var(--tinta);
}
.dir-ficha__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }

.dir-ficha__nombre {
    font-size: 1.08rem; font-weight: 800; letter-spacing: -.01em;
    margin: 0 0 .15rem; color: var(--tinta);
}
.dir-ficha__empresa {
    font-size: .86rem; margin: 0 0 .9rem;
    color: color-mix(in srgb, var(--tinta) 74%, transparent);
}
.dir-ficha__meta {
    display: flex; flex-wrap: wrap; align-items: center; gap: .45rem;
    margin: 0; padding-top: .8rem; font-size: .8rem;
    color: color-mix(in srgb, var(--tinta) 84%, transparent);
    border-top: 1px solid color-mix(in srgb, var(--tinta) 22%, transparent);
}
.dir-ficha__meta span + span::before { content: '·'; margin-right: .45rem; opacity: .6; }

@media (prefers-reduced-motion: reduce) {
    .dir-ficha { transition: none; }
    .dir-ficha:hover { transform: none; }
}

/* ------------------------------------------------
   Página genérica — page.php (1.59.2): Términos, Aviso de privacidad y toda página
   sin plantilla propia. Antes caía en index.php y se pintaba como extracto de blog.
   Columna de lectura (780px), tipografía de prosa sobre los tokens del tema.
   ------------------------------------------------ */
.pagina { padding: var(--space-2xl) 0 var(--space-3xl); }
.pagina__cuerpo { max-width: 780px; }
.pagina__titulo { font-size: clamp(1.9rem, 3vw, 2.5rem); letter-spacing: -.02em; margin-bottom: var(--space-lg); }
.prosa { font-size: 1.02rem; line-height: 1.7; color: var(--ink-secondary); }
.prosa p, .prosa ul, .prosa ol { margin: 0 0 1.1rem; }
.prosa h2 { font-size: 1.3rem; margin: 2rem 0 .7rem; color: var(--ink); }
.prosa h3 { font-size: 1.1rem; margin: 1.5rem 0 .5rem; color: var(--ink); }
.prosa ul, .prosa ol { padding-left: 1.3rem; }
.prosa li { margin-bottom: .4rem; }
.prosa strong { color: var(--ink); font-weight: 600; }
.prosa a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.prosa em { color: var(--ink-muted); }
@media (max-width: 768px) {
    .pagina { padding: var(--space-xl) 0 var(--space-2xl); }
}

/* ============================================================
   BLOG — indice y archivos de categoria (1.63.0)
   Las tarjetas reusan .blog-grid / .blog-card de la portada.
   La paginacion hereda .pagination (linea ~1105).
   ============================================================ */
.blog-listado { padding: clamp(2rem, 5vw, 3.5rem) 0 var(--space-3xl, 5rem); background: var(--surface); }

.bl-head { max-width: 760px; margin: 0 0 var(--space-lg); }
.bl-title {
    font-family: var(--font-display);
    font-size: clamp(1.8rem, 4vw, 2.6rem);
    font-weight: 800; line-height: 1.12; letter-spacing: -.01em;
    color: var(--ink); margin: 0 0 .6rem;
}
.bl-desc { font-size: clamp(.95rem, 1.4vw, 1.05rem); line-height: 1.6; color: var(--ink-muted); margin: 0; }

.bl-cats { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0 0 var(--space-lg); }
.bl-cat {
    display: inline-block; padding: .45rem .9rem;
    border: 1px solid var(--border); border-radius: 999px;
    background: var(--surface-card);
    font-size: .82rem; font-weight: 600; color: var(--ink-secondary, var(--ink));
    text-decoration: none; transition: border-color .15s, color .15s, background .15s;
}
.bl-cat:hover { border-color: var(--accent); color: var(--accent); }
/* activa: acento solido + blanco, no tinte (5.a/6.a trampa del CLAUDE.md) */
.bl-cat.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }

.bl-vacio {
    text-align: center; padding: var(--space-2xl) var(--space-md);
    background: var(--surface-card); border: 1px solid var(--border); border-radius: 16px;
}
.bl-vacio p { color: var(--ink-muted); margin: 0 0 var(--space-md); }

@media (max-width: 768px) {
    .bl-head { margin-bottom: var(--space-md); }
    .bl-cats { gap: .4rem; margin-bottom: var(--space-md); }
    .bl-cat { padding: .38rem .75rem; font-size: .76rem; }
}
