/* ============================================================================
   Estándar One — Design System (modo claro / oscuro)
   Tokens vía CSS variables. data-theme="light|dark" en <html>.
   Paleta: GRAFITO NEUTRO + acento TEAL (elegante, sin el azul genérico).
   ============================================================================ */

:root {
  /* Acento teal (reemplaza el azul institucional). Ramp usado por botones. */
  --brand:        #0d8276;
  --brand-600:    #0a685e;
  --brand-400:    #35a99b;
  --brand-300:    #8fcfc6;

  --radius:   14px;
  --radius-sm: 9px;
  --radius-lg: 20px;
  --gap:      16px;
  /* Escala de espaciado (ritmo consistente en toda la app) */
  --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
  --space-5: 24px; --space-6: 32px; --space-8: 48px;
  /* Escala tipográfica */
  --fs-1: 12px; --fs-2: 13px; --fs-3: 14px; --fs-4: 16px;
  --fs-5: 20px; --fs-6: 26px; --fs-7: 34px;
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --shadow: 0 1px 2px rgba(0,0,0,.04), 0 6px 20px rgba(0,0,0,.05);
  --shadow-sm:    0 1px 2px rgba(0,0,0,.05);
  --shadow-lg:    0 2px 6px rgba(0,0,0,.06), 0 16px 40px rgba(0,0,0,.10);
  --shadow-hover: 0 4px 12px rgba(0,0,0,.07), 0 22px 48px rgba(0,0,0,.12);
  /* Anillo de foco accesible (reemplaza el outline por defecto del navegador) */
  --ring: color-mix(in srgb, var(--primary) 42%, transparent);
  --trans: .18s ease;
  /* Glassmorphism: intensidad del desenfoque tras los paneles translúcidos.
     Bajado de 18px a 12px: menos costo de GPU con casi el mismo efecto. */
  --glass-blur: 12px;
  --glass-sat:  150%;
}

/* ── Tema claro (grises neutros, sin tinte azul) ── */
:root, [data-theme="light"] {
  --bg:        #f5f6f7;
  --surface:   #ffffff;
  --surface-2: #eef0f2;
  --border:    #e3e5e9;
  --text:      #17191d;
  --text-2:    #545a63;
  --muted:     #8a919b;
  --primary:   var(--brand);
  --primary-hover: var(--brand-600);
  --primary-contrast: #ffffff;
  --success:   #157f54;  --success-bg: #e6f3ec;
  --warning:   #a86a00;  --warning-bg: #f7eeda;
  --danger:    #c03a3a;  --danger-bg:  #f8e7e7;
  --info:      #0c7583;  --info-bg:    #e1f0f2;
  --neutral-bg:#eceef1;
  /* Superficies de vidrio (translúcidas, con desenfoque de fondo) */
  --glass:        rgba(255,255,255,.68);
  --glass-2:      rgba(255,255,255,.52);
  --glass-border: rgba(255,255,255,.75);
  --glass-hi:     rgba(255,255,255,.95);
  /* Manchas de color del fondo aurora en movimiento */
  --aurora-1: rgba(13,130,118,.22);
  --aurora-2: rgba(53,169,155,.18);
  --aurora-3: rgba(120,140,170,.16);
}

/* ── Tema oscuro (grafito neutro de alto contraste, sin navy) ── */
[data-theme="dark"] {
  --bg:        #0c0d10;
  --surface:   #15171b;
  --surface-2: #1c1f25;
  --border:    #2b2f37;
  --text:      #e9ebee;
  --text-2:    #aab0b9;
  --muted:     #757c86;
  --primary:   #17b0a0;            /* teal brillante para acentos */
  --primary-hover: #22c4b2;
  --primary-contrast: #06231f;      /* texto oscuro sobre el teal brillante */
  --success:   #35d3a0;  --success-bg: #0f2a23;
  --warning:   #f0b429;  --warning-bg: #2b2410;
  --danger:    #f27272;  --danger-bg:  #2b1616;
  --info:      #2bbccd;  --info-bg:    #0e2a31;
  --neutral-bg:#20242c;
  --shadow: 0 1px 3px rgba(0,0,0,.5), 0 12px 32px rgba(0,0,0,.45);
  --shadow-sm:    0 1px 2px rgba(0,0,0,.4);
  --shadow-lg:    0 2px 8px rgba(0,0,0,.5), 0 18px 44px rgba(0,0,0,.5);
  --shadow-hover: 0 6px 16px rgba(0,0,0,.55), 0 24px 56px rgba(0,0,0,.55);
  --glass:        rgba(20,22,27,.60);
  --glass-2:      rgba(28,31,37,.46);
  --glass-border: rgba(255,255,255,.09);
  --glass-hi:     rgba(255,255,255,.14);
  --aurora-1: rgba(23,176,160,.22);
  --aurora-2: rgba(13,130,118,.20);
  --aurora-3: rgba(46,70,110,.28);
}

/* ── Variantes del modo oscuro (docs/73 fase 4) ───────────────────────────────
   `data-variante` en <html> (lo pone theme.js). Sólo redefinen los tokens de fondo,
   superficie, borde y texto: el color de marca lo sigue derivando temas.js, así que
   cualquier variante funciona con cualquier color de acento. En modo claro no aplican. */

/* Negro puro: en pantallas OLED el píxel apagado no consume. Pensado para el teléfono. */
[data-theme="dark"][data-variante="negro"] {
  --bg:        #000000;
  --surface:   #0b0b0d;
  --surface-2: #131316;
  --border:    #26262b;
  --glass:        rgba(10,10,12,.66);
  --glass-2:      rgba(18,18,21,.50);
  --glass-border: rgba(255,255,255,.08);
}
/* Cálido: grises con una pizca de marrón. De noche cansa menos que el grafito frío. */
[data-theme="dark"][data-variante="calido"] {
  --bg:        #14100d;
  --surface:   #1d1814;
  --surface-2: #251f19;
  --border:    #3a3128;
  --text:      #efe8e0;
  --text-2:    #bfb3a5;
  --muted:     #8b8072;
  --glass:        rgba(29,24,20,.62);
  --glass-2:      rgba(37,31,25,.48);
  --glass-border: rgba(255,240,220,.10);
}
/* Alto contraste: fondo negro, texto blanco puro y bordes marcados (accesibilidad).
   El vidrio se vuelve casi opaco: la translucidez es lo que baja la legibilidad. */
[data-theme="dark"][data-variante="contraste"] {
  --bg:        #000000;
  --surface:   #0d0d0d;
  --surface-2: #171717;
  --border:    #6a6a6a;
  --text:      #ffffff;
  --text-2:    #e2e2e2;
  --muted:     #b0b0b0;
  --glass:        rgba(10,10,10,.95);
  --glass-2:      rgba(23,23,23,.92);
  --glass-border: rgba(255,255,255,.34);
}
[data-theme="dark"][data-variante="contraste"] .card,
[data-theme="dark"][data-variante="contraste"] .table-wrap { border-width: 2px; }

/* ── Decoraciones de temática (docs/73 fase 4) ────────────────────────────────
   Van SIEMPRE detrás del contenido (z-index -1) y sin capturar el mouse: no se ponen
   nunca encima de una tabla, un importe ni un formulario. Se apagan solas con
   `prefers-reduced-motion` y en modo ligero, que es donde molestarían o costarían GPU. */
[data-decoracion]::after {
  content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
}
/* Nieve: tres capas de puntos cayendo a distinta velocidad. Sin imágenes ni JS. */
[data-decoracion="nieve"]::after {
  background-image:
    radial-gradient(2.5px 2.5px at 20% 10%, rgba(255,255,255,.85), transparent),
    radial-gradient(2px 2px   at 65% 25%, rgba(255,255,255,.70), transparent),
    radial-gradient(1.6px 1.6px at 40% 60%, rgba(255,255,255,.60), transparent),
    radial-gradient(2.2px 2.2px at 85% 75%, rgba(255,255,255,.75), transparent),
    radial-gradient(1.8px 1.8px at 10% 85%, rgba(255,255,255,.65), transparent);
  background-size: 340px 340px, 280px 280px, 400px 400px, 320px 320px, 360px 360px;
  animation: nevar 14s linear infinite;
  opacity: .55;
}
@keyframes nevar { from { background-position: 0 -340px, 0 -280px, 0 -400px, 0 -320px, 0 -360px; }
                   to   { background-position: 0 340px, 0 280px, 0 400px, 0 320px, 0 360px; } }
/* En modo claro la nieve blanca no se ve: se oscurece apenas para que exista. */
:root:not([data-theme="dark"])[data-decoracion="nieve"]::after { filter: invert(1) brightness(.55); opacity: .28; }

/* Telaraña: dos esquinas fijas, sin animación (Halloween no necesita movimiento). */
[data-decoracion="telarana"]::after {
  background-image:
    repeating-radial-gradient(circle at 0 0,     transparent 0 26px, color-mix(in srgb, var(--acento, #5b2c83) 30%, transparent) 26px 27px),
    repeating-radial-gradient(circle at 100% 0,  transparent 0 26px, color-mix(in srgb, var(--acento, #5b2c83) 30%, transparent) 26px 27px);
  background-size: 240px 240px, 240px 240px;
  background-position: top left, top right;
  background-repeat: no-repeat;
  opacity: .5;
}
/* Accesibilidad y rendimiento mandan sobre lo decorativo. */
@media (prefers-reduced-motion: reduce) { [data-decoracion]::after { animation: none; } }
:root[data-perf="ligero"] [data-decoracion]::after,
[data-perf="ligero"][data-decoracion]::after { display: none; }

* { box-sizing: border-box; }
html, body { height: 100%; }
body {
  margin: 0; font-family: var(--font); background: var(--bg); color: var(--text);
  -webkit-font-smoothing: antialiased; transition: background var(--trans), color var(--trans);
}
/* Fondo aurora: manchas de color grandes que se desplazan lentamente detrás del vidrio. */
body::before {
  content: ''; position: fixed; inset: -25%; z-index: -1; pointer-events: none;
  background:
    radial-gradient(38% 38% at 18% 22%, var(--aurora-1), transparent 62%),
    radial-gradient(34% 34% at 82% 16%, var(--aurora-2), transparent 62%),
    radial-gradient(46% 46% at 72% 82%, var(--aurora-3), transparent 64%),
    radial-gradient(30% 30% at 40% 60%, var(--aurora-2), transparent 60%);
  /* Aurora ESTÁTICA: el gradiente se rasteriza una sola vez. Antes se animaba en
     bucle infinito con blur(48px) => la GPU repintaba una capa gigante 60fps para
     siempre (el motivo #1 del ventilador). Ahora no cuesta nada en reposo. */
  filter: blur(48px) saturate(120%);
}

/* ── Modo ligero (data-perf="ligero" en <html>): apaga los desenfoques que cargan
   la GPU. Se autodetecta en equipos modestos; se puede forzar desde Configuración. ── */
:root[data-perf="ligero"] body::before { display: none; }         /* sin aurora */
:root[data-perf="ligero"] *,
:root[data-perf="ligero"] *::before,
:root[data-perf="ligero"] *::after {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
/* Sin el desenfoque detrás, los paneles de vidrio se hacen más opacos para seguir legibles. */
:root[data-perf="ligero"]:not([data-theme="dark"]) {
  --glass: rgba(255,255,255,.94); --glass-2: rgba(255,255,255,.88); --glass-hi: #fff;
}
:root[data-perf="ligero"][data-theme="dark"] {
  --glass: rgba(20,22,27,.95); --glass-2: rgba(28,31,37,.9);
}
/* ── Navegador SIN soporte de desenfoque de fondo ──────────────────────────────
   Mismo criterio que el modo ligero: si no hay desenfoque detrás, el vidrio translúcido
   deja ver el fondo aurora a través del texto y se vuelve difícil de leer. Se opaca.
   (Antes esto no existía y esos navegadores mostraban paneles semitransparentes sin blur.) */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  :root:not([data-theme="dark"]) {
    --glass: rgba(255,255,255,.94); --glass-2: rgba(255,255,255,.88); --glass-hi: #fff;
  }
  :root[data-theme="dark"] {
    --glass: rgba(20,22,27,.95); --glass-2: rgba(28,31,37,.9);
  }
}
a { color: var(--primary); text-decoration: none; }
/* Jerarquía tipográfica: tamaños y tracking diferenciados (el "tracking" negativo
   en los títulos grandes es lo que da el aire de producto cuidado, no genérico). */
h1,h2,h3,h4 { margin: 0 0 .4em; line-height: 1.2; font-weight: 700; color: var(--text); }
h1 { font-size: clamp(22px, 2.2vw, 27px); letter-spacing: -.02em; line-height: 1.15; }
h2 { font-size: var(--fs-5); letter-spacing: -.015em; }
h3 { font-size: var(--fs-4); letter-spacing: -.01em; font-weight: 650; }
h4 { font-size: var(--fs-3); font-weight: 650; }
p  { line-height: 1.55; }
.muted { color: var(--muted); }
.num { text-align: right; font-variant-numeric: tabular-nums; }

/* ── Layout app: sidebar + main ── */
/* Alturas: `dvh` es la altura VISIBLE de verdad. En Safari de iPhone `100vh` incluye la barra
   de direcciones (que aparece y desaparece al hacer scroll), así que el layout queda más alto
   que la pantalla y el último ítem del menú queda tapado. Se deja `vh` primero como respaldo
   para navegadores que no entienden `dvh`: el que sí lo entiende pisa la línea anterior. */
.app { display: grid; grid-template-columns: 248px 1fr; min-height: 100vh; min-height: 100dvh;
  transition: grid-template-columns var(--trans); }

/* Sidebar colapsable en desktop: los módulos ocupan la pantalla completa
   y el logo pasa a la topbar para seguir siempre visible. */
.app.collapsed { grid-template-columns: 0 1fr; }
.app.collapsed .sidebar { width: 0; min-width: 0; padding: 0; border-right: none; overflow: hidden; }
.topbar-logo { height: 34px; width: auto; display: none; transition: filter var(--trans); }
.app.collapsed .topbar-logo { display: block; }
[data-theme="dark"] .topbar-logo { filter: invert(1) brightness(1.9) grayscale(1); }
/* La marca del producto (BRAND.logoProducto) NO se invierte: ya sigue el tema por
   dentro con var(--primary) / var(--primary-contrast). El filter de arriba existe
   para los logos monocromáticos que suben las organizaciones; aplicado a un
   recuadro verde lo deja magenta. */
.topbar-logo-producto { display: none; height: auto; }
.app.collapsed .topbar-logo-producto { display: flex; align-items: center; }
[data-theme="dark"] .topbar-logo-producto { filter: none; }
.sidebar {
  background: var(--glass); border-right: 1px solid var(--glass-border);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  display: flex; flex-direction: column; padding: 14px 12px; gap: 4px;
  position: sticky; top: 0; height: 100vh; height: 100dvh; overflow-y: auto;
  /* Zona segura de abajo: en iPhone sin botón físico, la raya de gestos se come el último ítem. */
  padding-bottom: max(14px, env(safe-area-inset-bottom));
}
.sidebar .brand { display: flex; align-items: center; gap: 10px; padding: 8px 8px 16px; }
.sidebar .brand img { height: 34px; width: auto; }
.sidebar .brand b { font-size: 15px; }
/* Logo monocromático: en dark mode se invierte a claro para contrastar con el grafito.
   Alcanza SÓLO a los <img> (los logos que suben las organizaciones). La marca del
   producto es un <svg> inline y queda fuera a propósito: ya cambia de color sola. */
.brand img { transition: filter var(--trans); }
[data-theme="dark"] .brand img { filter: invert(1) brightness(1.9) grayscale(1); }
.brand .logo-producto { flex: none; }
.sidebar .brand .logo-producto { width: 34px; height: 34px; }
.login-card .brand .logo-producto { width: 56px; height: 56px; }
.nav-item {
  display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: var(--radius-sm);
  color: var(--text-2); cursor: pointer; font-size: 14px; font-weight: 500; transition: var(--trans);
}
.nav-item:hover { background: var(--glass-2); color: var(--text); }
.nav-item.active { background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--text); font-weight: 600;
  box-shadow: inset 3px 0 0 var(--primary); }
.nav-item.active svg { color: var(--primary); }
.nav-section { font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
  color: var(--muted); padding: 14px 12px 4px; }

/* ── Barra lateral customizable (Frente 2) ── */
.nav { display: flex; flex-direction: column; gap: 4px; }
.nav-edit-btn { color: var(--muted); }
.nav-edit-hint { font-size: 11px; color: var(--muted); padding: 2px 12px 8px; line-height: 1.4; }
.nav-list { display: flex; flex-direction: column; gap: 4px; min-height: 6px; }
.nav-item.nav-editing { cursor: grab; user-select: none; }
.nav-item.nav-editing:active { cursor: grabbing; }
.nav-item.dragging { opacity: .45; }
.nav-grip { display: inline-flex; color: var(--muted); margin: 0 -2px 0 -4px; touch-action: none; }
.nav-toggle { margin-left: auto; background: none; border: 0; padding: 4px; border-radius: var(--radius-sm);
  color: var(--muted); cursor: pointer; display: inline-flex; transition: var(--trans); }
.nav-toggle:hover { color: var(--text); background: var(--glass-2); }
.nav-ocultas-h { color: var(--muted); }
.nav-ocultas .nav-item { opacity: .6; }
.nav-ocultas .nav-item:hover { opacity: 1; }
.nav-empty { font-size: 12px; color: var(--muted); padding: 6px 12px; line-height: 1.4; }
.nav-edit-actions { display: flex; gap: 6px; margin-top: 10px; padding: 0 4px; }
.nav-edit-actions .btn { flex: 1; justify-content: center; }
.sidebar.editing .nav-edit-btn { display: none; }
/* Indicador sutil de que el panel está en modo edición */
.sidebar.editing { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--primary) 35%, transparent); }

.main { display: flex; flex-direction: column; min-width: 0; }
.topbar {
  display: flex; align-items: center; gap: 12px; padding: 12px 24px;
  /* En iPhone con notch/isla la barra superior del sistema se monta encima: se respeta su alto. */
  padding-top: max(12px, env(safe-area-inset-top));
  padding-left: max(24px, env(safe-area-inset-left));
  padding-right: max(24px, env(safe-area-inset-right));
  background: var(--glass); border-bottom: 1px solid var(--glass-border); position: sticky; top: 0; z-index: 10;
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
}
.topbar .spacer { flex: 1; }
.content { padding: 24px; max-width: 1400px; width: 100%; margin: 0 auto; }

/* ── Selector de empresa (multi-tenant) ── */
.empresa-switch select {
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text);
  border-radius: var(--radius-sm); padding: 7px 10px; font-size: 13px; max-width: 280px;
}

/* ── Buscador de empresa (typeahead, escala a miles de clientes) ── */
.empresa-search { position: relative; }
.empresa-search input { min-width: 240px; max-width: 340px; font-size: 13px; padding: 7px 10px; }
.empresa-results {
  position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 60;
  background: var(--surface); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm);
  box-shadow: 0 16px 44px rgba(0,0,0,.22); max-height: 360px; overflow-y: auto; min-width: 300px;
}
.empresa-opt { display: flex; justify-content: space-between; gap: 14px; align-items: center;
  padding: 9px 12px; cursor: pointer; font-size: 13px; border-bottom: 1px solid var(--border); }
.empresa-opt:last-child { border-bottom: none; }
.empresa-opt:hover { background: var(--surface-2); }
.empresa-opt.sel { color: var(--primary); font-weight: 600; }
.empresa-opt .muted { font-family: var(--mono); font-size: 11px; }

/* ── Botones ── */
.btn { display: inline-flex; align-items: center; gap: 7px; border: 1px solid transparent;
  border-radius: var(--radius-sm); padding: 8px 14px; font-size: 14px; font-weight: 600;
  cursor: pointer; transition: var(--trans); font-family: inherit; }
.btn-primary { background: linear-gradient(135deg, var(--brand-400), var(--primary));
  color: var(--primary-contrast); box-shadow: 0 2px 10px color-mix(in srgb, var(--primary) 35%, transparent); }
.btn-primary:hover { background: linear-gradient(135deg, var(--primary), var(--primary-hover));
  box-shadow: 0 4px 16px color-mix(in srgb, var(--primary) 45%, transparent); transform: translateY(-1px); }
.btn-primary:active { transform: translateY(0); }
.btn-ghost { background: transparent; border-color: var(--border); color: var(--text); }
.btn-ghost:hover { background: var(--surface-2); }
.btn-danger { background: var(--danger); color: #fff; }
.btn-sm { padding: 5px 9px; font-size: 12px; }
.btn:disabled { opacity: .55; cursor: not-allowed; }
.icon-btn { background: transparent; border: none; color: var(--text-2); cursor: pointer;
  padding: 7px; border-radius: var(--radius-sm); display: inline-flex; }
.icon-btn:hover { background: var(--surface-2); color: var(--text); }
.notif-badge { position: absolute; top: 1px; right: 1px; min-width: 16px; height: 16px; padding: 0 4px;
  background: var(--danger); color: #fff; border-radius: 999px; font-size: 10px; font-weight: 700;
  display: flex; align-items: center; justify-content: center; line-height: 1; box-shadow: 0 0 0 2px var(--glass); }

/* ── Cards / KPIs ── */
.card { background: var(--glass); border: 1px solid var(--glass-border); border-radius: var(--radius);
  padding: 18px; box-shadow: var(--shadow);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat)); }
.grid { display: grid; gap: var(--gap); }
.grid-kpi { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.kpi .label { color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: .04em; }
.kpi .value { font-size: 26px; font-weight: 700; margin-top: 4px; }

/* ── Tablas ── */
.table-wrap { overflow-x: auto; border: 1px solid var(--glass-border); border-radius: var(--radius);
  background: var(--glass);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat)); }
thead th { position: relative; }
tbody tr { transition: background var(--trans); }
table { width: 100%; border-collapse: collapse; font-size: 14px; }
thead th { text-align: left; color: var(--muted); font-weight: 600; font-size: 12px;
  text-transform: uppercase; letter-spacing: .03em; padding: 12px 14px; border-bottom: 1px solid var(--border); }
tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border); color: var(--text); }
tbody tr:last-child td { border-bottom: none; }
tr.clickable { cursor: pointer; }
tr.clickable:hover td { background: var(--surface-2); }
.empty-state { padding: 40px; text-align: center; color: var(--muted); }

/* ── Badges ── */
.badge { display: inline-flex; align-items: center; padding: 3px 9px; border-radius: 999px;
  font-size: 12px; font-weight: 600; text-transform: capitalize; }
.badge.success { background: var(--success-bg); color: var(--success); }
.badge.warning { background: var(--warning-bg); color: var(--warning); }
.badge.danger  { background: var(--danger-bg);  color: var(--danger); }
.badge.info    { background: var(--info-bg);    color: var(--info); }
.badge.neutral { background: var(--neutral-bg); color: var(--text-2); }
.badge.primary { background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--primary); }

/* Paleta ampliada para los estados del trámite (mig 0302). Con cuatro colores, un
   tablero de doce estados obliga a repetirlos y deja de servir para distinguir de un
   vistazo en qué anda cada trámite.
   Cada color se define con `color-mix` sobre un tono base: así el fondo se calcula a
   partir del texto y el par mantiene contraste **en los dos temas**, en vez de fijar
   dos hexadecimales que en oscuro quedan ilegibles. Los tonos base se eligieron
   oscuros para tema claro; en oscuro se aclaran abajo. */
.badge.violeta { background: color-mix(in srgb, #6d4aad 15%, transparent); color: #5b3d93; }
.badge.rosa    { background: color-mix(in srgb, #b03a6e 15%, transparent); color: #9c3160; }
.badge.naranja { background: color-mix(in srgb, #b35a1f 15%, transparent); color: #994c1a; }
.badge.lima    { background: color-mix(in srgb, #4a7f22 15%, transparent); color: #3f6d1d; }
.badge.cielo   { background: color-mix(in srgb, #2170ad 15%, transparent); color: #1c6094; }
.badge.arena   { background: color-mix(in srgb, #8a6d3b 15%, transparent); color: #765d32; }
.badge.pizarra { background: color-mix(in srgb, #4a5560 15%, transparent); color: #3f4954; }

[data-theme="dark"] .badge.violeta { background: color-mix(in srgb, #b79be8 16%, transparent); color: #c4ade9; }
[data-theme="dark"] .badge.rosa    { background: color-mix(in srgb, #eaa0c0 16%, transparent); color: #edaecb; }
[data-theme="dark"] .badge.naranja { background: color-mix(in srgb, #e8ab7d 16%, transparent); color: #edb891; }
[data-theme="dark"] .badge.lima    { background: color-mix(in srgb, #a8d183 16%, transparent); color: #b4d896; }
[data-theme="dark"] .badge.cielo   { background: color-mix(in srgb, #8dc0e8 16%, transparent); color: #9dc9ec; }
[data-theme="dark"] .badge.arena   { background: color-mix(in srgb, #d4bd91 16%, transparent); color: #dcc8a4; }
[data-theme="dark"] .badge.pizarra { background: color-mix(in srgb, #a6b2be 16%, transparent); color: #b3bdc8; }
[data-theme="dark"] .badge.primary { background: color-mix(in srgb, var(--primary) 20%, transparent); color: var(--primary); }

/* Botón para elegir un color: es la muestra del color y nada más. Sin borde ni fondo
   propios, porque cualquier adorno compite con lo único que hay que mirar. */
/* ── Descuento (U.descuentoUI) ── */
/* Va en un recuadro aparte para que se lea como una decisión y no como un campo más
   del formulario: cobrar de menos no es lo mismo que elegir el medio de pago. */
.dsc-box { border: 1px dashed var(--border); border-radius: 10px; padding: 10px 12px; margin-top: 10px; }
.dsc-toggle { display: flex; align-items: center; gap: 8px; font-size: 13.5px; cursor: pointer; }
.dsc-res { margin-top: 8px; font-size: 12.5px; color: var(--text-2); line-height: 1.5; }

.chip-color { border: 0; background: none; padding: 0; cursor: pointer; line-height: 0; border-radius: 999px; }
.chip-color .badge { min-width: 26px; height: 18px; padding: 0; }
.chip-color:hover { transform: scale(1.12); }
.chip-color:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

/* ── Formularios ── */
.field { display: flex; flex-direction: column; gap: 5px; margin-bottom: 14px; }
.field label { font-size: 13px; font-weight: 600; color: var(--text-2); }
.field input, .field select, .field textarea {
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text);
  border-radius: var(--radius-sm); padding: 9px 11px; font-size: 14px; font-family: inherit; width: 100%; }
.field input:focus, .field select:focus, .field textarea:focus {
  outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent); }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }

/* Input reutilizable fuera de .field (barras de filtro, etc.) */
.input {
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text);
  border-radius: var(--radius-sm); padding: 9px 11px; font-size: 14px; font-family: inherit; }
.input:focus {
  outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent); }

/* ── Selector de tema (Apariencia / white-label) ── */
.tema-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; }
.tema-swatch { display: flex; align-items: center; gap: 9px; padding: 10px 12px; cursor: pointer;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm);
  color: var(--text); font-size: 13px; font-weight: 600; text-align: left; transition: var(--trans); }
.tema-swatch:hover { border-color: color-mix(in srgb, var(--sw) 55%, var(--border)); background: var(--surface); }
.tema-swatch.on { border-color: var(--sw); box-shadow: 0 0 0 2px color-mix(in srgb, var(--sw) 40%, transparent); }
.tema-swatch .tema-dot { flex: none; width: 20px; height: 20px; border-radius: 50%;
  background: var(--sw); box-shadow: inset 0 0 0 1px rgba(0,0,0,.12); }
.tema-swatch > span:nth-child(2) { flex: 1; }
.tema-swatch svg { flex: none; color: var(--sw); }

/* ── Modal ── */
.modal-backdrop { position: fixed; inset: 0; background: rgba(8,10,13,.5);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: flex;
  align-items: center; justify-content: center; z-index: 100; padding: 20px; animation: fade-in .18s ease; }
.modal { background: var(--glass); border-radius: var(--radius); width: 100%; max-width: 520px;
  max-height: 90vh; overflow: auto; box-shadow: 0 20px 60px rgba(0,0,0,.28); border: 1px solid var(--glass-border);
  backdrop-filter: blur(26px) saturate(var(--glass-sat)); -webkit-backdrop-filter: blur(26px) saturate(var(--glass-sat));
  animation: modal-rise .22s cubic-bezier(.2,.8,.2,1); }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes modal-rise { from { opacity: 0; transform: translateY(10px) scale(.985); } to { opacity: 1; transform: none; } }
.modal.wide { max-width: 880px; }
.modal-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px;
  border-bottom: 1px solid var(--border); }
.modal-body { padding: 20px; }
.modal-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px;
  border-top: 1px solid var(--border); }

/* ── Toast ── */
#toast-root { position: fixed; bottom: 22px; right: 22px; display: flex; flex-direction: column;
  gap: 10px; z-index: 200; }
.toast { background: var(--glass); border: 1px solid var(--glass-border); border-left: 4px solid var(--primary);
  padding: 12px 16px; border-radius: var(--radius-sm); box-shadow: 0 12px 32px rgba(0,0,0,.22); font-size: 14px; max-width: 360px;
  backdrop-filter: blur(20px) saturate(var(--glass-sat)); -webkit-backdrop-filter: blur(20px) saturate(var(--glass-sat));
  animation: modal-rise .2s cubic-bezier(.2,.8,.2,1); }
.toast.error { border-left-color: var(--danger); }
.toast.success { border-left-color: var(--success); }

/* ── Historial Deshacer / Rehacer por pantalla (docs/44) ── */
.undo-panel { margin-bottom: 12px; border-radius: var(--radius-sm); overflow: hidden;
  background: var(--surface-2); border: 1px solid var(--border); border-left: 3px solid var(--primary);
  animation: modal-rise .2s cubic-bezier(.2,.8,.2,1); }
.undo-panel-head { font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;
  color: var(--muted); padding: 7px 12px 4px; }
.undo-panel-head .muted { text-transform: none; letter-spacing: 0; font-size: 11.5px; }
.undo-row { display: flex; align-items: center; gap: 12px; padding: 6px 12px; font-size: 13px;
  border-top: 1px solid var(--border); }
.undo-row:first-of-type { border-top: none; }
.undo-bar-txt { flex: 1; color: var(--text); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.undo-bar-txt b { font-weight: 600; }
.undo-row.is-undone .undo-bar-txt { color: var(--muted); }
.undo-done { color: var(--muted); font-size: 12px; font-style: italic; }
.undo-err { color: var(--danger); font-style: normal; }

/* ── Login ── */
.login-wrap { min-height: 100vh; min-height: 100dvh; display: grid; place-items: center;
  padding: max(20px, env(safe-area-inset-top)) max(20px, env(safe-area-inset-right))
           max(20px, env(safe-area-inset-bottom)) max(20px, env(safe-area-inset-left)); }
.login-card { width: 100%; max-width: 380px; }
.login-card .brand { display: flex; flex-direction: column; align-items: center; gap: 10px; margin-bottom: 22px; }
.login-card .brand img { height: 56px; }

/* ── Firma del desarrollador (discreta) ── */
.brand-dev { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 5px;
  font-size: 11px; color: var(--muted); padding: 10px 8px 4px; text-align: center; }
.brand-dev b { font-weight: 600; }
.brand-dev a { color: var(--muted); text-decoration: none; transition: color var(--trans); }
.brand-dev a:hover { color: var(--primary); }
.brand-dev .sep { opacity: .6; }
.sidebar .brand-dev { margin-top: 2px; border-top: 1px solid var(--glass-border); }

/* ── Fondo oscuro tras el menú lateral (sólo celular) ─────────────────────────
   Fuera del flujo (position:fixed), así que NO cuenta como celda del grid `.app`
   y no altera las columnas del layout. En escritorio no existe. */
.scrim { display: none; }

/* ── Responsive ── */
@media (max-width: 880px) {
  .app { grid-template-columns: 1fr; }
  .app.collapsed { grid-template-columns: 1fr; }
  .sidebar { position: fixed; left: -260px; z-index: 50; transition: left var(--trans); width: 248px;
    /* pan-y: el navegador se queda con el desplazamiento VERTICAL (scroll del menú) y nos cede
       el horizontal, que es el que usamos para cerrar deslizando. Sin esto, iOS se lleva el
       gesto y el deslizamiento nunca llega al código. */
    touch-action: pan-y; }
  .app.collapsed .sidebar { width: 248px; min-width: 0; padding: 14px 12px; border-right: 1px solid var(--glass-border); overflow-y: auto; }
  .sidebar.open { left: 0; }
  .app.collapsed .topbar-logo { display: none; }
  .form-row { grid-template-columns: 1fr; }

  .scrim {
    display: block; position: fixed; inset: 0; z-index: 40;
    background: rgba(8,10,13,.45);
    backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
    opacity: 0; pointer-events: none; transition: opacity var(--trans);
  }
  .app.menu-abierto .scrim { opacity: 1; pointer-events: auto; }

  /* Área táctil mínima recomendada (44×44): los íconos de la barra eran más chicos
     y en el teléfono se fallaba el toque. */
  .icon-btn { min-width: 44px; min-height: 44px; }
}

/* ── Celular: la tabla se vuelve FICHAS (docs/73 fase 3) ──────────────────────
   Una tabla de 9 columnas mide ~800px: en un teléfono de 375px se miraba por una
   rendija, deslizando de lado. Acá cada fila se apila como tarjeta y cada dato lleva
   el nombre de su columna (viene en `data-h`, que ponen U.table y U.dataTable).
   Al estar enganchado a `.table-wrap`, arregla TODAS las pantallas de una vez.
   Las tablas que no usan esos helpers (matriz de comisiones, ejemplos de la ayuda)
   no llevan `.table-wrap` y siguen desplazándose de lado, que es lo correcto para ellas. */
@media (max-width: 640px) {
  .table-wrap { overflow-x: visible; border: none; background: none; }
  .table-wrap table, .table-wrap tbody, .table-wrap tr, .table-wrap td { display: block; width: 100%; }
  .table-wrap thead { display: none; }          /* el encabezado se repite en cada celda */

  .table-wrap tr {
    background: var(--glass); border: 1px solid var(--glass-border);
    border-radius: var(--radius); margin-bottom: 10px; padding: 4px 2px;
    box-shadow: var(--shadow-sm);
  }
  .table-wrap tbody td {
    display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
    text-align: right; border-bottom: 1px solid var(--border); padding: 8px 12px;
  }
  .table-wrap tbody tr td:last-child { border-bottom: none; }
  /* La etiqueta de la columna, a la izquierda de cada dato. */
  .table-wrap tbody td::before {
    content: attr(data-h);
    flex: 0 0 42%; text-align: left;
    color: var(--muted); font-size: 12px; font-weight: 600; text-transform: uppercase;
    letter-spacing: .04em;
  }
  /* Columnas sin nombre (botones de acción) y la fila de "sin registros": sin etiqueta. */
  .table-wrap tbody td[data-h=""]::before, .table-wrap tbody td:not([data-h])::before { display: none; }
  .table-wrap tbody td[data-h=""] { justify-content: flex-end; }
  .table-wrap tbody td:not([data-h]) { text-align: left; }
  /* En ficha, el rayado y el hover de fila no aportan: cada tarjeta ya se distingue sola. */
  .table-wrap tbody tr:nth-child(even) td, .table-wrap tbody tr:hover td { background: none; }
  /* Fila de totales: se muestra como tarjeta destacada, sin las columnas que no suman. */
  .table-wrap tr.fila-total { border-color: var(--primary); }
  .table-wrap tr.fila-total td:empty { display: none; }
}

/* ── Celular angosto en vertical ──────────────────────────────────────────── */
@media (max-width: 480px) {
  .content { padding: 14px; }
  .topbar { padding-left: max(12px, env(safe-area-inset-left)); padding-right: max(12px, env(safe-area-inset-right)); gap: 8px; }
  h1 { font-size: var(--fs-6); }
  .grid-kpi { grid-template-columns: 1fr; }
  /* Los campos de texto deben medir 16px o iOS hace ZOOM solo al enfocarlos y
     descoloca toda la pantalla. Es el motivo del tamaño, no una decisión estética. */
  .field input, .field select, .field textarea, .input { font-size: 16px; }
  /* Ventanas a pantalla completa: en un teléfono los bordes sólo restan espacio. */
  .modal-backdrop { padding: 0; }
  .modal, .modal.wide {
    max-width: 100%; width: 100%; height: 100%; max-height: 100%; border-radius: 0;
    display: flex; flex-direction: column;
  }
  .modal-body { flex: 1; overflow-y: auto; }
  .modal-head { padding-top: max(16px, env(safe-area-inset-top)); }
  .modal-foot { padding-bottom: max(14px, env(safe-area-inset-bottom)); }
  /* Los botones del pie ocupan el ancho: más fáciles de acertar con el pulgar. */
  .modal-foot { flex-wrap: wrap; }
  .modal-foot .btn { flex: 1; justify-content: center; min-height: 44px; }
}

/* ── Ayuda contextual (tutorial al pie de cada módulo) ───────────────────── */
.ayuda-wrap { margin: 26px 0 8px; }
.ayuda {
  background: var(--glass); border: 1px solid var(--glass-border);
  border-radius: var(--radius); box-shadow: var(--shadow);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  overflow: hidden; position: relative;
}
.ayuda::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px;
  background: linear-gradient(180deg, var(--brand-400), var(--primary));
}
.ayuda-sum {
  list-style: none; cursor: pointer; user-select: none;
  display: flex; align-items: center; gap: 10px;
  padding: 13px 18px; font-size: 14px; font-weight: 600; color: var(--text);
}
.ayuda-sum::-webkit-details-marker { display: none; }
.ayuda-sum:hover { background: var(--glass-2); }
.ayuda-ico {
  flex: none; width: 22px; height: 22px; border-radius: 50%;
  background: linear-gradient(135deg, var(--brand-400), var(--primary));
  color: #fff; font-weight: 700; font-size: 13px;
  display: grid; place-items: center;
}
.ayuda-sum > span:nth-child(2) { flex: 1; font-weight: 500; color: var(--text-2); }
.ayuda-sum > span:nth-child(2) b { color: var(--text); font-weight: 600; }
.ayuda-chev {
  flex: none; width: 8px; height: 8px; border-right: 2px solid var(--text-2);
  border-bottom: 2px solid var(--text-2); transform: rotate(45deg);
  transition: transform var(--trans); margin-right: 2px;
}
.ayuda[open] .ayuda-chev { transform: rotate(-135deg); }
.ayuda-body { padding: 4px 18px 18px; border-top: 1px solid var(--border); }
.ayuda-intro { margin: 12px 0 14px; color: var(--text-2); font-size: 13.5px; line-height: 1.55; }
.ayuda-cols { display: grid; grid-template-columns: 1.1fr 1fr; gap: 22px; }
/* Los hijos de un grid tienen `min-width:auto`: no bajan del ancho mínimo de su contenido.
   Con una tabla de ejemplo adentro, eso estiraba la columna a ~494px y desbordaba en celular.
   `min-width:0` los deja encoger; la tabla se desplaza sola dentro de su recuadro. */
.ayuda-cols > * { min-width: 0; }
.ayuda-body h4 {
  margin: 0 0 8px; font-size: 12px; text-transform: uppercase; letter-spacing: .04em;
  color: var(--primary);
}
.ayuda-pasos { margin: 0 0 6px; padding-left: 20px; }
.ayuda-pasos li { margin-bottom: 7px; font-size: 13.5px; line-height: 1.5; }
.ayuda-ej {
  margin: 0 0 14px; font-size: 13px; line-height: 1.55; color: var(--text-2);
  background: var(--glass-2); border-radius: var(--radius-sm); padding: 10px 12px;
  border: 1px solid var(--border);
}
.ayuda-tips { margin: 0; padding-left: 18px; }
.ayuda-tips li { margin-bottom: 6px; font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
@media (max-width: 760px) { .ayuda-cols { grid-template-columns: 1fr; gap: 14px; } }

/* ── Novedades / aviso de actualización ─────────────────────────────────── */
.nov-back {
  position: fixed; inset: 0; z-index: 200; display: grid; place-items: center;
  background: rgba(6, 10, 12, .45);
  backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
  animation: nov-fade .18s ease;
}
.nov-card {
  width: min(520px, 92vw); max-height: 86vh; overflow: auto;
  background: var(--glass-hi, var(--glass)); border: 1px solid var(--glass-border);
  border-radius: var(--radius); box-shadow: var(--shadow);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  padding: 22px 24px; animation: nov-pop .22s cubic-bezier(.2, .8, .2, 1);
}
.nov-head { margin-bottom: 12px; }
.nov-badge {
  display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .05em;
  text-transform: uppercase; color: var(--primary-contrast);
  background: linear-gradient(135deg, var(--brand-400), var(--primary));
  padding: 3px 9px; border-radius: 999px;
}
.nov-head h3 { margin: 10px 0 2px; font-size: 19px; color: var(--text); }
.nov-ver { font-size: 12px; color: var(--text-2); }
.nov-list { margin: 4px 0 18px; padding-left: 20px; }
.nov-list li { margin-bottom: 8px; font-size: 13.5px; line-height: 1.5; color: var(--text); }
.nov-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.nov-check { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--text-2); cursor: pointer; }
.nov-check input { accent-color: var(--primary); }
/* Historial completo (varias releases) */
.nov-card-hist { width: min(640px, 94vw); }
.nov-hist-body { max-height: 60vh; overflow: auto; margin: 6px 0 14px; padding-right: 4px; }
.nov-hist-item { padding: 12px 0; border-top: 1px solid var(--glass-border); }
.nov-hist-item:first-child { border-top: none; }
.nov-hist-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.nov-hist-head b { font-size: 14.5px; color: var(--text); }
.nov-hist-item .nov-list { margin: 8px 0 2px; }
@keyframes nov-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes nov-pop { from { opacity: 0; transform: translateY(10px) scale(.98); } to { opacity: 1; transform: none; } }

/* ============================================================================
   Frente 3 — Refinamientos de nivel (foco, tablas, inputs, detalles).
   Aditivo y al final: eleva el acabado sin tocar la estructura existente.
   Respeta el modo ligero (sin animaciones que carguen la GPU).
   ============================================================================ */

/* ── Foco por teclado: un anillo consistente y elegante en TODO lo interactivo
   (antes los botones/enlaces/nav usaban el outline por defecto del navegador). ── */
:focus-visible { outline: none; }
.btn:focus-visible, .icon-btn:focus-visible, .nav-item:focus-visible,
a:focus-visible, [tabindex]:focus-visible, summary:focus-visible,
.empresa-opt:focus-visible {
  outline: none; box-shadow: 0 0 0 3px var(--ring); border-radius: var(--radius-sm);
}
.btn-primary:focus-visible { box-shadow: 0 2px 10px color-mix(in srgb, var(--primary) 35%, transparent), 0 0 0 3px var(--ring); }

/* ── Botones: micro-interacción y foco ── */
.btn { letter-spacing: -.005em; }
.btn-ghost:active, .btn-danger:active { transform: translateY(1px); }
.btn:disabled { transform: none !important; box-shadow: none; }

/* ── Inputs: estado hover + placeholder + caret temático ── */
.field input, .field select, .field textarea, .input { transition: border-color var(--trans), box-shadow var(--trans), background var(--trans); caret-color: var(--primary); }
.field input:hover, .field select:hover, .field textarea:hover, .input:hover { border-color: var(--muted); }
::placeholder { color: var(--muted); opacity: .75; }

/* ── Tablas: cebra sutil, hover más claro, números tabulares, encabezado prolijo ── */
tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--surface-2) 32%, transparent); }
tbody tr:hover td { background: color-mix(in srgb, var(--primary) 7%, var(--surface-2)); }
thead th { white-space: nowrap; }
td.num, th.num, .num { font-variant-numeric: tabular-nums; }
.table-wrap table { border-radius: inherit; overflow: hidden; }

/* ── Cards / KPIs: números afinados y elevación opcional al hover ── */
.kpi .value { font-variant-numeric: tabular-nums; letter-spacing: -.015em; }
.card { transition: transform var(--trans), box-shadow var(--trans); }
.card.hoverable, .card[data-href], tr.clickable { cursor: pointer; }
.card.hoverable:hover, .card[data-href]:hover { transform: translateY(-2px); box-shadow: var(--shadow-hover); }

/* ── Badges: un borde interior sutil los asienta mejor sobre el vidrio ── */
.badge { box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 16%, transparent); }

/* ── Detalles finos: selección, scrollbar temática ── */
::selection { background: color-mix(in srgb, var(--primary) 28%, transparent); color: var(--text); }
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 999px; border: 3px solid transparent; background-clip: padding-box; }
::-webkit-scrollbar-thumb:hover { background: var(--muted); }

/* ── Skeleton de carga (usar clase .skeleton en bloques mientras cargan) ── */
.skeleton { position: relative; overflow: hidden; background: var(--surface-2);
  border-radius: var(--radius-sm); color: transparent !important; }
.skeleton::after { content: ""; position: absolute; inset: 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--glass-hi) 55%, transparent), transparent);
  animation: skeleton-sweep 1.3s ease-in-out infinite; }
.skeleton-row { height: 14px; margin: 9px 0; border-radius: 6px; }
@keyframes skeleton-sweep { to { transform: translateX(100%); } }

/* ── Modo ligero / menos movimiento: sin barridos ni transiciones caras ── */
:root[data-perf="ligero"] .skeleton::after { animation: none; opacity: .5; }
@media (prefers-reduced-motion: reduce) {
  .skeleton::after { animation: none; }
  * { scroll-behavior: auto; }
}

/* ── Zona de arrastrar-y-soltar (imágenes, import) ── */
.dz { border: 1.5px dashed var(--border); border-radius: 12px; padding: 16px; text-align: center;
  cursor: pointer; transition: border-color .15s, background .15s; background: var(--surface-2, transparent); }
.dz:hover { border-color: var(--primary); }
.dz.dz-over { border-color: var(--primary); background: var(--primary-soft, rgba(20,160,160,.12)); }
.dz .dz-hint { color: var(--muted); font-size: 12.5px; }

/* ── Comprobante: el formulario con forma de factura ────────────────────────
   La carga de una venta tenía forma de formulario: veinte campos apilados, todos
   con el mismo peso visual. Quien factura conoce el objeto "factura" —tiene un
   encabezado, un cliente, un detalle y un total abajo a la derecha— y ese
   conocimiento se estaba desperdiciando. Acá la pantalla toma la forma del papel
   que la persona ya sabe leer.
   Todo con variables del tema: la hoja tiene que funcionar igual en claro, oscuro,
   sepia y alto contraste. */
.doc-hoja { background: var(--surface); border: 1px solid var(--border); border-radius: 12px;
  padding: 18px 20px; margin-bottom: 14px; }
.doc-top { display: grid; grid-template-columns: 1fr auto; gap: 16px; align-items: start;
  padding-bottom: 14px; border-bottom: 2px solid var(--border); margin-bottom: 16px; }
.doc-emisor .doc-razon { font-size: 16px; font-weight: 700; line-height: 1.25; }
.doc-emisor .doc-linea { font-size: 12px; color: var(--muted); line-height: 1.5; }
/* El recuadro del tipo y número: en una factura de papel es lo primero que se mira. */
.doc-caja { border: 1.5px solid var(--border); border-radius: 10px; padding: 10px 14px;
  min-width: 190px; text-align: center; }
.doc-caja .doc-tipo { font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-2); }
.doc-caja .doc-nro { font-family: var(--mono); font-size: 17px; font-weight: 700; margin: 3px 0; }
.doc-caja .doc-timb { font-size: 11px; color: var(--muted); line-height: 1.45; }
.doc-seccion { font-size: 11px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted); margin: 0 0 8px; }
/* Los campos dentro de la hoja van más compactos que en un formulario suelto: son
   parte de un documento, no una lista de preguntas. */
.doc-hoja .field { margin-bottom: 10px; }
.doc-hoja .field label { font-size: 12px; }

/* Detalle en tabla, como el cuerpo de una factura. */
.doc-items { width: 100%; border-collapse: collapse; font-size: 13px; }
.doc-items thead th { font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
  color: var(--muted); text-align: left; padding: 6px 8px; border-bottom: 1.5px solid var(--border); }
.doc-items thead th.n { text-align: right; }
.doc-items thead th.c { text-align: center; }
.doc-items td { padding: 6px 8px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.doc-items input, .doc-items select { width: 100%; padding: 6px 8px; font-size: 13px;
  border: 1px solid transparent; border-radius: 7px; background: transparent; color: var(--text); }
.doc-items input:hover, .doc-items select:hover { border-color: var(--border); }
.doc-items input:focus, .doc-items select:focus { border-color: var(--primary); background: var(--surface-2);
  outline: none; }
.doc-items input.n { text-align: right; font-family: var(--mono); }
.doc-items td.total { text-align: right; font-family: var(--mono); white-space: nowrap; }
.doc-items .fila-quitar { opacity: .45; }
.doc-items tr:hover .fila-quitar { opacity: 1; }

/* Totales: abajo a la derecha, como en cualquier factura. */
.doc-totales { display: flex; justify-content: flex-end; margin-top: 14px; }
.doc-totales .caja { min-width: 280px; }
.doc-totales .fila { display: flex; justify-content: space-between; gap: 24px;
  padding: 4px 0; font-size: 13px; color: var(--text-2); }
.doc-totales .fila.total { border-top: 2px solid var(--border); margin-top: 6px; padding-top: 8px;
  font-size: 17px; font-weight: 700; color: var(--text); }
.doc-totales .fila span:last-child { font-family: var(--mono); }

@media (max-width: 720px) {
  .doc-top { grid-template-columns: 1fr; }
  .doc-caja { min-width: 0; text-align: left; }
  .doc-items thead { display: none; }
  .doc-items td { display: block; border: none; padding: 3px 0; }
  .doc-items tr { display: block; border-bottom: 1px solid var(--border); padding: 8px 0; }
}

/* El verde de iOS, no el color de marca: un interruptor prendido se lee como
   "esto está activo" y ese verde es el que todo el mundo ya tiene aprendido.
   Se define como variable para poder cambiarlo en un solo lugar. */
:root { --switch-on: #34C759; }
/* El selector del tema oscuro de este CSS es `[data-theme="dark"]` a secas, no
   `:root[data-theme="dark"]`: con `:root` delante la regla nunca ganaba y el
   oscuro se quedaba con el verde del modo claro. */
[data-theme="dark"] { --switch-on: #30D158; }   /* el verde de iOS en oscuro */

/* ── Interruptor estilo iOS ───────────────────────────────────────────────────
   Reemplaza al checkbox donde la opción PRENDE O APAGA algo (no donde se
   selecciona de una lista): un interruptor se lee de un vistazo y dice en qué
   estado está sin tener que buscar el tilde.
   Uso:  <label class="switch"><input type="checkbox" …><span class="sw"></span>
           <span class="switch-txt">Texto</span></label>
   El input real queda oculto pero presente, así que sigue funcionando con
   teclado, con `.checked` y con los `onchange` de siempre. */
.switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font-size: 14px; }
.switch > input { position: absolute; opacity: 0; width: 0; height: 0; }
.switch .sw {
  position: relative; flex: 0 0 auto; width: 44px; height: 26px; border-radius: 999px;
  background: var(--border); transition: background var(--trans);
}
.switch .sw::after {
  content: ''; position: absolute; top: 3px; left: 3px; width: 20px; height: 20px;
  border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.3);
  transition: transform var(--trans);
}
.switch > input:checked + .sw { background: var(--switch-on); }
.switch > input:checked + .sw::after { transform: translateX(18px); }
/* Foco visible: es un control interactivo y tiene que verse al tabular. */
.switch > input:focus-visible + .sw { outline: 2px solid var(--switch-on); outline-offset: 2px; }
.switch > input:disabled + .sw { opacity: .45; }
.switch > input:disabled ~ .switch-txt { opacity: .55; }
.switch:has(> input:disabled) { cursor: default; }
.switch-txt { line-height: 1.35; }
.switch-txt .muted { display: block; font-size: 12px; }
