@charset "UTF-8";
/* =========================================================================
   Algoritmo Trading — sistema de diseño público
   Claro · acento NEGRO · tecnológico minimalista

   TRES REGLAS QUE GOBIERNAN ESTE FICHERO Y NO SE NEGOCIAN
   ------------------------------------------------------
   1. CERO `«bang-important»`. Todo cuelga de `.algt-auth-form-wrap` (y de `.algt-panel`
      en M4) con UN escalón de especificidad. La hoja de la que se parte necesitaba
      74 líneas de "blindaje" con «bang-important» precisamente porque sus reglas vivían
      sueltas en el documento y competían de tú a tú con el tema del sitio; en
      cuanto el CSS está scoped, ese blindaje sobra entero.
   2. CERO `«at-import»`. La hoja original importaba tres familias de Google Fonts en
      su línea 7: una petición bloqueante en el <head> que retrasa el primer pintado
      de TODAS las páginas del sitio (no solo las del plugin) y un origen externo
      más que declarar en la CSP. Aquí, pila del sistema.
   3. Foco visible SIEMPRE. Ningún `outline: none` se queda sin sustituto. Donde se
      retira el contorno nativo se pone, en la misma regla, borde de acento + halo
      `--algt-focus`; y sobre el botón primario (negro sobre tarjeta clara) además
      un `outline` con separación, porque un halo translúcido pegado a una caja
      negra no llega al 3:1 que exige WCAG para un indicador de foco.

   ESTE FICHERO SE ESCRIBE CONTRA EL MARKUP REAL de public/views/*.php. Cada id,
   clase y atributo que se estiliza aquí existe allí; si cambia el markup, cambia
   esta hoja. No hay reglas "por si acaso" para DOM que nadie pinta.

   REPARTO POR HITOS
     M2 (§§1–14) → tokens, reset, tarjeta de autenticación, formularios, inputs,
        contraseñas, teléfono, botones, mensajes, responsive.
     M4 (§15, al final) → panel del miembro: armazón, tira de pestañas, píldoras,
        tablas, Inicio, Cuenta, Avisos y Soporte. Todo bajo `.algt-panel`.
     M8 → las pantallas de «Mi Bot» (§15.13, rotulada y vacía). El resto de los
        componentes que necesita —píldoras, tarjetas, tablas, botones, formularios—
        ya están aquí: ese hito maqueta, no inventa sistema.
   ========================================================================= */


/* =========================================================================
   1. TOKENS
   -------------------------------------------------------------------------
   Viven en :root, no dentro del scope, por dos motivos: el modo oscuro se
   conmuta con un atributo en <html>, y M4 necesita los mismos valores bajo
   `.algt-panel`. Declarar variables en :root no rompe el scoping — lo que está
   scoped son las REGLAS que pintan, no los valores que consultan.

   Los contrastes están verificados sobre el fondo con el que de verdad se usan —y
   "de verdad" incluye --algt-surface-3, que es el más oscuro de los cuatro y donde
   caen la fecha de una burbuja del equipo en el hilo de soporte y la barra de fuerza
   de contraseña; medir solo contra el blanco es exactamente cómo se cuela un fallo
   de AA en el sitio menos visible:
   --algt-text 20.1:1 · --algt-text-2 8.6:1 · --algt-text-3 5.8:1 (4.8:1 sobre
   --algt-surface-3), y los cuatro semánticos por encima de 4.5:1 sobre sus fondos.
   Cambiar un hex de aquí es rehacer esa cuenta.
   ========================================================================= */

:root {
    /* ── Superficies ─────────────────────────────────────────────────────
       Cuatro niveles y ni uno más. La jerarquía de este producto la hace el
       BORDE de 1px y el espacio, no una escalera de grises: si cada caja tiene
       su propio tono, el ojo deja de saber qué es contenedor y qué es dato. */
    --algt-bg:            #FFFFFF;
    --algt-surface:       #FAFAFA;
    --algt-surface-2:     #F4F4F5;
    --algt-surface-3:     #E9E9EC;

    /* --algt-border es la línea de reposo; --algt-border-strong es la que lleva
       un control con el que se PUEDE interactuar (input, select, botón fantasma).
       Esa distinción es lo que hace que un formulario se lea sin sombras. */
    --algt-border:        #E2E2E6;
    --algt-border-strong: #C9C9D0;

    --algt-text:          #0A0A0B;
    --algt-text-2:        #4B4B55;
    /* #65656F y no #6B6B76: el gris terciario NO se pinta solo sobre blanco. Cae
       también sobre --algt-surface-3 (#E9E9EC) —la fecha de la burbuja del equipo
       en el hilo de soporte y la pista de la barra de fuerza de contraseña— y ahí
       el #6B6B76 daba 4,34:1, por debajo del 4,5:1 que la AA exige para texto
       pequeño (esas dos piezas usan --algt-fs-xs, 12px). Con #65656F sube a 4,76:1
       sobre surface-3 y a 5,76:1 sobre el fondo, así que el resto de usos solo
       mejora. Es el MISMO ajuste que el bloque oscuro ya había hecho en su lado
       (#8A8A96 → #94949F) y por el mismo motivo; en claro se había quedado sin
       hacer. */
    --algt-text-3:        #65656F;

    /* ── Acento ──────────────────────────────────────────────────────────
       El acento ES el texto: negro. Deliberado. Un acento cromático obligaría a
       decidir cuándo algo es "de marca" y cuándo es "de interfaz"; con el negro,
       destacar cuesta caro y por eso se usa poco: botón primario, foco, pestaña
       activa. El dorado #c9a227 del sistema del que se parte no aparece aquí. */
    --algt-accent:         #0A0A0B;
    --algt-accent-hover:   #26262C;
    --algt-accent-active:  #000000;
    --algt-accent-soft:    #F4F4F5;
    --algt-accent-dim:     rgba(10, 10, 11, .06);
    --algt-accent-ring:    rgba(10, 10, 11, .18);
    --algt-text-on-accent: #FFFFFF;

    /* ── Semánticos ──────────────────────────────────────────────────────
       Trío por color (texto / fondo / borde) para que un estado se pinte SIEMPRE
       igual: fondo tenue, borde de 1px y texto oscuro legible. Nunca texto de
       color sobre fondo blanco a secas, que es donde se pierden los 4.5:1. */
    --algt-green:         #0F7A3D;
    --algt-green-bg:      #E8F6EE;
    --algt-green-border:  #B9E3CB;
    --algt-red:           #B3261E;
    --algt-red-bg:        #FDECEA;
    --algt-red-border:    #F3C2BD;
    --algt-amber:         #8A5B00;
    --algt-amber-bg:      #FDF4E3;
    --algt-amber-border:  #F0DCB0;
    --algt-blue:          #1A4FD6;
    --algt-blue-bg:       #EDF2FF;
    --algt-blue-border:   #C6D6FF;

    /* ── Forma ───────────────────────────────────────────────────────────
       18 tarjeta · 12 control · 8 microelemento · 999 píldora. */
    --algt-r:      18px;
    --algt-r-sm:   12px;
    --algt-r-xs:   8px;
    --algt-r-full: 999px;

    /* Sombras casi imperceptibles a propósito: aquí separan las cajas los bordes.
       La -2 se reserva para lo que de verdad flota (menús, M4). */
    --algt-shadow-1: 0 1px 2px rgba(10, 10, 11, .06);
    --algt-shadow-2: 0 6px 20px rgba(10, 10, 11, .08);

    --algt-focus: 0 0 0 3px var(--algt-accent-ring);
    --algt-ease:  .18s ease;

    /* Pila del sistema. Sin descarga, sin bloqueo de render, sin origen externo:
       el texto se pinta en el primer frame con la fuente que el usuario ya tiene. */
    --algt-font:      ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --algt-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;

    --algt-fs-xs:   .75rem;
    --algt-fs-sm:   .82rem;
    --algt-fs-base: .9rem;
    --algt-fs-lg:   1.05rem;
    --algt-fs-xl:   1.35rem;
    --algt-fs-2xl:  1.7rem;

    --algt-space-1: 4px;
    --algt-space-2: 8px;
    --algt-space-3: 12px;
    --algt-space-4: 16px;
    --algt-space-5: 24px;
    --algt-space-6: 32px;

    --algt-auth-max:  440px;
    --algt-panel-max: 960px;

    /* Se consume solo en `.algt-auth-form-wrap { color-scheme: … }`.
       Es una variable y no un valor fijo porque `color-scheme` es lo que hace que
       el navegador pinte en oscuro los CONTROLES NATIVOS que no podemos tocar
       desde CSS: el desplegable abierto del <select> de lada, la casilla de
       "Recordarme", la barra de desplazamiento interna. La hoja original resolvía
       esto forzando `option { color:#111; background:#fff }`, que en modo oscuro
       deja un menú blanco cegador colgando de un formulario negro.
       Va en la variable, y no en :root, para poder aplicarlo SOLO a la tarjeta:
       ponerlo en :root oscurecería también las barras de desplazamiento del sitio
       entero, que no es nuestro. */
    --algt-color-scheme: light;

    /* Punta de flecha del <select>. El color va cocido dentro del data-URI (un SVG
       de fondo no hereda `currentColor`), así que el bloque oscuro la reemplaza.
       Es la ÚNICA declaración duplicada entre temas, y por eso está en un token. */
    --algt-select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2365656F' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
}


/* =========================================================================
   2. MODO OSCURO
   -------------------------------------------------------------------------
   Misma lógica, espejada: el acento pasa a ser BLANCO y el texto sobre acento,
   negro. No es "el tema claro con los grises invertidos" — los semánticos se
   sustituyen por sus versiones claras (#4ADE80 / #FCA5A5 / #FBBF24 / #93B4FF),
   porque #0F7A3D sobre #141417 se queda en 2.4:1 y desaparece.

   POR QUÉ DOS BLOQUES Y CON ESTA FORMA EXACTA:
     · @media (prefers-color-scheme: dark) → respeta la preferencia del sistema.
       Lleva `:not([data-algt-theme="light"])` para que, si el usuario FUERZA el
       tema claro, el sistema operativo no se lo pise. Sin ese :not(), forzar
       "claro" en un equipo en modo oscuro no haría nada: el media query es
       posterior en la cascada y ganaría siempre.
     · :root[data-algt-theme="dark"] → forzar oscuro gana esté como esté el SO.
   Con las dos piezas, el interruptor manda en AMBAS direcciones.

   Contrastes verificados sobre --algt-surface #141417, que es el color real de la
   tarjeta en oscuro (no sobre el #0A0A0B del fondo, que sería hacer trampa):
   texto 17.2:1 · texto-2 9.5:1 · texto-3 5.4:1 · verde 10.6:1 · rojo 9.6:1 ·
   ámbar 11.0:1 · azul 8.9:1.
   ========================================================================= */

@media (prefers-color-scheme: dark) {
    :root:not([data-algt-theme="light"]) {
        --algt-bg:            #0A0A0B;
        --algt-surface:       #141417;
        --algt-surface-2:     #1B1B1F;
        --algt-surface-3:     #26262C;

        --algt-border:        #2A2A31;
        --algt-border-strong: #3A3A44;

        --algt-text:          #F7F7F8;
        --algt-text-2:        #B9B9C4;
        /* #94949F y no #8A8A96: el gris terciario también se pinta sobre
           --algt-surface-3 (#26262C) —la fecha de una burbuja del equipo en el
           hilo de soporte y la barra de fuerza de contraseña—, y ahí el
           #8A8A96 daba 4,41:1, por debajo del 4,5:1 de la AA para texto
           pequeño. Con #94949F sube a 5,01:1 sobre surface-3 y a 6,59:1 sobre
           el fondo, así que el resto de usos solo mejora. */
        --algt-text-3:        #94949F;

        --algt-accent:         #FFFFFF;
        --algt-accent-hover:   #E4E4E8;
        --algt-accent-active:  #D4D4DA;
        --algt-accent-soft:    #1B1B1F;
        --algt-accent-dim:     rgba(255, 255, 255, .08);
        --algt-accent-ring:    rgba(255, 255, 255, .28);
        --algt-text-on-accent: #0A0A0B;

        --algt-green:         #4ADE80;
        --algt-green-bg:      #10231A;
        --algt-green-border:  #1E4A32;
        --algt-red:           #FCA5A5;
        --algt-red-bg:        #2A1414;
        --algt-red-border:    #5A2A2A;
        --algt-amber:         #FBBF24;
        --algt-amber-bg:      #251C08;
        --algt-amber-border:  #57411A;
        --algt-blue:          #93B4FF;
        --algt-blue-bg:       #101A2E;
        --algt-blue-border:   #263A63;

        /* En oscuro la sombra ya no separa (negro sobre negro no se ve): el peso
           lo sostiene el borde. Se conservan las variables para no romper a quien
           las consuma, pero apenas tiñen. */
        --algt-shadow-1: 0 1px 2px rgba(0, 0, 0, .5);
        --algt-shadow-2: 0 6px 20px rgba(0, 0, 0, .6);

        --algt-color-scheme: dark;
        --algt-select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2394949F' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
    }
}

:root[data-algt-theme="dark"] {
    --algt-bg:            #0A0A0B;
    --algt-surface:       #141417;
    --algt-surface-2:     #1B1B1F;
    --algt-surface-3:     #26262C;

    --algt-border:        #2A2A31;
    --algt-border-strong: #3A3A44;

    --algt-text:          #F7F7F8;
    --algt-text-2:        #B9B9C4;
    /* Mismo valor y mismo motivo que en el bloque de prefers-color-scheme de
       arriba: #8A8A96 no llega a 4,5:1 sobre --algt-surface-3. */
    --algt-text-3:        #94949F;

    --algt-accent:         #FFFFFF;
    --algt-accent-hover:   #E4E4E8;
    --algt-accent-active:  #D4D4DA;
    --algt-accent-soft:    #1B1B1F;
    --algt-accent-dim:     rgba(255, 255, 255, .08);
    --algt-accent-ring:    rgba(255, 255, 255, .28);
    --algt-text-on-accent: #0A0A0B;

    --algt-green:         #4ADE80;
    --algt-green-bg:      #10231A;
    --algt-green-border:  #1E4A32;
    --algt-red:           #FCA5A5;
    --algt-red-bg:        #2A1414;
    --algt-red-border:    #5A2A2A;
    --algt-amber:         #FBBF24;
    --algt-amber-bg:      #251C08;
    --algt-amber-border:  #57411A;
    --algt-blue:          #93B4FF;
    --algt-blue-bg:       #101A2E;
    --algt-blue-border:   #263A63;

    --algt-shadow-1: 0 1px 2px rgba(0, 0, 0, .5);
    --algt-shadow-2: 0 6px 20px rgba(0, 0, 0, .6);

    --algt-color-scheme: dark;
    --algt-select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2394949F' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
}

/* Forzar claro no necesita repetir la paleta —la de :root ya es la clara—, solo
   devolver el esquema de los controles nativos. */
:root[data-algt-theme="light"] {
    --algt-color-scheme: light;
}


/* =========================================================================
   3. MOVIMIENTO REDUCIDO
   -------------------------------------------------------------------------
   Una sola línea porque TODA la animación del sistema pasa por --algt-ease.
   Colapsarla a 0s deja las transiciones declaradas (no hay que reescribir 40
   reglas con `transition: none`) y sin embargo el cambio es instantáneo.
   Aquí no hay nada que quitar además de eso: este diseño no tiene movimiento
   decorativo, solo transiciones de color, borde y sombra.
   ========================================================================= */

@media (prefers-reduced-motion: reduce) {
    :root {
        --algt-ease: 0s;
    }
}


/* =========================================================================
   4. RESET SCOPED
   -------------------------------------------------------------------------
   Solo lo imprescindible para que el tema del sitio no descoloque la tarjeta.
   No es un reset global: fuera de `.algt-auth-form-wrap` no se toca nada.
   ========================================================================= */

.algt-auth-form-wrap,
.algt-auth-form-wrap *,
.algt-auth-form-wrap *::before,
.algt-auth-form-wrap *::after {
    box-sizing: border-box;
}

/* Los temas de WordPress reparten márgenes generosos por h2/p/ul. Dentro de la
   tarjeta el ritmo lo decide esta hoja, así que se ponen a cero y se reconstruye
   con márgenes explícitos donde toca. */
.algt-auth-form-wrap h2,
.algt-auth-form-wrap p,
.algt-auth-form-wrap ul,
.algt-auth-form-wrap ol {
    margin: 0;
    padding: 0;
}

/* Los controles no heredan la tipografía por defecto: sin esto, un input dentro
   de una tarjeta con la pila del sistema se pinta con la fuente del navegador. */
.algt-auth-form-wrap input,
.algt-auth-form-wrap select,
.algt-auth-form-wrap textarea,
.algt-auth-form-wrap button {
    font-family: inherit;
    font-size: 100%;
    line-height: inherit;
    margin: 0;
}

/* OJO: aquí NO se declara `display` sobre elementos genéricos.
   `<input type="hidden" name="recaptcha_token">` y `<input type="hidden"
   name="phone">` son hijos directos del formulario y su ocultación viene del
   navegador; una regla como `.algt-auth-form-wrap input { display:block }` los
   revelaría como cajas vacías en mitad del formulario. */


/* =========================================================================
   5. LA TARJETA DE AUTENTICACIÓN
   ========================================================================= */

.algt-auth-form-wrap {
    /* max-width con min() para que a 320px la tarjeta encoja en vez de empujar:
       el requisito es que NINGUNA caja genere scroll horizontal de página. */
    max-width: min(var(--algt-auth-max), 100%);
    margin: 0 auto;
    padding: var(--algt-space-6) var(--algt-space-5);

    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r);
    box-shadow: var(--algt-shadow-1);

    color: var(--algt-text);
    font-family: var(--algt-font);
    font-size: var(--algt-fs-base);
    line-height: 1.5;
    text-align: left;

    color-scheme: var(--algt-color-scheme);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;

    /* Un correo largo sin espacios (o un usuario derivado kilométrico) no puede
       ensanchar la tarjeta. */
    overflow-wrap: break-word;
}

/* ── Cabecera ─────────────────────────────────────────────────────────── */

.algt-auth-form-wrap .algt-auth-header {
    margin: 0 0 var(--algt-space-6);
    text-align: center;
}

/* El icono se mete en una ficha cuadrada de 44px: el SVG llega con width/height
   32 en el atributo, pero `box-sizing: border-box` del reset hace que el padding
   coma hacia dentro y el dibujo quede en 22px dentro de un marco de 44. Es el
   único adorno de la pantalla y sostiene solo con borde y superficie.
   El color sale de `color` porque los tres SVG llevan stroke="currentColor";
   en la hoja original el icono traía #c9a227 clavado en el atributo y ninguna
   regla podía cambiarlo — ni el rebranding a negro ni el modo oscuro. */
.algt-auth-form-wrap .algt-auth-icon {
    display: block;
    width: 44px;
    height: 44px;
    padding: 10px;
    margin: 0 auto var(--algt-space-3);
    color: var(--algt-text);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

/* Título apretado: -0.02em es lo que separa un titular "de web" de uno "de
   producto". El peso hace la jerarquía; el color no cambia. */
.algt-auth-form-wrap .algt-auth-title {
    margin: 0 0 var(--algt-space-1);
    color: var(--algt-text);
    font-size: var(--algt-fs-2xl);
    font-weight: 650;
    line-height: 1.15;
    letter-spacing: -.02em;
}

.algt-auth-form-wrap .algt-auth-subtitle {
    margin: 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-base);
    line-height: 1.45;
}


/* =========================================================================
   6. ESTRUCTURA DEL FORMULARIO
   ========================================================================= */

/* Ritmo vertical por "lechuza": margen ARRIBA a todo hijo directo menos al
   primero. Se hace así, y no con `display: flex` + `gap`, por una razón concreta
   del contrato de DOM: `#algt-login-form`, `#algt-forgot-form` y los tres
   `.algt-msg` se ocultan con el ATRIBUTO hidden. Cualquier `display` que esta
   hoja pusiera sobre ellos competiría con `[hidden]` y los dejaría visibles.
   Con márgenes, `display` sigue siendo asunto exclusivo del atributo. */
.algt-auth-form-wrap .algt-auth-form > * {
    margin-top: var(--algt-space-4);
    margin-bottom: 0;
}

.algt-auth-form-wrap .algt-auth-form > :first-child {
    margin-top: 0;
}

/* El texto de ayuda de "Recordarme" es hermano de la casilla a nivel de
   formulario, no un hijo del grupo: sin esto se le aplicarían los 16px de la
   lechuza y quedaría flotando lejos de aquello que explica. */
.algt-auth-form-wrap .algt-form-check + .algt-form-help {
    margin-top: var(--algt-space-1);
}

.algt-auth-form-wrap .algt-form-group {
    margin: 0;
}

/* Nombre y apellido. En cuanto el espacio aprieta pasa a una columna (ver §12):
   dos campos de 90px de ancho no son un formulario, son un acertijo. */
.algt-auth-form-wrap .algt-auth-grid-2 {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--algt-space-3);
}

/* Separador entre datos personales y credenciales. 1px y nada más: es el mismo
   recurso que separa la tarjeta del fondo, usado a otra escala. */
.algt-auth-form-wrap .algt-auth-divider {
    height: 1px;
    background: var(--algt-border);
    border: 0;
}

.algt-auth-form-wrap .algt-auth-alt,
.algt-auth-form-wrap .algt-auth-actions {
    margin: var(--algt-space-4) 0 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    text-align: center;
}

.algt-auth-form-wrap .algt-auth-link {
    color: var(--algt-text);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    border-radius: var(--algt-r-xs);
    transition: color var(--algt-ease);
}

.algt-auth-form-wrap .algt-auth-link:hover {
    color: var(--algt-accent-hover);
}

.algt-auth-form-wrap .algt-auth-link:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

/* ── Etiquetas y ayudas ───────────────────────────────────────────────── */

/* Vale tanto para <label> como para el <span class="algt-label"> que rotula la
   previsualización del usuario (que NO es un control y por eso no puede llevar
   un <label for>). De ahí `display: block` en vez de confiar en el elemento. */
.algt-auth-form-wrap .algt-label {
    display: block;
    margin: 0 0 var(--algt-space-2);
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.3;
    letter-spacing: -.005em;
}

/* El asterisco es el único rojo que aparece sin que nada haya fallado. Va en
   semántico y no en negro porque "obligatorio" es información, no énfasis; su
   lectura accesible la aporta el <span class="algt-sr-only">(obligatorio)</span>
   que lo acompaña en el markup. */
.algt-auth-form-wrap .algt-required {
    margin-left: 2px;
    color: var(--algt-red);
    font-weight: 700;
}

/* .82rem es el suelo para --algt-text-3: por debajo, un gris de 5.4:1 empieza a
   costar de leer aunque el contraste siga cumpliendo. */
.algt-auth-form-wrap .algt-form-help {
    margin: var(--algt-space-2) 0 0;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.45;
}

/* Oculto para la vista, presente para el lector de pantalla. Lo usan la etiqueta
   del <select> de lada, los "(obligatorio)" y el campo `username_hint` del
   restablecimiento (que existe solo para los gestores de contraseñas).
   `clip-path` además de `clip` porque `clip` está obsoleto pero sigue siendo el
   único que entienden los navegadores viejos. */
.algt-auth-form-wrap .algt-sr-only {
    position: absolute;
    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;
}


/* =========================================================================
   7. CONTROLES DE ENTRADA
   -------------------------------------------------------------------------
   44px de alto mínimo (objetivo táctil), radio 12px, borde --algt-border-strong.
   El borde fuerte es lo que dice "esto se puede tocar": los contenedores llevan
   --algt-border y los controles --algt-border-strong, y esa sola diferencia
   basta para leer el formulario sin sombras ni rellenos de color.
   ========================================================================= */

.algt-auth-form-wrap .algt-input {
    display: block;
    width: 100%;
    min-height: 44px;
    padding: 10px 14px;

    color: var(--algt-text);
    /* El input es más claro que la tarjeta (blanco sobre #FAFAFA) para leerse
       como un hueco donde escribir. En oscuro la relación se invierte sola:
       --algt-bg pasa a #0A0A0B y el hueco queda hundido en la tarjeta #141417. */
    background: var(--algt-bg);
    border: 1px solid var(--algt-border-strong);
    border-radius: var(--algt-r-sm);

    font-size: var(--algt-fs-base);
    line-height: 1.4;

    /* Solo color, borde y sombra. Nada de transform ni de tamaño: un campo que
       se mueve al enfocarlo desplaza lo que hay debajo mientras se teclea. */
    transition: border-color var(--algt-ease), box-shadow var(--algt-ease), background-color var(--algt-ease);
}

.algt-auth-form-wrap .algt-input::placeholder {
    color: var(--algt-text-3);
    opacity: 1; /* Firefox lo baja a .54 por su cuenta y el gris se cae del AA. */
}

.algt-auth-form-wrap .algt-input:hover {
    border-color: var(--algt-text-3);
}

/* Foco de campo de texto: se declara `:focus` y no solo `:focus-visible` porque
   un input SIEMPRE debe mostrar dónde está el cursor, también cuando se llegó
   con el ratón. El `outline: none` va acompañado en la MISMA regla de su
   sustituto (borde de acento + halo), que es la condición del contrato: el
   original hacía `outline: none` a secas y dejaba la navegación por teclado
   completamente ciega. */
.algt-auth-form-wrap .algt-input:focus,
.algt-auth-form-wrap .algt-input:focus-visible {
    outline: none;
    border-color: var(--algt-accent);
    box-shadow: var(--algt-focus);
}

.algt-auth-form-wrap .algt-input:disabled {
    background: var(--algt-surface-2);
    color: var(--algt-text-3);
    cursor: not-allowed;
}

/* Autorrelleno de Chrome/Safari.
   El fondo amarillo del autofill lo aplica el navegador con prioridad de agente
   de usuario y `background` normal no lo tumba; el `box-shadow` interior de
   1000px SÍ, y por eso este truco existe. Sin él haría falta «bang-important» — y aun
   con «bang-important» no funcionaría, porque no es un problema de cascada.
   La variante :focus repite el halo de foco ANTES de la sombra de relleno: si se
   dejara solo la interior, enfocar un campo autorrellenado apagaría el foco. */
.algt-auth-form-wrap .algt-input:-webkit-autofill,
.algt-auth-form-wrap .algt-input:-webkit-autofill:hover {
    -webkit-box-shadow: 0 0 0 1000px var(--algt-bg) inset;
    box-shadow: 0 0 0 1000px var(--algt-bg) inset;
    -webkit-text-fill-color: var(--algt-text);
    caret-color: var(--algt-text);
}

.algt-auth-form-wrap .algt-input:-webkit-autofill:focus {
    -webkit-box-shadow: var(--algt-focus), 0 0 0 1000px var(--algt-bg) inset;
    box-shadow: var(--algt-focus), 0 0 0 1000px var(--algt-bg) inset;
    -webkit-text-fill-color: var(--algt-text);
}

/* ── Desplegables ─────────────────────────────────────────────────────── */

/* `appearance: none` + flecha propia para que el <select> de lada no rompa la
   línea del formulario con el control nativo de cada plataforma. El popup, que
   NO se puede estilizar, se resuelve por `color-scheme` en la tarjeta. */
.algt-auth-form-wrap select.algt-input {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    padding-right: 34px;
    background-image: var(--algt-select-arrow);
    background-repeat: no-repeat;
    background-position: right 12px center;
    cursor: pointer;
}

/* ── Casilla ──────────────────────────────────────────────────────────── */

/* La fila entera mide 44px aunque la casilla mida 18: el objetivo táctil es la
   fila (etiqueta incluida, que es clicable por el `for`), no el cuadradito. */
.algt-auth-form-wrap .algt-form-check {
    display: flex;
    align-items: center;
    gap: var(--algt-space-3);
    min-height: 44px;
}

/* `accent-color` en vez de reconstruir la casilla con pseudo-elementos: mantiene
   el control NATIVO (y con él su semántica, su comportamiento en modo de alto
   contraste y su indeterminado) pintándolo de negro. Reimplementarla a mano es
   la vía rápida a una casilla que el lector de pantalla no anuncia. */
.algt-auth-form-wrap .algt-check {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    margin: 0;
    accent-color: var(--algt-accent);
    cursor: pointer;
}

.algt-auth-form-wrap .algt-check:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-auth-form-wrap .algt-check-label {
    margin: 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-base);
    font-weight: 500;
    cursor: pointer;
}

/* ── Usuario derivado ─────────────────────────────────────────────────── */

/* No es un campo: es lo que el servidor VA a generar. El borde discontinuo y la
   mono lo dicen sin necesidad de un texto que lo aclare — se lee como "dato
   calculado", no como "casilla que olvidaste rellenar". Mono porque es un
   identificador técnico, igual que después lo serán el login MT5 o un hash. */
.algt-auth-form-wrap .algt-auto-username {
    min-height: 44px;
    padding: 11px 14px;
    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px dashed var(--algt-border-strong);
    border-radius: var(--algt-r-sm);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-sm);
    line-height: 1.45;
}

/* ── reCAPTCHA ────────────────────────────────────────────────────────── */

/* El widget de Google mide 302px fijos y no se puede reflujar. `min-width: 0`
   evita que empuje a sus hermanos de rejilla; el desbordamiento propio se acota
   en el bloque de 480px. La clase .g-recaptcha es de Google: no se renombra. */
.algt-auth-form-wrap .algt-recaptcha-group {
    min-width: 0;
}

.algt-auth-form-wrap .g-recaptcha {
    max-width: 100%;
}


/* =========================================================================
   8. CONTRASEÑAS
   ========================================================================= */

.algt-auth-form-wrap .algt-password-input-wrap {
    position: relative;
}

/* Hueco para el botón de mostrar/ocultar. Si no se reserva, un gestor de
   contraseñas mete su propio icono encima del nuestro. */
.algt-auth-form-wrap .algt-password-input {
    padding-right: 48px;
}

.algt-auth-form-wrap .algt-password-toggle {
    position: absolute;
    top: 50%;
    right: 6px;
    transform: translateY(-50%);

    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;

    color: var(--algt-text-3);
    background: transparent;
    border: 0;
    border-radius: var(--algt-r-full);
    cursor: pointer;
    transition: color var(--algt-ease), background-color var(--algt-ease);
}

.algt-auth-form-wrap .algt-password-toggle:hover {
    color: var(--algt-text);
    background: var(--algt-accent-dim);
}

/* aria-pressed lo conmuta el JS junto con el aria-label. Se estiliza el ESTADO
   ARIA y no una clase `.is-active` paralela: así el aspecto no puede
   desincronizarse de lo que anuncia el lector de pantalla. */
.algt-auth-form-wrap .algt-password-toggle[aria-pressed="true"] {
    color: var(--algt-text);
    background: var(--algt-accent-dim);
}

.algt-auth-form-wrap .algt-password-toggle:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-auth-form-wrap .algt-password-toggle svg {
    display: block;
    width: 18px;
    height: 18px;
}

/* ── Medidor de fuerza ────────────────────────────────────────────────── */

/* El significado lo lleva el TEXTO; la barra es adorno y va aria-hidden en el
   markup. `min-height` fijo para que aparecer y desaparecer no dé un salto que
   desplace el campo de confirmación mientras se teclea. */
.algt-auth-form-wrap .algt-password-strength {
    display: flex;
    align-items: center;
    gap: var(--algt-space-3);
    min-height: 20px;
    margin: var(--algt-space-2) 0 0;
}

.algt-auth-form-wrap .algt-strength-track {
    display: block;
    flex: 1 1 auto;
    min-width: 0;
    height: 4px;
    background: var(--algt-surface-3);
    border-radius: var(--algt-r-full);
    overflow: hidden;
}

.algt-auth-form-wrap .algt-strength-bar {
    display: block;
    width: 0;
    height: 100%;
    background: var(--algt-text-3);
    border-radius: var(--algt-r-full);
    transition: width var(--algt-ease), background-color var(--algt-ease);
}

.algt-auth-form-wrap .algt-strength-text {
    flex: 0 0 auto;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.2;
}

/* Los seis niveles. El JS conmuta ÚNICAMENTE la clase del contenedor y jamás
   escribe color ni width en línea: en la hoja de la que se parte,
   syncPasswordStrength() inyectaba un hex inline que ganaba a todo y hacía
   imposible cambiar la paleta o tener modo oscuro. Aquí el ancho y el color de
   cada nivel viven en el CSS, que es donde se pueden cambiar. */
.algt-auth-form-wrap .algt-strength-0 .algt-strength-bar { width: 0; }

.algt-auth-form-wrap .algt-strength-1 .algt-strength-bar {
    width: 20%;
    background: var(--algt-red);
}

.algt-auth-form-wrap .algt-strength-2 .algt-strength-bar {
    width: 40%;
    background: var(--algt-red);
}

.algt-auth-form-wrap .algt-strength-3 .algt-strength-bar {
    width: 60%;
    background: var(--algt-amber);
}

.algt-auth-form-wrap .algt-strength-4 .algt-strength-bar {
    width: 80%;
    background: var(--algt-green);
}

.algt-auth-form-wrap .algt-strength-5 .algt-strength-bar {
    width: 100%;
    background: var(--algt-green);
}

/* ── Coincidencia de contraseñas ──────────────────────────────────────── */

/* Nace vacío y con altura reservada por el mismo motivo que el medidor: escribir
   la confirmación no debe mover el botón de enviar justo cuando se va a pulsar. */
.algt-auth-form-wrap .algt-password-match {
    min-height: 18px;
    margin: var(--algt-space-2) 0 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.35;
}

.algt-auth-form-wrap .algt-match-ok  { color: var(--algt-green); }
.algt-auth-form-wrap .algt-match-err { color: var(--algt-red); }


/* =========================================================================
   9. TELÉFONO
   ========================================================================= */

.algt-auth-form-wrap .algt-phone-group {
    display: flex;
    align-items: stretch;
    gap: var(--algt-space-2);
}

.algt-auth-form-wrap .algt-phone-code-wrap {
    position: relative;
    flex: 0 0 152px;
    max-width: 152px;
    min-width: 0;
}

/* La bandera flota DENTRO del select (que le reserva sitio con padding-left).
   `pointer-events: none` para que un clic sobre ella siga abriendo el
   desplegable en lugar de no hacer nada. El aro de 1px la despega de fondos
   claros: muchas banderas tienen franja blanca en el borde. */
.algt-auth-form-wrap .algt-phone-flag {
    position: absolute;
    top: 50%;
    left: 14px;
    transform: translateY(-50%);
    width: 20px;
    height: 14px;
    border-radius: 2px;
    object-fit: cover;
    box-shadow: 0 0 0 1px var(--algt-border-strong);
    pointer-events: none;
}

.algt-auth-form-wrap .algt-phone-code {
    padding-left: 44px;
    text-overflow: ellipsis;
}

/* Mono y cifras tabulares: con la máscara «(555) (123) (4567)» los dígitos no
   bailan de ancho mientras se escriben, que es lo que hace que una máscara
   parezca rota. Es además el primer sitio del producto donde aparece la mono:
   de aquí en adelante, todo dato técnico (login MT5, hash, versión, balance)
   se pinta con ella. */
.algt-auth-form-wrap .algt-phone-number {
    flex: 1 1 auto;
    min-width: 0;
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-base);
    font-variant-numeric: tabular-nums;
    letter-spacing: .01em;
}


/* =========================================================================
   10. BOTONES
   -------------------------------------------------------------------------
   ORDEN DE FUENTE = ORDEN DE CASCADA. `.algt-btn-primary`, `.algt-btn-ghost`,
   `.algt-btn-link` y `.algt-btn-full` tienen todos la misma especificidad
   (0-2-0), así que gana el último declarado. Importa de verdad: el botón
   «¿Olvidaste tu contraseña?» lleva a la vez `algt-btn-ghost` y `algt-btn-link`,
   y solo se ve como un enlace porque -link va DESPUÉS de -ghost. Reordenar este
   bloque cambia el diseño sin tocar una sola declaración.
   ========================================================================= */

.algt-auth-form-wrap .algt-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--algt-space-2);
    min-height: 44px;
    padding: 0 var(--algt-space-4);

    color: var(--algt-text);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--algt-r-sm);

    font-family: inherit;
    font-size: var(--algt-fs-base);
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -.005em;
    text-align: center;
    text-decoration: none;

    cursor: pointer;
    /* Nunca `transform` ni `opacity` de rebote: pulsar un botón mueve un
       formulario entero si el botón crece. */
    transition: background-color var(--algt-ease), border-color var(--algt-ease), color var(--algt-ease), box-shadow var(--algt-ease);
}

/* El foco de un botón necesita DOS piezas y no una:
     · el `outline` negro con 2px de separación es el indicador real — sobre el
       botón primario (negro) un halo translúcido pegado a la caja no llega al
       3:1 que pide WCAG para el indicador de foco, porque se funde con el botón;
     · `--algt-focus` añade el halo suave del sistema, coherente con los inputs.
   En oscuro --algt-accent es blanco, así que el contorno sigue destacando. */
.algt-auth-form-wrap .algt-btn:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

/* Deshabilitado = el JS está enviando (cambia el texto a i18n.*_submitting).
   Se marca con opacidad y cursor, nunca quitándolo del DOM: el foco del teclado
   se perdería a mitad de envío. */
.algt-auth-form-wrap .algt-btn:disabled {
    opacity: .55;
    cursor: not-allowed;
}

.algt-auth-form-wrap .algt-btn-primary {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent);
    border-color: var(--algt-accent);
}

.algt-auth-form-wrap .algt-btn-primary:hover {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent-hover);
    border-color: var(--algt-accent-hover);
}

.algt-auth-form-wrap .algt-btn-primary:active {
    background: var(--algt-accent-active);
    border-color: var(--algt-accent-active);
}

/* El botón deshabilitado NO cambia de color al pasar por encima: sin esto, el
   :hover de arriba sigue aplicando y el botón parece vivo mientras envía. */
.algt-auth-form-wrap .algt-btn-primary:disabled:hover {
    background: var(--algt-accent);
    border-color: var(--algt-accent);
}

.algt-auth-form-wrap .algt-btn-ghost {
    color: var(--algt-text);
    background: transparent;
    border-color: var(--algt-border-strong);
}

.algt-auth-form-wrap .algt-btn-ghost:hover {
    background: var(--algt-accent-dim);
    border-color: var(--algt-text-3);
}

/* Se ve como texto pero SIGUE siendo un <button> (con aria-expanded y
   aria-controls reales). Se le quita la altura de 44px a propósito: es un enlace
   dentro de un párrafo, y un objetivo de 44px ahí abriría un hueco que rompe la
   lectura. El padding deja igualmente un área cómoda de pulsación. */
.algt-auth-form-wrap .algt-btn-link {
    display: inline;
    min-height: 0;
    padding: var(--algt-space-1) 2px;
    color: var(--algt-text);
    background: transparent;
    border-color: transparent;
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
}

.algt-auth-form-wrap .algt-btn-link:hover {
    color: var(--algt-accent-hover);
    background: transparent;
    border-color: transparent;
}

.algt-auth-form-wrap .algt-btn-full {
    display: flex;
    width: 100%;
}


/* =========================================================================
   11. MENSAJES
   -------------------------------------------------------------------------
   El estado NUNCA lo lleva solo el color: fondo tenue + borde + el texto que
   escribe el servidor. Quien no distingue rojo de verde lee igual el mensaje.
   Y NO se declara `display` aquí, ni se declarará: los tres `.algt-msg` se
   ocultan con el atributo hidden (ver §13).
   ========================================================================= */

.algt-auth-form-wrap .algt-msg {
    margin: var(--algt-space-4) 0 0;
    padding: var(--algt-space-3) var(--algt-space-4);
    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

.algt-auth-form-wrap .algt-msg-error {
    color: var(--algt-red);
    background: var(--algt-red-bg);
    border-color: var(--algt-red-border);
}

.algt-auth-form-wrap .algt-msg-ok {
    color: var(--algt-green);
    background: var(--algt-green-bg);
    border-color: var(--algt-green-border);
}


/* =========================================================================
   11.b AVISO DE «YA HAS INICIADO SESIÓN»
   -------------------------------------------------------------------------
   Lo pintan ALGT_Shortcode_Login::render_already_logged_in() y el mismo caso en
   ALGT_Shortcode_Register::render(). Es la ÚNICA salida del plugin que NO cuelga
   de `.algt-auth-form-wrap`: son dos líneas de PHP que devuelven un <p> suelto,
   sin tarjeta. Sin esta sección se quedaba sin una sola declaración y aparecía
   con la tipografía y el color que le tocaran del tema, dentro de un producto
   que por lo demás controla cada píxel de sus pantallas.

   El selector es una clase con prefijo `algt-` y no un elemento: no puede
   alcanzar nada del sitio del cliente, que es la condición que impone el
   CONTRATO §12 al scoping. Y el enlace lleva su propio `:focus-visible` porque
   aquí no hay `.algt-auth-link` que se lo dé — un enlace del plugin sin foco
   visible es exactamente el defecto que este hito viene a corregir.
   ========================================================================= */

.algt-auth-notice {
    max-width: min(var(--algt-auth-max), 100%);
    margin: 0 auto;
    padding: var(--algt-space-4) var(--algt-space-5);

    color: var(--algt-text-2);
    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r);

    font-family: var(--algt-font);
    font-size: var(--algt-fs-base);
    line-height: 1.5;
    text-align: center;

    color-scheme: var(--algt-color-scheme);
    overflow-wrap: break-word;
}

.algt-auth-notice a {
    color: var(--algt-text);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    border-radius: var(--algt-r-xs);
    transition: color var(--algt-ease);
}

.algt-auth-notice a:hover {
    color: var(--algt-accent-hover);
}

.algt-auth-notice a:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}


/* =========================================================================
   12. RESPONSIVE — 900 / 768 / 480
   -------------------------------------------------------------------------
   Regla que atraviesa los tres cortes: ninguna caja puede provocar scroll
   horizontal de página. Lo que no cabe, encoge (`min-width: 0`), pasa a una
   columna, o se desplaza DENTRO de su propio contenedor.
   ========================================================================= */

/* ── ≤900px: el aire empieza a sobrar ─────────────────────────────────── */
@media (max-width: 900px) {
    .algt-auth-form-wrap {
        padding: var(--algt-space-5) var(--algt-space-5);
    }
}

/* ── ≤768px: tableta y móvil apaisado ─────────────────────────────────── */
@media (max-width: 768px) {
    .algt-auth-form-wrap {
        padding: var(--algt-space-5) var(--algt-space-4);
    }

    .algt-auth-form-wrap .algt-auth-header {
        margin-bottom: var(--algt-space-5);
    }

    .algt-auth-form-wrap .algt-auth-title {
        font-size: var(--algt-fs-xl);
    }

    /* Nombre y apellido, uno debajo del otro. */
    .algt-auth-form-wrap .algt-auth-grid-2 {
        grid-template-columns: 1fr;
        gap: var(--algt-space-4);
    }

    /* 16px CLAVADOS, no un token.
       Safari en iOS hace zoom automático sobre cualquier campo cuyo texto mida
       menos de 16px al enfocarlo, y al hacerlo desplaza el layout: el usuario
       pierde de vista el formulario justo al empezar a escribir, y al salir del
       campo el zoom no se deshace. Es el motivo por el que este valor no puede
       salir de la escala tipográfica (--algt-fs-base son 0.9rem = 14.4px). */
    .algt-auth-form-wrap .algt-input {
        font-size: 16px;
    }

    .algt-auth-form-wrap .algt-phone-number {
        font-size: 16px;
    }
}

/* ── ≤480px: móvil en vertical ────────────────────────────────────────── */
@media (max-width: 480px) {
    .algt-auth-form-wrap,
    .algt-auth-notice {
        padding: var(--algt-space-4) var(--algt-space-3);
        border-radius: var(--algt-r-sm);
    }

    .algt-auth-form-wrap .algt-auth-icon {
        width: 40px;
        height: 40px;
        padding: 9px;
    }

    .algt-auth-form-wrap .algt-auth-subtitle {
        font-size: var(--algt-fs-sm);
    }

    /* La lada se estrecha y el texto de la opción se corta con puntos
       suspensivos (`text-overflow: ellipsis`, ya declarado). La hoja original
       resolvía esto con `color: transparent; font-size: 0`, que deja el control
       MUDO: el valor elegido deja de leerse en pantalla y, con la bandera en
       aria-hidden, no queda ninguna pista visible de qué país está puesto.
       Cortar el nombre del país y conservar «+52» dice lo esencial. */
    .algt-auth-form-wrap .algt-phone-code-wrap {
        flex: 0 0 104px;
        max-width: 104px;
    }

    .algt-auth-form-wrap .algt-phone-code {
        padding-left: 40px;
        padding-right: 26px;
    }

    /* El widget de Google mide 302px fijos y no reflujan. A partir de 320px de
       ancho de pantalla ya no cabe, y sin esto sería la ÚNICA caja del producto
       capaz de generar scroll horizontal de página. Con el desbordamiento
       acotado aquí, lo que se desplaza es el captcha dentro de su hueco. */
    .algt-auth-form-wrap .algt-recaptcha-group {
        overflow-x: auto;
        padding-bottom: 2px;
    }
}


/* =========================================================================
   13. MECANISMO DE OCULTACIÓN
   -------------------------------------------------------------------------
   `#algt-login-form`, `#algt-forgot-form` y los tres `.algt-msg` se ocultan con
   el ATRIBUTO hidden, nunca con `style="display:none"`. El CSS tiene que
   respetarlo sin recurrir a «bang-important».

   EL ATRIBUTO VA REPETIDO A PROPÓSITO. `[hidden][hidden]` puntúa 0-3-0 y gana a
   cualquier regla de esta hoja (todas son 0-2-0 bajo el scope), incluidas las
   que ponen `display: flex` sobre `.algt-form-check` o `.algt-password-strength`.
   No es un despiste ni un typo: es la forma de blindar el atributo sin subir a
   «bang-important» el día que alguien añada un `display` a `.algt-msg`. Hoy ninguna
   regla lo hace —está comprobado, y así debe seguir—, pero el blindaje cuesta
   ocho caracteres y evita un formulario que se pinta y "simplemente no envía".

   El segundo selector cubre el caso de que se oculte la SECCIÓN entera.
   Va al final del fichero para ganar también por orden de fuente.
   ========================================================================= */

.algt-auth-form-wrap [hidden][hidden],
.algt-auth-form-wrap[hidden] {
    display: none;
}


/* =========================================================================
   14. MODO DE ALTO CONTRASTE FORZADO
   -------------------------------------------------------------------------
   En Windows con contraste forzado el navegador descarta `box-shadow` y las
   variables de color: todo el indicador de foco de esta hoja desaparecería de
   golpe. Se restituye con un `outline` del color del sistema, que sí sobrevive.
   Va después de las reglas de foco para ganar por orden de fuente.
   ========================================================================= */

@media (forced-colors: active) {
    .algt-auth-form-wrap .algt-input:focus,
    .algt-auth-form-wrap .algt-btn:focus-visible,
    .algt-auth-form-wrap .algt-check:focus-visible,
    .algt-auth-form-wrap .algt-password-toggle:focus-visible,
    .algt-auth-form-wrap .algt-auth-link:focus-visible,
    .algt-auth-notice a:focus-visible {
        outline: 2px solid CanvasText;
        outline-offset: 2px;
    }

    /* Las barras del medidor son áreas de color puro: sin borde forzado
       desaparecen contra el fondo del sistema. */
    .algt-auth-form-wrap .algt-strength-bar {
        forced-color-adjust: none;
        border: 1px solid CanvasText;
    }
}


/* =========================================================================
   15. PANEL DEL MIEMBRO
   -------------------------------------------------------------------------
   Escrito CONTRA EL MARKUP REAL de public/views/panel-shell.php, tab-inicio.php,
   tab-cuenta.php, tab-avisos.php, tab-soporte.php y ticket-detail.php, y contra
   la tira que imprime ALGT_Panel_Tabs::render_strip(). Cada selector de aquí
   abajo corresponde a un nodo que alguno de esos ficheros pinta de verdad; no
   hay reglas "por si acaso".

   LAS MISMAS TRES REGLAS DE LA CABECERA, aplicadas a este bloque:
     · Cero «bang-important». Todo cuelga de `.algt-panel` con UN escalón de
       especificidad (0-2-0 casi siempre), igual que §§5–12 cuelgan de
       `.algt-auth-form-wrap`.
     · Cero colores sueltos. Ni un hex, ni un rgba(): todo sale de los tokens de
       §1, que es lo que hace que el modo oscuro de §2 llegue solo a casi todo
       este bloque. Si algún componente necesitara un color nuevo, sería señal
       de que se está saliendo del sistema.
     · Foco visible SIEMPRE, y no solo en botones: la tira de pestañas, las
       fichas-enlace de Inicio, las filas de ticket y los DOS contenedores con
       `tabindex` (#algt-panel-content con 0, #algt-support-detail y
       #algt-support-thread con -1) llevan su propio `:focus-visible`. Los de
       tabindex="-1" reciben el foco POR PROGRAMA desde el JS: sin indicador,
       quien navega con teclado no se entera de que el punto de lectura se ha
       movido al otro extremo de la página.

   SUPERFICIES — la escalera, decidida una vez y respetada en las cinco pestañas:
     nivel 0  la página del sitio                      (no es nuestra)
     nivel 1  `.algt-panel-section`   → --algt-surface   (LA tarjeta de la pestaña)
     nivel 2  bloques dentro de ella  → --algt-surface-2 (héroe, fichas, tarjetas
              de soporte, bloques de cuenta, avisos, burbujas del equipo)
     control  inputs y burbuja del usuario → --algt-bg
   En claro la escalera sube (blanco → #FAFAFA → #F4F4F5) y en oscuro se invierte
   sola (#0A0A0B → #141417 → #1B1B1F), que es exactamente el mismo truco que ya
   usan los `.algt-input` de §7: el nivel 2 queda ELEVADO en oscuro y apenas
   teñido en claro, y en los dos casos quien separa las cajas es el borde de 1px.
   ========================================================================= */


/* -------------------------------------------------------------------------
   15.1 RESET SCOPED DEL PANEL
   -------------------------------------------------------------------------
   Mismo criterio que §4: lo imprescindible para que el tema del sitio no
   descoloque nada, y ni una declaración más allá del scope.

   OJO CON LAS LISTAS: se les quita el marcador porque las cinco <ul>/<ol> del
   panel son estructuras (fichas de Inicio, avisos, accesos, tickets, mensajes
   del hilo) y un punto negro delante de una tarjeta es ruido. Pero hay TRES
   sitios donde el HTML lo escribe una persona —el anuncio del equipo, el cuerpo
   de un aviso y el mensaje de un ticket— y ahí las listas y los párrafos tienen
   que volver a comportarse como listas y párrafos. Ese rescate está en §15.14;
   sin él, un aviso con viñetas se leería como un bloque de texto pegado.

   ⚠ REGLA QUE HAY QUE RESPETAR AL AÑADIR CUALQUIER COSA A §15, y que se aprendió
   pintando esta hoja en un navegador de verdad:

       `.algt-panel p` puntúa 0-1-1 (una clase + un elemento).
       `.algt-hero-cta` puntúa 0-1-0 (una clase).
       → el reset GANA, y el margen que creías haber puesto no existe.

   Es decir: TODA regla de §15 que toque `margin` o `padding` sobre un <h2>, <h3>,
   <h4>, <p>, <ul>, <ol>, <dl>, <dt>, <dd>, <figure> o <blockquote> tiene que
   llevar el scope delante —`.algt-panel .algt-hero-cta`— para llegar a 0-2-0.
   Sin él la declaración se escribe, se lee bien en el fichero, y simplemente no
   se aplica: el fallo no da error en ninguna parte, solo deja las cajas pegadas.
   El bloque de autenticación (§§5–12) no tropieza con esto porque allí TODOS los
   selectores llevan el scope; aquí se hace lo mismo, y por eso conviven reglas
   con prefijo (las que tocan caja sobre esos elementos) y sin él (las que tocan
   color, tipografía o `display`, donde el reset no compite).

   Lo que NO se hizo, y por qué: bajar el reset a `:where(h2, h3, …)`, que puntúa
   0 y dejaría ganar a cualquier clase. Habría arreglado esto en una línea y roto
   otra cosa peor — el panel vive DENTRO del contenido del tema, y un
   `.entry-content p { margin-bottom: 1.5em }` cualquiera (0-1-1) le ganaría al
   reset y volvería a meter los márgenes del tema dentro de nuestras tarjetas.
   El reset tiene que seguir siendo más fuerte que el tema; somos nosotros los
   que tenemos que ser más fuertes que el reset.
   ------------------------------------------------------------------------- */

.algt-panel,
.algt-panel *,
.algt-panel *::before,
.algt-panel *::after {
    box-sizing: border-box;
}

.algt-panel h2,
.algt-panel h3,
.algt-panel h4,
.algt-panel p,
.algt-panel ul,
.algt-panel ol,
.algt-panel dl,
.algt-panel dt,
.algt-panel dd,
.algt-panel figure,
.algt-panel blockquote {
    margin: 0;
    padding: 0;
}

.algt-panel ul,
.algt-panel ol {
    list-style: none;
}

/* Los controles no heredan la tipografía por defecto (misma nota que en §4). */
.algt-panel input,
.algt-panel select,
.algt-panel textarea,
.algt-panel button {
    font-family: inherit;
    font-size: 100%;
    line-height: inherit;
    margin: 0;
}

/* Igual que en §4, aquí NO se declara `display` sobre elementos genéricos: el
   panel está lleno de <input type="hidden"> (action, nonce, ticket_id) que son
   hijos directos de sus formularios y cuya ocultación viene del navegador. */


/* -------------------------------------------------------------------------
   15.2 EL CONTENEDOR Y LA CABECERA
   ------------------------------------------------------------------------- */

.algt-panel {
    /* min() y no max-width a secas, por lo mismo que la tarjeta de auth: a
       320px el panel encoge en vez de empujar la página. */
    max-width: min(var(--algt-panel-max), 100%);
    margin: 0 auto;

    color: var(--algt-text);
    font-family: var(--algt-font);
    font-size: var(--algt-fs-base);
    line-height: 1.5;
    text-align: left;

    /* `color-scheme` aquí y no en :root, por el mismo motivo que en §5: pinta en
       oscuro los controles NATIVOS que el CSS no alcanza —el desplegable abierto
       de «Tipo de solicitud», la barra de desplazamiento de la tabla de
       membresías y la de la tira de pestañas— sin oscurecer las del sitio
       entero, que no es nuestro. */
    color-scheme: var(--algt-color-scheme);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;

    /* Un asunto de ticket kilométrico sin espacios, un correo largo o una IPv6
       no pueden ensanchar el panel ni sacar scroll horizontal a la página. */
    overflow-wrap: break-word;
}

/* El panel es una PILA. Ritmo por «lechuza» (margen arriba a todo hijo directo
   menos al primero) y no `display: flex; gap`, por la misma razón del §6: hay
   descendientes que se ocultan con el atributo `hidden` y no queremos que esta
   hoja les imponga un `display` con el que competir. */
.algt-panel > * {
    margin-top: var(--algt-space-4);
}

.algt-panel > :first-child {
    margin-top: 0;
}

/* ── Cabecera: saludo a la izquierda, estado de membresía a la derecha ──── */

.algt-panel-header {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-3) var(--algt-space-4);

    padding: var(--algt-space-5);
    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r);
    box-shadow: var(--algt-shadow-1);
}

.algt-panel-identity {
    /* min-width: 0 es lo que permite que un nombre larguísimo se parta en vez de
       empujar la píldora de membresía fuera de la tarjeta. */
    flex: 1 1 240px;
    min-width: 0;
}

.algt-panel-eyebrow {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    font-weight: 500;
    line-height: 1.3;
}

.algt-panel .algt-panel-title {
    margin-top: 2px;
    color: var(--algt-text);
    font-size: var(--algt-fs-2xl);
    font-weight: 650;
    line-height: 1.15;
    letter-spacing: -.02em;
}

/* El bloque de membresía se alinea a la DERECHA y sus líneas también: sobre una
   caja alineada a la derecha, un texto centrado se lee como un descuido. */
.algt-panel-membership {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: var(--algt-space-2) var(--algt-space-3);
    min-width: 0;
    text-align: right;
}

.algt-panel-membership-meta {
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.35;
}

/* Los días restantes viven en su propio <span> —con el punto medio DENTRO— justo
   para poder desaparecer enteros en pantallas estrechas sin dejar un separador
   huérfano al final de la frase. Ver §15.15. */
.algt-panel-membership-days {
    white-space: nowrap;
}

/* ── Puerta cerrada (sin sesión / sin capacidad) ───────────────────────── */

/* `.algt-panel-gate` NO cuelga de `.algt-panel`: es lo que devuelve el shortcode
   cuando no hay panel que pintar, y su único hijo es un `.algt-auth-notice` que
   ya viene resuelto por §11.b. Solo necesita el hueco. Mismo criterio de scoping
   que allí: una clase con prefijo `algt-`, incapaz de alcanzar nada del sitio. */
.algt-panel-gate {
    max-width: min(var(--algt-panel-max), 100%);
    margin: 0 auto;
}


/* -------------------------------------------------------------------------
   15.3 LA TIRA DE PESTAÑAS
   -------------------------------------------------------------------------
   Markup de ALGT_Panel_Tabs::render_strip():

     .algt-panel-tabs-wrap [data-algt-tabs]
       ├── button.algt-tabs-arrow.algt-tabs-arrow-prev  [hidden]
       ├── .algt-panel-tabs [role="tablist"] [data-algt-tabs-track]
       │     └── a.algt-tab[.algt-tab-active] [role="tab"] [aria-selected]
       │           ├── .algt-tab-icon (svg currentColor) · .algt-tab-label
       │           └── .algt-tab-badge + .algt-sr-only
       └── button.algt-tabs-arrow.algt-tabs-arrow-next  [hidden]

   LAS FLECHAS SON ELEMENTOS DE FLUJO, no cajas flotantes sobre la tira. Nacen
   con [hidden] y el JS se lo quita solo si el carril desborda de verdad; al
   aparecer, ENCOGEN el carril en vez de taparlo. Superponerlas habría escondido
   media pestaña debajo de cada flecha justo en el ancho en el que aparecen.

   EL ESTADO ACTIVO SE PINTA DOS VECES, por `.algt-tab-active` y por
   `[aria-selected="true"]`, en el mismo selector agrupado. No es redundancia
   ociosa: es lo que garantiza que el aspecto no pueda desincronizarse de lo que
   anuncia el lector de pantalla. El día que algo cambie una de las dos cosas sin
   la otra, la pestaña se verá mal —y se arreglará— en vez de mentir en silencio.
   ------------------------------------------------------------------------- */

.algt-panel-tabs-wrap {
    display: flex;
    align-items: center;
    gap: var(--algt-space-1);

    padding: var(--algt-space-2);
    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-panel-tabs {
    display: flex;
    flex: 1 1 auto;
    min-width: 0;
    gap: var(--algt-space-1);

    overflow-x: auto;
    /* Un swipe horizontal sobre la tira no debe encadenar con el gesto de
       «atrás» del navegador: en móvil eso saca al cliente del panel entero. */
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;

    /* Barra oculta A PROPÓSITO, y solo aquí. La afordancia de esta tira son las
       dos flechas (y el arrastre táctil, y el foco del teclado, que arrastra el
       carril solo). Una barra de desplazamiento nativa de Windows bajo cinco
       pestañas de 36px de alto ocuparía un tercio del control. En la TABLA de
       §15.7, donde no hay flechas, la barra se conserva. */
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.algt-panel-tabs::-webkit-scrollbar {
    display: none;
}

.algt-tab {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
    gap: var(--algt-space-2);
    min-height: 40px;
    padding: 0 var(--algt-space-3);

    color: var(--algt-text-2);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--algt-r-xs);

    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -.005em;
    text-decoration: none;
    white-space: nowrap;

    transition: background-color var(--algt-ease), color var(--algt-ease), border-color var(--algt-ease);
}

.algt-tab:hover {
    color: var(--algt-text);
    background: var(--algt-accent-dim);
}

.algt-tab:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: -2px;
    box-shadow: var(--algt-focus);
}

/* La pestaña activa es UNO DE LOS POCOS SITIOS donde este sistema gasta el
   negro (los otros dos son el botón primario y el indicador de foco). Por eso
   funciona: si el negro estuviera repartido, aquí no diría nada. */
.algt-tab-active,
.algt-tab[aria-selected="true"] {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent);
    border-color: var(--algt-accent);
}

.algt-tab-active:hover,
.algt-tab[aria-selected="true"]:hover {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent-hover);
    border-color: var(--algt-accent-hover);
}

/* outline-offset NEGATIVO sobre la activa: con el offset positivo de siempre, el
   contorno negro caería sobre el fondo claro de la tira y, siendo la pestaña ya
   negra, se leería como una caja negra con un halo negro alrededor. Metido hacia
   dentro, el contorno cae sobre el propio botón y el halo --algt-focus queda
   fuera: dos anillos de contraste opuesto, que es lo que hace visible el foco
   sobre un elemento oscuro. */
.algt-tab-active:focus-visible,
.algt-tab[aria-selected="true"]:focus-visible {
    outline-color: var(--algt-text-on-accent);
}

.algt-tab-icon {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
}

.algt-tab-icon svg {
    display: block;
    width: 16px;
    height: 16px;
}

.algt-tab-label {
    min-width: 0;
}

/* El globo del contador. Sobre una pestaña normal es negro; sobre la ACTIVA
   —que ya es negra— se invierte, porque si no desaparecería. La inversión se
   escribe con los mismos dos tokens al revés, así que el modo oscuro la sigue
   sin una sola declaración extra. */
.algt-tab-badge {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;

    color: var(--algt-text-on-accent);
    background: var(--algt-accent);
    border-radius: var(--algt-r-full);

    font-size: var(--algt-fs-xs);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    line-height: 1;
}

.algt-tab-active .algt-tab-badge,
.algt-tab[aria-selected="true"] .algt-tab-badge {
    color: var(--algt-accent);
    background: var(--algt-text-on-accent);
}

/* ── Flechas de desbordamiento ────────────────────────────────────────── */

.algt-tabs-arrow {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 40px;
    padding: 0;

    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-xs);
    cursor: pointer;

    transition: background-color var(--algt-ease), color var(--algt-ease), border-color var(--algt-ease);
}

.algt-tabs-arrow:hover {
    color: var(--algt-text);
    border-color: var(--algt-border-strong);
}

.algt-tabs-arrow:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

/* El JS puede deshabilitar la flecha cuando el carril ya está en su tope en vez
   de volver a ocultarla: quitarla del DOM con el foco dentro lo mandaría al
   <body>. Mismo criterio que el botón «Marcar todo» de Avisos. */
.algt-tabs-arrow:disabled {
    opacity: .45;
    cursor: not-allowed;
}

.algt-tabs-arrow-icon {
    display: block;
    width: 18px;
    height: 18px;
}


/* -------------------------------------------------------------------------
   15.4 CONTENIDO, SECCIONES Y ESTADOS VACÍOS
   ------------------------------------------------------------------------- */

/* El contenedor de contenido NO es una tarjeta: la tarjeta es la sección de
   dentro. Así, si una pestaña futura quiere pintar dos secciones hermanas
   (Soporte ya lo hace en la práctica), se ven como dos tarjetas y no como dos
   recuadros dentro de un tercero. */
.algt-panel-content {
    min-width: 0;
    border-radius: var(--algt-r);
}

/* Lleva tabindex="0" para poder recorrerlo con teclado cuando tiene scroll
   propio, así que ENTRA en el orden de tabulación y necesita indicador. El
   contorno va con offset negativo para no salirse del ancho del panel. */
.algt-panel-content:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: -2px;
    box-shadow: var(--algt-focus);
}

.algt-panel-section {
    padding: var(--algt-space-5);
    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r);
    box-shadow: var(--algt-shadow-1);
}

/* Mismo ritmo por «lechuza» que el panel: nada de gap, para no imponer un
   `display` que compita con [hidden] en los hijos que lo usan. */
.algt-panel .algt-panel-section > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-panel-section > :first-child {
    margin-top: 0;
}

.algt-panel-section-title {
    color: var(--algt-text);
    font-size: var(--algt-fs-xl);
    font-weight: 650;
    line-height: 1.2;
    letter-spacing: -.015em;
}

/* LAS RAÍCES DE PESTAÑA Y LOS BLOQUES CONTENEDORES.
   Estas doce clases no pintan nada por sí mismas —su aspecto se lo da la clase
   con la que comparten elemento: `.algt-panel-section`, `.algt-account-block`,
   `.algt-support-card`—, pero todas son, o contienen, un elemento de rejilla o
   de caja flexible. Y el valor inicial de `min-width` en un ítem de rejilla o
   de flex es `auto`, no `0`: eso significa que el ítem se niega a encoger por
   debajo del ancho de su contenido más largo.

   Traducido: un asunto de ticket de 190 caracteres sin espacios, un correo
   larguísimo del perfil o una IPv6 completa ensancharían su columna, la columna
   ensancharía la rejilla, y la rejilla sacaría scroll horizontal al BODY de la
   página — la única cosa que este diseño no se permite en ningún ancho.
   `min-width: 0` es lo que autoriza a la caja a encoger y dejar que el texto se
   parta (o que se desplace la tabla, que para eso tiene su envoltorio).

   Va en una sola regla agrupada y no repetida doce veces: es la MISMA razón
   doce veces, y doce copias es como una acaba faltando. */
.algt-tab-inicio,
.algt-tab-cuenta,
.algt-notices,
.algt-support,
.algt-account-profile,
.algt-account-history,
.algt-account-access,
.algt-support-create,
.algt-support-list-card {
    min-width: 0;
}

/* Estado vacío SERENO: borde discontinuo y gris, nunca rojo ni un icono de
   alerta. Una bandeja de avisos vacía o un historial sin membresías son la
   situación NORMAL de una cuenta nueva; pintarlos como un problema es cómo se
   genera el ticket de soporte que no hacía falta. El discontinuo es el mismo
   recurso del `.algt-auto-username` de §7: dice «aquí no hay un dato», no
   «aquí falta algo que hiciste mal». */
.algt-panel .algt-panel-empty {
    padding: var(--algt-space-4);
    color: var(--algt-text-3);
    background: var(--algt-surface-2);
    border: 1px dashed var(--algt-border-strong);
    border-radius: var(--algt-r-sm);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

/* La pestaña que todavía no existe (ALGT_Shortcode_Panel::render_placeholder).
   No necesita nada propio: es una sección con su título y su estado vacío. */
.algt-panel-placeholder {
    min-width: 0;
}


/* -------------------------------------------------------------------------
   15.5 PÍLDORAS DE ESTADO
   -------------------------------------------------------------------------
   CONTRATO §12: cada estado es COLOR + ETIQUETA DE TEXTO. El punto de color es
   un refuerzo, jamás el portador del significado; por eso va `aria-hidden` en
   el markup y por eso ninguna píldora de este panel se pinta sin su <span
   class="algt-pill-label"> al lado.

   Cinco tonos: los cuatro tríos semánticos de §1 más el gris. El azul
   (`.algt-pill-info`) es el que estrena este hito —lo piden «Instalando» y las
   fichas de Inicio con contador > 0— y sale de --algt-blue / -bg / -border, que
   ya estaban declarados y hasta ahora no consumía nadie.

   `white-space: normal` es deliberado: la etiqueta más larga del sistema es
   «Estado de membresía no disponible», y con `nowrap` esa píldora sacaría scroll
   horizontal en un móvil de 360px. Aquí el texto envuelve y la píldora crece.
   ------------------------------------------------------------------------- */

.algt-panel .algt-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    max-width: 100%;
    padding: 4px 10px 4px 8px;

    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-full);

    font-size: var(--algt-fs-xs);
    font-weight: 600;
    line-height: 1.35;
    white-space: normal;
    vertical-align: middle;
}

/* `currentColor`: el punto toma el color del texto de la píldora, así que cada
   tono lo tiñe con una sola declaración y nunca puede quedar de un color que no
   corresponda a su etiqueta. */
.algt-panel .algt-pill-dot {
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    background: currentColor;
    border-radius: var(--algt-r-full);
}

.algt-panel .algt-pill-label {
    min-width: 0;
}

.algt-panel .algt-pill-ok {
    color: var(--algt-green);
    background: var(--algt-green-bg);
    border-color: var(--algt-green-border);
}

.algt-panel .algt-pill-warn {
    color: var(--algt-amber);
    background: var(--algt-amber-bg);
    border-color: var(--algt-amber-border);
}

.algt-panel .algt-pill-err {
    color: var(--algt-red);
    background: var(--algt-red-bg);
    border-color: var(--algt-red-border);
}

.algt-panel .algt-pill-info {
    color: var(--algt-blue);
    background: var(--algt-blue-bg);
    border-color: var(--algt-blue-border);
}

.algt-panel .algt-pill-muted {
    color: var(--algt-text-3);
    background: var(--algt-surface-2);
    border-color: var(--algt-border);
}

/* Variante compacta: la que va DENTRO de un <li> de avisos, donde la píldora
   acompaña a una fecha en cuerpo pequeño y a tamaño normal se comería la línea. */
.algt-panel .algt-pill-sm {
    gap: 5px;
    padding: 2px 8px 2px 6px;
}

.algt-panel .algt-pill-sm .algt-pill-dot {
    width: 6px;
    height: 6px;
}


/* -------------------------------------------------------------------------
   15.6 BOTONES DEL PANEL
   -------------------------------------------------------------------------
   Los mismos cuatro de §10, redeclarados para este ámbito. Se DUPLICAN en vez
   de sacar el selector fuera (`.algt-btn` a secas) por la regla número uno de
   este fichero: una clase suelta en el documento competiría de tú a tú con el
   tema del sitio y volveríamos a necesitar el blindaje con «bang-important» que
   este rediseño vino a retirar. Duplicar cuatro reglas es el precio de no tener
   74 líneas de blindaje.

   ORDEN DE FUENTE = ORDEN DE CASCADA, igual que en §10: -primary y -ghost tienen
   la misma especificidad y gana el último. Aquí no hay ningún botón que lleve
   las dos, pero el orden se conserva por coherencia con el bloque de auth.
   ------------------------------------------------------------------------- */

.algt-panel .algt-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--algt-space-2);
    min-height: 44px;
    padding: 0 var(--algt-space-4);

    color: var(--algt-text);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--algt-r-sm);

    font-family: inherit;
    font-size: var(--algt-fs-base);
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -.005em;
    text-align: center;
    text-decoration: none;

    cursor: pointer;
    transition: background-color var(--algt-ease), border-color var(--algt-ease), color var(--algt-ease), box-shadow var(--algt-ease);
}

/* Las dos piezas del foco, por lo mismo que en §10: sobre el botón primario
   (negro) un halo translúcido pegado a la caja no llega al 3:1 de WCAG, así que
   el indicador REAL es el contorno separado y --algt-focus solo lo acompaña. */
.algt-panel .algt-btn:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-panel .algt-btn:disabled {
    opacity: .55;
    cursor: not-allowed;
}

.algt-panel .algt-btn-primary {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent);
    border-color: var(--algt-accent);
}

.algt-panel .algt-btn-primary:hover {
    color: var(--algt-text-on-accent);
    background: var(--algt-accent-hover);
    border-color: var(--algt-accent-hover);
}

.algt-panel .algt-btn-primary:active {
    background: var(--algt-accent-active);
    border-color: var(--algt-accent-active);
}

/* Sin esto, «Marcar todo como leído» seguiría cambiando de color al pasar por
   encima mientras está deshabilitado y parecería vivo. */
.algt-panel .algt-btn-primary:disabled:hover {
    background: var(--algt-accent);
    border-color: var(--algt-accent);
}

.algt-panel .algt-btn-ghost {
    color: var(--algt-text);
    background: transparent;
    border-color: var(--algt-border-strong);
}

.algt-panel .algt-btn-ghost:hover {
    background: var(--algt-accent-dim);
    border-color: var(--algt-text-3);
}

.algt-panel .algt-btn-ghost:disabled:hover {
    background: transparent;
    border-color: var(--algt-border-strong);
}

/* Compacto: el de la cabecera, el de «Marcar todo», los del paginador y los dos
   del hilo. 36px sigue siendo un objetivo táctil aceptable para un control
   secundario que nunca aparece solo en pantalla. */
.algt-panel .algt-btn-sm {
    min-height: 36px;
    padding: 0 var(--algt-space-3);
    font-size: var(--algt-fs-sm);
    border-radius: var(--algt-r-xs);
}

/* Enlace de texto dentro del panel (lo usa la pista «Escríbenos por soporte»). */
.algt-panel .algt-auth-link {
    color: var(--algt-text);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    border-radius: var(--algt-r-xs);
    transition: color var(--algt-ease);
}

.algt-panel .algt-auth-link:hover {
    color: var(--algt-accent-hover);
}

.algt-panel .algt-auth-link:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}


/* -------------------------------------------------------------------------
   15.7 FORMULARIOS, MENSAJES Y AVISOS DEL PANEL
   -------------------------------------------------------------------------
   Sólo los usa Soporte hoy, pero se escriben aquí y no en §15.12 porque «Mi Bot»
   (M8) monta el mismo formulario de alta con las mismas clases.
   ------------------------------------------------------------------------- */

.algt-panel .algt-form-group {
    min-width: 0;
}

.algt-panel .algt-label {
    display: block;
    margin: 0 0 var(--algt-space-2);
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.3;
    letter-spacing: -.005em;
}

.algt-panel .algt-required {
    margin-left: 2px;
    color: var(--algt-red);
    font-weight: 700;
}

.algt-panel .algt-form-help {
    margin: var(--algt-space-2) 0 0;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.45;
}

.algt-panel .algt-input {
    display: block;
    width: 100%;
    min-height: 44px;
    padding: 10px 14px;

    color: var(--algt-text);
    background: var(--algt-bg);
    border: 1px solid var(--algt-border-strong);
    border-radius: var(--algt-r-sm);

    font-size: var(--algt-fs-base);
    line-height: 1.4;

    transition: border-color var(--algt-ease), box-shadow var(--algt-ease), background-color var(--algt-ease);
}

.algt-panel .algt-input::placeholder {
    color: var(--algt-text-3);
    opacity: 1;
}

.algt-panel .algt-input:hover {
    border-color: var(--algt-text-3);
}

/* `:focus` además de `:focus-visible`, igual que en §7: un campo de texto
   siempre tiene que decir dónde está el cursor, también si se llegó con ratón.
   El `outline: none` va con su sustituto en la MISMA regla. */
.algt-panel .algt-input:focus,
.algt-panel .algt-input:focus-visible {
    outline: none;
    border-color: var(--algt-accent);
    box-shadow: var(--algt-focus);
}

/* El formulario entero se deshabilita cuando el cliente llegó al tope de
   tickets abiertos: campos incluidos, no solo el botón (ver tab-soporte.php). */
.algt-panel .algt-input:disabled {
    background: var(--algt-surface-2);
    color: var(--algt-text-3);
    cursor: not-allowed;
}

.algt-panel select.algt-input {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    padding-right: 34px;
    background-image: var(--algt-select-arrow);
    background-repeat: no-repeat;
    background-position: right 12px center;
    cursor: pointer;
}

/* `resize: vertical` y no libre: en horizontal el usuario puede estirar el
   textarea más allá de su tarjeta y sacar scroll a la página. */
.algt-panel textarea.algt-input {
    min-height: 120px;
    padding: 12px 14px;
    resize: vertical;
}

.algt-panel .algt-msg {
    padding: var(--algt-space-3) var(--algt-space-4);
    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

.algt-panel .algt-msg-error {
    color: var(--algt-red);
    background: var(--algt-red-bg);
    border-color: var(--algt-red-border);
}

.algt-panel .algt-msg-ok {
    color: var(--algt-green);
    background: var(--algt-green-bg);
    border-color: var(--algt-green-border);
}

/* `.algt-auth-notice` DENTRO del panel. La regla de §11.b lo deja centrado y
   con un tope de 440px, que es lo correcto para una pantalla de puerta cerrada
   y lo incorrecto dentro de una tarjeta de soporte: allí el aviso es un párrafo
   de la tarjeta y tiene que ocupar su ancho y leerse alineado con lo de
   alrededor. Especificidad 0-2-0 contra 0-1-0, y además más abajo en el
   fichero: gana por partida doble, sin «bang-important». */
.algt-panel .algt-auth-notice {
    max-width: none;
    margin: 0;
    padding: var(--algt-space-3) var(--algt-space-4);
    border-radius: var(--algt-r-sm);
    font-size: var(--algt-fs-sm);
    text-align: left;
}

/* sr-only propio del ámbito (lo usan la <caption> de la tabla, los contadores de
   la tira y los prefijos «Estado:» / «Tipo de solicitud:» del hilo). */
.algt-panel .algt-sr-only {
    position: absolute;
    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;
}


/* -------------------------------------------------------------------------
   15.8 TABLAS
   -------------------------------------------------------------------------
   EL ENVOLTORIO CON SCROLL PROPIO NO ES OPCIONAL. La tabla del historial de
   membresías tiene cuatro columnas y en un móvil de 360px no cabe de ninguna
   manera; sin `.algt-table-wrap` el que se desplaza en horizontal es el BODY de
   la página entera, que es exactamente lo que el CONTRATO prohíbe.

   NO se convierte en tarjetas apiladas a pesar de que las <td> traen su
   `data-label`. Apilar exige `display: block` sobre table/tr/td, y eso destruye
   la semántica de tabla en varios lectores de pantalla: se pierde el anuncio de
   «tabla de 4 columnas» y la asociación de cada celda con su encabezado, que es
   justo lo que hace navegable un historial. Los `data-label` se dejan puestos
   porque no estorban y porque son el punto de entrada si algún día se decide lo
   contrario con una auditoría delante.
   ------------------------------------------------------------------------- */

.algt-table-wrap {
    overflow-x: auto;
    /* Que un swipe sobre la tabla no encadene con el «atrás» del navegador. */
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
    /* Aquí la barra SÍ se ve: es la única pista de que hay más columnas a la
       derecha, porque esta caja no tiene flechas como la tira de pestañas. */
    scrollbar-width: thin;
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-table {
    width: 100%;
    /* min-width en ch y no en px: la unidad se escala con la tipografía del
       usuario, así que la tabla sigue sin aplastarse si alguien navega con el
       cuerpo de letra subido. Es un SUELO, no un objetivo: por debajo de él las
       celdas empezarían a partir «01/09/2026» en dos líneas y la tabla dejaría
       de leerse; a partir de ahí el que se desplaza es el envoltorio. */
    min-width: 42ch;
    border-collapse: collapse;
    font-size: var(--algt-fs-sm);
}

.algt-table th,
.algt-table td {
    padding: 10px var(--algt-space-3);
    text-align: left;
    vertical-align: middle;
    border-bottom: 1px solid var(--algt-border);
}

/* La fila de encabezados se marca con TIPOGRAFÍA y una línea más gruesa, no con
   un fondo. Un fondo aquí se saldría por las esquinas redondeadas del envoltorio
   (que no puede llevar `overflow: hidden`, porque es justo la caja que tiene que
   desplazarse), y taparlo con `overflow` rompería el scroll horizontal que es la
   razón de ser de esta caja. */
.algt-table thead th {
    color: var(--algt-text-3);
    border-bottom: 2px solid var(--algt-border-strong);
    font-size: var(--algt-fs-xs);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
}

.algt-table tbody td {
    color: var(--algt-text-2);
}

/* La última fila no lleva línea: el borde del envoltorio ya cierra la caja y
   dos líneas pegadas se ven como un error de pintado. */
.algt-table tbody tr:last-child td {
    border-bottom: 0;
}

/* Las FECHAS van en mono con cifras tabulares. Es la convención que estrenó el
   teléfono en §9 y que gobierna todo dato técnico del producto: así las columnas
   «Inicio» y «Vence» quedan alineadas dígito con dígito y una fecha más corta no
   descoloca la de arriba. `nowrap` porque «01/09/2026» partido en dos líneas
   deja de leerse como una fecha.

   POR POSICIÓN Y NO POR `[data-label="Inicio"]`, que era la tentación obvia: ese
   atributo lleva la cadena TRADUCIDA (`esc_attr__('Inicio')`). Hoy el dominio de
   origen ya es español y coincide, pero el día que se cargue un .mo —o que
   alguien retoque la cadena de origen— el selector dejaría de casar y las dos
   columnas de fechas volverían a la proporcional sin que nadie note por qué.
   Las columnas 2 y 3 de esta tabla son las fechas por estructura, no por texto. */
.algt-table tbody td:nth-child(2),
.algt-table tbody td:nth-child(3) {
    font-family: var(--algt-font-mono);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}


/* -------------------------------------------------------------------------
   15.9 PESTAÑA «INICIO»
   -------------------------------------------------------------------------
   Markup de public/views/tab-inicio.php. Tres bloques: el HÉROE de membresía,
   las tres fichas compactas y el anuncio del equipo.
   ------------------------------------------------------------------------- */

.algt-home-greeting {
    /* El saludo ES el título de sección (un <h3>), así que hereda de
       .algt-panel-section-title y aquí solo se ajusta el color del acento. */
    color: var(--algt-text);
}

/* ── El héroe ─────────────────────────────────────────────────────────── */

/* PLAN §4: la vigencia de la membresía es lo primero y lo más grande de esta
   pantalla. Se distingue del resto por TAMAÑO y por un filete de color en el
   canto, no por un fondo saturado: el estado ya lo dice la píldora con su
   etiqueta, y un panel entero teñido de rojo por una membresía vencida es una
   alarma desproporcionada para algo que se arregla con un clic. */
.algt-hero-card {
    padding: var(--algt-space-5);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    /* El filete. Su color lo fija cada modificador de estado; el valor de
       reposo cubre los estados que no tienen color propio. */
    border-left: 3px solid var(--algt-border-strong);
    border-radius: var(--algt-r-sm);
}

.algt-panel .algt-hero-card > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-hero-card > :first-child {
    margin-top: 0;
}

/* Los cinco estados de ALGT_Tab_Inicio::membership_card()['state']. El color va
   SOLO en el filete: el portador del significado sigue siendo la etiqueta de la
   píldora («Activa», «Vence pronto», «Vencida», «Sin membresía», «Estado de
   membresía no disponible»), que se lee igual sin distinguir colores. */
.algt-hero-active   { border-left-color: var(--algt-green); }
.algt-hero-expiring { border-left-color: var(--algt-amber); }
.algt-hero-expired  { border-left-color: var(--algt-red); }
.algt-hero-none     { border-left-color: var(--algt-border-strong); }
.algt-hero-unknown  { border-left-color: var(--algt-border-strong); }

.algt-hero-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-2) var(--algt-space-3);
}

.algt-hero-title {
    min-width: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 650;
    line-height: 1.25;
    letter-spacing: -.01em;
}

/* Plan y fecha, uno al lado del otro mientras quepan. `flex-wrap` y no una
   rejilla de dos columnas fijas: cuando solo hay uno de los dos (una membresía
   sin producto, o un estado desconocido sin fecha) una rejilla dejaría una
   columna vacía a la derecha. */
.algt-hero-body {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: var(--algt-space-4) var(--algt-space-6);
}

.algt-hero-plan,
.algt-hero-date {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.algt-hero-plan-label,
.algt-hero-date-label {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}

.algt-hero-plan-value {
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 600;
    line-height: 1.3;
}

/* La fecha en mono y tabular, como en la tabla y por lo mismo. */
.algt-hero-date-value {
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-lg);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    line-height: 1.3;
    white-space: nowrap;
}

/* Los días restantes son un dato de apoyo, no un cuarto titular. Van en
   `flex-basis: 100%` para caer SIEMPRE en su propia línea, debajo de plan y
   fecha; entre los dos se leerían como una tercera columna del mismo rango.
   Lo mismo vale para el estado vacío de «unknown» y «none», que la vista pinta
   como hermano dentro de este mismo contenedor flex: sin la base del 100% se
   encogería a la anchura de su texto y quedaría un recuadro discontinuo
   estrecho colgando al lado de la fecha. */
.algt-hero-days,
.algt-hero-body > .algt-panel-empty {
    flex: 1 0 100%;
    align-self: flex-start;
}

.algt-hero-days {
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
}

.algt-panel .algt-hero-cta {
    margin-top: var(--algt-space-5);
}

/* ── Las tres fichas ──────────────────────────────────────────────────── */

.algt-home-cards {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--algt-space-3);
}

.algt-home-card-item {
    min-width: 0;
}

/* La ficha es <a> cuando hay URL de pestaña y <div> cuando no (ver la vista):
   las declaraciones comunes van aquí y lo interactivo, más abajo, sobre a.* */
.algt-home-card {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--algt-space-2);
    height: 100%;
    padding: var(--algt-space-4);

    color: var(--algt-text);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
    text-decoration: none;

    transition: background-color var(--algt-ease), border-color var(--algt-ease), box-shadow var(--algt-ease);
}

.algt-home-card-label {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}

/* La cifra grande de las fichas de contador. Mono y tabular porque es un número
   que cambia: sin cifras tabulares, pasar de 9 a 10 mueve la caja. */
.algt-home-card-value {
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-2xl);
    font-variant-numeric: tabular-nums;
    font-weight: 650;
    line-height: 1.1;
    letter-spacing: -.02em;
}

.algt-panel a.algt-home-card:hover {
    background: var(--algt-bg);
    border-color: var(--algt-border-strong);
    box-shadow: var(--algt-shadow-1);
}

.algt-panel a.algt-home-card:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

/* ── Anuncio del equipo ───────────────────────────────────────────────── */

/* Es el único bloque de Inicio cuyo HTML lo escribe una persona (pasa por
   wp_kses_post en la vista), así que aquí dentro hay que devolverle a las
   listas y a los párrafos el comportamiento que les quitó el reset de §15.1.
   Ver §15.14, que hace ese rescate para los tres sitios donde ocurre. */
.algt-home-announcement {
    padding: var(--algt-space-4);
    color: var(--algt-text-2);
    background: var(--algt-blue-bg);
    border: 1px solid var(--algt-blue-border);
    border-radius: var(--algt-r-sm);
    font-size: var(--algt-fs-sm);
    line-height: 1.55;
}


/* -------------------------------------------------------------------------
   15.10 PESTAÑA «CUENTA»
   ------------------------------------------------------------------------- */

.algt-account-block {
    padding: var(--algt-space-4);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-panel .algt-account-block > * {
    margin-top: var(--algt-space-3);
}

.algt-panel .algt-account-block > :first-child {
    margin-top: 0;
}

.algt-account-block-title {
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 650;
    line-height: 1.25;
    letter-spacing: -.01em;
}

.algt-account-block-help {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

/* El bloque de cerrar sesión no tiene título ni contenido: es solo el botón.
   Sin fondo ni borde, para no parecer una sección más. */
.algt-account-logout {
    padding: 0;
    background: transparent;
    border: 0;
}

/* ── Perfil de solo lectura ───────────────────────────────────────────── */

/* Es un <dl> real (dt = etiqueta, dd = valor), no una tabla de dos columnas:
   son pares clave/valor, y así el lector de pantalla los anuncia emparejados. */
.algt-profile-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--algt-space-3) var(--algt-space-4);
}

.algt-profile-item {
    min-width: 0;
}

.algt-profile-label {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}

/* `overflow-wrap: anywhere` y no solo `break-word`: un correo de 45 caracteres
   sin espacios no se parte con break-word en todos los navegadores, y en una
   columna de la mitad del panel eso es scroll horizontal en la página. */
.algt-panel .algt-profile-value {
    margin-top: 2px;
    color: var(--algt-text);
    font-size: var(--algt-fs-base);
    font-weight: 500;
    line-height: 1.4;
    overflow-wrap: anywhere;
}

.algt-profile-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-2);
}

.algt-profile-hint {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

/* ── Últimos accesos ──────────────────────────────────────────────────── */

.algt-access-list {
    display: flex;
    flex-direction: column;
    gap: var(--algt-space-1);
}

.algt-access-item {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--algt-space-2) var(--algt-space-3);

    padding: 10px var(--algt-space-3);
    background: var(--algt-bg);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-xs);
    font-size: var(--algt-fs-sm);
}

/* La fecha en mono y tabular: es una columna de marcas de tiempo, y con cifras
   proporcionales las horas no se alinean entre líneas. */
.algt-access-when {
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    white-space: nowrap;
}

.algt-access-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--algt-space-2);
    min-width: 0;
}

/* La IP es un <code>: el cliente puede tener que copiarla en un ticket, y la
   mono es lo que hace distinguible un 0 de una O y un 1 de una l. */
.algt-access-ip {
    padding: 1px 6px;
    color: var(--algt-text-2);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-xs);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-xs);
    overflow-wrap: anywhere;
}

.algt-access-context {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
}


/* -------------------------------------------------------------------------
   15.11 PESTAÑA «AVISOS»
   ------------------------------------------------------------------------- */

.algt-notices-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-2) var(--algt-space-3);
}

.algt-notices-count {
    min-width: 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
}

.algt-notices-mark-all {
    flex: 0 0 auto;
}

.algt-notices-empty-hint {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

.algt-notice-list {
    display: flex;
    flex-direction: column;
    gap: var(--algt-space-3);
}

.algt-notice {
    padding: var(--algt-space-4);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    /* Filete de reposo TRANSPARENTE y no ausente: así el aviso leído y el no
       leído miden exactamente lo mismo, y marcar todo como leído no reflowea la
       lista entera bajo el dedo del usuario. */
    border-left: 3px solid transparent;
    border-radius: var(--algt-r-sm);
}

/* El no leído se marca por TRES vías a la vez: el filete ámbar, el punto de la
   píldora y —la que de verdad manda— la etiqueta «Sin leer». El JS quita la
   clase y borra el nodo de la píldora en el mismo paso (ver el contrato de
   algt-panel.js), así que las tres desaparecen juntas y no puede quedar un aviso
   con filete pero sin etiqueta. */
.algt-notice-unread {
    border-left-color: var(--algt-amber);
}

.algt-notice-title {
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 650;
    line-height: 1.3;
    letter-spacing: -.01em;
}

.algt-panel .algt-notice-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-2);
    margin-top: var(--algt-space-2);
}

.algt-notice-date {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
}

/* `help` y no `default` sobre la fecha: lleva un title= con la fecha absoluta y
   el cursor es la única pista de que ahí hay algo más que leer. */
.algt-notice-date[title] {
    cursor: help;
}

.algt-notice-body {
    margin-top: var(--algt-space-3);
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.6;
}

/* ── Paginador ────────────────────────────────────────────────────────── */

/* `margin: 0 auto` sobre el estado y no `justify-content: space-between`: en la
   primera página no hay botón «anterior» y en la última no hay «siguiente»; con
   space-between, el único botón que queda saltaría al lado equivocado. Con el
   margen automático, «anterior» se queda pegado a la izquierda, «siguiente» a la
   derecha y el número flota en medio esté quien esté. */
.algt-notices-pager {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-2) var(--algt-space-3);
    padding-top: var(--algt-space-2);
    border-top: 1px solid var(--algt-border);
}

.algt-panel .algt-notices-pager-status {
    margin: 0 auto;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    text-align: center;
}

.algt-notices-pager-prev,
.algt-notices-pager-next {
    flex: 0 0 auto;
}


/* -------------------------------------------------------------------------
   15.12 PESTAÑA «SOPORTE»
   -------------------------------------------------------------------------
   Maestro/detalle: la rejilla de arriba (alta + lista) y el hilo debajo, a todo
   el ancho. El hilo NO va en una tercera columna: una conversación con burbujas
   dentro de un tercio de 960px es ilegible, y además el detalle se reinyecta por
   AJAX y tiene que poder crecer sin descolocar la lista.
   ------------------------------------------------------------------------- */

.algt-support-header {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--algt-space-2) var(--algt-space-4);
}

.algt-support-heading {
    min-width: 0;
}

.algt-panel .algt-support-intro {
    margin-top: var(--algt-space-1);
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.45;
}

/* El contador «N / M abiertos». La cifra en mono y tabular porque el JS la
   reescribe al crear y al cerrar un ticket: con cifras proporcionales, pasar de
   «1 / 3» a «2 / 3» movería la palabra «abiertos». */
.algt-panel .algt-support-limit {
    display: inline-flex;
    align-items: baseline;
    gap: var(--algt-space-2);
    flex: 0 0 auto;
    padding: 6px var(--algt-space-3);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-full);
}

.algt-support-limit-count {
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    font-weight: 700;
}

.algt-support-limit-label {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
}

/* La caja de estado del JS. No lleva `display` —arranca con [hidden] y el JS
   solo le quita el atributo—, así que aquí no se declara ninguno. */
.algt-support-message {
    min-width: 0;
}

.algt-support-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--algt-space-4);
    align-items: start;
}

.algt-support-card {
    min-width: 0;
    padding: var(--algt-space-4);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-panel .algt-support-card > * {
    margin-top: var(--algt-space-3);
}

.algt-panel .algt-support-card > :first-child {
    margin-top: 0;
}

.algt-support-card-title {
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 650;
    line-height: 1.25;
    letter-spacing: -.01em;
}

.algt-panel .algt-support-form > * {
    margin-top: var(--algt-space-3);
}

.algt-panel .algt-support-form > :first-child {
    margin-top: 0;
}

/* Tipo y relevancia, uno al lado del otro: son dos desplegables cortos y en
   columna abrirían un formulario de alta innecesariamente largo. */
.algt-support-row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--algt-space-3);
}

.algt-support-textarea {
    min-height: 132px;
}

/* Un <option> largo («No puedo iniciar sesión en la plataforma») no debe
   ensanchar el desplegable: el control ya reserva 34px a la derecha para su
   flecha, y sin el corte el texto pasaría por debajo de ella. El valor completo
   sigue estando en el menú abierto, que es donde se elige. */
.algt-support-select {
    text-overflow: ellipsis;
}

/* Los dos botones de envío ocupan el ancho de su tarjeta: son la acción
   principal de cada formulario y no compiten con nada a su lado.

   EL SCOPE `.algt-panel` DELANTE NO ES DECORATIVO: sin él estos selectores
   puntúan 0-1-0 y `.algt-panel .algt-btn` —que puntúa 0-2-0 y declara
   `inline-flex`— seguiría ganando. El botón quedaría a todo el ancho pero
   colgando de una caja de línea, con un hueco de descendente debajo. Este es
   exactamente el tipo de fallo que en el sistema original se «arreglaba» con
   «bang-important»; aquí se arregla contando la especificidad. */
.algt-panel .algt-support-submit,
.algt-panel .algt-support-reply-submit {
    display: flex;
    width: 100%;
}

/* El texto de los tres avisos NO lo escribe esta hoja ni la vista: viene del
   servidor ($no_access_message, el del tope, el de cerrado) y puede traer el
   nombre de un producto o una URL sin espacios. `anywhere` es lo que impide que
   una cadena así ensanche la tarjeta y, con ella, la rejilla entera. */
.algt-support-notice {
    overflow-wrap: anywhere;
}

/* Los tres avisos de soporte. Llevan además `.algt-auth-notice`, así que la caja
   ya está resuelta arriba; aquí solo se les da su color. El significado lo lleva
   el TEXTO (que escribe el servidor), no el tono. */
.algt-support-notice-locked,
.algt-support-notice-limit {
    color: var(--algt-amber);
    background: var(--algt-amber-bg);
    border-color: var(--algt-amber-border);
}

.algt-support-notice-closed {
    color: var(--algt-text-3);
    background: var(--algt-surface-2);
    border-color: var(--algt-border);
}

/* ── Lista maestra ────────────────────────────────────────────────────── */

/* ALGT_Tab_Soporte::LIST_LIMIT son 50 filas. Al lado de un formulario de alta de
   unos 500px, cincuenta filas de 60px hacen una columna izquierda seis veces más
   alta que la derecha: la tarjeta de «Nuevo ticket» queda flotando arriba en un
   océano de blanco y hay que hacer scroll de página para volver a verla.
   Con el tope, la lista se desplaza DENTRO de su tarjeta y las dos columnas
   quedan a la par.

   No hace falta `tabindex` en esta caja para que sea accesible con teclado: sus
   hijos son enlaces reales y el navegador arrastra el contenedor solo al
   tabular hacia uno que está fuera de vista. `overscroll-behavior: contain`
   evita que, al llegar al final de la lista, la rueda siga y arrastre la página.

   El tope se RETIRA en una sola columna (≤900px): allí la lista ya no compite en
   altura con nada y una caja de scroll dentro de otra es un incordio en táctil. */
.algt-panel .algt-support-list {
    display: flex;
    flex-direction: column;
    gap: var(--algt-space-2);
    /* Los 3px de relleno son para el HALO DE FOCO. Una caja con `overflow` no
       recorta solo en el eje que desplaza: recorta en los dos, y sin este hueco
       el contorno de 2px con 2px de separación del enlace enfocado quedaría
       cercenado contra el borde de la tarjeta justo en el momento en que hace
       falta verlo. */
    padding: 3px;
    max-height: 26rem;
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
}

.algt-support-list-item {
    min-width: 0;
}

/* «Todavía no tienes tickets.» Centrado por lo mismo que los vacíos del
   detalle: ocupa el sitio de una lista entera y alineado a la izquierda, con una
   línea de alto, parece que la tarjeta se quedó a medio pintar. */
.algt-support-empty {
    text-align: center;
}

/* Cada fila es un <a> de verdad (enlace profundo real; el JS solo hace
   preventDefault). Por eso lleva foco visible y estado activo, y por eso no
   necesita `cursor: pointer`: ya lo trae por ser un enlace con href. */
.algt-support-item {
    display: flex;
    flex-direction: column;
    gap: var(--algt-space-2);
    padding: var(--algt-space-3);

    color: var(--algt-text);
    background: var(--algt-bg);
    border: 1px solid var(--algt-border);
    border-left: 3px solid transparent;
    border-radius: var(--algt-r-xs);
    text-decoration: none;

    transition: background-color var(--algt-ease), border-color var(--algt-ease);
}

.algt-support-item:hover {
    border-color: var(--algt-border-strong);
    border-left-color: var(--algt-border-strong);
}

.algt-support-item:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

/* El hilo abierto. Se estiliza por la clase Y por aria-current, agrupados, por
   el mismo motivo que la pestaña activa: el aspecto no puede desincronizarse de
   lo que anuncia el lector de pantalla.

   Con el scope delante para llegar a 0-2-0: `.algt-support-item:hover` ya puntúa
   0-2-0 y, siendo anterior en el fichero, ganaría a un `.algt-support-item-active`
   suelto de 0-1-0 — pasar el ratón por encima del hilo que ya está abierto le
   borraría la marca de «este es el que estás viendo». */
.algt-panel .algt-support-item-active,
.algt-panel .algt-support-item[aria-current="true"] {
    background: var(--algt-accent-dim);
    border-left-color: var(--algt-accent);
}

.algt-support-item-title {
    display: flex;
    align-items: baseline;
    gap: var(--algt-space-2);
    min-width: 0;
}

.algt-support-item-id {
    flex: 0 0 auto;
    color: var(--algt-text-3);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-xs);
    font-variant-numeric: tabular-nums;
}

/* Una línea y puntos suspensivos: el asunto puede tener 190 caracteres y la
   lista dejaría de ser una lista. El texto íntegro está en el aria-label del
   enlace y en el <h4> del hilo, así que no se pierde nada. */
.algt-support-item-subject {
    min-width: 0;
    overflow: hidden;
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    font-weight: 600;
    line-height: 1.35;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.algt-support-item-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-2);
}

.algt-support-item-date {
    color: var(--algt-text-3);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-xs);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* ── La píldora de estado del ticket ──────────────────────────────────── */

/* La píldora de estado aparece en la lista y en la cabecera del hilo, y en las
   dos comparte línea con más cosas: no debe encogerse para dejarles sitio. */
.algt-support-status {
    flex: 0 0 auto;
}

/* LOS CINCO ESTADOS COMPARTEN SOLO CUATRO TONOS. El mapa de
   ALGT_Tab_Soporte::status_tone() manda 'abierto' Y 'respondido' al mismo ámbar,
   así que dos estados distintos llegan aquí con la misma píldora y solo los
   separa la etiqueta. Lo que esta hoja NO hace es recolorearlos: el tono lo
   decide el servidor, y si el CSS lo pisara tendríamos dos autoridades sobre el
   mismo dato y una de las dos acabaría mintiendo.

   Lo que sí se puede añadir es un segundo eje que no es cromático —la FORMA del
   punto—, que además funciona para quien no distingue los tonos y sobrevive al
   modo de contraste forzado:
     · relleno → el hilo está EN MARCHA          (abierto · respondido · en_revision)
     · hueco   → el hilo TERMINÓ                 (cerrado)
     · diana   → la pelota es DEL CLIENTE        (esperando_usuario)

   Los tres primeros se declaran explícitamente aunque repitan el valor de
   `.algt-panel .algt-pill-dot`: así los cinco slugs del vocabulario aparecen en
   el fichero y quien toque la regla base ve de un vistazo a quién afecta. */
.algt-support-status-abierto .algt-pill-dot,
.algt-support-status-respondido .algt-pill-dot,
.algt-support-status-en_revision .algt-pill-dot {
    background: currentColor;
}

.algt-support-status-cerrado .algt-pill-dot {
    background: transparent;
    box-shadow: inset 0 0 0 2px currentColor;
}

/* El segundo anillo se separa del punto con el PROPIO fondo de la píldora (el
   tono 'err' del estado), no con un color inventado: así la diana se lee igual
   en claro y en oscuro sin una sola declaración de modo oscuro. */
.algt-support-status-esperando_usuario .algt-pill-dot {
    background: currentColor;
    box-shadow: 0 0 0 2px var(--algt-red-bg), 0 0 0 3px currentColor;
}

/* ── El detalle ───────────────────────────────────────────────────────── */

/* Contenedor vivo (role="region" aria-live). Existe SIEMPRE, con el hilo o con
   su estado vacío dentro, así que no se le declara ningún `display` ni se le
   pone fondo: la tarjeta es el hilo. */
.algt-support-detail {
    min-width: 0;
    border-radius: var(--algt-r-sm);
}

/* Los dos estados vacíos del detalle: «Selecciona un ticket» (el de reposo) y
   «Ticket no encontrado» (el fragmento que devuelve render_thread() cuando el
   id no existe o no es del usuario). Los dos llevan `.algt-panel-empty`, así que
   la caja ya está resuelta; aquí solo se centran y respiran más, porque ocupan
   el sitio de una conversación entera y a la izquierda, con dos líneas de alto,
   se leerían como un error de pintado. */
.algt-panel .algt-support-detail-empty,
.algt-panel .algt-support-thread-empty {
    padding: var(--algt-space-5);
    text-align: center;
}

/* tabindex="-1": recibe el foco POR PROGRAMA cuando el hilo no existe. Sin
   indicador, quien navega con teclado no sabría que el punto de lectura saltó
   al final de la página. */
.algt-support-detail:focus-visible,
.algt-support-thread:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-support-thread {
    padding: var(--algt-space-4);
    background: var(--algt-surface-2);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-panel .algt-support-thread > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-support-thread > :first-child {
    margin-top: 0;
}

.algt-support-thread-head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--algt-space-3);
}

.algt-support-thread-heading {
    flex: 1 1 260px;
    min-width: 0;
}

.algt-support-thread-title {
    display: flex;
    align-items: baseline;
    gap: var(--algt-space-2);
    min-width: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 650;
    line-height: 1.25;
    letter-spacing: -.01em;
}

.algt-support-thread-id {
    flex: 0 0 auto;
    color: var(--algt-text-3);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

/* Aquí el asunto SÍ envuelve entero: es el título del hilo abierto y es el sitio
   donde el cliente tiene que poder leerlo completo. */
.algt-support-thread-subject {
    min-width: 0;
    overflow-wrap: anywhere;
}

.algt-panel .algt-support-thread-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-2);
    margin-top: var(--algt-space-2);
}

/* Los chips de tipo, relevancia y fecha de apertura. Deliberadamente NEUTROS:
   compiten en la misma línea con la píldora de estado, que es la única que tiene
   derecho a color porque es la única que comunica un estado. */
.algt-support-thread-tag {
    display: inline-flex;
    align-items: center;
    padding: 3px 8px;
    color: var(--algt-text-3);
    background: var(--algt-bg);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-full);
    font-size: var(--algt-fs-xs);
}

.algt-support-thread-date {
    font-variant-numeric: tabular-nums;
}

.algt-support-thread-actions {
    display: flex;
    flex-wrap: wrap;
    flex: 0 0 auto;
    align-items: center;
    gap: var(--algt-space-2);
}

/* ── Burbujas ─────────────────────────────────────────────────────────── */

.algt-support-messages {
    display: flex;
    flex-direction: column;
    gap: var(--algt-space-3);
}

.algt-support-message-item {
    min-width: 0;
}

/* CONTRATO §15.7: las dos partes se distinguen por ALINEACIÓN y BORDE, no por
   dos fondos de color enfrentados (un verde contra un azul saturados dentro de
   una conversación es la estética de una app de mensajería, no la de un panel
   de producto, y además obligaría a inventar dos colores fuera del sistema).
   Aquí: el equipo a la izquierda con filete de acento, el cliente a la derecha
   con filete neutro. Y por encima de las dos cosas, el NOMBRE del autor escrito
   en cada burbuja, que es lo que lee quien no ve ni el color ni la posición. */
.algt-support-bubble {
    max-width: 92%;
    padding: var(--algt-space-3);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-support-bubble-admin {
    margin-right: auto;
    background: var(--algt-surface-3);
    border-left: 3px solid var(--algt-accent);
}

.algt-support-bubble-user {
    margin-left: auto;
    background: var(--algt-bg);
    border-right: 3px solid var(--algt-border-strong);
}

.algt-support-bubble-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--algt-space-2);
    margin-bottom: var(--algt-space-2);
}

.algt-support-bubble-author {
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    font-weight: 700;
}

.algt-support-bubble-date {
    color: var(--algt-text-3);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-xs);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* El cuerpo viene de wpautop + wp_kses_post: párrafos, listas y enlaces que el
   reset de §15.1 dejó pelados. Se rescatan en §15.14. */
.algt-support-bubble-body {
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.6;
    overflow-wrap: anywhere;
}

.algt-panel .algt-support-reply-form > * {
    margin-top: var(--algt-space-3);
}

.algt-panel .algt-support-reply-form > :first-child {
    margin-top: 0;
}

/* -------------------------------------------------------------------------
   15.13 PESTAÑA «MI BOT»
   -------------------------------------------------------------------------
   Los cuatro estados de la pestaña (sin solicitud, instalando con su carril de
   fases, necesita corrección, conectado), el interruptor
   `<button role="switch" aria-checked>` —que se estiliza por ESE atributo, no
   por una clase paralela— y la tarjeta viva de latido, balance, equity, P/L,
   versión del EA y estado de la configuración.

   No estrena ni un token ni un componente de base: las píldoras son las de
   §15.5, los botones los de §15.6 y los campos los de §15.7.

   ⚠ COLISIÓN DE NOMBRE QUE HAY QUE CONOCER ANTES DE TOCAR NADA AQUÍ:
   `.algt-bot-live` significa DOS cosas distintas en el mismo documento. La
   sección raíz lleva `algt-bot-<slug>`, así que en el estado D es
   `.algt-panel-section.algt-bot.algt-bot-live`; y la tarjeta de estado en vivo,
   dentro de ella, es `.algt-bot-card.algt-bot-live`. Por eso TODA regla de la
   tarjeta se escribe `.algt-bot-card.algt-bot-live` y nunca `.algt-bot-live` a
   secas: sin esa precisión, el padding de la tarjeta se aplicaría también a la
   sección entera y la pestaña saldría con doble margen. El JavaScript no tiene
   este problema porque localiza la tarjeta por `[data-algt-bot-live]`, que solo
   está en una de las dos.
   ------------------------------------------------------------------------- */

/* --- Cabecera de la pestaña ------------------------------------------------ */

.algt-panel .algt-bot-header {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--algt-space-3);
}

/* min-width:0 en la columna de texto: sin él, un intro largo empuja la píldora
   fuera de la tarjeta y saca scroll horizontal a 360px. */
.algt-panel .algt-bot-heading {
    flex: 1 1 260px;
    min-width: 0;
}

.algt-panel .algt-bot-intro {
    margin: var(--algt-space-1) 0 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.45;
}

/*
   El cuerpo, que es donde se inserta una de las cuatro vistas.

   Lleva su propio ritmo porque las vistas apilan VARIAS tarjetas dentro de él
   (el estado C mete la del error y la del formulario; el D, el banner de
   bloqueo, el interruptor, las preferencias y el estado en vivo) y el ritmo de
   §15.4 solo alcanza a los hijos DIRECTOS de la sección — es decir, a este
   contenedor, no a lo que hay dentro. Sin esta regla las cuatro tarjetas del
   estado «conectado» salen pegadas unas a otras.
*/
.algt-panel .algt-bot-body > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-bot-body > :first-child {
    margin-top: 0;
}

/* --- La tarjeta, que es la unidad de esta pestaña -------------------------- */

.algt-panel .algt-bot-card {
    padding: var(--algt-space-5);
    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r);
}

/* Ritmo vertical por "lechuza", igual que en el resto del panel: margen ARRIBA
   a todo hijo directo menos al primero. Es lo que permite añadir o quitar un
   bloque de una vista sin recalcular márgenes. */
.algt-panel .algt-bot-card > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-bot-card > :first-child {
    margin-top: 0;
}

/*
   ⚠ LOS <input type="hidden"> CUENTAN COMO PRIMER HIJO.

   El formulario de preferencias ES la tarjeta, y sus dos primeros hijos son los
   campos ocultos `action` y `nonce`. Sin esta regla, `:first-child` cae sobre un
   nodo sin caja y el <h4> —que es lo primero que se ve— hereda el margen
   superior, dejando un hueco de 16px que nadie pidió justo debajo del padding de
   la tarjeta. Se anula el margen del oculto y el del elemento que le sigue; con
   dos ocultos seguidos, el segundo ya lo neutraliza el primero y el <h4> lo
   neutraliza el segundo.
*/
.algt-panel .algt-bot-card > input[type="hidden"],
.algt-panel .algt-bot-card > input[type="hidden"] + * {
    margin-top: 0;
}

.algt-panel .algt-bot-card-title {
    margin: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-lg);
    font-weight: 700;
    line-height: 1.3;
    letter-spacing: -.01em;
}

/* Pareja etiqueta/valor. Se usa en tres vistas (instalando, conectado y la
   línea de cuenta), y por eso vive fuera de las tres. */
.algt-panel .algt-bot-kv {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--algt-space-2);
    min-width: 0;
}

.algt-panel .algt-bot-kv-label {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
}

/* Mono + tabular-nums: el login MT5, el nombre del servidor y los importes son
   datos técnicos, y con cifras de ancho fijo el refresco de cada 10 s no
   descoloca la línea al cambiar un dígito. `break-word` porque un nombre de
   servidor no se puede partir por espacios y a 360px se saldría de la caja. */
.algt-panel .algt-bot-kv-value {
    min-width: 0;
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    overflow-wrap: anywhere;
}

/* El aviso ámbar de la pestaña: balance corto, config en cola, último error del
   EA. Color + texto, nunca color solo (CONTRATO §12). */
.algt-panel .algt-bot-warning {
    padding: var(--algt-space-2) var(--algt-space-3);
    color: var(--algt-amber);
    background: var(--algt-amber-bg);
    border: 1px solid var(--algt-amber-border);
    border-radius: var(--algt-r-xs);
}

/* --- Piezas de §5–§12 que el panel todavía no tenía ------------------------ */
/*
   Las cinco de aquí abajo están declaradas en el bloque de autenticación bajo
   `.algt-auth-form-wrap` y esta pestaña es la primera del panel que las usa: el
   formulario de activación trae contraseña con ojo, radios de nivel de riesgo y
   un botón a ancho completo. Se REDECLARAN para este ámbito en vez de sacar el
   selector fuera, por la regla número uno de este fichero (una clase suelta
   competiría con el tema del sitio y volveríamos a necesitar el blindaje con
   «bang-important» que este rediseño retiró). Es el mismo criterio, y el mismo
   precio, que ya se pagó con los botones en §15.6.
*/

.algt-panel .algt-btn-full {
    display: flex;
    width: 100%;
}

.algt-panel .algt-check {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    margin: 0;
    accent-color: var(--algt-accent);
    cursor: pointer;
}

.algt-panel .algt-check:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-panel .algt-check-label {
    margin: 0;
    color: var(--algt-text-2);
    font-size: var(--algt-fs-base);
    font-weight: 500;
    cursor: pointer;
}

.algt-panel .algt-password-input-wrap {
    position: relative;
}

/* Hueco para el ojo. Sin reservarlo, el icono del gestor de contraseñas del
   navegador se monta encima del nuestro. */
.algt-panel .algt-password-input {
    padding-right: 48px;
}

.algt-panel .algt-password-toggle {
    position: absolute;
    top: 50%;
    right: 6px;
    transform: translateY(-50%);

    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;

    color: var(--algt-text-3);
    background: transparent;
    border: 0;
    border-radius: var(--algt-r-full);
    cursor: pointer;
    transition: color var(--algt-ease), background-color var(--algt-ease);
}

.algt-panel .algt-password-toggle:hover {
    color: var(--algt-text);
    background: var(--algt-accent-dim);
}

/* Se estiliza el ESTADO ARIA y no una clase `.is-active` paralela: así el
   aspecto no puede desincronizarse de lo que anuncia el lector de pantalla. */
.algt-panel .algt-password-toggle[aria-pressed="true"] {
    color: var(--algt-text);
    background: var(--algt-accent-dim);
}

.algt-panel .algt-password-toggle:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-panel .algt-password-toggle svg {
    display: block;
    width: 18px;
    height: 18px;
}

.algt-panel .algt-password-toggle:disabled {
    opacity: .55;
    cursor: not-allowed;
}

/* --- Estado A: sin solicitud ----------------------------------------------- */

.algt-panel .algt-bot-requisitos {
    background: var(--algt-surface-2);
}

.algt-panel .algt-bot-req-list {
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--algt-space-2);
}

/* El reset de §15.1 quitó el marcador a TODAS las listas del panel; aquí hace
   falta uno porque son requisitos que se cuentan. Se dibuja con ::before en vez
   de devolver `list-style` para que el punto quede alineado con la primera
   línea aunque el texto envuelva en dos. */
.algt-panel .algt-bot-req-list li {
    position: relative;
    padding-left: var(--algt-space-4);
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
}

.algt-panel .algt-bot-req-list li::before {
    content: "";
    position: absolute;
    top: .55em;
    left: 2px;
    width: 6px;
    height: 6px;
    background: var(--algt-text-3);
    border-radius: var(--algt-r-full);
}

/* Mismo ritmo y misma trampa de los campos ocultos que en la tarjeta: aquí el
   <form> va DENTRO de #algt-bot-form-wrap, así que necesita el suyo propio. */
.algt-panel .algt-bot-form > * {
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-bot-form > :first-child,
.algt-panel .algt-bot-form > input[type="hidden"],
.algt-panel .algt-bot-form > input[type="hidden"] + * {
    margin-top: 0;
}

.algt-panel .algt-bot-form-actions {
    margin-top: var(--algt-space-5);
}

.algt-panel .algt-bot-legal {
    text-align: center;
}

/* --- Estado B: instalando --------------------------------------------------- */

.algt-panel .algt-bot-progress-lead {
    color: var(--algt-text-2);
    font-size: var(--algt-fs-base);
    line-height: 1.5;
}

.algt-panel .algt-bot-progress-account {
    display: flex;
    flex-wrap: wrap;
    gap: var(--algt-space-2) var(--algt-space-5);
}

/*
   EL CARRIL DE FASES.

   El estado de cada paso viaja por TRES vías y hacen falta las tres: el color
   del punto, su FORMA (relleno / anillo / hueco) y la etiqueta que la vista
   imprime en .algt-sr-only. Con solo el color, un daltónico ve seis puntos
   iguales; con solo la forma, se pierde el matiz de "esta es la de ahora".
*/
.algt-panel .algt-bot-phases {
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--algt-space-3);
}

.algt-panel .algt-bot-phase {
    position: relative;
    display: flex;
    align-items: center;
    gap: var(--algt-space-3);
    min-width: 0;
    padding-left: 2px;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    line-height: 1.4;
}

/* La línea que une un paso con el siguiente. Va en ::after del <li> y no como
   borde del contenedor para que el ÚLTIMO no arrastre una línea que no lleva a
   ninguna parte. */
.algt-panel .algt-bot-phase::after {
    content: "";
    position: absolute;
    top: calc(50% + 9px);
    left: 7px;
    width: 2px;
    height: calc(100% + var(--algt-space-3) - 18px);
    background: var(--algt-border);
}

.algt-panel .algt-bot-phase:last-child::after {
    display: none;
}

.algt-panel .algt-bot-phase-dot {
    flex: 0 0 auto;
    width: 12px;
    height: 12px;
    margin-left: 2px;
    background: var(--algt-surface-3);
    border: 2px solid var(--algt-border-strong);
    border-radius: var(--algt-r-full);
}

.algt-panel .algt-bot-phase-label {
    min-width: 0;
    overflow-wrap: anywhere;
}

/* Hecha: punto verde RELLENO y texto en el gris secundario (ya no es lo que
   está pasando, pero tampoco es una promesa: pasó). */
.algt-panel .algt-bot-phase-done {
    color: var(--algt-text-2);
}

.algt-panel .algt-bot-phase-done .algt-bot-phase-dot {
    background: var(--algt-green);
    border-color: var(--algt-green);
}

.algt-panel .algt-bot-phase-done::after {
    background: var(--algt-green-border);
}

/* En curso: ANILLO azul (fondo de la tarjeta dentro, borde grueso fuera) y el
   texto en negro y en negrita. Es el único paso que el ojo tiene que encontrar
   sin leer. */
.algt-panel .algt-bot-phase-current {
    color: var(--algt-text);
    font-weight: 700;
}

.algt-panel .algt-bot-phase-current .algt-bot-phase-dot {
    background: var(--algt-bg);
    border-color: var(--algt-blue);
    box-shadow: 0 0 0 3px var(--algt-blue-bg);
}

.algt-panel .algt-bot-progress-count {
    color: var(--algt-text-2);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

.algt-panel .algt-bot-attempt {
    color: var(--algt-amber);
}

/* La nota del equipo: filete lateral, que es como este sistema marca "esto lo
   escribió una persona" sin recurrir a una tarjeta dentro de otra. */
.algt-panel .algt-bot-note {
    padding: var(--algt-space-3) var(--algt-space-4);
    background: var(--algt-surface-2);
    border-left: 3px solid var(--algt-border-strong);
    border-radius: 0 var(--algt-r-xs) var(--algt-r-xs) 0;
}

.algt-panel .algt-bot-note-label {
    margin: 0 0 var(--algt-space-1);
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.algt-panel .algt-bot-note-text {
    margin: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    line-height: 1.5;
    white-space: pre-line;
    overflow-wrap: anywhere;
}

/* --- Estado C: necesita corrección ------------------------------------------ */

.algt-panel .algt-bot-error-card {
    background: var(--algt-red-bg);
    border-color: var(--algt-red-border);
}

.algt-panel .algt-bot-error-head {
    display: flex;
    align-items: flex-start;
    gap: var(--algt-space-3);
}

.algt-panel .algt-bot-error-icon {
    flex: 0 0 auto;
    display: inline-flex;
    color: var(--algt-red);
}

/*
   EL TEXTO DEL EQUIPO, LITERAL.

   Es el msg_* configurado en Ajustes y es lo ÚNICO que le dice al cliente qué
   tiene que corregir. Va en el cuerpo base y no en cuerpo pequeño a propósito:
   es la frase más importante de la pantalla. `pre-line` conserva los saltos que
   el administrador escribió en el textarea; sin él, dos párrafos se leen como
   un bloque pegado.
*/
.algt-panel .algt-bot-error-text {
    margin: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-base);
    line-height: 1.55;
    white-space: pre-line;
    overflow-wrap: anywhere;
}

.algt-panel .algt-bot-error-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--algt-space-3);
}

/* El botón fantasma sobre el fondo rojo tenue necesita su propio borde: el
   --algt-border-strong de §15.6 se pierde ahí. */
.algt-panel .algt-bot-error-card .algt-btn-ghost {
    background: var(--algt-bg);
    border-color: var(--algt-red-border);
}

.algt-panel .algt-bot-seq {
    color: var(--algt-text-2);
}

/* --- Estado D: conectado ---------------------------------------------------- */

/*
   EL BANNER DE BLOQUEO.

   Dos tonos porque son dos situaciones distintas y el cliente tiene que
   distinguirlas sin leer: por impago (ámbar) se desbloquea él solo renovando;
   por decisión del equipo (rojo) no, y mandarle a renovar sería cobrarle por
   algo que no le va a devolver el bot. El TEXTO ya lo explica en las dos; el
   color solo lo refuerza.
*/
.algt-panel .algt-bot-blocked {
    border-width: 1px;
    border-style: solid;
}

.algt-panel .algt-bot-blocked-membership {
    background: var(--algt-amber-bg);
    border-color: var(--algt-amber-border);
}

.algt-panel .algt-bot-blocked-team {
    background: var(--algt-red-bg);
    border-color: var(--algt-red-border);
}

.algt-panel .algt-bot-blocked-text {
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    line-height: 1.55;
}

.algt-panel .algt-bot-blocked-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--algt-space-3);
}

.algt-panel .algt-bot-blocked .algt-btn-ghost {
    background: var(--algt-bg);
}

/*
   EL INTERRUPTOR.

   Es un <button role="switch" aria-checked>, no una casilla disfrazada, y se
   estiliza POR EL ATRIBUTO (CONTRATO §12): así el aspecto no puede
   desincronizarse de lo que anuncia el lector de pantalla. La clase
   `.algt-bot-switch-on` que imprime la vista y conmuta el JS se conserva como
   gancho, pero aquí no pinta nada — si algún día las dos discreparan, mandaría
   lo que se anuncia, que es lo correcto.
*/
.algt-panel .algt-bot-switch-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-4);
}

.algt-panel .algt-bot-switch-copy {
    flex: 1 1 240px;
    min-width: 0;
}

.algt-panel .algt-bot-switch-copy .algt-form-help {
    margin-top: var(--algt-space-1);
}

.algt-panel .algt-bot-switch {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: var(--algt-space-3);

    /* 44px de alto: el objetivo táctil es el control entero, etiqueta incluida,
       no la pista de 28px. */
    min-height: 44px;
    padding: 0 var(--algt-space-3) 0 var(--algt-space-2);

    color: var(--algt-text);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--algt-r-full);

    font-family: inherit;
    font-size: var(--algt-fs-sm);
    font-weight: 700;
    line-height: 1.2;
    cursor: pointer;
    transition: background-color var(--algt-ease), border-color var(--algt-ease);
}

.algt-panel .algt-bot-switch:hover:not(:disabled) {
    background: var(--algt-accent-dim);
}

/* El foco NUNCA se queda sin indicador (CONTRATO §12). Contorno separado + halo,
   igual que los botones de §15.6. */
.algt-panel .algt-bot-switch:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}

.algt-panel .algt-bot-switch:disabled {
    opacity: .55;
    cursor: not-allowed;
}

.algt-panel .algt-bot-switch-track {
    position: relative;
    flex: 0 0 auto;
    display: block;
    width: 48px;
    height: 28px;
    background: var(--algt-surface-3);
    border: 1px solid var(--algt-border-strong);
    border-radius: var(--algt-r-full);
    transition: background-color var(--algt-ease), border-color var(--algt-ease);
}

.algt-panel .algt-bot-switch-thumb {
    position: absolute;
    top: 3px;
    left: 3px;
    display: block;
    width: 20px;
    height: 20px;
    background: var(--algt-bg);
    border-radius: var(--algt-r-full);
    box-shadow: var(--algt-shadow-1);
    transition: transform var(--algt-ease);
}

/* Verde y no negro: aquí el color SÍ significa algo («está operando»), y el
   acento negro del sistema se reserva para «esto es una acción», no para «este
   es el estado». La etiqueta de al lado dice «Activo» de todas formas. */
.algt-panel .algt-bot-switch[aria-checked="true"] .algt-bot-switch-track {
    background: var(--algt-green);
    border-color: var(--algt-green);
}

/* 48 − 2 bordes − 3 de hueco a cada lado − 20 del pulgar = 20px de recorrido. */
.algt-panel .algt-bot-switch[aria-checked="true"] .algt-bot-switch-thumb {
    transform: translateX(20px);
}

.algt-panel .algt-bot-switch-text {
    min-width: 0;
}

/* --- Preferencias: lotaje, nivel de riesgo, riesgo máximo -------------------- */
/* El <form> de preferencias ES una .algt-bot-card, así que su ritmo vertical (y
   la excepción de los campos ocultos) ya está resuelto arriba. */

/* <fieldset> con el reset del navegador retirado: sin esto, el borde y el
   padding por defecto meten una caja dentro de la tarjeta. */
.algt-panel .algt-bot-risk-level {
    padding: 0;
    border: 0;
}

.algt-panel .algt-bot-risk-level legend {
    padding: 0;
    margin-bottom: var(--algt-space-2);
}

.algt-panel .algt-bot-risk-option {
    display: grid;
    grid-template-columns: 18px 1fr;
    align-items: center;
    gap: var(--algt-space-1) var(--algt-space-3);
    padding: var(--algt-space-2) 0;
}

/* La ayuda de cada nivel se alinea DEBAJO de la etiqueta, no del radio: en la
   segunda columna de la rejilla. Es lo que hace que las tres opciones se lean
   como tres bloques y no como seis líneas sueltas. */
.algt-panel .algt-bot-risk-help {
    grid-column: 2;
    margin: 0;
}

.algt-panel .algt-bot-risk-label {
    color: var(--algt-text);
    font-weight: 600;
}

/* --- La tarjeta de estado en vivo ------------------------------------------- */
/* Selector doble a propósito: ver la nota de colisión de la cabecera de §15.13. */

.algt-panel .algt-bot-card.algt-bot-live {
    background: var(--algt-bg);
}

.algt-panel .algt-bot-live-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--algt-space-3);
}

.algt-panel .algt-bot-live-age {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--algt-space-2);
}

/* auto-fit + minmax: dos columnas en escritorio, una en móvil, sin una sola
   media query y sin que una etiqueta larga rompa la rejilla. */
.algt-panel .algt-bot-live-grid {
    margin: 0;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
    gap: 1px;
    background: var(--algt-border);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
    overflow: hidden;
}

/* El fondo de la rejilla es el que dibuja las líneas de 1px; cada celda tapa su
   trozo con el color de la tarjeta. Una tabla de 8 datos sin bordes por celda. */
.algt-panel .algt-bot-live-item {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--algt-space-3);
    min-width: 0;
    padding: var(--algt-space-3) var(--algt-space-4);
    background: var(--algt-surface);
}

.algt-panel .algt-bot-live-item dt {
    margin: 0;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 600;
    line-height: 1.35;
}

.algt-panel .algt-bot-live-item dd {
    margin: 0;
    min-width: 0;
    color: var(--algt-text);
    font-family: var(--algt-font-mono);
    font-size: var(--algt-fs-sm);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    text-align: right;
    overflow-wrap: anywhere;
}

/* La celda de «Configuración» lleva una píldora, no una cifra: se le devuelve la
   tipografía normal para que no salga en mono. Se estiliza la PÍLDORA y no la
   celda con `:has()` a propósito: `:has()` es progresivo y donde no exista la
   píldora heredaría la mono del <dd> sin que nada lo delate. */
.algt-panel .algt-bot-live-item .algt-pill {
    font-family: var(--algt-font);
    font-variant-numeric: normal;
    font-weight: 600;
}

/*
   P/L DE LA CESTA.

   El único número con signo de la tarjeta. El signo va DENTRO del texto que
   imprime la vista (y que reescribe el sondeo); el color solo lo refuerza, y por
   eso -muted existe: sin dato no se pinta ni verde ni rojo.
*/
.algt-panel .algt-bot-pl-pos {
    color: var(--algt-green);
}

.algt-panel .algt-bot-pl-neg {
    color: var(--algt-red);
}

.algt-panel .algt-bot-pl-muted {
    color: var(--algt-text-3);
}

.algt-panel .algt-bot-live-account {
    display: flex;
    flex-wrap: wrap;
    gap: var(--algt-space-2) var(--algt-space-5);
}

/* --- Móvil en vertical ------------------------------------------------------ */
/*
   Se deja aquí y no en §15.15 porque solo toca selectores de esta pestaña: nada
   de lo que hay más abajo en el fichero compite con ellos, así que el orden de
   cascada no cambia y el bloque se lee entero de una vez.
*/

@media (max-width: 480px) {
    .algt-panel .algt-bot-card {
        padding: var(--algt-space-4);
    }

    /* El interruptor pasa a línea propia y a ancho completo: a 360px, con la
       explicación al lado, la pista de 48px quedaba pegada al borde y el
       objetivo táctil se comía el margen de la tarjeta. */
    .algt-panel .algt-bot-switch-row {
        align-items: stretch;
    }

    .algt-panel .algt-bot-switch {
        justify-content: space-between;
        width: 100%;
        padding: 0 var(--algt-space-3);
        border-color: var(--algt-border);
    }

    /* Etiqueta arriba y valor abajo: con ocho filas de dos columnas a 360px, el
       valor en mono acababa partido en dos líneas contra la etiqueta. */
    .algt-panel .algt-bot-live-item {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--algt-space-1);
    }

    .algt-panel .algt-bot-live-item dd {
        text-align: left;
    }

    .algt-panel .algt-bot-error-actions .algt-btn,
    .algt-panel .algt-bot-blocked-actions .algt-btn {
        width: 100%;
    }
}


/* -------------------------------------------------------------------------
   15.14 RESCATE DEL HTML REDACTADO POR PERSONAS
   -------------------------------------------------------------------------
   Tres sitios del panel imprimen HTML que escribió alguien y que pasó por
   wp_kses_post(): el anuncio del equipo en Inicio, el cuerpo de cada aviso y el
   mensaje de cada respuesta de ticket. El reset de §15.1 les quitó los márgenes
   y los marcadores de lista a TODO el panel —lo que es correcto para las cinco
   estructuras que maquetamos nosotros— y aquí se les devuelve.

   Sin este bloque, un aviso con viñetas se lee como un párrafo pegado y un
   ticket de cinco párrafos, como un muro de texto. Va DESPUÉS del reset para
   ganar por orden de fuente con la misma especificidad.
   ------------------------------------------------------------------------- */

.algt-panel .algt-home-announcement > * + *,
.algt-panel .algt-notice-body > * + *,
.algt-panel .algt-support-bubble-body > * + * {
    margin-top: var(--algt-space-3);
}

.algt-home-announcement ul,
.algt-home-announcement ol,
.algt-notice-body ul,
.algt-notice-body ol,
.algt-support-bubble-body ul,
.algt-support-bubble-body ol {
    padding-left: 1.35em;
    list-style: disc;
}

.algt-home-announcement ol,
.algt-notice-body ol,
.algt-support-bubble-body ol {
    list-style: decimal;
}

.algt-home-announcement li + li,
.algt-notice-body li + li,
.algt-support-bubble-body li + li {
    margin-top: var(--algt-space-1);
}

/* Los enlaces de ese HTML no llevan ninguna clase nuestra: se estilizan por
   elemento, pero SOLO dentro de estos tres contenedores, así que el selector
   sigue sin poder alcanzar nada del sitio del cliente. El foco visible es
   obligatorio también aquí: son enlaces reales y tabulables. */
.algt-home-announcement a,
.algt-notice-body a,
.algt-support-bubble-body a {
    color: var(--algt-text);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    border-radius: var(--algt-r-xs);
    overflow-wrap: anywhere;
    transition: color var(--algt-ease);
}

.algt-home-announcement a:hover,
.algt-notice-body a:hover,
.algt-support-bubble-body a:hover {
    color: var(--algt-accent-hover);
}

.algt-home-announcement a:focus-visible,
.algt-notice-body a:focus-visible,
.algt-support-bubble-body a:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    box-shadow: var(--algt-focus);
}


/* -------------------------------------------------------------------------
   15.16 PEDIDOS — la lista y el detalle
   -------------------------------------------------------------------------
   Reutiliza casi todo: la píldora de estado es la de §15.5, los botones los de
   §15.6 y el estado vacío el de §15.4. Lo propio de aquí son dos cosas:

   1. LA TABLA. Es la única tabla de datos del panel, y en el móvil no se
      desplaza: se DERRUMBA en tarjetas (§15.15). Por eso cada celda lleva
      data-label en el markup — en tarjeta, ese atributo pasa a ser la etiqueta
      del dato. Una tabla con scroll horizontal en un teléfono es una tabla que
      nadie lee entera.
   2. LOS IMPORTES. Van con `font-variant-numeric: tabular-nums`: sin eso, las
      cifras de una columna de dinero no alinean sus unidades y comparar dos
      pedidos exige leerlos dígito a dígito.

   Va NUMERADA 15.16 pero colocada ANTES del responsive (§15.15) a propósito: el
   responsive tiene que ser lo último de la hoja para que sus reglas ganen sin
   subir especificidad, y meter esto detrás obligaría a repetir el media query.
   ------------------------------------------------------------------------- */

.algt-panel .algt-orders-header {
    margin-bottom: var(--algt-space-4);
}

.algt-panel .algt-orders-intro,
.algt-panel .algt-orders-note {
    margin: var(--algt-space-1) 0 0;
    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
}

/* El contenedor con overflow existe para el caso intermedio: una tabla de cinco
   columnas entre 641px y ~760px cabe justa. Por debajo de 640 la tabla ya no es
   tabla y este overflow deja de intervenir. */
.algt-panel .algt-orders-table-wrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

.algt-panel .algt-orders-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--algt-fs-sm);
}

.algt-panel .algt-orders-table thead th {
    padding: var(--algt-space-2) var(--algt-space-3);
    border-bottom: 1px solid var(--algt-border-strong);

    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 600;
    text-align: left;
    text-transform: uppercase;
    letter-spacing: .06em;
    white-space: nowrap;
}

.algt-panel .algt-orders-table tbody th,
.algt-panel .algt-orders-table tbody td {
    padding: var(--algt-space-3);
    border-bottom: 1px solid var(--algt-border);

    color: var(--algt-text-2);
    font-weight: 400;
    text-align: left;
    vertical-align: middle;
}

/* La columna de dinero y el número de pedido, en cifras tabulares: es lo que
   hace que una columna de importes se pueda comparar de un vistazo. */
.algt-panel .algt-orders-table tbody td:nth-child(4),
.algt-panel .algt-orders-number {
    font-variant-numeric: tabular-nums;
}

.algt-panel .algt-orders-number {
    color: var(--algt-text);
    font-weight: 600;
    text-decoration: none;
    border-bottom: 1px solid var(--algt-border-strong);
}

.algt-panel .algt-orders-number:hover {
    border-bottom-color: var(--algt-accent);
}

.algt-panel .algt-orders-number:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    border-radius: 2px;
}

.algt-panel .algt-orders-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--algt-space-2);
    justify-content: flex-end;
}

.algt-panel .algt-orders-table tfoot th,
.algt-panel .algt-orders-table tfoot td {
    padding: var(--algt-space-2) var(--algt-space-3);
    color: var(--algt-text);
    font-size: var(--algt-fs-sm);
    text-align: left;
}

/* La ÚLTIMA fila del pie es el total. Se marca con peso y con una línea superior
   más marcada, no con color: es el número que el cliente compara con su extracto
   bancario y tiene que encontrarse solo. */
.algt-panel .algt-orders-table tfoot tr:last-child th,
.algt-panel .algt-orders-table tfoot tr:last-child td {
    border-top: 1px solid var(--algt-border-strong);
    font-weight: 700;
}

/* --- Paginación ----------------------------------------------------------- */

.algt-panel .algt-orders-pager {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-3);
    margin-top: var(--algt-space-4);
}

.algt-panel .algt-orders-pager-count {
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-variant-numeric: tabular-nums;
}

/* --- Detalle -------------------------------------------------------------- */

.algt-panel .algt-order-back {
    margin: 0 0 var(--algt-space-3);
}

.algt-panel .algt-order-back-link {
    display: inline-flex;
    align-items: center;
    gap: var(--algt-space-1);

    color: var(--algt-text-3);
    font-size: var(--algt-fs-sm);
    text-decoration: none;
}

.algt-panel .algt-order-back-link:hover {
    color: var(--algt-text);
}

.algt-panel .algt-order-back-link:focus-visible {
    outline: 2px solid var(--algt-accent);
    outline-offset: 2px;
    border-radius: 2px;
}

.algt-panel .algt-order-header {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--algt-space-3);
    margin-bottom: var(--algt-space-4);
}

/* Los datos del pedido en fila, cada uno con su rótulo encima. auto-fit y no
   columnas fijas: el método de pago no siempre está, y con columnas fijas su
   ausencia dejaría un hueco donde el ojo busca un dato. */
.algt-panel .algt-order-facts {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: var(--algt-space-4);
    margin: 0 0 var(--algt-space-5);
    padding: var(--algt-space-4);

    background: var(--algt-surface);
    border: 1px solid var(--algt-border);
    border-radius: var(--algt-r-sm);
}

.algt-panel .algt-order-fact dt {
    margin: 0 0 var(--algt-space-1);
    color: var(--algt-text-3);
    font-size: var(--algt-fs-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
}

.algt-panel .algt-order-fact dd {
    margin: 0;
    color: var(--algt-text);
    font-size: var(--algt-fs-base);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.algt-panel .algt-order-pay {
    margin: 0 0 var(--algt-space-5);
}

.algt-panel .algt-order-lines-title {
    margin: 0 0 var(--algt-space-3);
    color: var(--algt-text);
    font-size: var(--algt-fs-base);
    font-weight: 700;
}


/* -------------------------------------------------------------------------
   15.15 RESPONSIVE DEL PANEL — 900 / 768 / 480
   -------------------------------------------------------------------------
   Misma regla que atraviesa §12: ninguna caja puede provocar scroll horizontal
   de PÁGINA. Lo que no cabe encoge, pasa a una columna, o se desplaza dentro de
   su propio contenedor (la tabla y la tira de pestañas son los dos únicos que
   se desplazan, y los dos tienen su `overflow-x` declarado).
   ------------------------------------------------------------------------- */

/* ── ≤900px: la rejilla de dos columnas de Soporte deja de tener sentido ── */
@media (max-width: 900px) {
    /* Dos tarjetas de ~430px con un formulario dentro son dos columnas
       apretadas; por debajo de eso, el textarea de «Mensaje» se queda en tres
       palabras por línea. En una sola columna el alta se lee entera. */
    .algt-support-grid {
        grid-template-columns: minmax(0, 1fr);
    }

    /* Con una sola columna, la lista ya no compite en altura con el formulario:
       el tope de 26rem deja de tener sentido y una caja de scroll dentro de una
       página que también se desplaza es un incordio en táctil (el gesto se
       «pega» a la lista y el usuario cree que la página se ha bloqueado). */
    .algt-panel .algt-support-list {
        max-height: none;
        overflow-y: visible;
    }

    .algt-panel-section,
    .algt-panel-header {
        padding: var(--algt-space-4);
    }
}

/* ── ≤768px: tableta y móvil apaisado ─────────────────────────────────── */
@media (max-width: 768px) {
    /* La cabecera se apila: con el saludo y el estado en la misma fila, el
       nombre se parte en tres líneas para dejarle sitio a la píldora. Y el
       bloque de membresía se alinea a la IZQUIERDA, con el resto. */
    .algt-panel-header {
        flex-direction: column;
        align-items: flex-start;
    }

    /* ⚠ HAY QUE SOLTAR EL `flex-basis` DEL SALUDO, Y NO ES UN DETALLE ESTÉTICO.
       Arriba, en fila, `.algt-panel-identity` lleva `flex: 1 1 240px` para no
       aplastarse contra la píldora. Pero `flex-basis` se mide sobre el EJE
       PRINCIPAL, y al pasar el contenedor a `column` ese eje deja de ser el
       horizontal: los 240px se convierten en 240px de ALTO. El resultado es una
       cabecera con un agujero en blanco del tamaño de media pantalla entre el
       nombre y el estado de la membresía — se vio pintándolo, no leyéndolo. */
    .algt-panel-identity {
        flex: 0 0 auto;
        width: 100%;
    }

    .algt-panel-membership {
        justify-content: flex-start;
        width: 100%;
        text-align: left;
    }

    .algt-panel-title {
        font-size: var(--algt-fs-xl);
    }

    /* Las tres fichas, una debajo de otra. En dos columnas quedaría una huérfana
       y en tres, con la píldora «Necesita corrección» dentro, el texto se parte
       en cuatro líneas y las fichas dejan de tener la misma altura. */
    .algt-home-cards {
        grid-template-columns: minmax(0, 1fr);
    }

    /* Los tres bloques de Cuenta se nombran uno a uno en vez de usar
       `.algt-account-block`, que sería lo corto. El cuarto —«Cerrar sesión»— NO
       es una caja: lleva `padding: 0` y ningún fondo. Y una regla de media query
       con la MISMA especificidad que la suya, pero más abajo en el fichero, le
       ganaría: el botón de cerrar sesión aparecería en móvil con 12px de relleno
       fantasma alrededor, dentro de un contenedor invisible. Las media queries no
       suman especificidad; solo mueven el orden. */
    .algt-hero-card,
    .algt-support-card,
    .algt-support-thread,
    .algt-account-profile,
    .algt-account-history,
    .algt-account-access {
        padding: var(--algt-space-3);
    }

    .algt-hero-body {
        gap: var(--algt-space-3) var(--algt-space-5);
    }

    /* 16px CLAVADOS, no un token, y por el mismo motivo exacto de §12: Safari en
       iOS hace zoom automático sobre cualquier campo cuyo texto mida menos de
       16px, y al hacerlo desplaza el layout justo cuando el cliente empieza a
       escribir su ticket. --algt-fs-base son 0.9rem = 14.4px. */
    .algt-panel .algt-input {
        font-size: 16px;
    }

    /* Las burbujas ganan ancho: al 92% de una pantalla estrecha, una respuesta
       de dos frases cabe en dos líneas en vez de en cinco. La alineación sigue
       distinguiéndolas, y el filete y el nombre del autor no se tocan. */
    .algt-support-bubble {
        max-width: 96%;
    }
}

/* ── ≤640px: la tabla de pedidos deja de ser tabla ─────────────────────
   Cinco columnas —número, fecha, estado, total y dos botones— no caben en un
   teléfono de ninguna manera. Las dos salidas posibles son scroll horizontal o
   derrumbe en tarjetas, y el scroll pierde: la mitad derecha de cada fila queda
   fuera de la vista, así que el cliente ve una lista de números de pedido sin
   importes, que es justo el dato que venía a mirar.

   El derrumbe se apoya en los data-label del markup. Los roles ARIA se retiran
   con display:block, así que la semántica de tabla se pierde a propósito: lo que
   queda es una lista de tarjetas, que es lo que de verdad se está enseñando.
   ------------------------------------------------------------------------- */
@media (max-width: 640px) {
    .algt-panel .algt-orders-table-wrap {
        overflow-x: visible;
    }

    .algt-panel .algt-orders-table,
    .algt-panel .algt-orders-table tbody,
    .algt-panel .algt-orders-table tfoot,
    .algt-panel .algt-orders-table tr,
    .algt-panel .algt-orders-table th,
    .algt-panel .algt-orders-table td {
        display: block;
        width: auto;
    }

    /* La cabecera se esconde con la técnica de fuera-de-pantalla y no con
       display:none: display:none la borra también para el lector de pantalla, y
       entonces las celdas se anuncian sin decir de qué columna son. */
    .algt-panel .algt-orders-table thead {
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        padding: 0;
        overflow: hidden;
        clip: rect(0 0 0 0);
        clip-path: inset(50%);
        white-space: nowrap;
        border: 0;
    }

    .algt-panel .algt-orders-table tbody tr {
        margin-bottom: var(--algt-space-3);
        padding: var(--algt-space-3);

        background: var(--algt-surface);
        border: 1px solid var(--algt-border);
        border-radius: var(--algt-r-sm);
    }

    .algt-panel .algt-orders-table tbody th,
    .algt-panel .algt-orders-table tbody td {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: var(--algt-space-3);

        padding: var(--algt-space-2) 0;
        border-bottom: 0;
        text-align: right;
    }

    .algt-panel .algt-orders-table tbody th::before,
    .algt-panel .algt-orders-table tbody td::before {
        content: attr(data-label);

        flex: 0 0 auto;
        color: var(--algt-text-3);
        font-size: var(--algt-fs-xs);
        font-weight: 600;
        text-align: left;
        text-transform: uppercase;
        letter-spacing: .06em;
    }

    /* La fila de acciones no lleva rótulo: los dos botones se explican solos y
       la palabra «Acciones» delante solo les roba el ancho que necesitan. */
    .algt-panel .algt-orders-actions::before {
        content: none;
    }

    .algt-panel .algt-orders-actions {
        justify-content: stretch;
        margin-top: var(--algt-space-2);
        padding-top: var(--algt-space-3);
        border-top: 1px solid var(--algt-border);
    }

    .algt-panel .algt-orders-actions .algt-btn {
        flex: 1 1 auto;
        text-align: center;
    }

    /* El pie de totales conserva su forma de dos columnas: son pares
       etiqueta/valor, que es exactamente lo que ya es una fila derrumbada. */
    .algt-panel .algt-orders-table tfoot tr {
        display: flex;
        align-items: baseline;
        justify-content: space-between;
        gap: var(--algt-space-3);
        padding: var(--algt-space-1) 0;
    }
}

/* ── ≤480px: móvil en vertical ────────────────────────────────────────── */
@media (max-width: 480px) {
    .algt-panel-section,
    .algt-panel-header {
        padding: var(--algt-space-3);
        border-radius: var(--algt-r-sm);
    }

    .algt-panel-title {
        font-size: var(--algt-fs-lg);
    }

    /* Los días restantes se van. El punto medio separador vive DENTRO de este
       mismo <span> justo para esto (ver panel-shell.php): ocultarlo no deja un
       «·» huérfano al final de «Vigente hasta el 3 de septiembre de 2026». El
       dato no se pierde: la tarjeta héroe de Inicio lo sigue mostrando. */
    .algt-panel-membership-days {
        display: none;
    }

    /* Perfil y desplegables de soporte, a una columna: dos campos de 140px no
       son un formulario. */
    .algt-profile-grid,
    .algt-support-row {
        grid-template-columns: minmax(0, 1fr);
    }

    .algt-hero-plan-value,
    .algt-hero-date-value {
        font-size: var(--algt-fs-base);
    }

    .algt-home-card-value {
        font-size: var(--algt-fs-xl);
    }

    /* La cabecera de Soporte apila el contador bajo el título: en línea, el
       «N / M abiertos» empuja el <h3> y lo parte por la mitad. */
    .algt-support-header {
        flex-direction: column;
        align-items: flex-start;
    }

    /* Fecha e IP bajan a su propia línea en vez de competir por el ancho. */
    .algt-access-item {
        flex-direction: column;
        align-items: flex-start;
    }

    /* El paginador en columna. En fila con `flex-wrap` los tres elementos
       reparten mal el sobrante y queda «[anteriores] [Página 2]» arriba y
       «[siguientes]» descolgado debajo, alineado a la izquierda: parece que la
       navegación se rompió. En columna el orden del DOM —anterior, página,
       siguiente— se lee tal cual, y `stretch` da a los dos botones todo el ancho,
       que en táctil es lo que se quiere de todas formas.
       `margin: 0 auto` del estado se anula: en columna centraría en horizontal y
       el número quedaría flotando en medio en vez de alineado con los botones. */
    .algt-notices-pager {
        flex-direction: column;
        align-items: stretch;
    }

    .algt-panel .algt-notices-pager-status {
        margin: 0;
    }

    /* Los dos botones del hilo («Volver» y «Cerrar ticket») a todo el ancho: en
       360px, dos botones de 36px de alto uno junto a otro dejan objetivos
       táctiles de menos de 100px con el texto cortado. */
    .algt-support-thread-actions {
        width: 100%;
    }

    .algt-panel .algt-support-back,
    .algt-panel .algt-support-close {
        flex: 1 1 auto;
    }
}


/* -------------------------------------------------------------------------
   15.16 AJUSTES DE MODO OSCURO DEL PANEL
   -------------------------------------------------------------------------
   CASI TODO EL PANEL YA ESTÁ EN OSCURO SIN ESCRIBIR UNA LÍNEA AQUÍ, y no por
   suerte: §15 no contiene ni un hex ni un rgba(), así que las 13 variables que
   §2 reescribe arrastran consigo cada superficie, cada borde, cada píldora, la
   tira de pestañas (incluida la inversión del globo del contador, que se escribe
   con --algt-accent y --algt-text-on-accent al revés), las burbujas y la flecha
   del <select> (que es un token justo por esto).

   Queda UNA cosa que el intercambio de tokens no puede resolver: en oscuro las
   sombras dejan de separar —negro sobre negro no se ve, como ya documenta §2— y
   toda la jerarquía de elevación recae en el borde. Las cinco cajas de nivel 2
   del panel (§15) se apoyaban en un borde de 1px MÁS la sombra de su contenedor;
   sin la sombra, con --algt-border (#2A2A31) sobre --algt-surface (#141417) el
   contorno queda en 1.3:1 y las tarjetas se funden en una mancha. Se sube a
   --algt-border-strong (#3A3A44, 2.1:1), que es la línea que este sistema
   reserva para «esto es una caja con la que se interactúa».

   ⚠ POR QUÉ AQUÍ NO SE USA EL ATAJO `border-color`, QUE ERA LO OBVIO.
   Tres de estas cajas llevan un FILETE DE ESTADO en un canto: el héroe de
   membresía (verde / ámbar / rojo según el estado), el aviso sin leer (ámbar) y
   las burbujas del hilo (acento a la izquierda el equipo, neutro a la derecha el
   cliente). `border-color` es un atajo de los CUATRO lados, y estos selectores
   puntúan 0-2-0 o 0-3-0 contra los 0-1-0 de `.algt-hero-active`,
   `.algt-notice-unread` y `.algt-support-bubble-admin`: en modo oscuro el atajo
   les repintaría el filete de gris y se perderían de golpe los cinco estados de
   la membresía, la marca de «sin leer» y la distinción equipo/cliente. La
   especificidad gana sin importar el orden, así que no basta con mover el
   bloque. Por eso las cajas con filete solo reciben los lados NEUTROS, por
   longhand, y el canto de color se queda como estaba.

   `.algt-support-item` (las filas de la lista de tickets) se queda FUERA de este
   bloque a propósito y no por olvido: tiene el mismo filete —transparente en
   reposo, de acento cuando es el hilo abierto— y además vive sobre --algt-bg,
   que en oscuro es casi negro, así que su borde ya contrasta lo suficiente sin
   ayuda.

   LOS DOS BLOQUES, con la misma forma exacta que §2 y por el mismo motivo:
     · el media query lleva `:not([data-algt-theme="light"])` para que forzar el
       tema claro gane al sistema operativo;
     · el selector de atributo permite forzar oscuro esté como esté el SO.
   Sin las dos piezas, el interruptor solo mandaría en una dirección.
   ------------------------------------------------------------------------- */

@media (prefers-color-scheme: dark) {

    /* Cajas sin filete: los cuatro lados de una vez. */
    :root:not([data-algt-theme="light"]) .algt-panel-header,
    :root:not([data-algt-theme="light"]) .algt-panel-tabs-wrap,
    :root:not([data-algt-theme="light"]) .algt-panel-section,
    :root:not([data-algt-theme="light"]) .algt-home-card,
    :root:not([data-algt-theme="light"]) .algt-account-block,
    :root:not([data-algt-theme="light"]) .algt-support-card,
    :root:not([data-algt-theme="light"]) .algt-support-thread,
    :root:not([data-algt-theme="light"]) .algt-table-wrap {
        border-color: var(--algt-border-strong);
    }

    /* Héroe y aviso: filete a la IZQUIERDA, así que se refuerzan los otros tres. */
    :root:not([data-algt-theme="light"]) .algt-hero-card,
    :root:not([data-algt-theme="light"]) .algt-notice {
        border-top-color: var(--algt-border-strong);
        border-right-color: var(--algt-border-strong);
        border-bottom-color: var(--algt-border-strong);
    }

    /* Burbujas: cada variante tiene el filete en un lado distinto, así que en
       la base solo se tocan arriba y abajo. */
    :root:not([data-algt-theme="light"]) .algt-support-bubble {
        border-top-color: var(--algt-border-strong);
        border-bottom-color: var(--algt-border-strong);
    }

    :root:not([data-algt-theme="light"]) .algt-support-bubble-admin {
        border-right-color: var(--algt-border-strong);
    }

    :root:not([data-algt-theme="light"]) .algt-support-bubble-user {
        border-left-color: var(--algt-border-strong);
    }

    /* El bloque de «Cerrar sesión» no es una caja (lleva `border: 0`): queda
       fuera del refuerzo para que no le nazca un contorno en oscuro. */
    :root:not([data-algt-theme="light"]) .algt-account-logout {
        border-color: transparent;
    }
}

:root[data-algt-theme="dark"] .algt-panel-header,
:root[data-algt-theme="dark"] .algt-panel-tabs-wrap,
:root[data-algt-theme="dark"] .algt-panel-section,
:root[data-algt-theme="dark"] .algt-home-card,
:root[data-algt-theme="dark"] .algt-account-block,
:root[data-algt-theme="dark"] .algt-support-card,
:root[data-algt-theme="dark"] .algt-support-thread,
:root[data-algt-theme="dark"] .algt-table-wrap {
    border-color: var(--algt-border-strong);
}

:root[data-algt-theme="dark"] .algt-hero-card,
:root[data-algt-theme="dark"] .algt-notice {
    border-top-color: var(--algt-border-strong);
    border-right-color: var(--algt-border-strong);
    border-bottom-color: var(--algt-border-strong);
}

:root[data-algt-theme="dark"] .algt-support-bubble {
    border-top-color: var(--algt-border-strong);
    border-bottom-color: var(--algt-border-strong);
}

:root[data-algt-theme="dark"] .algt-support-bubble-admin {
    border-right-color: var(--algt-border-strong);
}

:root[data-algt-theme="dark"] .algt-support-bubble-user {
    border-left-color: var(--algt-border-strong);
}

:root[data-algt-theme="dark"] .algt-account-logout {
    border-color: transparent;
}


/* -------------------------------------------------------------------------
   15.17 MECANISMO DE OCULTACIÓN DEL PANEL
   -------------------------------------------------------------------------
   Cuatro nodos del panel se ocultan con el ATRIBUTO hidden y no con
   `style="display:none"`: las DOS flechas de la tira (que revela el JS solo si
   el carril desborda), `#algt-support-message` (la caja aria-live, que se
   descubre y se vuelve a tapar, nunca se recrea, o el lector deja de anunciar)
   y el botón «Volver» del hilo (que solo sirve con JS).

   Y esta hoja SÍ les pone `display`: `.algt-panel .algt-btn` y
   `.algt-panel .algt-tabs-arrow` declaran `inline-flex`. Sin esta regla, las dos
   flechas aparecerían siempre y el botón «Volver» estaría visible sin JS, que es
   justo lo que el markup evita.

   EL ATRIBUTO VA REPETIDO A PROPÓSITO, igual que en §13: `[hidden][hidden]`
   puntúa 0-3-0 y gana a cualquier regla de este bloque (todas 0-2-0 bajo el
   scope) sin subir a «bang-important». Va al final del fichero para ganar
   también por orden de fuente.
   ------------------------------------------------------------------------- */

.algt-panel [hidden][hidden],
.algt-panel[hidden] {
    display: none;
}


/* -------------------------------------------------------------------------
   15.18 ALTO CONTRASTE FORZADO — PANEL
   -------------------------------------------------------------------------
   Mismo problema que en §14: con contraste forzado el navegador descarta
   `box-shadow` y las variables de color, y todo el indicador de foco de este
   bloque desaparecería de golpe. Se restituye con `outline` del color del
   sistema, que sí sobrevive.

   Los dos contenedores con `tabindex` van incluidos: reciben el foco por
   programa desde el JS y son precisamente los que más falta hacen aquí.
   ------------------------------------------------------------------------- */

@media (forced-colors: active) {
    .algt-panel .algt-btn:focus-visible,
    .algt-panel .algt-input:focus,
    .algt-panel .algt-auth-link:focus-visible,
    .algt-panel .algt-tab:focus-visible,
    .algt-panel .algt-tabs-arrow:focus-visible,
    .algt-panel .algt-panel-content:focus-visible,
    .algt-panel a.algt-home-card:focus-visible,
    .algt-panel .algt-support-item:focus-visible,
    .algt-panel .algt-support-detail:focus-visible,
    .algt-panel .algt-support-thread:focus-visible,
    .algt-panel .algt-bot-switch:focus-visible,
    .algt-panel .algt-password-toggle:focus-visible,
    .algt-panel .algt-check:focus-visible,
    .algt-home-announcement a:focus-visible,
    .algt-notice-body a:focus-visible,
    .algt-support-bubble-body a:focus-visible {
        outline: 2px solid CanvasText;
        outline-offset: 2px;
    }

    /* El interruptor del bot pierde en contraste forzado lo único que distingue
       «activo» de «pausado» a simple vista: el verde de la pista. La etiqueta
       («Activo» / «Pausado») sigue diciéndolo —por eso el color nunca viaja
       solo—, pero conservar el matiz cuesta una declaración. Lo mismo con los
       puntos del carril de fases, que son tres áreas de color puro. */
    .algt-panel .algt-bot-switch-track,
    .algt-panel .algt-bot-phase-dot {
        forced-color-adjust: none;
    }

    /* Los puntos de las píldoras y el filete de estado de las tarjetas son
       áreas de color puro: sin `forced-color-adjust: none` el sistema los
       repinta con su propio color y los cinco tonos pasan a ser el mismo.
       La ETIQUETA de texto sigue diciendo cuál es cada uno —esa es la razón por
       la que el color nunca viaja solo—, pero conservar el matiz cuesta una
       declaración y ayuda a quien usa contraste forzado por fatiga visual, no
       por daltonismo. */
    .algt-panel .algt-pill-dot {
        forced-color-adjust: none;
    }

    /* La pestaña activa pierde su fondo negro en contraste forzado (el sistema
       impone sus propios colores) y quedaría indistinguible de las otras cuatro.
       El subrayado grueso la marca con una propiedad que el modo respeta. */
    .algt-tab-active,
    .algt-tab[aria-selected="true"] {
        text-decoration: underline;
        text-decoration-thickness: 2px;
        text-underline-offset: 3px;
    }
}
