/* Hoja de estilos del panel de ACV 21.
   Octubre de 2026: el mismo sistema que el gestor del equipo de ESECE
   (hoja de papel sobre el lienzo, menú lateral, barra inferior en el móvil,
   diálogos que suben desde abajo) con la piel de acv21.es: papel cálido,
   tinta azul marino, el azul de Adeslas como acento y el amarillo de su
   estrella como chispa. Fraunces habla (títulos), Instrument Sans trabaja.
   Cada bloque dice por qué es así; las fichas de la sección 1 mandan. */

/* =========================================================================
   0. TIPOGRAFÍAS
   -------------------------------------------------------------------------
   Las mismas de la web, autoalojadas en /fuentes (subconjunto latino): la
   marca se lee igual en acv21.es y en el panel, y no dependen de Google.
   ========================================================================= */
@font-face {
  font-family: 'Fraunces';
  src: url('fuentes/fraunces-display.woff2') format('woff2');
  font-weight: 300 600; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Fraunces';
  src: url('fuentes/fraunces-display-italic.woff2') format('woff2');
  font-weight: 300 500; font-style: italic; font-display: swap;
}
@font-face {
  font-family: 'Instrument Sans';
  src: url('fuentes/instrument-sans-var.woff2') format('woff2');
  font-weight: 400 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'JetBrains Mono';
  src: url('fuentes/jetbrains-mono-400.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
/* Respaldo métrico: mientras llegan las fuentes, Georgia y Arial ajustadas
   ocupan casi lo mismo y los titulares no saltan al cambiar (los de la web). */
@font-face {
  font-family: 'Fraunces Fallback';
  src: local('Georgia'), local('Times New Roman');
  size-adjust: 96%; ascent-override: 96%; descent-override: 25%;
}
@font-face {
  font-family: 'Instrument Fallback';
  src: local('Arial'), local('Helvetica');
  size-adjust: 97%; ascent-override: 98%; descent-override: 25%;
}

/* =========================================================================
   1. SISTEMA DE DISEÑO — FICHAS
   -------------------------------------------------------------------------
   Todo el color, el redondeo, la sombra, la letra y el movimiento salen de
   aquí. Los nombres son los del gestor de ESECE, así que las piezas se
   comparten; los valores son los de acv21.es. Contrastes medidos (AA):
   botón blanco sobre --marca-solida 5,65:1 · --marca sobre papel 6,1:1 ·
   --tenue sobre el lienzo 5,2:1 · --oro-texto sobre papel 5,0:1.
   ========================================================================= */
    :root {
      color-scheme: light;

      --fuente: 'Instrument Sans', 'Instrument Fallback', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
      --fuente-titulo: 'Fraunces', 'Fraunces Fallback', Georgia, 'Times New Roman', serif;
      --fuente-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace;

      /* --- Marca ---
         --marca        acento sobre fondo claro (texto, iconos, bordes activos)
         --marca-solida relleno del botón primario y lo seleccionado
         --marca-claro  tinte suave de fondo (la «niebla» de la web)
         El amarillo (--oro) es decoración: la chispa de la estrella, el carril
         de lo activo. Como texto, --oro-texto, que sí llega a AA.          */
      --marca: #0A5E8C;
      --marca-solida: #0C6DA1;
      --marca-solida-hover: #0A5E8C;
      --marca-osc: #084B70;
      --marca-claro: #E4ECF1;
      --marca-rgb: 10, 94, 140;
      --oro: #FBB81F;
      --oro-texto: #8A5D0A;
      --oro-bg: #FCF3DC;
      --oro-rgb: 251, 184, 31;

      /* --- Superficies: papel, no gris --- */
      --lienzo: #EAE3D6;
      --fondo: #F4EFE6;
      --superficie: #FFFFFF;
      --superficie-2: #FBF9F5;
      --elevado: #FFFFFF;
      --gris: #F1EBE0;
      --acento: rgba(14, 27, 44, .045);
      --acento-fuerte: rgba(14, 27, 44, .08);
      --vidrio: rgba(244, 239, 230, .84);
      --vidrio-lienzo: rgba(234, 227, 214, .86);
      --velo: rgba(11, 26, 42, .48);
      --tostada-bg: #0E1B2C; --tostada-tx: #F4EFE6; --tostada-suave: rgba(244, 239, 230, .62);
      --tostada-borde: rgba(255, 255, 255, .08); --tostada-acento: rgba(255, 255, 255, .1);
      --tostada-ok: #6fcf97; --tostada-error: #f08a7c; --tostada-aviso: #FBB81F; --tostada-info: #6CB8E4;

      /* --- Texto: tinta azul marino --- */
      --texto: #0E1B2C;
      --suave: #3B4654;
      --muted: #3B4654;
      --tenue: #545E6B;
      --sobre-marca: #FFFFFF;

      --borde: rgba(14, 27, 44, .12);
      --borde-suave: rgba(14, 27, 44, .07);
      --borde-fuerte: rgba(14, 27, 44, .22);

      /* --- Estados (par fondo / texto, AA en los dos temas) --- */
      --rojo: #B23A0F;        --rojo-bg: #FBEBE4;      --rojo-borde: rgba(178, 58, 15, .24);
      --verde: #256B2A;       --verde-bg: #E2EDDD;     --verde-borde: rgba(37, 107, 42, .26);
      --amarillo: #8A5D0A;    --amarillo-bg: #FCF0D2;  --amarillo-borde: rgba(138, 93, 10, .26);
      --azul: #0A5E8C;        --azul-bg: #E4ECF1;      --azul-borde: rgba(10, 94, 140, .24);
      --naranja: #B4460F;     --naranja-bg: #FCEFE3;   --naranja-borde: rgba(180, 70, 15, .26);
      --morado: #6E3F8E;      --morado-bg: #F1E9F6;
      --indigo: #3F46B8;      --indigo-bg: #ECEEFC;
      --turquesa: #0B6F66;    --turquesa-bg: #E2F2F0;
      --neutro: #545E6B;      --neutro-bg: #ECE7DE;
      --peligro-solido: #B23A0F;  --sobre-peligro: #FFFFFF;
      --verde-vivo: #2E9E4F;

      /* --- Avatares: cada persona, su tono (sale de su nombre) --- */
      --av-1-bg: #DCE9F2; --av-1: #0A5E8C;   /* ría */
      --av-2-bg: #E2EDDD; --av-2: #2D5F2F;   /* monte */
      --av-3-bg: #F6E3D8; --av-3: #8A3D1E;   /* teja */
      --av-4-bg: #EEE5F2; --av-4: #643A72;   /* ciruela */
      --av-5-bg: #FBEFCF; --av-5: #7A5512;   /* estrella */
      --av-6-bg: #DFF0EE; --av-6: #1D6363;   /* mar */

      --sk-base: #EBE4D8;
      --sk-brillo: #F6F1E9;
      --scroll-fondo: #EBE4D8;
      --scroll-pulgar: #A39C90;

      /* --- Redondeo (el de la web es más redondo: base 14px) --- */
      --r: .875rem;
      --r-xs: 6px;
      --r-sm: calc(var(--r) - 4px);   /* 10px */
      --r-md: calc(var(--r) - 2px);   /* 12px */
      --r-lg: var(--r);               /* 14px */
      --r-xl: calc(var(--r) + 4px);   /* 18px */
      --r-2xl: calc(var(--r) + 10px); /* 24px */
      --r-full: 999px;
      --abajo-seguro: env(safe-area-inset-bottom, 0px);

      --ancho-menu: 16.5rem;
      --alto-barra: 3.5rem;
      --margen-hoja: .5rem;

      /* --- Sombras: tinta azulada, nunca negro puro (como la web) --- */
      --sh-xs: 0 1px 2px rgba(14, 27, 44, .05);
      --sh-sm: 0 1px 2px rgba(14, 27, 44, .05), 0 2px 6px -2px rgba(14, 27, 44, .07);
      --sh-md: 0 1px 2px rgba(14, 27, 44, .04), 0 8px 18px -6px rgba(14, 27, 44, .13);
      --sh-lg: 0 2px 4px rgba(14, 27, 44, .04), 0 18px 36px -10px rgba(14, 27, 44, .2);
      --sh-xl: 0 4px 10px rgba(14, 27, 44, .05), 0 32px 72px -16px rgba(14, 27, 44, .32);
      --sh-brillo: inset 0 1px 0 rgba(255, 255, 255, .16);

      --ring: var(--marca);
      --ring-w: 3px;
      --ring-sombra: 0 0 0 var(--ring-w) rgba(var(--marca-rgb), .28);
      --ring-peligro: 0 0 0 var(--ring-w) rgba(178, 58, 15, .26);

      --ms-1: .12s;
      --ms-2: .16s;
      --ms-3: .2s;
      --ms-4: .24s;
      --ease: cubic-bezier(0, 0, .3, 1);
      --ease-sal: cubic-bezier(.7, 0, 1, 1);
      --ease-suave: cubic-bezier(.3, 0, .7, 1);
      --ease-enfasis: cubic-bezier(.16, 1, .3, 1);

      --txt--1: clamp(0.8331rem, 0.8108rem + 0.09907vw, 0.9rem);
      --txt-0:  clamp(1rem, 0.9583rem + 0.1852vw, 1.125rem);
      --txt-1:  clamp(1.2rem, 1.131rem + 0.3056vw, 1.406rem);
      --txt-2:  clamp(1.44rem, 1.334rem + 0.4713vw, 1.758rem);
      --txt-3:  clamp(1.6rem, 1.47rem + 0.6vw, 2.05rem);
      --txt-4:  clamp(1.85rem, 1.6rem + 1.1vw, 2.6rem);
      --txt-5:  clamp(2.3rem, 1.92rem + 1.7vw, 3.4rem);

      --esp-2xs: clamp(0.5rem, 0.4792rem + 0.09259vw, 0.5625rem);
      --esp-xs:  clamp(0.75rem, 0.7083rem + 0.1852vw, 0.875rem);
      --esp-s:   clamp(1rem, 0.9583rem + 0.1852vw, 1.125rem);
      --esp-m:   clamp(1.25rem, 1.083rem + 0.7407vw, 1.75rem);
      --esp-l:   clamp(2rem, 1.75rem + 1.111vw, 2.75rem);

      --grano: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
      /* La cubierta: la «noche» de la web, igual en los dos temas. */
      --cubierta: #0B1A2A;
      --cubierta-2: #12283D;
      --sobre-cubierta: #F4EFE6;
      --sobre-cubierta-suave: rgba(244, 239, 230, .74);
      --sobre-cubierta-acento: rgba(244, 239, 230, .1);
      --cubierta-sombra: rgba(0, 0, 0, .3);
      --relleno-brillo: linear-gradient(180deg, rgba(255, 255, 255, .1), rgba(255, 255, 255, 0) 55%);
    }
    @supports (color: color-mix(in oklab, black 8%, transparent)) {
      :root {
        --borde: color-mix(in oklab, #0E1B2C 12%, transparent);
        --borde-suave: color-mix(in oklab, #0E1B2C 7%, transparent);
        --borde-fuerte: color-mix(in oklab, #0E1B2C 22%, transparent);
        --acento: color-mix(in oklab, #0E1B2C 4.5%, transparent);
        --acento-fuerte: color-mix(in oklab, #0E1B2C 8%, transparent);
      }
    }

/* =========================================================================
   2. MODO OSCURO
   -------------------------------------------------------------------------
   Noche de ría, no negro: las superficies suben de luminosidad con la
   elevación (lienzo < hoja < tarjeta < diálogo).
   ========================================================================= */
    html[data-tema="oscuro"] {
      color-scheme: dark;

      --marca: #6CB8E4;
      --marca-solida: #1A5F8A;
      --marca-solida-hover: #227099;
      --marca-osc: #227099;
      --marca-claro: #13283A;
      --marca-rgb: 108, 184, 228;
      --oro: #FBB81F;
      --oro-texto: #F5C85A;
      --oro-bg: #2B2410;
      --oro-rgb: 251, 184, 31;

      --lienzo: #070F18;
      --fondo: #0B1622;
      --superficie: #101E2C;
      --superficie-2: #132334;
      --elevado: #172838;
      --gris: #142536;
      --acento: rgba(255, 255, 255, .045);
      --acento-fuerte: rgba(255, 255, 255, .085);
      --vidrio: rgba(11, 22, 34, .82);
      --vidrio-lienzo: rgba(7, 15, 24, .84);
      --velo: rgba(0, 0, 0, .62);
      --tostada-bg: #EEF1F4; --tostada-tx: #0E1B2C; --tostada-suave: rgba(14, 27, 44, .6);
      --tostada-borde: rgba(0, 0, 0, .06); --tostada-acento: rgba(0, 0, 0, .07);
      --tostada-ok: #256B2A; --tostada-error: #B23A0F; --tostada-aviso: #8A5D0A; --tostada-info: #0A5E8C;

      --texto: #E8EDF2;
      --suave: #A9B6C3;
      --muted: #A9B6C3;
      --tenue: #8D9BAA;
      --sobre-marca: #F2F8FC;

      --borde: rgba(255, 255, 255, .1);
      --borde-suave: rgba(255, 255, 255, .06);
      --borde-fuerte: rgba(255, 255, 255, .19);

      --rojo: #F08A7C;        --rojo-bg: #351D1A;      --rojo-borde: rgba(240, 138, 124, .28);
      --verde: #7FCB8A;       --verde-bg: #15291A;     --verde-borde: rgba(127, 203, 138, .28);
      --amarillo: #F5C85A;    --amarillo-bg: #302614;  --amarillo-borde: rgba(245, 200, 90, .28);
      --azul: #6CB8E4;        --azul-bg: #13283A;      --azul-borde: rgba(108, 184, 228, .28);
      --naranja: #F59A6A;     --naranja-bg: #33210F;   --naranja-borde: rgba(245, 154, 106, .3);
      --morado: #C793E3;      --morado-bg: #2A1C36;
      --indigo: #A3ACF7;      --indigo-bg: #1C1F3D;
      --turquesa: #62CBBD;    --turquesa-bg: #0F2B29;
      --neutro: #A6B2BF;      --neutro-bg: #1C2A38;
      --peligro-solido: #C2412F;  --sobre-peligro: #FFFFFF;
      --verde-vivo: #3CCF7A;

      --av-1-bg: #13283A; --av-1: #9CCDEB;
      --av-2-bg: #1B2D1D; --av-2: #A6D3AC;
      --av-3-bg: #3A2219; --av-3: #F0B39C;
      --av-4-bg: #33213A; --av-4: #DCB0DE;
      --av-5-bg: #352A14; --av-5: #E6C27E;
      --av-6-bg: #163231; --av-6: #8FD3CF;

      --sk-base: #172838;
      --sk-brillo: #20354A;
      --scroll-fondo: #132334;
      --scroll-pulgar: #3B5064;

      --sh-xs: 0 1px 2px rgba(0, 0, 0, .35);
      --sh-sm: 0 1px 3px rgba(0, 0, 0, .4);
      --sh-md: 0 6px 16px -4px rgba(0, 0, 0, .5);
      --sh-lg: 0 16px 32px -8px rgba(0, 0, 0, .55);
      --sh-xl: 0 28px 64px -12px rgba(0, 0, 0, .65);
      --sh-brillo: inset 0 1px 0 rgba(255, 255, 255, .08);

      --ring-sombra: 0 0 0 var(--ring-w) rgba(var(--marca-rgb), .36);
      --ring-peligro: 0 0 0 var(--ring-w) rgba(240, 138, 124, .32);

      --cubierta: #08131F;
      --cubierta-2: #0F2234;
    }
    @supports (color: color-mix(in oklab, black 8%, transparent)) {
      html[data-tema="oscuro"] {
        --borde: color-mix(in oklab, #ffffff 10%, transparent);
        --borde-suave: color-mix(in oklab, #ffffff 6%, transparent);
        --borde-fuerte: color-mix(in oklab, #ffffff 19%, transparent);
        --acento: color-mix(in oklab, #ffffff 4.5%, transparent);
        --acento-fuerte: color-mix(in oklab, #ffffff 8.5%, transparent);
      }
    }

/* =========================================================================
   3. BASE
   ========================================================================= */
    * { box-sizing: border-box; margin: 0; padding: 0; }
    html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; background: var(--fondo); }
    body {
      font-family: var(--fuente);
      font-size: 16px;
      line-height: 1.5;
      background: var(--fondo);
      color: var(--texto);
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-rendering: optimizeLegibility;
      font-optical-sizing: auto;
      transition: background-color var(--ms-3) var(--ease), color var(--ms-3) var(--ease);
    }
    a { color: var(--marca); text-decoration-thickness: from-font; text-underline-offset: .18em; }
    button { font-family: inherit; cursor: pointer; color: inherit; }
    input, select, textarea { font-family: inherit; font-size: .95rem; color: inherit; }
    /* Los números alineados en columna (importes, contadores, horas) solo se
       comparan de un vistazo si todas las cifras ocupan lo mismo. */
    td, th, .num, .k-val, .stat .num, .md-count .n, .calc-tot b, .col-count, .badge, .kpi-n, time {
      font-variant-numeric: tabular-nums;
    }
    h1, h2, h3, h4 { line-height: 1.2; letter-spacing: -.012em; font-weight: 650; }
    ::selection { background: rgba(var(--marca-rgb), .2); }
    hr, .separador { border: none; border-top: 1px solid var(--borde); margin: 1rem 0; }
    code, kbd, .mono { font-family: var(--fuente-mono); }
    .mono { font-size: .92em; }

    /* --- Anillo de foco global (reui / coss) -----------------------------
       :focus-visible solo se dispara con teclado, así que el ratón no deja
       anillos por toda la pantalla, pero navegar con Tab nunca se pierde. */
    :focus-visible {
      outline: none;
      box-shadow: var(--ring-sombra);
      position: relative;
      z-index: 1;
    }
    /* Cada cosa conserva su redondeo con el anillo puesto (antes «inherit»
       le daba el del padre: un campo enfocado se quedaba con esquinas
       rectas). Solo lo que no tiene redondeo propio recibe uno pequeño. */
    a:focus-visible, summary:focus-visible, [tabindex]:focus-visible { border-radius: var(--r-xs); }

    /* Saltar al contenido: primera parada del tabulador, invisible hasta que
       recibe el foco. Sin esto, el teclado recorre todo el menú en cada vista. */
    .saltar {
      position: fixed; top: -100px; left: 50%; transform: translateX(-50%);
      z-index: 300; background: var(--elevado); color: var(--marca);
      border: 1px solid var(--marca); border-radius: 0 0 var(--r-md) var(--r-md);
      padding: .6rem 1.1rem; font-weight: 600; font-size: .9rem; text-decoration: none;
      transition: top var(--ms-2) var(--ease);
    }
    .saltar:focus { top: 0; }

    /* Quien pide menos movimiento en el sistema recibe la app entera quieta:
       sin deslizamientos, sin brillos y sin desplazamiento suave. */
    @media (prefers-reduced-motion: reduce) {
      *, *::before, *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
        scroll-behavior: auto !important;
      }
    }

/* =========================================================================
   3b. MARCA
   -------------------------------------------------------------------------
   La brújula de acv21.es: cuadrado azul Adeslas, la aguja blanca y el punto
   amarillo de la estrella. El nombre, como en la web: «ACV21» de palo y
   «asesores» en Fraunces cursiva. Va en la entrada, el menú y el móvil.
   ========================================================================= */
    .sello { display: inline-flex; flex: none; width: 2.2rem; height: 2.2rem; }
    .sello svg { width: 100%; height: 100%; display: block; overflow: visible; }
    .sello .s-fondo { fill: #0F77AE; }
    html[data-tema="oscuro"] .sello .s-fondo { fill: #1B6E9E; }
    .sello .s-aro { fill: none; stroke: #fff; stroke-width: .7; opacity: .28; }
    .sello .s-marcas { stroke: #fff; stroke-width: 1; stroke-linecap: round; opacity: .5; }
    .sello .s-aguja { fill: #fff; }
    .sello .s-sombra { fill: #fff; fill-opacity: .32; }
    .sello .s-punto { fill: var(--oro); }
    .sello .s-giro { transform-origin: 22px 22px; transition: transform .7s var(--ease-enfasis); }
    .marca-txt { display: flex; flex-direction: column; line-height: 1.02; min-width: 0; }
    .marca-txt b { font-weight: 650; font-size: 1.12rem; letter-spacing: -.02em; color: var(--texto); white-space: nowrap; }
    .marca-txt b i {
      font-family: var(--fuente-titulo); font-style: italic; font-weight: 380; font-synthesis: none;
      letter-spacing: -.01em; color: var(--marca); margin-left: .12em;
    }
    .marca-txt small {
      font-family: var(--fuente-mono); font-size: .6rem; font-weight: 400; letter-spacing: .1em;
      text-transform: uppercase; color: var(--tenue); margin-top: .34rem; white-space: nowrap;
    }

/* =========================================================================
   3c. ENTRADA
   -------------------------------------------------------------------------
   Dos mitades: la cubierta, en el verde de la marca con un mapa de curvas de
   nivel que se mueve despacio (la ría vista desde arriba), y el formulario
   sobre papel. En el móvil la cubierta se queda en una franja con el sello
   y el formulario sube: lo primero que ve el pulgar es dónde escribir.
   ========================================================================= */
    #login {
      min-height: 100vh; min-height: 100dvh; display: flex; align-items: stretch;
      background: var(--fondo);
    }
    .login-cubierta {
      position: relative; flex: 1 1 52%; overflow: hidden; isolation: isolate;
      display: flex; flex-direction: column; justify-content: space-between;
      padding: clamp(2rem, 4vw, 3.5rem);
      background:
        radial-gradient(120% 90% at 85% 10%, rgba(var(--oro-rgb), .16), transparent 55%),
        radial-gradient(90% 80% at 0% 100%, var(--cubierta-sombra), transparent 60%),
        var(--cubierta);
      color: var(--sobre-cubierta);
    }
    /* El grano: sin él, el verde es un plano de plantilla. */
    .login-cubierta::after {
      content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
      background-image: var(--grano); background-size: 180px; opacity: .09; mix-blend-mode: overlay;
    }
    .login-curvas {
      position: absolute; inset: -10% -20% -10% -10%; z-index: -1; width: 130%; height: 120%;
      color: var(--oro); opacity: .5; pointer-events: none;
    }
    .login-curvas path { fill: none; stroke: currentColor; stroke-width: 1; vector-effect: non-scaling-stroke; }
    .login-curvas path:nth-child(3n) { opacity: .55; }
    .login-curvas path:nth-child(3n+1) { opacity: .3; }
    .login-curvas g { animation: deriva 38s ease-in-out infinite alternate; transform-origin: 60% 50%; }
    @keyframes deriva { from { transform: translate3d(0, 0, 0) rotate(0deg); } to { transform: translate3d(-3%, 2%, 0) rotate(-2.5deg); } }
    .login-cab { display: flex; align-items: center; gap: .8rem; }
    .login-cab .sello { width: 2.6rem; height: 2.6rem; }
    .login-cab .sello .s-fondo { fill: var(--sobre-cubierta-acento); }
    .login-cab .marca-txt b { color: var(--sobre-cubierta); font-size: 1.55rem; }
    .login-cab .marca-txt small { color: var(--sobre-cubierta-suave); }
    .login-lema { max-width: 34rem; }
    .login-lema h1 {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: clamp(2.6rem, 1.6rem + 3.2vw, 4.6rem); line-height: .98; letter-spacing: -.02em;
      text-wrap: balance;
    }
    .login-lema h1 em { font-style: italic; color: var(--oro); }
    .login-lema p { margin-top: 1.1rem; max-width: 26rem; font-size: 1.02rem; line-height: 1.55; color: var(--sobre-cubierta-suave); text-wrap: pretty; }
    .login-areas { display: flex; flex-wrap: wrap; gap: .45rem; margin-top: 1.6rem; list-style: none; }
    .login-areas li {
      font-size: .78rem; font-weight: 500; letter-spacing: .02em;
      padding: .3rem .75rem; border-radius: var(--r-full);
      border: 1px solid rgba(var(--oro-rgb), .38); color: var(--sobre-cubierta);
      background: var(--sobre-cubierta-acento);
    }
    .login-pie { font-size: .78rem; color: var(--sobre-cubierta-suave); letter-spacing: .02em; }

    .login-lado {
      flex: 1 1 48%; display: flex; align-items: center; justify-content: center;
      padding: clamp(1.5rem, 4vw, 3rem); position: relative;
    }
    #login .card {
      position: relative; z-index: 1; background: none; border: 0; box-shadow: none;
      padding: 0; max-width: 23.5rem; animation: sube var(--ms-4) var(--ease-enfasis) both;
    }
    .login-tit {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: var(--txt-4); line-height: 1.05; letter-spacing: -.015em; margin-bottom: .35rem;
    }
    .login-sub { color: var(--suave); margin-bottom: 1.8rem; font-size: .95rem; }
    .login-recordar { display: flex; align-items: center; gap: .55rem; font-weight: 500; font-size: .88rem; margin: .1rem 0 1.2rem; cursor: pointer; color: var(--texto); }
    .login-nota { margin-top: .75rem; text-align: center; font-size: .8rem; }
    .login-enlaces { margin-top: 1.6rem; padding-top: 1.2rem; border-top: 1px solid var(--borde); display: flex; flex-direction: column; gap: .35rem; text-align: center; font-size: .85rem; }
    .login-enlaces a { color: var(--marca); font-weight: 600; text-decoration: none; }
    .login-enlaces a:hover { text-decoration: underline; }
    @keyframes sube { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

    @media (max-width: 820px) {
      #login { flex-direction: column; }
      .login-cubierta { flex: none; padding: max(1.4rem, env(safe-area-inset-top)) 1.25rem 1.6rem; min-height: 15.5rem; }
      .login-lema h1 { font-size: 2.45rem; }
      .login-lema p, .login-areas, .login-pie { display: none; }
      .login-lado { flex: 1; align-items: flex-start; padding: 1.75rem 1.25rem calc(1.5rem + var(--abajo-seguro)); }
      #login .card { max-width: none; }
      .login-tit { font-size: 2rem; }
    }

    /* Tarjeta suelta (la usa establecer-password.html). */
    .card { background: var(--elevado); border: 1px solid var(--borde-suave); border-radius: var(--r-2xl); box-shadow: var(--sh-xl); padding: 2.2rem; width: 100%; max-width: 410px; }
    .logo { display: flex; align-items: center; justify-content: center; gap: .65rem; font-family: var(--fuente-titulo); font-weight: 400; font-size: 1.9rem; color: var(--texto); text-align: center; letter-spacing: .02em; }
    .sub { text-align: center; color: var(--suave); font-size: .82rem; letter-spacing: .08em; text-transform: uppercase; margin: .2rem 0 1.6rem; }
    label { display: block; font-size: .8rem; font-weight: 600; margin-bottom: .4rem; color: var(--texto); letter-spacing: .005em; }

/* =========================================================================
   4. CAMPOS DE FORMULARIO
   ------------------------------------------------------------------------- */
    .inp {
      width: 100%; padding: .66rem .8rem; margin-bottom: 1rem; line-height: 1.4;
      background: var(--superficie); color: var(--texto);
      border: 1px solid var(--borde); border-radius: var(--r-md);
      box-shadow: var(--sh-xs);
      transition: border-color var(--ms-1) var(--ease), box-shadow var(--ms-1) var(--ease), background-color var(--ms-1) var(--ease);
    }
    .inp::placeholder { color: var(--tenue); }
    /* El anillo es sombra, no outline: aparece sin empujar nada de sitio. */
    .inp:focus, .inp:focus-visible { outline: none; border-color: var(--ring); box-shadow: var(--ring-sombra); }
    .inp:hover:not(:focus):not(:disabled) { border-color: var(--borde-fuerte); }
    .inp:disabled, .inp[readonly] { background: var(--gris); color: var(--suave); cursor: not-allowed; box-shadow: none; }
    .inp[aria-invalid="true"], .inp.error { border-color: var(--rojo); }
    .inp[aria-invalid="true"]:focus, .inp.error:focus { box-shadow: var(--ring-peligro); }
    /* Fecha y hora encajan en su hueco como los demás campos. */
    input[type="date"].inp, input[type="time"].inp { min-width: 0; max-width: 100%; display: block; }
    /* En el iPhone miden lo que su texto y no el 100 %, así que se salían del
       ancho. Sin el aspecto nativo sí encajan; el valor va a la izquierda como
       en el resto, y con alto mínimo porque vacíos se aplastan. Solo iOS
       (-webkit-touch-callout): en los demás el aspecto nativo ya encaja. */
    @supports (-webkit-touch-callout: none) {
      input[type="date"].inp, input[type="time"].inp { -webkit-appearance: none; appearance: none; min-height: calc(1.2em + 1.4rem + 2px); }
      input[type="date"].inp::-webkit-date-and-time-value,
      input[type="time"].inp::-webkit-date-and-time-value { text-align: left; }
    }
    select.inp { appearance: none; -webkit-appearance: none; padding-right: 2.1rem;
      background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' fill='none' stroke='%236b7280' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
      background-repeat: no-repeat; background-position: right .7rem center; }

    /* Texto de ayuda y de error bajo un campo (patrón "Field" de coss-com-ui):
       la explicación vive junto al campo, no en un tostado que se va solo. */
    .field-hint { font-size: .78rem; color: var(--suave); margin: -.75rem 0 1rem; }
    .field-error { font-size: .78rem; color: var(--rojo); font-weight: 600; margin: -.75rem 0 1rem; display: flex; align-items: center; gap: .3rem; }

    /* Grupo de campo con icono o botón pegado dentro del recuadro
       ("Input Group"): el icono va dentro del campo, no al lado. */
    .inp-grupo { position: relative; display: block; }
    .inp-grupo .inp { margin-bottom: 1rem; }
    .inp-grupo > .ig-ico {
      position: absolute; left: .75rem; top: .72rem; width: 18px; height: 18px;
      color: var(--tenue); pointer-events: none;
      z-index: 2;   /* el campo enfocado sube a z-index 1 (anillo global) y lo tapaba */
    }
    .inp-grupo > .ig-ico ~ .inp { padding-left: 2.35rem; }
    .inp-grupo > .ig-btn {
      position: absolute; right: .3rem; top: .3rem;
      display: inline-flex; align-items: center; justify-content: center;
      width: 34px; height: 34px; padding: 0;
      background: none; border: none; border-radius: var(--r-sm);
      color: var(--suave); cursor: pointer;
    }
    .inp-grupo > .ig-btn:hover { background: var(--acento); color: var(--texto); }
    .inp-grupo:focus-within > .ig-ico { color: var(--marca); }

    /* Campo con sugerencias ("Combobox"): la lista flota bajo el campo, sin
       empujar el resto del formulario mientras se escribe. El margen pasa del
       campo al contenedor para que la lista salga pegada al borde. */
    .combo { position: relative; margin-bottom: 1rem; }
    .combo > .inp { margin-bottom: 0; }
    .combo-lista {
      position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 5;
      max-height: min(17rem, 45vh); overflow-y: auto; overscroll-behavior: contain;
      padding: .3rem; background: var(--elevado);
      border: 1px solid var(--borde); border-radius: var(--r-lg); box-shadow: var(--sh-lg);
      animation: despliega var(--ms-2) var(--ease-enfasis);
    }
    @keyframes despliega { from { opacity: 0; transform: translateY(-4px) scale(.99); } to { opacity: 1; transform: none; } }
    .combo-op {
      display: flex; flex-direction: column; gap: .1rem;
      padding: .5rem .65rem; border-radius: var(--r-sm); cursor: pointer;
    }
    .combo-op[aria-selected="true"] { background: var(--marca-claro); color: var(--marca); }
    @media (hover: hover) { .combo-op:hover { background: var(--acento); } }
    .combo-nombre { font-weight: 600; font-size: .9rem; }
    .combo-meta { font-size: .78rem; color: var(--suave); }
    .combo-meta:empty { display: none; }

    /* Atajo bajo un campo de fecha ("+10 hábiles") y la explicación de qué
       ha calculado, para que nadie tenga que fiarse de un número a ciegas. */
    .atajo-plazo { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem .6rem; margin: -.5rem 0 1rem; }
    .atajo-plazo .field-hint { margin: 0; }
    .atajo-plazo .field-hint:empty { display: none; }

    /* Casillas e interruptores nativos, teñidos de marca en vez de azul
       sistema, y con el tamaño mínimo que un dedo acierta. */
    input[type="checkbox"], input[type="radio"] {
      accent-color: var(--marca); width: 1.05rem; height: 1.05rem; cursor: pointer;
    }

/* =========================================================================
   5. BOTONES
   -------------------------------------------------------------------------
   Familia con las mismas medidas y estados para todas las variantes, como en
   reui.io: relleno (primario), contorno (secundario), fantasma, y peligro.
   El relleno lleva un brillo interior de 1px arriba —el truco de coss-com-ui
   para que un botón sólido tenga volumen sin dibujarle un degradado visible—
   y se hunde 1px al pulsarlo, que es la única confirmación táctil que hay.
   ========================================================================= */
    .btn, .btn-sec, .btn-peligro, .btn-fantasma {
      display: inline-flex; align-items: center; justify-content: center; gap: .45rem;
      border-radius: var(--r-md); font-weight: 600; font-size: .92rem; line-height: 1.2; letter-spacing: .005em;
      padding: .68rem 1.05rem; border: 1px solid transparent; white-space: nowrap;
      text-decoration: none; cursor: pointer; position: relative;
      transition: background-color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease),
                  box-shadow var(--ms-1) var(--ease), transform var(--ms-1) var(--ease),
                  color var(--ms-1) var(--ease);
    }
    .btn svg, .btn-sec svg, .btn-peligro svg, .btn-fantasma svg { width: 1.05em; height: 1.05em; flex-shrink: 0; }

    /* Primario: azul Adeslas con un brillo de arriba abajo, el borde un punto
       más oscuro y la sombra pegada. Es el único botón con color de la
       pantalla; si hay dos, uno sobra. */
    .btn {
      background-color: var(--marca-solida); background-image: var(--relleno-brillo);
      color: var(--sobre-marca); border-color: var(--marca-solida-hover);
      box-shadow: var(--sh-brillo), var(--sh-xs);
    }
    .btn:hover:not(:disabled) { background-color: var(--marca-solida-hover); box-shadow: var(--sh-brillo), var(--sh-sm); }

    /* Secundario: papel con borde, letra de tinta. Neutro a propósito: el
       color se reserva para lo principal y para los estados. */
    .btn-sec { background: var(--superficie); color: var(--texto); border-color: var(--borde); box-shadow: var(--sh-xs); padding: .56rem .9rem; }
    .btn-sec:hover:not(:disabled) { background: var(--gris); border-color: var(--borde-fuerte); }
    .btn-sec svg { color: var(--suave); }

    .btn-peligro {
      background-color: var(--peligro-solido); background-image: var(--relleno-brillo);
      color: var(--sobre-peligro); box-shadow: var(--sh-brillo), var(--sh-xs);
    }
    .btn-peligro:hover:not(:disabled) { filter: brightness(1.08); }
    .btn-peligro:focus-visible { box-shadow: var(--ring-peligro); }

    .btn-fantasma { background: none; color: var(--texto); padding: .56rem .9rem; }
    /* .btn.ghost: botón de poco peso, que se pinta como el secundario. */
    .btn.ghost { background: var(--superficie); background-image: none; color: var(--texto); border-color: var(--borde); box-shadow: var(--sh-xs); }
    .btn.ghost:hover:not(:disabled) { background: var(--gris); border-color: var(--borde-fuerte); box-shadow: var(--sh-xs); }
    .btn-fantasma:hover:not(:disabled) { background: var(--acento); }



    .btn:disabled, .btn-sec:disabled, .btn-peligro:disabled, .btn-fantasma:disabled,
    .btn[aria-disabled="true"] { opacity: .55; cursor: not-allowed; box-shadow: none; transform: none; }

    .btn-sm { padding: .4rem .7rem; font-size: .84rem; border-radius: var(--r-sm); gap: .35rem; }
    .btn-lg { padding: .86rem 1.3rem; font-size: .98rem; border-radius: var(--r-lg); }
    .btn-block { width: 100%; }
    /* Botón cuadrado de solo icono: sin esto el icono queda descentrado por
       el relleno horizontal heredado. */
    .btn-ico { padding: 0; width: 2.4rem; height: 2.4rem; }
    .btn-ico.btn-sm { width: 2rem; height: 2rem; }

    /* Estado "cargando": el botón se bloquea, mantiene su ancho (para que la
       fila no dé un salto) y cambia su contenido por un girador. Lo activa
       app.js con cargando(btn, true/false). */
    .btn.cargando, .btn-sec.cargando, .btn-peligro.cargando { color: transparent !important; pointer-events: none; }
    .btn.cargando::after, .btn-sec.cargando::after, .btn-peligro.cargando::after {
      content: ''; position: absolute; top: 50%; left: 50%;
      width: 1.05em; height: 1.05em; margin: -.525em 0 0 -.525em;
      border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%;
      color: var(--sobre-marca); animation: girar .6s linear infinite;
    }
    .btn-sec.cargando::after { color: var(--marca); }
    @keyframes girar { to { transform: rotate(360deg); } }

    /* Girador suelto, para cargas dentro de un panel. */
    .spinner {
      display: inline-block; width: 1.1em; height: 1.1em; vertical-align: -.15em;
      border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%;
      opacity: .7; animation: girar .6s linear infinite;
    }

/* =========================================================================
   6. AVISOS EN LÍNEA
   ------------------------------------------------------------------------- */
    .msg {
      font-size: .9rem; padding: .7rem .85rem; border-radius: var(--r-md);
      margin-bottom: 1rem; display: none; border: 1px solid transparent;
    }
    .msg.error { background: var(--rojo-bg); color: var(--rojo); border-color: var(--rojo-borde); display: block; }
    .msg.ok { background: var(--verde-bg); color: var(--verde); border-color: var(--verde-borde); display: block; }
    .msg.info { background: var(--azul-bg); color: var(--azul); border-color: var(--azul-borde); display: block; }
    .msg.aviso { background: var(--amarillo-bg); color: var(--amarillo); border-color: var(--amarillo-borde); display: block; }

/* =========================================================================
   ARMAZÓN DE LA APP
   -------------------------------------------------------------------------
   Escritorio: el menú lateral va sobre el lienzo, a la izquierda y fijo, y
   cada sección se pinta en una hoja de papel que flota con un margen de
   medio rem y las esquinas redondeadas. La hoja no tiene desplazamiento
   propio (lo tiene la ventana, como siempre: el chat, las tablas y
   Mi día cuentan con ello): el marco es una capa fija por encima, con un
   hueco redondeado del tamaño de la hoja, y lo de fuera lo tapa el lienzo.
   El contenido pasa por debajo de las esquinas, como en una ventana.

   Móvil: no hay menú lateral ni marco. Cabecera arriba, barra inferior con
   lo frecuente y la hoja «Más» con todo lo demás.
   ========================================================================= */
    #app { display: none; min-height: 100vh; }

    /* --- Cabecera ----------------------------------------------------------
       En escritorio es la barra de la hoja: dónde estás (sección y apartado)
       y quién eres. En el móvil, el sello y los atajos. Vidrio esmerilado: el
       contenido se intuye al pasar por debajo, que es lo que dice que la
       barra está encima y no es parte de la página.                       */
    header.top {
      position: sticky; top: 0; z-index: 50;
      display: flex; align-items: center; gap: .75rem;
      min-height: var(--alto-barra);
      padding: max(.55rem, env(safe-area-inset-top)) var(--esp-m) .55rem;
      background: var(--vidrio);
      border-bottom: 1px solid var(--borde-suave);
      -webkit-backdrop-filter: saturate(1.6) blur(14px);
      backdrop-filter: saturate(1.6) blur(14px);
    }
    header.top .brand { display: flex; align-items: center; gap: .6rem; min-width: 0; text-decoration: none; color: inherit; }
    header.top .brand .sello { width: 1.9rem; height: 1.9rem; }
    header.top .brand .marca-txt small { display: none; }
    .top-ruta {
      display: flex; align-items: center; gap: .45rem; min-width: 0; flex: 1;
      font-size: .9rem; color: var(--tenue); white-space: nowrap;
    }
    .top-ruta #top-grupo:empty, .top-ruta #top-grupo:empty + .top-barra { display: none; }
    .top-barra { color: var(--borde-fuerte); font-weight: 300; }
    #top-titulo { color: var(--texto); font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
    header.top .me { display: flex; align-items: center; gap: .4rem; flex-shrink: 0; margin-left: auto; font-size: .85rem; }
    .top-ico {
      display: inline-flex; align-items: center; justify-content: center; flex: none;
      width: 2.25rem; height: 2.25rem; padding: 0; border-radius: var(--r-md);
      border: 1px solid transparent; background: none; color: var(--suave);
      transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease);
    }
    .top-ico:hover { background: var(--acento); color: var(--texto); }
    .top-ico svg { width: 1.15rem; height: 1.15rem; }
    .top-yo {
      display: inline-flex; align-items: center; gap: .55rem; padding: .2rem .55rem .2rem .2rem;
      border: 1px solid transparent; border-radius: var(--r-full); background: none; text-decoration: none; color: inherit;
      transition: background-color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease);
    }
    .top-yo:hover { background: var(--acento); }
    .top-yo .avatar { width: 30px; height: 30px; font-size: .72rem; }
    .top-yo-txt { display: flex; flex-direction: column; line-height: 1.15; text-align: left; }
    #me-nombre { font-weight: 600; color: var(--texto); font-size: .85rem; white-space: nowrap; }
    header.top .rol { font-size: .68rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--tenue); }
    .top-sep { width: 1px; height: 1.4rem; background: var(--borde); margin: 0 .25rem; }
    #logout { gap: .4rem; }
    #logout svg { width: 1rem; height: 1rem; }

    /* --- Menú lateral ------------------------------------------------------ */
    .side { display: none; }
    .side-marca {
      display: flex; align-items: center; gap: .7rem; text-decoration: none; color: inherit;
      padding: .25rem .5rem; border-radius: var(--r-md); min-height: var(--alto-barra);
    }
    .side-marca:hover .sello .s-raya { transform: scaleX(1.18); }
    .sello .s-raya { transform-origin: 50% 50%; transform-box: fill-box; transition: transform var(--ms-3) var(--ease-enfasis); }
    .side-nav { display: flex; flex-direction: column; gap: 1px; padding: .5rem 0 0; flex: 1 0 auto; }
    .side-nav a {
      display: flex; align-items: center; gap: .65rem; min-height: 2.15rem;
      padding: .38rem .6rem; border-radius: var(--r-sm); border: 1px solid transparent;
      color: var(--suave); text-decoration: none; font-weight: 500; font-size: .9rem; line-height: 1.25;
      transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease), box-shadow var(--ms-1) var(--ease);
    }
    .nav-ico { display: inline-flex; flex: none; color: var(--tenue); transition: color var(--ms-1) var(--ease); }
    .nav-ico .ico { width: 1.1rem; height: 1.1rem; vertical-align: 0; }
    .nav-txt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .side-nav a:hover { background: var(--acento); color: var(--texto); }
    .side-nav a:hover .nav-ico { color: var(--suave); }
    /* Lo activo es una ficha de papel sobre el lienzo, como la hoja de al
       lado: se ve dónde estás sin un bloque de color que grite. */
    .side-nav a.active {
      background: var(--superficie); color: var(--texto); font-weight: 600;
      border-color: var(--borde-suave); box-shadow: var(--sh-xs);
    }
    .side-nav a.active .nav-ico { color: var(--marca); }
    .side-nav .nav-sep {
      display: flex; align-items: center; justify-content: space-between; gap: .4rem;
      margin: 1.05rem 0 .2rem; padding: .3rem .6rem; border-radius: var(--r-sm);
      font-size: .68rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase;
      color: var(--tenue); cursor: pointer; user-select: none;
      transition: color var(--ms-1) var(--ease), background-color var(--ms-1) var(--ease);
    }
    .side-nav .nav-sep:hover { color: var(--texto); background: var(--acento); }
    .side-nav .nav-caret { display: inline-flex; opacity: .7; transition: transform var(--ms-2) var(--ease); }
    .side-nav .nav-caret .ico { width: .9rem; height: .9rem; }
    .side-nav .nav-sep.collapsed .nav-caret { transform: rotate(-90deg); }
    .side-nav .nav-group { display: flex; flex-direction: column; gap: 1px; }
    .side-nav .nav-group.collapsed { display: none; }
    .side-nav .nav-spacer { height: .9rem; }
    .side-nav .kbd { margin-left: auto; }

    /* Contador: rojo porque es lo único del menú que pide hacer algo ya. */
    .badge {
      display: inline-flex; align-items: center; justify-content: center; flex: none;
      min-width: 1.3rem; height: 1.3rem; padding: 0 .38rem; margin-left: auto;
      background: var(--peligro-solido); color: var(--sobre-peligro);
      border-radius: var(--r-full); font-size: .7rem; font-weight: 600; line-height: 1; letter-spacing: 0;
    }

    main { flex: 1; min-width: 0; width: 100%; padding: var(--esp-m) clamp(1.25rem, 2.6vw, 2.75rem) var(--esp-l); }  /* fluido: usa todo el ancho disponible. min-width:0 confina el scroll de tablas anchas al panel, no a la página */
    .layout { display: flex; min-height: calc(100vh - var(--alto-barra)); }

    /* Al cambiar de sección, lo nuevo sube un poco al aparecer: se nota que
       ha cambiado sin hacer esperar a nadie (app.js pone .entra 240 ms). */
    #main.entra > * { animation: aparece var(--ms-4) var(--ease-enfasis) both; }
    #main.entra > *:nth-child(2) { animation-delay: 30ms; }
    #main.entra > *:nth-child(3) { animation-delay: 60ms; }
    #main.entra > *:nth-child(n+4) { animation-delay: 90ms; }
    @keyframes aparece { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
    /* El chat mide su alto al pintarse (--chat-arriba): sin
       desplazamiento, solo fundido, para que la medida no salga 6px corta. */
    #main.entra > .chat { animation-name: funde; }
    @keyframes funde { from { opacity: 0; } to { opacity: 1; } }

    /* En una pantalla de portátil pequeño el menú cede un poco de ancho. */
    @media (min-width: 821px) and (max-width: 1180px) { :root { --ancho-menu: 14.5rem; } }
    @media (min-width: 821px) {
      #app { padding: var(--margen-hoja) var(--margen-hoja) 0 var(--ancho-menu); background: var(--fondo); }
      html { background: var(--lienzo); }
      .side {
        display: flex; flex-direction: column;
        position: fixed; left: 0; top: 0; bottom: 0; z-index: 75; width: var(--ancho-menu);
        padding: var(--margen-hoja) .75rem 1rem;
        background: var(--lienzo); overflow-y: auto; overscroll-behavior: contain;
        scrollbar-width: thin; scrollbar-color: var(--scroll-pulgar) transparent;
      }
      /* La hoja: el marco tapa con el lienzo todo lo que cae fuera de un
         rectángulo redondeado. Capa decorativa, no recoge clics. */
      #app::after {
        content: ''; position: fixed; z-index: 70; pointer-events: none;
        top: var(--margen-hoja); right: var(--margen-hoja); bottom: var(--margen-hoja); left: var(--ancho-menu);
        border-radius: var(--r-xl);
        box-shadow: 0 0 0 1px var(--borde-suave), 0 0 0 100vmax var(--lienzo);
      }
      header.top { top: var(--margen-hoja); padding: 0 clamp(1.25rem, 2.6vw, 2.75rem); }
      header.top .brand { display: none; }
      #top-buscar { display: none; }
    }
    /* En el móvil la cabecera es la cubierta verde, como la franja de la
       entrada: la app del iPhone pinta la barra de estado en blanco encima
       (black-translucent), así que debajo tiene que haber algo oscuro. */
    @media (max-width: 820px) {
      header.top {
        padding-left: 1rem; padding-right: .5rem; gap: .5rem;
        background: var(--cubierta); color: var(--sobre-cubierta); border-bottom: 0;
        -webkit-backdrop-filter: none; backdrop-filter: none;
      }
      header.top::after {
        content: ''; position: absolute; inset: 0; pointer-events: none;
        background-image: var(--grano); background-size: 180px; opacity: .07; mix-blend-mode: overlay;
      }
      header.top .brand .sello .s-fondo { fill: var(--sobre-cubierta-acento); }
      header.top .marca-txt b { color: var(--sobre-cubierta); }
      header.top .top-ico, header.top #logout { color: var(--sobre-cubierta-suave); }
      header.top .top-ico:hover, header.top #logout:hover { background: var(--sobre-cubierta-acento); color: var(--sobre-cubierta); }
      header.top .top-yo .avatar { box-shadow: 0 0 0 2px var(--sobre-cubierta-acento); }
      .top-ruta { display: none; }
      .top-yo-txt, .top-sep, #logout .logout-txt { display: none; }
      .top-yo { padding: .15rem; }
      #logout { width: 2.25rem; height: 2.25rem; padding: 0; border-color: transparent; background: none; box-shadow: none; color: var(--suave); }
    }

    /* ---------- CABECERA DE CADA SECCIÓN ----------
       El título en serif es la voz de la casa: una sola palabra grande
       ("Tareas", "Nóminas") orienta más que cualquier icono. La entradilla,
       en gris y con medida de lectura. */
    h2.title {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: var(--txt-4); line-height: 1.02; letter-spacing: -.014em;
      color: var(--texto); margin-bottom: .4rem;
    }
    p.lead { color: var(--suave); margin-bottom: 1.5rem; font-size: .95rem; line-height: 1.55; }
    .page-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 1rem 1.5rem; flex-wrap: wrap; margin-bottom: var(--esp-m); }
    .page-head .title { margin-bottom: .35rem; }
    .page-head > div:first-child { min-width: 0; }

    /* ---------- COMPONENTES ---------- */
    .panel {
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
      padding: clamp(1rem, .9rem + .45vw, 1.35rem); margin-bottom: var(--esp-s); box-shadow: var(--sh-xs);
    }
    /* Las tablas tienen su propio recuadro con altura limitada → la barra de scroll
       horizontal queda SIEMPRE visible abajo (antes quedaba al final de la tabla, fuera de pantalla)
       y la cabecera se mantiene fija arriba. */
    .panel:has(table.tablareg) { max-height: 72vh; overflow: auto; }
    /* Barra de desplazamiento SIEMPRE visible (en Mac está oculta por defecto). */
    .panel { scrollbar-width: thin; scrollbar-color: var(--scroll-pulgar) var(--scroll-fondo); }
    .panel::-webkit-scrollbar { height: 14px; width: 12px; -webkit-appearance: none; }
    .panel::-webkit-scrollbar-track { background: var(--scroll-fondo); }
    .panel::-webkit-scrollbar-thumb { background: var(--scroll-pulgar); border-radius: var(--r-full); border: 3px solid var(--scroll-fondo); }
    .panel::-webkit-scrollbar-thumb:hover { background: var(--marca-solida); }
    .panel::-webkit-scrollbar-corner { background: var(--scroll-fondo); }
    .row { display: flex; gap: .85rem; flex-wrap: wrap; }
    .row > * { flex: 1; min-width: 160px; }
    .field { margin-bottom: 1rem; }
    textarea.inp { resize: vertical; min-height: 84px; line-height: 1.5; }
    .toolbar { display: flex; gap: .65rem; flex-wrap: wrap; align-items: end; margin-bottom: 1.25rem; }
    .toolbar > button { min-height: calc(2.65rem + 2px); }  /* misma altura que los .inp para alinear "Limpiar" */
    .toolbar label { color: var(--suave); font-weight: 500; font-size: .78rem; }
    /* En el móvil los filtros van de dos en dos: en una columna, una hoja con
       seis filtros ocupaba la pantalla entera antes de la primera fila. Lo
       que no es un campo (botones, avisos, la búsqueda) va a lo ancho. */
    @media (max-width: 600px) {
      .toolbar { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: end; gap: .6rem .55rem; }
      .toolbar > * { min-width: 0 !important; width: auto; flex: none; }
      .toolbar > :not(.field), .toolbar > .field:has(input[type="search"]), .toolbar > .field:has(input:not([type])),
      .toolbar > .field:has(input[type="text"]) { grid-column: 1 / -1; }
      .toolbar .field { min-width: 0; width: 100%; }
      .toolbar > button { width: 100%; }
      .row { gap: .6rem; }
      .row > * { min-width: 0; flex: 1 1 100%; }
      .stats { grid-template-columns: repeat(2, 1fr); gap: .6rem; }
      .modal { padding: 1.2rem; }
      .page-head { gap: .75rem; align-items: stretch; }
      /* Los botones de la cabecera, uno debajo de otro y todos del mismo ancho. */
      .page-head > .fila { display: grid; grid-template-columns: minmax(0, 1fr); width: 100%; }
      .page-head .btn, .page-head > .fila > .btn-sec { width: 100%; justify-content: center; }
      h2.title { font-size: 2.15rem; }
    }
    .toolbar .field, .toolbar .inp { margin-bottom: 0; }

    .item {
      border: 1px solid var(--borde); border-radius: var(--r-xl); padding: 1rem 1.1rem; margin-bottom: .75rem;
      background: var(--superficie); box-shadow: var(--sh-xs);
      transition: box-shadow var(--ms-2) var(--ease), border-color var(--ms-2) var(--ease), transform var(--ms-2) var(--ease);
    }
    .item:hover { box-shadow: var(--sh-md); border-color: var(--borde-fuerte); }
    .item.leido { opacity: .6; }
    .item .head { display: flex; justify-content: space-between; align-items: start; gap: .6rem; }
    .item .asunto { font-weight: 600; }
    .item .meta { font-size: .8rem; color: var(--suave); margin-top: .15rem; }
    .item .cuerpo { margin: .6rem 0; white-space: pre-wrap; }
    .item .acciones { display: flex; gap: .5rem; flex-wrap: wrap; }
    .item .tags { display: flex; gap: .35rem; flex-wrap: wrap; }
    .item.anuncio.fijado { border-color: rgba(var(--oro-rgb), .45); background: var(--oro-bg); box-shadow: inset 3px 0 0 var(--oro), var(--sh-xs); }
    .hilo { margin-top: .7rem; border-top: 1px solid var(--borde); padding-top: .55rem; }
    .hilo > summary { cursor: pointer; font-size: .85rem; font-weight: 600; color: var(--marca); list-style: none; }
    .hilo > summary::-webkit-details-marker { display: none; }
    /* Flechas y marcas dibujadas con los mismos trazos que ico(): el SVG hace
       de máscara y el color es el del texto (currentColor). Nada de símbolos. */
    :root {
      --ico-derecha: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E");
      --ico-abajo: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
      --ico-exclama: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v10M12 20h.01'/%3E%3C/svg%3E");
      --ico-punto: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 12h.01'/%3E%3C/svg%3E");
      --ico-hecho: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
    }
    .hilo > summary::before {
      content: ''; display: inline-block; width: .75em; height: .75em; margin-right: .4rem; vertical-align: -.05em;
      background: currentColor; -webkit-mask: var(--ico-derecha) center / contain no-repeat; mask: var(--ico-derecha) center / contain no-repeat;
      transition: transform var(--ms-1) var(--ease);
    }
    .hilo[open] > summary::before { transform: rotate(90deg); }
    .hilo-body { margin-top: .7rem; }
    .resp-input { width: 100%; margin-bottom: .4rem; }

    /* Avatares de iniciales: tinte de su tono y la inicial en el mismo tono,
       más oscuro (data-tono lo pone avatar() en app.js). Sin tono, el verde
       de la casa. */
    .avatar {
      display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
      width: 38px; height: 38px; border-radius: 50%;
      background: var(--marca-solida); color: var(--sobre-marca);
      font-weight: 600; font-size: .82rem; letter-spacing: .02em; line-height: 1;
      box-shadow: inset 0 0 0 1px var(--borde-suave);
    }
    .avatar[data-tono="1"] { background: var(--av-1-bg); color: var(--av-1); }
    .avatar[data-tono="2"] { background: var(--av-2-bg); color: var(--av-2); }
    .avatar[data-tono="3"] { background: var(--av-3-bg); color: var(--av-3); }
    .avatar[data-tono="4"] { background: var(--av-4-bg); color: var(--av-4); }
    .avatar[data-tono="5"] { background: var(--av-5-bg); color: var(--av-5); }
    .avatar[data-tono="6"] { background: var(--av-6-bg); color: var(--av-6); }
    .avatar.sm { width: 26px; height: 26px; font-size: .64rem; }
    .rec-from { display: flex; align-items: center; gap: .7rem; }
    .rec-nombre { font-weight: 600; font-size: .95rem; line-height: 1.15; }
    .u-cell { display: flex; align-items: center; gap: .6rem; }

    /* Etiqueta: versalitas pequeñas con aire. La prioridad lleva además su
       punto (forma, no solo color). */
    .tag {
      display: inline-flex; align-items: center; gap: .3rem; vertical-align: middle;
      font-size: .66rem; font-weight: 600; letter-spacing: .07em; line-height: 1.5;
      padding: .12rem .5rem; border-radius: var(--r-full); text-transform: uppercase;
      background: var(--neutro-bg); color: var(--neutro); white-space: nowrap;
    }
    .tag.urgente { background: var(--rojo-bg); color: var(--rojo); }
    .tag.alta { background: var(--rojo-bg); color: var(--rojo); }
    .tag.media { background: var(--amarillo-bg); color: var(--amarillo); }
    .tag.baja { background: var(--verde-bg); color: var(--verde); }
    .tag.resuelto { background: var(--verde-bg); color: var(--verde); }
    .tag.dep { background: var(--marca-claro); color: var(--marca); }
    .tag.alta::before, .tag.media::before, .tag.baja::before, .tag.urgente::before {
      content: ''; width: .38rem; height: .38rem; border-radius: 50%; background: currentColor; flex: none;
    }

    /* ---------- KANBAN ---------- */
    .kanban { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .85rem; align-items: start; }
    /* Controles de Tareas exclusivos del móvil (los muestra la media query). */
    .tareas-f-toggle, .tabs-est { display: none; }
    /* Columnas hundidas en la hoja y tarjetas de papel encima: el tablero se
       lee como un corcho con fichas. La prioridad es un carril en el borde
       izquierdo que sigue la curva de la esquina, y además la etiqueta. */
    .col { background: var(--acento); border: 1px solid var(--borde-suave); border-radius: var(--r-xl); padding: .6rem; }
    .col-head { display: flex; align-items: center; justify-content: space-between; margin: .15rem 0 .7rem; padding: 0 .3rem; }
    .col-tit { display: flex; align-items: center; gap: .5rem; font-size: .7rem; text-transform: uppercase; letter-spacing: .09em; color: var(--suave); font-weight: 600; }
    .col-dot { width: 8px; height: 8px; border-radius: 50%; box-shadow: 0 0 0 3px var(--superficie); }
    .col-dot.pendiente { background: var(--tenue); }
    .col-dot.en_curso { background: var(--azul); }
    .col-dot.completada { background: var(--verde); }
    .col-count { background: var(--superficie); border: 1px solid var(--borde-suave); border-radius: var(--r-full); font-size: .7rem; font-weight: 600; padding: .05rem .5rem; color: var(--suave); }
    .col.drop { background: var(--marca-claro); outline: 2px dashed rgba(var(--marca-rgb), .55); outline-offset: -5px; }
    .col-body { min-height: 140px; }

    .task {
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-md);
      padding: .8rem .85rem .75rem 1rem; margin-bottom: .55rem; box-shadow: var(--sh-xs); cursor: grab;
      transition: box-shadow var(--ms-2) var(--ease), transform var(--ms-2) var(--ease), border-color var(--ms-2) var(--ease);
    }
    .task:hover { box-shadow: var(--sh-md); border-color: var(--borde-fuerte); transform: translateY(-1px); }
    .task.dragging { opacity: .45; transform: rotate(-1deg); }
    .task.prio-alta { box-shadow: inset 3px 0 0 var(--rojo), var(--sh-xs); }
    .task.prio-media { box-shadow: inset 3px 0 0 var(--amarillo), var(--sh-xs); }
    .task.prio-baja { box-shadow: inset 3px 0 0 var(--verde), var(--sh-xs); }
    .task.prio-alta:hover { box-shadow: inset 3px 0 0 var(--rojo), var(--sh-md); }
    .task.prio-media:hover { box-shadow: inset 3px 0 0 var(--amarillo), var(--sh-md); }
    .task.prio-baja:hover { box-shadow: inset 3px 0 0 var(--verde), var(--sh-md); }
    .task .t-top { display: flex; justify-content: space-between; align-items: start; gap: .6rem; }
    .task .t-tit { font-weight: 600; font-size: .93rem; line-height: 1.3; text-wrap: pretty; }
    .task .t-meta { font-size: .8rem; color: var(--suave); margin-top: .35rem; line-height: 1.45; }
    .task .t-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: .5rem; margin-top: .65rem; }
    .task .estado-sel { min-width: 0; }
    .task .t-foot + .t-foot { padding-top: .6rem; border-top: 1px solid var(--borde-suave); }
    .avatars { display: flex; }
    .avatars .avatar { width: 26px; height: 26px; font-size: .62rem; box-shadow: 0 0 0 2px var(--superficie); margin-left: -7px; }
    .avatars .avatar:first-child { margin-left: 0; }
    .due { display: inline-flex; align-items: center; gap: .3rem; font-size: .78rem; color: var(--suave); white-space: nowrap; }
    .due .ico { opacity: .8; }
    .due.overdue { color: var(--rojo); font-weight: 600; }
    .due.today { color: var(--amarillo); font-weight: 600; }
    .icon-btn {
      display: inline-flex; align-items: center; justify-content: center;
      background: var(--superficie); border: 1px solid var(--borde-suave); border-radius: var(--r-sm);
      padding: .25rem .45rem; min-height: 1.9rem; font-size: .82rem; cursor: pointer; color: var(--suave);
      transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease), transform var(--ms-1) var(--ease);
    }
    .icon-btn:hover { background: var(--gris); color: var(--texto); border-color: var(--borde); }
    .icon-btn[data-borrar]:hover, .icon-btn[title^="Borrar"]:hover, .icon-btn[title^="Eliminar"]:hover { color: var(--rojo); background: var(--rojo-bg); border-color: var(--rojo-borde); }
    .estado-sel {
      font-size: .76rem; font-weight: 500; padding: .28rem .5rem; border: 1px solid var(--borde); border-radius: var(--r-sm);
      background: var(--superficie); color: var(--texto); cursor: pointer; max-width: 220px;
    }
    .inline-sel { font-size: .78rem; padding: .26rem 1.5rem .26rem .5rem; border: 1px solid var(--borde); border-radius: var(--r-sm); background: var(--superficie); color: var(--texto); cursor: pointer; max-width: 200px; min-width: 60px; width: 100%; }
    .inline-sel:hover { border-color: rgba(var(--marca-rgb), .5); }
    /* Celda "pulsa para editar" (Organismo / Asignado): parece una casilla desplegable (borde + flecha),
       pero es ligera; el <select> real se crea al pulsar. */
    .cell-edit { display: inline-flex; align-items: center; justify-content: space-between; gap: .35rem; min-width: 96px; max-width: 165px; padding: .28rem .5rem; border: 1px solid var(--borde); border-radius: var(--r-sm); background: var(--superficie-2); cursor: pointer; font-size: .78rem; box-shadow: var(--sh-xs); }
    .cell-edit .v { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .cell-edit::after {
      content: ''; width: .75rem; height: .75rem; flex-shrink: 0; background: var(--marca);
      -webkit-mask: var(--ico-abajo) center / contain no-repeat; mask: var(--ico-abajo) center / contain no-repeat;
    }
    .cell-edit:hover { border-color: rgba(var(--marca-rgb), .5); background: var(--superficie); }
    .tipo-tag { display: inline-block; font-size: .72rem; font-weight: 600; padding: .15rem .6rem; border-radius: var(--r-full); white-space: nowrap; }
    .tipo-tag.azul { background: var(--azul-bg); color: var(--azul); }
    .tipo-tag.verde { background: var(--verde-bg); color: var(--verde); }
    .tipo-tag.ambar { background: var(--naranja-bg); color: var(--naranja); }
    .tipo-tag.morado { background: var(--morado-bg); color: var(--morado); }
    .tipo-tag.gris { background: var(--neutro-bg); color: var(--neutro); }
    .est-tag { display: inline-block; font-size: .72rem; font-weight: 600; padding: .15rem .6rem; border-radius: var(--r-full); white-space: nowrap; }
    .est-tag.gris { background: var(--neutro-bg); color: var(--neutro); } .est-tag.azul { background: var(--azul-bg); color: var(--azul); }
    .est-tag.verde { background: var(--verde-bg); color: var(--verde); } .est-tag.ambar { background: var(--naranja-bg); color: var(--naranja); }
    .est-tag.rojo { background: var(--rojo-bg); color: var(--rojo); } .est-tag.indigo { background: var(--indigo-bg); color: var(--indigo); }
    .est-tag.naranja { background: var(--naranja-bg); color: var(--naranja); } .est-tag.turquesa { background: var(--turquesa-bg); color: var(--turquesa); }
    .sem-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: .35rem; vertical-align: middle; }
    .sem-dot.verde { background: var(--verde); } .sem-dot.ambar { background: var(--amarillo); } .sem-dot.rojo { background: var(--rojo); } .sem-dot.gris { background: var(--tenue); }
    .chk-row { display: flex; align-items: center; gap: .6rem; padding: .4rem .2rem; border-bottom: 1px solid var(--borde); font-size: .88rem; }
    .chk-row .chk-lbl { flex: 1; } .chk-row.obl .chk-lbl::after { content: ' *'; color: var(--rojo); font-weight: 600; }
    .calc-box { background: var(--gris); border-radius: var(--r-lg); padding: 1rem 1.1rem; }
    .calc-tot { display: flex; justify-content: space-between; align-items: baseline; margin-top: .6rem; padding-top: .6rem; border-top: 1px solid var(--borde); }
    .calc-tot b { font-size: 1.4rem; }
    .aviso-box { border-radius: var(--r-md); padding: .6rem .8rem; font-size: .85rem; margin-top: .5rem; }
    .aviso-box.warn { background: var(--naranja-bg); color: var(--naranja); } .aviso-box.err { background: var(--rojo-bg); color: var(--rojo); } .aviso-box.ok { background: var(--verde-bg); color: var(--verde); }
    .pestanas { display: flex; gap: .3rem; margin: 1rem 0 .6rem; border-bottom: 1px solid var(--borde); overflow-x: auto; scrollbar-width: none; }
    .pestanas::-webkit-scrollbar { display: none; }
    .pestanas button { border: none; background: none; padding: .65rem .9rem; font-size: .9rem; font-weight: 500; color: var(--suave); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap; flex-shrink: 0; transition: color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease); }
    .pestanas button:hover { color: var(--texto); }
    .pestanas button.active { color: var(--texto); font-weight: 600; border-bottom-color: var(--marca); }
    .est-count { display: inline-flex; align-items: center; gap: .35rem; background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-full); padding: .25rem .7rem; font-size: .8rem; }
    .inline-inp { width: 100%; min-width: 90px; box-sizing: border-box; padding: .25rem .4rem; border: 1px solid var(--marca); border-radius: var(--r-sm); font: inherit; font-size: .85rem; margin: 0; background: var(--superficie); color: var(--texto); box-shadow: var(--ring-sombra); }
    .chip-enc { font-size: .76rem; background: var(--gris); border: 1px solid var(--borde); border-radius: var(--r-full); padding: .15rem .6rem; white-space: nowrap; }
    .chip-enc.ok { background: var(--verde-bg); color: var(--verde); border-color: transparent; font-weight: 600; }
    /* ---------- CALENDARIO ---------- */
    /* El mes en serif, como la cabecera de una agenda de papel; hoy, con su
       número en un círculo de la marca. */
    .cal-bar { display: flex; align-items: center; gap: .6rem; margin-bottom: 1rem; }
    .cal-mes {
      min-width: 190px; text-align: center; text-transform: capitalize;
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.7rem; line-height: 1.1;
    }
    .cal-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; }
    .cal-dow { text-align: center; font-size: .68rem; text-transform: uppercase; letter-spacing: .09em; color: var(--tenue); font-weight: 600; padding: .2rem 0 .35rem; }
    .cal-cell {
      background: var(--superficie); border: 1px solid var(--borde-suave); border-radius: var(--r-md);
      min-height: 104px; min-width: 0; overflow: hidden; padding: .4rem; display: flex; flex-direction: column; gap: .25rem;
      transition: border-color var(--ms-1) var(--ease);
    }
    .cal-cell:hover { border-color: var(--borde-fuerte); }
    .cal-cell.empty { background: transparent; border: none; }
    .cal-cell.hoy { border-color: rgba(var(--marca-rgb), .5); box-shadow: inset 0 0 0 1px rgba(var(--marca-rgb), .5); background: var(--superficie); }
    .cal-num { display: inline-flex; align-items: center; justify-content: center; align-self: flex-start; min-width: 1.5rem; height: 1.5rem; padding: 0 .25rem; border-radius: var(--r-full); font-size: .76rem; font-weight: 600; color: var(--suave); }
    .cal-cell.hoy .cal-num { background: var(--marca-solida); color: var(--sobre-marca); }
    .cal-task {
      display: block; width: 100%; max-width: 100%; min-width: 0; box-sizing: border-box; text-align: left;
      font-size: .72rem; font-weight: 500; line-height: 1.25; padding: .22rem .4rem .22rem .5rem; border: none;
      border-radius: var(--r-xs); background: var(--gris); color: var(--texto); cursor: pointer;
      white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
      box-shadow: inset 2px 0 0 var(--borde-fuerte);
      transition: background-color var(--ms-1) var(--ease);
    }
    .cal-task:hover { background: var(--marca-claro); }
    .cal-task.prio-alta { box-shadow: inset 2px 0 0 var(--rojo); }
    .cal-task.prio-media { box-shadow: inset 2px 0 0 var(--amarillo); }
    .cal-task.prio-baja { box-shadow: inset 2px 0 0 var(--verde); }
    .cal-task.done { text-decoration: line-through; color: var(--suave); }
    .cal-task.insp { box-shadow: inset 2px 0 0 var(--oro); background: var(--oro-bg); }
    .cal-task.smac { box-shadow: inset 2px 0 0 var(--azul); background: var(--azul-bg); }
    @media (max-width: 820px) {
      .cal-grid { gap: 3px; }
      .cal-cell { min-height: 64px; padding: .25rem; border-radius: var(--r-sm); }
      .cal-num { min-width: 1.25rem; height: 1.25rem; font-size: .68rem; }
      .cal-task { font-size: .62rem; padding: .15rem .25rem .15rem .35rem; }
      .cal-mes { min-width: 0; flex: 1; font-size: 1.45rem; }
    }

    .venc-item { display: flex; justify-content: space-between; gap: .6rem; padding: .5rem .35rem; border-bottom: 1px solid var(--borde-suave); cursor: pointer; font-size: .9rem; border-radius: var(--r-xs); }
    .venc-item:last-child { border-bottom: none; }
    .venc-item:hover { background: var(--superficie-2); }

    /* ---------- DASHBOARD ---------- */
    /* Cifras del panel: el número en serif, grande, como en Mi día. */
    .stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: .85rem; margin-bottom: var(--esp-m); }
    .stat {
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
      padding: 1.1rem 1.15rem 1.05rem; box-shadow: var(--sh-xs);
      transition: box-shadow var(--ms-2) var(--ease), transform var(--ms-2) var(--ease);
    }
    .stat:hover { box-shadow: var(--sh-md); transform: translateY(-1px); }
    .stat .num {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: 2.75rem; letter-spacing: -.02em; color: var(--texto); line-height: 1;
    }
    .stat .num.alerta { color: var(--rojo); }
    .stat .lbl { color: var(--suave); font-size: .82rem; margin-top: .45rem; }
    .carga { display: flex; align-items: center; gap: .8rem; margin-bottom: .75rem; }
    .carga .n { width: 170px; display: flex; align-items: center; gap: .55rem; font-size: .88rem; font-weight: 500; }
    .bar { display: block; flex: 1; height: 8px; background: var(--gris); border-radius: var(--r-full); overflow: hidden; box-shadow: inset 0 0 0 1px var(--borde-suave); }
    .bar-fill { display: block; height: 100%; background: var(--marca); border-radius: var(--r-full); transition: width var(--ms-4) var(--ease-enfasis); }
    .carga .v { width: 28px; text-align: right; font-weight: 600; font-size: .85rem; }
    @media (max-width: 820px) { .stats { grid-template-columns: repeat(2, 1fr); } }

    /* ---------- FICHA DE DETALLE ---------- */
    .dt-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: .6rem 1rem; margin: .4rem 0 1rem; }
    .dt-item { display: flex; flex-direction: column; gap: .1rem; min-width: 0; }
    .dt-k { font-size: .66rem; text-transform: uppercase; letter-spacing: .08em; color: var(--tenue); font-weight: 600; }
    .dt-v { font-weight: 500; word-break: break-word; }
    .dt-coment { background: var(--gris); border-radius: var(--r-md); padding: .6rem .8rem; white-space: pre-wrap; word-break: break-word; }
    a.lnk-detalle { color: var(--marca); font-weight: 600; text-decoration: none; cursor: pointer; }
    a.lnk-detalle:hover { text-decoration: underline; }
    @media (max-width: 600px) { .dt-grid { grid-template-columns: 1fr; } }
    /* Administración y socios del cliente: una persona por fila, con lo que es
       (cargo, % de capital) debajo del nombre y sus datos de contacto. */
    .per-lista { border: 1px solid var(--borde); border-radius: var(--r-md); }
    .per-item { display: flex; align-items: flex-start; gap: .6rem; padding: .55rem .7rem; }
    .per-item + .per-item { border-top: 1px solid var(--borde); }
    .per-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .1rem; }
    .per-nombre { font-weight: 600; overflow-wrap: anywhere; }
    .per-papel { font-size: .85rem; color: var(--marca); font-weight: 600; }
    .per-datos { font-size: .82rem; color: var(--suave); overflow-wrap: anywhere; }
    .per-acc { display: flex; gap: .25rem; flex-shrink: 0; }
    .per-vacio { margin: 0; font-size: .88rem; color: var(--suave); }
    .per-aviso { margin: .4rem 0 0; font-size: .82rem; color: var(--naranja); font-weight: 600; }
    .per-nuevo { margin-top: .5rem; }
    .per-de { margin: -.6rem 0 1rem; color: var(--suave); }

    /* ---------- COMENTARIOS Y ADJUNTOS ---------- */
    .det-info { background: var(--gris); border-radius: var(--r-md); padding: .8rem 1rem; margin-bottom: 1.1rem; font-size: .9rem; }
    .det-info .det-row { display: flex; gap: .5rem; margin-top: .35rem; flex-wrap: wrap; align-items: center; }
    .sec-tit { font-size: .7rem; text-transform: uppercase; letter-spacing: .09em; color: var(--tenue); font-weight: 600; margin: 1.2rem 0 .65rem; }
    /* --- Mi día ---
       La portada de la app. Un saludo en serif con el nombre de pila en
       cursiva, la fecha como antetítulo con su raya amarilla, las cifras
       debajo como titulares y después las listas: lo que vence y lo que
       viene. Calma: un solo color fuerte, el rojo de lo vencido. */
    .md-pagina { max-width: 64rem; }
    .md-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem 2rem; flex-wrap: wrap; margin-bottom: var(--esp-m); }
    .md-head-txt { min-width: 0; }
    .md-head .fecha {
      display: flex; align-items: center; gap: .6rem;
      font-size: .74rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--tenue);
    }
    .md-head .fecha::before { content: ''; width: 1.6rem; height: 1px; background: var(--oro); }
    .md-saludo.title { font-size: var(--txt-5); line-height: .98; letter-spacing: -.02em; margin: .55rem 0 .6rem; }
    .md-saludo em { font-style: italic; color: var(--marca); }
    .md-head .resumen { display: flex; align-items: center; flex-wrap: wrap; gap: .1rem .5rem; font-size: .98rem; color: var(--suave); }
    .md-n { color: var(--texto); font-weight: 600; }
    .md-n.rojo { color: var(--rojo); }
    .md-punto { width: 3px; height: 3px; border-radius: 50%; background: var(--borde-fuerte); }
    .md-toggle { margin-bottom: .2rem; }

    .md-counts { display: grid; grid-template-columns: repeat(auto-fit, minmax(12.5rem, 1fr)); gap: .75rem; margin: 0 0 var(--esp-m); }
    .md-count {
      position: relative; display: grid; grid-template-columns: auto 1fr; grid-template-areas: "ico ir" "n n" "l l";
      align-items: center; row-gap: .15rem; text-align: left; font: inherit; color: inherit;
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
      padding: .95rem 1.05rem 1rem; cursor: pointer; box-shadow: var(--sh-xs);
      transition: box-shadow var(--ms-2) var(--ease), transform var(--ms-2) var(--ease), border-color var(--ms-2) var(--ease);
    }
    .md-count:hover { box-shadow: var(--sh-md); transform: translateY(-2px); border-color: var(--borde-fuerte); }
    .md-count-ico {
      grid-area: ico; display: inline-flex; align-items: center; justify-content: center;
      width: 2rem; height: 2rem; border-radius: var(--r-sm); background: var(--marca-claro); color: var(--marca);
    }
    .md-count-ico .ico { width: 1.05rem; height: 1.05rem; vertical-align: 0; }
    .md-count-ir { grid-area: ir; justify-self: end; color: var(--tenue); transition: transform var(--ms-2) var(--ease-enfasis), color var(--ms-2) var(--ease); }
    .md-count:hover .md-count-ir { transform: translateX(3px); color: var(--texto); }
    .md-count .n {
      grid-area: n; margin-top: .55rem;
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: 2.6rem; line-height: 1; letter-spacing: -.02em; color: var(--texto);
    }
    .md-count .l { grid-area: l; font-size: .82rem; color: var(--suave); }
    .md-count.warn .md-count-ico { background: var(--naranja-bg); color: var(--naranja); }
    .md-count.warn .n { color: var(--naranja); }

    .md-sec {
      display: flex; align-items: center; gap: .5rem; margin: var(--esp-m) 0 .6rem;
      font-family: var(--fuente); font-size: .74rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--suave);
    }
    .md-sec .ico { width: .95rem; height: .95rem; }
    .md-sec.rojo { color: var(--rojo); }
    .md-sec-n { font-size: .7rem; letter-spacing: 0; padding: 0 .45rem; border-radius: var(--r-full); background: var(--acento-fuerte); color: var(--suave); }
    .md-sec.rojo .md-sec-n { background: var(--rojo-bg); color: var(--rojo); }
    .md-list { border: 1px solid var(--borde); border-radius: var(--r-xl); overflow: hidden; background: var(--superficie); box-shadow: var(--sh-xs); }
    .md-row {
      display: flex; align-items: center; gap: .85rem; min-height: 3.1rem; padding: .55rem .75rem .55rem 1rem;
      border-bottom: 1px solid var(--borde-suave); cursor: pointer;
      transition: background-color var(--ms-1) var(--ease);
    }
    .md-row:last-child { border-bottom: none; }
    .md-row:hover { background: var(--superficie-2); }
    .md-row:focus-visible { box-shadow: inset var(--ring-sombra); border-radius: 0; }
    .md-row.md-mas { justify-content: center; cursor: default; color: var(--tenue); font-size: .84rem; min-height: 2.6rem; }
    .md-row.md-mas:hover { background: none; }
    .md-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
    .md-tipo { font-size: .66rem; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; color: var(--tenue); width: 6.4rem; flex: none; }
    .md-txt { flex: 1; font-size: .93rem; font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .md-fecha { font-size: .8rem; white-space: nowrap; color: var(--suave); }
    .md-fecha.rojo { color: var(--rojo); font-weight: 600; } .md-fecha.ambar { color: var(--amarillo); font-weight: 600; }
    .md-acc { display: flex; gap: .3rem; flex: none; }
    .md-acc button {
      display: inline-flex; align-items: center; justify-content: center;
      border: 1px solid var(--borde-suave); background: var(--superficie); border-radius: var(--r-sm);
      width: 2rem; height: 2rem; cursor: pointer; line-height: 1; color: var(--suave); padding: 0;
      transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease), transform var(--ms-1) var(--ease);
    }
    .md-acc button:hover { background: var(--gris); color: var(--texto); border-color: var(--borde); }
    .md-acc button[data-hecho]:hover { background: var(--verde-bg); color: var(--verde); border-color: var(--verde-borde); }
    .md-vacio { text-align: center; padding: 3.5rem 1rem 3rem; border: 1px dashed var(--borde-fuerte); border-radius: var(--r-xl); }
    .md-vacio .big {
      display: inline-flex; align-items: center; justify-content: center; width: 3.5rem; height: 3.5rem; border-radius: 50%;
      background: var(--verde-bg); color: var(--verde); font-size: 1.6rem; line-height: 1;
    }
    .md-vacio .txt { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 2rem; color: var(--texto); margin-top: .8rem; }
    @media (max-width: 600px) {
      .md-tipo { display: none; }
      .md-head { gap: 1rem; }
      .md-saludo.title { font-size: 2.6rem; }
      .md-toggle { width: 100%; }
      .md-toggle button { flex: 1; justify-content: center; }
      .md-counts { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .55rem; }
      .md-count { padding: .8rem .85rem .85rem; }
      .md-count .n { font-size: 2.2rem; margin-top: .4rem; }
      .md-count .l { font-size: .76rem; line-height: 1.3; }
      .md-row { padding-left: .85rem; gap: .65rem; }
    }
    /* --- Recados (bandeja limpia) --- */
    .rc-seg { display: inline-flex; }
    .rc-seg button { border: 1px solid var(--borde); background: var(--superficie); padding: .42rem .95rem; font-size: .82rem; font-weight: 500; cursor: pointer; color: var(--suave); }
    .rc-seg button:first-child { border-radius: var(--r-md) 0 0 var(--r-md); } .rc-seg button:last-child { border-radius: 0 var(--r-md) var(--r-md) 0; border-left: none; }
    .rc-seg button.on { background: var(--marca-solida); color: var(--sobre-marca); border-color: var(--marca-solida); font-weight: 600; }
    .rc-list { border: 1px solid var(--borde); border-radius: var(--r-xl); overflow: hidden; background: var(--superficie); box-shadow: var(--sh-xs); }
    .rc-row { display: flex; align-items: center; gap: .75rem; padding: .6rem .9rem; border-bottom: 1px solid var(--borde-suave); cursor: pointer; transition: background-color var(--ms-1) var(--ease); }
    .rc-row:last-child { border-bottom: none; } .rc-row:hover { background: var(--superficie-2); } .rc-row.rc-open { background: var(--gris); }
    .rc-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
    .rc-main { flex: 1; min-width: 0; }
    .rc-main .l1 { font-size: .9rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .rc-main .l2 { font-size: .76rem; color: var(--suave); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .rc-fecha { font-size: .76rem; color: var(--suave); white-space: nowrap; flex: none; }
    .rc-acc { display: flex; gap: .25rem; flex: none; align-items: center; }
    .rc-acc button { border: 1px solid var(--borde-suave); background: var(--superficie); border-radius: var(--r-sm); width: 2rem; height: 2rem; cursor: pointer; font-size: .85rem; color: var(--suave); padding: 0; transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease); }
    .rc-acc button:hover { background: var(--gris); color: var(--texto); border-color: var(--borde); }
    .rc-exp { padding: .6rem 1rem 1rem 2.7rem; background: var(--gris); border-bottom: 1px solid var(--borde-suave); }
    .rc-exp .msg-cuerpo { font-size: .88rem; margin: 0 0 .7rem; white-space: pre-wrap; }
    .rc-collapse { display: inline-flex; align-items: center; gap: .4rem; font-size: .82rem; color: var(--suave); cursor: pointer; padding: .7rem .2rem; }
    /* ---------- RECADOS: conversaciones ----------
       Escritorio: la lista a la izquierda y el hilo a la derecha, cada uno con
       su desplazamiento y lo que se escribe siempre abajo. Móvil: o la lista o
       el hilo. Un hilo abierto es pantalla de conversación (html.pantalla-conv,
       en «Escribir en el móvil»): sin barra inferior (body.en-hilo), solo se
       desplazan los mensajes y lo que se escribe queda abajo, encima del
       teclado cuando está fuera. --chat-arriba lo mide app.js al pintar: el
       título de la página no mide siempre lo mismo. */
    .chat {
      display: grid; grid-template-columns: minmax(230px, 300px) minmax(0, 1fr);
      height: calc(100vh - var(--chat-arriba, 150px) - var(--esp-m) - var(--margen-hoja));   /* sin dvh (Safari < 15.4) */
      height: calc(100dvh - var(--chat-arriba, 150px) - var(--esp-m) - var(--margen-hoja)); min-height: 460px;
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
      box-shadow: var(--sh-xs); overflow: hidden;
    }
    .chat-lista { border-right: 1px solid var(--borde-suave); overflow-y: auto; padding: .45rem; background: var(--superficie-2); scrollbar-width: thin; }
    .chat-sec { font-size: .66rem; font-weight: 600; text-transform: uppercase; letter-spacing: .1em; color: var(--tenue); padding: .85rem .65rem .35rem; }
    .chat-conv {
      display: flex; align-items: center; gap: .65rem; width: 100%; min-height: 52px; padding: .45rem .6rem;
      border: 1px solid transparent; border-radius: var(--r-md); background: none; color: var(--texto); font: inherit; text-align: left; cursor: pointer;
      transition: background-color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease), box-shadow var(--ms-1) var(--ease);
    }
    .chat-conv:hover { background: var(--acento); }
    /* La abierta, como lo activo del menú lateral: una ficha de papel. */
    .chat-conv.activa { background: var(--superficie); border-color: var(--borde); box-shadow: var(--sh-xs); }
    .chat-conv.activa .chat-canal-ico { background: var(--marca-claro); color: var(--marca); }
    .chat-conv:focus-visible { outline: none; box-shadow: var(--ring-sombra); }
    .chat-canal-ico { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: var(--r-sm); background: var(--gris); color: var(--suave); flex-shrink: 0; transition: background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease); }
    .chat-canal-ico .ico { width: 15px; height: 15px; }
    .chat-conv .avatar.sm { width: 28px; height: 28px; }
    .chat-conv-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
    .chat-conv-tit, .chat-conv-prev { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .chat-conv-tit { font-weight: 600; font-size: .9rem; }
    .chat-conv-prev { font-size: .78rem; color: var(--suave); }
    .chat-conv.sin-leer .chat-conv-tit { font-weight: 600; }
    .chat-conv.sin-leer .chat-conv-prev { color: var(--texto); }
    .chat-conv-lado { display: flex; flex-direction: column; align-items: flex-end; gap: .2rem; flex-shrink: 0; font-size: .72rem; color: var(--suave); }
    .chat-arroba { margin-left: .35rem; color: var(--marca); font-weight: 600; }
    .chat-silencio { display: inline-flex; color: var(--tenue); }
    .chat-silencio .ico { width: 14px; height: 14px; }
    .chat-nada { font-size: .8rem; color: var(--suave); padding: .1rem .6rem .6rem; }
    .chat-antiguos { margin-top: .5rem; border-top: 1px solid var(--borde-suave); border-radius: 0 0 var(--r-md) var(--r-md); }

    .chat-hilo { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
    .chat-hilo-cab { display: flex; align-items: center; gap: .7rem; padding: .7rem 1.1rem; border-bottom: 1px solid var(--borde-suave); background: var(--superficie); }
    .chat-hilo-tit { flex: 1; min-width: 0; }
    .chat-hilo-tit h3 {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.45rem; line-height: 1.1;
      letter-spacing: -.01em; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    }
    .chat-hilo-tit p { font-size: .76rem; color: var(--suave); margin: .1rem 0 0; }
    .chat-volver { display: none; }
    .chat-silenciar[aria-pressed="true"] { background: var(--gris); color: var(--suave); box-shadow: none; }
    .chat-msgs { flex: 1; overflow-y: auto; padding: .5rem 1.1rem 1rem; scrollbar-width: thin; }
    .chat-mas { display: flex; margin: .3rem auto .5rem; }
    .chat-raya { display: flex; align-items: center; gap: .7rem; margin: 1rem 0 .5rem; font-size: .66rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--tenue); }
    .chat-raya::before, .chat-raya::after { content: ''; flex: 1; height: 1px; background: var(--borde); }
    .chat-raya.nuevos { color: var(--rojo); }
    .chat-raya.nuevos::before, .chat-raya.nuevos::after { background: var(--rojo-borde); }

    .chat-msg { display: flex; gap: .6rem; margin: 0 -.5rem; padding: .35rem .5rem; border-radius: var(--r-md); transition: background-color var(--ms-1) var(--ease); }
    .chat-msg.junto { padding-top: .05rem; }
    .chat-msg:hover, .chat-msg:focus-within { background: var(--acento); }
    /* Donde te mencionan, una raya dorada: se ve al pasar por el hilo sin
       depender solo del color (la mención va también resaltada en el texto). */
    .chat-msg.me-menciona { background: var(--oro-bg); box-shadow: inset 3px 0 0 var(--oro); }
    .chat-msg.urgente .chat-msg-cab b { color: var(--rojo); }
    .chat-msg-hueco { width: 26px; flex-shrink: 0; }
    .chat-msg-cuerpo { flex: 1; min-width: 0; }
    .chat-msg-cab { display: flex; align-items: baseline; flex-wrap: wrap; gap: .5rem; }
    .chat-msg-cab b { font-size: .88rem; font-weight: 600; }
    .chat-msg-cab time { font-size: .72rem; color: var(--tenue); }
    .chat-msg-cab .tag { align-self: center; }
    .chat-msg-texto { margin: .08rem 0 0; max-width: 68ch; font-size: .93rem; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
    .chat-msg-texto a { color: var(--marca); text-decoration: underline; text-underline-offset: 2px; }
    .chat-msg.borrado .chat-msg-texto { color: var(--tenue); font-style: italic; }
    .mencion { padding: 0 .15rem; border-radius: var(--r-xs); background: var(--marca-claro); color: var(--marca); font-weight: 600; }
    .mencion.yo { background: var(--oro-bg); color: var(--oro-texto); box-shadow: inset 0 -1px 0 rgba(var(--oro-rgb), .5); }
    .chat-chips { display: flex; flex-wrap: wrap; gap: .35rem; margin-top: .35rem; }
    .chat-chip {
      display: inline-flex; align-items: center; gap: .3rem; padding: .15rem .55rem;
      border: 1px solid var(--borde); border-radius: var(--r-full); background: var(--superficie); color: var(--texto);
      font: inherit; font-size: .76rem; font-weight: 600;
    }
    .chat-chip .ico { width: 13px; height: 13px; }
    button.chat-chip { cursor: pointer; }
    button.chat-chip:hover { border-color: var(--borde-fuerte); background: var(--marca-claro); color: var(--marca); }
    .chat-chip.tarea { color: var(--verde); background: var(--verde-bg); border-color: var(--verde-borde); }
    .chat-chip.urgente { color: var(--rojo); background: var(--rojo-bg); border-color: var(--rojo-borde); }
    .chat-chip-x { margin-left: .1rem; padding: 0 .1rem; border: none; background: none; color: inherit; font-size: 1rem; line-height: 1; cursor: pointer; }
    .chat-acc { display: flex; align-self: flex-start; gap: .25rem; opacity: 0; transition: opacity var(--ms-1) var(--ease); }
    .chat-msg:hover .chat-acc, .chat-msg:focus-within .chat-acc { opacity: 1; }
    .chat-acc .icon-btn { width: 30px; height: 30px; padding: 0; }
    .chat-acc .ico { width: 15px; height: 15px; }
    /* Sin ratón no hay «pasar por encima»: las acciones se ven siempre, discretas. */
    @media (hover: none) {
      .chat-acc { opacity: 1; }
      .chat-acc .icon-btn { width: 36px; height: 36px; border-color: transparent; background: none; }
    }

    .chat-vacio { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .3rem; height: 100%; padding: 3rem 1rem; color: var(--suave); text-align: center; }
    .chat-vacio > .ico { width: 30px; height: 30px; color: var(--tenue); }

    .chat-comp { position: relative; padding: .7rem .9rem .8rem; border-top: 1px solid var(--borde-suave); background: var(--superficie); }
    .chat-comp-extra { display: flex; flex-wrap: wrap; gap: .35rem; }
    .chat-comp-extra:not(:empty) { margin-bottom: .45rem; }
    .chat-comp-fila { display: flex; align-items: flex-end; gap: .4rem; }
    .chat-comp-fila textarea.inp { flex: 1; min-width: 0; min-height: 2.4rem; max-height: 220px; margin: 0; padding-top: .55rem; padding-bottom: .55rem; line-height: 1.35; resize: none; border-radius: var(--r-lg); background: var(--superficie-2); }
    .chat-comp-fila textarea.inp:focus { background: var(--superficie); }
    .chat-comp-fila .btn-ico { flex-shrink: 0; }
    .chat-urg[aria-pressed="true"] { color: var(--rojo); border-color: var(--rojo-borde); background: var(--rojo-bg); }
    /* Las sugerencias de @ se abren hacia arriba: debajo está el teclado. */
    .chat-menc { top: auto; bottom: calc(100% - .3rem); left: .8rem; right: .8rem; z-index: 20; }
    .chat-menc .combo-op { flex-direction: row; align-items: center; gap: .55rem; }

    .msg-resultados { max-height: 220px; overflow: auto; border: 1px solid var(--borde); border-radius: var(--r-md); }
    .msg-resultado {
      display: flex; flex-direction: column; gap: .15rem; width: 100%; padding: .55rem .7rem; margin-bottom: .45rem;
      border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie); color: var(--texto);
      font: inherit; text-align: left; cursor: pointer;
    }
    .msg-resultados .msg-resultado { margin: 0; border: none; border-bottom: 1px solid var(--borde); border-radius: 0; }
    .msg-resultado:hover { background: var(--superficie-2); }
    .msg-resultado-cab { font-size: .78rem; color: var(--suave); }
    .msg-resultado-cab b { color: var(--texto); }
    .msg-resultado-txt { font-size: .88rem; }

    /* Buscar: una fila por resultado; la que lleva a algún sitio es un botón. */
    .bus-lista { border: 1px solid var(--borde); border-radius: var(--r-xl); background: var(--superficie); overflow: hidden; box-shadow: var(--sh-xs); }
    .bus-fila {
      display: flex; flex-direction: column; gap: .12rem; width: 100%; padding: .65rem 1rem;
      border: none; border-bottom: 1px solid var(--borde-suave); background: none; color: var(--texto);
      font: inherit; text-align: left; transition: background-color var(--ms-1) var(--ease);
    }
    .bus-fila:last-child { border-bottom: none; }
    button.bus-fila { cursor: pointer; }
    button.bus-fila:hover { background: var(--superficie-2); }
    .bus-nom { font-weight: 600; font-size: .92rem; overflow-wrap: anywhere; }
    .bus-meta { font-size: .8rem; color: var(--suave); overflow-wrap: anywhere; }

    @media (max-width: 820px) {
      .chat { display: block; height: auto; min-height: 0; border: none; border-radius: 0; background: none; box-shadow: none; overflow: visible; }
      .chat.chat-abierto .chat-lista, .chat:not(.chat-abierto) .chat-hilo { display: none; }
      .chat-lista { overflow: visible; border: 1px solid var(--borde); border-radius: var(--r-xl); background: var(--superficie); }
      /* Dentro de un hilo: a lo ancho, sin título de página ni barra inferior,
         y el hilo llena lo que se ve para que lo que se escribe quede abajo
         aunque haya pocos mensajes. */
      body.en-hilo .chat-pagina, body.en-hilo #tabbar { display: none; }
      body.en-hilo main { padding: 0; }
      body.en-hilo #toast { bottom: calc(96px + var(--abajo-seguro)); }
      .chat.chat-abierto { display: flex; flex-direction: column; flex: 1; min-height: 0; }
      .chat-hilo { flex: 1; }
      .chat-volver { display: inline-flex; }
      .chat-hilo-cab { padding: .55rem 1rem; }
      .chat-msgs { overscroll-behavior: contain; padding: .5rem 1rem 1rem; }
      /* Con el teclado fuera, la barra de inicio del iPhone queda debajo de él:
         su margen sobra y lo que se escribe va pegado al teclado. */
      .chat-comp { padding-bottom: max(.7rem, var(--abajo-seguro)); }
      body.teclado .chat-comp { padding-bottom: .6rem; }
      /* Solo el icono; el texto sigue ahí para el lector de pantalla. */
      /* Del tamaño del botón de ajustes de al lado: sin alto propio se aplastaba
         a la altura del icono. */
      .chat-silenciar { width: 2rem; height: 2rem; padding: 0; }
      .chat-silenciar-txt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
    }
    .coment { display: flex; gap: .6rem; margin-bottom: .9rem; }
    .coment-body { flex: 1; }
    .coment-head { display: flex; justify-content: space-between; align-items: baseline; gap: .5rem; }
    .coment-head .nm { font-weight: 600; font-size: .88rem; }
    .coment-text { font-size: .9rem; white-space: pre-wrap; margin-top: .15rem; }
    .coment-del { background: none; border: none; color: var(--suave); font-size: .8rem; cursor: pointer; }
    .coment-del:hover { color: var(--rojo); }
    .adj { display: flex; align-items: center; justify-content: space-between; gap: .5rem; border: 1px solid var(--borde); border-radius: var(--r-md); padding: .55rem .75rem; margin-bottom: .5rem; background: var(--superficie); }
    .adj .fname { display: flex; align-items: center; gap: .5rem; font-size: .88rem; overflow: hidden; }
    .adj .fname a { font-weight: 600; text-decoration: none; }
    .adj .fmeta { font-size: .74rem; color: var(--suave); }

    /* ---------- DIRECTORIO DE PERSONAS (recados) ---------- */
    .people { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: .6rem; }
    .person { display: flex; align-items: center; gap: .65rem; text-align: left; background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg); padding: .65rem .75rem; cursor: pointer; transition: border-color var(--ms-2) var(--ease), box-shadow var(--ms-2) var(--ease), background-color var(--ms-2) var(--ease); }
    .person:hover { border-color: var(--borde-fuerte); background: var(--superficie-2); box-shadow: var(--sh-md); }
    .person.sel { border-color: var(--marca); background: var(--marca-claro); box-shadow: inset 0 0 0 1px var(--marca); }
    .person .p-info { display: flex; flex-direction: column; line-height: 1.2; overflow: hidden; }
    .person .p-nombre { font-weight: 600; font-size: .9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .person .p-dep { font-size: .76rem; color: var(--suave); }

    /* ---------- TABLA USUARIOS ---------- */
    table { width: 100%; border-collapse: collapse; }
    th, td { text-align: left; padding: .65rem .6rem; border-bottom: 1px solid var(--borde-suave); font-size: .9rem; }
    th { color: var(--tenue); font-size: .68rem; text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
    tbody tr { transition: background-color var(--ms-1) var(--ease); }
    tbody tr:hover { background: var(--acento); }
    tbody tr:last-child td { border-bottom: none; }
    .inactivo td { opacity: .5; }
    /* Tablas de registros: se trabajan como una hoja de cálculo, así que las
       columnas se separan, pero con una raya fina; lo que manda es la
       horizontal. Sin los bordes de fuera, que ya los pone el panel. */
    table.tablareg th, table.tablareg td { border: 1px solid var(--borde-suave); border-width: 0 1px 1px 0; vertical-align: top; padding: .55rem .6rem; font-size: .84rem; line-height: 1.45; }
    table.tablareg tr > :last-child { border-right: 0; }
    table.tablareg tbody tr:last-child td { border-bottom: 0; }
    table.tablareg thead th { background: var(--superficie-2); position: sticky; top: 0; z-index: 2; box-shadow: inset 0 -1px 0 var(--borde); border-bottom-color: transparent; padding-top: .65rem; padding-bottom: .6rem; }
    .th-sort { cursor: pointer; white-space: nowrap; user-select: none; transition: color var(--ms-1) var(--ease); }
    .th-sort:hover { color: var(--texto); }
    .th-sort .ico { color: var(--marca); }
    table.tablareg .filtros-row th { background: var(--superficie); padding: .3rem .35rem; position: static; box-shadow: none; border-bottom: 1px solid var(--borde); }
    .fcol { width: 100%; min-width: 64px; font-size: .76rem; font-weight: 400; text-transform: none; letter-spacing: 0; padding: .28rem .45rem; border: 1px solid var(--borde); border-radius: var(--r-sm); background: var(--superficie-2); color: var(--texto); }
    .fcol:focus { outline: none; border-color: var(--ring); box-shadow: var(--ring-sombra); background: var(--superficie); }

    .pill { display: inline-flex; align-items: center; gap: .3rem; font-size: .72rem; font-weight: 600; padding: .12rem .55rem; border-radius: var(--r-full); }
    .pill.on::before, .pill.off::before { content: ''; width: .38rem; height: .38rem; border-radius: 50%; background: currentColor; }
    .pill.on { background: var(--verde-bg); color: var(--verde); }
    .pill.off { background: var(--rojo-bg); color: var(--rojo); }

    /* ---------- MODAL ---------- */
    /* Fondo sólido, no desenfocado: desenfocar toda la ventana obliga al
       navegador a recomponer la pantalla entera en cada fotograma de la
       apertura, y en un equipo de oficina eso se nota. Un velo algo más denso
       separa el diálogo igual de bien y no cuesta nada. */
    .overlay {
      display: none; position: fixed; inset: 0; z-index: 100;
      background: var(--velo);
      align-items: center; justify-content: center; padding: 1rem;
    }
    .overlay.open { animation: fundido var(--ms-2) var(--ease); }
    .overlay.cerrando { animation: fundido var(--ms-2) var(--ease-sal) reverse; }
    .overlay.cerrando .modal { animation: modal-sale var(--ms-2) var(--ease-sal) forwards; }
    @keyframes fundido { from { opacity: 0; } to { opacity: 1; } }
    @keyframes modal-entra { from { opacity: 0; transform: translateY(12px) scale(.98); } to { opacity: 1; transform: none; } }
    @keyframes modal-sale { to { opacity: 0; transform: translateY(6px) scale(.985); } }
    .overlay.open { display: flex; }
    .modal {
      --pad-modal: clamp(1.25rem, 1.05rem + .9vw, 1.85rem);
      background: var(--elevado); border: 1px solid var(--borde-suave);
      border-radius: var(--r-2xl); box-shadow: var(--sh-xl);
      padding: var(--pad-modal); width: 100%; max-width: 540px; max-height: 90vh; overflow: auto;
      animation: modal-entra var(--ms-4) var(--ease-enfasis);
    }
    /* El diálogo se desplaza arriba y abajo, nunca de lado. En el iPhone un
       campo de fecha u hora medía más que el hueco y dejaba arrastrar el
       formulario entero hacia los lados (28-09, «Nueva tarea»). */
    .modal { overflow-x: hidden; overscroll-behavior: contain; }
    /* El título del diálogo, en la serif de la casa: se sabe dónde se está
       sin leer el resto. */
    .modal > h3:first-child, .modal h3 {
      font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
      font-size: 1.85rem; line-height: 1.08; letter-spacing: -.012em; margin-bottom: 1.15rem;
      padding-right: 1rem;
    }
    .modal .checks { display: flex; flex-direction: column; gap: .4rem; max-height: 200px; overflow: auto; border: 1px solid var(--borde); border-radius: var(--r-md); padding: .65rem .75rem; background: var(--superficie-2); }
    .dep-quick { display: flex; gap: .4rem; flex-wrap: wrap; margin-bottom: .5rem; }
    .modal .checks label { display: flex; align-items: center; gap: .55rem; font-weight: 500; margin: 0; }
    .modal-actions { display: flex; justify-content: flex-end; gap: .6rem; margin-top: 1.4rem; }
    /* Los botones del final se quedan abajo mientras se baja por un formulario
       largo: guardar siempre está a la vista. Solo el último bloque: si hay
       acciones a mitad de diálogo, se quedan donde están. */
    .modal > .modal-actions:last-child {
      position: sticky; bottom: calc(-1 * var(--pad-modal)); z-index: 3;
      margin: 1.4rem calc(-1 * var(--pad-modal)) calc(-1 * var(--pad-modal));
      padding: .9rem var(--pad-modal) var(--pad-modal);
      background: var(--elevado); border-top: 1px solid var(--borde-suave);
    }
    /* En el móvil, el diálogo es una hoja que sube desde abajo, como las del
       sistema: al alcance del pulgar y sin velo por debajo de los botones. */
    @media (max-width: 600px) {
      .overlay { align-items: flex-end; padding: 0; }
      .modal {
        max-width: none; max-height: 92vh; border-radius: var(--r-2xl) var(--r-2xl) 0 0; border-bottom: 0;
        padding-bottom: calc(var(--pad-modal) + var(--abajo-seguro));
        animation: sheet-up var(--ms-4) var(--ease-enfasis);
      }
      .modal > .modal-actions:last-child { margin-bottom: calc(-1 * var(--pad-modal) - var(--abajo-seguro)); padding-bottom: calc(.9rem + var(--abajo-seguro)); bottom: calc(-1 * var(--pad-modal) - var(--abajo-seguro)); }
      .modal > .modal-actions:last-child > * { flex: 1; }
      .modal h3 { font-size: 1.65rem; }
      .overlay.cerrando .modal { animation: hoja-sale var(--ms-2) var(--ease-sal) forwards; }
    }
    @keyframes hoja-sale { to { transform: translateY(30px); opacity: 0; } }

    /* Estado vacío ("Empty" de coss-com-ui): un hueco sin explicación se lee
       como un error de carga. Figura, qué pasa, y qué hacer a continuación. */
    .empty { text-align: center; color: var(--suave); padding: 3rem 1rem; }
    .empty-ico {
      display: inline-flex; align-items: center; justify-content: center;
      width: 3.4rem; height: 3.4rem; margin-bottom: 1rem;
      border-radius: var(--r-xl); background: var(--marca-claro);
      box-shadow: inset 0 0 0 1px var(--borde-suave), 0 0 0 6px var(--acento);
      color: var(--marca); font-size: 1.4rem;
    }
    .empty-tit { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.6rem; line-height: 1.15; color: var(--texto); margin-bottom: .35rem; }
    .empty-txt { font-size: .88rem; max-width: 34rem; margin: 0 auto; line-height: 1.55; }
    .empty-acc { margin-top: 1.1rem; display: flex; gap: .5rem; justify-content: center; flex-wrap: wrap; }
    .muted { color: var(--suave); font-size: .85rem; }

    /* Esqueleto de carga (shimmer) mientras llegan los datos de una vista. */
    .sk { background: linear-gradient(90deg, var(--sk-base) 25%, var(--sk-brillo) 45%, var(--sk-base) 65%); background-size: 200% 100%; animation: sk-shimmer 2s -1s linear infinite; border-radius: var(--r-md); }
    .sk-circ { border-radius: 50%; }
    @keyframes sk-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
    @media (prefers-reduced-motion: reduce) { .sk { animation: none; } }
    .sk-title { height: 2.5rem; width: 240px; max-width: 55%; margin: .2rem 0 .7rem; border-radius: var(--r-sm); }
    .sk-lead { height: .95rem; width: 380px; max-width: 80%; margin-bottom: var(--esp-m); }
    .sk-line { height: .85rem; margin-bottom: .7rem; }
    .sk-line:last-child { margin-bottom: 0; }
    .sr-solo { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

    /* Atajo de teclado en el menú (Ctrl K / ⌘K) y fila "Mostrar más" de tablas paginadas. */
    .kbd { display: inline-block; font-family: var(--fuente-mono); font-size: .66rem; color: var(--tenue); border: 1px solid var(--borde); border-bottom-width: 2px; border-radius: var(--r-xs); padding: .06rem .38rem; background: var(--superficie); white-space: nowrap; line-height: 1.5; }
    tr.fila-mas td { text-align: center; padding: .7rem !important; background: var(--superficie-2); }
    tr.fila-mas .muted { margin-left: .6rem; }

/* =========================================================================
   7. AVISOS FLOTANTES (toast)
   -------------------------------------------------------------------------
   Antes era un único recuadro: dos avisos seguidos y el primero se perdía sin
   llegar a leerse. Ahora es una pila —cada aviso espera su turno visible—,
   con color e icono según de qué hable y un botón para cerrarlo antes.
   ========================================================================= */
    #toast {
      position: fixed; z-index: 200;
      bottom: calc(1.2rem + var(--abajo-seguro)); left: 50%; transform: translateX(-50%);
      display: flex; flex-direction: column-reverse; align-items: center; gap: .5rem;
      width: min(26rem, calc(100vw - 2rem));
      pointer-events: none;
    }
    /* Tinta sobre papel: el aviso va en negativo (oscuro en claro, claro en
       oscuro) para que se distinga de todo lo que hay en la página sin
       necesitar un color fuerte; el tono lo lleva solo el icono. */
    .toast {
      pointer-events: auto;
      display: flex; align-items: flex-start; gap: .65rem; width: 100%;
      background: var(--tostada-bg); color: var(--tostada-tx);
      border: 1px solid var(--tostada-borde);
      border-radius: var(--r-lg); box-shadow: var(--sh-xl);
      padding: .75rem .7rem .75rem .9rem; font-size: .9rem; font-weight: 500; line-height: 1.45;
      animation: toast-entra var(--ms-4) var(--ease-enfasis);
    }
    .toast.saliendo { animation: toast-sale var(--ms-2) var(--ease-sal) forwards; }
    .toast .t-ico { flex: none; width: 1.15rem; height: 1.15rem; margin-top: .1rem; }
    .toast .t-txt { flex: 1; min-width: 0; overflow-wrap: anywhere; }
    .toast .t-cerrar {
      flex: none; border: none; background: none; color: var(--tostada-suave);
      width: 1.5rem; height: 1.5rem; border-radius: var(--r-xs); padding: 0;
      font-size: 1rem; line-height: 1; cursor: pointer;
    }
    .toast .t-cerrar:hover { background: var(--tostada-acento); color: var(--tostada-tx); }
    .toast.ok .t-ico    { color: var(--tostada-ok); }
    .toast.error .t-ico { color: var(--tostada-error); }
    .toast.aviso .t-ico { color: var(--tostada-aviso); }
    .toast.info .t-ico  { color: var(--tostada-info); }
    @keyframes toast-entra { from { opacity: 0; transform: translateY(16px) scale(.96); } to { opacity: 1; transform: none; } }
    @keyframes toast-sale { to { opacity: 0; transform: translateY(8px) scale(.97); } }

    /* ---------- NAVEGACIÓN MÓVIL: barra inferior + hoja "Más" ---------- */
    /* En pantalla estrecha el menú lateral desaparece. Lo frecuente (Mi día, Mensajes,
       Tareas, Agenda) vive en una barra inferior fija al alcance del pulgar; todo lo
       demás se abre desde "Más" en una hoja que sube desde abajo, con quién eres
       arriba y las secciones agrupadas por departamento. */
    #tabbar { display: none; }
    #navsheet {
      position: fixed; inset: 0; z-index: 90; display: none;
      background: var(--velo);
    }
    #navsheet.open { display: flex; align-items: flex-end; animation: fundido var(--ms-3) var(--ease); }
    #navsheet .sheet {
      background: var(--elevado); width: 100%; max-height: 86vh; overflow-y: auto; overscroll-behavior: contain;
      border-radius: var(--r-2xl) var(--r-2xl) 0 0; box-shadow: var(--sh-xl);
      padding: .4rem 1rem calc(1.2rem + var(--abajo-seguro));
      animation: sheet-up var(--ms-4) var(--ease-enfasis);
    }
    @keyframes sheet-up { from { transform: translateY(40px); opacity: .4; } to { transform: none; opacity: 1; } }
    #navsheet .sheet-handle { width: 2.5rem; height: 4px; border-radius: var(--r-full); background: var(--borde-fuerte); margin: .35rem auto .9rem; }
    .sheet-yo {
      display: flex; align-items: center; gap: .75rem;
      padding: .75rem; margin-bottom: .4rem;
      background: var(--gris); border-radius: var(--r-lg);
    }
    .sheet-yo-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
    .sheet-yo-txt b { font-size: .98rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .sheet-yo-txt span { font-size: .78rem; color: var(--suave); }
    #navsheet .sheet-sep {
      font-size: .68rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase;
      color: var(--tenue); margin: 1.1rem .25rem .5rem;
    }
    #navsheet .sheet-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; }
    #navsheet .sheet-grid a {
      display: flex; align-items: center; gap: .6rem; min-height: 3rem; padding: .6rem .7rem;
      background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-md);
      font-weight: 500; font-size: .86rem; line-height: 1.2; color: var(--texto); text-decoration: none;
      transition: background-color var(--ms-1) var(--ease), border-color var(--ms-1) var(--ease), transform var(--ms-1) var(--ease);
    }
    #navsheet .sheet-grid a:active { transform: scale(.97); }
    #navsheet .sheet-grid a .nav-ico { color: var(--suave); }
    #navsheet .sheet-grid a .nav-txt { white-space: normal; }
    #navsheet .sheet-grid a.active { border-color: rgba(var(--marca-rgb), .45); background: var(--marca-claro); color: var(--marca); font-weight: 600; }
    #navsheet .sheet-grid a.active .nav-ico { color: var(--marca); }

    /* ---------- RESPONSIVE ---------- */
    @media (max-width: 820px) {
      .layout { flex-direction: column; }
      /* max(): con viewport-fit=cover el inset real del iPhone (~34px) manda; donde
         env() sea 0 (Android, escritorio) queda un colchón mínimo de .8rem para que
         las etiquetas nunca rocen el borde ni el indicador de inicio. */
      #tabbar {
        position: fixed; bottom: 0; left: 0; right: 0; z-index: 80; display: flex;
        background: var(--superficie); border-top: 1px solid var(--borde-suave);
        padding: .4rem .35rem max(calc(.3rem + var(--abajo-seguro)), .8rem);
        box-shadow: 0 -6px 24px -12px rgba(var(--marca-rgb), .18);
      }
      #tabbar a {
        flex: 1; display: flex; flex-direction: column; align-items: center; gap: .22rem;
        padding: .1rem .15rem; text-decoration: none; color: var(--tenue);
        font-size: .66rem; font-weight: 600; letter-spacing: .01em; position: relative;
        -webkit-tap-highlight-color: transparent;
      }
      /* Activo: icono y texto en la marca, con una píldora de tinte SOLO tras el
         icono (estilo Material 3). Nada de bloque de color sobre el elemento entero. */
      #tabbar a.active { color: var(--texto); }
      #tabbar .t-ico {
        display: flex; align-items: center; justify-content: center; width: 3.4rem; height: 1.85rem;
        border-radius: var(--r-full); color: var(--suave);
        transition: background-color var(--ms-2) var(--ease), color var(--ms-2) var(--ease), transform var(--ms-2) var(--ease-enfasis);
      }
      #tabbar a:active .t-ico { transform: scale(.92); }
      #tabbar a.active .t-ico { background: var(--marca-claro); color: var(--marca); }
      #tabbar .t-ico svg { width: 1.32rem; height: 1.32rem; display: block; }
      #tabbar .badge { position: absolute; top: -.2rem; left: calc(50% + .45rem); margin: 0; box-shadow: 0 0 0 2px var(--superficie); }
      main { padding: 1.15rem 1rem calc(92px + var(--abajo-seguro)); overflow-x: clip; }
      /* Tablas en móvil: la página es el ÚNICO scroll vertical. El tope de 72vh y la
         cabecera pegajosa son de escritorio; anidados en el scroll táctil de iOS la
         cabecera se queda clavada a mitad y pinta filas por encima. El panel solo
         desliza en horizontal, y la tabla se compacta para que quepan más columnas. */
      .panel:has(table.tablareg) { max-height: none; }
      table.tablareg thead th { position: static; }
      table.tablareg th, table.tablareg td { font-size: .78rem; padding: .35rem .4rem; }
      #toast { bottom: calc(86px + var(--abajo-seguro)); }
      .kanban { grid-template-columns: 1fr; }

      /* --- Tareas en móvil --- */
      /* Los filtros ocupaban la pantalla entera antes de ver una sola tarea:
         plegados tras el botón "Filtros" hasta que hagan falta. */
      .tareas-f-toggle { display: block; width: 100%; margin-bottom: .9rem; }
      .tareas-toolbar { display: none; }
      .tareas-toolbar.abierta { display: flex; }
      /* El arrastre no existe en pantalla táctil: la pista sobra y el estado se
         cambia con el selector de cada tarjeta. */
      .hint-arrastre { display: none; }
      /* Una columna cada vez, elegida con pestañas, en vez de tres tableros apilados. */
      /* Las tres columnas, como el control segmentado del resto de la app. */
      .tabs-est { display: flex; gap: .2rem; background: var(--acento); border: 1px solid var(--borde-suave); border-radius: var(--r-lg); padding: .2rem; margin-bottom: .9rem; }
      .tabs-est button { flex: 1; border: 1px solid transparent; background: none; border-radius: var(--r-md); padding: .5rem .2rem; font-size: .8rem; font-weight: 500; color: var(--suave); display: flex; align-items: center; justify-content: center; gap: .35rem; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: background-color var(--ms-2) var(--ease), color var(--ms-2) var(--ease); }
      .tabs-est button.activa { background: var(--superficie); color: var(--texto); font-weight: 600; border-color: var(--borde-suave); box-shadow: var(--sh-sm); }
      .tabs-est button .n { background: var(--acento-fuerte); border-radius: var(--r-full); padding: 0 .42rem; font-size: .7rem; font-weight: 600; }
      .tabs-est button.activa .n { background: var(--marca-claro); color: var(--marca); }
      .kanban[data-movil="pendiente"] .col:not([data-col="pendiente"]),
      .kanban[data-movil="en_curso"] .col:not([data-col="en_curso"]),
      .kanban[data-movil="completada"] .col:not([data-col="completada"]) { display: none; }
      /* La pestaña ya dice qué columna es y cuántas hay: la caja y su cabecera sobran. */
      .col { background: none; border: none; padding: 0; }
      .col-head { display: none; }
      .col-body { min-height: 0; }

      /* iOS amplía la página al enfocar cualquier control con letra menor de 16px
         y la deja ampliada (de ahí el "se mueve hacia los lados"). 16px en los
         controles lo corta de raíz en toda la app, login y modales incluidos.
         Las clases con letra propia van listadas: ganan al selector de elemento. */
      select, input, textarea, .inp, .estado-sel, .inline-sel, .inline-inp, .ext-sel, .fcol { font-size: 16px; }

      /* --- Escribir en el móvil ---
         Como en Mensajes del iPhone. app.js pone body.escribiendo al tocar un
         campo, body.teclado mientras el teclado está fuera, y --vv-alto y
         --vv-arriba con lo que se ve (iOS no encoge la ventana con el teclado,
         solo lo que se ve). */
      /* La barra inferior se va al tocar el campo y no flota sobre el teclado. */
      body.escribiendo #tabbar { display: none; }
      /* Los avisos, arriba: abajo los taparía el teclado. */
      body.teclado #toast { top: calc(var(--vv-arriba, 0px) + var(--alto-cabecera, 52px) + .5rem); bottom: auto; }
      /* Un diálogo cabe entero encima del teclado y se desplaza por dentro. */
      body.teclado .overlay { top: var(--vv-arriba, 0px); bottom: auto; height: var(--vv-alto, 100%); padding: .5rem; }
      body.teclado .modal { max-height: 100%; }
      /* iOS se queda a veces con una pantalla más baja que la de verdad (ver
         iosCorto() en app.js) y por debajo no pinta la página, solo su color de
         fondo. Mientras dure, ese color es el de la barra y lo pegado abajo
         pierde el margen de la raya de inicio, que ya cae en el hueco.
         ios-corto NO puede cambiar el alto de la página: en una pantalla de
         conversación la página no mide nada (la app va fija), y alargarla a
         100vh la hacía más alta que lo que iOS pinta; iOS se recolocaba, el
         hueco desaparecía, la clase se iba y vuelta a empezar: parpadeaba a
         cada fotograma. El gris de fondo de la conversación lo pone la propia
         app (#app, más abajo), no el cuerpo. */
      html.ios-corto { background: var(--superficie); --abajo-seguro: 0px; }
      /* Pantalla de conversación (un hilo del chat): la página no
         se desplaza (la app va fija y no deja nada debajo), la app ocupa la
         pantalla con la cabecera arriba, y dentro solo se desplaza la
         conversación. Con el teclado fuera, se ata a lo que se ve. */
      html.pantalla-conv, html.pantalla-conv body { overscroll-behavior: none; }
      html.pantalla-conv #app { position: fixed; left: 0; right: 0; top: 0; bottom: 0; min-height: 0; overflow: hidden; background: var(--fondo); }
      html.pantalla-conv body.teclado #app { top: var(--vv-arriba, 0px); bottom: auto; height: var(--vv-alto, 100%); }
      html.pantalla-conv .layout { position: absolute; left: 0; right: 0; top: var(--alto-cabecera, 52px); bottom: 0; min-height: 0; }
      html.pantalla-conv main { height: 100%; display: flex; flex-direction: column; padding-bottom: 0; }
    }

/* Firma del estudio. El nombre es lo que se lee; "Desarrollado por" es la
   letra pequeña que lo sostiene. Al pie del menú, presente sin pedir turno:
   si sobra sitio, se va abajo del todo. */
.side-nav a.firma-estudio, .firma-estudio {
  display: block; margin-top: auto; padding: 1.4rem .6rem .2rem;
  border: 0; border-radius: 0; min-height: 0; background: none; box-shadow: none;
  text-decoration: none;
}
.side-nav a.firma-estudio:hover { background: none; }
.firma-estudio:hover { text-decoration: none; }
.firma-pre {
  display: block; font-size: .62rem; letter-spacing: .1em; text-transform: uppercase;
  color: var(--tenue);
}
.firma-marca {
  display: block; margin-top: .12rem;
  font-size: .82rem; font-weight: 600; letter-spacing: .01em;
  color: var(--suave);
}
.firma-estudio:hover .firma-marca { color: var(--oro-texto); }

/* =========================================================================
   8. PIEZAS NUEVAS
   -------------------------------------------------------------------------
   Componentes que reui.io y coss-com-ui dan por sentados y que aquí faltaban.
   Todos se apoyan en las fichas de la sección 1, así que heredan el modo
   oscuro y el anillo de foco sin tener que repetirlos.
   ========================================================================= */

/* --- Etiqueta de tono (badge) -------------------------------------------
   Una sola familia para lo que antes eran .tag, .pill, .est-tag, .tipo-tag y
   .chip-enc con sus propios hexadecimales repetidos. Las clases viejas siguen
   funcionando; lo nuevo debería usar .badge-tono.                          */
.badge-tono {
  display: inline-flex; align-items: center; gap: .3rem;
  font-size: .72rem; font-weight: 600; line-height: 1.5;
  padding: .12rem .55rem; border-radius: var(--r-full);
  border: 1px solid transparent; white-space: nowrap;
}
.badge-tono.neutro   { background: var(--neutro-bg);   color: var(--neutro); }
.badge-tono.verde    { background: var(--verde-bg);    color: var(--verde); }
.badge-tono.rojo     { background: var(--rojo-bg);     color: var(--rojo); }
.badge-tono.ambar    { background: var(--amarillo-bg); color: var(--amarillo); }
.badge-tono.naranja  { background: var(--naranja-bg);  color: var(--naranja); }
.badge-tono.azul     { background: var(--azul-bg);     color: var(--azul); }
.badge-tono.morado   { background: var(--morado-bg);   color: var(--morado); }
.badge-tono.indigo   { background: var(--indigo-bg);   color: var(--indigo); }
.badge-tono.turquesa { background: var(--turquesa-bg); color: var(--turquesa); }
.badge-tono.marca    { background: var(--marca-claro); color: var(--marca); }
/* Variante de contorno, para cuando el relleno compite con la fila. */
.badge-tono.contorno { background: none; border-color: currentColor; }
/* Punto de color delante, para leer el estado sin leer el texto. */
.badge-tono.con-punto::before {
  content: ''; width: .45rem; height: .45rem; border-radius: 50%;
  background: currentColor; flex: none;
}

/* --- Aviso con icono (alert) --------------------------------------------
   El bloque de aviso de coss-com-ui: franja de color a la izquierda, icono,
   título y cuerpo. Se distingue de un párrafo cualquiera de un vistazo.    */
.destacado {
  display: flex; gap: .75rem; align-items: flex-start;
  padding: .9rem 1rem .9rem 1.1rem; margin-bottom: 1rem;
  border: 1px solid var(--borde); box-shadow: inset 3px 0 0 var(--suave);
  border-radius: var(--r-lg); background: var(--superficie);
  font-size: .9rem; line-height: 1.5;
}
.destacado > svg, .destacado > .a-ico { flex: none; width: 1.15rem; height: 1.15rem; margin-top: .1rem; color: var(--suave); }
.destacado .a-tit { font-weight: 600; margin-bottom: .15rem; }
.destacado .a-cuerpo { color: var(--suave); }
.destacado.ok    { background: var(--verde-bg);    border-color: var(--verde-borde);    box-shadow: inset 3px 0 0 var(--verde); }
.destacado.error { background: var(--rojo-bg);     border-color: var(--rojo-borde);     box-shadow: inset 3px 0 0 var(--rojo); }
.destacado.aviso { background: var(--amarillo-bg); border-color: var(--amarillo-borde); box-shadow: inset 3px 0 0 var(--amarillo); }
.destacado.info  { background: var(--azul-bg);     border-color: var(--azul-borde);     box-shadow: inset 3px 0 0 var(--azul); }
.destacado.ok > svg, .destacado.ok > .a-ico       { color: var(--verde); }
.destacado.error > svg, .destacado.error > .a-ico { color: var(--rojo); }
.destacado.aviso > svg, .destacado.aviso > .a-ico { color: var(--amarillo); }
.destacado.info > svg, .destacado.info > .a-ico   { color: var(--azul); }
.destacado.ok .a-cuerpo, .destacado.error .a-cuerpo,
.destacado.aviso .a-cuerpo, .destacado.info .a-cuerpo { color: inherit; opacity: .85; }

/* --- Control segmentado --------------------------------------------------
   Forma única para las tres barras de dos o tres opciones que la app tenía
   cada una con su maquetación (.md-toggle, .rc-seg, .pestanas en móvil).  */
.seg {
  display: inline-flex; padding: .2rem; gap: .15rem;
  background: var(--acento); border: 1px solid var(--borde-suave);
  border-radius: var(--r-lg);
}
.seg button {
  border: 1px solid transparent; background: none; cursor: pointer;
  padding: .4rem .95rem; font-size: .84rem; font-weight: 500;
  color: var(--suave); border-radius: var(--r-md);
  display: inline-flex; align-items: center; gap: .35rem;
  transition: background-color var(--ms-2) var(--ease), color var(--ms-2) var(--ease), box-shadow var(--ms-2) var(--ease);
}
.seg button:hover:not(.on) { color: var(--texto); background: var(--acento); }
.seg button.on { background: var(--superficie); color: var(--texto); font-weight: 600; border-color: var(--borde-suave); box-shadow: var(--sh-sm); }
.seg.bloque { display: flex; width: 100%; }
.seg.bloque button { flex: 1; justify-content: center; }

/* --- Barra de progreso y medidor ----------------------------------------
   .barra es la versión con ficha de .bar; el medidor añade color por umbral
   (verde / ámbar / rojo) para que el número no haya que interpretarlo.     */
.barra { height: 8px; background: var(--gris); border-radius: var(--r-full); overflow: hidden; }
.barra > i {
  display: block; height: 100%; border-radius: var(--r-full);
  background: var(--marca); transition: width var(--ms-3) var(--ease);
}
.barra.ok > i    { background: var(--verde); }
.barra.aviso > i { background: var(--amarillo); }
.barra.peligro > i { background: var(--rojo); }
.barra.rayada > i {
  background-image: linear-gradient(45deg, rgba(255,255,255,.18) 25%, transparent 25%,
    transparent 50%, rgba(255,255,255,.18) 50%, rgba(255,255,255,.18) 75%, transparent 75%);
  background-size: 12px 12px;
}

/* --- Separador con texto ------------------------------------------------- */
.sep-txt {
  display: flex; align-items: center; gap: .8rem;
  color: var(--tenue); font-size: .76rem; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 600; margin: 1.2rem 0;
}
.sep-txt::before, .sep-txt::after { content: ''; flex: 1; height: 1px; background: var(--borde); }

/* --- Rastro de migas (breadcrumb) ---------------------------------------- */
.migas { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem; font-size: .84rem; color: var(--suave); margin-bottom: .6rem; }
.migas a { color: var(--suave); text-decoration: none; border-radius: var(--r-xs); padding: .1rem .2rem; }
.migas a:hover { color: var(--marca); background: var(--acento); }
.migas li + li::before, .migas span + span::before { content: '/'; margin-right: .3rem; color: var(--tenue); }
.migas [aria-current="page"] { color: var(--texto); font-weight: 600; }

/* --- Pista emergente (tooltip) -------------------------------------------
   Solo CSS y sin marcado extra: cualquier elemento con data-pista la enseña
   al pasar por encima o al recibir el foco con el tabulador.               */
[data-pista] { position: relative; }
[data-pista]::after {
  content: attr(data-pista);
  position: absolute; bottom: calc(100% + 6px); left: 50%;
  transform: translateX(-50%) translateY(3px);
  background: var(--texto); color: var(--fondo);
  padding: .3rem .55rem; border-radius: var(--r-sm);
  font-size: .75rem; font-weight: 500; line-height: 1.35;
  white-space: nowrap; max-width: 18rem; text-transform: none; letter-spacing: 0;
  opacity: 0; pointer-events: none; z-index: 150;
  transition: opacity var(--ms-2) var(--ease), transform var(--ms-2) var(--ease);
}
[data-pista]:hover::after, [data-pista]:focus-visible::after { opacity: 1; transform: translateX(-50%); }
/* En pantalla táctil no hay "pasar por encima": la pista nunca se cierra y
   tapa lo de al lado, así que se retira. */
@media (hover: none) { [data-pista]::after { display: none; } }

/* --- Avatar: estado y pila ------------------------------------------------ */
.avatar.lg { width: 46px; height: 46px; font-size: 1.05rem; }
.avatar.xl { width: 64px; height: 64px; font-size: 1.4rem; }
.av-estado { position: relative; display: inline-flex; flex: none; }
.av-estado > .punto {
  position: absolute; right: -1px; bottom: -1px;
  width: 11px; height: 11px; border-radius: 50%;
  border: 2px solid var(--superficie); background: var(--tenue);
}
.av-estado > .punto.on { background: var(--verde-vivo); }
.av-estado > .punto.away { background: var(--amarillo); }

/* --- Cambio de tema, en la cabecera --------------------------------------- */
.tema-btn svg { width: 1.1rem; height: 1.1rem; }
/* El sol y la luna giran al cambiar: un gesto de 240 ms que dice «ha
   cambiado» sin hacer esperar a nadie. */
html:not(.sin-transicion) .tema-btn svg { animation: gira-tema var(--ms-4) var(--ease-enfasis); }
@keyframes gira-tema { from { transform: rotate(-60deg) scale(.7); opacity: 0; } to { transform: none; opacity: 1; } }
/* Cada tema enseña el icono del otro: el botón dice adónde vas, no dónde estás. */
.tema-btn .ico-luna { display: none; }
html[data-tema="oscuro"] .tema-btn .ico-luna { display: block; }
html[data-tema="oscuro"] .tema-btn .ico-sol { display: none; }

/* --- Contenedor con desplazamiento suave ---------------------------------- */
.scroll-area { scrollbar-width: thin; scrollbar-color: var(--scroll-pulgar) transparent; overscroll-behavior: contain; }
.scroll-area::-webkit-scrollbar { width: 10px; height: 10px; }
.scroll-area::-webkit-scrollbar-track { background: transparent; }
.scroll-area::-webkit-scrollbar-thumb { background: var(--scroll-pulgar); border-radius: var(--r-full); border: 3px solid transparent; background-clip: content-box; }

/* --- Utilidades de maquetación -------------------------------------------- */
.pila { display: flex; flex-direction: column; gap: .6rem; }
.fila { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }
.fila-entre { display: flex; align-items: center; justify-content: space-between; gap: .6rem; flex-wrap: wrap; }
.empujar { margin-left: auto; }

/* =========================================================================
   9. PANTALLA TÁCTIL
   -------------------------------------------------------------------------
   Varios botones de la app miden 24–28px. Con ratón se aciertan; con el dedo
   no, y en una bandeja de recados fallar el botón de "resuelto" significa
   abrir el recado entero. En vez de agrandarlos —lo que descuadraría las
   filas— se amplía solo la zona que responde al toque, con una capa invisible
   centrada en el botón. La apariencia no cambia; el objetivo sí.
   ========================================================================= */
@media (pointer: coarse) {
  .md-acc button, .rc-acc button, .icon-btn,
  .toast .t-cerrar, .coment-del {
    position: relative;
  }
  .md-acc button::after, .rc-acc button::after, .icon-btn::after,
  .toast .t-cerrar::after, .inp-grupo > .ig-btn::after, .coment-del::after {
    content: ''; position: absolute; top: 50%; left: 50%;
    width: max(100%, 44px); height: max(100%, 44px);
    transform: translate(-50%, -50%);
  }
  /* Las filas de lista que se abren al tocarlas necesitan altura suficiente
     por sí mismas, no solo sus botones. */
  .md-row, .rc-row, .venc-item, .plazo-row { min-height: 48px; }
  .side-nav a, #navsheet .sheet-grid a { min-height: 44px; }
  .combo-op, .atajo-plazo .btn-sec { min-height: 44px; justify-content: center; }
}

/* =========================================================================
   10. DETALLES DE INTERACCIÓN
   -------------------------------------------------------------------------
   Los remates de interfaces.rauno.me: cosas diminutas que no se ven en una
   captura pero que separan una interfaz que "funciona" de una que se siente
   terminada. Cada bloque dice qué se rompía sin él.
   ========================================================================= */

/* --- El hover solo existe donde hay un puntero que lo produce -------------
   En pantalla táctil el navegador deja :hover PEGADO tras el toque: tocas
   una fila de recados, se abre el detalle, y al volver la fila sigue
   resaltada como si el dedo siguiera encima. Con (hover: hover) el resaltado
   solo se aplica donde de verdad hay ratón.                                */
@media (hover: none) {
  .md-row:hover, .rc-row:hover, .venc-item:hover, .person:hover,
  .mon-card:hover, .item:hover, .task:hover, .subv-card:hover,
  tbody tr:hover, .side-nav a:hover, .cal-task:hover, .miembro:hover {
    background: inherit;
    border-color: var(--borde);
    box-shadow: none;
    transform: none;
  }
  .person:hover, .mon-card:hover { border-color: var(--borde); }
  .chat-msg:hover { background: none; }
  .chat-msg.me-menciona:hover { background: var(--oro-bg); }
  .md-count:hover, .con-ejemplo:hover, .stat:hover { transform: none; box-shadow: var(--sh-xs); }
}

/* --- Nada de resaltado azul del sistema al tocar -------------------------
   Estaba puesto solo en la barra inferior. En el resto de la app, cada toque
   dejaba un destello azul de Android encima de nuestros propios colores.   */
a, button, .md-row, .rc-row, .person, .mon-card, .cal-task,
.task, .miembro, .rdest, .venc-item, .subv-card {
  -webkit-tap-highlight-color: transparent;
}

/* --- Lo que se pulsa no se selecciona ------------------------------------
   Al pulsar dos veces seguidas sobre una fila o un botón, el navegador
   seleccionaba su texto y lo dejaba en azul. En un tablero que se usa a
   golpe de clic pasa constantemente.                                       */
button, .seg button, .md-row, .rc-row, .col-head, .tabs-est button,
.rdest, .miembro, .cal-task, .th-sort, .nav-sep, .cell-edit {
  -webkit-user-select: none; user-select: none;
}
/* El contenido sigue siendo seleccionable donde el usuario lo necesita:
   copiar un NIF de una tabla o el texto de un recado. */
td, .rc-exp, .item .cuerpo, .dt-v, .coment-text, .con-resp, .dt-coment {
  -webkit-user-select: text; user-select: text;
}

/* --- Lo decorativo no intercepta el ratón --------------------------------
   El halo de la pantalla de acceso cubre toda la ventana; sin esto se come
   los clics de la tarjeta que tiene debajo.                                */
.login-curvas, .sk, .empty-ico, .col-dot, .sem-dot, .md-dot, .rc-dot {
  pointer-events: none;
}

/* --- El peso de la letra no cambia al pasar por encima -------------------
   Pasar de 600 a 700 en hover reflowea la fila entera y el texto "salta".
   Si hace falta reforzar, se refuerza el color, no el grosor.              */
.side-nav a, .seg button, .migas a, .md-row, .rc-row { font-synthesis-weight: none; }

/* --- Cambio de tema sin animación ----------------------------------------
   Con las transiciones activas, pasar a oscuro hacía que cada panel, borde
   y etiqueta virara a su ritmo: medio segundo de arcoíris desordenado.
   app.js pone .sin-transicion mientras cambia y la quita en el fotograma
   siguiente, así el tema salta de golpe y el resto de la app sigue animada. */
html.sin-transicion, html.sin-transicion *, html.sin-transicion *::before, html.sin-transicion *::after {
  transition: none !important;
  animation: none !important;
}

/* --- Un botón desactivado no lleva pista emergente -----------------------
   Prometía explicar algo y al pasar por encima no aparecía nada.           */
[data-pista]:disabled::after, [data-pista][aria-disabled="true"]::after { display: none; }

/* =========================================================================
   11. PLAYBOOK (ui-skills.com)
   ========================================================================= */

/* --- Iconos -------------------------------------------------------------
   Escalan con la letra y heredan su color, que es lo que un emoji no puede
   hacer. El grosor sigue su regla: 2px junto a texto semibold, 1,5px junto a
   texto normal; 1,9px es el punto medio con el que vive esta app.          */
.ico { width: 1.05em; height: 1.05em; flex: none; vertical-align: -.14em; }
.ico-sm { width: .95em; height: .95em; }
/* Los botones de icono pasan de contener un emoji de ancho variable a un
   trazo de tamaño fijo: se centran de verdad y quedan cuadrados. */
.icon-btn, .md-acc button, .rc-acc button {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.9rem;
}

/* --- Medida de lectura (60-75 caracteres) --------------------------------
   main es fluido a propósito, porque las tablas necesitan todo el ancho.
   Pero el texto corrido heredaba esa anchura: en un monitor de 27 pulgadas
   el cuerpo de un anuncio salía a más de 200 caracteres por línea y el ojo
   pierde el renglón al volver. El tope solo afecta a la prosa.            */
.item .cuerpo, .coment-text, .dt-coment, .rc-exp .msg-cuerpo,
p.lead, .md-vacio .txt, .det-info {
  max-width: 68ch;
}
/* Equilibra el corte de los titulares en vez de dejar una palabra huérfana
   en la última línea; text-pretty hace lo propio con la prosa. */
h1, h2, h3, h4, .title, .empty-tit, .a-tit { text-wrap: balance; }
p, .empty-txt, .field-hint, .lead { text-wrap: pretty; }

/* --- Radio anidado: interior = exterior − relleno ------------------------
   Una tarjeta de radio 14 dentro de un panel de radio 14 deja las esquinas
   descuadradas: el hueco entre ambas curvas no es constante. Con el relleno
   del panel (16px) descontado, las curvas quedan concéntricas.            */
.panel > .item, .panel > .task, .panel > .md-list, .panel > .rc-list,
.col > .task, .panel > table.tablareg { border-radius: var(--r-sm); }
.panel > .item:first-child, .panel > .task:first-child { margin-top: 0; }

/* --- El estado nunca depende solo del color ------------------------------
   El semáforo de plazos de Subvenciones era un punto de color y nada más.
   Quien no distingue rojo de verde —en torno al 8% de los hombres— no veía
   ninguna información. Ahora cada color lleva además una forma distinta.  */
.sem-dot {
  position: relative;
  display: inline-grid; place-content: center;
  color: var(--sobre-peligro); font-size: 8px; font-weight: 600; line-height: 1;
}
.sem-dot.verde::after  {
  content: ''; width: 7px; height: 7px; background: currentColor;
  -webkit-mask: var(--ico-hecho) center / contain no-repeat; mask: var(--ico-hecho) center / contain no-repeat;
}
.sem-dot.ambar::after, .sem-dot.rojo::after {
  content: ''; width: 7px; height: 7px; background: currentColor;
  -webkit-mask: var(--ico-exclama) center / contain no-repeat; mask: var(--ico-exclama) center / contain no-repeat;
}
.sem-dot.gris::after {
  content: ''; width: 5px; height: 5px; background: currentColor;
  -webkit-mask: var(--ico-punto) center / contain no-repeat; mask: var(--ico-punto) center / contain no-repeat;
}
.sem-dot.ambar, .sem-dot.verde { color: var(--sobre-peligro); }

/* --- Fondo de los desplazables que continúan ------------------------------
   Una tabla que sigue a la derecha no lo anuncia de ninguna forma hasta que
   alguien la arrastra por casualidad. El desvanecido del borde lo dice.   */
.panel:has(table.tablareg) {
  --fade: 0px;
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--fade)), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - var(--fade)), transparent);
}
/* Apagado de fábrica y encendido por app.js solo mientras quede tabla a la
   derecha: así, si el guion fallara, la última columna se ve entera en vez de
   quedar difuminada para siempre. */

/* --- Hundimiento al pulsar con escala (regla 6) --------------------------
   Su recomendación es escala ~0.96 en vez del desplazamiento de 1px: se
   percibe igual de bien y no descuadra la fila de al lado.                */
.btn:active:not(:disabled), .btn-sec:active:not(:disabled),
.btn-peligro:active:not(:disabled), .btn-fantasma:active:not(:disabled) {
  transform: scale(.97);
}
.icon-btn:active, .md-acc button:active, .rc-acc button:active { transform: scale(.94); }

/* =========================================================================
   13. EL ANILLO DE FOCO SIEMPRE GANA
   -------------------------------------------------------------------------
   Los botones y las fichas llevan su propia sombra (volumen, carril de
   prioridad), y al ir después del anillo global se la comían: con el
   tabulador, «Salir» o una tarjeta de Mi día no enseñaban dónde estaba el
   foco. Va al final para ganar a todas.
   ========================================================================= */
.btn:focus-visible, .btn-sec:focus-visible, .btn-fantasma:focus-visible, .icon-btn:focus-visible,
.top-ico:focus-visible, .top-yo:focus-visible, .side-marca:focus-visible, .side-nav a:focus-visible, .side-nav .nav-sep:focus-visible,
.chat-conv:focus-visible, .md-count:focus-visible, .con-ejemplo:focus-visible, .seg button:focus-visible,
.tabs-est button:focus-visible, #tabbar a:focus-visible, #navsheet a:focus-visible, .md-acc button:focus-visible,
.rc-acc button:focus-visible, .rdest:focus-visible, .person:focus-visible, .mon-card:focus-visible,
.cal-task:focus-visible, .chat-chip:focus-visible, .con-enviar:focus-visible, .con-accion:focus-visible,
.task:focus-visible, .stat:focus-visible, .bus-fila:focus-visible, .msg-resultado:focus-visible {
  box-shadow: var(--ring-sombra);
}
.btn-peligro:focus-visible { box-shadow: var(--ring-peligro); }

/* =========================================================================
   14. PIEZAS DE ACV 21
   -------------------------------------------------------------------------
   Lo que el gestor de ESECE no tiene porque no lo necesita: el catálogo de
   productos, el calculador de primas y comisiones, la ficha de solicitud,
   las campañas y la lista de comprobación de Auto Selección. Todo con las
   mismas fichas, así que hereda el modo oscuro y el anillo de foco.
   ========================================================================= */

/* --- Tablero de tareas: los estados del panel (pendiente, en curso, hecha) */
.col-dot.hecha { background: var(--verde); }
.col-dot.bloqueada { background: var(--rojo); }
.kanban[data-movil="hecha"] .col:not([data-col="hecha"]) { display: none; }
.task.hecha .t-tit { text-decoration: line-through; color: var(--suave); }
.task.hecha { opacity: .78; }

/* --- Antetítulo con la raya de la estrella (como la fecha de Mi día) --- */
.antetitulo {
  display: flex; align-items: center; gap: .6rem;
  font-size: .72rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--tenue);
}
.antetitulo::before { content: ''; width: 1.6rem; height: 2px; border-radius: 2px; background: var(--oro); }

/* --- Catálogo de productos --------------------------------------------- */
.prod-filtros { margin-bottom: 1rem; }
.prod-filtros .seg { flex-wrap: wrap; }
@media (max-width: 600px) { .prod-filtros .seg { flex-wrap: nowrap; } .prod-filtros .inp { max-width: none !important; } }
.prod-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(17.5rem, 1fr)); gap: .9rem; }
.prod-card {
  position: relative; display: flex; flex-direction: column; gap: .55rem;
  text-align: left; font: inherit; color: inherit; cursor: pointer;
  background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
  padding: 1.1rem 1.15rem 1rem; box-shadow: var(--sh-xs);
  transition: box-shadow var(--ms-2) var(--ease), transform var(--ms-2) var(--ease), border-color var(--ms-2) var(--ease);
}
.prod-card:hover { box-shadow: var(--sh-md); transform: translateY(-2px); border-color: var(--borde-fuerte); }
.prod-card.apagado { opacity: .62; }
.prod-cab { display: flex; align-items: flex-start; justify-content: space-between; gap: .6rem; }
.prod-card h3 {
  font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none;
  font-size: 1.32rem; line-height: 1.12; letter-spacing: -.01em;
}
.prod-res { font-size: .86rem; color: var(--suave); line-height: 1.45; flex: 1; }
.prod-pie {
  display: flex; align-items: flex-end; justify-content: space-between; gap: .6rem;
  padding-top: .65rem; margin-top: .1rem; border-top: 1px dashed var(--borde);
}
.prod-desde { font-size: .74rem; color: var(--tenue); }
.prod-desde b { display: block; font-family: var(--fuente-titulo); font-weight: 400; font-size: 1.35rem; color: var(--texto); letter-spacing: -.01em; }
.prod-comi { text-align: right; font-size: .72rem; color: var(--tenue); }
.prod-comi b { display: block; font-size: 1.05rem; color: var(--verde); font-weight: 650; }
.lista-check { list-style: none; display: grid; gap: .35rem; margin: .4rem 0 1rem; }
.lista-check li { display: flex; gap: .55rem; align-items: flex-start; font-size: .9rem; line-height: 1.45; }
.lista-check li > .ico { margin-top: .18rem; color: var(--verde); flex: none; }
.lista-check.no li > .ico { color: var(--rojo); }
.dl { display: grid; grid-template-columns: minmax(8rem, max-content) 1fr; gap: .35rem 1rem; font-size: .88rem; margin: .3rem 0 1rem; }
.dl dt { color: var(--tenue); font-weight: 600; font-size: .78rem; text-transform: uppercase; letter-spacing: .05em; padding-top: .1rem; }
.dl dd { overflow-wrap: anywhere; }
@media (max-width: 600px) { .dl { grid-template-columns: 1fr; gap: .1rem; } .dl dd { margin-bottom: .45rem; } }

/* --- Calculador --------------------------------------------------------
   El formulario a la izquierda y el resultado a la derecha, fijo mientras
   se rellena: cada cambio se ve sin buscarlo. En el móvil, el resultado
   va debajo y se queda pegado al pie como una barra.                      */
.calc { display: grid; grid-template-columns: minmax(0, 1fr) minmax(17rem, 22rem); gap: 1.2rem; align-items: start; }
.calc-res { position: sticky; top: calc(var(--alto-barra) + var(--margen-hoja) + 1rem); }
.resul {
  background: var(--cubierta); color: var(--sobre-cubierta); border-radius: var(--r-xl);
  padding: 1.2rem 1.25rem 1.15rem; box-shadow: var(--sh-lg); position: relative; overflow: hidden; isolation: isolate;
}
.resul::after {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background-image: var(--grano); background-size: 180px; opacity: .08; mix-blend-mode: overlay;
}
.resul .r-lbl { font-size: .7rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--sobre-cubierta-suave); }
.resul .r-prima { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 2.6rem; line-height: 1.05; letter-spacing: -.02em; margin: .2rem 0 .1rem; }
.resul .r-sub { font-size: .82rem; color: var(--sobre-cubierta-suave); }
.resul .r-comi {
  margin-top: 1rem; padding: .85rem .95rem; border-radius: var(--r-lg);
  background: rgba(var(--oro-rgb), .14); box-shadow: inset 0 0 0 1px rgba(var(--oro-rgb), .38);
}
.resul .r-comi b { display: block; font-family: var(--fuente-titulo); font-weight: 400; font-size: 2rem; line-height: 1.05; color: var(--oro); }
.resul .r-comi span { font-size: .8rem; color: var(--sobre-cubierta-suave); }
.resul .r-filas { margin-top: .8rem; display: grid; gap: .3rem; font-size: .82rem; }
.resul .r-fila { display: flex; justify-content: space-between; gap: .8rem; color: var(--sobre-cubierta-suave); }
.resul .r-fila b { color: var(--sobre-cubierta); font-weight: 600; white-space: nowrap; }
.resul .r-error { margin-top: .5rem; font-size: .84rem; color: #F5C85A; }
.resul .btn { margin-top: 1rem; width: 100%; background-color: var(--oro); color: #0E1B2C; border-color: #E0A30F; }
.resul .btn:hover:not(:disabled) { background-color: #F4AE0D; }
.resul .r-nota { margin-top: .75rem; font-size: .72rem; line-height: 1.45; color: var(--sobre-cubierta-suave); }
@media (max-width: 900px) {
  .calc { grid-template-columns: 1fr; }
  .calc-res { position: static; }
}

/* Asegurados: una fila por persona, con su edad o su fecha de nacimiento. */
.aseg-lista { display: grid; gap: .5rem; margin-bottom: .8rem; }
.aseg-fila {
  display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, .7fr) auto; gap: .5rem; align-items: center;
  padding: .55rem .6rem; border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie-2);
}
.aseg-fila .inp { margin: 0; }
.aseg-fila .a-edad { font-size: .8rem; color: var(--suave); white-space: nowrap; }
.aseg-fila .a-err { grid-column: 1 / -1; font-size: .78rem; color: var(--rojo); font-weight: 600; }
@media (max-width: 600px) {
  /* Nombre arriba, a todo lo ancho; debajo, fecha, edad (o pack) y quitar. */
  .aseg-fila { grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr) auto; }
  .aseg-fila > :nth-child(1) { grid-column: 1 / -1; }
}

/* --- Lista de comprobación (Auto Selección) ----------------------------
   Sí, no y «falta el dato»: tres formas, no solo tres colores.            */
.compr { list-style: none; display: grid; gap: .3rem; margin: .5rem 0 0; }
.compr li { display: flex; align-items: flex-start; gap: .55rem; font-size: .88rem; line-height: 1.4; }
.compr .c-ico {
  flex: none; width: 1.25rem; height: 1.25rem; border-radius: 50%; margin-top: .05rem;
  display: inline-flex; align-items: center; justify-content: center;
}
.compr .c-ico .ico { width: .8rem; height: .8rem; }
.compr .ok .c-ico { background: var(--verde-bg); color: var(--verde); }
.compr .ko .c-ico { background: var(--rojo-bg); color: var(--rojo); }
.compr .nd .c-ico { background: var(--neutro-bg); color: var(--neutro); }
.compr .nd { color: var(--suave); }
.resul .compr li { color: var(--sobre-cubierta); }
.resul .compr .ok .c-ico { background: rgba(127, 203, 138, .2); color: #9FE0A9; }
.resul .compr .ko .c-ico { background: rgba(240, 138, 124, .2); color: #F6A99E; }
.resul .compr .nd .c-ico { background: rgba(244, 239, 230, .12); color: var(--sobre-cubierta-suave); }
.veredicto { display: flex; align-items: center; gap: .6rem; padding: .7rem .85rem; border-radius: var(--r-lg); font-weight: 600; font-size: .9rem; margin-top: .6rem; }
.veredicto.si { background: var(--verde-bg); color: var(--verde); }
.veredicto.no { background: var(--neutro-bg); color: var(--neutro); }
.veredicto.nd { background: var(--amarillo-bg); color: var(--amarillo); }

/* --- Campañas --------------------------------------------------------- */
.camp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); gap: .9rem; }
.camp-card {
  position: relative; display: flex; flex-direction: column; gap: .5rem;
  background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl);
  padding: 1.15rem 1.2rem 1.05rem; box-shadow: inset 0 3px 0 var(--oro), var(--sh-xs);
}
.camp-card.interna { box-shadow: inset 0 3px 0 var(--marca), var(--sh-xs); }
.camp-card.pasada { box-shadow: inset 0 3px 0 var(--borde-fuerte), var(--sh-xs); opacity: .78; }
.camp-card h3 { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.45rem; line-height: 1.1; }
.camp-card p { font-size: .88rem; color: var(--suave); }
.camp-fechas { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; font-size: .8rem; color: var(--tenue); }
.camp-pie { display: flex; gap: .5rem; flex-wrap: wrap; margin-top: auto; padding-top: .5rem; }
.camp-dest {
  display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;
  padding: 1rem 1.15rem; margin-bottom: var(--esp-m); border-radius: var(--r-xl);
  background: var(--cubierta); color: var(--sobre-cubierta); box-shadow: var(--sh-md); position: relative; overflow: hidden; isolation: isolate;
}
.camp-dest::before {
  content: ''; position: absolute; right: -40px; top: -60px; width: 220px; height: 220px; z-index: -1; border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--oro-rgb), .3), transparent 65%);
}
.camp-dest .cd-txt { flex: 1; min-width: 14rem; }
.camp-dest .cd-tit { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.5rem; line-height: 1.1; }
.camp-dest .cd-sub { font-size: .86rem; color: var(--sobre-cubierta-suave); margin-top: .2rem; }
.camp-dest .cd-dias { text-align: center; }
.camp-dest .cd-dias b { display: block; font-family: var(--fuente-titulo); font-weight: 400; font-size: 2.2rem; line-height: 1; color: var(--oro); }
.camp-dest .cd-dias span { font-size: .72rem; letter-spacing: .08em; text-transform: uppercase; color: var(--sobre-cubierta-suave); }
.camp-dest .btn-sec { background: var(--sobre-cubierta-acento); color: var(--sobre-cubierta); border-color: rgba(244, 239, 230, .2); }
.camp-dest .btn-sec svg { color: var(--sobre-cubierta-suave); }
.camp-dest .btn-sec:hover { background: rgba(244, 239, 230, .16); }
.reparto { display: flex; flex-wrap: wrap; gap: .35rem; }
.pre-copia {
  white-space: pre-wrap; font: inherit; font-size: .86rem; line-height: 1.55;
  background: var(--gris); border: 1px solid var(--borde-suave); border-radius: var(--r-md);
  padding: .8rem .9rem; margin: .3rem 0 1rem; max-height: 22rem; overflow: auto;
}

/* --- Solicitudes: el camino de una petición ---------------------------- */
.pasos { display: flex; gap: .25rem; margin: .2rem 0 1rem; }
.pasos li {
  list-style: none; flex: 1; min-width: 0; text-align: center;
  font-size: .7rem; font-weight: 600; letter-spacing: .02em; color: var(--tenue);
  padding-top: .55rem; border-top: 3px solid var(--borde);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pasos li.hecho { color: var(--marca); border-top-color: var(--marca); }
.pasos li.actual { color: var(--texto); border-top-color: var(--oro); }
.pasos.cerrada li { border-top-color: var(--borde); color: var(--tenue); }
.sol-cab { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-bottom: .6rem; }
.sol-num { font-family: var(--fuente-mono); font-size: .78rem; color: var(--tenue); }
.sol-grid { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 1rem; align-items: start; }
@media (max-width: 900px) { .sol-grid { grid-template-columns: 1fr; } }
.hilo-sol { display: flex; flex-direction: column; gap: .15rem; max-height: 26rem; overflow-y: auto; padding: .2rem .1rem .6rem; }
.sis-msg { display: flex; align-items: center; gap: .5rem; font-size: .78rem; color: var(--tenue); padding: .3rem .5rem; }
.sis-msg::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--borde-fuerte); flex: none; }
.chat-msg.interna { background: var(--oro-bg); box-shadow: inset 3px 0 0 var(--oro); }
.escribir-sol { display: flex; gap: .4rem; align-items: flex-end; border-top: 1px solid var(--borde-suave); padding-top: .7rem; }
.escribir-sol textarea.inp { margin: 0; min-height: 2.6rem; flex: 1; }
.comi-caja { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; margin-top: .5rem; }
.comi-caja > div { background: var(--gris); border-radius: var(--r-md); padding: .6rem .7rem; }
.comi-caja b { display: block; font-size: 1.1rem; font-weight: 650; }
.comi-caja span { font-size: .74rem; color: var(--tenue); }
.comi-caja .verde b { color: var(--verde); }

/* Filas de una lista con su estado a la derecha (bandeja de solicitudes). */
.fila-sol { display: flex; align-items: center; gap: .85rem; }
.fila-sol .fs-main { flex: 1; min-width: 0; }
.fila-sol .fs-l1 { font-weight: 600; font-size: .93rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fila-sol .fs-l2 { font-size: .78rem; color: var(--suave); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fila-sol .fs-der { display: flex; flex-direction: column; align-items: flex-end; gap: .2rem; flex: none; }
.fila-sol .fs-imp { font-size: .8rem; font-weight: 600; color: var(--verde); white-space: nowrap; }

/* Opciones en tarjeta (elegir producto o tipo de cliente): radio grande. */
.opciones { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: .5rem; margin-bottom: 1rem; }
.opcion {
  display: flex; align-items: center; gap: .6rem; padding: .7rem .8rem; cursor: pointer; margin: 0;
  border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie);
  font-weight: 500; font-size: .88rem; line-height: 1.25;
  transition: border-color var(--ms-1) var(--ease), background-color var(--ms-1) var(--ease), box-shadow var(--ms-1) var(--ease);
}
.opcion:hover { border-color: var(--borde-fuerte); }
.opcion:has(input:checked) { border-color: var(--marca); background: var(--marca-claro); box-shadow: inset 0 0 0 1px var(--marca); color: var(--marca); font-weight: 600; }
.opcion input { flex: none; }

.paso-tit { display: flex; align-items: center; gap: .6rem; margin: 1.3rem 0 .7rem; font-size: .74rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--suave); }
.paso-tit .n {
  display: inline-flex; align-items: center; justify-content: center; width: 1.45rem; height: 1.45rem; border-radius: 50%;
  background: var(--marca-solida); color: var(--sobre-marca); font-size: .72rem; letter-spacing: 0;
}
.paso-tit:first-child { margin-top: 0; }
.consent {
  display: flex; gap: .65rem; align-items: flex-start; padding: .8rem .9rem; margin: .4rem 0 1rem;
  border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie-2);
  font-weight: 500; font-size: .86rem; line-height: 1.45; cursor: pointer;
}
.consent input { margin-top: .15rem; flex: none; }

/* --- Equipo y colaboradores: tarjeta por persona ------------------------ */
.gente { display: grid; grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); gap: .85rem; }
.persona-card { background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-xl); padding: 1rem 1.05rem; box-shadow: var(--sh-xs); display: flex; flex-direction: column; }
.persona-card.suspendida { opacity: .6; }
.pc-cab { display: flex; align-items: center; gap: .75rem; margin-bottom: .8rem; }
.pc-nom { font-weight: 650; font-size: .98rem; line-height: 1.2; overflow-wrap: anywhere; }
.pc-meta { font-size: .78rem; color: var(--suave); overflow-wrap: anywhere; }
.pc-cifras { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .4rem; text-align: center; }
.pc-cifras > div { background: var(--gris); border-radius: var(--r-md); padding: .45rem .3rem; }
.pc-cifras b { display: block; font-size: 1.15rem; font-weight: 650; line-height: 1.2; }
.pc-cifras span { font-size: .68rem; color: var(--tenue); }
.pc-cifras .rojo b { color: var(--rojo); }
.pc-cifras .verde b { color: var(--verde); }
/* Las acciones de la tarjeta, todas del mismo ancho; la principal (Liquidar), a lo ancho. */
/* Al pie de la tarjeta, para que en una fila de tarjetas los botones queden a la misma altura. */
.pc-acc { display: grid; grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr)); gap: .4rem; margin-top: auto; padding-top: .8rem; }
.pc-acc > .btn, .pc-acc > .btn-sec { width: 100%; justify-content: center; }
.pc-acc > .pc-ancho { grid-column: 1 / -1; }
.pc-avisos { display: flex; flex-wrap: wrap; gap: .3rem; margin: -.25rem 0 .75rem; }
.pc-codigo { font-family: var(--fuente-mono); font-size: .74rem; letter-spacing: .04em; }

/* --- Venta cruzada ---------------------------------------------------- */
.vc-barra { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-bottom: 1rem; }
.vc-sync { font-size: .8rem; color: var(--suave); flex: 1 1 100%; }
.vc-cifras { display: grid; grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr)); gap: .55rem; margin-bottom: 1rem; }
.vc-cifra {
  text-align: left; font: inherit; color: inherit; cursor: pointer;
  background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg); padding: .6rem .75rem; box-shadow: var(--sh-xs);
  transition: border-color var(--ms-1) var(--ease), box-shadow var(--ms-1) var(--ease);
}
.vc-cifra:hover { border-color: var(--borde-fuerte); box-shadow: var(--sh-sm); }
.vc-cifra.on { border-color: var(--marca); box-shadow: inset 0 0 0 1px var(--marca); }
.vc-cifra .n { font-family: var(--fuente-titulo); font-weight: 400; font-size: 1.65rem; line-height: 1.05; }
.vc-cifra .l { font-size: .74rem; color: var(--suave); line-height: 1.3; margin-top: .15rem; }
.vc-cifra.campana { box-shadow: inset 0 3px 0 var(--oro), var(--sh-xs); }
.item.vence { box-shadow: inset 3px 0 0 var(--amarillo), var(--sh-xs); }
.vc-contacto { display: flex; flex-wrap: wrap; gap: .25rem .9rem; font-size: .86rem; margin-top: .35rem; }
.vc-contacto a, .vc-contacto span { display: inline-flex; align-items: center; gap: .3rem; }
.vc-contacto .ico { color: var(--tenue); }
.vc-ramos { display: flex; flex-wrap: wrap; gap: .3rem; align-items: center; }
.poli { font-family: var(--fuente-mono); font-size: .78rem; }
.rel-tag { min-width: 5.6rem; justify-content: center; }
.ramo-barra { height: 5px; background: var(--gris); border-radius: var(--r-full); overflow: hidden; margin-top: .3rem; }
.ramo-barra i { display: block; height: 100%; background: var(--marca); border-radius: var(--r-full); }
.tarif { margin-top: 1rem; border: 1px solid rgba(var(--marca-rgb), .3); border-radius: var(--r-xl); background: var(--marca-claro); padding: 1rem 1.05rem; }
.tarif .tarif-res { background: var(--superficie); border-radius: var(--r-md); padding: .6rem .75rem; margin-top: .6rem; font-size: .88rem; }
.tarif .t-fila { display: flex; justify-content: space-between; gap: .6rem; padding: .3rem 0; border-bottom: 1px solid var(--borde-suave); }
.tarif .t-fila:last-child { border-bottom: 0; }
.tarif .t-total { font-weight: 650; }
.loc-lista { display: grid; gap: .15rem; margin: -.5rem 0 .8rem; }
.loc-lista button { text-align: left; border: 0; background: var(--superficie); border-radius: var(--r-sm); padding: .4rem .55rem; font: inherit; font-size: .84rem; }
.loc-lista button:hover { background: var(--marca-claro); }

/* --- Instalar como aplicación ---------------------------------------- */
.instalar {
  display: flex; align-items: center; gap: .8rem; flex-wrap: wrap;
  padding: .8rem 1rem; margin-bottom: var(--esp-s); border-radius: var(--r-xl);
  background: var(--marca-claro); border: 1px solid rgba(var(--marca-rgb), .25);
}
.instalar .i-txt { flex: 1; min-width: 12rem; font-size: .88rem; }
.instalar .i-txt b { display: block; }

/* --- Texto de ayuda que nunca falta en un formulario de datos --------- */
.nota-legal { font-size: .76rem; color: var(--tenue); line-height: 1.5; margin-top: .4rem; }
.numero-grande { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; letter-spacing: -.02em; }
.texto-derecha { text-align: right; }
.sin-margen { margin: 0 !important; }

/* --- Entrada: las isobatas de la web en lugar de las curvas de nivel ----
   El mapa vive en img/isobatas.svg (el mismo de acv21.es) y se usa con
   <use>: hereda el color con currentColor y no engorda el HTML. */
.login-curvas { color: #6CB8E4; opacity: .34; }
.login-curvas use { animation: deriva 38s ease-in-out infinite alternate; transform-origin: 50% 50%; transform-box: fill-box; }
[hidden] { display: none !important; }

/* --- Chat del equipo: un solo canal, sin lista a la izquierda ---------- */
.chat.chat-solo { grid-template-columns: minmax(0, 1fr); }
@media (max-width: 820px) {
  .chat.chat-solo.chat-abierto {
    display: flex; flex-direction: column; min-height: 360px;
    height: calc(100vh - var(--chat-arriba, 150px) - 96px - var(--abajo-seguro));
    height: calc(100dvh - var(--chat-arriba, 150px) - 96px - var(--abajo-seguro));
    border: 1px solid var(--borde); border-radius: var(--r-xl); background: var(--superficie); overflow: hidden;
  }
  .chat.chat-solo .chat-hilo { display: flex; flex: 1; min-height: 0; }
}

/* Arreglos vistos al recorrer el simulador (03/10/2026) */
.fila-sol .fs-main { display: flex; flex-direction: column; gap: .1rem; }
.fila-sol .fs-l1, .fila-sol .fs-l2 { display: block; }
/* Los segmentos no se parten en dos renglones: si no caben, se deslizan. */
.seg { max-width: 100%; overflow-x: auto; scrollbar-width: none; }
.seg::-webkit-scrollbar { display: none; }
.seg button { white-space: nowrap; flex: none; }
.seg.bloque button { flex: 1 0 auto; }
/* Seis cifras en dos filas de tres, no en cuatro y dos. */
@media (min-width: 821px) {
  .md-counts:has(> :nth-child(6):last-child) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* Una cifra larga (un importe) no cabe al tamaño de un contador. */
.md-count .n.n-largo { font-size: clamp(1.5rem, 4.2vw, 2.1rem); white-space: nowrap; }
@media (max-width: 600px) { .md-count .n.n-largo { font-size: 1.45rem; } }

/* --- Sin cursor de texto parpadeando -------------------------------------
   El cursor de escribir solo aparece en un campo que se ha tocado. En el
   resto (títulos, tarjetas, filas, menú) no: ni al pulsar ni con la
   navegación con cursor del navegador (F7), que lo pinta en cualquier texto.
   Lo que se pulsa tampoco se selecciona; lo que se copia (teléfonos,
   correos, pólizas, mensajes, tablas), sí.                                 */
html, body, *, *::before, *::after { caret-color: transparent; }
input, textarea, [contenteditable="true"], [contenteditable=""] { caret-color: var(--marca); }
input[type="checkbox"], input[type="radio"], input[type="range"] { caret-color: transparent; }
header.top, aside.side, #tabbar, #navsheet, .page-head, .md-head, .md-count, .md-sec, .camp-dest, .prod-card,
.persona-card .pc-cab, .pc-cifras, .vc-cifras, .pasos, .pestanas, .badge, .badge-tono, label, .btn, .btn-sec,
.btn-fantasma, .icon-btn, .empty, .login-cubierta, .migas, .sol-cab .fila, .comi-caja, .r-lbl, .paso-tit {
  -webkit-user-select: none; user-select: none;
}

/* --- El fondo de abajo, en el móvil ----------------------------------------
   La página no rebota por debajo de la barra de abajo (en iOS dejaba ver un
   hueco vacío al tirar), y si iOS se queda un momento con menos alto del de
   verdad (al cerrar el teclado), lo que asoma debajo de la barra es del color
   de la barra, no un agujero. La pantalla de entrada no lleva barra: ahí el
   fondo sigue siendo el de siempre.                                         */
@media (max-width: 820px) {
  html, body { overscroll-behavior-y: none; }
  html:has(#app[style*="block"]) { background: var(--superficie); }
}

/* Cabecera de la hoja «Más»: qué es y cómo se cierra. */
#navsheet .sheet-handle { margin-bottom: .35rem; }
#navsheet .sheet-cab {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  margin: 0 .1rem .5rem .25rem;
  font-size: .68rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--tenue);
}
#navsheet .sheet-x { width: 2.5rem; height: 2.5rem; flex: none; }
#navsheet .sheet { transition: transform var(--ms-2) var(--ease); }

/* --- Recomendador -------------------------------------------------------
   Preguntas en fichas que se marcan (una o varias) y, al lado, lo que le
   encaja al cliente: el resumen en la cubierta oscura, como el resultado de
   Calcular, y debajo una tarjeta por cada cosa que busca. En el escritorio
   la columna del resultado se queda fija y se desplaza sola si es larga; en
   el móvil va debajo y un botón flotante lleva a ella.                     */
.reco-sec[hidden], .preg[hidden], .chip[hidden] { display: none !important; }
.reco-sec { margin-bottom: var(--esp-s); }
.reco-sec .paso-tit { margin-bottom: .5rem; }
.preg { margin-top: 1rem; }
.reco-sec > .preg:first-of-type, .reco-sec > .preg-pista + .preg { margin-top: .6rem; }
.preg-tit { font-size: .86rem; font-weight: 600; margin-bottom: .45rem; }
.preg-pista { font-size: .8rem; color: var(--tenue); line-height: 1.45; margin: -.15rem 0 .55rem; }
.chips { display: flex; flex-wrap: wrap; gap: .45rem; }
.chip {
  display: inline-flex; align-items: center; gap: .45rem; min-height: 2.6rem; max-width: 100%;
  padding: .45rem .85rem; border: 1px solid var(--borde); border-radius: var(--r-full);
  background: var(--superficie); color: var(--texto); font: inherit; font-size: .87rem; font-weight: 500; line-height: 1.25;
  text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: border-color var(--ms-1) var(--ease), background-color var(--ms-1) var(--ease), color var(--ms-1) var(--ease), transform var(--ms-1) var(--ease);
}
.chip:hover { border-color: var(--borde-fuerte); }
.chip:active { transform: scale(.97); }
.chip:focus-visible { outline: none; box-shadow: var(--ring-sombra); border-color: var(--ring); }
.chip > .ico { width: 1.05rem; height: 1.05rem; flex: none; color: var(--suave); }
.chip[aria-pressed="true"] { border-color: var(--marca); background: var(--marca-claro); color: var(--marca); font-weight: 600; box-shadow: inset 0 0 0 1px var(--marca); }
.chip[aria-pressed="true"] > .ico { color: var(--marca); }
.chip .chip-ok { display: none; width: 1.1rem; height: 1.1rem; border-radius: 50%; background: var(--marca-solida); color: var(--sobre-marca); align-items: center; justify-content: center; flex: none; margin-right: -.3rem; }
.chip .chip-ok .ico { width: .72rem; height: .72rem; stroke-width: 3; }
.chip[aria-pressed="true"] .chip-ok { display: inline-flex; }
.reco-num { max-width: 9rem; margin-bottom: 0; }
.reco-num + .field-hint { margin: .4rem 0 0; }
.reco-num + .field-hint:empty { display: none; }
.reco-nota { display: flex; gap: .45rem; align-items: flex-start; margin: 0 .2rem var(--esp-s); }
.reco-nota .ico { flex: none; margin-top: .15rem; }

/* Edades: una cajita por persona, el titular primero. */
.edades { display: flex; flex-wrap: wrap; gap: .6rem; align-items: flex-end; }
.edad-caja { display: flex; flex-direction: column; gap: .2rem; }
.edad-caja label { font-size: .72rem; font-weight: 600; color: var(--tenue); margin: 0; }
.edad-in { display: flex; align-items: center; gap: .3rem; font-size: .8rem; color: var(--suave); }
.edad-in .inp { width: 4.1rem; margin: 0; text-align: center; padding-left: .4rem; padding-right: .4rem; font-variant-numeric: tabular-nums; }
.edad-in .icon-btn { min-height: 2.1rem; padding: .25rem .35rem; }
.edad-mas { min-height: 2.6rem; }

/* El resultado */
.reco-res { display: grid; gap: var(--esp-s); }
@media (min-width: 901px) {
  .reco .calc-res {
    /* Lo que deja la barra de arriba y el margen de abajo de la hoja: así, al
       llegar al final de la página, no se mete por debajo de la barra. */
    max-height: calc(100vh - var(--alto-barra) - 2 * var(--margen-hoja) - 1.5rem - var(--esp-l)); overflow-y: auto; overscroll-behavior: contain;
    scrollbar-width: thin; padding: 0 .35rem .35rem 0; margin-right: -.35rem;
  }
}
.reco-resul .ri-lista { display: grid; margin-top: .55rem; }
.reco-resul .ri-fila {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: 'nec precio' 'prod precio'; gap: .1rem .8rem; align-items: center;
  width: 100%; padding: .6rem 0; border: 0; border-top: 1px solid rgba(244, 239, 230, .14); background: none;
  color: inherit; font: inherit; text-align: left;
}
.reco-resul button.ri-fila { cursor: pointer; }
.reco-resul button.ri-fila:hover .ri-prod { text-decoration: underline; text-underline-offset: 3px; }
.reco-resul .ri-nec { grid-area: nec; display: flex; align-items: center; gap: .35rem; font-size: .68rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--sobre-cubierta-suave); }
.reco-resul .ri-nec .ico { width: .9rem; height: .9rem; }
.reco-resul .ri-prod { grid-area: prod; font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.2rem; line-height: 1.15; letter-spacing: -.01em; }
.reco-resul .ri-prod.ri-inc, .reco-resul .ri-prod.ri-no { font-family: var(--fuente); font-size: .88rem; color: var(--sobre-cubierta-suave); }
.reco-resul .ri-precio { grid-area: precio; font-size: .86rem; font-weight: 600; white-space: nowrap; color: var(--sobre-cubierta); }

.reco-card { display: flex; flex-direction: column; gap: .5rem; margin: 0; }
.reco-card .rc-cab { display: flex; align-items: center; justify-content: space-between; gap: .6rem; }
.reco-card h3 { font-family: var(--fuente-titulo); font-weight: 400; font-synthesis: none; font-size: 1.45rem; line-height: 1.12; letter-spacing: -.01em; }
.reco-card .rc-nota { font-size: .9rem; color: var(--suave); line-height: 1.5; }
.rc-precio { display: flex; flex-wrap: wrap; align-items: baseline; gap: .2rem .7rem; font-size: .82rem; color: var(--suave); }
.rc-precio b { font-size: 1.05rem; color: var(--texto); font-weight: 650; }
.rc-precio .rc-com { flex-basis: 100%; color: var(--verde); font-weight: 600; }
.reco-card .lista-check { margin: .2rem 0 0; }
.reco-avisos li > .ico { color: var(--amarillo) !important; }
.rc-sub { margin-top: .4rem; font-size: .7rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--tenue); }
.reco-alt { display: grid; gap: .45rem; }
.ra {
  display: flex; align-items: center; justify-content: space-between; gap: .8rem; padding: .6rem .75rem;
  border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie-2); color: inherit; text-decoration: none;
  transition: border-color var(--ms-1) var(--ease);
}
.ra:hover { border-color: var(--borde-fuerte); }
.ra-txt { display: flex; flex-direction: column; min-width: 0; }
.ra-etq { font-size: .66rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--marca); }
.ra-nom { font-weight: 600; font-size: .9rem; }
.ra-dif { font-size: .8rem; color: var(--suave); }
.ra-precio { display: flex; flex-direction: column; align-items: flex-end; font-size: .86rem; font-weight: 600; white-space: nowrap; }
.ra-precio small { font-size: .74rem; font-weight: 600; color: var(--verde); }
.rc-desc > summary { cursor: pointer; font-size: .82rem; font-weight: 600; color: var(--suave); list-style: none; }
.rc-desc > summary::-webkit-details-marker { display: none; }
.rc-desc > summary::before { content: '+'; display: inline-block; width: 1rem; color: var(--tenue); }
.rc-desc[open] > summary::before { content: '–'; }
.rc-desc ul { list-style: none; display: grid; gap: .25rem; margin: .4rem 0 0 1rem; font-size: .82rem; color: var(--suave); line-height: 1.4; }
.rc-desc b { color: var(--texto); font-weight: 600; }
.reco-acc { display: flex; flex-wrap: wrap; gap: .45rem; margin-top: .3rem; }
.reco-ideas { display: grid; }
.reco-ideas .idea { display: flex; align-items: center; gap: .75rem; padding: .7rem 0; border-top: 1px solid var(--borde-suave); }
.reco-ideas .idea:first-child { border-top: 0; padding-top: .2rem; }
.reco-ideas .md-count-ico { flex: none; }
.idea-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .1rem; font-size: .84rem; line-height: 1.4; color: var(--suave); }
.idea-txt b { font-size: .9rem; color: var(--texto); }
.reco-ideas .btn-sm { flex: none; }

/* Móvil: el resultado debajo y un botón que lleva a él. */
.reco-flota { display: none; }
@media (max-width: 900px) {
  .reco { padding-bottom: 3.5rem; }
  .reco-flota:not([hidden]) {
    display: inline-flex; align-items: center; gap: .45rem; position: fixed; z-index: 70; left: 50%; transform: translateX(-50%);
    bottom: calc(5.4rem + var(--abajo-seguro)); max-width: calc(100vw - 2rem);
    padding: .7rem 1.15rem; border: 0; border-radius: var(--r-full); cursor: pointer;
    background: var(--cubierta); color: var(--sobre-cubierta); font: inherit; font-size: .9rem; font-weight: 600;
    box-shadow: var(--sh-lg); animation: sube-flota var(--ms-3) var(--ease-enfasis);
  }
  .reco-flota .ico { color: var(--oro); }
}
@keyframes sube-flota { from { opacity: 0; transform: translate(-50%, 10px); } to { opacity: 1; transform: translate(-50%, 0); } }
@media (max-width: 600px) {
  .chip { font-size: .85rem; padding: .45rem .75rem; }
  .ra { flex-wrap: wrap; }
  .ra-precio { flex-direction: row; gap: .5rem; align-items: baseline; }
}
@media (min-width: 901px) { .calc.reco { grid-template-columns: minmax(0, 1fr) minmax(20rem, 27rem); } }

/* ---------- Colaboradores externos (07/10/2026) ---------- */
/* Su enlace a acv21.es: se lee entero y se copia o se manda por WhatsApp. */
.enlace-caja { display: flex; flex-direction: column; gap: .55rem; }
.enlace-url { display: block; font-family: var(--fuente-mono); font-size: .8rem; background: var(--superficie-2); border: 1px solid var(--borde);
  border-radius: 8px; padding: .55rem .7rem; overflow-wrap: anywhere; user-select: all; }
.enlace-panel .sec-tit { display: flex; align-items: center; gap: .4rem; }
.enlace-panel .sec-tit .ico { width: 1rem; height: 1rem; }
/* Qué relación hay, al pie de su Inicio. */
.nota-legal.relacion { display: flex; gap: .5rem; align-items: flex-start; margin-top: var(--esp-m, 1.4rem); }
.nota-legal.relacion .ico { flex: none; width: 1rem; height: 1rem; margin-top: .1rem; }
/* Las condiciones, para leerlas con calma. */
.cond-texto { line-height: 1.6; }
.cond-texto p { margin: 0 0 .8rem; }
.condiciones .cond-texto { max-height: 60vh; overflow-y: auto; border: 1px solid var(--borde); border-radius: 10px; padding: .9rem 1rem; margin-bottom: 1rem; background: var(--superficie-2); }
.condiciones .consent { margin-bottom: .4rem; }
.cond-resumen p { line-height: 1.55; }
.btn-link { background: none; border: 0; padding: 0; font: inherit; color: var(--marca); text-decoration: underline; cursor: pointer; }
/* Línea de una liquidación del colaborador: la retención y la factura se leen enteras. */
.fila-sol .fs-l2.envuelve { white-space: normal; overflow: visible; }
/* Ventana «Gestionar» de una cuenta: una acción por fila, con lo que hace debajo. */
.gestion { display: grid; gap: 1rem; }
.gestion-lista { display: grid; gap: .4rem; }
.gestion-op { display: flex; align-items: center; gap: .8rem; width: 100%; text-align: left; padding: .75rem .85rem; border: 1px solid var(--borde);
  border-radius: var(--r-md); background: var(--superficie); color: var(--texto); font: inherit; cursor: pointer; transition: background .15s, border-color .15s; }
@media (hover: hover) { .gestion-op:hover { background: var(--gris); border-color: var(--borde-fuerte); } .gestion-op.peligro:hover { background: var(--rojo-bg); } }
.gestion-op:focus-visible { outline: 2px solid var(--marca); outline-offset: 2px; }
.gestion-op > .ico { width: 1.2rem; height: 1.2rem; flex: none; color: var(--marca); }
.gestion-txt { display: grid; gap: .1rem; min-width: 0; }
.gestion-txt b { font-weight: 600; font-size: .92rem; }
.gestion-txt span { font-size: .78rem; color: var(--suave); overflow-wrap: anywhere; }
.gestion-op.peligro { border-color: var(--rojo-borde); }
.gestion-op.peligro > .ico, .gestion-op.peligro b { color: var(--rojo); }

/* ---------- Contrato de colaboración, documentos y expediente ---------- */
.sec-tit > .ico { width: .95rem; height: .95rem; vertical-align: -.17em; margin-right: .35rem; }
.cond-claves ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; }
.cond-claves li { display: flex; gap: .6rem; align-items: flex-start; line-height: 1.45; font-size: .93rem; }
.cond-claves li .ico { flex: none; width: 1.05rem; height: 1.05rem; color: var(--verde); margin-top: .17rem; }
.cond-cab { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: .3rem 1rem; margin-bottom: .8rem; }
.cond-cab p { margin: 0; }
.cond-acc { margin-top: 1rem; }
/* La pantalla de alta: sus datos, el contrato y su firma (V.condiciones). */
.cond-alta .cond-intro { margin: -.2rem 0 .9rem; }
.cond-alta .cond-correo { margin: -.3rem 0 .4rem; }
.cond-alta .cond-texto { max-height: 46vh; }
.condiciones .cond-decl { font-weight: 400; font-size: .84rem; margin-bottom: .6rem; }
.cond-decl b { font-weight: 650; }
.firma-caja { position: relative; aspect-ratio: 5 / 2; max-width: 34rem; border: 1.5px dashed var(--borde); border-radius: 12px; background: var(--superficie); }
.firma-lienzo { display: block; width: 100%; height: 100%; touch-action: none; cursor: crosshair; color: var(--texto); border-radius: inherit; }
.firma-guia { position: absolute; left: 1.1rem; right: 1.1rem; bottom: 22%; padding-top: .3rem; border-top: 1px solid var(--borde); font-size: .74rem; color: var(--suave); pointer-events: none; }
.firma-caja.con-firma .firma-guia { color: transparent; }
.firma-pie { display: flex; justify-content: space-between; align-items: center; gap: 1rem; max-width: 34rem; margin: .45rem 0 1.1rem; font-size: .85rem; }
.firma-pie > span { flex: 1; text-align: left; }
.firma-caja[aria-invalid="true"] { border-color: var(--rojo); }
.firma-svg { display: block; width: 100%; height: auto; color: var(--texto); }
.firma-mia { max-width: 15rem; margin: .2rem 0 .9rem; }
.firma-mia .firma-svg { border-bottom: 1px solid var(--borde); }
.firma-mia span { display: block; margin-top: .3rem; font-size: .78rem; color: var(--suave); }
.colab-relacion { margin: 0 0 .8rem; line-height: 1.55; }
.cond-plazo { max-width: 22rem; margin-bottom: .9rem; }
.doc-lista { display: grid; margin-bottom: .8rem; }
.doc-fila { display: flex; align-items: center; gap: .7rem; padding: .6rem 0; border-bottom: 1px solid var(--borde-suave); }
.doc-fila:last-child { border-bottom: 0; }
.doc-ico { flex: none; width: 2rem; height: 2rem; border-radius: var(--r-md); background: var(--gris); display: grid; place-items: center; color: var(--marca); }
.doc-ico .ico { width: 1rem; height: 1rem; }
.doc-txt { flex: 1; min-width: 0; display: grid; gap: .1rem; }
.doc-txt b { font-weight: 600; font-size: .9rem; }
.doc-txt span { font-size: .76rem; color: var(--suave); overflow-wrap: anywhere; }
.doc-acc { flex: none; display: flex; gap: .2rem; }
.doc-vacio { color: var(--tenue); font-size: .88rem; margin: 0 0 .8rem; }
.exp-estado { display: grid; gap: .4rem; justify-items: start; margin-bottom: .6rem; }
.exp-estado p { margin: 0; line-height: 1.5; font-size: .92rem; }
.exp-plazo { margin: 0 0 .4rem; font-size: .85rem; }
.exp-avisos { margin: 0 0 var(--esp-m, 1.2rem); }
.pc-nom-enlace { display: block; color: inherit; text-decoration: none; }
.pc-nom-enlace:hover { color: var(--marca); text-decoration: underline; }
/* Mi cuenta: los botones de acceso, del mismo ancho. */
.acc-cuenta { display: grid; grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr)); gap: .5rem; }
.acc-cuenta > .btn-sec { width: 100%; justify-content: center; }

/* ---------- Móvil ---------- */
@media (max-width: 820px) {
  /* iOS deja a veces un hueco bajo la barra de pestañas (al recoger su barra
     o al tirar de la página) y lo pinta con el color de fondo del documento:
     que sea el de la barra, y así no se ve una franja beige debajo. La página
     sigue con su fondo (el de body). */
  html { background: var(--superficie); }
}
@media (max-width: 600px) {
  /* Filas de solo botones: cada fila llena el ancho, sin bordes irregulares. */
  .fila:not(:has(> :not(.btn, .btn-sec, .btn-fantasma))) > .btn,
  .fila:not(:has(> :not(.btn, .btn-sec, .btn-fantasma))) > .btn-sec,
  .fila:not(:has(> :not(.btn, .btn-sec, .btn-fantasma))) > .btn-fantasma,
  .item .acciones > .btn-sec, .camp-pie > .btn-sec, .camp-pie > .btn, .camp-pie > .btn-fantasma, .vc-barra > .btn-sec { flex: 1 1 auto; justify-content: center; }
  .md-head > .fila { width: 100%; }
  /* Venta cruzada: el estado y la ficha, debajo del cliente (al lado le
     dejaban al nombre tres palabras de ancho). */
  #vc-lista .item .head { flex-direction: column; align-items: stretch; }
  #vc-lista .item .head > .fila { width: 100%; }
  #vc-lista .item .head > .fila > .estado-sel { flex: 1 1 auto; }
  /* Tablas: cada fila, una ficha con el título de cada dato (app.js pone
     data-col). Así no se salen de lado. */
  table.tablareg, table.tablareg tbody, table.tablareg tr, table.tablareg td { display: block; width: 100%; }
  table.tablareg thead { display: none; }
  table.tablareg tbody tr { padding: .5rem 0; border-bottom: 1px solid var(--borde); }
  table.tablareg tbody tr:last-child { border-bottom: 0; }
  /* El título a la izquierda; lo de la celda (aunque sean varias cosas),
     en una columna a la derecha. */
  table.tablareg td { display: grid; grid-template-columns: fit-content(60%) minmax(0, 1fr); column-gap: 1rem; row-gap: .15rem;
    align-items: baseline; justify-items: end; border: 0 !important; padding: .18rem .7rem; text-align: right; }
  table.tablareg td > * { grid-column: 2; }
  table.tablareg td[data-col]::before { content: attr(data-col); grid-column: 1; grid-row: 1; justify-self: start; text-align: left; color: var(--tenue); font-size: .7rem; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
  table.tablareg td[data-col=""]::before { content: none; }
  table.tablareg td[data-col=""], table.tablareg td:not([data-col]) { grid-template-columns: minmax(0, 1fr); }
  table.tablareg td[data-col=""] > *, table.tablareg td:not([data-col]) > * { grid-column: 1; }
  .panel:has(table.tablareg) { overflow: visible; max-height: none; }
  .modal-actions > .btn, .modal-actions > .btn-sec { flex: 1 1 auto; justify-content: center; }
  .cond-acc > .btn { width: 100%; justify-content: center; }
}

/* ---------- Página de firma del cliente (firmar.html, sin sesión) ---------- */
.pagina-firma { min-height: 100vh; display: flex; flex-direction: column; }
.firma-cab { display: flex; flex-wrap: wrap; align-items: center; gap: .3rem .6rem; padding: max(.8rem, env(safe-area-inset-top)) 1rem .8rem; background: #0B1A2A; color: #F3EEE4; }
.firma-cab img { border-radius: 7px; }
.firma-marca { font-family: var(--fuente-titulo); font-size: 1.2rem; letter-spacing: -.01em; color: #F3EEE4; }
.firma-marca em { font-style: italic; color: #7DB8DE; }
.firma-sub { flex-basis: 100%; font-size: .74rem; opacity: .75; }
.firma-main { flex: 1; width: 100%; max-width: 44rem; margin: 0 auto; padding: 1.4rem 1rem 2rem; display: grid; gap: 1rem; align-content: start; }
.firma-tit { font-family: var(--fuente-titulo); font-weight: 500; font-size: clamp(1.6rem, 6vw, 2.1rem); line-height: 1.1; margin: 0 0 .5rem; text-wrap: balance; }
.firma-intro p { margin: 0; line-height: 1.55; color: var(--suave); }
.firma-texto { max-height: 55vh; overflow-y: auto; border: 1px solid var(--borde); border-radius: 10px; padding: .9rem 1rem; background: var(--superficie-2); margin-bottom: 1rem; font-size: .92rem; }
.firma-acc { margin-top: 1rem; }
.firma-acc > .btn, .firma-acc > .btn-sec { width: 100%; justify-content: center; }
.firma-error { color: var(--rojo); font-weight: 600; font-size: .88rem; margin: .6rem 0 0; }
.firma-legal { font-size: .78rem; margin: .8rem 0 0; }
.firma-hecha p, .firma-aviso p { line-height: 1.55; margin: 0 0 .7rem; }
.firma-ok { display: grid; place-items: center; width: 3rem; height: 3rem; border-radius: 50%; background: var(--verde-bg); color: var(--verde); margin-bottom: .7rem; }
.firma-ok svg { width: 1.6rem; height: 1.6rem; }
.firma-copia { margin: .4rem 0; }
.firma-copia summary { cursor: pointer; color: var(--marca); font-weight: 600; margin-bottom: .6rem; }
.firma-pie { padding: 1rem 1rem max(1rem, env(safe-area-inset-bottom)); font-size: .72rem; color: var(--tenue); text-align: center; line-height: 1.5; }
@media print { .firma-cab, .firma-acc, .firma-pie { display: none; } .firma-copia > div { display: block; } }
