/* ============================================================
   Ficha de la propiedad — PÁGINA /propiedad/<slug> (buscador público).
   Solo se carga en esa página (layouts/header.php mira $sin_filtros).
   En PC: galería a la izquierda y datos a la derecha. En teléfono: una
   columna, con la galería arriba.

   Nota: fue una ventana emergente de Bootstrap hasta que la ficha pasó a ser
   una página. Por eso las medidas siguen siendo de "pantalla completa": lo que
   cambió es que ahora scrollea la página y no una caja interna.
   ============================================================ */

/* Ocupa todo su contenedor. Antes llevaba márgenes negativos para romper el p-4
   del <body>, que ya no existe; dejarlos la sacaría 24px por cada lado y habría
   scroll horizontal. NO usar 100vw: en PC incluye la barra de desplazamiento. */
.ficha-pagina {
    background: var(--bs-body-bg);
    display: flex; flex-direction: column; min-height: calc(100vh - 90px);
}
.ficha-head {
    border-bottom: 1px solid var(--bs-border-color); padding: 12px 16px;
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
    /* Se queda arriba al bajar: desde ahí se vuelve al buscador y se comparte.
       Va justo debajo de la barra del sitio, que también es sticky; su altura la
       mide ficha.js en --dr-nav (cambia con el ancho de la pantalla). */
    position: sticky; top: var(--dr-nav, 86px); z-index: 3; background: var(--bs-body-bg);
}
.fi-accion { text-decoration: none; }
.fi-titulo { font-size: 1.15rem; }
.ficha-head-izq { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ficha-head-der { display: flex; align-items: center; gap: 10px; }
.fi-op { background: #d4af37; color: #3a2e07; font-weight: 600; }
.fi-accion {
    width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;
    border: 1px solid var(--bs-border-color); background: transparent; color: #d4af37;
    display: inline-flex; align-items: center; justify-content: center; font-size: 1rem;
}
.fi-accion:hover { background: #d4af37; color: #3a2e07; border-color: #d4af37; }
/* Guardada en Favoritos / Comparación: relleno, igual que en la tarjeta. */
.fi-accion.activo { background: #d4af37; color: #3a2e07; border-color: #d4af37; }

/* En el teléfono la cabecera pasó a llevar 6 piezas (volver, código, operación y
   los tres botones): suman más que el ancho de la pantalla y se partía en dos
   renglones, con la flecha sola arriba. Se aprietan los botones y se retira la
   píldora de la operación, que está repetida en el título de justo debajo
   ("Apartamento en Venta"); el código, que es lo que identifica al inmueble, se
   queda. */
@media (max-width: 575.98px) {
    .ficha-head { padding: 10px 12px; gap: 6px; }
    .ficha-head-izq, .ficha-head-der { gap: 6px; }
    .fi-accion { width: 34px; height: 34px; }
    .ficha-head .fi-op { display: none; }
}

/* overflow-x oculto: la ficha se lee de arriba abajo, nunca de lado. Es la red por
   si algún texto o dato nuevo se pasa de ancho en una pantalla estrecha.
   Va en los bloques de contenido y NO en .ficha-pagina: overflow (aunque sea solo
   en x) convierte al elemento en contenedor de scroll, y entonces la cabecera
   sticky se calcula contra ÉL — se pintaba 86px más abajo, encima de la galería. */
.ficha-grid, .fi-relacionadas { overflow-x: hidden; }
.ficha-grid { display: grid; grid-template-columns: 1fr; gap: 0; max-width: 1200px; margin: 0 auto; min-width: 0; width: 100%; }
.ficha-galeria, .ficha-datos { min-width: 0; }
@media (min-width: 992px) {
    .ficha-grid { grid-template-columns: minmax(0, 1.25fr) minmax(320px, 1fr); gap: 24px; padding: 20px; }
}

/* ---------- Galería ---------- */
/* Las fotos no vienen todas en 4:3, así que sobra espacio arriba y abajo. Ese relleno
   va del color del tema (claro u oscuro), no en negro: las franjas negras parecían un
   fallo. Se usa la variable de Bootstrap para que siga al tema sin reglas duplicadas. */
.gal-marco { position: relative; width: 100%; aspect-ratio: 4/3; background: var(--bs-tertiary-bg); overflow: hidden; }
@media (min-width: 992px) { .gal-marco { border-radius: 14px; } }
.gal-img { width: 100%; height: 100%; object-fit: contain; display: block; cursor: zoom-in; }
.gal-nav {
    position: absolute; top: 50%; transform: translateY(-50%);
    width: 42px; height: 42px; border-radius: 50%; border: none;
    background: rgba(0,0,0,.5); color: #fff; font-size: 1.2rem;
    display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.gal-nav:hover { background: #d4af37; color: #3a2e07; }
.gal-prev { left: 10px; }
.gal-next { right: 10px; }
.gal-cuenta {
    position: absolute; bottom: 10px; left: 10px;
    background: rgba(0,0,0,.6); color: #fff; font-size: .75rem; font-weight: 600;
    padding: 3px 10px; border-radius: 20px;
}
.gal-descargar {
    position: absolute; bottom: 10px; right: 10px;
    width: 38px; height: 38px; border-radius: 10px;
    background: rgba(0,0,0,.6); color: #fff; text-decoration: none;
    display: inline-flex; align-items: center; justify-content: center;
}
.gal-descargar:hover { background: #d4af37; color: #3a2e07; }
.gal-tiras { display: flex; gap: 8px; overflow-x: auto; padding: 10px 12px; }
.gal-tira {
    width: 76px; height: 58px; border-radius: 9px; overflow: hidden; flex-shrink: 0;
    border: 2px solid transparent; background: var(--bs-tertiary-bg); padding: 0; cursor: pointer;
}
.gal-tira img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gal-tira.activa { border-color: #d4af37; }
/* EN PC LAS MINIATURAS LLENAN LO QUE SOBRE DE LA COLUMNA.

   El hueco que se veía debajo de la galería no era de una ficha concreta: la columna
   izquierda medía SIEMPRE 587 px —una foto en 4:3 más UNA fila de miniaturas— y la
   derecha crece con el texto, así que el hueco era la resta. Medido en seis fichas de
   producción: de 71 a 245 px de rectángulo vacío. Lo reportó el usuario con capturas.

   Y había algo desaprovechado justo ahí: esa ficha tiene 27 fotos y se veían 7,
   arrastrando una barra horizontal fina que casi no se nota. Ahora las miniaturas
   bajan de fila y ocupan el alto que la columna deje libre. Medido después, a 1536 px:
   la de 27 fotos pasa de 238 px de hueco a 20 y se ven las 27 de golpe; la de 23, de
   126 a 0. Con pocas fotos se reduce a la mitad y no llega a cero, porque las filas
   van completas o no van — con 18 fotos entran tres filas exactas y no hay una cuarta.

   LAS DOS PIEZAS QUE LO HACEN POSIBLE, y sin cualquiera de ellas no funciona:
   · `grid-template-rows: auto minmax(0, 1fr)` — la tira se queda con lo que sobre. Con
     `flex: 1` NO basta: el contenido envuelto estira el elemento y arrastra la columna
     entera (medido: la ficha pasaba de 825 px a 929 y el hueco se daba la vuelta).
   · `min-height: 0` — sin él un elemento no baja de su contenido y pasa lo mismo.

   EN EL TELÉFONO NO CAMBIA NADA: ahí la ficha es de una sola columna y la tira
   horizontal funciona bien; por eso va dentro de la media query. */
@media (min-width: 992px) {
    /* EL ALTO LO MANDA LA COLUMNA DE TEXTO, NUNCA LAS MINIATURAS.

       `height: 0` hace que la galería no aporte altura a la fila —así la fila la
       decide la columna de la derecha— y `min-height: 100%` la estira luego hasta
       llenarla. Sin esto, una ficha con MUCHAS fotos hacía lo contrario de lo que
       arregla todo lo demás: la tira crecía, empujaba la página y el hueco aparecía
       al otro lado, junto al texto. Lo reportó el usuario con una de 30 fotos:
       la izquierda llegaba a 1025 px y la derecha a 740 — 285 px de hueco.

       Con esto, esa misma ficha deja las dos columnas en 740 y la página baja de
       1045 a 760. Lo que no cabe se desplaza DENTRO de la tira (ahí se ven 14 de 30),
       que es justo lo que `minmax(0, 1fr)` y `min-height: 0` permiten. Y no toca
       ninguna otra ficha: medidas las de 11, 13, 18, 20, 23 y otra de 30, todas se
       quedan exactamente igual. */
    .ficha-galeria {
        display: grid; grid-template-rows: auto minmax(0, 1fr);
        height: 0; min-height: 100%;
    }
    .gal-tiras {
        flex-wrap: wrap;
        /* Las FILAS se reparten el alto que sobre, en vez de amontonarse arriba y
           dejar el resto vacío. Es lo que lleva el hueco a cero en todas las fichas y
           no solo en las que tienen muchas fotos: con 18 se quedaba en 139 px.

           LO QUE CUESTA, y el usuario lo aprobó sabiéndolo: la miniatura deja de ser
           4:3 y se pone más alta que ancha —de 76x58 pasa a entre 76x96 y 76x125,
           según cuánto haya que llenar—, así que la foto se recorta más por los lados.
           Para volver atrás basta con `align-content: flex-start` y quitar el `height`
           de abajo; o poner un `max-height` en `.gal-tira` para limitar cuánto crecen,
           a cambio de que en las fichas con pocas fotos vuelva a quedar algo de hueco. */
        align-content: stretch;
        min-height: 0; overflow-x: hidden; overflow-y: auto;
    }
    /* Sin `height: auto` la FILA se estira pero la miniatura no: tiene el alto fijo
       en 58 px. Y el `max-height` es el freno: sin él la miniatura llegaba a 76x125
       —más alta que ancha— y la foto se recortaba demasiado por los lados.

       96 NO ES UN NÚMERO INVENTADO: es lo que le sale sola a una ficha de 8 fotos, o
       sea el crecimiento natural más pequeño que se midió. Con él todas las fichas
       enseñan la miniatura del MISMO tamaño, que antes iba de 96 a 125 según cuántas
       fotos tuviera cada una.

       Y el tope no devuelve el hueco: lo que sobra se reparte como separación ENTRE
       filas (medido: de 8 a 37 px según la ficha), no se acumula abajo. */
    .gal-tira { height: auto; max-height: 96px; }
}

/* El flyer va al final y se distingue: es una pieza distinta de una foto. */
.gal-tira.es-flyer img { object-fit: contain; background: var(--bs-tertiary-bg); }

/* ---------- Datos ---------- */
.ficha-datos { padding: 16px; }
@media (min-width: 992px) { .ficha-datos { padding: 0; } }
/* Precio y título comparten renglón (baseline: las dos letras se apoyan en la
   misma línea aunque tengan tamaños muy distintos). Si no caben, el título baja
   solo, sin desmontar nada. */
/* Precio primero y a la izquierda, con el titulo debajo: es el dato que se busca
   al abrir la ficha. Antes iban en la misma linea con el precio empujado a la
   derecha (margin-left:auto), y en el telefono el precio caia solo a un lado. */
.fi-cabecera { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; margin-bottom: 6px; }
.fi-precio { font-size: 1.7rem; font-weight: 700; color: #b8860b; line-height: 1.15; }
/* Precio y costo por m2 en el mismo renglon, apoyados en la misma linea de base.
   La pildora (.prop-pm2) se pinta en el <style> de layouts/header.php, la misma
   que usa la tarjeta del listado. */
/* Centradas entre si, no por la linea de base: apoyada en la base del precio (que
   es mucho mas grande) la pildora se veia caida hacia abajo. */
.fi-precio-fila { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.fi-titulo { font-size: 1.15rem; font-weight: 700; margin: 0; }
.fi-ubic { font-size: .88rem; color: var(--bs-secondary-color); margin-bottom: 16px; }
.fi-ubic i { color: #d4af37; }

/* La fila de datos es EXACTAMENTE la de la tarjeta del listado: se reutilizan sus
   clases (.prop-specs / .spec-label / .spec-ic), definidas en el <style> de
   layouts/header.php, que esta página también carga. Aquí solo va la separación.
   Se probaron cajas propias (dos por fila, luego tres) y quedaban altas y pesadas;
   la fila de la tarjeta dice lo mismo en un renglón y ya es el lenguaje del sitio. */
.fi-specs { margin-bottom: 18px; }
/* Etiqueta larga / corta según quepa. Nacieron para las cajas de datos de la ficha
   —que ya no existen— pero las USA la tabla de comparación para los nombres de sus
   filas, y comparar.php carga esta misma hoja. Si se borran, esa tabla enseña los
   dos textos pegados. */
.lbl-corta { display: none; }
@media (max-width: 575.98px) {
    .lbl-larga { display: none; }
    .lbl-corta { display: inline; }
}

.fi-bloque { margin-bottom: 18px; }
.fi-sub { font-size: .8rem; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: #b8860b; margin-bottom: 8px; }
.fi-sub-fila { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.fi-mini {
    border: 1px solid var(--bs-border-color); background: transparent; color: var(--bs-body-color);
    border-radius: 8px; padding: 5px 11px; font-size: .78rem; font-weight: 600; cursor: pointer;
    display: inline-flex; align-items: center; gap: 6px; margin-bottom: 8px;
}
.fi-mini:hover { border-color: #d4af37; color: #b8860b; }
/* overflow-wrap: una URL o una palabra larga dentro de la ficha descriptiva
   ensancharía el bloque y volvería a sacar la página de la pantalla. */
.fi-ficha { font-size: .88rem; line-height: 1.55; white-space: pre-line; color: var(--bs-body-color); overflow-wrap: anywhere; }
.fi-servicios { display: flex; flex-wrap: wrap; gap: 6px; }
.fi-serv { font-size: .76rem; font-weight: 600; padding: 4px 11px; border-radius: 20px; background: rgba(212,175,55,.16); color: #b8860b; }

/* ---------- Agente ---------- */
.fi-agente {
    display: flex; align-items: center; gap: 12px;
    border: 1px solid var(--bs-border-color); border-radius: 14px; padding: 12px;
}
.fi-ag-avatar {
    width: 54px; height: 54px; border-radius: 50%; flex-shrink: 0; overflow: hidden;
    background: #d4af37; color: #3a2e07; font-weight: 700; font-size: 1.1rem;
    display: flex; align-items: center; justify-content: center;
    border: 2px solid #fff; box-shadow: 0 0 0 2px #d4af37;
}
.fi-ag-avatar img { width: 100%; height: 100%; object-fit: cover; }
.fi-ag-datos { flex: 1; min-width: 0; }
.fi-ag-nombre { font-weight: 700; font-size: .95rem; }
.fi-ag-cargo { font-size: .78rem; color: #b8860b; font-weight: 600; }
.fi-ag-botones { display: flex; gap: 8px; flex-shrink: 0; }
.fi-ag-btn {
    width: 40px; height: 40px; border-radius: 11px; color: #fff; text-decoration: none;
    display: inline-flex; align-items: center; justify-content: center; font-size: 1.05rem;
}
.fi-ag-btn.wa { background: #25D366; }
.fi-ag-btn.tel { background: #00c3ff; }

/* ---------- Ventana de compartir ---------- */
.comp-btn {
    display: flex; align-items: center; gap: 10px; width: 100%;
    border: 1px solid var(--bs-border-color); background: transparent; color: var(--bs-body-color);
    border-radius: 11px; padding: 12px 14px; font-size: .92rem; font-weight: 600; cursor: pointer;
}
.comp-btn:hover { border-color: #d4af37; }
.comp-btn i { color: #d4af37; font-size: 1.15rem; }

/* ============================================================
   Fotos protegidas del menú del navegador
   Mantener pulsado (o el botón derecho) ofrecía "descargar/copiar imagen",
   saltándose la decisión del agente sobre si sus fotos pueden circular.
   Aquí ese gesto pasa a servir para ELEGIR fotos (ver .gal-tira.marcada).
   ============================================================ */
.gal-img, .gal-tira img, .gv-img {
    -webkit-user-select: none; user-select: none;
    -webkit-touch-callout: none;   /* iOS: nada de menú al mantener pulsado */
    -webkit-user-drag: none;
}

/* ---------- Elegir fotos para descargar ---------- */
.gal-seleccion {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    padding: 8px 12px; font-size: .82rem; font-weight: 600;
    background: rgba(212,175,55,.14); color: #b8860b;
}
.gal-seleccion[hidden] { display: none; }
.gal-sel-btn {
    border: 1px solid #d4af37; background: transparent; color: #b8860b;
    border-radius: 8px; padding: 4px 12px; font-size: .78rem; font-weight: 600; cursor: pointer;
}
.gal-sel-btn:hover { background: #d4af37; color: #3a2e07; }
/* El de descargar es el que manda en esta barra: va relleno, solo con el icono y
   separado del resto. Cuántas fotos van lo dice el texto de la izquierda. */
.gal-sel-btn.descargar {
    background: #d4af37; color: #3a2e07; margin-left: auto;
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 32px; padding: 0; font-size: 1rem;
}
.gal-sel-btn.descargar:hover { background: #b8860b; color: #fff; }
.gal-sel-btn.descargar:disabled { opacity: .5; cursor: default; }
/* Una miniatura elegida: marca dorada arriba a la derecha. */
.gal-tira { position: relative; }
.gal-tira.marcada { border-color: #d4af37; }
.gal-tira.marcada::after {
    content: "\F26E";   /* bi-check-lg */
    font-family: "bootstrap-icons"; position: absolute; top: 2px; right: 2px;
    width: 20px; height: 20px; border-radius: 50%;
    background: #d4af37; color: #3a2e07; font-size: .7rem;
    display: flex; align-items: center; justify-content: center;
}

/* ---------- Foto ampliada ---------- */
.gal-visor {
    position: fixed; inset: 0; z-index: 1080;
    display: flex; align-items: center; justify-content: center;
    /* El entorno se difumina en vez de taparse a secas. */
    background: rgba(10,12,15,.72);
    -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
    padding: 60px 12px;
}
.gal-visor[hidden] { display: none; }
.gv-img { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 10px; }
.gv-cerrar, .gv-nav {
    position: absolute; border: none; cursor: pointer;
    background: rgba(255,255,255,.16); color: #fff;
    display: flex; align-items: center; justify-content: center;
}
.gv-cerrar { top: 14px; right: 14px; width: 44px; height: 44px; border-radius: 12px; font-size: 1.1rem; }
.gv-nav { top: 50%; transform: translateY(-50%); width: 46px; height: 46px; border-radius: 50%; font-size: 1.3rem; }
.gv-prev { left: 12px; }
.gv-next { right: 12px; }
.gv-cerrar:hover, .gv-nav:hover { background: #d4af37; color: #3a2e07; }
.gv-cuenta {
    position: absolute; bottom: 18px; left: 50%; transform: translateX(-50%);
    background: rgba(0,0,0,.55); color: #fff; font-size: .8rem; font-weight: 600;
    padding: 4px 14px; border-radius: 20px;
}

/* ---------- Mapa de la propiedad (solo con exclusividad) ---------- */
.fi-mapa { position: relative; width: 100%; aspect-ratio: 4/3; border-radius: 12px; overflow: hidden; background: var(--bs-tertiary-bg); }
.fi-mapa iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
/* Misma franja que el popup de Ubicación: tapa el chip "Abrir en Maps" de Google,
   que confunde porque el botón bueno es el dorado de abajo. */
.fi-mapa .mapa-tapa {
    position: absolute; top: 0; left: 0; right: 0; z-index: 2;
    display: flex; align-items: center; gap: 7px;
    min-height: 42px; padding: 9px 12px;
    background: var(--bs-body-bg); color: var(--bs-body-color);
    font-size: .8rem; font-weight: 600;
    border-bottom: 1px solid var(--bs-border-color);
}
.fi-mapa .mapa-tapa i { color: #d4af37; flex-shrink: 0; }
.fi-mapa .mapa-tapa span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fi-mapa-btn {
    display: flex; align-items: center; justify-content: center; gap: 8px;
    margin-top: 10px; padding: 10px 14px; border-radius: 10px;
    background: #d4af37; color: #3a2e07; text-decoration: none; font-weight: 700; font-size: .9rem;
}
.fi-mapa-btn:hover { background: #b8860b; color: #fff; }

/* ---------- Propiedades parecidas ---------- */
.fi-relacionadas { padding: 4px 16px 24px; max-width: 1200px; margin: 0 auto; }
@media (min-width: 992px) { .fi-relacionadas { padding: 0 20px 28px; } }
.fi-relacionadas[hidden] { display: none; }
/* FILAS SIEMPRE COMPLETAS. Era `auto-fill`, que deja que la rejilla invente las
   columnas según el ancho — y con 6 tarjetas casi nunca cuadraba. Medido antes de
   tocarlo: a 900 px salían 5+1 (cuatro huecos), a 800 y 700 salían 4+2 (dos huecos),
   y a 1200 la rejilla hacía SIETE columnas para seis tarjetas, dejando una vacía y
   encogiendo cada una a 157 px. Lo reportó el usuario con capturas.

   Ahora el número de columnas es fijo por tramo y lo que se enseña es SIEMPRE un
   múltiplo de ellas: 2 columnas -> 6 (tres filas) · 3 columnas -> 6 (dos filas) ·
   4 columnas -> 4 (una fila). Nunca 5 ni 7, que son las que no dividen a 6.

   En PC son CUATRO y ocupan una sola fila (decisión del usuario): con el contenedor
   a 1200 px la tarjeta pasa de 157 a 292 px, que es donde se distingue la foto.

   `minmax(0, 1fr)` y no `1fr`: en un grid, `1fr` no deja encoger por debajo del
   contenido y saca scroll horizontal en el teléfono (la trampa de 8.10). */
.fi-rel-lista { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
/* Con seis en la mano, de la séptima en adelante no se enseña nada. */
.fi-rel-lista > .fi-rel:nth-child(n+7) { display: none; }
@media (min-width: 576px) { .fi-rel-lista { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 992px) {
    .fi-rel-lista { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    .fi-rel-lista > .fi-rel:nth-child(n+5) { display: none; }
}
/* Es un enlace de verdad (cada parecida tiene su URL): display block y sin
   subrayado, o se vería como texto enlazado dentro de la tarjeta. */
.fi-rel {
    display: block; text-decoration: none; color: inherit;
    border: 1px solid var(--bs-border-color); border-radius: 12px; overflow: hidden;
    background: transparent; padding: 0; cursor: pointer; text-align: left; min-width: 0;
}
.fi-rel:hover { border-color: #d4af37; }
.fi-rel-img { width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block; background: var(--bs-tertiary-bg); }
/* display:block: en un <span> EN LINEA el padding izquierdo solo afecta a la primera
   linea, asi que el precio quedaba indentado y el tipo y la ubicacion pegados al
   borde. Es la misma trampa del text-overflow en elementos en linea. */
.fi-rel-datos { display: block; padding: 8px 10px; }
.fi-rel-precio { font-weight: 700; font-size: .92rem; color: #b8860b; }
.fi-rel-tipo { font-size: .78rem; font-weight: 600; color: var(--bs-body-color); }
.fi-rel-ubic {
    font-size: .72rem; color: var(--bs-secondary-color);
    display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ---------- Pie con el contacto del agente ---------- */
/* Pegado abajo mientras se lee la ficha: es la acción que importa y con la ficha
   larga se perdía al bajar. En la página se consigue con position: sticky —
   antes iba fuera de la caja que scrolleaba. */
.ficha-pie {
    margin-top: auto;
    position: sticky; bottom: 0; z-index: 2;
    padding: 10px 16px;
    border-top: 1px solid var(--bs-border-color);
    background: var(--bs-body-bg);
    padding-bottom: calc(10px + env(safe-area-inset-bottom));
}
.ficha-pie .fi-agente { margin: 0 auto; max-width: 1200px; }

/* En PC el contacto NO va pegado abajo: va en la columna de la derecha, debajo de
   la descripción, que es donde queda el hueco y donde la vista ya está mirando.
   Ahí no hace falta perseguir al lector — el bloque está a la vista todo el rato —
   y de paso el pie fijo dejaba una franja de lado a lado quitándole alto a la foto.
   En el teléfono se queda pegado abajo, que ahí sí se pierde al desplazarse.
   Quien MUEVE el bloque es ficha.js: es el mismo nodo, no una copia. */
@media (min-width: 992px) {
    .ficha-datos > .ficha-pie {
        position: static;
        margin: 18px 0 0;
        padding: 14px 16px;
        border: 1px solid var(--bs-border-color);
        border-radius: 14px;
        background: var(--bs-tertiary-bg, rgba(255,255,255,.03));
    }
    .ficha-datos > .ficha-pie .fi-agente { max-width: none; }
}

/* El botón de "volver arriba" está fijo abajo a la derecha (30px) y aquí caía
   justo encima del botón de llamar. Se sube por encima del pie, pero SOLO
   mientras el pie está pegado abajo: al llegar al final de la ficha el pie deja
   de estarlo y el botón vuelve a su sitio de siempre, el mismo que en el
   listado (ficha.js pone y quita la clase). Su alto lo mide ficha.js en
   --dr-pie, que cambia si el nombre del agente ocupa dos renglones. */
/* Con el pie del contacto pegado abajo, el botón de subir se esconde: ahí caía
   encima del botón de llamar. Se apaga con opacity/visibility y NO con display,
   porque el script del pie de página le escribe display en línea al desplazarse y
   un estilo en línea le gana a la hoja. De paso hereda la transición que ya tiene. */
.fab-up.tras-pie { opacity: 0; visibility: hidden; pointer-events: none; }

/* Captador en DUPLA: una fila por persona, con su nombre encima de sus botones.
   Se muestran las dos en vez de un menú: así se elige a quién llamar de un toque
   y se ve a quién se está llamando antes de pulsar. */
.fi-ag-persona { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.fi-ag-quien { font-size: .68rem; font-weight: 600; color: var(--fi-muted, #6c757d); max-width: 90px;
               overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fi-ag-par { display: flex; gap: 6px; }

/* Pestañas de la ficha (Ficha descriptiva · Servicios adicionales). Mismo
   lenguaje que las pestañas de los paneles: subrayado dorado y nada más. */
/* Las pestañas van SIEMPRE una al lado de otra: con flex-wrap se le iban abajo
   en el telefono (dos rotulos largos no caben en 319px), que es justo lo que no
   se queria. Se reparten el ancho y, si hace falta, el texto parte en dos lineas
   DENTRO de su pestaña. */
.fi-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--bs-border-color); margin-bottom: 14px; flex-wrap: nowrap; }
.fi-tab {
    background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer;
    padding: 9px 12px; font-size: .82rem; font-weight: 700; letter-spacing: .04em;
    text-transform: uppercase; color: var(--bs-secondary-color); font-family: inherit;
    flex: 1 1 0; min-width: 0; line-height: 1.2; text-align: center;
}
@media (max-width: 575px) {
    .fi-tab { font-size: .7rem; letter-spacing: .02em; padding: 8px 4px; }
}
.fi-tab:hover { color: var(--bs-body-color); }
.fi-tab.activa { color: #d4af37; border-bottom-color: #d4af37; }
.fi-panel.oculto { display: none; }
.fi-panel-nota { font-size: .82rem; color: var(--bs-secondary-color); }

/* La descripción se lee de corrido, así que va con más aire entre líneas que
   la ficha operativa, que es una lista de datos. */
.fi-relato { white-space: pre-line; line-height: 1.75; font-size: .98rem; margin: 0; }
