/* ============================================================
   TapBox · capa de marca para el panel Filament
   ============================================================ */
@import url('/fonts/tapbox/tapbox-fuentes.css');

:root {
    --tb-navy: #20282D;
    --tb-blue: #2563EB;
    --tb-display: 'Schibsted Grotesk', 'Inter', system-ui, sans-serif;
    --tb-mono: 'IBM Plex Mono', ui-monospace, monospace;
}

.fi-header-heading,
.fi-section-header-heading,
.fi-section-heading,
.fi-modal-heading,
.fi-ta-header-heading,
.fi-wi-stats-overview-stat-value,
.fi-form-section-header-heading {
    font-family: var(--tb-display) !important;
    letter-spacing: -0.01em;
}

.fi-topbar .fi-logo,
.fi-sidebar-header .fi-logo { font-family: var(--tb-display); }

.fi-btn { border-radius: 0.7rem; }

.fi-sidebar-item-active .fi-sidebar-item-button { box-shadow: inset 3px 0 0 0 var(--tb-blue); }

.fi-wi-stats-overview-stat-label { font-family: var(--tb-mono); letter-spacing: 0.04em; }

.tb-logo-light { display: none !important; }
.dark .tb-logo-dark { display: none !important; }
.dark .tb-logo-light { display: block !important; }

.fi-tabs-item-label { color: #111722; }
.dark .fi-tabs-item-label { color: #ffffff; }

/* — Inicio: cabecera de bienvenida (hero) — */
.tb-hero { position: relative; overflow: hidden; border-radius: 18px; padding: 30px 32px; color: #fff;
    background: linear-gradient(168deg, #2A343A 0%, #20282D 62%, #171D21 100%);
    border: 1px solid rgba(255,255,255,.08); box-shadow: 0 24px 50px -30px rgba(0,0,0,.55); }
/* Filo azul superior: firma de marca sin recurrir a degradados de color. */
.tb-hero::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 2px;
    background: linear-gradient(90deg, #5B8DF7, rgba(91, 141, 247,0)); }
.tb-hero__mark { display: flex; align-items: center; gap: 10px; margin-bottom: 18px; flex-wrap: wrap; }
.tb-hero__mark img { height: 28px; width: auto; display: block; }
/* X para cerrar el menú lateral (solo móvil; no tapa los logos, va a la derecha) */
.tb-sidebar-close { display: none; }
@media (max-width: 1024px) {
    .tb-sidebar-close {
        display: inline-flex; align-items: center; justify-content: center;
        margin-inline-start: auto; flex: none;
        width: 36px; height: 36px; border-radius: 9px;
        border: 1px solid var(--tb-d-border, #e2e8f0); background: transparent;
        color: inherit; cursor: pointer;
    }
    .tb-sidebar-close:active { transform: scale(.94); }
}

/* ═══════════════════════════════════════════════════════════════════════
   FIRMA DE MARCA: el negocio manda, TapBox firma

   El panel es del cliente, así que su logo es el que se ve; TapBox queda al
   lado, más chico y en gris, detrás de una línea fina. La versión anterior
   ponía las dos marcas del mismo tamaño y con un "Usa" entre medio: el
   proveedor pesaba más que el dueño de casa, y la frase se leía cortada.
   ═══════════════════════════════════════════════════════════════════════ */
.tb-brand { display: inline-flex; align-items: center; gap: .7rem; line-height: 1; }

/* Logo del negocio: es el protagonista. El fondo blanco con esquinas
   redondeadas sirve para los logos de tinta oscura, que sobre el tema oscuro
   desaparecerían. */
.tb-brand__cliente {
    height: 2.5rem; width: auto; max-width: 150px; display: block;
    border-radius: 7px; background: #fff; padding: 3px 7px; box-sizing: content-box;
}

/* La línea fina: separa sin decir nada y aguanta cualquier ancho de logo. */
.tb-brand__linea { width: 1px; height: 2.1rem; background: currentColor; opacity: .17; flex: none; }

.tb-brand__firma { display: inline-flex; flex-direction: column; gap: .18rem; }

/* "FUNCIONA CON": micro-texto en versalitas. Tiene que leerse, no llamar la
   atención — por eso va chico, espaciado y apagado. */
.tb-brand__nota {
    font-family: 'Schibsted Grotesk', 'Inter', ui-sans-serif, sans-serif;
    font-size: .5625rem; font-weight: 600; letter-spacing: .11em;
    text-transform: uppercase; opacity: .5; white-space: nowrap;
}

.tb-brand__marca { display: inline-flex; align-items: center; gap: .3rem; opacity: .82; }
.tb-brand__marca img { height: 1.15rem; width: auto; display: block; }

.tb-brand__palabra {
    font-family: 'Schibsted Grotesk', 'Inter', ui-sans-serif, sans-serif;
    font-weight: 600; font-size: .9375rem; letter-spacing: -.02em; color: currentColor;
}

/* Logo del negocio en la barra del celular. Oculto en el computador, donde el
   menú lateral ya lo muestra fijo; ahí repetirlo sería ruido.
   El corte es el mismo que usa Filament para plegar el menú (1024px). */
.tb-brand-movil { display: none; }
@media (max-width: 1023px) {
    .tb-brand-movil { display: inline-flex; align-items: center; flex: none; margin-inline-end: .5rem; }
    .tb-brand-movil img {
        /* Se mide en vw: en un teléfono angosto el logo cede ancho solo, en vez
           de dejar el buscador reducido a "Bus". */
        height: 1.75rem; width: auto; max-width: min(88px, 23vw); display: block;
        border-radius: 6px; background: #fff; padding: 2px 5px; box-sizing: content-box;
    }

    /* El botón del menú va primero, como en cualquier app: el pulgar lo busca
       en el borde. El logo se dibuja antes en el HTML, así que se reordena acá. */
    .fi-topbar-open-sidebar-btn, .fi-topbar-close-sidebar-btn { order: -1; }

    /* ── Buscador plegado a lupa ──────────────────────────────────────────
       En 375px no caben el logo, el buscador y los tres botones: el buscador
       quedaba reducido a 41px útiles, mostrando "Bu". Plegado a la lupa deja
       sitio al logo, y al tocarlo se abre con espacio real para escribir.

       La zona de toque es la ETIQUETA del campo, no el icono: pulsar el icono
       no enfoca nada (es un SVG decorativo), mientras que una etiqueta enfoca
       su campo por sí sola, sin una línea de JavaScript. Sigue leyéndose en
       los lectores de pantalla porque se esconde con sangría, no se elimina. */
    /* Filament separa los elementos de la derecha con 1rem (column-gap). Con
       el buscador plegado a icono, ese hueco a ambos lados lo dejaba flotando
       lejos del avatar y del resto. En móvil se aprieta la separación. */
    .fi-topbar-end { column-gap: .375rem; min-width: 0; }

    .fi-topbar .fi-global-search-ctn { flex: none; width: 2.25rem; transition: width .2s ease; }

    /* Desplegado NO se le da un ancho calculado: antes era 100vw menos una
       medida a ojo, y cuando no calzaba con el ancho real de la barra el campo
       se montaba encima del avatar. Ahora simplemente se reparte el espacio
       que sobra, así nunca puede pedir más del que hay. */
    .fi-topbar .fi-global-search-ctn:focus-within {
        flex: 1 1 auto;
        width: auto;
        min-width: 0;
    }
    /* Y mientras se escribe, el logo del negocio cede su lugar: es lo único
       prescindible de la barra, y así el campo queda cómodo de verdad. */
    .fi-topbar:has(.fi-global-search-ctn:focus-within) .tb-brand-movil,
    .fi-topbar:has(.fi-global-search-ctn:focus-within) .fi-topbar-start { display: none; }
    .fi-topbar .fi-global-search-field { position: relative; }
    .fi-topbar .fi-global-search-field .fi-sr-only {
        position: absolute; inset: 0; width: auto; height: auto; margin: 0;
        clip: auto; clip-path: none; overflow: visible; white-space: normal;
        text-indent: -9999px; cursor: pointer; z-index: 2;
    }
    .fi-topbar .fi-global-search-ctn:focus-within .fi-sr-only { display: none; }

    /* Plegado, el buscador es un ICONO, no una caja.
       Filament le deja su marco blanco de campo de texto: un cuadrado de 40px
       alrededor de una lupa de 18 se ve enorme y desalineado con los botones
       vecinos, que sí son sólo icono. Mientras está plegado se le quita el
       marco; al enfocarlo vuelve, porque ahí sí es un campo donde se escribe. */
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input-wrp {
        background: transparent !important;
        box-shadow: none !important;
        border-color: transparent !important;
        min-height: 0;
    }
    /* Plegado ocupa exactamente lo que ocupa un botón de icono de la barra,
       ni un pixel más: antes medía 2,5rem con relleno propio adentro y se veía
       separado de sus vecinos, como si sobrara aire a su alrededor. */
    .fi-topbar .fi-global-search-ctn:not(:focus-within) { width: 2.25rem; }
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-global-search-field,
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input-wrp,
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input-wrp-content-ctn {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        height: 2.25rem;
        padding: 0 !important;
        margin: 0 !important;
        gap: 0 !important;
    }
    /* La lupa, del tamaño y color de los demás iconos de la barra. */
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input-wrp-prefix {
        padding: 0 !important;
        margin: 0 !important;
        flex: none;
    }
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input-wrp svg {
        width: 1.25rem;
        height: 1.25rem;
    }
    /* Plegado no hay dónde escribir: el campo no debe reservar ancho. */
    .fi-topbar .fi-global-search-ctn:not(:focus-within) .fi-input {
        width: 0 !important;
        min-width: 0 !important;
        padding: 0 !important;
    }
}

/* El avatar se dejaba aplastar cuando la barra iba justa de ancho: en el
   teléfono llegó a medir 13px y se montaba con el botón de tema. */
.fi-topbar .fi-user-menu { flex: none; }

/* Sin logo del negocio no hay a quién cederle el lugar: TapBox va completo. */
.tb-brand--solo img { height: 2.6rem; width: auto; display: block; }
.tb-brand__palabra--grande { font-size: 1.45rem; }
.tb-hero__word { font-family: var(--tb-display); font-weight: 600; font-size: 20px; letter-spacing: -.02em; line-height: 1; }
.tb-hero__word .b { color: #5B8DF7; }
.tb-hero__greet { font-family: var(--tb-display); font-weight: 600; font-size: clamp(28px, 4vw, 40px); letter-spacing: -.03em; line-height: 1.05; }
.tb-hero__greet b { color: #5B8DF7; font-weight: 600; }
.tb-hero__bottom { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 24px; margin-top: 26px; }
.tb-quickgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(155px, 1fr)); gap: 12px; flex: 1 1 100%; }
.tb-quick { display: inline-flex; align-items: center; justify-content: center; gap: 9px; padding: 13px 16px; border-radius: 12px;
    font-family: var(--tb-display); font-size: 14.5px; font-weight: 500; letter-spacing: -.01em; text-decoration: none; color: #fff;
    background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.14);
    transition: transform .18s ease, background .18s ease, box-shadow .18s ease, border-color .18s ease; }
.tb-quick:hover { background: rgba(91, 141, 247,.14); border-color: rgba(91, 141, 247,.55); transform: translateY(-2px); box-shadow: none; color: #C8EAD9; }
.tb-quick:active { transform: translateY(-1px); }
.tb-quick svg { width: 20px; height: 20px; }
.tb-hero__clock { flex: none; margin-left: auto; text-align: right; line-height: 1.15; }
.tb-hero__date { font-family: var(--tb-mono); font-size: 11px; text-transform: capitalize; color: rgba(255,255,255,.9); letter-spacing: .3px; }
.tb-hero__time { font-family: var(--tb-mono); font-size: 15px; font-weight: 500; color: #fff; letter-spacing: .5px; margin-top: 1px; }
@media (max-width: 760px) { .tb-quickgrid { grid-template-columns: 1fr; } }

/* — Texto más nítido (HD) en todo el panel — */
body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; }

/* — Tema claro/oscuro: botón aparte en el topbar; el menú del avatar queda solo con "Cerrar sesión" — */
.fi-dropdown-list:has(.fi-theme-switcher) { display: none !important; }
.tb-theme-trigger { display: inline-flex; align-items: center; justify-content: center; width: 2.25rem; height: 2.25rem; border: 0; background: transparent; border-radius: .5rem; color: #6b7280; cursor: pointer; transition: background .15s, color .15s; margin-inline-end: .25rem; }
.tb-theme-trigger svg { width: 1.3rem; height: 1.3rem; }
.tb-theme-trigger:hover { background: rgba(0,0,0,.05); color: #374151; }
.dark .tb-theme-trigger { color: #A1A1A6; }
.dark .tb-theme-trigger:hover { background: rgba(255,255,255,.08); color: #E5E5EA; }

/* — Reloj (fecha + hora) en la barra superior — */
.tb-clock { display: none; align-items: center; font-family: var(--tb-mono); font-size: 12.5px; letter-spacing: .2px; color: #6b7280; text-transform: capitalize; white-space: nowrap; margin-inline-end: .85rem; }
.dark .tb-clock { color: #A1A1A6; }
@media (min-width: 768px) { .tb-clock { display: inline-flex; } }

/* — Iconos del menú lateral: identidad azul de marca.
     Inactivos en un azul apagado; hover en el azul de marca; el activo
     conserva el color de marca que aplica Filament. Claro y oscuro. — */
.fi-sidebar-item:not(.fi-active) .fi-sidebar-item-icon { color: #4F6E8C !important; transition: color .15s; }
/* El azul fijo se fue a `--primary`: ver «el realce es del color de la persona». */
.dark .fi-sidebar-item:not(.fi-active) .fi-sidebar-item-icon { color: #9FB8CE !important; }


/* ═══════════════════════════════════════════════════════════════════════
   MODO OSCURO "PRO" — solo .dark
   Estilo iOS: fondo negro real + tarjetas gris elevado (#1c1c1e) + bordes
   neutros sutiles. Jerarquía por elevación, como Ajustes de iPhone.
   ═══════════════════════════════════════════════════════════════════════ */
:root { --tb-d-bg:#000000; --tb-d-surface:#1C1C1E; --tb-d-card:#2C2C2E; --tb-d-sunken:#3A3A3C;
        --tb-d-border:rgba(255,255,255,.09); --tb-d-border-strong:rgba(255,255,255,.15); }

/* Fondo general de la app */
.dark, .dark body, .dark .fi-body { background-color: var(--tb-d-bg) !important; }

/* Barra lateral y superior: un pelo más claras que el fondo + borde frío */
.dark .fi-sidebar { background-color: var(--tb-d-surface) !important; border-inline-end: 1px solid var(--tb-d-border) !important; }
.dark .fi-topbar { background-color: rgba(0,0,0,.8) !important; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); border-bottom: 1px solid var(--tb-d-border) !important; }

/* Tarjetas / secciones / KPIs / tablas: superficie elevada, borde definido y sombra sutil.
   OJO: el contenedor real de tabla es .fi-ta-ctn (no .fi-ta). */
.dark .fi-section,
.dark .fi-wi-stats-overview-stat,
.dark .fi-ta-ctn { background-color: var(--tb-d-card) !important; }
.dark .fi-section,
.dark .fi-wi-stats-overview-stat,
.dark .fi-ta-ctn {
    border: 1px solid var(--tb-d-border) !important;
    box-shadow: 0 1px 2px rgba(0,0,0,.35), 0 8px 24px -16px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.03) !important;
}

/* Todas las superficies internas de la tabla heredan el color de la tarjeta:
   así no aparecen "manchones" por header/celdas con otro tono. La separación
   del encabezado queda dada por su borde inferior propio de Filament. */
.dark .fi-ta,
.dark .fi-ta-header,
.dark .fi-ta-header-cell,
.dark .fi-ta-row,
.dark .fi-ta-cell,
.dark .fi-ta-header-ctn { background-color: transparent !important; }

/* Campos (inputs, selects, búsqueda, paginación): el color va en el WRAPPER
   redondeado (.fi-input-wrp) y el elemento interno queda transparente. Así el
   fondo respeta las esquinas y no asoman cuadrados. Un borde frío definido los
   delimita en cualquier superficie (incluida la barra superior). */
.dark .fi-input-wrp {
    background-color: var(--tb-d-sunken) !important;
    box-shadow: inset 0 0 0 1px var(--tb-d-border-strong) !important;
}
.dark .fi-input-wrp:has(:focus) {
    box-shadow: inset 0 0 0 1px #2563EB, 0 0 0 2px rgba(37, 99, 235,.25) !important;
}
.dark .fi-input-wrp:has([aria-invalid="true"]) {
    box-shadow: inset 0 0 0 1px #FF453A !important;   /* conserva el ring de error */
}
.dark .fi-input, .dark .fi-select-input { background-color: transparent !important; }

/* Modales, popovers y dropdowns: misma superficie iOS gris (no el slate/navy
   por defecto de Filament). Cubre las ventanas de "registrar atención", subir
   vacuna/documento, confirmaciones, menús, etc. */
.dark .fi-modal-window,
.dark .fi-dropdown-panel {
    background-color: var(--tb-d-card) !important;
    border: 1px solid var(--tb-d-border) !important;
    box-shadow: 0 24px 60px -12px rgba(0,0,0,.65) !important;
}
.dark .fi-modal-header,
.dark .fi-modal-content,
.dark .fi-modal-footer { background-color: transparent !important; }
/* Secciones/inputs dentro del modal heredan la superficie del propio modal para
   que no aparezca un "card dentro del card" con otro tono. */
.dark .fi-modal-window .fi-section { background-color: transparent !important; box-shadow: none !important; border: 0 !important; }

/* ═══════════════════════════════════════════════════════════════════════
   LOGIN (página simple): SIN card. Contenido directo sobre el fondo (logo,
   TapBox, "Entre a su cuenta", correo*, contraseña*, olvidó, recordarme, entrar).
   ═══════════════════════════════════════════════════════════════════════ */
.fi-simple-main {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    padding-inline: 0 !important;
}
.dark .fi-simple-main { background: transparent !important; }

/* Placeholders visibles (ya no hay card que dé contraste). */
.fi-simple-main .fi-input::placeholder { color: #6b7280 !important; opacity: 1; }
.dark .fi-simple-main .fi-input::placeholder { color: #9a9aa0 !important; opacity: 1; }

/* Campos con borde definido sobre el fondo. */
.fi-simple-main .fi-input-wrp {
    background-color: #ffffff !important;
    box-shadow: inset 0 0 0 1px #cbd2dc !important;
}
.dark .fi-simple-main .fi-input-wrp {
    background-color: var(--tb-d-sunken) !important;
    box-shadow: inset 0 0 0 1px var(--tb-d-border-strong) !important;
}

/* Check "Recordarme" con recuadro notorio. */
.fi-simple-main .fi-checkbox-input {
    border: 2px solid #9aa3af !important;
    background-color: #ffffff !important;
}
.dark .fi-simple-main .fi-checkbox-input {
    border: 2px solid #6b7280 !important;
    background-color: transparent !important;
}
.fi-simple-main .fi-checkbox-input:checked {
    background-color: #2563EB !important;
    border-color: #2563EB !important;
}

/* Todo el contenido del login centrado vertical, sin scroll, adaptable a
   cualquier alto de pantalla (dvh evita el salto por las barras del móvil). */
.fi-simple-layout {
    min-height: 100vh !important;
    min-height: 100dvh !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    padding-block: 1.5rem !important;
    padding-inline: 1.75rem !important; /* aire a ambos lados */
}

/* El «sin scroll» es SÓLO para el login.
 *
 * Filament usa esta misma plantilla simple para el PERFIL, que es mucho más
 * largo: bloquear el desplazamiento ahí dejaba el bloque de verificación en
 * dos pasos fuera de alcance, sin forma de llegar a él.
 *
 * Se distinguen por el menú de usuario: el perfil lo tiene (hay sesión
 * iniciada), el login no. El perfil además arranca arriba en vez de centrado,
 * porque centrar algo más alto que la pantalla recorta justamente el comienzo.
 */
body:not(:has(.fi-user-menu)) .fi-simple-layout { overflow: hidden !important; }
body:not(:has(.fi-user-menu)):has(.fi-simple-layout) { overflow: hidden; }

body:has(.fi-user-menu) .fi-simple-layout {
    justify-content: flex-start !important;
    overflow-y: auto !important;
}

/*
 * CUANDO LA PANTALLA ES MÁS BAJA QUE EL FORMULARIO.
 *
 * Con la pantalla fija (`html.tb-fija`, ver partials/pantalla-fija) el
 * documento ya no se desplaza, así que el `overflow:hidden` de arriba dejaba
 * el login sin salida: medido en un viewport de 380px de alto, la caja
 * arrancaba en -155px y no había forma de llegar al logo ni al primer campo.
 * Pasa de verdad en un teléfono en horizontal, y sobre todo con el teclado
 * abierto, que es justo lo que esto viene a arreglar.
 *
 * Dos correcciones que van juntas:
 *
 *  · El contenido puede desplazarse POR DENTRO. `contain` corta el rebote en
 *    el borde, así que se sigue sin ver la franja del navegador por detrás.
 *  · Se centra con márgenes automáticas y no sólo con `justify-content`: el
 *    centrado por alineación recorta el COMIENZO cuando el contenido no cabe;
 *    las márgenes automáticas centran igual y ceden cuando falta espacio.
 */
html.tb-fija .fi-simple-layout {
    overflow-y: auto !important;
    overscroll-behavior: contain;
    /*
     * `flex-start` + margen automática, y no `center` a secas.
     *
     * Las márgenes automáticas sólo reparten espacio SOBRANTE: si el contenido
     * es más alto que la pantalla se resuelven en cero, y ahí manda el
     * `justify-content`. Con `center`, ese caso recorta el comienzo —medido:
     * la caja arrancaba en -155px, sin forma de llegar al logo ni al primer
     * campo—. Con `flex-start` de base, la margen automática centra mientras
     * quepa y cede en cuanto deja de caber.
     */
    justify-content: flex-start !important;
}

html.tb-fija .fi-simple-layout > * { margin-block: auto !important; }

/*
 * NADA CAMBIA DE TAMAÑO AL ABRIRSE EL TECLADO.
 *
 * Hubo acá un modo «compacto» que encogía el logo, el título y los espacios
 * cuando el alto útil bajaba: estaba mal. Al tocar un campo, la pantalla se
 * reacomodaba bajo el dedo y la marca se achicaba justo cuando la persona
 * escribe su contraseña — el momento en que ver la marca importa más.
 *
 * En la APK no pasa porque el teclado se DIBUJA ENCIMA: la maqueta conserva su
 * alto y el navegador sólo corre la vista para dejar visible el campo. Es la
 * conducta nativa, y es la que se replica acá midiendo `innerHeight` —el alto
 * de la maqueta— y no `visualViewport`, que es el alto libre y se encoge con
 * el teclado. Ver partials/pantalla-fija.
 */

/* Y el aire entre campos se reparte más justo. */
/*
 * Los espacios entre bloques bajan de 24px a 8-12. Es el recorte que más
 * rinde y el que menos se nota: separar el título de los campos con 24px es
 * una decisión de pantalla grande, no una necesidad de lectura.
 */

/* Botón "Entrar" / "Enviar email": azul de marca (como el Box del logo). */
.fi-simple-main .fi-btn {
    background: #2563EB !important;
    border: 0 !important;
    color: #fff !important;
    font-weight: 600 !important;
    letter-spacing: .01em !important;
    border-radius: 0.7rem !important;
    padding-block: 0.8rem !important;
    box-shadow: none !important;
    transition: background .15s ease, transform .08s ease;
}
.fi-simple-main .fi-btn:hover { background: #1D4FD0 !important; box-shadow: none !important; }
.fi-simple-main .fi-btn:active { transform: translateY(1px); box-shadow: none !important; }
.dark .fi-simple-main .fi-btn { background: #2563EB !important; }
.dark .fi-simple-main .fi-btn:hover { background: #2563EB !important; }

/* Notificaciones premium (línea del correo de reset): tarjeta clara/oscura con
   esquinas suaves y sombra cuidada. El acento de color lo da el ícono (azul en
   el aviso de "correo registrado"). */
.fi-no-notification {
    border-radius: 14px !important;
    border: 1px solid #E2E8F0 !important;
    box-shadow: 0 16px 40px -12px rgba(15,26,46,.22) !important;
}
.dark .fi-no-notification {
    background-color: #242426 !important;
    border-color: #2f2f31 !important;
    box-shadow: 0 20px 50px -14px rgba(0,0,0,.6) !important;
}
.fi-no-notification .fi-no-notification-title,
.fi-no-notification h3 { font-weight: 700 !important; letter-spacing: -.01em; }

/* Bloqueo de zoom por gesto (doble-tap) + sin retardo de toque. El pinch-zoom
   lo bloquea el meta viewport; esto complementa en el resto de la app. */
html { touch-action: manipulation; -webkit-text-size-adjust: 100%; }

/* ═══════════════════════════════════════════════════════════════════════
   NITIDEZ "HD" — texto, iconos y detalles (app + central)
   ═══════════════════════════════════════════════════════════════════════ */

/* 1+2) Suavizado de fuentes: texto más limpio y nítido en todo el panel.
   antialiased afina el trazo (menos "gordo") en pantallas Retina/OLED. */
.fi-body, .fi-body *, .fi-sidebar, .fi-topbar, .fi-modal {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
}

/* 1) Panel lateral: texto e iconos más nítidos y con mejor contraste. */
.fi-sidebar-item-label { font-weight: 500; letter-spacing: -0.005em; }
.dark .fi-sidebar-item-label { color: #eaeaec !important; }
.dark .fi-sidebar-item:not(.fi-active) .fi-sidebar-item-icon { color: #b7bec8 !important; }
.dark .fi-sidebar-group-label { color: #9b9ba1 !important; letter-spacing: .02em; }
/* SVG de iconos con render de máxima precisión (bordes limpios). */
.fi-sidebar-item-icon svg,
.fi-btn svg,
.fi-ta-actions svg { shape-rendering: geometricPrecision; }

/* 2) Encabezados y textos generales: contraste alto en oscuro. */
.dark .fi-header-heading,
.dark .fi-section-heading,
.dark .fi-ta-header-heading { color: #FFFFFF !important; }
.dark .fi-ta-text, .dark .fi-ta-cell, .dark .fi-in-text { color: #E5E5EA; }

/* 3) REDONDEO GLOBAL de todos los cards (todas las plantillas, app + central):
   KPIs, secciones, tablas y widgets. El tile de KPI (fi-wi-stats-overview-stat)
   es el que salía con esquinas en punta. */
.fi-wi-stats-overview-stat,
.fi-section,
.fi-ta-ctn,
.fi-wi > .fi-section,
.fi-fo-tabs {
    border-radius: 0.9rem !important;
}
.fi-wi-stats-overview-stat { overflow: hidden; }

/* 4) Fecha/hora, placeholders y buscadores: texto nítido y placeholder legible. */
.dark .fi-input,
.dark .fi-select-input { color: #FFFFFF !important; }
.dark .fi-input::placeholder,
.dark .fi-select-input::placeholder { color: #8a8a8e !important; opacity: 1; }
.dark .fi-ta-search-field .fi-input { color: #FFFFFF !important; }

/* Conmutador de tema flotante en el login (sin topbar). Oculto por defecto;
   solo aparece en las páginas simples (login) de cualquier panel. */
.tb-login-theme { display: none; }
body:has(.fi-simple-layout) .tb-login-theme,
body:has(.fi-simple-page) .tb-login-theme,
body:has(.fi-simple-main) .tb-login-theme {
    display: block; position: fixed; top: 1rem; inset-inline-end: 1rem; z-index: 50;
}

/* Perfil también es una página simple, pero AHÍ SÍ hay avatar de usuario, y
   Filament lo fija arriba a la derecha: el conmutador flotante caía justo
   encima y los dos círculos se pisaban. Cuando conviven, el tema se corre a la
   izquierda del avatar y queda una separación real entre ambos.
      avatar: 2rem de ancho + 1rem de margen al borde, más 0.5rem de aire y el
      0.25rem que el propio botón lleva de margen a la derecha. */
body:has(.fi-simple-page):has(.fi-user-menu) .tb-login-theme,
body:has(.fi-simple-main):has(.fi-user-menu) .tb-login-theme {
    inset-inline-end: 4.25rem;
}

/* Flecha "Volver" del Perfil: arriba a la izquierda, en el mismo tono discreto
   que el resto de los controles de la barra. */
.tb-profile-back { position: fixed; top: 1rem; inset-inline-start: 1rem; z-index: 50; }
.tb-profile-back button {
    display: inline-flex; align-items: center; gap: .35rem;
    padding: .4rem .7rem .4rem .5rem; border: 0; border-radius: .5rem;
    background: transparent; color: #6b7280; cursor: pointer;
    font: inherit; font-size: .875rem; transition: background .15s, color .15s;
}
.tb-profile-back svg { width: 1.15rem; height: 1.15rem; }
.tb-profile-back button:hover { background: rgba(0,0,0,.05); color: #374151; }
.dark .tb-profile-back button { color: #A1A1A6; }
.dark .tb-profile-back button:hover { background: rgba(255,255,255,.08); color: #E5E5EA; }

/* En el topbar el avatar y el conmutador quedaban pegados, sin un pixel entre
   ellos: el fondo del botón de tema al pasar el mouse tocaba el borde del
   círculo de iniciales. */
.fi-topbar .fi-user-menu { margin-inline-end: .5rem; }

/* ═══════════════════════════════════════════════════════════════════════
   FICHAS COMPACTAS (estilo CRM/B2B). Solo secciones marcadas con .tb-crm
   (p. ej. ficha de cliente). No afecta al resto de formularios.
   ═══════════════════════════════════════════════════════════════════════ */
/* Medido sobre el DOM real antes de tocar nada: cabecera 14×20, contenido
   18×20, título 16px, etiquetas 14px, separación entre tarjetas 24px. Todo
   generoso; se veía espacioso y de plantilla. Acá se aprieta y se le da
   jerarquía. */

/* — Tarjeta — */
.tb-crm .fi-section {
    border-radius: 12px !important;
    box-shadow: 0 1px 2px rgba(16, 24, 40, .04) !important;
}
.dark .tb-crm .fi-section { box-shadow: none !important; }

/* — Cabecera: más baja, con una línea que la separa del contenido — */
.tb-crm .fi-section-header {
    padding: .7rem .95rem !important;
    border-bottom: 1px solid rgba(16, 24, 40, .07);
    gap: .55rem !important;
}
.dark .tb-crm .fi-section-header { border-bottom-color: rgba(255, 255, 255, .07); }

/* Título de sección: etiqueta, no encabezado de página. */
.tb-crm .fi-section-header-heading {
    font-size: .875rem !important;
    font-weight: 600 !important;
    letter-spacing: -.01em;
}
.tb-crm .fi-section-header-description { font-size: .75rem !important; margin-top: .1rem; }

/* El icono va en una pastilla azul: da identidad y ancla la vista. */
.tb-crm .fi-section-header > svg {
    width: 1.85rem !important;
    height: 1.85rem !important;
    padding: .35rem;
    border-radius: 8px;
    color: #2563EB;
    background: #E8EFFE;
    box-sizing: border-box;
    flex: none;
}
.dark .tb-crm .fi-section-header > svg {
    color: #0A84FF;
    background: rgba(10, 132, 255, .12);
}

/* — Contenido: menos aire — */
.tb-crm .fi-section-content { padding: .85rem .95rem !important; }
.tb-crm .fi-grid { gap: .6rem .8rem !important; }
.tb-crm .fi-fo-field-wrp { gap: .3rem !important; }

/* — Etiquetas de campo: pequeñas y apagadas; el dato es el protagonista — */
.tb-crm .fi-fo-field-label-content {
    font-size: .75rem !important;
    font-weight: 500 !important;
    letter-spacing: .01em;
    color: rgb(100 116 139);
}
.dark .tb-crm .fi-fo-field-label-content { color: rgb(161 161 166); }

/* — Campos — */
.tb-crm .fi-input-wrp { border-radius: 9px !important; }
.tb-crm .fi-input,
.tb-crm .fi-select-input { padding-block: .35rem !important; font-size: .8125rem !important; }
.tb-crm .fi-fo-field-hint,
.tb-crm .fi-fo-field-helper-text { font-size: .7rem !important; }

/* Foco: sólo el borde de marca (regla general .fi-input-wrp:focus-within), sin halo. */
.tb-crm .fi-input-wrp:focus-within { outline: none; }

/* — Separación entre tarjetas apiladas: 24px era demasiado — */
.fi-fo .fi-sc > .fi-sc-component + .fi-sc-component,
.fi-sc-has-gap { gap: .85rem !important; }

/* — Barra de acciones fija abajo: los botones quedan siempre a mano y la
     página deja de terminar en un vacío enorme. — */
.fi-fo-actions-ctn,
.fi-page-content > form > .fi-ac {
    position: sticky;
    bottom: 0;
    z-index: 10;
    margin-top: 1rem;
    padding: .75rem 0;
    background: linear-gradient(to top, var(--tb-page-bg, #f8fafc) 72%, transparent);
}
.dark .fi-fo-actions-ctn,
.dark .fi-page-content > form > .fi-ac {
    background: linear-gradient(to top, #000 72%, transparent);
}

/* ═══════════════════════════════════════════════════════════════════════
   QUOTE BUILDER (Central → Crear/Editar cotización) · 3 columnas compactas
   ═══════════════════════════════════════════════════════════════════════ */
/* Contenedor: ancho amplio pero acotado y centrado (nada pegado a la izq.) */
.tb-qb { max-width: 1600px; margin-inline: auto; width: 100%; gap: 1rem !important; }
/* Barra lateral sticky */
@media (min-width: 1024px) { .tb-sticky { position: sticky; top: 1rem; } }

/* Cards compactas del builder */
.tb-qb-card .fi-section-content { padding: 15px 16px !important; }
.tb-qb-card .fi-section-header { padding: 13px 16px !important; }
.tb-qb .fi-grid { gap: .55rem .7rem !important; }
/* Inputs 34–38px y labels chicos */
.tb-qb .fi-input, .tb-qb .fi-select-input { padding-block: .4rem !important; }
.tb-qb .fi-fo-field-label-content { font-size: .8rem !important; }

/* Resumen ejecutivo (derecha) */
.tb-quote-sum { margin-top: 2px; }
.tb-quote-sum__div { border-top: 1px dashed #e5e7eb; margin: 8px 0; }
.dark .tb-quote-sum__div { border-color: var(--tb-d-border); }
.tb-quote-sum__total {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-top: 12px; padding: 14px 16px; border-radius: 12px;
    background: #eaf2fd; color: #20282D;
}
.dark .tb-quote-sum__total { background: rgba(10, 132, 255, .18); color: #FFFFFF; }
.tb-quote-sum__total span:first-child { font-size: 13px; font-weight: 600; color: #2563EB; }
.dark .tb-quote-sum__total span:first-child { color: #0A84FF; }
.tb-quote-sum__total span:last-child { font-size: 22px; font-weight: 800; letter-spacing: -.5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.tb-quote-sum > div { white-space: nowrap; }
.tb-quote-sum > div > span:first-child { white-space: normal; }

/* Módulos como tarjetas compactas (~90px), grilla 2 col */
.tb-modules .fi-fo-checkbox-list-option,
.tb-modules label:has(> input[type="checkbox"]) {
    border: 1px solid #e5e7eb; border-radius: 12px; padding: 12px 14px; min-height: 88px;
    transition: border-color .12s, background .12s, box-shadow .12s; cursor: pointer;
}
.dark .tb-modules .fi-fo-checkbox-list-option,
.dark .tb-modules label:has(> input[type="checkbox"]) { border-color: var(--tb-d-border); background: var(--tb-d-card); }
.tb-modules .fi-fo-checkbox-list-option:hover,
.tb-modules label:has(> input[type="checkbox"]):hover { border-color: #2563EB; box-shadow: 0 2px 12px -6px rgba(37, 99, 235,.5); }
.tb-modules .fi-fo-checkbox-list-option:has(:checked),
.tb-modules label:has(> input[type="checkbox"]:checked) { border-color: #2563EB; background: #eaf2fd; }
.dark .tb-modules .fi-fo-checkbox-list-option:has(:checked),
.dark .tb-modules label:has(> input[type="checkbox"]:checked) { background: rgba(10, 132, 255, .18); border-color: #2563EB; }
.tb-modules .fi-fo-checkbox-list { gap: .55rem !important; }

/* ── Cabecera de identidad (ficha de cliente/paciente) ── */
.tb-idcard {
    display: flex; align-items: center; gap: 16px;
    padding: 16px 20px; border-radius: 0.9rem;
    background: #ffffff; border: 1px solid #e5e7eb;
    box-shadow: 0 1px 2px rgba(15,26,46,.05);
}
.dark .tb-idcard { background: var(--tb-d-card); border-color: var(--tb-d-border);
    box-shadow: 0 1px 2px rgba(0,0,0,.35), 0 8px 24px -16px rgba(0,0,0,.6); }
.tb-idcard__avatar {
    flex: none; width: 52px; height: 52px; border-radius: 13px;
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: 18px; letter-spacing: .3px;
    background: #e8f0fe; color: #2563EB;
}
.dark .tb-idcard__avatar { background: rgba(37, 99, 235,.18); color: #0A84FF; }
.tb-idcard__main { min-width: 0; }
.tb-idcard__name { font-size: 19px; font-weight: 700; line-height: 1.15; color: #20282D; }
.dark .tb-idcard__name { color: #FFFFFF; }
.tb-idcard__meta { margin-top: 3px; font-size: 13px; color: #64748b; }
.dark .tb-idcard__meta { color: #9aa0aa; }
.tb-idcard__badge {
    margin-inline-start: auto; flex: none;
    display: inline-flex; align-items: center; gap: 7px;
    padding: 6px 14px; border-radius: 999px;
    font-size: 13px; font-weight: 600;
    color: #16a34a; background: rgba(22,163,74,.10); border: 1px solid rgba(22,163,74,.25);
}
.dark .tb-idcard__badge { color: #30D158; }
.tb-idcard__badge::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
/* Avatar con foto (ficha de mascota) */
.tb-idcard__avatar--img { padding: 0; overflow: hidden; background: #e8f0fe; }
.tb-idcard__avatar--img img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Badge de dueño (azul, sin punto) */
.tb-idcard__badge--owner { color: #2563EB; background: rgba(37, 99, 235,.10); border-color: rgba(37, 99, 235,.25); }
.dark .tb-idcard__badge--owner { color: #0A84FF; }
.tb-idcard__badge--owner::before { display: none; }

/* ── Botón escribir tarjeta NFC ── */
.tb-nfc__btn {
    display: inline-flex; align-items: center; gap: 8px;
    background: #2563EB; color: #fff; border: 0; border-radius: 10px;
    padding: 10px 16px; font-weight: 700; font-size: 14px; cursor: pointer;
}
.tb-nfc__btn:disabled { opacity: .6; cursor: progress; }
.tb-nfc__btn:hover:not(:disabled) { background: #1D4FD0; }
.tb-nfc__status { margin-top: 8px; font-size: 13px; color: #94a3b8; }
.tb-nfc__status.is-ok { color: #16a34a; font-weight: 600; }
.tb-nfc__hint { font-size: 13px; color: #94a3b8; }

/* ═══════════════════════════════════════════════════════════════════════
   APP INSTALADA (TWA/PWA): sin "tap-to-search" ni menú de selección de Chrome
   en textos no editables. Solo aplica en modo standalone (no en el navegador).
   ═══════════════════════════════════════════════════════════════════════ */
@media (display-mode: standalone) {
    body { -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
    input, textarea, select, [contenteditable="true"],
    .fi-input, .fi-select-input { -webkit-user-select: text !important; user-select: text !important; }
}

/* ═══════════════════════════════════════════════════════════════════════
   RESPONSIVE (móvil / tablet / iPad) · App + Central
   ═══════════════════════════════════════════════════════════════════════ */
/* Ningún card debe provocar scroll horizontal del cuerpo */
.fi-section, .tb-idcard, .tb-hero, .tb-qb, .tb-qb-card { max-width: 100%; }

/* Tablet e inferior (≤ 1024px, incluye iPad) */
@media (max-width: 1024px) {
    .tb-hero { padding: 22px 22px; }
    .tb-hero__bottom { gap: 18px; margin-top: 20px; }
    /* Quote builder: todo apilado a una columna, resumen debajo */
    .tb-sticky { position: static !important; }
}

/* Móvil / tablet chico (≤ 768px) */
@media (max-width: 768px) {
    .tb-hero { padding: 18px 16px; border-radius: 14px; }
    .tb-quickgrid { grid-template-columns: repeat(2, 1fr); flex-basis: 100%; }
    .tb-idcard { flex-wrap: wrap; padding: 14px 16px; gap: 12px; }
    .tb-idcard__badge { margin-inline-start: 0; }
    .tb-qb-card .fi-section-content { padding: 13px 14px !important; }
    /* Inputs cómodos al tacto (evita zoom en iOS con < 16px) */
    .fi-input, .fi-select-input { font-size: 16px !important; }
}

/* Teléfono (≤ 480px) */
@media (max-width: 480px) {
    .tb-quickgrid { grid-template-columns: 1fr; }
    .tb-hero__greet { font-size: 26px; }
    .tb-idcard__avatar { width: 46px; height: 46px; font-size: 16px; }
    .tb-idcard__name { font-size: 17px; }
}

/* — Marca del panel: "Tap" en tinta, "Next" en azul —
   El tono del "Box" cambia según el fondo: sobre claro necesita el azul
   oscuro (#2563EB da 5.6 de contraste); sobre el tema oscuro, el aclarado. */
/* ── Marca de Central ────────────────────────────────────────────────────
   El logotipo completo (imagen) y, al lado, la palabra «Central» que dice en
   qué panel estás. La palabra «PaperNext» ya no se escribe: viene dentro del
   logotipo, y tenerla dos veces era tenerla desincronizada. */
.tb-marca { display: inline-flex; align-items: center; gap: 10px; }
.tb-marca .tb-marca-img { height: 2.1rem; width: auto; display: block; flex: none; }
.tb-marca .tb-marca-img--oscura { display: none; }
.dark .tb-marca .tb-marca-img--clara { display: none; }
.dark .tb-marca .tb-marca-img--oscura { display: block; }
/* Separador entre el logotipo y «Central», del mismo peso que el filo del panel. */
.tb-marca__sub::before {
    content: ""; display: inline-block; width: 1px; height: 1.05rem;
    background: var(--pn-filo-2, rgba(0,0,0,.12)); margin-inline-end: 10px;
    vertical-align: -.2rem;
}
.tb-marca__tx {
    font-family: var(--tb-display, 'Schibsted Grotesk', Inter, sans-serif);
    font-weight: 700; font-size: 1.06rem; letter-spacing: -.02em; line-height: 1;
    color: #20282D; white-space: nowrap;
}
.tb-marca__b { color: #2563EB; }
.tb-marca__sub { font-weight: 600; font-size: .95rem; color: var(--pn-tinta-2); letter-spacing: -.01em; }

/* El avión sólo aparece en el acceso; en el panel manda el logotipo completo. */
.tb-marca .tb-marca-img--simbolo { display: none; }

/* ── MARCA DE CENTRAL EN EL ACCESO ─────────────────────────────────────
   Apilada y centrada: el avión arriba, «Central» debajo. Con el logotipo
   apaisado más la palabra al costado, el bloque medía 260px de ancho y se
   leía como un encabezado de barra metido en una tarjeta de 420.

   El separador vertical se quita: entre dos cosas apiladas, una línea de pie
   no separa nada —se lee como un subrayado suelto. */
.fi-simple-main .tb-marca {
    flex-direction: column; gap: .5rem; width: 100%; justify-content: center;
}
.fi-simple-main .tb-marca .tb-marca-img--palabra { display: none; }
.fi-simple-main .tb-marca .tb-marca-img--simbolo { display: block; height: 4.1rem; }
.fi-simple-main .tb-marca .tb-marca-img--simbolo.tb-marca-img--oscura { display: none; }
.dark .fi-simple-main .tb-marca .tb-marca-img--simbolo.tb-marca-img--clara { display: none; }
.dark .fi-simple-main .tb-marca .tb-marca-img--simbolo.tb-marca-img--oscura { display: block; }
.fi-simple-main .tb-marca__sub {
    font-size: .8125rem; font-weight: 600; letter-spacing: .14em;
    text-transform: uppercase; opacity: .55;
}
.fi-simple-main .tb-marca__sub::before { content: none; }

.dark .tb-marca__tx { color: #FBF9ED; }
.dark .tb-marca__b { color: #0A84FF; }

/* — El "Box" del logotipo del panel —
   Sobre fondo claro necesita el azul oscuro (5.6 de contraste); sobre el tema
   oscuro, el aclarado. Va por clase y no como color fijo en línea para que
   pueda cambiar con el tema.
   El !important es deliberado: Filament pinta la marca con currentColor
   heredado de la barra, y sin esto el "Box" sale negro en ambos temas. */
.tb-box,
.fi-topbar .tb-box,
.fi-sidebar .tb-box { color: #2563EB !important; }

.dark .tb-box,
.dark .fi-topbar .tb-box,
.dark .fi-sidebar .tb-box { color: #0A84FF !important; }
/* ══════════════════════════════════════════════════════════════════════
   SÓLO ESCRITORIO (≥768px)
   Todo lo que sigue existe para una sola cosa: que en una FILA de formulario
   el desplegable, el campo de texto y el selector de fecha midan igual y su
   texto quede a la misma altura. En móvil no hay filas — cada campo va a
   ancho completo, uno debajo del otro — así que nada de esto hace falta ahí.
   Y sí hace daño: el desplegable no nativo dibuja su PANEL DE OPCIONES dentro
   de la misma caja, así que cualquier altura o ancho impuesto lo aplasta. Eso
   descuadró «Existencias» de Inventario en el teléfono cuatro veces seguidas
   («otro» partido letra por letra, etiquetas encabalgadas).
   Si vuelve a aparecer un descuadre de formulario SÓLO en móvil, la causa
   está acá adentro y la respuesta es acotar, no agregar otra regla.
   ══════════════════════════════════════════════════════════════════════ */
@media (min-width: 768px) {

/* — Formularios: campos parejos y sin texto cortado —
   Los desplegables de Filament traen su propio control y quedaban más altos
   que los campos de texto de al lado, con la fila desalineada. Y cuando el
   campo era angosto, el valor se partía en dos líneas o se recortaba.

   OJO: la clase del contenedor de campo es .fi-fo-field, NO .fi-fo-field-wrp.
   Una versión anterior de este bloque usaba -wrp y por eso no hacía nada:
   verificado midiendo el DOM real (select 50px, texto 38px, fecha 36px). */
.fi-fo-field .fi-input-wrp { min-height: 2.625rem; }

/* Altura fija e idéntica para los tres controles que conviven en una fila. */
.fi-fo-field .fi-input-wrp.fi-fo-select,
.fi-fo-field .fi-input-wrp.fi-fo-text-input,
.fi-fo-field .fi-input-wrp.fi-fo-date-time-picker { height: 2.625rem; }

/* EXCEPCIÓN · desplegables de selección múltiple.
   La regla de arriba emparejó las filas del formulario de citas, pero le impuso
   altura fija a TODOS los desplegables. Uno de selección múltiple pinta un
   distintivo por cada valor elegido y necesita crecer: con 13 módulos, la
   segunda fila de distintivos se salía de la caja y tapaba el texto de ayuda.
   Se reconocen por el contenedor de distintivos que Filament sólo usa ahí. */
.fi-fo-field .fi-input-wrp.fi-fo-select:has(.fi-select-input-value-badges-ctn) {
    height: auto;
    min-height: 2.625rem;
}
/* Los distintivos fluyen en varias líneas, con aire entre ellos. */
.fi-fo-field .fi-select-input-value-badges-ctn {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    padding-block: .35rem;
    min-width: 0;
}
/* Un valor largo no debe empujar la caja a lo ancho ni cortarse a la mitad. */
.fi-fo-field .fi-select-input-value-badges-ctn > * { max-width: 100%; }
/* El control interno de un múltiple tampoco se estira a una altura fija. */
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) > *,
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) button {
    height: auto;
    min-height: 2.625rem;
}

/* El control interno estira hasta la caja en vez de imponer su propia altura.
 *
 * CUIDADO CON `.fi-select-input`: en el desplegable NO NATIVO esa clase NO está
 * en el control, sino en el <div> contenedor donde el JavaScript de Filament
 * dibuja el widget completo — el PANEL DE OPCIONES incluido (ver
 * vendor/filament/forms/.../select.blade.php, línea 216). Darle `height:100%`
 * lo mete entero dentro de 2,6 rem: la lista queda aplastada, las etiquetas se
 * encabalgan y una opción como «Otro…» se parte letra por letra en vertical.
 * Se vio al editar una unidad en Inventario, y se confirmó volcando el DOM real.
 *
 * Por eso: el <select> NATIVO por su etiqueta, y del no nativo sólo el BOTÓN.
 * Ni `> *`, ni `.fi-select-input` a secas, ni `> button` (no es hijo directo). */
.fi-fo-field .fi-fo-select select.fi-select-input,
.fi-fo-field .fi-fo-select .fi-select-input-btn,
.fi-fo-field .fi-input-wrp input { height: 100%; }

/* El panel de opciones se dimensiona solo, pase lo que pase arriba.
   Va con !important porque más abajo hubo (y podría volver a haber) reglas que
   intentan darle altura fija a este contenedor: es el error que descuadró
   «Existencias» en Inventario tres veces seguidas. */
.fi-fo-field .fi-fo-select .fi-select-input:not(select) {
    height: auto !important;
    min-height: 0 !important;
    display: block !important;
}
.fi-fo-field .fi-fo-select [role="listbox"],
.fi-fo-field .fi-fo-select [role="option"] { height: auto; white-space: normal; }

/* El valor va en una línea: si no cabe, se corta con puntos suspensivos en
   vez de romperse en dos renglones y descuadrar la fila. */
.fi-fo-field .fi-fo-select [class*="selected"]:not([role="option"]),
.fi-fo-field .fi-fo-select .fi-fo-select-value,
.fi-fo-field .fi-fo-select > button > span,
.fi-fo-field .fi-fo-select select {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
}
} /* fin · sólo escritorio */

/* ═══════════════════════════════════════════════════════════════════════
   SELECTOR DE EMPRESA DEL STAFF (topbar de /app)
   Solo lo ve el staff de TapBox. Deja claro a qué empresa está mirando.
   ═══════════════════════════════════════════════════════════════════════ */
.tb-switch {
    display: flex; align-items: center; gap: .4rem;
    margin-inline-end: .75rem;
}
.tb-switch__lbl {
    font-size: .7rem; text-transform: uppercase; letter-spacing: .06em;
    color: rgb(107 114 128); white-space: nowrap;
}
.dark .tb-switch__lbl { color: rgb(161 161 166); }

.tb-switch__sel {
    height: 2rem; max-width: 12rem; padding: 0 1.6rem 0 .6rem;
    font-size: .8125rem; border-radius: .5rem;
    border: 1px solid rgb(209 213 219); background-color: #fff; color: rgb(17 24 39);
}
.dark .tb-switch__sel {
    border-color: rgb(255 255 255 / .12); background-color: rgb(255 255 255 / .05); color: rgb(226 232 240);
}

.tb-switch__btn {
    height: 2rem; padding: 0 .7rem; border-radius: .5rem; border: 0;
    font-size: .8125rem; font-weight: 600; cursor: pointer;
    background-color: #2563EB; color: #fff;
}
.tb-switch__btn:hover { background-color: #1D4FD0; }

/* En pantallas chicas el topbar no alcanza: se deja solo el desplegable. */
@media (max-width: 640px) {
    .tb-switch__lbl { display: none; }
    .tb-switch__sel { max-width: 8rem; }
}

/* ═══════════════════════════════════════════════════════════════════════
   CAMPO DE ETIQUETAS (teléfonos del cliente)
   El placeholder se veía descolgado respecto a la caja: el input vive dentro
   de un contenedor flex junto a las etiquetas ya ingresadas, y sin altura ni
   alineación propias quedaba pegado arriba.
   ═══════════════════════════════════════════════════════════════════════ */
/* OJO CON EL SELECTOR: `.fi-fo-tags-input .fi-input-wrp` no existe. Las dos
   clases van en EL MISMO elemento (`.fi-input-wrp.fi-fo-tags-input`), así que
   esa regla —escrita como descendiente— nunca hizo nada. Medido: el input
   quedaba de 17px pegado al borde de arriba de una caja de 42, con 25px de
   vacío debajo. Es lo que hacía ver el texto de ejemplo «colgado». */
.fi-fo-field .fi-input-wrp.fi-fo-tags-input { align-items: center; }

/* El contenedor intermedio tampoco centra por su cuenta. */
.fi-fo-field .fi-input-wrp.fi-fo-tags-input > .fi-input-wrp-content-ctn {
    display: flex;
    align-items: center;
    min-width: 0;
}
.fi-fo-field .fi-input-wrp.fi-fo-tags-input > .fi-input-wrp-content-ctn > * {
    flex: 1 1 auto;
    min-width: 0;
}

/* Y el input recupera su alto natural: la regla de los desplegables le daba
   `height: 100%` sobre un padre de alto automático, que resuelve en la altura
   del texto y lo deja apoyado arriba. */
.fi-fo-field .fi-input-wrp.fi-fo-tags-input input {
    height: auto;
    line-height: 1.5;
    padding-block: 0;
}

/* El placeholder hereda la línea del input, no la del contenedor. */
.fi-fo-field .fi-input-wrp.fi-fo-tags-input input::placeholder { line-height: inherit; opacity: .55; }

/* ═══════════════════════════════════════════════════════════════════════
   HISTORIAL DE LA MASCOTA · línea de tiempo (agenda + atenciones + vacunas)
   Colores por variable para que el modo oscuro se resuelva solo.
   ═══════════════════════════════════════════════════════════════════════ */
.tb-hist { display: flex; flex-direction: column; gap: .85rem; }

.tb-hist__item { position: relative; display: flex; gap: .7rem; padding-left: .1rem; }
/* Línea vertical que une los hitos; el último no la lleva. */
.tb-hist__item::before {
    content: ""; position: absolute; left: .3rem; top: 1.1rem; bottom: -.85rem;
    width: 1px; background: rgb(0 0 0 / .1);
}
.dark .tb-hist__item::before { background: rgb(255 255 255 / .12); }
.tb-hist__item:last-child::before { display: none; }

.tb-hist__punto {
    flex: none; width: .65rem; height: .65rem; margin-top: .3rem;
    border-radius: 999px; background: #2563EB; position: relative; z-index: 1;
    box-shadow: 0 0 0 3px rgb(37 99 235 / .14);
}
.tb-hist__item--vacuna .tb-hist__punto { background: #5B8DF7; box-shadow: 0 0 0 3px rgb(91 141 247 / .16); }
.tb-hist__item--cita .tb-hist__punto { background: #4F6E8C; box-shadow: 0 0 0 3px rgb(79 110 140 / .16); }

.tb-hist__cuerpo { flex: 1; min-width: 0; }
.tb-hist__cab { display: flex; align-items: center; gap: .45rem; flex-wrap: wrap; }
.tb-hist__fecha { font-family: var(--tb-mono); font-size: .7rem; color: rgb(107 114 128); }
.dark .tb-hist__fecha { color: rgb(161 161 166); }
.tb-hist__tipo {
    font-size: .65rem; text-transform: uppercase; letter-spacing: .05em; font-weight: 700;
    color: #1D4FD0; background: #E8EFFE; padding: .1rem .4rem; border-radius: 999px;
}
.dark .tb-hist__tipo { color: #0A84FF; background: rgb(10 132 255 / .14); }
.tb-hist__estado { font-size: .65rem; color: rgb(107 114 128); text-transform: capitalize; }
.dark .tb-hist__estado { color: rgb(161 161 166); }

.tb-hist__titulo { font-size: .85rem; font-weight: 600; margin: .15rem 0 0; }
.tb-hist__detalle, .tb-hist__pie { font-size: .78rem; color: rgb(107 114 128); margin: .1rem 0 0; }
.dark .tb-hist__detalle, .dark .tb-hist__pie { color: rgb(161 161 166); }

.tb-hist__vacio { font-size: .82rem; color: rgb(107 114 128); }
.dark .tb-hist__vacio { color: rgb(161 161 166); }

/* ══════════════════════════════════════════════════════════════════════
   SÓLO ESCRITORIO (≥768px)
   Todo lo que sigue existe para una sola cosa: que en una FILA de formulario
   el desplegable, el campo de texto y el selector de fecha midan igual y su
   texto quede a la misma altura. En móvil no hay filas — cada campo va a
   ancho completo, uno debajo del otro — así que nada de esto hace falta ahí.
   Y sí hace daño: el desplegable no nativo dibuja su PANEL DE OPCIONES dentro
   de la misma caja, así que cualquier altura o ancho impuesto lo aplasta. Eso
   descuadró «Existencias» de Inventario en el teléfono cuatro veces seguidas
   («otro» partido letra por letra, etiquetas encabalgadas).
   Si vuelve a aparecer un descuadre de formulario SÓLO en móvil, la causa
   está acá adentro y la respuesta es acotar, no agregar otra regla.
   ══════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════
   DESPLEGABLES · EL TEXTO CENTRADO, EN CUALQUIER ANCHO

   Lo que sigue NO impone alturas: sólo centra lo que haya dentro de la caja.
   Por eso puede vivir fuera del bloque de escritorio, donde sí hay reglas de
   altura que en el teléfono rompían la maqueta.

   POR QUÉ IMPORTA: el bloque de escritorio empieza en 768px, así que en un
   modal abierto desde el teléfono —«Asociar vehículo», por ejemplo— el texto
   del desplegable quedaba pegado al borde de arriba. Los campos de una PÁGINA
   no lo mostraban porque Filament ya los centra por su cuenta; los de un modal,
   sí.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-fo-field .fi-fo-select .fi-select-input-btn {
    padding-block: 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
}

/* MEDIDO EN EL DOM: el control interno medía 47px dentro de una caja de 42 y
   se desbordaba 5px por abajo. La culpa es de su propio relleno vertical
   (5,6px arriba y abajo) sumado a la altura fija de la caja. Se le quita: la
   caja ya reserva el alto y el centrado lo hace el contenedor. */
.fi-fo-field .fi-fo-select .fi-select-input:not(select) { padding-block: 0; }

/* En los de selección múltiple el relleno se queda: ahí la caja crece con los
   distintivos y ese aire es el que los separa del borde. */
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input:not(select) {
    padding-block: .35rem;
}

/* Y el contenedor que sí tiene el alto de la caja centra lo que lleva dentro.
   Sin esto el control se apoyaba arriba y el texto quedaba 3px alto.

   `min-width: 0` EN LA CADENA COMPLETA, y no es opcional: al volver flexible
   este contenedor, sus hijos pasan a tener `min-width: auto`, que les permite
   crecer más que la caja. Con un nombre largo el control se salía por la
   derecha y el valor, la ✕ y la flecha quedaban FUERA del borde. El recorte
   con puntos suspensivos tampoco puede actuar mientras el elemento tenga
   permiso de crecer. */
.fi-fo-field .fi-input-wrp.fi-fo-select > .fi-input-wrp-content-ctn {
    display: flex;
    align-items: center;
    min-width: 0;
}
.fi-fo-field .fi-input-wrp.fi-fo-select > .fi-input-wrp-content-ctn > * {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 100%;
}

/* EL VALOR ELEGIDO VA EN UNA LÍNEA, EN CUALQUIER ANCHO.

   «Andrea Hernández Contreras» en un desplegable de teléfono se partía en
   TRES renglones y el último quedaba cortado por el borde de la caja. Se corta
   con puntos suspensivos, que es lo que hace cualquier campo de una ficha.

   Esta regla vivía sólo en el bloque de escritorio; en el teléfono, que es
   donde el ancho aprieta, no aplicaba.

   Se excluyen los de selección MÚLTIPLE: ahí el primer hijo es el contenedor
   de distintivos y tiene que poder fluir en varias líneas. */
.fi-fo-field .fi-fo-select:not(:has(.fi-select-input-value-badges-ctn)) .fi-select-input-btn > *:first-child {
    flex: 1 1 auto;
    min-width: 0;
    text-align: left;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* `display: block` es lo que hace visibles los puntos suspensivos:
       Filament trae este contenedor en `flex`, y `text-overflow` no actúa
       sobre el texto suelto de una caja flexible. Sin esto el nombre se
       cortaba en seco contra la flecha, sin señal de que seguía. */
    display: block;
    line-height: 1.4;
}

/* Los dos contenedores intermedios tampoco centran por su cuenta: mientras
   ellos no se estiren a lo alto, el botón se apoya arriba. */
.fi-fo-field .fi-fo-select .fi-select-input > div:has(.fi-select-input-ctn),
.fi-fo-field .fi-fo-select .fi-select-input-ctn {
    display: flex;
    align-items: center;
    min-width: 0;
}

/* Y el botón tampoco: es el último eslabón antes del texto. */
.fi-fo-field .fi-fo-select .fi-select-input-btn { min-width: 0; max-width: 100%; }

/* En los de selección múltiple mandan los distintivos: la caja crece con ellos
   y el contenido se apoya arriba, que es lo correcto ahí. */
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input > div:has(.fi-select-input-ctn),
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input-ctn {
    align-items: flex-start;
}

@media (min-width: 768px) {
/* ═══════════════════════════════════════════════════════════════════════
   DESPLEGABLES · el texto tiene que quedar centrado en su caja
   Medido en el DOM: el control interno del select medía 60px dentro de una
   caja de 42, corrido 29px hacia abajo. Por eso el texto de ejemplo se veía
   "chueco" respecto a los campos de texto vecinos, que estaban perfectos.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-fo-field .fi-fo-select .fi-select-input-btn {
    height: 100% !important;
    min-height: 0 !important;
    padding-block: 0 !important;
    display: flex;
    align-items: center;
    /* OJO: sin esto el botón se encoge al ancho de su texto (medido: 194px
       dentro de una caja de 327) y el valor con su flecha quedan agrupados a
       la izquierda, con el resto de la caja vacío. Se ve torcido.
       Con width:100% NO basta: el botón es un elemento flexible dentro de la
       caja, así que hay que decirle que CREZCA (flex-grow), no cuánto mide. */
    flex: 1 1 auto;
    width: 100%;
    min-width: 0;
    justify-content: space-between;
    gap: .5rem;
}
/* Entre la caja y el botón hay dos contenedores intermedios que NO crecen —
   ni a lo ancho (medido: 194px dentro de 327) ni a lo alto (36 y 17px dentro
   de 42). Mientras ellos no se estiren, el botón no puede: su width:100% y su
   height:100% se calculan sobre esos contenedores encogidos, y el texto queda
   descentrado hacia arriba. */
.fi-fo-field .fi-fo-select .fi-select-input > div:has(.fi-select-input-ctn),
.fi-fo-field .fi-fo-select .fi-select-input-ctn {
    flex: 1 1 auto;
    width: 100%;
    min-width: 0;
    height: 100%;
    display: flex;
    align-items: center;
}

/* En los de selección múltiple los distintivos mandan: ahí NO se fuerza la
   altura, porque la caja tiene que crecer con ellos. */
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input > div:has(.fi-select-input-ctn),
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input-ctn {
    height: auto;
    align-items: flex-start;
}

/* El texto ocupa el espacio disponible y la flecha se va al extremo. */
.fi-fo-field .fi-fo-select .fi-select-input-btn > *:first-child { flex: 1 1 auto; text-align: left; }
.fi-fo-field .fi-fo-select .fi-select-input-btn > svg,
.fi-fo-field .fi-fo-select .fi-select-input-btn > *:last-child { flex: 0 0 auto; }
/* El valor y el texto de ejemplo comparten la misma línea vertical. */
.fi-fo-field .fi-fo-select .fi-select-input-value-ctn,
.fi-fo-field .fi-fo-select .fi-select-input-value-label,
.fi-fo-field .fi-fo-select .fi-select-input-placeholder {
    display: flex;
    align-items: center;
    /* Probado: forzar height:100% acá lo descuadra 4px. Con alineación al
       centro y el interlineado normal queda a ras (medido: 0px de desviación). */
    line-height: 1.2;
    margin-block: 0;
    min-width: 0;
}
/* Excepción: los de selección múltiple crecen, así que ahí no se fuerza. */
.fi-fo-field .fi-fo-select:has(.fi-select-input-value-badges-ctn) .fi-select-input-btn {
    height: auto !important;
    min-height: 2.625rem !important;
    align-items: flex-start;
}

/* ── Selector de fecha: el mismo problema que los desplegables ──
   Medido: su input mide 29px dentro de una caja de 42 y queda 6,5px por
   sobre el centro, mientras el campo de texto de al lado está a ras.
   Se estiran el disparador y sus contenedores para que el texto quede
   centrado igual que en el resto. */
.fi-fo-field .fi-fo-date-time-picker .fi-fo-date-time-picker-trigger,
.fi-fo-field .fi-fo-date-time-picker .fi-fo-date-time-picker-trigger > div,
.fi-fo-field .fi-fo-date-time-picker .fi-input-wrp-content-ctn > div {
    height: 100%;
    display: flex;
    align-items: center;
}
.fi-fo-field .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input {
    height: 100%;
    width: 100%;
    padding-block: 0;
}
} /* fin · sólo escritorio */

/* ═══════════════════════════════════════════════════════════════════════
   CÓDIGO DE 6 DÍGITOS (MFA) · máscara TapBox
   La misma idea del PIN del APK: mientras se escribe, los puntos se van
   convirtiendo en las letras de TapBox — "Tap" en tinta y "Next" en azul.

   CÓMO ESTÁ HECHO POR DENTRO (medido en el CSS de Filament, no supuesto):
     · El contenedor es position:relative y las casillas son INLINE-BLOCK.
       Un primer intento las puso en flex y se apilaron en columna.
     · Los dígitos que se ven NO están en las casillas: son el propio input,
       encima, con un letter-spacing grande. Por eso, además de las letras,
       quedaban los números a la vista.

   Por eso acá: se respeta el flujo inline y se oculta el texto del input —
   la máscara pasa a ser la única señal de avance, igual que en el APK.

   Sin JavaScript: Filament ya marca .fi-active en cada casilla a medida que
   entran dígitos. Si esas clases cambiaran, se pierde el efecto pero el campo
   sigue funcionando: nadie queda fuera por un adorno.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-one-time-code-input-ctn {
    height: 3.25rem !important;
    text-align: center;
    white-space: nowrap;
}

.fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field {
    /* inline-flex, NO flex: así siguen en fila y se centra su contenido. */
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    vertical-align: middle;
    width: 1.75rem !important;
    height: 3.25rem !important;
    margin-inline: .28rem;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    font-family: 'Schibsted Grotesk', Inter, system-ui, sans-serif;
    font-weight: 700;
    font-size: 2rem;
    line-height: 1;
}

/* Vacía: solo el punto. */
.fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field::before {
    content: '';
    width: .8rem;
    height: .8rem;
    border-radius: 50%;
    background: #CBD5E1;
}
.dark .fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field::before { background: #3A3A3C; }

/* Con dígito: el punto se rellena con el color del panel. */
.fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field.fi-active::before {
    background: var(--primary-600, #2563EB);
    transform: scale(1.05);
}
.dark .fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field.fi-active::before {
    background: var(--primary-400, #0A84FF);
}

/* ═══════════════════════════════════════════════════════════════════════
   LA MARCA SE ESCRIBE SOLA MIENTRAS ENTRA EL CÓDIGO

   ANTES ERA UNA LETRA POR CASILLA: T-a-p-B-o-x, seis letras en seis huecos.
   Calzaba perfecto con la marca vieja y con la nueva no calza en absoluto —
   «PaperNext» tiene nueve—, así que en staff seguía deletreando una marca que
   ya no existe.

   Ahora la palabra NO vive en las casillas sino debajo de ellas, y crece por
   tramos a medida que entran los dígitos:

       1 → P     2 → Pap    3 → Pape
       4 → PaperN   5 → PaperNe   6 → el logotipo

   Los tramos no son de una letra: nueve letras en seis pasos no dan una por
   paso, y repartir 1-1-1-1-1-4 dejaba el salto entero para el final. Con
   1-3-4-6-7-9 el crecimiento se siente parejo y el último dígito es el que
   completa la palabra, que es el momento que vale.

   SIN JAVASCRIPT, con `:has()`. Filament ya marca `.fi-active` en cada casilla
   con dígito; la regla que gana es la del último tramo cumplido. Si esas
   clases cambiaran, se pierde el adorno y el campo sigue funcionando: nadie
   se queda fuera por una animación.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-one-time-code-input-ctn {
    position: relative;
    /* Espacio reservado SIEMPRE, tenga o no palabra debajo: si se reservara
       sólo al escribir, el bloque entero saltaría con el primer dígito. */
    margin-bottom: 2.5rem;

    /* CENTRADO. Filament le pone `width: fit-content`, así que la caja mide lo
       que miden las seis casillas y se queda pegada al borde izquierdo del
       formulario: quedaba corrida respecto del título, del texto y del botón,
       que sí van centrados. `text-align:center` no la mueve —centra el
       contenido DENTRO de la caja, no la caja—; lo que la centra son los
       márgenes automáticos. */
    margin-inline: auto;
}

/* La palabra que crece. */
.fi-one-time-code-input-ctn::after {
    content: '';
    position: absolute;
    top: calc(100% + .35rem);
    left: 0;
    right: 0;
    text-align: center;
    font-family: 'Schibsted Grotesk', Inter, system-ui, sans-serif;
    font-weight: 700;
    font-size: 1.35rem;
    letter-spacing: -.02em;
    line-height: 1.2;
    color: var(--pn-tinta, #1D1D1F);
    transition: opacity .22s ease;
}

.fi-one-time-code-input-ctn:has(> :nth-child(1).fi-active)::after { content: 'P'; }
.fi-one-time-code-input-ctn:has(> :nth-child(2).fi-active)::after { content: 'Pap'; }
.fi-one-time-code-input-ctn:has(> :nth-child(3).fi-active)::after { content: 'Pape'; }
.fi-one-time-code-input-ctn:has(> :nth-child(4).fi-active)::after { content: 'PaperN'; }
.fi-one-time-code-input-ctn:has(> :nth-child(5).fi-active)::after { content: 'PaperNe'; }

/* Sexto dígito: la palabra se apaga y aparece el logotipo de verdad, que es
   el que trae los dos colores de la marca. */
.fi-one-time-code-input-ctn:has(> :nth-child(6).fi-active)::after {
    content: 'PaperNext';
    opacity: 0;
}

.fi-one-time-code-input-ctn::before {
    content: '';
    position: absolute;
    top: calc(100% + .3rem);
    left: 50%;
    transform: translateX(-50%) scale(.94);
    width: 8.6rem;
    height: 1.945rem;   /* 8,6 / 4,423: la proporción exacta del logotipo */
    background: url('/img/pn-logo.png') center / contain no-repeat;
    opacity: 0;
    transition: opacity .28s ease, transform .28s ease;
    pointer-events: none;
}
.dark .fi-one-time-code-input-ctn::before { background-image: url('/img/pn-logo-oscuro.png'); }

.fi-one-time-code-input-ctn:has(> :nth-child(6).fi-active)::before {
    opacity: 1;
    transform: translateX(-50%) scale(1);
}

@media (prefers-reduced-motion: reduce) {
    .fi-one-time-code-input-ctn::before,
    .fi-one-time-code-input-ctn::after { transition: none; }
}

/* El código escrito se oculta: la máscara es la señal de avance, y un código
   de acceso no tiene por qué quedar a la vista de quien mire la pantalla. */
.fi-one-time-code-input {
    color: transparent !important;
    caret-color: transparent !important;
    letter-spacing: normal !important;
}
.fi-one-time-code-input::selection { background: transparent; }

/* En celular: casillas y letras algo más chicas para que quepan sin apretar. */
@media (max-width: 400px) {
    .fi-one-time-code-input-ctn > .fi-one-time-code-input-digit-field {
        width: 1.5rem !important;
        margin-inline: .18rem;
        font-size: 1.75rem;
    }
}

/* ── MFA · "Use un código de recuperación" va DEBAJO del botón ──
   Filament lo pinta como contenido inferior del campo del código, o sea
   dentro del campo y por lo tanto encima del botón de confirmar.

   PRIMER INTENTO, DESCARTADO: aplanar la jerarquía con display:contents para
   poder reordenarlo. Medido, el código y el botón terminaban SOLAPADOS — al
   quitarle la caja a los envoltorios se perdía la altura del campo.

   Lo que sí funciona sin tocar la estructura de Filament: se saca el enlace
   del flujo y se fija al pie del formulario, con espacio reservado abajo para
   que no pise al botón. Si Filament cambiara su marcado, el enlace vuelve a
   su lugar original y sigue funcionando.

   Acotado a #multiFactorChallengeForm: no afecta ningún otro formulario.

   SÓLO EL ENLACE, NO LA CASILLA. El texto de ayuda de «No volver a pedirme el
   código en este equipo» (DesafioSegundoFactor) también se dibuja como
   `.fi-sc.fi-inline`, y esta regla lo mandaba al pie junto con el enlace: los
   dos quedaban apilados bajo el botón, pisándolo y pisándose entre sí. El
   enlace vive en el campo del código; la casilla trae su propio campo, y ése
   se excluye para que su ayuda siga bajo la casilla, en el flujo normal. */
#multiFactorChallengeForm {
    position: relative;
    padding-bottom: 2.4rem;
}
#multiFactorChallengeForm .fi-fo-field:not(:has(.fi-checkbox-input)) .fi-sc.fi-inline {
    position: absolute;
    inset-inline: 0;
    bottom: 0;
    display: flex;
    justify-content: center;
    margin: 0;
}

/* — Tablas en teléfono: una ficha por registro, sin desplazarse de lado —
   La fila ya se resume en un bloque (App\Support\TablaMovil), pero la celda de
   ACCIONES seguía estirando la tabla: cuatro botones en línea no caben en
   375px y devolvían el desplazamiento horizontal.

   POR QUÉ SE DESARMA A BLOQUES Y NO A CAJA FLEXIBLE
   Se intentó con `display:flex` en la fila y quedó peor: un <tr> flexible sale
   de la maquinaria de la tabla, el <tbody> le genera celdas anónimas alrededor
   y el ancho pasa a calcularse sobre una caja fantasma. En pantalla se veía la
   ficha metida en una columna de ~150px con media pantalla en blanco al lado.

   La forma que funciona es desarmar la tabla ENTERA —tabla, cuerpo, fila y
   celdas— a bloques. Un bloque ocupa el ancho de su contenedor por definición,
   así que la ficha usa toda la pantalla y las celdas se apilan solas: primero
   el resumen, después los botones.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 767px) {
    /* La tabla deja de comportarse como tabla: nada de anchos mínimos ni de
       columnas que negocien espacio entre sí. */
    .fi-ta-table,
    .fi-ta-content table {
        display: block;
        min-width: 0 !important;
        width: 100% !important;
    }
    .fi-ta-content { overflow-x: hidden; }

    .fi-ta-table > thead,
    .fi-ta-table > tbody { display: block; width: 100%; }

    /* La cabecera no aporta nada cuando la fila ya es una ficha: sus títulos
       corresponden a columnas que en el teléfono están ocultas. */
    .fi-ta-table > thead { display: none; }

    .fi-ta-row {
        display: block;
        width: 100%;
        position: relative;
    }

    /* Cada celda visible, una línea a ancho completo.
       Se EXCLUYEN las columnas de escritorio: Filament las esconde con
       `.fi-ta-cell.md\:fi-visible { display:none }` —misma especificidad que
       esta regla, cargada después— y sin excluirlas reaparecían todas en el
       teléfono, entre ellas la ✗ roja del 2FA de Usuarios. El comodín cubre
       cualquier corte (sm/md/lg), no sólo `md`. */
    .fi-ta-row > .fi-ta-cell:not([class*="fi-visible"]):not(.fi-ta-selection-cell) {
        display: block;
        width: 100% !important;
        max-width: 100%;
        min-width: 0;
        white-space: normal;
        padding-block: .35rem;
    }
    /* OJO con `:first-child`: la primera <td> de la fila es la CASILLA DE
       SELECCIÓN, no el texto. Apuntando ahí, el aire de arriba se lo llevaba
       una celda que está posicionada aparte, y la reserva de margen derecho
       también — por eso en Empleados el nombre se metía debajo de la casilla y
       parecía cortado. Se apunta al contenido, excluyéndola. */
    .fi-ta-row > .fi-ta-cell:not(.fi-ta-selection-cell):not([class*="fi-visible"]):nth-of-type(1),
    .fi-ta-row > .fi-ta-selection-cell + .fi-ta-cell { padding-top: .7rem; }
    .fi-ta-row > .fi-ta-cell:last-child { padding-bottom: .7rem; }

    /*
     * EL AIRE VA UNA SOLA VEZ, EN LA CELDA.
     *
     * Filament reparte el respiro de la fila entre la <td> y el envoltorio del
     * contenido: 16px arriba y abajo por dentro. En escritorio se suman en
     * HORIZONTAL —una fila, siete columnas— y no se notan. Acá las celdas se
     * apilan, así que esos 32px se suman en VERTICAL una vez por columna: en
     * Mascotas, con foto, nombre y microchip, la ficha de cada animal quedaba
     * con casi 100px de blanco repartidos en huecos entre líneas que no se
     * entendían.
     *
     * Se anula el de dentro y manda el de la celda, que es el que esta hoja
     * ajusta arriba.
     */
    .fi-ta-row > .fi-ta-cell .fi-ta-text,
    .fi-ta-row > .fi-ta-cell .fi-ta-image,
    .fi-ta-row > .fi-ta-cell .fi-circular,
    .fi-ta-row > .fi-ta-cell .fi-ta-icon,
    .fi-ta-row > .fi-ta-cell > .fi-ta-col > * { padding-block: 0 !important; }

    /*
     * Y todo alineado a la izquierda. Una columna numérica va a la derecha
     * porque en una tabla se compara con la de arriba; apilada no tiene con
     * qué alinearse, y el número se va solo al borde opuesto del nombre —en
     * Mascotas el microchip quedaba flotando lejos del animal al que pertenece.
     */
    .fi-ta-row > .fi-ta-cell,
    .fi-ta-row > .fi-ta-cell .fi-ta-col,
    .fi-ta-row > .fi-ta-cell .fi-ta-text { text-align: left !important; justify-content: flex-start !important; }

    /* La casilla de selección se queda donde siempre: al principio de la
       ficha, a la izquierda. Lo único que hacía falta era que NO heredara el
       ancho completo de las demás celdas — con 341px su caja empezaba fuera
       del margen de la tarjeta y la casilla salía cortada por el borde. */
    .fi-ta-row > .fi-ta-cell.fi-ta-selection-cell {
        display: block;
        width: auto !important;
        padding: .7rem .75rem 0;
    }


    /* EXCEPCIÓN · el menú de tres puntos va al costado, no abajo.
     *
     * Bajar los botones a su propia línea tiene sentido cuando son varios y
     * llevan texto («Documentos», «Ver», «Portal», «Editar»). Cuando la tabla
     * resuelve todo con UN menú de tres puntos —como Consentimientos— esa
     * línea entera se gasta en un icono, y la ficha queda con un renglón
     * suelto debajo del texto.
     *
     * Se reconoce por ser una sola acción y ser un desplegable. Sólo se aplica
     * si la fila no tiene casilla de selección, porque ésa ya ocupa la esquina
     * superior derecha y se estorbarían. */
    .fi-ta-row:not(:has(.fi-ta-selection-cell))
        > .fi-ta-cell:has(.fi-ta-actions .fi-dropdown):not(:has(.fi-ta-actions > *:nth-child(2))) {
        position: absolute;
        inset-inline-end: .5rem;
        /*
         * SE CENTRA ESTIRANDO LA CELDA, NO CON `transform`.
         *
         * `top:50% + translateY(-50%)` centraba igual, pero un elemento con
         * `transform` se convierte en el bloque contenedor de sus descendientes
         * `position: fixed`. El panel del menú de tres puntos es fixed
         * justamente para poder ESCAPAR del contenedor con scroll de la tabla
         * (`.fi-ta-content-ctn`, que va en `overflow: auto`); atrapado por la
         * celda, quedaba anclado a ella y recortado por ese contenedor: en
         * Consentimientos, «Ver comprobante» aparecía detrás de la tarjeta y
         * cortado.
         *
         * Estirar la celda de arriba a abajo y centrar con flex da el mismo
         * resultado visual sin crear ese bloque contenedor.
         */
        top: 0;
        bottom: 0;
        display: flex;
        align-items: center;
        width: auto !important;
        padding: 0;
        z-index: 1;
    }
    /* El texto se detiene antes de llegar al menú. */
    .fi-ta-row:not(:has(.fi-ta-selection-cell)):has(.fi-ta-actions .fi-dropdown)
        > .fi-ta-cell:not(:has(.fi-ta-actions)) { padding-inline-end: 3rem; }

    /* Los botones, en su propia línea y alineados a la izquierda con el texto. */
    .fi-ta-actions {
        flex-wrap: wrap;
        justify-content: flex-start;
        gap: 6px;
        max-width: 100%;
    }
    .fi-ta-actions .fi-btn,
    .fi-ta-actions .fi-icon-btn { flex: none; }

    /* Nada dentro de una celda debe empujar el ancho: ni un RUT ni un correo. */
    .fi-ta-text, .fi-ta-text-item-label { overflow-wrap: anywhere; }
}

/* — Acceso por PIN: estado y acciones —
   El estado va como una tira legible de un vistazo, no como un párrafo. Y las
   dos acciones se separan: «Guardar nuevo PIN» y «Desactivar PIN» pegados —y
   además pegados al campo «Repite el PIN»— invitan a pulsar la equivocada. */
.tb-pin-estado {
    display: flex; align-items: center; gap: 14px;
}
.tb-pin-estado__ic {
    display: inline-flex; align-items: center; justify-content: center;
    width: 42px; height: 42px; border-radius: 12px; flex: none;
    background: rgba(148, 163, 184, .14); color: #64748b;
}
.tb-pin-estado.is-on .tb-pin-estado__ic { background: rgba(37, 99, 235, .12); color: #2563EB; }
.dark .tb-pin-estado.is-on .tb-pin-estado__ic { background: rgba(10, 132, 255, .14); color: #0A84FF; }

.tb-pin-estado__txt { min-width: 0; flex: 1; }
.tb-pin-estado__tit { font-weight: 700; font-size: 15px; letter-spacing: -.01em; }
.tb-pin-estado__sub { font-size: 13.5px; line-height: 1.55; color: #64748b; margin-top: 2px; }
.dark .tb-pin-estado__sub { color: #A1A1A6; }

.tb-pin-estado__chip {
    flex: none; font-size: 11.5px; font-weight: 700; letter-spacing: .04em;
    text-transform: uppercase; padding: 5px 11px; border-radius: 999px;
    background: rgba(148, 163, 184, .16); color: #64748b;
}
.tb-pin-estado.is-on .tb-pin-estado__chip { background: rgba(37, 99, 235, .12); color: #2563EB; }
.dark .tb-pin-estado.is-on .tb-pin-estado__chip { background: rgba(10, 132, 255, .16); color: #0A84FF; }

/* Aire entre el último campo del formulario y los botones. */
.tb-pin-acciones {
    display: flex; flex-wrap: wrap; align-items: center; gap: 12px;
    margin-top: 26px; padding-top: 20px;
    border-top: 1px solid rgb(228 233 231 / 1);
}
.dark .tb-pin-acciones { border-top-color: rgb(255 255 255 / .08); }

/* La acción destructiva se va al otro extremo: no se pulsa por inercia. */
.tb-pin-acciones > *:last-child:not(:first-child) { margin-inline-start: auto; }

@media (max-width: 640px) {
    /* En teléfono no hay ancho para separarlos de lado: se apilan, y el
       destructivo queda abajo, lejos del pulgar que viene de «Guardar». */
    .tb-pin-acciones { flex-direction: column; align-items: stretch; gap: 14px; }
    .tb-pin-acciones > *:last-child:not(:first-child) { margin-inline-start: 0; }
    .tb-pin-estado { flex-wrap: wrap; }
    .tb-pin-estado__chip { order: -1; }
}

/* ══════════════════════════════════════════════════════════════════════
   DESPLEGABLES EN MÓVIL · ancho, nunca altura
   Al acotar el bloque de escritorio se fue también lo único que en el
   teléfono sí hacía falta: decirle al desplegable que ocupe TODO el ancho
   de su caja. Sin eso el botón se encoge al ancho de su contenido y una
   etiqueta como «Otro…» se parte letra por letra en vertical, estirando el
   campo hacia abajo y encabalgándose con la etiqueta de al lado. Se veía al
   editar una unidad fuera de la lista (litro, saco, bolsa…).

   REGLA DE ORO: acá se toca ANCHO, jamás altura ni display. El desplegable
   no nativo dibuja su panel de opciones dentro de esta misma caja, y
   cualquier altura impuesta lo aplasta.
   ══════════════════════════════════════════════════════════════════════ */
@media (max-width: 767px) {
    .fi-fo-field .fi-fo-select .fi-select-input:not(select),
    .fi-fo-field .fi-fo-select .fi-select-input-ctn,
    .fi-fo-field .fi-fo-select .fi-select-input-btn {
        width: 100%;
        min-width: 0;
        max-width: 100%;
    }
    /* El valor va en una línea: si no cabe, puntos suspensivos. */
    .fi-fo-field .fi-fo-select .fi-select-input-value-label,
    .fi-fo-field .fi-fo-select .fi-select-input-placeholder {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        min-width: 0;
    }
    /* Las opciones del panel sí pueden ocupar dos líneas. */
    .fi-fo-field .fi-fo-select [role="option"] { white-space: normal; }
}

/* ══════════════════════════════════════════════════════════════════════
   MENÚ LATERAL ABIERTO EN MÓVIL · la página de atrás no se mueve
   Con el menú desplegado, arrastrar el dedo desplazaba el contenido de
   abajo: se perdía el sitio donde uno estaba y el menú parecía flotar
   sobre algo que se movía solo. La marca la pone el propio menú (ver
   resources/views/filament/sidebar-close.blade.php) y sólo en móvil.
   ══════════════════════════════════════════════════════════════════════ */
html.tb-menu-abierto,
html.tb-menu-abierto body {
    overflow: hidden;
    /* Corta el "rebote" que en iOS pasa el gesto a la página de atrás. */
    overscroll-behavior: none;
}
/* El fondo oscuro no es contenido: ahí el dedo no debe desplazar nada. */
html.tb-menu-abierto .fi-sidebar-close-overlay { touch-action: none; }
/* Dentro del menú sí se desplaza, pero el gesto se queda ahí: al llegar al
   final de la lista no continúa arrastrando lo de atrás. */
html.tb-menu-abierto .fi-sidebar { overscroll-behavior: contain; }

/* ══════════════════════════════════════════════════════════════════════
   CASILLA DE SELECCIÓN DE LAS TABLAS
   Marcada, Filament le deja su sombra proyectada (0 1px 3px negro al 10%).
   Sobre el azul y en fondo oscuro esa sombra se lee como una franja más
   oscura pegada al borde de abajo, como si el icono estuviera mal recortado.
   El relleno azul ya la distingue de sobra; la sombra sólo ensucia.
   ══════════════════════════════════════════════════════════════════════ */
.fi-ta-record-checkbox,
.fi-ta-record-checkbox:checked { box-shadow: none !important; }

/* ══════════════════════════════════════════════════════════════════════
   ETIQUETA JUNTO AL NOMBRE (tipo de documento)
   Distintivo pequeño que acompaña al título en la misma línea, en vez de
   ocupar una columna propia. Discreto a propósito: el que manda es el
   nombre del documento, la etiqueta sólo lo clasifica.
   ══════════════════════════════════════════════════════════════════════ */
.tb-etiqueta {
    display: inline-block;
    margin-inline-start: .4rem;
    padding: .05rem .4rem;
    border-radius: 999px;
    font-size: .68rem;
    font-weight: 600;
    line-height: 1.5;
    letter-spacing: .01em;
    vertical-align: middle;
    white-space: nowrap;
    color: #1D4FD0;
    background: #E8EFFE;
}
.dark .tb-etiqueta { color: #0A84FF; background: rgb(10 132 255 / .14); }

/* ══════════════════════════════════════════════════════════════════════════
   INICIO · sistema visual propio
   ══════════════════════════════════════════════════════════════════════════
   Las tarjetas de estadística que trae Filament se ven como las de cualquier
   panel hecho con Filament: mismo recuadro, misma tipografía, mismo peso para
   el número y para su etiqueta. Sirven, pero no dicen nada de la marca ni
   jerarquizan.
   Acá el número manda —tipografía display, grande, apretada—, la etiqueta va
   arriba en versalitas y el contexto abajo en gris. El icono ocupa una esquina
   y no compite. Todo comparte radio, borde y sombra con el resto del panel.  */

.tb-ico { width: 100%; height: 100%; display: block; }

/* ── Rejilla de tarjetas ───────────────────────────────────────────────── */
.tb-panel { display: grid; gap: 12px; grid-template-columns: repeat(4, minmax(0, 1fr)); }
/* La primera ocupa dos columnas: es el dato del día y con siete tarjetas en una
   rejilla de cuatro, además, deja la segunda fila completa en vez de con un
   hueco suelto al final. */
.tb-tarj--ancha { grid-column: span 2; }
@media (max-width: 640px) { .tb-tarj--ancha { grid-column: span 2; } }
@media (max-width: 1279px) { .tb-panel { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* En el teléfono se mantienen DOS por fila. Con una sola, siete tarjetas
   obligaban a desplazar media pantalla por dato, y el panel dejaba de servir
   para lo que existe: ver el estado de un vistazo. */
@media (max-width: 900px)  { .tb-panel { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.tb-tarj {
    position: relative; overflow: hidden;
    background: #fff; border: 1px solid rgb(15 23 42 / .07); border-radius: 16px;
    padding: 16px 16px 14px; text-decoration: none; color: inherit; display: block;
    transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
.dark .tb-tarj { background: var(--tb-d-card, #242426); border-color: var(--tb-d-border, rgba(255,255,255,.09)); }

/* Filo de color arriba: identifica el estado sin pintar la tarjeta entera. */
.tb-tarj::before {
    content: ""; position: absolute; inset: 0 0 auto 0; height: 3px;
    background: var(--filo, transparent); opacity: .9;
}
.tb-tarj--ir { cursor: pointer; }
.tb-tarj--ir:hover { transform: translateY(-2px); box-shadow: 0 10px 24px -14px rgb(15 23 42 / .45); border-color: rgb(37 99 235 / .35); }

.tb-tarj__cab { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.tb-tarj__et {
    font-size: 10.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
    color: rgb(100 116 139); line-height: 1.35;
}
.dark .tb-tarj__et { color: rgb(161 161 166); }

.tb-tarj__ico {
    flex: none; width: 34px; height: 34px; border-radius: 10px; padding: 8px;
    background: var(--tinte, rgb(148 163 184 / .12)); color: var(--filo, #64748b);
}

.tb-tarj__num {
    font-family: var(--tb-display, inherit); font-weight: 600;
    font-size: 34px; line-height: 1.05; letter-spacing: -.035em;
    color: #0f172a; margin-top: 10px;
}
.tb-tarj--ancha { padding: 18px 20px 16px; }
.tb-tarj--ancha .tb-tarj__num { font-size: 44px; margin-top: 14px; }
.tb-tarj--ancha .tb-tarj__ico { width: 38px; height: 38px; padding: 9px; }
.dark .tb-tarj__num { color: #FFFFFF; }
.tb-tarj__num small { font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: rgb(100 116 139); margin-left: 3px; }

.tb-tarj__pie { margin-top: 4px; font-size: 12.2px; line-height: 1.45; color: rgb(100 116 139); }
.dark .tb-tarj__pie { color: rgb(161 161 166); }
.tb-tarj__pie b { color: var(--filo, inherit); font-weight: 700; }

/* Tonos. El filo y el tinte del icono salen del mismo color. */
/* «verde» es un ESTADO ("todo bien"), no la marca: lo emite el widget junto a
   ámbar y rojo. Cuando la marca era verde, ambos coincidían por casualidad y
   el color corporativo terminaba significando "ok". Con la marca en azul se
   separan, que es como debe ser: la escala de estado se lee sola. */
.tb-t--verde  { --filo: #1C8A5B; --tinte: rgb(28 138 91 / .12); }
.tb-t--ambar  { --filo: #B45309; --tinte: rgb(180 83 9 / .12); }
.tb-t--rojo   { --filo: #B91C1C; --tinte: rgb(185 28 28 / .11); }
.tb-t--gris   { --filo: #94A3B8; --tinte: rgb(148 163 184 / .14); }
.dark .tb-t--verde { --filo: #5CC79A; --tinte: rgb(92 199 154 / .15); }
.dark .tb-t--ambar { --filo: #FF9F0A; --tinte: rgb(255 159 10 / .15); }
.dark .tb-t--rojo  { --filo: #F0857D; --tinte: rgb(240 133 125 / .15); }

/* ── Agenda del día ────────────────────────────────────────────────────── */
.tb-agenda__lista { display: flex; flex-direction: column; }
.tb-cita {
    display: flex; align-items: center; gap: 14px; padding: 12px 2px;
    border-top: 1px solid rgb(15 23 42 / .06); text-decoration: none; color: inherit;
}
.tb-cita:first-child { border-top: 0; padding-top: 4px; }
.dark .tb-cita { border-top-color: rgb(255 255 255 / .07); }

/* La hora en una pastilla: es el dato por el que se busca en la lista. */
.tb-cita__hora {
    flex: none; width: 62px; text-align: center; border-radius: 12px; padding: 7px 0;
    background: rgb(37 99 235 / .09);
}
.dark .tb-cita__hora { background: rgb(10 132 255 / .13); }
.tb-cita__h { font-family: var(--tb-display, inherit); font-size: 16px; font-weight: 600; letter-spacing: -.02em; color: #1D4FD0; line-height: 1.1; }
.dark .tb-cita__h { color: #0A84FF; }
.tb-cita__d { font-size: 10px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: #2563EB; opacity: .75; margin-top: 1px; }
.dark .tb-cita__d { color: #0A84FF; }

/* Hoy se distingue del resto sin gritar. */
.tb-cita--hoy .tb-cita__hora { background: #2563EB; }
.tb-cita--hoy .tb-cita__h, .tb-cita--hoy .tb-cita__d { color: #fff; opacity: 1; }

.tb-cita__cuerpo { flex: 1; min-width: 0; }
.tb-cita__tit { font-size: 14.5px; font-weight: 600; color: #0f172a; line-height: 1.3; overflow-wrap: anywhere; }
.dark .tb-cita__tit { color: #FFFFFF; }
.tb-cita__sub { font-size: 12.4px; color: rgb(100 116 139); margin-top: 2px; line-height: 1.4; overflow-wrap: anywhere; }
.dark .tb-cita__sub { color: rgb(161 161 166); }

.tb-cita__estado {
    flex: none; font-size: 11px; font-weight: 700; letter-spacing: .03em;
    padding: 4px 9px; border-radius: 999px; white-space: nowrap;
}
.tb-e--ok { background: rgb(37 99 235 / .12); color: #1D4FD0; }
.tb-e--pend { background: rgb(180 83 9 / .12); color: #92400E; }
.dark .tb-e--ok { background: rgb(10 132 255 / .15); color: #0A84FF; }
.dark .tb-e--pend { background: rgb(255 159 10 / .15); color: #FF9F0A; }

.tb-vacio { padding: 26px 16px; text-align: center; color: rgb(100 116 139); font-size: 13.5px; }
.tb-vacio__ico { width: 34px; height: 34px; margin: 0 auto 10px; color: rgb(148 163 184); }

@media (max-width: 640px) {
    .tb-cita { gap: 11px; }
    .tb-cita__hora { width: 54px; }
    .tb-cita__estado { display: none; }

    /* Tarjetas más apretadas: con dos por fila, el aire de escritorio sobra. */
    .tb-panel { gap: 10px; }
    .tb-tarj { padding: 12px 12px 11px; border-radius: 14px; }
    .tb-tarj__et { font-size: 9.5px; letter-spacing: .06em; }
    .tb-tarj__ico { width: 28px; height: 28px; padding: 6px; border-radius: 8px; }
    .tb-tarj__num { font-size: 27px; margin-top: 6px; }
    .tb-tarj__pie { font-size: 11.4px; margin-top: 2px; }
    .tb-tarj--ancha { padding: 14px 14px 12px; }
    .tb-tarj--ancha .tb-tarj__num { font-size: 34px; margin-top: 8px; }
    .tb-tarj--ancha .tb-tarj__ico { width: 32px; height: 32px; padding: 7px; }

    /* Los accesos rápidos no parten la palabra en dos líneas. */
    .tb-quickgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; }
    .tb-quick { padding: 11px 12px; font-size: 12.5px; }
    .tb-quick svg { width: 16px; height: 16px; }
    .tb-hero__greet { font-size: clamp(24px, 7vw, 30px); }
    .tb-hero__resumen { font-size: 12.5px; gap: 6px 14px; }
}

/* ── Bienvenida ───────────────────────────────────────────────────────────
   Antes era un saludo grande y una fila de botones iguales. Ahora la barra
   trae además la FECHA y el dato del día —cuántas citas y a qué hora la
   próxima—, que es lo que se busca al abrir. Los accesos pasan a ser piezas
   con icono propio y jerarquía: el primero es la acción principal del rubro. */
.tb-hero__fecha {
    font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
    color: rgba(255,255,255,.42); margin-bottom: 10px;
}
.tb-hero__resumen {
    display: flex; flex-wrap: wrap; gap: 8px 20px; margin-top: 14px;
    font-size: 13.5px; color: rgba(255,255,255,.72);
}
.tb-hero__dato { display: inline-flex; align-items: center; gap: 8px; }
.tb-hero__dato svg { width: 16px; height: 16px; color: #5B8DF7; flex: none; }
.tb-hero__dato b { color: #fff; font-weight: 600; }

.tb-quick {
    gap: 10px; padding: 12px 14px; justify-content: flex-start;
    font-size: 13.5px; font-weight: 600;
}
.tb-quick svg { width: 18px; height: 18px; flex: none; color: #5B8DF7; }
/* La primera es la acción principal del rubro: se rellena para que se vea. */
.tb-quick--principal { background: #2563EB; border-color: #2563EB; color: #fff; }
.tb-quick--principal svg { color: #fff; }
.tb-quick--principal:hover { background: #175A88; border-color: #175A88; color: #fff; }

@media (max-width: 720px) {
    .tb-quickgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tb-hero { padding: 22px 20px; }
}

/* ══════════════════════════════════════════════════════════════════════════
   CAPA DE MARCA PAPERNEXT · alineación con el sitio público
   ══════════════════════════════════════════════════════════════════════════

   Va al FINAL a propósito. Todo lo de arriba son correcciones puntuales de
   comportamiento —desplegables que no cerraban, celdas torcidas en móvil,
   máscaras de campos— y no hay que tocarlas. Esta capa sólo cambia el
   LENGUAJE VISUAL para que el panel y papernext se vean la misma marca:
   misma tipografía, mismos neutros, mismos radios y el mismo azul.

   Reglas del sistema, tomadas del sitio:
     · Superficies: blanco puro y un gris de reposo (#F5F5F7 / #0E0E10).
     · Tinta:       #1D1D1F, secundario #6E6E73, terciario #A1A1A6.
     · Acento:      #2563EB, y sólo aparece donde hay que actuar.
     · Formas:      botones en cápsula, tarjetas de 22px, campos de 14px.
     · Sombra:      muy baja y muy abierta; nada de bordes duros.
   ────────────────────────────────────────────────────────────────────── */

:root {
  --pn-tinta:   #1D1D1F;
  --pn-tinta-2: #6E6E73;
  --pn-tinta-3: #A1A1A6;
  --pn-lienzo:  #FFFFFF;
  --pn-nivel:   #F5F5F7;
  --pn-nivel-2: #EBEBEF;
  --pn-filo:    rgba(0,0,0,.07);
  --pn-filo-2:  rgba(0,0,0,.12);
  --pn-ac:      #2563EB;
  --pn-ac-3:    37,99,235;
  --pn-sombra:  0 1px 2px rgba(0,0,0,.04), 0 12px 34px -22px rgba(0,0,0,.30);
  --pn-r-card:  22px;
  --pn-r-campo: 14px;
}
.dark {
  --pn-tinta:   #FFFFFF;
  --pn-tinta-2: #A1A1A6;
  --pn-tinta-3: #8E8E93;
  --pn-lienzo:  #1C1C1E;
  --pn-nivel:   #000000;
  --pn-nivel-2: #2C2C2E;
  --pn-filo:    #2C2C2E;
  --pn-filo-2:  #38383A;
  --pn-ac:      #0A84FF;
  --pn-ac-3:    10,132,255;
  --pn-sombra:  0 1px 2px rgba(0,0,0,.5), 0 16px 40px -24px rgba(0,0,0,.9);
}

/* ── Tipografía ─────────────────────────────────────────────────────────
   Una sola familia, como en el sitio. El peso y el interletrado hacen la
   jerarquía; los títulos van cerrados porque a cuerpo grande el tracking
   por defecto se ve suelto. */
.fi-body, .fi-simple-layout {
  font-family: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  letter-spacing: -.011em;
  background: var(--pn-nivel);
}
.fi-header-heading, .fi-section-header-heading, .fi-modal-heading,
.fi-simple-header-heading, .fi-wi-stats-overview-stat-value {
  font-weight: 800 !important;
  letter-spacing: -.028em !important;
}
.fi-header-heading { font-size: 1.9rem !important; line-height: 1.1 !important; }
.fi-header-subheading, .fi-section-header-description, .fi-simple-header-subheading {
  color: var(--pn-tinta-2) !important;
  letter-spacing: -.008em;
}
.fi-fo-field-label, .fi-ta-header-cell-label {
  font-weight: 700 !important;
  letter-spacing: -.008em;
}

/* ── Tarjetas y secciones ───────────────────────────────────────────────
   Blanco sobre gris, esquina generosa, un filo de un píxel y sombra muy
   abierta. Ni bordes duros ni sombras marcadas: la separación la da el
   contraste de superficie, como en el sitio. */
.fi-section, .fi-wi-stats-overview-stat, .fi-ta-ctn, .fi-modal-window,
.fi-fo-repeater-item, .fi-in-entry-wrp {
  border-radius: var(--pn-r-card) !important;
  border-color: var(--pn-filo) !important;
  background-color: var(--pn-lienzo) !important;
  box-shadow: var(--pn-sombra) !important;
}
.fi-section-header { padding-block: 1.15rem !important; }
.fi-wi-stats-overview-stat { padding: 1.25rem 1.35rem !important; }
.fi-wi-stats-overview-stat-label {
  font-weight: 700 !important; color: var(--pn-tinta-2) !important;
  letter-spacing: -.005em;
}
.fi-wi-stats-overview-stat-value { font-size: 1.85rem !important; }

/* ── Botones en cápsula ─────────────────────────────────────────────────
   Es la forma más reconocible del sitio. El primario lleva una sombra
   teñida del propio acento: lo despega sin necesidad de borde. */
.fi-btn {
  border-radius: 980px !important;
  font-weight: 700 !important;
  letter-spacing: -.01em;
  transition: transform .25s cubic-bezier(.22,1,.32,1), box-shadow .25s, background-color .2s;
}
.fi-btn:active { transform: scale(.975); }
.fi-btn.fi-color-primary:not(.fi-outlined):not(.fi-link),
.fi-btn.fi-color-primary:not(.fi-outlined):not(.fi-link):hover {
  /* Sin sombra teñida: leía como brillo neón. El relleno ya lo distingue. */
  box-shadow: none !important;
}
.fi-icon-btn { border-radius: 980px !important; }
.fi-badge { border-radius: 980px !important; font-weight: 800 !important; letter-spacing: -.004em; }

/* ── Campos ─────────────────────────────────────────────────────────────
   Relleno gris en reposo y blanco al enfocar, con el aro en el acento. Es
   el mismo comportamiento del formulario de contacto del sitio. */
.fi-input-wrp {
  border-radius: var(--pn-r-campo) !important;
  box-shadow: none !important;
  border: 1.5px solid transparent !important;
  background-color: var(--pn-nivel) !important;
  transition: border-color .2s, background-color .2s;
}
.fi-input-wrp:focus-within {
  border-color: var(--pn-ac) !important;
  background-color: var(--pn-lienzo) !important;
}
.fi-input, .fi-select-input { letter-spacing: -.008em; }
.fi-fo-checkbox-list-option, .fi-fo-radio-option { border-radius: var(--pn-r-campo) !important; }

/* ── Barra lateral ──────────────────────────────────────────────────────
   El activo es una pastilla blanca elevada sobre el gris, igual que en la
   maqueta del panel que aparece en el sitio. */
.fi-sidebar { background: var(--pn-nivel) !important; border-right-color: var(--pn-filo) !important; }
.fi-sidebar-item-label { font-weight: 600 !important; letter-spacing: -.012em; }
.fi-sidebar-item-button { border-radius: 12px !important; }
.fi-sidebar-item.fi-active > .fi-sidebar-item-button {
  background: var(--pn-lienzo) !important;
  box-shadow: var(--pn-sombra) !important;
}
.fi-sidebar-item.fi-active .fi-sidebar-item-label { font-weight: 700 !important; color: var(--pn-tinta) !important; }
.fi-sidebar-group-label {
  font-weight: 700 !important; letter-spacing: .01em;
  color: var(--pn-tinta-3) !important; text-transform: none !important;
}

/* ── Barra superior ─────────────────────────────────────────────────────
   Translúcida y desenfocada, como la del sitio: al bajar, el contenido se
   ve pasar por debajo en vez de chocar contra una franja opaca. */
.fi-topbar > nav {
  background: color-mix(in srgb, var(--pn-lienzo) 74%, transparent) !important;
  backdrop-filter: saturate(180%) blur(20px);
  -webkit-backdrop-filter: saturate(180%) blur(20px);
  border-bottom: 1px solid var(--pn-filo) !important;
  box-shadow: none !important;
}

/* ── Tablas ─────────────────────────────────────────────────────────────
   Filas separadas por un filo de un píxel y nada más. La cabecera pierde
   el fondo gris: con la tarjeta blanca ya hay suficiente contraste. */
.fi-ta-header-cell { background: transparent !important; }
.fi-ta-row { border-color: var(--pn-filo) !important; }
.fi-ta-row:hover { background-color: var(--pn-nivel) !important; }
.fi-ta-header-cell-label { color: var(--pn-tinta-3) !important; font-size: .78rem !important; }

/* ── Acceso ─────────────────────────────────────────────────────────────
   La tarjeta de login toma la misma forma que las del sitio. */
.fi-simple-main {
  border-radius: 28px !important;
  border: 1px solid var(--pn-filo) !important;
  box-shadow: var(--pn-sombra) !important;
}

/* ── Símbolo de la marca ────────────────────────────────────────────────
   En vectorial y heredando el acento del panel. Sustituye a los dos PNG
   —claro y oscuro— que había que mantener en paralelo. */
.tb-marca-svg { width: 2.1rem; height: 2.1rem; display: block; color: var(--pn-ac); flex: none; }
.tb-brand__marca .tb-marca-svg { width: 1.15rem; height: 1.15rem; }

/* ── Cápsula, también donde había reglas más específicas ────────────────
   Arriba hay bloques como `.fi-simple-main .fi-btn` que fijan el radio con
   !important y ganan por especificidad. Esta capa NO puede limitarse a
   `.fi-btn`: hay que igualar o superar esos selectores. */
.fi-simple-main .fi-btn,
.fi-ta-actions .fi-btn,
.fi-modal-footer-actions .fi-btn,
.fi-header-actions .fi-btn { border-radius: 980px !important; }

/* ── Movimiento ─────────────────────────────────────────────────────────
   Todo lo anterior se apaga si el sistema pide menos movimiento. */
@media (prefers-reduced-motion: reduce) {
  .fi-btn, .fi-btn:hover, .fi-btn:active { transition: none; transform: none; }
}

/* ══════════ LOGOTIPO DE PAPERNEXT EN EL PANEL ══════════
 *
 * El mismo de papernext.cl. Dos archivos y no uno teñido: en oscuro la
 * trituradora se aclara y el azul sube de tono, cosas que un filtro CSS no
 * hace bien. El alto lo fija el contenedor; el ancho va automático porque el
 * logotipo es apaisado (≈2,95:1) y forzar los dos lo deformaría.
 *
 * OJO CON LA ESPECIFICIDAD. Estas reglas van calificadas con `.tb-brand`
 * (0,2,0) y no sueltas (0,1,0) porque más arriba de este archivo vive
 * `.tb-brand__marca img` (0,1,1), que fija `display:block`. Con los selectores
 * sueltos ganaba aquélla y SE VEÍAN LOS DOS LOGOS a la vez, el claro y el
 * oscuro, uno al lado del otro.
 */
.tb-brand .tb-marca-img { height: 2.35rem; width: auto; display: block; flex: none; }

/* SEGURO CONTRA DEFORMACIÓN. El reset aplica `max-width:100%` a toda imagen;
   combinado con un `height` fijo, el navegador achica el ancho y DEJA el alto,
   así que el dibujo sale aplastado —el círculo del avión se veía como elipse—.
   Con `object-fit: contain` el contenido conserva su forma pase lo que pase
   con la caja. Es una red de seguridad: lo que de verdad corrige el encaje es
   la regla de abajo. */
.tb-marca-img { object-fit: contain; }

/* ── LA FIRMA DE MARCA, EN UNA FILA QUE SÍ CABE ────────────────────────
   El menú lateral de Filament mide 18rem (288px), de los que quedan 256
   útiles, y en el teléfono nuestro botón X de cerrar se lleva otros 36: el
   presupuesto real es 220px.

   Con los tamaños que había, la fila pedía ~350px. El sobrante no lo absorbía
   nadie: el reset aplica `max-width:100%` a toda imagen y, con el alto fijo,
   el navegador achica el ancho y DEJA el alto. El logotipo salía aplastado
   —el círculo del avión se veía como elipse—.

   Así que los tamaños de acá no son estéticos, son un reparto de 220px
   medido en el navegador hasta que ninguna de las dos imágenes se comprime.
   Si mañana cambia el ancho del menú o se agranda el botón de cerrar, hay que
   volver a repartir: no basta con cambiar un número al ojo.

   Y el logotipo de PaperNext SIEMPRE más chico que el del negocio. El panel
   es del cliente; esto es una firma al pie, no un segundo logo. */

/* Que no ceda la firma: si encoge, la imagen de adentro se lleva el recorte. */
.tb-brand__firma { flex: none; }

/* Red de seguridad para las dos imágenes: con `object-fit: contain` el dibujo
   conserva su forma aunque la caja quede más angosta de lo que le toca. */
.tb-marca-img, .tb-brand__cliente { object-fit: contain; }

/* Reparto en el computador: 256px sin botón de cerrar. */
.tb-brand--dual .tb-brand__cliente { max-width: 100px; }
.tb-brand--dual .tb-marca-img { height: 1.45rem; }

/* Reparto en el teléfono: 220px, porque aparece la X de cerrar. */
@media (max-width: 1023px) {
    .tb-brand--dual { gap: .5rem; }
    .tb-brand--dual .tb-brand__cliente { height: 2.15rem; max-width: 92px; }
    .tb-brand--dual .tb-brand__linea { height: 1.9rem; }
    .tb-brand--dual .tb-marca-img { height: 1.3rem; }
}

.tb-brand .tb-marca-img--grande { height: 2.9rem; }
.tb-brand .tb-marca-img--oscura { display: none; }
.dark .tb-brand .tb-marca-img--clara { display: none; }
.dark .tb-brand .tb-marca-img--oscura { display: block; }

/* El logotipo ya trae el nombre dentro, así que el bloque que lo acompaña no
   necesita el hueco que dejaba el símbolo + palabra de antes. */
.tb-brand__marca { gap: 0; }

/* ══════════ APARIENCIA DEL PANEL ══════════
 *
 * La sección de colores y la del logo venían con el tamaño por defecto de
 * Filament: dos barras de color a todo el ancho y una zona de arrastre de
 * 220 px de alto para un archivo. Ocupaban media pantalla para decir dos
 * cosas. Aquí se acotan a lo que miden sus contenidos.
 */
/* Un color por fila, no dos en paralelo: se leen de arriba abajo como lo que
   son, una lista corta de decisiones. En dos columnas la explicación de cada
   uno quedaba en un canal de texto de 20 caracteres. */
.tb-color { display: grid; grid-template-columns: auto 1fr; gap: 0 .85rem; align-items: start; }
.tb-color + .tb-color { margin-top: .9rem; padding-top: .9rem; border-top: 1px solid rgb(0 0 0 / .07); }
.dark .tb-color + .tb-color { border-top-color: rgb(255 255 255 / .1); }

/* Muestra REDONDA. `appearance:none` y el ajuste del swatch interno porque el
   input de color nativo pinta su propio marco cuadrado dentro del control, y
   sin esto el círculo quedaba con esquinas asomando. */
.tb-color__muestra {
    width: 2.15rem; height: 2.15rem; border-radius: 50%; flex: none; cursor: pointer;
    -webkit-appearance: none; appearance: none; padding: 0; overflow: hidden;
    border: 0; background: none;
    box-shadow: inset 0 0 0 1px rgb(0 0 0 / .14), 0 1px 2px rgb(0 0 0 / .07);
}
.tb-color__muestra::-webkit-color-swatch-wrapper { padding: 0; }
.tb-color__muestra::-webkit-color-swatch { border: 0; border-radius: 50%; }
.tb-color__muestra::-moz-color-swatch { border: 0; border-radius: 50%; }
.dark .tb-color__muestra { box-shadow: inset 0 0 0 1px rgb(255 255 255 / .22); }

.tb-color__nom { font-size: .8125rem; font-weight: 600; line-height: 1.2; }
.tb-color__que { font-size: .75rem; line-height: 1.4; color: var(--pn-tinta-2, #6E6E73); margin-top: .1rem; }
.tb-color__hex {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .7rem;
    text-transform: uppercase; letter-spacing: .02em;
    width: 5.9rem; padding: .22rem .45rem; border-radius: .4rem;
    border: 1px solid rgb(0 0 0 / .12); background: #fff; color: inherit;
}
.dark .tb-color__hex { background: rgb(255 255 255 / .05); border-color: rgb(255 255 255 / .2); }

/* Atajos y campo hexadecimal en la misma línea: son la misma decisión. */
.tb-color__fila { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; margin-top: .4rem; }
.tb-paleta { display: flex; flex-wrap: wrap; gap: .3rem; }
.tb-paleta button {
    width: 1.15rem; height: 1.15rem; border-radius: 50%; border: 0; cursor: pointer; padding: 0;
    box-shadow: inset 0 0 0 1px rgb(0 0 0 / .14); transition: transform .12s;
}
.tb-paleta button:hover { transform: scale(1.18); }
.tb-paleta button[aria-pressed="true"] { box-shadow: inset 0 0 0 1px rgb(0 0 0 / .2), 0 0 0 2px #fff, 0 0 0 3.5px currentColor; }
.dark .tb-paleta button[aria-pressed="true"] { box-shadow: inset 0 0 0 1px rgb(255 255 255 / .25), 0 0 0 2px #1C1C1E, 0 0 0 3.5px currentColor; }

/* Vista previa: se ve el efecto antes de guardar, que es lo que evita el
   ciclo de guardar-mirar-volver. */
.tb-previo { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.tb-previo__btn { padding: .35rem .85rem; border-radius: 980px; font-size: .75rem; font-weight: 600; color: #fff; }
.tb-previo__chip { padding: .2rem .5rem; border-radius: 980px; font-size: .65rem; font-weight: 700; }
.tb-previo__ico { width: 1.7rem; height: 1.7rem; border-radius: .5rem; display: grid; place-items: center; }
.tb-previo__ico svg { width: .95rem; height: .95rem; }
.tb-previo__link { font-size: .75rem; font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }

/* ── Las tres tarjetas, apretadas ─────────────────────────────────────
   Se ajusta el relleno de la sección y el hueco entre campos: por defecto
   Filament reserva aire para formularios largos, y estas tres tarjetas dicen
   pocas cosas cada una. */
.tb-ajustes .fi-section-content { padding-block: .9rem; }
.tb-ajustes .fi-section-header { padding-block: .9rem; }
.tb-ajustes .fi-sc-has-gap { gap: .75rem; }

/* Logo: caja de carga a la medida del archivo, no de la pantalla. */
.tb-logo .fi-fo-file-upload { max-width: 22rem; }
.tb-logo .filepond--root { margin-bottom: 0; }
.tb-logo .filepond--panel-root { border-radius: .6rem; }
.tb-logo .filepond--drop-label { min-height: 3.6rem; font-size: .78rem; }

/* «Qué se ve en el menú»: cada sección es UNA fila compacta (nombre a la
   izquierda, interruptor a la derecha) y no una pila de etiqueta + control.
   Son hasta doce o más, y así caben en una pantalla, alineadas y del mismo alto. */
.tb-menu-switches .fi-section-content { gap: .5rem .65rem; }
.tb-menu-switches .fi-fo-field {
    display: flex !important; flex-direction: row; align-items: center; justify-content: space-between;
    gap: .75rem; min-height: 2.75rem; padding: .4rem .5rem .4rem .85rem;
    border: 1px solid rgba(0,0,0,.08); border-radius: 12px;
    transition: border-color .18s, background-color .18s;
}
.tb-menu-switches .fi-fo-field:hover { border-color: rgba(var(--primary-500, 37 99 235) / .45); }
.tb-menu-switches .fi-fo-field-label-col { flex: 1 1 0; min-width: 0; }
.tb-menu-switches .fi-fo-field-label-ctn, .tb-menu-switches .fi-fo-field-label { margin: 0; min-width: 0; max-width: 100%; }
/* La etiqueta se parte en dos líneas si no cabe (antes se montaba sobre el interruptor). */
.tb-menu-switches .fi-fo-field-label-content {
    display: block; font-size: .875rem; font-weight: 600; line-height: 1.25;
    white-space: normal; overflow-wrap: anywhere; hyphens: auto;
}
.tb-menu-switches .fi-fo-field-content-col { flex: none; margin: 0; padding: 0; }
.tb-menu-switches .fi-fo-field { min-height: 2.75rem; height: auto; }
.tb-menu-switches .fi-section-header-description { margin-top: .15rem; }
.dark .tb-menu-switches .fi-fo-field { border-color: rgba(255,255,255,.1); }


.tb-oculto { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════════
   PERFIL: la tarjeta necesita aire por dentro.

   EL PROBLEMA. El Perfil comparte diseño con el LOGIN, y el login es a
   propósito sin tarjeta: contenido directo sobre el fondo. Para eso hay, más
   arriba en este archivo, un `.fi-simple-main { padding-inline: 0 !important }`.
   El Perfil sí tiene tarjeta, así que heredaba ese cero: los campos medían
   510 px dentro de un contenedor de 512 y quedaban pegados al borde, a un
   píxel por lado. Se veía como un error de maquetación, y lo era.

   POR QUÉ NO SE QUITA LA TARJETA. Sin ella el formulario queda flotando sobre
   el gris de la página, sin nada que diga dónde empieza y dónde termina. En el
   login funciona porque son dos campos y un botón centrados; el Perfil tiene
   cinco campos, un checklist y dos botones, y necesita un continente.

   SE DISTINGUE POR `.tb-profile-back`, la flecha de volver, que el panel
   inyecta SOLO en esta página (renderHook con scope EditProfile). Así el login
   se queda exactamente como está.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-simple-main:has(.tb-profile-back) {
    /* El aire que faltaba. 2.25rem a los lados es la medida que usa el resto
       de las tarjetas del panel, así que el Perfil deja de ser la excepción. */
    padding-inline: 2.25rem !important;
    padding-block: 2.5rem !important;

    /* Y que se lea COMO tarjeta: la de antes era transparente y solo se
       adivinaba por el radio de las esquinas. */
    background: var(--pn-lienzo, #FFFFFF) !important;
    box-shadow: 0 1px 2px rgb(0 0 0 / .04), 0 18px 42px -28px rgb(0 0 0 / .3) !important;
    border: 1px solid rgb(0 0 0 / .06) !important;
    border-radius: 22px !important;
    max-width: 34rem;
}
.dark .fi-simple-main:has(.tb-profile-back) {
    background: #1C1C1E !important;
    border-color: rgb(255 255 255 / .08) !important;
    box-shadow: 0 1px 2px rgb(0 0 0 / .5), 0 18px 42px -28px rgb(0 0 0 / .9) !important;
}

/* El título pegado al borde superior se leía como encabezado de la página y no
   de la ficha. Con aire debajo, encabeza lo que viene. */
.fi-simple-main:has(.tb-profile-back) .fi-header,
.fi-simple-main:has(.tb-profile-back) .fi-simple-header { margin-bottom: 1.75rem; }

/* Ritmo entre campos: apretados se leen como una lista; separados, como
   decisiones distintas. */
.fi-simple-main:has(.tb-profile-back) .fi-fo-component-ctn > .fi-sc-component + .fi-sc-component,
.fi-simple-main:has(.tb-profile-back) form > * + * { margin-top: 1.15rem; }

/* Los botones cierran el formulario: se separan con una línea, igual que en
   Apariencia del panel.
   
   EL `:not(...)` NO SOBRA. Los bloques de 2FA usan LA MISMA clase
   `.fi-sc-actions` que estos botones, así que sin acotar, esta línea se dibujaba
   también encima de cada método de dos factores —con su margen y su relleno—,
   y el resultado eran rayas sueltas con huecos vacíos arriba. La diferencia
   está en que los botones del formulario NO viven dentro de una `.fi-section`
   y los de 2FA sí. */
.fi-simple-main:has(.tb-profile-back) .fi-sc-actions:not(.fi-section .fi-sc-actions) {
    margin-top: 1.9rem;
    padding-top: 1.4rem;
    border-top: 1px solid rgb(0 0 0 / .07);
}
.dark .fi-simple-main:has(.tb-profile-back) .fi-sc-actions:not(.fi-section .fi-sc-actions) {
    border-top-color: rgb(255 255 255 / .1);
}

/* ── DOS FACTORES: una lista, no tarjetas dentro de tarjetas ──────────
   
   Venía con demasiadas divisiones para lo que dice: la sección ya es una caja,
   y dentro cada método traía sus propios bordes. Tres marcos anidados para
   mostrar un título, un estado y una frase.
   
   Ahora es una lista simple: título y estado en la misma línea, la explicación
   debajo, y una sola raya fina ENTRE métodos —no encima del primero, que es lo
   que dejaba ese hueco flotando arriba—. */
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-sc-actions {
    border: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    display: flex;
    flex-direction: column;
    gap: .45rem;
}

/* La raya va entre columnas hermanas: separa un método del siguiente. */
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-grid-col + .fi-grid-col {
    margin-top: 1.15rem;
    padding-top: 1.15rem;
    border-top: 1px solid rgb(0 0 0 / .07);
}
.dark .fi-simple-main:has(.tb-profile-back) .fi-section .fi-grid-col + .fi-grid-col {
    border-top-color: rgb(255 255 255 / .1);
}

/* Título y estado, en la misma línea y sin competir. */
.fi-simple-main:has(.tb-profile-back) .fi-sc-actions-label {
    font-size: .9rem; font-weight: 600; line-height: 1.3;
}
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-sc-text {
    font-size: .8125rem; line-height: 1.5;
}

/* «Configurar» era un enlace violeta —el color por defecto de Filament, ajeno
   a la marca— con un candado del mismo tono. Pasa a botón discreto, del color
   del panel, que es lo que de verdad es: una acción. */
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac { margin-top: .1rem; }
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac button {
    display: inline-flex; align-items: center; gap: .4rem;
    padding: .35rem .8rem; border-radius: 980px;
    font-size: .78rem; font-weight: 600;
    color: var(--pn-tinta, #1D1D1F) !important;
    background: rgb(0 0 0 / .045);
    box-shadow: inset 0 0 0 1px rgb(0 0 0 / .08);
}
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac button:hover {
    background: rgb(0 0 0 / .075);
}
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac button .fi-icon {
    width: .95rem; height: .95rem; color: inherit !important;
}
.dark .fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac button {
    color: #FFFFFF !important;
    background: rgb(255 255 255 / .07);
    box-shadow: inset 0 0 0 1px rgb(255 255 255 / .14);
}
.dark .fi-simple-main:has(.tb-profile-back) .fi-section .fi-ac button:hover { background: rgb(255 255 255 / .11); }

/* La caja de 2FA acompaña a la ficha: mismo aire, sin sombra propia —ya está
   dentro de una tarjeta— y sin borde que la vuelva a encajonar. */
.fi-simple-main:has(.tb-profile-back) .fi-section {
    box-shadow: none !important;
    border: 1px solid rgb(0 0 0 / .07) !important;
    border-radius: 16px !important;
    background: rgb(0 0 0 / .015) !important;
}
.dark .fi-simple-main:has(.tb-profile-back) .fi-section {
    border-color: rgb(255 255 255 / .09) !important;
    background: rgb(255 255 255 / .03) !important;
}
.fi-simple-main:has(.tb-profile-back) .fi-section-content { padding: 1.15rem !important; }

/* La flecha de volver, fuera de la tarjeta y alineada con su borde. */
.fi-simple-main:has(.tb-profile-back) .tb-profile-back { margin-bottom: 1.25rem; }

@media (max-width: 640px) {
    .fi-simple-main:has(.tb-profile-back) {
        padding-inline: 1.35rem !important;
        padding-block: 1.75rem !important;
        border-radius: 18px !important;
    }
}

/* La etiqueta de estado no se recorta.
   
   Salía «Deshabilita…»: el contenedor es flex y el distintivo llevaba
   `flex: 0 1 auto` con `text-overflow: ellipsis`, así que cedía ancho ante un
   título de dos líneas. Un estado a medias no informa de nada —«Deshabilita…»
   podría ser «Deshabilitado» o «Deshabilitar»—, así que el que cede es el
   título, que sí puede repartirse en dos líneas sin perder sentido. */
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-badge,
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-badge-label-ctn,
/* El que RECORTA es este, no el distintivo: medido, 87 px de ancho con 96 de
   contenido. Poner la regla solo en `.fi-badge` no cambiaba nada. */
.fi-simple-main:has(.tb-profile-back) .fi-section .fi-badge-label {
    flex: none;
    overflow: visible;
    text-overflow: clip;
}
.fi-simple-main:has(.tb-profile-back) .fi-sc-actions-label {
    min-width: 0;
    text-wrap: balance;
}

/* ═══════════════════════════════════════════════════════════════════════
   INICIO — afinado

   Lo que se corrige no es "que se vea más bonito" sino tres cosas concretas
   que hacían que la página se leyera como una plantilla:

     1. Todo medía lo mismo y ocupaba el ancho completo. Una pila de bloques
        iguales no tiene jerarquía: el ojo no sabe por dónde empezar.
     2. Las tarjetas de indicador tenían el número enorme y la etiqueta chica,
        y con un cero eso deja un bloque de aire muerto que grita.
     3. Cada widget traía su propio radio, su propia sombra y su propio borde.
        Cinco vecinos con cinco acabados distintos se ven ensamblados, no
        diseñados.

   La regla de aquí: una sola familia de superficies —mismo radio, mismo filo,
   misma sombra— y la jerarquía puesta con TAMAÑO y AIRE, no con color.
   ═══════════════════════════════════════════════════════════════════════ */

/* Ritmo entre widgets: el aire entre bloques es lo que los vuelve piezas
   separadas en vez de una lista continua. */
.fi-page .fi-wi { gap: 1.25rem; }

/* ── Superficies: una sola familia ─────────────────────────────────────── */
.fi-page .tb-tarj,
.fi-page .fi-wi-stats-overview-stat,
.fi-page .fi-ta-ctn,
.fi-page .fi-sc-section .fi-section {
    border-radius: 18px !important;
}

/* ── Tarjetas de indicador ─────────────────────────────────────────────── */
.tb-panel { gap: 14px; }

.tb-tarj {
    padding: 18px 18px 16px;
    border-color: rgb(15 23 42 / .08);
    box-shadow: 0 1px 2px rgb(15 23 42 / .04);
}
.dark .tb-tarj { box-shadow: none; }

/* El filo de color pasa de 3 px a 2: marca el estado sin convertirse en el
   elemento más llamativo de la tarjeta. */
.tb-tarj::before { height: 2px; opacity: 1; }

/* El número baja de 34 a 30 px y la etiqueta sube de 10,5 a 11.
   Con un cero, 34 px de dígito sobre 10,5 de rótulo dejaba un vacío que
   pesaba más que el dato. Ahora el bloque se lee como una unidad. */
.tb-tarj__num { font-size: 30px; margin-top: 12px; letter-spacing: -.03em; }
.tb-tarj--ancha .tb-tarj__num { font-size: 38px; margin-top: 14px; }
.tb-tarj__et { font-size: 11px; letter-spacing: .06em; }
.tb-tarj__pie { margin-top: 5px; font-size: 12.5px; }

/* El icono deja de ser un botón de color y pasa a ser una marca discreta en la
   esquina: el protagonista es el número. */
.tb-tarj__ico { width: 30px; height: 30px; border-radius: 9px; padding: 7px; opacity: .9; }
.tb-tarj--ancha .tb-tarj__ico { width: 34px; height: 34px; padding: 8px; }

/* El realce al pasar por encima era un salto de 2 px con sombra fuerte; queda
   en un gesto discreto. Lo que tiene que invitar es el dato, no el efecto. */
.tb-tarj--ir:hover {
    transform: translateY(-1px);
    box-shadow: 0 6px 18px -12px rgb(15 23 42 / .35);
    border-color: rgb(15 23 42 / .16);
}
.dark .tb-tarj--ir:hover { border-color: rgb(255 255 255 / .2); }

/* ── Bienvenida ────────────────────────────────────────────────────────── */
/* Medía casi un tercio de la pantalla para dar un saludo y cuatro atajos.
   Se recorta el aire, no el contenido. */
.tb-hero { padding: 26px 28px; border-radius: 20px; }
.tb-hero__greet { font-size: clamp(24px, 3.2vw, 32px); }
.tb-hero__bottom { margin-top: 20px; }
.tb-hero__mark { margin-bottom: 14px; }

@media (max-width: 640px) {
    .tb-hero { padding: 20px; border-radius: 18px; }
    .tb-tarj { padding: 15px 15px 13px; }
    .tb-tarj__num { font-size: 26px; margin-top: 9px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ACCESO: la tarjeta necesitaba aire por dentro.

   EL PROBLEMA, MEDIDO. Más arriba conviven dos decisiones de épocas
   distintas: un bloque que quita la tarjeta del login
   (`.fi-simple-main { background:transparent; padding-inline:0 }`) y otro
   posterior que le devuelve borde, radio y sombra. Ganaba el radio y ganaba
   el cero: en app.papernext.cl la tarjeta medía 512 px, los campos 510 y
   quedaba UN PÍXEL de holgura por lado. El fondo, además, seguía
   transparente, así que el marco encerraba el gris de la página.

   Es exactamente el mismo defecto que ya se corrigió en el Perfil; acá se
   resuelve igual, y con el mismo criterio de aire (2.5rem a los lados).

   EL `:not(:has(.tb-profile-back))` NO SOBRA. El Perfil usa esta misma
   plantilla simple y tiene su propio bloque, más abajo, con otro ancho y otro
   ritmo. Sin acotar, las dos capas se pisarían.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-simple-main:not(:has(.tb-profile-back)) {
    width: 100%;
    max-width: 27rem;
    padding: 2.75rem 2.5rem 2.25rem !important;
    background: var(--pn-lienzo, #FFFFFF) !important;
    border: 1px solid rgb(0 0 0 / .06) !important;
    border-radius: 24px !important;
    box-shadow: 0 1px 2px rgb(0 0 0 / .04), 0 24px 56px -34px rgb(15 26 46 / .35) !important;
}
.dark .fi-simple-main:not(:has(.tb-profile-back)) {
    background: #1C1C1E !important;
    border-color: rgb(255 255 255 / .08) !important;
    box-shadow: 0 1px 2px rgb(0 0 0 / .5), 0 24px 56px -34px rgb(0 0 0 / .9) !important;
}

/* El encabezado —logotipo y "Entre a su cuenta"— encabeza el formulario, así
   que respira hacia abajo y no hacia los lados. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-simple-header { margin-bottom: 2rem; }

/* El logotipo es lo primero que se mira y medía 35 px: más cerca de un icono
   que de una marca. Sube a 44 y se separa del título. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-logo { margin-bottom: 1.1rem; }
.fi-simple-main:not(:has(.tb-profile-back)) .fi-logo .tb-marca-img { height: 3.4rem; width: auto; }

/* ── EN EL ACCESO, SOLO EL AVIÓN Y CENTRADO ────────────────────────────
   El nombre ya está en el título de la pestaña, en el dominio y en el texto
   de la página; escribirlo otra vez en grande justo encima del formulario era
   decir «PaperNext» tres veces en una pantalla que pide una sola cosa.

   El centrado se fuerza en la cadena completa —contenedor, caja de la marca e
   imagen— porque `.tb-brand` es `inline-flex`: heredar `text-align` no lo
   mueve, hay que centrar la caja misma. */
/* `.tb-brand--solo` en el medio no es adorno: sin él este selector queda en
   (0,2,0) y pierde contra `.dark .tb-brand .tb-marca-img--oscura`, que es
   (0,3,0) — en modo oscuro reaparecía el logotipo con la palabra. */
.fi-simple-main .tb-brand--solo .tb-marca-img--palabra { display: none; }
.fi-simple-main .tb-brand--solo .tb-marca-img--simbolo { display: block; }
.fi-simple-main .tb-brand--solo .tb-marca-img--simbolo.tb-marca-img--oscura { display: none; }
.dark .fi-simple-main .tb-brand--solo .tb-marca-img--simbolo.tb-marca-img--clara { display: none; }
.dark .fi-simple-main .tb-brand--solo .tb-marca-img--simbolo.tb-marca-img--oscura { display: block; }

.fi-simple-main .fi-logo,
.fi-simple-main .fi-simple-header { text-align: center; }
.fi-simple-main .fi-logo > .tb-brand--solo { display: flex; justify-content: center; width: 100%; }
.fi-simple-main .fi-logo .tb-marca-img--simbolo { margin-inline: auto; }

/* El avión es casi cuadrado (1,46:1), así que a la misma altura que el
   logotipo apaisado ocupaba un tercio de lo que debía: acá manda su altura. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-logo .tb-marca-img--simbolo { height: 4.1rem; }
.fi-simple-main:not(:has(.tb-profile-back)) .fi-simple-header-heading {
    font-size: 1.5rem !important;
    line-height: 1.25 !important;
}

/* Ritmo entre campos: apretados se leen como una lista; separados, como dos
   decisiones distintas. */
.fi-simple-main:not(:has(.tb-profile-back)) form > * + * { margin-top: 1.15rem; }
.fi-simple-main:not(:has(.tb-profile-back)) .fi-fo-field-wrp-label-col { margin-bottom: .45rem; }

/* Los campos toman el alto cómodo del resto del panel. 42 px es alto de
   formulario apretado; 46 es alto de pantalla en la que hay que escribir una
   contraseña con el teléfono en una mano. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-input-wrp { border-radius: 12px !important; }
.fi-simple-main:not(:has(.tb-profile-back)) .fi-input { padding-block: .72rem !important; }

/* "Recordarme" es una casilla suelta entre dos bloques altos: sin aire propio
   se pega al campo de arriba y parece parte de él. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-fo-checkbox { margin-top: .35rem; }

/* El botón cierra el formulario. */
.fi-simple-main:not(:has(.tb-profile-back)) .fi-form-actions { margin-top: 1.6rem; }

/* Y el pie legal se separa con una raya fina: es información del servicio, no
   un paso más del acceso. */
.fi-simple-main:not(:has(.tb-profile-back)) .tb-pie-legal {
    margin-top: 1.9rem;
    padding-top: 1.3rem;
    border-top: 1px solid rgb(0 0 0 / .07);
}
.dark .fi-simple-main:not(:has(.tb-profile-back)) .tb-pie-legal {
    border-top-color: rgb(255 255 255 / .1);
}

@media (max-width: 480px) {
    .fi-simple-main:not(:has(.tb-profile-back)) {
        padding: 2rem 1.5rem 1.75rem !important;
        border-radius: 20px !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════
   INICIO · BIENVENIDA

   EL BLOQUE OSCURO SE FUE. Era un rectángulo de casi 200 px de alto pintado
   en gris carbón, en un panel que por lo demás es blanco: en modo claro se
   leía como un agujero en la página, y lo primero que veías al abrir tu
   herramienta de trabajo era una masa oscura. El peso visual no es gratis —lo
   gasta lo que importa— y lo que importa acá son las cuatro acciones.

   Ahora es la misma tarjeta que el resto del panel: blanca, con el mismo filo
   y el mismo radio. El color aparece una vez, en el botón principal.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-bienvenida {
    padding: 24px 26px;
    border-radius: var(--pn-r-card);
    background: var(--pn-lienzo);
    border: 1px solid var(--pn-filo);
    box-shadow: var(--pn-sombra);
}

.pn-bienvenida__fecha {
    margin: 0 0 6px;
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--pn-tinta-3);
}

.pn-bienvenida__saludo {
    margin: 0;
    font-family: var(--tb-display);
    font-size: clamp(23px, 2.6vw, 30px);
    font-weight: 600;
    letter-spacing: -.025em;
    line-height: 1.12;
    color: var(--pn-tinta);
}
/* El nombre lleva el color que la persona eligió para su panel: es el único
   dato del bloque que le pertenece, y el acento del panel es literalmente
   suyo. `--primary-600` es la variable que escribe el panel con la paleta del
   usuario (ver AdminPanelProvider), así que cambia sola al cambiarlo. */
.pn-bienvenida__saludo span { color: var(--primary-600, var(--pn-ac)); font-weight: 700; }
.dark .pn-bienvenida__saludo span { color: var(--primary-400, var(--pn-ac)); }

.pn-bienvenida__dia {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 20px;
    margin-top: 10px;
    font-size: 13.5px;
    color: var(--pn-tinta-2);
}
.pn-dato { display: inline-flex; align-items: center; gap: 7px; }
.pn-dato svg { width: 16px; height: 16px; color: var(--pn-tinta-3); flex: none; }
.pn-dato b { color: var(--pn-tinta); font-weight: 600; }
.pn-dato__extra { color: var(--pn-tinta-3); }

/*
 * LOS ACCESOS VAN JUNTOS Y DEBAJO, no repartidos a lo ancho.
 *
 * Estaban a la derecha del saludo con `justify-content: space-between`, así
 * que en una pantalla ancha el saludo se quedaba a la izquierda, los botones
 * se iban al otro extremo y entre medio quedaba medio metro de nada. Cuatro
 * accesos separados por un vacío no se leen como una barra de acciones: se
 * leen como cuatro cosas sueltas.
 *
 * Ahora son una fila compacta bajo el saludo, alineada con él.
 */
.pn-bienvenida__acciones {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 18px;
    padding-top: 18px;
    border-top: 1px solid var(--pn-filo);
}

.pn-accion {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 9px 15px;
    border-radius: 980px;
    font-size: 13.5px;
    font-weight: 500;
    letter-spacing: -.005em;
    text-decoration: none;
    color: var(--pn-tinta);
    background: var(--pn-nivel);
    border: 1px solid transparent;
    transition: background .16s ease, color .16s ease, border-color .16s ease, transform .1s ease;
}
.pn-accion svg { width: 17px; height: 17px; color: var(--pn-tinta-2); }

/* Al pasar por encima aparece el color del usuario. En reposo NO: si los
   cuatro botones fueran de color, el bloque cambiaría de carácter según quién
   entre —y con un acento claro el texto blanco deja de leerse—. El realce del
   puntero es momentáneo y sobre fondo tenue, así que funciona con la paleta
   completa. */
.pn-accion:hover {
    background: color-mix(in oklab, var(--primary-600, var(--pn-ac)) 12%, transparent);
    border-color: color-mix(in oklab, var(--primary-600, var(--pn-ac)) 35%, transparent);
    color: var(--primary-700, var(--pn-ac));
}
.pn-accion:hover svg { color: var(--primary-600, var(--pn-ac)); }
.dark .pn-accion:hover {
    background: color-mix(in oklab, var(--primary-400, var(--pn-ac)) 18%, transparent);
    color: var(--primary-300, var(--pn-ac));
}
.dark .pn-accion:hover svg { color: var(--primary-300, var(--pn-ac)); }
.pn-accion:active { transform: translateY(1px); }

@media (max-width: 640px) {
    .pn-bienvenida { padding: 20px 18px; }
    .pn-accion { flex: 1 1 calc(50% - 4px); justify-content: center; }
}
@media (max-width: 420px) {
    .pn-accion { flex: 1 1 100%; }
}

/* ═══════════════════════════════════════════════════════════════════════
   INICIO · ACTIVIDAD RECIENTE

   Era una tabla a todo el ancho con paginador. Ahora son cinco líneas en una
   columna, al lado de la agenda: el tablero avisa que hay movimiento, y el
   Historial de acciones es donde se investiga.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-actividad {
    height: 100%;
    padding: 20px 22px;
    border-radius: var(--pn-r-card);
    background: var(--pn-lienzo);
    border: 1px solid var(--pn-filo);
    box-shadow: var(--pn-sombra);
}

.pn-actividad__cab {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 14px;
}
.pn-actividad__cab h3 {
    margin: 0;
    font-size: 15px;
    font-weight: 600;
    letter-spacing: -.01em;
    color: var(--pn-tinta);
}
.pn-actividad__cab a {
    font-size: 12.5px;
    font-weight: 500;
    color: var(--pn-ac);
    text-decoration: none;
}
.pn-actividad__cab a:hover { text-decoration: underline; }

.pn-actividad__vacio { margin: 0; font-size: 13px; color: var(--pn-tinta-3); }

.pn-actividad__lista { list-style: none; margin: 0; padding: 0; }

.pn-act { display: flex; gap: 11px; padding: 10px 0; }
/* La raya va ENTRE líneas: encima de la primera dejaría un filo suelto bajo
   el encabezado. */
.pn-act + .pn-act { border-top: 1px solid var(--pn-filo); }

.pn-act__punto {
    width: 7px; height: 7px; border-radius: 50%;
    margin-top: 6px; flex: none;
    background: var(--pn-tinta-3);
}
.pn-act__punto--ok    { background: #16A34A; }
.pn-act__punto--aviso { background: #D97706; }
.pn-act__punto--malo  { background: #DC2626; }
.pn-act__punto--info  { background: var(--pn-ac); }

.pn-act__cuerpo { min-width: 0; }
.pn-act__titulo {
    margin: 0;
    font-size: 13.5px;
    line-height: 1.35;
    color: var(--pn-tinta);
    /* Dos líneas como techo: un detalle largo no puede estirar la tarjeta
       hasta descuadrarla respecto de la agenda que tiene al lado. */
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}
.pn-act__meta {
    margin: 2px 0 0;
    font-size: 12px;
    color: var(--pn-tinta-3);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* La edad calculada, dentro del campo de fecha de nacimiento. Es una lectura,
   no un dato editable: por eso va en el tono secundario y sin caja propia. */
.tb-edad {
    font-size: .8125rem;
    font-weight: 500;
    color: var(--pn-tinta-2);
    white-space: nowrap;
}
[x-cloak] { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════════
   ARCHIVOS ADJUNTOS (FilePond)

   EL PROBLEMA, MEDIDO. Cada archivo se dibujaba sobre una barra
   `rgb(100,96,94)` —el gris oscuro por omisión de FilePond, que viene pensado
   para fondos negros— a todo el ancho y con 46 px de alto. En una ficha clara
   se leían como dos manchas, y la zona de arrastre sumaba otros 160 px para
   decir «arrastra aquí». Un adjunto de 3 KB ocupaba más pantalla que la
   dirección del paciente.

   Acá se le devuelve el tono de las demás tarjetas y se recorta el aire.
   ═══════════════════════════════════════════════════════════════════════ */

/* La barra de cada archivo: superficie clara, borde de un píxel, esquinas
   como las del resto del panel. Son tres piezas (arriba, centro, abajo)
   porque FilePond dibuja el panel en tres capas. */
.filepond--item-panel {
    background: var(--pn-nivel, #F5F5F7) !important;
    border-radius: 10px;
}
.dark .filepond--item-panel { background: var(--pn-nivel-2, #2C2C2E) !important; }

/* El nombre del archivo y su peso, en tinta normal: sobre el gris oscuro iban
   en blanco y al aclarar el fondo quedaban ilegibles. */
.filepond--file { color: var(--pn-tinta, #1D1D1F) !important; }
.filepond--file-info-main { font-size: .8125rem; font-weight: 500; }
.filepond--file-info-sub { color: var(--pn-tinta-3, #A1A1A6); opacity: 1; }

/* Los botones de abrir, descargar y quitar: círculos discretos, no manchas
   negras translúcidas. */
.filepond--file-action-button {
    background-color: rgb(0 0 0 / .06) !important;
    color: var(--pn-tinta-2, #6E6E73) !important;
}
.filepond--file-action-button:hover { background-color: rgb(0 0 0 / .12) !important; }
.dark .filepond--file-action-button { background-color: rgb(255 255 255 / .12) !important; color: #E5E5EA !important; }
.filepond--file-action-button.filepond--action-remove-item { color: #B4232A !important; }

/* Los iconos de abrir y descargar se dibujan con una MÁSCARA pintada por
   `background`, no con `fill`. Venían en blanco —correcto sobre el gris
   oscuro de FilePond— y sobre el botón claro desaparecían. */
.filepond--open-icon, .filepond--download-icon { background-color: var(--pn-tinta-2, #6E6E73) !important; }
.dark .filepond--open-icon, .dark .filepond--download-icon { background-color: #E5E5EA !important; }

/* La zona de arrastre: de 160 px a lo que mide su propio texto. Sigue
   aceptando archivos soltados encima; sólo deja de ocupar media ficha. */
.filepond--root { margin-bottom: 0; }
.filepond--drop-label { min-height: 0 !important; }
.filepond--drop-label label {
    padding: .85rem 1rem !important;
    font-size: .8125rem;
    color: var(--pn-tinta-2, #6E6E73);
}
.filepond--panel-root {
    background: transparent !important;
    border: 1px dashed var(--pn-filo-2, rgba(0,0,0,.12)) !important;
    border-radius: 12px !important;
}
.filepond--list { margin-top: .35rem; }

/* Separación entre archivos: FilePond los apila pegados. */
.filepond--item { margin-bottom: .3rem; }

/* ── Repetidor de teléfonos ──────────────────────────────────────────────
   El botón «Agregar teléfono» venía centrado y a tamaño de acción principal,
   como si fuera el objetivo del formulario. Va a la izquierda, bajo su lista,
   y del tamaño de lo que es: un añadido ocasional. */
.tb-crm .fi-fo-simple-repeater-add { justify-content: flex-start; margin-top: .35rem; }

/* La barra de la ventana avisa que se puede tomar. Sólo con ratón: en un
   teléfono la ventana ocupa la pantalla y no hay nada que descubrir detrás. */
@media (pointer: fine) and (min-width: 820px) {
    .fi-modal-window .fi-modal-header { cursor: move; user-select: none; }
    .fi-modal-window .fi-modal-header button,
    .fi-modal-window .fi-modal-header a { cursor: pointer; }
}

/* ── Estado del correo del cliente ───────────────────────────────────────
   Va justo bajo el campo, alineado con el correo, pero FUERA del flujo: en
   flujo normal ese renglón estiraba toda la fila y dejaba al nombre y al RUT
   con cuarenta píxeles de hueco debajo. Absoluto, se dibuja en el aire que ya
   existía entre una fila y la siguiente. */
.tb-correo-estado { position: relative; }
/* El texto de ayuda de Filament v5 se dibuja como `.fi-sc-text` dentro de la
   columna del campo; se saca del flujo por el último de esa columna, que es
   justo el de ayuda. */
.tb-correo-estado .fi-fo-field-content-col > .fi-sc:last-child {
    position: absolute;
    top: 100%;
    left: 0;
    margin-top: .3rem;
}
.tb-correo-estado .fi-fo-field-content-col > .fi-sc:last-child .fi-sc-text {
    font-size: .75rem;
    line-height: 1.2;
    white-space: nowrap;
}
.tb-correo-estado--ok .fi-fo-field-content-col > .fi-sc:last-child .fi-sc-text { color: #15803D !important; }
.dark .tb-correo-estado--ok .fi-fo-field-content-col > .fi-sc:last-child .fi-sc-text { color: #30D158 !important; }

/* ── Menú lateral: el realce es del color de la persona ──────────────────
   Al pasar el puntero, el ítem se pintaba de un azul fijo (#2563EB) aunque
   el panel estuviera en verde o en morado: el único punto del menú donde el
   color elegido no mandaba. Ahora el texto y el icono toman `--primary`,
   que es la variable que el panel escribe con la paleta del usuario. */
.fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-label {
    color: var(--primary-600, #2563EB) !important;
}
.fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-icon {
    color: var(--primary-600, #2563EB) !important;
}
.dark .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-label,
.dark .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-icon {
    color: var(--primary-400, #0A84FF) !important;
}

/* ══════════════════════════════════════════════════════════════════
   SELECTOR DE SUCURSAL (barra superior)

   El contexto de todo lo que se ve debajo, así que se lee como una
   etiqueta y no como un botón más: sin relleno de color, con el nombre
   en negrita. Ver resources/views/filament/selector-sucursal.blade.php.
   ══════════════════════════════════════════════════════════════════ */
.tb-suc { position: relative; display: flex; align-items: center; }

.tb-suc__btn {
  display: flex; align-items: center; gap: .45rem;
  padding: .4rem .7rem; border: 0; border-radius: 999px;
  background: transparent; cursor: pointer; font: inherit;
  font-size: .875rem; font-weight: 600; letter-spacing: -.01em;
  color: var(--gray-700, #3f3f46); transition: background-color .15s;
  max-width: 15rem;
}
.tb-suc__btn:hover { background: var(--gray-100, #f4f4f5); }
.tb-suc__btn > svg:first-child { width: 1.05rem; height: 1.05rem; flex: none; opacity: .65; }
.tb-suc__txt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tb-suc__caret { width: .85rem; height: .85rem; flex: none; opacity: .5; }

/* Teletransportado al <body> (ver la vista): `.fi-topbar-ctn` tiene
   `overflow: clip` y recortaba el menú. Por eso es `fixed` y no `absolute`:
   ya no cuelga del botón, lo ubica Alpine con las coordenadas del disparador. */
.tb-suc__menu {
  position: fixed; z-index: 9999;
  min-width: 15rem; padding: .35rem;
  background: var(--gray-50, #fff); border: 1px solid var(--gray-200, #e4e4e7);
  border-radius: .9rem; box-shadow: 0 10px 34px -12px rgba(0,0,0,.28);
}
.tb-suc__op {
  display: flex; align-items: flex-start; gap: .5rem; width: 100%;
  padding: .5rem .6rem; border: 0; border-radius: .6rem;
  background: transparent; cursor: pointer; font: inherit; text-align: left;
  color: var(--gray-700, #3f3f46);
}
.tb-suc__op:hover { background: var(--gray-100, #f4f4f5); }
.tb-suc__op b { display: block; font-size: .875rem; font-weight: 650; letter-spacing: -.01em; }
.tb-suc__op small { display: block; font-size: .75rem; opacity: .62; margin-top: .05rem; }
.tb-suc__op--on b { color: var(--primary-600, #2563eb); }
.tb-suc__tic { width: .9rem; flex: none; font-size: .8rem; color: var(--primary-600, #2563eb); }
.tb-suc__sep { height: 1px; margin: .3rem .35rem; background: var(--gray-200, #e4e4e7); }

.dark .tb-suc__btn { color: var(--gray-300, #D1D1D6); }
.dark .tb-suc__btn:hover { background: var(--gray-800, #2C2C2E); }
.dark .tb-suc__menu { background: var(--gray-900, #1C1C1E); border-color: var(--gray-700, #3A3A3C); }
.dark .tb-suc__op { color: var(--gray-300, #D1D1D6); }
.dark .tb-suc__op:hover { background: var(--gray-800, #2C2C2E); }

/* Punto de «hay un filtro activo». Va sobre el ícono, así que no ocupa ancho
   en la barra. Se pinta con el acento del panel, no con el azul fijo: si la
   empresa tiene su color, el punto lo respeta. */
.tb-suc__btn { position: relative; }
.tb-suc__btn--filtrado::after {
  content: ''; position: absolute; top: .28rem; right: .3rem;
  width: .42rem; height: .42rem; border-radius: 50%;
  background: var(--primary-600, #2563eb);
  box-shadow: 0 0 0 2px var(--gray-50, #fff);
}
.dark .tb-suc__btn--filtrado::after { box-shadow: 0 0 0 2px var(--gray-900, #1C1C1E); }

/* En el teléfono, SOLO el ícono. El nombre al lado se comía 125px de 375 y
   desbordaba la barra: el candado terminaba encima del avatar y el engranaje
   se salía de la pantalla. El nombre sigue en el menú, con su marca de
   selección, y el punto de arriba avisa si hay una sucursal enfocada. */
@media (max-width: 640px) {
  .tb-suc__txt, .tb-suc__caret { display: none; }
  .tb-suc__btn { padding: .4rem .45rem; }
  .tb-suc__btn--filtrado::after { top: .2rem; right: .16rem; }
  .tb-suc__menu { min-width: 13.5rem; max-width: calc(100vw - 1.5rem); }
}

/* ══════════════════════════════════════════════════════════════════
   SOLO MÓVIL · ajustes del contenedor Flutter (cl.papernext.app)

   `pointer: coarse` = se toca con el dedo. No es lo mismo que «pantalla
   chica»: una ventana angosta en el computador sigue teniendo mouse y
   debe conservar sus efectos. Lo que sigue aplica al teléfono y no toca
   el escritorio.
   ══════════════════════════════════════════════════════════════════ */

/* El botón «Entrar» se veía con un halo azul permanente alrededor.
   Venían de dos lados y los dos se apagan acá:

   1. Un `box-shadow` de color en REPOSO, heredado del botón primario del
      panel. En una pantalla grande lee como profundidad; en el login del
      teléfono, con el botón a todo el ancho sobre fondo claro, lee como
      contorno neón.

   2. El `:hover`, que en una pantalla táctil NO es pasajero: el dedo deja
      el estado pegado después de tocar, así que el halo más intenso se
      quedaba encendido hasta tocar en otra parte. Por eso se veía aunque
      nadie estuviera apuntando al botón. */
@media (pointer: coarse) {
  .fi-simple-main .fi-btn,
  .fi-simple-main .fi-btn:hover,
  .fi-simple-main .fi-btn:focus,
  .fi-simple-main .fi-btn.fi-color-primary:not(.fi-btn-outlined):not(.fi-link),
  .fi-simple-main .fi-btn.fi-color-primary:not(.fi-btn-outlined):not(.fi-link):hover {
    box-shadow: none !important;
    transform: none !important;
  }

  /* Al tocar sí hay respuesta, pero de contacto: se hunde, no brilla. */
  .fi-simple-main .fi-btn:active {
    background: #1D4FD0 !important;
    transform: scale(.985) !important;
  }
}

/* ═══════════════════════════════════════════════════════════════════════
   FOTO DE PERFIL · botones de quitar y editar

   Sobre la foto redonda los dos botones heredaban el círculo translúcido de
   los adjuntos (6 % de negro): encima de una cara casi no se veían, y cada
   uno caía donde FilePond lo dejaba. Acá van sólidos, del mismo tamaño y en
   pareja, centrados en el borde inferior de la foto: lápiz a la izquierda,
   X a la derecha.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-fo-file-upload-avatar .filepond--file-action-button {
    width: 30px !important; height: 30px !important;
    padding: 5px !important; margin: 0 !important;
    top: auto !important; right: auto !important; bottom: 12px !important;
    border-radius: 50% !important;
    border: 2px solid #FFFFFF !important;
    box-shadow: 0 2px 6px rgb(0 0 0 / .38) !important;
    cursor: pointer;
}
.fi-fo-file-upload-avatar .filepond--file-action-button svg { width: 100%; height: 100%; }

/* Editar: blanco con el lápiz en tinta. */
.fi-fo-file-upload-avatar .filepond--file-action-button.filepond--action-edit-item {
    left: calc(50% - 33px) !important;
    background-color: #FFFFFF !important; color: #1D1D1F !important;
}
.fi-fo-file-upload-avatar .filepond--file-action-button.filepond--action-edit-item:hover { background-color: #F0F0F2 !important; }

/* Quitar (y cancelar o deshacer mientras sube): rojo pleno con la X en blanco. */
.fi-fo-file-upload-avatar .filepond--file-action-button:not(.filepond--action-edit-item) {
    left: calc(50% + 3px) !important;
    background-color: #B4232A !important; color: #FFFFFF !important;
}
.fi-fo-file-upload-avatar .filepond--file-action-button:not(.filepond--action-edit-item):hover { background-color: #981C22 !important; }

.fi-fo-file-upload-avatar .filepond--file-action-button:focus-visible {
    outline: 3px solid #2563EB !important; outline-offset: 2px;
}

/* ═══════════════════════════════════════════════════════════════════════
   EL AVIÓN SALÍA DOS VECES en la marca del panel (sin logo de empresa).

   `brand-lockup` manda el logotipo completo Y el símbolo suelto, para que el
   CSS elija: símbolo en el acceso, logotipo en el resto. Pero la regla que
   esconde el símbolo fuera del acceso sólo existía para `.tb-marca` (panel
   Central); en `.tb-brand` no había ninguna, así que ya adentro se pintaban
   los dos: el logotipo —que trae su avión— y el avión solo al lado.

   Fuera del acceso, una sola marca: el logotipo. Las reglas del acceso
   (`.fi-simple-main .tb-brand--solo …`) son más específicas y siguen ganando.
   ═══════════════════════════════════════════════════════════════════════ */
.tb-brand .tb-marca-img--simbolo { display: none; }
.dark .tb-brand .tb-marca-img--simbolo { display: none; }

/* ═══════════════════════════════════════════════════════════════════════
   INICIO · FRANJA DE MARCA (empresa + «Potenciado por PaperNext»)

   Abre la tarjeta de bienvenida cuando la empresa tiene logo. Es una banda
   sobria, no un cartel: fondo apenas hundido, el logo del cliente en una
   placa blanca —se lee igual en claro y en oscuro, sea como sea el archivo
   que subieron— y la firma de PaperNext al otro extremo, más chica y con
   menos tinta. El saludo y las acciones siguen debajo, intactos.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-bienvenida--marca { overflow: hidden; }
.pn-franja {
    display: flex; align-items: center; gap: 16px;
    margin: -24px -26px 22px; padding: 18px 26px;
    background:
        linear-gradient(90deg, rgba(var(--pn-ac-3), .07), rgba(var(--pn-ac-3), 0) 55%),
        var(--pn-nivel);
    border-bottom: 1px solid var(--pn-filo);
}
.pn-franja__placa {
    flex: none; display: grid; place-items: center;
    height: 60px; padding: 8px 16px; border-radius: 14px;
    background: #FFFFFF;
    box-shadow: 0 0 0 1px var(--pn-filo-2), 0 6px 16px -10px rgba(0,0,0,.35);
}
.pn-franja__placa img { height: 44px; width: auto; max-width: 180px; display: block; object-fit: contain; }
.pn-franja__quien { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.pn-franja__rotulo {
    font-size: 10.5px; font-weight: 600; letter-spacing: .12em;
    text-transform: uppercase; color: var(--pn-tinta-3); line-height: 1.2; white-space: nowrap;
}
.pn-franja__nombre {
    font-family: var(--tb-display); font-size: 18px; font-weight: 700;
    letter-spacing: -.02em; line-height: 1.2; color: var(--pn-tinta);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pn-franja__firma {
    flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 6px;
    padding-left: 18px; border-left: 1px solid var(--pn-filo-2);
}
.pn-franja__pn { height: 22px; width: auto; display: block; }
.pn-franja__pn--oscura { display: none; }
.dark .pn-franja__pn--clara { display: none; }
.dark .pn-franja__pn--oscura { display: block; }

@media (max-width: 640px) {
    .pn-franja { flex-wrap: wrap; gap: 12px 14px; padding: 16px 18px; margin: -24px -26px 20px; }
    .pn-franja__placa { height: 52px; padding: 7px 12px; }
    .pn-franja__placa img { height: 38px; max-width: 140px; }
    .pn-franja__nombre { font-size: 16.5px; }
    /* La firma baja a su propia línea, en horizontal y sin el filo lateral. */
    .pn-franja__firma {
        flex: 1 1 100%; flex-direction: row; align-items: center; gap: 9px;
        padding: 12px 0 0; border-left: 0; border-top: 1px solid var(--pn-filo);
    }
    .pn-franja__pn { height: 18px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ACCESO DEL TRABAJADOR · estado del PIN

   «Ya tiene un PIN creado.» salía en el verde por omisión del panel: claro,
   algo lavado sobre blanco, con cuerpo normal. Va en un verde profundo y
   nítido, en semi-negrita, con un punto pleno delante que da el estado de
   un vistazo —el mismo recurso de las insignias de las fichas—.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-pin-estado {
    display: inline-flex !important; align-items: center; gap: .5rem;
    font-size: .875rem; font-weight: 600 !important; letter-spacing: -.005em;
}
.pn-pin-estado::before {
    content: ""; width: .5rem; height: .5rem; border-radius: 50%;
    background: currentColor; flex: none;
}
.pn-pin-estado--ok    { color: #0F7A4D !important; }
.pn-pin-estado--falta { color: #9A5B13 !important; }
.dark .pn-pin-estado--ok    { color: #30D158 !important; }
.dark .pn-pin-estado--falta { color: #FF9F0A !important; }

/* ═══════════════════════════════════════════════════════════════════════
   LISTA DE TRABAJADORES · «Apto» con el verde estándar (prueba)

   Mismo criterio que el estado del PIN: en vez de la píldora de fondo verde
   claro, contorno neutro, punto pleno y texto en el verde profundo #0F7A4D.
   Por ahora sólo «Apto» y sólo en esta columna, para evaluar cómo queda antes
   de llevarlo a «Restringido», «No apto» y a las demás tablas.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-estado-op .fi-badge.fi-color-success {
    background: transparent !important;
    color: #0F7A4D !important;
    box-shadow: inset 0 0 0 1px var(--pn-filo-2, rgba(0,0,0,.12)) !important;
    font-weight: 600 !important;
    gap: .4rem; padding-inline: .6rem .7rem;
}
.pn-estado-op .fi-badge.fi-color-success .fi-badge-label { color: inherit !important; }
.pn-estado-op .fi-badge.fi-color-success::before {
    content: ""; width: .45rem; height: .45rem; border-radius: 50%;
    background: currentColor; flex: none;
}
.dark .pn-estado-op .fi-badge.fi-color-success { color: #30D158 !important; }

/* ═══════════════════════════════════════════════════════════════════════
   INSIGNIAS DE ESTADO · estándar del panel

   La prueba con «Apto» se extiende a todas las insignias de estado: verde,
   ámbar y rojo, en tablas, vistas de detalle y formularios. Mismo criterio
   que las fichas públicas: sin relleno pastel, contorno neutro, un punto
   pleno que da el estado y el texto en un tono profundo y nítido.

   Sólo los tres colores con significado (success / warning / danger). Las
   insignias grises, azules o de marca, los contadores del menú lateral y los
   de las pestañas no se tocan: no son estados.
   ═══════════════════════════════════════════════════════════════════════ */
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge:is(.fi-color-success, .fi-color-warning, .fi-color-danger) {
    background: transparent !important;
    box-shadow: inset 0 0 0 1px var(--pn-filo-2, rgba(0,0,0,.12)) !important;
    font-weight: 600 !important;
    gap: .4rem; padding-inline: .6rem .7rem;
}
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge:is(.fi-color-success, .fi-color-warning, .fi-color-danger) .fi-badge-label { color: inherit !important; }
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge:is(.fi-color-success, .fi-color-warning, .fi-color-danger)::before {
    content: ""; width: .45rem; height: .45rem; border-radius: 50%;
    background: currentColor; flex: none;
}
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-success { color: #0F7A4D !important; }
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-warning { color: #9A5B13 !important; }
:is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-danger  { color: #B4232A !important; }
.dark :is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-success { color: #30D158 !important; }
.dark :is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-warning { color: #FF9F0A !important; }
.dark :is(.fi-ta, .fi-in-entry, .fi-sc, .fi-wi) .fi-badge.fi-color-danger  { color: #FF453A !important; }

/* Sugerencia de correo («¿Quisiste decir gmail.com?»): la ampolleta va en
   ámbar encendido, un tono más vivo que el texto, para que se lea como luz. */
.pn-sugerencia .fi-icon, .pn-sugerencia svg { color: #D98A0B !important; }
.dark .pn-sugerencia .fi-icon, .dark .pn-sugerencia svg { color: #F5B83D !important; }

/* ═══════════════════════════════════════════════════════════════════════
   PIN · DESAFÍO EN VIVO

   Reemplaza a la frase «Nada de 123456, números seguidos ni dígitos del
   RUT». Una advertencia en prosa se lee una vez y se olvida; esto muestra
   las mismas reglas como una lista que se va poniendo verde mientras se
   escribe, con una barra por tramos que dice cuánto falta. Gris = todavía
   no se puede juzgar, verde = cumplida, rojo = hay que cambiarlo.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-reto {
    margin-top: .35rem; padding: .8rem .9rem .75rem;
    border: 1px solid var(--pn-filo-2, rgba(0,0,0,.12)); border-radius: 12px;
    background: var(--pn-nivel, #F5F5F7);
    transition: border-color .2s, background .2s;
}
.pn-reto--listo { border-color: rgba(15,122,77,.45); background: rgba(15,122,77,.06); }
.pn-reto__cab { display: flex; align-items: baseline; justify-content: space-between; gap: .75rem; }
.pn-reto__tit {
    font-size: .6875rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
    color: var(--pn-tinta-2, #6E6E73);
}
.pn-reto--listo .pn-reto__tit { color: #0F7A4D; }
.pn-reto__cuenta { font-size: .75rem; font-weight: 600; color: var(--pn-tinta-2, #6E6E73); font-variant-numeric: tabular-nums; }
.pn-reto--listo .pn-reto__cuenta { color: #0F7A4D; }

.pn-reto__barra { display: flex; gap: 4px; margin: .5rem 0 .65rem; }
.pn-reto__tramo { flex: 1; height: 4px; border-radius: 99px; background: var(--pn-filo-2, rgba(0,0,0,.12)); transition: background .2s; }
.pn-reto__tramo--ok  { background: #0F7A4D; }
.pn-reto__tramo--mal { background: #B4232A; }

.pn-reto__lista { list-style: none; margin: 0; padding: 0; display: grid; gap: .4rem; }
.pn-reto__regla {
    display: flex; align-items: flex-start; gap: .55rem;
    font-size: .8125rem; line-height: 1.35; color: var(--pn-tinta-2, #6E6E73);
    transition: color .2s;
}
.pn-reto__regla svg { width: 1.05rem; height: 1.05rem; flex: none; margin-top: .06rem; color: var(--pn-tinta-3, #A1A1A6); }
.pn-reto__regla--ok  { color: #0F7A4D; font-weight: 600; }
.pn-reto__regla--ok svg  { color: #0F7A4D; }
.pn-reto__regla--mal { color: #B4232A; font-weight: 600; }
.pn-reto__regla--mal svg { color: #B4232A; }

.dark .pn-reto--listo { border-color: rgba(74,222,154,.4); background: rgba(74,222,154,.08); }
.dark .pn-reto--listo .pn-reto__tit, .dark .pn-reto--listo .pn-reto__cuenta,
.dark .pn-reto__regla--ok, .dark .pn-reto__regla--ok svg { color: #30D158; }
.dark .pn-reto__tramo--ok { background: #30D158; }
.dark .pn-reto__regla--mal, .dark .pn-reto__regla--mal svg { color: #FF453A; }
.dark .pn-reto__tramo--mal { background: #FF453A; }

/* ══════════════════════════════════════════════════════════════════════
   CASILLA SIN MARCAR: no se veía.

   Filament no le pone borde a la casilla: su contorno ES una sombra (un
   anillo de 1 px). La regla de más arriba quita la sombra para limpiar la
   casilla MARCADA —y de paso borraba el contorno de la que está sin marcar,
   que quedaba como un cuadrado blanco sobre fondo blanco: invisible.

   Se le devuelve el contorno sólo a la que está sin marcar, y un poco más
   firme que el original. La marcada queda exactamente como estaba.
   ══════════════════════════════════════════════════════════════════════ */
.fi-ta-record-checkbox:not(:checked):not(:indeterminate),
.fi-ta-page-checkbox:not(:checked):not(:indeterminate),
.fi-ta-group-checkbox:not(:checked):not(:indeterminate) {
    box-shadow: inset 0 0 0 1.5px #9AA1AC !important;
    background-color: #FFFFFF !important;
}
.fi-ta-record-checkbox:not(:checked):not(:indeterminate):hover,
.fi-ta-page-checkbox:not(:checked):not(:indeterminate):hover,
.fi-ta-group-checkbox:not(:checked):not(:indeterminate):hover {
    box-shadow: inset 0 0 0 1.5px #2563EB !important;
}
.dark .fi-ta-record-checkbox:not(:checked):not(:indeterminate),
.dark .fi-ta-page-checkbox:not(:checked):not(:indeterminate),
.dark .fi-ta-group-checkbox:not(:checked):not(:indeterminate) {
    box-shadow: inset 0 0 0 1.5px #6B7280 !important;
    background-color: transparent !important;
}

/* ══════════════════════════════════════════════════════════════════════
   BARRA DE SELECCIÓN («N registros seleccionados»): fuera.

   Se probó de dos formas —montada sobre la fila de títulos y como píldora
   flotante— y las dos se veían mal. Saber cuántos hay marcados no hace falta:
   las casillas ya lo muestran, y el botón «Abrir acciones» de la cabecera
   aparece apenas hay una selección. Para desmarcar todo sirve la casilla de
   la cabecera de la tabla.
   ══════════════════════════════════════════════════════════════════════ */
.fi-ta-main > .fi-ta-selection-indicator, .fi-ta-ctn .fi-ta-selection-indicator { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════════
   TEMA «CONFORT VISUAL» (tercer tema, junto a Claro y Oscuro)

   Una variante CLARA y cálida para jornadas largas frente a la pantalla:
   cremas y blancos cálidos de fondo, grises cálidos en vez de neutros. No es
   un filtro amarillo encima de la página: se cambian los TOKENS, así que
   cada superficie, borde y texto toma su versión cálida y la jerarquía queda
   intacta (fondo → tarjeta → campo, tinta → secundario → tenue).

   Contraste medido (WCAG): tinta 14,9:1 · secundario 7,2:1 · gris de apoyo
   5,0:1 sobre la tarjeta. Los colores funcionales —azul de marca, verde,
   ámbar y rojo de estado— NO cambian: significan lo mismo en los tres temas.

   Se activa con la clase `confort` en <html>; nunca convive con `dark`.
   ═══════════════════════════════════════════════════════════════════════ */
html.confort {
  color-scheme: light;

  /* Escala de grises de Filament, en cálido. */
  --gray-50:  oklch(0.965 0.0102 81.80);  /* #F7F3EC  fondo de página */
  --gray-100: oklch(0.936 0.0149 80.71);  /* #EFE9DF */
  --gray-200: oklch(0.891 0.0208 81.78);  /* #E2DACC  bordes */
  --gray-300: oklch(0.827 0.0246 79.72);  /* #CFC5B5 */
  --gray-400: oklch(0.665 0.0234 76.44);  /* #9C9284  marcadores */
  --gray-500: oklch(0.540 0.0233 74.46);  /* #776D60  texto de apoyo */
  --gray-600: oklch(0.455 0.0210 72.80);  /* #5E554A  texto secundario */
  --gray-700: oklch(0.372 0.0178 74.12);  /* #463F36 */
  --gray-800: oklch(0.309 0.0149 71.51);  /* #352F28 */
  --gray-900: oklch(0.268 0.0131 72.27);  /* #2A251F */
  --gray-950: oklch(0.215 0.0090 75.14);  /* #1C1915  tinta */

  /* Blanco cálido para tarjetas, tablas y ventanas. */
  --color-white: #FFFDF8;

  /* Tokens propios del panel. */
  --pn-tinta:   #2A251F;
  --pn-tinta-2: #5E554A;
  --pn-tinta-3: #776D60;
  --pn-lienzo:  #FFFDF8;
  --pn-nivel:   #F7F3EC;
  --pn-nivel-2: #EFE9DF;
  --pn-filo:    rgba(70, 55, 30, .10);
  --pn-filo-2:  rgba(70, 55, 30, .17);
  --pn-sombra:  0 1px 2px rgba(60, 40, 10, .05), 0 12px 34px -22px rgba(60, 40, 10, .28);
}

/* ═══════════════════════════════════════════════════════════════════════
   DISTINTIVOS DEL SELECTOR MÚLTIPLE: la «×» estiraba la píldora.

   La regla que deja crecer los selectores múltiples («… :has(badges) button
   { min-height: 2.625rem }») alcanzaba también al botón «×» de CADA
   distintivo. Ese botón pasaba a medir 42 px de alto: la píldora se estiraba,
   el nombre quedaba pegado arriba y la «×» caía abajo a la derecha, como en
   «Oficinas · Andén de carga · Bodega» de las zonas a autorizar.

   El botón de quitar vuelve a su tamaño natural y todo el distintivo se
   centra en una sola línea.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-fo-field .fi-fo-select .fi-select-input-value-badges-ctn .fi-badge {
    align-items: center !important;
    height: auto !important;
    min-height: 0 !important;
    line-height: 1.25;
}
.fi-fo-field .fi-fo-select .fi-select-input-value-badges-ctn .fi-badge-delete-btn {
    height: auto !important;
    min-height: 0 !important;
    margin-block: 0 !important;
    padding: 2px !important;
    align-self: center;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.fi-fo-field .fi-fo-select .fi-select-input-value-badges-ctn .fi-badge-delete-btn svg {
    width: .8rem;
    height: .8rem;
}

/* ═══════════════════════════════════════════════════════════════════════
   «VER» TRABAJADOR · ficha compacta

   La ficha tenía demasiado aire: mucha separación entre filas y entre el
   rótulo y su dato. Acá se aprieta sin perder legibilidad: filas más juntas,
   rótulo pegado a su valor, y menos relleno dentro de cada tarjeta.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-ficha-compacta .fi-section-content { padding: 1rem 1.25rem !important; }
.pn-ficha-compacta .fi-section-header { padding-block: .8rem !important; }
.pn-ficha-compacta .fi-sc { row-gap: .85rem !important; column-gap: 1.25rem !important; }
.pn-ficha-compacta .fi-in-entry { gap: .2rem !important; }
.pn-ficha-compacta .fi-in-entry-label { font-size: .75rem !important; color: var(--pn-tinta-2, #6E6E73) !important; }
.pn-ficha-compacta .fi-in-text-item { font-size: .875rem !important; }
.pn-ficha-compacta .fi-in-entry.fi-in-entry-has-inline-label { column-gap: .75rem !important; }

/* Segunda fila de «Ver» trabajador: contacto, salud y QR lado a lado.
   Cada tarjeta mide lo que mide su contenido, y tres alturas distintas en una
   misma fila se ven desprolijas: aquí todas toman el alto de la más alta. El
   estiramiento ya lo hace la rejilla; faltaba que la tarjeta lo acompañara.
   OJO: Filament envuelve la rejilla en un div con la clase, así que la clase
   NO está en `.fi-grid` sino en su padre: de ahí el `> .fi-grid >`. */
.pn-fila-tarjetas > .fi-grid > .fi-grid-col > .fi-sc-component { height: 100%; }
.pn-fila-tarjetas > .fi-grid > .fi-grid-col > .fi-sc-component > .fi-sc-section { height: 100%; }
.pn-fila-tarjetas > .fi-grid > .fi-grid-col > .fi-sc-component > .fi-sc-section > .fi-section { flex: 1 1 auto; }

/* ═══════════════════════════════════════════════════════════════════════
   INICIO · DOCUMENTACIÓN FISCALIZABLE (rol «Super Admin + Documentación
   fiscalizable»). Misma tarjeta que la bienvenida; baldosas por organismo.
   ═══════════════════════════════════════════════════════════════════════ */
.pn-fisc { padding: 20px 22px; border-radius: var(--pn-r-card); background: var(--pn-lienzo); border: 1px solid var(--pn-filo); box-shadow: var(--pn-sombra); }
.pn-fisc__cab { display: flex; align-items: center; justify-content: space-between; gap: 14px 18px; flex-wrap: wrap; }
.pn-fisc__titulo { display: flex; align-items: center; gap: 12px; min-width: 0; }
.pn-fisc__ic { width: 40px; height: 40px; border-radius: 12px; flex: none; display: grid; place-items: center; background: rgba(var(--pn-ac-3), .12); color: var(--pn-ac); }
.pn-fisc__ic svg { width: 22px; height: 22px; }
.pn-fisc__rot { margin: 0; font-size: 11.5px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--pn-tinta-3); }
.pn-fisc__total { margin: 3px 0 0; font-size: 15px; color: var(--pn-tinta-2); }
.pn-fisc__total b { font-size: 20px; color: var(--pn-tinta); font-weight: 700; }
.pn-fisc__acciones { display: flex; gap: 8px; flex-wrap: wrap; }
.pn-fisc__acciones .pn-accion svg { width: 16px; height: 16px; }
.pn-accion--marca { background: var(--primary-600, var(--pn-ac)) !important; color: #fff !important; border-color: transparent !important; }

.pn-fisc__organismos { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-top: 16px; }
.pn-fisc__org { display: flex; flex-direction: column; gap: 2px; padding: 12px 14px; border-radius: 14px; background: var(--pn-nivel); border: 1px solid var(--pn-filo); text-decoration: none; transition: border-color .15s; }
.pn-fisc__org:hover { border-color: rgba(var(--pn-ac-3), .45); }
.pn-fisc__org-nombre { font-size: 12.5px; font-weight: 600; color: var(--pn-tinta-2); }
.pn-fisc__org-num { font-size: 24px; font-weight: 700; color: var(--pn-tinta); line-height: 1.15; font-variant-numeric: tabular-nums; }
.pn-fisc__org-fecha { font-size: 11.5px; color: var(--pn-tinta-3); }
.pn-fisc__org--vacio .pn-fisc__org-num { color: var(--pn-tinta-3); }

.pn-fisc__recientes { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--pn-filo); }
.pn-fisc__sub { margin: 0 0 8px; font-size: 11.5px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--pn-tinta-3); }
.pn-fisc__recientes ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 6px 18px; }
.pn-fisc__recientes li { display: flex; flex-direction: column; min-width: 0; }
.pn-fisc__doc { font-size: 13.5px; font-weight: 600; color: var(--pn-tinta); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pn-fisc__meta { font-size: 12px; color: var(--pn-tinta-3); }


/* ═══════════════════════════════════════════════════════════════════════
   BOTONES CON CONTORNO (2026-10-05)

   Heredaban la sombra azul del botón principal: la regla que debía
   excluirlos buscaba `.fi-btn-outlined` (Filament 3) y en Filament 4/5 la
   clase es `.fi-outlined`. Encima de su anillo de color, se veía un halo
   neón. Y en modo oscuro el anillo gris oscuro sobre negro desaparecía:
   sólo se leía el texto.

   Ahora: borde sólido de 1px y un fondo propio, sin sombra, en ambos modos.
   Los selectores repiten `.fi-color` para ganar a los de Filament.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-btn.fi-outlined,
.fi-btn.fi-outlined.fi-color,
.fi-btn.fi-outlined.fi-color-primary {
  box-shadow: none !important;
  border: 1px solid rgba(0, 0, 0, .14) !important;
  background-color: var(--pn-lienzo, #FFFFFF) !important;
}
.fi-btn.fi-outlined:hover,
.fi-btn.fi-outlined.fi-color:hover {
  background-color: var(--pn-nivel, #F5F5F7) !important;
}
.dark .fi-btn.fi-outlined,
.dark .fi-btn.fi-outlined.fi-color,
.dark .fi-btn.fi-outlined.fi-color-primary {
  border-color: rgba(255, 255, 255, .24) !important;
  background-color: rgba(255, 255, 255, .07) !important;
}
.dark .fi-btn.fi-outlined:hover,
.dark .fi-btn.fi-outlined.fi-color:hover {
  background-color: rgba(255, 255, 255, .12) !important;
}
.fi-btn.fi-outlined:focus-visible { outline: 2px solid #2563EB; outline-offset: 2px; }

/* ═══════════════════════════════════════════════════════════════════════
   CAMPOS «BUSCAR» (2026-10-05)
   Todos los buscadores llevan el mismo contorno sutil (el gris de las líneas
   del panel) y, al escribir, el azul de marca. Sin borde se confundían con el
   fondo. Cubre: barra superior, tablas, búsqueda por columna, listas de
   casillas (p. ej. permisos de Roles) y el buscador dentro de los selectores.
   En el teléfono la lupa plegada de la barra sigue sin marco: su regla
   (max-width: 1023px, más arriba) es más específica y gana.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-global-search-field .fi-input-wrp,
.fi-ta-search-field .fi-input-wrp,
.fi-ta-individual-search-cell .fi-input-wrp,
.fi-fo-checkbox-list-search-input-wrp .fi-input-wrp {
  border: 1px solid var(--pn-filo-2, rgba(0, 0, 0, .12)) !important;
}
.fi-global-search-field .fi-input-wrp:focus-within,
.fi-ta-search-field .fi-input-wrp:focus-within,
.fi-ta-individual-search-cell .fi-input-wrp:focus-within,
.fi-fo-checkbox-list-search-input-wrp .fi-input-wrp:focus-within {
  border-color: var(--pn-ac, #2563EB) !important;
}
/* Buscador dentro de un selector desplegable: es un input suelto, sin marco. */
.fi-select-input-search-ctn input {
  border: 1px solid var(--pn-filo-2, rgba(0, 0, 0, .12)) !important;
  border-radius: var(--pn-r-campo, 10px) !important;
  box-shadow: none !important;
}
.fi-select-input-search-ctn input:focus {
  border-color: var(--pn-ac, #2563EB) !important;
  outline: none !important;
}
/* El input del selector va pegado a los bordes del desplegable: un poco de aire
   para que su contorno no se monte sobre el marco de la lista. */
.fi-select-input-search-ctn { padding: 6px 6px 4px; }
.fi-select-input-search-ctn input { width: 100%; box-sizing: border-box; }

/* Menú «⋯» de acciones de fila (2026-10-05): ítems alineados y aireados. */
.fi-ta-actions .fi-dropdown-panel { min-width: 13rem; padding: 4px; border-radius: 12px; }
.fi-ta-actions .fi-dropdown-list { padding: 0; gap: 2px; }
.fi-ta-actions .fi-dropdown-list-item { gap: 10px; padding: 8px 10px; border-radius: 8px; font-size: .875rem; justify-content: flex-start; text-align: left; }
.fi-ta-actions .fi-dropdown-list-item-icon { width: 1.125rem; height: 1.125rem; flex: none; }

/* Candado de «No operativa si sale mal»: mismo rojo que el botón Eliminar. */
.pn-candado .fi-icon, .pn-candado svg { color: var(--danger-600) !important; }
.dark .pn-candado .fi-icon, .dark .pn-candado svg { color: var(--danger-400) !important; }

/* Logo de la empresa: la ✕ para quitarlo, más notoria (rojo sólido, más grande). */
.tb-logo .filepond--file-action-button.filepond--action-remove-item {
  width: 1.75rem !important; height: 1.75rem !important;
  background-color: #B4232A !important; color: #FFFFFF !important;
  box-shadow: 0 0 0 2px #FFFFFF, 0 2px 6px rgba(0, 0, 0, .25) !important;
  opacity: 1 !important; cursor: pointer;
}
.tb-logo .filepond--file-action-button.filepond--action-remove-item:hover { background-color: #981C22 !important; }
.tb-logo .filepond--file-action-button.filepond--action-remove-item svg { width: 100%; height: 100%; }
.dark .tb-logo .filepond--file-action-button.filepond--action-remove-item { box-shadow: 0 0 0 2px #1C1C1E, 0 2px 6px rgba(0, 0, 0, .5) !important; }
/*
 * Logo de la empresa: miniatura sobre cuadriculado gris (el de "transparente").
 * FilePond pinta la vista previa sobre #222 casi negro y encima una sombra
 * oscura: un logo blanco o claro se veía como una mancha negra. El
 * cuadriculado deja ver logos claros Y oscuros.
 */
.tb-logo .filepond--image-preview {
  background-color: #C7C7CC !important;
  background-image:
    linear-gradient(45deg, #AEAEB2 25%, transparent 25%), linear-gradient(-45deg, #AEAEB2 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #AEAEB2 75%), linear-gradient(-45deg, transparent 75%, #AEAEB2 75%) !important;
  background-size: 14px 14px !important;
  background-position: 0 0, 0 7px, 7px -7px, -7px 0 !important;
}
.tb-logo .filepond--image-preview-overlay-idle { display: none !important; }
/*
 * Logo: miniatura COMPLETA. FilePond recorta la imagen para llenar el panel
 * (como "cover"): un logo apaisado perdía los bordes. Se anulan sus
 * transformaciones y el lienzo se ajusta entero dentro de la caja ("contain").
 */
.tb-logo .filepond--image-clip {
  width: 100% !important; height: 100% !important; transform: none !important;
  margin: 0 !important; left: 0 !important; top: 0 !important;
}
.tb-logo .filepond--image-canvas-wrapper,
.tb-logo .filepond--image-bitmap {
  width: 100% !important; height: 100% !important; transform: none !important;
  left: 0 !important; top: 0 !important;
}
.tb-logo .filepond--image-bitmap { padding: 10px 44px; box-sizing: border-box; }
.tb-logo .filepond--image-bitmap canvas {
  width: 100% !important; height: 100% !important; object-fit: contain; display: block;
}
/* Logo: sin nombre/peso del archivo; la ✕ a la derecha, junto al logo, sin taparlo. */
.tb-logo .filepond--file-info,
.tb-logo .filepond--file-status { display: none !important; }
.tb-logo .filepond--image-bitmap { padding: 10px 52px 10px 14px !important; }
.tb-logo .filepond--image-bitmap canvas { object-position: right center; }
.tb-logo .filepond--file-action-button.filepond--action-remove-item {
  position: absolute !important; left: auto !important; right: .75rem !important;
  top: 50% !important; margin-top: -.875rem !important; transform: none !important;
}
/*
 * Logo: la imagen ocupa la caja salvo una franja a la derecha, donde van el
 * lápiz y la ✕, uno junto al otro y FUERA de la imagen (nada la tapa).
 */
.tb-logo .filepond--image-preview { width: calc(100% - 5.5rem) !important; border-radius: .5rem; }
.tb-logo .filepond--image-bitmap { padding: 8px 10px !important; }
.tb-logo .filepond--image-bitmap canvas { object-position: center; }
.tb-logo .filepond--file-action-button.filepond--action-edit-item,
.tb-logo .filepond--file-action-button.filepond--action-remove-item {
  position: absolute !important; left: auto !important; top: 50% !important;
  margin-top: -.875rem !important; transform: none !important;
  width: 1.75rem !important; height: 1.75rem !important; opacity: 1 !important;
}
.tb-logo .filepond--file-action-button.filepond--action-remove-item { right: .5rem !important; }
.tb-logo .filepond--file-action-button.filepond--action-edit-item {
  right: 2.75rem !important; background-color: #FFFFFF !important; color: #1C1C1E !important;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .12), 0 2px 6px rgba(0, 0, 0, .18) !important;
}
.tb-logo .filepond--file-action-button.filepond--action-edit-item:hover { background-color: #F0F0F2 !important; }
.dark .tb-logo .filepond--file-action-button.filepond--action-edit-item {
  background-color: #3A3A3C !important; color: #F5F5F7 !important; box-shadow: 0 0 0 1px rgba(255, 255, 255, .14) !important;
}
/*
 * Logo cargado: la CAJA (fondo y borde) termina antes de los botones, así el
 * lápiz y la ✕ quedan afuera, sobre el fondo del card de ajustes.
 */
.tb-logo .filepond--root:has(.filepond--item) .filepond--panel-root,
.tb-logo .filepond--item-panel { width: calc(100% - 5.5rem) !important; right: auto !important; }
.tb-logo .filepond--root:has(.filepond--item) .filepond--panel-root { background-color: transparent !important; }
.tb-logo .filepond--image-preview { width: calc(100% - 5.5rem) !important; }
.tb-logo .filepond--image-preview-wrapper { border-radius: .6rem; }
.tb-logo .filepond--image-bitmap canvas { object-position: right center; }
/* ═══ LOGO CARGADO — versión final (reemplaza los ajustes anteriores) ═══
   [ logo completo ]  ✕
                      ✎
   La caja del logo se angosta y los dos botones quedan AFUERA, a su derecha,
   en columna: la ✕ arriba y el lápiz debajo. */
.tb-logo .filepond--root:has(.filepond--item) { margin-right: 2.75rem !important; overflow: visible !important; }
.tb-logo .filepond--root:has(.filepond--item) .filepond--list-scroller,
.tb-logo .filepond--root:has(.filepond--item) .filepond--list,
.tb-logo .filepond--item,
.tb-logo .filepond--file-wrapper,
.tb-logo .filepond--file { overflow: visible !important; }
/* FilePond enmascara la lista (mask-image) y eso recortaba el logo y los botones. */
.tb-logo .filepond--list-scroller { -webkit-mask: none !important; mask: none !important; }
.tb-logo .filepond--root:has(.filepond--item) .filepond--panel-root,
.tb-logo .filepond--item-panel,
.tb-logo .filepond--image-preview { width: 100% !important; right: auto !important; }
.tb-logo .filepond--image-bitmap { padding: 8px 10px !important; }
.tb-logo .filepond--image-bitmap canvas { object-position: center !important; }
.tb-logo .filepond--file-action-button.filepond--action-edit-item,
.tb-logo .filepond--file-action-button.filepond--action-remove-item {
  position: absolute !important; left: auto !important; right: -2.6rem !important;
  margin: 0 !important; transform: none !important;
  width: 1.75rem !important; height: 1.75rem !important; opacity: 1 !important; visibility: visible !important;
}
.tb-logo .filepond--file-action-button.filepond--action-remove-item { top: 0 !important; }
.tb-logo .filepond--file-action-button.filepond--action-edit-item { top: 2.15rem !important; }

.tb-logo .filepond--root:has(.filepond--item) { margin-bottom: .75rem !important; }

/* Logo cargado: sin el borde punteado de la zona de arrastre ni el hueco de
   arriba; con el logo puesto sólo se ve su caja. Vacío, la zona sigue igual. */
.tb-logo .filepond--root:has(.filepond--item) .filepond--panel-root { border: 0 !important; }
.tb-logo .filepond--root:has(.filepond--item) .filepond--list { margin-top: 0 !important; }
.tb-logo .filepond--root:has(.filepond--item) .filepond--item { margin-top: 0 !important; margin-bottom: 0 !important; }

/*
 * Resaltado del menú lateral al pasar el mouse: color propio de cada persona
 * (--pn-menu, «Tus colores»). Sin elegir, el color principal como antes. En
 * oscuro se aclara para leerse sobre negro. El reposo del menú no cambia.
 */
html .fi-sidebar .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-label,
html .fi-sidebar .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-icon {
  color: var(--pn-menu, var(--primary-600, #2563EB)) !important;
}
html.dark .fi-sidebar .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-label,
html.dark .fi-sidebar .fi-sidebar-item:not(.fi-active):hover .fi-sidebar-item-icon {
  color: color-mix(in oklab, var(--pn-menu, var(--primary-400, #0A84FF)) 70%, #fff) !important;
}
/* Selectores marcados (p. ej. Trabajadores/Áreas en Carga de documentos): el
   contorno estándar de los buscadores; azul al usarlos. */
.pn-contorno .fi-input-wrp { border: 1px solid var(--pn-filo-2, rgba(0, 0, 0, .12)) !important; }
.pn-contorno .fi-input-wrp:focus-within { border-color: var(--pn-ac, #2563EB) !important; }
/* ═══════════════════════════════════════════════════════════════════════
   CONTORNO EN TODOS LOS CAMPOS (2026-10-05)
   El mismo de los buscadores: gris sutil en reposo, azul al usarlo. Sin él,
   un campo vacío se confundía con el fondo del card hasta hacerle clic.
   Cubre textos, números, fechas, selectores, áreas de texto y teléfonos.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-fo-field .fi-input-wrp,
.fi-fo-field .fi-fo-textarea,
.fi-fo-field textarea.fi-input {
  border: 1px solid var(--pn-filo-2, rgba(0, 0, 0, .12)) !important;
}
.fi-fo-field .fi-input-wrp:focus-within,
.fi-fo-field .fi-fo-textarea:focus-within,
.fi-fo-field textarea.fi-input:focus {
  border-color: var(--pn-ac, #2563EB) !important;
}
.dark .fi-fo-field .fi-input-wrp,
.dark .fi-fo-field .fi-fo-textarea,
.dark .fi-fo-field textarea.fi-input {
  border-color: rgba(255, 255, 255, .16) !important;
}
.dark .fi-fo-field .fi-input-wrp:focus-within,
.dark .fi-fo-field .fi-fo-textarea:focus-within,
.dark .fi-fo-field textarea.fi-input:focus {
  border-color: var(--pn-ac, #0A84FF) !important;
}
/* Campo con error: el rojo manda sobre el gris. */
.fi-fo-field .fi-invalid .fi-input-wrp,
.fi-fo-field .fi-input-wrp.fi-invalid { border-color: #B4232A !important; }

/* ═══════════════════════════════════════════════════════════════════════
   ARRASTRAR ARCHIVOS (2026-10-05)
   Al entrar con un archivo sobre una zona de carga, la zona se desenfoca y
   aparece «Suéltalo aquí» al centro. FilePond marca el estado en
   data-hopper-state="drag-over"; sólo CSS, vale para todas las cargas.
   ═══════════════════════════════════════════════════════════════════════ */
.filepond--root[data-hopper-state="drag-over"] > *:not(.filepond--drip) { filter: blur(4px); opacity: .35; transition: filter .15s ease, opacity .15s ease; }
.filepond--root[data-hopper-state="drag-over"]::after {
  content: "Suéltalo aquí";
  position: absolute; inset: 0; z-index: 50;
  display: flex; align-items: center; justify-content: center;
  padding-left: 1rem; padding-right: 1rem; text-align: center;
  font: 650 1rem/1.2 inherit; letter-spacing: -.01em;
  padding-top: 2.4rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563EB' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 15V4m0 0L7.5 8.5M12 4l4.5 4.5'/%3E%3Cpath d='M4 14v3.5A2.5 2.5 0 0 0 6.5 20h11a2.5 2.5 0 0 0 2.5-2.5V14'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-size: 1.6rem; background-position: center calc(50% - .85rem);
  color: var(--primary-700, #1D4ED8);
  background-color: color-mix(in oklab, var(--primary-500, #2563EB) 10%, rgba(255, 255, 255, .6));
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  border: 2px dashed var(--primary-500, #2563EB);
  border-radius: 12px;
  pointer-events: none;
  animation: pn-soltar .15s ease;
}
.dark .filepond--root[data-hopper-state="drag-over"]::after {
  color: var(--primary-300, #93C5FD);
  background-color: color-mix(in oklab, var(--primary-400, #0A84FF) 14%, rgba(0, 0, 0, .55));
  border-color: var(--primary-400, #0A84FF);
}
@keyframes pn-soltar { from { opacity: 0; transform: scale(.98); } to { opacity: 1; transform: none; } }
.filepond--root[data-hopper-state="drag-over"] .filepond--drop-label { opacity: 0 !important; }

/* Roles: el card del rol acompaña al desplazar (columna izquierda). */
@media (min-width: 1024px) {
  .pn-rol-lateral { position: sticky; top: 5.5rem; align-self: start; }
}
/* Los cards de permisos apilados, con aire parejo entre ellos. */
.fi-resource-roles .fi-sc-group > .fi-sc { gap: 1.25rem; }
/*
 * Código QR / URL del trabajador: el enlace va JUNTO al QR, centrado a su
 * altura, en vez de quedar flotando en la otra mitad del card. Cuando el
 * card es angosto, el enlace baja debajo del QR (no se monta encima).
 */
.pn-qr-fila > .fi-sc { display: flex !important; flex-wrap: wrap; align-items: center; gap: .75rem 1.25rem; }
.pn-qr-fila > .fi-sc > .fi-grid-col { grid-column: auto !important; }
.pn-qr-fila > .fi-sc > .fi-grid-col:first-child { flex: none; }
.pn-qr-fila > .fi-sc > .fi-grid-col:last-child { flex: 1 1 14rem; min-width: 0; }
/* ── Inicio en tablet vertical (768–1023 px) ──────────────────────────────
   Filament pone «ancho completo» (`1 / -1`) sólo desde `lg` (1024 px), pero
   la rejilla ya pasa a 6 columnas en `md` (768 px). En ese tramo las tarjetas
   «completas» caían en UNA columna de seis: el saludo y los indicadores
   quedaban en ~110 px de ancho, con el texto partido y cortado. Se les da el
   ancho completo también en ese tramo. */
@media (min-width: 768px) and (max-width: 1023.98px) {
    .fi-grid > .fi-wi-widget[style*="--col-span-lg: 1 / -1"] { grid-column: 1 / -1; }
}

/* ═══════════════════════════════════════════════════════════════════════
   MODO OSCURO · ACABADO iOS
   El oscuro tenía dos sistemas encima: las tarjetas Filament en #2C2C2E con
   borde duro y doble sombra, y las propias (saludo, avisos) en #1C1C1E. Una
   al lado de la otra se leían como dos grises distintos sin razón.

   Regla única, la de iOS: lienzo negro → tarjeta #1C1C1E → lo que va DENTRO
   de una tarjeta (campos, chips, filas al pasar el puntero) #2C2C2E → lo que
   flota (ventanas, menús) #2C2C2E con campos #3A3A3C. Separación por un filo
   de un píxel, no por sombra: sobre negro la sombra no se ve y sólo ensucia.
   Un solo azul de acento (#0A84FF) para enlaces y foco.
   ═══════════════════════════════════════════════════════════════════════ */
.dark {
    --tb-d-card:   #1C1C1E;
    --tb-d-sunken: #2C2C2E;
    --tb-d-border: rgba(255,255,255,.08);
    --tb-d-border-strong: rgba(255,255,255,.12);
    --pn-filo: rgba(255,255,255,.08);
    --pn-sombra: none;
}

/* Tarjetas: una sola superficie, sin sombra, esquina continua. */
.dark .fi-section,
.dark .fi-wi-stats-overview-stat,
.dark .fi-ta-ctn,
.dark .tb-tarj,
.dark .pn-bienvenida,
.dark .fi-fo-repeater-item,
.dark .fi-in-entry-wrp {
    background-color: #1C1C1E !important;
    border: 1px solid rgba(255,255,255,.08) !important;
    box-shadow: none !important;
}

/* Barra superior: material translúcido, no un negro plano con filo. */
.dark .fi-topbar {
    background-color: rgba(28,28,30,.72) !important;
    -webkit-backdrop-filter: saturate(180%) blur(24px);
    backdrop-filter: saturate(180%) blur(24px);
    border-bottom: 1px solid rgba(255,255,255,.08) !important;
}

/* Barra lateral: sin la barrita azul de la izquierda (es de Material, no de
   iOS); el elemento activo se marca con un relleno suave y su icono en azul. */
.dark .fi-sidebar-item-active .fi-sidebar-item-button { box-shadow: none !important; }
.dark .fi-sidebar-item-active > .fi-sidebar-item-button,
.dark .fi-sidebar-item.fi-active > .fi-sidebar-item-button {
    background-color: rgba(255,255,255,.09) !important;
}
.dark .fi-sidebar-item-active .fi-sidebar-item-icon,
.dark .fi-sidebar-item.fi-active .fi-sidebar-item-icon { color: #0A84FF !important; }
.dark .fi-sidebar-group-label { color: #8E8E93 !important; letter-spacing: .02em; }

/* Campos: relleno #2C2C2E sin borde duro; el foco es un aro azul. */
.dark .fi-input-wrp {
    background-color: #2C2C2E !important;
    box-shadow: inset 0 0 0 1px transparent !important;
}
.dark .fi-input-wrp:hover { box-shadow: inset 0 0 0 1px rgba(255,255,255,.10) !important; }
.dark .fi-input-wrp:has(:focus) {
    box-shadow: inset 0 0 0 1px #0A84FF, 0 0 0 3px rgba(10,132,255,.28) !important;
}
.dark .fi-input-wrp:has([aria-invalid="true"]) { box-shadow: inset 0 0 0 1px #FF453A !important; }

/* Lo que flota: ventanas y menús un escalón más claros que las tarjetas, con
   los campos un escalón más arriba todavía. Aquí sí hay sombra: separa de lo
   que queda detrás. */
.dark .fi-modal-window,
.dark .fi-dropdown-panel {
    background-color: #2C2C2E !important;
    border: 1px solid rgba(255,255,255,.10) !important;
    box-shadow: 0 24px 64px -16px rgba(0,0,0,.7) !important;
}
.dark .fi-modal-window .fi-input-wrp,
.dark .fi-dropdown-panel .fi-input-wrp { background-color: #3A3A3C !important; }

/* Enlaces y acentos de texto: el azul de iOS en oscuro. */
.dark .fi-link:not(.fi-color-danger):not(.fi-color-success):not(.fi-color-warning):not(.fi-color-gray),
.dark .tb-act__ver, .dark .fi-wi-recent-activity a { color: #0A84FF; }

/* Filas de tabla: filo fino y pasar el puntero con el relleno interior. */
.dark .fi-ta-row { border-color: rgba(255,255,255,.07) !important; }
.dark .fi-ta-row:hover { background-color: rgba(255,255,255,.04) !important; }

/* Chips de acceso del saludo: relleno gris de iOS en vez de negro puro, que
   sobre #1C1C1E se leía como un agujero. */
.dark .pn-accion { background-color: #2C2C2E !important; border-color: transparent !important; }
.dark .pn-accion:hover { background-color: #3A3A3C !important; }

/* Indicadores: la etiqueta en la misma tipografía que el resto de la
   interfaz (iOS no mezcla monoespaciada en etiquetas de tarjeta). */
.fi-wi-stats-overview-stat-label {
    font-family: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
    font-weight: 600 !important;
    letter-spacing: -.005em !important;
}

/* Una sección «sin marco» de Filament (la que agrupa los indicadores) NO es
   una tarjeta: sólo ordena las tarjetas de dentro. Con marco propio salía un
   contorno extra alrededor de la fila de indicadores. */
.dark .fi-section.fi-section-not-contained,
.dark .fi-section-not-contained {
    background-color: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
}

/* Contraste en oscuro (≥ 4,5:1): textos que quedaban en azul/gris de modo
   claro sobre #1C1C1E. */
.dark .tb-vacio { color: #A1A1A6; }

/* Indicadores en teléfono: DOS por fila en vez de seis tarjetas altas
   apiladas. Cada una cabe holgada incluso a 360 px. */
@media (max-width: 639.98px) {
    .fi-section-content.fi-grid:has(> .fi-grid-col > .fi-sc-component > .fi-wi-stats-overview-stat),
    .fi-section-content.fi-grid:has(.fi-wi-stats-overview-stat) {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
        gap: .75rem !important;
    }
    .fi-wi-stats-overview-stat { padding: 1rem 1rem !important; }
    .fi-wi-stats-overview-stat-value { font-size: 1.6rem !important; }
}

/* Marca de Central en oscuro: salían a la vez el logotipo completo y el
   símbolo suelto («PaperNext ✈ Central»). La regla que muestra la versión
   oscura (`.dark … --oscura`) pisaba la que oculta el símbolo en el panel. */
.dark .tb-marca .tb-marca-img--simbolo { display: none; }
.dark .fi-simple-main .tb-marca .tb-marca-img--simbolo.tb-marca-img--oscura { display: block; }
.dark .fi-simple-main .tb-marca .tb-marca-img--palabra { display: none; }

/* Saludo de Central en oscuro: la misma superficie plana que el resto, en vez
   del degradado azul-petróleo que desentonaba con las tarjetas grises. */
.dark .tb-hero {
    background: #1C1C1E;
    border: 1px solid rgba(255,255,255,.08);
    box-shadow: none;
}

/* ── Desplazar la página desde dentro de una lista (teléfono y tablet) ────────
   El contenedor de la tabla (`.fi-ta-content-ctn`) va en `overflow: auto` y, por
   uno o dos píxeles de borde, queda con algo que desplazar. Un dedo que empieza
   DENTRO de la tarjeta movía esos píxeles en vez de la página: había que
   arrancar el gesto fuera del card. Sin desplazamiento vertical propio en
   pantallas táctiles o angostas, el gesto sube a la página. El horizontal se
   conserva en tablet, donde la tabla sigue siendo tabla. */
@media (max-width: 1023.98px), (pointer: coarse) {
    .fi-ta-content-ctn { overflow-y: hidden !important; overscroll-behavior-y: auto; }
}
@media (max-width: 767.98px) {
    /* En teléfono la fila es una ficha: no hay nada que desplazar de lado. */
    .fi-ta-content-ctn { overflow: visible !important; }
}

/*
 * Menú lateral: el elemento SELECCIONADO usa el mismo color que la persona
 * eligió en «Tus colores» (--pn-menu), igual que al pasar el mouse. Antes el
 * activo quedaba siempre en el azul del panel y el color elegido solo se veía
 * en el hover. Sin elegir color, todo queda como estaba.
 */
html .fi-sidebar .fi-sidebar-item.fi-active .fi-sidebar-item-icon {
  color: var(--pn-menu, var(--primary-600, #2563EB)) !important;
}
html .fi-sidebar .fi-sidebar-item.fi-active .fi-sidebar-item-label {
  color: var(--pn-menu, var(--pn-tinta)) !important;
}
html.dark .fi-sidebar .fi-sidebar-item.fi-active .fi-sidebar-item-icon {
  color: color-mix(in oklab, var(--pn-menu, #0A84FF) 70%, #fff) !important;
}
html.dark .fi-sidebar .fi-sidebar-item.fi-active .fi-sidebar-item-label {
  color: color-mix(in oklab, var(--pn-menu, #fff) 70%, #fff) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   MENÚ LATERAL PLEGABLE (computador)
   Abierto al partir; el botón de la barra superior lo cierra (X) y lo vuelve
   a abrir (ícono de menú).

   POR QUÉ ESTO Y NO SOLO UNA DURACIÓN: en pantalla ancha Filament apaga la
   transición del menú (`transition-property: none`) y, al cerrarlo, lo pasa de
   «pegado» (ocupa lugar) a «fijo» (no ocupa), así que el contenido saltaba de
   golpe: se veía un parpadeo, no una animación. Aquí el menú SIEMPRE ocupa
   lugar y lo que se anima es su ancho (de su tamaño a 0), con el contenido
   interior a ancho fijo, recortado y desvaneciéndose. El resto de la página
   se reacomoda sola, cuadro a cuadro. Mismos 200 ms y misma curva que los
   grupos del menú (Operación, Administración…), que Filament abre con
   `x-collapse`.
   ═══════════════════════════════════════════════════════════════════════ */
@media (min-width: 1024px) {
    .fi-body-has-sidebar-fully-collapsible-on-desktop .fi-sidebar {
        position: sticky !important;
        translate: 0 0 !important;
        width: var(--sidebar-width);
        overflow: hidden;
        transition-property: width, opacity, border-color !important;
        transition-duration: .2s !important;
        transition-timing-function: cubic-bezier(.4, 0, .2, 1) !important;
    }
    .fi-body-has-sidebar-fully-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open) {
        width: 0 !important;
        opacity: 0;
        border-color: transparent !important;
    }
    /* El contenido no se aprieta mientras el ancho baja: conserva su tamaño y se recorta. */
    .fi-body-has-sidebar-fully-collapsible-on-desktop .fi-sidebar > * {
        width: var(--sidebar-width); flex-shrink: 0;
    }
    /* …pero la lista SÍ debe encogerse con la altura de la ventana: es la que
       lleva el scroll. Con `flex-shrink: 0` se desbordaba hacia abajo y, al estar
       el menú recortado, las últimas opciones quedaban inalcanzables. */
    .fi-body-has-sidebar-fully-collapsible-on-desktop .fi-sidebar > .fi-sidebar-nav {
        flex: 1 1 0; min-height: 0; overflow-y: auto;
    }
    .fi-sidebar-item-label, .fi-sidebar-group-label { white-space: nowrap; }
}
.fi-topbar-open-collapse-sidebar-btn, .fi-topbar-close-collapse-sidebar-btn {
    border-radius: 10px; transition: background-color .18s, transform .18s;
}
.fi-topbar-open-collapse-sidebar-btn:hover { background: rgba(127,127,127,.14); }
/* La X de cerrar el menú: al pasar el mouse se pone roja ELLA, no su recuadro. */
.fi-topbar-close-collapse-sidebar-btn .fi-icon, .fi-topbar-close-collapse-sidebar-btn svg,
.tb-sidebar-close svg { transition: color .18s, transform .18s cubic-bezier(.4, 0, .2, 1); }
/* Y crece apenas (12 %): se nota que responde, sin llamar la atención. */
.fi-topbar-close-collapse-sidebar-btn:hover svg, .fi-topbar-close-collapse-sidebar-btn:focus-visible svg,
.tb-sidebar-close:hover svg { transform: scale(1.12); }
@media (prefers-reduced-motion: reduce) {
    .fi-topbar-close-collapse-sidebar-btn:hover svg, .tb-sidebar-close:hover svg { transform: none; }
}
.fi-topbar-close-collapse-sidebar-btn:hover,
.fi-topbar-close-collapse-sidebar-btn:focus-visible { background: transparent !important; }
.fi-topbar-close-collapse-sidebar-btn:hover .fi-icon, .fi-topbar-close-collapse-sidebar-btn:hover svg,
.fi-topbar-close-collapse-sidebar-btn:focus-visible svg,
.tb-sidebar-close:hover svg { color: #DC2626 !important; }
.dark .fi-topbar-close-collapse-sidebar-btn:hover .fi-icon, .dark .fi-topbar-close-collapse-sidebar-btn:hover svg,
.dark .fi-topbar-close-collapse-sidebar-btn:focus-visible svg,
.dark .tb-sidebar-close:hover svg { color: #FF453A !important; }
.fi-topbar-open-collapse-sidebar-btn:active, .fi-topbar-close-collapse-sidebar-btn:active { transform: scale(.92); }
@media (prefers-reduced-motion: reduce) {
    .fi-body-has-sidebar-fully-collapsible-on-desktop .fi-sidebar { transition-duration: .01ms !important; }
}


/* ═══════════════════════════════════════════════════════════════════════
   CONFIGURACIÓN (Apariencia): pestañas arriba, y debajo SOLO la sección elegida
   ═══════════════════════════════════════════════════════════════════════ */
.tb-config { display: grid; gap: 1rem; }
.tb-config__bar {
    position: sticky; top: calc(var(--topbar-height, 4rem) + .5rem); z-index: 6;
    display: flex; align-items: center; gap: .75rem; padding: .4rem;
    background: rgba(255,255,255,.82); border: 1px solid rgba(0,0,0,.07); border-radius: 16px;
    -webkit-backdrop-filter: saturate(180%) blur(16px); backdrop-filter: saturate(180%) blur(16px);
}
.tb-config__nav { flex: 1 1 auto; min-width: 0; display: flex; gap: .4rem; overflow-x: auto; scrollbar-width: none; }
.tb-config__nav::-webkit-scrollbar { display: none; }
.tb-config__nav button {
    flex: none; display: flex; align-items: center; gap: .65rem; padding: .4rem .95rem .4rem .45rem;
    border: 0; border-radius: 12px; background: transparent; color: inherit; font: inherit; cursor: pointer; text-align: start;
    transition: background-color .18s;
}
.tb-config__nav button:hover { background: rgba(127,127,127,.1); }
.tb-config__ico {
    flex: none; width: 2.25rem; height: 2.25rem; border-radius: 10px; display: grid; place-items: center;
    background: rgba(127,127,127,.12); color: #6E6E73;
    transition: background-color .22s, color .22s, transform .22s cubic-bezier(.4,0,.2,1);
}
.tb-config__txt { display: grid; line-height: 1.2; }
.tb-config__txt b { font-size: .875rem; font-weight: 700; }
.tb-config__txt small { font-size: .75rem; color: #6E6E73; white-space: nowrap; }
/* Los íconos son los de color de cada sección. Apagados (sin elegir) se ven grises; el
   elegido recupera TODO su color —nunca blanco— y la pestaña toma un fondo suave. */
.tb-config__ico svg { width: 1.45rem; height: 1.45rem; display: block; transition: filter .22s, opacity .22s; }
.tb-config__nav button:not(.tb-config__on) .tb-config__ico svg { filter: grayscale(1); opacity: .6; }
.tb-config__on { background: rgba(var(--primary-500, 37 99 235) / .1) !important; }
.tb-config__on .tb-config__ico { background: rgba(var(--primary-500, 37 99 235) / .14); transform: scale(1.04); }
/* El ícono de «Menú» (tres rayas) va en azul, tanto en la pestaña como en su sección, y no
   en el color que cada persona eligió para su panel. */
.tb-ico-azul, #cfg-menu .fi-section-header > .fi-icon { color: #2F7BF5 !important; }
.dark .tb-ico-azul, .dark #cfg-menu .fi-section-header > .fi-icon { color: #6AA6FF !important; }
.dark .tb-config__bar { background: rgba(28,28,30,.78); border-color: rgba(255,255,255,.1); }
.dark .tb-config__txt small { color: #A1A1A6; }

/* Solo la sección elegida. Sin el atributo (sin JavaScript) se ven todas. */
.tb-config[data-activa="cfg-colores"] .tb-config__form .tb-ajustes:not(#cfg-colores),
.tb-config[data-activa="cfg-logo"] .tb-config__form .tb-ajustes:not(#cfg-logo),
.tb-config[data-activa="cfg-menu"] .tb-config__form .tb-ajustes:not(#cfg-menu) { display: none; }
.tb-config[data-activa] .tb-ajustes { animation: tb-sec-in .22s cubic-bezier(.4,0,.2,1); }
@keyframes tb-sec-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .tb-config[data-activa] .tb-ajustes { animation: none; } }

/* Cada sección: ícono en baldosa, título y descripción en una línea, y aire parejo. */
.tb-config__form .fi-section-header { align-items: center; gap: .85rem; }
.tb-config__form .fi-section-header > svg, .tb-config__form .fi-section-header > .fi-icon {
    flex: none; padding: .45rem; box-sizing: content-box; border-radius: 12px; background: rgba(127,127,127,.1);
}
/* Encabezado que se reacomoda: título y descripción mantienen un ancho útil y los
   atajos («Mostrar todas»…) bajan a su propia línea si no caben a la derecha. */
.tb-config__form .fi-section-header { flex-wrap: wrap; }
.tb-config__form .fi-section-header-text-ctn { flex: 1 1 13rem; min-width: 0; }
.tb-config__form .fi-section-header-after-ctn { flex: 0 1 auto; margin-inline-start: auto; }
@media (max-width: 639px) {
    .tb-config__form .fi-section-header-after-ctn { flex-basis: 100%; margin-inline-start: 0; }
    .tb-config__form .fi-section-header-after-ctn .fi-sc { justify-content: flex-start; }
}
.tb-config__form .fi-section-header-heading { font-size: 1rem; font-weight: 700; letter-spacing: -.01em; }
.tb-config__form .fi-section-header-description { font-size: .8125rem; }
/* Los campos que se guardan pero no se ven no deben dejar huecos en la rejilla. */
.tb-config__form .fi-grid-col:has(> .fi-sc-component > .tb-oculto), .tb-config__form .fi-grid-col:has(> .tb-oculto) { display: none; }


@media (max-width: 639px) {
    .tb-config__txt small { display: none; }
    .tb-config__nav button { padding-right: .75rem; }
    .tb-config__ico { width: 1.9rem; height: 1.9rem; }
}



/* ═══════════════════════════════════════════════════════════════════════
   SCROLL FLUIDO: UN solo desenfoque en la barra superior

   En modo oscuro la barra tenía DOS capas con `backdrop-filter` anidadas
   (`.fi-topbar` y su `nav` interior), cada una con desenfoque de 20-24 px y
   saturación. Un desenfoque dentro de otro obliga a la GPU a rehacer ambos en
   CADA cuadro de scroll sobre una lista larga, y en iPad o PC con gráficos
   integrados eso se nota como tirones. Ahora hay una sola capa, con un
   desenfoque más corto; el tinte se compensa para que se vea igual.
   ═══════════════════════════════════════════════════════════════════════ */
.fi-topbar > nav { -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); }
.dark .fi-topbar {
    background-color: rgba(28,28,30,.9) !important;
    -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
}
.dark .fi-topbar > nav {
    -webkit-backdrop-filter: none; backdrop-filter: none; background: transparent !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   UN SOLO SCROLL VERTICAL EN LAS LISTAS (computador con mouse)

   El contenedor de la tabla (`.fi-ta-content-ctn`) va en `overflow: auto` en
   los dos ejes. Basta que la tabla sea un poco más ancha que el card para que
   aparezca la barra horizontal, y esa barra le quita unos píxeles de alto:
   el contenedor queda con un desplazamiento vertical PROPIO de unos pocos
   píxeles. Con el mouse sobre la lista, la rueda se gastaba primero en esos
   píxeles y, al terminarse, pasaba a la página: dos scrolls peleándose, que se
   sentía como si la lista «se pegara». (En tablet y teléfono ya estaba
   corregido arriba; faltaba el computador.)

   Sin alto fijado a mano, la lista no desplaza hacia arriba y abajo: lo hace la
   página, siempre. Con alto fijado a mano (listas «a medida») el desplazamiento
   interno es a propósito, y se le corta el traspaso a la página a mitad de
   gesto para que no pasen los dos a la vez.
   ═══════════════════════════════════════════════════════════════════════ */
@media (min-width: 1024px) and (pointer: fine) {
    html:not(.pn-alto-fijo) .fi-ta-content-ctn { overflow-y: hidden !important; }
    html.pn-alto-fijo .fi-ta-content-ctn { overscroll-behavior-y: contain; }
}


/* ═══════════════════════════════════════════════════════════════════════
   ÓRDENES DE REPARACIÓN · reloj del plazo de cotización
   Un punto de color y dos líneas: «En plazo / quedan 3 d 4 h». Los colores
   son los del semáforo del resto del panel (verde, ámbar, rojo, gris).
   ═══════════════════════════════════════════════════════════════════════ */
.tb-plazo { display: inline-flex; align-items: center; gap: .55rem; line-height: 1.2; }
.tb-plazo__punto { flex: none; width: .6rem; height: .6rem; border-radius: 50%; background: #98989D; box-shadow: 0 0 0 3px rgba(152,152,157,.18); }
.tb-plazo__txt { display: grid; }
.tb-plazo__txt b { font-size: .8125rem; font-weight: 700; }
.tb-plazo__txt small { font-size: .75rem; color: #6E6E73; white-space: nowrap; font-variant-numeric: tabular-nums; }
.dark .tb-plazo__txt small { color: #A1A1A6; }
.tb-plazo--success .tb-plazo__punto { background: #16A34A; box-shadow: 0 0 0 3px rgba(22,163,74,.18); }
.tb-plazo--success .tb-plazo__txt b { color: #15803D; }
.tb-plazo--warning .tb-plazo__punto { background: #D97706; box-shadow: 0 0 0 3px rgba(217,119,6,.2); animation: tb-plazo-late 1.8s ease-in-out infinite; }
.tb-plazo--warning .tb-plazo__txt b { color: #B45309; }
.tb-plazo--danger .tb-plazo__punto { background: #DC2626; box-shadow: 0 0 0 3px rgba(220,38,38,.2); }
.tb-plazo--danger .tb-plazo__txt b { color: #B91C1C; }
.dark .tb-plazo--success .tb-plazo__txt b { color: #30D158; }
.dark .tb-plazo--warning .tb-plazo__txt b { color: #FF9F0A; }
.dark .tb-plazo--danger .tb-plazo__txt b { color: #FF453A; }
@keyframes tb-plazo-late { 50% { box-shadow: 0 0 0 5px rgba(217,119,6,.08); } }
@media (prefers-reduced-motion: reduce) { .tb-plazo--warning .tb-plazo__punto { animation: none; } }

/* ── Tablero de órdenes de reparación ───────────────────────────────── */
.tb-kanban { display: flex; gap: .75rem; overflow-x: auto; padding-bottom: .5rem; align-items: flex-start; -webkit-overflow-scrolling: touch; }
.tb-kanban__col { flex: 0 0 15.5rem; background: rgba(120,120,128,.08); border: 1px solid transparent; border-radius: .875rem; padding: .5rem; min-height: 8rem; }
.tb-kanban__col--sobre { border-color: #0A84FF; background: rgba(10,132,255,.08); }
.tb-kanban__cab { display: flex; align-items: center; justify-content: space-between; padding: .25rem .375rem .5rem; }
.tb-kanban__titulo { font-size: .8125rem; font-weight: 700; }
.tb-kanban__n { font-size: .75rem; font-weight: 600; color: #6E6E73; background: rgba(120,120,128,.16); border-radius: 999px; padding: 0 .5rem; }
.dark .tb-kanban__n { color: #A1A1A6; }
.tb-kanban__lista { display: grid; gap: .5rem; }
.tb-kanban__card { background: #fff; border-radius: .625rem; padding: .625rem .75rem; box-shadow: 0 1px 2px rgba(0,0,0,.08); display: grid; gap: .25rem; }
.dark .tb-kanban__card { background: #2C2C2E; }
.tb-kanban__card[draggable="true"] { cursor: grab; }
.tb-kanban__card[draggable="true"]:active { cursor: grabbing; opacity: .7; }
.tb-kanban__ot { font-weight: 700; font-size: .875rem; color: #0A84FF; text-decoration: none; }
.tb-kanban__comp { font-size: .8125rem; }
.tb-kanban__comp small { color: #6E6E73; }
.tb-kanban__cli { font-size: .75rem; color: #6E6E73; }
.dark .tb-kanban__cli, .dark .tb-kanban__comp small { color: #A1A1A6; }
.tb-kanban__plazo { margin-top: .125rem; }
.tb-kanban__sig { justify-self: start; margin-top: .25rem; font-size: .75rem; font-weight: 600; color: #0A84FF; background: rgba(10,132,255,.1); border-radius: .5rem; padding: .25rem .625rem; }
.tb-kanban__vacia { font-size: .75rem; color: #98989D; text-align: center; padding: 1rem 0; margin: 0; }
.tb-kanban__nota { font-size: .75rem; color: #6E6E73; margin-top: .75rem; }

/* Tira de avance de la lista de órdenes */
.tb-avance { display: flex; flex-wrap: wrap; gap: .25rem; max-width: 21rem; }
.tb-avance__paso { font-size: .6875rem; font-weight: 600; line-height: 1; padding: .3125rem .5rem; border-radius: 999px; background: rgba(120,120,128,.12); color: #8E8E93; }
.tb-avance__paso--hecho { background: rgba(22,163,74,.12); color: #15803D; }
.tb-avance__paso--toca { background: #0A84FF; color: #fff; cursor: pointer; box-shadow: 0 1px 2px rgba(10,132,255,.4); }
.tb-avance__paso--toca:hover { background: #0071E3; }
.tb-avance__cerrada { font-size: .75rem; color: #8E8E93; }

/* ── Estados de las órdenes de reparación ───────────────────────────────
   Escala que avanza con la orden: gris → azul → índigo → ámbar → naranja →
   verde azulado → verde → verde oscuro. El color va en el texto; el fondo es
   el mismo tono muy suave. */
.tb-est { --est: #6B7280; display: inline-flex; align-items: center; gap: .4rem; font-weight: 700; font-size: .8125rem; line-height: 1.1; color: var(--est); background: color-mix(in srgb, var(--est) 13%, transparent); border-radius: 999px; padding: .3125rem .625rem .3125rem .5rem; white-space: nowrap; }
.tb-est::before { content: ''; width: .5rem; height: .5rem; border-radius: 50%; background: var(--est); flex: none; }
.tb-est--recepcionado { --est: #6B7280; }
.tb-est--evaluacion { --est: #7C3AED; }
.tb-est--presupuesto { --est: #0891B2; }
.tb-est--cotizacion_enviada { --est: #0A84FF; }
.tb-est--oc_autorizada { --est: #5E5CE6; }
.tb-est--en_proceso { --est: #EA580C; }
.tb-est--reparado { --est: #0D9488; }
.tb-est--listo_entrega { --est: #16A34A; }
.tb-est--entregado { --est: #166534; }
.tb-est--rechazada { --est: #DC2626; }
.tb-est--anulada { --est: #8E8E93; }
.tb-est--devolucion { --est: #6B7280; }
.dark .tb-est--recepcionado { --est: #9CA3AF; }
.dark .tb-est--evaluacion { --est: #A78BFA; }
.dark .tb-est--presupuesto { --est: #22D3EE; }
.dark .tb-est--cotizacion_enviada { --est: #64B5FF; }
.dark .tb-est--oc_autorizada { --est: #A5A3FF; }
.dark .tb-est--en_proceso { --est: #FB923C; }
.dark .tb-est--reparado { --est: #2DD4BF; }
.dark .tb-est--listo_entrega { --est: #4ADE80; }
.dark .tb-est--entregado { --est: #86EFAC; }
.dark .tb-est--rechazada { --est: #F87171; }
.dark .tb-est--anulada { --est: #AEAEB2; }
.dark .tb-est--devolucion { --est: #A1A1A6; }

/* Fila de la lista en el teléfono */
.tb-ot-movil { display: grid; gap: .375rem; padding: .125rem 0; flex: 1 1 auto; width: 100%; min-width: 0; }
.tb-ot-movil__cab { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
.tb-ot-movil__ot { font-size: 1rem; font-weight: 800; letter-spacing: -.01em; }
.tb-ot-movil__comp { font-size: .9375rem; font-weight: 600; }
.tb-ot-movil__det { font-size: .8125rem; color: #6E6E73; }
.dark .tb-ot-movil__det { color: #A1A1A6; }
.tb-ot-movil .tb-est { font-size: .875rem; padding: .375rem .75rem .375rem .625rem; }

/* Tablero: títulos de columna con el color de su estado, y en el teléfono dos columnas parejas, sin desplazarse de lado */
.tb-kanban__col { border-top: 3px solid var(--est, transparent); }
.tb-kanban__titulo { color: var(--est, inherit); }
@media (max-width: 47.99rem) {
    .tb-kanban { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem; overflow: visible; align-items: stretch; }
    .tb-kanban__col { flex: none; min-width: 0; padding: .375rem; }
    .tb-kanban__card { padding: .5rem .5rem; }
    .tb-kanban__comp, .tb-kanban__cli { overflow-wrap: anywhere; }
    .tb-kanban__sig { white-space: normal; text-align: left; }
}

/* Lista en el teléfono: aire a los lados, y el botón del paso alineado con el texto */
.fi-ta-cell-tb-movil .fi-ta-col:has(.tb-ot-movil) { padding: .875rem 1rem .25rem; }
.fi-ta-row:has(.tb-ot-movil) .fi-ta-actions { padding: 0 .5rem .75rem; }
.tb-ot-movil__falla { font-size: .8125rem; color: #3A3A3C; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.dark .tb-ot-movil__falla { color: #D1D1D6; }
.tb-ot-movil__meta { display: grid; gap: .125rem; font-size: .75rem; color: #6E6E73; border-top: 1px solid rgba(120,120,128,.18); padding-top: .375rem; margin-top: .125rem; }
.dark .tb-ot-movil__meta { color: #A1A1A6; }
.tb-ot-movil__sin { font-style: italic; opacity: .8; }

/* Botones de paso de las órdenes: botón sólido con el color del estado al que llevan */
.tb-paso { background: var(--est) !important; color: #fff !important; font-weight: 700; border-radius: .75rem; box-shadow: 0 1px 2px color-mix(in srgb, var(--est) 45%, transparent); --tw-ring-color: transparent; }
.tb-paso:hover { filter: brightness(.94); }
.tb-paso svg { color: inherit !important; }
.dark .tb-paso { color: #111 !important; }
/* En el teléfono: ancho completo y alto cómodo para el dedo */
@media (max-width: 47.99rem) {
    .fi-ta-row:has(.tb-ot-movil) .fi-ta-actions { padding: .25rem 0 .875rem .5rem; display: flex; gap: .5rem; align-items: center; }
    .fi-ta-row:has(.tb-ot-movil) .fi-ta-actions .tb-paso { flex: 1 1 auto; justify-content: center; min-height: 2.75rem; font-size: .9375rem; }
}

/* Inicio de Maestranza: las etapas de las órdenes, de punta a punta */
.tb-flujo { display: grid; grid-template-columns: repeat(2, 1fr); gap: .5rem; }
@media (min-width: 48rem) { .tb-flujo { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 80rem) { .tb-flujo { grid-template-columns: repeat(8, 1fr); } }
.tb-flujo__etapa { display: grid; gap: .125rem; padding: .75rem .875rem; border-radius: .875rem; text-decoration: none; background: color-mix(in srgb, var(--est, #6B7280) 11%, transparent); border-top: 3px solid var(--est, #6B7280); }
.tb-flujo__etapa:hover { background: color-mix(in srgb, var(--est, #6B7280) 18%, transparent); }
.tb-flujo__n { font-size: 1.75rem; font-weight: 800; line-height: 1; color: var(--est, #6B7280); letter-spacing: -.02em; }
.tb-flujo__txt { font-size: .8125rem; font-weight: 600; color: var(--est, #6B7280); }

/* Área de trabajo del componente: H Hidráulica, M Maestranza, S Soldadura */
.tb-area { --a: #6B7280; display: inline-grid; place-items: center; min-width: 1.5rem; height: 1.5rem; padding: 0 .375rem; border-radius: .5rem; font-size: .75rem; font-weight: 800; line-height: 1; color: #fff; background: var(--a); letter-spacing: .02em; vertical-align: middle; }
.tb-area--H { --a: #0284C7; }
.tb-area--M { --a: #7C3AED; }
.tb-area--S { --a: #D97706; }
.tb-ot-movil__ot .tb-area { margin-left: .375rem; }
/* Botones secundarios del recorrido: pequeños y discretos junto al paso principal */
.tb-omitir { font-weight: 600; }
.tb-derivar { font-weight: 700; }

/* Ruta por área en la ficha */
.tb-ruta { display: grid; gap: .75rem; }
.tb-ruta__tramo { border: 1px solid rgba(120,120,128,.2); border-radius: .875rem; padding: .75rem .875rem; display: grid; gap: .5rem; }
.tb-ruta__cab { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.tb-ruta__cab small { color: #6E6E73; }
.dark .tb-ruta__cab small { color: #A1A1A6; }
.tb-ruta__pasos { display: flex; flex-wrap: wrap; gap: .375rem; margin: 0; padding: 0; list-style: none; }
.tb-ruta__paso { font-size: .8125rem; font-weight: 600; padding: .3125rem .625rem; border-radius: 999px; background: rgba(120,120,128,.12); color: #8E8E93; }
.tb-ruta__paso small { font-weight: 500; }
.tb-ruta__paso--hecho { background: rgba(22,163,74,.13); color: #15803D; }
.tb-ruta__paso--omitido { background: rgba(120,120,128,.08); color: #8E8E93; text-decoration: line-through; text-decoration-color: rgba(120,120,128,.5); }
.tb-ruta__paso--actual { background: #EA580C; color: #fff; }
.dark .tb-ruta__paso--hecho { color: #4ADE80; }
.tb-ruta__vacia { color: #6E6E73; margin: 0; }

.tb-kanban__card .tb-area { justify-self: start; }
.tb-kanban__paso { font-size: .75rem; font-weight: 700; color: #EA580C; }
.tb-kanban__sig--sec { color: #6E6E73; background: rgba(120,120,128,.12); }

/* Columna «Área» de las órdenes: la letra va centrada en la columna (el contenedor interno de la celda parte alineado a la izquierda). */
.fi-ta-cell-area .fi-ta-col { justify-content: center; }

/* Ruta por área: el próximo paso por marcar va con borde (lo hecho va relleno) */
.tb-ruta__paso--siguiente { background: transparent; color: #EA580C; box-shadow: inset 0 0 0 1.5px #EA580C; }

/* Inventario: vista previa de la foto de un repuesto */
.tb-foto-previa { display: grid; gap: .75rem; justify-items: center; }
.tb-foto-previa__img { max-width: 100%; max-height: 65vh; object-fit: contain; border-radius: .75rem; background: rgba(120,120,128,.08); }
.tb-foto-previa__pie { margin: 0; text-align: center; font-size: .875rem; }
.tb-foto-previa__pie span { color: #6E6E73; font-size: .8125rem; }
.dark .tb-foto-previa__pie span { color: #A1A1A6; }
.fi-ta-cell-foto-path img { cursor: zoom-in; }

/* ── Tablero de órdenes, rediseñado ────────────────────────────────────
   Escritorio: las columnas se reparten el ancho (nada de desplazarse de lado salvo en pantallas muy
   angostas), cada una con su propio desplazamiento vertical, y tarjetas compactas y alineadas.
   El teléfono conserva sus dos columnas parejas (reglas más arriba). */
@media (min-width: 48rem) {
    .tb-kanban { display: grid; grid-template-columns: repeat(var(--cols, 6), minmax(0, 1fr)); gap: .625rem; overflow: visible; align-items: stretch; padding-bottom: 0; }
    .tb-kanban__col { display: flex; flex-direction: column; }
    .tb-kanban__lista { flex: 1 1 auto; align-content: start; }
    .tb-kanban__col { flex: none; min-width: 0; padding: .5rem .5rem .625rem; background: color-mix(in srgb, var(--est, #6B7280) 7%, transparent); border-radius: 1rem; border-top-width: 3px; }
    .tb-kanban__cab { padding: .125rem .25rem .5rem; gap: .375rem; }
    .tb-kanban__titulo { font-size: .75rem; line-height: 1.15; letter-spacing: .01em; }
    .tb-kanban__n { flex: none; color: var(--est, #6E6E73); background: color-mix(in srgb, var(--est, #6B7280) 16%, transparent); font-weight: 700; }
    .tb-kanban__lista { gap: .4rem; max-height: calc(100vh - 17rem); min-height: 4rem; overflow-y: auto; overflow-x: hidden; scrollbar-width: thin; padding: 1px; }
    .tb-kanban__card { padding: .5rem .5625rem; gap: .1875rem; border-radius: .625rem; box-shadow: 0 0 0 1px rgba(120,120,128,.14), 0 1px 2px rgba(0,0,0,.05); min-width: 0; }
    .tb-kanban__card:hover { box-shadow: 0 0 0 1px color-mix(in srgb, var(--est, #6B7280) 45%, transparent), 0 2px 6px rgba(0,0,0,.08); }
}
/* Pantallas de escritorio angostas: si 6 columnas ya no caben con comodidad, ahí sí se desplaza (con columnas legibles). */
@media (min-width: 48rem) and (max-width: 72rem) {
    .tb-kanban { grid-template-columns: repeat(var(--cols, 6), minmax(8.75rem, 1fr)); overflow-x: auto; }
}
.tb-kanban__fila { display: flex; align-items: center; gap: .375rem; min-width: 0; }
.tb-kanban__fila .tb-area { min-width: 1.25rem; height: 1.25rem; font-size: .6875rem; border-radius: .375rem; padding: 0 .25rem; flex: none; }
.tb-kanban__dias { margin-left: auto; font-size: .6875rem; font-weight: 600; color: #8E8E93; flex: none; font-variant-numeric: tabular-nums; }
.tb-kanban__ot { font-size: .8125rem; font-weight: 800; letter-spacing: -.01em; white-space: nowrap; }
.tb-kanban__comp { font-size: .78125rem; font-weight: 600; line-height: 1.25; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.tb-kanban__cli { font-size: .6875rem; color: #6E6E73; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tb-kanban__paso { font-size: .6875rem; font-weight: 700; color: #EA580C; }
.tb-kanban__plazo { font-size: .6875rem; color: #8E8E93; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Botones de la tarjeta: ancho completo, del color del estado al que llevan */
.tb-kanban__sig { justify-self: stretch; width: 100%; margin-top: .25rem; padding: .3125rem .5rem; font-size: .6875rem; font-weight: 700; line-height: 1.2; text-align: center; border-radius: .5rem; color: var(--est, #0A84FF); background: color-mix(in srgb, var(--est, #0A84FF) 13%, transparent); }
.tb-kanban__sig:hover { background: color-mix(in srgb, var(--est, #0A84FF) 22%, transparent); }
.tb-kanban__sig--sec { color: #6E6E73; background: rgba(120,120,128,.1); font-weight: 600; margin-top: .125rem; }
.dark .tb-kanban__dias, .dark .tb-kanban__plazo { color: #A1A1A6; }

/* Tablero adaptable por el ANCHO REAL del área de contenido (no de la ventana): con el menú lateral abierto un
   notebook de 14" o 15,6" deja ~880–1100 px, y seis columnas ahí quedan ilegibles. Así: 6 columnas si caben
   bien, 3 (en dos filas) en notebooks, 2 en pantallas pequeñas. Nunca hay desplazamiento lateral. */
.tb-kanban-wrap { container-type: inline-size; }
@container (min-width: 0px) {
    .tb-kanban-wrap .tb-kanban { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .625rem; overflow: visible; align-items: stretch; }
    .tb-kanban-wrap .tb-kanban__lista { max-height: none; overflow: visible; }
}
@container (min-width: 36rem) {
    .tb-kanban-wrap .tb-kanban { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@container (min-width: 70rem) {
    .tb-kanban-wrap .tb-kanban { grid-template-columns: repeat(var(--cols, 6), minmax(0, 1fr)); }
    .tb-kanban-wrap .tb-kanban__lista { max-height: max(24rem, calc(100vh - 15rem)); overflow-y: auto; }
}

/* Hoja de papel con sello de firma por área (firma electrónica simple con PIN). */
.tb-hojas { display: grid; grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); gap: 1rem; }
.tb-hoja__vacia { color: #8E8E93; font-size: .875rem; margin: 0; }
.tb-hoja { position: relative; background: #fffdf8; background-image: repeating-linear-gradient(transparent 0 1.55rem, rgba(120,100,60,.10) 1.55rem 1.6rem); border: 1px solid #e6dfcc; border-radius: .25rem .25rem .25rem 1.25rem; padding: 1rem 1.1rem 1.1rem; min-height: 14rem; box-shadow: 0 1px 1px rgba(60,50,20,.08), 0 6px 14px rgba(60,50,20,.10); overflow: hidden; color: #3b3a35; }
.tb-hoja::after { content: ""; position: absolute; left: 0; bottom: 0; width: 1.25rem; height: 1.25rem; background: linear-gradient(45deg, #e9e2cf 50%, transparent 50%); border-top-right-radius: .5rem; }
.tb-hoja__cab { display: flex; justify-content: space-between; align-items: baseline; gap: .5rem; border-bottom: 2px solid #3b3a35; padding-bottom: .3rem; }
.tb-hoja__titulo { font-family: Georgia, 'Times New Roman', serif; font-weight: 700; font-size: .95rem; letter-spacing: .02em; }
.tb-hoja__area { font-size: .7rem; font-weight: 700; color: #6b6a62; }
.tb-hoja__ot { font-size: .72rem; margin: .4rem 0 .3rem; color: #6b6a62; }
.tb-hoja__pasos { margin: 0 0 .5rem; padding-left: 1rem; font-size: .72rem; line-height: 1.55rem; color: #4a4943; max-height: 6.2rem; overflow: hidden; }
.tb-hoja__pie { position: absolute; left: 1.1rem; right: 1.1rem; bottom: .9rem; }
.tb-hoja__linea { border-top: 1px solid #8a8878; width: 55%; }
.tb-hoja__quien { font-size: .65rem; color: #6b6a62; margin-top: .15rem; max-width: 55%; }
.tb-sello { position: absolute; right: .8rem; bottom: 1.6rem; transform: rotate(-6deg); text-align: center; color: #1e3a8a; border: 3px double #1e3a8a; border-radius: .65rem; padding: .35rem .6rem .4rem; background: rgba(30,58,138,.035); mix-blend-mode: multiply; opacity: .88; filter: url(#tb-tinta); max-width: 11rem; font-family: 'Courier New', ui-monospace, monospace; line-height: 1.15; box-shadow: inset 0 0 0 1px rgba(30,58,138,.35); }
.tb-sello__sup { font-size: .55rem; font-weight: 800; letter-spacing: .12em; text-transform: uppercase; border-bottom: 1px solid rgba(30,58,138,.55); padding-bottom: .15rem; margin-bottom: .2rem; }
.tb-sello__nombre { font-size: .8rem; font-weight: 800; text-transform: uppercase; overflow-wrap: anywhere; }
.tb-sello__area { font-size: .6rem; font-weight: 700; margin-top: .1rem; }
.tb-sello__fecha { font-size: .6rem; margin-top: .15rem; }
.tb-sello__cod { font-size: .5rem; letter-spacing: .08em; opacity: .75; margin-top: .05rem; }
.dark .tb-hoja { background-color: #2b2a26; background-image: repeating-linear-gradient(transparent 0 1.55rem, rgba(255,255,255,.05) 1.55rem 1.6rem); border-color: #4a483f; color: #e9e6da; }
.dark .tb-hoja__cab { border-color: #e9e6da; } .dark .tb-hoja__pasos, .dark .tb-hoja__ot, .dark .tb-hoja__area, .dark .tb-hoja__quien { color: #bdb9a8; }
.dark .tb-sello { color: #93b4ff; border-color: #93b4ff; mix-blend-mode: screen; background: rgba(147,180,255,.06); }

/* Tablas de las tarjetas del Inicio, en el teléfono: cada línea (OT, cliente, estado/contador) empieza en el
   mismo margen y ninguna queda pegada a la orilla de la tarjeta. */
@media (max-width: 767px) {
    .fi-wi-table .fi-ta-row > .fi-ta-cell:not(.fi-ta-selection-cell) { padding-inline: 1rem !important; }
    .fi-wi-table .fi-ta-row > .fi-ta-cell .fi-ta-text,
    .fi-wi-table .fi-ta-row > .fi-ta-cell .fi-ta-col,
    .fi-wi-table .fi-ta-row > .fi-ta-cell .fi-ta-col > *:not(.tb-est):not(.fi-badge),
    .fi-wi-table .fi-ta-row > .fi-ta-cell .fi-ta-text-item { padding-inline: 0 !important; margin-inline: 0 !important; }
}

/* Etapas del Inicio: el filo de color de arriba iba como `border-top`, que con las esquinas redondas se
   afina y se corta en las puntas. Ahora es una sombra interior, que sigue la curva y queda pareja. */
.tb-flujo__etapa { border-top: 0; box-shadow: inset 0 3px 0 0 var(--est, #6B7280); padding: .875rem .875rem .8125rem; }

/* Insignia «Listo para entregar»: sin relleno verde; contorno neutro con punto y texto verdes, igual que las
   insignias de estado «1 kit», «1 unidad» (ver arriba). */
.tb-est.tb-est--listo_entrega { background: transparent; box-shadow: inset 0 0 0 1px var(--pn-filo-2, rgba(0,0,0,.12)); font-weight: 600; gap: .4rem; padding: .125rem .7rem .125rem .6rem !important; line-height: 1.4; }

/* Accesos rápidos del saludo (Nueva orden de trabajo, Ver órdenes, Tablero, Trazabilidad…): un contorno fino
   y neutro, con apenas una sombra, para que se lean como botones sin competir con el contenido. */
.pn-accion { border-color: var(--pn-filo-2, rgba(0,0,0,.12)); box-shadow: 0 1px 1px rgba(0,0,0,.04); }
.dark .pn-accion { box-shadow: none; }
.pn-accion:hover { box-shadow: 0 1px 3px rgba(0,0,0,.08); }

/* Etapas del Inicio: contorno sutil en su color, que arranca donde termina el filo grueso de arriba. */
.tb-flujo__etapa { box-shadow: inset 0 3px 0 0 var(--est, #6B7280), inset 0 0 0 1px color-mix(in srgb, var(--est, #6B7280) 30%, transparent); }

/* Tarjetas de indicadores de las órdenes (Inicio): filo de color arriba y contorno sutil en su tono, como las
   etapas de abajo; la cifra manda y un separador fino la aparta de la descripción. */
.fi-wi-stats-overview-stat.tb-kpi {
    box-shadow: inset 0 3px 0 0 var(--est), inset 0 0 0 1px color-mix(in srgb, var(--est) 28%, transparent), 0 1px 2px rgba(0,0,0,.04) !important;
    background-image: linear-gradient(180deg, color-mix(in srgb, var(--est) 6%, transparent), transparent 55%);
    padding-top: calc(1.25rem + 3px) !important;
}
.fi-wi-stats-overview-stat.tb-kpi .fi-wi-stats-overview-stat-label { color: color-mix(in srgb, var(--est) 80%, #6E6E73); font-weight: 700; }
.fi-wi-stats-overview-stat.tb-kpi .fi-wi-stats-overview-stat-description {
    margin-top: .65rem; padding-top: .65rem;
    border-top: 1px solid color-mix(in srgb, var(--est) 18%, transparent);
}
a.fi-wi-stats-overview-stat.tb-kpi:hover, .fi-wi-stats-overview-stat.tb-kpi:hover { box-shadow: inset 0 3px 0 0 var(--est), inset 0 0 0 1px color-mix(in srgb, var(--est) 45%, transparent), 0 4px 12px -4px rgba(0,0,0,.12) !important; }

/* Aviso «N órdenes en pausa» bajo las tarjetas del Inicio: una línea con contorno sutil. */
.tb-pausa-aviso { display: flex; align-items: center; gap: .6rem; padding: .6rem .9rem; border-radius: .875rem; background: transparent; box-shadow: inset 0 0 0 1px var(--pn-filo-2, rgba(0,0,0,.12)); color: #6E6E73; font-size: .8125rem; text-decoration: none; }
.tb-pausa-aviso strong { color: inherit; font-weight: 700; }
.tb-pausa-aviso__ico { width: 1.15rem; height: 1.15rem; flex: none; }
.tb-pausa-aviso__ver { margin-left: auto; font-weight: 600; color: #0A84FF; }
.tb-pausa-aviso:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, #0A84FF 40%, transparent); }
.dark .tb-pausa-aviso { color: #A1A1A6; }

/* Indicadores de las órdenes (Inicio): sin la sección blanca detrás, para que cada tarjeta flote sola sobre el fondo. */
.fi-section:has(.tb-kpi) { background: transparent !important; box-shadow: none !important; --tw-ring-shadow: 0 0 #0000 !important; border: 0 !important; overflow: visible !important; }

/* Indicadores: fondo blanco; el tono de su color aparece sólo al pasar el mouse. */
.fi-wi-stats-overview-stat.tb-kpi { background-image: none; }
.fi-wi-stats-overview-stat.tb-kpi:hover { background-image: linear-gradient(180deg, color-mix(in srgb, var(--est) 6%, transparent), transparent 55%); }

/* ═══════════════════════════════════════════════════════════════════════
   AYUDA · botón «?» y panel lateral con preguntas frecuentes
   ═══════════════════════════════════════════════════════════════════════ */
.pn-ayuda { position: fixed; inset: 0; z-index: 60; }
.pn-ayuda__fondo { position: absolute; inset: 0; background: rgba(0,0,0,.35); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.pn-ayuda__panel { position: absolute; top: 0; right: 0; bottom: 0; width: min(30rem, 100%); display: flex; flex-direction: column;
    background: var(--pn-lienzo); border-left: 1px solid var(--pn-filo); box-shadow: -18px 0 50px -24px rgba(0,0,0,.35); }
.pn-ayuda__cab { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: 1.25rem 1.25rem .6rem; }
.pn-ayuda__eyebrow { margin: 0 0 .25rem; font-size: 11.5px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--pn-tinta-3); }
.pn-ayuda__cab h2 { margin: 0; font-family: var(--tb-display); font-size: 1.45rem; font-weight: 600; letter-spacing: -.025em; color: var(--pn-tinta); }
.pn-ayuda__x { border: 0; background: var(--pn-nivel); color: var(--pn-tinta-2); width: 2rem; height: 2rem; border-radius: 50%; font-size: 1.3rem; line-height: 1; cursor: pointer; }
.pn-ayuda__buscador { display: flex; align-items: center; gap: .6rem; margin: .4rem 1.25rem .9rem; padding: .6rem .9rem; border-radius: var(--pn-r-campo);
    background: var(--pn-nivel); border: 1px solid transparent; color: var(--pn-tinta-3); }
.pn-ayuda__buscador:focus-within { border-color: rgba(var(--pn-ac-3), .5); background: var(--pn-lienzo); }
.pn-ayuda__buscador svg { width: 1.15rem; height: 1.15rem; flex: none; }
.pn-ayuda__buscador input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; font: inherit; font-size: .95rem; color: var(--pn-tinta); }
.pn-ayuda__cuerpo { flex: 1; overflow-y: auto; padding: 0 1.25rem 1.5rem; }
.pn-ayuda__categoria { margin: 1.1rem 0 .5rem; font-family: var(--tb-mono); font-size: .72rem; letter-spacing: .06em; text-transform: uppercase; color: var(--pn-tinta-3); }
.pn-ayuda__item { border: 1px solid var(--pn-filo); border-radius: 16px; margin-bottom: .5rem; background: var(--pn-lienzo); }
.pn-ayuda__item summary { cursor: pointer; list-style: none; padding: .8rem 1rem; font-weight: 600; font-size: .93rem; letter-spacing: -.01em; color: var(--pn-tinta); display: flex; justify-content: space-between; gap: .8rem; }
.pn-ayuda__item summary::-webkit-details-marker { display: none; }
.pn-ayuda__item summary::after { content: '+'; color: var(--pn-tinta-3); font-weight: 400; font-size: 1.2rem; line-height: 1; }
.pn-ayuda__item[open] summary::after { content: '–'; }
.pn-ayuda__item[open] { border-color: var(--pn-filo-2); box-shadow: var(--pn-sombra); }
.pn-ayuda__resp { padding: 0 1rem 1rem; color: var(--pn-tinta-2); font-size: .9rem; line-height: 1.55; }
.pn-ayuda__resp p { margin: 0 0 .45rem; }
.pn-ayuda__boton { display: inline-flex; align-items: center; margin-top: .5rem; padding: .5rem 1rem; border-radius: 980px; background: var(--pn-nivel); color: var(--pn-tinta);
    border: 1px solid var(--pn-filo-2); font-size: .85rem; font-weight: 600; text-decoration: none; }
.pn-ayuda__boton:hover { border-color: rgba(var(--pn-ac-3), .5); color: var(--pn-ac); }
.pn-ayuda__vacio { text-align: center; padding: 1.4rem 1rem; color: var(--pn-tinta-2); }
.pn-ayuda__vacio strong { display: block; color: var(--pn-tinta); font-family: var(--tb-display); font-size: 1.05rem; margin-bottom: .3rem; }

/* ── Resúmenes de órdenes ─────────────────────────────────────────────── */
.tb-res { display: grid; gap: 1.25rem; max-width: 62rem; }
.tb-res__bloque { display: grid; gap: .6rem; }
.tb-res__tit { font-size: .95rem; font-weight: 700; margin: 0; }
.tb-res__ayuda { font-size: .8rem; color: var(--pn-texto-2, #6E6E73); margin: 0; }
.tb-res__cajas { display: grid; grid-template-columns: repeat(auto-fill, minmax(11.5rem, 1fr)); gap: .65rem; }
.tb-res__caja { position: relative; display: flex; align-items: center; gap: .6rem; padding: .85rem .9rem; border-radius: .85rem; text-align: left; cursor: pointer;
    background: var(--pn-superficie, #fff); box-shadow: inset 0 0 0 1px var(--pn-filo-2, rgba(0,0,0,.12)); transition: box-shadow .15s, background-color .15s, transform .1s; }
.tb-res__caja:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--est) 55%, transparent), 0 4px 12px -6px rgba(0,0,0,.18); }
.tb-res__caja:active { transform: scale(.985); }
.tb-res__caja--on { background: color-mix(in srgb, var(--est) 10%, var(--pn-superficie, #fff)); box-shadow: inset 0 0 0 2px var(--est); }
.tb-res__check { flex: none; width: 1.25rem; height: 1.25rem; border-radius: .35rem; display: grid; place-items: center; box-shadow: inset 0 0 0 1.5px var(--pn-filo-2, rgba(0,0,0,.25)); color: #fff; }
.tb-res__caja--on .tb-res__check { background: var(--est); box-shadow: none; }
.tb-res__icono { flex: none; width: 1.35rem; height: 1.35rem; color: var(--est); }
.tb-res__nom { font-weight: 600; font-size: .9rem; flex: 1; }
.tb-res__n { font-size: .75rem; font-weight: 700; color: var(--est); background: color-mix(in srgb, var(--est) 12%, transparent); border-radius: 999px; padding: .1rem .5rem; }
.tb-res__fechas { display: flex; flex-wrap: wrap; gap: .9rem; }
.tb-res__fechas label { display: grid; gap: .25rem; font-size: .8rem; font-weight: 600; }
.tb-res__barra { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .6rem; }
.tb-res__acciones { display: flex; flex-wrap: wrap; gap: .5rem; }
.tb-res__hojas { display: grid; gap: .75rem; padding: .75rem; border-radius: .85rem; background: var(--pn-fondo-2, #F1F3F4); max-height: 38rem; overflow: auto; }
.tb-res__hojas img { width: 100%; height: auto; background: #fff; border-radius: .4rem; box-shadow: 0 2px 10px -4px rgba(0,0,0,.25); }
.tb-res__marco { width: 100%; height: 38rem; border: 0; border-radius: .85rem; background: #fff; }
