/* Facturación OK — reset y fundamentos */

* {
    box-sizing: border-box;
}

/* El atributo hidden debe ganar siempre, aunque el elemento tenga una clase
   (p.ej. .campo { display: flex }) con la misma especificidad que la regla
   por defecto del navegador [hidden]{display:none} — si no, el orden de
   carga de las hojas de estilo puede dejar el hidden sin efecto. */
[hidden] {
    display: none !important;
}

html {
    scrollbar-gutter: stable;
}

html,
body {
    width: 100%;
    max-width: 100%;
    overflow-x: hidden;
    height: 100%;
}

body {
    margin: 0;
    background: var(--fondo-pagina);
    color: var(--texto-principal);
    font-family: -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
    font-size: 15px;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
    min-height: 100dvh;
}

h1,
h2,
h3 {
    font-weight: 700;
    text-wrap: balance;
    margin: 0;
    letter-spacing: -0.01em;
}

img,
svg,
video,
canvas {
    max-width: 100%;
    height: auto;
}

a {
    color: inherit;
}

button {
    font-family: inherit;
}

.num {
    font-variant-numeric: tabular-nums;
}

:focus-visible {
    outline: 2px solid var(--primario);
    outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
    * {
        transition: none !important;
        animation: none !important;
    }
}

/* Icono de ayuda progresivo con tooltip */
.ayuda {
    display: inline-grid;
    place-items: center;
    width: 17px;
    height: 17px;
    border-radius: 50%;
    border: 1.3px solid var(--texto-tenue);
    color: var(--texto-tenue);
    font-size: 0.68rem;
    font-weight: 700;
    cursor: help;
    flex-shrink: 0;
    position: relative;
}

.ayuda:hover,
.ayuda:focus-visible {
    border-color: var(--primario);
    color: var(--primario);
}

.ayuda .globo {
    display: none;
    position: fixed;
    background: var(--texto-principal);
    color: var(--fondo-superficie);
    font-size: 0.76rem;
    font-weight: 500;
    line-height: 1.4;
    padding: 8px 11px;
    border-radius: 7px;
    width: max-content;
    max-width: 230px;
    box-shadow: var(--sombra-md);
    z-index: 50;
    text-align: left;
    white-space: normal;
}

.ayuda:hover .globo,
.ayuda:focus-visible .globo {
    display: block;
}

/* Botones */
.boton {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 17px;
    border-radius: 9px;
    border: 1px solid var(--borde);
    background: var(--fondo-superficie);
    color: var(--texto-principal);
    font-size: 0.88rem;
    font-weight: 600;
    cursor: pointer;
    white-space: nowrap;
    text-decoration: none;
    transition: background .12s ease, border-color .12s ease;
}

.boton:hover {
    background: var(--fondo-hundido);
}

.boton-primario {
    background: var(--primario);
    border-color: var(--primario);
    color: #fff;
}

.boton-primario:hover {
    background: var(--primario-hover);
    border-color: var(--primario-hover);
}

.boton-peligro {
    background: var(--peligro);
    border-color: var(--peligro);
    color: #fff;
}

.boton-peligro:hover {
    filter: brightness(0.9);
}

/* Etiquetas de estado (chips) */
.etiqueta-estado {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 999px;
    font-size: 0.76rem;
    font-weight: 700;
}

.etiqueta-estado::before {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 50%;
}

/* Variante sin el punto de color delante — para usarla como icono de sí/no
   (✓/✗) donde el punto queda redundante y se ve como una manchita. */
.etiqueta-estado.sin-punto::before {
    content: none;
}

/* Variante clicable: mismo aspecto de chip, pero como <button>, sin el
   estilo nativo del navegador. */
.etiqueta-estado.etiqueta-boton {
    border: none;
    cursor: pointer;
    font-family: inherit;
}

.etiqueta-estado.etiqueta-boton:hover {
    filter: brightness(0.95);
}

.etiqueta-estado.exito {
    background: var(--exito-fondo);
    color: var(--exito);
}

.etiqueta-estado.exito::before {
    background: var(--exito);
}

.etiqueta-estado.aviso {
    background: var(--aviso-fondo);
    color: var(--aviso);
}

.etiqueta-estado.aviso::before {
    background: var(--aviso);
}

.etiqueta-estado.peligro {
    background: var(--peligro-fondo);
    color: var(--peligro);
}

.etiqueta-estado.peligro::before {
    background: var(--peligro);
}

.etiqueta-estado.info {
    background: var(--primario-claro);
    color: var(--primario);
}

.etiqueta-estado.info::before {
    background: var(--primario);
}

.etiqueta-estado.neutro {
    background: var(--fondo-hundido);
    color: var(--texto-atenuado);
}

.etiqueta-estado.neutro::before {
    background: var(--texto-atenuado);
}

.envoltorio-contrasena {
    position: relative;
    display: block;
}

.campo .envoltorio-contrasena input {
    width: 100%;
    padding-right: 40px;
}

.boton-ojo-contrasena {
    position: absolute;
    right: 6px;
    top: 50%;
    transform: translateY(-50%);
    background: none;
    border: none;
    padding: 6px;
    margin: 0;
    cursor: pointer;
    color: var(--texto-tenue);
    display: grid;
    place-items: center;
    border-radius: 6px;
}

.boton-ojo-contrasena:hover {
    color: var(--primario);
    background: var(--fondo-hundido);
}

/* Página 403 autónoma (helpers/respuesta_acceso.php): se sirve sin el layout
   normal porque puede dispararse antes de que la vista prepare sus datos. */
.pagina-acceso-denegado {
    padding: 40px 20px;
}

.panel-acceso-denegado {
    max-width: 560px;
    margin: 0 auto;
    padding: 28px 30px;
}

.panel-acceso-denegado h1 {
    font-size: 1.25rem;
    margin: 0 0 12px;
}

.panel-acceso-denegado p {
    margin: 0 0 16px;
    color: var(--texto-atenuado);
}

/* Indicador de usuarios conectados (solo superadmin, cabecera). Verde si
   hay alguien más conectado: no es buen momento para desplegar. */
/* Doble clase: .boton-icono-barra (layout.css, que carga después) es una
   rejilla de 38x38 que apilaba el número debajo del icono. */
.boton-icono-barra.boton-conectados {
    display: inline-flex;
    flex-direction: row;
    align-items: center;
    justify-content: center;
    gap: 5px;
    width: auto;
    min-width: 38px;
    padding: 0 9px;
    white-space: nowrap;
}

.contador-conectados {
    line-height: 1;
    font-size: 0.85rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

.boton-conectados.hay-otros-conectados {
    color: var(--exito);
    background: var(--exito-fondo);
}

.fila-conectado {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    padding: 10px 12px;
    border-bottom: 1px solid var(--borde);
}

.fila-conectado:last-child {
    border-bottom: none;
}

.punto-conectado {
    flex: none;
    width: 10px;
    height: 10px;
    margin-top: 4px;
    border-radius: 50%;
}

.punto-conectado.activo {
    background: var(--exito);
}

.punto-conectado.inactivo {
    background: var(--aviso);
}

.datos-conectado {
    display: grid;
    gap: 2px;
    min-width: 0;
    font-size: 0.82rem;
}

.datos-conectado span {
    color: var(--texto-tenue);
    overflow-wrap: anywhere;
}

/* Avisos (toast) globales — js/avisos.js. Abajo a la derecha; en móvil
   ocupan el ancho. Los colores salen de las variables, así que siguen el
   modo noche. */
.contenedor-avisos {
    position: fixed;
    right: 20px;
    bottom: 20px;
    z-index: 1000;
    display: flex;
    flex-direction: column;
    gap: 8px;
    width: min(380px, calc(100vw - 32px));
    pointer-events: none;
}

/* Aviso emergente (toast). Se excluye .etiqueta-estado: las insignias de
   estado usan también la clase "aviso" (color ámbar) y heredaban de aquí
   relleno, borde izquierdo y sombra, con lo que Emitida/Enviada salían
   como cajas en vez de píldoras. */
.aviso:not(.etiqueta-estado) {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 16px;
    border: 1px solid var(--borde);
    border-left-width: 4px;
    border-radius: var(--radio);
    background: var(--fondo-superficie);
    color: var(--texto-principal);
    box-shadow: var(--sombra-md);
    font-size: 0.92rem;
    cursor: pointer;
    pointer-events: auto;
    animation: aviso-entrada 0.2s ease-out;
}

.aviso-exito {
    border-left-color: var(--exito);
}

.aviso-aviso {
    border-left-color: var(--aviso);
}

.aviso-error {
    border-left-color: var(--peligro);
}

.aviso-icono {
    flex: none;
    font-weight: 700;
}

.aviso-exito .aviso-icono {
    color: var(--exito);
}

.aviso-aviso .aviso-icono {
    color: var(--aviso);
}

.aviso-error .aviso-icono {
    color: var(--peligro);
}

.aviso-saliendo {
    opacity: 0;
    transition: opacity 0.2s;
}

@keyframes aviso-entrada {
    from {
        opacity: 0;
        transform: translateY(8px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@media (max-width: 575px) {
    .contenedor-avisos {
        right: 16px;
        bottom: 16px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .aviso {
        animation: none;
    }
}

/* Texto escrito vs. texto de ejemplo (placeholder): lo escrito va en el color
   principal y el ejemplo en un gris más claro y en cursiva, para distinguirlos
   a primera vista en toda la aplicación (modo claro y noche). */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="file"]),
textarea,
select {
    color: var(--texto-principal);
}

input::placeholder,
textarea::placeholder {
    color: var(--texto-tenue);
    opacity: 1;
    font-style: italic;
}

/* Lo escrito, en semi-negrita: se distingue del ejemplo aunque el contraste de color sea poco en modo claro. */
input:not(:placeholder-shown):not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="file"]):not([type="button"]):not([type="submit"]),
textarea:not(:placeholder-shown) {
    font-weight: 500;
}
