/* ==========================================================================
   style.css — Sistema de Control de Insumos · Alcaldía de San Salvador Sur
   Complementa a Tailwind: variables de marca, scrollbars, transiciones
   y utilidades que se repiten en todas las vistas.
   ========================================================================== */

/* Medidas del armazón. Los COLORES ya no viven aquí: los escribe
   core/tema-store.js como variables --sci-* sobre <html>, a partir del tema,
   el modo y el estilo de armazón que haya elegido cada usuario.

   Antes había un --brand-500 fijo en este archivo. Mientras existió, el color
   del foco era el mismo con cualquier tema, porque este valor no se enteraba
   de nada. */
:root {
    --radio-tarjeta: 16px;
    --ancho-sidebar: 290px;
    --ancho-sidebar-min: 90px;
    --alto-topbar: 68px;
}

/* El fondo y el color de texto de la página siguen al modo. Sin esto, el
   <body> se queda con el bg-gray-50 de la plantilla y el modo oscuro deja una
   franja clara asomando por debajo del contenido. */
body {
    background-color: rgb(var(--sci-fondo, 238 241 247));
    color: rgb(var(--sci-texto-2, 71 84 103));
}

* {
    -webkit-tap-highlight-color: transparent;
}

html {
    scroll-behavior: smooth;
}

body {
    margin: 0;
    min-height: 100vh;
    text-rendering: optimizeLegibility;
}

/* ── Scrollbars discretos ───────────────────────────────────────────────── */

.scrollbar-fino::-webkit-scrollbar {
    width: 6px;
    height: 6px;
}

.scrollbar-fino::-webkit-scrollbar-track {
    background: transparent;
}

.scrollbar-fino::-webkit-scrollbar-thumb {
    background: rgb(var(--sci-texto-3, 152 162 179) / 0.45);
    border-radius: 999px;
}

.scrollbar-fino::-webkit-scrollbar-thumb:hover {
    background: rgb(var(--sci-texto-3, 152 162 179) / 0.75);
}

/* En oscuro no hace falta una regla aparte: --sci-texto-3 ya cambia con el
   modo, así que el pulgar se aclara solo. */

.sin-scrollbar::-webkit-scrollbar {
    display: none;
}

.sin-scrollbar {
    -ms-overflow-style: none;
    scrollbar-width: none;
}

/* ── Transiciones de vista ──────────────────────────────────────────────── */

.vista-enter-active,
.vista-leave-active {
    transition: opacity 0.18s ease, transform 0.18s ease;
}

.vista-enter-from {
    opacity: 0;
    transform: translateY(6px);
}

.vista-leave-to {
    opacity: 0;
    transform: translateY(-4px);
}

.modal-enter-active,
.modal-leave-active {
    transition: opacity 0.15s ease;
}

.modal-enter-from,
.modal-leave-to {
    opacity: 0;
}

.panel-enter-active {
    transition: opacity 0.18s ease, transform 0.18s ease;
}

.panel-enter-from {
    opacity: 0;
    transform: scale(0.97) translateY(8px);
}

.panel-leave-active {
    transition: opacity 0.12s ease;
}

.panel-leave-to {
    opacity: 0;
}

/* ── Formularios: estados consistentes ─────────────────────────────────── */

input[type="date"]::-webkit-calendar-picker-indicator {
    cursor: pointer;
    opacity: 0.55;
}

.dark input[type="date"]::-webkit-calendar-picker-indicator {
    filter: invert(1);
    opacity: 0.5;
}

input:disabled,
select:disabled,
textarea:disabled {
    cursor: not-allowed;
    opacity: 0.6;
}

/* Oculta las flechas de los input numéricos */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
    margin: 0;
    -webkit-appearance: none;
}

input[type="number"] {
    -moz-appearance: textfield;
}

/* ── Carga: esqueleto con brillo ────────────────────────────────────────── */

.esqueleto {
    position: relative;
    overflow: hidden;
    background: rgb(var(--sci-superficie-2, 242 244 247));
}

.esqueleto::after {
    position: absolute;
    inset: 0;
    content: "";
    background: linear-gradient(90deg, transparent, rgb(255 255 255 / 0.55), transparent);
    transform: translateX(-100%);
    animation: brillo 1.4s infinite;
}

.dark .esqueleto::after {
    background: linear-gradient(90deg, transparent, rgb(255 255 255 / 0.06), transparent);
}

@keyframes brillo {
    100% {
        transform: translateX(100%);
    }
}

/* ── Utilidades puntuales ───────────────────────────────────────────────── */

/* Cifras: monoespaciada y de ancho fijo, para que los montos y los saldos
   queden alineados en columna y se lean de un vistazo. */
.numeros-tabulares {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.01em;
}

.recorte-2 {
    display: -webkit-box;
    overflow: hidden;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
}

/* Foco visible y accesible en todo elemento interactivo */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
    outline: 2px solid rgb(var(--sci-marca-solido, 0 27 160));
    outline-offset: 2px;
}

/* ── Impresión: solo el contenido ───────────────────────────────────────── */

@media print {

    aside,
    header,
    .no-imprimir {
        display: none !important;
    }

    main {
        overflow: visible !important;
        padding: 0 !important;
    }
}

/* ── Desfase de las manchas del acceso ──────────────────────────────────────
   Las tres manchas del panel de marca comparten la misma animación `blob`. Sin
   desfase arrancan a la vez y se mueven en bloque, que se lee como un solo
   fondo temblando en lugar de tres luces sueltas.

   Va aquí y no como `[animation-delay:2s]` en la plantilla: la CSP del sistema
   prohíbe estilos en línea, y una propiedad arbitraria de Tailwind depende de
   que el generador la reconozca. Una clase de dos líneas no depende de nada.
   ────────────────────────────────────────────────────────────────────────── */

.retraso-2s { animation-delay: 2s; }
.retraso-4s { animation-delay: 4s; }

/* Quien pidió menos movimiento en su sistema operativo no ve las manchas
   moverse. El panel se queda quieto y con el mismo aspecto. */
@media (prefers-reduced-motion: reduce) {
    .animate-blob { animation: none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   COMPONENTES DEL SISTEMA DE DISEÑO
   ══════════════════════════════════════════════════════════════════════════

   Al estilo de TailAdmin: superficies planas, borde de 1 px, esquinas
   generosas y sombras casi imperceptibles. El relieve lo da el borde y el
   contraste entre capas, no la sombra.

   POR QUÉ EXISTEN, SI YA HAY UTILIDADES
   Una tarjeta escrita a mano son once clases —«rounded-2xl border
   border-gray-200 bg-white shadow-theme-xs dark:border-gray-800
   dark:bg-gray-900»— repetidas en dieciocho vistas. Cambiar el radio de las
   esquinas obligaba a buscar y reemplazar en todas, y la que se escapaba no
   avisaba: simplemente se quedaba distinta.

   NINGUNO LLEVA VARIANTES dark:. No hacen falta: los colores salen de las
   variables --sci-*, que ya cambian con el modo.

   UNA UTILIDAD SIEMPRE GANA A UN COMPONENTE, porque el <style> del CDN de
   Tailwind se declara después de este archivo (ver el comentario largo de
   templates/index.html). Así "btn btn-primario w-full" hace lo que parece, y
   "tarjeta bg-exito-50" también.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Tarjetas ───────────────────────────────────────────────────────────── */

.tarjeta {
    /*
     * UNA TARJETA NUNCA ESTIRA A SU CONTENEDOR.
     *
     * Sin esto, una tarjeta dentro de una rejilla o un flex se dimensiona por
     * su contenido: `min-width` vale `auto` por defecto, así que una gráfica o
     * una tabla ancha empuja la columna, la columna empuja la rejilla y la
     * página entera se sale de la pantalla del teléfono.
     *
     * Se veía como gráficas más anchas que el móvil, con las leyendas
     * cortadas. Taparlo con `overflow-x-hidden` en el contenedor solo esconde
     * la barra de desplazamiento: el contenido sigue fuera y sin poder verse.
     * Lo que hay que decir es que la tarjeta SÍ puede encogerse.
     */
    min-width: 0;
    background-color: rgb(var(--sci-superficie, 252 252 253));
    border: 1px solid rgb(var(--sci-borde-suave, 228 231 236));
    border-radius: var(--radio-tarjeta);
    box-shadow: var(--sci-sombra-xs, 0 1px 2px 0 rgba(16, 24, 40, 0.05));
}

.tarjeta-interactiva {
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
}

.tarjeta-interactiva:hover {
    border-color: rgb(var(--sci-marca-300, 115 138 249));
    box-shadow: var(--sci-sombra-md, 0 4px 8px -2px rgba(16, 24, 40, 0.10));
}

/* ── Botones ────────────────────────────────────────────────────────────── */

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    font-weight: 500;
    font-size: 0.875rem;
    line-height: 1.25rem;
    height: 2.75rem;
    padding: 0 1rem;
    border-radius: 0.5rem;
    border: 1px solid transparent;
    cursor: pointer;
    white-space: nowrap;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.btn:focus-visible {
    outline: none;
    box-shadow: 0 0 0 4px rgb(var(--sci-marca-solido, 0 27 160) / 0.14);
}

.btn:disabled {
    opacity: 0.7;
    cursor: not-allowed;
}

.btn-primario {
    background-color: rgb(var(--sci-marca-solido, 0 27 160));
    color: rgb(var(--sci-marca-contraste, 255 255 255));
}

.btn-primario:not(:disabled):hover {
    background-color: rgb(var(--sci-marca-solido-2, 0 21 125));
}

.btn-suave {
    background-color: rgb(var(--sci-marca-50, 236 239 251));
    color: rgb(var(--sci-marca-solido, 0 27 160));
    border-color: rgb(var(--sci-marca-100, 211 218 250));
}

.btn-suave:not(:disabled):hover {
    background-color: rgb(var(--sci-marca-100, 211 218 250));
}

.btn-contorno {
    background-color: transparent;
    color: rgb(var(--sci-texto-2, 71 84 103));
    border-color: rgb(var(--sci-borde, 208 213 221));
}

.btn-contorno:not(:disabled):hover {
    background-color: rgb(var(--sci-superficie-2, 242 244 247));
    color: rgb(var(--sci-texto, 16 24 40));
}

.btn-peligro {
    background-color: rgb(var(--sci-peligro-500, 240 68 56));
    color: #fff;
}

.btn-peligro:not(:disabled):hover {
    background-color: rgb(var(--sci-peligro-600, 217 45 32));
}

/* ── Campos ─────────────────────────────────────────────────────────────── */

.campo {
    width: 100%;
    height: 2.75rem;
    background-color: rgb(var(--sci-campo, 255 255 255));
    border: 1px solid rgb(var(--sci-borde, 208 213 221));
    border-radius: 0.5rem;
    padding: 0 0.875rem;
    font-size: 0.875rem;
    color: rgb(var(--sci-texto, 16 24 40));
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

/* UN <select> NUNCA MÁS ANCHO QUE SU HUECO.
   Un select se dimensiona por su opción MÁS LARGA, y las de artículo llevan el
   nombre completo con su presentación. En un teléfono estrecho eso empuja la
   página entera de lado.

   min-width: 0 es la mitad importante: dentro de un contenedor flex, un hijo
   no baja de su tamaño de contenido por mucho max-width que lleve. */
select.campo {
    max-width: 100%;
    min-width: 0;
    text-overflow: ellipsis;
}

textarea.campo {
    height: auto;
    padding: 0.625rem 0.875rem;
}

.campo::placeholder {
    color: rgb(var(--sci-texto-3, 152 162 179));
}

.campo:focus {
    outline: none;
    border-color: rgb(var(--sci-marca-300, 115 138 249));
    box-shadow: 0 0 0 4px rgb(var(--sci-marca-solido, 0 27 160) / 0.12);
}

.campo:disabled {
    background-color: rgb(var(--sci-superficie-2, 242 244 247));
    opacity: 0.7;
    cursor: not-allowed;
}

.etiqueta {
    display: block;
    margin-bottom: 0.375rem;
    font-size: 0.8125rem;
    font-weight: 500;
    color: rgb(var(--sci-texto-2, 71 84 103));
}

/* ── Distintivos ────────────────────────────────────────────────────────── */

.chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.1875rem 0.5rem;
    border-radius: 9999px;
    font-size: 0.75rem;
    font-weight: 500;
    line-height: 1.125rem;
}

.chip-exito   { background: rgb(var(--sci-exito-500, 18 183 106) / 0.12);  color: rgb(var(--sci-exito-700, 2 122 72)); }
.chip-alerta  { background: rgb(var(--sci-alerta-500, 247 144 9) / 0.14);  color: rgb(var(--sci-alerta-700, 181 71 8)); }
.chip-peligro { background: rgb(var(--sci-peligro-500, 240 68 56) / 0.12); color: rgb(var(--sci-peligro-700, 180 35 24)); }
.chip-info    { background: rgb(var(--sci-info-500, 11 165 236) / 0.12);   color: rgb(var(--sci-info-700, 2 106 162)); }
.chip-marca   { background: rgb(var(--sci-marca-solido, 0 27 160) / 0.12); color: rgb(var(--sci-marca-solido, 0 27 160)); }
.chip-neutro  { background: rgb(var(--sci-superficie-3, 228 231 236));     color: rgb(var(--sci-texto-2, 71 84 103)); }

/* En oscuro los tonos 700 se hunden sobre un fondo ya oscuro; se sube al 500,
   que sí contrasta. Es la única regla de estos componentes que necesita saber
   en qué modo está, porque aquí el color es del texto y no de la superficie. */
.dark .chip-exito   { color: rgb(var(--sci-exito-500, 18 183 106)); }
.dark .chip-alerta  { color: rgb(var(--sci-alerta-500, 247 144 9)); }
.dark .chip-peligro { color: rgb(var(--sci-peligro-500, 240 68 56)); }
.dark .chip-info    { color: rgb(var(--sci-info-500, 11 165 236)); }
.dark .chip-marca   { color: rgb(var(--sci-marca-300, 115 138 249)); }

/* ── Tablas ─────────────────────────────────────────────────────────────── */

.tabla {
    width: 100%;
    text-align: left;
    font-size: 0.875rem;
    border-collapse: collapse;
}

.tabla thead th {
    background-color: rgb(var(--sci-superficie-2, 242 244 247));
    color: rgb(var(--sci-texto-2, 71 84 103));
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    padding: 0.75rem 1rem;
    white-space: nowrap;
}

.tabla tbody td {
    padding: 0.75rem 1rem;
    border-top: 1px solid rgb(var(--sci-borde-suave, 228 231 236));
}

.tabla tbody tr:hover {
    background-color: rgb(var(--sci-superficie-2, 242 244 247) / 0.6);
}

/* ══════════════════════════════════════════════════════════════════════════
   NAVEGACIÓN DEL TELÉFONO
   ══════════════════════════════════════════════════════════════════════════ */

/* EL HUECO DEL INDICADOR DE INICIO
   En un iPhone sin botón, los últimos ~34 px de la pantalla los ocupa la barra
   del sistema. Sin env(safe-area-inset-bottom) los rótulos quedan debajo y no
   se pueden tocar. Hace falta viewport-fit=cover en el meta viewport; sin él
   esta variable vale siempre cero.

   Va en CSS y no como clase de Tailwind porque pb-[env(...)] obliga a escribir
   el valor entre corchetes en cada sitio, y basta olvidarlo una vez para que
   el fallo aparezca solo en un modelo de teléfono. */
.barra-inferior {
    padding-bottom: calc(0.5rem + env(safe-area-inset-bottom, 0px));
}

.hoja-modulos {
    padding-bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px));
    max-height: 80vh;
}

/* El contenido no puede quedar debajo de la barra.
   MEDIDO, NO ESTIMADO: 8 (pt-2) + 4+4 (py-1) + 28 (icono) + 2 + 13 (rótulo)
   = 59 px, más el relleno inferior de la propia barra. Con 5.5rem sobra
   margen y la última fila de cada lista queda alcanzable. */
.con-barra-inferior {
    padding-bottom: calc(5.5rem + env(safe-area-inset-bottom, 0px));
}

/* El botón de añadir, flotando sobre la barra y a la derecha.
   FUERA DE LA BARRA, Y NO ES UN CAPRICHO: dentro ocupaba una ranura que solo
   existe en algunas pantallas, así que los atajos cambiaban de sitio al entrar
   en un módulo y volvían a cambiar al salir. Una barra en la que el mismo
   icono se mueve rompe lo único que la hace rápida, que es tocar sin mirar. */
.boton-flotante {
    position: fixed;
    right: 1rem;
    bottom: calc(5rem + env(safe-area-inset-bottom, 0px));
    z-index: 30;
}

/* La hoja "Más" sube desde abajo. Quien pidió menos movimiento la ve aparecer
   sin el desplazamiento. */
@media (prefers-reduced-motion: reduce) {
    .animate-hoja { animation: none; }
}

/* ── El editor de plantillas ────────────────────────────────────────────────
   OSCURO SIEMPRE, TAMBIÉN CON EL TEMA CLARO, y no es un descuido de los temas:
   un editor de código con fondo blanco cansa a los veinte minutos, y en esta
   pantalla se está un rato largo. Es además lo que hace cualquier editor
   incrustado en una aplicación clara.

   La paleta es la de Dracula, la misma que se usa en el editor de escritorio:
   saltar de una herramienta a otra sin que cambien los colores ahorra un
   reajuste de la vista en cada salto.

   SIN COLOREADO DE SINTAXIS, Y NO POR PEREZA. Esto es un <textarea>. Pintarlo
   por dentro exige un <pre> espejo debajo con el desplazamiento sincronizado,
   y cualquier desajuste de métricas deja el cursor separado de su letra: peor
   que no tener colores.
   ────────────────────────────────────────────────────────────────────────── */

.codigo-plantilla {
    background-color: #282a36;
    color: #f8f8f2;
    caret-color: #ff79c6;
    tab-size: 4;
}

.codigo-plantilla::placeholder { color: #6272a4; }
.codigo-plantilla::selection      { background-color: #44475a; color: #f8f8f2; }
.codigo-plantilla::-moz-selection { background-color: #44475a; color: #f8f8f2; }

/* La barra de desplazamiento de la aplicación es casi invisible sobre claro y
   desaparecería del todo sobre este panel. */
.codigo-plantilla::-webkit-scrollbar-thumb { background: #44475a; }
.codigo-plantilla::-webkit-scrollbar-thumb:hover { background: #6272a4; }
