* { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  --verde: #2e7d4f;
  --verde-oscuro: #1d5c38;
  --crema: #f6f4ee;
  --tinta: #26301f;
  --gris: #5e655a;
  --borde: #e2ded3;
  --blanco: #ffffff;
  /* EL FONDO DE UNA TARJETA. Existía en trece reglas de Bodega y Productividad —
     `background: var(--tarjeta)`— y NO estaba declarado en ninguna parte: una variable que
     no existe invalida la declaración entera, así que esas trece superficies computaban
     rgba(0,0,0,0) y quedaban transparentes sobre el papel. Medido en el navegador: .tarjeta
     daba rgb(255,255,255) y .pr-op daba rgba(0,0,0,0). Por eso esas pantallas se veían
     lavadas: las fichas nunca se pintaron. */
  --tarjeta: #ffffff;
  --rojo: #c0392b;
  --ambar: #c98a12;
  --naranja: #d35400;
  --teal: #16786c;

  /* paleta premium */
  --noir: #14140f;
  --noir-2: #26261d;
  --marfil: #faf9f6;
  /* Color de la app. temas.js reescribe estas variables sobre <html> cuando el
     colaborador elige otro color. El grano (encabezado y fondo) es una capa aparte:
     nunca se toca, solo cambia el degradado que lleva debajo. */
  --oro: #b5924f;
  --oro-claro: #d8bd86;
  --oro-rgb: 181, 146, 79;
  --bronce: #463c28;
  --bronce-osc: #37301f;
  --bronce-grad: linear-gradient(135deg, #4e4330 0%, #37301f 100%);
  --head-a: #4e4331;   /* encabezado */
  --head-b: #3a3120;
  --head-c: #2b2416;
  --pag-a: #fdfbf6;    /* fondo de la página (el papel) */
  --pag-b: #f5eede;
  --pag-c: #efe4cf;

  /* sombras en capas para dar profundidad */
  --sombra-sm: 0 1px 2px rgba(20, 20, 15, 0.04), 0 2px 8px rgba(20, 20, 15, 0.05);
  --sombra-md: 0 2px 6px rgba(20, 20, 15, 0.05), 0 12px 28px rgba(20, 20, 15, 0.08);
  --sombra-lg: 0 8px 20px rgba(20, 20, 15, 0.08), 0 24px 60px rgba(20, 20, 15, 0.12);
}

/* ---------- la letra ----------
   En el iPhone `system-ui` YA es la San Francisco de Apple: allí la app se ve como
   el dueño quiere y NO se toca nada. En Windows, `system-ui` cae en Segoe UI, que
   tiene otro aire. La San Francisco NO se puede servir desde aquí: su licencia
   prohíbe expresamente incrustarla, usarla en web y ponerla en una red donde varios
   equipos la usen — que es literalmente lo que hace este servidor.
   Por eso en ESCRITORIO se usa Inter, hecha para pantallas con el mismo propósito
   que la San Francisco y libre de verdad (SIL Open Font License 1.1).

   Inter — Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
   Licencia SIL OFL 1.1 · copia completa en vendor/fuentes/inter-LICENSE.txt

   Dos detalles que importan:
   · Los @font-face solo DECLARAN: el navegador no descarga nada hasta que algo usa
     la familia, y solo se usa dentro del @media de escritorio ⇒ el celular baja CERO.
   · size-adjust: 96% — Inter dibuja la equis ~4% más alta que la San Francisco; sin
     esto, el mismo texto se vería más grande que en el iPhone. */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;      /* un solo archivo variable cubre todos los grosores */
  font-display: swap;        /* el texto se lee desde el primer instante */
  size-adjust: 96%;
  src: url("vendor/fuentes/inter-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
    U+FEFF, U+FFFD;
}
@font-face {
  /* Europa del este y monedas raras. Con unicode-range NO se descarga jamás… salvo que
     alguien escriba un nombre que lo necesite. Cuesta 0 bytes tenerlo por si acaso. */
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  size-adjust: 96%;
  src: url("vendor/fuentes/inter-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
    U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB,
    U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

body {
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
  /* papel con grano: el grano es su propia capa, así que el color de abajo puede
     cambiar con el tema del colaborador sin perder la textura */
  background-image:
    url("marca/grano.png"),
    linear-gradient(180deg, var(--pag-a) 0%, var(--pag-b) 55%, var(--pag-c) 100%);
  background-attachment: fixed, fixed;
  background-repeat: repeat, no-repeat;
  background-size: 180px 180px, cover;
  background-blend-mode: overlay, normal;
  color: var(--tinta);
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

.oculto { display: none !important; }

/* ---------- monograma reutilizable ---------- */

.marca-mono { width: 30px; height: 34px; flex-shrink: 0; }
.marca-mono polygon { fill: var(--marfil); }

/* ---------- encabezado ---------- */

header {
  background-image:
    url("marca/grano.png"),
    linear-gradient(135deg, var(--head-a) 0%, var(--head-b) 55%, var(--head-c) 100%);
  background-size: 150px 150px, cover;
  background-repeat: repeat, no-repeat;
  background-blend-mode: overlay, normal;
  color: var(--marfil);
  padding: 14px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  position: relative;
  box-shadow: var(--sombra-md);
}

/* filete dorado inferior */
header::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1.5px;
  background: linear-gradient(90deg, transparent, var(--oro) 20%, var(--oro-claro) 50%, var(--oro) 80%, transparent);
  opacity: 0.75;
}

header .marca { display: flex; align-items: center; gap: 11px; cursor: pointer; }
header .marca-texto { display: flex; flex-direction: column; line-height: 1.15; }
header .marca-nombre {
  font-size: 1.02rem;
  font-weight: 700;
  letter-spacing: 3px;
}
header .marca-etq {
  font-size: 0.6rem;
  letter-spacing: 2px;
  color: var(--oro-claro);
  border: 1px solid rgba(216, 189, 134, 0.4);
  border-radius: 4px;
  padding: 1px 5px;
  margin-left: 4px;
  vertical-align: middle;
}
header .quien { font-size: 0.82rem; opacity: 0.7; letter-spacing: 0.3px; }

header a, header button.enlace {
  color: var(--marfil);
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 9px;
  padding: 7px 13px;
  font-size: 0.82rem;
  letter-spacing: 0.3px;
  text-decoration: none;
  cursor: pointer;
  transition: background 0.18s ease, border-color 0.18s ease;
}
header a:hover, header button.enlace:hover {
  background: rgba(255, 255, 255, 0.15);
  border-color: rgba(216, 189, 134, 0.5);
}
/* En celular angosto con cuenta admin (🔔 + Mi panel + Admin + Salir) el encabezado no cabía
   y desbordaba la página entera: eso corría los modales fuera de la pantalla. Que se encoja,
   y si aun así no cabe, que baje a una segunda línea en vez de desbordar. */
header { flex-wrap: wrap; }
.header-acciones { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
@media (max-width: 460px) {
  header { padding: 12px 10px; gap: 6px; }
  header a, header button.enlace { padding: 6px 7px; font-size: 0.72rem; letter-spacing: 0; }
  header .marca-nombre { font-size: 1.05rem; letter-spacing: 1.5px; }
  header .quien { font-size: 0.72rem; }
  .header-acciones { gap: 5px; }
  /* SALIR SE SEPARA DEL RESTO. En el celular queda en la esquina de arriba a la derecha,
     justo donde cae el pulgar al estirar la mano y pegado a la campana de avisos: apuntar a
     una y darle a la otra es cuestión de tiempo. Un hueco propio y menos contraste hacen que
     no compita con los botones que sí se usan a diario. Además pide confirmación. */
  #boton-salir { margin-left: 6px; opacity: 0.72; }
  #boton-salir:hover, #boton-salir:focus-visible { opacity: 1; }
}

main { max-width: 640px; margin: 0 auto; padding: 18px 14px 60px; }

/* ---------- barra lateral de escritorio ----------
   En celular NO existe (los tiles del inicio mandan). Todo lo suyo vive en el
   bloque @media ≥900px de más abajo; aquí solo se apaga. El pulso del inicio
   (tarjetas del tablero) igual: nace apagado y solo respira en pantalla grande. */
#barra-lateral { display: none; }
.pulso-inicio { display: none; }

/* ---------- descripción del ítem: varias líneas con su ✕ ---------- */
.cot-it-desc-zona { grid-area: desc2; display: flex; flex-direction: column; gap: 5px; }
.cot-it-detalles { display: flex; flex-direction: column; gap: 5px; }
.cot-it-detalle { display: grid; grid-template-columns: minmax(0, 1fr) 26px; gap: 5px; align-items: center; }
.cot-it-detalle .cot-it-det { font-size: 0.88rem; }
.cot-it-det-x { width: 26px; height: 26px; font-size: 0.7rem; }
/* el + no debe competir con los botones grandes: discreto y alineado a la izquierda */
.cot-it-mas {
  align-self: flex-start;
  padding: 5px 11px; font-size: 0.78rem;
  border-style: dashed;
}
/* en el detalle, las líneas debajo del título del ítem */
.cot-td-det { display: block; font-size: 0.82rem; color: var(--gris); line-height: 1.4; }
.cot-td-det::before { content: "· "; color: var(--oro); font-weight: 700; }

/* ---------- compartir la cotización con el cliente ---------- */
.cot-compartir {
  margin-top: 16px; padding: 14px;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 12px;
}
.cot-enlace {
  background: var(--blanco); border: 1px solid var(--borde); border-radius: 10px;
  padding: 9px 11px; margin: 8px 0;
  /* el enlace es largo y no debe desbordar el celular */
  overflow-x: auto; -webkit-overflow-scrolling: touch;
}
.cot-enlace code {
  font-family: ui-monospace, "Cascadia Mono", Consolas, monospace;
  font-size: 0.78rem; color: var(--bronce); white-space: nowrap;
}
.cot-respuesta {
  margin-top: 12px; padding: 10px 12px; border-radius: 10px;
  border-left: 3px solid var(--verde); background: var(--blanco);
}
.cot-respuesta.no { border-left-color: var(--rojo); }
/* pedido de ajustes: no es un veredicto, es «hablemos» — va en el bronce de la casa */
.cot-respuesta.ajuste { border-left-color: var(--bronce); background: #fdf8ef; }
.cot-respuesta .cot-notas { margin-top: 6px; font-size: 0.88rem; }
/* lo que el cliente anotó en ítems concretos, con el título del ítem al lado */
.cot-notas-items { margin: 8px 0 0; padding-left: 0; list-style: none; }
.cot-notas-items li {
  font-size: 0.86rem; line-height: 1.45; padding: 5px 0 5px 12px;
  border-left: 2px solid var(--oro-claro, #d8bd86); margin-bottom: 4px;
}
.cot-notas-items strong { color: var(--bronce); }

/* ---------- día por día de la nómina ---------- */
/* Franja que agrupa los días por semana del año. Selector con el ancestro a
   propósito: `.tabla-mes td` se declara más abajo con la misma especificidad y le
   ganaría el desempate por orden, dejando la franja con el relleno de una fila
   normal (el mismo tropiezo que el z-index de la ventanita de pausas). */
.tabla-mes .mes-semana td {
  padding: 10px 6px 4px;
  font-size: 0.68rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--gris);
  border-bottom: 1px solid var(--borde);
  background: none;
}
/* el punto azul: abre las pausas del día. Azul a propósito — es el único dato del
   día que se puede DESPLEGAR, y no debe confundirse con los avisos (ámbar/rojo). */
.punto-pausas {
  width: 11px; height: 11px;
  padding: 0; margin-left: 6px;
  border: none; border-radius: 50%;
  background: #2f6fd0;
  cursor: pointer;
  vertical-align: middle;
  flex: none;
  box-shadow: 0 0 0 0 rgba(47, 111, 208, 0.5);
  transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.punto-pausas:hover { transform: scale(1.15); box-shadow: 0 0 0 4px rgba(47, 111, 208, 0.18); }
/* doble clase: `.nom-linea` se declara después y le ganaría el desempate por orden */
.nom-linea.pausas-total { border-top: 1px solid var(--borde); margin-top: 4px; padding-top: 8px; }
/* La ventanita de pausas se abre ENCIMA del detalle del mes. Doble clase a
   propósito: `.velo` se declara más abajo con la misma especificidad y ganaría
   el desempate por orden, dejando esta ventana DEBAJO de la que la abrió. */
.velo.velo-encima { z-index: 70; }

/* ---------- cartera (quién nos debe) ---------- */
.cartera-total {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 12px;
  padding: 10px 14px; margin-top: 10px;
}
.cartera-total b { font-size: 1.3rem; color: var(--bronce); font-variant-numeric: tabular-nums; }
.cartera-cli { border: 1px solid var(--borde); border-radius: 12px; padding: 10px 12px; margin-top: 10px; background: var(--blanco); }
.cartera-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.cartera-nom { font-weight: 700; }
.cartera-saldo { font-weight: 800; font-variant-numeric: tabular-nums; color: var(--ambar); white-space: nowrap; }
.cartera-saldo.a-favor { color: var(--verde); }
.cartera-sub { font-size: 0.78rem; color: var(--gris); margin-top: 2px; }
.cartera-seccion { margin-top: 16px; font-weight: 700; }
.cartera-cli details { margin-top: 6px; }
.cartera-cli summary { cursor: pointer; font-size: 0.8rem; color: var(--gris); }
.cartera-movs { list-style: none; margin-top: 6px; font-size: 0.84rem; }
.cartera-movs li { display: flex; justify-content: space-between; gap: 8px; padding: 4px 0; border-bottom: 1px solid var(--crema); }
.cartera-movs li:last-child { border-bottom: none; }
.mov-cargo { color: var(--ambar); font-variant-numeric: tabular-nums; }
.mov-abono { color: var(--verde); font-variant-numeric: tabular-nums; }
.cartera-abono-btn { margin-top: 8px; width: 100%; }

/* ---------- pestañas ---------- */

.pestanas {
  display: flex;
  flex-wrap: wrap;          /* con 5 pestañas (panel) baja a 2 filas en móvil en vez de desbordar */
  gap: 8px;
  margin-bottom: 18px;
}

.pestanas button {
  flex: 1 1 auto;
  min-width: 88px;
  padding: 11px 10px;
  border: 1px solid var(--borde);
  background: rgba(255, 255, 255, 0.7);
  border-radius: 11px;
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--gris);
  cursor: pointer;
  white-space: nowrap;
  transition: all 0.18s ease;
  box-shadow: var(--sombra-sm);
}

.pestanas button.activa {
  background: var(--bronce-grad);
  border-color: var(--bronce-osc);
  color: var(--marfil);
  box-shadow: var(--sombra-md);
}

/* ---------- tarjetas ---------- */

.tarjeta {
  background: var(--blanco);
  border: 1px solid var(--borde);
  border-radius: 16px;
  padding: 20px;
  margin-bottom: 16px;
  box-shadow: var(--sombra-md);
}

.tarjeta h2 {
  font-size: 0.82rem;
  margin-bottom: 14px;
  color: var(--bronce);
  letter-spacing: 1.5px;
  text-transform: uppercase;
  font-weight: 700;
}
.tarjeta h2::before {
  content: "";
  display: inline-block;
  width: 14px;
  height: 2px;
  background: var(--oro);
  vertical-align: middle;
  margin-right: 8px;
  margin-bottom: 3px;
}

/* ---------- login ---------- */

.login {
  position: fixed;
  inset: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 26px;
  padding: 40px 20px;
  text-align: center;
  /* grano premium sobre un degradado blanco → dorado (champán con más oro) */
  background-image:
    url("marca/grano.png"),
    linear-gradient(180deg, #ffffff 0%, #f9f2df 30%, #eedcb4 58%, #ddc389 82%, #cfb277 100%);
  background-repeat: repeat, no-repeat;
  background-size: 180px 180px, cover;
  background-blend-mode: overlay, normal;
}

.login-marca {
  display: flex;
  flex-direction: column;
  align-items: center;
  position: relative;
  animation: surgir 0.9s cubic-bezier(0.16, 1, 0.3, 1) both;
}

/* monograma en tono bronce con brillo (mismo tono que el logotipo) */
.logo-wrap {
  position: relative;
  z-index: 1;
  width: 126px;
  height: 150px;
}
.logo-mono {
  width: 100%;
  height: 100%;
  display: block;
}
/* destello que recorre el logo cada pocos segundos, recortado a su forma */
.logo-glint {
  position: absolute;
  inset: 0;
  pointer-events: none;
  -webkit-mask: url("logo.svg") center / contain no-repeat;
  mask: url("logo.svg") center / contain no-repeat;
  background: linear-gradient(105deg, transparent 43%, rgba(255, 245, 218, 0.7) 50%, transparent 57%);
  background-repeat: no-repeat;
  background-size: 250% 100%;
  animation: glint 4s ease-in-out infinite;
}
@keyframes glint {
  0% { background-position: 170% 0; }
  42%, 100% { background-position: -70% 0; }
}

.logo-wordmark {
  position: relative;
  z-index: 1;
  margin-top: 20px;
  width: 250px;
  max-width: 80vw;
  height: auto;
}

.login-pie {
  font-size: 0.74rem;
  font-weight: 800;
  letter-spacing: 1.8px;
  text-transform: uppercase;
  color: #463c28;
}

.tarjeta-login {
  width: 100%;
  max-width: 360px;
  text-align: left;
  border-radius: 18px;
  padding: 24px;
  background: rgba(255, 255, 255, 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(255, 255, 255, 0.6);
  box-shadow: var(--sombra-lg);
  animation: surgir 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.12s both;
}

@keyframes surgir {
  from { opacity: 0; transform: translateY(16px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

/* acceso por correo bajo el login normal: discreto, no compite con el PIN */
.login-recuperar {
  display: block;
  width: 100%;
  margin-top: 14px;
  padding: 6px;
  background: none;
  border: none;
  color: var(--gris);
  font-size: 0.85rem;
  font-weight: 600;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
  transition: color 0.15s ease;
}
.login-recuperar:hover { color: var(--bronce); }

.login-correo-bloque {
  margin-top: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--borde);
  animation: surgir 0.4s ease both;
}

/* mensaje neutro del enlace (verde suave); en rojo si falta el correo */
.login-correo-msg {
  background: #e2f3e8;
  color: var(--verde-oscuro);
  border-radius: 8px;
  padding: 10px 12px;
  margin-top: 10px;
  font-size: 0.86rem;
  font-weight: 600;
  line-height: 1.4;
}
.login-correo-msg.login-correo-error { background: #fdecea; color: var(--rojo); }

/* pantalla de aterrizaje del enlace mágico (confirmar antes de canjear) */
.enlace-titulo {
  margin: 0 0 6px;
  color: var(--bronce);
  font-size: 1.3rem;
  font-weight: 800;
  letter-spacing: 0.3px;
}
.enlace-sub {
  margin: 0 0 16px;
  color: var(--gris);
  font-size: 0.92rem;
  line-height: 1.45;
}
/* en esta tarjeta el botón "Entrar" no lleva el margen extra del enlace de abajo */
#pantalla-enlace .principal { margin-top: 4px; }

select, textarea, input[type="password"], input[type="text"], input[type="date"],
input[type="datetime-local"], input[type="number"], input[type="time"],
input[type="email"], input[type="tel"], input[type="url"], input[type="month"],
input[type="search"] {
  width: 100%;
  padding: 12px 13px;
  font-size: 1rem;
  border: 1px solid var(--borde);
  border-radius: 11px;
  background: var(--blanco);
  margin-bottom: 12px;
  color: var(--tinta);
  transition: border-color 0.16s ease, box-shadow 0.16s ease;
}

/* Los controles NO heredan la letra: el navegador les impone la suya (aquí salían en
   Arial, que no es la de nadie). Con esto la letra de la app llega también a botones,
   campos y desplegables — en el iPhone pasan a la de Apple y en el monitor a Inter,
   en vez del Arial suelto que desentonaba en las dos. */
button, input, select, textarea, optgroup { font-family: inherit; }
textarea { resize: vertical; line-height: 1.5; }

select:focus, input:focus, textarea:focus {
  outline: none;
  border-color: var(--oro);
  box-shadow: 0 0 0 3px rgba(181, 146, 79, 0.15);
}

button.principal {
  width: 100%;
  padding: 14px;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--marfil);
  /* exactamente el color del logo (#463c28), sin grano, plano */
  background: #463c28;
  border: none;
  border-radius: 11px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  box-shadow: var(--sombra-md);
  transition: transform 0.12s ease, box-shadow 0.18s ease;
}

/* brillo dorado que cruza al pasar el cursor */
button.principal::before {
  content: "";
  position: absolute;
  top: 0; left: -120%;
  width: 60%; height: 100%;
  background: linear-gradient(100deg, transparent, rgba(216, 189, 134, 0.35), transparent);
  transition: left 0.6s ease;
}
button.principal:hover::before { left: 130%; }
button.principal:hover { box-shadow: var(--sombra-lg); }
button.principal:active { transform: translateY(1px); }

.error {
  background: #fdecea;
  color: var(--rojo);
  border-radius: 8px;
  padding: 10px 12px;
  margin-bottom: 12px;
  font-size: 0.9rem;
}

/* ---------- marcar ---------- */

.estado-linea { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.reloj {
  font-size: 3rem;
  font-weight: 300;
  letter-spacing: 2px;
  font-variant-numeric: tabular-nums;
  color: var(--bronce);
}
/* OJO: sin text-transform aquí — esta clase se reutiliza como nota gris en toda la app
   y capitalize ponía Cada Palabra En Mayúscula en frases enteras. La fecha del reloj
   (#fecha-hoy) capitaliza solo su primera letra. */
.fecha-hoy { color: var(--gris); font-size: 0.9rem; margin-bottom: 16px; }
#fecha-hoy::first-letter { text-transform: uppercase; }

/* contador de tiempo trabajado en vivo */
.trabajado-vivo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  padding: 13px 15px;
  margin-bottom: 16px;
  border-radius: 13px;
  border: 1px solid var(--borde);
  background: linear-gradient(135deg, #f2f6f1, #eaf0e8);
  transition: background 0.4s ease;
}
.trabajado-vivo.tv-pausa { background: linear-gradient(135deg, #fbf3df, #f6ebcf); }
.trabajado-vivo.tv-almuerzo { background: linear-gradient(135deg, #fceadd, #f7ddc9); }
.tv-label { font-size: 0.74rem; text-transform: uppercase; letter-spacing: 1px; color: var(--gris); font-weight: 700; }
.tv-tiempo {
  font-size: 1.45rem;
  font-weight: 700;
  color: var(--verde-oscuro);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.5px;
}
.tv-pausa .tv-tiempo { color: #a9720c; }
.tv-almuerzo .tv-tiempo { color: #a83f00; }

/* resumen de jornada al terminar */
.resumen-jornada .rj-linea {
  display: flex;
  justify-content: space-between;
  padding: 10px 2px;
  border-bottom: 1px solid var(--borde);
  font-size: 0.95rem;
}
.resumen-jornada .rj-linea:last-child { border-bottom: none; }
.resumen-jornada .rj-linea span:first-child { color: var(--gris); }
.resumen-jornada .rj-linea span:last-child { font-weight: 700; font-variant-numeric: tabular-nums; }
.resumen-jornada .rj-destacado span:last-child { color: var(--verde-oscuro); font-size: 1.15rem; }

/* ---------- menú inicial (tarjetas de secciones) ---------- */

.menu-tiles {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 2px;
}

.tile {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  padding: 18px 16px;
  background: var(--blanco);
  border: 1px solid var(--borde);
  border-radius: 16px;
  box-shadow: var(--sombra-md);
  cursor: pointer;
  text-align: left;
  position: relative;
  overflow: hidden;
  transition: transform 0.12s ease, box-shadow 0.18s ease;
}
/* filete dorado superior */
.tile::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--oro), var(--oro-claro));
}
.tile:hover { transform: translateY(-2px); box-shadow: var(--sombra-lg); }
.tile:active { transform: translateY(0); }
.tile-icon { font-size: 1.75rem; margin-bottom: 4px; }
.tile-nombre { font-weight: 700; color: var(--bronce); font-size: 1.02rem; letter-spacing: 0.3px; }
.tile-sub { font-size: 0.76rem; color: var(--gris); }

.tile-pronto { opacity: 0.62; cursor: default; }
.tile-pronto::before { background: var(--borde); }
.tile-pronto:hover { transform: none; box-shadow: var(--sombra-md); }
.tile-pronto .tile-sub { color: var(--oro); font-weight: 700; letter-spacing: 0.5px; }

.volver-inicio {
  background: none;
  border: none;
  color: var(--bronce);
  font-weight: 700;
  font-size: 0.95rem;
  padding: 2px 2px 14px;
  cursor: pointer;
  letter-spacing: 0.3px;
}

/* ---------- calendario ---------- */

.cal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.cal-titulo { margin: 0; font-size: 1.05rem; color: var(--bronce); font-weight: 800; letter-spacing: 0.3px; }
.cal-titulo::before { content: none; }
.cal-nav {
  width: 38px; height: 38px; border-radius: 10px;
  border: 1px solid var(--borde); background: var(--blanco);
  color: var(--bronce); font-size: 1.4rem; font-weight: 800; line-height: 1;
  cursor: pointer; display: grid; place-items: center;
}
.cal-nav:active { transform: scale(0.95); }

.cal-dow { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-bottom: 4px; }
.cal-dow span { text-align: center; font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: var(--gris); }

.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.cal-dia {
  aspect-ratio: 1 / 1;
  border: 1px solid var(--borde);
  background: var(--blanco);
  border-radius: 10px;
  padding: 4px;
  display: flex; flex-direction: column; align-items: center; justify-content: flex-start;
  gap: 3px; cursor: pointer;
  font: inherit; color: var(--tinta);
  position: relative;
  transition: background 0.12s ease;
}
.cal-dia:active { background: var(--crema); }
.cal-dia .dnum { font-size: 0.9rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.cal-dia.otro-mes { opacity: 0.4; }
.cal-dia.festivo { background: #fbf1df; border-color: #ecd9b4; }
.cal-dia.festivo .dnum { color: var(--naranja); font-weight: 800; }
.cal-dia.hoy { border-color: var(--bronce); border-width: 2px; }
.cal-dia.hoy .dnum { color: var(--bronce); font-weight: 800; }
.cal-dia .dots { display: flex; gap: 2px; flex-wrap: wrap; justify-content: center; }
.cal-dia .dots i { width: 6px; height: 6px; border-radius: 50%; display: block; }

.cal-leyenda { display: flex; gap: 16px; margin-top: 14px; flex-wrap: wrap; }
.cal-leyenda .ley { display: inline-flex; align-items: center; gap: 6px; font-size: 0.78rem; color: var(--gris); font-weight: 600; }
.cal-leyenda i { width: 10px; height: 10px; border-radius: 50%; display: block; }
.pt-hoy { border: 2px solid var(--bronce); }
.pt-festivo { background: var(--naranja); }
.pt-entrega { background: var(--gold-soft, var(--oro)); }

/* selector de color */
.proy-colores { display: flex; gap: 9px; flex-wrap: wrap; margin-bottom: 12px; }
.swatch { width: 30px; height: 30px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; box-shadow: var(--sombra-sm); }
.swatch.sel { border-color: var(--tinta); box-shadow: 0 0 0 2px var(--blanco), 0 0 0 4px var(--bronce); }

/* lista de entregas */
.lista-entregas { list-style: none; }
.lista-entregas li {
  display: flex; align-items: flex-start; gap: 11px;
  padding: 11px 2px; border-bottom: 1px solid var(--borde);
}
.lista-entregas li:last-child { border-bottom: none; }
.ent-color { width: 6px; align-self: stretch; border-radius: 4px; flex: none; min-height: 34px; }
.ent-info { flex: 1; min-width: 0; }
.ent-nombre { font-weight: 700; display: block; }
/* capitalize solo en la fecha (.ent-fecha): las notas del usuario van en esta misma línea */
.ent-meta { display: block; color: var(--gris); font-size: 0.8rem; margin-top: 2px; }
.ent-fecha { text-transform: capitalize; }
.lista-entregas .borrar { background: none; border: none; color: var(--rojo); font-size: 1rem; cursor: pointer; padding: 2px 4px; flex: none; }

/* la entrega ahora se toca para ver el detalle */
.ent-item { cursor: pointer; }
.ent-item:active { background: var(--crema); }
.ent-flecha { color: var(--gris); font-size: 1.2rem; flex: none; align-self: center; }
.ent-camara { flex: none; align-self: center; font-size: 0.9rem; }
/* el cliente: el fijo se marca; el ocasional va en gris, sin promesa de ficha */
.ent-cliente {
  display: inline-block; margin-top: 4px; font-size: 0.72rem; font-weight: 700;
  padding: 2px 8px; border-radius: 999px; background: var(--crema); color: var(--gris);
  border: 1px solid var(--borde);
}
.ent-cliente.fijo { background: var(--oro-claro); color: var(--bronce-osc); border-color: var(--oro); }

/* filtro por cliente, encima del calendario */
.cal-filtros { display: flex; gap: 6px; flex-wrap: wrap; }
.cal-chip {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--blanco); border: 1px solid var(--borde); border-radius: 999px;
  padding: 6px 11px; font-size: 0.78rem; font-weight: 700; color: var(--gris); cursor: pointer;
}
.cal-chip i { width: 9px; height: 9px; border-radius: 50%; display: block; flex: none; }
.cal-chip.sel { background: var(--bronce-grad); color: var(--marfil); border-color: var(--bronce-osc); }

/* foto de referencia de la entrega */
.ent-foto-caja { margin-bottom: 14px; border-radius: 12px; overflow: hidden; background: var(--crema); }
.ent-foto-caja img { display: block; width: 100%; max-height: 260px; object-fit: cover; }
.ent-acciones { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 14px; }
.ent-acciones .secundario { width: 100%; padding: 10px 6px; font-size: 0.8rem; }

/* clientes fijos */
.lista-clientes { list-style: none; }
.cli-item {
  display: flex; align-items: center; gap: 11px;
  padding: 11px 2px; border-bottom: 1px solid var(--borde);
}
.cli-item:last-child { border-bottom: none; }
.cli-color { width: 12px; height: 12px; border-radius: 50%; flex: none; box-shadow: var(--sombra-sm); }
.cli-info { flex: 1; min-width: 0; }
.cli-info strong { display: block; font-size: 0.95rem; color: var(--tinta); }
.cli-info small { display: block; color: var(--gris); font-size: 0.78rem; margin-top: 1px; }
.cli-btn { flex: none; padding: 7px 14px; font-size: 0.8rem; }

.prox { font-size: 0.68rem; font-weight: 800; padding: 1px 7px; border-radius: 999px; letter-spacing: 0.3px; vertical-align: middle; text-transform: none; }
.prox.vencido { background: #fdecea; color: var(--rojo); }
.prox.hoy-p { background: #e2f3e8; color: var(--verde-oscuro); }
.prox.semana { background: #fff3d6; color: #8a6410; }

.dia-festivo { background: #fbf1df; border: 1px solid #ecd9b4; color: var(--naranja); border-radius: 10px; padding: 9px 12px; font-weight: 700; font-size: 0.9rem; }

/* ---------- mi perfil ---------- */

.perfil-ok {
  background: #e2f3e8;
  color: var(--verde-oscuro);
  border-radius: 8px;
  padding: 10px 12px;
  margin-bottom: 12px;
  font-size: 0.9rem;
  font-weight: 700;
}

.lista-horarios { list-style: none; }
.lista-horarios li {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 11px 2px; border-bottom: 1px solid var(--borde);
}
.lista-horarios li:last-child { border-bottom: none; }
.hm-mes { font-weight: 700; text-transform: capitalize; }
.hm-datos { text-align: right; }
.hm-horas { display: block; font-weight: 800; color: var(--bronce); font-variant-numeric: tabular-nums; font-size: 1.05rem; }
.hm-sub { display: block; font-size: 0.76rem; color: var(--gris); }

/* nómina y saldo */
.saldo-grande { font-size: 2.3rem; font-weight: 800; font-variant-numeric: tabular-nums; letter-spacing: -0.5px; margin-bottom: 4px; }
.saldo-grande.positivo { color: var(--verde-oscuro); }
.saldo-grande.negativo { color: var(--rojo); }

.lista-nomina { list-style: none; }
.nom-mes { padding: 15px 2px; border-bottom: 1px solid var(--borde); }
.nom-mes:last-child { border-bottom: none; }
.nom-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; margin-bottom: 9px; }
.nom-titulo { font-weight: 800; color: var(--bronce); }
.nom-saldo { font-weight: 800; font-variant-numeric: tabular-nums; font-size: 1.05rem; }
.nom-saldo.positivo { color: var(--verde-oscuro); }
.nom-saldo.negativo { color: var(--rojo); }
.nom-linea { display: flex; justify-content: space-between; gap: 10px; font-size: 0.9rem; padding: 3px 0; }
.nom-linea > span:last-child { font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap; }
.nom-ant { color: var(--gris); font-size: 0.83rem; padding-left: 12px; }
.nom-arr { color: var(--gris); border-top: 1px dashed var(--borde); margin-top: 7px; padding-top: 7px; font-size: 0.83rem; }

.saldo-actual-admin { font-size: 1.35rem; font-weight: 800; margin: 14px 0; font-variant-numeric: tabular-nums; }
.saldo-actual-admin.positivo { color: var(--verde-oscuro); }
.saldo-actual-admin.negativo { color: var(--rojo); }

/* nota bajo el saldo — texto normal (sin capitalizar cada palabra) */
.saldo-nota { color: var(--gris); font-size: 0.9rem; margin: 0; }

/* el sueldo, por tramos: «desde tal mes gana tanto». Se lee como una historia —del más
   viejo al más nuevo—, así que va en filas, no en tarjetas sueltas. */
.nom-sueldos { border-top: 1px solid var(--borde); margin-top: 18px; padding-top: 14px; }
.nom-sueldos .subtitulo { display: block; margin-bottom: 4px; }
.nom-tramo { display: flex; align-items: baseline; gap: 10px; padding: 7px 2px; border-bottom: 1px dashed var(--borde); font-size: 0.9rem; }
.nom-tramo:last-child { border-bottom: none; }
.nom-tramo-mes { flex: 1; min-width: 190px; color: var(--gris); }
.nom-tramo-val { font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.nom-tramo button { padding: 0; font-size: 0.8rem; }
/* la división a la vista, antes de guardar */
#nom-s-cuenta { margin-top: 6px; font-variant-numeric: tabular-nums; }
#nom-s-horas-caja { max-width: 120px; }
/* con qué se pagó cada mes, bajo el monto de la fila */
.nom-a-tarifa { color: var(--gris); font-size: 0.76rem; font-weight: 600; }
.nom-sin-sueldo { color: var(--rojo); font-size: 0.76rem; font-weight: 600; }

/* tarjeta de mes clicable */
.nom-mes-link { cursor: pointer; transition: background 0.15s; border-radius: 8px; padding-left: 8px; padding-right: 8px; }
.nom-mes-link:hover { background: rgba(70, 60, 40, 0.05); }
.nom-ver { color: var(--gold); font-size: 0.78rem; font-weight: 700; margin-top: 6px; }

/* detalle de mes (modal) */
.mes-resumen { margin-bottom: 12px; }
.tabla-mes { font-size: 0.86rem; }
.tabla-mes td, .tabla-mes th { padding: 6px 8px; }
.tabla-mes .dia-incons td { color: var(--rojo); }
.mes-vacio { text-align: center; color: var(--gris); }
.mes-ant { padding: 8px 0; border-bottom: 1px solid var(--borde); }
.mes-ant:last-child { border-bottom: none; }
.mes-ant-info { display: flex; justify-content: space-between; gap: 10px; font-size: 0.88rem; }
.mes-ant-monto { font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap; }
.mes-ant-monto.pos { color: var(--verde-oscuro); }
.mes-ant em { color: var(--gold); font-style: normal; font-weight: 700; }
.ver-foto { background: none; border: none; color: var(--gold); font-weight: 700; font-size: 0.8rem; cursor: pointer; padding: 4px 0 0; }
.foto-comprobante { width: 100%; max-height: 60vh; object-fit: contain; border-radius: 10px; background: #f4efe5; }

/* fila de mes clicable en la tabla del admin */
.fila-mes { cursor: pointer; }
.fila-mes:hover { background: rgba(70, 60, 40, 0.05); }
.ver-mes { color: var(--gold); font-size: 0.72rem; font-weight: 700; }
.ver-foto-a { background: none; border: none; color: var(--gold); font-weight: 700; cursor: pointer; font-size: 0.82rem; flex: none; white-space: nowrap; }

/* documentación / contabilidad */
.lista-docs { list-style: none; }
.doc-item { padding: 12px 2px; border-bottom: 1px solid var(--borde); }
.doc-item:last-child { border-bottom: none; }
.doc-top { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.doc-top-l { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.doc-nombre { font-weight: 700; color: var(--bronce); overflow: hidden; text-overflow: ellipsis; }
.doc-handle { cursor: grab; color: var(--gris); font-size: 1.15rem; line-height: 1; flex: none; touch-action: none; user-select: none; -webkit-user-select: none; }
.doc-handle:active { cursor: grabbing; }
.doc-item.sortable-chosen { background: #f6f1e6; border-radius: 8px; }
.doc-item.sortable-ghost { opacity: 0.4; }
.doc-monto { font-weight: 800; font-variant-numeric: tabular-nums; white-space: nowrap; }
.doc-meta { color: var(--gris); font-size: 0.82rem; margin-top: 2px; }
.doc-acciones { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.doc-acciones button { background: none; border: 1px solid var(--borde); border-radius: 8px; padding: 5px 10px; font-size: 0.8rem; font-weight: 700; cursor: pointer; color: var(--bronce); }
.doc-acciones button.link { border: none; padding: 5px 2px; color: var(--gold); }
.doc-acciones button.ver-btn { background: var(--bronce); color: #fff; border-color: var(--bronce); padding: 7px 16px; }
.doc-acciones button.compartir { border-color: var(--bronce); }
.doc-acciones button.peligro { color: var(--rojo); border-color: var(--rojo); }
.badge-vig { font-size: 0.68rem; font-weight: 800; padding: 2px 8px; border-radius: 999px; letter-spacing: 0.2px; white-space: nowrap; }
.vig-ok { background: #e3efe4; color: var(--verde-oscuro); }
.vig-pronto { background: #fbf0d5; color: #8a6d1e; }
.vig-vencido { background: #f7dcdc; color: var(--rojo); }
/* visor de archivos a pantalla completa (PDF renderizado / imagen) */
.visor-full { position: fixed; inset: 0; z-index: 2000; background: #2c2a26; display: flex; flex-direction: column; }
.visor-full .visor-barra { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 10px 14px; background: var(--bronce); flex: none; }
.visor-titulo { font-weight: 800; color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.visor-btns { display: flex; gap: 8px; flex: none; }
.visor-btns button { padding: 8px 14px; font-size: 0.9rem; font-weight: 700; border: 0; border-radius: 8px; background: rgba(255, 255, 255, 0.16); color: #fff; cursor: pointer; }
.visor-btns button:active { background: rgba(255, 255, 255, 0.32); }
.visor-cont { flex: 1; overflow: auto; -webkit-overflow-scrolling: touch; padding: 10px; text-align: center; }
.visor-cont img { max-width: 100%; height: auto; display: inline-block; border-radius: 6px; }
.pdf-pagina { position: relative; margin: 0 auto 10px; background: #fff; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.45); }
.pdf-pagina canvas { display: block; width: 100%; height: 100%; }
/* Capa de texto transparente encima del lienzo: permite seleccionar y copiar. */
.textLayer { position: absolute; inset: 0; overflow: hidden; line-height: 1; text-align: initial; text-size-adjust: none; -webkit-text-size-adjust: none; forced-color-adjust: none; transform-origin: 0 0; z-index: 2; opacity: 1; }
.textLayer span, .textLayer br { color: transparent; position: absolute; white-space: pre; cursor: text; transform-origin: 0 0; }
.textLayer span.markedContent { top: 0; height: 0; }
.textLayer ::selection { background: rgba(120, 90, 40, 0.4); }
.textLayer br::selection { background: transparent; }
.textLayer .endOfContent { display: block; position: absolute; inset: 100% 0 0; z-index: 0; cursor: default; user-select: none; }
.textLayer .endOfContent.active { top: 0; }
.visor-cargando { color: #eee; padding: 40px 20px; }

.badge-estado { font-size: 0.68rem; font-weight: 800; padding: 2px 8px; border-radius: 999px; white-space: nowrap; }
.est-pendiente { background: #fbf0d5; color: #8a6d1e; }
.est-pagado { background: #e3efe4; color: var(--verde-oscuro); }
/* estados del expediente de impuestos */
.est-prep { background: #efe9dc; color: #6b5f45; }        /* 📝 en preparación (neutro) */
.est-porpagar { background: #fbf0d5; color: #8a6d1e; }    /* 💰 pide acción (ámbar) */

/* ---------- impuestos: año → meses (carpetas) → expedientes ---------- */
.imp-anios { margin: 4px 0 14px; }
.imp-anios button { flex: 0 0 auto; min-width: 64px; padding: 8px 14px; }

/* fila del desplegable de tipo de impuesto + botón "nuevo" (modal cargar impuesto) */
.imp-tipo-fila { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; }
.imp-tipo-fila select { flex: 1; margin-bottom: 0; }
.imp-tipo-fila button { flex: none; padding: 9px 12px; white-space: nowrap; }
.imp-tipo-fila .tipo-borrar { padding: 9px 10px; }
.imp-mes { border: 1px solid var(--borde); border-radius: 12px; margin-bottom: 12px; background: rgba(255, 255, 255, 0.55); overflow: hidden; }
.imp-mes[open] { box-shadow: var(--sombra-sm); }
.imp-mes-cab { list-style: none; cursor: pointer; display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 12px 14px; font-weight: 700; }
.imp-mes-cab::-webkit-details-marker { display: none; }
.imp-mes-cab::before { content: '▸'; color: var(--gris); margin-right: 6px; font-size: 0.8rem; transition: transform 0.15s ease; }
.imp-mes[open] > .imp-mes-cab::before { transform: rotate(90deg); }
.imp-mes-nom { color: var(--bronce); font-size: 1.02rem; flex: 1; }
.imp-mes-meta { color: var(--gris); font-size: 0.78rem; font-weight: 600; white-space: nowrap; }
.imp-mes-cuerpo { padding: 4px 14px 14px; border-top: 1px solid var(--borde); }

/* rejilla de expedientes: en el monitor se acomodan 2-3 por fila; en el celular, 1 */
.imp-grid { display: grid; grid-template-columns: 1fr; gap: 12px; margin: 12px 0; }
.imp-exp { border: 1px solid var(--borde); border-left: 4px solid var(--borde); border-radius: 10px; padding: 12px; background: var(--blanco); }
.est-borde-enPreparacion { border-left-color: #c9bfa6; }
.est-borde-porPagar { border-left-color: var(--ambar); }
.est-borde-pagado { border-left-color: var(--verde); }
.imp-exp-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.imp-exp-monto { font-weight: 800; font-variant-numeric: tabular-nums; margin-top: 2px; }

.imp-slots { list-style: none; margin: 10px 0 0; }
.imp-slot { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; padding: 6px 8px; border-radius: 8px; }
.imp-slot.sig { background: #fbf6ea; }                     /* pista suave del siguiente paso */
.imp-slot-nom { font-size: 0.86rem; color: var(--tinta); }
.imp-slot.hecho .imp-slot-nom { color: var(--gris); }
.imp-slot-ck { font-size: 0.9rem; }
.imp-slot-acc { display: flex; flex-wrap: wrap; gap: 6px; }

.imp-btn { background: none; border: 1px solid var(--borde); border-radius: 8px; padding: 4px 10px; font-size: 0.76rem; font-weight: 700; cursor: pointer; color: var(--bronce); }
.imp-btn:hover { background: var(--crema); }
.imp-btn.peligro { color: var(--rojo); border-color: var(--rojo); }
.imp-exp-acc { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--borde); }

.imp-docsmes { margin-top: 6px; padding-top: 10px; border-top: 1px dashed var(--borde); }
.imp-docsmes-tit { font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px; color: var(--gris); }
.imp-dm { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; padding: 6px 0; border-bottom: 1px solid var(--borde); }
.imp-dm:last-of-type { border-bottom: none; }
.imp-dm-nom { font-size: 0.86rem; font-weight: 600; color: var(--tinta); }
.imp-dm-ret { font-weight: 700; font-size: 0.8rem; color: var(--bronce); font-variant-numeric: tabular-nums; }
/* el tipo guardado ya no existe en el catálogo (se borró): aviso suave, no un error */
.imp-dm-huerfano { color: var(--naranja, #b06000); font-weight: 700; font-size: 0.78rem; margin-left: 4px; }

/* tarjeta "Retenciones a favor" */
.ret-fila { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--borde); }
.ret-fila:last-child { border-bottom: none; }
.ret-tipo { font-weight: 600; color: var(--tinta); }
.ret-monto { font-weight: 700; color: var(--tinta); font-variant-numeric: tabular-nums; }
.ret-monto small { color: var(--gris); font-weight: 600; }
.ret-total { margin-top: 2px; border-top: 2px solid var(--borde); border-bottom: none; font-weight: 800; }
.ret-total span:last-child { color: var(--verde); font-variant-numeric: tabular-nums; }
.imp-add { margin-top: 8px; }
.imp-mes-pie { margin-top: 12px; }
.imp-globales { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 12px; }
.imp-globales .secundario { flex: 1 1 auto; }

/* cuentas y datos para copiar */
.lista-datos { list-style: none; }
.dato-item { padding: 14px 0; border-bottom: 1px solid var(--borde); }
.dato-item:last-child { border-bottom: none; }
.dato-titulo { font-weight: 800; color: var(--bronce); margin-bottom: 6px; }
.dato-contenido { white-space: pre-wrap; word-break: break-word; background: #f6f1e6; border-radius: 8px; padding: 10px 12px; font-size: 0.92rem; line-height: 1.5; }
.dato-acciones { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.dato-acciones button { border: 1px solid var(--borde); border-radius: 8px; padding: 6px 12px; font-size: 0.82rem; font-weight: 700; cursor: pointer; color: var(--bronce); background: none; }
.dato-acciones button.copiar { background: var(--bronce); color: #fff; border-color: var(--bronce); padding: 8px 18px; }
.dato-acciones button.abrir { background: var(--bronce); color: #fff; border-color: var(--bronce); padding: 8px 18px; text-decoration: none; display: inline-block; }
.dato-acciones button.peligro { color: var(--rojo); border-color: var(--rojo); }
.link-url { color: var(--gris); font-size: 0.85rem; margin-bottom: 6px; word-break: break-all; }

/* ---------- permisos (modal admin) ---------- */

.permiso-op {
  display: flex; gap: 11px; align-items: flex-start;
  padding: 12px 2px; border-bottom: 1px solid var(--borde); cursor: pointer;
}
.permiso-op:last-of-type { border-bottom: none; }
.permiso-op input { width: 22px; height: 22px; margin-top: 1px; accent-color: var(--bronce); flex: none; }
.permiso-op strong { display: block; color: var(--tinta); }
.permiso-op small { display: block; color: var(--gris); font-size: 0.8rem; margin-top: 2px; }

.insignia {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 14px;
  border-radius: 999px;
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.5px;
  color: var(--blanco);
  box-shadow: var(--sombra-sm);
}
.insignia::before {
  content: "";
  width: 7px; height: 7px;
  border-radius: 50%;
  background: currentColor;
  opacity: 0.9;
  box-shadow: 0 0 8px currentColor;
}
.insignia.fuera { background: linear-gradient(135deg, #8a9182, var(--gris)); }
.insignia.trabajando { background: linear-gradient(135deg, #37946a, var(--verde)); }
.insignia.pausa { background: linear-gradient(135deg, #d99b28, var(--ambar)); }
.insignia.almuerzo { background: linear-gradient(135deg, #e0691a, var(--naranja)); }

/* ---------- equipo (chip + modal) ---------- */

.estado-derecha { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; }

.chip-equipo {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: rgba(70, 60, 40, 0.08);
  border: 1px solid var(--borde);
  border-radius: 999px;
  padding: 5px 12px;
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--bronce);
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.16s ease;
}
.chip-equipo:hover { background: rgba(70, 60, 40, 0.16); }
.chip-equipo:active { transform: scale(0.97); }

/* campanita de notificaciones */
.campana { position: relative; font-size: 0.95rem; padding: 7px 11px; }
.notif-badge {
  position: absolute; top: -6px; right: -6px;
  min-width: 18px; height: 18px; padding: 0 4px;
  background: #c0392b; color: #fff; border-radius: 999px;
  font-size: 0.66rem; font-weight: 800; line-height: 18px; text-align: center;
  border: 2px solid var(--bronce); box-sizing: border-box;
}
.lista-notif { list-style: none; }
.lista-notif li {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 11px 6px; border-bottom: 1px solid var(--borde); font-size: 0.92rem;
}
.lista-notif li:last-child { border-bottom: none; }
.lista-notif li.no-leida { background: rgba(181, 146, 79, 0.12); border-radius: 8px; }
.noti-icono { font-size: 1.1rem; flex: none; line-height: 1.35; }
.noti-cuerpo { display: flex; flex-direction: column; gap: 2px; }
.noti-texto { line-height: 1.35; }
.noti-hora { color: var(--gris); font-size: 0.78rem; }

.modal-equipo {
  text-align: left;
  max-width: 420px;
  max-height: 88vh;
  overflow-y: auto;
}
.titulo-modal { color: var(--bronce); margin-bottom: 8px; font-size: 1.05rem; }

.lista-equipo, .lista-registros { list-style: none; }
.lista-equipo li, .lista-registros li {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 10px;
  padding: 9px 2px;
  border-bottom: 1px solid var(--borde);
  font-size: 0.94rem;
}
.lista-equipo li:last-child, .lista-registros li:last-child { border-bottom: none; }
.lista-equipo .eq-nombre, .lista-registros .eq-nombre { font-weight: 600; }
.lista-registros .eq-tipo { color: var(--gris); font-weight: 400; }
.lista-registros .hora { font-weight: 700; font-variant-numeric: tabular-nums; color: var(--bronce); }

.cerrar-modal {
  width: 100%;
  margin-top: 16px;
  padding: 12px;
  border-radius: 10px;
  border: none;
  background: var(--bronce);
  color: var(--marfil);
  font-weight: 700;
  font-size: 1rem;
  cursor: pointer;
}

.botones-marca { display: grid; grid-template-columns: 1fr; gap: 12px; }

.botones-marca button {
  padding: 20px;
  font-size: 1.15rem;
  font-weight: 700;
  letter-spacing: 1.5px;
  border: none;
  border-radius: 15px;
  color: var(--blanco);
  cursor: pointer;
  position: relative;
  overflow: hidden;
  box-shadow: var(--sombra-md);
  transition: transform 0.12s ease, box-shadow 0.18s ease, filter 0.12s ease;
}
.botones-marca button::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.18), transparent 45%);
  pointer-events: none;
}
.botones-marca button:hover { transform: translateY(-1px); box-shadow: var(--sombra-lg); }
.botones-marca button:active { transform: translateY(1px); filter: brightness(0.92); }
.b-entrada { background: linear-gradient(135deg, #3a9268 0%, var(--verde-oscuro) 100%); }
.b-pausa { background: linear-gradient(135deg, #d99b28 0%, #a9720c 100%); }
.b-despausa { background: linear-gradient(135deg, #1e8c7e 0%, #0f5d54 100%); }
.b-almuerzo { background: linear-gradient(135deg, #e0691a 0%, #a83f00 100%); }
.b-fin_almuerzo { background: linear-gradient(135deg, #1e8c7e 0%, #0f5d54 100%); }
.b-salida { background: linear-gradient(135deg, #cf4436 0%, #932619 100%); }

/* Qué se le retiene al proveedor AL PAGARLE. Va en una caja aparte del pie de la factura
   a propósito: las de arriba son las que el proveedor sugirió en su XML, éstas las decide
   Raíces. Se parecen demasiado como para dejarlas juntas. */
.facd-ret-caja { margin-top: 14px; border-top: 1px solid var(--borde); padding-top: 12px; }
.facd-ret-tit { font-size: 0.72rem; font-weight: 800; letter-spacing: 1px; text-transform: uppercase; color: var(--bronce); margin-bottom: 6px; }
.facd-ret-linea { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 5px 0; font-size: 0.9rem; }
.facd-ret-linea small { display: block; color: var(--gris); font-size: 0.76rem; font-weight: 400; }
.facd-ret-linea strong { font-variant-numeric: tabular-nums; white-space: nowrap; }
.facd-ret-linea.apagada { opacity: 0.72; }
.facd-ret-no { color: var(--gris); font-size: 0.8rem; white-space: nowrap; }
.facd-ret-neto { border-top: 1px solid var(--borde); margin-top: 4px; padding-top: 8px; font-weight: 700; }
.facd-ret-dian { color: var(--gris); font-size: 0.84rem; }
.facd-ret-pago { margin-top: 10px; padding: 8px 10px; border-radius: 8px; background: var(--crema); border-left: 4px solid var(--verde-oscuro); font-size: 0.84rem; }
.facd-ret-pago.entero { border-left-color: var(--ambar); }
.facd-ret-ojo { color: var(--rojo); font-weight: 700; }
.facd-ret-cuadra { color: var(--verde-oscuro); font-weight: 700; }

/* ESCOGER LA ACTIVIDAD. El RUT da 4 dígitos y Bogotá usa 5, así que a veces hay dos
   actividades posibles con tarifas distintas. Se ven las dos completas —descripción
   oficial y tarifa— porque la decisión se toma leyéndolas; la escogida va marcada. */
.facd-act-caja { margin-top: 12px; }
/* el rótulo y su explicación son dos frases, no una: sin esto salían pegadas
   («…en BogotáSu RUT dice 4663») */
.facd-act-caja > label { display: block; font-weight: 700; font-size: 0.88rem; margin-bottom: 2px; }
.facd-act-caja > small { display: block; color: var(--gris); font-size: 0.8rem; line-height: 1.4; }
.facd-act-ops { display: flex; flex-direction: column; gap: 6px; margin: 6px 0 4px; }
.facd-act {
  display: grid; grid-template-columns: auto 1fr auto; align-items: baseline; gap: 4px 10px;
  width: 100%; text-align: left; cursor: pointer;
  padding: 8px 10px; border: 1px solid var(--borde); border-radius: 8px;
  background: var(--blanco); color: inherit; font: inherit;
}
.facd-act:hover:not(.puesta) { border-color: var(--bronce); background: var(--crema); }
.facd-act.puesta { border-color: var(--verde-oscuro); border-width: 2px; padding: 7px 9px; background: var(--crema); cursor: default; }
.facd-act[disabled] { opacity: 0.55; cursor: progress; }
.facd-act-cod { font-weight: 800; font-variant-numeric: tabular-nums; color: var(--bronce); }
.facd-act-nom { font-size: 0.84rem; line-height: 1.35; }
.facd-act-tar { font-size: 0.8rem; font-weight: 700; white-space: nowrap; font-variant-numeric: tabular-nums; }
.facd-act-regla { display: block; color: var(--gris); font-size: 0.76rem; line-height: 1.45; }
.facd-act-regla em { font-style: normal; font-weight: 700; }
@media (max-width: 560px) {
  .facd-act { grid-template-columns: auto auto; }
  .facd-act-nom { grid-column: 1 / -1; }
}

/* El doble del domingo: la propuesta va bajo su día, no escondida en otra pantalla. La
   barra de color de la izquierda dice de un vistazo en qué estado está. */
.fila-recargo > td { padding: 8px 12px; border-left: 4px solid var(--gold); background: var(--crema); }
.fila-recargo.pendiente > td { border-left-color: var(--ambar); }
.fila-recargo.aplicado > td { border-left-color: var(--verde-oscuro); }
.fila-recargo.descartado > td { border-left-color: var(--borde); opacity: 0.72; }
.rec-caja { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.rec-texto { flex: 1; min-width: 240px; font-size: 0.86rem; }
.rec-tipo { font-weight: 800; color: var(--bronce); }
.rec-cuenta { color: var(--gris); margin-top: 2px; }
.rec-nota { color: var(--gris); }
.rec-falto { color: var(--rojo); }
.rec-si { color: var(--verde-oscuro); }
.rec-no { color: var(--rojo); }
.rec-fallo { margin-top: 3px; font-weight: 700; }
.rec-botones { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rec-botones button { white-space: nowrap; }

/* Corregir un día desde el estado de cuenta. El nombre del día es un botón, pero se ve
   como el texto que reemplazó: lo que invita a hacer clic es el subrayado al pasar. */
.dia-abrir {
  background: none; border: none; padding: 0; margin: 0;
  font: inherit; color: inherit; cursor: pointer; text-align: left;
}
.dia-abrir:hover { text-decoration: underline; }
/* el «…» de lo que falta: ahí se ve el hueco, así que ahí se arregla */
.falta-marca {
  background: none; border: none; padding: 0 4px; margin: 0;
  font: inherit; color: var(--rojo); font-weight: 800; cursor: pointer; letter-spacing: 1px;
}
.falta-marca:hover { text-decoration: underline; }
.fila-editar-dia > td { background: var(--crema); padding: 10px 12px; }
.fila-editar-dia .fila-controles { margin-bottom: 0; margin-top: 8px; }
.fila-editar-dia .fila-controles > div { max-width: 170px; }
.fila-editar-dia .error { margin-top: 8px; }

.lista-marcas { list-style: none; }
.lista-marcas li {
  display: flex;
  justify-content: space-between;
  padding: 9px 2px;
  border-bottom: 1px solid var(--borde);
  font-size: 0.95rem;
}
.lista-marcas li:last-child { border-bottom: none; }
.lista-marcas .hora { font-weight: 700; font-variant-numeric: tabular-nums; }
.nota-editada { color: var(--ambar); font-size: 0.8rem; }

/* ---------- compras ---------- */

.form-compra { display: flex; gap: 8px; margin-bottom: 6px; }
.form-compra input { flex: 1; margin-bottom: 0; }
.form-compra button {
  padding: 0 18px;
  font-size: 1.3rem;
  font-weight: 800;
  color: var(--blanco);
  background: var(--verde);
  border: none;
  border-radius: 10px;
  cursor: pointer;
}

.lista-compras { list-style: none; }
.lista-compras li {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 11px 2px;
  border-bottom: 1px solid var(--borde);
}
.lista-compras li:last-child { border-bottom: none; }
.lista-compras input[type="checkbox"] { width: 22px; height: 22px; accent-color: var(--verde); flex-shrink: 0; }
.lista-compras .texto { flex: 1; }
.lista-compras .meta { display: block; color: var(--gris); font-size: 0.78rem; margin-top: 2px; }
.lista-compras li.hecho .texto { text-decoration: line-through; color: var(--gris); }
.compra-prov {
  display: inline-block; margin-left: 8px; font-size: 0.72rem; font-weight: 700;
  padding: 1px 8px; border-radius: 999px; background: var(--oro-claro); color: var(--bronce-osc);
  vertical-align: middle;
}
.lista-compras li.hecho .compra-prov { opacity: 0.6; }
.lista-compras .borrar {
  background: none; border: none; color: var(--rojo); font-size: 1.1rem; cursor: pointer; padding: 4px;
}

.subtitulo { color: var(--gris); font-size: 0.85rem; font-weight: 700; margin: 16px 0 4px; text-transform: uppercase; letter-spacing: 0.5px; }

/* ---------- tablas admin ---------- */

.envoltura-tabla { overflow-x: auto; }

table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
th, td { text-align: left; padding: 9px 10px; border-bottom: 1px solid var(--borde); white-space: nowrap; }
th { color: var(--gris); font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.4px; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }

.acciones button {
  background: none;
  border: 1px solid var(--borde);
  border-radius: 7px;
  padding: 4px 9px;
  font-size: 0.8rem;
  cursor: pointer;
  margin-right: 4px;
  color: var(--tinta);
}
.acciones button.peligro { color: var(--rojo); border-color: #ecc; }

.fila-controles { display: flex; gap: 10px; align-items: end; flex-wrap: wrap; margin-bottom: 14px; }
.fila-controles label { font-size: 0.8rem; color: var(--gris); display: block; margin-bottom: 4px; }
.fila-controles > div { flex: 1; min-width: 130px; }
.fila-controles input, .fila-controles select { margin-bottom: 0; }
.fila-controles button { white-space: nowrap; }

button.secundario {
  padding: 12px 18px;
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: 0.5px;
  background: var(--blanco);
  color: var(--bronce);
  border: 1.5px solid var(--bronce);
  border-radius: 11px;
  cursor: pointer;
  transition: background 0.16s ease, color 0.16s ease;
}
button.secundario:hover { background: var(--bronce); color: var(--marfil); }

.aviso {
  background: #fff8e6;
  border: 1px solid #eadfa9;
  color: #7a621a;
  border-radius: 10px;
  padding: 10px 14px;
  font-size: 0.88rem;
  margin-bottom: 16px;
}

/* aviso de bienvenida tras entrar por enlace mágico, con la recuperación de PIN dentro */
.aviso-enlace { position: relative; padding: 14px 16px; }
.be-x {
  position: absolute;
  top: 8px;
  right: 10px;
  background: none;
  border: none;
  color: #a2884a;
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
  padding: 4px;
}
.be-x:hover { color: var(--bronce); }
.be-texto { font-weight: 700; padding-right: 20px; }

/* aviso de versión nueva (pestaña abierta desde antes del último deploy) */
.aviso-version { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.aviso-version button { flex: none; }

/* aviso de push apagado en el menú principal (no invasivo, se cierra por una semana) */
.aviso-push { position: relative; padding: 14px 16px; }
.ap-texto { padding-right: 20px; line-height: 1.4; }
.ap-activar { margin-top: 10px; }
.be-reset-link {
  display: inline-block;
  margin-top: 8px;
  padding: 2px 0;
  background: none;
  border: none;
  color: var(--bronce);
  font-size: 0.86rem;
  font-weight: 700;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.be-reset-bloque {
  margin-top: 10px;
  padding-top: 12px;
  border-top: 1px solid #eadfa9;
  animation: surgir 0.35s ease both;
}

/* ---------- reportes de corrección ---------- */

button.mini {
  background: none;
  border: 1px solid var(--borde);
  border-radius: 7px;
  padding: 3px 8px;
  font-size: 0.75rem;
  color: var(--gris);
  cursor: pointer;
  margin-left: 8px;
}
button.mini:active { border-color: var(--verde); color: var(--verde); }

.chip {
  display: inline-block;
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 0.78rem;
  font-weight: 700;
  white-space: nowrap;
}
.chip-pendiente { background: #fff3d6; color: #8a6410; }
.chip-aprobado { background: #e2f3e8; color: var(--verde-oscuro); }
.chip-rechazado { background: #fdecea; color: var(--rojo); }

.badge-num {
  display: inline-block;
  background: var(--rojo);
  color: var(--blanco);
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: 800;
  padding: 1px 7px;
  margin-left: 6px;
  vertical-align: middle;
}

.lista-reportes-admin { list-style: none; }
.lista-reportes-admin .reporte-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 12px 2px;
  border-bottom: 1px solid var(--borde);
  font-size: 0.92rem;
}
.lista-reportes-admin .reporte-item:last-child { border-bottom: none; }
.reporte-item .motivo { color: var(--gris); font-style: italic; margin-top: 3px; font-size: 0.85rem; }
.reporte-item .acciones { display: flex; flex-direction: column; gap: 6px; }
.reporte-item .acciones button { margin: 0; }
.reporte-item .acciones .aprobar { color: var(--verde-oscuro); border-color: #bcd9c6; }

.meta-reporte { display: block; color: var(--gris); font-size: 0.8rem; margin-top: 2px; }

/* ---------- modal ---------- */

.velo {
  position: fixed; inset: 0;
  background: rgba(20, 30, 20, 0.45);
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  z-index: 50;
}

.modal {
  background: var(--blanco);
  border-radius: 16px;
  padding: 22px;
  width: 100%;
  max-width: 360px;
  text-align: center;
  /* si el contenido crece (p. ej. la galería de 16 colores), que se pueda desplazar:
     el velo es fixed y lo que se desborde de él no se alcanza ni con scroll */
  max-height: 90vh;
  overflow-y: auto;
}

.modal p { margin-bottom: 18px; font-size: 1.05rem; }
.modal .botones { display: flex; gap: 10px; }
.modal .botones button { flex: 1; padding: 12px; border-radius: 10px; font-weight: 700; font-size: 1rem; border: none; cursor: pointer; }
.modal .botones button:disabled { opacity: 0.55; cursor: wait; }
.modal .confirmar { background: var(--verde); color: var(--blanco); }
.modal .cancelar { background: #eceae2; color: var(--tinta); }

@media (min-width: 560px) {
  .botones-marca { grid-template-columns: 1fr 1fr; }
  .botones-marca button.solo { grid-column: 1 / -1; }
}

/* resultado del alta masiva */
.lote-resultado { margin-top: 14px; }
/* la lista de días a los que se puede volver */
.resp-fila {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 7px 0; border-bottom: 1px dashed var(--borde); font-size: 0.88rem;
}
.resp-fila:last-child { border-bottom: none; }
.resp-que { display: flex; flex-direction: column; min-width: 0; }
.resp-que small { color: var(--gris); font-size: 0.78rem; font-variant-numeric: tabular-nums; }
.resp-fila > button { flex: 0 0 auto; }
/* la papelera: cada archivo con su cuenta atrás */
.pap-fila {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 9px 0; border-bottom: 1px dashed var(--borde); font-size: 0.88rem;
}
.pap-fila:last-child { border-bottom: none; }
.pap-que { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
.pap-que small { color: var(--gris); font-size: 0.78rem; line-height: 1.35; }
.pap-cuando { font-variant-numeric: tabular-nums; }
/* el que se va hoy o mañana: última oportunidad de bajarlo */
.pap-fila.pap-urge .pap-cuando { color: var(--rojo); font-weight: 700; }
.pap-acciones { display: flex; gap: 6px; flex: 0 0 auto; }
.pap-acciones button { white-space: nowrap; }
@media (max-width: 560px) {
  .pap-fila { flex-direction: column; align-items: stretch; }
  .pap-acciones { justify-content: flex-end; }
}
/* dos personas cuyo nombre se escribe igual para entrar: NINGUNA de las dos puede */
.emp-choca { margin-top: 3px; font-size: 0.74rem; font-weight: 700; color: var(--rojo); line-height: 1.3; }
.lote-aviso {
  background: #fff8e6;
  border: 1px solid #eadfa9;
  color: #7a621a;
  border-radius: 10px;
  padding: 10px 12px;
  font-size: 0.85rem;
  margin-bottom: 12px;
}
.lote-lista { list-style: none; }
.lote-lista li {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 2px;
  border-bottom: 1px solid var(--borde);
  font-size: 0.95rem;
}
.lote-lista li:last-child { border-bottom: none; }
.lote-lista .lote-pin {
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  letter-spacing: 2px;
  font-size: 1.1rem;
  color: var(--verde-oscuro);
}
.lote-lista .lote-omitido { color: var(--gris); font-size: 0.82rem; font-style: italic; }

/* respeta a quien prefiere menos movimiento */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}

/* ============================== Juegos — Sudoku ============================= */
/* ---- TEMA del tablero y su menú ----
   Aquí viven SOLO los valores de la marca (el tema por defecto). Los demás colores
   los calcula temas.js y los escribe como variables inline sobre #vista-juegos, de
   donde los heredan tanto el menú como el tablero. Agregar un color = una línea allá. */
#vista-juegos {
  --sk-rgb: var(--oro-rgb);    /* acento: tintes de la guía y del mismo número */
  --sk-sel: var(--oro-claro);  /* celda tocada */
  --sk-fondo: #ffffff;         /* fondo del tablero */
  --sk-linea: #e7e2d5;         /* líneas finas */
  --sk-marco: var(--bronce-osc); /* marco y líneas de caja */
  --sk-dado: #26301f;          /* números que ya venían */
  --sk-user: #1d5c38;          /* tus números */
  --sk-pista: #16786c;         /* números puestos por una pista */
  --sk-nota: #5e655a;          /* anotaciones a lápiz */
  --sk-error: #c0392b;
  --sk-tecla: var(--bronce);   /* teclado */
  --sk-tecla-bg: #ffffff;
  --sk-tecla-borde: #e2ded3;
  --sk-mesa: transparent;      /* la "mesa" sobre la que se apoya el tablero */
  --sk-texto: var(--gris);     /* textos de la barra superior y el récord */
  --sk-acento: var(--bronce);  /* dificultad y flecha de volver */
  --sk-btn-bg: var(--blanco);  /* iconos, acciones y pie */
  --sk-btn-txt: var(--gris);
  --sk-btn-borde: var(--borde);
  --sk-activa-bg: var(--bronce);   /* botón de notas encendido */
  --sk-activa-txt: var(--marfil);
  --sk-vida: #e0392b;              /* corazón lleno */
  --sk-vida-ida: #d8d2c4;          /* corazón gastado: debe verse MENOS que el lleno */
  /* menú del Sudoku */
  --sk-hero-a: var(--head-a);
  --sk-hero-b: var(--head-c);
  --sk-hero-oro: var(--oro-claro);
  --sk-hero-sub: #cfc7b5;
  --sk-card-bg: var(--blanco);
  --sk-card-borde: var(--borde);
  --sk-card-txt: var(--bronce);
}
#sudoku-host { background: var(--sk-mesa); border-radius: 14px; padding: 8px 6px; }
/* En un sudoku se toca cien veces por partida, y iOS pinta un destello azul del sistema
   —rgba(51,181,229,.4)— en cada toque de un botón. Con el teclado de números y las 81
   celdas, eso hacía que el juego se sintiera de otra app. Se apaga en todo el tablero,
   incluido el menú y los ajustes. */
#sudoku-host button, #sudoku-menu button,
#velo-sk-ajustes button, #velo-sk-tema button { -webkit-tap-highlight-color: transparent; }

.sk-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
.sk-volver { background: none; border: none; color: var(--sk-acento); font-weight: 700; cursor: pointer; font-size: 1.1rem; padding: 2px 4px; flex: none; }
.sk-stats { display: flex; gap: 10px; align-items: center; font-size: 0.86rem; color: var(--sk-texto); font-weight: 700; font-variant-numeric: tabular-nums; }
.sk-stats .sk-dif { color: var(--sk-acento); }
/* iconos de la barra: 🎨 tema y ⚙️ ajustes (estadísticas y duelos viven ahí dentro) */
.sk-iconos { display: flex; gap: 6px; flex: none; }
.sk-icono {
  width: 34px; height: 34px; border-radius: 9px; border: 1px solid var(--sk-btn-borde);
  background: var(--sk-btn-bg); font-size: 1rem; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center; box-shadow: var(--sombra-sm);
}
.sk-icono:active { transform: scale(0.94); }

/* La cuadrícula NO usa bordes por celda (en Android se difuminaban/desparejaban por el
   redondeo de subpíxeles: las cajas quedaban de distinto tamaño). El grid de celdas es
   PLANO 9x9 y las líneas las dibuja un SVG superpuesto (.sk-rejilla) con grosor fijo en
   píxeles — exactas y parejas en cualquier pantalla y densidad. */
.sk-board {
  display: grid; grid-template-columns: repeat(9, 1fr);
  position: relative;
  width: 100%; max-width: min(94vw, 460px); aspect-ratio: 1; margin: 12px auto;
  background: var(--sk-fondo); border: 2px solid var(--sk-marco); border-radius: 10px;
  overflow: hidden; box-shadow: var(--sombra-md); touch-action: manipulation;
}
.sk-board.generando { opacity: 0.45; pointer-events: none; }
/* rejilla SVG por ENCIMA de las celdas: UNA sola línea por borde (el original con bordes
   por celda mostraba una fina pegada a la gruesa = "doble línea"). 1px finas + 2px gruesas
   de caja, exactas gracias a non-scaling-stroke; no intercepta toques. */
.sk-rejilla { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; }
/* geometricPrecision (NO crispEdges): con crispEdges + un trazo de 2px que cae en una
   posición de subpíxel, el navegador partía la línea gruesa en DOS de 1px (la "doble
   línea"). Con geometricPrecision se pinta como UNA sola línea. */
.sk-rejilla path { fill: none; vector-effect: non-scaling-stroke; shape-rendering: geometricPrecision; }
.sk-rejilla .sk-l-fina { stroke: var(--sk-linea); stroke-width: 1; }
.sk-rejilla .sk-l-gruesa { stroke: var(--sk-marco); stroke-width: 2; }
/* NUEVE PLACAS detrás de las celdas. Solo las usan las skins «Con aire» y «Elevada»,
   que separan las cajas con espacio o con sombra en vez de con una raya. En las demás
   está en display:none y no pinta nada. */
.sk-cajas { display: none; position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.sk-cajas i { display: block; }

.sk-cell {
  position: relative; display: flex; align-items: center; justify-content: center;
  padding: 0; background: transparent; cursor: pointer;
  /* La celda es un <button> y nunca se le quitó el estilo por defecto del sistema: venía
     con `border: 2px outset`, el bisel de botón del navegador, en las 81 celdas. En un
     Mac/PC casi no se nota; en iPhone sí, y además empujaba el número 2 px hacia dentro,
     así que los números quedaban descentrados respecto a las líneas del SVG.
     Y el destello azul: iOS pinta rgba(51,181,229,.4) al tocar cualquier botón. En un
     sudoku uno toca cien veces por partida — se veía como una app de otro. */
  border: 0; -webkit-appearance: none; appearance: none;
  -webkit-tap-highlight-color: transparent;
  transition: background 0.1s ease;
}
/* GUÍA al tocar una celda: se tiñen su fila, su columna y su caja 3x3 (más intuitivo) */
.sk-cell.par { background: rgba(var(--sk-rgb), 0.20); }
/* mismo número que el de la celda tocada: se resalta más */
.sk-cell.mismo { background: rgba(var(--sk-rgb), 0.38); }
/* la celda tocada: la más marcada de todas */
.sk-cell.sel { background: var(--sk-sel); box-shadow: inset 0 0 0 2px var(--sk-marco); }
.sk-val { font-size: clamp(1.05rem, 5.2vw, 1.6rem); font-weight: 600; color: var(--sk-user); font-variant-numeric: tabular-nums; line-height: 1; }
.sk-cell.dado .sk-val { color: var(--sk-dado); font-weight: 800; }
.sk-cell.pista .sk-val { color: var(--sk-pista); font-weight: 800; }
.sk-cell.error .sk-val { color: var(--sk-error); }
.sk-notas { position: absolute; inset: 2px; display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 1fr); }
.sk-notas i { font-style: normal; font-size: clamp(0.42rem, 1.9vw, 0.6rem); color: var(--sk-nota); display: flex; align-items: center; justify-content: center; line-height: 1; }

/* ═══════════════════════════════════════════════════════════════════════════════
   LAS CUADRÍCULAS (skins). Pedido del dueño (2026-07-29): probarlas en el celular,
   que es donde se decide. Cada una cambia el MECANISMO con que se separan las cajas
   3x3 —línea, aire, relieve, campo— y no solo el grosor de una raya.

   Dos reglas que se cumplen en TODAS, porque sin ellas cualquier skin sale mal:
   · el MARCO pesa igual que la línea de caja. En esta app el marco es el `border` de
     .sk-board, no está en el SVG: si la caja sube y el borde se queda, el marco queda
     más flaco que las cajas y se nota. Nueve de nueve diseños medidos lo hacen igual.
   · el ANILLO de la celda tocada se iguala a la caja. Si la caja va a 4 y el anillo se
     queda en 2, vuelve el artefacto de «doble línea» que ya estaba arreglado.

   La clase la pone aplicarPrefs() en #sudoku-host, así el cambio se ve al instante sin
   reconstruir el tablero.
   ═══════════════════════════════════════════════════════════════════════════════ */

/* ── CON AIRE: la separación es espacio real. Nueve bloques y por las juntas se ve
      la mesa. Ninguna línea gruesa. (Retícula suiza: la estructura por vacío.) ── */
/* NO usar --sk-mesa: en el tema por defecto (el que usa el dueño) vale `transparent` a
   propósito —aplicarJuego() no escribe variables cuando el tema es el de la marca y manda
   la paleta de respaldo del CSS—, así que las nueve tejas flotaban sobre el fondo de la
   página y se veían como huecos, no como bloques sobre una mesa. Un tinte con alfa del
   color del tema funciona en las 16 paletas, incluida la de respaldo. */
.sk-rejilla-aire .sk-board {
  background: rgba(var(--sk-rgb), 0.13); border-width: 0; border-radius: 8px;
}
.sk-rejilla-aire .sk-cajas {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 1fr);
  gap: 5px;
}
.sk-rejilla-aire .sk-cajas i { background: var(--sk-fondo); border-radius: 3px; }
.sk-rejilla-aire .sk-rejilla .sk-l-gruesa { stroke: transparent; }
.sk-rejilla-aire .sk-rejilla .sk-l-fina { stroke: rgba(var(--sk-rgb), 0.11); }

/* ── ELEVADA: la jerarquía es profundidad. Cada caja flota sobre la mesa. ── */
.sk-rejilla-elevada .sk-board {
  background: rgba(var(--sk-rgb), 0.20); border-width: 0; border-radius: 10px;
}
.sk-rejilla-elevada .sk-cajas {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 1fr);
  gap: 3px;
}
.sk-rejilla-elevada .sk-cajas i {
  background: var(--sk-fondo); border-radius: 2px;
  box-shadow: 0 1px 2px rgba(var(--sk-rgb), 0.28), 0 0 0 1px rgba(var(--sk-rgb), 0.12);
}
.sk-rejilla-elevada .sk-rejilla .sk-l-gruesa { stroke: transparent; }
.sk-rejilla-elevada .sk-rejilla .sk-l-fina { stroke: rgba(var(--sk-rgb), 0.09); }

/* ── DAMERO: el campo alterna por caja y la reja queda finísima. Dos señales
      suaves en vez de una fuerte. (LibreSudoku, tinte al 8-10%.) ── */
.sk-rejilla-damero .sk-board { border-width: 2px; border-color: rgba(var(--sk-rgb), 0.62); }
.sk-rejilla-damero .sk-rejilla .sk-l-gruesa {
  stroke: rgba(var(--sk-rgb), 0.62); stroke-width: 1.5;
}
.sk-rejilla-damero .sk-rejilla .sk-l-fina { stroke: rgba(var(--sk-rgb), 0.14); }
/* el tinte va DEBAJO de los resaltados (guía, mismo número, celda tocada), que se
   declaran después en el archivo y por eso ganan sin necesidad de !important */
/* EL TINTE DEL DAMERO VA EN LAS PLACAS, NO EN LAS CELDAS. Estaba en el fondo de la celda
   —`.sk-rejilla-damero .sk-cell.caja-par`, tres clases— y por especificidad le ganaba a la
   guía `.sk-cell.par`, que son dos. Resultado: al tocar una celda, 14 de las 20 resaltadas
   se veían IGUAL que sus vecinas y la cruz salía a parches. El dueño lo reportó como «la
   guía dejó de funcionar», y tenía razón.
   La regla que queda: el CAMPO (lo que no cambia al tocar) se pinta en las placas; el
   ESTADO (guía, mismo número, celda tocada) se pinta en la celda. Así no compiten nunca. */
.sk-rejilla-damero .sk-cajas {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 1fr);
}
.sk-rejilla-damero .sk-cajas i:nth-child(odd) { background: rgba(var(--sk-rgb), 0.08); }

/* ── IMPRENTA: una sola tinta y razón 4 a 1. Es la cuadrícula del cuadernillo de
      sudoku impreso (Krazydad, medido en su PDF). La más marcada que existe: en
      celular la caja se come el 12 % de la celda, y eso se ve. ── */
.sk-rejilla-imprenta .sk-board { border-width: 4px; border-radius: 5px; }
.sk-rejilla-imprenta .sk-rejilla .sk-l-fina { stroke: var(--sk-marco); stroke-width: 1; stroke-linecap: butt; }
.sk-rejilla-imprenta .sk-rejilla .sk-l-gruesa { stroke-width: 4; stroke-linecap: round; }
.sk-rejilla-imprenta .sk-cell.sel { box-shadow: inset 0 0 0 4px var(--sk-marco); }

/* ═══════════════════════════════════════════════════════════════════════════════
   LAS CINCO DEL SEGUNDO LOTE. Salieron de VER las fotos del iPhone, no de razonar:
   en el celular lo que más grita no es la rejilla, es la mancha beige de la fila y la
   columna resaltadas (oro al 20 %) y la celda tocada RELLENA de oro, que se lee como un
   hueco tapado. Con eso encima, da igual qué rejilla se ponga debajo.

   Por eso estas cinco no cambian solo las líneas: cambian la GUÍA y la SELECCIÓN. Una
   skin es el tablero entero, no la raya.
   ═══════════════════════════════════════════════════════════════════════════════ */

/* ── PAPEL: calmada. La guía baja de 20 % a 9 % y la celda tocada NO se rellena: se
      marca con un aro y se queda blanca, así el número sigue leyéndose sobre su fondo. ── */
.sk-rejilla-papel .sk-board { background: rgba(var(--sk-rgb), 0.045); border-width: 3px; }
.sk-rejilla-papel .sk-rejilla .sk-l-fina { stroke: rgba(var(--sk-rgb), 0.22); }
.sk-rejilla-papel .sk-rejilla .sk-l-gruesa { stroke: rgba(var(--sk-rgb), 0.85); stroke-width: 3; }
.sk-rejilla-papel .sk-board { border-color: rgba(var(--sk-rgb), 0.85); }
.sk-rejilla-papel .sk-cell.par { background: rgba(var(--sk-rgb), 0.13); }
.sk-rejilla-papel .sk-cell.mismo { background: rgba(var(--sk-rgb), 0.20); }
.sk-rejilla-papel .sk-cell.sel { background: var(--sk-fondo); box-shadow: inset 0 0 0 3px var(--sk-marco); }

/* ── TINTA: mucho contraste y CERO beige. Los grises son neutros a propósito: el tinte
      dorado es lo que hacía ver la pantalla amarillenta. La celda tocada se invierte. ── */
.sk-rejilla-tinta .sk-rejilla .sk-l-fina { stroke: rgba(58, 54, 46, 0.17); }
.sk-rejilla-tinta .sk-rejilla .sk-l-gruesa { stroke: rgba(26, 24, 19, 0.92); stroke-width: 3; }
.sk-rejilla-tinta .sk-board { border-width: 3px; border-color: rgba(26, 24, 19, 0.92); }
.sk-rejilla-tinta .sk-cell.par { background: rgba(58, 54, 46, 0.10); }
.sk-rejilla-tinta .sk-cell.mismo { background: rgba(58, 54, 46, 0.17); }
.sk-rejilla-tinta .sk-cell.sel { background: rgba(26, 24, 19, 0.92); box-shadow: none; }
.sk-rejilla-tinta .sk-cell.sel .sk-val { color: #fdfcf8; }
.sk-rejilla-tinta .sk-cell.sel .sk-notas i { color: rgba(253, 252, 248, 0.65); }

/* ── NOCHE: tablero oscuro. Los números tienen que invertirse o no se lee nada. ── */
.sk-rejilla-noche .sk-board { background: #1b1913; border-width: 3px; border-color: rgba(255, 255, 255, 0.42); }
.sk-rejilla-noche .sk-rejilla .sk-l-fina { stroke: rgba(255, 255, 255, 0.11); }
.sk-rejilla-noche .sk-rejilla .sk-l-gruesa { stroke: rgba(255, 255, 255, 0.42); stroke-width: 3; }
.sk-rejilla-noche .sk-cell.par { background: rgba(255, 255, 255, 0.10); }
.sk-rejilla-noche .sk-cell.mismo { background: rgba(255, 255, 255, 0.16); }
.sk-rejilla-noche .sk-cell.sel { background: rgba(var(--sk-rgb), 0.62); box-shadow: none; }
.sk-rejilla-noche .sk-cell .sk-val { color: rgba(var(--sk-rgb), 0.95); }
.sk-rejilla-noche .sk-cell.dado .sk-val { color: #f0ece1; }
.sk-rejilla-noche .sk-cell.sel .sk-val { color: #1b1913; }
.sk-rejilla-noche .sk-cell.pista .sk-val { color: #7fd6c3; }
.sk-rejilla-noche .sk-cell.error .sk-val { color: #ff8b7a; }
.sk-rejilla-noche .sk-notas i { color: rgba(255, 255, 255, 0.42); }

/* ── SUAVE: el aire de verdad. En la foto del iPhone la versión anterior se veía flojísima,
      así que la mesa sube a 0,18 y la guía baja al mínimo: manda la estructura, no el tinte. ── */
.sk-rejilla-suave .sk-board { background: rgba(var(--sk-rgb), 0.18); border-width: 0; border-radius: 9px; }
.sk-rejilla-suave .sk-cajas {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 1fr); gap: 5px;
}
.sk-rejilla-suave .sk-cajas i { background: var(--sk-fondo); border-radius: 3px; }
.sk-rejilla-suave .sk-rejilla .sk-l-gruesa { stroke: transparent; }
.sk-rejilla-suave .sk-rejilla .sk-l-fina { stroke: rgba(var(--sk-rgb), 0.10); }
.sk-rejilla-suave .sk-cell.par { background: rgba(var(--sk-rgb), 0.12); }
.sk-rejilla-suave .sk-cell.mismo { background: rgba(var(--sk-rgb), 0.19); }
.sk-rejilla-suave .sk-cell.sel { background: rgba(var(--sk-rgb), 0.42); box-shadow: none; }

/* ── SOLO LA CAJA: se acaba la cruz. La fila y la columna dejan de teñirse y solo se
      resalta la caja de 3x3 — que es la que de verdad ayuda a descartar. Y el «mismo
      número» pasa de relleno a aro, así no compite con la caja. ── */
.sk-rejilla-soloCaja .sk-rejilla .sk-l-gruesa { stroke-width: 3; }
.sk-rejilla-soloCaja .sk-board { border-width: 3px; }
.sk-rejilla-soloCaja .sk-cell.par { background: transparent; }
.sk-rejilla-soloCaja .sk-cell.par-caja { background: rgba(var(--sk-rgb), 0.12); }
.sk-rejilla-soloCaja .sk-cell.mismo {
  background: transparent; box-shadow: inset 0 0 0 2px rgba(var(--sk-rgb), 0.55);
}
.sk-rejilla-soloCaja .sk-cell.sel { background: var(--sk-fondo); box-shadow: inset 0 0 0 3px var(--sk-marco); }

/* ── el selector, en la configuración ── */
.sk-ajuste-alto { align-items: flex-start; }
.sk-rejillas { display: grid; gap: 6px; margin: 0 0 4px; }
/* OJO CON LAS VARIABLES AQUÍ. El modal de ajustes vive pegado a <body>, NO dentro de
   #vista-juegos, que es donde temas.js escribe las --sk-*. Dentro del modal esas
   variables llegan VACÍAS, así que toda --sk-* necesita respaldo — es lo que ya hacen
   .sk-seg y .sk-ajuste más abajo. Sin el respaldo, estos botones salían sin fondo, sin
   borde y con el color de texto por defecto: se veía roto en el celular. */
.sk-rej-op {
  display: grid; gap: 1px; text-align: left; width: 100%; cursor: pointer;
  background: var(--sk-btn-bg, #fff); color: var(--sk-texto, var(--tinta));
  border: 1px solid var(--sk-tecla-borde, var(--borde)); border-radius: 10px; padding: 10px 12px;
  font: inherit; -webkit-appearance: none; appearance: none;
  -webkit-tap-highlight-color: transparent;
}
.sk-rej-op strong { font-size: 0.9rem; font-weight: 700; }
.sk-rej-op small { font-size: 0.74rem; opacity: 0.75; line-height: 1.35; }
.sk-rej-op.activo {
  border-color: var(--sk-acento, var(--bronce));
  box-shadow: inset 0 0 0 1px var(--sk-acento, var(--bronce));
  background: var(--crema, #f7f4ec);
}

.sk-pad { display: grid; grid-template-columns: repeat(9, 1fr); gap: 5px; max-width: min(94vw, 460px); margin: 0 auto 12px; }
.sk-num {
  position: relative; aspect-ratio: 1; font-size: clamp(1.1rem, 5vw, 1.5rem); font-weight: 700;
  color: var(--sk-tecla); background: var(--sk-tecla-bg); border: 1px solid var(--sk-tecla-borde); border-radius: 12px;
  cursor: pointer; box-shadow: var(--sombra-sm); display: flex; align-items: center; justify-content: center;
}
.sk-num:active { transform: translateY(1px); filter: brightness(0.95); }
.sk-num.completo { opacity: 0.32; }
.sk-num .sk-rem { position: absolute; top: 3px; right: 5px; font-size: 0.58rem; color: var(--sk-nota); font-weight: 700; }

/* ajustes: ocultar cronómetro / números restantes según preferencias */
#sudoku-host.sin-contador .sk-reloj { display: none; }
#sudoku-host.sin-restantes .sk-rem { display: none; }

.sk-acciones { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; max-width: min(94vw, 460px); margin: 0 auto 14px; }
.sk-accion {
  display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 9px 4px;
  background: var(--sk-btn-bg); border: 1px solid var(--sk-btn-borde); border-radius: 12px;
  font-size: 0.72rem; font-weight: 700; color: var(--sk-btn-txt); cursor: pointer; box-shadow: var(--sombra-sm);
}
.sk-accion .sk-ai { font-size: 1.15rem; }
.sk-accion:active { transform: translateY(1px); }
.sk-accion.activa { background: var(--sk-activa-bg); color: var(--sk-activa-txt); border-color: var(--sk-activa-bg); }

.sk-pie { display: flex; gap: 10px; align-items: center; max-width: min(94vw, 460px); margin: 0 auto; }
.sk-pie .sk-nivel { flex: 1; margin-bottom: 0; }
.sk-pie .sk-nivel,
.sk-pie .secundario { background: var(--sk-btn-bg); color: var(--sk-btn-txt); border-color: var(--sk-btn-borde); }
.sk-record { text-align: center; color: var(--sk-texto); font-size: 0.8rem; margin: 10px auto 0; font-variant-numeric: tabular-nums; }

.sk-victoria { position: fixed; inset: 0; background: rgba(20, 30, 20, 0.5); display: flex; align-items: center; justify-content: center; padding: 24px; z-index: 60; }
.sk-victoria-caja { background: var(--blanco); border-radius: 18px; padding: 28px 24px; text-align: center; max-width: 320px; box-shadow: var(--sombra-lg); animation: surgir 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }
.sk-trofeo { font-size: 3rem; line-height: 1; }
.sk-victoria-caja h3 { color: var(--bronce); margin: 8px 0 4px; font-size: 1.3rem; }
.sk-victoria-caja p { color: var(--gris); margin-bottom: 18px; font-size: 0.95rem; line-height: 1.4; }

/* --- Sudoku: vidas, toast, estadísticas, y bloqueo de zoom por doble toque --- */
#vista-juegos, #vista-juegos * { touch-action: manipulation; } /* evita el zoom al tocar dos veces */

.sk-vidas { display: inline-flex; gap: 2px; }
.sk-vida { font-size: 1.05rem; line-height: 1; }
.sk-vida.llena { color: var(--sk-vida); }
.sk-vida.vacia { color: var(--sk-vida-ida); }

.sk-toast {
  position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%) translateY(10px);
  background: var(--bronce); color: var(--marfil); padding: 11px 18px; border-radius: 12px;
  font-weight: 700; font-size: 0.9rem; box-shadow: var(--sombra-lg); z-index: 70;
  opacity: 0; transition: opacity 0.25s ease, transform 0.25s ease; max-width: 90vw; text-align: center;
}
.sk-toast.sk-toast-show { opacity: 1; transform: translateX(-50%) translateY(0); }

.sk-elo { text-align: center; padding: 6px 0 14px; }
.sk-elo-num { font-size: 2.6rem; font-weight: 800; color: var(--bronce); line-height: 1; font-variant-numeric: tabular-nums; }
.sk-elo-rango { font-size: 1rem; font-weight: 700; color: var(--oro); margin-top: 4px; }
.sk-elo-cap { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 1px; color: var(--gris); margin-top: 2px; }
.sk-stats-tabla { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
.sk-stats-tabla th, .sk-stats-tabla td { padding: 8px 6px; border-bottom: 1px solid var(--borde); text-align: right; font-variant-numeric: tabular-nums; }
.sk-stats-tabla th:first-child, .sk-stats-tabla td:first-child { text-align: left; }
.sk-stats-tabla th { color: var(--gris); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.4px; }
.sk-stats-resumen { text-align: center; color: var(--gris); font-size: 0.85rem; margin-top: 12px; font-weight: 600; }

/* --- cierre fácil de modales de lista: cabecera fija con ✕ (y tocar fuera cierra) --- */
/* La cabecera se PEGA arriba (top:0) pero tenía margin-top:-22px: al fijarse bajaba
   22px y se comía lo que venía debajo (el ELO en Estadísticas, los iconos en Ajustes).
   Ahora la cabecera aporta su propio padding y el modal no lleva padding arriba. */
.modal.tiene-cab { padding-top: 0; }
.modal-cab {
  position: sticky; top: 0; z-index: 4;
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  background: var(--blanco); margin: 0 -22px 6px; padding: 20px 20px 10px;
  border-radius: 16px 16px 0 0;
}
.modal-cab .titulo-modal { margin: 0; }
.modal-x {
  flex: none; width: 34px; height: 34px; border: none; border-radius: 9px;
  background: rgba(70, 60, 40, 0.08); color: var(--bronce); font-size: 1.05rem; line-height: 1; cursor: pointer;
}
.modal-x:hover { background: rgba(70, 60, 40, 0.16); }
.modal-x:active { transform: scale(0.94); }

/* --- Sudoku: tabla de posiciones (ranking del equipo) --- */
.sk-rank tbody tr.sk-yo { background: rgba(181, 146, 79, 0.16); font-weight: 800; color: var(--bronce); }
.sk-rank td:first-child, .sk-rank th:first-child { text-align: center; width: 34px; }
.sk-rank-cargando { text-align: center; color: var(--gris); font-size: 0.85rem; padding: 12px 0; }

/* ✕ para salir de los overlays de victoria/derrota del Sudoku */
.sk-victoria-caja { position: relative; }
.sk-ov-x {
  position: absolute; top: 8px; right: 10px; width: 34px; height: 34px; border: none; border-radius: 9px;
  background: rgba(70, 60, 40, 0.08); color: var(--bronce); font-size: 1.05rem; line-height: 1; cursor: pointer;
}
.sk-ov-x:hover { background: rgba(70, 60, 40, 0.16); }
.sk-ov-x:active { transform: scale(0.94); }

/* --- Sudoku: duelos entre compañeros --- */
.sk-duelo-badge { font-size: 0.82rem; font-weight: 800; color: var(--sk-acento); white-space: nowrap; }
.retos-lista { margin-top: 4px; }
.reto-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 2px; border-bottom: 1px solid var(--borde); }
.reto-item:last-child { border-bottom: none; }
.reto-info { font-size: 0.9rem; }
.reto-info strong { color: var(--bronce); }
.reto-estado { display: block; color: var(--gris); font-size: 0.8rem; margin-top: 2px; font-variant-numeric: tabular-nums; }
.reto-item .secundario { padding: 8px 14px; flex: none; }

/* aviso dentro del modal de estadísticas (p. ej. tras borrar puntajes) */
.sk-stats-aviso {
  background: #fff8e6; border: 1px solid #eadfa9; color: #7a621a;
  border-radius: 10px; padding: 10px 12px; margin-bottom: 12px;
  font-size: 0.88rem; font-weight: 700; text-align: center;
}

/* ---- avisos push en el celular ---- */
.push-estado {
  display: flex; align-items: center; gap: 8px; justify-content: center;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 12px;
  padding: 12px 14px; margin-bottom: 12px;
  font-size: 0.9rem; font-weight: 700; color: var(--gris); text-align: center;
}
.push-estado.activo { background: #eef7f0; border-color: #cfe6d8; color: var(--verde-oscuro); }
#push-ayuda { margin-top: 12px; margin-bottom: 0; text-align: left; line-height: 1.45; }

/* ---- galería de colores (tablero y app) — el degradado lo pone temas.js ---- */
.sk-temas { display: grid; grid-template-columns: repeat(auto-fit, minmax(62px, 1fr)); gap: 6px; padding: 10px 0 4px; }
.sk-tema { background: none; border: none; cursor: pointer; padding: 4px 2px; display: flex; flex-direction: column; align-items: center; gap: 5px; }
/* el aro interior evita que la mitad clara (Marca) se pierda sobre el modal blanco */
.sk-tema .sk-sw {
  width: 44px; height: 44px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  border: 3px solid transparent; box-shadow: var(--sombra-sm), inset 0 0 0 1px rgba(0, 0, 0, 0.14);
}
.sk-tema small { font-size: 0.68rem; font-weight: 700; color: var(--gris); }
.sk-tema.sel .sk-sw { border-color: var(--tinta); }
.sk-tema.sel small { color: var(--tinta); }
.sk-tema:active { transform: translateY(1px); }
/* el botón "+" que abre el resto de la paleta */
.sk-tema-mas .sk-sw {
  background: var(--blanco); border: 2px dashed var(--oro); box-shadow: none;
  color: var(--oro); font-size: 1.3rem; font-weight: 700; line-height: 1;
}

/* ---- menú del Sudoku (entre la lista de juegos y el tablero) ---- */
/* Todo el menú se pinta con las variables del tema: al cambiar el color del
   tablero cambia también el menú. Los que viven en modales (fuera de #vista-juegos)
   no heredan nada, por eso cada var lleva su respaldo con el color de la app. */
.sk-hero {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 14px;
  background: linear-gradient(135deg, var(--sk-hero-a) 0%, var(--sk-hero-b) 100%); color: var(--marfil);
  border: 1px solid var(--sk-hero-b); border-radius: 18px;
  padding: 18px 18px; box-shadow: var(--sombra-md); margin-bottom: 14px;
}
/* la misma hairline dorada de las tarjetas de la app */
.sk-hero::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: linear-gradient(90deg, transparent, var(--sk-hero-oro) 25%, var(--sk-hero-oro) 75%, transparent);
  opacity: 0.85;
}
/* mini tablero decorativo */
.sk-hero-mini {
  flex: none; width: 52px; height: 52px; display: grid;
  grid-template-columns: repeat(3, 1fr); gap: 3px; padding: 4px;
  border: 1.5px solid var(--sk-hero-oro); border-radius: 10px; background: rgba(0, 0, 0, 0.18);
}
.sk-hero-mini i { display: block; border-radius: 3px; background: rgba(255, 255, 255, 0.18); }
.sk-hero-mini i.on { background: var(--sk-hero-oro); }
.sk-hero-info { flex: 1; min-width: 0; }
.sk-hero-kicker {
  display: block; font-size: 0.6rem; font-weight: 800; letter-spacing: 1.6px;
  text-transform: uppercase; color: var(--sk-hero-oro); margin-bottom: 1px;
}
.sk-hero-info h2 { margin: 0; font-size: 1.35rem; font-weight: 800; color: var(--marfil); letter-spacing: 0.3px; }
.sk-hero-info h2::before { content: none; }
.sk-hero-info p { margin: 3px 0 0; font-size: 0.78rem; color: var(--sk-hero-sub); line-height: 1.35; }
.sk-hero-elo { flex: none; text-align: right; }
.sk-hero-elo strong {
  display: block; font-size: 1.3rem; font-weight: 800; color: var(--sk-hero-oro);
  font-variant-numeric: tabular-nums; line-height: 1;
}
.sk-hero-elo small { display: block; font-size: 0.62rem; color: var(--sk-hero-sub); font-weight: 700; margin-top: 3px; opacity: 0.85; }

/* continuar partida: el botón protagonista */
.sk-continuar {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  padding: 14px 16px; border-radius: 16px; cursor: pointer; margin-bottom: 14px;
  background: var(--sk-card-bg); border: 1.5px solid rgba(var(--sk-rgb), 0.8); box-shadow: var(--sombra-md);
}
.sk-continuar:active { transform: translateY(1px); }
.sk-cont-ico {
  flex: none; width: 40px; height: 40px; border-radius: 50%;
  background: linear-gradient(135deg, var(--sk-hero-a) 0%, var(--sk-hero-b) 100%); color: var(--sk-hero-oro);
  display: flex; align-items: center; justify-content: center; font-size: 0.85rem;
}
.sk-cont-txt { min-width: 0; }
.sk-cont-txt strong { display: block; font-size: 0.98rem; font-weight: 800; color: var(--sk-card-txt); }
.sk-cont-txt small { display: block; font-size: 0.78rem; color: var(--sk-texto); margin-top: 2px; font-variant-numeric: tabular-nums; }

/* fichas de dificultad (crecen solas si mañana agregamos más niveles o variantes) */
.sk-bloque { margin-bottom: 0; background: var(--sk-card-bg); border-color: var(--sk-card-borde); }
.sk-bloque h2 { color: var(--sk-card-txt); }
.sk-bloque h2::before { background: var(--sk-acento); }
/* el botón de Jugar también es del tema: si no, queda un botón bronce sobre un menú verde */
#sudoku-menu .principal {
  background: linear-gradient(135deg, var(--sk-hero-a) 0%, var(--sk-hero-b) 100%);
  border-color: var(--sk-hero-b); color: var(--marfil);
}
.sk-niveles { display: grid; grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); gap: 8px; }
/* dentro del Sudoku la salida es "← Juegos": sobra el "← Inicio" de la sección */
#vista-juegos.en-sudoku > .volver-inicio { display: none; }
.sk-chip {
  display: flex; flex-direction: column; align-items: center; gap: 3px; padding: 11px 4px;
  background: var(--sk-card-bg); border: 1.5px solid var(--sk-card-borde); border-radius: 12px;
  cursor: pointer; box-shadow: var(--sombra-sm); transition: transform 0.1s ease;
}
.sk-chip strong { font-size: 0.8rem; font-weight: 800; color: var(--sk-card-txt); }
.sk-chip small { font-size: 0.64rem; color: var(--sk-texto); font-variant-numeric: tabular-nums; }
.sk-chip:active { transform: translateY(1px); }
.sk-chip.sel {
  background: linear-gradient(135deg, var(--sk-hero-a) 0%, var(--sk-hero-b) 100%);
  border-color: var(--sk-hero-b); box-shadow: var(--sombra-md);
}
.sk-chip.sel strong { color: var(--marfil); }
.sk-chip.sel small { color: var(--sk-hero-oro); }

/* fichas de acción (menú y atajos de ajustes): icono arriba, para que el texto no se corte */
.sk-menu-acciones { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 14px; }
.sk-mtile {
  display: flex; flex-direction: column; align-items: center; gap: 3px; padding: 14px 6px;
  background: var(--sk-card-bg, var(--blanco)); border: 1px solid var(--sk-card-borde, var(--borde));
  border-radius: 14px; box-shadow: var(--sombra-sm); cursor: pointer; text-align: center;
}
.sk-mtile:active { transform: translateY(1px); }
.sk-mtile-i { font-size: 1.35rem; line-height: 1; }
.sk-mtile-n { font-size: 0.76rem; font-weight: 800; color: var(--sk-card-txt, var(--bronce)); letter-spacing: 0.2px; }
.sk-mtile small { font-size: 0.62rem; color: var(--sk-texto, var(--gris)); line-height: 1.25; }

/* ---- ajustes del Sudoku: atajos + interruptores ---- */
.sk-atajos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 18px; }
.sk-ajuste {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 9px 2px; border-bottom: 1px solid var(--borde); cursor: pointer;
}
.sk-ajuste:last-child { border-bottom: none; }
.sk-ajuste-txt strong { display: block; font-size: 0.88rem; color: var(--tinta); font-weight: 700; }
.sk-ajuste-txt small { display: block; margin-top: 1px; font-size: 0.72rem; color: var(--gris); line-height: 1.3; }
.sk-ajuste input { width: 22px; height: 22px; flex: none; accent-color: var(--bronce); cursor: pointer; }
/* control segmentado (tamaño de los números): tres botones pegados */
.sk-seg { display: inline-flex; flex: none; border: 1px solid var(--sk-borde, var(--borde)); border-radius: 9px; overflow: hidden; }
.sk-seg button {
  border: none; background: var(--sk-btn-bg, #fff); color: var(--sk-texto, var(--tinta));
  font-size: 0.78rem; font-weight: 700; padding: 7px 11px; cursor: pointer; line-height: 1;
  border-left: 1px solid var(--sk-borde, var(--borde));
}
.sk-seg button:first-child { border-left: none; }
.sk-seg button.activo { background: var(--sk-acento, var(--bronce)); color: #fff; }
/* tamaños mayores de los números del tablero (se aplican por clase en #sudoku-host) */
.sk-num-grande .sk-val { font-size: clamp(1.35rem, 6.6vw, 2rem); }
.sk-num-enorme .sk-val { font-size: clamp(1.6rem, 7.8vw, 2.35rem); }
/* las notas a lápiz suben un poco a la par, para que no queden diminutas al lado */
.sk-num-grande .sk-notas i { font-size: clamp(0.48rem, 2.1vw, 0.66rem); }
.sk-num-enorme .sk-notas i { font-size: clamp(0.52rem, 2.3vw, 0.72rem); }
/* y también los números del TECLADO, para que combinen con el tablero */
.sk-num-grande .sk-num { font-size: clamp(1.3rem, 6vw, 1.8rem); }
.sk-num-enorme .sk-num { font-size: clamp(1.5rem, 7vw, 2.1rem); }

/* ============================== Herramientas de taller ============================= */
.th-top { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.th-volver { background: none; border: none; color: var(--bronce); font-weight: 700; cursor: pointer; font-size: 1.2rem; padding: 2px 6px; flex: none; }
.th-titulo { font-weight: 800; color: var(--bronce); font-size: 1.05rem; }
.th-card { margin-bottom: 14px; }
.th-vacio { color: var(--gris); font-size: 0.86rem; margin: 4px 0 10px; }
.th-add { margin-top: 4px; }

.th-item {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 2px; border-bottom: 1px solid var(--borde);
}
.th-item:last-of-type { border-bottom: none; }
.th-item-info { flex: 1; min-width: 0; }
.th-item-info strong { display: block; font-size: 0.92rem; color: var(--tinta); }
.th-item-info small { display: block; color: var(--gris); font-size: 0.78rem; margin-top: 1px; }
.th-item-val { font-weight: 800; color: var(--bronce); font-variant-numeric: tabular-nums; white-space: nowrap; }
.th-alerta { color: var(--rojo); font-weight: 700; }
.th-mini { flex: none; width: 30px; height: 30px; border: 1px solid var(--borde); border-radius: 8px; background: var(--blanco); cursor: pointer; font-size: 0.9rem; color: var(--bronce); }
.th-mini.th-del { color: var(--rojo); }
.th-mini:active { transform: translateY(1px); }

/* formulario inline (agregar / editar tablero o pieza) */
.th-form { background: var(--crema); border: 1px solid var(--borde); border-radius: 12px; padding: 14px; margin-bottom: 12px; }
.th-form .subtitulo:first-child { margin-top: 0; }
.th-fila2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.th-fila3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
.th-form-btns { display: flex; gap: 10px; margin-top: 12px; }
.th-form-btns button { flex: 1; }

.th-total {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 12px;
  background: var(--bronce-grad); color: var(--marfil);
  border-radius: 16px; padding: 16px 18px; box-shadow: var(--sombra-md);
}
.th-total-lbl { font-size: 0.9rem; font-weight: 700; color: var(--oro-claro); }
.th-total-val { font-size: 1.6rem; font-weight: 800; margin-left: auto; font-variant-numeric: tabular-nums; }
.th-total-nota { flex-basis: 100%; font-size: 0.76rem; color: #cfc7b5; }

/* ---- despiece: resultado y plano ---- */
.dsp-chip { flex: none; width: 12px; height: 12px; border-radius: 3px; }
.dsp-check { display: flex; align-items: center; gap: 8px; margin-top: 10px; font-size: 0.86rem; color: var(--tinta); cursor: pointer; }
.dsp-check input { width: 20px; height: 20px; accent-color: var(--bronce); }
.dsp-resumen { display: flex; gap: 10px; margin-bottom: 14px; }
.dsp-metrica {
  flex: 1; background: var(--crema); border: 1px solid var(--borde); border-radius: 12px;
  padding: 12px 8px; text-align: center;
}
.dsp-metrica strong { display: block; font-size: 1.3rem; font-weight: 800; color: var(--bronce); font-variant-numeric: tabular-nums; }
.dsp-metrica small { display: block; color: var(--gris); font-size: 0.72rem; margin-top: 2px; }
.dsp-plano-lbl { font-weight: 700; color: var(--bronce); font-size: 0.85rem; margin: 14px 0 6px; }
.dsp-svg { width: 100%; height: auto; display: block; border-radius: 8px; box-shadow: var(--sombra-sm); background: #fff; }

/* ---- Optimizar corte: restyle (leyenda, retazos, cantidades rápidas) ---- */
.dsp-leyenda { display: flex; flex-wrap: wrap; gap: 6px 12px; margin: 4px 0 12px; }
.dsp-ley-item {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 0.78rem; font-weight: 700; color: var(--tinta);
}
.dsp-ley-item i { width: 11px; height: 11px; border-radius: 3px; display: block; }
.dsp-ley-item small { color: var(--gris); font-weight: 700; }

.dsp-plano-sub { font-weight: 700; color: var(--gris); font-size: 0.78rem; }

.dsp-retazos {
  background: var(--crema); border: 1px dashed var(--borde); border-radius: 12px;
  padding: 12px 14px; margin-top: 14px;
}
.dsp-retazos strong { display: block; font-size: 0.85rem; color: var(--bronce); margin-bottom: 6px; }
.dsp-retazo {
  display: inline-block; background: var(--blanco); border: 1px solid var(--borde);
  border-radius: 999px; padding: 3px 10px; margin: 2px 4px 2px 0;
  font-size: 0.78rem; font-weight: 700; color: var(--tinta); font-variant-numeric: tabular-nums;
}
.dsp-retazo small { color: var(--gris); font-weight: 600; }
.dsp-mas { display: block; color: var(--gris); margin-top: 4px; }

.dsp-acciones { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 14px; }
.dsp-acciones .secundario { width: 100%; }

.dsp-step { display: inline-flex; align-items: center; gap: 7px; flex: none; }
.dsp-step b { min-width: 18px; text-align: center; font-variant-numeric: tabular-nums; color: var(--tinta); }
.dsp-step-btn {
  width: 27px; height: 27px; border-radius: 50%; border: 1px solid var(--borde);
  background: var(--blanco); color: var(--bronce); font-size: 1rem; line-height: 1;
  cursor: pointer; font-weight: 700;
}
.dsp-step-btn:active { transform: scale(0.92); }
/* con 4 métricas en celular, que bajen de línea en vez de apretarse */
.dsp-resumen { flex-wrap: wrap; }
.dsp-metrica { min-width: 30%; }

/* biblioteca: el wordmark en la cabecera de la sección */
.bib-logo { margin-left: auto; height: 16px; width: auto; opacity: 0.9; }

/* biblioteca: grupos de cortes guardados + botón de enviar */
.bib-grupo { font-size: 0.72rem; font-weight: 800; letter-spacing: 1px; text-transform: uppercase; color: var(--oro); margin: 12px 0 2px; }
.bib-grupo:first-child { margin-top: 0; }
.bib-enviar { flex: none; padding: 7px 10px; font-size: 0.74rem; white-space: nowrap; }

/* proveedores: lista de precios de lámina en la ficha */
.pf-lam-fila { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--borde); font-size: 0.85rem; }
.pf-lam-fila:last-child { border-bottom: none; }
.pf-lam-fila span { flex: 1; color: var(--tinta); }
.pf-lam-fila strong { color: var(--bronce); font-variant-numeric: tabular-nums; }
.pf-lam-fila .borrar { background: none; border: none; color: var(--rojo); cursor: pointer; font-size: 0.95rem; padding: 2px 4px; }
/* dos filas: material/calibre/tipo arriba, precio ancho + botón abajo (en una sola
   fila de 5 los selects quedaban de ~76px y el texto no cabía) */
.pf-lam-form { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 6px; margin-top: 8px; }
.pf-lam-form #pfl-precio { grid-column: 1 / 3; }
.pf-lam-form #pfl-add { grid-column: 3; }
.pf-lam-form select, .pf-lam-form input { margin-bottom: 0; padding: 9px 8px; font-size: 0.82rem; }
.pf-lam-form .secundario { padding: 8px 12px; }

/* biblioteca: costo de la orden */
.bib-costo-caja { background: var(--crema); border: 1px solid var(--borde); border-radius: 12px; padding: 12px 14px; margin-top: 12px; }
.bib-costo-caja > strong { display: block; font-size: 0.85rem; color: var(--bronce); margin-bottom: 6px; }
.bib-costo-fila { display: flex; justify-content: space-between; gap: 10px; padding: 4px 0; font-size: 0.85rem; color: var(--tinta); font-variant-numeric: tabular-nums; }
.bib-costo-fila.bib-envio { color: var(--gris); font-size: 0.8rem; }
.bib-envio-inp { width: 90px; padding: 4px 6px; margin: 0; font-size: 0.8rem; text-align: right; }
.bib-costo-fila.bib-total { border-top: 1px solid var(--borde); margin-top: 6px; padding-top: 8px; font-weight: 800; color: var(--bronce); font-size: 0.95rem; }
.bib-costo-nota { display: block; margin-top: 6px; color: #7a621a; }
.preinv-inp { width: 76px; padding: 8px 6px; margin: 0; text-align: center; flex: none; }

/* ============================ Controles y consistencia ============================ */

/* --gold se usaba en 7 reglas sin estar definida (el color caía al heredado); sigue
   al tema del colaborador porque temas.js reescribe --oro */
:root { --gold: var(--oro); }

/* los <input type="file"> salían como el control crudo del navegador */
input[type="file"] {
  width: 100%;
  padding: 9px 10px;
  border: 1px dashed var(--borde);
  border-radius: 11px;
  background: var(--blanco);
  margin-bottom: 12px;
  font-size: 0.85rem;
  color: var(--gris);
}
/* dentro de una fila de controles no lleva el margen de bloque (empataba en
   especificidad con la regla de .fila-controles y ganaba por orden de fuente) */
.fila-controles input[type="file"] { margin-bottom: 0; }
input[type="file"]::file-selector-button {
  border: none;
  border-radius: 8px;
  background: #eceae2;
  color: var(--tinta);
  padding: 7px 12px;
  margin-right: 10px;
  font-size: 0.82rem;
  font-weight: 700;
  cursor: pointer;
}

/* button.enlace fuera del header (herramientas de taller) no tenía NINGUNA regla */
main button.enlace, .modal button.enlace {
  display: block;
  margin: 10px auto 0;
  background: none;
  border: none;
  color: var(--bronce);
  font-weight: 700;
  font-size: 0.88rem;
  letter-spacing: 0.3px;
  padding: 6px 10px;
  cursor: pointer;
}
main button.enlace:hover, .modal button.enlace:hover { color: var(--oro); }

/* modales de formulario: antes era style="text-align:left; max-width:420px" copiado 13 veces */
.modal-form { text-align: left; max-width: 420px; }

/* aclaraciones dentro de una label .subtitulo sin deshacer el uppercase a mano */
.subtitulo .nota { text-transform: none; letter-spacing: 0; color: var(--gris); font-weight: 400; }

/* el chip Pendiente/Aprobado se estiraba a la altura de la fila (flex default stretch) */
.lista-marcas li { align-items: center; gap: 10px; }
.lista-marcas .chip { flex: none; }

/* las flechitas del spinner se montaban sobre el número en los inputs chicos */
.bib-envio-inp::-webkit-inner-spin-button, .bib-envio-inp::-webkit-outer-spin-button,
.preinv-inp::-webkit-inner-spin-button, .preinv-inp::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.bib-envio-inp, .preinv-inp { -moz-appearance: textfield; }

/* feedback de hover en escritorio (en táctil no molesta: no hay hover);
   :not(.festivo)/:not(.sel) para no pisar los estados por orden de fuente */
.cal-nav:hover, .cal-chip:not(.sel):hover { border-color: var(--oro); }
.cal-dia:not(.festivo):hover { background: var(--crema); }
.cal-dia:hover { cursor: pointer; }
.ent-item:hover { background: var(--crema); }
button.mini { transition: border-color 0.15s ease, color 0.15s ease; }
button.mini:hover { border-color: var(--oro); color: var(--bronce); }
.form-compra button { transition: filter 0.12s ease; }
.form-compra button:hover { filter: brightness(1.08); }
.nom-mes-link:hover { background: var(--crema); }

/* en ventanas bajas el login centrado cortaba el logo por arriba (inaccesible) */
.login { justify-content: center; justify-content: safe center; }

/* la cabecera sticky de modal reponía 20px de padding sobre los 22 del modal */
.modal-cab { padding: 20px 22px 10px; }

/* el rótulo del optimizador antes vivía en un inline style */
#dsp-resultado { margin-top: 16px; }

/* ============================ Escritorio ============================ */

@media (min-width: 560px) {
  /* taller tiene exactamente 3 herramientas: que no quede una coja */
  #vista-taller .menu-tiles { grid-template-columns: repeat(3, 1fr); }
  /* con 3 botones de marca (trabajando) el impar de abajo ocupa la fila completa */
  .botones-marca button:nth-child(odd):last-child { grid-column: 1 / -1; }
}

/* en celular los campos fluyen como siempre (el envoltorio .campo no pinta caja) */
#perfil-campos .campo { display: contents; }

@media (min-width: 700px) {
  /* modales que en monitor merecen aire (en celular el ancho lo da la pantalla) */
  .modal-form, .modal-equipo { max-width: 540px; }
  #velo-proveedor-form .modal { max-width: 600px; }
  #velo-mes .modal, #velo-mes-a .modal { max-width: 680px; }
  .tabla-mes { font-size: 0.92rem; }
  .tabla-mes td, .tabla-mes th { padding: 8px 10px; }

  /* datos personales en dos columnas */
  #perfil-campos { display: grid; grid-template-columns: 1fr 1fr; column-gap: 16px; }
  #perfil-campos .campo { display: block; }
  #perfil-campos .campo-ancho { grid-column: 1 / -1; }
}

@media (min-width: 900px) {
  /* LA LETRA EN ESCRITORIO. Aquí —y solo aquí— entra Inter; por eso el celular no
     descarga la fuente. Los nombres de fuentes de emoji al final NO se sirven desde
     aquí: se nombran para que el sistema ponga los suyos (Inter no trae emoji), que
     es lo que hace hoy el navegador por su cuenta. */
  body {
    font-family: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif,
      "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji";
  }

  /* el ancho de main depende de la vista abierta: las de formulario se quedan
     angostas (leerse bien > llenar la pantalla); estas aprovechan el monitor */
  main:has(#vista-inicio:not(.oculto)),
  main:has(#vista-calendario:not(.oculto)),
  main:has(#vista-documentacion:not(.oculto)),
  main:has(#vista-contabilidad:not(.oculto)) { max-width: 1000px; }
  /* los hosts pierden .oculto al abrirse y NO lo recuperan al salir con "← Inicio"
     (solo al reentrar al taller): exigir el ancestro visible evita que la regla se
     "fugue" y deje TODA la app en 1100px */
  main:has(#vista-taller:not(.oculto) #costo-host:not(.oculto)),
  main:has(#vista-taller:not(.oculto) #despiece-host:not(.oculto)),
  main:has(#vista-taller:not(.oculto) #biblioteca-host:not(.oculto)) { max-width: 1100px; }

  /* inicio: el reloj a la izquierda (se queda fijo al hacer scroll), el menú a la
     derecha. Solo si el widget está visible: a la contadora (pago fijo) y a las
     cuentas solo-juegos se les oculta, y el grid dejaría una columna vacía de 400px. */
  #vista-inicio:has(> #widget-marcar:not(.oculto)) { display: grid; grid-template-columns: 400px minmax(0, 1fr); gap: 0 20px; align-items: start; }
  #vista-inicio > * { grid-column: 1; }
  #vista-inicio > .menu-tiles {
    grid-column: 2;
    grid-row: 1 / span 2;
    grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
    align-content: start;
    margin-top: 0;
  }
  #vista-inicio > #widget-marcar { position: sticky; top: 16px; }
  /* el aviso de push (cuando aparece) va a todo lo ancho ARRIBA, no dentro de la
     columna del reloj: si no, robaría una fila y empujaría el reloj hacia abajo. */
  #vista-inicio > #aviso-push { grid-column: 1 / -1; }
  #vista-inicio:has(> #aviso-push:not(.oculto)) > .menu-tiles { grid-row: 2 / span 2; }

  /* calendario: cuadrícula grande a la izquierda, agregar/próximas a la derecha */
  #vista-calendario { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 0 18px; align-items: start; }
  #vista-calendario > * { grid-column: 2; }
  #vista-calendario > .volver-inicio { grid-column: 1 / -1; }
  #vista-calendario > #cal-card { grid-column: 1; grid-row: 2 / span 6; }

  /* documentación: sus dos tarjetas lado a lado */
  #vista-documentacion { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; align-items: start; }
  #vista-documentacion > .volver-inicio { grid-column: 1 / -1; }
  /* contabilidad: Impuestos ahora es rico (año, meses, expedientes de 4 documentos) →
     una sola columna ancha para que respire; adentro, los expedientes se acomodan en su
     propia rejilla (.imp-grid) para aprovechar el monitor. Extractos queda debajo. */
  #vista-contabilidad .imp-grid { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }

  /* calculadora de costos: tableros y piezas lado a lado */
  #costo-host { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; align-items: start; }
  #costo-host > .th-top, #costo-host > .th-total, #costo-host > button { grid-column: 1 / -1; }

  /* optimizar corte: formulario a la izquierda, plano a la derecha…
     …pero mientras no haya resultado, columna centrada como en celular */
  #despiece-host { display: grid; grid-template-columns: 420px minmax(0, 1fr); gap: 0 18px; align-items: start; }
  #despiece-host > * { grid-column: 1; }
  #despiece-host > .th-top { grid-column: 1 / -1; }
  #despiece-host > #dsp-resultado { grid-column: 2; grid-row: 2 / span 4; margin-top: 0; }
  #despiece-host:has(#dsp-resultado:empty) { display: block; max-width: 640px; margin: 0 auto; }

  /* biblioteca: armar la orden | orden, pre-inventario | cortes guardados */
  #biblioteca-host { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; align-items: start; }
  #biblioteca-host > .th-top, #biblioteca-host > #bib-error, #biblioteca-host > #bib-vacio { grid-column: 1 / -1; }

  /* ============ ESCRITORIO DE VERDAD: barra lateral + inicio-tablero ============
     El encabezado sigue a lo ancho; debajo, la app se parte en barra (240px) +
     contenido. main conserva sus max-width por vista y se CENTRA en su columna.
     Todo bebe de las variables del tema: el color de cada colaborador tiñe la
     barra solo. Bajo 900px nada de esto existe. */
  #pantalla-app { display: grid; grid-template-columns: 240px minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); min-height: 100vh; }
  #pantalla-app > header { grid-column: 1 / -1; }
  #pantalla-app > main { grid-row: 2; grid-column: 2; min-width: 0; }
  #barra-lateral {
    display: flex; flex-direction: column; gap: 2px;
    grid-row: 2; grid-column: 1;
    padding: 16px 10px 24px;
    border-right: 1px solid var(--borde);
    position: sticky; top: 0; align-self: start;
    max-height: 100vh; overflow-y: auto;
  }
  .bl-grupo {
    font-size: 0.66rem; letter-spacing: 0.12em; text-transform: uppercase;
    color: var(--gris); padding: 14px 12px 4px;
  }
  .bl-item {
    display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
    padding: 8px 12px; border-radius: 10px;
    border: 1px solid transparent; background: none;
    color: var(--tinta); font-size: 0.9rem; cursor: pointer; position: relative;
    transition: background 0.15s ease, border-color 0.15s ease;
  }
  .bl-item:hover { background: rgba(var(--oro-rgb), 0.1); }
  .bl-item.activo {
    background: var(--blanco); border-color: var(--borde);
    box-shadow: var(--sombra-sm); font-weight: 600;
  }
  .bl-item.activo::before {
    content: ""; position: absolute; left: -10px; top: 22%; bottom: 22%; width: 3px;
    border-radius: 2px; background: linear-gradient(180deg, var(--oro), var(--oro-claro));
  }
  .bl-ico { width: 1.3em; text-align: center; flex: none; }
  .bl-txt { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .bl-item.pronto { opacity: 0.5; cursor: default; }
  .bl-item.pronto:hover { background: none; }

  /* inicio-tablero: la barra ya navega, así que los tiles sobran en el monitor;
     su columna la ocupa el pulso del negocio (misma geometría que tenían los tiles,
     incluida la variante con el aviso de push arriba). */
  #vista-inicio > .menu-tiles { display: none; }
  #vista-inicio > #pulso-inicio {
    display: grid; grid-column: 2; grid-row: 1 / span 2;
    grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
    gap: 12px; align-content: start;
  }
  #vista-inicio:has(> #aviso-push:not(.oculto)) > #pulso-inicio { grid-row: 2 / span 2; }
  .pulso-mini {
    background: var(--blanco); border: 1px solid var(--borde); border-radius: 14px;
    padding: 12px 14px; box-shadow: var(--sombra-sm);
  }
  .pm-k { font-size: 0.68rem; letter-spacing: 0.09em; text-transform: uppercase; color: var(--gris); }
  .pm-v { font-size: 1.3rem; font-weight: 800; margin-top: 2px; font-variant-numeric: tabular-nums; color: var(--bronce); }
  .pm-n { font-size: 0.78rem; color: var(--gris); margin-top: 2px; }
  .pulso-link { cursor: pointer; transition: border-color 0.15s ease, box-shadow 0.15s ease; }
  .pulso-link:hover { border-color: var(--oro); box-shadow: var(--sombra-md); }

  /* cartera en monitor: la vista se ensancha y los clientes van en columnas */
  main:has(#vista-cartera:not(.oculto)) { max-width: 1000px; }
  #cartera-cont { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; align-items: start; }
  #cartera-cont > .cartera-cli { margin-top: 0; }
  #cartera-cont > .cartera-seccion, #cartera-cont > .saldo-nota { grid-column: 1 / -1; }

}

/* ============================ Panel admin en escritorio ============================ */

.main-admin { max-width: 880px; }
td.col-rol { white-space: normal; max-width: 340px; }
.fila-controles > div { max-width: 260px; }

@media (min-width: 1100px) {
  .main-admin { max-width: 1060px; }
}
@media (min-width: 900px) {
  #seccion-empleados, #seccion-reportes { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; align-items: start; }
  #seccion-empleados > .tarjeta:last-child { grid-column: 1 / -1; }
}

/* perfiles de permisos: plantillas por rol en el modal de permisos del admin */
.perfil-chips { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.perfil-chips-lbl { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.5px; text-transform: uppercase; color: var(--gris); }
.perfil-chips button {
  border: 1px solid var(--borde);
  background: var(--crema);
  color: var(--bronce);
  border-radius: 999px;
  padding: 7px 12px;
  font-size: 0.8rem;
  font-weight: 700;
  cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.perfil-chips button:hover { border-color: var(--oro); background: var(--blanco); }
/* el contenedor de chips dinámicos no es un item propio: sus botones fluyen en el flex del padre */
.perfil-chips-din { display: contents; }
.perfil-chips-vacio { font-size: 0.8rem; color: var(--gris); font-style: italic; }
/* el botón de gestionar se distingue de los chips-paquete con borde punteado */
.perfil-chips .chip-gestion { border-style: dashed; margin-left: auto; }

/* sección de avisos dentro del modal de permisos */
.avisos-seccion { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--borde); }
.aviso-op {
  display: flex; gap: 11px; align-items: center;
  padding: 9px 2px; cursor: pointer;
}
.aviso-op input { width: 20px; height: 20px; accent-color: var(--bronce); flex: none; }
.aviso-op span { color: var(--tinta); font-size: 0.95rem; }

/* la confirmación genérica (#velo) debe quedar por encima de los modales de permisos/paquetes */
#velo { z-index: 60; }

/* modal de datos personales de un empleado (admin → Equipo → Datos) */
.de-fila { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--borde); }
.de-rotulo { font-size: 0.78rem; font-weight: 700; color: var(--gris); flex: none; }
.de-valor { text-align: right; color: var(--tinta); font-weight: 600; word-break: break-word; }
.de-valor.vacio { color: var(--gris); font-weight: 400; }

/* mini-modal de gestión de paquetes */
.paquetes-lista { margin-bottom: 4px; }
.paquete-fila {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 0; border-bottom: 1px solid var(--borde);
}
.paquete-info strong { display: block; color: var(--tinta); }
.paquete-info small { display: block; color: var(--gris); font-size: 0.8rem; margin-top: 2px; }
.paquete-fila .acciones { display: flex; gap: 6px; flex: none; }
.paquete-fila .acciones button {
  border: 1px solid var(--borde); background: var(--crema); color: var(--bronce);
  border-radius: 8px; padding: 6px 12px; font-size: 0.82rem; font-weight: 700; cursor: pointer;
}
.paquete-fila .acciones button.peligro { color: var(--rojo); border-color: var(--rojo); }
.paquete-editor { margin-top: 16px; padding-top: 14px; border-top: 2px solid var(--borde); }
.paquete-editor input[type="text"] { width: 100%; margin-bottom: 4px; }
.pq-checks { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 12px; margin-bottom: 4px; }
.pq-check { display: flex; gap: 8px; align-items: center; padding: 5px 2px; cursor: pointer; }
.pq-check input { width: 18px; height: 18px; accent-color: var(--bronce); flex: none; }
.pq-check span { color: var(--tinta); font-size: 0.9rem; }
@media (max-width: 480px) { .pq-checks { grid-template-columns: 1fr; } }

/* ============================ Facturas electrónicas ============================ */

.fac-buscar-fila { display: flex; gap: 8px; }
.fac-buscar-fila input { margin-bottom: 0; flex: 1; }
.fac-buscar-fila .secundario { flex: none; padding: 10px 16px; }
#fac-resultados { margin-top: 10px; }

.fac-cab-lista { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.fac-mes { width: auto; margin-bottom: 0; padding: 8px 10px; font-size: 0.88rem; }

.fac-totales {
  display: flex; flex-wrap: wrap; gap: 6px 16px;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 12px;
  padding: 10px 14px; margin-bottom: 10px; font-size: 0.82rem; color: var(--gris);
}
.fac-totales strong { color: var(--tinta); font-variant-numeric: tabular-nums; }
.fac-totales .fac-tot-total strong { color: var(--bronce); }

.fac-fila { cursor: pointer; }
.fac-fila:hover { background: var(--crema); }
.fac-fila-der { display: flex; align-items: center; gap: 6px; flex: none; }
.fac-monto { font-weight: 800; color: var(--bronce); font-variant-numeric: tabular-nums; white-space: nowrap; }
.fac-monto-nc { color: var(--rojo); }
.fac-chip-tipo { background: #eef3fb; color: #33527d; }
.fac-aviso { background: #fff8e6; border: 1px solid #eadfa9; color: #7a621a; border-radius: 10px; padding: 9px 12px; font-size: 0.84rem; margin: 10px 0; }

/* ---- Lote 4: segmentado Lista / Alegra · gutter de estado · alerta de precio ---- */

/* segmentado bajo los totales (reusa .pestanas), un pelín más compacto */
.fac-vista { margin-bottom: 12px; }
/* badge con el nº de problemas de cruce del mes, dentro del segmento "Facturas Alegra" */
.fac-vista-badge {
  display: inline-block; min-width: 18px; padding: 0 6px; margin-left: 4px;
  background: var(--ambar); color: var(--blanco); border-radius: 999px;
  font-size: 0.72rem; font-weight: 800; font-variant-numeric: tabular-nums;
  line-height: 18px; text-align: center;
}
.fac-vista button.activa .fac-vista-badge { background: rgba(255, 255, 255, 0.26); color: var(--marfil); }

/* pie de frescura del cruce + botón Actualizar (enlace inline, no el centrado de main) */
.fac-alegra-fresco {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px;
  margin: -2px 0 12px; font-size: 0.8rem; color: var(--gris);
}
.fac-alegra-fresco .enlace { display: inline; margin: 0; padding: 0; font-size: 0.8rem; }
.fac-alegra-fresco-txt.sincronizando { color: var(--ambar); font-weight: 700; }

/* gutter de estado del cruce con Alegra a la izquierda de cada fila (ancho fijo para
   que todos los nombres arranquen alineados, haya símbolo o no) */
.fac-estado { flex: none; width: 22px; text-align: center; font-size: 0.95rem; line-height: 1.2; }
.fac-estado-neutro { color: var(--gris); opacity: 0.75; }   /* ○ pendiente de cruce */
/* motivo del cruce colgando del <small> de la fila: ámbar en problemas, gris en pendiente */
.fac-estado-motivo { color: var(--ambar); font-weight: 700; }
.fac-estado-motivo.neutro { color: var(--gris); font-weight: 600; }

/* chip de alerta de precio en la parte derecha de la fila (⚠ N productos más caros) */
.fac-chip-alerta {
  background: #fbf0d8; color: var(--ambar); border: 1px solid #ecd9a6;
  border-radius: 999px; padding: 2px 8px; font-size: 0.74rem; font-weight: 800;
  white-space: nowrap; font-variant-numeric: tabular-nums;
}

/* En pantallas muy angostas (iPhone SE ~320px) una fila con chip de tipo + chip de
   alerta + monto de 7 dígitos apretuja el bloque derecho y desborda unos px. Se le deja
   ENVOLVER y encoger para que el chip baje de línea antes que empujar. Solo <=360px; en
   375px+ nunca ocurre, así que no toca el resto de teléfonos. */
@media (max-width: 360px) {
  .fac-fila-der { flex-wrap: wrap; justify-content: flex-end; flex-shrink: 1; min-width: 0; }
}

/* notas de alerta de precio bajo el nombre del producto en el detalle (3 clases para
   ganarle a ".fac-desc small", que es gris). Ámbar si subió, apagada si bajó. */
.tabla-fac .fac-desc .fac-alerta-nota { display: block; margin-top: 2px; color: var(--ambar); font-weight: 700; }
.tabla-fac .fac-desc .fac-baja-nota { display: block; margin-top: 2px; color: var(--gris); }

.facd-emisor { margin-bottom: 10px; }
.facd-emisor small { display: block; color: var(--gris); margin-top: 2px; }
.facd-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
.facd-pago, .facd-cat {
  border: 1px solid var(--borde); background: var(--blanco); color: var(--gris);
  border-radius: 999px; padding: 6px 11px; font-size: 0.78rem; font-weight: 700; cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.facd-pago { color: var(--naranja); border-color: #ecd9b4; }
.facd-pago.pagada { color: var(--blanco); background: var(--verde); border-color: var(--verde); }
.facd-cat.sel { color: var(--blanco); background: var(--bronce); border-color: var(--bronce); }
.facd-cat:hover, .facd-pago:hover { border-color: var(--oro); }
.facd-prov { margin-bottom: 12px; font-size: 0.88rem; }

.tabla-fac { font-size: 0.82rem; }
.tabla-fac td, .tabla-fac th { padding: 6px 8px; }
.tabla-fac .fac-desc { white-space: normal; min-width: 140px; }
.tabla-fac .fac-desc small { display: block; color: var(--gris); }
.fac-emp { width: 86px; padding: 5px 6px; margin: 0; font-size: 0.82rem; text-align: right; }
.fac-emp::-webkit-inner-spin-button, .fac-emp::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.fac-unidad { font-weight: 800; color: var(--verde-oscuro); }
/* Detalle de factura: desglose completo del IVA por línea. Precios SIN IVA como en
   la factura DIAN; las columnas de IVA (IVA/u, IVA, y por herencia el total c/IVA)
   son valores DERIVADOS → se tiñen de gris para leerse como referencia, no como el
   dato oficial. Encabezados en dos renglones (Precio/u · sin IVA) para angostar y
   que quepan las 7 columnas con scroll horizontal en iPhone. */
.fac-iva-leyenda { color: var(--gris); font-size: 0.74rem; margin: 0 0 6px; }
.tabla-fac-iva td, .tabla-fac-iva th { padding: 6px 7px; }
.tabla-fac-iva th { vertical-align: bottom; line-height: 1.15; }
.tabla-fac-iva th .fac-th-sub {
  display: block; font-weight: 400; font-size: 0.66rem;
  text-transform: none; letter-spacing: 0; color: var(--gris);
}
.tabla-fac td.fac-col-iva, .tabla-fac th.fac-col-iva { color: var(--gris); }
/* nota de descuento por unidad bajo el nombre del producto (precio de lista vs.
   neto real). Especificidad de 3 clases para ganarle a ".fac-desc small" (gris). */
.tabla-fac .fac-desc .fac-desc-nota { display: block; margin-top: 2px; color: var(--verde-oscuro); }

.fac-desglose { margin-top: 12px; border-top: 1px solid var(--borde); padding-top: 8px; }
.facd-acciones { display: flex; gap: 8px; margin-top: 14px; }
.facd-acciones .secundario { flex: 1; }

@media (min-width: 700px) {
  /* el detalle de factura trae una tabla ancha (desglose de IVA por producto):
     que la ventana CREZCA hasta donde haya espacio en el PC para que la tabla
     quepa sin barra interna; en un navegador angosto, 94vw la achica y ahí sí
     la envoltura-tabla vuelve a hacer scroll horizontal. */
  #velo-factura .modal { max-width: min(1120px, 94vw); }
}
@media (min-width: 900px) {
  main:has(#vista-facturas:not(.oculto)) { max-width: 1000px; }
  /* El detalle de la cotización se ensancha como la vista de facturas: con descuento por
     ítem y con IVA son OCHO columnas, y en 640 px hay que arrastrar la tabla de lado para
     ver la última. En el papel se ven todas de un golpe, y eso es justo lo que el dueño
     dijo que le gustaba más (2026-07-28). */
  main:has(#cot-sec-detalle:not(.oculto)) { max-width: 1060px; }
  #vista-facturas { display: grid; grid-template-columns: 5fr 6fr; gap: 0 18px; align-items: start; }
  #vista-facturas > .volver-inicio { grid-column: 1 / -1; }
  /* en la vista de Alegra el panel trae una tabla ancha: se colapsa la rejilla de dos
     columnas a una sola para que la tarjeta de Facturas se estire al ancho completo */
  #vista-facturas:has(#fac-alegra-panel:not(.oculto)) { grid-template-columns: 1fr; }
}

/* estado del robot del correo en Facturas */
.fac-robot-error { color: var(--rojo); }
#fac-robot .enlace { margin: 4px auto 0; }

/* conteo de documentos del mes (señal anti-recaída junto al título) */
.fac-conteo {
  font-size: 0.7rem; font-weight: 700; color: var(--gris);
  background: var(--crema); border: 1px solid var(--borde); border-radius: 999px;
  padding: 2px 9px; margin-left: 8px; vertical-align: middle; white-space: nowrap;
}
.fac-conteo.vacio { color: var(--rojo); background: #fdecea; border-color: #f0cfca; }

/* marca discreta de fecha estimada en una fila de factura */
.fac-aprox { color: var(--ambar); font-weight: 700; }

/* panel del robot enriquecido: modo de búsqueda + resumen de la última corrida */
.fac-robot-modo { font-size: 0.82rem; margin: 6px 0 0; }
.fac-robot-modo.ok { color: var(--verde-oscuro); }
.fac-robot-modo.aviso { color: var(--naranja); }
.fac-robot-resumen { font-size: 0.8rem; color: var(--gris); margin: 4px 0 0; }

/* controles de admin (reescanear + borrar todo), separados por una línea */
.fac-admin { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--borde); }
.fac-admin-btn { width: 100%; margin-top: 8px; }
.fac-admin-btn:first-child { margin-top: 0; }
#fac-robot .fac-admin-btn.peligro { color: var(--rojo); border-color: var(--rojo); background: var(--blanco); }
#fac-robot .fac-admin-btn.peligro:hover { background: var(--rojo); color: var(--marfil); border-color: var(--rojo); }
.fac-peligro-nota { margin: 6px 0 0; }

/* facturas: nota de empaque bajo el producto + botón 📦 discreto */
.fac-emp-nota { display: block; color: var(--verde-oscuro); margin-top: 2px; }
.fac-emp-btn { border: 1px solid var(--borde); background: var(--blanco); border-radius: 8px; padding: 4px 7px; cursor: pointer; }
.fac-emp-btn:hover { border-color: var(--oro); }

/* ===== Cruce con Alegra: herramienta interactiva (solo lectura) =====
   Panel ancho bajo las dos columnas de Facturas. Resumen llano + pestañas por lado +
   filtros (fecha/proveedor/texto) + mini-resumen por proveedor + tabla ordenable. */
#vista-facturas > .fac-alegra { grid-column: 1 / -1; }

/* A. resumen en lenguaje llano + aviso de 'alegraDesde' */
.fac-alegra-frase { font-size: 0.9rem; color: var(--tinta); margin: 12px 0 0; line-height: 1.5; }
.fac-alegra-frase strong { color: var(--bronce); font-variant-numeric: tabular-nums; }
.fac-alegra-frase small { color: var(--gris); }
.fac-cross-banner {
  background: #fff8e6; border: 1px solid #eadfa9; color: #6f5a17;
  border-radius: 12px; padding: 10px 12px; margin: 10px 0 0; font-size: 0.84rem; line-height: 1.5;
}
.fac-cross-banner strong { color: var(--bronce); }

/* atajos de fecha (píldoras contorneadas) — reusadas en el banner y en la barra */
.fac-cross-atajo {
  display: inline-block; border: 1px solid var(--oro); background: var(--blanco);
  color: var(--bronce); border-radius: 999px; padding: 4px 10px; font-size: 0.76rem;
  font-weight: 700; cursor: pointer; margin: 4px 4px 0 0;
}
.fac-cross-atajo:hover { background: var(--oro); color: var(--marfil); }

/* B. pestañas por lado */
.fac-cross-pills { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 12px; }
.fac-cross-pill {
  border: 1px solid var(--borde); background: var(--blanco); color: var(--gris);
  border-radius: 999px; padding: 7px 12px; font-size: 0.82rem; font-weight: 700; cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
}
.fac-cross-pill:hover { border-color: var(--oro); }
.fac-cross-pill.activa { background: var(--bronce-grad); color: var(--marfil); border-color: var(--bronce-osc); }
.fac-cross-pilln {
  font-variant-numeric: tabular-nums; background: rgba(70, 60, 40, 0.10);
  border-radius: 999px; padding: 0 7px; margin-left: 4px; font-size: 0.78rem;
}
.fac-cross-pill.activa .fac-cross-pilln { background: rgba(255, 255, 255, 0.22); }

/* C. barra de filtros */
.fac-cross-filtros { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 10px; }
.fac-cross-fecha { display: flex; gap: 8px; flex-wrap: wrap; }
.fac-cross-fecha label { font-size: 0.78rem; color: var(--gris); font-weight: 700; display: inline-flex; align-items: center; gap: 4px; }
.fac-cross-fecha input[type="date"] { margin: 0; padding: 7px 9px; font-size: 0.82rem; width: auto; }
.fac-cross-filtros select { margin: 0; padding: 8px 10px; font-size: 0.82rem; max-width: 100%; flex: 1 1 200px; }
.fac-cross-atajos { display: flex; flex-wrap: wrap; gap: 4px; }
.fac-cross-q { margin: 0 !important; flex: 1 1 180px; min-width: 140px; }

/* D. conteo filtrado en vivo */
.fac-cross-cuenta { font-size: 0.82rem; color: var(--gris); margin: 4px 0 8px; }
.fac-cross-cuenta strong { color: var(--bronce); font-variant-numeric: tabular-nums; }
.fac-cross-limpiar { display: inline !important; margin: 0 0 0 6px !important; padding: 0 !important; font-size: 0.8rem !important; }

/* E. mini-resumen por proveedor (chips que además filtran al tocarlos) */
.fac-cross-mini { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
.fac-cross-provchip {
  max-width: 100%; border: 1px solid var(--borde); background: var(--crema); color: var(--bronce);
  border-radius: 999px; padding: 4px 10px; font-size: 0.76rem; font-weight: 700; cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fac-cross-provchip:hover { border-color: var(--oro); }
.fac-cross-provchip.activa { background: var(--bronce); color: var(--marfil); border-color: var(--bronce); }
.fac-cross-provn { font-variant-numeric: tabular-nums; opacity: 0.75; margin-left: 2px; font-weight: 800; }

/* D. tabla ordenable, con scroll propio (no empuja el ancho de la página) */
.fac-cross-scroll {
  max-height: 62vh; overflow: auto; border: 1px solid var(--borde); border-radius: 12px;
}
.fac-cross-tabla { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
.fac-cross-tabla th, .fac-cross-tabla td { text-align: left; padding: 7px 9px; border-bottom: 1px solid var(--borde); vertical-align: top; }
.fac-cross-tabla tbody tr:last-child td { border-bottom: none; }
.fac-cross-tabla th {
  position: sticky; top: 0; z-index: 1; background: var(--crema);
  font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.5px; color: var(--gris); font-weight: 800;
}
.fac-cross-tabla th.num, .fac-cross-tabla td.num { text-align: right; }
.fac-cross-orden { background: none; border: none; padding: 0; font: inherit; color: inherit; cursor: pointer; text-transform: uppercase; letter-spacing: 0.5px; }
.fac-cross-orden:hover { color: var(--bronce); }
.fac-cross-cprov strong { display: block; color: var(--tinta); font-weight: 700; }
.fac-cross-cprov small, .fac-cross-cnum small, .fac-cross-cval small { display: block; color: var(--gris); font-size: 0.72rem; font-weight: 600; margin-top: 1px; }
.fac-cross-cnum { font-variant-numeric: tabular-nums; }
.fac-cross-cnum strong { color: var(--tinta); }
.fac-cross-cfecha { white-space: nowrap; color: var(--gris); }
.fac-cross-cval .fac-monto { font-size: 0.86rem; }

/* “ver más” (render por tandas) */
.fac-cross-mas { width: 100%; margin-top: 10px; }

/* F. exportar a Excel para la contadora */
.fac-cross-exportar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 12px; }
.fac-cross-exportar .secundario { flex: none; }
.fac-cross-exp-nota { font-size: 0.78rem; color: var(--gris); }

/* G. pie: sincronización + volver a comparar */
.fac-alegra-pie {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px;
  margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--borde);
  font-size: 0.8rem; color: var(--gris);
}
.fac-alegra-pie .enlace { margin: 0; }
.fac-alegra-aviso { color: var(--naranja); }

/* ==================== Facturas de VENTA (ventas.js) ==================== */
/* reusa .fac-totales / .fac-monto / .th-item; solo el IVA generado se resalta en verde */
.ven-totales .ven-tot-iva strong { color: var(--verde); }
.ven-fila { cursor: default; }
.ven-fila:last-child { border-bottom: none; }
/* el IVA de cada factura, bien visible en la línea (para cazar un misparse a ojo) */
.ven-iva-fila { color: var(--verde-oscuro); font-weight: 700; }
/* filtro por cliente (campo con autocompletado: la lista completa era impresentable) */
.ven-filtro { display: flex; align-items: center; gap: 8px; margin: 4px 0 12px; }
.ven-filtro label { font-size: 0.8rem; font-weight: 700; color: var(--gris); flex: none; }
.ven-filtro input { flex: 1; margin-bottom: 0; }
.ven-filtro .ven-limpiar { flex: none; background: none; border: none; color: var(--gris); cursor: pointer; font-size: 1rem; padding: 4px 6px; }
.ven-filtro .ven-limpiar:hover { color: var(--rojo); }

/* rótulo de grupo en los resultados del buscador de compras */
.fac-res-grupo {
  font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px;
  color: var(--gris); margin: 12px 0 2px;
}

/* cuentas por cobrar (crédito de clientes) */
.cxc-cli { border: 1px solid var(--borde); border-radius: 10px; margin-bottom: 8px; background: var(--blanco); overflow: hidden; }
.cxc-cli > summary { list-style: none; cursor: pointer; display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 10px 12px; }
.cxc-cli > summary::-webkit-details-marker { display: none; }
.cxc-nom { font-weight: 700; color: var(--tinta); }
.cxc-saldo { font-weight: 800; font-variant-numeric: tabular-nums; white-space: nowrap; }
.cxc-saldo.debe { color: var(--rojo); }
.cxc-saldo.favor { color: var(--verde); }
.cxc-saldo.cero { color: var(--gris); }
.cxc-movs { padding: 4px 12px 12px; border-top: 1px dashed var(--borde); }
.cxc-mov { display: flex; align-items: baseline; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--borde); }
.cxc-mov:last-of-type { border-bottom: none; }
.cxc-mov-info { flex: 1; font-size: 0.82rem; color: var(--gris); }
.cxc-mov-monto { font-weight: 700; font-variant-numeric: tabular-nums; }
.cxc-cargo { color: var(--rojo); font-weight: 700; }
.cxc-abono { color: var(--verde); font-weight: 700; }
.cxc-x { flex: none; background: none; border: none; color: var(--gris); cursor: pointer; font-size: 0.9rem; padding: 2px 4px; }
.cxc-x:hover { color: var(--rojo); }
.cxc-mas { margin-top: 8px; }
.cxc-total { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-top: 6px; padding-top: 10px; border-top: 2px solid var(--borde); font-weight: 800; }
.cxc-total .debe { color: var(--rojo); font-variant-numeric: tabular-nums; }
.cxc-total .cero { color: var(--gris); font-variant-numeric: tabular-nums; }

/* ============ Proyección de IVA (Contabilidad · renderProyeccionIva) ============ */
.proy-tag {
  font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.5px;
  font-weight: 800; color: var(--ambar); background: #fbf0d8;
  border: 1px solid #ecd9a6; border-radius: 999px; padding: 2px 8px;
  vertical-align: middle; margin-left: 4px;
}
.proy-iva-banner {
  background: #fff8e6; border: 1px solid #eadfa9; color: #7a621a;
  border-radius: 10px; padding: 9px 12px; font-size: 0.82rem; line-height: 1.4;
  margin-bottom: 12px;
}
.proy-per {
  border: 1px solid var(--borde); border-radius: 12px;
  padding: 10px 12px; margin-bottom: 8px; background: var(--blanco);
}
.proy-per:last-child { margin-bottom: 0; }
.proy-per.vigente { border-color: var(--bronce); box-shadow: 0 0 0 1px var(--bronce) inset; }
.proy-per-cab { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 10px; }
.proy-per-nombre { font-weight: 700; color: var(--tinta); }
.proy-per-tag {
  font-size: 0.64rem; text-transform: uppercase; letter-spacing: 0.5px; font-weight: 800;
  color: var(--marfil); background: var(--bronce); border-radius: 999px; padding: 1px 7px; margin-left: 2px;
}
.proy-per-neto { font-size: 0.9rem; font-variant-numeric: tabular-nums; }
.proy-per-neto strong { font-weight: 800; }
.proy-per-neto.pagar strong { color: var(--rojo); }
.proy-per-neto.favor strong { color: var(--verde); }
/* Sin las ventas de Alegra el neto sale negativo y se pintaría verde, "A favor" — que es
   justo lo contrario de lo que pasa. Mientras falten datos no hay veredicto ni color. */
.proy-per-neto.incierto { color: var(--gris); font-weight: 700; font-style: italic; }
.proy-iva-alerta {
  background: #fdecea; border: 1px solid #f2b8b1; color: #8a1c10;
  border-radius: 10px; padding: 9px 12px; font-size: 0.85rem; line-height: 1.4;
  font-weight: 600; margin-bottom: 12px;
}
.proy-per.incompleto { opacity: 0.75; }
/* Retenciones personales del representante legal: van fuera del total de la empresa. */
.ret-fila.ret-personal { color: var(--gris); font-style: italic; border-top: 1px dashed var(--borde); }
.proy-per-fuera { color: var(--gris); font-style: italic; flex-basis: 100%; }
.proy-per-desglose {
  display: flex; flex-wrap: wrap; gap: 2px 16px;
  margin-top: 6px; font-size: 0.8rem; color: var(--gris);
}
.proy-per-desglose strong { color: var(--tinta); font-variant-numeric: tabular-nums; }
.proy-iva-toggle {
  display: block; margin: 10px auto 0; padding: 6px 10px;
  background: none; border: none; color: var(--bronce);
  font-weight: 700; font-size: 0.85rem; cursor: pointer;
}
.proy-iva-toggle:hover { color: var(--oro); }
#proy-iva-anteriores { margin-top: 8px; }
#proy-iva-anteriores .proy-per:first-child { margin-top: 0; }

/* ============================ To-Do (tareas) ============================ */
.td-alta { display: flex; gap: 8px; }
.td-alta input { margin-bottom: 0; flex: 1; }
.td-alta .secundario { flex: none; width: 46px; padding: 0; font-size: 1.4rem; }
#td-lista, #td-asignadas { margin-top: 10px; }

.td-item {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 10px 2px; border-bottom: 1px solid var(--borde); cursor: pointer;
}
.td-item:last-child { border-bottom: none; }
.td-item input[type="checkbox"] { width: 20px; height: 20px; margin-top: 1px; accent-color: var(--verde); flex: none; cursor: pointer; }
.td-item .td-texto { flex: 1; line-height: 1.35; }
.td-item .td-de { display: block; color: var(--oro); font-size: 0.76rem; font-weight: 700; margin-top: 1px; }
.td-item.td-hecha .td-texto { text-decoration: line-through; color: var(--gris); }
/* Desde cuándo está ahí. Discreta: informa sin competir con el texto de la tarea. */
.td-item .td-cuando { color: var(--gris); font-size: 0.72rem; margin-top: 2px; }
/* La tachada de «hecha» va en .td-texto y SE PROPAGA a los hijos: un `text-decoration:none`
   dentro no la cancela (así lo manda la especificación). Lo único que la corta es una caja
   inline atómica, así que estos renglones —fecha, nombres, quién la asignó— van en
   inline-block al 100%: se ven como bloque y no salen tachados. */
.td-item .td-cuando, .td-item .td-con, .td-item .td-de { display: inline-block; width: 100%; }
.td-item .th-del { flex: none; margin-top: 1px; }

@media (min-width: 900px) {
  main:has(#vista-todo:not(.oculto)) { max-width: 900px; }
  #vista-todo:has(#td-sup) { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; align-items: start; }
  #vista-todo:has(#td-sup) > .volver-inicio { grid-column: 1 / -1; }
}

/* ==================== Ficha 360 del cliente (Contactos → Ver ficha) ==================== */

/* cabecera: punto de color + nombre + botón Editar en una fila */
.ficha-cab-fila { display: flex; align-items: center; gap: 10px; }
.ficha-cab-fila .cli-color { width: 14px; height: 14px; }
.ficha-nombre { flex: 1; min-width: 0; font-size: 1.15rem; font-weight: 800; color: var(--tinta); overflow-wrap: anywhere; }
.ficha-datos { display: flex; flex-direction: column; gap: 4px; margin-top: 10px; color: var(--gris); font-size: 0.88rem; }
.ficha-datos span { overflow-wrap: anywhere; }

/* saldo de la cuenta por cobrar, grande y con el color del estado */
.ficha-saldo { font-size: 1.25rem; font-weight: 800; font-variant-numeric: tabular-nums; margin-bottom: 6px; }
.ficha-saldo.debe { color: var(--rojo); }
.ficha-saldo.favor { color: var(--verde); }
.ficha-saldo.cero { color: var(--gris); }

/* nombres de Alegra vinculados (alias), como pastillas con su ✕ */
.ficha-alias { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.ficha-alias-chip {
  display: inline-flex; align-items: center; gap: 4px;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 999px;
  padding: 4px 8px 4px 11px; font-size: 0.78rem; font-weight: 700; color: var(--gris);
}
.ficha-alias-x { background: none; border: none; color: var(--gris); cursor: pointer; font-size: 0.8rem; padding: 0 2px; }
.ficha-alias-x:hover { color: var(--rojo); }

/* ==================== Cotizaciones (cotizaciones.js + tarjeta en la ficha 360) ==================== */

/* badge de estado: pastilla chica con el color del estado (borrador gris, enviada
   azul, aprobada verde, rechazada rojo) — se usa en la lista, el detalle y la ficha */
.cot-badge {
  display: inline-block; font-size: 0.66rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.4px;
  border-radius: 999px; padding: 2px 8px; border: 1px solid transparent;
  vertical-align: middle; white-space: nowrap;
}
.cot-badge.cot-borrador { color: var(--gris); background: var(--crema); border-color: var(--borde); }
.cot-badge.cot-enviada { color: #33527d; background: #eef3fb; border-color: #c9d8ef; }
.cot-badge.cot-aprobada { color: var(--verde-oscuro); background: #e8f3ec; border-color: #c4dfcf; }
.cot-badge.cot-rechazada { color: var(--rojo); background: #fdecea; border-color: #f0cfca; }

/* chips de estado de la lista (reusan .cal-filtros/.cal-chip); solo el margen es propio */
.cot-chips { margin: 0 0 12px; }

/* fila de la lista: tocar abre el detalle */
.cot-fila { cursor: pointer; }
.cot-fila:hover { background: var(--crema); }
.cot-fila small .cot-badge { margin-left: 2px; }

/* editor: filas de ítems en grid descripción 1fr / cantidad 64px / precio 110px / ✕ */
/* interruptor "Aplica IVA (19%)": el % es fijo, solo se decide si aplica o no */
.cot-iva-fila {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 10px 12px; margin-bottom: 12px; cursor: pointer;
  border: 1px solid var(--borde); border-radius: 10px; background: var(--blanco);
}
.cot-iva-txt strong { display: block; font-size: 0.88rem; color: var(--tinta); font-weight: 700; }
.cot-iva-txt small { display: block; margin-top: 1px; font-size: 0.72rem; color: var(--gris); line-height: 1.3; }
.cot-iva-fila input { width: 22px; height: 22px; flex: none; margin: 0; accent-color: var(--bronce); cursor: pointer; }

/* DESCUENTO: cerrado por defecto. Es un <details> a propósito y no una casilla: mientras
   esté cerrado y vacío el descuento no existe en ninguna parte, y no hay un interruptor
   aparte que pueda quedarse encendido en cero. */
.cot-dto {
  border: 1px solid var(--borde); border-radius: 10px; background: var(--blanco);
  margin: 12px 0;
}
.cot-dto > summary {
  padding: 11px 12px; cursor: pointer; font-size: 0.88rem; font-weight: 700;
  color: var(--tinta); list-style: none;
}
.cot-dto > summary::-webkit-details-marker { display: none; }
.cot-dto > summary::before { content: "▸ "; color: var(--bronce); }
.cot-dto[open] > summary::before { content: "▾ "; }
.cot-dto[open] > summary { border-bottom: 1px solid var(--crema); }
.cot-dto-cuerpo { padding: 10px 12px 12px; }
.cot-dto-cuerpo input { width: 100%; }
.cot-dto-pct { margin: 4px 0 10px; min-height: 1em; color: var(--bronce); font-weight: 600; }
/* el mismo hueco, pero avisando: el descuento tecleado se pasó del total */
.cot-dto-pct.cot-dto-mal { color: var(--rojo, #c0392b); }
/* la condición del descuento, en la ficha: se le muestra al dueño lo MISMO que ve el cliente */
.cot-dto-cond {
  margin: 8px 0 0; padding: 8px 10px; border-radius: 8px;
  background: #e6f2ea; color: #1d5c38; font-size: 0.82rem; line-height: 1.4;
}

/* Fila de ítem = tarjetita en tres renglones, pensada para el iPhone: la descripción
   arriba, medidas/cantidad/precio en medio, y las fotos abajo a lo ancho. Así nada se
   aplasta y las miniaturas caben aunque sean seis. La fila ACTIVA va resaltada: es
   donde cae la foto que se pegue con Ctrl+V. */
.cot-item-fila {
  display: grid;
  /* las fotos van en su PROPIA franja debajo: con varias referencias (frente, lateral,
     detalle…) una casilla fija se desbordaba y se montaba sobre los totales */
  grid-template-columns: minmax(0, 1fr) 30px;
  grid-template-areas: "desc x" "desc2 desc2" "nums nums" "plata plata" "fotos fotos";
  gap: 6px; align-items: center;
  margin-bottom: 8px; padding: 6px;
  border: 1px solid transparent; border-radius: 12px;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.cot-item-fila.activa { border-color: var(--oro); background: rgba(var(--oro-rgb), 0.09); }
.cot-item-fila.soltar { border-color: var(--verde); border-style: dashed; background: rgba(46, 125, 79, 0.08); }
.cot-item-fila input { margin-bottom: 0; padding: 10px 9px; font-size: 0.9rem; }
.cot-item-fila .cot-it-desc { grid-area: desc; }
.cot-item-fila .cot-it-x { grid-area: x; }
.cot-it-nums { grid-area: nums; display: grid; grid-template-columns: minmax(0, 1fr) 52px 88px 62px; gap: 6px; }
.cot-item-fila .cot-it-cant { padding: 10px 4px; text-align: center; }
.cot-item-fila .cot-it-dto { padding: 10px 4px; text-align: center; }
.cot-item-fila .cot-it-med { padding: 10px 8px; font-size: 0.85rem; }
/* El desglose de la línea, en vivo: bruto → descuento → neto. Solo aparece con descuento;
   sin él sería el mismo número dos veces. */
.cot-it-plata {
  grid-area: plata; justify-self: end;
  font-size: 0.78rem; color: var(--gris); font-variant-numeric: tabular-nums;
  padding: 0 2px;
}
.cot-it-plata:empty { display: none; }
.cot-it-plata.mal { color: var(--rojo); font-weight: 700; font-style: normal; }
/* ---------- configuración de contabilidad ----------
   Todo lo que la app NO puede saber y por eso lo escribe el dueño: la tarifa de ICA de su
   actividad y las fechas de vencimiento. Las tres retenciones NO están aquí: son fijas. */
.cont-barra { display: flex; justify-content: flex-end; margin-bottom: 10px; }
/* vencimiento de impuesto en el calendario: la marca en la celda del día y el bloque
   dentro del modal. Solo lo ve quien tiene el permiso de contabilidad. */
.cal-dia.con-impuesto { box-shadow: inset 0 -3px 0 var(--oro); }
.cal-dia .cal-imp { position: absolute; top: 2px; right: 3px; font-size: 0.62rem; line-height: 1; }
.dia-imp {
  background: #fff8e6; border: 1px solid #eadfa9; border-radius: 10px;
  padding: 8px 11px; margin-bottom: 6px; color: #7a621a; font-size: 0.86rem;
}
/* ---------- To-Do compartido ----------
   Una tarea de varios: una sola fila, un solo `hecha`. Quien la marca la marca para todos,
   que es lo que pidió el dueño («es un avance compartido»). */
/* «¿A quiénes les toca?» de una repetida grupal */
.td-rep-grupo { margin: 8px 0 0; }
.td-rep-grupo > summary { cursor: pointer; font-size: 0.85rem; font-weight: 600; color: var(--bronce); padding: 4px 0; }
.td-rep-gente { display: flex; flex-wrap: wrap; gap: 6px 12px; }
.td-rep-chk { display: flex; align-items: center; gap: 5px; font-size: 0.85rem; }
.td-rep-chk input { margin: 0; }
.td-rep-equipo { display: block; color: var(--bronce); }

.td-item.td-compartida { border-left: 3px solid var(--oro); padding-left: 7px; }
.td-con { display: block; color: var(--gris); font-size: 0.74rem; margin-top: 2px; }
.th-mini.th-invitar, .th-mini.th-salir { color: var(--bronce); }
.td-inv-panel {
  display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
  margin: -2px 0 8px 10px; padding: 8px 10px;
  border: 1px solid var(--borde); border-left: 3px solid var(--oro);
  border-radius: 10px; background: var(--crema);
}
.td-inv-panel select { flex: 1 1 150px; min-width: 0; margin-bottom: 0; }
.td-inv-panel button { flex: none; padding: 8px 12px; font-size: 0.82rem; }
.td-inv-cargando { color: var(--gris); font-size: 0.82rem; }
/* Cambiar el grupo de una repetida ya programada. Se ve como el panel de invitar —es el
   mismo gesto— pero en columna, porque las casillas necesitan su renglón. */
.td-rep-panel {
  margin: -2px 0 8px 10px; padding: 8px 10px;
  border: 1px solid var(--borde); border-left: 3px solid var(--oro);
  border-radius: 10px; background: var(--crema);
}
.td-rep-panel-btns { display: flex; gap: 6px; margin-top: 8px; }
.td-rep-panel-btns button { flex: none; padding: 7px 12px; font-size: 0.82rem; }
/* a quien solo está en el grupo se le dice de quién es, en vez de botones que no puede usar */
.td-rep-dequien { font-size: 0.72rem; text-align: right; max-width: 96px; line-height: 1.25; }

.ent-item.ent-impuesto { background: #fffdf5; }
.ent-color-imp { background: transparent !important; display: grid; place-items: center; font-size: 0.9rem; }
.dia-imp strong { display: block; }
.dia-imp small { display: block; margin-top: 2px; opacity: 0.85; }
/* subtítulos de cada impuesto dentro de la tarjeta de proyección */
.proy-sub {
  margin: 16px 0 8px; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.6px;
  color: var(--bronce); font-weight: 700;
}
.proy-sub:first-child { margin-top: 4px; }
/* Los DOS GRUPOS de la proyección. Pesan más que los subtítulos de dentro porque la
   diferencia entre ellos es de quién es la plata, no de qué impuesto es. */
.proy-grupo {
  font-size: 0.92rem; text-transform: none; letter-spacing: 0; color: var(--tinta);
  font-weight: 800; margin-top: 26px; padding-top: 14px; border-top: 2px solid var(--borde);
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
}
.proy-grupo:first-child { margin-top: 4px; padding-top: 0; border-top: none; }
.proy-grupo-nota {
  font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px;
  color: var(--gris);
}
/* el bloque de lo que se gira nace marcado: es una deuda, no un saldo */
.proy-grupo-girar { border-top-color: var(--rojo); }
.proy-grupo-girar .proy-grupo-nota { color: var(--rojo); }
/* «A girar» NUNCA en verde y nunca con «a favor»: esa plata no es suya y no se le
   descuenta de nada. Es el error que más caro sale de esta pantalla. */
.proy-per-neto.girar { color: var(--rojo); }
.proy-per-neto.girar strong { color: var(--rojo); font-weight: 800; }

/* LO RETENIDO CONTRA LO DECLARADO, mes a mes. Lo que falta por presentar es una deuda con
   fecha: se marca, no se deja como un renglón más. */
.proy-sub { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.proy-entidad { text-transform: none; letter-spacing: 0; font-weight: 600; color: var(--gris); font-size: 0.76rem; }
.proy-sub-falta {
  margin-left: auto; text-transform: none; letter-spacing: 0; font-size: 0.78rem;
  font-weight: 800; color: var(--rojo); font-variant-numeric: tabular-nums;
}
.proy-per-debe { border-left: 4px solid var(--rojo); padding-left: 9px; }
.proy-falta { color: var(--rojo); font-weight: 700; flex-basis: 100%; }
.proy-cuadra { color: var(--verde-oscuro); font-weight: 700; flex-basis: 100%; }
/* de dónde sale la cifra: sin poder llegar a la factura no se puede auditar */
.proy-pagos { flex-basis: 100%; margin-top: 2px; }
.proy-pagos > summary { cursor: pointer; color: var(--gris); font-size: 0.78rem; }
.proy-pago {
  display: flex; justify-content: space-between; gap: 10px; align-items: baseline;
  padding: 3px 0 3px 12px; font-size: 0.79rem; border-bottom: 1px dashed var(--borde);
}
.proy-pago:last-child { border-bottom: none; }
.proy-pago strong { font-variant-numeric: tabular-nums; white-space: nowrap; }
.proy-anteriores { margin-top: 8px; }
.proy-anteriores > summary {
  cursor: pointer; color: var(--bronce); font-weight: 700; font-size: 0.85rem;
  padding: 6px 0; list-style: none;
}
.proy-anteriores > summary::-webkit-details-marker { display: none; }
.proy-anteriores > summary::before { content: '▸ '; }
.proy-anteriores[open] > summary::before { content: '▾ '; }
.modal-ancho { max-width: min(760px, 94vw); }
.cfg-titulo {
  margin: 18px 0 2px; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.6px;
  color: var(--bronce); font-weight: 700;
}
.cfg-titulo:first-of-type { margin-top: 4px; }
.cfg-lista { margin: 8px 0; }
.cfg-item {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 10px; font-size: 0.85rem;
  border: 1px solid var(--borde); border-radius: 9px; background: var(--crema);
  margin-bottom: 6px;
}
.cfg-item span { min-width: 0; overflow-wrap: anywhere; }
.cfg-item .peligro { color: var(--rojo); flex: none; }
.cfg-fila { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.cfg-fila input, .cfg-fila select { flex: 1 1 120px; min-width: 0; margin-bottom: 0; }
.cfg-fila button { flex: none; }
.cfg-fila input:disabled, .cfg-fila button:disabled { opacity: 0.5; cursor: not-allowed; }
/* «Así se están aplicando hoy las retenciones». Cada regla es una tarjeta y no un
   renglón de tabla: lleva la nota y la norma de la que salió, que es lo que le permite
   a la contadora revisarla en vez de creernos. */
.cfg-ret-fila {
  display: grid; gap: 2px; padding: 9px 10px; margin-bottom: 6px;
  border: 1px solid var(--borde); border-radius: 10px; background: var(--crema);
}
.cfg-ret-nom { font-weight: 700; font-size: 0.86rem; }
.cfg-ret-num { font-size: 0.86rem; font-variant-numeric: tabular-nums; }
.cfg-ret-nota { font-size: 0.76rem; color: var(--gris); line-height: 1.35; }
.cfg-ret-fuente { font-size: 0.7rem; color: var(--gris); opacity: 0.8; overflow-wrap: anywhere; }
.cfg-uvt { color: var(--gris); font-weight: 400; }
/* las filas que ya cambiaron dos veces este año se marcan: son las que hay que
   confirmar antes de retener, no las que se dan por buenas */
.cfg-ret-fila.riesgo { border-left: 3px solid var(--oro); }
.cfg-ret-tag {
  font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.5px;
  background: var(--oro); color: #fff; padding: 1px 5px; border-radius: 6px; vertical-align: 1px;
}
.cfg-plegado { margin: 10px 0 4px; }
.cfg-plegado > summary {
  cursor: pointer; color: var(--bronce); font-weight: 700; font-size: 0.82rem; padding: 6px 0;
}

/* PREGUNTAS PARA LA CONTADORA. Las dos respuestas se ven DISTINTAS a propósito: la
   diferencia entre lo que él supone y lo que ella confirma es la función de la pantalla. */
.preg-fila {
  border: 1px solid var(--borde); border-left: 3px solid var(--borde);
  border-radius: 10px; padding: 10px 12px; margin-bottom: 10px; background: var(--crema);
}
.preg-fila.preg-abierta { border-left-color: var(--gris); }
.preg-fila.preg-espera { border-left-color: var(--oro); }
.preg-fila.preg-cuadra { border-left-color: var(--verde); }
/* que ELLA ya contestó se ve verde: era lo que la pantalla escondía */
.preg-fila.preg-contesto { border-left-color: var(--teal); }
.preg-fila.preg-contesto .preg-estado { color: var(--teal); }
.preg-fila.preg-discrepa { border-left-color: var(--rojo); }
.preg-cab { display: flex; gap: 10px; align-items: baseline; justify-content: space-between; flex-wrap: wrap; }
.preg-txt { font-weight: 700; font-size: 0.88rem; line-height: 1.35; }
.preg-estado { font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.5px; color: var(--gris); white-space: nowrap; }
.preg-fila.preg-cuadra .preg-estado { color: var(--verde); }
.preg-fila.preg-discrepa .preg-estado { color: var(--rojo); }
.preg-porque { font-size: 0.76rem; color: var(--gris); margin: 4px 0 0; line-height: 1.4; }
.preg-afecta { font-size: 0.72rem; color: var(--bronce); font-weight: 700; margin: 3px 0 0; }
.preg-resp { margin-top: 8px; }
.preg-quien { display: block; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.5px; color: var(--gris); margin-bottom: 3px; }
.preg-resp textarea { width: 100%; margin: 0; font-size: 0.84rem; resize: vertical; }
/* la de ella se marca: mientras esté vacía, lo de arriba es una suposición */
.preg-de-ella .preg-quien { color: var(--bronce); }
.preg-de-ella textarea { border-left: 3px solid var(--oro); }
.preg-comparar { margin-top: 8px; font-size: 0.78rem; color: var(--gris); }
/* el elegido se marca abajo, con el botón lleno: el subrayado era de cuando esto se
   pintaba como enlace */
.preg-comparar .link.sel { font-weight: 800; }
.preg-quitar { margin-top: 6px; font-size: 0.76rem; }

/* La guía. Texto para leer, no una pantalla de datos: renglón más suelto y más aire. */
.guia-cont { font-size: 0.86rem; line-height: 1.55; }
.guia-cont h3 { font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.6px; color: var(--bronce); margin: 18px 0 6px; }
.guia-cont h3:first-child { margin-top: 6px; }
.guia-cont p { margin: 0 0 8px; }
.guia-cont ul { margin: 0 0 8px; padding-left: 20px; }
.guia-cont li { margin-bottom: 5px; }
.guia-tabla { width: 100%; border-collapse: collapse; font-size: 0.78rem; margin-bottom: 10px; display: block; overflow-x: auto; }
.guia-tabla th, .guia-tabla td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--borde); vertical-align: top; }
.guia-tabla th { color: var(--bronce); text-transform: uppercase; font-size: 0.68rem; letter-spacing: 0.5px; }
.guia-ojo { border-left: 3px solid var(--oro); padding: 8px 10px; background: var(--crema); border-radius: 0 8px 8px 0; }
#conta-guia > summary { cursor: pointer; padding: 4px 0; }

/* TODO RAÍCES — «las cuentas de los otros lados».
   Se ve DISTINTO de Contabilidad a propósito: lo de aquí no es de la SAS, y confundir
   este total con el de la empresa es el único error grave que puede cometer esta pantalla. */
.tr-anios { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0; }
.tr-anio {
  border: 1px solid var(--borde); background: transparent; color: var(--gris);
  border-radius: 999px; padding: 4px 12px; font-size: 0.8rem; font-weight: 700; cursor: pointer;
}
.tr-anio.sel { border-color: var(--bronce); color: var(--tinta); background: var(--crema); }
.tr-fila {
  display: flex; justify-content: space-between; align-items: baseline; gap: 12px;
  padding: 8px 0; border-bottom: 1px solid var(--borde);
}
.tr-et { font-size: 0.86rem; }
.tr-et small { display: block; color: var(--gris); font-size: 0.72rem; }
.tr-monto { font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap; }
.tr-fila.tr-facturado .tr-monto { color: var(--verde); }
.tr-fila.tr-terceros .tr-monto { color: var(--oro); }
.tr-fila.tr-total { border-bottom: none; border-top: 2px solid var(--tinta); margin-top: 4px; padding-top: 10px; }
.tr-fila.tr-total .tr-et { font-weight: 800; }
.tr-fila.tr-total .tr-monto { font-size: 1.05rem; font-weight: 800; }
.tr-porTercero { display: flex; flex-wrap: wrap; gap: 4px 14px; padding: 4px 0 8px 10px; font-size: 0.76rem; color: var(--gris); }
.tr-aviso {
  font-size: 0.74rem; color: var(--gris); line-height: 1.4; margin: 10px 0 0;
  border-left: 3px solid var(--oro); padding: 6px 10px; background: var(--crema); border-radius: 0 8px 8px 0;
}
.tr-item {
  display: flex; justify-content: space-between; gap: 12px; align-items: flex-start;
  padding: 9px 0; border-bottom: 1px solid var(--borde);
}
.tr-item:last-child { border-bottom: none; }
.tr-item.de-tercero { border-left: 3px solid var(--oro); padding-left: 8px; }
.tr-item-txt { min-width: 0; display: grid; gap: 1px; }
.tr-desc { font-size: 0.8rem; color: var(--gris); overflow-wrap: anywhere; }
.tr-item-der { text-align: right; white-space: nowrap; }
.tr-item-monto { display: block; font-variant-numeric: tabular-nums; font-weight: 700; font-size: 0.9rem; }
.tr-item-btns { display: inline-flex; gap: 8px; font-size: 0.76rem; }
@media (min-width: 900px) { main:has(#vista-todo-raices:not(.oculto)) { max-width: 860px; } }
/* el libro: cuentas, personas y movimientos */
.tr-flecha { color: var(--bronce); font-weight: 700; flex: none; }
.tr-cta, .tr-mov {
  display: flex; justify-content: space-between; gap: 12px; align-items: flex-start;
  padding: 9px 0; border-bottom: 1px solid var(--borde);
}
.tr-cta:last-child, .tr-mov:last-child { border-bottom: none; }
.tr-cta.de-raices { border-left: 3px solid var(--verde); padding-left: 8px; }
.tr-cta.archivada { opacity: 0.55; }
.tr-cta-txt, .tr-mov-txt { min-width: 0; display: grid; gap: 1px; }
.tr-cta-der, .tr-mov-der { text-align: right; white-space: nowrap; display: grid; gap: 1px; }
.tr-cta-saldo { font-variant-numeric: tabular-nums; font-weight: 800; font-size: 0.95rem; }
.tr-cta-saldo.negativo { color: var(--rojo); }
.tr-cta-btns { display: inline-flex; gap: 8px; font-size: 0.74rem; justify-content: flex-end; }
.tr-mov-monto { font-variant-numeric: tabular-nums; font-weight: 700; font-size: 0.9rem; }
.tr-mov.tr-ingreso .tr-mov-monto { color: var(--verde); }
.tr-mov.tr-egreso .tr-mov-monto { color: var(--rojo); }
.tr-mov.tr-traslado { border-left: 3px solid var(--oro); padding-left: 8px; }
/* ── EL NÚMERO GRANDE Y DÓNDE ESTÁ ────────────────────────────────────────────
   La barra de tres tramos contesta «¿dónde está mi plata?» sin leer una cifra: el
   ancho de cada tramo es su proporción real. */
.tarjeta.tr-total { padding: 20px 18px 16px; }
.tr-total .tr-rotulo {
  font-size: .7rem; letter-spacing: 2px; text-transform: uppercase;
  color: var(--bronce); font-weight: 700;
}
.tr-total .tr-plata {
  font-variant-numeric: tabular-nums; font-weight: 800; letter-spacing: -1.5px;
  font-size: clamp(2.2rem, 11vw, 3.2rem); line-height: 1.03; margin: 5px 0 2px;
}
.tr-total .tr-cuando { font-size: .72rem; color: var(--gris); }
.tr-reparto {
  display: flex; height: 13px; border-radius: 7px; overflow: hidden;
  margin: 15px 0 10px; background: var(--crema);
}
.tr-reparto i { display: block; }
.tr-reparto i.empresa { background: var(--verde); }
.tr-reparto i.prestadas { background: var(--oro); }
.tr-reparto i.efectivo { background: var(--ambar); }
.tr-fila-rep {
  display: grid; grid-template-columns: 11px 1fr auto; align-items: baseline; gap: 9px;
  padding: 8px 0; border-bottom: 1px solid var(--borde);
}
.tr-fila-rep:last-child { border-bottom: none; }
.tr-punto { width: 9px; height: 9px; border-radius: 3px; margin-top: 5px; }
.tr-punto.empresa { background: var(--verde); }
.tr-punto.prestadas { background: var(--oro); }
.tr-punto.efectivo { background: var(--ambar); }
.tr-que { font-size: .85rem; }
.tr-que small { display: block; color: var(--gris); font-size: .7rem; margin-top: 1px; }

/* la línea que separa la plata de lo que NO es plata */
.tr-bajo-linea { border-top: 2px solid var(--tinta); margin: 2px 0 12px; }

/* LA DEUDA, en el único bloque oscuro de la pantalla: así es imposible leerla como
   plata que se tiene. Si sumara arriba, la app diría que hay más de lo que hay. */
.tr-oscuro {
  background: linear-gradient(135deg, var(--noir-2) 0%, var(--noir) 100%);
  border-radius: 16px; padding: 15px 17px; margin-bottom: 12px; color: var(--marfil);
  box-shadow: var(--sombra-md);
}
.tr-osc-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.tr-osc-tit {
  font-size: .7rem; letter-spacing: 1.6px; text-transform: uppercase;
  font-weight: 700; color: var(--oro-claro);
}
.tr-oscuro .tr-monto { font-size: 1.25rem; color: var(--marfil); }
.tr-osc-det { display: flex; flex-wrap: wrap; gap: 3px 16px; margin-top: 8px; font-size: .74rem; color: rgba(250, 249, 246, .68); }
.tr-osc-det b { font-variant-numeric: tabular-nums; color: var(--marfil); font-weight: 600; }
.tr-osc-nota { font-size: .72rem; line-height: 1.5; color: rgba(250, 249, 246, .6); margin-top: 8px; }
.tr-pagado {
  background: var(--blanco); border: 1px solid var(--borde); border-left: 3px solid var(--gris);
  border-radius: 0 14px 14px 0; padding: 13px 15px; margin-bottom: 12px;
}
.tr-pag-tit { font-size: .7rem; letter-spacing: 1.6px; text-transform: uppercase; font-weight: 700; color: var(--gris); }

/* EL TOPE de lo que puede recibir cada persona en el año. Cuenta lo que ENTRA, no lo
   que queda: por eso alguien puede estar al 87 % con la cuenta casi vacía. */
.tr-tope { margin-top: 8px; }
.tr-tope-cab {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: .7rem; color: var(--gris); text-transform: uppercase; letter-spacing: 1px; font-weight: 700;
}
.tr-tope-pct { font-variant-numeric: tabular-nums; font-size: .92rem; color: var(--tinta); }
.tr-tope.alerta .tr-tope-pct { color: var(--rojo); }
.tr-tope-barra {
  position: relative; height: 9px; border-radius: 5px; background: var(--blanco);
  border: 1px solid var(--borde); overflow: hidden; margin: 5px 0 4px;
}
.tr-tope-barra.chica { height: 6px; margin: 9px 0 0; background: var(--crema); border: none; }
.tr-tope-barra i { display: block; height: 100%; background: var(--oro); }
.tr-tope.alerta .tr-tope-barra i { background: linear-gradient(90deg, var(--oro), var(--rojo)); }
/* PASADO EL TOPE la barra NO se detiene: se reescala. Lo recibido ocupa todo el ancho y la
   línea marca dónde quedó el tope, así que se ve por dónde lo cruzó y cuánto lleva de más.
   Una barra clavada en el 100% no distingue pasarse por cien mil de pasarse por veinte
   millones, que es justo lo que hay que poder ver.
   Va con la MISMA cuenta de clases que la regla de `.alerta` de arriba (`.tr-tope.alerta
   .tr-tope-barra i`), porque si no, aquella gana por especificidad y el rayado no aparece
   — el mismo tropiezo que ya hubo con la guía del sudoku. */
.tr-tope.pasado .tr-tope-barra i,
.tr-tope-barra.pasado i {
  background: repeating-linear-gradient(135deg, var(--rojo) 0 5px, #a5322a 5px 10px);
}
.tr-tope-linea {
  position: absolute; top: -2px; bottom: -2px; width: 2px; background: var(--tinta);
  box-shadow: 0 0 0 1px var(--blanco);
}
.tr-tope-txt { font-size: .73rem; color: var(--gris); font-variant-numeric: tabular-nums; }
.tr-tope.alerta .tr-tope-txt strong { color: var(--rojo); }

/* sus cuentas, dentro de la ficha de la persona */
.tr-sus-ctas { margin-top: 8px; display: grid; gap: 1px; }
.tr-sub-cta {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  font-size: .78rem; padding: 5px 0; border-top: 1px solid var(--borde);
}
.tr-sub-cta.archivada { opacity: .55; }
.tr-sub-monto { font-variant-numeric: tabular-nums; font-weight: 700; white-space: nowrap; }
.tr-sub-monto.negativo { color: var(--rojo); }
.tr-eti {
  font-size: .6rem; letter-spacing: .5px; text-transform: uppercase; font-weight: 700;
  padding: 1px 6px; border-radius: 4px; vertical-align: 1px;
}
.tr-eti.prestada { background: rgba(var(--oro-rgb), .16); color: #6d5622; }
.tr-eti.personal { background: #eeece6; color: var(--gris); }
.tr-eti.tarjeta { background: rgba(192, 57, 43, .1); color: var(--rojo); }
.tr-chk { display: inline-flex; align-items: center; gap: 6px; font-size: .78rem; color: var(--gris); }

/* ── LA NAVEGACIÓN entre el tablero, los perfiles y un perfil ── */
.tr-nav { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 12px; }
.btn-cfg {
  font: inherit; font-size: .76rem; font-weight: 700; padding: 7px 14px; border-radius: 999px;
  border: 1px solid var(--oro); background: var(--blanco); color: var(--bronce); cursor: pointer;
}
.btn-cfg:hover { background: rgba(var(--oro-rgb), 0.12); }
/* el botón que lleva a los perfiles: una fila entera, no un enlace escondido */
.tr-ir-perfiles {
  width: 100%; display: flex; justify-content: space-between; align-items: center; gap: 12px;
  font: inherit; text-align: left; cursor: pointer; margin-bottom: 16px;
  background: var(--blanco); border: 1px solid var(--borde); border-left: 3px solid var(--oro);
  border-radius: 0 14px 14px 0; padding: 14px 16px; box-shadow: var(--sombra-sm);
}
.tr-ir-txt strong { display: block; font-size: .95rem; }
.tr-ir-txt small { display: block; color: var(--gris); font-size: .72rem; margin-top: 2px; }
.tr-ir-flecha { color: var(--bronce); font-size: 1.5rem; line-height: 1; }

/* cada perfil, una tarjeta que se toca */
.tr-perfil-card {
  width: 100%; display: block; text-align: left; font: inherit; cursor: pointer;
  background: var(--blanco); border: 1px solid var(--borde); border-radius: 14px;
  padding: 13px 15px; margin-bottom: 10px; box-shadow: var(--sombra-sm);
}
.tr-perfil-card.es-empresa { border-left: 3px solid var(--verde); }
.tr-perfil-card.archivada { opacity: .55; }
.tr-pc-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.tr-pc-cab strong { font-size: .98rem; }
.tr-pc-cab .tr-monto { color: var(--oro); font-size: 1.02rem; }
.tr-pc-sub { font-size: .72rem; color: var(--gris); margin-top: 3px; }
.tr-pc-barra { height: 6px; border-radius: 3px; background: var(--crema); overflow: hidden; margin-top: 9px; }
.tr-pc-barra i { display: block; height: 100%; background: var(--oro); }
.tr-pc-barra.alerta i { background: linear-gradient(90deg, var(--oro), var(--rojo)); }
.tr-pc-tope { font-size: .69rem; color: var(--gris); margin-top: 4px; font-variant-numeric: tabular-nums; }

/* ── EL PERFIL ── */
.tr-p-nombre { font-size: 1.35rem; font-weight: 800; letter-spacing: -.4px; }
.tr-p-sub { font-size: .73rem; color: var(--gris); margin-top: 3px; }
/* un solo carril derecho para todas las cifras, como un extracto bien impreso */
.tr-eje { display: grid; }
.tr-ren {
  display: grid; grid-template-columns: 1fr auto; gap: 10px; align-items: baseline;
  padding: 9px 0; border-bottom: 1px solid var(--borde); font-size: .85rem;
}
.tr-ren:last-child { border-bottom: none; }
.tr-ren small { display: block; color: var(--gris); font-size: .69rem; margin-top: 1px; }
.tr-ren b { font-variant-numeric: tabular-nums; font-weight: 700; }
.tr-ren b.negativo { color: var(--rojo); }

/* el costo por plataforma, comparable en PORCENTAJE del bruto */
.tr-costo-uno { display: grid; gap: 6px; margin-bottom: 14px; }
.tr-costo-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.tr-costo-pct { font-variant-numeric: tabular-nums; font-weight: 800; font-size: .95rem; }
.tr-costo-barra { display: flex; height: 10px; border-radius: 5px; overflow: hidden; background: var(--crema); }
.tr-costo-barra i.com { background: var(--bronce); }
.tr-costo-barra i.env { background: var(--oro); }
.tr-costo-barra i.pub { background: var(--oro-claro); }
.tr-costo-pie { display: flex; flex-wrap: wrap; gap: 2px 14px; font-size: .7rem; color: var(--gris); }
.tr-costo-pie b { font-variant-numeric: tabular-nums; color: var(--tinta); font-weight: 600; }

/* la rejilla de papeles: se ven los HUECOS, no una lista de lo que ya está */
.tr-rejilla { display: grid; gap: 3px; }
/* el número de columnas lo pone quien pinta la rejilla, no el CSS: estaba clavado en seis
   y al agregar la séptima el ICA se salió de la fila y quedó colgando debajo de los meses */
.tr-rj-cab, .tr-rj-fila { display: grid; grid-template-columns: 58px repeat(var(--rj-cols, 6), 1fr); gap: 4px; align-items: center; }
.tr-rj-cab span {
  font-size: .58rem; letter-spacing: .3px; text-transform: uppercase; color: var(--gris);
  font-weight: 700; text-align: center;
}
.tr-rj-fila .tr-mes { font-size: .7rem; color: var(--gris); font-weight: 600; }
/* CADA CUADRITO DICE ALGO. Eran barras de color y ya; ahora el de un certificado trae su
   monto y el mes sin ventas lo dice con palabras. Números tabulares para que las columnas
   se puedan leer de arriba abajo sin que bailen. */
.tr-rj-fila .rj {
  display: block; min-height: 22px; border-radius: 5px; padding: 3px 6px;
  font-size: .68rem; font-weight: 700; text-align: center;
  font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tr-rj-fila .rj.hay { background: rgba(46, 125, 79, .82); color: #fff; }
.tr-rj-fila .rj.no { background: #e8e4d9; border: 1px solid var(--borde); color: var(--gris); }
/* «sin ventas» NO se ve como un hueco: no falta nada, no había nada que traer */
.tr-rj-fila .rj.nada { background: none; border: 1px dashed var(--borde); color: #a09c92; font-weight: 400; }
/* las dos filas de abajo: lo que dicen los papeles contra lo que trae la API */
.tr-rj-suma { margin-top: 6px; }
/* el rótulo de estas dos filas no cabe en la columna de los meses: se pone ENCIMA, a lo
   ancho, y las celdas quedan alineadas con sus columnas igual */
.tr-rj-suma { grid-template-columns: 34px repeat(var(--rj-cols, 6), 1fr); }
.tr-rj-suma .tr-mes {
  grid-column: 1 / -1; text-align: left; padding-left: 2px; margin-bottom: 2px;
}
.tr-rj-suma .rj.tot { grid-row: 2; }
.tr-rj-suma .rj.tot:first-of-type { grid-column: 2; }
.tr-rj-suma .tr-mes { font-weight: 800; text-transform: uppercase; font-size: .62rem; }
/* la fila de totales SÍ puede ocupar dos renglones: el «dif» se aplastaba contra el monto
   y quedaba "8.715dif 8.912", que no se puede leer */
.tr-rj-fila .rj.tot {
  background: none; border-top: 2px solid var(--borde); border-radius: 0;
  color: var(--tinta); padding-top: 5px; white-space: normal; line-height: 1.3;
}
.tr-rj-fila .rj.tot.ok { border-top-color: var(--verde); }
.tr-rj-fila .rj.tot.mal { border-top-color: var(--rojo); color: var(--rojo); }
.tr-rj-fila .rj.tot small { display: block; font-size: .6rem; font-weight: 700; }
/* en pantallas angostas la rejilla se desliza en su propia caja: la página nunca se mueve
   de lado, que es la regla de la casa para tablas anchas */
.tr-rejilla { overflow-x: auto; }
.tr-rj-cab, .tr-rj-fila { min-width: 320px; }

/* ── IMPORTAR UN REPORTE ──────────────────────────────────────────────────────
   Lo que el archivo trae se PROPONE. El color de cada fila dice qué le va a pasar:
   se guarda, ya estaba, hay que mirarla, o no puede entrar. */
.tr-imp-resumen {
  border-left: 3px solid var(--oro); background: var(--crema); padding: 10px 12px;
  border-radius: 0 10px 10px 0; font-size: .8rem; margin-bottom: 10px;
}
.tr-imp-resumen .nota { margin-top: 4px; }
.tr-imp-faltan {
  border-left: 3px solid var(--rojo); background: rgba(192, 57, 43, .05); padding: 9px 12px;
  border-radius: 0 10px 10px 0; font-size: .77rem; line-height: 1.45; margin-bottom: 10px;
}
.tr-imp-desc { font-size: .76rem; color: var(--gris); margin-bottom: 10px; }
.tr-imp-desc > summary { cursor: pointer; color: var(--bronce); font-weight: 600; }
.tr-imp-lista { display: grid; gap: 1px; max-height: 60vh; overflow-y: auto; }
.tr-imp-fila {
  display: grid; grid-template-columns: 26px 1fr auto; gap: 8px; align-items: start;
  padding: 9px 8px; border-bottom: 1px solid var(--borde); border-left: 3px solid transparent;
}
.tr-imp-fila:last-child { border-bottom: none; }
.tr-imp-fila.bien { border-left-color: var(--verde); }
.tr-imp-fila.ojo  { border-left-color: var(--ambar); background: rgba(201, 138, 18, .05); }
.tr-imp-fila.mal  { border-left-color: var(--rojo); background: rgba(192, 57, 43, .05); }
.tr-imp-fila.ya   { opacity: .5; }
.tr-imp-chk { display: flex; align-items: center; height: 20px; }
.tr-imp-txt { min-width: 0; }
.tr-imp-nums { display: flex; flex-wrap: wrap; gap: 2px 12px; font-size: .71rem; color: var(--gris); margin-top: 2px; }
.tr-imp-nums b { font-variant-numeric: tabular-nums; color: var(--tinta); font-weight: 600; }
.tr-imp-der { text-align: right; white-space: nowrap; }
.tr-imp-ok {
  border-left: 3px solid var(--verde); background: rgba(46, 125, 79, .07); padding: 10px 12px;
  border-radius: 0 10px 10px 0; font-size: .82rem;
}

/* «cuánto le ha entrado a cada uno»: la pregunta que trae al dueño a esta pantalla */
.tr-persona {
  border: 1px solid var(--borde); border-radius: 10px; padding: 9px 11px; margin-bottom: 8px;
  background: var(--crema);
}
.tr-persona-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.tr-persona-det { display: flex; flex-wrap: wrap; gap: 3px 14px; margin-top: 4px; font-size: 0.76rem; color: var(--gris); }
.tr-persona-det .tr-ret { color: var(--bronce); }
/* «le retuvieron y no hay certificado»: es un papel que la plataforma tiene que volver a
   dar, así que se avisa en rojo y con la frase completa, no con un icono */
.tr-persona-falta {
  margin-top: 5px; font-size: 0.75rem; line-height: 1.35; color: var(--rojo);
  border-left: 3px solid var(--rojo); padding-left: 8px;
}

/* LOS PAPELES. El cuadre entre lo que dice el documento y lo que hay en el libro es lo
   único que convierte esto en algo más que una carpeta con PDFs. */
.tr-sop {
  display: flex; justify-content: space-between; gap: 12px; align-items: flex-start;
  padding: 9px 0; border-bottom: 1px solid var(--borde);
}
.tr-sop:last-child { border-bottom: none; }
.tr-sop-txt { min-width: 0; display: grid; gap: 1px; }
.tr-sop-der { text-align: right; white-space: nowrap; display: grid; gap: 1px; }
.tr-sop-grupo + .tr-sop-grupo { border-top: 1px solid var(--borde); }
.tr-cuadra { color: var(--verde); font-weight: 700; }
.tr-descuadre { color: var(--rojo); font-weight: 700; }
/* la pista de «hay movimientos sin plataforma» explica un descuadre que puede ser falso:
   va en renglón aparte para que no se lea como parte de la cifra */
.tr-pista { display: block; color: var(--gris); font-weight: 400; }

/* el valor por unidad con IVA, bajo el total de la fila en el detalle */
.cot-td-cu { color: var(--gris); font-weight: 400; font-size: 0.72rem; }

/* franja de fotos del ítem: TODAS las miniaturas en línea (envuelven si no caben) y al
   final el 📷 para agregar otra. Cada miniatura lleva su ✕ encima. */
.cot-it-foto { grid-area: fotos; display: flex; flex-wrap: wrap; gap: 9px; align-items: center; }
.cot-foto-mini { position: relative; width: 52px; height: 52px; flex: none; }
.cot-foto-add { width: 52px; height: 52px; flex: none; }
.cot-foto-add, .cot-foto-ver {
  padding: 0; overflow: hidden;
  display: grid; place-items: center; cursor: pointer;
  border: 1px dashed var(--borde); border-radius: 10px; background: var(--crema);
  font-size: 1.15rem; line-height: 1; color: var(--gris);
}
.cot-foto-add:hover { border-color: var(--oro); color: var(--bronce); }
.cot-foto-ver { border-style: solid; background: var(--blanco); width: 100%; height: 100%; }
.cot-foto-ver img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cot-foto-x {
  position: absolute; top: -6px; right: -6px; width: 22px; height: 22px; padding: 0;
  border: 1px solid var(--borde); border-radius: 999px; background: var(--blanco);
  color: var(--rojo); font-size: 0.68rem; line-height: 1; cursor: pointer; box-shadow: var(--sombra-sm);
}
.cot-foto-x:hover { background: var(--rojo); border-color: var(--rojo); color: var(--marfil); }

/* nota de ayuda del editor (cómo poner las fotos) */
.cot-tip { margin: -4px 0 10px; font-size: 0.78rem; color: var(--gris); line-height: 1.4; }
.cot-tip strong { color: var(--bronce); }
.cot-tip-marca { background: rgba(var(--oro-rgb), 0.22); border-radius: 4px; padding: 0 4px; color: var(--bronce); font-weight: 700; }

/* aviso flotante al pegar/soltar una foto (a dónde cayó) */
.cot-toast {
  position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%) translateY(10px);
  background: var(--bronce); color: var(--marfil); padding: 11px 16px; border-radius: 12px;
  font-weight: 700; font-size: 0.85rem; box-shadow: var(--sombra-lg); z-index: 70;
  opacity: 0; transition: opacity 0.25s ease, transform 0.25s ease;
  max-width: 90vw; text-align: center; pointer-events: none;
}
.cot-toast.ver { opacity: 1; transform: translateX(-50%) translateY(0); }

/* En pantallas MUY angostas (iPhone viejo, 320px) las medidas quedaban de 20px al
   lado de cantidad y precio: no se podía ni escribir. Ahí se van a su propio renglón. */
@media (max-width: 380px) {
  /* El ORDEN es el del DOM: medidas, cantidad, precio, % dto. Medidas se va a su renglón,
     así que en el segundo caen cantidad, PRECIO y % dto — y la pista elástica tiene que
     ser la del PRECIO, que es donde se escribe la plata. Al revés, el precio se quedaba
     en 58 px con «1.200.000» desbordado y el campo opcional se llevaba 200. */
  .cot-it-nums { grid-template-columns: 54px minmax(0, 1fr) 58px; }
  .cot-it-nums .cot-it-med { grid-column: 1 / -1; }
}

/* en pantallas anchas hay sitio para respirar: cada campo a lo suyo y miniaturas más grandes */
@media (min-width: 620px) {
  .cot-it-nums { grid-template-columns: minmax(0, 1fr) 64px 104px 74px; }
  .cot-foto-mini, .cot-foto-add { width: 62px; height: 62px; }
}

/* totales (vista previa del editor y totales del detalle): reusa .fac-totales */
.cot-totales { margin-top: 12px; margin-bottom: 0; }
.cot-totales .cot-tot-total strong { color: var(--bronce); font-size: 0.98rem; }

/* detalle: cabecera número + badge, tabla de ítems y notas */
.cot-det-cab { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
/* LA TABLA DEL DETALLE, CON LA CARA DEL PDF.
   Pedido del dueño (2026-07-28): «me gustaría que la tabla de cotización se vea más como
   en el PDF, que me parece que se ve más bonito, como se ve en forma de tabla».
   Tiene razón: el PDF se ve mejor porque es una REJILLA —banda de cabecera, rayas entre
   columnas y marco— y esto eran solo renglones sueltos.
   Los colores son LOS MISMOS del papel, sacados de armarCotizacion (cotizaciones.js), no
   parecidos: si la pantalla y el papel van a ser el mismo documento, tienen que serlo de
   verdad. Banda 244,241,233 · rótulos 94,101,90 · rayas 226,222,211 · título 38,48,31 ·
   descripción 65,65,65 · medidas 70,60,40 · números 45,45,45 · renglón chico 150,143,125. */
.cot-tabla { border: 1px solid #E2DED3; border-radius: 10px; overflow: hidden; }
.cot-tabla th, .cot-tabla td {
  padding: 8px 9px; text-align: left; font-size: 0.85rem;
  border-bottom: 1px solid #E2DED3;
  border-right: 1px solid #E2DED3;   /* las rayas verticales del papel */
}
.cot-tabla th:last-child, .cot-tabla td:last-child { border-right: 0; }
.cot-tabla tbody tr:last-child td { border-bottom: 0; }
.cot-tabla thead th {
  background: #F4F1E9; color: #5E655A;
  font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.5px; font-weight: 400;
  vertical-align: middle;
}
.cot-tabla td { vertical-align: top; color: #2D2D2D; }
.cot-tabla .num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* celda del ÍTEM: como en el papel, el título arriba y la foto GRANDE debajo — es la que
   lleva las medidas dibujadas encima, así que de estampilla no sirve */
.cot-td-desc { display: block; }
.cot-td-txt { display: block; min-width: 0; overflow-wrap: anywhere; }
.cot-td-txt > strong { color: #26301F; font-size: 0.92rem; }
.cot-td-det { display: block; color: #414141; font-size: 0.8rem; margin-top: 1px; }
.cot-td-med { display: block; margin-top: 3px; color: #463C28; font-size: 0.76rem; }
.cot-tabla .cot-td-cu { color: #968F7D; }
.cot-minis { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.cot-mini {
  flex: none; width: 96px; height: 72px; padding: 0; overflow: hidden; cursor: pointer;
  display: grid; place-items: center; font-size: 0.95rem; line-height: 1;
  border: 1px solid var(--borde); border-radius: 8px; background: var(--crema); color: var(--gris);
}
/* en el celular la tabla ya hace scroll horizontal; ahí la foto vuelve a ser miniatura
   para que la columna del ítem no se coma la pantalla */
@media (max-width: 620px) {
  .cot-mini { width: 56px; height: 44px; }
}
.cot-mini img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cot-mini:hover { border-color: var(--oro); }
.cot-notas { margin: 12px 0 0; color: var(--gris); font-size: 0.88rem; white-space: pre-wrap; overflow-wrap: anywhere; }

/* botonera del detalle (estado y acciones), en fila que envuelve en pantallas chicas */
.cot-acciones { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.cot-acciones .secundario { flex: 1 1 auto; padding: 10px 8px; font-size: 0.82rem; }
.cot-acciones .cot-peligro { color: var(--rojo); border-color: #f0cfca; }
.cot-acciones .cot-peligro:hover { background: var(--rojo); border-color: var(--rojo); color: var(--marfil); }

/* ---------- vista previa del certificado dentro del formulario ----------
   El monto retenido se teclea LEYÉNDOLO del PDF. Antes tocaba abrirlo por fuera,
   memorizar la cifra y volver; ahora el papel está a la vista mientras se escribe.
   En el celular va debajo del campo (no hay ancho para ponerlo al lado); en pantallas
   grandes el modal se parte en dos y el PDF queda a la derecha, fijo. */
.dm-vista {
  margin-top: 10px; border: 1px solid var(--borde); border-radius: 10px;
  background: var(--crema); overflow: hidden;
}
.dm-vista-barra {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 6px 8px; background: var(--blanco); border-bottom: 1px solid var(--borde);
  font-size: 0.78rem; color: var(--gris);
}
#dm-vista-tit { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-vista-btns { display: flex; gap: 4px; flex: none; }
.dm-vista-btns button { padding: 2px 9px; font-size: 0.85rem; min-width: 0; }
.dm-vista-lienzo {
  max-height: 46vh; overflow: auto; padding: 6px; text-align: center;
  /* el papel se ve como papel */
  background: repeating-conic-gradient(#f0ede6 0% 25%, #f6f4ee 0% 50%) 50% / 16px 16px;
}
.dm-vista-lienzo canvas, .dm-vista-lienzo img {
  max-width: none; box-shadow: 0 1px 6px rgba(20,20,15,.14); background: #fff;
}

@media (min-width: 900px) {
  /* El modal del documento del mes se ensancha y se parte: campos a la izquierda,
     certificado a la derecha y FIJO, para poder cotejar sin perder de vista el campo. */
  #velo-nuevo-docmes .modal-form { max-width: 980px; }
  #velo-nuevo-docmes .modal-form:has(#dm-vista:not(.oculto)) {
    display: grid; grid-template-columns: minmax(0, 380px) minmax(0, 1fr);
    gap: 0 18px; align-items: start;
  }
  #velo-nuevo-docmes .modal-form:has(#dm-vista:not(.oculto)) > .titulo-modal { grid-column: 1 / -1; }
  #velo-nuevo-docmes .modal-form:has(#dm-vista:not(.oculto)) > #dm-vista {
    grid-column: 2; grid-row: 2 / 100; margin-top: 0; position: sticky; top: 0;
    /* el papel manda en su columna y no se mueve mientras se rellenan los campos */
    align-self: start;
  }
  #velo-nuevo-docmes .modal-form:has(#dm-vista:not(.oculto)) > .botones { grid-column: 1; }
  #velo-nuevo-docmes .dm-vista-lienzo { max-height: 68vh; }
}

/* ---------- tareas que se repiten ----------
   Va plegado: se configura una vez y no se vuelve a tocar, así que no puede estorbar la
   lista del día a día, que es lo que se mira todas las mañanas. */
.td-rep > summary {
  cursor: pointer; list-style: none; padding: 2px 0;
  font-size: 0.95rem; color: var(--tinta);
}
.td-rep > summary::-webkit-details-marker { display: none; }
.td-rep > summary::before { content: "▸ "; color: var(--bronce); }
.td-rep[open] > summary::before { content: "▾ "; }
.td-rep-cuando { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.td-rep-cuando select { flex: 1 1 130px; min-width: 0; }
.td-rep-cuando button { flex: none; }
.td-rep-fila {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 0; border-top: 1px solid var(--crema);
}
.td-rep-fila:first-child { border-top: none; }
.td-rep-fila.pausada { opacity: 0.55; }
.td-rep-txt { flex: 1; min-width: 0; }
.td-rep-txt strong { display: block; font-size: 0.92rem; }
.td-rep-txt .saldo-nota { display: block; margin-top: 1px; }
.td-rep-btns { display: flex; gap: 5px; flex: none; }
.td-rep-btns button { padding: 4px 9px; min-width: 0; }

/* la conexión con Mercado Libre, en la ficha de cada cuenta */
.tr-ml-ok { color: var(--verde); }
.tr-ml-enlace {
  margin-top: 8px; border-left: 3px solid var(--oro); background: var(--crema);
  padding: 10px 12px; border-radius: 0 10px 10px 0;
}
.tr-ml-enlace strong { display: block; font-size: .82rem; margin-bottom: 6px; }
.tr-ml-enlace input {
  width: 100%; font: inherit; font-size: .72rem; padding: 7px 9px;
  border: 1px solid var(--borde); border-radius: 8px; background: var(--blanco);
}
.tr-ml-enlace .nota { margin-top: 6px; }
/* El resultado de preguntarle a Mercado Pago. Empieza en gris —«todavía no sabemos»— y
   solo se pone verde si de verdad contestó: un diagnóstico que se ve bien pase lo que pase
   no sirve para decidir nada. */
.tr-mp-prueba {
  grid-column: 1 / -1; margin-top: 8px; padding: 10px 12px;
  border-left: 3px solid var(--borde); background: var(--crema); border-radius: 0 10px 10px 0;
}
.tr-mp-prueba.sirve { border-left-color: var(--verde); }
.tr-mp-prueba strong { display: block; font-size: .82rem; line-height: 1.45; margin-bottom: 8px; }
.tr-mp-prueba ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.tr-mp-prueba li {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  font-size: .76rem; padding-left: 14px; position: relative;
}
.tr-mp-prueba li::before {
  position: absolute; left: 0; top: 0; font-weight: 700;
}
.tr-mp-prueba li.si::before { content: '✓'; color: var(--verde); }
.tr-mp-prueba li.no::before { content: '✕'; color: var(--rojo); }
/* el mensaje de error de Mercado Pago es lo más útil de la prueba y puede ser largo:
   que se acomode entero, no que se salga de la caja */
.tr-mp-prueba li small { color: var(--gris); text-align: right; min-width: 0; overflow-wrap: anywhere; }

/* LOS DOS AÑOS DEL TOPE DEL IVA, siempre a la vista. La ley mira el año anterior Y el en
   curso: esconder el anterior dejaría tranquilo a alguien que ya se pasó. */
.tr-iva-anios {
  display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px;
  font-size: 0.74rem; font-variant-numeric: tabular-nums;
}
.tr-iva-anios span {
  padding: 3px 8px; border-radius: 999px;
  background: var(--crema); border: 1px solid var(--borde); color: var(--gris);
}
.tr-iva-anios span.pasado { background: rgba(192, 57, 43, 0.10); border-color: var(--rojo); color: var(--rojo); font-weight: 700; }
/* «no se pudo mirar» no es «va bien»: se ve distinto de los dos */
.tr-iva-anios span.nose { border-style: dashed; font-style: italic; }
/* una barra apagada tiene que verse apagada, no verde */
.tr-tope.apagado { opacity: 0.75; border-left-color: var(--borde); }
.tr-mp-prueba li.no small { color: var(--rojo); }

/* ---------- ANOTACIONES («faltas») ----------
   El dueño lo dijo: «para hablar, no para castigar». Por eso este bloque NO tiene rojo,
   ni semáforo, ni contador de alarma: la tarjeta de una anotación tiene que verse como
   una nota que alguien dejó, no como una multa. El único color fuerte que aparece es el
   verde de «ya hablamos», que es el final feliz. */
.fa-marcador { display: flex; gap: 22px; margin-top: 14px; }
.fa-marcador div { display: flex; flex-direction: column; }
.fa-marcador strong { font-size: 1.5rem; font-variant-numeric: tabular-nums; color: var(--tinta); line-height: 1.1; }
.fa-marcador span { font-size: 0.78rem; color: var(--gris); }

.fa-lbl { display: block; font-size: 0.8rem; font-weight: 700; color: var(--gris); margin: 12px 0 4px; }
.fa-tipos { display: flex; flex-wrap: wrap; gap: 6px; }
.fa-tipo {
  padding: 7px 12px; border-radius: 999px; font-size: 0.82rem; font-weight: 600;
  border: 1px solid var(--borde); background: var(--blanco); color: var(--gris); cursor: pointer;
}
.fa-tipo.sel { border-color: var(--oro); background: rgba(var(--oro-rgb), 0.12); color: var(--tinta); }

/* la anotación misma: una nota con un filo dorado, no una tarjeta de alerta */
.fa-item { border-left: 3px solid var(--oro); }
.fa-item.fa-hablado { border-left-color: var(--verde); opacity: 0.82; }
.fa-top { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.fa-chip { background: rgba(var(--oro-rgb), 0.16); color: var(--bronce); }
.fa-quien { font-weight: 700; color: var(--tinta); }
.fa-fecha { font-size: 0.82rem; color: var(--gris); }
.fa-que { margin: 10px 0 0; color: var(--tinta); line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
.fa-anoto { margin: 8px 0 0; font-size: 0.78rem; color: var(--gris); }

/* la versión de la persona va DENTRO de la misma tarjeta y con el mismo peso visual que
   lo que se anotó: si se viera como un pie de página, se leería como un descargo */
.fa-respuesta {
  margin-top: 12px; padding: 10px 12px; border-radius: 10px;
  background: var(--crema); border: 1px solid var(--borde);
}
.fa-respuesta strong { display: block; font-size: 0.78rem; color: var(--gris); margin-bottom: 4px; }
.fa-respuesta p { margin: 0; color: var(--tinta); line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
.fa-mi-version { margin-top: 12px; }
.fa-mi-version .fa-lbl { margin-top: 0; }
.fa-mi-version textarea { width: 100%; margin-bottom: 8px; }

.fa-acciones { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.fa-acciones button { flex: none; font-size: 0.82rem; }
.fa-borrar { color: var(--rojo); }
.mini-ancho { margin-top: 10px; font-size: 0.82rem; }

.fa-vacio { text-align: center; padding: 32px 18px; }
.fa-vacio span { font-size: 2rem; display: block; margin-bottom: 8px; }
.fa-vacio p { margin: 0; color: var(--gris); }
/* la anotación del propio supervisor entre las de los demás: se marca para que no se le
   pierda en la lista, sin volverla una alarma */
.fa-item.fa-propia { border-left-color: var(--teal); background: rgba(22, 120, 108, 0.04); }

/* ---------- CÓMO SE HACE AQUÍ: el árbol de procesos y la biblioteca ----------
   La caja de buscar va arriba de todo y se ve como lo más importante de la pantalla: él
   dijo «por la pregunta que traes, como un buscador de cosas», y si la caja parece un
   filtro más nadie la usa como puerta principal. */
.pr-buscar { padding: 18px; }
.pr-buscar-lbl {
  display: block; font-size: 0.78rem; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; color: var(--oro); margin-bottom: 8px;
}
input.pr-q {
  width: 100%; font-size: 1.05rem; padding: 13px 15px; margin-bottom: 0;
  border: 1.5px solid var(--borde); border-radius: 12px;
}
input.pr-q:focus { border-color: var(--oro); outline: none; }

.pr-res { margin-top: 12px; display: grid; gap: 6px; }
.pr-hit {
  display: grid; grid-template-columns: 24px 1fr; gap: 10px; text-align: left;
  border: 1px solid var(--borde); border-radius: 10px; padding: 10px 12px;
  background: var(--blanco); cursor: pointer; width: 100%;
}
.pr-hit:hover { border-color: var(--oro); }
.pr-hit.pr-flojo { opacity: .72; }
.pr-hit-tipo { font-size: 1rem; line-height: 1.4; }
.pr-hit-cuerpo { min-width: 0; }
.pr-hit-tit { display: block; font-weight: 700; color: var(--tinta); }
.pr-hit-donde { display: block; font-size: .76rem; color: var(--gris); }
.pr-hit-pista {
  display: block; font-size: .82rem; color: var(--gris); margin-top: 4px;
  overflow-wrap: anywhere;
}
.pr-nada, .pr-aviso { font-size: .88rem; color: var(--gris); margin: 4px 0; }
.pr-aviso-viejo { background: rgba(201,138,18,.10); border-radius: 8px; padding: 8px 10px; }

/* el árbol: carpetas que se abren, no una lista plana */
.pr-area { padding: 0; overflow: hidden; }
.pr-area-cab {
  display: grid; grid-template-columns: 30px 1fr auto 18px; gap: 10px; align-items: center;
  width: 100%; text-align: left; background: none; border: none; padding: 16px 18px; cursor: pointer;
}
.pr-area-ico { font-size: 1.2rem; }
.pr-area-nom { font-weight: 700; color: var(--tinta); }
.pr-area-n { font-size: .76rem; color: var(--gris); white-space: nowrap; }
.pr-area-flecha { color: var(--oro); font-size: .9rem; }
.pr-area-cuerpo { border-top: 1px solid var(--borde); padding: 8px 10px 12px; }
.pr-area-vacia { font-size: .86rem; color: var(--gris); padding: 10px 8px; }
.pr-area-pie { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 8px 0; }
.pr-area-pie button, .pr-area-vacia button { font-size: .8rem; }

.pr-fila {
  display: block; width: 100%; text-align: left; background: none; border: none;
  border-radius: 8px; padding: 10px 10px; cursor: pointer;
}
.pr-fila:hover { background: var(--crema); }
.pr-fila-tit { display: block; font-weight: 600; color: var(--tinta); }
.pr-fila-sub { display: block; font-size: .82rem; color: var(--gris); margin-top: 2px; }
.pr-fila-meta { display: block; font-size: .74rem; color: var(--gris); margin-top: 3px; }
/* «hace año y medio que nadie confirma que siga siendo así». Ámbar y no rojo: no está mal,
   solo lleva mucho sin mirarse. */
.pr-viejo { color: var(--ambar); font-size: 1.3rem; line-height: 0; margin-left: 6px; }

.pr-detalle .pr-cerrar { margin-bottom: 12px; }
.pr-migas { font-size: .78rem; color: var(--gris); margin: 0 0 2px; }
.pr-cuerpo { margin-top: 12px; line-height: 1.65; color: var(--tinta); overflow-wrap: anywhere; }
.pr-sub { margin-top: 20px; font-size: .95rem; }
.pr-firma { margin-top: 16px; font-size: .76rem; color: var(--gris); }
.pr-acciones { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 14px; }
.pr-acciones button { font-size: .82rem; }
.pr-borrar { color: var(--rojo); }

.pr-fotos { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.pr-foto {
  position: relative; border: 1px solid var(--borde); border-radius: 10px; overflow: hidden;
  background: var(--blanco); padding: 0; cursor: pointer; width: 150px;
}
.pr-foto img { display: block; width: 100%; height: 110px; object-fit: cover; }
.pr-foto span { display: block; font-size: .74rem; color: var(--gris); padding: 5px 7px; }
.pr-foto-x {
  position: absolute; top: 4px; right: 4px; width: 22px; height: 22px; padding: 0;
  border-radius: 50%; background: rgba(20,20,15,.6); color: #fff; font-size: .7rem;
  display: grid; place-items: center;
}

.pr-lbl { display: block; font-size: .8rem; font-weight: 700; color: var(--gris); margin: 14px 0 4px; }
.pr-lbl .nota { font-weight: 400; }
.pr-tipos { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 4px; }

/* la biblioteca: notas y links en la MISMA lista, distintos a la vista pero juntos */
.pr-refs { display: grid; gap: 10px; }
.pr-ref { padding: 14px 16px; }
.pr-ref-nota { border-left: 3px solid var(--oro); }
.pr-ref-link { border-left: 3px solid var(--teal); }
.pr-ref-top { display: grid; grid-template-columns: 22px 1fr; gap: 10px; align-items: baseline; }
.pr-ref-ico { font-size: 1rem; }
.pr-ref-tit { font-weight: 700; color: var(--tinta); }
.pr-ref-cuerpo { margin-top: 8px; color: var(--gris); line-height: 1.55; overflow-wrap: anywhere; }
.pr-ref-falta { margin-top: 8px; font-size: .84rem; color: var(--ambar); font-style: italic; }
.pr-ref-url { margin-top: 6px; font-size: .76rem; color: var(--gris); overflow-wrap: anywhere; }
.pr-ref-donde { margin-top: 8px; font-size: .76rem; color: var(--teal); }
.pr-ref-acciones { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.pr-ref-acciones button { font-size: .8rem; }
.pr-resaltada { box-shadow: 0 0 0 3px var(--oro); }

.pr-huecos { list-style: none; margin-top: 12px; display: grid; gap: 6px; }
.pr-huecos li {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  border: 1px solid var(--borde); border-radius: 8px; padding: 8px 10px;
}
.pr-hueco-q { font-weight: 600; color: var(--tinta); flex: 1 1 140px; }
.pr-hueco-n { font-size: .76rem; color: var(--gris); font-variant-numeric: tabular-nums; }
.pr-huecos button { font-size: .78rem; }

.pr-vacio { text-align: center; padding: 32px 18px; }
.pr-vacio span { font-size: 2rem; display: block; margin-bottom: 8px; }
.pr-vacio p { margin: 0; color: var(--gris); }
/* una miniatura que no se pudo bajar se ve APAGADA, no como un hueco: si sale igual que un
   espacio en blanco, nadie sabe que ahí había una foto */
.pr-foto.pr-foto-rota { opacity: .5; }
.pr-foto.pr-foto-rota img { min-height: 60px; background: var(--crema); }

/* ---------- CERTIFICADOS DE RETENCIÓN, LEÍDOS DEL PDF ----------
   Se sueltan los dos del mes y la app propone. Lo que NO pudo leer se marca en ámbar: un
   campo que la app rellenó mal y nadie miró es peor que uno vacío. */
.tr-cert-fila {
  display: grid; gap: 2px; padding: 9px 11px; margin-top: 6px;
  border: 1px solid var(--borde); border-radius: 10px; background: var(--crema);
}
.tr-cert-fila label { display: flex; align-items: center; gap: 7px; cursor: pointer; }
.tr-cert-fila .nota { font-size: .78rem; color: var(--gris); }
.tr-cert-fila.incompleta { border-color: var(--ambar); background: rgba(201, 138, 18, .07); }
.tr-cert-fila.mala { border-color: var(--rojo); background: rgba(192, 57, 43, .06); }
.tr-cert-falta { color: var(--ambar); font-weight: 600; }
/* lo que la app leyó del PDF, dicho donde él está mirando: al lado del archivo elegido */
.tr-s-leido {
  margin-top: 8px; padding: 9px 12px; border-radius: 10px; font-size: .86rem;
  background: rgba(46, 125, 79, .08); border: 1px solid var(--verde); color: var(--tinta);
}
.tr-s-leido .nota { color: var(--gris); font-size: .78rem; }

/* ---------- TODO RAÍCES: la barra de arriba y los botones de acción ----------
   El dueño (2026-07-31): «aquí me gustaría ver el botón de perfiles, y todos esos tipos de
   botones no me gustan, parece una plataforma vieja».
   Tenía razón por una causa concreta: los «Editar» y «Quitar» salen con class="link", y esa
   clase NO estaba definida fuera de una sección — eran botones CRUDOS del sistema
   operativo, con su borde gris y sus esquinas cuadradas, en medio de una app que no se
   parece a eso en ningún otro sitio. */
.tr-barra {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin-bottom: 4px;
}
.tr-barra .volver-inicio { margin: 0; }

/* el atajo a los perfiles, arriba a la derecha: donde él lo fue a buscar */
.tr-chip-perfiles {
  border: 1px solid var(--oro); background: rgba(var(--oro-rgb), 0.10);
  color: var(--bronce); font-weight: 700; font-size: 0.8rem;
  padding: 7px 14px; border-radius: 999px; cursor: pointer; white-space: nowrap;
  transition: background 0.15s ease, box-shadow 0.15s ease;
}
.tr-chip-perfiles:hover { background: rgba(var(--oro-rgb), 0.2); box-shadow: var(--sombra-sm); }
.tr-chip-perfiles:active { transform: translateY(1px); }

/* volver: un enlace, no una caja. Un «‹ El tablero» dentro de un rectángulo con borde es
   justo lo que hace que una pantalla parezca de hace quince años. */
button.tr-atras {
  background: none; border: none; padding: 6px 2px; cursor: pointer;
  color: var(--gris); font-weight: 700; font-size: 0.86rem;
}
button.tr-atras:hover { color: var(--bronce); }

/* LA ACCIÓN DE UNA FILA. Un BOTÓN, no un enlace: la primera versión los dejó como
   hipervínculos y él lo dijo de una — «quiero verlos como botones». Tiene razón: si algo
   se puede tocar, tiene que verse tocable. Lo que sobraba de los de antes no era el borde,
   era la CARA: rectángulo gris de sistema operativo. Este es del mismo idioma que el chip
   de arriba y el de Configurar — píldora, borde suave, color de la casa. */
button.link {
  background: var(--blanco);
  border: 1px solid var(--borde);
  border-radius: 999px;
  padding: 6px 14px;
  margin: 0;
  font: inherit; font-size: 0.78rem; font-weight: 700;
  color: var(--bronce);
  cursor: pointer;
  box-shadow: var(--sombra-sm);
  transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
}
button.link:hover { border-color: var(--oro); background: rgba(var(--oro-rgb), 0.10); }
button.link:active { transform: translateY(1px); }
button.link:focus-visible { outline: 2px solid var(--oro); outline-offset: 2px; }
/* «Quitar» se ve igual de tocable, pero NO grita: es la acción rara de la fila, no la
   principal. El rojo aparece cuando ya está a punto de tocarlo. */
button.link.peligro { color: var(--gris); }
button.link.peligro:hover { border-color: var(--rojo); background: rgba(192, 57, 43, 0.08); color: var(--rojo); }
/* en la comparación de cuadre, el «Sí/No» elegido se marca lleno en vez de subrayado */
.preg-comparar button.link.sel { background: rgba(var(--oro-rgb), 0.18); border-color: var(--oro); text-decoration: none; }
/* «sin separar» NO es un faltante: la plata está, lo que falta es partirla en fuente e ICA.
   Va en ámbar y no en rojo — el rojo es para lo que de verdad no cuadra. */
.tr-rj-fila .rj.tot.pendiente { border-top-color: var(--ambar); color: var(--ambar); }

/* ---------- catálogo de productos (maestro de SKUs) ----------
   El código manda: es lo primero que se lee en cada fila y va en monoespaciada, porque un
   SKU se compara carácter por carácter y una tipografía de texto hace que 0 y O se
   parezcan. Todo lo demás de la fila es contexto para saber que es EL producto correcto:
   la descripción en palabras, el nombre con el que se publica y dónde está publicado. */
.cat-cabecera { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.cat-acciones { display: flex; gap: 8px; flex-wrap: wrap; }
.cat-nota { color: var(--gris); font-size: 0.86rem; margin: 6px 0 14px; max-width: 62ch; }
.cat-resumen { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.cat-chip {
  display: inline-block; padding: 5px 12px; border-radius: 999px;
  background: rgba(var(--oro-rgb), 0.12); border: 1px solid var(--borde);
  font-size: 0.78rem; color: var(--bronce);
}
.cat-chip strong { font-variant-numeric: tabular-nums; }
/* ámbar y no rojo: «a medias» o «sin publicar» no es un error, es trabajo pendiente */
.cat-chip-ojo { background: rgba(201, 138, 18, 0.14); border-color: rgba(201, 138, 18, 0.4); color: #8a6d1e; }
.cat-aviso {
  background: #e9f2ea; border: 1px solid #cfe2d2; color: var(--verde-oscuro);
  border-radius: 10px; padding: 10px 14px; font-size: 0.88rem; margin-bottom: 12px;
}
.cat-filtros { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.cat-filtros input, .cat-filtros select {
  padding: 9px 12px; border: 1px solid var(--borde); border-radius: 10px;
  background: var(--blanco); color: var(--tinta); font-size: 0.9rem;
}
/* el buscador manda y crece; los tres desplegables van a su lado y solo bajan de línea
   cuando de verdad no caben. Sin la base, cada uno se llevaba un renglón entero. */
.cat-filtros input { flex: 1 1 260px; min-width: 200px; }
.cat-filtros select { flex: 0 1 170px; min-width: 130px; }
.cat-vacio { color: var(--gris); font-size: 0.9rem; padding: 18px 2px; }

.cat-lista { display: flex; flex-direction: column; gap: 8px; }
.cat-fila {
  display: grid; grid-template-columns: minmax(190px, auto) 1fr auto;
  gap: 14px; align-items: center;
  background: var(--blanco); border: 1px solid var(--borde); border-radius: 12px;
  padding: 10px 14px; box-shadow: var(--sombra-sm);
}
.cat-fila-ojo { border-left: 3px solid var(--ambar); }
.cat-col-cod { display: flex; flex-direction: column; gap: 3px; align-items: flex-start; }
.cat-cod {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 0.86rem; font-weight: 700; color: var(--bronce); letter-spacing: 0.2px;
}
.cat-set, .cat-estado {
  font-size: 0.68rem; font-weight: 800; letter-spacing: 0.3px; text-transform: uppercase;
  padding: 2px 7px; border-radius: 999px; background: rgba(var(--oro-rgb), 0.16); color: var(--bronce);
}
.cat-estado { background: rgba(201, 138, 18, 0.18); color: #8a6d1e; }
.cat-col-desc { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.cat-desc { font-size: 0.92rem; color: var(--tinta); }
.cat-ml { font-size: 0.78rem; color: var(--gris); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-pubs { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 2px; }
.cat-pub {
  font-size: 0.72rem; padding: 2px 8px; border-radius: 999px;
  background: var(--crema); border: 1px solid var(--borde); color: var(--gris);
}
.cat-pub em { font-style: normal; color: var(--bronce); font-weight: 700; }
.cat-pub-falta { background: transparent; border-style: dashed; }
.cat-col-fin { display: flex; align-items: center; gap: 12px; }
.cat-precio { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--tinta); font-size: 0.9rem; }

/* el formulario y el importador van más anchos que un modal normal: son tablas, no preguntas */
.modal-ancho { max-width: 720px; width: min(92vw, 720px); max-height: 88vh; overflow-y: auto; }
/* EL CÓDIGO EN VIVO. Es el corazón de la pantalla: mientras se eligen los ejes, el código
   se va armando solo. Que se vea grande y arriba es lo que enseña, sin explicarlo, que el
   código es una consecuencia de lo que el producto ES y no una casilla que se llena. */
.cat-codigo-vivo {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 1.15rem; font-weight: 800; letter-spacing: 0.5px;
  color: var(--borde); background: var(--crema); border: 1px dashed var(--borde);
  border-radius: 10px; padding: 12px 14px; text-align: center; margin-bottom: 14px;
  overflow-wrap: anywhere;
}
.cat-codigo-listo { color: var(--bronce); border-style: solid; border-color: var(--oro); background: rgba(var(--oro-rgb), 0.10); }
.cat-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-bottom: 12px; }
.cat-form-grid label, .cat-ancho { display: flex; flex-direction: column; gap: 4px; font-size: 0.8rem; color: var(--gris); font-weight: 700; }
.cat-ancho { margin-bottom: 12px; }
.cat-form-grid input, .cat-form-grid select, .cat-ancho input {
  padding: 9px 11px; border: 1px solid var(--borde); border-radius: 9px;
  background: var(--blanco); color: var(--tinta); font-size: 0.92rem; font-weight: 400;
}
.cat-canales { border-top: 1px solid var(--borde); padding-top: 12px; margin-bottom: 12px; }
.cat-canales h4 { font-size: 0.9rem; color: var(--bronce); margin-bottom: 4px; }
.cat-canal-fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 6px 0; border-bottom: 1px solid var(--borde); font-size: 0.84rem; }
.cat-canal-fila code { font-family: ui-monospace, Menlo, Consolas, monospace; color: var(--bronce); font-weight: 700; }
.cat-canal-fila em { font-style: normal; color: var(--gris); }
.cat-cuenta { color: var(--gris); font-size: 0.78rem; }
.cat-canal-nuevo { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; }
.cat-canal-nuevo input, .cat-canal-nuevo select {
  padding: 8px 10px; border: 1px solid var(--borde); border-radius: 9px; font-size: 0.85rem;
  background: var(--blanco); color: var(--tinta); flex: 1 1 130px; min-width: 0;
}
.cat-imp-resumen { display: flex; gap: 8px; flex-wrap: wrap; margin: 12px 0; }
.cat-imp-lista { display: flex; gap: 6px; flex-wrap: wrap; max-height: 160px; overflow-y: auto; }
.cat-imp-lista code {
  font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.74rem;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 6px; padding: 2px 6px; color: var(--bronce);
}
.cat-imp-pend { margin: 6px 0 0 18px; font-size: 0.82rem; color: #8a6d1e; max-height: 160px; overflow-y: auto; }
#cat-velo-imp textarea {
  width: 100%; padding: 10px; border: 1px solid var(--borde); border-radius: 10px;
  font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.78rem;
  background: var(--blanco); color: var(--tinta); resize: vertical;
}
/* En un celular la fila de tres columnas no cabe: se apila y el código sigue arriba. */
@media (max-width: 640px) {
  .cat-fila { grid-template-columns: 1fr; gap: 6px; }
  .cat-col-fin { justify-content: space-between; }
}

/* colores dentro del Catálogo, y los avisos de la importación */
.cat-col-lista { display: flex; flex-direction: column; gap: 6px; max-height: 320px; overflow-y: auto; margin-bottom: 12px; }
.cat-col-fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.cat-col-nom { flex: 1 1 130px; font-size: 0.88rem; color: var(--tinta); font-weight: 600; }
.cat-col-cod-in, .cat-col-ml, .cat-col-nuevo input {
  padding: 7px 10px; border: 1px solid var(--borde); border-radius: 9px;
  background: var(--blanco); color: var(--tinta); font-size: 0.85rem; min-width: 0;
}
.cat-col-cod-in { flex: 0 1 110px; font-family: ui-monospace, Menlo, Consolas, monospace; font-weight: 700; text-transform: uppercase; }
.cat-col-ml { flex: 1 1 130px; }
.cat-col-nuevo { display: flex; gap: 6px; flex-wrap: wrap; border-top: 1px solid var(--borde); padding-top: 10px; }
.cat-col-nuevo input { flex: 1 1 120px; }
/* «no entendí estas columnas» es un aviso, no un error: el resto sí se va a cargar */
.cat-aviso-ojo {
  background: rgba(201, 138, 18, 0.12); border: 1px solid rgba(201, 138, 18, 0.4); color: #8a6d1e;
  border-radius: 9px; padding: 8px 12px; font-size: 0.84rem; margin: 8px 0;
}
/* la vista previa de la importación: código, precio, publicación y código de barras, para
   poder ver ANTES de confirmar que el precio no se leyó mil veces más barato */
.cat-imp-tabla { display: flex; flex-direction: column; gap: 3px; max-height: 220px; overflow-y: auto; margin: 8px 0; }
.cat-imp-fila {
  display: grid; grid-template-columns: minmax(150px, 1.4fr) 90px 1fr 1fr; gap: 8px; align-items: center;
  font-size: 0.76rem; color: var(--gris); padding: 3px 0; border-bottom: 1px solid var(--borde);
}
.cat-imp-fila code { font-family: ui-monospace, Menlo, Consolas, monospace; color: var(--bronce); font-weight: 700; }
.cat-imp-fila span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-imp-fila em { font-style: normal; opacity: 0.6; }
@media (max-width: 640px) { .cat-imp-fila { grid-template-columns: 1fr auto; } }

/* ---------- catálogo: la tabla de tres niveles ----------
   Sección → producto → variantes de color. Él lo pidió así: «tendríamos que crear la sección
   de mesas auxiliares… entonces sería mesa auxiliar circular pequeña 30 cm y sus variantes de
   color». Tabla y no tarjetas porque un catálogo se COMPARA: se recorre una columna hacia
   abajo buscando el hueco. Las cinco columnas son las mismas en los dos niveles, para que el
   ojo no tenga que reacomodarse al abrir un producto. */
.cat-seccion { margin-bottom: 22px; }
.cat-sec-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 6px; }
.cat-sec-nom { font-size: 1rem; font-weight: 800; color: var(--bronce); letter-spacing: 0.3px; }
.cat-sec-n { font-size: 0.76rem; color: var(--gris); }
.cat-tabla { background: var(--blanco); border: 1px solid var(--borde); border-radius: 12px; overflow: hidden; box-shadow: var(--sombra-sm); }
.cat-th, .cat-tr {
  display: grid;
  grid-template-columns: minmax(200px, 2.2fr) minmax(120px, 1.4fr) 110px minmax(110px, 1.2fr) 74px;
  gap: 10px; align-items: center; padding: 8px 14px;
}
.cat-th {
  background: var(--crema); border-bottom: 1px solid var(--borde);
  font-size: 0.68rem; font-weight: 800; letter-spacing: 0.4px; text-transform: uppercase; color: var(--gris);
}
.cat-tr { border-bottom: 1px solid var(--borde); font-size: 0.86rem; }
.cat-tr:last-child { border-bottom: none; }
.cat-tr-prod { cursor: pointer; }
.cat-tr-prod:hover { background: rgba(var(--oro-rgb), 0.06); }
.cat-tr-prod.abierto { background: rgba(var(--oro-rgb), 0.10); font-weight: 600; }
.cat-tr-ojo { box-shadow: inset 3px 0 0 var(--ambar); }
/* el chevron no se puede quedar solo en un renglón: se fija y el NOMBRE es el que envuelve */
.cat-chevron { flex: none; width: 14px; color: var(--gris); font-size: 0.8rem; }
.cat-td-txt { min-width: 0; }
/* el nombre y sus etiquetas en una caja aparte: el chevron y la miniatura se quedan fijos a
   la izquierda y lo que envuelve es el texto, no ellos */
.cat-td-txtwrap { flex: 1 1 0; min-width: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.cat-td-nom { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; color: var(--tinta); min-width: 0; }
.cat-td-col { display: flex; gap: 4px; flex-wrap: wrap; min-width: 0; }
.cat-td-num { text-align: right; font-variant-numeric: tabular-nums; color: var(--tinta); }
.cat-td-pub { display: flex; gap: 4px; flex-wrap: wrap; font-size: 0.78rem; color: var(--gris); min-width: 0; }
.cat-td-fin { text-align: right; white-space: nowrap; }
/* el botón de la etiqueta va antes de «Abrir»: es un gesto de todos los días —se empaca
   una mesa, se imprime su etiqueta— y no merece estar escondido dentro del formulario */
.cat-eti-b {
  background: none; border: 0; cursor: pointer; padding: 0 6px 0 0;
  font-size: 0.95rem; line-height: 1; opacity: 0.55;
}
.cat-eti-b:hover, .cat-eti-b:focus-visible { opacity: 1; }

/* --- el modal de la etiqueta --- */
.cat-eti-previa {
  display: flex; justify-content: center; padding: 14px;
  background: var(--crema); border: 1px solid var(--borde); border-radius: 8px;
  margin: 10px 0;
}
/* el lienzo se dibuja a 10 px por milímetro y se muestra al doble de sus milímetros:
   se ve grande en pantalla sin perder nitidez */
.cat-eti-previa canvas {
  width: 100mm; max-width: 100%; height: auto;
  background: #fff; border-radius: 3px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
}
.cat-eti-nota { font-size: 0.78rem; color: var(--gris); margin: 4px 0; }
.cat-eti-ops { display: flex; gap: 16px; align-items: flex-end; flex-wrap: wrap; margin-top: 10px; }
.cat-eti-ops label { display: flex; flex-direction: column; gap: 4px; font-size: 0.82rem; color: var(--gris); }
.cat-eti-ops input[type="number"] { width: 90px; }
.cat-eti-check { flex-direction: row !important; align-items: center; gap: 6px !important; }
.cat-th span:nth-child(3), .cat-th span:nth-child(5) { text-align: right; }
.cat-td-num em, .cat-td-pub em { font-style: normal; opacity: 0.5; }
/* el nombre del color como pastilla: de un vistazo se ve en cuántos colores está cada uno */
.cat-punto {
  font-size: 0.72rem; padding: 2px 8px; border-radius: 999px;
  background: var(--crema); border: 1px solid var(--borde); color: var(--gris); white-space: nowrap;
}
/* la fila de una variante va sangrada y en fondo suave: se lee como «dentro de» */
.cat-tr-var { background: var(--crema); font-size: 0.82rem; }
.cat-tr-var .cat-td-nom { padding-left: 22px; }
.cat-var-color { font-weight: 700; color: var(--bronce); }
.cat-gtin { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.72rem; color: var(--gris); }
.cat-nota-var { font-size: 0.72rem; color: #8a6d1e; flex-basis: 100%; }
/* En el celular la rejilla de cinco no cabe: cada fila se apila y el nombre manda. */
@media (max-width: 760px) {
  .cat-th { display: none; }
  .cat-tr { grid-template-columns: 1fr auto; gap: 4px 10px; padding: 10px 12px; }
  .cat-td-col { grid-column: 1 / -1; }
  .cat-td-pub { grid-column: 1 / -1; }
  .cat-tr-var .cat-td-nom { padding-left: 12px; }
}

/* ---------- catálogo: fotos ----------
   Van en la VARIANTE, no en el producto: lo que cambia entre variantes es el color, que es
   justo lo que se ve. La fila del producto muestra la primera que encuentre entre sus
   colores, y dice cuántos se quedaron sin foto — que es lo que él va a querer cerrar.
   El fondo se pone por JS con un blob: la imagen está protegida y un <img src> daría 401. */
.cat-mini {
  flex: none; width: 34px; height: 34px; border-radius: 8px;
  background: var(--crema) center/cover no-repeat;
  border: 1px solid var(--borde);
  display: grid; place-items: center; font-size: 0.8rem;
}
.cat-mini.con-foto { border-color: rgba(var(--oro-rgb), 0.5); }
.cat-mini-falta { opacity: 0.35; }
.cat-sinfoto {
  font-size: 0.68rem; font-weight: 700; padding: 2px 7px; border-radius: 999px;
  background: rgba(201, 138, 18, 0.14); color: #8a6d1e; white-space: nowrap;
}
.cat-tr-var .cat-mini { width: 28px; height: 28px; }
.cat-fotos { border-top: 1px solid var(--borde); padding-top: 12px; margin-bottom: 12px; }
.cat-fotos h4 { font-size: 0.9rem; color: var(--bronce); margin-bottom: 2px; }
.cat-fotos-tira { display: flex; gap: 10px; flex-wrap: wrap; margin: 10px 0; }
.cat-foto-item { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.cat-foto-grande {
  width: 92px; height: 92px; border-radius: 10px;
  background: var(--crema) center/cover no-repeat;
  border: 1px solid var(--borde);
}
.cat-foto-grande.con-foto { border-color: rgba(var(--oro-rgb), 0.5); }

/* ---------- catálogo: la tabla ancha ----------
   Él la pidió más ancha, y con razón: con tipo, medidas, peso, código de barras y UNA
   COLUMNA POR MARKETPLACE son diez columnas, y en los 640 px del resto de la app no caben.
   Se ensancha solo esta vista, con el mismo truco que ya usan Facturas y Cartera. */
@media (min-width: 900px) {
  main:has(#vista-catalogo:not(.oculto)) { max-width: min(1560px, 96vw); }
}
/* Las columnas se calculan en JS porque su número depende de en cuántos marketplaces haya
   algo publicado; por eso van en el atributo style de cada fila. La regla de abajo solo
   pone el resto. */
.cat-th, .cat-tr { grid-template-columns: unset; }
.cat-td-chip {
  font-size: 0.7rem; font-weight: 700; padding: 2px 8px; border-radius: 999px;
  background: var(--crema); border: 1px solid var(--borde); color: var(--gris);
  justify-self: start; white-space: nowrap;
}
.cat-td-dato { font-variant-numeric: tabular-nums; color: var(--gris); font-size: 0.8rem; white-space: nowrap; }
.cat-td-cb { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.74rem; color: var(--gris); }
.cat-td-mk { font-size: 0.78rem; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-mk-n { color: var(--gris); }
/* el enlace se ve como enlace: si lleva a otra página, tiene que parecerlo */
.cat-mk-link { color: var(--bronce); font-weight: 700; text-decoration: none; border-bottom: 1px solid rgba(var(--oro-rgb), 0.5); }
.cat-mk-link:hover { color: var(--oro); border-bottom-color: var(--oro); }
.cat-td-chip em, .cat-td-dato em, .cat-td-cb em, .cat-td-mk em { font-style: normal; opacity: 0.45; }
/* En el celular la rejilla de diez no existe: se apila. El !important es necesario porque
   el número de columnas se pone en el atributo style de cada fila, y un atributo le gana a
   cualquier clase. */
@media (max-width: 760px) {
  .cat-th, .cat-tr { grid-template-columns: 1fr auto !important; }
  .cat-td-chip, .cat-td-dato, .cat-td-cb, .cat-td-mk { grid-column: 1 / -1; }
}

/* la columna del SKU. Va en monoespaciada porque un código se compara carácter por carácter
   y en una tipografía de texto el 0 y la O se parecen. En el producto es el PATRÓN
   («AUX-…-CIRCULAR-30») y por eso va más apagado: no es un código que se pueda copiar. */
.cat-td-sku { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cat-td-sku .cat-cod { user-select: all; }   /* un doble clic selecciona el código entero */
.cat-td-sku-patron {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 0.76rem; color: var(--gris); letter-spacing: 0.2px;
}
@media (max-width: 760px) { .cat-td-sku { grid-column: 1 / -1; } }

/* Si aun así no cabe (monitor pequeño, muchos marketplaces), que se deslice LA TABLA y nunca
   la página: una página que se mueve de lado esconde la barra lateral y el encabezado, y
   quien la ve cree que la app se rompió. Regla de la casa para todo lo ancho. */
.cat-tabla { overflow-x: auto; }
.cat-th, .cat-tr { gap: 8px; }

/* La medida de la MESA se lee más que la de la caja: es lo que pregunta un cliente. La del
   paquete queda en gris, que es para quien despacha. Son dos columnas porque son dos cosas —
   tenerlas juntas fue lo que hizo que «Medidas» enseñara el paquete. */
.cat-td-mesa { color: var(--tinta); font-weight: 600; }

/* el código del catálogo en la tarjeta del pedido: monoespaciado y discreto, pero presente —
   es lo que quien empaca compara contra la etiqueta de la caja */
.ped-sku {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 0.74rem; font-weight: 700; color: var(--bronce);
  background: rgba(var(--oro-rgb), 0.12); border-radius: 6px; padding: 1px 6px;
}

/* ── BODEGA ─────────────────────────────────────────────────────────────────────── */
/* La cuarta pestaña ya no cabe en un celular angosto: la barra se desliza DENTRO de sí
   misma en vez de empujar la página de lado. Medido: con «Movimientos» a 319 px la página
   entera se iba 53 px a la derecha. */
.bod-tabs {
  display: flex; gap: 6px; margin: 10px 0 14px; border-bottom: 1px solid var(--borde);
  overflow-x: auto; scrollbar-width: none;
}
.bod-tabs::-webkit-scrollbar { display: none; }
.bod-tab {
  background: none; border: 0; border-bottom: 2px solid transparent; cursor: pointer;
  padding: 8px 12px; font-size: 0.92rem; color: var(--gris);
  flex: 0 0 auto; white-space: nowrap;
}
.bod-tab.activa { color: var(--tinta); border-bottom-color: var(--tinta); font-weight: 600; }
.bod-nota { font-size: 0.84rem; color: var(--gris); margin: 0 0 12px; line-height: 1.5; }
.bod-nota-ojo {
  background: var(--crema); border-left: 3px solid var(--borde);
  padding: 10px 12px; border-radius: 0 6px 6px 0;
}
.bod-h3 { margin: 26px 0 6px; font-size: 1rem; }
.bod-lista { display: flex; flex-direction: column; gap: 6px; }
.bod-fila {
  display: grid; grid-template-columns: 1fr auto auto; gap: 12px; align-items: center;
  padding: 10px 12px; background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 8px;
}
/* En rojo el color al que ya no le queda nada por encima del colchón: es el que va a
   dejar de vender, y hay que verlo sin buscarlo. */
.bod-fila-baja { border-color: #e3b7b7; background: #fdf6f6; }
/* LOS CORTES. Lo que se lee de un vistazo es la canasta: qué saca este archivo. */
.bod-cortes { display: flex; flex-direction: column; gap: 10px; }
.bod-corte { padding: 12px; background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 8px; }
/* uno sin configurar no se esconde: se marca, porque no aparece en la lista del taller */
.bod-corte-falta { border-style: dashed; background: var(--crema); }
.bod-corte-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.bod-corte-cab strong { font-size: 0.95rem; }
.bod-corte-come { font-size: 0.78rem; color: var(--gris); flex: 0 0 auto; }
.bod-canasta { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.bod-canasta li { font-size: 0.86rem; }
.bod-canasta b { display: inline-block; min-width: 26px; font-variant-numeric: tabular-nums; color: var(--bronce); }
.bod-canasta-falta { color: var(--rojo); text-decoration: line-through; }
.bod-corte-vacio { margin: 8px 0 0; color: var(--rojo); }
.bod-h4 { margin: 18px 0 6px; font-size: 0.9rem; }
.bc-fila { display: grid; grid-template-columns: 1fr 78px auto; gap: 6px; align-items: center; margin-bottom: 6px; }
.bc-fila select, .bc-fila input { margin: 0; }

/* LAS CUATRO ETAPAS DE UNA SUPERFICIE. Las cifras suman SIEMPRE el total de arriba: no son
   cuatro montones, es un montón visto por dentro. La barrita está para leer de un golpe
   dónde se está atascando el trabajo, que es la pregunta que hoy no se puede responder. */
.bod-sups { display: flex; flex-direction: column; gap: 10px; }
.bod-sup { padding: 12px; background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 8px; }
.bod-sup-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.bod-sup-cab strong { min-width: 0; font-size: 0.92rem; }
.bod-sup-tot { flex: 0 0 auto; text-align: right; font-variant-numeric: tabular-nums; }
.bod-sup-tot b { font-size: 1.15rem; }
.bod-sup-tot small { display: block; font-size: 0.68rem; color: var(--gris); }
.bod-pilas { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin-top: 10px; }
.bod-pila { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.bod-pila-n { font-size: 1.05rem; font-weight: 600; font-variant-numeric: tabular-nums; line-height: 1; }
.bod-pila-nom { font-size: 0.68rem; color: var(--gris); line-height: 1.2; }
.bod-pila-barra { display: block; height: 4px; border-radius: 2px; background: var(--borde); overflow: hidden; }
.bod-pila-barra i { display: block; height: 100%; background: var(--bronce); }
.bod-pila-cero .bod-pila-n { color: var(--gris); font-weight: 400; }
/* un montón en rojo es que se reportó más avance del que había. NO se convierte en un cero
   limpio: se ve, porque es una señal de que alguien no anotó su corte. */
.bod-pila-roja .bod-pila-n { color: var(--rojo); }
.bod-pila-roja .bod-pila-barra i { background: var(--rojo); }
.bod-sup-acc { display: flex; gap: 12px; margin-top: 10px; }
@media (max-width: 420px) {
  .bod-pilas { grid-template-columns: repeat(2, 1fr); gap: 10px 8px; }
}

/* LA BITÁCORA. El número va a la izquierda y grande porque es lo que se viene a leer:
   +20, −1, y el conteo aparte porque ése no suma, fija. */
.bod-movs { display: flex; flex-direction: column; }
.bod-mov {
  display: grid; grid-template-columns: 62px 1fr auto; gap: 12px; align-items: center;
  padding: 9px 2px; border-bottom: 1px dashed var(--borde);
}
.bod-mov:last-child { border-bottom: none; }
.bod-mov-n { text-align: right; font-variant-numeric: tabular-nums; line-height: 1.15; }
.bod-mov-n b { font-size: 1.05rem; }
.bod-mov-n small { display: block; font-size: 0.66rem; color: var(--gris); }
.bod-mov-sube b { color: var(--verde-oscuro); }
.bod-mov-baja b { color: var(--rojo); }
/* un conteo físico no es una suma: es la línea base. Se marca para no leerlo como «entraron
   396», que es exactamente el error que le cuesta un inventario a cualquiera. */
.bod-mov-fija { background: var(--crema); }
.bod-mov-fija .bod-mov-n b { color: var(--bronce); }
.bod-mov-que { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
.bod-mov-que small { font-size: 0.76rem; color: var(--gris); line-height: 1.35; }
.bod-mov-cuando {
  font-size: 0.76rem; color: var(--gris); text-align: right; flex: 0 0 auto;
  font-variant-numeric: tabular-nums; line-height: 1.3;
}
.bod-mov-cuando small { display: block; font-size: 0.7rem; }
.bod-color { display: flex; align-items: center; gap: 10px; min-width: 0; }
.bod-color small { display: block; font-size: 0.74rem; color: var(--gris); }
.bod-swatch { width: 20px; height: 20px; border-radius: 5px; border: 1px solid var(--borde); flex: 0 0 auto; }
.bod-swatch-nulo { background: repeating-linear-gradient(45deg, #eee, #eee 3px, #fafafa 3px, #fafafa 6px); }
.bod-cant { text-align: right; font-variant-numeric: tabular-nums; }
.bod-cant b { font-size: 1.15rem; display: block; line-height: 1.1; }
.bod-cant small { font-size: 0.7rem; color: var(--gris); }
.bod-acc { min-width: 56px; text-align: right; }

.bod-prods { display: flex; flex-direction: column; gap: 10px; }
.bod-prod { border: 1px solid var(--borde); border-radius: 8px; background: var(--tarjeta); overflow: hidden; }
.bod-prod-cab {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  padding: 10px 12px; background: var(--crema); flex-wrap: wrap;
}
.bod-rend { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; color: var(--gris); }
.bod-rend input { width: 70px; text-align: center; }
.bod-vars { display: flex; flex-direction: column; }
.bod-var {
  display: grid; grid-template-columns: 1.1fr auto 1.4fr auto; gap: 10px; align-items: center;
  padding: 8px 12px; border-top: 1px solid var(--borde); font-size: 0.86rem;
}
.bod-var-hechas { color: var(--gris); font-size: 0.8rem; font-variant-numeric: tabular-nums; }
.bod-var-pub { text-align: right; font-variant-numeric: tabular-nums; }
.bod-var-pub small { color: var(--gris); font-size: 0.74rem; }
.bod-var-pub em, .bod-var-hechas em { font-style: normal; opacity: 0.5; }
@media (max-width: 620px) {
  .bod-var { grid-template-columns: 1fr auto; row-gap: 4px; }
  .bod-var-pub { grid-column: 1 / -1; text-align: left; }
}
/* La bodega es una tabla de mirar, no un formulario: en el monitor se ensancha. */
@media (min-width: 900px) {
  main:has(#vista-bodega:not(.oculto)) { max-width: 1000px; }
}

/* --- Bodega: las piezas genéricas y las recetas --- */
.bod-agregar { display: flex; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.bod-agregar input { flex: 1 1 140px; min-width: 0; }
.bod-receta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bod-chip {
  font-size: 0.72rem; padding: 2px 8px; border-radius: 999px;
  background: var(--tarjeta); border: 1px solid var(--borde); color: var(--gris); white-space: nowrap;
}
/* Lo que falta se ve como falta: un dato ausente que parece un dato es lo que hace que
   un inventario mienta sin que nadie se dé cuenta. */
.bod-chip-falta { border-color: #e3b7b7; background: #fdf6f6; color: #a05252; }
.bod-freno { color: #a05252; font-weight: 600; }
.bod-h4 { margin: 16px 0 6px; font-size: 0.9rem; }
/* EL INTERRUPTOR DE UN CORTE. Va separado del resto del formulario por una línea: no es un
   campo más, es apagar algo que el taller está usando. */
.bod-chk {
  display: grid; grid-template-columns: auto 1fr; gap: 4px 9px; align-items: center;
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--borde);
  font-size: 0.92rem; color: var(--tinta); cursor: pointer;
}
.bod-chk input { width: 20px; height: 20px; margin: 0; accent-color: var(--bronce); }
.bod-chk small {
  grid-column: 2; font-size: 0.79rem; color: var(--gris); line-height: 1.45; font-weight: 400;
}
.bod-recpiezas { display: flex; flex-direction: column; gap: 6px; }
.bod-recpieza {
  display: flex !important; flex-direction: row !important; align-items: center;
  justify-content: space-between; gap: 10px; margin: 0;
}
.bod-recpieza input { width: 80px; text-align: center; }
.bod-acc { display: flex; gap: 8px; justify-content: flex-end; align-items: center; }

/* --- Bodega: la lámina va por color Y formato ---
   OJO CON EL NOMBRE: .bod-color ya existía y es la CELDA del color dentro de una fila
   (display:flex). Yo llamé igual al recuadro que agrupa un color, y como la regla vieja
   no se anulaba, el recuadro quedó siendo una fila horizontal: los tres formatos salían
   uno al lado del otro y en el celular el tercero se salía de la pantalla. Se llama
   .bod-grupo, que además dice mejor lo que es. */
.bod-grupo { border: 1px solid var(--borde); border-radius: 10px; overflow: hidden; background: var(--tarjeta); }
.bod-grupos { display: flex; flex-direction: column; gap: 10px; }
.bod-grupo-cab {
  display: flex; align-items: center; gap: 8px; padding: 9px 12px;
  background: var(--crema); border-bottom: 1px solid var(--borde); font-size: 0.92rem;
}
.bod-grupo-cab strong { min-width: 0; overflow-wrap: anywhere; }
/* Los formatos: apilados en el celular, uno al lado del otro cuando hay ancho. La
   etiqueta va SIEMPRE pegada al número — en el celular no había forma de saber cuál
   columna era cuál, que fue justo lo que él reportó. */
.bod-fmts { display: grid; grid-template-columns: 1fr; }
.bod-fmt {
  display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center;
  padding: 9px 12px; border-top: 1px solid var(--borde);
}
.bod-fmt:first-child { border-top: 0; }
.bod-fmt-nom { min-width: 0; }
.bod-fmt-nom strong { display: block; font-size: 0.88rem; font-weight: 600; }
.bod-fmt-nom small { display: block; font-size: 0.72rem; color: var(--gris); }
.bod-fmt-n { text-align: right; font-variant-numeric: tabular-nums; }
.bod-fmt-n b { font-size: 1.2rem; display: block; line-height: 1.05; }
.bod-fmt-n small { font-size: 0.68rem; color: var(--gris); }
.bod-fmt-cero b { color: var(--gris); font-weight: 400; }
.bod-fmt-baja { background: #fdf6f6; }
/* Un color del que no hay NADA se resume en un renglón: nueve colores en cero son
   ruido, y el que sí tiene material hay que verlo sin buscarlo. */
.bod-grupo-vacio .bod-grupo-cab { border-bottom: 0; }
.bod-grupo-vacio { opacity: 0.6; }
.bod-grupo-vacio:hover, .bod-grupo-vacio:focus-within { opacity: 1; }
.bod-vacio-acc { margin-left: auto; display: flex; gap: 6px; }
@media (min-width: 620px) {
  .bod-fmts { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
  .bod-fmt { border-top: 0; border-left: 1px solid var(--borde); }
  .bod-fmt:first-child { border-left: 0; }
}
.bod-recpieza small { display: block; font-weight: 400; color: var(--gris); font-size: 0.72rem; }
.bod-check { flex-direction: row !important; align-items: flex-start; gap: 8px !important; }
.bod-check input { margin-top: 3px; flex: 0 0 auto; }
.bod-check small { display: block; color: var(--gris); font-size: 0.75rem; margin-top: 2px; }

/* La bodega también se ensancha en pantalla grande: con 640 px los tres formatos se
   parten en 2+1 y quedan cojos. Mismo truco que Catálogo, Facturas y Cartera. */
@media (min-width: 900px) {
  main:has(#vista-bodega:not(.oculto)) { max-width: min(1100px, 94vw); }
}

/* La textura del color: se reconoce de un vistazo, que es lo que un color plano no logra
   con «Mácula», «Fronda» o «Marmoro» — esos son vetas y mármoles, no colores. */
.bod-swatch.con-textura, .cat-col-tex.con-textura { background-size: cover; background-position: center; }
.cat-col-tex {
  width: 26px; height: 26px; border-radius: 6px; border: 1px solid var(--borde);
  flex: 0 0 auto; background: var(--crema);
}
.cat-col-tex-falta { background: repeating-linear-gradient(45deg, #eee, #eee 3px, #fafafa 3px, #fafafa 6px); }
.bod-h3-primero { margin-top: 4px; }
/* La cuenta de lo que se va a descontar, dicha ANTES de confirmar. */
.bod-pista { background: var(--crema); border-radius: 6px; padding: 8px 10px; margin: 8px 0 0; }

/* --- La cabecera de una vista: «← Inicio | TÍTULO» ---------------------------------
   Estaba escrita en Bodega y en Productividad y NO EXISTÍA en la hoja de estilos. Sin
   regla, un div es display:block: los tres pedazos se apilaban uno debajo del otro y el
   título salía con la h2 por defecto del navegador —24 px, sin versalita, sin la regla
   dorada— justo la que el resto de la app no usa en ninguna parte. */
.cabecera-vista { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.cabecera-vista h2 {
  margin-right: auto; font-size: 0.82rem; letter-spacing: 1.5px;
  text-transform: uppercase; font-weight: 700; color: var(--bronce);
}
.cabecera-vista h2::before {
  content: ""; display: inline-block; width: 14px; height: 2px; background: var(--oro);
  vertical-align: middle; margin-right: 8px; margin-bottom: 3px;
}

/* --- Productividad: la puerta del taller -------------------------------------------
   Esto se opera DE PIE, al lado de la Router, con una mano y a veces con guantes. De ahí
   sale todo lo de abajo:
     · la pregunta abierta es lo único grande — lo ya contestado se encoge a su respuesta
     · el número manda sobre la palabra: cuántas salen, cuántas quedan
     · una lámina se reconoce por la veta, no por el nombre: «Mácula» no es un color
     · lo que va a pasar con el material se dice ANTES del botón

   OJO CON EL PREFIJO: `.pr-` lo comparten esta pantalla y el Árbol de procesos, y ya
   chocaban en `.pr-aviso` (de allá se colaba el color del texto). Los nombres nuevos de
   aquí están comprobados contra los de allá. */

/* LA HOJA. El flujo vivía suelto sobre el papel, sin la ficha blanca del resto de la
   app; por eso se veía a medio terminar. */
.pr-hoja {
  background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 16px;
  box-shadow: var(--sombra-md); padding: 15px 14px 17px; margin-bottom: 16px;
}
.pr-h3 { margin: 22px 0 8px; font-size: 0.78rem; letter-spacing: 1.4px;
  text-transform: uppercase; color: var(--bronce); font-weight: 700; }
.pr-h4 { margin: 16px 0 6px; font-size: 0.86rem; color: var(--gris); font-weight: 600; }
.pr-nota { font-size: 0.84rem; color: var(--gris); margin: 6px 0; line-height: 1.5; }
.pr-aviso {
  font-size: 0.84rem; background: #fdf6f6; border-left: 3px solid #e3b7b7;
  color: var(--tinta);   /* explícito: sin esto hereda el gris de `.pr-nada, .pr-aviso` */
  padding: 10px 12px; border-radius: 0 6px 6px 0; margin: 10px 0; line-height: 1.5;
}

/* LA PREGUNTA ABIERTA. Antes el enunciado era gris de 13,7 px y las respuestas tinta de
   15,2: la pregunta se leía MÁS CHICA que las opciones. */
.pr-preg { font-size: 1.02rem; font-weight: 700; color: var(--tinta); margin: 0 0 9px; line-height: 1.3; }

/* LO YA CONTESTADO, encogido a su respuesta y todavía tocable. Medido antes: con el corte
   elegido la pantalla media 961 px en un celular de 812 — el botón de Empezar nacía
   siempre fuera del pliegue, debajo de tres filas de opciones que ya nadie iba a volver a
   mirar. */
.pr-pasos { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-bottom: 13px; }
.pr-paso {
  border: 1px solid var(--borde); background: var(--crema); color: var(--bronce);
  font-size: 0.75rem; font-weight: 700; letter-spacing: 0.2px;
  padding: 5px 11px; border-radius: 999px; cursor: pointer; line-height: 1.3;
}
.pr-paso:hover, .pr-paso:focus-visible { border-color: var(--oro); color: var(--tinta); }
.pr-paso-sep { color: var(--oro); font-size: 0.7rem; line-height: 1; }

/* Los botones grandes: un menú desplegable de 8 opciones no se opera con guantes. */
.pr-ops { display: flex; gap: 8px; flex-wrap: wrap; }
.pr-op {
  flex: 1 1 130px; min-height: 56px; padding: 10px 14px; cursor: pointer;
  background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 11px;
  font-size: 0.95rem; color: var(--tinta); text-align: center;
  transition: border-color 0.14s ease, background 0.14s ease;
}
.pr-op:hover { border-color: var(--oro); }
.pr-op small {
  display: block; font-size: 0.62rem; letter-spacing: 0.6px; text-transform: uppercase;
  color: var(--gris); margin-top: 3px;
}
.pr-op-sel { border-color: var(--oro); background: var(--crema); font-weight: 700; box-shadow: inset 0 0 0 1px var(--oro); }

/* EL CORTE: una ficha, no un botón centrado. Lo que distingue un corte de otro son dos
   datos —qué lámina come y cuántas piezas saca— y estaban en gris de 0,68 rem debajo del
   nombre, centrados. El número se va a la derecha, grande, que es como se reconoce: «ese
   es el de nueve piezas». */
.pr-corte {
  display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 12px;
  width: 100%; text-align: left; padding: 11px 13px; min-height: 62px; cursor: pointer;
  background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 11px;
  font: inherit; color: var(--tinta);   /* un <button> no hereda ni el cuerpo ni el color */
  transition: border-color 0.14s ease, background 0.14s ease;
}
.pr-corte + .pr-corte { margin-top: 7px; }
.pr-corte:hover { border-color: var(--oro); }
.pr-corte-sel { border-color: var(--oro); background: var(--crema); box-shadow: inset 3px 0 0 var(--oro); }
.pr-corte-nom { display: block; font-size: 0.95rem; font-weight: 600; color: var(--tinta); line-height: 1.3; }
.pr-corte-fmt { display: block; font-size: 0.74rem; color: var(--gris); margin-top: 3px; }
.pr-corte-rinde { text-align: center; flex: 0 0 auto; }
.pr-corte-n { display: block; font-size: 1.45rem; font-weight: 700; color: var(--tinta); font-variant-numeric: tabular-nums; line-height: 1; }
.pr-corte-und { display: block; font-size: 0.6rem; letter-spacing: 0.8px; text-transform: uppercase; color: var(--gris); margin-top: 3px; }

/* LO QUE SACA, como lista de cantidades. Era una frase corrida en gris de 13,4 px que
   ocupaba tres renglones: el dato más valioso de la pantalla en el estilo menos legible. */
.pr-saca { background: var(--crema); border-radius: 10px; padding: 11px 13px; margin: 10px 0; }
.pr-saca-tit { font-size: 0.66rem; letter-spacing: 1.1px; text-transform: uppercase; color: var(--bronce); font-weight: 700; }
.pr-saca-fila { display: grid; grid-template-columns: 2.4ch 1fr; gap: 10px; align-items: baseline; margin-top: 7px; }
.pr-saca-n { font-size: 1.02rem; font-weight: 700; color: var(--tinta); font-variant-numeric: tabular-nums; text-align: right; }
.pr-saca-nom { font-size: 0.86rem; color: var(--tinta); line-height: 1.35; }

/* LA LÁMINA: la veta, no un desplegable. Era el único elemento blanco puro y a todo lo
   ancho de la pantalla —lo más ruidoso— y escondía detrás de un toque tanto los colores
   como las existencias, en el momento más caro del flujo: cuál tablero se va a partir. */
.pr-lam { display: grid; grid-template-columns: repeat(auto-fill, minmax(97px, 1fr)); gap: 8px; }
.pr-lam-b {
  padding: 0 0 8px; cursor: pointer; overflow: hidden; text-align: center;
  background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 11px;
  font: inherit; color: var(--tinta);
  transition: border-color 0.14s ease;
}
.pr-lam-b:hover { border-color: var(--oro); }
.pr-lam-sel { border-color: var(--oro); background: var(--crema); box-shadow: inset 0 0 0 2px var(--oro); }
.pr-lam-tex { display: block; height: 44px; background: var(--crema); background-size: cover; background-position: center; }
.pr-lam-tex-falta { background: repeating-linear-gradient(45deg, #eee, #eee 3px, #fafafa 3px, #fafafa 6px); }
.pr-lam-nom { display: block; font-size: 0.75rem; font-weight: 600; color: var(--tinta); margin: 7px 6px 0; line-height: 1.25; }
.pr-lam-n { display: block; font-size: 0.68rem; color: var(--gris); margin-top: 2px; font-variant-numeric: tabular-nums; }
.pr-lam-cero .pr-lam-tex { opacity: 0.45; }
.pr-lam-cero .pr-lam-nom { color: var(--gris); }
.pr-lam-cero .pr-lam-n { color: var(--ambar); font-weight: 700; }

/* EL TRATO, dicho antes del botón: entra un tablero y salen tantas. Es la misma regla del
   resto de la app —se dice qué va a pasar con el material mientras todavía se puede
   corregir— pero aquí, además, es lo único que dibuja la pantalla completa. */
.pr-trato {
  display: flex; align-items: center; justify-content: center; gap: 11px; flex-wrap: wrap;
  background: var(--crema); border-radius: 11px; padding: 12px 13px; margin: 14px 0 0;
}
.pr-trato-lado { display: flex; align-items: center; gap: 8px; }
.pr-trato-tex { width: 26px; height: 26px; border-radius: 6px; border: 1px solid var(--borde); flex: 0 0 auto; background-size: cover; background-position: center; }
.pr-trato-n { font-size: 1.4rem; font-weight: 700; color: var(--tinta); font-variant-numeric: tabular-nums; }
.pr-trato-q { font-size: 0.8rem; color: var(--gris); line-height: 1.3; }
.pr-trato-flecha {
  color: var(--oro); font-size: 1.35rem; font-weight: 700; line-height: 1;
  animation: pr-flecha 1.9s ease-in-out infinite;
}

/* --- Las marcas: el cuaderno de tiempos ---------------------------------------------
   «saber cuál es mi mejor tiempo, mi promedio, el promedio del último mes, el de las otras
   personas y el mejor de alguien del equipo». Se compara SIEMPRE contra la misma tarea y
   por unidad, nunca el total: lijar 20 tapas y lijar 40 no se comparan por el reloj. */
.pr-marca {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px;
  background: var(--crema); border-radius: 9px; padding: 8px 11px; margin: 10px 0 0;
  font-size: 0.8rem; color: var(--gris);
}
.pr-marca b { color: var(--tinta); font-variant-numeric: tabular-nums; }
.pr-marca-tuya { color: var(--bronce); font-weight: 700; }

.mk-lista { display: flex; flex-direction: column; gap: 9px; }
.mk {
  background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 12px;
  padding: 13px 14px; box-shadow: var(--sombra-sm);
}
.mk-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.mk-nom { font-size: 0.94rem; font-weight: 600; color: var(--tinta); line-height: 1.3; }
.mk-veces { font-size: 0.72rem; color: var(--gris); white-space: nowrap; font-variant-numeric: tabular-nums; }
.mk-mejor { display: flex; align-items: baseline; gap: 8px; margin: 9px 0 3px; }
.mk-mejor-n {
  font-size: 1.9rem; font-weight: 700; color: var(--tinta);
  font-variant-numeric: tabular-nums; line-height: 1; letter-spacing: -0.5px;
}
.mk-mejor-et { font-size: 0.68rem; letter-spacing: 1.2px; text-transform: uppercase; color: var(--bronce); font-weight: 700; }
.mk-unidad { font-size: 0.74rem; color: var(--gris); }
.mk-rejilla {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px 12px;
  margin-top: 11px; padding-top: 11px; border-top: 1px dashed var(--borde);
}
.mk-k { display: block; font-size: 0.68rem; letter-spacing: 0.5px; text-transform: uppercase; color: var(--gris); }
.mk-v { display: block; font-size: 0.92rem; font-weight: 600; color: var(--tinta); font-variant-numeric: tabular-nums; margin-top: 1px; }
.mk-v small { display: block; font-size: 0.7rem; font-weight: 400; color: var(--gris); }
/* con una o dos corridas no hay promedio que valga: se dice, no se disimula */
.mk-flojo { font-style: italic; color: var(--gris); font-weight: 400; }
.mk-suyo { color: var(--bronce); }

/* EL RÉCORD. Aquí sí va el brillo entero: es lo único de esta pantalla que merece que algo
   se mueva por celebrar y no por informar. */
.pr-fanfarria {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 12px;
  border: 1px solid var(--oro); border-radius: 13px; padding: 13px 15px; margin-bottom: 14px;
  background: linear-gradient(135deg, rgba(var(--oro-rgb), 0.16), rgba(var(--oro-rgb), 0.05));
  box-shadow: var(--sombra-md);
  animation: pr-fanfarria 0.45s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.pr-fanfarria::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(100deg, transparent 40%, rgba(255, 252, 240, 0.75) 50%, transparent 60%);
  background-size: 220% 100%; background-repeat: no-repeat;
  animation: pr-brillo 1.5s ease-out 0.25s 2;
}
.pr-fan-ico { font-size: 1.7rem; line-height: 1; flex: 0 0 auto; }
.pr-fan-txt { min-width: 0; line-height: 1.4; }
.pr-fan-txt strong { display: block; font-size: 1.02rem; color: var(--bronce); }
.pr-fan-txt small { display: block; font-size: 0.79rem; color: var(--gris); margin-top: 2px; }

/* --- Los brillos ------------------------------------------------------------------
   «me gustaría que agregáramos un poco más de brillos, animaciones» (dueño, 2026-08-11).
   Con una regla encima: esto se mira de pie al lado de una máquina, así que el movimiento
   va donde PASA algo —una respuesta que aparece, el reloj que arranca, un récord que se
   bate— y nunca en algo que solo está ahí. Todo muere solo con `prefers-reduced-motion`,
   que ya está apagando animaciones en toda la app desde antes. */
@keyframes pr-entrar { from { opacity: 0; transform: translateY(9px); } to { opacity: 1; transform: none; } }
@keyframes pr-brillo { from { background-position: -60% 0; } to { background-position: 170% 0; } }
/* el latido de lo que está corriendo: un anillo que se abre y se apaga, como el piloto de
   una máquina encendida */
@keyframes pr-late {
  0%, 100% { box-shadow: var(--sombra-lg), 0 0 0 0 rgba(var(--oro-rgb), 0.34); }
  55%      { box-shadow: var(--sombra-lg), 0 0 0 12px rgba(var(--oro-rgb), 0); }
}
@keyframes pr-flecha { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(5px); } }
@keyframes pr-fanfarria { from { opacity: 0; transform: translateY(-10px) scale(0.97); } to { opacity: 1; transform: none; } }

/* LO QUE APARECE, APARECE. Cada respuesta nueva entra con un escalón de 45 ms: se lee el
   orden de la lista sin que nadie tenga que esperarla — a los 300 ms ya está todo quieto. */
.pr-preg, .pr-saca, .pr-trato, .pr-lam, .pr-campo, .pr-op, .pr-corte, .pr-marca {
  animation: pr-entrar 0.26s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.pr-ops .pr-op:nth-child(2), .pr-corte:nth-of-type(2), .pr-lam-b:nth-child(2) { animation-delay: 0.045s; }
.pr-ops .pr-op:nth-child(3), .pr-corte:nth-of-type(3), .pr-lam-b:nth-child(3) { animation-delay: 0.09s; }
.pr-ops .pr-op:nth-child(4), .pr-corte:nth-of-type(4), .pr-lam-b:nth-child(4) { animation-delay: 0.135s; }
.pr-ops .pr-op:nth-child(n+5), .pr-corte:nth-of-type(n+5), .pr-lam-b:nth-child(n+5) { animation-delay: 0.18s; }
.pr-lam-b { animation: pr-entrar 0.26s cubic-bezier(0.16, 1, 0.3, 1) both; }

/* el destello dorado que ya usa el botón principal, ahora también al pasar por una ficha */
.pr-corte, .pr-lam-b { position: relative; overflow: hidden; }
.pr-corte::after, .pr-lam-b::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: 0;
  background: linear-gradient(100deg, transparent 38%, rgba(var(--oro-rgb), 0.22) 50%, transparent 62%);
  background-size: 220% 100%; background-repeat: no-repeat;
}
.pr-corte:hover::after, .pr-lam-b:hover::after { opacity: 1; animation: pr-brillo 0.75s ease-out; }
.pr-op:active, .pr-corte:active, .pr-lam-b:active { transform: scale(0.985); }

.pr-campo { display: flex; flex-direction: column; gap: 4px; margin: 14px 0; font-size: 0.86rem; color: var(--gris); }
.pr-curso-botones { display: flex; gap: 10px; justify-content: flex-end; margin-top: 18px; align-items: center; }
.pr-curso-botones .grande { flex: 1; min-height: 54px; font-size: 1.05rem; }

/* CUANDO ALGO ESTÁ CORRIENDO, LA PANTALLA CAMBIA DE COLOR. Antes era una ficha blanca más
   entre fichas blancas, y esta es la única pregunta que se contesta de lejos: ¿está
   andando el reloj o se me olvidó abrirlo? En bronce, con el cronómetro en dorado, se
   contesta desde el otro lado del taller sin acercarse a leer. */
.pr-curso {
  border: 1px solid var(--bronce-osc); border-radius: 16px; padding: 20px 18px;
  background-image: url("marca/grano.png"), var(--bronce-grad);
  background-size: 150px 150px, cover;
  background-repeat: repeat, no-repeat;
  background-blend-mode: overlay, normal;
  box-shadow: var(--sombra-lg); color: var(--marfil); text-align: center;
  /* el piloto de la máquina encendida: late mientras el reloj corre */
  animation: pr-late 2.6s ease-in-out infinite;
}
.pr-curso-viejo { border-color: #a8563f; box-shadow: var(--sombra-lg), 0 0 0 2px rgba(168, 86, 63, 0.55); }
.pr-curso-et {
  display: block; font-size: 0.66rem; letter-spacing: 1.5px; text-transform: uppercase;
  font-weight: 700; color: rgba(250, 249, 246, 0.78);
}
.pr-curso-que { display: block; font-size: 1.1rem; font-weight: 600; margin: 8px 0 10px; overflow-wrap: anywhere; line-height: 1.35; }
.pr-curso-t {
  display: block; font-size: 2.9rem; font-weight: 700; color: var(--oro-claro);
  font-variant-numeric: tabular-nums; line-height: 1; letter-spacing: -0.5px;
}
/* dentro del bronce, el botón de terminar va en dorado: el bronce de `.principal` sobre
   bronce desaparecería */
/* TERMINAR VA EN MARFIL, NO EN EL ACENTO. Cada colaborador elige el color de su app: sobre
   el dorado de la casa el texto oscuro contrasta 6,3 a 1, pero sobre un morado claro baja a
   3,6 — por debajo del mínimo legible. El marfil da 17 a 1 con cualquier color, y encima es
   la jerarquía correcta: lo claro sobre la tarjeta oscura es lo que hay que tocar.
   El acento se reserva para el cronómetro, que es lo que se mira. */
.pr-curso .principal { background: var(--marfil); color: var(--noir); box-shadow: none; }
.pr-curso .principal:hover { background: #ffffff; }
.pr-curso button.link {
  background: transparent; border-color: rgba(250, 249, 246, 0.34); color: var(--marfil); box-shadow: none;
}
.pr-curso button.link:hover { background: rgba(250, 249, 246, 0.10); border-color: var(--marfil); }
/* cancelar sigue siendo la acción rara: no grita, pero se pone roja al ir a tocarla */
.pr-curso button.link.peligro:hover { background: rgba(255, 138, 120, 0.14); border-color: #ff8a78; color: #ffb3a7; }
.pr-curso .pr-aviso {
  background: rgba(255, 233, 214, 0.12); border-left-color: var(--oro-claro);
  color: var(--marfil); text-align: left;
}
.pr-pista { background: var(--crema); border-radius: 8px; padding: 9px 11px; }
.pr-lista { display: flex; flex-direction: column; gap: 6px; }
.pr-item {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  padding: 11px 13px; background: var(--tarjeta); border: 1px solid var(--borde); border-radius: 10px;
}
.pr-item strong { font-size: 0.92rem; font-weight: 600; line-height: 1.3; }
.pr-item small { display: block; font-size: 0.76rem; color: var(--gris); margin-top: 2px; }
/* el tiempo es el dato de la lista, no una nota al margen */
.pr-item-t { font-variant-numeric: tabular-nums; color: var(--tinta); font-weight: 700; white-space: nowrap; }
/* EL «✕» DE UN REGISTRO. Discreto a propósito: borrar un tiempo no es la acción de la
   lista, es la rara. Se despierta en rojo cuando ya se va a tocar. */
.pr-borrar {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 8px; cursor: pointer;
  border: 1px solid transparent; background: none; color: var(--gris);
  font: inherit; font-size: 0.9rem; line-height: 1;
  transition: color 0.14s ease, border-color 0.14s ease, background 0.14s ease;
}
.pr-borrar:hover, .pr-borrar:focus-visible { color: var(--rojo); border-color: var(--rojo); background: rgba(192, 57, 43, 0.07); }
.pr-ok { background: #f2f8f3 !important; border-color: #bcd9c6 !important; color: var(--verde-oscuro) !important; }

/* --- «En qué estás trabajando», debajo del reloj --- */
/* Va aquí y no en la cuadrícula porque él lo pidió arriba: «es un botón que se usará
   seguido». Y cuando hay algo en curso, lo que hace falta a un toque no es entrar a la
   sección: es terminar. */
.atajo-trabajo {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  width: 100%; cursor: pointer; text-align: center; padding: 14px 16px;
  border: 1px solid var(--borde); background: var(--tarjeta);
}
.atajo-trabajo:hover, .atajo-trabajo:focus-visible { border-color: var(--tinta); }
.at-icono { font-size: 1.4rem; line-height: 1; }
.at-et { font-size: 0.76rem; color: var(--gris); }
.at-que { font-size: 1.05rem; font-weight: 600; overflow-wrap: anywhere; }
.at-t { font-size: 1.6rem; font-variant-numeric: tabular-nums; line-height: 1.1; margin-top: 2px; }
/* con algo en curso cambia de piel: se tiene que notar sin leer */
.at-vivo { background: var(--crema); border-color: var(--tinta); }

/* En la cabecera, el celular se queda sólo con los iconos: con «Mi jornada» ya son cinco
   cosas y a 375 px no caben las palabras. */
.solo-ancho { display: none; }
@media (min-width: 560px) { .solo-ancho { display: inline; } }
/* Lo que se trajo de Alegra a la ficha del cliente: se dice, no se rellena en silencio. */
.cf-traido {
  font-size: 0.8rem; margin: 6px 0 0; padding: 8px 10px; border-radius: 6px;
  background: #f2f8f3; border: 1px solid #bcd9c6; color: var(--verde-oscuro);
}
/* El dígito de verificación del NIT: se avisa, nunca se bloquea. Una cédula no lo tiene. */
.cf-dv { font-size: 0.78rem; color: var(--gris); margin: 4px 0 0; }
.cf-dv-mal { color: #a05252; font-weight: 600; }

/* --- Las personas de contacto de una empresa --- */
/* En el celular se apilan; en pantalla ancha van en una fila. Un formulario de cuatro
   campos por persona en 375 px, en columnas, no se puede llenar. */
.cf-contactos { display: flex; flex-direction: column; gap: 10px; }
.cf-contacto {
  display: grid; grid-template-columns: 1fr auto; gap: 6px; align-items: start;
  padding: 10px; border: 1px solid var(--borde); border-radius: 8px; background: var(--crema);
}
.cf-contacto input { grid-column: 1; margin: 0; }
.cf-contacto-x {
  grid-column: 2; grid-row: 1 / span 4;
  background: none; border: 0; cursor: pointer; font-size: 1.3rem; line-height: 1;
  color: var(--gris); padding: 2px 6px; align-self: center;
}
.cf-contacto-x:hover { color: #a05252; }
@media (min-width: 620px) {
  .cf-contacto { grid-template-columns: 1.2fr 1fr 1fr 1.2fr auto; align-items: center; }
  .cf-contacto input { grid-column: auto; }
  .cf-contacto-x { grid-column: auto; grid-row: auto; }
}
/* Las personas de la empresa, en la ficha. Cada teléfono con su nombre: un número suelto
   no le sirve a nadie, hay que saber a quién se está llamando. */
.ficha-gente { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.ficha-persona {
  display: flex; flex-direction: column; gap: 1px;
  padding: 8px 10px; border: 1px solid var(--borde); border-radius: 8px;
  background: var(--crema); font-size: 0.82rem; min-width: 0;
}
.ficha-persona small { color: var(--gris); font-size: 0.72rem; }
.ficha-persona span { color: var(--tinta); overflow-wrap: anywhere; }
/* «No me la ha pagado», en la factura de venta: el monto y el número salen de ella. */
.ven-cobrar { font-size: 0.74rem; white-space: nowrap; margin-left: 8px; }
.ven-cobrar-ya { color: var(--gris); font-size: 0.72rem; white-space: nowrap; margin-left: 8px; }
/* El comprobante de un movimiento de cartera: 📎 si ya tiene, 📎+ si falta. */
.cxc-clip {
  background: none; border: 0; cursor: pointer; font-size: 0.8rem;
  padding: 0 4px; opacity: 0.45; line-height: 1;
}
.cxc-clip:hover, .cxc-clip:focus-visible { opacity: 1; }
.cxc-clip-hay { opacity: 1; }
/* Un abono derivado de un pago a proveedor no se toca desde aquí: se toca en el pago. */
.cxc-derivado { color: var(--gris); font-size: 0.8rem; padding: 0 4px; cursor: default; }

/* --- CUENTA POR COBRAR: una factura, y debajo sus pagos ---
   Antes era una lista plana en orden de fecha, donde un cargo y su abono podían quedar
   separados por media pantalla y no había forma de ver qué factura sigue abierta — que es
   lo único que uno quiere saber cuando va a llamar a cobrar.
   Y esta tarjeta la va a ver el CLIENTE, así que se lee sin saber contabilidad. */
.cxc-cabeza {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  flex-wrap: wrap; margin-bottom: 12px;
}
.cxc-resumen { font-size: 0.8rem; color: var(--gris); }
.cxc-sub { margin: 18px 0 6px; font-size: 0.82rem; color: var(--gris); font-weight: 600; }

.cxc-factura {
  border: 1px solid var(--borde); border-radius: 10px; overflow: hidden;
  margin-bottom: 8px; background: var(--tarjeta);
}
/* una factura saldada se apaga: sigue ahí para consultarla, pero no compite por la mirada */
.cxc-saldada { opacity: 0.6; }
.cxc-saldada:hover, .cxc-saldada:focus-within { opacity: 1; }
.cxc-fac-cab {
  display: grid; grid-template-columns: 1fr auto; gap: 4px 12px;
  align-items: center; padding: 10px 12px;
}
.cxc-fac-que { min-width: 0; }
.cxc-fac-que strong { display: block; overflow-wrap: anywhere; font-size: 0.92rem; }
.cxc-fac-que small { color: var(--gris); font-size: 0.74rem; }
.cxc-fac-cifras { text-align: right; font-variant-numeric: tabular-nums; }
.cxc-fac-total { font-weight: 600; }
.cxc-fac-cifras small { display: block; font-size: 0.72rem; color: var(--gris); }
/* Lo que FALTA es la cifra que importa, y por eso es la que tiene color. */
.cxc-fac-queda { font-size: 0.82rem; font-weight: 600; grid-column: 1; }
.cxc-fac-queda.falta { color: #a05252; }
.cxc-fac-queda.ok { color: var(--verde-oscuro); font-weight: 400; }
.cxc-fac-acc { display: flex; gap: 6px; align-items: center; justify-content: flex-end; }

.cxc-pagos { border-top: 1px solid var(--borde); background: var(--crema); }
.cxc-pago {
  display: flex; align-items: center; gap: 8px; padding: 7px 12px 7px 22px;
  font-size: 0.82rem; border-bottom: 1px solid var(--borde);
}
.cxc-pagos .cxc-pago:last-child { border-bottom: 0; }
.cxc-pago-info { flex: 1; min-width: 0; color: var(--gris); overflow-wrap: anywhere; }
.cxc-pago-monto { font-variant-numeric: tabular-nums; color: var(--verde-oscuro); white-space: nowrap; }
.cxc-banco { color: var(--tinta); }
.cxc-abonar { font-size: 0.76rem; white-space: nowrap; }

/* En pantalla ancha la factura cabe en UNA línea: nombre, cifras, lo que falta y los
   botones. En el celular se parte en dos, que es donde el ancho no da. */
@media (min-width: 620px) {
  .cxc-fac-cab { grid-template-columns: 1fr auto auto auto; }
  .cxc-fac-queda { grid-column: auto; text-align: right; min-width: 110px; }
}

/* --- Ideas pendientes --- */
.idea-sub { margin: 16px 0 6px; font-size: 0.8rem; color: var(--gris); font-weight: 600; }
.idea {
  display: flex; align-items: flex-start; gap: 8px; padding: 9px 10px;
  border: 1px solid var(--borde); border-radius: 8px; margin-bottom: 6px; background: var(--tarjeta);
}
/* una idea hecha se apaga pero no se va: sirve de memoria de lo que ya se resolvió */
.idea-hecha { opacity: 0.5; }
.idea-hecha .idea-txt { text-decoration: line-through; }
.idea-txt { flex: 1; min-width: 0; font-size: 0.88rem; overflow-wrap: anywhere; }
.idea-txt small { display: block; font-size: 0.72rem; color: var(--gris); text-decoration: none; }
.idea-estado { width: auto; min-width: 96px; font-size: 0.78rem; padding: 4px 6px; margin: 0; }
.idea-x {
  background: none; border: 0; cursor: pointer; color: var(--gris);
  font-size: 1rem; line-height: 1; padding: 2px 4px;
}
.idea-x:hover { color: #a05252; }

/* ── EL RUT ────────────────────────────────────────────────────────────────────
   La tarjeta se lee de arriba abajo en el orden en que importa: primero QUÉ
   SIGNIFICA para la plata (en español, no en códigos), luego de cuándo es el
   papel, y sólo si alguien quiere, lo que el RUT dice textualmente. */
.rut-dice { margin: 0 0 12px; }
.rut-dice p {
  margin: 0 0 6px; font-size: 0.95rem; line-height: 1.45; color: var(--tinta);
}
.rut-dice p:last-child { margin-bottom: 0; }

.rut-meta {
  display: flex; flex-wrap: wrap; gap: 6px 14px;
  font-size: 0.82rem; color: var(--gris); margin-bottom: 10px;
}
.rut-meta .rut-bien { color: var(--verde); font-weight: 600; }
.rut-meta .rut-ojo  { color: var(--ambar); font-weight: 600; }
.rut-meta .rut-mal  { color: var(--rojo);  font-weight: 700; }

/* subir el RUT de otra empresa es el error que de verdad duele: se ve de lejos */
.rut-alerta {
  margin: 0 0 10px; padding: 9px 11px; border-radius: 8px;
  background: rgba(192, 57, 43, 0.08); border: 1px solid rgba(192, 57, 43, 0.28);
  color: var(--rojo); font-size: 0.87rem; line-height: 1.4;
}

.rut-detalle { margin-bottom: 10px; }
.rut-detalle > summary {
  cursor: pointer; font-size: 0.85rem; color: var(--gris); padding: 4px 0;
}
.rut-resp {
  padding: 8px 0; border-bottom: 1px solid var(--borde);
}
.rut-resp:last-child { border-bottom: none; }
.rut-resp strong { display: block; font-size: 0.88rem; color: var(--tinta); }
.rut-resp small  { display: block; font-size: 0.79rem; color: var(--gris); margin-top: 2px; line-height: 1.4; }
.rut-fuente { font-style: italic; opacity: 0.85; }

/* Lo que el papel y la ficha no dicen igual. La app no lo cambia sola. */
.rut-difs {
  border: 1px solid var(--borde); border-radius: 9px;
  padding: 10px 11px; margin-bottom: 12px; background: var(--crema);
}
.rut-difs > strong { display: block; font-size: 0.86rem; margin-bottom: 8px; color: var(--tinta); }
.rut-dif {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 0; border-top: 1px solid var(--borde);
  font-size: 0.84rem; line-height: 1.4; color: var(--gris);
}
.rut-dif span { flex: 1; min-width: 0; }
/* la que QUITA una exención se pinta distinta: puede hacer que la app empiece a
   retenerle a quien se retiene solo */
.rut-dif-ojo { color: var(--tinta); }
.rut-dif-ojo span::before { content: '⚠ '; color: var(--ambar); }

.rut-acciones { display: flex; flex-wrap: wrap; gap: 8px; }
.rut-acciones button { flex: 1 1 auto; min-width: 110px; }

@media (min-width: 760px) {
  /* en el computador la tarjeta se parte en dos: el significado a la izquierda,
     el papel y sus fechas a la derecha */
  .rut-meta { gap: 6px 20px; }
}

/* «Según este RUT»: lo de arriba describe el papel. Cuando el papel y la ficha no
   coinciden, quien manda en el cálculo es la ficha, y eso se dice aquí mismo. */
.rut-segun {
  display: block; font-size: 0.72rem; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--gris); margin-bottom: 6px;
}
.rut-aviso-ficha {
  margin: 0 0 8px; font-size: 0.83rem; line-height: 1.4; color: var(--ambar);
}

/* ── PAGOS A PROVEEDORES ───────────────────────────────────────────────────────
   Antes «pagar» era un botón que marcaba la factura pagada. Aquí se registra la
   plata de verdad: cuánto salió, de dónde, y qué se le retuvo — que es lo que
   después hay que declararle a la DIAN. */
.pag-totales {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px;
  padding: 8px 0 10px; border-bottom: 1px solid var(--borde); margin-bottom: 4px;
  font-size: 0.85rem; color: var(--gris);
}
.pag-totales strong { font-size: 1.05rem; color: var(--tinta); font-variant-numeric: tabular-nums; }
/* lo retenido NO se le pagó al proveedor: es plata que Raíces le debe a la DIAN */
.pag-ret { color: var(--ambar); font-weight: 600; }
.pag-fila { cursor: pointer; }
.pag-fila:hover { background: var(--crema); }

/* qué se está pagando */
.pag-facs { margin-bottom: 12px; }
.pag-fac {
  display: flex; align-items: baseline; gap: 8px;
  padding: 7px 9px; border: 1px solid var(--borde); border-radius: 8px;
  margin-bottom: 6px; background: var(--crema);
}
.pag-fac strong { flex: 1; min-width: 0; font-size: 0.9rem; }
.pag-fac small { color: var(--gris); font-size: 0.78rem; }
.pag-fac span { font-weight: 700; font-variant-numeric: tabular-nums; }

.pag-aviso {
  margin: 6px 0 0; padding: 8px 10px; border-radius: 8px;
  background: rgba(201, 138, 18, 0.10); border: 1px solid rgba(201, 138, 18, 0.30);
  color: #8a5e08; font-size: 0.84rem; line-height: 1.4;
}

/* los tres impuestos juntos: se ven de un vistazo y se suman de cabeza */
.pag-rets { display: flex; flex-wrap: wrap; gap: 8px; }
/* cada renglón lleva debajo sus dos referencias: lo que propone la app y lo que dice la
   factura del proveedor, que es la que se puede tomar de un clic */
.pag-ret-fila { flex: 1 1 160px; display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.pag-ret-pistas { display: flex; flex-direction: column; gap: 3px; }
.pag-ret-pista { font-size: 0.75rem; color: var(--gris); line-height: 1.35; }
.pag-ret-tomar {
  font: inherit; font-size: 0.75rem; line-height: 1.35; text-align: left; cursor: pointer;
  padding: 4px 7px; border: 1px solid var(--bronce); border-radius: 6px;
  background: var(--crema); color: inherit;
}
.pag-ret-tomar:hover { background: var(--blanco); }
.pag-ret-tomar[disabled] { opacity: 0.5; cursor: default; }
.pag-ret-cuadra { color: var(--verde-oscuro); font-weight: 700; font-size: 0.78rem; }
/* lo que su factura dice pero a este proveedor NO se le retiene: se enseña, no se ofrece */
.pag-ret-veto {
  font-size: 0.75rem; line-height: 1.4; color: var(--gris);
  padding: 4px 7px; border-left: 3px solid var(--ambar); background: var(--crema); border-radius: 0 6px 6px 0;
}
.pag-ret-ojo { color: var(--rojo); font-weight: 700; font-size: 0.8rem; line-height: 1.4; }
.pag-ret-cuadre { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; }
.pag-ret-cuadre:empty { display: none; }
/* la resta escrita: de lo que se salda, cuánto se gira y cuánto se retiene */
.pag-ret-cuenta {
  font-size: 0.82rem; line-height: 1.5; margin-top: 4px; padding-top: 6px;
  border-top: 1px dashed var(--borde);
}
/* la fecha de un pago ya guardado se puede corregir */
.pag-fecha-fila { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.pag-fecha-fila > input { flex: 1 1 160px; min-width: 0; }
.pag-pista { display: block; margin-top: 3px; color: var(--gris); font-size: 0.76rem; line-height: 1.4; }
/* el aviso de que el monto no cuadra con la factura */
.pag-cuadre-monto { margin-top: 6px; }
.pag-cuadre-monto:empty { display: none; }
.pag-cuadre-monto .pag-ret-ojo { display: block; }
.pag-cuadre-monto .pag-ret-tomar { display: inline-block; margin-top: 5px; }
/* `flex: 1 1 110px` se escribió cuando esto era hijo directo de .pag-rets, que va en fila
   y donde 110px era el ANCHO base. Dentro de .pag-ret-fila, que va en columna, esos 110px
   pasaron a ser el ALTO base y estiraban la casilla. El ancho lo pone ahora la fila. */
.pag-ret-campo { display: flex; flex-direction: column; gap: 3px; }
.pag-ret-campo > span { font-size: 0.78rem; color: var(--gris); }
.pag-ret-campo > input { width: 100%; }

.pag-porque { margin-top: 8px; }
.pag-porque > summary { cursor: pointer; font-size: 0.82rem; color: var(--gris); }
.pag-porque small { display: block; margin-top: 6px; font-size: 0.79rem; color: var(--gris); line-height: 1.45; }

.pag-acciones { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.pag-acciones button { flex: 1 1 auto; min-width: 130px; }

/* «¿A qué cuenta entró?» no siempre tiene respuesta: cuando el cliente paga comprándole
   a un proveedor con su tarjeta, esa plata nunca tocó una cuenta de Raíces. En vez de
   dejar que se teclee un abono sin rastro —y que además cuente doble si luego se
   registra el pago—, el modal explica y manda a la puerta correcta. */
.mov-prov {
  margin-top: 12px; padding: 12px 13px; border-radius: 10px;
  background: var(--crema); border: 1px solid var(--borde);
}
.mov-prov p { margin: 0 0 10px; font-size: 0.9rem; line-height: 1.5; color: var(--tinta); }
.mov-prov p.saldo-nota { font-size: 0.83rem; color: var(--gris); }

/* ── ¿ESTE CLIENTE NOS RETIENE? (en la cotización) ─────────────────────────────
   Va pegada a los totales porque cambia el número que de verdad entra: sobre una
   cotización de $20.000.000 un 2,5 % son $500.000 que no llegan en el pago.
   Verlo al cotizar es distinto a descubrirlo al cobrar. */
.cot-reten {
  margin-top: 10px; padding: 12px 13px; border-radius: 10px;
  border: 1px solid var(--borde); background: var(--crema);
}
.cot-reten > strong { display: block; font-size: 0.95rem; margin-bottom: 5px; color: var(--tinta); }
.cot-reten p { margin: 0 0 8px; font-size: 0.85rem; line-height: 1.5; color: var(--gris); }
.cot-reten p:last-child { margin-bottom: 0; }

/* verde: te entra todo. ámbar: te van a descontar algo. gris: no se puede saber. */
.cot-reten-bien { border-color: rgba(46, 125, 79, 0.35); background: rgba(46, 125, 79, 0.06); }
.cot-reten-bien > strong { color: var(--verde); }
.cot-reten-ojo  { border-color: rgba(201, 138, 18, 0.38); background: rgba(201, 138, 18, 0.07); }
.cot-reten-ojo  > strong { color: #8a5e08; }
.cot-reten-gris > strong { color: var(--gris); }

.cot-reten-fila {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  padding: 8px 0; margin: 4px 0 8px; border-top: 1px solid var(--borde);
  font-size: 0.88rem; color: var(--gris);
}
.cot-reten-fila strong { font-size: 1.05rem; color: var(--tinta); font-variant-numeric: tabular-nums; }

.cot-reten-concepto { display: block; font-size: 0.8rem; color: var(--gris); }
.cot-reten-concepto select { width: 100%; margin-top: 4px; }

.cot-reten-porque { margin-top: 8px; }
.cot-reten-porque > summary { cursor: pointer; font-size: 0.8rem; color: var(--gris); }
.cot-reten-porque small { display: block; margin-top: 6px; font-size: 0.78rem; line-height: 1.45; color: var(--gris); }

/* un RUT viejo puede estar diciendo mentiras, y de él cuelga toda esta respuesta */
.cot-reten-rut { margin-top: 8px !important; font-size: 0.8rem !important; color: var(--ambar) !important; }

/* QUIÉN EMITE LA FACTURA cambia la respuesta entera, y hoy nadie lo ha dicho nunca:
   el campo de la ficha no se puede poner desde ninguna pantalla, así que toda
   cotización cae en el supuesto de que factura Raíces — y Raíces factura mezclado.
   El supuesto se dice en voz baja pero se dice, y se puede cambiar aquí mismo. */
.cot-reten-emisor { margin-top: 8px !important; font-size: 0.79rem !important; }
.cot-reten-link {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--verde); font: inherit; text-decoration: underline;
}
.cot-reten-link:hover { color: var(--verde-oscuro); }

/* ── TABLAS DE RETENCIÓN ───────────────────────────────────────────────────────
   Lo que se muestra son las reglas que la app USA para calcular, no una
   transcripción del PDF: una tarifa mal leída es plata mal retenida. El papel
   queda al lado, con los días que lleva cargado — que es la pregunta de verdad. */
.tablas-uvt {
  margin: 10px 0; padding: 9px 11px; border-radius: 8px;
  background: var(--crema); border: 1px solid var(--borde);
  font-size: 0.88rem; color: var(--tinta);
}
.tablas-uvt strong { font-variant-numeric: tabular-nums; }
.tablas-uvt small { display: block; margin-top: 3px; color: var(--gris); font-size: 0.76rem; }

#tablas-buscar { width: 100%; margin: 10px 0; }

.tablas-subir { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.tablas-subir button { flex: 1 1 auto; min-width: 190px; }

/* una tabla de hace más de un año no se venció, pero seguro ya no dice la verdad */
.tablas-viejo { color: var(--ambar) !important; font-weight: 600; }

/* Las banderas tributarias de la propia Raíces: se ven y se cambian de un toque.
   De ellas sale la tarifa que un cliente le retiene al venderle. */
.raices-bandera {
  min-width: 46px; font-weight: 700; border-radius: 999px;
  border: 1px solid var(--borde); background: var(--blanco); color: var(--gris);
}
.raices-bandera.raices-si { background: var(--verde); border-color: var(--verde); color: #fff; }

/* Los dos papeles de una ficha, uno debajo del otro. La cámara de comercio se
   separa del RUT porque son documentos distintos con vidas distintas: el RUT no
   vence, la cámara se pide reciente. */
.papel-sep {
  margin: 16px 0 8px; padding-top: 12px; border-top: 1px solid var(--borde);
}
.papel-sep strong { font-size: 0.92rem; color: var(--tinta); }

/* EL NIT DEL PROVEEDOR, con su dígito de verificación comprobado mientras se teclea.
   Es lo que engancha las facturas de compra con la ficha: un dedazo aquí deja al
   proveedor desconectado de todas sus facturas y nadie se entera — la factura
   simplemente sigue saliendo «sin ficha». Avisar después de guardar no sirve. */
.pf-nit-aviso { font-size: 0.79rem; color: var(--gris); margin: 4px 0 0; line-height: 1.4; }
.pf-nit-ok { color: var(--verde); font-weight: 600; }
.pf-nit-mal { color: var(--rojo); font-weight: 600; }

/* Los papeles elegidos ANTES de que la ficha exista: se suben al guardar. */
.pf-papeles { display: flex; flex-wrap: wrap; gap: 8px; }
.pf-papeles button { flex: 1 1 auto; min-width: 150px; }
.pf-papeles-listos {
  margin: 8px 0 0; padding: 8px 10px; border-radius: 8px; background: var(--crema);
  font-size: 0.82rem; color: var(--tinta); line-height: 1.5;
}
/* lo que el RUT contestó al leerlo: el NIT ya quedó puesto sin teclearlo */
.pf-papeles-leido {
  margin: 8px 0 0; padding: 9px 11px; border-radius: 8px;
  background: rgba(46, 125, 79, 0.07); border: 1px solid rgba(46, 125, 79, 0.28);
  font-size: 0.83rem; line-height: 1.5; color: var(--tinta);
}
.pf-papeles-leido small { display: block; margin-top: 3px; color: var(--gris); }

/* Traer los proveedores de Alegra. La contadora ya los tiene allá con su NIT: volverlos
   a teclear es teclear dos veces lo mismo, y el NIT mal tecleado deja sus facturas
   sueltas sin que nadie se entere. */
.prov-alegra {
  margin-top: 10px; padding: 12px 13px; border-radius: 10px;
  border: 1px solid var(--borde); background: var(--crema);
}
.prov-alegra .fac-cab-lista { margin-bottom: 6px; }
.prov-alegra .th-item small em { color: var(--ambar); font-style: normal; }

/* Un código de responsabilidad que la app no ha visto en ningún RUT real: lo que
   dice de él salió de mi memoria, no de un documento. El 09 ya demostró lo que eso
   vale — lo tenía como «autorretenedor» y por eso decía que a un proveedor no había
   que retenerle. Mientras no se confirme, se advierte. */
.rut-sinver { display: block; margin-top: 3px; font-size: 0.76rem; color: var(--ambar); line-height: 1.4; }

/* «Ver ficha» desde el detalle de una factura de compra: el RUT, la cámara y los
   precios de lámina de ese proveedor están a un toque, sin ir hasta Contactos. */
.facd-verficha { padding: 3px 10px; font-size: 0.78rem; border-radius: 999px; }

/* Los precios de lámina van detrás de una pregunta: a la mayoría de proveedores
   —herrajes, pintura, herramienta— esta sección no les toca, y al CREAR uno
   todavía no le has comprado nada. */
.pf-lam-pregunta { margin-top: 4px; }

/* ── LA FICHA DEL PROVEEDOR ────────────────────────────────────────────────────
   «Poder ingresar a la ficha del proveedor y ver todas las facturas, si tenemos
   facturas por pagar». Lo que le debes va primero y grande: es la pregunta que
   trae a esta pantalla, no un dato más entre otros. */
.fprov-cifras {
  display: flex; flex-wrap: wrap; gap: 10px; margin-top: 14px;
}
.fprov-cifra {
  flex: 1 1 160px; padding: 10px 12px; border-radius: 10px;
  border: 1px solid var(--borde); background: var(--crema);
}
.fprov-cifra > span { display: block; font-size: 0.78rem; color: var(--gris); }
.fprov-cifra > strong {
  display: block; font-size: 1.25rem; color: var(--tinta);
  font-variant-numeric: tabular-nums; line-height: 1.2; margin: 2px 0;
}
.fprov-cifra > small { display: block; font-size: 0.75rem; color: var(--gris); line-height: 1.35; }
/* si le debes, se ve que le debes */
.fprov-debe { border-color: rgba(201, 138, 18, 0.4); background: rgba(201, 138, 18, 0.08); }
.fprov-debe > strong { color: #8a5e08; }

.fprov-fac { cursor: pointer; }
.fprov-fac:hover { background: var(--crema); }
.fprov-fac em { font-style: normal; color: var(--gris); font-weight: 400; }
.fprov-vencida { display: block; color: var(--rojo) !important; font-weight: 600; }

/* A qué facturas se le ha retenido. El total suelto no arma un certificado: hay que poder
   decir de cuál factura salió cada peso. */
/* La tarifa de cada retención, con su código. Sin cifras en pesos: la tarifa es del
   proveedor y el monto es de cada factura. */
.fprov-tarifas { margin-top: 14px; border-top: 1px solid var(--borde); padding-top: 12px; }
.fprov-tar {
  display: grid; grid-template-columns: minmax(120px, auto) 1fr auto; align-items: baseline;
  gap: 4px 12px; padding: 5px 0; font-size: 0.88rem;
}
.fprov-tar + .fprov-tar { border-top: 1px dashed var(--borde); }
.fprov-tar.no, .fprov-tar.falta { opacity: 0.75; }
.fprov-tar-que { font-weight: 700; }
.fprov-tar-cod {
  font-weight: 800; font-variant-numeric: tabular-nums; color: var(--bronce);
  font-size: 0.8rem; margin-left: 4px;
}
.fprov-tar-det { color: var(--gris); font-size: 0.8rem; line-height: 1.4; }

/* La actividad económica: dato suyo, arriba de las tres retenciones */
.fprov-act {
  display: grid; grid-template-columns: minmax(120px, auto) 1fr auto; align-items: baseline;
  gap: 4px 12px; padding: 7px 10px; margin-bottom: 8px; font-size: 0.88rem;
  border-radius: 8px; background: var(--crema); border-left: 4px solid var(--verde-oscuro);
}
.fprov-act-falta { border-left-color: var(--ambar); }
.fprov-act .fprov-tar-tasa { font-weight: 700; }
.fprov-act-falta .fprov-tar-tasa { color: var(--gris); font-weight: 400; font-size: 0.8rem; }
/* elegir el concepto sin salirse de la ficha */
.fprov-pide { margin-top: 10px; display: flex; flex-direction: column; gap: 4px; }
.fprov-pide label { font-weight: 700; font-size: 0.85rem; }
.fprov-pide select { max-width: 420px; }
.fprov-pide small { color: var(--gris); font-size: 0.78rem; line-height: 1.4; }
/* cuánto se le retiene en total, que es la pregunta con la que se abre esta pantalla */
.fprov-tar-total {
  margin-top: 10px; padding-top: 9px; border-top: 1px solid var(--borde);
  font-size: 0.86rem; line-height: 1.5;
}
@media (max-width: 560px) {
  .fprov-act { grid-template-columns: 1fr auto; }
  .fprov-act .fprov-tar-det { grid-column: 1 / -1; }
}
.fprov-tar-tasa { font-weight: 700; white-space: nowrap; font-variant-numeric: tabular-nums; }
.fprov-tar.no .fprov-tar-tasa, .fprov-tar.falta .fprov-tar-tasa { font-weight: 400; color: var(--gris); font-size: 0.8rem; }
@media (max-width: 560px) {
  .fprov-tar { grid-template-columns: 1fr auto; }
  .fprov-tar-det { grid-column: 1 / -1; }
}

/* «Qué se le retiene al pagarle» dejó de ser el título del bloque —ahora lo es
   «Información de empresa»— y pasó a ser el rótulo de los tres renglones. */
.fprov-sub-tit {
  margin-top: 12px; font-size: 0.8rem; font-weight: 800; color: var(--bronce);
  text-transform: uppercase; letter-spacing: 0.6px;
}

/* LOS PAPELES, PLEGADOS. El botón lleva el estado de los dos documentos, para saber si
   algo hace falta sin tener que abrirlo. */
.fprov-docs { margin-top: 14px; border-top: 1px solid var(--borde); padding-top: 12px; }
.fprov-docs > summary {
  cursor: pointer; list-style: none; display: flex; flex-wrap: wrap; align-items: center;
  gap: 6px 12px; padding: 9px 12px; border: 1px solid var(--borde); border-radius: 8px;
  background: var(--crema);
}
.fprov-docs > summary::-webkit-details-marker { display: none; }
.fprov-docs > summary:hover { border-color: var(--bronce); }
.fprov-docs > summary:focus-visible { outline: 2px solid var(--bronce); outline-offset: 2px; }
.fdoc-titulo { font-weight: 700; font-size: 0.9rem; }
.fdoc-titulo::after { content: ' ▾'; color: var(--gris); }
.fprov-docs[open] > summary .fdoc-titulo::after { content: ' ▴'; }
.fdoc-señas { display: flex; flex-wrap: wrap; gap: 6px; margin-left: auto; }
.fdoc-señal {
  font-size: 0.72rem; font-weight: 700; white-space: nowrap;
  padding: 2px 7px; border-radius: 999px; border: 1px solid var(--borde); background: var(--blanco);
}
.fdoc-bien { color: var(--verde-oscuro); border-color: var(--verde-oscuro); }
.fdoc-ojo { color: var(--ambar); border-color: var(--ambar); }
.fdoc-mal, .fdoc-falta { color: var(--rojo); border-color: var(--rojo); }
.fdoc-nota { margin: 4px 0 8px; font-size: 0.78rem; color: var(--gris); line-height: 1.45; }
/* separa lo que se decide (la actividad, el concepto) de los papeles de donde sale */
.fdoc-sep {
  margin-top: 16px; padding-top: 10px; border-top: 1px solid var(--borde);
  font-size: 0.78rem; font-weight: 800; color: var(--bronce);
  text-transform: uppercase; letter-spacing: 0.6px;
}
.fprov-docs > .fprov-act:first-of-type { margin-top: 12px; }
@media (max-width: 560px) {
  .fdoc-señas { margin-left: 0; width: 100%; }
}

.fprov-retenciones { margin-top: 14px; border-top: 1px solid var(--borde); padding-top: 12px; }
.fprov-ret-tit { font-size: 0.72rem; font-weight: 800; letter-spacing: 1px; text-transform: uppercase; color: var(--bronce); margin-bottom: 6px; }

/* LA CANASTA AL CERRAR UN CORTE. El nombre a la izquierda y el número a mano derecha,
   grande, porque lo único que se hace aquí es corregir el que no salió. */
.pr-fila-canasta {
  display: grid; grid-template-columns: 1fr 88px; gap: 10px; align-items: center;
  padding: 7px 0; border-bottom: 1px dashed var(--borde);
}
.pr-fila-canasta:last-child { border-bottom: 0; }
.pr-fila-canasta span { font-size: 0.88rem; min-width: 0; line-height: 1.3; }
.pr-fila-canasta input {
  margin: 0; text-align: right; font-variant-numeric: tabular-nums;
  font-size: 1.05rem; font-weight: 700; padding: 9px 11px;
}

/* EL REGISTRO DE SUPERFICIES. Lo que se lee es forma+tamaño y en cuántos colores está. */
.cat-h4 { margin: 22px 0 6px; font-size: 0.95rem; }
.cat-sup-form { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; }
.cat-sup-form label { display: flex; flex-direction: column; gap: 3px; font-size: 0.8rem; color: var(--gris); flex: 1 1 130px; }
.cat-sup-form input, .cat-sup-form select { margin: 0; }
.cat-sup-colores { display: flex; flex-wrap: wrap; gap: 6px 14px; margin-bottom: 10px; }
.cat-chk { display: flex; align-items: center; gap: 5px; font-size: 0.85rem; }
.cat-chk input { margin: 0; }
.cat-sup-acc { display: flex; gap: 12px; align-items: center; justify-content: space-between; margin-bottom: 6px; }
.cat-formas { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }
.cat-forma { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 0; border-bottom: 1px dashed var(--borde); font-size: 0.88rem; }
.cat-forma small { display: block; font-size: 0.74rem; color: var(--gris); }
.cat-sups { display: flex; flex-direction: column; gap: 8px; }
.cat-sup { padding: 9px 11px; border: 1px solid var(--borde); border-radius: 8px; background: var(--tarjeta); }
.cat-sup-cab { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; justify-content: space-between; }
.cat-sup-meta { font-size: 0.76rem; color: var(--gris); font-variant-numeric: tabular-nums; }
.cat-sup-cols { display: flex; flex-wrap: wrap; gap: 4px 8px; margin-top: 5px; }
.cat-sup-col { cursor: pointer; border: 1px solid transparent; font-family: inherit; font-size: 0.76rem; color: var(--gris); background: var(--crema); padding: 1px 7px; border-radius: 10px; }
.cat-sup-col b { color: var(--bronce); }
.cat-sup-col-off { opacity: 0.45; text-decoration: line-through; }
.cat-sup-mas { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--borde); }
.cat-sup-mas .cat-nota { margin-bottom: 6px; }
.cat-sup-todos { font-size: 0.74rem; color: var(--gris); font-style: italic; }
.cat-sup-col-sel { border-color: var(--bronce); }
/* una opción que necesita la fila entera (el nombre de una superficie no cabe en media). */
.pr-op-ancho { flex: 1 1 100%; }
