/* =============================================================================
   PANEL de padres y de admin · Material Design 3 Expressive
   =============================================================================
   Se apoya en /assets/css/m3-tokens.css (roles de color, formas, tipografía,
   resortes, capas de estado, elevación). Aquí NO se inventan colores: todo sale
   de un rol --md-sys-color-*. Al tocar esta hoja, sube ?v= en views/_head.php
   (el service worker sirve /assets/ desde caché por URL).

   Capas (de menos a más prioridad):
     base        reinicio, tipografía, alias de los tokens viejos, foco
     componentes botones, navegación, tarjetas, campos, avisos, progreso…
     vistas      bloques propios de una pantalla (hijos, suscripción, planes…)
     utilidades  márgenes y ajustes sueltos (ganan a todo lo anterior)
   Fuera de capas, al final: solo lo que retoca a los iconos .ms. m3-tokens.css
   define .ms sin capa y cualquier regla con capa pierde contra ella, así que un
   tamaño o un relleno de icono solo surte efecto si también va sin capa.

   Movimiento: spatial-* (posición, tamaño, forma; con rebote) y effects-*
   (color, opacidad; sin rebote). Con «reducir movimiento» los tokens ya dejan
   las duraciones en 1 ms y aquí se quitan las entradas en cascada.          */

@layer base, componentes, vistas, utilidades;

/* Propiedades registradas para poder animarlas (el pulgar del interruptor). */
@property --sw-x { syntax: '<length>'; inherits: false; initial-value: 14px; }
@property --sw-r { syntax: '<length>'; inherits: false; initial-value: 8px; }

/* Transición entre páginas del mismo sitio: la barra de navegación se queda
   quieta y el contenido funde. Solo si la persona no pidió menos movimiento. */
@media (prefers-reduced-motion: no-preference) {
  @view-transition { navigation: auto; }
}

/* ═══════════════════════════════════ BASE ═══════════════════════════════════ */
@layer base {
  :root {
    color-scheme: light;
    /* Medidas del armazón. --rail-w es 0 hasta que hay riel (escritorio). */
    --wrap-pad-x: clamp(16px, 4vw, 48px);
    --wrap-pad-top: clamp(24px, 3vh, 36px);
    --rail-w: 0px;
    --barra-sup: 0px;
    --barra-inf: 0px;
    /* Capa de estado: se mezcla el color del contenido sobre el del fondo. */
    --capa-hover: calc(var(--md-sys-state-hover-opacity) * 100%);
    --capa-foco: calc(var(--md-sys-state-focus-opacity) * 100%);
    --capa-pulsado: calc(var(--md-sys-state-pressed-opacity) * 100%);
    /* Velo detrás de diálogos y del cajón (rol scrim al 32 %). */
    --velo: color-mix(in srgb, var(--md-sys-color-scrim) 32%, transparent);
    /* Flecha del desplegable: un SVG no puede leer currentColor desde un
       background, así que hay una por esquema (tono on-surface-variant). */
    --flecha-select: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23414940' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");

    /* ALIAS de los tokens de antes. Siguen vivos porque quedan estilos en
       línea y JS de las vistas que los nombran (var(--ink-soft), var(--sand),
       var(--mint-deep)…). Apuntan a roles M3, así que también cambian con el
       tema oscuro. No usarlos en código nuevo. */
    --bg: var(--md-sys-color-surface);
    --surface: var(--md-sys-color-surface-container-low);
    --card: var(--md-sys-color-surface-container-low);
    --ink: var(--md-sys-color-on-surface);
    --ink-soft: var(--md-sys-color-on-surface-variant);
    --soft: var(--md-sys-color-on-surface-variant);
    --mint: var(--md-sys-color-primary-container);
    --mint-deep: var(--md-sys-color-primary);
    --sand: var(--md-sys-color-outline-variant);
    --amber: var(--md-sys-color-tertiary);
    --warn-ink: var(--md-sys-color-tertiary);
    --danger: var(--md-sys-color-error);
    --radius: var(--md-sys-shape-corner-large);
    --shadow: var(--md-sys-elevation-level1);
    --ease: var(--md-sys-motion-easing-emphasized);
  }
  /* Tema oscuro: mismas condiciones que m3-tokens.css. */
  @media (prefers-color-scheme: dark) {
    :root[data-tema="auto"] {
      color-scheme: dark;
      --flecha-select: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23c1c9be' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
    }
  }
  :root[data-tema="oscuro"] {
    color-scheme: dark;
    --flecha-select: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23c1c9be' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
  }
  /* Armazón: el riel aparece a partir de 840 px (M3 «expanded»); por debajo,
     barra superior de 64 px y barra de navegación inferior de 72 px (estilo
     Kizuna: destinos principales siempre a la vista, «Más» abre el cajón). */
  @media (min-width: 840px) { :root { --rail-w: 96px; } }
  @media (min-width: 1200px) { :root { --rail-w: 248px; } }
  @media (max-width: 839.98px) { :root:has(.appbar) { --barra-sup: 64px; } }
  @media (max-width: 839.98px) { :root:has(.barra-nav) { --barra-inf: 72px; } }

  *, *::before, *::after { box-sizing: border-box; }
  * { margin: 0; padding: 0; scrollbar-color: var(--md-sys-color-outline) transparent; }
  /* El atributo hidden tiene que ganar siempre: cualquier clase con display
     (.aviso, .acciones, .btn, .bsab-elegido) lo anulaba. */
  [hidden] { display: none !important; }

  html {
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
    scroll-padding-top: calc(var(--barra-sup) + 8px);
    /* Deja animar alturas «auto» (acordeones) donde el navegador lo admite. */
    interpolate-size: allow-keywords;
  }
  body {
    font: var(--md-sys-typescale-body-large);
    font-optical-sizing: auto;
    background: var(--md-sys-color-surface);
    color: var(--md-sys-color-on-surface);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    min-height: 100vh;
    min-height: 100dvh;
  }
  ::selection { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); }

  a { color: var(--md-sys-color-primary); text-decoration: none; }
  /* Un enlace suelto dentro de una frase no puede distinguirse solo por el
     color (WCAG 1.4.1): va subrayado. Botones, chips y navegación llevan clase. */
  :where(p, li, label, dd, .hint, .sub, .aviso-txt, .franja-txt, .flash, .error) a:not([class]) {
    text-decoration: underline;
    text-underline-offset: .15em;
    text-decoration-thickness: from-font;
  }

  h1 {
    font: var(--md-sys-typescale-headline-medium);
    font-weight: var(--md-sys-typescale-emphasized-weight);
    letter-spacing: -.2px;
    color: var(--md-sys-color-on-surface);
    margin: 0 0 4px;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px 14px;
    text-wrap: balance;
  }
  h2 {
    font: var(--md-sys-typescale-title-large);
    font-weight: 600;
    color: var(--md-sys-color-on-surface);
    margin: clamp(32px, 4.5vh, 48px) 0 14px;
    text-wrap: balance;
  }
  h3 {
    font: var(--md-sys-typescale-title-medium);
    font-weight: 600;
    color: var(--md-sys-color-on-surface);
    margin: 0 0 10px;
  }
  h4 {
    font: var(--md-sys-typescale-title-small);
    color: var(--md-sys-color-on-surface-variant);
    margin: 0 0 6px;
  }
  :where(h1, h2, h3) + :where(.sub, p.sub) { margin-top: 2px; }
  :where(h1) + :where(.sub, p.sub) { font: var(--md-sys-typescale-body-large); }

  p { text-wrap: pretty; }
  strong, b { font-weight: 650; }
  code, kbd, .mono {
    font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace;
    font-size: .9em;
  }
  code {
    background: var(--md-sys-color-surface-container-highest);
    color: var(--md-sys-color-on-surface);
    border-radius: var(--md-sys-shape-corner-extra-small);
    padding: 1px 5px;
  }
  hr { border: 0; border-top: 1px solid var(--md-sys-color-outline-variant); margin: 22px 0; }
  pre, code.bloque { white-space: pre-wrap; word-break: break-word; }
  img, svg, video, iframe { max-width: 100%; }

  /* Foco visible siempre, con anillo de 3 px en el rol secondary (≥ 3:1). */
  :focus-visible {
    outline: var(--md-focus-ring-width) solid var(--md-focus-ring-color);
    outline-offset: var(--md-focus-ring-offset);
  }

  /* Barras de desplazamiento finas (el color del tema va en el reinicio *). */
  .tabla-scroll, .rail, .appbar { scrollbar-width: thin; }

  /* ── Movimiento: entradas ── */
  @keyframes m3-sube { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
  @keyframes m3-baja { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: none; } }
  @keyframes m3-crece { from { width: 0; } }
  @keyframes m3-escala { from { opacity: 0; transform: scale(.6); } to { opacity: 1; transform: none; } }
  @keyframes m3-indicador { from { transform: scaleX(.4); opacity: .4; } to { transform: none; opacity: 1; } }
  @keyframes m3-aparece { from { opacity: 0; } to { opacity: 1; } }
  @keyframes m3-gira { to { transform: rotate(360deg); } }
  @keyframes m3-ola { to { -webkit-mask-position: 20px 50%; mask-position: 20px 50%; } }
  @keyframes m3-snack {
    0% { opacity: 0; transform: translate(-50%, 24px); }
    6%, 92% { opacity: 1; transform: translate(-50%, 0); }
    100% { opacity: 0; transform: translate(-50%, 8px); visibility: hidden; }
  }

  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: .01ms !important;
      animation-iteration-count: 1 !important;
      animation-delay: 0s !important;
      transition-duration: .01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

/* ════════════════════════════════ COMPONENTES ════════════════════════════════ */
@layer componentes {

  /* ── Armazón y rejillas ─────────────────────────────────────────────────
     .wrap          tableros, tablas, rejillas de tarjetas (usa el ancho)
     .wrap.narrow   formularios y lectura (hoy mismo ancho: el margen seguro
                    lo da el relleno lateral; nada arrinconado a un tercio)
     .wrap.auth     tarjetas de acceso centradas, páginas SIN navegación    */
  .wrap {
    width: 100%;
    max-width: 1480px;
    margin: 0 auto;
    padding: var(--wrap-pad-top) var(--wrap-pad-x) clamp(56px, 8vh, 96px);
    min-width: 0;
  }
  .wrap.narrow { max-width: 1480px; }
  .wrap.auth { max-width: 480px; padding-top: clamp(32px, 8vh, 72px); }
  /* Con riel, todo el documento (contenido y pie) se aparta de él. */
  body:has(.appbar) { padding-inline-start: var(--rail-w); }

  /* Rejilla de tarjetas: auto-fit (sin columnas fantasma), pistas con tope
     (una sola tarjeta no se estira a 1.400 px) y centrada. Cada página ajusta
     --gmin/--gmax sin reescribir la plantilla. */
  .grid {
    display: grid;
    gap: 20px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--gmin, 320px)), var(--gmax, 430px)));
  }
  /* Columnas que colapsan solas: minmax(0,…) para que una tabla ancha se
     encoja en vez de ensanchar la celda. */
  .cols { display: grid; gap: 20px; grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr)); align-items: start; }
  .cols-3 { display: grid; gap: 20px; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); align-items: start; }
  .cols-ab, .cols-ba { display: grid; gap: 20px; align-items: start; grid-template-columns: minmax(0, 1fr); }
  @media (min-width: 960px) {
    .cols-ab { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
    .cols-ba { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
    .col-sticky { position: sticky; top: calc(var(--barra-sup) + 16px); }
  }
  .col-full { grid-column: 1 / -1; }
  .tabla-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; min-width: 0; position: relative; }
  .tabla-scroll:focus-visible { outline-offset: -3px; }
  /* Un hijo de rejilla o flex no encoge por debajo de su contenido si no se
     le dice: sin esto una tabla nowrap ensancha la página entera. */
  .grid > *, .cols > *, .cols-3 > *, .cols-ab > *, .cols-ba > *, .card { min-width: 0; }

  /* ── Navegación: riel (escritorio) · barra superior + cajón (móvil) ──────
     Un solo marcado para las tres formas. <header class="appbar"> lleva la
     marca, el botón de menú y un <nav popover>. En escritorio el nav se
     muestra siempre dentro del riel (se anulan los estilos del popover); en
     móvil es un cajón modal que abre el botón con popovertarget, con cierre
     al tocar fuera y con Escape, sin una línea de JavaScript. */
  .appbar { view-transition-name: navegacion; }
  .appbar-logo {
    display: flex;
    align-items: center;
    gap: 12px;
    min-height: 48px;
    color: var(--md-sys-color-on-surface);
    text-decoration: none;
    border-radius: var(--md-sys-shape-corner-large);
  }
  .appbar-logo-ico {
    display: grid;
    place-items: center;
    width: 44px;
    height: 44px;
    flex: none;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-primary-container);
    color: var(--md-sys-color-on-primary-container);
    transition: border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized); /* sin rebote: el resorte llevaba el radio por debajo de 0 */
  }
  .appbar-logo:hover .appbar-logo-ico { border-radius: var(--md-sys-shape-corner-extra-large); }
  .appbar-logo-txt { font: var(--md-sys-typescale-title-medium); font-weight: 700; white-space: nowrap; }
  /* Marca: búho con halo (docs/marca/) sin el cuadrado de color, y el nombre en
     Young Serif pasado a trazos, que hereda el color del texto en cada tema. */
  .appbar-logo-ico:has(.marca-buho) { background: none; }
  .marca-buho { display: block; width: 100%; height: 100%; }
  .marca-nombre { display: block; height: 1.15em; width: 5.5em; color: var(--md-sys-color-on-primary-container); }
  /* En oscuro el verde de la marca se pierde: el nombre pasa al color del texto. */
  :root[data-tema="oscuro"] .marca-nombre, html[data-noche="1"] .marca-nombre { color: var(--md-sys-color-on-surface); }
  @media (prefers-color-scheme: dark) { :root[data-tema="auto"] .marca-nombre { color: var(--md-sys-color-on-surface); } }
  .appbar-logo:hover .marca-buho { transform: rotate(-4deg); }
  @media (prefers-reduced-motion: no-preference) {
    .marca-buho { transition: transform var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast); }
  }
  .appbar-logo--staff .appbar-logo-txt > span {
    display: inline-block;
    margin-inline-start: 2px;
    padding: 0 8px;
    border-radius: var(--md-sys-shape-corner-small);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
    font: var(--md-sys-typescale-label-medium);
    vertical-align: 2px;
  }
  .icon-btn.appbar-menu { display: none; }
  .rail-cab { display: none; }
  .appbar-out { margin: 0; }

  /* Destino de navegación. */
  .navlink {
    position: relative;
    display: flex;
    align-items: center;
    width: 100%;
    border: 0;
    background: none;
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-label-large);
    text-decoration: none;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    user-select: none;
  }
  .navlink-ico {
    position: relative;
    display: grid;
    place-items: center;
    flex: none;
    border-radius: var(--md-sys-shape-corner-full);
    transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .navlink-txt { min-width: 0; }
  .navlink.on { color: var(--md-sys-color-on-surface); }
  /* Insignia grande de M3 (cuenta) sobre el icono. */
  .nav-badge {
    position: absolute;
    top: -4px;
    inset-inline-start: calc(50% + 4px);
    display: grid;
    place-items: center;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: var(--md-sys-shape-corner-full);
    background: var(--md-sys-color-error);
    color: var(--md-sys-color-on-error);
    font: var(--md-sys-typescale-label-small);
    line-height: 16px;
  }

  /* «Más» del admin: <details> nativo. Acordeón en el riel expandido y en el
     cajón; menú flotante junto al riel compacto. */
  .navmore { width: 100%; position: relative; }
  .navmore > summary { list-style: none; }
  .navmore > summary::-webkit-details-marker { display: none; }
  .navmore-flecha { margin-inline-start: auto; transition: transform var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast); }
  .navmore[open] .navmore-flecha { transform: rotate(180deg); }
  .navmore-panel { display: flex; flex-direction: column; gap: 2px; }
  .navmore-item {
    position: relative;
    display: flex;
    align-items: center;
    gap: 12px;
    min-height: 48px;
    padding: 0 16px;
    border-radius: var(--md-sys-shape-corner-full);
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-label-large);
    text-decoration: none;
    white-space: nowrap;
    transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .navmore-item:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), transparent); color: var(--md-sys-color-on-surface); }
  .navmore-item.on { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); }

  /* ESCRITORIO (≥ 840 px): el header es el riel fijo a la izquierda. */
  @media (min-width: 840px) {
    .appbar {
      position: fixed;
      inset-block: 0;
      inset-inline-start: 0;
      z-index: 30;
      width: var(--rail-w);
      display: flex;
      flex-direction: column;
      gap: 8px;
      padding: 16px 0 16px;
      background: var(--md-sys-color-surface-container);
      overflow-y: auto;
      overscroll-behavior: contain;
    }
    /* El nav vive dentro del riel: se anulan los estilos de popover del
       navegador (fixed, centrado, borde, display:none). */
    .rail {
      display: flex;
      flex-direction: column;
      flex: 1;
      gap: 4px;
      position: static;
      inset: auto;
      width: auto;
      height: auto;
      margin: 0;
      padding: 0;
      border: 0;
      background: transparent;
      color: inherit;
      overflow: visible;
    }
    .rail::backdrop { display: none; }
    .rail .appbar-out { margin-top: auto; padding-top: 8px; }
  }
  /* Riel COMPACTO (840–1199): icono en su píldora y rótulo debajo. */
  @media (min-width: 840px) and (max-width: 1199.98px) {
    .appbar { align-items: center; overflow: visible; }
    .appbar-logo { justify-content: center; flex-direction: column; gap: 2px; margin-bottom: 12px; }
    .appbar-logo-ico { width: 56px; height: 56px; border-radius: var(--md-sys-shape-corner-large); }
    .appbar-logo-txt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .rail { width: 100%; align-items: stretch; }
    .navlink {
      flex-direction: column;
      justify-content: center;
      gap: 4px;
      min-height: 64px;
      padding: 4px 4px 6px;
      font: var(--md-sys-typescale-label-medium);
      text-align: center;
    }
    .navlink-ico { width: 56px; height: 32px; }
    .navlink:hover .navlink-ico { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-hover), transparent); }
    .navlink:active .navlink-ico { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-pulsado), transparent); }
    .navlink.on .navlink-ico {
      background: var(--md-sys-color-secondary-container);
      color: var(--md-sys-color-on-secondary-container);
      animation: m3-indicador var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) both;
    }
    .navlink.on { font-weight: 700; }
    .navlink:focus-visible { outline: 0; }
    .navlink:focus-visible .navlink-ico { outline: var(--md-focus-ring-width) solid var(--md-focus-ring-color); outline-offset: 2px; }
    /* Menú flotante del «Más». */
    .navmore-panel {
      position: absolute;
      inset-inline-start: calc(100% + 4px);
      top: 0;
      z-index: 40;
      min-width: 248px;
      max-height: calc(100dvh - 32px);
      overflow-y: auto;
      padding: 8px;
      border-radius: var(--md-sys-shape-corner-large);
      background: var(--md-sys-color-surface-container);
      box-shadow: var(--md-sys-elevation-level2);
      animation: m3-escala var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast) both;
      transform-origin: left top;
    }
    .navmore-item { border-radius: var(--md-sys-shape-corner-medium); }
  }
  /* Riel EXPANDIDO (≥ 1200) y CAJÓN (móvil): icono y rótulo en fila; la
     píldora entera es el indicador. */
  @media (min-width: 1200px), (max-width: 839.98px) {
    .appbar-logo { padding: 0 16px; margin-bottom: 8px; }
    .navlink {
      gap: 12px;
      min-height: 56px;
      width: auto;
      margin: 0 12px;
      padding: 0 16px;
      border-radius: var(--md-sys-shape-corner-full);
      transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
    }
    .navlink-ico { width: 24px; height: 24px; }
    .navlink:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), transparent); color: var(--md-sys-color-on-surface); }
    .navlink:active { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-pulsado), transparent); }
    .navlink.on {
      background: var(--md-sys-color-secondary-container);
      color: var(--md-sys-color-on-secondary-container);
      font-weight: 700;
      animation: m3-indicador var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) both;
    }
    .navmore-panel { padding: 2px 12px 8px 36px; }
    .navmore-item { min-height: 48px; }
  }
  /* MÓVIL (< 840 px): barra superior pegajosa + cajón modal. */
  @media (max-width: 839.98px) {
    .wrap:has(> .appbar) { padding-top: 0; }
    .appbar {
      position: sticky;
      top: 0;
      z-index: 30;
      display: flex;
      align-items: center;
      gap: 4px;
      min-height: 64px;
      margin: 0 calc(-1 * var(--wrap-pad-x)) clamp(16px, 3vh, 24px);
      padding: 8px var(--wrap-pad-x) 8px max(4px, calc(var(--wrap-pad-x) - 12px));
      background: var(--md-sys-color-surface-container);
    }
    .icon-btn.appbar-menu { display: inline-grid; }
    .appbar-logo { padding: 0 4px; margin: 0; min-width: 0; }
    .appbar-logo-ico { width: 40px; height: 40px; }
    .appbar-logo-txt { overflow: hidden; text-overflow: ellipsis; }
    /* Cajón: el popover abierto, pegado a la izquierda y a toda altura. */
    .rail:popover-open {
      display: flex;
      flex-direction: column;
      gap: 4px;
      position: fixed;
      inset: 0 auto 0 0;
      width: min(320px, 86vw);
      height: 100dvh;
      max-height: none;
      margin: 0;
      padding: 12px 0 20px;
      border: 0;
      border-radius: 0 var(--md-sys-shape-corner-large) var(--md-sys-shape-corner-large) 0;
      background: var(--md-sys-color-surface-container-low);
      color: var(--md-sys-color-on-surface);
      box-shadow: var(--md-sys-elevation-level1);
      overflow-y: auto;
      overscroll-behavior: contain;
      transform: none;
      transition:
        transform var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default),
        display var(--md-sys-motion-spatial-default-duration) allow-discrete,
        overlay var(--md-sys-motion-spatial-default-duration) allow-discrete;
    }
    @starting-style { .rail:popover-open { transform: translateX(-100%); } }
    .rail::backdrop {
      background: rgb(0 0 0 / .32); /* rol scrim (#000) al 32 % */
      transition: opacity var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default);
    }
    @starting-style { .rail:popover-open::backdrop { opacity: 0; } }
    .rail-cab {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 8px;
      padding: 4px 12px 12px 28px;
      font: var(--md-sys-typescale-title-medium);
      font-weight: 700;
    }
    .rail .appbar-out { margin-top: auto; padding-top: 12px; }
  }
  /* Sin soporte de popover: el menú se enseña como tira desplazable. */
  @supports not selector(:popover-open) {
    @media (max-width: 839.98px) {
      .appbar { flex-wrap: wrap; }
      .icon-btn.appbar-menu { display: none; }
      .rail { display: flex; flex-wrap: nowrap; overflow-x: auto; width: 100%; position: static; }
      .navlink { width: auto; margin: 0; }
      .barra-nav { display: none; }
    }
  }

  /* Barra de navegación inferior (< 840 px). Mismo patrón que Kizuna Yori y
     Kizuna Finanzas: los destinos de más uso siempre a la vista, fija abajo;
     «Más» abre el mismo cajón (<nav class="rail" popover>) que antes abría la
     hamburguesa en la barra superior, ahora con el listado completo. Por eso
     ya no hace falta el botón de menú en el móvil. */
  .barra-nav { display: none; }
  @media (max-width: 839.98px) {
    .icon-btn.appbar-menu { display: none; }
    body:has(.barra-nav) { padding-bottom: calc(var(--barra-inf) + env(safe-area-inset-bottom)); }
    .barra-nav {
      position: fixed;
      inset-inline: 0;
      inset-block-end: 0;
      z-index: 30;
      display: flex;
      justify-content: space-around;
      align-items: stretch;
      height: calc(var(--barra-inf) + env(safe-area-inset-bottom));
      padding: 8px max(4px, calc(var(--wrap-pad-x) - 12px)) env(safe-area-inset-bottom);
      background: var(--md-sys-color-surface-container);
      box-shadow: var(--md-sys-elevation-level2);
    }
    .barra-nav-item {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 2px;
      flex: 1 1 0;
      min-width: 0;
      padding: 0;
      border: 0;
      border-radius: var(--md-sys-shape-corner-large);
      background: transparent;
      color: var(--md-sys-color-on-surface-variant);
      font: var(--md-sys-typescale-label-medium);
      text-decoration: none;
    }
    .barra-nav-ico {
      display: grid;
      place-items: center;
      width: 56px;
      height: 32px;
      border-radius: var(--md-sys-shape-corner-full);
    }
    .barra-nav-item:hover .barra-nav-ico { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-hover), transparent); }
    .barra-nav-item:active .barra-nav-ico { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-pulsado), transparent); }
    .barra-nav-item.on { color: var(--md-sys-color-on-surface); font-weight: 700; }
    .barra-nav-item.on .barra-nav-ico {
      background: var(--md-sys-color-secondary-container);
      color: var(--md-sys-color-on-secondary-container);
      animation: m3-indicador var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) both;
    }
    .barra-nav-item:focus-visible { outline: 0; }
    .barra-nav-item:focus-visible .barra-nav-ico { outline: var(--md-focus-ring-width) solid var(--md-focus-ring-color); outline-offset: 2px; }
    .barra-nav-txt { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    /* El snack, el toast y el FAB fijo viven al fondo de la pantalla: sin
       esto quedarían tapados por la barra de navegación inferior. */
    .snack, .toast { bottom: calc(var(--barra-inf) + max(16px, env(safe-area-inset-bottom))); }
    .fab-fijo { inset-block-end: calc(var(--barra-inf) + max(16px, env(safe-area-inset-bottom))); }
    main:has(.fab-fijo) { padding-bottom: calc(var(--barra-inf) + 88px); }
  }

  /* ── Pestañas principales (Mi cuenta) ── */
  .cuenta-h1 { margin: 0 0 12px; }
  .cuenta-tabs {
    display: flex;
    gap: 0;
    margin: 0 0 24px;
    border-bottom: 1px solid var(--md-sys-color-outline-variant);
    overflow-x: auto;
    scrollbar-width: none;
  }
  .cuenta-tab {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    flex: 1 0 auto;
    min-height: 48px;
    padding: 0 20px;
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-title-small);
    text-decoration: none;
    white-space: nowrap;
    border-radius: var(--md-sys-shape-corner-small) var(--md-sys-shape-corner-small) 0 0;
    transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast), color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .cuenta-tab:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), transparent); color: var(--md-sys-color-on-surface); }
  .cuenta-tab:focus-visible { outline-offset: -3px; }
  .cuenta-tab.on { color: var(--md-sys-color-primary); }
  /* Indicador activo: 3 px, esquinas altas redondeadas, entra con resorte. */
  .cuenta-tab.on::after {
    content: "";
    position: absolute;
    inset-inline: 12px;
    bottom: 0;
    height: 3px;
    border-radius: 3px 3px 0 0;
    background: var(--md-sys-color-primary);
    animation: m3-indicador var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) both;
  }
  @media (min-width: 600px) { .cuenta-tab { flex: 0 1 auto; min-width: 120px; } }

  /* ── Botones comunes ─────────────────────────────────────────────────────
     Tamaño S de Expressive: 40 px de alto, objetivo táctil de 48 px con un
     ::before invisible. Forma: redonda en reposo; al pulsar la esquina baja a
     8 px con el resorte spatial-fast (el «shape morph» de Expressive).
       .btn               relleno (primary)
       .btn-tonal         tonal (secondary-container)
       .btn-outlined      contorno   (.btn-ghost es el alias de antes)
       .btn-text          texto
       .btn-elevated      elevado
       .peligro           variante de error (relleno o contorno)
       .btn-xs / .btn-m   32 px / 56 px            .btn-bloque  ancho entero */
  .btn, .tab {
    --btn-h: 40px;
    --btn-r: calc(var(--btn-h) / 2);
    --btn-r-pulsado: var(--md-sys-shape-corner-small);
    --btn-bg: var(--md-sys-color-primary);
    --btn-fg: var(--md-sys-color-on-primary);
    --btn-borde: transparent;
    --btn-sombra: none;
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    min-height: var(--btn-h);
    padding: 0 20px;
    border: 1px solid var(--btn-borde);
    border-radius: var(--btn-r);
    background: var(--btn-bg);
    color: var(--btn-fg);
    box-shadow: var(--btn-sombra);
    font: var(--md-sys-typescale-label-large);
    letter-spacing: .1px;
    line-height: 1.2;
    text-align: center;
    text-decoration: none;
    vertical-align: middle;
    cursor: pointer;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    transition:
      border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      box-shadow var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default);
  }
  /* Objetivo de 48 px sin cambiar el tamaño visible. */
  .btn::before, .tab::before {
    content: "";
    position: absolute;
    inset-block: min(0px, calc((100% - 48px) / 2));
    inset-inline: 0;
  }
  .btn:has(> .ms:first-child) { padding-inline-start: 16px; }
  .btn:has(> .ms:last-child:not(:first-child)) { padding-inline-end: 16px; }
  .btn:hover, .tab:hover { background: color-mix(in srgb, var(--btn-fg) var(--capa-hover), var(--btn-bg)); }
  .btn:focus-visible, .tab:focus-visible { background: color-mix(in srgb, var(--btn-fg) var(--capa-foco), var(--btn-bg)); }
  .btn:active, .tab:active {
    background: color-mix(in srgb, var(--btn-fg) var(--capa-pulsado), var(--btn-bg));
    border-radius: var(--btn-r-pulsado);
  }
  .btn:not(.btn-outlined, .btn-ghost, .btn-text, .btn-tonal, .btn-elevated):hover { --btn-sombra: var(--md-sys-elevation-level1); }
  .btn-tonal { --btn-bg: var(--md-sys-color-secondary-container); --btn-fg: var(--md-sys-color-on-secondary-container); }
  .btn-outlined, .btn-ghost { --btn-bg: transparent; --btn-fg: var(--md-sys-color-on-surface-variant); --btn-borde: var(--md-sys-color-outline-variant); }
  .btn-text { --btn-bg: transparent; --btn-fg: var(--md-sys-color-primary); padding-inline: 12px; }
  .btn-text:has(> .ms:first-child) { padding-inline: 12px 16px; }
  .btn-elevated { --btn-bg: var(--md-sys-color-surface-container-low); --btn-fg: var(--md-sys-color-primary); --btn-sombra: var(--md-sys-elevation-level1); }
  .btn-elevated:hover { --btn-sombra: var(--md-sys-elevation-level2); }
  .btn.peligro { --btn-bg: var(--md-sys-color-error); --btn-fg: var(--md-sys-color-on-error); }
  .btn.peligro:is(.btn-outlined, .btn-ghost, .btn-text) { --btn-bg: transparent; --btn-fg: var(--md-sys-color-error); --btn-borde: var(--md-sys-color-error); }
  .btn.peligro.btn-text { --btn-borde: transparent; }
  .btn-xs { --btn-h: 32px; padding: 0 12px; gap: 4px; }
  .btn-xs:has(> .ms:first-child) { padding-inline-start: 8px; }
  .btn-m { --btn-h: 56px; --btn-r-pulsado: var(--md-sys-shape-corner-medium); padding: 0 24px; font: var(--md-sys-typescale-title-medium); }
  .btn-m:has(> .ms:first-child) { padding-inline-start: 20px; }
  .btn-bloque { width: 100%; }
  .btn[disabled], .btn:disabled, .tab:disabled {
    --btn-bg: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent);
    --btn-fg: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
    --btn-sombra: none;
    cursor: not-allowed;
  }
  .btn:is(.btn-outlined, .btn-ghost):disabled { --btn-bg: transparent; --btn-borde: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent); }
  .btn-text:disabled { --btn-bg: transparent; }
  /* Un summary con aspecto de botón (Anotar pago manual). */
  summary.btn { list-style: none; }
  summary.btn::-webkit-details-marker { display: none; }

  /* ── Botones de icono ── */
  .icon-btn {
    --ib-bg: transparent;
    --ib-fg: var(--md-sys-color-on-surface-variant);
    position: relative;
    display: inline-grid;
    place-items: center;
    flex: none;
    width: 40px;
    height: 40px;
    padding: 0;
    border: 0;
    border-radius: var(--md-sys-shape-corner-full);
    background: var(--ib-bg);
    color: var(--ib-fg);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition:
      border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .icon-btn::before { content: ""; position: absolute; inset: -4px; }
  .icon-btn:hover { background: color-mix(in srgb, var(--ib-fg) var(--capa-hover), var(--ib-bg)); }
  /* --md-sys-motion-spatial-fast tiene rebote real (linear() se pasa de 1 y
     vuelve): ir de «full» (9999px) a un radio chico con esa curva cruza un
     instante por radio NEGATIVO, que el navegador recorta a 0 — la esquina
     sale en punta antes de asentarse. Al pulsar, border-radius pasa a la
     curva de «effects» (sin rebote), igual que ya tenía background-color; al
     soltar, el resorte de siempre (fuera de :active), donde pasarse de largo
     no se nota porque ya está en el redondeo máximo. */
  .icon-btn:active {
    background: color-mix(in srgb, var(--ib-fg) var(--capa-pulsado), var(--ib-bg));
    border-radius: var(--md-sys-shape-corner-small);
    transition:
      border-radius var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .icon-btn.filled { --ib-bg: var(--md-sys-color-primary); --ib-fg: var(--md-sys-color-on-primary); }
  .icon-btn.tonal { --ib-bg: var(--md-sys-color-secondary-container); --ib-fg: var(--md-sys-color-on-secondary-container); }
  .icon-btn.outlined { border: 1px solid var(--md-sys-color-outline-variant); }

  /* ── FAB y FAB extendido ── */
  .fab {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    min-width: 56px;
    height: 56px;
    padding: 0 16px;
    border: 0;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-primary-container);
    color: var(--md-sys-color-on-primary-container);
    box-shadow: var(--md-sys-elevation-level3);
    font: var(--md-sys-typescale-label-large);
    text-decoration: none;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition:
      border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized),
      box-shadow var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  .fab:hover { box-shadow: var(--md-sys-elevation-level4); background: color-mix(in srgb, var(--md-sys-color-on-primary-container) var(--capa-hover), var(--md-sys-color-primary-container)); }
  .fab:active { border-radius: var(--md-sys-shape-corner-extra-large); box-shadow: var(--md-sys-elevation-level3); }
  .fab-ext { padding: 0 20px 0 16px; }
  /* FAB fijo abajo a la derecha; main deja sitio para que no tape el final. */
  .fab-fijo {
    position: fixed;
    inset-inline-end: max(16px, env(safe-area-inset-right));
    inset-block-end: max(16px, env(safe-area-inset-bottom));
    z-index: 25;
    animation: m3-escala var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) .15s backwards;
  }
  main:has(.fab-fijo) { padding-bottom: 88px; }

  /* ── Grupo de botones conectados (Expressive) ──
     Esquinas interiores pequeñas, exteriores redondas; el seleccionado se
     vuelve píldora entera. .tabs/.tab son los filtros de siempre (su JS pone
     .activa y aria-pressed) con este aspecto. */
  .grupo-con, .tabs { display: flex; flex-wrap: wrap; gap: 2px; align-items: center; }
  .tab {
    --btn-bg: var(--md-sys-color-surface-container-high);
    --btn-fg: var(--md-sys-color-on-surface-variant);
    padding: 0 16px;
    border-radius: var(--md-sys-shape-corner-small);
  }
  .grupo-con > .btn { --btn-r: var(--md-sys-shape-corner-small); }
  .grupo-con > .btn:first-child, .tabs > .tab:first-child { border-start-start-radius: 20px; border-end-start-radius: 20px; }
  .grupo-con > .btn:last-child, .tabs > .tab:last-child { border-start-end-radius: 20px; border-end-end-radius: 20px; }
  .tab.activa, .tab[aria-pressed="true"], .grupo-con > .btn[aria-pressed="true"] {
    --btn-bg: var(--md-sys-color-secondary-container);
    --btn-fg: var(--md-sys-color-on-secondary-container);
    border-radius: 20px;
  }
  /* Cuenta dentro de un filtro: píldora sobre el fondo más claro del tema,
     con texto on-surface (legible sobre el tono del botón activo o no). */
  .tab-n {
    display: inline-grid;
    place-items: center;
    min-width: 22px;
    height: 20px;
    padding: 0 6px;
    border-radius: var(--md-sys-shape-corner-full);
    background: var(--md-sys-color-surface-container-lowest);
    color: var(--md-sys-color-on-surface);
    font: var(--md-sys-typescale-label-medium);
    font-variant-numeric: tabular-nums;
  }

  /* ── Chips ── assist (.chip), filtro (.chip con aria-pressed o .sel),
     de entrada (.chip-input) y con avatar (.chip-avatar). 32 px visibles y
     48 px de objetivo. */
  .chips { display: flex; flex-wrap: wrap; gap: 12px 8px; align-items: center; }
  .chip {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-height: 32px;
    padding: 0 16px;
    border: 1px solid var(--md-sys-color-outline-variant);
    border-radius: var(--md-sys-shape-corner-small);
    background: transparent;
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-label-large);
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition:
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized);
  }
  .chip::before { content: ""; position: absolute; inset-block: -8px; inset-inline: 0; }
  .chip:has(> .ms:first-child) { padding-inline-start: 8px; }
  .chip:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-hover), transparent); }
  .chip:active { background: color-mix(in srgb, var(--md-sys-color-on-surface-variant) var(--capa-pulsado), transparent); border-radius: var(--md-sys-shape-corner-medium); }
  .chip.sel, .chip[aria-pressed="true"], .chip[aria-current] {
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
    border-color: transparent;
  }
  .chip-avatar { padding: 0 16px 0 4px; min-height: 40px; border-radius: var(--md-sys-shape-corner-full); }
  .chip-avatar::before { inset-block: -4px; }
  .chip-avatar > i {
    display: grid;
    place-items: center;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    font: var(--md-sys-typescale-label-large);
    font-style: normal;
    font-weight: 700;
  }

  /* ── Tarjetas ── elevada (por defecto), rellena y con contorno. Una
     tarjeta que es enlace responde con capa de estado y elevación. */
  .card {
    background: var(--md-sys-color-surface-container-low);
    color: var(--md-sys-color-on-surface);
    border-radius: var(--md-sys-shape-corner-large);
    box-shadow: var(--md-sys-elevation-level1);
    padding: 20px;
    transition:
      box-shadow var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      border-radius var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-easing-emphasized);
  }
  .card-filled { background: var(--md-sys-color-surface-container-highest); box-shadow: none; }
  .card-outlined { background: var(--md-sys-color-surface); box-shadow: none; border: 1px solid var(--md-sys-color-outline-variant); }
  /* Tarjeta destacada (antes con degradado crema-menta): tono secondary. */
  .card-tonal { background: var(--md-sys-color-secondary-container); box-shadow: none; }
  a.card, .card-link { display: block; color: inherit; text-decoration: none; cursor: pointer; }
  a.card:hover, .card-link:hover {
    background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), var(--md-sys-color-surface-container-low));
    box-shadow: var(--md-sys-elevation-level2);
    border-radius: var(--md-sys-shape-corner-large-increased);
  }
  a.card:active { box-shadow: var(--md-sys-elevation-level1); }
  .card > :is(h2, h3):first-child, .card > p:first-child { margin-top: 0; }
  .card > .tabla-scroll:only-child table tr:last-child > td { border-bottom: 0; }
  .card-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
  .card-cab > :is(h2, h3) { margin: 0; }
  .card-pie { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .tit-card { font: var(--md-sys-typescale-title-large); font-weight: 600; margin: 0; color: var(--md-sys-color-on-surface); text-transform: none; }
  /* Título con icono delante: fila alineada (el espacio suelto entre ambos no cuenta). */
  :is(h2, h3, .tit-card):has(> .ms:first-child) { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .card-cab-pad { padding: 18px 20px 6px; margin: 0; }
  .card-amplia { padding: clamp(20px, 5vw, 32px); border-radius: var(--md-sys-shape-corner-extra-large); }
  .card-pago { padding: 12px; }
  .checkout-caja { min-height: 420px; }
  .ranura-principal { outline: 2px solid var(--md-sys-color-primary); outline-offset: -2px; }
  /* En tarjetas tonales la pista de progreso y los chips secondary se
     perderían contra el fondo: van sobre surface. */
  .card-tonal, .plan-estado, .flash { --bar-pista: var(--md-sys-color-surface); }
  :is(.card-tonal, .plan-estado, .flash) .tag-ok { background: var(--md-sys-color-surface); }
  :is(.card-tonal, .plan-estado) .btn:is(.btn-outlined, .btn-ghost) { --btn-borde: var(--md-sys-color-outline); }

  /* Icono en contenedor tonal (cabeceras de tarjeta, herramientas, listas). */
  .ico-caja {
    display: inline-grid;
    place-items: center;
    flex: none;
    width: 48px;
    height: 48px;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
  }

  /* ── Listas ── con separador (por defecto) o segmentadas (Expressive). */
  .lista { list-style: none; display: flex; flex-direction: column; margin: 0; padding: 0; }
  .lista-item {
    display: flex;
    align-items: center;
    gap: 16px;
    min-height: 56px;
    padding: 10px 0;
    border-bottom: 1px solid var(--md-sys-color-outline-variant);
  }
  .lista-item:last-child { border-bottom: 0; }
  .lista-item:has(> .lista-fin) { flex-wrap: wrap; }
  .lista-txt { flex: 1; min-width: 0; }
  .lista-item:has(> .lista-fin) > .lista-txt { min-width: min(100%, 200px); }
  .lista-txt > small, .lista-sub { display: block; font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .lista-fin { flex: none; margin-inline-start: auto; }
  .lista.segmentada { gap: 2px; }
  .lista.segmentada > .lista-item {
    border: 0;
    padding: 12px 16px;
    background: var(--md-sys-color-surface-container);
    border-radius: var(--md-sys-shape-corner-extra-small);
  }
  .lista.segmentada > .lista-item:first-child { border-top-left-radius: var(--md-sys-shape-corner-large); border-top-right-radius: var(--md-sys-shape-corner-large); }
  .lista.segmentada > .lista-item:last-child { border-bottom-left-radius: var(--md-sys-shape-corner-large); border-bottom-right-radius: var(--md-sys-shape-corner-large); }
  a.lista-item { color: inherit; text-decoration: none; transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast); }
  a.lista-item:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), var(--md-sys-color-surface-container)); }

  /* ── Tablas ── */
  table { width: 100%; border-collapse: collapse; font: var(--md-sys-typescale-body-medium); }
  th {
    text-align: left;
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-title-small);
    padding: 12px 14px;
    border-bottom: 1px solid var(--md-sys-color-outline-variant);
    vertical-align: bottom;
  }
  td { padding: 12px 14px; border-bottom: 1px solid var(--md-sys-color-outline-variant); vertical-align: middle; }
  tr { transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast); }
  tbody tr:hover > td, table > tr:hover > td { background: color-mix(in srgb, var(--md-sys-color-on-surface) 4%, transparent); }
  .card.p0 th:first-child, .card.p0 td:first-child { padding-inline-start: 20px; }
  .card.p0 th:last-child, .card.p0 td:last-child { padding-inline-end: 20px; }

  /* ── Campos de texto (contorno M3) y desplegables ──
     48 px de alto (densidad −2 de M3), borde en el rol outline (≥ 3:1) y
     foco de 2 px en primary. El rótulo va encima como <label>. */
  input[type=email], input[type=password], input[type=text], input[type=url],
  input[type=number], input[type=date], input[type=search], input[type=tel], select, textarea {
    width: 100%;
    max-width: 100%;
    min-width: 0;
    min-height: 48px;
    padding: 11px 16px;
    border: 1px solid var(--md-sys-color-outline);
    border-radius: var(--md-sys-shape-corner-small);
    background: transparent;
    color: var(--md-sys-color-on-surface);
    font: var(--md-sys-typescale-body-large);
    transition:
      border-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      box-shadow var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  select, textarea { font: var(--md-sys-typescale-body-large); }
  :is(input, select, textarea):hover:not(:disabled, [readonly]) { border-color: var(--md-sys-color-on-surface); }
  :is(input, select, textarea):focus {
    outline: none;
    border-color: var(--md-sys-color-primary);
    box-shadow: inset 0 0 0 1px var(--md-sys-color-primary);
  }
  :is(input, select, textarea):focus-visible { outline: none; }
  ::placeholder { color: var(--md-sys-color-on-surface-variant); opacity: .85; }
  :is(input, select, textarea):disabled {
    color: color-mix(in srgb, var(--md-sys-color-on-surface) 60%, transparent);
    border-color: color-mix(in srgb, var(--md-sys-color-on-surface) 18%, transparent);
    background: color-mix(in srgb, var(--md-sys-color-on-surface) 4%, transparent);
    cursor: not-allowed;
  }
  input[readonly] { background: color-mix(in srgb, var(--md-sys-color-on-surface) 3%, transparent); }
  :is(input, select, textarea):user-invalid { border-color: var(--md-sys-color-error); }
  select {
    appearance: none;
    -webkit-appearance: none;
    cursor: pointer;
    padding-inline-end: 44px;
    background-image: var(--flecha-select);
    background-repeat: no-repeat;
    background-position: right 12px center;
    background-size: 24px 24px;
  }
  select option, select optgroup { background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface); }
  textarea { min-height: 96px; resize: vertical; line-height: 1.5; }
  textarea.mono { font-family: ui-monospace, Consolas, monospace; font-size: 13px; min-height: 64px; }
  input[type=file] {
    max-width: 100%;
    font: var(--md-sys-typescale-body-medium);
    color: var(--md-sys-color-on-surface-variant);
  }
  input[type=file]::file-selector-button {
    margin-inline-end: 12px;
    min-height: 40px;
    padding: 0 16px;
    border: 0;
    border-radius: 20px;
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
    font: var(--md-sys-typescale-label-large);
    cursor: pointer;
  }
  input[type=color] { border: 1px solid var(--md-sys-color-outline); border-radius: var(--md-sys-shape-corner-small); background: transparent; }
  label {
    display: block;
    font: var(--md-sys-typescale-title-small);
    color: var(--md-sys-color-on-surface-variant);
    margin: 16px 0 6px;
  }
  /* Texto de ayuda y de error bajo un campo (supporting text de M3). */
  .campo-ayuda { font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); margin-top: 6px; }
  /* Rótulo de un grupo de controles (no es <label>: nombra un role="group"). */
  .etiqueta-grupo { font: var(--md-sys-typescale-title-small); color: var(--md-sys-color-on-surface-variant); margin: 16px 0 6px; }
  .campo-codigo { text-transform: uppercase; letter-spacing: 2px; font-family: ui-monospace, Consolas, monospace; }
  .campo-mono { font-family: ui-monospace, Consolas, monospace; font-size: 13px; }
  .cols-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
  @media (max-width: 360px) { .cols-2 { grid-template-columns: 1fr; } }
  .campo-ayuda.bien { color: var(--md-sys-color-primary); font-weight: 600; }
  .campo-ayuda.mal { color: var(--md-sys-color-error); font-weight: 600; }
  fieldset { border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-sys-shape-corner-medium); padding: 12px 16px 16px; }
  legend { padding: 0 6px; font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant); }

  /* Casillas y radios: nativos con el color primary; capa de estado de 40 px
     alrededor al pasar el ratón. */
  input[type=checkbox], input[type=radio] {
    width: 18px;
    height: 18px;
    margin: 0;
    flex: none;
    accent-color: var(--md-sys-color-primary);
    cursor: pointer;
    border-radius: 50%;
    transition: box-shadow var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  input[type=checkbox]:hover, input[type=radio]:hover { box-shadow: 0 0 0 11px color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), transparent); }
  input[type=checkbox]:focus-visible, input[type=radio]:focus-visible { outline-offset: 3px; }
  /* Fila de casilla con su texto (etiqueta que envuelve al control). */
  .check {
    display: flex;
    align-items: center;
    gap: 12px;
    min-height: 48px;
    margin: 4px 0 0;
    font: var(--md-sys-typescale-body-large);
    color: var(--md-sys-color-on-surface);
    cursor: pointer;
  }
  .check.arriba { align-items: flex-start; }
  .check.arriba > input { margin-top: 3px; }

  /* Interruptor de M3: casilla con role="switch". El pulgar es un degradado
     radial cuya posición y radio (propiedades registradas) viajan con el
     resorte spatial-fast. */
  input[type=checkbox].switch {
    appearance: none;
    -webkit-appearance: none;
    position: relative;
    width: 52px;
    height: 32px;
    border-radius: 16px;
    border: 2px solid var(--md-sys-color-outline);
    background-color: var(--md-sys-color-surface-container-highest);
    background-image: radial-gradient(circle at var(--sw-x) 50%, var(--sw-pulgar, var(--md-sys-color-outline)) var(--sw-r), transparent calc(var(--sw-r) + .5px));
    --sw-x: 14px;
    --sw-r: 8px;
    transition:
      --sw-x var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast),
      --sw-r var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast),
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      border-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
  }
  input[type=checkbox].switch:checked {
    --sw-x: 34px;
    --sw-r: 12px;
    --sw-pulgar: var(--md-sys-color-on-primary);
    background-color: var(--md-sys-color-primary);
    border-color: var(--md-sys-color-primary);
  }
  input[type=checkbox].switch:active { --sw-r: 14px; }
  input[type=checkbox].switch:hover { box-shadow: none; --sw-pulgar: var(--md-sys-color-on-surface-variant); }
  input[type=checkbox].switch:checked:hover { --sw-pulgar: var(--md-sys-color-primary-container); }

  /* ── Mensajes ──
     .flash  confirmación en línea (secondary-container)
     .error  error en línea (error-container)
     .snack  confirmación corta como snackbar: flota abajo y se va sola
     .aviso  aviso con acciones (.atencion tertiary, .peligro error)
     .toast  snackbar que pinta el JS de cada vista (.show / .err)          */
  .flash, .error, .aviso {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    padding: 12px 16px;
    margin-bottom: 16px;
    border-radius: var(--md-sys-shape-corner-medium);
    font: var(--md-sys-typescale-body-medium);
    animation: m3-baja var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) both;
  }
  .flash { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-surface); }
  .error { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }
  :is(.flash, .error, .aviso) > :is(.flash-txt, .error-txt, .aviso-txt) { flex: 1; min-width: min(100%, 220px); }
  .error :is(.sub, .hint, a:not(.btn)) { color: inherit; }
  span.error, .error.en-linea { display: inline-flex; padding: 6px 12px; margin: 0; }
  .aviso { background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); }
  .aviso .aviso-txt { flex: 1; min-width: min(100%, 200px); }
  /* Atención: superficie alta con acento tertiary (barra e icono). Con el
     tertiary-container entero, un simple «confirma tu correo» parecía un error. */
  .aviso.atencion { background: var(--md-sys-color-surface-container-highest); border-inline-start: 4px solid var(--md-sys-color-tertiary); }
  .aviso.atencion > .ms:first-child { color: var(--md-sys-color-tertiary); }
  .aviso.peligro { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }
  /* Sobre el error-container todo el texto usa su rol on-*. */
  .aviso.peligro :is(.sub, .hint, label, a:not(.btn)) { color: inherit; }
  .aviso.peligro .btn:is(.btn-ghost, .btn-outlined, .btn-text) { --btn-fg: var(--md-sys-color-on-error-container); --btn-borde: var(--md-sys-color-on-error-container); }
  .aviso .cerrar { margin-inline-start: auto; --ib-fg: currentColor; }
  .snack {
    position: fixed;
    left: 50%;
    bottom: max(16px, env(safe-area-inset-bottom));
    z-index: 50;
    width: max-content;
    max-width: min(560px, calc(100vw - 32px));
    margin: 0;
    padding: 14px 16px;
    border-radius: var(--md-sys-shape-corner-extra-small);
    background: var(--md-sys-color-inverse-surface);
    color: var(--md-sys-color-inverse-on-surface);
    box-shadow: var(--md-sys-elevation-level3);
    pointer-events: none;
    animation: m3-snack 7s var(--md-sys-motion-easing-emphasized) both;
  }
  .snack a { color: var(--md-sys-color-inverse-primary); }
  @media (min-width: 840px) { body:has(.appbar) .snack { left: calc(50% + var(--rail-w) / 2); } }
  @media (prefers-reduced-motion: reduce) { .snack { animation: none; position: static; transform: none; width: auto; max-width: none; margin-bottom: 16px; border-radius: var(--md-sys-shape-corner-medium); } }
  .toast {
    position: fixed;
    left: 50%;
    bottom: max(16px, env(safe-area-inset-bottom));
    z-index: 60;
    max-width: min(560px, calc(100vw - 32px));
    padding: 14px 16px;
    border-radius: var(--md-sys-shape-corner-extra-small);
    background: var(--md-sys-color-inverse-surface);
    color: var(--md-sys-color-inverse-on-surface);
    box-shadow: var(--md-sys-elevation-level3);
    font: var(--md-sys-typescale-body-medium);
    text-align: left;
    opacity: 0;
    transform: translate(-50%, 16px);
    /* pointer-events:none es obligatorio: vive siempre en el DOM y, sin esto,
       su caja invisible roba los clics de lo que haya debajo. */
    pointer-events: none;
    transition:
      opacity var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default),
      transform var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default);
  }
  .toast:empty { display: none; }
  .toast.show { opacity: 1; transform: translate(-50%, 0); }
  /* La primera vez pasa de vacío (display:none) a visible: sin esto no animaría. */
  @starting-style { .toast.show { opacity: 0; transform: translate(-50%, 16px); } }
  .toast.err { background: var(--md-sys-color-error); color: var(--md-sys-color-on-error); }
  @media (min-width: 840px) { body:has(.appbar) .toast { left: calc(50% + var(--rail-w) / 2); } }

  /* Franja del estado de la prueba (todas las páginas del padre). */
  .franja-prueba {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    padding: 12px 16px;
    margin: 0 0 20px;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container-highest);
    border-inline-start: 4px solid var(--md-sys-color-tertiary);
    color: var(--md-sys-color-on-surface);
    font: var(--md-sys-typescale-body-medium);
  }
  .franja-prueba > .ms:first-child { color: var(--md-sys-color-tertiary); }
  .franja-prueba.vencida { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); border-inline-start-color: var(--md-sys-color-error); }
  .franja-prueba.vencida > .ms:first-child { color: inherit; }
  .franja-prueba .franja-txt { flex: 1; min-width: min(100%, 220px); }
  .franja-prueba.vencida .btn:is(.btn-ghost, .btn-outlined) { --btn-fg: currentColor; --btn-borde: currentColor; }

  /* ── Diálogos ── */
  dialog {
    margin: auto;
    max-width: min(560px, calc(100vw - 32px));
    max-height: calc(100dvh - 48px);
    padding: 24px;
    border: 0;
    border-radius: var(--md-sys-shape-corner-extra-large);
    background: var(--md-sys-color-surface-container-high);
    color: var(--md-sys-color-on-surface);
    box-shadow: var(--md-sys-elevation-level3);
    opacity: 0;
    transform: scale(.92);
    transition:
      opacity var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default),
      transform var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default),
      display var(--md-sys-motion-spatial-default-duration) allow-discrete,
      overlay var(--md-sys-motion-spatial-default-duration) allow-discrete;
  }
  dialog[open] { opacity: 1; transform: none; }
  @starting-style { dialog[open] { opacity: 0; transform: scale(.92); } }
  dialog::backdrop { background: rgb(0 0 0 / .32); }
  dialog h2 { font: var(--md-sys-typescale-headline-small); margin: 0 0 16px; }

  /* ── Progreso ──
     Lineal de Expressive: indicador activo redondo, 4 px de hueco, pista en
     secondary-container y punto de parada al final. --pct (0-100) y --c (color
     del indicador) van en el <i>. .ondulada es la variante en ola. */
  .bar { position: relative; height: 8px; border-radius: var(--md-sys-shape-corner-full); overflow: hidden; }
  .bar > i {
    display: block;
    height: 100%;
    width: calc(var(--pct, 100) * 1%);
    border-radius: inherit;
    background: var(--c, var(--md-sys-color-primary));
    animation: m3-crece var(--md-sys-motion-spatial-slow-duration) var(--md-sys-motion-spatial-slow) .15s backwards;
    transition: width var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default);
  }
  .bar > i::after {
    content: "";
    position: absolute;
    inset-block: 0;
    inset-inline-start: calc(var(--pct, 100) * 1% + 4px);
    inset-inline-end: 0;
    border-radius: var(--md-sys-shape-corner-full);
    background: var(--bar-pista, var(--md-sys-color-secondary-container));
  }
  .bar > i::before {
    content: "";
    position: absolute;
    inset-inline-end: 2px;
    top: 50%;
    width: 4px;
    height: 4px;
    margin-top: -2px;
    border-radius: 50%;
    background: var(--md-sys-color-primary);
    z-index: 1;
    opacity: clamp(0, calc(96 - var(--pct, 100)), 1);
  }
  .bar-rotulo { display: flex; justify-content: space-between; gap: 10px; font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); margin: 10px 0 4px; }
  .bar.ondulada { height: 10px; overflow: visible; }
  .bar.ondulada > i {
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='10' viewBox='0 0 20 10'%3E%3Cpath d='M0 5 Q5 0 10 5 T20 5' fill='none' stroke='black' stroke-width='3.2' stroke-linecap='round'/%3E%3C/svg%3E") 0 50% / 20px 10px repeat-x;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='10' viewBox='0 0 20 10'%3E%3Cpath d='M0 5 Q5 0 10 5 T20 5' fill='none' stroke='black' stroke-width='3.2' stroke-linecap='round'/%3E%3C/svg%3E") 0 50% / 20px 10px repeat-x;
    animation: m3-ola 1s linear infinite;
  }
  .bar.ondulada > i::after { inset-block: 3px; }
  /* Circular determinada (SVG con pathLength=100) e indeterminada. */
  .prog-circ { display: block; transform: rotate(-90deg); overflow: visible; }
  .prog-circ circle { fill: none; stroke-width: 5; stroke-linecap: round; }
  .prog-circ .pista {
    stroke: var(--md-sys-color-secondary-container);
    stroke-dasharray: max(0, calc(100 - var(--pct, 0) - 10)) 100;
    stroke-dashoffset: calc(-1 * (var(--pct, 0) + 5));
    stroke-opacity: clamp(0, calc(90 - var(--pct, 0)), 1);
  }
  .prog-circ .activo {
    stroke: var(--c, var(--md-sys-color-primary));
    stroke-dasharray: var(--pct, 0) 100;
    stroke-opacity: clamp(0, var(--pct, 0), 1);
    transition: stroke-dasharray var(--md-sys-motion-spatial-slow-duration) var(--md-sys-motion-spatial-slow);
  }
  /* Indeterminado: un <progress> sin valor dibujado como arco que gira. */
  .cargando {
    -webkit-appearance: none;
    appearance: none;
    display: inline-block;
    flex: none;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: 4px solid var(--md-sys-color-secondary-container);
    border-top-color: var(--md-sys-color-primary);
    background: transparent;
    color: transparent;
    vertical-align: middle;
    animation: m3-gira 1s linear infinite;
  }
  .cargando::-webkit-progress-bar, .cargando::-webkit-progress-value { background: transparent; }
  .cargando::-moz-progress-bar { background: transparent; }

  /* ── Insignias de estado (chips de solo lectura) ── */
  .tag {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    min-height: 24px;
    padding: 2px 10px;
    border-radius: var(--md-sys-shape-corner-small);
    background: var(--md-sys-color-surface-container-highest);
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-label-medium);
    vertical-align: middle;
  }
  .tag:has(> .ms:first-child) { padding-inline-start: 6px; }
  .tag-ok { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); }
  .tag-warn { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }
  .tag-mal { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }
  .tag-neutro { background: var(--md-sys-color-surface-container-highest); color: var(--md-sys-color-on-surface-variant); }
  /* Etiqueta de área: el color del área va en un punto; el texto, en rol. */
  .tag-area { background: var(--md-sys-color-surface-container-highest); color: var(--md-sys-color-on-surface); }
  .tag-area::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--c, var(--md-sys-color-primary)); flex: none; }

  /* ── Información sobre herramientas (tooltip plano) ──
     Solo en elementos con aria-label: el nombre accesible ya lo da la
     etiqueta y el globo es un apoyo visual. Sin contenido mientras no se ve,
     para que no cuente en el ancho de la página. */
  [data-tip] { position: relative; }
  [data-tip]:is(:hover, :focus-visible)::after {
    content: attr(data-tip);
    position: absolute;
    top: calc(100% + 6px);
    left: 50%;
    transform: translateX(-50%);
    z-index: 70;
    padding: 4px 8px;
    border-radius: var(--md-sys-shape-corner-extra-small);
    background: var(--md-sys-color-inverse-surface);
    color: var(--md-sys-color-inverse-on-surface);
    font: var(--md-sys-typescale-body-small);
    white-space: nowrap;
    pointer-events: none;
    animation: m3-aparece var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast) .45s backwards;
  }

  /* ── Cifras ── */
  .kpis { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); margin-top: 16px; }
  .kpi {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 16px;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container-low);
    color: var(--md-sys-color-on-surface);
    text-decoration: none;
    transition:
      background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast),
      border-radius var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-easing-emphasized);
  }
  a.kpi:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), var(--md-sys-color-surface-container-low)); border-radius: var(--md-sys-shape-corner-extra-large); }
  .kpi b { display: block; font: var(--md-sys-typescale-headline-medium); font-weight: 700; font-variant-numeric: tabular-nums; }
  /* Separador para quien lee el texto sin maquetar: «0 pruebas», no «0pruebas». */
  .kpi b::after { content: " "; }
  .kpi b small { font: var(--md-sys-typescale-title-small); }
  .kpi span { font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .kpi.bien b { color: var(--md-sys-color-primary); }
  .kpi.ojo { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }
  .kpi.mal { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }
  .kpi:is(.ojo, .mal) span { color: inherit; }
  a.kpi.ojo:hover { background: color-mix(in srgb, var(--md-sys-color-on-tertiary-container) var(--capa-hover), var(--md-sys-color-tertiary-container)); }
  a.kpi.mal:hover { background: color-mix(in srgb, var(--md-sys-color-on-error-container) var(--capa-hover), var(--md-sys-color-error-container)); }

  /* ── Filtros, paginación ── */
  .filtros { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin: 16px 0; }
  .filtros :is(input[type=text], input[type=search], select) { width: auto; min-width: min(100%, 200px); flex: 1; }
  .filtros .btn { flex: none; }
  .filtros label { margin: 0; }
  .paginacion { display: flex; gap: 8px; align-items: center; justify-content: center; flex-wrap: wrap; margin-top: 16px; }

  /* ── Definiciones ── */
  .defs { display: grid; grid-template-columns: max-content 1fr; gap: 8px 16px; font: var(--md-sys-typescale-body-medium); align-items: baseline; }
  .defs dt { color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-label-medium); }
  .defs dd { margin: 0; }
  @media (max-width: 480px) { .defs { grid-template-columns: 1fr; gap: 2px; } .defs dd { margin-bottom: 8px; } }

  /* ── Preguntas frecuentes y acordeones (<details>) ── */
  .faq details {
    margin-top: 8px;
    padding: 0 20px;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container-low);
    transition: border-radius var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-easing-emphasized);
  }
  .faq details[open] { border-radius: var(--md-sys-shape-corner-extra-large); }
  .faq summary {
    display: flex;
    align-items: center;
    gap: 12px;
    min-height: 56px;
    padding: 14px 0;
    font: var(--md-sys-typescale-title-medium);
    list-style: none;
    cursor: pointer;
  }
  .faq summary::-webkit-details-marker { display: none; }
  /* Cheurón dibujado (no es icono: no depende del subconjunto de la fuente). */
  .faq summary::after {
    content: "";
    flex: none;
    width: 8px;
    height: 8px;
    margin-inline: auto 6px;
    border-right: 2px solid var(--md-sys-color-on-surface-variant);
    border-bottom: 2px solid var(--md-sys-color-on-surface-variant);
    transform: rotate(45deg) translate(-2px, -2px);
    transition: transform var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast);
  }
  .faq details[open] summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
  .faq p { padding: 0 0 16px; margin: 0; color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-medium); }
  .faq details::details-content {
    block-size: 0;
    overflow: clip;
    transition:
      block-size var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default),
      content-visibility var(--md-sys-motion-spatial-default-duration) allow-discrete;
  }
  .faq details[open]::details-content { block-size: auto; }

  /* ── Avatares ── inicial sobre primary-container; el color propio del niño
     (dato de la base) va de anillo, nunca de fondo bajo el texto. */
  .avatar-dot {
    display: inline-grid;
    place-items: center;
    flex: none;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: var(--md-sys-color-primary-container);
    color: var(--md-sys-color-on-primary-container);
    box-shadow: inset 0 0 0 3px var(--c, transparent);
    font: var(--md-sys-typescale-title-medium);
    font-weight: 700;
  }

  .empty { color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-medium); padding: 24px; text-align: center; }

  /* ── Pie ── */
  .site-foot {
    max-width: 1480px;
    margin: clamp(40px, 6vh, 72px) auto 0;
    padding: 0 var(--wrap-pad-x) 24px;
    color: var(--md-sys-color-on-surface-variant);
    font: var(--md-sys-typescale-body-medium);
    text-align: center;
  }
  .site-foot::before { content: ""; display: block; border-top: 1px solid var(--md-sys-color-outline-variant); margin-bottom: 16px; }
  .site-foot-marca { display: inline-flex; align-items: center; gap: 6px; }
  .site-foot-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 4px; margin-top: 8px; }

  /* ── Cabecera de página: título a la izquierda, acciones a la derecha ── */
  .pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px 24px; flex-wrap: wrap; margin-bottom: 24px; }
  .pagehead h1 { margin: 0 0 4px; }
  .pagehead .sub { margin: 0; }
  /* Título de sección con una acción a la derecha (sin meter el enlace en el h2). */
  .seccion-cab { display: flex; justify-content: space-between; align-items: center; gap: 8px 16px; flex-wrap: wrap; margin: clamp(32px, 4.5vh, 48px) 0 14px; }
  .seccion-cab > h2 { margin: 0; }

  /* ── Acceso (login, registro…) ── */
  .marca-auth { text-align: center; margin-bottom: 24px; }
  .marca-auth .appbar-logo { display: inline-flex; flex-direction: column; gap: 10px; }
  .marca-auth .appbar-logo-ico { width: 64px; height: 64px; border-radius: var(--md-sys-shape-corner-extra-large); }
  .marca-auth .appbar-logo-txt { font: var(--md-sys-typescale-headline-small); font-weight: 700; }
  .marca-auth .appbar-logo-ico { width: 72px; height: 84px; }
  .marca-auth .marca-nombre { height: 1.3em; width: 6.2em; }
  .marca-auth .appbar-logo-txt span { color: var(--md-sys-color-primary); }
  .marca-auth .sub { margin-top: 8px; }
  .card-auth { padding: clamp(20px, 5vw, 32px); border-radius: var(--md-sys-shape-corner-extra-large); }
  /* Resultado de una acción (pago, verificación, contraseña): icono grande. */
  .resultado { text-align: center; }
  .resultado-ico {
    display: inline-grid;
    place-items: center;
    width: 72px;
    height: 72px;
    margin-bottom: 16px;
    border-radius: var(--md-sys-shape-corner-extra-large);
    animation: m3-escala var(--md-sys-motion-spatial-slow-duration) var(--md-sys-motion-spatial-slow) .1s backwards;
  }
  .resultado h1 { justify-content: center; margin-bottom: 10px; }
  .resultado .acciones { justify-content: center; }
  /* Código grande para apuntar (código de explorador, PIN, invitación). */
  .codigo-grande {
    margin: 12px 0 20px;
    padding: 16px;
    border: 2px dashed var(--md-sys-color-outline-variant);
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface);
    font: 700 30px/1.2 ui-monospace, Consolas, monospace;
    letter-spacing: 4px;
    text-align: center;
    color: var(--md-sys-color-on-surface);
    overflow-wrap: anywhere;
  }
  .codigo-medio { font: 700 22px/1.3 ui-monospace, Consolas, monospace; letter-spacing: 3px; margin-top: 6px; }
}

/* ══════════════════════════════════ VISTAS ══════════════════════════════════ */
@layer vistas {
  /* Entrada orquestada: el contenido de <main> sube en cascada con el resorte
     spatial-default. La barra de navegación no se anima (se queda quieta al
     cambiar de página). :where() deja la especificidad baja. */
  .wrap > :where(:not(main, .appbar, .franja-prueba)), .wrap > :where(main) > :where(*:not(.fab-fijo, .snack, .toast)) {
    animation: m3-sube var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) backwards;
  }
  .wrap > :where(main) > :nth-child(2) { animation-delay: .04s; }
  .wrap > :where(main) > :nth-child(3) { animation-delay: .08s; }
  .wrap > :where(main) > :nth-child(4) { animation-delay: .12s; }
  .wrap > :where(main) > :nth-child(5) { animation-delay: .16s; }
  .wrap > :where(main) > :nth-child(n+6) { animation-delay: .2s; }
  .grid > .card, .planes-grid > .card, .hijos-lista > * {
    animation: m3-sube var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default) backwards;
  }
  .grid > .card:nth-child(2), .planes-grid > .card:nth-child(2), .hijos-lista > :nth-child(2) { animation-delay: .06s; }
  .grid > .card:nth-child(3), .planes-grid > .card:nth-child(3), .hijos-lista > :nth-child(3) { animation-delay: .12s; }
  .grid > .card:nth-child(n+4), .hijos-lista > :nth-child(n+4) { animation-delay: .18s; }
  @media (prefers-reduced-motion: reduce) {
    .wrap > *, .wrap > main > *, .grid > .card, .planes-grid > .card, .hijos-lista > * { animation: none; }
  }

  /* ── Inicio del padre ── */
  .hoy { margin-top: 16px; }
  .hoy .lista-item { border-bottom-color: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent); }
  .hoy .lista-ico { background: var(--md-sys-color-surface); color: var(--md-sys-color-primary); }
  .lista-ico {
    display: grid;
    place-items: center;
    flex: none;
    width: 40px;
    height: 40px;
    border-radius: var(--md-sys-shape-corner-full);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
  }
  .explorador-cab { display: flex; gap: 12px; align-items: center; margin-bottom: 14px; flex-wrap: wrap; }
  .explorador-cab > div:first-of-type { flex: 1; min-width: 0; }
  .explorador-acc { display: flex; flex-direction: column; gap: 8px; }
  @media (max-width: 480px) {
    .explorador-acc { flex-direction: row; flex-wrap: wrap; width: 100%; }
    .explorador-acc .btn { flex: 1 1 auto; }
  }
  .retos-barra { padding: 16px 20px 8px; }
  .col-marca { width: 48px; }
  .vacio-grande { padding: 44px 24px; }
  .fila-hecha { opacity: .6; }
  .explorador-cifras { display: flex; gap: 8px 18px; flex-wrap: wrap; font: var(--md-sys-typescale-body-medium); margin-bottom: 8px; align-items: center; }

  /* ── Suscripción: rejilla de planes ── */
  .planes-grid { display: grid; gap: 22px; justify-content: center; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 560px)); }
  .planes-pie { text-align: center; max-width: 86ch; margin: 24px auto 0; font: var(--md-sys-typescale-body-small); }

  /* ── Mis hijos ── */
  .hijos-lista { display: grid; gap: 16px; justify-content: center; grid-template-columns: repeat(auto-fit, minmax(min(100%, 330px), 440px)); }
  .hijo-card {
    display: flex;
    flex-direction: column;
    gap: 16px;
    padding: 20px;
    border-radius: var(--md-sys-shape-corner-extra-large);
    background: var(--md-sys-color-surface-container-low);
    box-shadow: var(--md-sys-elevation-level1);
    transition: box-shadow var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default);
  }
  .hijo-card:hover { box-shadow: var(--md-sys-elevation-level2); }
  .hijo-card--pausado { background: var(--md-sys-color-surface-container); box-shadow: none; outline: 1px dashed var(--md-sys-color-outline); outline-offset: -1px; }
  .hijo-id { display: flex; align-items: center; gap: 14px; }
  .hijo-anillo { position: relative; width: 64px; height: 64px; flex: none; display: grid; place-items: center; }
  .hijo-anillo .prog-circ { position: absolute; inset: 0; width: 100%; height: 100%; }
  .hijo-anillo span { position: relative; font: var(--md-sys-typescale-title-medium); font-weight: 700; line-height: 1; }
  .hijo-anillo small { font: var(--md-sys-typescale-label-small); color: var(--md-sys-color-on-surface-variant); }
  .hijo-nombre { min-width: 0; }
  .hijo-nombre strong { font: var(--md-sys-typescale-title-large); font-weight: 650; }
  .hijo-nombre .sub { margin-top: 2px; }
  .hijo-cifras {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px;
    margin: 0;
  }
  .hijo-cifras div { min-width: 0; padding: 10px 12px; border-radius: var(--md-sys-shape-corner-medium); background: var(--md-sys-color-surface-container); }
  .hijo-cifras dt { font: var(--md-sys-typescale-label-medium); color: var(--md-sys-color-on-surface-variant); margin: 0 0 4px; }
  .hijo-cifras dd { margin: 0; font: var(--md-sys-typescale-headline-small); font-weight: 700; font-variant-numeric: tabular-nums; }
  .hijo-cifras .ojo { background: var(--md-sys-color-tertiary-container); }
  .hijo-cifras .ojo :is(dt, dd) { color: var(--md-sys-color-on-tertiary-container); }
  .hijo-uso { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .hijo-uso strong { color: var(--md-sys-color-on-surface); }
  .hijo-areas summary {
    display: flex;
    align-items: center;
    gap: 8px;
    min-height: 48px;
    font: var(--md-sys-typescale-label-large);
    color: var(--md-sys-color-primary);
    list-style: none;
    cursor: pointer;
    user-select: none;
    border-radius: var(--md-sys-shape-corner-small);
  }
  .hijo-areas summary::-webkit-details-marker { display: none; }
  .hijo-areas summary::after {
    content: "";
    width: 7px;
    height: 7px;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg) translate(-2px, -2px);
    transition: transform var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast);
  }
  .hijo-areas[open] summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
  .hijo-areas::details-content {
    block-size: 0;
    overflow: clip;
    transition:
      block-size var(--md-sys-motion-spatial-default-duration) var(--md-sys-motion-spatial-default),
      content-visibility var(--md-sys-motion-spatial-default-duration) allow-discrete;
  }
  .hijo-areas[open]::details-content { block-size: auto; }
  .hijo-areas-lista { display: flex; flex-direction: column; gap: 8px; padding-top: 6px; }
  .area-fila { display: grid; grid-template-columns: minmax(0, 1fr) 90px 44px; align-items: center; gap: 10px; font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); }
  .area-nom { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .area-num { text-align: right; font-variant-numeric: tabular-nums; }
  .area-fila .bar { height: 6px; display: block; }
  .hijo-acciones { display: flex; gap: 8px; flex-wrap: wrap; margin-top: auto; }
  .hijo-acciones .btn { flex: 1; white-space: nowrap; }
  @media (max-width: 420px) {
    .hijo-cifras { grid-template-columns: 1fr 1fr; }
    .area-fila { grid-template-columns: minmax(0, 1fr) 60px 42px; }
  }

  /* ── Materiales: buscador de saberes (prefijo bsab-) ── */
  .bsab-elegido {
    display: flex;
    align-items: center;
    gap: 8px;
    justify-content: space-between;
    min-height: 56px;
    padding: 6px 4px 6px 16px;
    margin-bottom: 8px;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
    font: var(--md-sys-typescale-body-large);
    animation: m3-escala var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast) both;
  }
  .bsab-elegido b { font-weight: 700; color: var(--md-sys-color-on-surface); }
  .bsab-elegido small { display: block; font: var(--md-sys-typescale-label-medium); }
  .bsab-quitar {
    position: relative;
    display: inline-grid;
    place-items: center;
    flex: none;
    width: 40px;
    height: 40px;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: inherit;
    cursor: pointer;
    font-size: 18px;
    transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast), border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized);
  }
  .bsab-quitar::before { content: ""; position: absolute; inset: -4px; }
  .bsab-quitar:hover { background: color-mix(in srgb, currentColor var(--capa-hover), transparent); }
  .bsab-quitar:active { border-radius: var(--md-sys-shape-corner-small); }
  .bsab-fila { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
  .bsab-mini { margin: 0; flex: 0 0 auto; font: var(--md-sys-typescale-label-medium); }
  .bsab-area { flex: 1 1 0; font: var(--md-sys-typescale-body-medium); }
  .bsab-lista {
    display: none;
    list-style: none;
    margin: 8px 0 0;
    padding: 8px 0;
    max-height: 280px;
    overflow-y: auto;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container);
    box-shadow: var(--md-sys-elevation-level2);
  }
  .bsab-lista.abierta { display: block; animation: m3-escala var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast) both; transform-origin: top center; }
  .bsab-op {
    display: flex;
    flex-direction: column;
    justify-content: center;
    min-height: 48px;
    padding: 8px 16px;
    cursor: pointer;
    font: var(--md-sys-typescale-body-large);
    color: var(--md-sys-color-on-surface);
  }
  .bsab-op small { font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); }
  .bsab-op:hover { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-hover), transparent); }
  .bsab-op.foco { background: color-mix(in srgb, var(--md-sys-color-on-surface) var(--capa-foco), transparent); outline: 2px solid var(--md-sys-color-primary); outline-offset: -2px; }
  .bsab-ayuda { margin: 8px 2px 0; font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); min-height: 16px; }
  .bsab-ayuda.mal { color: var(--md-sys-color-error); font-weight: 600; }

  /* ── La semana ── */
  .sem-hijo { margin-bottom: 28px; }
  .sem-hijo h2 { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
  .sem-hijo h2 .btn { margin-inline-start: auto; }
  .sem-kpis { display: flex; gap: 8px; flex-wrap: wrap; margin: 12px 0 16px; }
  .sem-kpi { flex: 1; min-width: 120px; padding: 12px 14px; border-radius: var(--md-sys-shape-corner-medium); background: var(--md-sys-color-surface-container); }
  .sem-kpi b { display: block; font: var(--md-sys-typescale-headline-small); font-weight: 700; font-variant-numeric: tabular-nums; }
  .sem-kpi span { font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); }
  .sem-tit { display: flex; align-items: center; gap: 8px; font: var(--md-sys-typescale-title-small); margin-top: 12px; }
  .sem-lista { margin: 6px 0 0; padding-left: 22px; font: var(--md-sys-typescale-body-medium); }
  .sem-lista li { margin: 2px 0; }
  .sem-lista .sub { font: inherit; }
  .sem-sug {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    margin-top: 16px;
    padding: 14px 16px;
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-surface);
    font: var(--md-sys-typescale-body-medium);
  }
  .sem-sug > .ms:first-child { color: var(--md-sys-color-primary); }
  .sem-frase { margin: 4px 0 8px; font: var(--md-sys-typescale-body-large); }

  /* ── Planes (admin) ── */
  .plan-off { background: var(--md-sys-color-surface-container); box-shadow: none; outline: 1px dashed var(--md-sys-color-outline); outline-offset: -1px; }
  .plan-etiquetas { display: flex; gap: 6px; flex-wrap: wrap; margin-inline-start: auto; }
  .plan-etiquetas code { font-size: 12px; background: none; padding: 0; }
  .plan-rejilla { display: grid; grid-template-columns: 1fr 110px 130px; gap: 12px; align-items: end; }
  .plan-rejilla label { margin-top: 14px; }
  .plan-campos { margin-top: 18px; }
  .plan-campos legend { text-transform: none; }
  .plan-check { display: flex; align-items: center; gap: 12px; margin-top: 12px; min-height: 48px; font: var(--md-sys-typescale-body-large); color: var(--md-sys-color-on-surface); cursor: pointer; }
  .plan-pie { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  @media (max-width: 600px) { .plan-rejilla { grid-template-columns: 1fr; } .plan-etiquetas { margin-inline-start: 0; } }

  /* ── Ficha del hijo ── */
  .ficha-top { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
  .kid-row { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
  .ficha-h1 { justify-content: space-between; }
  .ficha-chips {
    position: sticky;
    top: var(--barra-sup);
    z-index: 20;
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin: 8px calc(-1 * var(--wrap-pad-x)) 6px;
    padding: 10px var(--wrap-pad-x);
    background: color-mix(in srgb, var(--md-sys-color-surface) 92%, transparent);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
  }
  .ficha-sec { scroll-margin-top: calc(var(--barra-sup) + 76px); }
  /* Dos columnas en escritorio con flujo tipo mosaico; una en pantallas
     estrechas. Cada tarjeta fluye completa y su título viaja pegado a ella. */
  .ficha-cols { columns: 2; column-gap: 24px; margin-top: 4px; }
  .ficha-col, .ficha-sec { display: block; }
  .ficha-cols .card { break-inside: avoid; margin-bottom: 18px; }
  .ficha-cols h2 { break-after: avoid; }
  @media (max-width: 1020px) { .ficha-cols { columns: 1; } }
  .att-scroll { max-height: 420px; overflow-y: auto; }
  .att-scroll th { position: sticky; top: 0; background: var(--md-sys-color-surface-container-low); z-index: 1; }
  .att-row { cursor: pointer; }
  .att-detail > td { background: var(--md-sys-color-surface-container); }
  .frase-semana { margin: 4px 0 8px; font: var(--md-sys-typescale-body-large); }
  .nota-suave { display: flex; gap: 8px; align-items: flex-start; margin: 8px 0 0; font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .explicacion { padding: 12px 0; border-bottom: 1px solid var(--md-sys-color-outline-variant); }
  .explicacion-meta { display: flex; align-items: center; gap: 6px; font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-on-surface-variant); margin-bottom: 4px; }
  .explicacion-txt { font: var(--md-sys-typescale-body-large); }
  /* Explicaciones evaluadas (fase 0): el padre dice si se entiende. */
  .valora { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; }
  /* Vara PISA: perfil de competencias y Guardián Interdimensional. */
  .pisa-fila { align-items: flex-start; }
  .pisa-emoji { flex: none; width: 32px; font-size: 22px; line-height: 1.3; text-align: center; }
  .pisa-fila .lista-txt > small + small { margin-top: 2px; }
  .reglas { display: grid; gap: 14px; grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr)); }
  .reglas label { margin-top: 0; }
  .fila-form { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
  .fila-form > .crece { flex: 1; min-width: min(100%, 180px); }
  .fila-form > .fijo-120 { width: 120px; }
  .acceso-cab { display: flex; flex-wrap: wrap; gap: 16px 24px; justify-content: space-between; align-items: flex-start; }
  .reporta-q {
    border: 0;
    background: none;
    color: var(--md-sys-color-on-surface-variant);
    cursor: pointer;
    font: var(--md-sys-typescale-body-small);
    text-decoration: underline;
    min-height: 32px;
    padding: 0 4px;
  }
  .costo-lista { margin: 0 0 12px; padding-left: 20px; }
  .costo-lista li { margin: 4px 0; }

  /* ── Mi cuenta ── */
  .ficha-id { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding-bottom: 18px; border-bottom: 1px solid var(--md-sys-color-outline-variant); }
  .ficha-id .avatar-dot { width: 48px; height: 48px; font: var(--md-sys-typescale-title-large); font-weight: 700; }
  .ficha-id-txt { min-width: 0; flex: 1; }
  .ficha-id-txt b { display: block; font: var(--md-sys-typescale-title-medium); font-weight: 650; }
  .ajuste { display: grid; gap: 10px 32px; padding: 18px 0; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .ajuste:first-of-type { border-top: 0; padding-top: 16px; }
  .ajuste-txt strong { display: block; font: var(--md-sys-typescale-title-small); }
  .ajuste-txt .hint { margin-top: 3px; max-width: 56ch; }
  .ajuste label { margin: 0 0 6px; }
  .ajuste-ctrl > .hint { margin-top: 6px; }
  .ajuste-pie { display: flex; padding-top: 16px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  @media (min-width: 860px) {
    .ajuste { grid-template-columns: minmax(0, 1fr) minmax(0, var(--ctrl, 400px)); align-items: start; }
    .ajuste-pie { justify-content: flex-end; }
  }
  .campo-corto { max-width: 400px; }
  .bloque + .bloque { margin-top: 22px; padding-top: 22px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .bloque h3 { margin-bottom: 8px; }

  /* ── Suscripción ── */
  .plan-estado { padding: 24px; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-secondary-container); box-shadow: none; }
  .plan-estado :is(.tit-card) { color: var(--md-sys-color-on-surface); }
  .plan-datos { display: grid; gap: 18px 30px; margin-top: 20px; padding-top: 18px; border-top: 1px solid color-mix(in srgb, var(--md-sys-color-on-surface) 14%, transparent); grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr)); }
  .plan-dato b { display: block; font: var(--md-sys-typescale-title-medium); font-weight: 650; margin-top: 3px; }
  .plan-dato .bar { margin-top: 10px; max-width: 190px; }
  .plan-acciones { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 20px; padding-top: 18px; border-top: 1px solid color-mix(in srgb, var(--md-sys-color-on-surface) 14%, transparent); }
  /* Tarjeta de plan: precio arriba, lo que incluye en medio y el pago abajo
     del todo (margin-top:auto) para que los botones queden alineados. */
  .plan-card { display: flex; flex-direction: column; gap: 14px; padding: 24px; margin-bottom: 18px; }
  .planes-grid .plan-card { margin-bottom: 0; border-radius: var(--md-sys-shape-corner-extra-large); }
  .plan-card.es-actual { outline: 2px solid var(--md-sys-color-primary); outline-offset: -2px; }
  .plan-cab { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; }
  .plan-cab h3 { margin: 0; font: var(--md-sys-typescale-title-large); font-weight: 650; }
  .plan-precio { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
  .plan-precio b { font: var(--md-sys-typescale-display-small); font-weight: 750; letter-spacing: -1px; font-variant-numeric: tabular-nums; }
  .plan-precio span { font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .plan-lista { list-style: none; display: grid; gap: 8px; margin: 0; font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .plan-lista li { display: flex; gap: 10px; align-items: flex-start; }
  .plan-lista li > .ms { color: var(--md-sys-color-primary); }
  .plan-pago { display: grid; gap: 10px; margin-top: auto; padding-top: 18px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .plan-pago .btn { width: 100%; }
  .plan-pago-nota { text-align: center; color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-small); }
  .plan-o { display: flex; align-items: center; gap: 10px; color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-label-medium); margin: 2px 0; }
  .plan-o::before, .plan-o::after { content: ""; flex: 1; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .faq-cols { display: grid; gap: 0 22px; align-items: start; }
  @media (min-width: 860px) { .faq-cols { grid-template-columns: 1fr 1fr; } }
  .precio-plan { font: var(--md-sys-typescale-headline-medium); font-weight: 700; }
  .precio-plan .sub { font: var(--md-sys-typescale-body-medium); }

  /* ── Invitar ── */
  .invita-acc { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 16px; padding-top: 16px; border-top: 1px solid color-mix(in srgb, var(--md-sys-color-on-surface) 14%, transparent); }
  .cifra-sola { display: flex; flex-direction: column; gap: 2px; }
  .cifra-sola .cifra-num { margin: 0; }

  /* ── Métricas y cifras de admin ── */
  .cifra { text-align: center; }
  .cifra-tit { font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant); }
  .cifra-num { font: var(--md-sys-typescale-display-small); font-weight: 700; margin-top: 4px; font-variant-numeric: tabular-nums; }
  .cifra-num.chica { font: var(--md-sys-typescale-headline-large); font-weight: 700; }
  .cifra-num small { font: var(--md-sys-typescale-title-small); color: var(--md-sys-color-on-surface-variant); }
  .cifra-num.bien { color: var(--md-sys-color-primary); }
  .cifra-num.ojo { color: var(--md-sys-color-tertiary); }
  .cifra-num.mal { color: var(--md-sys-color-error); }

  /* Panel de admin: tarjetas de contenido y herramientas. */
  .conteo { display: flex; flex-direction: column; gap: 2px; }
  .conteo .ico-caja { margin-bottom: 10px; }
  .conteo-num { font: var(--md-sys-typescale-display-small); font-weight: 750; font-variant-numeric: tabular-nums; }
  .conteo-tit { font: var(--md-sys-typescale-title-small); }
  .herramientas { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); margin-top: 8px; }
  .herramienta { display: flex; align-items: center; gap: 14px; padding: 14px 16px; }
  .herramienta > div { min-width: 0; }
  .herramienta strong { display: block; font: var(--md-sys-typescale-title-small); }

  /* ── Jefes Maestros (admin): lista de conceptos en varias columnas ── */
  .conceptbox {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr));
    gap: 4px 12px;
    align-content: start;
    max-height: 280px;
    overflow: auto;
    padding: 12px;
    border: 1px solid var(--md-sys-color-outline);
    border-radius: var(--md-sys-shape-corner-small);
  }
  .conceptbox .check { min-height: 40px; margin: 0; font: var(--md-sys-typescale-body-medium); }
  .examen-q { border-bottom: 1px solid var(--md-sys-color-outline-variant); padding: 12px 0; }
  .examen-q:last-child { border-bottom: 0; }
  .examen-resp { font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-primary); margin-top: 3px; }
  .aviso-tasa { color: var(--md-sys-color-error); font-weight: 700; }

  /* ── Tesoros (admin): tarjetas de área (chips de filtro con su mínimo) ── */
  .tes-areas { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-start; }
  .tes-area {
    border: 1px solid var(--md-sys-color-outline-variant);
    border-radius: var(--md-sys-shape-corner-medium);
    padding: 4px 12px;
    background: transparent;
    transition: background-color var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast), border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-easing-emphasized);
  }
  .tes-area[data-on="1"] { border-color: transparent; background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); border-radius: var(--md-sys-shape-corner-large); padding-bottom: 12px; }
  .tes-area-tog { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; padding: 0; border: 0; background: transparent; color: inherit; font: var(--md-sys-typescale-label-large); cursor: pointer; }
  .tes-area-tog i { width: 12px; height: 12px; border-radius: 50%; flex: none; background: var(--c, var(--md-sys-color-primary)); }
  .tes-area-tog .sub { font: var(--md-sys-typescale-body-small); }
  .tes-area[data-on="1"] .tes-area-tog .sub { color: inherit; }
  .tes-area-min { display: none; margin-top: 8px; font: var(--md-sys-typescale-body-medium); }
  .tes-area[data-on="1"] .tes-area-min { display: block; }
  .tes-area-min input { width: 64px; display: inline-block; min-height: 40px; padding: 6px 8px; text-align: center; }
  .tes-area-min input.mal { border-color: var(--md-sys-color-error); }
  .tes-aviso { margin-top: 6px; font: var(--md-sys-typescale-body-small); color: var(--md-sys-color-error); }
  .tes-area[data-on="1"] .tes-aviso { color: var(--md-sys-color-on-secondary-container); font-weight: 700; }
  .rombos { color: var(--md-sys-color-tertiary); letter-spacing: 2px; }
  .caso-txt { padding: 16px; margin-bottom: 16px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); }
  .caso-svg { padding: 12px; margin-bottom: 18px; max-width: 520px; border-radius: var(--md-sys-shape-corner-large); background: #fff; /* el SVG del caso trae su propia paleta clara */ }
  .caso-rot { font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant); margin-bottom: 8px; }

  /* ── Árboles y plantillas: tarjeta con identidad ── */
  .arboles-grid { display: grid; gap: 16px; justify-content: center; grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 400px)); }
  .arbol-card { display: flex; flex-direction: column; gap: 12px; overflow: hidden; border-radius: var(--md-sys-shape-corner-extra-large); }
  .arbol-portada { display: block; width: calc(100% + 40px); max-width: none; height: 128px; margin: -20px -20px 0; object-fit: cover; }
  .arbol-cab { display: flex; align-items: center; gap: 12px; }
  .arbol-cab > div { min-width: 0; }
  .arbol-cab strong { font: var(--md-sys-typescale-title-medium); font-weight: 650; }
  .arbol-acc { display: flex; gap: 8px; margin-top: auto; flex-wrap: wrap; }
  .arbol-acc > :first-child { flex: 1; }
  .tpl-fila { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 10px 14px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); }
  .tpl-fila > div { flex: 1; min-width: min(100%, 180px); }
  .tpl-mini { width: 72px; height: 48px; flex: none; border-radius: var(--md-sys-shape-corner-medium); object-fit: cover; }
  .picker-area { margin-top: 14px; }
  .picker-cab { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
  .picker-punto { width: 12px; height: 12px; border-radius: 50%; display: inline-block; flex: none; background: var(--c, var(--md-sys-color-primary)); }
  .picker-rejilla { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); gap: 2px 12px; }
  .picker-rejilla .check { min-height: 40px; margin: 0; font: var(--md-sys-typescale-body-medium); }
  .hijo-asigna { display: flex; flex-wrap: wrap; gap: 8px; }
  .hijo-asigna .check { margin: 0; padding: 0 16px 0 12px; border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-sys-shape-corner-small); min-height: 48px; }
  .hijo-asigna .check:has(input:checked) { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); border-color: transparent; }
  .resultado-ia { padding: 12px 14px; border-radius: var(--md-sys-shape-corner-medium); background: var(--md-sys-color-surface-container); }
  .resultado-ia ul { margin: 10px 0 0; padding-left: 18px; }
  .resultado-ia li { margin: 6px 0; }

  /* ── Revisión (admin) ── */
  .reporte { display: flex; justify-content: space-between; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--md-sys-color-outline-variant); }
  .reporte > div { min-width: 0; }
  .reporte .btn { flex: none; align-self: center; }
  .cola-resumen { display: flex; gap: 16px 28px; flex-wrap: wrap; align-items: center; }
  .cola-resumen .conteo-num { font: var(--md-sys-typescale-headline-medium); font-weight: 750; }
  .cola-filtros { display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-end; }
  .cola-filtros > div { flex: 1; min-width: min(100%, 170px); }
  .cola-filtros > .ancho-2 { flex: 2; min-width: min(100%, 220px); }
  .cola-filtros label { margin-top: 0; }
  .cola-contador { padding: 10px 20px; border-top: 1px solid var(--md-sys-color-outline-variant); }

  /* ── Auditor y generador IA ── */
  .hallazgo-cab { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
  .hallazgo-det { font: var(--md-sys-typescale-body-medium); color: var(--md-sys-color-on-surface-variant); }
  .hallazgo-ops { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--md-sys-color-outline-variant); }
  .hallazgo-op { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin: 6px 0; font: var(--md-sys-typescale-body-medium); }
  .cobertura-fila { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--md-sys-color-outline-variant); font: var(--md-sys-typescale-body-medium); }
  .cobertura-fila:last-child { border-bottom: 0; }
  .lista-ticks { margin: 0; padding-left: 20px; line-height: 1.9; }
}

/* ════════════════════════════════ UTILIDADES ════════════════════════════════ */
@layer utilidades {
  /* Fila de acciones: botones juntos, nunca enlaces sueltos. */
  .acciones { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
  .acciones.derecha { justify-content: flex-end; }
  .acciones.centro { justify-content: center; }
  .entre { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; }
  .apilado { display: flex; flex-direction: column; gap: 8px; }
  .apilado-20 { display: flex; flex-direction: column; gap: 20px; }
  .fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  .crece { flex: 1; min-width: 0; }
  .ml-auto { margin-inline-start: auto; }
  .m0 { margin: 0; }
  .p0 { padding: 0; }
  .mt0 { margin-top: 0; } .mt4 { margin-top: 4px; } .mt6 { margin-top: 6px; } .mt8 { margin-top: 8px; }
  .mt10 { margin-top: 10px; } .mt12 { margin-top: 12px; } .mt14 { margin-top: 14px; } .mt16 { margin-top: 16px; }
  .mt20 { margin-top: 20px; } .mt24 { margin-top: 24px; }
  .mb0 { margin-bottom: 0; } .mb6 { margin-bottom: 6px; } .mb8 { margin-bottom: 8px; } .mb10 { margin-bottom: 10px; }
  .mb12 { margin-bottom: 12px; } .mb16 { margin-bottom: 16px; } .mb20 { margin-bottom: 20px; }
  .sub { color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-medium); }
  .hint { color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-medium); }
  .chico { font: var(--md-sys-typescale-body-small); }
  .medio { font: var(--md-sys-typescale-body-medium); }
  .fuerte { font-weight: 700; }
  .normal { font-weight: 400; }
  .nowrap { white-space: nowrap; }
  .derecha { text-align: right; }
  .centro { text-align: center; }
  .mayus { text-transform: uppercase; }
  .mono { font-family: ui-monospace, Consolas, monospace; font-size: 12px; }
  .texto-primario { color: var(--md-sys-color-primary); }
  .texto-error { color: var(--md-sys-color-error); }
  /* Cifras de tabla: a la derecha y con dígitos de ancho fijo. */
  .num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
  .num.fuerte { font-weight: 700; }
  .num.mal { color: var(--md-sys-color-error); }
  .celda-acciones { text-align: right; white-space: nowrap; }
  .celda-acciones .btn + .btn { margin-inline-start: 4px; }
  .tabla-acciones { display: flex; gap: 6px; justify-content: flex-end; flex-wrap: wrap; }
  .solo-lector {
    position: absolute !important;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }
  .fila-oculta { display: none !important; }
  .fila-marcada > td { background: color-mix(in srgb, var(--md-sys-color-secondary-container) 60%, transparent); }
  .pestanas-hijo { margin: 0 0 12px; }
  /* Topes de ancho para campos cortos. */
  .max140, input.max140, select.max140 { max-width: 140px; }
  .max220, input.max220, select.max220 { max-width: 220px; }
  .ancho-auto { width: auto; }
  .pb16 { padding-bottom: 16px; }
  .gap14 { gap: 14px; }
  .min-linea { min-height: 1.4em; }
  /* Tonos de identidad (avatares, iconos de árbol, resultados): siempre un
     par contenedor/on-contenedor de M3. Utilidad: gana al fondo del componente. */
  .tono-1 { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); }
  .tono-2 { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); }
  .tono-3 { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }
  .tono-4 { background: var(--md-sys-color-surface-container-highest); color: var(--md-sys-color-on-surface); }
}

/* ═══════════════ ICONOS (sin capa a propósito: ver cabecera) ═══════════════ */
.btn .ms, .tab .ms, .navmore-item .ms { font-size: 20px; }
.btn-xs .ms, .chip .ms { font-size: 18px; }
.tag .ms { font-size: 16px; }
.btn-m .ms, .fab .ms, .icon-btn .ms, .navlink .ms, .lista-ico .ms { font-size: 24px; }
.appbar-logo-ico .ms { font-size: 26px; }
.marca-auth .appbar-logo-ico .ms { font-size: 36px; }
.ico-caja .ms { font-size: 26px; }
.resultado-ico .ms { font-size: 44px; }
.flash > .ms:first-child, .error > .ms:first-child, .aviso > .ms:first-child,
.franja-prueba > .ms:first-child, .sem-sug > .ms:first-child, .nota-suave > .ms:first-child { font-size: 22px; }
h1 > .ms:first-child {
  display: inline-grid;
  place-items: center;
  width: 48px;
  height: 48px;
  font-size: 28px;
  border-radius: var(--md-sys-shape-corner-large);
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
h2 > .ms:first-child { font-size: 26px; color: var(--md-sys-color-primary); }
h3 > .ms:first-child, .sem-tit > .ms:first-child { font-size: 22px; color: var(--md-sys-color-primary); }
/* Icono dentro de una línea de texto: toma el tamaño de la letra. */
.ms.txt { font-size: 1.25em; vertical-align: -.25em; }
.tab-marca { display: none; }
.tab.activa .tab-marca, .tab[aria-pressed="true"] .tab-marca { display: inline-block; }
/* Destino activo y pestaña activa: icono relleno (el eje FILL de la fuente). */
.navlink.on .ms, .cuenta-tab.on .ms, .navmore-item.on .ms, .chip.sel .ms, .chip[aria-pressed="true"] .ms {
  font-variation-settings: 'FILL' 1, 'wght' 500, 'GRAD' 0, 'opsz' 24;
}
.navlink .ms, .cuenta-tab .ms { transition: font-variation-settings var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default); }
@media (min-width: 840px) and (max-width: 1199.98px) {
  .navmore-flecha { display: none; }
}

/* ── «En familia» (89): tarjetas de actividades para hacer con el hijo ──
   Se reabre la capa de vistas: las reglas viven en su capa aunque vayan al
   final del archivo. Solo iconos del subconjunto (material-symbols.txt). */
@layer vistas {
  .fam-bloque { margin-top: 16px; }
  /* Enigmas del bosque (93): la tarjeta del hijo y su pedido de ayuda. */
  .eni-card {
    margin: 12px 0;
    padding: 16px;
    border: 1px solid var(--md-sys-color-outline-variant);
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container-low);
  }
  .eni-card.pide { border-color: var(--md-sys-color-tertiary); }
  .eni-ico {
    flex: none;
    display: inline-grid;
    place-items: center;
    width: 40px;
    height: 40px;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
  }
  .eni-ayuda {
    display: grid;
    gap: 8px;
    margin-top: 12px;
    padding: 14px;
    border-radius: var(--md-sys-shape-corner-medium);
    border-left: 4px solid var(--md-sys-color-tertiary);
    background: var(--md-sys-color-surface-container-high);
    color: var(--md-sys-color-on-surface);
  }
  .eni-ayuda .sem-tit { margin-top: 4px; }
  .fam-intro { margin: 4px 0 12px; }
  .fam-act {
    margin-bottom: 12px;
    padding: 16px;
    border: 1px solid var(--md-sys-color-outline-variant);
    border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface-container-low);
  }
  .fam-act.hecha { background: var(--md-sys-color-surface-container); }
  .fam-cab { display: flex; gap: 12px; align-items: flex-start; }
  .fam-ico {
    flex: none;
    display: inline-grid;
    place-items: center;
    width: 40px;
    height: 40px;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-tertiary-container);
    color: var(--md-sys-color-on-tertiary-container);
  }
  .fam-tit { margin: 0 0 6px; font: var(--md-sys-typescale-title-medium); text-wrap: balance; }
  .fam-meta { display: flex; flex-wrap: wrap; gap: 6px; }
  .fam-aprende { margin: 12px 0 8px; font: var(--md-sys-typescale-body-medium); }
  .fam-det > summary {
    display: flex;
    align-items: center;
    min-height: 40px;
    cursor: pointer;
    font: var(--md-sys-typescale-label-large);
    color: var(--md-sys-color-primary);
  }
  .fam-mat { margin: 4px 0 8px; }
  .fam-pasos, .fam-conv { margin: 6px 0 8px; padding-left: 22px; font: var(--md-sys-typescale-body-medium); }
  .fam-pasos li, .fam-conv li { margin: 4px 0; }
  .fam-sab { margin: 8px 0 0; }
  .fam-acc { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 12px; }
  .fam-hecha { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0; }
  .fam-reac { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0; padding: 0; border: 0; }
  .fam-reac > legend { float: left; margin-inline-end: 8px; padding: 0; }
  .fam-reac .chip { gap: 6px; }
  .fam-reac .chip:has(input:checked) {
    background: var(--md-sys-color-secondary-container);
    color: var(--md-sys-color-on-secondary-container);
    border-color: transparent;
  }
  .fam-hoja { max-width: 72ch; }
  .fam-hoja-tit { margin: 4px 0; font: var(--md-sys-typescale-headline-small); text-wrap: balance; }
  .fam-hoja-h { margin: 16px 0 4px; font: var(--md-sys-typescale-title-medium); }
  @media print {
    .no-imprimir, .site-foot, .appbar, nav { display: none !important; }
    body { background: #fff; }
    .fam-hoja { max-width: none; border: 0; box-shadow: none; }
  }
}

/* «En familia» (91): el aviso del correo semanal de ideas en «La semana». */
@layer vistas {
  .fam-correo {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px 12px;
    margin-bottom: 16px;
    padding: 8px 8px 8px 16px;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-surface-container);
    font: var(--md-sys-typescale-body-medium);
  }
  .fam-correo > .ms { color: var(--md-sys-color-primary); }
  .fam-correo-txt { flex: 1; min-width: 200px; }
}

/* ===== Primeros pasos y ficha en pestañas (1 oct 2026) ===== */
@layer vistas {
  .ficha-pestana [id] { scroll-margin-top: calc(var(--barra-sup) + 76px); }

  .pasos { display: grid; gap: 16px; }
  .pasos-cab { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
  .pasos-cab .hijo-anillo { flex: none; }
  .pasos-cab h2 { margin: 0; }
  .pasos-cab .crece { flex: 1 1 220px; min-width: 0; }
  @media (max-width: 560px) { .pasos-cab form { flex-basis: 100%; } }
  .pasos-lista { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(132px, 1fr)); gap: 8px; }
  .paso {
    display: flex; align-items: center; gap: 10px; padding: 10px 12px;
    border-radius: var(--md-sys-shape-corner-medium);
    background: var(--md-sys-color-surface-container);
    font: var(--md-sys-typescale-body-medium);
  }
  .paso-num {
    flex: none; width: 28px; height: 28px; border-radius: 50%;
    display: grid; place-items: center; font-weight: 600;
    background: var(--md-sys-color-surface-container-highest); color: var(--md-sys-color-on-surface-variant);
  }
  .paso-num .ms { font-size: 18px; }
  .paso.hecho .paso-num { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); }
  .paso.hecho, .paso.omitido { color: var(--md-sys-color-on-surface-variant); }
  .paso.omitido .paso-txt { text-decoration: line-through; }
  .paso.actual { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); font-weight: 600; }
  .paso.actual .paso-num { background: var(--md-sys-color-secondary); color: var(--md-sys-color-on-secondary); }
  .paso-ahora {
    display: grid; grid-template-columns: auto 1fr; gap: 6px 16px; align-items: start;
    padding: 16px; border-radius: var(--md-sys-shape-corner-large);
    background: var(--md-sys-color-surface);
  }
  .paso-ahora > .ico-caja { grid-row: span 3; }
  .paso-ahora h3 { margin: 0; }
  .paso-ahora p { margin: 0; }
  .paso-ahora .acciones { margin: 6px 0 0; }
  .codigo-nino { font: 600 1.6rem/1.2 var(--fuente-mono, ui-monospace, monospace); letter-spacing: .12em; }
  @media (max-width: 560px) { .paso-ahora { grid-template-columns: 1fr; } .paso-ahora > .ico-caja { grid-row: auto; } }

  /* «¿Qué es esto?»: fichas del glosario. */
  .glosario { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
  .glosario .card { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; align-items: start; margin: 0; }
  .glosario .card > .ico-caja { grid-row: span 2; }
  .glosario h3 { margin: 0; font: var(--md-sys-typescale-title-small); }
  .glosario p { margin: 0; color: var(--md-sys-color-on-surface-variant); font: var(--md-sys-typescale-body-medium); }
  .como-funciona { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }
  .como-funciona li { display: grid; gap: 6px; padding: 14px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); }
  .como-funciona b { font: var(--md-sys-typescale-title-small); }
}
