/* =============================================================================
   Libro Mayor — hoja de estilo

   La ESTRUCTURA sigue la de FacturaDirecta porque es la que la usuaria tiene en
   los dedos: barra superior con pestañas centradas, fondo gris claro, tarjetas
   blancas con esquinas redondeadas, título a la izquierda y botón primario a la
   derecha, listados con fila de filtros encima.

   Los COLORES son los de Legato Translations, no los suyos: verde #2A651D de
   las cabeceras de tabla del PDF y verde #316245 del logotipo. Ni una pizca del
   azul de FacturaDirecta.
   ========================================================================== */

/* Android infla por su cuenta el texto de los bloques que considera «contenido
   principal» (font boosting). Agranda las LETRAS sin recolocar las cajas, así
   que en un menú los rótulos se salen de su sitio y se pisan unos con otros.
   Aquí los tamaños ya están pensados para el móvil: que no los toque nadie. */
html {
    -webkit-text-size-adjust: 100%;
            text-size-adjust: 100%;
}

:root {
    --verde:        #2A651D;   /* cabeceras de tabla, botón primario */
    --verde-oscuro: #1E4A15;
    --logo:         #316245;   /* el verde del logotipo */
    --verde-suave:  #E4EFE3;
    --fondo:        #EDF1EC;   /* el gris del lienzo */
    --tarjeta:      #FFFFFF;
    --tinta:        #1A211D;
    --tinta-2:      #3B453F;
    --suave:        #5C665F;
    --tenue:        #8A948D;
    --linea:        #E2E7E2;
    --linea-fuerte: #CBD3CB;
    --gris-fila:    #F5F7F4;
    --rojo:         #9B2C2C;
    --rojo-suave:   #FBEAE8;
    --ambar:        #8A5A12;
    --ambar-suave:  #FAF2E2;
    --sombra:       0 1px 2px rgba(26,33,29,.06), 0 1px 3px rgba(26,33,29,.05);
}

* { box-sizing: border-box; }

/* Roboto, que es la que usa FacturaDirecta. Se carga de Google Fonts con una
   pila de reserva completa: si el servidor de fuentes no responde, la página
   sigue leyéndose igual, solo cambia el tipo. */
body {
    margin: 0;
    background: var(--fondo);
    color: var(--tinta);
    font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI",
                 "Helvetica Neue", Arial, sans-serif;
    font-size: 14px;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
    letter-spacing: .01em;
}

a { color: var(--logo); text-decoration: none; }
a:hover { text-decoration: underline; }
:focus-visible { outline: 2px solid var(--verde); outline-offset: 2px; border-radius: 3px; }

/* ------------------------------------------------------------- barra superior */

.barra {
    background: #fff;
    border-bottom: 1px solid var(--linea);
    position: sticky; top: 0; z-index: 40;
}

/* NADA de `overflow-x: hidden` en el body.
   Se puso para evitar el scroll horizontal de la página y lo que hacía era
   RECORTAR: en el móvil la tabla de archivos medía 1198 px dentro de una
   ventana de 420, y el fichero estaba ahí pero no había forma de llegar a él.
   La solución no es tapar el desbordamiento sino que no lo haya: menos
   pestañas arriba y tablas que se apilan abajo. */
.barra-int {
    max-width: 1240px; margin: 0 auto; padding: 0 20px;
    display: flex; align-items: center; gap: 18px; height: 54px;
    min-width: 0;                     /* deja que las pestañas se encojan */
}
.marca { display: flex; align-items: center; gap: 9px; flex-shrink: 0; }
.marca img { height: 26px; width: auto; display: block; }
.marca span {
    font-weight: 500; font-size: 15px; color: var(--logo); letter-spacing: -.01em;
    white-space: nowrap;
}
/* Las pestañas ruedan en horizontal SIEMPRE que no quepan, no sólo en el móvil.
   Con doce pestañas dejan de caber ya en un portátil, y lo que pasaba entonces
   era que se desbordaba la PÁGINA ENTERA: aparecía una barra de scroll
   horizontal abajo del todo y el contenido se movía de lado. */
/* OJO con el selector: `> a`, hijos DIRECTOS. El menú «Más» cuelga de este
   mismo <nav>, así que un `nav.pestanyas a` a secas les caía encima a sus
   enlaces y les metía `display:flex` y `height:100%`. Resultado en el móvil:
   cada opción del menú medía 136 px en vez de 34, se salían de su grupo y los
   grupos se dibujaban unos sobre otros. */
nav.pestanyas { display: flex; gap: 2px; margin: 0 auto; height: 100%; min-width: 0; }
nav.pestanyas > a {
    display: flex; align-items: center; padding: 0 15px; height: 100%;
    color: var(--suave); font-size: 14px; text-decoration: none;
    border-bottom: 2px solid transparent; white-space: nowrap;
    transition: color .12s, border-color .12s;
}
nav.pestanyas > a:hover { color: var(--tinta); text-decoration: none; }
nav.pestanyas > a.activa { color: var(--verde); border-bottom-color: var(--verde); font-weight: 500; }
.empresa {
    display: flex; align-items: center; gap: 9px; flex-shrink: 0;
    font-size: 13px; color: var(--suave);
}
.avatar {
    width: 26px; height: 26px; border-radius: 50%; background: var(--logo);
    color: #fff; display: grid; place-items: center; font-size: 12px; font-weight: 600;
}

/* --------------------------------------------------------------- lienzo */

.lienzo { max-width: 1240px; margin: 0 auto; padding: 22px 20px 60px; }
.cabecera {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; margin-bottom: 18px; flex-wrap: wrap;
}
h1 { font-size: 1.5rem; font-weight: 400; margin: 0; letter-spacing: 0; }
h2 { font-size: 1.02rem; font-weight: 600; margin: 0 0 12px; }

.tarjeta {
    background: var(--tarjeta); border: 1px solid var(--linea);
    border-radius: 8px; box-shadow: var(--sombra);
}
.tarjeta + .tarjeta { margin-top: 16px; }
.tarjeta-cuerpo { padding: 18px 20px; }

/* --------------------------------------------------------------- botones */

.boton {
    display: inline-flex; align-items: center; gap: 7px;
    background: var(--verde); color: #fff; border: 1px solid var(--verde);
    border-radius: 4px; padding: 8px 18px; font-size: 13.5px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .04em;
    cursor: pointer; text-decoration: none; white-space: nowrap;
    transition: background .12s;
}
.boton:hover { background: var(--verde-oscuro); text-decoration: none; color: #fff; }
.boton.secundario {
    background: #fff; color: var(--tinta-2); border-color: var(--linea-fuerte); font-weight: 500;
}
.boton.secundario:hover { background: var(--gris-fila); color: var(--tinta); }

/* --------------------------------------------------- fila de filtros */

.filtros {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    padding: 14px 18px; border-bottom: 1px solid var(--linea);
}
.vista {
    font-size: 14.5px; font-weight: 600; color: var(--tinta);
    display: inline-flex; align-items: center; gap: 6px;
}
.chip {
    display: inline-flex; align-items: center; gap: 6px;
    border: 1px solid var(--linea-fuerte); border-radius: 999px;
    padding: 4px 12px; font-size: 13px; color: var(--suave); background: #fff;
    text-decoration: none;
}
.chip:hover { border-color: var(--verde); color: var(--verde); text-decoration: none; }
.chip.puesta { background: var(--verde-suave); border-color: var(--verde); color: var(--verde-oscuro); }
.buscador { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.buscador input, select.campo, input.campo {
    border: 1px solid var(--linea-fuerte); border-radius: 6px; padding: 7px 11px;
    font-size: 14px; font-family: inherit; background: #fff; color: var(--tinta);
    min-width: 150px;
}
.buscador input:focus, .campo:focus { border-color: var(--verde); outline: none; }

/* --------------------------------------------------------------- tablas */

.tabla-marco { overflow-x: auto; }
table.listado { width: 100%; border-collapse: collapse; font-size: 13.8px; }
table.listado thead th {
    text-align: left; padding: 10px 14px; font-weight: 500; font-size: 12.5px;
    color: var(--suave); border-bottom: 1px solid var(--linea-fuerte);
    white-space: nowrap; background: #fff; position: sticky; top: 54px;
}
table.listado tbody td {
    padding: 11px 14px; border-bottom: 1px solid var(--linea); vertical-align: top;
}
table.listado tbody tr:hover td { background: var(--gris-fila); }
table.listado tbody tr:last-child td { border-bottom: none; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Fechas y números de documento: LA MISMA tipografía que el resto.
   Antes iban en la monoespaciada del sistema (`ui-monospace, Menlo,
   Consolas`), que no es Roboto y cantaba al lado de las demás columnas.
   Lo que hace falta no es otra letra, son CIFRAS DE ANCHO FIJO —
   `tabular-nums`— para que los números queden alineados en columna. */
td.mono, .mono {
    font-variant-numeric: tabular-nums;
    letter-spacing: .005em;
    white-space: nowrap;
}
td .sub { display: block; color: var(--tenue); font-size: 12.4px; margin-top: 2px; }
.vacio { padding: 42px 20px; text-align: center; color: var(--tenue); }

/* --------------------------------------------------------------- estados */

.estado { font-weight: 600; font-size: 13px; white-space: nowrap; }
.estado.pagado    { color: var(--verde); }
.estado.pendiente { color: var(--ambar); }
.estado.atrasado  { color: var(--rojo); }
.estado.borrador  { color: var(--tenue); }
.estado.anulado   { color: var(--tenue); text-decoration: line-through; }

.etiqueta {
    display: inline-block; font-size: 11.5px; font-weight: 600; padding: 2px 8px;
    border-radius: 4px; background: var(--gris-fila); color: var(--suave);
    border: 1px solid var(--linea);
}
.etiqueta.verde { background: var(--verde-suave); color: var(--verde-oscuro); border-color: #BEDAB8; }
.etiqueta.roja  { background: var(--rojo-suave); color: var(--rojo); border-color: #F0C9C4; }
.etiqueta.ambar { background: var(--ambar-suave); color: var(--ambar); border-color: #EBD9B4; }

/* --------------------------------------------------- tarjetas del panel */

.rejilla { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(232px, 1fr)); }
.panel-tarjeta { background: #fff; border: 1px solid var(--linea); border-radius: 8px;
                 box-shadow: var(--sombra); padding: 16px 18px; }
.panel-tarjeta h3 {
    margin: 0 0 3px; font-size: 15px; font-weight: 500; color: var(--tinta);
}
.panel-tarjeta .periodo { font-size: 11.5px; color: var(--tenue); margin-bottom: 8px; }
.panel-tarjeta .cifra {
    font-size: 1.7rem; font-weight: 400; letter-spacing: -.01em;
    font-variant-numeric: tabular-nums; color: var(--tinta);
}
.panel-tarjeta .cifra.verde { color: var(--verde); }
.panel-tarjeta .cifra.roja  { color: var(--rojo); }

/* Barras: SVG no, CSS. Menos código y escalan solas. */
.barras { display: flex; align-items: flex-end; gap: 4px; height: 62px; margin-top: 12px; }
.barras .b { flex: 1; background: var(--verde-suave); border-radius: 2px 2px 0 0; min-height: 3px; }
.barras .b.lleno { background: var(--verde); }
.meses { display: flex; gap: 4px; margin-top: 5px; }
.meses span { flex: 1; text-align: center; font-size: 9.5px; color: var(--tenue); }

.doble { display: flex; gap: 22px; margin-top: 12px; flex-wrap: wrap; }
.doble > div { flex: 1; min-width: 92px; }
.doble .e { font-size: 11.5px; color: var(--tenue); }
.doble .v { font-size: 1.02rem; font-weight: 600; font-variant-numeric: tabular-nums; }

/* --------------------------------------------------------------- avisos */

.aviso {
    border-left: 4px solid var(--verde); background: var(--verde-suave);
    padding: 13px 17px; border-radius: 0 6px 6px 0; font-size: 13.6px;
    margin-bottom: 16px;
}
.aviso.ambar { border-left-color: var(--ambar); background: var(--ambar-suave); }
.aviso.rojo  { border-left-color: var(--rojo);  background: var(--rojo-suave); }
.aviso b { display: block; margin-bottom: 3px; }
.aviso p { margin: 0; color: var(--suave); }

/* --------------------------------------------- detalle de documento */

.doc-cab { display: flex; justify-content: space-between; gap: 26px; flex-wrap: wrap;
           padding: 22px 24px; border-bottom: 1px solid var(--linea); }
.doc-partes { display: flex; gap: 40px; flex-wrap: wrap; }
.doc-parte h4 { margin: 0 0 6px; font-size: 11.5px; letter-spacing: .07em;
                text-transform: uppercase; color: var(--tenue); font-weight: 600; }
.doc-parte p { margin: 0; font-size: 13.6px; line-height: 1.5; color: var(--tinta-2); }
.doc-parte strong { color: var(--tinta); }
.doc-numero { text-align: right; }
.doc-numero .n { font-size: 1.16rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.doc-numero .f { font-size: 13px; color: var(--suave); margin-top: 2px; }

.totales { margin-left: auto; width: 100%; max-width: 340px; font-size: 14px; }
.totales tr td { padding: 6px 0; }
.totales tr td:last-child { text-align: right; font-variant-numeric: tabular-nums; }
.totales tr.total td { border-top: 2px solid var(--verde); font-weight: 700; font-size: 1.05rem;
                       padding-top: 10px; }

dl.fichas { display: grid; grid-template-columns: auto 1fr; gap: 7px 18px; margin: 0; font-size: 13.6px; }
dl.fichas dt { color: var(--tenue); }
dl.fichas dd { margin: 0; color: var(--tinta-2); }

/* --------------------------------------------------------------- pie */

footer.pie {
    max-width: 1240px; margin: 0 auto; padding: 22px 20px 40px;
    font-size: 12px; color: var(--tenue); display: flex; gap: 16px; flex-wrap: wrap;
}

/* --------------------------------------------------------------- móvil */

/* NO se parte la barra en dos filas.
   Se intentó: por debajo de 860 px las cinco pestañas no caben junto al
   logotipo, así que pasaban a una segunda fila y la barra crecía a 75 px. Pero
   `.franja` se queda pegada en `top: 54px`, contando con una barra de 54, y al
   hacer scroll se le montaba encima 21 px. Y por debajo de 720 px las pestañas
   se esconden, con lo que esa segunda fila se quedaba vacía ocupando media
   pantalla para un solo icono.
   Ahora hay UN solo cambio, en 860 px: o pestañas en una línea, o menú. La
   barra mide 54 px siempre, que es lo que `.franja` da por hecho. */
@media (max-width: 860px) {
    .empresa span { display: none; }
    table.listado thead th { position: static; }
    .lienzo { padding: 16px 12px 48px; }
}
@media (prefers-reduced-motion: reduce) { * { transition: none !important; } }

/* =============================================================================
   Panel de inicio — colores SEMÁNTICOS

   Aquí el color significa algo, y por eso no es todo verde. Cada familia de
   cifra tiene el suyo y se repite en toda la aplicación: si algo sale en rojo
   es dinero que falta, si sale en ámbar es un impuesto por pagar. El verde de
   la marca se reserva para los ingresos y para lo que va bien.
   ========================================================================== */

:root {
    --c-ingreso:  #2A651D;   /* entra dinero */
    --c-gasto:    #1F5B7A;   /* sale dinero — azul pizarra, no compite con el verde */
    --c-impuesto: #8A5A12;   /* obligación con Hacienda */
    --c-cobro:    #9B2C2C;   /* pendiente de cobrar */
    --c-caja:     #4A5D52;   /* tesorería, neutro */
    --c-ingreso-f:#E4EFE3;
    --c-gasto-f:  #E3EDF3;
    --c-impuesto-f:#FAF2E2;
    --c-cobro-f:  #FBEAE8;
}

.panel-tarjeta { position: relative; overflow: hidden; }
.panel-tarjeta::before {
    content: ""; position: absolute; inset: 0 auto 0 0; width: 3px;
    background: var(--barra-color, transparent);
}
.t-ingreso  { --barra-color: var(--c-ingreso); }
.t-gasto    { --barra-color: var(--c-gasto); }
.t-impuesto { --barra-color: var(--c-impuesto); }
.t-cobro    { --barra-color: var(--c-cobro); }
.t-caja     { --barra-color: var(--c-caja); }

.cifra.c-ingreso  { color: var(--c-ingreso); }
.cifra.c-gasto    { color: var(--c-gasto); }
.cifra.c-impuesto { color: var(--c-impuesto); }
.cifra.c-cobro    { color: var(--c-cobro); }
.cifra.c-caja     { color: var(--c-caja); }

.barras .b.ingreso  { background: var(--c-ingreso); }
.barras .b.gasto    { background: var(--c-gasto); }
.barras .b.vacio-b  { background: var(--gris-fila); }

/* Barra de reparto: una línea que enseña la proporción de un total */
.reparto { display: flex; height: 7px; border-radius: 4px; overflow: hidden;
           background: var(--gris-fila); margin: 10px 0 8px; }
.reparto i { display: block; height: 100%; }
.leyenda { display: flex; flex-wrap: wrap; gap: 12px; font-size: 11.5px; color: var(--suave); }
.leyenda span { display: inline-flex; align-items: center; gap: 5px; }
.leyenda i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }

/* Filas de detalle dentro de una tarjeta */
.lineas { margin-top: 10px; display: flex; flex-direction: column; gap: 6px; }
.lineas div { display: flex; justify-content: space-between; gap: 10px; font-size: 13px; }
.lineas div span:first-child { color: var(--suave); }
.lineas div span:last-child  { font-variant-numeric: tabular-nums; font-weight: 500; }
.lineas div.destacada span:last-child { color: var(--tinta); font-weight: 700; }

/* Trimestres del IVA, con su barra proporcional */
.trim { display: flex; flex-direction: column; gap: 9px; margin-top: 10px; }
.trim > div { display: grid; grid-template-columns: 26px 1fr auto; gap: 9px; align-items: center;
              font-size: 12.6px; }
.trim .eti { color: var(--tenue); font-weight: 500; }
.trim .via { height: 6px; border-radius: 3px; background: var(--gris-fila); overflow: hidden; }
.trim .via i { display: block; height: 100%; background: var(--c-impuesto); }
.trim .val { font-variant-numeric: tabular-nums; font-weight: 500; }

/* ---------------------------------------------- franja de periodo y creación

   Va debajo de la barra y por encima de todo lo demás, en TODAS las pantallas.
   Antes el año se elegía dentro de cada listado, con lo que había que buscarlo
   en un sitio distinto según dónde estuvieras, y cambiar de pestaña lo perdía.
   Aquí está siempre en el mismo punto y viaja con cada enlace de la barra.     */

.herramientas { display: flex; align-items: center; gap: 12px; flex-shrink: 0; margin-left: auto; }

/* La luz del dique. Antes esto era un aviso plegado en TODAS las pantallas;
   ahora es un punto de color que no estorba y que se puede pulsar para ir a
   donde se cambia. Cerrado = verde, porque cerrado es el estado bueno. */
.dique-luz {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 12px; color: var(--suave); text-decoration: none;
    padding: 0 10px; border-radius: 999px; border: 1px solid var(--linea);
    white-space: nowrap;
    /* Es un enlace: necesita altura de dedo como cualquier otro. Con el
       relleno de 4 px se quedaba en 17. */
    min-height: 30px;
}
.dique-luz:hover { border-color: var(--linea-fuerte); text-decoration: none; }
.dique-luz .punto {
    width: 7px; height: 7px; border-radius: 50%; background: var(--verde);
    flex-shrink: 0;
}
.dique-luz.abierto { color: var(--rojo); border-color: var(--rojo); font-weight: 500; }
.dique-luz.abierto .punto { background: var(--rojo); }
.herramientas .empresa { gap: 0; }
.salir { font-size: 12px; color: var(--tenue); }

.franja {
    background: #fff; border-bottom: 1px solid var(--linea);
    position: sticky; top: 54px; z-index: 39;
}
.franja-int {
    max-width: 1240px; margin: 0 auto; padding: 9px 20px;
    display: flex; align-items: center; justify-content: flex-end; gap: 12px;
}

.franja .periodo {
    display: flex; align-items: center; gap: 7px;
    border: 1px solid var(--linea); border-radius: 6px; padding: 0 10px;
    height: 34px; background: #fff;
}
.franja .periodo:focus-within { border-color: var(--verde); }
.periodo-icono { width: 17px; height: 17px; fill: var(--tenue); flex-shrink: 0; }
.franja .periodo select {
    border: 0; background: none; font: inherit; font-size: 13.5px;
    color: var(--tinta); padding: 0 2px; height: 100%; cursor: pointer;
    max-width: 15rem;
}
.franja .periodo select:focus { outline: none; }

/* El botón de crear. Redondo y verde en vez de azul: es la marca de la casa. */
.crear { position: relative; flex-shrink: 0; }
.crear-boton {
    width: 34px; height: 34px; border-radius: 50%; border: 0;
    background: var(--verde); color: #fff; font-size: 21px; line-height: 1;
    cursor: pointer; display: grid; place-items: center; padding: 0;
    box-shadow: 0 1px 3px rgba(0,0,0,.22); transition: background .12s;
}
.crear-boton:hover { background: var(--verde-oscuro); }

.crear-menu {
    position: absolute; right: 0; top: 42px; z-index: 60;
    background: #fff; border: 1px solid var(--linea); border-radius: 8px;
    box-shadow: 0 6px 22px rgba(0,0,0,.14); min-width: 254px; padding: 7px 0;
}
.crear-menu[hidden] { display: none; }
.crear-titulo {
    font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
    color: var(--tenue); padding: 5px 14px 8px;
}
.crear-menu a {
    display: flex; align-items: center; gap: 11px; padding: 8px 14px;
    color: var(--tinta); font-size: 14px; text-decoration: none;
}
.crear-menu a:hover { background: var(--gris-fila); text-decoration: none; }
.crear-ficha {
    width: 26px; height: 26px; border-radius: 50%; display: grid;
    place-items: center; font-size: 12px; font-weight: 600; flex-shrink: 0;
}

.aviso.verde { border-left-color: var(--verde); background: var(--verde-suave); }

/* En el móvil la barra de pestañas se desborda: que ruede en horizontal en vez
   de partirse o de comerse el ancho de la página. */
@media (max-width: 900px) {
    .barra-int { gap: 10px; }
    nav.pestanyas { margin: 0; }
    nav.pestanyas > a { padding: 0 11px; font-size: 13.5px; }
    .marca img { height: 22px; }
    .franja-int { padding: 8px 14px; }
    .franja .periodo select { max-width: 10rem; }
    .lienzo { padding: 16px 14px 48px; }
}

/* ------------------------------------------------------------- formularios

   Etiqueta pequeña encima, campo debajo, ayuda en gris. Es el patrón de
   FacturaDirecta y el que la usuaria tiene aprendido.                        */

.rejilla-campos {
    display: grid; gap: 14px 16px; margin: 4px 0 6px;
    grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
}
.campo-caja { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.campo-etiqueta { font-size: 11.5px; color: var(--tenue); }
.campo-etiqueta b { color: var(--rojo); font-weight: 400; }
.campo-ayuda { font-size: 11.5px; color: var(--tenue); line-height: 1.45; }

textarea.campo { resize: vertical; font: inherit; font-size: 14px; }
input.campo, select.campo, textarea.campo {
    width: 100%; padding: 8px 10px; border: 1px solid var(--linea);
    border-radius: 6px; font-size: 14px; background: #fff; color: var(--tinta);
}
input.campo:focus, select.campo:focus, textarea.campo:focus {
    border-color: var(--verde); outline: none;
}

.campo-casilla {
    display: flex; gap: 10px; align-items: flex-start; margin: 12px 0 2px;
    font-size: 14px; cursor: pointer;
}
.campo-casilla input { margin-top: 2px; width: 16px; height: 16px; flex-shrink: 0; }
.campo-casilla b { font-weight: 400; display: block; }
.campo-casilla .campo-ayuda { display: block; margin-top: 2px; }

.explica { color: var(--suave); max-width: 74ch; margin: 0 0 14px; line-height: 1.6; }
.detalle { margin-top: 14px; }
.detalle summary {
    cursor: pointer; font-size: 13px; color: var(--verde); width: fit-content;
}
.lista-ayuda { margin-top: 10px; display: grid; gap: 6px; font-size: 13px;
    color: var(--suave); max-width: 84ch; line-height: 1.55; }
.lista-ayuda b { color: var(--tinta); font-weight: 500; }

.acciones-pie { display: flex; gap: 10px; margin: 18px 0 6px; }
.cabecera-acciones { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

/* OJO: `.boton` es `inline-flex`. En un contenedor flex el contenido NO se
   centra con `text-align`, hace falta `justify-content`. Sin esto, un botón
   estirado con `flex: 1` dejaba su texto pegado a la izquierda y parecía
   descuadrado. Se pone aquí, en la regla base, y no sólo en el móvil: un botón
   siempre centra lo suyo. */
.boton { justify-content: center; }

.boton.peligro { background: var(--rojo); border-color: var(--rojo); }
.boton.peligro:hover { background: #7E2323; border-color: #7E2323; }

/* Botón con desplegable pegado a la derecha, como el «Nueva factura ▾». */
.desplegable { position: relative; }
/* La flecha hereda `padding: 0` y se quedaba en 18-21 px de alto: una diana de
   dedo demasiado pequeña en un móvil. Se le da la misma altura que su botón
   hermano en vez de dejarla al aire. */
.boton.flecha {
    padding: 0 9px; border-left: 1px solid rgba(255,255,255,.28);
    align-self: stretch; min-height: 38px;
}
.desplegable-menu {
    position: absolute; right: 0; top: calc(100% + 5px); z-index: 50;
    background: #fff; border: 1px solid var(--linea); border-radius: 7px;
    box-shadow: 0 5px 18px rgba(0,0,0,.13); min-width: 254px; padding: 5px 0;
}
.desplegable-menu[hidden] { display: none; }
.desplegable-menu a {
    display: block; padding: 8px 14px; font-size: 14px; color: var(--tinta);
    text-decoration: none; white-space: nowrap;
}
.desplegable-menu a:hover { background: var(--gris-fila); text-decoration: none; }

.chip b { font-weight: 600; margin-left: 3px; }
/* El botón de quitar una línea. Medía 29x23 px, y fallar ese toque en un móvil
   BORRA una línea de la factura: de todos los aciertos que se pueden fallar,
   éste es el peor. Se le da una diana redonda decente sin agrandar el aspa. */
.chip.quitar, button.quitar {
    color: var(--tenue);
    min-width: 34px; min-height: 34px;
    justify-content: center; padding: 4px 8px;
}
.chip.quitar:hover, button.quitar:hover { color: var(--rojo); border-color: var(--rojo); }

@media (max-width: 860px) {
    /* En el móvil la tabla de líneas se apila y el aspa queda suelta al final
       de cada bloque: ahí necesita ser inconfundible, no un punto perdido. */
    .chip.quitar, button.quitar { min-width: 40px; min-height: 40px; }
}
.pie-lista { border-bottom: none; border-top: 1px solid var(--linea); }
.pie-lista .cuenta { font-size: 13px; color: var(--suave); }

/* --------------------------------------- tarjetas del panel, como enlaces

   Una cifra del panel que no se puede abrir obliga a repetir el filtro a mano
   en otra pantalla. Así que la tarjeta entera es el enlace a su listado ya
   filtrado, y el «→» de la cabecera dice a dónde va.                        */

a.panel-tarjeta { display: block; color: inherit; text-decoration: none; }
a.panel-tarjeta:hover {
    border-color: #C7D4C4; box-shadow: 0 2px 10px rgba(0,0,0,.07);
    text-decoration: none;
}
.panel-tarjeta h3 { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.panel-tarjeta .ir {
    font-size: 11px; font-weight: 400; color: var(--tenue); white-space: nowrap;
    opacity: 0; transition: opacity .12s;
}
a.panel-tarjeta:hover .ir { opacity: 1; }
.panel-tarjeta h3 a.ir { opacity: 1; }
.panel-tarjeta h3 a.ir:hover { color: var(--verde); }

/* Barrita de proporción bajo cada nombre del ranking de clientes/proveedores. */
.via-fina { height: 3px; background: var(--gris-fila); border-radius: 2px;
    margin: -2px 0 7px; overflow: hidden; }
.via-fina i { display: block; height: 100%; }

.trim a {
    display: flex; align-items: center; gap: 9px; padding: 3px 0;
    color: inherit; text-decoration: none; border-radius: 4px;
}
.trim a:hover { background: var(--gris-fila); text-decoration: none; }

.cabecera-nota { font-size: 13px; color: var(--tenue); }
.c-cobro { color: var(--c-cobro); }

/* ------------------------------------------------- buscador de contacto

   Un `<select>` con 383 contactos obliga a rodar la lista buscando a ojo.
   Aquí se teclea parte del nombre, del NIF o del correo y la lista se
   reduce; y se puede seguir desplegando con la flecha.                     */

.busca-caja { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.busca-caja > span { font-size: 12px; color: var(--suave); font-weight: 500; }
.busca-caja > span .mini { font-size: 11.5px; font-weight: 400; margin-left: 5px; }

.busca { position: relative; }
.busca-texto { width: 100%; padding-right: 30px !important; }
.busca-flecha {
    position: absolute; right: 1px; top: 1px; bottom: 1px; width: 27px;
    border: 0; background: none; color: var(--tenue); cursor: pointer;
    font-size: 11px; border-radius: 0 6px 6px 0;
}
.busca-flecha:hover { background: var(--gris-fila); }

.busca-lista {
    position: absolute; left: 0; right: 0; top: calc(100% + 3px); z-index: 70;
    background: #fff; border: 1px solid var(--linea); border-radius: 7px;
    box-shadow: 0 5px 18px rgba(0,0,0,.13); max-height: 288px; overflow-y: auto;
    list-style: none; margin: 0; padding: 4px 0;
}
.busca-lista[hidden] { display: none; }
.busca-lista li {
    padding: 6px 12px; cursor: pointer; display: flex; flex-direction: column;
    gap: 1px; line-height: 1.35;
}
.busca-lista li:hover, .busca-lista li.marcada { background: var(--verde-suave); }
.busca-lista li[hidden] { display: none; }
.busca-nombre { font-size: 14px; color: var(--tinta); }
.busca-sub { font-size: 11.5px; color: var(--tenue); }
.busca-vacio { padding: 12px; color: var(--tenue); font-size: 13px; text-align: center; }
.busca-aviso { color: var(--rojo); }
.busca.mal .busca-texto { border-color: var(--rojo); }

/* La marca de la barra: símbolo nítido + nombre en texto. El logotipo completo
   lleva «TRANSLATIONS, S.L.» y el lema en letra pequeña, y a 26 px eso no se
   lee: se convierte en una mancha. El texto en HTML se ve bien a cualquier
   tamaño y en cualquier densidad de pantalla. */
.marca img { height: 28px; width: 28px; }
.marca span {
    font-size: 16px; color: var(--logo); letter-spacing: -.015em;
    font-weight: 300; white-space: nowrap;
}
.marca span b { font-weight: 600; }
@media (max-width: 900px) {
    .marca span { display: none; }   /* en el móvil, sólo el símbolo */
    .marca img { height: 26px; width: 26px; }
}

/* Descargar el adjunto DESDE la lista. Entrar en cada compra sólo para bajar el
   PDF del proveedor es un clic de más en lo que se hace todos los días. */
.chip.adjunto {
    display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px;
    border-color: #BEDAB8; background: var(--verde-suave); color: var(--verde-oscuro);
}
.chip.adjunto:hover { background: #D6E8D2; text-decoration: none; }
.chip.adjunto svg { width: 13px; height: 13px; fill: currentColor; transform: rotate(180deg); }

/* ------------------------------------------------------------ menú «Más»

   Cinco pestañas a la vista y el resto aquí dentro, como FacturaDirecta. Es la
   única forma de que quepan doce secciones sin cortar ninguna.               */

.mas { position: relative; display: flex; align-items: center; }
.mas-boton {
    display: flex; align-items: center; gap: 6px; height: 100%;
    padding: 0 15px; border: 0; background: none; cursor: pointer;
    font: inherit; font-size: 14px; color: var(--suave);
    border-bottom: 2px solid transparent;
}
.mas-boton:hover { color: var(--tinta); }
.mas-boton.activa { color: var(--verde); border-bottom-color: var(--verde); font-weight: 500; }
.mas-boton svg { width: 17px; height: 17px; fill: currentColor; }

/* Se ancla a `.mas` en pantalla ancha y a `.barra` entera en el móvil (ver más
   abajo). En los dos casos con `top: 100%`, NUNCA con un número fijo: la barra
   cambia de alto según el tamaño de letra del sistema, y un `top: 58px` a mano
   hacía que en un teléfono con el texto grande el menú se abriera ENCIMA de la
   propia barra, tapando el botón que acababas de pulsar. */
.mas-menu {
    position: absolute; left: 0; top: 100%; z-index: 60;
    background: #fff; border: 1px solid var(--linea); border-radius: 8px;
    box-shadow: 0 6px 22px rgba(0,0,0,.14);
    padding: 10px 0; display: grid; gap: 2px;
    grid-template-columns: repeat(2, minmax(190px, 1fr));
}
.mas-menu[hidden] { display: none; }
.mas-grupo { padding: 4px 0; }
.mas-titulo {
    font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
    color: var(--tenue); padding: 4px 16px 6px;
}
.mas-menu a {
    display: block; padding: 7px 16px; font-size: 14px; color: var(--tinta);
    text-decoration: none; white-space: nowrap;
}
.mas-menu a:hover { background: var(--gris-fila); text-decoration: none; }
.mas-menu a.activa { color: var(--verde); font-weight: 500; background: var(--verde-suave); }

/* El aviso del dique, plegado. Ocupaba cuatro líneas en TODAS las pantallas y
   en el móvil empujaba el contenido por debajo del pliegue. */
details.aviso.plegable { padding: 10px 14px; }
details.aviso.plegable summary { cursor: pointer; list-style: none; }
details.aviso.plegable summary::-webkit-details-marker { display: none; }
details.aviso.plegable summary::before { content: "▸ "; color: var(--verde); }
details.aviso.plegable[open] summary::before { content: "▾ "; }
details.aviso.plegable p { margin-top: 8px; }

/* ------------------------------------------------------ tablas en el móvil

   Por debajo de 760 px la tabla deja de ser una tabla: cada fila pasa a ser una
   tarjeta y cada celda una línea con su etiqueta delante. Es lo único que evita
   de verdad el desplazamiento lateral, porque una tabla de siete columnas no
   cabe en un teléfono por mucho que se encoja la letra.

   La etiqueta sale de `data-etiqueta`, que pone la plantilla de cada fila.    */

@media (max-width: 760px) {
    table.listado, table.listado tbody, table.listado tr, table.listado td {
        display: block; width: auto;
    }
    table.listado thead { display: none; }
    table.listado tr {
        border: 1px solid var(--linea); border-radius: 8px;
        margin: 0 0 10px; padding: 4px 0; background: #fff;
    }
    table.listado td {
        border: 0; padding: 5px 12px; text-align: left !important;
        display: flex; justify-content: space-between; gap: 12px;
        align-items: baseline;
    }
    table.listado td::before {
        content: attr(data-etiqueta);
        font-size: 11.5px; color: var(--tenue); flex-shrink: 0;
    }
    table.listado td:empty { display: none; }
    /* La primera celda hace de título de la tarjeta. */
    table.listado td:first-child {
        font-weight: 500; font-size: 15px; padding-top: 9px;
    }
    table.listado td:first-child::before { display: none; }
    table.listado td .sub { display: block; margin-top: 2px; }
    .tabla-marco { overflow-x: visible; }

    /* El pie de la tabla y los filtros, en columna. */
    .filtros { flex-wrap: wrap; gap: 8px; }
    .buscador { margin-left: 0; width: 100%; }
    .buscador input { flex: 1; min-width: 0; }
    .cabecera { flex-wrap: wrap; gap: 10px; }
    .cabecera-acciones { width: 100%; }
    /* `flex: 1 1 0` con `min-width: 0`, no `flex: 1` a secas: `.boton` lleva
       `white-space: nowrap`, así que sin permitirle encoger un rótulo largo
       —«IMPORTAR MOVIMIENTOS»— imponía su ancho mínimo, el otro botón se
       quedaba estrecho y la pareja salía descompensada. */
    .cabecera-acciones .boton,
    .cabecera-acciones button { flex: 1 1 0; min-width: 0; }
    /* Y si de verdad no cabe, que parta en dos líneas antes que salirse. */
    .cabecera-acciones .boton { white-space: normal; text-align: center; }

    /* Altura mínima de dedo para TODO lo que se pulsa. Un enlace de 18 px de
       alto se falla más veces de las que se acierta. */
    .boton, button.boton, .crear-boton, .mas-boton { min-height: 38px; }
    .totales { width: 100%; }
    /* Una columna, pero con un ancho decente: al pasar de dos columnas a una,
       el menú se encogía al contenido y se quedaba en 169 px. */
    .mas-menu { grid-template-columns: 1fr; min-width: 240px; }
}

/* El adjunto, con su icono, para que se vea que es un fichero descargable y no
   un texto cualquiera. */
a.descarga { display: inline-flex; align-items: center; gap: 6px; }
a.descarga svg {
    width: 14px; height: 14px; fill: var(--verde); flex-shrink: 0;
    transform: rotate(180deg);
}

/* ---------------------------------------------------------------- donut

   Como los de FacturaDirecta: un color base con la opacidad bajando por
   segmento y el total en el centro. Dibujado con SVG a mano — cinco arcos no
   justifican cargar una biblioteca de gráficas entera, y así se ve igual con
   JavaScript desactivado. */

.donut { display: flex; justify-content: center; margin: 6px 0 10px; }
.donut svg { width: 100%; max-width: 168px; height: auto; }
.donut circle[stroke] { transition: stroke-width .12s; }
.donut svg:hover circle[stroke] { stroke-width: 48; }
.donut-cifra {
    font-size: 30px; font-weight: 500; fill: var(--tinta);
    font-variant-numeric: tabular-nums;
}
.donut-nota { font-size: 15px; fill: var(--tenue); }
.donut-vacio {
    padding: 30px 12px; color: var(--tenue); font-size: 13px; text-align: center;
}

/* ------------------------------------------------------ escribir en grande

   Un concepto de línea de factura cabe en 200 caracteres pero el hueco de la
   tabla tiene sitio para veinte: escribir ahí es escribir a ciegas. El lápiz
   abre el mismo texto en una ventana donde se ve entero.                     */

.con-lapiz { position: relative; display: block; width: 100%; }
.con-lapiz input { padding-right: 30px !important; }
.lapiz {
    position: absolute; right: 2px; top: 50%; transform: translateY(-50%);
    width: 26px; height: 26px; border: 0; background: none; cursor: pointer;
    display: grid; place-items: center; border-radius: 4px; padding: 0;
}
.lapiz svg { width: 14px; height: 14px; fill: var(--tenue); }
.lapiz:hover { background: var(--gris-fila); }
.lapiz:hover svg { fill: var(--verde); }

.grande-fondo {
    position: fixed; inset: 0; z-index: 120; background: rgba(20,28,20,.42);
    display: grid; place-items: center; padding: 18px;
}
.grande {
    background: #fff; border-radius: 10px; width: min(620px, 100%);
    box-shadow: 0 12px 40px rgba(0,0,0,.28); padding: 16px 18px 14px;
}
.grande-cab {
    display: flex; justify-content: space-between; align-items: center;
    margin-bottom: 10px; font-weight: 500;
}
.grande-x {
    border: 0; background: none; cursor: pointer; font-size: 15px;
    color: var(--tenue); padding: 4px 8px; border-radius: 4px;
}
.grande-x:hover { background: var(--gris-fila); color: var(--tinta); }
.grande textarea { width: 100%; font-size: 15px; line-height: 1.55; resize: vertical; }
.grande-pie {
    display: flex; align-items: center; gap: 10px; margin-top: 12px;
}
.grande-cuenta { margin-right: auto; font-size: 12px; color: var(--tenue); }
body.sin-scroll { overflow: hidden; }

@media (max-width: 760px) {
    .grande { padding: 14px; }
    .grande-pie { flex-wrap: wrap; }
    .grande-pie .boton { flex: 1; }
}

/* ------------------------------------------------------- barra en el móvil

   Cinco pestañas más el botón «Más» ocupan 451 px y un teléfono tiene 375. No
   caben, y encogerlas hasta que quepan las deja ilegibles. Así que por debajo
   de 860 px se esconden y TODO pasa al menú, que es lo que hace cualquier
   aplicación en un teléfono.

   860 px es el ÚNICO corte de la barra. Antes había cuatro (900, 860, 760,
   720) puestos en momentos distintos, y se pisaban entre ellos.              */

.solo-movil { display: none; }

@media (max-width: 860px) {
    nav.pestanyas > a { display: none; }          /* las pestañas, al menú */

    nav.pestanyas {
        width: auto; flex: 0 0 auto;
        margin-left: auto; margin-right: 0; overflow: visible;
    }
    /* `.herramientas` trae su propio `margin-left: auto`. Con el de la barra de
       menú puestos los dos, el espacio sobrante se repartía entre ambos y el
       botón se quedaba plantado en mitad de la barra. Manda el de `nav`. */
    .herramientas { margin-left: 0; }
    /* 54 px clavados y sin envolver: es la altura con la que `.franja` cuenta
       para quedarse pegada en `top: 54px`. */
    .barra-int { height: 54px; flex-wrap: nowrap; padding: 0 12px; gap: 8px; }

    .solo-movil { display: block; }
    .mas-boton { padding: 0 10px; }
    .mas-boton span { display: none; }            /* sólo el icono */

    /* El menú cuelga de la BARRA, no del botón, para poder ocupar todo el
       ancho. `.barra` es `position: sticky`, que ya sirve de referencia. */
    .mas { position: static; }
    .mas-menu {
        left: 8px; right: 8px; top: 100%; width: auto;
        max-height: calc(100vh - 5rem); overflow-y: auto;
        overscroll-behavior: contain;             /* que no arrastre la página */
    }

    .marca span { display: none; }
    .herramientas { gap: 8px; }
    .dique-luz { padding: 0 8px; min-height: 32px; }
    .dique-texto { display: none; }        /* en el móvil basta el punto */
    .salir { display: none; }                     /* está en el menú de usuario */
    .franja-int { padding: 8px 12px; }
    .franja .periodo select { max-width: 12rem; font-size: 13px; }
}

/* Que nada se salga nunca por ser demasiado largo: un IBAN, un concepto de
   traducción o el nombre de un fichero pueden pasar de cien caracteres. */
.lienzo, .tarjeta, .panel-tarjeta { min-width: 0; }
td, .v, .lineas span, .busca-nombre { overflow-wrap: anywhere; }

/* ------------------------------------------- las LÍNEAS del documento, en móvil

   La tabla de líneas es un caso aparte: no es un listado que se lee, es un
   formulario que se rellena. Apilarla como las demás dejaría seis campos
   sueltos sin saber cuál pertenece a qué línea. Aquí cada línea se convierte en
   un bloque con su marco, y los campos se etiquetan dentro.                  */

@media (max-width: 760px) {
    #lineas, #lineas tbody, #lineas tr, #lineas td { display: block; width: auto; }
    #lineas thead { display: none; }
    #lineas tr.linea {
        border: 1px solid var(--linea); border-radius: 8px;
        margin: 0 0 12px; padding: 8px 10px 10px; background: #fff;
        position: relative;
    }
    #lineas td {
        border: 0; padding: 5px 0; display: block;
    }
    #lineas td::before {
        content: attr(data-etiqueta);
        display: block; font-size: 11.5px; color: var(--tenue); margin-bottom: 3px;
    }
    #lineas td:last-child::before { display: none; }
    #lineas .campo { width: 100% !important; text-align: left !important; }
    #lineas input.cant, #lineas input.prec { text-align: right !important; }
    /* El total y el botón de quitar, en la misma línea. */
    #lineas td.total-linea {
        display: flex; justify-content: space-between; align-items: baseline;
        font-weight: 500; border-top: 1px solid var(--linea);
        margin-top: 6px; padding-top: 8px;
    }
    #lineas td.total-linea::before { display: inline; margin: 0; }
    #lineas td:last-child {
        position: absolute; top: 6px; right: 8px; padding: 0;
    }
    .acciones-emitir { flex-direction: column; align-items: stretch; }
    .acciones-emitir .boton { width: 100%; }
}

/* Los campos anchos ocupan «span 2» o «span 3» de la rejilla. Cuando sólo cabe
   UNA columna, eso les hace pedir el doble o el triple del ancho disponible y
   son ellos los que desbordan la página entera. En el móvil todos ocupan una. */
@media (max-width: 760px) {
    .rejilla-campos, .campos { grid-template-columns: 1fr !important; }
    .rejilla-campos > *, .campos > * { grid-column: span 1 !important; }
    .lienzo, form, .tarjeta, .tarjeta-cuerpo { min-width: 0; max-width: 100%; }
    .rejilla { grid-template-columns: 1fr; }
    .doc-partes { flex-direction: column; gap: 14px; }
    .doble { gap: 14px; }
    h1 { font-size: 1.35rem; }
}

/* Una huella SHA-256 son 64 caracteres seguidos sin un espacio donde cortar, y
   eso desborda cualquier pantalla estrecha. `overflow-wrap: anywhere` no basta
   con `white-space: nowrap` puesto, que es lo que llevan las celdas `.mono`. */
@media (max-width: 760px) {
    td.mono, .mono { white-space: normal; overflow-wrap: anywhere; }
    .huella, code { word-break: break-all; }
}

/* Recorrer la cadena de registros: anterior, éste, siguiente. */
.cadena-saltos { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.salto { flex: 1; min-width: 180px; display: flex; flex-direction: column; gap: 6px; }
.salto.actual { text-align: center; }
.salto-estado { display: flex; gap: 5px; flex-wrap: wrap; }
pre.volcado {
    background: var(--gris-fila); border: 1px solid var(--linea);
    border-radius: 6px; padding: 12px; overflow-x: auto; font-size: 12px;
    line-height: 1.5; margin: 0; white-space: pre;
}
@media (max-width: 760px) {
    .cadena-saltos { flex-direction: column; align-items: stretch; }
    pre.volcado { font-size: 11px; }
}

/* La alarma del art. 6.f. No se pliega, no se cierra y no pasa desapercibida:
   el reglamento pide que «indique claramente este hecho» y que no se desactive
   hasta poder volver a garantizar la integridad. */
.aviso.alarma {
    border-left-width: 6px;
    box-shadow: 0 2px 12px rgba(155, 44, 44, .18);
}
.aviso.alarma b { font-size: 15px; }
