:root {
  --azul: #0E2A47;
  --azul-osc: #0a1f36;
  --naranja: #FF6B2C;
  --naranja-osc: #e85d1f;
  --tinta: #1a1f29;
  --gris: #f4f5f7;
  --linea: #e3e6ea;
  --verde: #137333;
  --ambar: #9a6700;
  --rojo: #b3261e;
  /* Texto atenuado (etiquetas, notas al pie…): #5b6675 sobre blanco da ratio ~5.8:1 (AA). El
     antiguo #8595a8, disperso por el CSS, solo daba ~3:1 → se unificó aquí (auditoría P2). */
  --texto-suave: #5b6675;
  /* Tintes/veos de marca DERIVADOS de --azul/--naranja con `color-mix()`: se recalculan solos
     al cambiar de tema (el skin Sobrio solo redefine --azul/--naranja, arriba) en vez de
     duplicar cada rgba(...) a mano. El sufijo es el % de alpha. */
  --azul-a07: color-mix(in srgb, var(--azul) 7%, transparent);
  --azul-a12: color-mix(in srgb, var(--azul) 12%, transparent);
  --azul-a14: color-mix(in srgb, var(--azul) 14%, transparent);
  --azul-a45: color-mix(in srgb, var(--azul) 45%, transparent);
  --azul-a90: color-mix(in srgb, var(--azul) 90%, transparent);
  --naranja-a10: color-mix(in srgb, var(--naranja) 10%, transparent);
  --naranja-a15: color-mix(in srgb, var(--naranja) 15%, transparent);
  --naranja-a50: color-mix(in srgb, var(--naranja) 50%, transparent);
}
/* Skin "Sobrio" (variante CLARA, mismo layout): solo cambian los tokens de color de marca
   (azul/naranja) — TODOS los tintes/veos de arriba se derivan de estos dos con `color-mix()`,
   así que recolorean solos, sin duplicar reglas. Tinta/gris/línea y los semánticos
   verde/ámbar/rojo se mantienen. Se activa con la clase `tema-sobrio` en el <body>
   (preferencia `taller.tema_visual`). El portal del cliente es white-label: NUNCA hereda este
   tema (usa su propia paleta `--p-*`). */
.tema-sobrio {
  --azul: #2f3e4f;
  --azul-osc: #243140;
  --naranja: #c2613a;
  --naranja-osc: #a8512e;
}
/* Foco visible global (accesibilidad, WCAG 2.4.7): outline consistente con el naranja de marca
   para CUALQUIER elemento interactivo (enlaces, botones, campos, y elementos custom con
   tabindex/role="button", p. ej. los pins de la inspección). Solo se pinta con teclado
   (:focus-visible), nunca al hacer clic con ratón. Los focos ya diseñados a medida (inputs
   con anillo `box-shadow`, pestañas) tienen mayor especificidad y ganan donde ya existían. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible {
  outline: 2px solid var(--naranja);
  outline-offset: 2px;
  border-radius: 4px;
}
* { box-sizing: border-box; }
html, body { height: 100%; }
body {
  margin: 0;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  color: var(--tinta);
  background: var(--gris);
}
a { color: var(--azul); text-decoration: none; }
a:hover { text-decoration: underline; }

/* Layout: barra lateral + (topbar + contenido) */
.app { display: grid; grid-template-columns: 240px 1fr; min-height: 100vh; }
.sidebar {
  /* Con logo de marca OSCURO, la barra ENTERA se pinta de ese color (`--menu-fondo`) para que el
     logo se funda con el menú, igual que la ventana de login. Sin logo (o con uno claro, que
     dejaría los textos ilegibles) se mantiene el degradado azul de Cocopit. */
  background: var(--menu-fondo, linear-gradient(180deg, var(--azul), var(--azul-osc)));
  color: #cdd9e8;
  display: flex; flex-direction: column; padding: .9rem .7rem;
}
.brand { display: flex; align-items: center; gap: .55rem; font-weight: 700; font-size: 1.1rem; color: #fff; padding: .45rem .5rem 1rem; }
.brand-mark { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 9px; background: linear-gradient(135deg, var(--azul), #3b82f6); color: #fff; font-size: .78rem; font-weight: 800; }
/* Marca Cocopit en el sidebar (backend) */
.brand-ico { width: 30px; height: 30px; flex: 0 0 auto; }
/* El arco del isotipo sigue el token de marca (CSS gana al atributo `stroke` del SVG): así el
   skin Sobrio recolorea también el logo, sin un segundo SVG. */
.brand-ico-arc { stroke: var(--naranja); }
.brand-txt { font-weight: 800; letter-spacing: -.02em; color: #fff; font-size: 1.18rem; }
.brand-pit { color: var(--naranja); }
/* Logo del TALLER en la cabecera del menú: ocupa el ancho disponible con alto libre
   (`contain`), nunca una caja fija que lo deforme. SIN fondo propio: la cabecera ya viene
   teñida del color de fondo del logo (ver `color_marca.py`), así el logo se funde con ella en
   vez de verse como un recorte pegado encima. */
.brand-logo-taller {
  width: 100%; max-height: 64px; height: auto; object-fit: contain; display: block;
}

.ico { width: 20px; height: 20px; display: inline-block; vertical-align: middle; flex: 0 0 auto; }
.sidebar nav { display: flex; flex-direction: column; gap: .12rem; }
/* Textos del menú en BLANCO (petición del dueño 13-08-2026): el menú puede ir teñido con el
   color del taller, y el celeste/gris de antes se leía flojo sobre cualquier azul. Los
   encabezados van en blanco atenuado para conservar la jerarquía sin perder contraste. */
.nav-grupo { padding: .9rem .6rem .3rem; font-size: .67rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: rgba(255,255,255,.72); }
.nav-item { display: flex; align-items: center; gap: .65rem; color: #fff; padding: .52rem .6rem; border-radius: 9px; font-size: .92rem; position: relative; }
.nav-item:hover { background: rgba(255,255,255,.07); color: #fff; text-decoration: none; }
.nav-item .ico { width: 19px; height: 19px; opacity: .95; }
/* Sección activa: fondo y barra con el color de ACENTO del logo del taller (el amarillo del
   coche en el piloto); sin logo, el naranja de Cocopit de siempre. */
.nav-item.activo { background: var(--acento-suave, var(--naranja-a15)); color: #fff; font-weight: 600; }
.nav-item.activo .ico { opacity: 1; color: var(--acento, #ff9b6b); }
.nav-item.activo::before { content: ""; position: absolute; left: -.7rem; top: 18%; bottom: 18%; width: 3px; border-radius: 0 3px 3px 0; background: var(--acento, var(--naranja)); }
/* Subgrupos colapsables de Configuración (Taller/Maestros/Datos/Sistema): mismo lenguaje visual
   que `.nav-grupo` pero clicable (`<details><summary>`, sin JS obligatorio; nativo del navegador,
   funciona igual dentro del drawer móvil). Colapsado por defecto; el que contiene la ruta activa
   se abre server-side con el atributo `open` (ver base.html). */
.nav-sub { margin: 0; }
.nav-sub-titulo {
  display: flex; align-items: center; gap: .65rem; cursor: pointer; list-style: none;
  padding: .52rem .6rem; border-radius: 9px; color: rgba(255,255,255,.82);
  font-size: .78rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  -webkit-user-select: none; user-select: none;
}
.nav-sub-titulo::-webkit-details-marker { display: none; }
.nav-sub-titulo:hover { background: rgba(255,255,255,.07); color: #fff; }
.nav-sub-titulo .ico { width: 18px; height: 18px; opacity: .8; flex: 0 0 auto; }
/* Flecha propia (no dependemos del marcador nativo, distinto por navegador): rota al abrir. */
.nav-sub-titulo::after {
  content: ""; margin-left: auto; width: 7px; height: 7px; flex: 0 0 auto;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(-45deg); transition: transform .15s ease; opacity: .7;
}
.nav-sub[open] > .nav-sub-titulo::after { transform: rotate(45deg); }
.nav-sub-items {
  display: flex; flex-direction: column; gap: .12rem;
  margin: .1rem 0 .3rem .95rem; padding-left: .5rem;
  border-left: 2px solid rgba(255,255,255,.08);
}
.sidebar-pie { margin-top: auto; padding-top: .5rem; }

/* Indicador de sincronización (solo escritorio): estado del servidor + cola offline-first */
.sync-box { margin: .4rem .15rem .2rem; padding: .5rem .6rem; border-radius: 8px; background: rgba(255,255,255,.06); display: flex; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; font-size: .8rem; color: #cfe0f0; }
.sync-dot { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; background: #93a7bd; }
.sync-ok .sync-dot { background: #34d399; }     /* verde: en línea */
.sync-off .sync-dot { background: #f59e0b; }    /* ámbar: sin conexión */
.sync-local .sync-dot { background: #93a7bd; }  /* gris: solo local */
.sync-txt { font-weight: 600; }
.sync-cola { width: 100%; color: #ffd9a8; font-size: .78rem; }  /* cambios en cola */
.sync-cola-ok { color: #93a7bd; }
.sync-btn { background: rgba(255,255,255,.12); color: #fff; border: 0; padding: .2rem .55rem; border-radius: 6px; font-size: .78rem; cursor: pointer; }
.sync-btn:hover { background: rgba(255,255,255,.22); text-decoration: none; }
.sync-btn[disabled] { opacity: .5; cursor: default; }
/* Mini-form para pegar el token de dispositivo (M2) cuando el servidor lo exige. */
.sync-token-form { width: 100%; display: flex; flex-wrap: wrap; gap: .35rem; margin-top: .2rem; }
.sync-token-aviso { width: 100%; margin: 0 0 .15rem; color: #ffd9a8; font-size: .76rem; }
.sync-token-input { flex: 1 1 8rem; min-width: 0; background: rgba(255,255,255,.1); color: #fff; border: 1px solid rgba(255,255,255,.2); border-radius: 6px; padding: .2rem .4rem; font-size: .76rem; }
/* Resultado de "Guardar código" (`sync_token_guardar`): fondo propio, se ve tanto dentro de la
   topbar oscura como en la página clara de Conexión (escritorio VIRGEN, sin `.sync-box` alrededor). */
.sync-token-mensaje { margin: .3rem .15rem; padding: .3rem .55rem; border-radius: 6px; background: var(--azul-a07); color: var(--azul); font-size: .8rem; font-weight: 600; }

/* main = topbar pegajosa + contenido */
.main { display: flex; flex-direction: column; min-width: 0; }
.topbar { position: sticky; top: 0; z-index: 30; display: flex; align-items: center; gap: 1rem; padding: .6rem 1.4rem; background: rgba(255,255,255,.9); backdrop-filter: blur(8px); border-bottom: 1px solid var(--linea); }
.content { padding: 1.6rem 2rem; max-width: 1560px; width: 100%; }

/* Búsqueda global (topbar) */
.buscador-global { position: relative; display: flex; align-items: center; gap: .5rem; flex: 1; max-width: 560px; background: #fff; border: 1px solid var(--linea); border-radius: 10px; padding: 0 .7rem; }
.buscador-global:focus-within { border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.buscador-global .ico-buscar { width: 18px; height: 18px; color: var(--texto-suave); }
.buscador-global input { flex: 1; min-width: 0; border: 0; outline: 0; padding: .55rem 0; font-size: .95rem; background: transparent; color: var(--tinta); }
.buscar-resultados:empty { display: none; }
.buscar-resultados { position: absolute; top: calc(100% + .5rem); left: 0; right: 0; background: #fff; border: 1px solid var(--linea); border-radius: 12px; box-shadow: 0 12px 30px rgba(16,32,56,.16); max-height: 70vh; overflow: hidden auto; z-index: 40; }
.res-grupo { padding: .5rem .8rem .25rem; font-size: .7rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--texto-suave); background: #fafbfc; }
.res-item { display: flex; align-items: center; gap: .7rem; padding: .55rem .8rem; border-top: 1px solid #f0f2f5; color: var(--tinta); }
.res-item:hover { background: #f3f8ff; text-decoration: none; }
.res-item .ico { width: 18px; height: 18px; color: var(--texto-suave); }
.res-titulo { font-weight: 600; }
.res-sub { color: #6b7891; font-size: .85rem; }
.res-vacio { padding: .9rem; color: #6b7891; font-size: .9rem; }
/* Glóbulo de notificaciones del portal (topbar, A5) */
.globulo-portal { display: inline-flex; align-items: center; position: relative; padding: .25rem .3rem; border-radius: 8px; color: var(--texto-suave); text-decoration: none; }
.globulo-portal:hover { background: #f0f2f5; text-decoration: none; }
.globulo-con-badge .ico { color: var(--azul); }
.globulo-sin-badge .ico { color: var(--texto-suave); }
.globulo-badge { position: absolute; top: -.1rem; right: -.25rem; background: var(--rojo); color: #fff; font-size: .68rem; font-weight: 700; min-width: 18px; height: 18px; border-radius: 9px; display: flex; align-items: center; justify-content: center; padding: 0 .3rem; line-height: 1; }

/* Mensajes cliente↔taller (pestaña Mensajes de la ficha de cliente) */
/* El bloque entero se acota a ancho de "chat": en pantallas grandes el hilo a página
   completa dejaba la burbuja del taller perdida en el borde derecho. */
#mensajes-cliente { max-width: 760px; }
.mensajes-hilo { display: flex; flex-direction: column; gap: .6rem; padding: .6rem 0 1rem; max-height: 480px; overflow-y: auto; }
.mensaje-burbuja { max-width: 75%; padding: .5rem .85rem; border-radius: 12px; font-size: .93rem; }
.mensaje-taller { align-self: flex-end; background: var(--azul); color: #fff; border-bottom-right-radius: 4px; }
.mensaje-cliente { align-self: flex-start; background: #f0f2f5; color: var(--tinta); border-bottom-left-radius: 4px; }
.mensaje-meta { font-size: .76rem; margin-top: .3rem; opacity: .75; }
.mensaje-taller .mensaje-meta { color: rgba(255, 255, 255, .88); opacity: 1; }
.mensajes-form { border-top: 1px solid var(--linea); padding-top: .8rem; display: flex; flex-direction: column; gap: .5rem; }
.mensajes-label { font-size: .82rem; font-weight: 600; color: var(--texto-suave); }
.mensajes-form textarea { width: 100%; box-sizing: border-box; font: inherit; font-size: .95rem; padding: .55rem .7rem; border: 1px solid var(--linea); border-radius: 10px; resize: vertical; background: #fff; }
.mensajes-form textarea:focus { border-color: var(--azul); outline: 1px solid var(--azul); }
.mensajes-acciones { display: flex; justify-content: flex-end; }

.topbar-taller { display: flex; align-items: center; gap: .4rem; font-size: .88rem; color: var(--texto-suave); white-space: nowrap; margin-left: auto; }
.punto-taller { width: 8px; height: 8px; border-radius: 50%; background: var(--verde); }

h1 { margin: 0 0 1rem; font-size: 1.5rem; color: var(--tinta); }
h2 { margin: 1.6rem 0 .6rem; font-size: 1.15rem; }

.cabecera { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }

/* KPIs (web del TALLER) — escritorio (≥900px): una sola fila que se reparte el ancho SIEMPRE
   (flex:1 por tarjeta, sin `wrap` real gracias a `min-width:0`); vale igual con 8 tarjetas o con
   7 (KPI "Bandeja" gateado sin el módulo portal, ver `modulos_activos`). Móvil (≤899px): rejilla
   FIJA de 4 columnas (4+4, decisión del dueño; con 7 tarjetas la última fila queda 4+3).
   El portal del CLIENTE usa sus propias tarjetas (`.portal-tarjetas`, portal.css), NO esto. */
.kpis { display: flex; gap: 1rem; flex-wrap: wrap; }
.kpi {
  background: #fff; border: 1px solid var(--linea); border-radius: 12px;
  padding: 1rem .6rem; display: flex; flex-direction: column; align-items: center;
  text-align: center; min-width: 0; flex: 1 1 0;
}
@media (max-width: 899px) {
  .kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .6rem; }
  .kpi { padding: .7rem .3rem; }
  /* El número se ADAPTA al ancho real: con un importe largo ("54.354,97 €") un tamaño fijo se
     salía de la tarjeta y se pisaba con la de al lado (visto en vivo en un móvil, 13-08-2026). */
  .kpi .num { font-size: clamp(.95rem, 4.2vw, 1.5rem); overflow-wrap: anywhere; }
  .kpi .lbl { font-size: .75rem; overflow-wrap: anywhere; }
  .kpi-destacado .num { font-size: clamp(1.3rem, 6vw, 2.4rem); }
  /* Los KPI de informes llevan IMPORTES: en móvil, 2 columnas (4 no caben legibles). */
  .informe-kpi-fila-4 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; }
}
.kpi .kpi-ico { font-size: 1.6rem; line-height: 1; margin-bottom: .3rem; }
.kpi .num { font-size: 2rem; font-weight: 700; color: var(--azul); line-height: 1; }
.kpi .lbl { color: var(--texto-suave); font-size: .9rem; margin-top: .3rem; }
/* KPI clicable (enlace a su apartado) */
a.kpi { transition: border-color .15s, box-shadow .15s, transform .15s; }
a.kpi:hover {
  text-decoration: none; border-color: var(--azul);
  box-shadow: 0 2px 10px var(--azul-a12); transform: translateY(-1px);
}

/* === KPIs del panel — Opción A (métrica analítica): tarjetas chip·número·etiqueta ===
   Estilo `kpis_dashboard="a"`. MISMA mecánica que `.kpis` clásico: escritorio (≥900px) FLEX de
   una sola fila que se reparte el ancho SIEMPRE (flex:1, sin wrap real); vale igual con 8
   tarjetas o con 7 (KPI "Bandeja" gateado sin el módulo portal). Móvil (≤899px): rejilla FIJA de
   4 columnas (4+4; con 7 tarjetas la última fila queda 4+3). Estructura vertical de cada
   tarjeta: chip ARRIBA · número en el CENTRO · etiqueta ABAJO. */
.kA-grid { display: flex; flex-wrap: wrap; gap: .8rem; }
.kA {
  flex: 1 1 0; min-width: 0;
  background: #fff; border: 1px solid var(--linea); border-radius: 14px; padding: .9rem .6rem;
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: .4rem;
  color: var(--tinta);
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
@media (max-width: 899px) {
  .kA-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .6rem; }
  .kA { padding: .7rem .3rem; }
}
a.kA:hover { text-decoration: none; border-color: #d4dae3; box-shadow: 0 6px 18px rgba(16,32,56,.1); transform: translateY(-2px); }
.kA-chip { width: 30px; height: 30px; border-radius: 9px; display: flex; align-items: center; justify-content: center; background: #e7f0fb; color: var(--azul); flex: 0 0 auto; }
.kA-chip svg { width: 17px; height: 17px; }
.kA-num { font-size: 1.95rem; font-weight: 700; line-height: 1; color: var(--azul); font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.kA-lbl { font-weight: 700; font-size: .62rem; letter-spacing: .05em; text-transform: uppercase; color: #6b7891; }
/* Acento (naranja de marca) para el KPI más relevante; alerta (rojo) cuando hay pendientes. */
.kA.acento .kA-chip { background: #ffe9dd; color: var(--naranja-osc); }
.kA.acento .kA-num { color: var(--naranja-osc); }
.kA.alerta .kA-chip { background: #fde8e6; color: var(--rojo); }
.kA.alerta .kA-num { color: var(--rojo); }

/* === KPIs del panel — Opción B: un KPI destacado + barra segmentada ===
   Estilo `kpis_dashboard="b"`. */
.kB-wrap { display: grid; grid-template-columns: 280px 1fr; gap: .9rem; }
@media (max-width: 900px) { .kB-wrap { grid-template-columns: 1fr; } }
.kB-feat {
  background: linear-gradient(135deg, var(--azul), var(--azul-osc)); color: #fff; border-radius: 16px;
  padding: 1.25rem; display: flex; flex-direction: column; justify-content: space-between;
  position: relative; overflow: hidden; min-height: 152px;
  transition: box-shadow .15s, transform .15s;
}
a.kB-feat:hover { text-decoration: none; box-shadow: 0 10px 26px rgba(16,32,56,.22); transform: translateY(-2px); }
/* El "glow" usa --naranja-a50 (color-mix): se recolorea solo con el tema, sin duplicar regla. */
.kB-feat .glow { position: absolute; width: 170px; height: 170px; right: -44px; bottom: -54px; background: radial-gradient(circle, var(--naranja-a50), transparent 70%); }
.kB-feat .lbl { font-weight: 700; font-size: .68rem; letter-spacing: .07em; text-transform: uppercase; color: #9fb6d4; position: relative; }
.kB-feat .num { font-size: 2.7rem; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; letter-spacing: -.02em; position: relative; margin-top: .4rem; }
.kB-feat .foot { display: flex; align-items: center; gap: .5rem; position: relative; font-size: .8rem; color: #c4d4e6; }
/* 7 celdas (agenda·presupuestos·avisos·bandeja·pedidos·clientes·vehículos; 6 sin el módulo
   portal, ver `modulos_activos`): FLEX de una sola fila (como `.kpis`/`.kA-grid`) en vez de una
   rejilla de columnas fijas — 6 y 7 no son múltiplo de 4, así que una rejilla fija dejaba la
   última fila con hueco; el FLEX reparte el ancho exacto SIEMPRE, sea cual sea el nº de celdas. */
.kB-seg { background: #fff; border: 1px solid var(--linea); border-radius: 16px; display: flex; overflow: hidden; }
.kB-cell { flex: 1 1 0; min-width: 0; padding: .9rem 1rem; border-left: 1px solid var(--linea); display: flex; flex-direction: column; gap: .5rem; color: var(--tinta); }
.kB-cell:first-child { border-left: 0; }
a.kB-cell:hover { text-decoration: none; background: #f8fafc; }
.kB-bar { height: 3px; width: 26px; border-radius: 3px; background: var(--azul); }
.kB-cell.amb .kB-bar { background: var(--ambar); }
.kB-cell.nar .kB-bar { background: var(--naranja); }
.kB-cell.rojo .kB-bar { background: var(--rojo); }
.kB-cell.verde .kB-bar { background: var(--verde); }
.kB-r { display: flex; align-items: center; justify-content: space-between; }
.kB-num { font-size: 1.65rem; font-weight: 700; line-height: 1; color: var(--tinta); font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.kB-cell.rojo .kB-num { color: var(--rojo); }
.kB-ico { width: 17px; height: 17px; color: #6b7891; }
.kB-lbl { font-size: .8rem; color: var(--texto-suave); font-weight: 500; }
@media (max-width: 560px) {
  .kB-seg { display: grid; grid-template-columns: repeat(2, 1fr); }
  .kB-cell:nth-child(odd) { border-left: 0; }
}

/* Tablas */
.tabla { width: 100%; border-collapse: collapse; background: #fff; border: 1px solid var(--linea); border-radius: 10px; overflow: hidden; margin-top: .6rem; }
.tabla th, .tabla td { text-align: left; padding: .55rem .8rem; border-bottom: 1px solid var(--linea); }
.tabla thead th { background: #fafbfc; font-size: .85rem; color: var(--texto-suave); text-transform: uppercase; letter-spacing: .02em; }
.tabla tbody tr:hover { background: #f8fafc; }
.tabla .num { text-align: right; font-variant-numeric: tabular-nums; }
.tabla tfoot th { background: #fafbfc; }
.tabla tfoot .total-final th { font-size: 1.05rem; color: var(--azul); }

/* Estados */
.estado { padding: .1rem .55rem; border-radius: 999px; font-size: .8rem; font-weight: 600; background: #eef1f5; color: var(--texto-suave); }
.estado-abierta, .estado-en_curso { background: #e7f0fb; color: var(--azul); }
.estado-terminada, .estado-entregada { background: #e6f4ea; color: var(--verde); }
.estado-facturada { background: #fff4e5; color: var(--ambar); }
.estado-anulada { background: #fde8e6; color: var(--rojo); }
/* Estados de cita (agenda) */
.estado-pendiente { background: #fff4e5; color: var(--ambar); }
.estado-propuesta { background: #fff0d6; color: #b36b00; }
.estado-confirmada { background: #e7f0fb; color: var(--azul); }
.estado-cumplida { background: #e6f4ea; color: var(--verde); }
.estado-cancelada { background: #eef1f5; color: var(--texto-suave); }
/* Mini-form «Proponer otra fecha» en la bandeja */
.cita-proponer-form { padding: .6rem .2rem; }
.proponer-campos { display: flex; flex-wrap: wrap; gap: .6rem; align-items: flex-end; }
.form-label-mini { display: flex; flex-direction: column; font-size: .9rem; gap: .2rem; }
.input-mini { font-size: .9rem; padding: .3rem .5rem; border: 1px solid var(--linea); border-radius: 6px; }
.proponer-acciones { display: flex; gap: .5rem; align-items: center; }
/* Logo / monograma de marca de vehículo (assets en static/adm_ui/marcas/) */
.marca-logo, .marca-mono { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; vertical-align: middle; border-radius: 8px; overflow: hidden; }
.marca-logo { background: #fff; border: 1px solid var(--linea); }
.marca-logo img { width: 100%; height: 100%; object-fit: contain; padding: 2px; }
.marca-mono { color: #fff; font-weight: 700; line-height: 1; }
.marca-logo-sm, .marca-mono.marca-logo-sm { width: 24px; height: 24px; font-size: .8rem; border-radius: 6px; }
.marca-logo-md, .marca-mono.marca-logo-md { width: 36px; height: 36px; font-size: 1rem; }
.marca-logo-lg, .marca-mono.marca-logo-lg { width: 56px; height: 56px; font-size: 1.5rem; border-radius: 12px; }
.titulo-marca { display: flex; align-items: center; gap: .7rem; }
.titulo-marca h1 { margin: 0; }
.titulo-marca .nota { margin: .1rem 0 0; }
.celda-marca { display: inline-flex; align-items: center; gap: .5rem; }

/* Ficha de marca: cabecera (editar + logo) */
.marca-cabecera { margin-bottom: 1.6rem; }

/* Tarjeta única al ancho del contenido, con dos columnas (datos | logo). */
.marca-editor {
  display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-top: 1rem;
  background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1.2rem 1.4rem;
}
.marca-editor-col { display: flex; flex-direction: column; gap: .7rem; min-width: 0; }
.marca-editor .panel-titulo { margin: 0; font-size: 1rem; color: var(--tinta); }
.marca-editor form { margin: 0; }
.marca-editor .marca-campo { display: flex; flex-direction: column; gap: .25rem; font-size: .9rem; color: var(--texto-suave); margin-bottom: .7rem; }
.marca-editor .marca-campo input {
  width: 100%; box-sizing: border-box; padding: .5rem .7rem; border: 1px solid var(--linea);
  border-radius: 8px; font-size: 1rem; color: var(--tinta);
}
.marca-editor .marca-campo input:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.marca-editor .acciones { margin-top: 1rem; }
.marca-editor .check-inline { margin-bottom: .2rem; }
.marca-logo-quitar { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin-top: .8rem; }

/* Zona de arrastrar y soltar (logo): label clicable + drag&drop. */
.dropzone {
  display: flex; flex-direction: row; align-items: center; gap: .9rem; text-align: left;
  border: 2px dashed var(--linea); border-radius: 10px; background: #fafbfc;
  padding: .8rem 1rem; cursor: pointer; transition: border-color .15s, background .15s;
}
.dropzone:hover, .dropzone:focus-within { border-color: var(--azul); background: #f3f8ff; }
.dropzone.dragover { border-color: var(--azul); border-style: solid; background: #eaf2fd; }
.dropzone-preview { pointer-events: none; flex: 0 0 auto; }
.dropzone-txt { display: flex; flex-direction: column; gap: .12rem; min-width: 0; }
.dropzone-texto { margin: 0; font-size: .9rem; font-weight: 600; color: var(--tinta); }
.dropzone-nota { margin: 0; font-size: .8rem; color: var(--texto-suave); }

.check-inline, .form label.check-inline { display: flex; flex-direction: row; align-items: center; gap: .4rem; white-space: nowrap; }
.check-inline input { width: auto; }
.en-produccion { color: var(--verde); font-style: italic; }
@media (max-width: 720px) { .marca-editor { grid-template-columns: 1fr; } }

/* Combustibles del modelo: abreviaturas (vista) + checklist (edición) */
.combustibles-abrev { display: inline-flex; gap: .25rem; flex-wrap: wrap; }
.combustible-chip {
  display: inline-block; min-width: 1.5rem; padding: .1rem .3rem; border-radius: 5px;
  font-size: .72rem; font-weight: 600; text-align: center; letter-spacing: .02em;
  background: #eef1f5; color: #aab4c0; border: 1px solid transparent;
}
.combustible-chip.on { background: var(--azul); color: #fff; }
.combustibles-check { display: flex; gap: .3rem; flex-wrap: wrap; }
.combustible-opcion {
  display: inline-flex; align-items: center; gap: .2rem; padding: .1rem .35rem; cursor: pointer;
  border: 1px solid #cdddf1; border-radius: 5px; background: #fff; font-size: .72rem; font-weight: 600;
  white-space: nowrap; user-select: none;
}
/* No estirar los checkboxes con la regla genérica de `.fila-edicion input` */
.combustibles-check input[type="checkbox"] { width: auto; margin: 0; padding: 0; }
.combustible-opcion:has(input:checked) { background: var(--azul); color: #fff; border-color: var(--azul); }

/* Alta de línea (presupuesto / OR): bloque ENCIMA de la tabla, cada campo ETIQUETADO y alineado. */
.linea-nueva { margin: 0 0 1rem; padding: 1rem 1.2rem; background: #f7faff; border: 1px solid var(--linea); border-radius: 12px; }
.linea-nueva-titulo { margin: 0 0 .8rem; font-size: 1rem; color: var(--tinta); }
.linea-nueva-campos { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .7rem .9rem; }
.linea-nueva label { display: flex; flex-direction: column; gap: .25rem; font-size: .78rem; font-weight: 600; color: var(--texto-suave); }
.linea-nueva input, .linea-nueva select { padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; color: var(--tinta); background: #fff; }
.linea-nueva input:focus, .linea-nueva select:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.linea-nueva .campo-desc { flex: 1 1 260px; position: relative; }
.linea-nueva .campo-desc input { width: 100%; }
.linea-nueva .campo-num input { width: 5.5rem; text-align: right; }
.linea-nueva button[type=submit] { margin-left: auto; }
@media (max-width: 720px) { .linea-nueva .campo-desc { flex-basis: 100%; } .linea-nueva button[type=submit] { margin-left: 0; } }

/* Stepper de cantidad: input + botones −/+ (alta de línea y edición inline). */
.stepper { display: inline-flex; align-items: stretch; }
.stepper > button { flex: 0 0 auto; width: 1.9rem; padding: 0; border: 1px solid var(--linea); background: #fff; color: var(--tinta); font-size: 1.05rem; line-height: 1; cursor: pointer; }
.stepper > button:first-child { border-radius: 8px 0 0 8px; }
.stepper > button:last-child { border-radius: 0 8px 8px 0; }
.stepper > button:hover { background: #eef3fb; border-color: var(--azul); color: var(--azul); }
.stepper > input { width: 3rem !important; text-align: center; border-radius: 0 !important; border-left: 0 !important; border-right: 0 !important; }
.fila-edicion .stepper > button { padding: .25rem 0; }
.fila-edicion .stepper > input { width: 2.6rem !important; }

/* Sugerencias de artículo en el campo Descripción de "Añadir línea" (lineas.js). */
.articulo-sugerencias { position: absolute; top: calc(100% + .25rem); left: 0; right: 0; z-index: 60; margin: 0; padding: .25rem; list-style: none; background: #fff; border: 1px solid var(--linea); border-radius: 10px; box-shadow: 0 12px 30px rgba(16,32,56,.16); max-height: 260px; overflow: auto; }
.articulo-sugerencia { display: flex; align-items: baseline; gap: .55rem; padding: .4rem .55rem; border-radius: 7px; cursor: pointer; font-size: .9rem; font-weight: 400; }
.articulo-sugerencia:hover { background: #f3f8ff; }
.articulo-sugerencia .art-desc { flex: 1 1 auto; color: var(--tinta); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.articulo-sugerencia .art-ref { flex: 0 0 auto; color: var(--texto-suave); font-size: .8rem; }
.articulo-sugerencia .art-pvp { flex: 0 0 auto; color: var(--azul); font-weight: 600; }

/* Prioridad de la OR (cola de trabajo: baja / normal / alta / urgente) */
.prioridad { padding: .1rem .55rem; border-radius: 999px; font-size: .8rem; font-weight: 600; background: #eef1f5; color: var(--texto-suave); }
.prioridad-baja { background: #eef1f5; color: var(--texto-suave); }
.prioridad-normal { background: #e7f0fb; color: var(--azul); }
.prioridad-alta { background: #fff4e5; color: var(--ambar); }
.prioridad-urgente { background: #fde8e6; color: var(--rojo); }

/* Tipo de orden (categoría predefinida: mantenimiento / avería / pre-ITV…) */
.chip-tipo { padding: .1rem .55rem; border-radius: 999px; font-size: .8rem; font-weight: 600; background: #ede9fe; color: #6d28d9; }
.filtro-tipo { margin: .4rem 0 .2rem; }
/* La clase vale tanto en el contenedor (uso antiguo) como en el propio <label> (listados que ya
   usan `filtros-listado`), para no tener dos estilos de filtro distintos por la app. */
.filtro-tipo label, label.filtro-tipo { display: inline-flex; align-items: center; gap: .5rem;
  font-size: .9rem; color: var(--texto-suave); margin: 0; }
.filtro-tipo select { padding: .4rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; }
.filtros-listado .filtro-tipo { margin: 0; }

/* Estados de presupuesto */
.estado-borrador { background: #eef1f5; color: var(--texto-suave); }
.estado-enviado { background: #e7f0fb; color: var(--azul); }
.estado-aceptado { background: #e6f4ea; color: var(--verde); }
.estado-rechazado { background: #fde8e6; color: var(--rojo); }
.estado-convertido { background: #e6f4ea; color: var(--verde); }
/* Estado de pedido a proveedor (recibido = compra cerrada, verde) */
.estado-recibido { background: #e6f4ea; color: var(--verde); }
/* Estados nuevos de OR/presupuesto (coordinación con agente dominio) */
.estado-pendiente_pieza { background: #fff0d6; color: #b36b00; }
.estado-pieza_pedida { background: #fff4e5; color: var(--ambar); }
.estado-pendiente_contactar { background: #fef0e4; color: #9a4a00; }
.estado-servicio_externo { background: #ede9fe; color: #5b21b6; }

/* Pedidos a proveedor: indicadores de control + líneas de devolución
   ------------------------------------------------------------------ */
.pedido-resumen { display: flex; flex-wrap: wrap; gap: .5rem; margin: .4rem 0 1rem; }
.badge-pendiente { background: #fff4e5; color: var(--ambar); padding: .12rem .6rem; border-radius: 999px; font-size: .82rem; font-weight: 600; }
.badge-ok { background: #e6f4ea; color: var(--verde); padding: .12rem .6rem; border-radius: 999px; font-size: .82rem; font-weight: 600; }
.badge-devolucion { background: #fde8e6; color: var(--rojo); padding: .12rem .6rem; border-radius: 999px; font-size: .82rem; font-weight: 600; }
.tabla.tabla-pedido .fila-devolucion td { background: #fef5f4; }
.tag-devolucion { display: inline-block; font-weight: 700; color: var(--rojo); }
.nota-ref { color: var(--texto-suave); font-size: .85rem; }
.nota-motivo { display: block; color: var(--texto-suave); font-size: .78rem; margin-top: .15rem; }
.celda-estado-linea { white-space: nowrap; }
/* Mini-form de "marcar devolución" (select de motivo + botón) dentro de una celda de acciones */
.form-devolucion { display: inline-flex; align-items: center; gap: .25rem; margin: 0; }
.form-devolucion select { padding: .15rem .35rem; border: 1px solid #cdddf1; border-radius: 6px; font-size: .8rem; background: #fff; color: var(--tinta); }
/* Alta de línea de pedido: el select de artículo ocupa una fila ancha */
.linea-nueva .campo-articulo { flex: 1 1 320px; }
.linea-nueva .campo-articulo select { width: 100%; }
.linea-nueva .nota { flex-basis: 100%; margin-top: .4rem; }
@media (max-width: 720px) { .linea-nueva .campo-articulo { flex-basis: 100%; } }

/* Acciones de documento (presupuesto: enviar/aceptar/rechazar/convertir) */
.acciones-doc { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; margin: 1rem 0; }
.acciones-doc form { margin: 0; }

/* Botones.
   El PRIMARIO (relleno) usa `--accion`, que por defecto es el azul Cocopit y que la marca del
   taller pisa con el color de su logo (decisión del dueño 13-08-2026: su color corporativo manda
   en los botones de acción). Los secundarios claros (`.btn-claro`, `.btn-sec` en <a>) NO se tocan:
   siguen en azul claro, que es lo que los distingue de la acción principal. */
.btn, button { background: var(--accion, var(--azul)); color: #fff; border: 0; padding: .55rem 1rem; border-radius: 8px; font-size: .95rem; cursor: pointer; }
.btn:hover, button:hover { background: var(--accion-osc, var(--azul-osc)); text-decoration: none; }
/* btn-sec en <a> = enlace secundario: texto azul sobre el fondo claro de la página.
   En <button> hereda el fondo azul de la regla `button`, así que AHÍ el texto debe ser blanco
   (antes era azul sobre azul = invisible, p. ej. el botón "Subir imagen" / "Posponer"). */
.btn-sec { display: inline-block; margin-top: 1rem; color: var(--azul); }
button.btn-sec { color: #fff; }
/* Botón secundario (fondo claro, buen contraste; p. ej. "Autocompletar") */
.btn-claro { background: #eef3fb; color: var(--azul); border: 1px solid #cdddf1; white-space: nowrap; }
.btn-claro:hover { background: #e0eaf8; }

/* Búsqueda */
.buscador { width: 100%; max-width: 420px; padding: .55rem .8rem; border: 1px solid var(--linea); border-radius: 8px; font-size: 1rem; margin: .4rem 0; }
.htmx-indicator { opacity: 0; transition: opacity .2s; color: var(--texto-suave); font-size: .85rem; margin-left: .5rem; }
.htmx-request .htmx-indicator, .htmx-indicator.htmx-request { opacity: 1; }

/* Aviso global de error HTMX (offline / 5xx), inyectado por `htmx_avisos.js`: franja discreta
   abajo, `role="alert"` para que el lector de pantalla lo anuncie sin robarle el foco al
   usuario. Auto-descartable (temporizador) + botón de cerrar manual. */
.htmx-aviso-global {
  position: fixed; left: 50%; bottom: 1.2rem; transform: translateX(-50%);
  z-index: 500; display: flex; align-items: center; gap: .7rem;
  background: var(--tinta); color: #fff; border-radius: 10px;
  padding: .6rem .7rem .6rem 1rem; font-size: .9rem;
  box-shadow: 0 10px 30px rgba(16,32,56,.28); max-width: min(420px, calc(100vw - 2rem));
}
.htmx-aviso-global[hidden] { display: none; }
.htmx-aviso-texto { flex: 1; }
.htmx-aviso-cerrar {
  flex: 0 0 auto; background: transparent; border: 0; color: #fff; opacity: .8;
  cursor: pointer; padding: .1rem .3rem; font-size: .95rem; line-height: 1;
}
.htmx-aviso-cerrar:hover { opacity: 1; background: transparent; }

/* Paginación de listados (clientes/vehículos/productos/órdenes): anterior/siguiente + "página X de Y" */
.paginacion { display: flex; align-items: center; justify-content: center; gap: 1rem; margin: 1rem 0; }
.paginacion-link { color: var(--azul); font-size: .9rem; }
.paginacion-link.paginacion-inactivo { color: #b7c0cc; pointer-events: none; }
.paginacion-info { color: var(--texto-suave); font-size: .85rem; }

/* Formularios */
.form { display: flex; flex-direction: column; gap: .7rem; max-width: 420px; width: 100%; background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1.2rem; }
.form label { display: flex; flex-direction: column; gap: .25rem; font-size: .9rem; color: var(--texto-suave); }
.form input, .form select { width: 100%; padding: .5rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font-size: 1rem; color: var(--tinta); }
.form input[type="checkbox"], .form input[type="radio"] { width: auto; padding: 0; border: none; }
.form .acciones { display: flex; gap: 1rem; align-items: center; margin-top: .4rem; }

.aviso { background: #fff4e5; border: 1px solid #ffe0b2; color: var(--ambar); padding: .8rem 1rem; border-radius: 10px; }
.nota { color: var(--texto-suave); font-size: .85rem; margin: 0; }
.averia { color: var(--texto-suave); }
.con-boton { display: flex; gap: .5rem; flex-wrap: wrap; }
.con-boton input { flex: 1; width: auto; min-width: 10ch; }
/* Matrícula: se guarda en mayúsculas (`matricula.normaliza`); mostrarla ya en mayúsculas
   mientras se escribe evita el salto visual al guardar. Solo presentación (no toca el valor). */
.input-mayus { text-transform: uppercase; }
/* Recambios: un botón de proveedor por fila (uno debajo de otro), alineados a la izquierda. */
.acciones-recambios { display: flex; flex-direction: column; align-items: flex-start; gap: .5rem; margin: .6rem 0; }
.acciones-recambios .btn small { opacity: .85; font-weight: normal; }
.vin-copia { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }

/* Desplegables dependientes Marca→Modelo en el alta de vehículo */
.catalogo-rapido { display: flex; gap: 1rem; flex-wrap: wrap; }
.catalogo-rapido label { flex: 1; min-width: 160px; }
@media (max-width: 720px) {
  .catalogo-rapido { flex-direction: column; }
  .catalogo-rapido label { min-width: 0; flex: none; width: 100%; }
  .catalogo-rapido select { width: 100%; }
}

/* Bloques `<details>` discretos dentro de un formulario (campos manuales/de corrección que casi
   nunca hace falta abrir: marca/modelo a mano, trazabilidad RGPD…). Genérico y reutilizable. */
.form details summary, .form-grupo details summary { cursor: pointer; font-weight: 600; color: var(--azul); font-size: .88rem; }
.form details[open] summary, .form-grupo details[open] summary { margin-bottom: .6rem; }
.campos-en-fila { display: flex; gap: 1rem; flex-wrap: wrap; margin-top: .5rem; }
.campos-en-fila label { flex: 1; min-width: 160px; }
@media (max-width: 720px) {
  .campos-en-fila { flex-direction: column; }
  .campos-en-fila label { min-width: 0; flex: none; width: 100%; }
}

/* Ficha (tabla etiqueta/valor) */
.tabla.ficha th { background: #fafbfc; color: var(--texto-suave); font-weight: 600; width: 140px; text-transform: none; letter-spacing: 0; font-size: .9rem; }
.tabla.ficha td { font-size: .95rem; }
.acciones-cab { display: flex; gap: .5rem; align-items: center; }
/* Mini-form del botón "Hacer foto" (cámara): que no rompa el flex de .acciones-cab. */
.acciones-cab .form-foto-rapida { display: contents; }

/* Form ancho (ficha de edición): grid de 12 columnas; cada campo ocupa el ancho
   que le corresponde por su contenido (clases .campo-* abajo). Ver templatetag
   `anchos.py` (mapa name→clase). En estrecho colapsa todo a una columna. */
.form.form-ancho { max-width: 820px; display: grid; grid-template-columns: repeat(12, 1fr); gap: .7rem 1rem; }
/* Por defecto cada hijo directo ocupa la fila entera; las clases .campo-* lo estrechan. */
.form.form-ancho > * { grid-column: 1 / -1; }
.form textarea { padding: .5rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font: inherit; color: var(--tinta); resize: vertical; }
.error { color: var(--rojo); font-size: .85rem; }

/* Anchos de campo (span sobre el grid de 12 columnas de .form-ancho / .form-grupo).
   xs: códigos/%/años (≈2 caben en media fila) · sm: NIF/teléfono/fechas/precios ·
   md: media columna · lg: campo largo casi entero · full: fila completa.
   Aplican a cualquier hijo directo (label, p.aviso, div.catalogo-rapido…). */
.form.form-ancho > .campo-xs, .form-grupo > .campo-xs { grid-column: span 3; }
.form.form-ancho > .campo-sm, .form-grupo > .campo-sm { grid-column: span 4; }
.form.form-ancho > .campo-md, .form-grupo > .campo-md { grid-column: span 6; }
.form.form-ancho > .campo-lg, .form-grupo > .campo-lg { grid-column: span 8; }
.form.form-ancho > .campo-full, .form-grupo > .campo-full { grid-column: span 12; }
/* Toggle (checkbox): la etiqueta va en horizontal, ocupa media fila (input a la izda, texto a la dcha) */
.form.form-ancho > label.campo-check { grid-column: span 6; }
.form-grupo > label.campo-check { grid-column: span 12; }
.form.form-ancho > label.campo-check, .form-grupo > label.campo-check { flex-direction: row-reverse; align-items: center; justify-content: flex-end; gap: .5rem; }
.form.form-ancho > label.campo-check input, .form-grupo > label.campo-check input { width: auto; flex: 0 0 auto; }

/* Bloque agrupado dentro de un formulario ancho (dirección, RGPD, técnica…):
   fieldset sobrio que abarca toda la fila y contiene su propio sub-grid de 12. */
.form.form-ancho > .form-grupo { display: grid; grid-template-columns: repeat(12, 1fr); gap: .7rem 1rem; border: 1px solid var(--linea); border-radius: 10px; padding: .9rem 1rem 1rem; margin: 0; }
.form-grupo > legend { padding: 0 .4rem; font-size: .78rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--texto-suave); }
.form-grupo > * { grid-column: 1 / -1; }

/* Responsive: en pantallas estrechas, un solo campo por fila. */
@media (max-width: 720px) {
  .form.form-ancho, .form-grupo { grid-template-columns: 1fr; }
  .form.form-ancho > *, .form-grupo > * { grid-column: 1 / -1 !important; }
}

/* Atajo: programar próxima ITV / revisión */
.programar { display: flex; flex-wrap: wrap; gap: .8rem; align-items: end; margin-top: .6rem; padding: .8rem; background: #fff; border: 1px solid var(--linea); border-radius: 10px; }
.programar label { display: flex; flex-direction: column; gap: .25rem; font-size: .85rem; color: var(--texto-suave); }
.programar input { padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; }

/* Zona de peligro / botón destructivo */
.zona-peligro { margin-top: 1.6rem; padding-top: 1rem; border-top: 1px solid var(--linea); }
.btn-peligro { background: var(--rojo); }
.btn-peligro:hover { background: #8f1e17; }

/* Mini botón (borrar línea / cancelar cita): acción destructiva pequeña */
.btn-mini { background: #fde8e6; color: var(--rojo); padding: .15rem .5rem; border-radius: 6px; font-size: .9rem; line-height: 1.4; }
.btn-mini:hover { background: #f9d2ce; }
/* Chip de acción positiva pequeña (confirmar/cumplir/crear cita) */
.btn-chip { background: #e7f0fb; color: var(--azul); border: 1px solid #cdddf1; padding: .15rem .55rem; border-radius: 6px; font-size: .85rem; line-height: 1.4; }
.btn-chip:hover { background: #d8e6f8; }

/* Agenda: acciones en línea */
.acciones-fila { display: flex; gap: .4rem; flex-wrap: wrap; }
.acciones-fila form { margin: 0; }

/* Agenda: calendario mensual
   ------------------------------------------------------------------ */
/* Filtros (motivo / estado) */
.agenda-filtros { display: flex; flex-wrap: wrap; align-items: end; gap: 1rem; margin: .4rem 0 1.1rem; }
.agenda-filtros label { display: flex; flex-direction: column; gap: .3rem; font-size: .8rem; font-weight: 600; color: var(--texto-suave); }
.agenda-filtros select { padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .92rem; background: #fff; min-width: 170px; }
.agenda-filtros select:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.agenda-limpiar { font-size: .85rem; padding-bottom: .55rem; }

/* Contenedor del calendario */
.calendario { background: #fff; border: 1px solid var(--linea); border-radius: 14px; overflow: hidden; box-shadow: 0 1px 3px rgba(16,32,56,.05); }
.cal-cabecera { display: flex; align-items: center; gap: .6rem; padding: .9rem 1.1rem; border-bottom: 1px solid var(--linea); }
.cal-titulo { margin: 0; font-size: 1.25rem; font-weight: 700; min-width: 12rem; text-align: center; }
.cal-nav {
  display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px;
  border-radius: 9px; border: 1px solid var(--linea); background: #fff; color: var(--tinta);
  font-size: 1.4rem; line-height: 1; font-weight: 600;
}
.cal-nav:hover { background: var(--gris); text-decoration: none; border-color: #cdddf1; }
.cal-hoy { margin-left: auto; padding: .4rem .85rem; border: 1px solid #cdddf1; border-radius: 8px; background: #eef3fb; color: var(--azul); font-size: .85rem; font-weight: 600; }
.cal-hoy:hover { background: #d8e6f8; text-decoration: none; }

/* Rejilla 7×N */
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); }
.cal-dow { padding: .55rem .6rem; text-align: center; font-size: .72rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--texto-suave); background: #fafbfc; border-bottom: 1px solid var(--linea); }

.cal-dia {
  display: flex; flex-direction: column; gap: .25rem; min-height: 116px; padding: .4rem .45rem;
  border-right: 1px solid var(--linea); border-bottom: 1px solid var(--linea);
  color: var(--tinta); background: #fff; overflow: hidden;
}
.cal-dia:nth-child(7n) { border-right: 0; }   /* columna domingo */
.cal-dia:hover { background: #f3f8ff; text-decoration: none; }
.cal-dia.otro-mes { background: #fafbfc; color: #aab4c2; }
.cal-dia.otro-mes:hover { background: #f1f4f8; }
.cal-dia.sel { background: #eaf2fd; box-shadow: inset 0 0 0 2px var(--azul); }

.cal-num { font-size: .92rem; font-weight: 600; align-self: flex-start; line-height: 1.5; min-width: 1.6rem; text-align: center; }
.cal-dia.hoy .cal-num { background: var(--azul); color: #fff; border-radius: 50%; height: 1.6rem; }
.cal-dia.otro-mes .cal-num { color: #aab4c2; }

.cal-citas { display: flex; flex-direction: column; gap: .18rem; min-width: 0; }
.cal-chip {
  display: flex; align-items: center; gap: .3rem; font-size: .72rem; font-weight: 600;
  padding: .1rem .35rem; border-radius: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  /* hereda los colores del estado vía .estado-<estado> */
}
.cal-chip-punto { width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; background: currentColor; opacity: .85; }
.cal-mas { font-size: .7rem; color: #6b7891; font-weight: 600; padding-left: .2rem; }

/* Detalle del día seleccionado */
.agenda-dia { margin-top: 1.6rem; }
.agenda-dia h2 { text-transform: capitalize; }
.agenda-pista { margin-top: 1.4rem; color: #6b7891; }
.vacio-dia { color: #6b7891; }

/* Reservas / bloqueos de agenda */
.estado-reservado, .cal-chip.reservado { background: #e7e9ef; color: #39414f; }
.cal-dia.con-reserva { background: repeating-linear-gradient(135deg, transparent, transparent 8px, rgba(57,65,79,.05) 8px, rgba(57,65,79,.05) 16px); }
.reservas-titulo { margin: 1.2rem 0 .4rem; font-size: 1rem; }
.reservas-lista { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4rem; }
.reserva-item { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }
.reserva-item form { margin: 0; }
.reserva-nota { color: var(--texto-suave); }
.reservar-cta { margin-top: 1rem; }

/* Modal genérico (citas del día en la agenda, etc.) */
.modal-overlay { position: fixed; inset: 0; background: var(--azul-a45); display: flex; align-items: flex-start; justify-content: center; padding: 4vh 1rem; z-index: 1000; overflow: auto; }
.modal-overlay[hidden] { display: none; }
.modal-caja { background: #fff; border-radius: 12px; max-width: 860px; width: 100%; padding: 1.2rem 1.4rem; box-shadow: 0 12px 48px rgba(0, 0, 0, .28); position: relative; }
.modal-cerrar { position: absolute; top: .5rem; right: .5rem; background: transparent; color: var(--texto-suave); border: 0; font-size: 1.15rem; cursor: pointer; padding: .2rem .5rem; }
.modal-cerrar:hover { color: var(--azul); background: transparent; }

/* Lightbox genérico de fotos (galerías OR/presupuesto/vehículo, ver `lightbox.js`). Overlay
   ÚNICO por página, vive en `base.html`; las miniaturas de cada galería son sus disparadores
   (`data-lb-zoom`). Mismo patrón que `.ayuda-lightbox`, con clases genéricas reutilizables
   también en el portal (ver el bloque equivalente en `portal.css`). */
.lb-overlay { position: fixed; inset: 0; background: var(--azul-a45); display: flex; align-items: center; justify-content: center; padding: 2.5vh 3vw; z-index: 1000; cursor: zoom-out; }
.lb-overlay[hidden] { display: none; }
.lb-caja { display: flex; flex-direction: column; align-items: center; gap: .5rem; max-width: 95vw; max-height: 90vh; cursor: default; }
.lb-barra { display: flex; justify-content: flex-end; width: 100%; }
.lb-cerrar { background: #fff; color: var(--tinta); border: 0; border-radius: 8px; padding: .45rem .9rem; font-size: .92rem; font-weight: 600; cursor: pointer; box-shadow: 0 4px 14px rgba(0, 0, 0, .25); }
.lb-cerrar:hover, .lb-cerrar:focus-visible { background: var(--gris); }
.lb-caja img { display: block; max-width: 95vw; max-height: 78vh; width: auto; height: auto; object-fit: contain; border-radius: 10px; box-shadow: 0 12px 48px rgba(0, 0, 0, .35); background: #fff; }
.lb-pie { margin: 0; color: #fff; font-size: .92rem; text-align: center; max-width: 90vw; }
.lb-pie:empty { display: none; }

/* Buscador global de la bandeja del taller */
.bandeja-buscar { display: block; margin: .2rem 0 1.1rem; }
.bandeja-buscar input { width: 100%; max-width: 480px; padding: .5rem .7rem; border: 1px solid #d7dce5; border-radius: 8px; font-size: .95rem; }
.bandeja-fila[hidden], .bandeja-fila-extra[hidden] { display: none; }

/* Editar / mover una cita: resumen de contexto sobre el formulario. */
.cita-editar-resumen { margin: .4rem 0 1.2rem; }
.cita-editar-resumen p { margin: .2rem 0; }
.cita-editar-resumen .nota { color: #6b7891; font-size: .9rem; }

/* Responsive: en móvil la rejilla se rompe; pasamos a una lista vertical por día. */
@media (max-width: 720px) {
  .cal-grid { grid-template-columns: 1fr; }
  .cal-dow { display: none; }
  .cal-dia { min-height: auto; flex-direction: row; align-items: flex-start; gap: .7rem; border-right: 0; }
  .cal-dia.otro-mes { display: none; }   /* en lista no aportan los días vecinos */
  .cal-num { min-width: 2.2rem; }
  .cal-citas { flex: 1; }
  .cal-chip { white-space: normal; }
}

/* Avisos: plazos y filas vencidas */
tr.fila-vencida td { background: #fdf3f2; }
.badge-vencido { background: #fde8e6; color: var(--rojo); padding: .1rem .5rem; border-radius: 999px; font-size: .8rem; font-weight: 600; }
.badge-hoy { background: #fff4e5; color: var(--ambar); padding: .1rem .5rem; border-radius: 999px; font-size: .8rem; font-weight: 600; }
.kpi-alerta .num { color: var(--rojo); }

/* Pestañas (fichas de detalle). Reutilizable: ".tabs" envuelve ".tabs-barra"
   (los botones [role=tab]) + uno o varios ".tab-panel". Barra tipo "underline".
   Todos los paneles quedan en el DOM (HTMX dentro de un panel oculto sigue ok). */
.tabs { margin-top: 1.2rem; }
.tabs-barra { display: flex; flex-wrap: wrap; gap: .2rem; border-bottom: 1px solid var(--linea); margin-bottom: 1.1rem; }
.tabs-barra [role=tab] {
  background: none; border: 0; border-bottom: 2px solid transparent; color: var(--texto-suave);
  padding: .55rem .9rem; font-size: .95rem; font-weight: 600; cursor: pointer; border-radius: 0;
  margin-bottom: -1px;
}
.tabs-barra [role=tab]:hover { background: var(--gris); color: var(--tinta); }
.tabs-barra [role=tab][aria-selected="true"] { color: var(--azul); border-bottom-color: var(--azul); background: none; }
.tabs-barra [role=tab]:focus-visible { outline: 2px solid var(--azul); outline-offset: -2px; border-radius: 6px 6px 0 0; }
.tab-panel[hidden] { display: none; }
/* El primer h2 de un panel no necesita el margen superior (ya hay separación). */
.tab-panel > h2:first-child { margin-top: 0; }

/* Ficha de OR: layout en dos columnas (documento | vehículo + pestañas)
   ------------------------------------------------------------------
   Izquierda (flexible, min 0) = el "documento": cabecera + líneas + totales.
   Derecha (ancho fijo) = tarjeta del vehículo + bloque de pestañas.
   En pantallas <=1100px colapsa a una columna (derecha debajo). */
.or-layout { display: grid; grid-template-columns: minmax(0, 1fr) 440px; gap: 1.6rem; align-items: start; }
.or-doc { min-width: 0; }
.or-doc-meta {
  display: flex; flex-wrap: wrap; gap: .4rem 1.6rem; margin: .9rem 0 .2rem;
  padding: .8rem 1.1rem; background: #fff; border: 1px solid var(--linea);
  border-radius: 12px; box-shadow: 0 1px 3px rgba(16,32,56,.05);
}
.or-doc-dato { display: inline-flex; align-items: baseline; gap: .45rem; font-size: .92rem; min-width: 0; }
.or-doc-lbl { font-size: .7rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--texto-suave); }
.or-doc-averia { flex-basis: 100%; color: var(--texto-suave); }
.or-lateral { display: flex; flex-direction: column; gap: 1.2rem; min-width: 0; }

/* Tarjeta del vehículo (cabecera de la columna derecha, estilo ficha técnica) */
.vehiculo-card {
  display: flex; align-items: center; gap: 1rem; background: #fff;
  border: 1px solid var(--linea); border-radius: 14px; padding: 1rem 1.2rem;
  box-shadow: 0 1px 3px rgba(16,32,56,.05);
}
.vehiculo-card-datos { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
.vehiculo-card-nombre { font-size: 1.08rem; font-weight: 700; line-height: 1.25; }
.vehiculo-card-matricula {
  align-self: flex-start; font-family: ui-monospace, "Cascadia Code", monospace;
  font-weight: 700; letter-spacing: .06em; font-size: .92rem;
  border: 2px solid var(--tinta); border-radius: 6px; padding: .05rem .5rem; background: #fff;
}
.vehiculo-card-meta { color: var(--texto-suave); font-size: .88rem; }
.vehiculo-card-meta:empty { display: none; }
.vehiculo-card-enlace { font-size: .88rem; font-weight: 600; }

/* El bloque de pestañas de la derecha va en su propia tarjeta; tabs algo más compactas
   (caben Vehículo · Tareas · Informe · Fotos · Detalles… y las que vengan). */
.or-lateral .tabs {
  margin-top: 0; background: #fff; border: 1px solid var(--linea); border-radius: 14px;
  padding: 1.1rem 1.2rem 1.3rem; box-shadow: 0 1px 3px rgba(16,32,56,.05);
}
.or-tabs .tabs-barra { gap: .1rem; }
.or-tabs .tabs-barra [role=tab] { padding: .5rem .65rem; font-size: .9rem; }

/* Pestaña Vehículo: recepción (km, combustible, estado general, inventario) */
.recepcion-bloque { margin-bottom: 1.2rem; }
.recepcion-bloque:last-child { margin-bottom: 0; }
.bloque-titulo { margin: 0 0 .45rem; font-size: .74rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--texto-suave); }
.km-ingreso { display: flex; gap: .5rem; align-items: center; }
.km-ingreso input { flex: 1; min-width: 0; padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; color: var(--tinta); }
.km-ingreso input:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.recepcion-ro { margin: 0; font-weight: 600; }

/* Barra de combustible E→F: 8 segmentos clicables + porcentaje en verde */
.combustible-medidor { display: flex; align-items: center; gap: .6rem; }
.combustible-barra { display: flex; gap: 3px; flex: 1; min-width: 0; }
.combustible-seg { flex: 1 1 0; height: 26px; padding: 0; border: 1px solid var(--linea); border-radius: 4px; background: #eef1f5; }
button.combustible-seg { cursor: pointer; }
button.combustible-seg:hover { background: #d9efe1; border-color: var(--verde); }
.combustible-seg.lleno, button.combustible-seg.lleno:hover { background: linear-gradient(180deg, #34a85e, var(--verde)); border-color: #0f5e2a; }
.combustible-pct { flex: 0 0 auto; min-width: 2.8rem; text-align: right; font-weight: 700; color: var(--verde); font-variant-numeric: tabular-nums; }
.combustible-escala { display: flex; justify-content: space-between; margin-top: .3rem; font-size: .72rem; font-weight: 700; color: var(--texto-suave); }

/* Estado general del vehículo (textarea + guardar) */
.estado-vehiculo-form { display: flex; flex-direction: column; gap: .5rem; align-items: flex-start; }
.estado-vehiculo-form textarea { width: 100%; padding: .5rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font: inherit; color: var(--tinta); resize: vertical; }
.estado-vehiculo-form textarea:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }

/* Inventario del vehículo: checklist en rejilla (se guarda al cambiar) */
.inventario-check { display: grid; grid-template-columns: repeat(2, 1fr); gap: .25rem .9rem; margin: 0; }
.inventario-item { display: flex; align-items: center; gap: .45rem; padding: .18rem 0; font-size: .9rem; color: var(--tinta); cursor: pointer; }
.inventario-item input[type="checkbox"] { width: 1rem; height: 1rem; margin: 0; flex: 0 0 auto; accent-color: var(--azul); cursor: pointer; }
.inventario-item input[type="checkbox"][disabled] { cursor: default; }

@media (max-width: 1100px) {
  .or-layout { grid-template-columns: 1fr; }
  .inventario-check { grid-template-columns: repeat(3, 1fr); }  /* a todo el ancho caben 3 */
}
@media (max-width: 720px) {
  .inventario-check { grid-template-columns: 1fr 1fr; }
}

/* Pestaña Inspección de carrocería: croquis del vehículo (3 estilos) + pins por severidad.
   El `estilo` (esquema/realista/volumen) lo decide el servidor (?estilo=) y cambia la
   carpeta SVG + la clase del lienzo (fondo/glow/reflejo). La pintura y el fondo son
   presentación efímera (CSS vars que pone inspeccion.js). Cada pin va absoluto en
   left/top % del viewBox, centrado con translate(-50%,-50%) (mismo criterio que el JS). */
.inspeccion-cabecera { display: flex; align-items: center; justify-content: space-between; gap: .6rem; margin-bottom: .6rem; flex-wrap: wrap; }
.inspeccion-estilos { display: inline-flex; background: #eef1f5; border: 1px solid var(--linea); border-radius: 10px; padding: 3px; gap: 2px; }
.estilo-pill { border: 0; background: transparent; padding: .34rem .55rem; border-radius: 7px; font-size: .8rem; font-weight: 600; color: var(--texto-suave); cursor: pointer; display: inline-flex; align-items: center; gap: .35rem; }
.estilo-pill .estilo-sw { width: 12px; height: 12px; border-radius: 50%; border: 1px solid rgba(0,0,0,.12); }
.estilo-pill.activo { background: #fff; color: var(--azul); box-shadow: 0 1px 2px rgba(16,32,56,.12); }
.inspeccion-vistas { display: flex; flex-wrap: wrap; gap: .3rem; margin-bottom: .7rem; }
.vista-pill {
  border: 1px solid var(--linea); background: #fff; color: var(--texto-suave); border-radius: 999px;
  padding: .28rem .6rem; font-size: .8rem; font-weight: 600; cursor: pointer;
  display: inline-flex; align-items: center; gap: .35rem;
}
.vista-pill:hover { border-color: var(--azul); color: var(--azul); }
.vista-pill.activa { background: var(--accion, var(--azul));
  border-color: var(--accion, var(--azul)); color: #fff; }
.vista-pill .pill-num {
  display: inline-flex; align-items: center; justify-content: center; min-width: 1.05rem;
  height: 1.05rem; padding: 0 .2rem; border-radius: 999px; background: var(--azul-a12);
  color: var(--azul); font-size: .68rem; font-variant-numeric: tabular-nums;
}
.vista-pill.activa .pill-num { background: rgba(255,255,255,.25); color: #fff; }

.inspeccion-lienzo {
  position: relative; border: 1px solid var(--linea); border-radius: 14px; overflow: hidden;
  box-shadow: 0 1px 3px rgba(16,32,56,.05);
  background: radial-gradient(120% 120% at 50% 0%, #fbfcfd 0%, #eef2f6 70%, #e7ecf1 100%);
}
.inspeccion-lienzo.editable { cursor: crosshair; }
.inspeccion-lienzo::before {
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .5; z-index: 0;
  background-image: linear-gradient(var(--linea) 1px, transparent 1px), linear-gradient(90deg, var(--linea) 1px, transparent 1px);
  background-size: 22px 22px;
  -webkit-mask-image: radial-gradient(120% 100% at 50% 45%, #000 55%, transparent 92%);
  mask-image: radial-gradient(120% 100% at 50% 45%, #000 55%, transparent 92%);
}
.insp-corner { position: absolute; width: 18px; height: 18px; border: 2px solid var(--azul); opacity: .35; pointer-events: none; z-index: 2; }
.insp-corner.tl { top: 10px; left: 10px; border-right: 0; border-bottom: 0; border-radius: 6px 0 0 0; }
.insp-corner.tr { top: 10px; right: 10px; border-left: 0; border-bottom: 0; border-radius: 0 6px 0 0; }
.insp-corner.bl { bottom: 10px; left: 10px; border-right: 0; border-top: 0; border-radius: 0 0 0 6px; }
.insp-corner.br { bottom: 10px; right: 10px; border-left: 0; border-top: 0; border-radius: 0 0 6px 0; }
.insp-vista-tag {
  position: absolute; top: 10px; left: 50%; transform: translateX(-50%); z-index: 2;
  background: var(--azul-a90); color: #fff; font-size: .64rem; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; padding: .2rem .55rem; border-radius: 999px; pointer-events: none;
}
.insp-glow {
  position: absolute; left: 50%; top: 62%; width: 62%; height: 36%; transform: translate(-50%, -50%);
  border-radius: 50%; background: radial-gradient(ellipse, rgba(63,121,200,.55), transparent 70%);
  filter: blur(14px); opacity: 0; pointer-events: none; z-index: 0;
}
.inspeccion-stage { position: relative; z-index: 1; padding: 28px 18px 24px; display: flex; align-items: center; justify-content: center; min-height: 240px; }
.inspeccion-svg { display: block; width: 84%; max-width: 360px; height: auto; user-select: none; filter: drop-shadow(0 14px 18px rgba(20,40,70,.18)); transition: opacity .2s; }

/* estilo Color (realista): fondo claro de estudio y reflejo suave bajo la carrocería */
.inspeccion-lienzo.estilo-realista { background: var(--insp-fondo, radial-gradient(120% 120% at 50% 0%, #ffffff 0%, #eef2f7 68%, #e4eaf1 100%)); }
.estilo-realista .inspeccion-svg { filter: drop-shadow(0 16px 20px rgba(20,40,70,.22)) var(--insp-tint,); -webkit-box-reflect: below 3px linear-gradient(transparent 66%, rgba(20,40,70,.14)); }
.estilo-realista.fondo-oscuro .insp-corner { border-color: #7fb0e6; opacity: .5; }
.estilo-realista.fondo-oscuro .insp-vista-tag { background: rgba(255,255,255,.16); }

/* estilo Volumen: showroom oscuro, glow inferior y reflejo en el suelo */
.inspeccion-lienzo.estilo-volumen { background: var(--insp-fondo, radial-gradient(120% 130% at 50% 22%, #1a3a5e 0%, var(--azul) 60%, #08182c 100%)); }
.estilo-volumen::before { opacity: .13; }
.estilo-volumen .insp-vista-tag { background: rgba(255,255,255,.16); }
.estilo-volumen .insp-corner { border-color: #7fb0e6; opacity: .5; }
.estilo-volumen .insp-glow { opacity: 1; }
.estilo-volumen .inspeccion-svg { filter: drop-shadow(0 22px 26px rgba(0,0,0,.5)) var(--insp-tint,); -webkit-box-reflect: below 4px linear-gradient(transparent 52%, rgba(160,200,240,.20)); }
.estilo-volumen.fondo-claro::before { opacity: .4; }
.estilo-volumen.fondo-claro .insp-glow { opacity: 0; }
.estilo-volumen.fondo-claro .insp-corner { border-color: var(--azul); opacity: .32; }
.estilo-volumen.fondo-claro .insp-vista-tag { background: var(--azul-a90); }

/* pins de daño coloreados por severidad (gota invertida, como el mockup) */
.inspeccion-pin {
  position: absolute; transform: translate(-50%, -50%); rotate: 45deg;
  width: 24px; height: 24px; border-radius: 50% 50% 50% 2px; color: #fff; border: 2px solid #fff;
  box-shadow: 0 3px 8px rgba(20,40,70,.35); display: flex; align-items: center; justify-content: center;
  font-size: .74rem; font-weight: 700; line-height: 1; cursor: pointer; transition: transform .12s ease; z-index: 3;
}
.inspeccion-pin > span { rotate: -45deg; line-height: 1; }
.inspeccion-pin:hover { transform: translate(-50%, -50%) scale(1.18); z-index: 5; }
.inspeccion-pin.sev-leve { background: #137333; }
.inspeccion-pin.sev-moderado { background: var(--naranja); }
.inspeccion-pin.sev-grave { background: var(--rojo); }

/* pie del lienzo: leyenda (severidad activa para nuevos pins) + pintura + fondo */
.inspeccion-foot { display: flex; align-items: center; gap: .8rem; margin-top: .7rem; flex-wrap: wrap; }
.inspeccion-leyenda { display: flex; gap: .35rem; }
.leyenda-sev { border: 0; background: transparent; display: inline-flex; align-items: center; gap: .4rem; font-size: .8rem; color: var(--texto-suave); cursor: pointer; font-weight: 600; padding: .2rem .4rem; border-radius: 999px; }
.leyenda-sev .dot { width: 12px; height: 12px; border-radius: 50%; }
.leyenda-sev.on { background: var(--azul-a07); color: var(--tinta); }
.leyenda-sev.on .dot { box-shadow: 0 0 0 3px var(--azul-a14); }
.dot.leve { background: #137333; } .dot.moderado { background: var(--naranja); } .dot.grave { background: var(--rojo); }
.inspeccion-pintura, .inspeccion-fondo { display: inline-flex; align-items: center; gap: .35rem; flex-wrap: wrap; }
.inspeccion-pintura .lbl, .inspeccion-fondo .lbl { font-size: .72rem; color: var(--texto-suave); font-weight: 600; }
.insp-sw { width: 18px; height: 18px; padding: 0; border-radius: 50%; cursor: pointer; border: 2px solid #fff; box-shadow: 0 1px 4px rgba(20,40,70,.3), 0 0 0 1px rgba(0,0,0,.08); transition: transform .12s; }
.insp-sw:hover { transform: scale(1.14); }
.insp-sw.activo { box-shadow: 0 0 0 2px var(--azul), 0 1px 4px rgba(20,40,70,.3); }
.inspeccion-ayuda { margin: .5rem 0 0; color: var(--texto-suave); font-size: .82rem; }

/* lista de daños: cabecera + resumen por severidad + filas */
.inspeccion-lista-head { display: flex; align-items: baseline; justify-content: space-between; margin: 1rem 0 .5rem; }
.inspeccion-lista-head h3 { margin: 0; font-size: 1rem; }
.inspeccion-lista-head .cnt { font-size: .78rem; color: var(--texto-suave); }
.inspeccion-resumen { display: flex; gap: .5rem; margin-bottom: .6rem; }
.res-chip { flex: 1; border-radius: 10px; padding: .5rem; text-align: center; }
.res-chip .v { font-weight: 700; font-size: 1.25rem; line-height: 1; font-variant-numeric: tabular-nums; }
.res-chip .l { font-size: .62rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; margin-top: .2rem; }
.res-chip.leve { background: #e6f4ea; color: #137333; }
.res-chip.moderado { background: #fff1e9; color: #b5521f; }
.res-chip.grave { background: #fde8e6; color: var(--rojo); }
.inspeccion-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .4rem; max-height: 360px; overflow: auto; }
.inspeccion-punto { display: flex; align-items: flex-start; gap: .55rem; padding: .5rem; border: 1px solid var(--linea); border-radius: 10px; background: #fff; }
.inspeccion-punto.resaltada { border-color: var(--naranja); background: #fff8f4; box-shadow: 0 0 0 3px var(--naranja-a10); }
.pin-mini {
  flex: 0 0 auto; rotate: 45deg; width: 20px; height: 20px; border-radius: 50% 50% 50% 2px;
  color: #fff; font-size: .68rem; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; line-height: 1;
}
.pin-mini > span { rotate: -45deg; line-height: 1; }
.pin-mini.sev-leve { background: #137333; } .pin-mini.sev-moderado { background: var(--naranja); } .pin-mini.sev-grave { background: var(--rojo); }
.punto-cuerpo { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .3rem; }
.punto-meta { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.inspeccion-vista-lbl { color: var(--texto-suave); font-size: .68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; }
.sevb { font-size: .64rem; font-weight: 700; padding: .05rem .4rem; border-radius: 999px; }
.sevb.sev-leve { background: #e6f4ea; color: #137333; } .sevb.sev-moderado { background: #fff1e9; color: #b5521f; } .sevb.sev-grave { background: #fde8e6; color: var(--rojo); }
.sev-select { font-size: .7rem; font-weight: 600; padding: .08rem .4rem; border-radius: 999px; border: 1px solid var(--linea); cursor: pointer; }
.sev-select.sev-leve { background: #e6f4ea; color: #137333; border-color: #bfe3cb; }
.sev-select.sev-moderado { background: #fff1e9; color: #b5521f; border-color: #ffd6bf; }
.sev-select.sev-grave { background: #fde8e6; color: var(--rojo); border-color: #f5c6c2; }
.inspeccion-desc { width: 100%; padding: .3rem .45rem; border: 1px solid var(--linea); border-radius: 6px; font-size: .85rem; color: var(--tinta); }
.inspeccion-desc:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.inspeccion-desc-ro { font-size: .85rem; color: var(--tinta); }
.punto-acciones { display: flex; flex-direction: column; gap: .25rem; flex: 0 0 auto; align-items: stretch; }
.punto-del { width: 26px; height: 26px; border-radius: 7px; border: 0; background: #eef1f5; color: var(--texto-suave); cursor: pointer; font-size: .8rem; line-height: 1; }
.punto-del:hover { background: #fde8e6; color: var(--rojo); }
.inspeccion-vacio { margin: .6rem 0 0; padding: 1.4rem 1rem; text-align: center; color: var(--texto-suave); font-size: .85rem; border: 1px dashed var(--linea); border-radius: 12px; }

/* Edición inline de una línea de OR */
.fila-edicion td { background: #f3f8ff; }
.fila-edicion input, .fila-edicion select { width: 100%; padding: .35rem .45rem; border: 1px solid #cdddf1; border-radius: 6px; font-size: .9rem; }
.fila-edicion .num input { text-align: right; }

/* Alta de línea en la OR */
.form-linea { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-top: .8rem; padding: .8rem; background: #fff; border: 1px solid var(--linea); border-radius: 10px; }
.form-linea select, .form-linea input { padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; }
.form-linea input[name="descripcion"] { flex: 1; min-width: 180px; }

/* Maestros de Configuración (Familias/Tipos/Ubicaciones): código estable e inmutable */
.codigo-fijo { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .85rem; color: #5a636e; background: #f1f3f6; padding: .1rem .4rem; border-radius: 6px; }
.form-linea .campo-codigo { display: inline-flex; flex-direction: column; gap: 2px; }
.ayuda-campo { color: #6b7891; font-size: .72rem; }

/* Checklist de tareas de la OR */
.checklist { list-style: none; margin: .5rem 0 0; padding: 0; }
.checklist-item { display: flex; align-items: center; gap: .6rem; padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; background: #fff; margin-bottom: .4rem; }
.checklist-item input[type="checkbox"] { width: 1.1rem; height: 1.1rem; flex: 0 0 auto; accent-color: var(--azul); cursor: pointer; }
/* La casilla y el texto van dentro de un <label> (clic en el texto también marca la tarea). */
.checklist-etiqueta { display: flex; align-items: center; gap: .6rem; flex: 1; cursor: pointer; min-width: 0; }
.checklist-item .checklist-texto { flex: 1; }
.checklist-item.hecha .checklist-texto { text-decoration: line-through; color: #8a93a0; }
.checklist-vacio { color: var(--texto-suave); padding: .45rem .6rem; }
.form-tarea { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-top: .8rem; padding: .8rem; background: #fff; border: 1px solid var(--linea); border-radius: 10px; }
.form-tarea input { flex: 1; min-width: 200px; padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; }
.informe-texto { white-space: pre-wrap; }

/* Galería de fotos de la OR */
.galeria-fotos { list-style: none; margin: .5rem 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: .7rem; }
.foto-item { position: relative; display: flex; flex-direction: column; gap: .3rem; }
/* `.foto-enlace` es un `<button>` (disparador del lightbox, ver `lightbox.js`), NUNCA un
   `<a target="_blank">`: en el escritorio (PyWebView) eso atrapaba al usuario sin poder volver. */
.foto-enlace { display: block; width: 100%; border: 1px solid var(--linea); border-radius: 10px; overflow: hidden; background: #fff; padding: 0; cursor: zoom-in; text-align: left; }
.foto-item img { display: block; width: 100%; height: 120px; object-fit: cover; }
.foto-item img.foto-rota { display: flex; align-items: center; justify-content: center; }
.foto-enlace:has(img.foto-rota) { position: relative; }
.foto-enlace:has(img.foto-rota)::after { content: "Imagen no disponible"; display: flex; align-items: center; justify-content: center; height: 120px; padding: .4rem; font-size: .78rem; color: #8a93a0; background: repeating-linear-gradient(45deg, #f4f5f7, #f4f5f7 8px, #eceef2 8px, #eceef2 16px); text-align: center; }
.foto-pie { font-size: .8rem; color: var(--texto-suave); }
.foto-borrar { position: absolute; top: .35rem; right: .35rem; }
.form-foto { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-top: .8rem; padding: .8rem; background: #fff; border: 1px solid var(--linea); border-radius: 10px; }
.form-foto input[name="descripcion"] { flex: 1; min-width: 180px; padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; }
.form-foto input[type="file"] { font-size: .9rem; }

/* Aprobación del cliente por línea (OR): chips ✓/⊘. Informativa: la fila rechazada
   se atenúa y la descripción se tacha, pero los importes y los totales NO cambian. */
.aprobacion-col { width: 4rem; text-align: center; }
td.aprobacion { white-space: nowrap; text-align: center; }
.chip-aprobacion {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.55rem; height: 1.55rem; padding: 0; border-radius: 999px;
  border: 1px solid var(--linea); background: #f3f5f8; color: #9aa6b5;
  font-size: .85rem; line-height: 1;
}
button.chip-aprobacion { cursor: pointer; }
button.chip-aprobacion:hover { border-color: #9aa6b5; color: var(--texto-suave); }
.chip-aprobacion.chip-ok.activo { background: var(--verde); border-color: var(--verde); color: #fff; }
.chip-aprobacion.chip-no.activo { background: var(--rojo); border-color: var(--rojo); color: #fff; }
.fila-rechazada { opacity: .55; }
.fila-rechazada td:first-child { text-decoration: line-through; }

/* Notas internas de la OR (pestaña Notas): alta arriba + timeline sutil */
.form-nota { display: flex; flex-direction: column; gap: .5rem; align-items: flex-start; }
.form-nota textarea { width: 100%; padding: .5rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font: inherit; color: var(--tinta); resize: vertical; }
.form-nota textarea:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.notas-timeline { list-style: none; margin: 1rem 0 0 .25rem; padding: 0 0 0 .95rem; border-left: 2px solid var(--linea); display: flex; flex-direction: column; gap: .65rem; }
.nota-item { position: relative; padding-bottom: .65rem; border-bottom: 1px dashed var(--linea); }
.nota-item:last-child { border-bottom: 0; padding-bottom: 0; }
.nota-item::before { content: ""; position: absolute; left: -1.28rem; top: .4rem; width: 8px; height: 8px; border-radius: 50%; background: var(--azul); }
.nota-meta { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
.nota-fecha { font-size: .76rem; color: var(--texto-suave); font-variant-numeric: tabular-nums; }
.nota-texto { margin: .15rem 0 0; font-size: .92rem; }
.notas-vacio { margin: .9rem 0 0; color: var(--texto-suave); font-size: .9rem; }

/* Citas del vehículo en la ficha de OR (pestaña Citas): alta rápida + historial */
.form-cita-or { display: flex; flex-wrap: wrap; gap: .5rem .6rem; align-items: flex-end; padding: .8rem; background: #fff; border: 1px solid var(--linea); border-radius: 10px; }
.form-cita-or label { display: flex; flex-direction: column; gap: .25rem; font-size: .78rem; font-weight: 600; color: var(--texto-suave); }
.form-cita-or input, .form-cita-or select { padding: .4rem .55rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .9rem; color: var(--tinta); }
.form-cita-or .campo-desc { flex: 1 1 100%; }
.form-cita-or .campo-desc input { width: 100%; }
.form-cita-or .btn-chip { margin-left: auto; }
.citas-or-lista { list-style: none; margin: .9rem 0 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }
.cita-or-item { padding: .55rem .7rem; border: 1px solid var(--linea); border-radius: 10px; background: #fff; }
.cita-or-linea { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.cita-or-fecha { font-weight: 700; font-variant-numeric: tabular-nums; }
.cita-or-motivo { color: var(--texto-suave); font-size: .9rem; }
.cita-or-linea .estado { margin-left: auto; }
.cita-or-desc { margin: .3rem 0 0; font-size: .85rem; color: var(--texto-suave); }
.cita-or-acciones { display: flex; gap: .4rem; margin-top: .45rem; }
.cita-or-acciones form { display: inline; }
.citas-or-vacio { margin: .9rem 0 0; color: var(--texto-suave); font-size: .9rem; }

code { background: #eef1f5; padding: .1rem .35rem; border-radius: 5px; font-family: ui-monospace, "Cascadia Code", monospace; }

/* Informes y estadísticas
   ----------------------------------------------------------------------------- */
.acciones-cabecera { display: flex; gap: .5rem; flex-wrap: wrap; }
.acciones-cabecera .btn-claro { margin-top: 0; }

/* Filtro de fechas (presets + rango) */
.informe-filtro {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 1rem 1.5rem;
  background: #fff; border: 1px solid var(--linea); border-radius: 12px;
  padding: .9rem 1.1rem; margin: 1rem 0 1.4rem;
}
.informe-presets { display: flex; gap: .4rem; flex-wrap: wrap; }
.informe-presets .btn-chip { cursor: pointer; }
.informe-presets .btn-chip.activo { background: var(--accion, var(--azul)); color: #fff;
  border-color: var(--accion, var(--azul)); }
.informe-rango { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .8rem; }
.informe-rango label { display: flex; flex-direction: column; gap: .25rem; font-size: .85rem; color: var(--texto-suave); }
.informe-rango input[type="date"] {
  padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px;
  font-size: .95rem; color: var(--tinta); background: #fff;
}

/* Secciones del informe */
.informe-seccion { margin-bottom: 2rem; }
.informe-seccion h2 { margin-top: 1.4rem; }
.informe-bloque h3 { font-size: 1rem; color: var(--texto-suave); margin: .6rem 0 .4rem; }

/* Rejilla gráfica + tabla; en órdenes, dos bloques lado a lado */
.informe-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: 1.5rem; align-items: start; }
.informe-grid-2 { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.informe-lateral { display: flex; flex-direction: column; gap: .8rem; }

/* Columnas a la misma altura (la gráfica crece para igualar la tabla del otro lado). */
.informe-grid-stretch { align-items: stretch; }
.informe-lateral-graf { min-width: 0; }
/* Fila de dos KPIs (aceptados / rechazados) sobre el donut, misma altura que el KPI destacado. */
.informe-kpi-fila { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; }
.informe-kpi-fila .kpi { min-width: 0; }

/* Caja de la gráfica (altura acotada para que Chart.js no crezca sin fin) */
.informe-grafica {
  background: #fff; border: 1px solid var(--linea); border-radius: 12px;
  padding: 1rem; position: relative; height: 260px;
}
/* La gráfica crece para llenar el alto restante de la columna (columnas equilibradas). */
.informe-grafica-crece { flex: 1 1 auto; height: auto; min-height: 240px; }
.informe-grafica-ancha { height: 300px; margin-top: .6rem; }
.informe-grafica canvas { max-width: 100%; }

/* Tarjeta envolvente de un bloque de órdenes (por estado / por tipo): ambas igual de altas. */
.informe-card {
  display: flex; flex-direction: column; gap: .2rem;
  background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1rem 1.1rem;
}
.informe-card h3 { margin: 0 0 .4rem; }
.informe-card .informe-grafica { border: 0; padding: 0; background: none; }
.informe-card .tabla { margin-top: .8rem; }

/* KPI destacado (tasa de conversión) */
.kpi-destacado { background: linear-gradient(135deg, #eef5ff, #fff); border-color: #cdddf1; }
.kpi-destacado .num { font-size: 2.4rem; }

@media (max-width: 900px) {
  .informe-grid, .informe-grid-2 { grid-template-columns: minmax(0, 1fr); }
  .informe-grafica-crece { min-height: 260px; }
}

/* Dashboard de Inicio (filtros + gráficas + 'Próximos')
   ----------------------------------------------------------------------------- */
/* Filtros (rango de fechas + estados). Form GET que recarga (robusto con Chart.js). */
.dash-filtro {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 1rem 1.8rem;
  background: #fff; border: 1px solid var(--linea); border-radius: 12px;
  padding: .9rem 1.1rem; margin: 1.2rem 0 1.4rem;
}
.dash-rango, .dash-estados { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .8rem; }
.dash-filtro label { display: flex; flex-direction: column; gap: .25rem; font-size: .85rem; color: var(--texto-suave); }
.dash-filtro input[type="date"], .dash-filtro select {
  padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px;
  font-size: .95rem; color: var(--tinta); background: #fff;
}

/* Rejilla de gráficas: 2 columnas en escritorio, 1 en móvil. minmax(0,1fr) para que
   el min-content de canvas/tablas no infle la pista (overflow global en móvil). */
.dash-graficas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.3rem; margin-bottom: 1.8rem; }
.dash-card {
  background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1rem 1.1rem;
}
.dash-card h3 { margin: 0 0 .6rem; font-size: 1rem; color: var(--texto-suave); }
/* Caja de gráfica con alto acotado (Chart.js con maintainAspectRatio:false crece a este alto). */
.dash-grafica { position: relative; height: 260px; }
.dash-grafica canvas { max-width: 100%; }

/* 'Próximos': dos tarjetas (citas + avisos) lado a lado. */
.dash-proximos { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.3rem; margin-bottom: 1.8rem; }
.dash-proximos .cabecera { margin-bottom: .4rem; }
.dash-proximos .cabecera h3 { margin: 0; font-size: 1rem; color: var(--texto-suave); }
.dash-proximos .btn-claro { margin-top: 0; }

@media (max-width: 900px) {
  .dash-graficas, .dash-proximos { grid-template-columns: minmax(0, 1fr); }
}

/* Home operativa del taller (Avisos · Órdenes abiertas · Citas · Explorador)
   ----------------------------------------------------------------------------- */
.home-seccion { margin-bottom: 1.6rem; }
.home-seccion > h2 { margin: 0 0 .8rem; }
.home-seccion .dash-card .cabecera { margin-bottom: .5rem; }
.home-seccion .dash-card .cabecera h3 { margin: 0; font-size: 1rem; color: var(--texto-suave); }
.home-seccion .dash-card .btn-claro { margin-top: 0; }

/* Acciones por aviso (crear cita / posponer / descartar). En fila, con wrap en móvil. */
.aviso-acciones { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; }
.aviso-acciones form { margin: 0; }
/* Menú "Posponer" = POPOVER nativo (top layer): no lo recorta el overflow de la tabla y se
   centra/adapta en cualquier pantalla (móvil/tablet/desktop). Cierra al tocar fuera o con Esc. */
.aviso-posponer-menu {
  width: min(340px, 92vw); box-sizing: border-box; margin: auto;  /* margin:auto centra el popover */
  background: #fff; border: 1px solid var(--linea); border-radius: 14px;
  box-shadow: 0 16px 48px rgba(15, 30, 55, 0.24); padding: 1.1rem;
}
.aviso-posponer-menu:popover-open { display: flex; flex-direction: column; gap: .8rem; }
.aviso-posponer-menu::backdrop { background: rgba(15, 30, 55, 0.4); }
.aviso-posponer-titulo { margin: 0; font-weight: 700; color: var(--tinta); }
.aviso-posponer-menu form { display: flex; flex-direction: column; gap: .8rem; }
.aviso-posponer-rapido { display: flex; gap: .5rem; }
.aviso-posponer-rapido .btn-chip { flex: 1; text-align: center; }
.aviso-posponer-fecha { display: flex; flex-direction: column; gap: .3rem; font-size: .85rem; color: var(--texto-suave); }
.aviso-posponer-fecha input[type="date"] {
  width: 100%; box-sizing: border-box; padding: .55rem .6rem; border: 1px solid var(--linea);
  border-radius: 8px; font-size: 16px; color: var(--tinta); background: #fff;
  -webkit-appearance: none; appearance: none; min-width: 0;
}
.aviso-posponer-pie { display: flex; gap: .6rem; justify-content: flex-end; }
.aviso-posponer-menu .btn-sec { margin-top: 0; }

/* Explorador: filtro de fecha COMPARTIDO + subpestañas (Presupuestos / Órdenes). */
.explorador-fechas { margin: 0 0 1rem; }
.explorador-controles { margin-bottom: 1rem; }
.explorador-controles label {
  display: inline-flex; flex-direction: column; gap: .25rem; font-size: .85rem; color: var(--texto-suave);
}
.explorador-controles select {
  padding: .45rem .6rem; border: 1px solid var(--linea); border-radius: 8px;
  font-size: .95rem; color: var(--tinta); background: #fff;
}
.explorador-tabs .dash-card { margin-bottom: 1.1rem; }
.explorador-tabs .dash-grafica { height: 300px; }

/* Combobox con búsqueda (marca/modelo del catálogo). Lo monta combobox.js encima del
   <select> nativo (que se oculta con .combobox-nativo pero sigue siendo la fuente del POST).
   Sin JS no se ve ".combobox" (no existe en el DOM) y se muestra el <select> normal. */
.combobox { position: relative; }
.combobox-nativo { display: none !important; }
.combobox-input { width: 100%; padding: .5rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font-size: 1rem; color: var(--tinta); background: #fff; }
.combobox-input:focus { outline: 0; border-color: var(--azul); box-shadow: 0 0 0 3px var(--azul-a12); }
.combobox-panel { position: absolute; top: calc(100% + .3rem); left: 0; right: 0; margin: 0; padding: .25rem; list-style: none; background: #fff; border: 1px solid var(--linea); border-radius: 10px; box-shadow: 0 12px 30px rgba(16,32,56,.16); max-height: 280px; overflow: auto; z-index: 50; }
.combobox-panel[hidden] { display: none; }
.combobox-item { display: flex; align-items: center; gap: .55rem; padding: .4rem .55rem; border-radius: 7px; cursor: pointer; color: var(--tinta); font-size: .95rem; }
.combobox-item:hover, .combobox-item.activo { background: #f3f8ff; }
.combobox-item[aria-selected="true"] { font-weight: 600; }
.combobox-item .marca-logo, .combobox-item .marca-mono { flex: 0 0 auto; }
.combobox-nombre { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.combobox-vacio { padding: .5rem .55rem; color: var(--texto-suave); font-size: .9rem; }
/* Lista hermana de items (data-combobox-items): la usa el JS; sin JS no estorba. */
ul[data-combobox-items] { display: none; }

/* Inventario / kardex (ficha de producto, pestaña Inventario) */
.estado-entrada { background: #e6f4ea; color: var(--verde); }
.estado-salida { background: #fde8e6; color: var(--rojo); }
.estado-ajuste { background: #e7f0fb; color: var(--azul); }
.inv-resumen { display: flex; flex-wrap: wrap; gap: 1rem; margin-bottom: 1.2rem; }
.inv-dato { flex: 1 1 160px; background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: .9rem 1.1rem; }
.inv-dato-alerta { border-color: #f0c9c5; background: #fff7f6; }
.inv-num { display: block; font-size: 1.6rem; font-weight: 700; color: var(--azul); line-height: 1; }
.inv-dato-alerta .inv-num { color: var(--rojo); }
.inv-lbl { display: block; color: var(--texto-suave); font-size: .85rem; margin-top: .35rem; }
.linea-nueva .campo-mov select { min-width: 9rem; }

/* Aviso / resaltado de bajo stock (listado de productos) */
.aviso-bajo-stock { background: #fff7f6; border: 1px solid #f0c9c5; border-radius: 10px; padding: .6rem .9rem; margin: 0 0 1rem; color: var(--tinta); }
.fila-bajo-stock { background: #fff7f6; }
.tag-bajo-stock { color: var(--rojo); font-weight: 700; }

/* Resumen de importación de tarifas */
.resumen-importacion { margin-top: 1.4rem; background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1rem 1.2rem; max-width: 760px; }
.resumen-importacion h2 { margin-top: 0; }
.resumen-importacion ul { margin: 0; padding-left: 1.1rem; line-height: 1.7; }

/* ============================================================================
   Móvil / drawer
   ----------------------------------------------------------------------------
   ≤960px: el sidebar fijo de 240px no cabe → pasa a drawer off-canvas sobre un
   overlay (botón ☰ en la topbar, clase `menu-abierto` en <body>, ver movil.js).
   En escritorio (>960px) NADA cambia: sidebar fijo, sin ☰ ni overlay.
   ============================================================================ */

/* Tablas anchas: patrón único `.tabla-scroll`. La tabla se desplaza DENTRO de su
   contenedor (con inercia táctil); la página nunca tiene scroll horizontal global. */
.tabla-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* Botón hamburguesa (topbar) y ✕ del drawer: ocultos en escritorio. */
.menu-btn {
  display: none; flex: 0 0 auto; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; border-radius: 10px;
  background: #fff; border: 1px solid var(--linea); color: var(--tinta);
}
.menu-btn:hover { background: var(--gris); }
.menu-btn .ico { width: 22px; height: 22px; }
.sidebar-cerrar { display: none; }
.sidebar-overlay { display: none; }
.sidebar-cabecera { display: flex; align-items: flex-start; justify-content: space-between;
  gap: .4rem; border-radius: 10px; }
/* Cuando la barra NO se tiñe (logo claro), la cabecera sí lleva su tarjeta de color. */
.sidebar-cabecera[style*="background"] { padding: .5rem .6rem; margin-bottom: .6rem; }
.sidebar-cabecera[style*="background"] .brand { padding: 0; width: 100%; }
/* Barra teñida: el logo respira sin caja y el menú arranca justo debajo. */
.sidebar[style*='--menu-fondo'] .brand { padding: .2rem .2rem .9rem; width: 100%; }

@media (max-width: 960px) {
  .app { grid-template-columns: 1fr; }
  .sidebar {
    position: fixed; top: 0; bottom: 0; left: 0; z-index: 100;
    width: min(280px, 85vw); overflow-y: auto;
    transform: translateX(-100%); transition: transform .2s ease;
  }
  body.menu-abierto .sidebar { transform: translateX(0); box-shadow: 0 0 42px rgba(5, 12, 22, .45); }
  body.menu-abierto { overflow: hidden; }  /* sin scroll de fondo con el drawer abierto */
  .sidebar-overlay {
    display: block; position: fixed; inset: 0; z-index: 99;
    background: rgba(8, 16, 28, .45); opacity: 0; pointer-events: none;
    transition: opacity .2s ease;
  }
  body.menu-abierto .sidebar-overlay { opacity: 1; pointer-events: auto; }
  .menu-btn { display: inline-flex; }
  .sidebar-cerrar {
    display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
    width: 44px; height: 44px; padding: 0; border: 0; border-radius: 10px;
    background: transparent; color: #cdd9e8;
  }
  .sidebar-cerrar:hover { background: rgba(255,255,255,.1); color: #fff; }
  .sidebar-cerrar .ico { width: 20px; height: 20px; }
  .topbar { padding: .55rem .8rem; gap: .6rem; }
  /* La barra de pestañas (ficha de OR, producto…) hace scroll horizontal si no cabe. */
  .tabs-barra { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .tabs-barra [role=tab] { white-space: nowrap; }
}
/* Accesibilidad: quien pide "reducir movimiento" en el SO no debería ver NINGUNA transición o
   animación de la app (antes solo se cubría el drawer del móvil). Patrón estándar: casi anula
   duración/iteración de transition/animation en todo el árbol, sin quitar los cambios de
   estado en sí (siguen aplicándose, solo que de golpe). `!important` es intencional: apaga
   incluso las transiciones puestas inline o con mayor especificidad. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* Pantallas táctiles: área táctil cómoda (≥40px) en chips, steppers y segmentos
   sin tocar el escritorio (puntero fino y >960px quedan igual). */
@media (max-width: 960px), (pointer: coarse) {
  .btn-chip, .btn-mini {
    min-width: 40px; min-height: 40px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  .chip-aprobacion { width: 2.5rem; height: 2.5rem; font-size: 1rem; }
  .stepper > button { width: 2.6rem; min-height: 40px; }
  .combustible-seg { height: 40px; }
  .vista-pill { padding: .5rem .8rem; }
  .cal-nav { width: 44px; height: 44px; }
  .inventario-item { padding: .4rem 0; }
  .inventario-item input[type="checkbox"], .checklist-item input[type="checkbox"] { width: 1.3rem; height: 1.3rem; }
  /* iOS hace zoom al enfocar inputs con fuente <16px: la fijamos en táctil. */
  input, select, textarea { font-size: 16px; }
}

/* Móvil estrecho: contenido a sangre, cabeceras que envuelven, topbar compacta. */
@media (max-width: 720px) {
  .content { padding: 1rem .8rem; }
  /* Cabecera de listado en móvil: título arriba, acciones debajo y aire antes del contenido.
     Sin esto, los enlaces, el botón y los filtros se amontonaban unos sobre otros (14-08-2026). */
  .cabecera { flex-wrap: wrap; gap: .5rem; margin-bottom: 1.1rem; }
  .cabecera h1 { margin-bottom: .2rem; }
  .acciones-cab { flex-wrap: wrap; gap: .5rem .9rem; width: 100%; }
  /* `.btn-sec` en <a> nace con `margin-top: 1rem` porque suele ser un "← Volver" suelto; dentro
     de una cabecera ese margen lo desalinea respecto al botón principal. */
  .acciones-cab .btn-sec { margin-top: 0; }
  /* Objetivo táctil decente en los chips de filtro (dedo, no ratón). */
  .btn-chip { padding: .45rem .8rem; }
  .topbar-taller { display: none; }  /* no cabe junto al buscador */
  .topbar-usuario .usuario-nombre, .topbar-usuario .usuario-rol { display: none; }
  .buscador-global { max-width: none; }
  /* el "buscando…" ocupa sitio aunque sea invisible (opacity 0) y desborda el topbar */
  .buscador-global .htmx-indicator { display: none; }
}

/* --- Autenticación: login, usuario en la topbar, credenciales, 403 --- */

/* Página de login (sin sidebar): tarjeta centrada. El fondo es el COLOR DEL LOGO del taller
   cuando lo tiene (variables `--login-fondo`/`--login-texto` que pinta la vista); sin logo, el
   gris de siempre. La caja del formulario sigue blanca a propósito: es donde se escribe. */
.login-body {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  min-height: 100vh; padding: 1.5rem;
  background: var(--login-fondo, var(--gris));
}
.login-caja { width: 100%; max-width: 380px; }
.login-marca { text-align: center; margin-bottom: 1.4rem; }
.login-marca h1 { font-size: 1.4rem; margin: .6rem 0 .15rem; color: var(--login-texto, var(--tinta)); }
/* La coletilla y el pie se leen sobre el fondo de marca (blanco sobre oscuro, tinta sobre claro). */
.login-marca .nota { color: var(--login-texto, var(--texto-suave)); opacity: .85; }
.login-mark { width: 48px; height: 48px; font-size: 1.1rem; border-radius: 13px; }
.login-logo { width: 60px; height: 60px; }
/* Logo del TALLER: los suyos son apaisados (cabecera con nombre), no iconos cuadrados como el de
   Cocopit. Se le da el ANCHO de la caja de login y alto automático — con los 60x60 de arriba el
   de Díaz Motor salía diminuto y estirado (foto del dueño, 13-08-2026). `contain` respeta la
   proporción sea cual sea la imagen que suba el taller. */
.login-logo-taller {
  width: 100%; height: auto; max-height: 130px;
  object-fit: contain; display: block; margin: 0 auto;
}
.login-wordmark { font-weight: 800; letter-spacing: -.02em; }
.login-form { max-width: none; }
.login-form .acciones button { width: 100%; padding: .6rem 1rem; }
/* Marca Cocopit disimulada al pie del login (sin protagonismo). */
.login-pie { margin-top: 1.6rem; text-align: center; color: var(--login-texto, #aab4c0);
  opacity: .7; font-size: .76rem; }
.login-error { background: #fdecea; border: 1px solid #f3c2bd; color: var(--rojo); border-radius: 8px; padding: .6rem .8rem; font-size: .9rem; margin-bottom: 1rem; }

/* Auto-update en la cabecera (solo escritorio): versión instalada / descarga / aviso.
   Nace de que el taller no sabía qué versión corría ni por qué la app tardaba en abrir. */
.update-estado { display: flex; align-items: center; gap: .45rem; font-size: .82rem; }
.update-version { color: var(--texto-suave); white-space: nowrap; }
.update-cargando { color: var(--azul); font-weight: 600; }
.update-preparada { background: #eef7ee; border: 1px solid #cbe6cb; border-radius: 999px;
  padding: .18rem .3rem .18rem .7rem; }
.update-preparada .update-txt { color: #1f6b34; font-weight: 600; white-space: nowrap; }
.update-form { margin: 0; }
.update-btn { background: var(--verde, #2e7d32); color: #fff; border: 0; border-radius: 999px;
  padding: .28rem .7rem; font-size: .78rem; font-weight: 600; cursor: pointer; }
.update-btn:hover { filter: brightness(.94); }
@media (max-width: 720px) { .update-version { display: none; } }

/* Usuario autenticado en la topbar: nombre + rol + botón Salir. */
.topbar-usuario { display: flex; align-items: center; gap: .55rem; margin-left: auto; }
.topbar-usuario .usuario-nombre { font-size: .88rem; font-weight: 600; color: var(--tinta); white-space: nowrap; }
.topbar-usuario .usuario-rol { font-size: .76rem; color: var(--texto-suave); background: var(--gris); border: 1px solid var(--linea); padding: .08rem .4rem; border-radius: 6px; white-space: nowrap; }
.topbar-usuario .salir-form { margin: 0; }
.btn-salir { background: #eef3fb; color: var(--azul); border: 1px solid #cdddf1; padding: .32rem .7rem; border-radius: 7px; font-size: .82rem; cursor: pointer; }
.btn-salir:hover { background: #e0eaf8; }

/* Recuadro destacado de contraseña recién generada (se muestra una sola vez). */
.credencial-aviso { display: flex; flex-direction: column; align-items: stretch; gap: .5rem; background: #fff7e6; border: 1px solid #f0d28a; border-radius: 10px; padding: .8rem 1rem; margin-bottom: 1rem; }
.credencial-fila { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }
.credencial-copiar { flex: 0 0 auto; }
.credencial-acciones { display: flex; align-items: center; justify-content: space-between; gap: .6rem .9rem; flex-wrap: wrap; margin-top: .2rem; }
.credencial-acciones .nota { margin: 0; }
.credencial-pass { font-size: 1.05rem; font-weight: 700; letter-spacing: .03em; background: #fff; border: 1px solid #e0d4a8; border-radius: 6px; padding: .15rem .5rem; }
.fila-inactiva { opacity: .55; }

.aviso-403 { max-width: 540px; }
.aviso-403 h1 { margin-top: .4rem; }

/* Bloque "Acceso al portal" en la ficha del cliente (fase A3) */
.acceso-portal { margin-top: 1.6rem; padding-top: 1.2rem; border-top: 1px solid var(--linea); }
.acceso-portal h3 { margin: 0 0 .8rem; font-size: 1rem; font-weight: 600; color: var(--texto-suave); text-transform: uppercase; letter-spacing: .04em; }

/* M4 — Facturación: asistente AEAT + ficha de factura */
.aviso-fiscal { color: var(--texto-suave); font-size: .9rem; background: #f3f8ff; border: 1px solid #cdddf1; border-radius: 8px; padding: .6rem .9rem; margin-bottom: 1rem; }
.avisos-asistente { display: flex; flex-direction: column; gap: .5rem; margin-bottom: 1rem; }
.aviso-asistente { margin: 0; padding: .6rem .9rem; border-radius: 8px; background: #fff8e7; border: 1px solid #f0d28a; color: #7a5100; font-size: .9rem; }
.asistente-sede { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.4rem; }
.btn-sede { font-size: 1rem; padding: .65rem 1.4rem; }
.asistente-sede-nota { font-size: .85rem; color: var(--texto-suave); }
.asistente-bloques { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
.asistente-bloque { background: #fff; border: 1px solid var(--linea); border-radius: 12px; padding: 1rem 1.1rem; }
.asistente-bloque .bloque-titulo { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--texto-suave); margin: 0; }
.bloque-titulo-fila { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin: 0 0 .7rem; }
.btn-copiar-bloque { white-space: nowrap; }
.bloque-campos { display: flex; flex-direction: column; gap: .5rem; }
.asistente-copiar-todo { margin: -.5rem 0 2rem; }
.campo-copiable { display: flex; align-items: center; gap: .5rem; }
.campo-etiqueta { flex: 0 0 auto; min-width: 130px; font-size: .82rem; color: var(--texto-suave); }
.campo-valor { flex: 1 1 0; min-width: 0; font-weight: 600; font-size: .95rem; word-break: break-all; }
.btn-copiar { flex: 0 0 auto; padding: .18rem .55rem; font-size: .78rem; border: 1px solid var(--linea); border-radius: 6px; background: #f4f5f7; cursor: pointer; color: var(--tinta); }
.btn-copiar:hover { background: var(--azul); color: #fff; border-color: var(--azul); }
.btn-copiar.copiado { background: var(--verde); color: #fff; border-color: var(--verde); }
/* Ficha de factura: meta en 2 columnas */
.ficha-factura { max-width: 900px; }
.factura-meta { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-bottom: 1.4rem; }
.factura-meta-col {}
.dl-factura { display: grid; grid-template-columns: auto 1fr; gap: .3rem .8rem; font-size: .93rem; margin: 0; }
.dl-factura dt { color: var(--texto-suave); font-weight: 500; }
.dl-factura dd { margin: 0; font-weight: 600; word-break: break-word; }
/* Banners de anulación / rectificativa */
.banner-anulada { background: #fde8e6; border: 1px solid #f3bfbb; color: var(--rojo); border-radius: 8px; padding: .6rem .9rem; margin-bottom: 1rem; font-size: .9rem; }
.banner-rectificativa { background: #fff4e5; border: 1px solid #f0d28a; color: #7a5100; border-radius: 8px; padding: .6rem .9rem; margin-bottom: 1rem; font-size: .9rem; }
.btn-peligro { background: var(--rojo); border-color: var(--rojo); }
.btn-peligro:hover { background: #9a1e18; border-color: #9a1e18; }
/* Filtros en fila (para listados con búsqueda + select) */
.filtros-fila { display: flex; gap: .8rem; align-items: flex-end; flex-wrap: wrap; margin-bottom: 1rem; }
.filtros-fila label { display: flex; flex-direction: column; gap: .25rem; font-size: .85rem; color: var(--texto-suave); }
.filtros-fila input, .filtros-fila select { padding: .45rem .7rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .93rem; color: var(--tinta); background: #fff; }
@media (max-width: 720px) { .factura-meta { grid-template-columns: 1fr; } .asistente-bloques { grid-template-columns: 1fr; } }
/* Mensajes de éxito en la ficha del vehículo (citas creadas al programar) */
.mensajes-exito { list-style: none; margin: 0 0 1rem; padding: 0; display: flex; flex-direction: column; gap: .35rem; }
.aviso-ok { background: #e8f8ee; border: 1px solid #a4d9b5; color: #1a5c31; border-radius: 8px; padding: .45rem .8rem; font-size: .92rem; }
.aviso-warn { background: #fdf3e0; border: 1px solid #f5d5a0; color: #7a4400; border-radius: 8px; padding: .45rem .8rem; font-size: .92rem; }
/* Evidencia de firma electrónica del presupuesto (decisión del cliente desde el portal) */
.portal-evidencia { margin-top: .6rem; margin-bottom: .6rem; font-weight: 500; }
/* Checkbox "Crear cita" en el formulario de programar ITV/revisión */
.crear-cita-check { display: flex; align-items: center; gap: .45rem; font-size: .93rem; cursor: pointer; }
.crear-cita-check input[type="checkbox"] { width: 1.1rem; height: 1.1rem; cursor: pointer; }
/* Conmutador de vista Calendario / Lista en la Agenda */
.agenda-vista-toggle { display: flex; gap: .4rem; margin-bottom: .8rem; }
.agenda-vista-toggle .btn-chip.activo { background: var(--accion, var(--azul)); color: #fff;
  border-color: var(--accion, var(--azul)); }
/* Cobro de facturas */
.chip { display: inline-block; padding: .1rem .55rem; border-radius: 999px; font-size: .8rem; font-weight: 600; }
.chip-cobro-pendiente { background: #fff4e5; color: #7a5100; }
.chip-cobro-pagada { background: #e8f8ee; color: #1a5c31; }
.chip-aeat { background: #e6f0ff; color: #1a3a80; font-size: .75rem; }
.cobro-estado { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .6rem; }
.cobro-fecha { font-size: .88rem; color: var(--texto-suave); }
.cobro-medio { font-size: .88rem; color: var(--texto-suave); }
.cobro-form .cobro-campos { display: flex; align-items: flex-end; gap: .8rem; flex-wrap: wrap; margin-top: .5rem; }
.cobro-form .cobro-campos label { display: flex; flex-direction: column; gap: .2rem; font-size: .9rem; }
#cobro-section { background: #f9fafb; border: 1px solid #e2e8f0; border-radius: 10px; padding: 1rem 1.2rem; margin-bottom: 1.4rem; max-width: 700px; }
/* Selector de tipo en Informes */
.informes-tipo-selector { display: flex; gap: .5rem; flex-wrap: wrap; margin-bottom: 1.2rem; }
.informes-tipo-selector .btn-chip.activo { background: var(--accion, var(--azul)); color: #fff;
  border-color: var(--accion, var(--azul)); }
/* Fila de filtros de un listado (chips + desplegable). En móvil se apilan sin apretujarse. */
.filtros-listado { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem; margin-bottom: .8rem; }
.filtros-listado .clientes-filtro-estado { margin-bottom: 0; }
.filtros-listado .filtro-tipo { margin: 0; }
.filtros-listado label { display: flex; align-items: center; gap: .4rem; font-size: .88rem; color: var(--texto-suave); }

/* En MÓVIL el alto es el recurso caro, más que el ancho (apunte del dueño, 14-08-2026): esta
   cabecera gastaba cinco líneas (título / enlaces / botón / chips / desplegable) donde caben
   tres. Va después de las reglas base a propósito: un @media más arriba en el fichero lo pisan
   ellas por orden de cascada. */
@media (max-width: 720px) {
  /* La acción principal sube a la línea del título, que estaba medio vacía. `display: contents`
     saca a los hijos de `.acciones-cab` al flex de la cabecera para poder repartirlos por
     líneas; el resto de enlaces caen debajo. No se mezclan con los filtros a propósito: un
     dedo que busca "Todos" no debe acabar creando un producto. */
  /* `flex-start` para que los enlaces secundarios queden JUNTOS a la izquierda; el botón
     principal ya se va a la derecha porque el título se lleva el espacio sobrante. */
  .cabecera { flex-wrap: wrap; align-items: center; justify-content: flex-start;
    gap: .35rem .6rem; margin-bottom: .9rem; }
  .cabecera h1 { flex: 1 1 auto; min-width: 0; margin: 0; }
  .acciones-cab { display: contents; }
  .acciones-cab .btn { order: 1; flex: 0 0 auto; }
  .acciones-cab .btn-sec { order: 2; flex: 0 0 auto; margin-top: 0; }

  /* Chips y desplegable comparten línea y el desplegable se queda el hueco que sobre. Se deja
     envolver (no `nowrap`): en Productos caben los dos chips y la familia, y donde hay tres
     chips (Clientes) el desplegable baja entero en vez de quedarse estrujado. */
  .filtros-listado { gap: .5rem; margin-bottom: .8rem; }
  .filtros-listado .clientes-filtro-estado { flex: 0 0 auto; margin-bottom: 0; }
  /* El `9rem` es el ancho mínimo con el que un desplegable sigue leyéndose: si en la línea de
     los chips queda ese hueco, sube; si no (tres chips), baja entero en vez de estrujarse. */
  .filtros-listado .filtro-tipo,
  .filtros-listado label { flex: 1 1 9rem; min-width: 0; }
  .filtros-listado select { width: 100%; min-width: 0; }
}

/* Segmento Todos/Activos/No activos del listado de clientes */
.clientes-filtro-estado { display: flex; gap: .5rem; flex-wrap: wrap; margin-bottom: .8rem; }
.clientes-filtro-estado .btn-chip.activo { background: var(--accion, var(--azul)); color: #fff;
  border-color: var(--accion, var(--azul)); }
.informe-kpi-fila-4 { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.2rem; }
.informe-kpi-fila-4 .kpi { min-width: 0; }
/* Autocompletado de dirección postal (proxy Photon/OSM) */
.dir-sugerencias { position: absolute; top: 100%; left: 0; right: 0; z-index: 50; margin: .15rem 0 0; padding: 0; list-style: none; background: #fff; border: 1px solid var(--linea); border-radius: 10px; box-shadow: 0 8px 24px rgba(16,32,56,.14); max-height: 280px; overflow-y: auto; }
.dir-sugerencia { display: flex; flex-direction: column; gap: .1rem; padding: .55rem .8rem; cursor: pointer; border-top: 1px solid #f0f2f5; font-size: .93rem; }
.dir-sugerencia:first-child { border-top: 0; }
.dir-sugerencia:hover, .dir-sugerencia:focus { background: #f3f8ff; outline: none; }
.dir-sug-dir { font-weight: 600; color: var(--tinta); }
.dir-sug-meta { font-size: .82rem; color: #6b7891; }
/* Backup Nube */
.chip-info { background: #e6f0ff; color: #1a3a80; }
.chip-nube { background: #ede9fe; color: #4c1d95; }
.tabla .mono { font-family: ui-monospace, "Cascadia Code", "Courier New", monospace; font-size: .85rem; }
.backup-circuito { margin-top: 1.8rem; border: 1px solid var(--linea); border-radius: 10px; padding: .7rem 1rem; max-width: 800px; }
.backup-circuito summary { cursor: pointer; font-weight: 600; color: var(--azul); font-size: .93rem; }
.backup-circuito-cuerpo { margin-top: .6rem; }
.backup-circuito-cuerpo ul { margin: 0; padding-left: 1.4rem; display: flex; flex-direction: column; gap: .4rem; font-size: .9rem; color: var(--tinta); }
.aviso-origen { margin-bottom: .5rem; }

/* Branding (galería + asignaciones)
   --------------------------------------------------------------------------- */
.branding-seccion { margin-bottom: 2.4rem; }
.branding-subir { display: flex; flex-direction: column; gap: .8rem; max-width: 640px; margin-bottom: 1.4rem; }
.branding-nombre-fila { display: flex; align-items: flex-end; gap: .8rem; flex-wrap: wrap; }
.branding-nombre-label { display: flex; flex-direction: column; gap: .25rem; font-size: .88rem; flex: 1 1 200px; }
.branding-nombre-input { padding: .45rem .65rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .95rem; background: #fff; }
.branding-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 1rem; margin-top: .8rem; }
.branding-item { background: #fff; border: 1px solid var(--linea); border-radius: 10px; overflow: hidden; display: flex; flex-direction: column; }
.branding-thumb { height: 110px; display: flex; align-items: center; justify-content: center; background: #f4f5f7; padding: .5rem; }
.branding-img { max-width: 100%; max-height: 100%; object-fit: contain; }
.branding-sin-img { font-size: .8rem; color: var(--texto-suave); }
.branding-item-info { padding: .5rem .65rem; flex: 1; display: flex; flex-direction: column; gap: .15rem; }
.branding-item-nombre { font-size: .88rem; font-weight: 600; word-break: break-word; }
.branding-item-fecha { font-size: .78rem; color: var(--texto-suave); }
.branding-item form { padding: .4rem .65rem .55rem; border-top: 1px solid var(--linea); display: flex; justify-content: flex-end; }
.branding-vacio { margin-top: .8rem; }
.branding-asignaciones-lista { display: flex; flex-direction: column; gap: .8rem; margin-top: .6rem; }
.branding-asig-fila { background: #fff; border: 1px solid var(--linea); border-radius: 10px; padding: .85rem 1rem; display: grid; grid-template-columns: minmax(0,2fr) minmax(0,1fr) auto; align-items: center; gap: 1rem; }
.branding-asig-info { display: flex; flex-direction: column; gap: .2rem; }
.branding-asig-info strong { font-size: .95rem; }
.branding-asig-info .nota { margin: 0; }
.branding-asig-actual { display: flex; align-items: center; gap: .5rem; }
.branding-asig-preview { display: flex; align-items: center; gap: .5rem; }
.branding-asig-thumb { width: 40px; height: 40px; object-fit: contain; border-radius: 6px; background: #f4f5f7; border: 1px solid var(--linea); }
.branding-asig-nombre { font-size: .88rem; font-weight: 600; }
.branding-sin-asig { color: var(--texto-suave); font-size: .88rem; }
.branding-asig-form { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.branding-asig-select { padding: .38rem .55rem; border: 1px solid var(--linea); border-radius: 8px; font-size: .9rem; background: #fff; color: var(--tinta); }
.branding-asig-btn { white-space: nowrap; }
@media (max-width: 800px) { .branding-asig-fila { grid-template-columns: 1fr; } }

/* Logo de branding en el sidebar (LOGO_WEB asignado) */
.brand-logo { padding: .45rem .5rem 1rem; }
.brand-logo-img { height: 36px; width: auto; object-fit: contain; display: block; max-width: 190px; }
.brand-logo-fallback { display: flex; align-items: center; gap: .55rem; font-weight: 700; font-size: 1.1rem; color: #fff; }

/* Importar / Exportar (Configuración) */
.importexport-tabs { margin-top: 1rem; }
.importexport-muestra { margin-bottom: 1.2rem; }
.importexport-muestra table { font-size: .88rem; }
.importexport-mapeo { max-width: 760px; }
.importexport-mapeo th[scope=row] { text-align: left; font-weight: 500; white-space: normal; }
.importexport-mapeo select { width: 100%; }
.importexport-errores { margin-top: 1rem; }
.importexport-errores summary { cursor: pointer; font-weight: 600; }
.importexport-errores table { margin-top: .6rem; font-size: .9rem; }
.obligatorio { color: #c0392b; font-weight: 700; }
.aviso-proximamente { background: #fff; border: 1px dashed var(--linea); border-radius: 12px; padding: 1.4rem 1.6rem; max-width: 640px; color: #5a6b80; }
.aviso-proximamente h2 { margin-top: 0; color: var(--tinta); }

/* Pestaña Exportar (F5): selector de entidad/formato/fechas + lista de columnas reordenable. */
.export-config { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-end; margin-bottom: 1rem; }
.export-config label { display: flex; flex-direction: column; gap: .25rem; font-size: .9rem; }
.export-config select, .export-config input[type=date] { min-width: 180px; }
.export-columnas { list-style: none; margin: .4rem 0 1rem; padding: 0; max-width: 620px; border: 1px solid var(--linea); border-radius: 10px; overflow: hidden; }
.export-columna { display: flex; align-items: center; justify-content: space-between; gap: .6rem; padding: .4rem .8rem; border-bottom: 1px solid var(--linea); }
.export-columna:last-child { border-bottom: 0; }
/* Especificidad ">= .form label" (0,1,1): esta lista vive dentro de un `<form class="form">`. */
.form label.export-columna-check, .export-columna-check {
  display: flex; flex-direction: row; align-items: center; gap: .55rem; flex: 1;
  font-size: .95rem; cursor: pointer;
}
.export-columna-check input[type=checkbox] { width: auto; flex: none; }
.export-columna-orden { display: inline-flex; gap: .25rem; }
.export-columna-orden .btn-mini { background: #eef2f7; color: var(--azul); }
.export-columna-orden .btn-mini:hover { background: #dde6f1; }
.export-acciones { margin: .6rem 0 1.4rem; }
.export-guardar { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--linea); max-width: 620px; }

/* Conexión al cloud (escritorio) */
.ayuda-bloque { background: var(--gris); border: 1px solid var(--linea); border-radius: 8px; padding: .7rem .9rem; margin: 0 0 1rem; color: var(--tinta); max-width: 720px; font-size: .9rem; }
.aviso-reinicio { background: #fff7e6; border: 1px solid #e7c98a; color: var(--ambar); border-radius: 8px; padding: .7rem .9rem; margin: 0 0 1rem; max-width: 720px; }
/* Especificidad ">= .form label" (0,1,1) a propósito: si no, ".form label{flex-direction:column}"
   gana y el radio se pinta encima del texto en vez de al lado (mismo bug que .radio-fila). */
.form label.campo-radio, .campo-radio {
  display: inline-flex; flex-direction: row; align-items: center; gap: .4rem;
  margin-right: 1.4rem; cursor: pointer;
}
.campo-radio input { width: auto; margin: 0; }
.form-acciones { margin: 1rem 0 1.4rem; }

/* Rectificativa por diferencias (I): sentido (radios) + editor de filas de concepto libre.
   Los dos bloques de modalidad (S/I) viven siempre en el DOM; `rectificativa.js` alterna
   `hidden` sin tocar `display` en ningún otro sitio, pero se fija igualmente por si acaso
   (mismo patrón defensivo que `.tab-panel[hidden]`). */
.campo-grupo-sentido { display: flex; gap: 1.2rem; flex-wrap: wrap; margin: .3rem 0 .5rem; }
.bloque-modalidad[hidden] { display: none; }
.bloque-modalidad-s, .bloque-modalidad-i { margin: 1rem 0; }

/* Pantallas de programa: Acerca de, EULA, Aviso legal, Privacidad del software */
.doc-legal { max-width: 760px; }
.doc-legal h2 { margin: 1.4rem 0 .4rem; font-size: 1.1rem; }
.doc-legal p, .doc-legal li { line-height: 1.6; }
.doc-legal ul { padding-left: 1.3rem; }

/* Pie del sidebar con versión y enlaces legales (solo escritorio) */
.pie-legal { font-size: .7rem; color: #9fb2cc; padding: .4rem .6rem .25rem; }
.pie-legal a { color: #9fb2cc; text-decoration: underline; }
.pie-legal a:hover { color: #cde; }
.pie-legal-sep { margin: 0 .25rem; }

/* --- Licencia (Fase 1C): banner no bloqueante + pantalla de activación --- */
/* Mensaje de error (formularios de configuración: activar, etc.) */
.mensajes-error { background: #fde8e6; border: 1px solid #f0b6b0; color: var(--rojo); border-radius: 8px; padding: .7rem .9rem; margin: 0 0 1rem; max-width: 720px; }
/* Mensaje neutro/informativo (django.contrib.messages nivel INFO: p. ej. "Buscar actualizaciones ahora") */
.mensajes-info { background: #f3f8ff; border: 1px solid #cdddf1; color: var(--tinta); border-radius: 8px; padding: .7rem .9rem; margin: 0 0 1rem; max-width: 720px; }
/* Banner de licencia: aparece en lo alto del contenido. "aviso" = cuenta atrás; "alerta" = degradación premium. Nunca bloquea. */
.lic-banner { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; border-radius: 10px; padding: .7rem 1rem; margin: 0 0 1.2rem; font-size: .92rem; border: 1px solid; }
.lic-banner-txt { flex: 1 1 320px; }
.lic-banner-link { font-weight: 600; white-space: nowrap; text-decoration: underline; }
.lic-banner-aviso { background: #fff7e6; border-color: #e7c98a; color: var(--ambar); }
.lic-banner-aviso .lic-banner-link { color: var(--ambar); }
.lic-banner-alerta { background: #fde8e6; border-color: #f0b6b0; color: var(--rojo); }
.lic-banner-alerta .lic-banner-link { color: var(--rojo); }
/* Ficha de estado de la licencia (pares etiqueta/valor) */
.lic-datos { display: grid; grid-template-columns: 1fr; gap: .5rem; margin: 0; }
.lic-datos > div { display: flex; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--linea); padding-bottom: .4rem; }
.lic-datos dt { color: var(--texto-suave); font-size: .9rem; margin: 0; }
.lic-datos dd { margin: 0; font-weight: 600; color: var(--tinta); text-align: right; }

/* Lista de módulos/funciones activas en la pantalla de Licencia (Fase 2) */
.lic-modulos { margin: .2rem 0 1rem; padding-left: 1.1rem; color: var(--texto-suave); font-size: .9rem; }
.lic-modulos li { margin: .1rem 0; }

/* --- Configuración → Apariencia: selectores de tema/KPIs/inspección (radios en píldoras) --- */
.apariencia-grupo legend { font-weight: 700; }
.apariencia-pista { grid-column: 1 / -1; margin: -.2rem 0 .6rem; }
/* RadioSelect de Django: contenedor + una opción (input+label) por radio. Se reparten en fila. */
.apariencia-opciones { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: .6rem; }
.apariencia-opciones > div { display: flex; }
.apariencia-opciones label {
  display: inline-flex; align-items: center; gap: .45rem; cursor: pointer;
  border: 1px solid var(--linea); background: #fff; border-radius: 10px;
  padding: .5rem .9rem; font-size: .95rem; color: var(--tinta);
}
.apariencia-opciones label:hover { border-color: var(--azul); }
.apariencia-opciones input[type="radio"] { width: auto; cursor: pointer; accent-color: var(--azul); }
.apariencia-opciones input[type="radio"]:checked + label,
.apariencia-opciones label:has(input[type="radio"]:checked) {
  border-color: var(--azul); background: #eef3fb; font-weight: 600;
}

/* --- RadioSelect EN FILA (opciones largas: mejor una fila por opción que píldoras que
   desbordan). Título aparte con `<span>` (NUNCA un `<label>` exterior envolviendo el widget:
   Django ya pinta un `<label>` por opción y ".form label{flex-direction:column}" los
   descoloca — círculo encima del texto). Especificidad ">= .form label" con
   ".radio-lista label.radio-fila" para que gane sin depender del orden en la hoja. --- */
.campo-titulo { display: block; font-size: .9rem; color: var(--texto-suave); margin: 0 0 .35rem; }
.radio-lista { display: flex; flex-direction: column; gap: .5rem; }
.radio-lista label.radio-fila {
  display: flex; flex-direction: row; align-items: center; gap: .5rem; cursor: pointer;
  font-size: .95rem; color: var(--tinta); font-weight: 400;
}
.radio-lista label.radio-fila input[type="radio"] { width: auto; margin: 0; flex: none; }
/* Checkbox suelto fuera del grid `.campo-check` (p. ej. Copia de seguridad): misma fila que
   `.radio-fila`, pero SIN el `white-space: nowrap` de `.check-inline` (aquí el texto es largo
   y necesita poder envolver en móvil). */
.form label.check-fila { flex-direction: row; align-items: center; gap: .5rem; }
.form label.check-fila input[type="checkbox"] { width: auto; margin: 0; flex: none; }

/* --- Aviso de «esta ficha cambió en otro equipo» (móvil ↔ PC) ---------------------------------
   Informativo, NO de error: el taller no ha hecho nada mal, solo le falta refrescar. Ámbar y no
   rojo por eso mismo. Mientras no hay cambios el fragmento va vacío y no ocupa ni un píxel, así
   que aparecer no desplaza lo que se está leyendo (no hay salto de maquetación). */
.aviso-cambios { display: flex; align-items: center; flex-wrap: wrap; gap: .6rem .9rem;
  margin: 0 0 1rem; padding: .6rem .9rem; border: 1px solid #f0d49b; border-radius: 10px;
  background: #fff8e8; color: #7a5a12; font-size: .93rem; }
.aviso-cambios-txt { flex: 1 1 auto; min-width: 0; }
.aviso-cambios .btn-chip { flex: 0 0 auto; background: #fff; border-color: #e0be7f;
  color: #7a5a12; }
.aviso-cambios .btn-chip:hover { background: #fdf1d8; }

@media (max-width: 720px) {
  /* En el móvil el aviso se ancla ABAJO, al alcance del pulgar, y flota sobre el contenido en vez
     de empujarlo: la ficha se sigue leyendo igual mientras decides si actualizar. */
  .aviso-cambios { position: fixed; left: .6rem; right: .6rem; bottom: .6rem; z-index: 60;
    margin: 0; box-shadow: 0 6px 20px rgba(16,32,56,.18); }
}

/* Km rodados entre una visita y la anterior (historial de OR del vehículo). Se resalta porque es
   el dato que se busca al repasar el historial: 1.000 km o 40.000 cambian la lectura de todo. */
.km-recorridos { font-weight: 600; color: var(--texto-suave); white-space: nowrap; }

/* Caja sobria para bloques dentro de una pestaña de ficha (p. ej. los mantenimientos). */
.tarjeta-plana { background: #fff; border: 1px solid var(--linea); border-radius: 12px;
  padding: .9rem 1rem; margin-bottom: 1.2rem; max-width: 640px; }

/* Banda de sesión de SOPORTE: deliberadamente llamativa y en todas las pantallas. El taller tiene
   que saber en todo momento que hay alguien de Cocopit dentro (y poder echarnos). */
.banda-soporte { position: sticky; top: 0; z-index: 200; display: flex; align-items: center;
  justify-content: center; gap: .8rem; padding: .45rem .9rem; background: #7a2ea8; color: #fff;
  font-size: .9rem; font-weight: 600; }
.banda-soporte form { margin: 0; }
.banda-soporte-salir { background: rgba(255,255,255,.18); border: 1px solid rgba(255,255,255,.5);
  color: #fff; border-radius: 8px; padding: .15rem .6rem; font: inherit; font-size: .85rem;
  cursor: pointer; }
.banda-soporte-salir:hover { background: rgba(255,255,255,.3); }

/* Listado con un filtro PRINCIPAL (el estado de las órdenes: el que el taller usa a diario).
   En pantalla grande los tres van en línea con su ancho natural — a ancho completo, el
   desplegable de Estado medía 1.136 px y quedaba ridículo. Solo en MÓVIL se lleva su propia
   línea, que es donde compite de verdad por el hueco. */
.filtros-listado-2 { flex-wrap: wrap; }
.filtros-listado .filtro-principal { display: flex; flex: 0 0 auto; }

@media (max-width: 720px) {
  .filtros-listado .filtro-principal { flex: 1 1 100%; }
  .filtros-listado .filtro-principal .filtro-tipo { flex: 1 1 auto; }
  .filtros-listado .filtro-principal select { flex: 1 1 auto; min-width: 0; }
}

/* Marca/modelo del catálogo OFICIAL de Cocopit: se puede ocultar, no editar ni borrar.
   La etiqueta explica por qué faltan los botones (si no, parece que la app está rota). */
.chip-oficial {
  display: inline-block; padding: 0.1rem 0.45rem; margin-right: 0.35rem;
  font-size: 0.72rem; letter-spacing: 0.02em; white-space: nowrap;
  color: #4a5a6e; background: #eef2f7; border: 1px solid #d7e0ea; border-radius: 999px;
}

/* Estado del sync: cuándo fue la última vez que subió de verdad, y lo que se ha quedado
   bloqueado. Antes el indicador solo decía "en línea" (el último INTENTO), así que un canal
   atascado días seguía en verde. */
.sync-cuando { font-size: 0.72rem; opacity: 0.75; white-space: nowrap; }
.sync-cuando.sync-nunca { opacity: 0.9; }
.sync-bloqueados {
  display: inline-block; padding: 0.05rem 0.4rem; border-radius: 999px;
  font-size: 0.72rem; white-space: nowrap;
  background: #fde8e8; color: #9b1c1c; border: 1px solid #f7c9c9;
}
