/* ── Variables ───────────────────────────────────────── */
/* Paleta base: modo oscuro (default). El modo claro y los temas de color
   se aplican con atributos en <html> (data-modo, data-tema) — ver theme.js. */
:root {
  --bg:        #0f1117;
  --bg2:       #1a1d27;
  --bg3:       #22263a;
  --border:    #2e3250;
  --accent:    #5b21b6;
  --accent-h:  #4c1d95;
  --green:     #22c55e;
  --red:       #ef4444;
  --yellow:    #eab308;
  --orange:    #f97316;
  --purple:    #a855f7;
  --text:      #e2e8f0;
  --muted:     #94a3b8;
  --sidebar-w: 216px;
}

/* ── Modo claro ──────────────────────────────────────── */
:root[data-modo="claro"] {
  --bg:     #f4f6fb;
  --bg2:    #ffffff;
  --bg3:    #eef1f8;
  --border: #dbe2f0;
  --text:   #1e293b;
  --muted:  #64748b;
  --fondo-overlay: rgba(244,246,251,.88);
}
:root { --fondo-overlay: rgba(15,17,23,.88); }

/* ── Colores del gráfico de Finanzas (Reportes) ── fijos, no siguen el tema de
   acento de la empresa: azul/naranja/aqua son 3 slots consecutivos de la
   paleta categórica del equipo, validados para no confundirse entre sí ni con
   los badges de estado (rojo/verde quedan reservados para esos, no para acá). */
:root {
  --fin-ingresos: #3987e5;
  --fin-egresos:  #d95926;
  --fin-ganancia: #199e70;
}
:root[data-modo="claro"] {
  --fin-ingresos: #2a78d6;
  --fin-egresos:  #eb6834;
  --fin-ganancia: #1baf7a;
}

/* ── Temas de color (independientes del modo claro/oscuro) ──
   "violeta" es el default ya definido arriba, no necesita override. */
:root[data-tema="azul"]    { --accent: #4f8ef7; --accent-h: #3a7ce0; }
:root[data-tema="verde"]   { --accent: #22c55e; --accent-h: #16a34a; }
:root[data-tema="purpura"] { --accent: #a855f7; --accent-h: #9333ea; }
:root[data-tema="naranja"] { --accent: #f97316; --accent-h: #ea580c; }
:root[data-tema="rosa"]    { --accent: #ec4899; --accent-h: #db2777; }
:root[data-tema="cian"]    { --accent: #06b6d4; --accent-h: #0891b2; }

/* ── Ajustes de contraste en modo claro para elementos que en oscuro
   usan colores oscuros translúcidos como fondo (chips, toasts, botones
   de estado): en un lienzo blanco esos mismos tonos oscuros se ven sucios,
   así que se invierten a fondo claro + texto oscuro saturado. */
:root[data-modo="claro"] {
  --chip-green-bg: #dcfce7;  --chip-green-fg: #15803d;  --chip-green-bd: #86efac;
  --chip-red-bg:   #fee2e2;  --chip-red-fg:   #b91c1c;  --chip-red-bd:   #fca5a5;
  --chip-yellow-bg:#fef9c3;  --chip-yellow-fg:#a16207;  --chip-yellow-bd:#fde047;
  --chip-blue-bg:  #dbeafe;  --chip-blue-fg:  #1d4ed8;  --chip-blue-bd:  #93c5fd;
  --chip-purple-bg:#f3e8ff;  --chip-purple-fg:#7e22ce;  --chip-purple-bd:#d8b4fe;
  --chip-orange-bg:#ffedd5;  --chip-orange-fg:#c2410c;  --chip-orange-bd:#fdba74;
  --hover-tint: #00000008;
  --banner-warn-bg:   #fef3c7;  --banner-warn-fg:   #92400e;
  --banner-danger-bg: #fee2e2;  --banner-danger-fg: #991b1b;
}
:root {
  --chip-green-bg: #14532d44;  --chip-green-fg: #4ade80;  --chip-green-bd: #4ade8033;
  --chip-red-bg:   #7f1d1d44;  --chip-red-fg:   #f87171;  --chip-red-bd:   #f8717133;
  --chip-yellow-bg:#78350f44;  --chip-yellow-fg:#fbbf24;  --chip-yellow-bd:#fbbf2433;
  --chip-blue-bg:  #1e3a8a44;  --chip-blue-fg:  #60a5fa;  --chip-blue-bd:  #60a5fa33;
  --chip-purple-bg:#4c1d9544;  --chip-purple-fg:#c4b5fd;  --chip-purple-bd:#c4b5fd33;
  --hover-tint: #ffffff05;
  --banner-warn-bg:   #78350f88;  --banner-warn-fg:   #fde68a;
  --banner-danger-bg: #7f1d1d88;  --banner-danger-fg: #fecaca;
  --chip-orange-bg:#7c2d1244;  --chip-orange-fg:#fb923c;  --chip-orange-bd:#fb923c33;
}

/* ── Reset ───────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { background: var(--bg); color: var(--text); font-family: 'Segoe UI', system-ui, sans-serif; font-size: 13px; line-height: 1.5; }
a { color: var(--accent); text-decoration: none; }
button { cursor: pointer; }
input, select, textarea { font-family: inherit; font-size: 13px; }
.hidden { display: none !important; }
.w-full { width: 100%; }
.px-3 { padding-left: 12px; padding-right: 12px; }
.mb-2 { margin-bottom: 8px; }
.text-sm { font-size: 12px; }
.text-muted { color: var(--muted); }
.text-green { color: var(--green); }
.text-red { color: var(--red); }
.text-yellow { color: var(--yellow); }
.text-accent { color: var(--accent); }
.mt-1 { margin-top: 4px; }
.mt-2 { margin-top: 8px; }
.mt-4 { margin-top: 16px; }
.flex { display: flex; }
.items-center { align-items: center; }
.gap-2 { gap: 8px; }
.gap-3 { gap: 12px; }
.font-bold { font-weight: 700; }

/* ── Scrollbar ───────────────────────────────────────── */
::-webkit-scrollbar { width: 5px; height: 5px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }

/* ── Toast ───────────────────────────────────────────── */
#toast-container { position: fixed; bottom: 24px; right: 24px; z-index: 9999; display: flex; flex-direction: column; gap: 8px; pointer-events: none; }
.toast { padding: 12px 18px; border-radius: 8px; font-size: 13px; font-weight: 500; min-width: 240px; max-width: 360px; box-shadow: 0 4px 16px #0006; animation: slideIn .25s ease; pointer-events: auto; display: flex; align-items: center; gap: 10px; }
.toast.hide { animation: slideOut .25s ease forwards; }
.toast-success { background: #14532d; border: 1px solid var(--green); color: #bbf7d0; }
.toast-error   { background: #7f1d1d; border: 1px solid var(--red);   color: #fecaca; }
.toast-info    { background: #1e3a8a; border: 1px solid var(--accent); color: #bfdbfe; }
.toast-warn    { background: #78350f; border: 1px solid var(--yellow); color: #fde68a; }
@keyframes slideIn { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } }
@keyframes slideOut { to { opacity: 0; transform: translateX(30px); } }

/* ── Modal ───────────────────────────────────────────── */
#modal-overlay { position: fixed; inset: 0; background: #000a; z-index: 1000; display: flex; align-items: center; justify-content: center; padding: 20px; }
#modal-box { background: var(--bg2); border: 1px solid var(--border); border-radius: 12px; width: 100%; max-width: 520px; max-height: 90vh; overflow-y: auto; }
#modal-box.modal-wide { max-width: 820px; }
#modal-box.modal-xwide { max-width: 1120px; }
#modal-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px 14px; border-bottom: 1px solid var(--border); }
#modal-title { font-size: 16px; font-weight: 700; }
#modal-close { background: none; border: none; color: var(--muted); font-size: 18px; line-height: 1; padding: 2px 6px; border-radius: 4px; transition: .15s; }
#modal-close:hover { background: var(--bg3); color: var(--text); }
#modal-body { padding: 20px; }

/* ── Confirm ─────────────────────────────────────────── */
#confirm-overlay { position: fixed; inset: 0; background: #000a; z-index: 1100; display: flex; align-items: center; justify-content: center; }
#confirm-box { background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 28px 24px; max-width: 360px; width: 100%; }
#confirm-msg { margin-bottom: 20px; font-size: 14px; line-height: 1.6; }
.confirm-btns { display: flex; gap: 10px; justify-content: flex-end; }

/* ── Login ───────────────────────────────────────────── */
#login-screen { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--bg); padding: 24px; }
.login-layout { width: min(1000px, 100%); min-height: 600px; display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(380px, .9fr); overflow: hidden; background: var(--bg2); border: 1px solid var(--border); border-radius: 20px; box-shadow: 0 28px 80px #0008; }
.login-layout-wide { grid-template-columns: minmax(0, .9fr) minmax(460px, 1.1fr); }
.login-layout-wide .login-form-panel { padding: 32px; }
.login-visual { position: relative; min-height: 600px; overflow: hidden; background: #0f1117; }
.login-visual img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.login-form-panel { display: flex; align-items: center; justify-content: center; padding: 44px; }
.login-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 14px; padding: 40px 36px; width: 100%; max-width: 380px; }
.login-form-panel .login-card { border: 0; border-radius: 0; padding: 0; }
.login-logo { text-align: center; margin-bottom: 28px; }
.login-logo .icon { font-size: 40px; }
.login-logo h1 { font-size: 20px; font-weight: 700; margin-top: 8px; }
.login-logo p { color: var(--muted); font-size: 12px; margin-top: 4px; }
.login-error { background: var(--chip-red-bg); border: 1px solid var(--red); color: var(--chip-red-fg); padding: 10px 14px; border-radius: 6px; font-size: 13px; margin-bottom: 14px; }
.login-ok { background: var(--chip-green-bg); border: 1px solid var(--green); color: var(--chip-green-fg); padding: 10px 14px; border-radius: 6px; font-size: 13px; margin-bottom: 14px; }
.login-card-wide { max-width: 460px; }
.login-switch { text-align: center; font-size: 12px; color: var(--muted); margin-top: 18px; }

@media (max-width: 860px) {
  #login-screen { padding: 0; }
  .login-layout { min-height: 100vh; grid-template-columns: minmax(0, 1fr) minmax(340px, .95fr); border: 0; border-radius: 0; }
  .login-visual { min-height: 100vh; }
  .login-form-panel { padding: 32px 24px; }
}

@media (max-width: 680px) {
  #login-screen { align-items: stretch; }
  .login-layout { display: block; background: var(--bg); }
  .login-visual { min-height: 200px; height: 28vh; max-height: 260px; }
  .login-form-panel { min-height: 70vh; align-items: flex-start; padding: 32px 24px 40px; }
}

/* ── App Shell ───────────────────────────────────────── */
#app-shell { display: flex; min-height: 100vh; }

/* ── Sidebar ─────────────────────────────────────────── */
/* overflow NO va acá (a diferencia de antes): #sidebar-footer vive dentro de
   este contenedor y sus menús desplegables (notificaciones/cuenta) necesitan
   poder salirse del recuadro del sidebar sin que se recorten. El scroll
   interno del menú de navegación vive en #sidebar-nav en su lugar. */
/* El sidebar es un "isla" siempre oscura (estilo Verifix/Discord), fija sin
   importar el modo claro/oscuro del resto de la app: se logra pisando acá las
   variables de color, que heredan a todo lo que vive adentro (footer, menús
   desplegables de notificaciones/cuenta, etc.) sin tocar ninguna otra regla. */
#sidebar {
  --bg2: #0a0b10; --bg3: #1c1f2e; --border: #23273a; --text: #eef1f8; --muted: #8992a8;
  width: var(--sidebar-w); min-width: var(--sidebar-w); background: var(--bg2); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 50;
}
.sidebar-logo { display: flex; align-items: center; gap: 12px; padding: 20px 16px; border-bottom: 1px solid var(--border); }
.sidebar-logo-text { flex: 1; min-width: 0; }
.logo-icon { font-size: 32px; }
.logo-title { font-weight: 700; font-size: 16px; }
.logo-sub { font-size: 12px; color: var(--accent); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 150px; }
#sidebar-compact-toggle { background: none; border: none; color: var(--muted); font-size: 14px; padding: 3px 5px; border-radius: 6px; flex-shrink: 0; }
#sidebar-compact-toggle:hover { background: var(--bg3); color: var(--text); }
#sidebar-nav { flex: 1; min-height: 0; overflow-y: auto; padding: 2px 0; }

/* ── Pie del sidebar: tema y notificaciones arriba, cuenta abajo del todo
   — orden a propósito, ver comentario en HTML. Filas de ancho completo,
   ícono + texto, blanco de toque grande (min-height 44px). */
#sidebar-footer { display: flex; flex-direction: column; align-items: stretch; gap: 4px; padding: 10px 8px; flex-shrink: 0; }
#sidebar-footer #notif-wrap { width: 100%; }
#sidebar-footer #notif-btn, #sidebar-footer #theme-toggle-btn {
  width: 100%; min-height: 44px; display: flex; align-items: center; gap: 12px; padding: 8px 10px; border-radius: 10px; font-size: 20px;
}
#sidebar-footer #notif-btn:hover, #sidebar-footer #theme-toggle-btn:hover { background: var(--bg3); }
#sidebar-footer .sidebar-footer-label { font-size: 13.5px; font-weight: 600; color: var(--text); }
#sidebar-footer .notif-badge { position: static; margin-left: auto; transform: none; }
#sidebar-footer .user-avatar { width: 32px; height: 32px; font-size: 13px; }
/* min-height ~44px: blanco de toque recomendado, no solo un renglón de texto. */
.nav-item { display: flex; align-items: center; gap: 12px; min-height: 44px; margin: 2px 8px; padding: 8px 12px; border-radius: 10px; color: var(--muted); font-size: 13.5px; cursor: pointer; transition: .15s; user-select: none; }
.nav-item:hover { color: var(--text); background: var(--bg3); }
.nav-item.active { color: #fff; background: var(--accent); font-weight: 600; box-shadow: 0 4px 14px -4px var(--accent); }
.nav-item .nav-icon { font-size: 23px; width: 27px; text-align: center; }

/* ── Main wrap ───────────────────────────────────────── */
/* min-width: 0 anula el mínimo automático de flexbox (que por defecto es el
   ancho del contenido): sin esto, una tabla ancha en cualquier página empuja
   #main-wrap más allá del viewport en vez de scrollear dentro de .table-wrap. */
#main-wrap { margin-left: var(--sidebar-w); flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 100vh; }
#topbar { background: var(--bg2); border-bottom: 1px solid var(--border); padding: 0 20px; height: 46px; display: flex; align-items: center; gap: 14px; position: sticky; top: 0; z-index: 40; }
#page-title { font-size: 15px; font-weight: 700; }
#page-content { padding: 12px 20px; flex: 1; }
#page-content.fondo-sucursal { background-size: cover; background-position: center; background-attachment: fixed; }
#sidebar-toggle { display: none; background: none; border: none; color: var(--text); font-size: 20px; padding: 4px 6px; border-radius: 6px; }
#sidebar-toggle:hover { background: var(--bg3); }
#sidebar-overlay { display: none; position: fixed; inset: 0; background: #000a; z-index: 45; }
#sidebar-overlay.show { display: block; }

/* ── Selector rápido de modo claro/oscuro ─────────────── */
#theme-toggle-btn { background: none; border: none; color: var(--text); font-size: 18px; padding: 6px 8px; border-radius: 6px; line-height: 1; }
#theme-toggle-btn:hover { background: var(--bg3); }

/* ── Apariencia (modal) ────────────────────────────────── */
.tema-modo-switch { display: flex; gap: 8px; }
.tema-modo-btn { flex: 1; background: var(--bg3); border: 1px solid var(--border); color: var(--text); padding: 10px; border-radius: 7px; font-size: 13px; font-weight: 600; transition: .15s; }
.tema-modo-btn:hover { border-color: var(--accent); }
.tema-modo-btn.active { border-color: var(--accent); background: var(--bg2); color: var(--accent); }
.tema-swatch-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
.tema-swatch { display: flex; align-items: center; gap: 8px; background: var(--bg3); border: 1px solid var(--border); color: var(--text); padding: 10px 12px; border-radius: 7px; font-size: 13px; font-weight: 600; transition: .15s; }
.tema-swatch:hover { border-color: var(--accent); }
.tema-swatch.active { border-color: var(--accent); background: var(--bg2); }
.tema-swatch-color { width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; box-shadow: inset 0 0 0 2px #ffffff33; }

/* ── Notificaciones ──────────────────────────────────── */
#notif-wrap { position: relative; }
#notif-btn { position: relative; background: none; border: none; color: var(--text); font-size: 18px; padding: 6px 8px; border-radius: 6px; line-height: 1; }
#notif-btn:hover { background: var(--bg3); }
.notif-badge { position: absolute; top: 0; right: 0; background: var(--red); color: #fff; font-size: 10px; font-weight: 700; min-width: 16px; height: 16px; border-radius: 999px; display: flex; align-items: center; justify-content: center; padding: 0 3px; transform: translate(35%, -35%); animation: notif-badge-pulse 1.6s ease-in-out infinite; }
@keyframes notif-badge-pulse { 0%, 100% { box-shadow: 0 0 0 0 #ff4d4f80; } 50% { box-shadow: 0 0 0 5px #ff4d4f00; } }
@keyframes notif-shake { 0%, 100% { transform: rotate(0); } 15% { transform: rotate(18deg); } 30% { transform: rotate(-16deg); } 45% { transform: rotate(12deg); } 60% { transform: rotate(-8deg); } 75% { transform: rotate(4deg); } }
.notif-shake { animation: notif-shake 0.6s ease-in-out; }
/* bottom (no top): el botón vive al pie del sidebar, así que el panel se abre
   hacia arriba para no salirse de la pantalla por abajo. */
.notif-panel { position: absolute; bottom: calc(100% + 8px); top: auto; left: 0; right: auto; width: 340px; max-height: 420px; overflow-y: auto; background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 8px 24px #0008; z-index: 60; }
.notif-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 14px; border-bottom: 1px solid var(--border); font-size: 13px; font-weight: 700; position: sticky; top: 0; background: var(--bg2); }
.notif-panel-body { padding: 4px 0; }
.notif-loading { display: flex; justify-content: center; padding: 24px; }
.notif-item { padding: 10px 14px; border-bottom: 1px solid var(--border); cursor: pointer; transition: .15s; }
.notif-item:last-child { border-bottom: none; }
.notif-item:hover { background: var(--bg3); }
.notif-item.unread { background: #4f8ef712; border-left: 3px solid var(--accent); }
.notif-item-titulo { font-size: 13px; font-weight: 700; margin-bottom: 2px; }
.notif-item-msg { font-size: 12px; color: var(--muted); margin-bottom: 4px; white-space: pre-wrap; }
.notif-item-meta { font-size: 11px; color: var(--muted); }

/* ── Menú de usuario (pie del sidebar, estilo Discord/Slack) ─────────── */
#user-menu-wrap { position: relative; width: 100%; min-width: 0; }
#user-menu-btn { display: flex; align-items: center; gap: 8px; width: 100%; background: none; border: none; color: var(--text); padding: 5px 6px 5px 4px; border-radius: 8px; }
#user-menu-btn:hover { background: var(--bg3); }
.user-avatar { width: 28px; height: 28px; border-radius: 50%; background: var(--accent); color: #fff; font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.user-menu-name { font-size: 13px; font-weight: 600; max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.user-menu-caret { font-size: 10px; color: var(--muted); margin-left: auto; }
.user-menu-panel { position: absolute; bottom: calc(100% + 8px); top: auto; left: 0; right: auto; width: 240px; background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 8px 24px #0008; z-index: 60; overflow: hidden; }
.user-menu-header { padding: 14px; border-bottom: 1px solid var(--border); }
.user-menu-item { display: block; padding: 10px 14px; font-size: 13px; color: var(--text); transition: .15s; }
.user-menu-item:hover { background: var(--bg3); }
.user-menu-item-danger:hover { color: var(--red); }

@media (max-width: 480px) {
  .user-menu-name { display: none; }
}

/* ── Page header ─────────────────────────────────────── */
/* El <h2> repite el mismo texto que ya se ve en #page-title (arriba, en el
   topbar), así que se oculta para no gastar una fila entera dos veces — el
   hijo que sigue al <h2> (los botones de acción) se corre a la derecha en su
   lugar. El selector solo aplica cuando hay un <h2> justo antes: los <h3> de
   subtítulo dentro de la misma página (ej. "Últimas ventas") no tienen <h2>
   al lado y quedan intactos, alineados a la izquierda como siempre. */
.page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; flex-wrap: wrap; gap: 12px; }
.page-header h2 { display: none; }
.page-header h2 + * { margin-left: auto; flex-wrap: wrap; }

/* ── Buttons ─────────────────────────────────────────── */
.btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 7px; font-size: 12.5px; font-weight: 600; border: none; transition: .15s; white-space: nowrap; }
.btn-primary { background: var(--accent); color: #fff; }
.btn-primary:hover { background: var(--accent-h); }
.btn-danger { background: #7f1d1d; color: #fca5a5; border: 1px solid var(--red); }
.btn-danger:hover { background: var(--red); color: #fff; }
.btn-ghost { background: var(--bg3); color: var(--text); border: 1px solid var(--border); }
.btn-ghost:hover { border-color: var(--accent); color: var(--accent); }
.btn-success { background: #14532d; color: #4ade80; border: 1px solid #4ade8033; }
.btn-success:hover { background: var(--green); color: #fff; }
.btn-sm { padding: 4px 9px; font-size: 11.5px; }
.btn-icon { padding: 5px 7px; }
.btn[disabled] { opacity: .5; cursor: not-allowed; }

/* ── Form ────────────────────────────────────────────── */
.form-group { margin-bottom: 8px; }
.form-group label { display: block; font-size: 11px; font-weight: 600; color: var(--muted); margin-bottom: 3px; letter-spacing: .3px; text-transform: uppercase; }
.input { width: 100%; background: var(--bg3); border: 1px solid var(--border); color: var(--text); border-radius: 7px; padding: 6px 10px; outline: none; transition: border-color .15s; }
.input:focus { border-color: var(--accent); }
.input::placeholder { color: var(--muted); }
select.input { cursor: pointer; }
.form-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 14px; }
.form-grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0 14px; }
.form-grid-4 { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 0 14px; }
.usr-empresa-checks { max-height: 160px; overflow-y: auto; border: 1px solid var(--border); border-radius: 7px; padding: 10px 12px; background: var(--bg3); display: flex; flex-direction: column; gap: 8px; }
.usr-check-item { display: flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer; }

/* ── Compras/Ventas: buscador con autocompletado + carrito ───── */
.buscador-wrap { position: relative; }
.autocomplete-list { position: absolute; top: 100%; left: 0; right: 0; z-index: 20; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; margin-top: 4px; max-height: 220px; overflow-y: auto; box-shadow: 0 8px 24px rgba(0,0,0,.4); }
.autocomplete-item { padding: 9px 12px; font-size: 13px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 8px; border-bottom: 1px solid var(--border); }
.autocomplete-item:last-child { border-bottom: none; }
.autocomplete-item:hover { background: var(--bg3); }
.autocomplete-price { color: var(--muted); font-size: 12px; white-space: nowrap; }
.autocomplete-empty { padding: 10px 12px; font-size: 13px; color: var(--muted); }
.autocomplete-crear { color: var(--accent); font-weight: 600; }
.selected-chip { display: inline-flex; align-items: center; gap: 8px; background: var(--bg3); border: 1px solid var(--border); border-radius: 20px; padding: 6px 8px 6px 14px; font-size: 13px; }
.chip-remove { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 13px; padding: 2px 6px; border-radius: 50%; }
.chip-remove:hover { background: var(--red); color: #fff; }
.carrito-input { max-width: 100px; }
.carrito-stepper { display: flex; align-items: center; gap: 4px; }
.carrito-stepper .carrito-input { max-width: 56px; text-align: center; }
.carrito-stepper-btn { width: 30px; height: 30px; flex-shrink: 0; border-radius: 8px; border: 1px solid var(--border); background: var(--bg3); color: var(--text); font-size: 16px; font-weight: 700; cursor: pointer; line-height: 1; }
.carrito-stepper-btn:hover, .carrito-stepper-btn:active { border-color: var(--accent); color: var(--accent); }
.carrito-quitar-btn { min-width: 36px; min-height: 36px; font-size: 15px; }
.carrito-lote-row td { padding-top: 0; border-top: none; }
.carrito-lote-input { max-width: 220px; }
.carrito-fila-error td { background: var(--chip-red-bg); border-top-color: var(--chip-red-bd); }
.doc-total-row { text-align: right; font-size: 16px; margin: 14px 0; padding-top: 12px; border-top: 1px solid var(--border); }

/* ── Nueva Venta: buscador + carrito compacto de la barra lateral ─ */
/* El carrito de Ventas vive en la barra lateral, una fila por producto
   (nombre truncado + cantidad×precio editables + total + quitar, todo en la
   misma línea) en vez de una tabla ancha — Compras sigue usando su propia
   tabla (.carrito-input/.carrito-stepper de arriba), no se tocó nada de eso. */
.venta-main #venta-buscar-producto { min-height: 46px; font-size: 15px; }
.carrito-lista { display: flex; flex-direction: column; gap: 6px; }
.carrito-vacio { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 2px; padding: 28px 10px; color: var(--muted); }
.carrito-vacio-icon { font-size: 34px; opacity: .5; margin-bottom: 6px; }
.carrito-vacio p { margin: 0; font-size: 13px; }
.carrito-vacio p:first-of-type { font-weight: 700; color: var(--text); font-size: 14px; }
.carrito-item { background: var(--bg3); border: 1px solid var(--border); border-radius: 8px; padding: 7px 10px; }
.carrito-item.carrito-fila-error { border-color: var(--red); background: var(--chip-red-bg); }
.carrito-item-row { display: flex; align-items: center; gap: 6px; }
.carrito-item-nombre { flex: 1; min-width: 0; font-size: 13px; font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.carrito-item-total { font-size: 13px; font-weight: 700; color: var(--accent); white-space: nowrap; flex-shrink: 0; min-width: 52px; text-align: right; }
.carrito-input-mini { width: 42px; flex-shrink: 0; padding: 4px 3px; font-size: 12.5px; text-align: center; background: var(--bg2); border: 1px solid var(--border); border-radius: 5px; color: var(--text); }
/* Precio de venta: nunca editable, para ningún rol (ver crear_venta en el
   backend, que lo rechaza igual aunque se salte esto a mano) — el único
   descuento válido es el de una promoción. */
.carrito-item-precio-fijo { flex-shrink: 0; min-width: 42px; text-align: center; font-size: 12.5px; color: var(--muted); }
.carrito-item-x { font-size: 12px; color: var(--muted); flex-shrink: 0; }
.carrito-descuento { font-size: 11px; color: var(--yellow); margin-top: 2px; }

/* ── Nueva Venta: vista de página completa (no modal) ─────────── */
/* 70px = 46px del topbar + 24px de padding vertical de #page-content: con esto
   la barra de atajos queda pegada abajo del viewport (vía margin-top:auto en
   .atajos-bar-footer) incluso cuando el carrito está vacío y el contenido no
   llega a llenar la pantalla, en vez de quedar "flotando" a mitad de página. */
.venta-page { display: flex; flex-direction: column; min-height: calc(100vh - 70px); }
/* La barra lateral ya no es un ancho fijo: crece con el viewport (con un
   piso y un techo razonables) para no dejar espacio desperdiciado en
   monitores grandes ni quedar angosta en laptops chicas. */
.venta-layout { display: grid; grid-template-columns: minmax(0, 1fr) clamp(360px, 26vw, 480px); gap: 14px; align-items: start; }
/* min-width: 0 anula el mínimo automático de grid (igual que en #main-wrap más
   arriba): sin esto, la tabla del carrito o la grilla de productos empujaban
   toda la fila más allá del viewport en vez de scrollear internamente — en
   pantallas ~1280px (laptop común) esto llegaba a cortar la barra lateral
   entera (total, botón "Registrar Venta") fuera de la vista. */
/* Mismo patrón que .venta-sidebar: header (buscador) y sub-header (pestañas de
   categoría) fijos, solo la grilla de productos (#venta-productos-grid) crece
   y encoge con su propio scroll. En mobile/tablet no hay stretch (ver abajo),
   así que acá no pasa nada — cada hijo simplemente ocupa su alto natural. */
.venta-main { background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 12px; min-width: 0; display: flex; flex-direction: column; overflow-y: auto; }
.venta-main > .form-group:first-child { flex: 0 0 auto; }
#venta-categoria-tabs { flex: 0 0 auto; }
#venta-productos-grid { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
/* La barra lateral es flex-column con 3 hijos directos (header, #venta-carrito,
   #venta-form): header y form nunca encogen (flex: 0 0 auto, más abajo) — solo
   #venta-carrito (la lista de productos del carrito) crece y encoge, con su
   propio scroll interno. Así, con un carrito largo, lo que scrollea es la
   lista de productos — sucursal/cliente/método de pago/total/"Registrar Venta"
   siempre quedan visibles, nunca empujados fuera de la vista. */
.venta-sidebar {
  background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 11px;
  position: sticky; top: 8px;
  max-height: calc(100vh - 16px);
  display: flex; flex-direction: column;
  /* Respaldo, no el mecanismo principal: si la ventana es tan baja que ni
     encogiendo el carrito a 0 entran el header+form, esto deja scrollear la
     barra entera en vez de recortar "Registrar Venta" sin forma de llegar. */
  overflow-y: auto;
}
/* Carrito de venta: ahora vive arriba del formulario en la barra lateral (antes
   estaba en la columna central) — título + botón para vaciarlo de un toque,
   sin depender solo del atajo Esc. */
.venta-carrito-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; flex: 0 0 auto; }
.venta-carrito-header h3 { font-size: 14px; margin: 0; }
#venta-carrito { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
#venta-form { flex: 0 0 auto; }
.venta-total-box { text-align: center; background: var(--bg3); border: 1px solid var(--accent); border-radius: 10px; padding: 7px; margin: 8px 0; }
.venta-total-label { font-size: 10px; font-weight: 700; letter-spacing: 1px; color: var(--muted); text-transform: uppercase; margin-bottom: 2px; }
.venta-total-monto { font-size: 22px; font-weight: 800; color: var(--accent); line-height: 1.1; }
/* Monto recibido: es la cifra que el cajero más necesita ver bien clara (de
   ella sale el cambio a devolver) — se agranda respecto al resto de los
   campos del formulario, que son de una sola pasada y no hace falta releer. */
.input-monto-grande { font-size: 22px; font-weight: 800; text-align: center; padding: 10px; color: var(--accent); }

/* ── Pestañas de categoría (selector táctil por categoría) ──────── */
/* Tamaño pensado para dedo, no solo mouse: la fila de categorías es lo
   primero que se toca al vender, así que el blanco de toque es grande
   (min-height ~40px) aunque eso "desperdicie" espacio en desktop. */
.categoria-tabs { display: flex; flex-wrap: nowrap; overflow-x: auto; gap: 8px; padding-bottom: 6px; margin-top: 4px; -webkit-overflow-scrolling: touch; }
.categoria-tab { flex: 0 0 auto; min-height: 40px; background: var(--bg3); border: 1px solid var(--border); border-radius: 20px; padding: 9px 18px; font-size: 13.5px; font-weight: 600; color: var(--muted); cursor: pointer; transition: .15s; white-space: nowrap; }
.categoria-tab:hover { border-color: var(--accent); color: var(--text); }
.categoria-tab.active { background: var(--accent); border-color: var(--accent); color: #fff; }

/* ── Catálogo de productos (selector rápido con imágenes, tocable) ── */
/* Ya no comparte columna con el carrito (que se movió a la barra lateral), así
   que usa todo el alto disponible en vez de scrollear en una caja chica — la
   barra lateral (carrito + cobro) es la que queda "sticky" al lado mientras
   se recorre el catálogo. */
.producto-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; margin-bottom: 10px; }
.producto-card { position: relative; background: var(--bg3); border: 1px solid var(--border); border-radius: 12px; padding: 12px; cursor: pointer; transition: .15s; text-align: center; }
.producto-card:hover, .producto-card:active { border-color: var(--accent); transform: translateY(-2px); box-shadow: 0 6px 16px -8px rgba(0,0,0,.35); }
.producto-card-img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 10px; margin-bottom: 8px; }
.producto-card-placeholder { display: flex; align-items: center; justify-content: center; font-size: 38px; background: var(--bg2); opacity: .4; }
.producto-card-nombre { font-size: 13px; color: var(--text); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.producto-card-precio { font-size: 13px; color: var(--accent); font-weight: 700; }
.producto-card-fav {
  position: absolute; top: 8px; right: 8px; width: 26px; height: 26px; border-radius: 50%;
  background: rgba(0,0,0,.4); display: flex; align-items: center; justify-content: center;
  font-size: 15px; line-height: 1; color: #cbd5e1; cursor: pointer; transition: .15s; z-index: 1;
}
.producto-card-fav:hover { background: rgba(0,0,0,.6); transform: scale(1.12); }
.producto-card-fav.active { color: #ffc107; }
.producto-card-cant {
  position: absolute; top: 8px; left: 8px; width: 26px; height: 26px; border-radius: 50%;
  background: rgba(0,0,0,.4); display: flex; align-items: center; justify-content: center;
  font-size: 13px; line-height: 1; color: #cbd5e1; cursor: pointer; transition: .15s; z-index: 1;
}
.producto-card-cant:hover { background: rgba(0,0,0,.6); transform: scale(1.12); }

/* ── Selector de cantidad (modal): grilla 1-10 de toque único ──────── */
.cantidad-picker-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; }
.cantidad-picker-btn {
  min-height: 52px; border-radius: 10px; border: 1px solid var(--border); background: var(--bg3);
  color: var(--text); font-size: 18px; font-weight: 700; cursor: pointer; transition: .15s;
}
.cantidad-picker-btn:hover, .cantidad-picker-btn:active { border-color: var(--accent); color: var(--accent); background: var(--bg2); }
/* Tarjeta "+ Agregar producto": mismo tamaño que el resto, estilo punteado para
   distinguirla de un producto real (ver reference de catálogo tipo Verifix). */
.producto-card-agregar {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  min-height: 128px; border: 2px dashed var(--border); background: transparent; color: var(--muted);
  font-size: 12px; font-weight: 700; letter-spacing: .3px; line-height: 1.4;
}
.producto-card-agregar:hover { border-color: var(--accent); color: var(--accent); transform: none; box-shadow: none; }
.producto-card-agregar .plus-icon { font-size: 28px; font-weight: 400; }
.btn-lg { padding: 12px; font-size: 15px; min-height: 48px; }

/* ── Método de pago: botones grandes de un toque, no <select> ───── */
.metodo-pago-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.metodo-pago-btn {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
  min-height: 54px; border-radius: 10px; border: 2px solid transparent; cursor: pointer;
  font-size: 20px; color: #fff; opacity: .55; transition: .15s; padding: 8px 4px;
}
.metodo-pago-btn span { font-size: 11px; font-weight: 700; }
.metodo-pago-btn.active { opacity: 1; border-color: rgba(255,255,255,.6); transform: translateY(-1px); }
.metodo-efectivo { background: #16a34a; }
.metodo-qr { background: #7c3aed; }
.metodo-tarjeta { background: #2563eb; }
.metodo-mixto { background: #ea580c; }

/* ── Pago mixto: 3 montos (efectivo/QR/tarjeta) en vez de uno solo ─── */
.venta-mixto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.venta-mixto-item label { display: block; font-size: 11px; font-weight: 600; color: var(--muted); margin-bottom: 3px; }
.venta-mixto-item .input { text-align: center; font-weight: 700; }
.section-subtitle { font-size: 15px; font-weight: 700; color: var(--text); margin: 0; }
.atajos-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; padding: 5px 12px; margin-bottom: 8px; font-size: 11.5px; color: var(--muted); }
.atajos-bar kbd { background: var(--bg3); border: 1px solid var(--border); border-bottom-width: 2px; border-radius: 4px; padding: 1px 6px; font-family: inherit; font-size: 11px; font-weight: 700; color: var(--text); }
.atajos-tutorial-link { margin-left: auto; color: var(--accent); font-weight: 600; }
.atajos-bar-footer { margin-top: auto; margin-bottom: 0; }
/* Sucursal vive acá (no arriba en el form de cobro): es contexto fijo de la
   sesión, casi nunca cambia mientras se vende, así que no necesita ocupar
   espacio en el panel de cobro — se muestra compacta, a juego con el resto
   de esta barra angosta de atajos. */
.atajos-sucursal { display: flex; align-items: center; gap: 6px; padding-right: 10px; border-right: 1px solid var(--border); }
.atajos-sucursal #venta-sucursal-slot { display: flex; }
.atajos-sucursal .input { width: auto; min-width: 140px; padding: 3px 8px; font-size: 11.5px; border-radius: 5px; }
.form-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.input-wrap { position: relative; }
.input-wrap .input { padding-right: 36px; }
.search-icon { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: var(--muted); pointer-events: none; }

/* ── Password toggle (ojito) ────────────────────────── */
.password-wrap { position: relative; }
.password-wrap .input { padding-right: 40px; }
.password-toggle { position: absolute; right: 4px; top: 50%; transform: translateY(-50%); background: none; border: none; color: var(--muted); padding: 6px; border-radius: 6px; display: flex; align-items: center; justify-content: center; transition: .15s; }
.password-toggle:hover { color: var(--text); background: var(--bg3); }
.password-toggle svg { width: 16px; height: 16px; display: block; }

/* ── Filters bar ─────────────────────────────────────── */
.filters { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; }
.filters .input { width: auto; flex: 1; min-width: 160px; max-width: 260px; }

/* ── Table ───────────────────────────────────────────── */
.table-wrap { overflow-x: auto; border-radius: 10px; border: 1px solid var(--border); }
table { width: 100%; border-collapse: collapse; }
thead th { background: var(--bg3); color: var(--muted); font-size: 11px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase; padding: 6px 14px; text-align: left; white-space: nowrap; }
thead th.th-sortable { cursor: pointer; user-select: none; transition: color .15s; }
thead th.th-sortable:hover { color: var(--text); }
tbody td { padding: 5px 14px; border-top: 1px solid var(--border); vertical-align: middle; }
tbody tr:hover td { background: var(--hover-tint); }
.td-actions { display: flex; gap: 6px; }
.empty-row td { text-align: center; padding: 20px; color: var(--muted); font-size: 12.5px; }

/* ── Table pagination ───────────────────────────────────── */
.table-pagination { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; margin-top: 10px; font-size: 12px; color: var(--muted); }
.table-pagination-size { display: flex; align-items: center; gap: 6px; }
.table-pagination-size select { width: auto; padding: 4px 8px; font-size: 12px; }
.table-pagination-nav { display: flex; align-items: center; gap: 10px; }
.table-pagination-page { white-space: nowrap; }

/* ── Badges ──────────────────────────────────────────── */
.badge { display: inline-flex; align-items: center; padding: 3px 9px; border-radius: 20px; font-size: 11px; font-weight: 700; gap: 4px; }
.badge-green  { background: var(--chip-green-bg);  color: var(--chip-green-fg);  border: 1px solid var(--chip-green-bd); }
.badge-red    { background: var(--chip-red-bg);    color: var(--chip-red-fg);    border: 1px solid var(--chip-red-bd); }
.badge-yellow { background: var(--chip-yellow-bg); color: var(--chip-yellow-fg); border: 1px solid var(--chip-yellow-bd); }
.badge-blue   { background: var(--chip-blue-bg);   color: var(--chip-blue-fg);   border: 1px solid var(--chip-blue-bd); }
.badge-purple { background: var(--chip-purple-bg); color: var(--chip-purple-fg); border: 1px solid var(--chip-purple-bd); }
.badge-gray   { background: var(--bg3); color: var(--muted); border: 1px solid var(--border); }
.badge-orange { background: var(--chip-orange-bg); color: var(--chip-orange-fg); border: 1px solid var(--chip-orange-bd); }

/* ── Stats cards ─────────────────────────────────────── */
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 14px; margin-bottom: 24px; }
.stat-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 18px 20px; }
.stat-card .stat-label { font-size: 11px; color: var(--muted); font-weight: 600; text-transform: uppercase; letter-spacing: .5px; }
.stat-card .stat-value { font-size: 30px; font-weight: 800; margin: 4px 0; }
.stat-card .stat-sub { font-size: 11px; color: var(--muted); }
.stat-card.green { border-color: #4ade8033; }
.stat-card.green .stat-value { color: var(--green); }
.stat-card.red { border-color: #f8717133; }
.stat-card.red .stat-value { color: var(--red); }
.stat-card.yellow { border-color: #fbbf2433; }
.stat-card.yellow .stat-value { color: var(--yellow); }
.stat-card.blue { border-color: #60a5fa33; }
.stat-card.blue .stat-value { color: var(--accent); }

/* ── Section card ────────────────────────────────────── */
.card { background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 14px; margin-bottom: 14px; }
.card-title { font-size: 14px; font-weight: 700; margin-bottom: 14px; display: flex; align-items: center; gap: 8px; }

/* ── Spinner ─────────────────────────────────────────── */
.spinner { width: 32px; height: 32px; border: 3px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin .7s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.loading-page { display: flex; align-items: center; justify-content: center; height: 200px; }
.btn .spinner { width: 14px; height: 14px; border-width: 2px; }

/* ── Inventario specific ─────────────────────────────── */
.inv-select-bar { display: flex; gap: 12px; margin-bottom: 20px; flex-wrap: wrap; }
.inv-select-bar .input { max-width: 240px; }
.stock-ok   { color: var(--green); font-weight: 700; }
.stock-low  { color: var(--yellow); font-weight: 700; }
.stock-zero { color: var(--red); font-weight: 700; }

/* ── Reportes ────────────────────────────────────────── */
.reportes-layout { display: grid; grid-template-columns: 1fr 280px; gap: 14px; align-items: start; }
.reportes-sidebar { position: sticky; top: 8px; }
@media (max-width: 900px) {
  .reportes-layout { grid-template-columns: 1fr; }
  .reportes-sidebar { position: static; }
}
.report-grid, .reports-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
.report-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 20px; display: flex; flex-direction: column; gap: 10px; }
.report-card h4 { font-size: 14px; font-weight: 700; }
.report-card p { font-size: 12px; color: var(--muted); flex: 1; }

/* Menú de reportes: un filtro de fecha/sucursal compartido arriba y cada
   reporte como una fila de lista (en vez de repetir los mismos campos de
   fecha en una tarjeta por reporte). */
.report-row { display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 14px 4px; border-bottom: 1px solid var(--border); }
.report-row:last-child { border-bottom: none; }
.report-row-info { display: flex; align-items: flex-start; gap: 12px; min-width: 0; }
.report-row-icon { font-size: 20px; line-height: 1.3; }
.report-row-title { font-size: 14px; font-weight: 700; }
.report-row-desc { font-size: 12px; color: var(--muted); margin-top: 2px; }
.report-row-actions { display: flex; gap: 8px; flex-shrink: 0; align-items: center; }

@media (min-width: 1500px) {
  .reportes-main > .card:has(.report-row) { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); column-gap: 18px; }
  .reportes-main > .card:has(.report-row) > .card-title { grid-column: 1 / -1; }
  .reportes-main > .card:has(.report-row) .report-row { min-width: 0; padding: 9px 4px; }
  .reportes-main > .card:has(.report-row) .report-row:nth-last-child(-n+2) { border-bottom: none; }
  .reportes-main > .card:has(.report-row) .report-row-desc { line-height: 1.3; }
}

@media (max-width: 768px) {
  .report-row { flex-direction: column; align-items: stretch; }
  .report-row-actions { justify-content: flex-end; }
}
.mb-3 { margin-bottom: 12px; }
.stat-value.ok     { color: var(--green); }
.stat-value.warn   { color: var(--yellow); }
.stat-value.danger { color: var(--red); }

/* ── Reportes: gráfico de Finanzas (barras + línea) ─────────────────────
   Ver Utils.comboChart (utils.js) — barras ancladas a la línea de cero,
   línea con marcadores para la serie derivada, tooltip por banda de hover. */
.fchart-legend { display: flex; gap: 18px; margin-bottom: 10px; flex-wrap: wrap; }
.fchart-legend-item { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--muted); font-weight: 600; }
.fchart-legend-item i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
/* max-width en vez de un height fijo en el svg: con el viewBox 760x300, esto
   limita el alto proporcionalmente (~340px) sin dejar franjas vacías a los
   costados en pantallas anchas, que es lo que pasaba con solo height:auto. */
.fchart-wrap { position: relative; max-width: 860px; }
.fchart-svg { width: 100%; height: auto; display: block; overflow: visible; }
.fchart-grid { stroke: var(--border); stroke-width: 1; }
.fchart-zero { stroke: var(--muted); stroke-width: 1.2; }
.fchart-axis-label { font-size: 10px; fill: var(--muted); font-family: ui-sans-serif, sans-serif; }
.fchart-bar { opacity: .9; transition: opacity .12s; }
.fchart-bar.is-hover { opacity: 1; }
.fchart-bar-ing { fill: var(--fin-ingresos); }
.fchart-bar-egr { fill: var(--fin-egresos); }
.fchart-line { fill: none; stroke: var(--fin-ganancia); stroke-width: 2; }
.fchart-dot { fill: var(--fin-ganancia); stroke: var(--bg2); stroke-width: 2; transition: r .12s; }
.fchart-dot.is-hover { r: 6.5; }
.fchart-hit { fill: transparent; cursor: pointer; }
.fchart-tip {
  position: absolute; pointer-events: none; background: var(--bg3); border: 1px solid var(--border);
  border-radius: 8px; padding: 8px 10px; font-size: 12px; box-shadow: 0 8px 20px #0006; z-index: 5; min-width: 150px;
}
.fchart-tip-title { font-weight: 700; margin-bottom: 6px; font-size: 12px; }
.fchart-tip-row { display: flex; align-items: center; gap: 6px; padding: 2px 0; }
.fchart-tip-row i { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }
.fchart-tip-row b { margin-left: auto; font-variant-numeric: tabular-nums; }

/* ── Productos: pestaña "Más vendidos" — lista de clientes top ─────────── */
.mv-cliente-row { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 12.5px; }
.mv-cliente-row:last-child { border-bottom: none; }
.mv-cliente-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.mv-cliente-val { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; white-space: nowrap; flex-shrink: 0; }
.mv-cliente-meta { font-size: 11px; color: var(--muted); font-weight: 400; }

/* ── Dashboard: panel "Ventas de hoy por caja" (ver ventas_por_caja.js) ── */
.vpc-sucursal { margin-bottom: 14px; }
.vpc-sucursal:last-child { margin-bottom: 0; }
.vpc-sucursal-header { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--border); margin-bottom: 4px; }
.vpc-sucursal-header .text-muted { flex: 1; }
.vpc-sucursal-total { font-weight: 700; font-variant-numeric: tabular-nums; }
.vpc-caja-row { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 6px 0; font-size: 13px; border-bottom: 1px solid var(--border); }
.vpc-caja-row:last-child { border-bottom: none; }
.vpc-caja-montos { display: flex; gap: 12px; white-space: nowrap; font-variant-numeric: tabular-nums; font-size: 12.5px; }

/* ── Mapa del almacén (ver mapa_almacen.js) ──────────────────────────────
   Zoom: el canvas nunca cambia de tamaño (position:absolute; inset:0, sin
   transform); lo que cambia es left/top/width/height % de cada estante,
   recalculados en JS a partir de su posición lógica × el zoom actual. */
.mapa-toolbar { display: flex; justify-content: flex-end; margin-bottom: 10px; }
.mapa-layout { display: flex; gap: 16px; align-items: flex-start; }
.mapa-viewport-wrap { flex: 1; min-width: 0; }
.mapa-panel { flex: 0 0 40%; max-width: 420px; min-width: 260px; }
.mapa-panel.hidden { display: none; }
@media (max-width: 900px) { .mapa-layout { flex-direction: column; } .mapa-panel { flex: 1 1 auto; max-width: none; width: 100%; } }

.mapa-viewport {
  position: relative; overflow: auto; min-height: 360px;
  border: 1px solid var(--border); border-radius: 10px; background: var(--bg2);
  background-image: radial-gradient(var(--border) 1px, transparent 1px);
  background-size: 22px 22px;
}
.mapa-plano-canvas { position: absolute; inset: 0; }

.mapa-fab {
  position: absolute; top: 10px; left: 10px; z-index: 5; width: 38px; height: 38px; border-radius: 50%;
  background: var(--accent); color: #fff; border: none; font-size: 20px; font-weight: 700; cursor: pointer;
  display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 10px #0004; line-height: 1;
}
.mapa-fab.hidden { display: none; }
.mapa-zoom-controls {
  position: absolute; top: 10px; right: 10px; z-index: 5; display: flex; align-items: center; gap: 2px;
  background: var(--bg2); border: 1px solid var(--border); border-radius: 999px; padding: 4px 8px;
  box-shadow: 0 4px 10px #0004;
}
.mapa-zoom-btn { background: transparent; border: none; color: var(--text); font-size: 15px; width: 22px; height: 22px; cursor: pointer; border-radius: 50%; line-height: 1; }
.mapa-zoom-btn:hover { background: var(--bg3); }
.mapa-zoom-pct { font-size: 11px; color: var(--muted); min-width: 32px; text-align: center; font-variant-numeric: tabular-nums; }
.mapa-zoom-sep { width: 1px; height: 16px; background: var(--border); margin: 0 2px; }

.mapa-estante-rect {
  position: absolute; border-radius: 6px; border: 1.5px solid; cursor: grab;
  display: flex; align-items: center; justify-content: center; padding: 4px;
  font-size: 11px; font-weight: 700; text-align: center; overflow: hidden;
  user-select: none; touch-action: none; transition: box-shadow .12s;
}
.mapa-estante-rect:active { cursor: grabbing; }
.mapa-estante-rect.is-selected { box-shadow: 0 0 0 2px var(--accent); z-index: 2; }
.mapa-estante-nombre { pointer-events: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mapa-resize-handle {
  position: absolute; right: 0; bottom: 0; width: 14px; height: 14px; cursor: nwse-resize;
  background: linear-gradient(135deg, transparent 50%, currentColor 50%); opacity: .5; border-bottom-right-radius: 6px;
}
.mapa-estante-green  { background: var(--chip-green-bg);  border-color: var(--chip-green-bd);  color: var(--chip-green-fg); }
.mapa-estante-blue    { background: var(--chip-blue-bg);   border-color: var(--chip-blue-bd);   color: var(--chip-blue-fg); }
.mapa-estante-yellow  { background: var(--chip-yellow-bg); border-color: var(--chip-yellow-bd); color: var(--chip-yellow-fg); }
.mapa-estante-purple  { background: var(--chip-purple-bg); border-color: var(--chip-purple-bd); color: var(--chip-purple-fg); }
.mapa-estante-orange  { background: var(--chip-orange-bg); border-color: var(--chip-orange-bd); color: var(--chip-orange-fg); }

.mapa-panel-header { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 12px; }
.mapa-panel-acciones { display: flex; gap: 6px; flex-shrink: 0; }
.mapa-grid-pisos { display: flex; flex-direction: column; gap: 6px; }
.mapa-piso-row { display: flex; align-items: center; gap: 8px; }
.mapa-piso-label { font-size: 11px; font-weight: 700; color: var(--muted); width: 22px; flex-shrink: 0; }
.mapa-cuadrantes { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; flex: 1; }
.mapa-cuadrante {
  aspect-ratio: 1; border: 1px solid var(--border); border-radius: 5px; background: var(--bg2);
  display: flex; align-items: center; justify-content: center; font-size: 11px; color: var(--muted);
}
.mapa-cuadrante.is-ocupada { background: var(--chip-green-bg); border-color: var(--chip-green-bd); color: var(--chip-green-fg); cursor: pointer; font-weight: 700; }
.mapa-cuadrante.is-resaltada { outline: 2px solid var(--accent); outline-offset: 1px; }
.mapa-cuadrante.is-elegida { background: var(--chip-blue-bg); border-color: var(--chip-blue-bd); color: var(--chip-blue-fg); font-weight: 700; cursor: pointer; }
.mapa-cuadrante-vacia { visibility: hidden; }
.mapa-productos-lista { margin: 0; padding-left: 18px; font-size: 13px; }

.mapa-popup-layout { display: flex; gap: 18px; align-items: flex-start; }
@media (max-width: 640px) { .mapa-popup-layout { flex-direction: column; } }
.mapa-popup-mini { flex: 1.6; min-width: 0; }
.mapa-popup-detalle { flex: 1; max-width: 220px; }
@media (max-width: 640px) { .mapa-popup-detalle { max-width: none; } }
.mapa-popup-mini-plano { position: relative; height: 280px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg2); overflow: hidden; }
.mapa-popup-mini-rect {
  position: absolute; border-radius: 4px; border: 1.5px solid; display: flex; align-items: center; justify-content: center;
  font-size: 10px; font-weight: 700; overflow: hidden; cursor: default;
}
.mapa-popup-mini-rect.is-clickable { cursor: pointer; }
.mapa-popup-mini-rect.is-resaltado { box-shadow: 0 0 0 2px var(--accent); z-index: 2; animation: mapaPulse 1.4s ease-in-out infinite; }
@keyframes mapaPulse { 0%, 100% { box-shadow: 0 0 0 2px var(--accent); } 50% { box-shadow: 0 0 0 5px var(--accent); } }
@media (prefers-reduced-motion: reduce) { .mapa-popup-mini-rect.is-resaltado { animation: none; } }
.mapa-popup-detalle-header { margin-bottom: 8px; }
.mapa-popup-codigo { margin: 10px 0 0; font-size: 12px; color: var(--muted); text-align: center; }

.mapa-pin { cursor: pointer; opacity: .9; }
.mapa-pin:hover { opacity: 1; }
.mapa-pin.mapa-pin-disabled { opacity: .3; cursor: default; }

/* ── Plan banner ─────────────────────────────────────── */
.plan-banner { padding: 10px 24px; font-size: 13px; font-weight: 500; display: flex; align-items: center; gap: 8px; }
.plan-banner-warn   { background: var(--banner-warn-bg); border-bottom: 1px solid var(--yellow); color: var(--banner-warn-fg); }
.plan-banner-danger { background: var(--banner-danger-bg); border-bottom: 1px solid var(--red);    color: var(--banner-danger-fg); }

/* ── Aviso inline dentro de formularios/modales (mismo estilo que plan-banner
   pero contenido, con bordes redondeados, para usar dentro de un form-group) ── */
.form-warn-box { background: var(--banner-warn-bg); color: var(--banner-warn-fg); border: 1px solid var(--yellow); border-radius: 7px; padding: 9px 12px; font-size: 12.5px; line-height: 1.4; margin-bottom: 10px; }

/* ── Actividad por sucursal ──────────────────────────── */
/* Ancho mínimo mayor que .stats-grid genérico: las 3 columnas de métricas
   necesitan más aire que una tarjeta de KPI suelta. */
.actividad-suc-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
.actividad-suc-caja-info { font-size: 12px; color: var(--muted); margin: 2px 0 12px; }
.actividad-suc-metrics { display: flex; margin-top: 6px; border-top: 1px solid var(--border); }
.actividad-metric-col { flex: 1; display: flex; flex-direction: column; align-items: center; text-align: center; gap: 3px; padding: 12px 6px 4px; border-left: 1px solid var(--border); }
.actividad-metric-col:first-child { border-left: none; }
.actividad-metric-label { font-size: 11px; color: var(--muted); white-space: nowrap; }
.actividad-metric-value { font-size: 17px; font-weight: 700; color: var(--text); line-height: 1.2; }
.actividad-metric-sub { font-size: 11px; font-weight: 400; color: var(--muted); }

/* ── Plan modal ──────────────────────────────────────── */
.plan-status-card { background: var(--bg3); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; margin-bottom: 18px; }
.plan-info-row { display: flex; gap: 10px; font-size: 12px; margin-top: 5px; color: var(--muted); }
.plan-info-row span { min-width: 110px; }
.plan-info-row strong { color: var(--text); }
.plan-section { padding: 14px 0; border-top: 1px solid var(--border); }
.plan-section-title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--muted); margin-bottom: 10px; }
.plan-danger-section { padding-top: 16px; border-top: 1px solid #f8717133; }

/* ── Import Excel ────────────────────────────────────── */
.import-drop-zone { border: 2px dashed var(--border); border-radius: 10px; padding: 36px 24px; text-align: center; cursor: pointer; transition: .2s; color: var(--muted); }
.import-drop-zone:hover, .import-drop-zone.drag-over { border-color: var(--accent); background: #4f8ef710; color: var(--text); }

/* ── Adjuntos de ticket (clic, arrastrar o pegar con Ctrl+V) ───────────── */
.ticket-drop-zone { border: 2px dashed var(--border); border-radius: 10px; padding: 14px 12px; text-align: center; cursor: pointer; transition: .2s; color: var(--muted); font-size: 13px; }
.ticket-drop-zone:hover, .ticket-drop-zone.drag-over, .ticket-drop-zone:focus { border-color: var(--accent); background: #4f8ef710; color: var(--text); outline: none; }
.ticket-archivos-preview { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.ticket-archivo-item { position: relative; width: 64px; height: 64px; border-radius: 8px; overflow: hidden; border: 1px solid var(--border); background: var(--bg3); }
.ticket-archivo-item img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ticket-archivo-item .ticket-archivo-file { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; font-size: 10px; padding: 2px; text-align: center; word-break: break-word; }
.ticket-archivo-remove { position: absolute; top: 2px; right: 2px; width: 18px; height: 18px; border-radius: 50%; background: rgba(0,0,0,.6); color: #fff; border: none; cursor: pointer; font-size: 11px; line-height: 1; display: flex; align-items: center; justify-content: center; }
.ticket-archivo-remove:hover { background: var(--red); }
.import-summary { display: flex; gap: 12px; justify-content: center; margin-bottom: 4px; }
.import-stat { flex: 1; text-align: center; padding: 16px 8px; border-radius: 8px; border: 1px solid var(--border); }
.import-stat-ok  { border-color: var(--chip-green-bd); background: var(--chip-green-bg); }
.import-stat-skip { border-color: var(--border); background: var(--bg3); }
.import-stat-err { border-color: var(--chip-red-bd); background: var(--chip-red-bg); }
.import-stat-num   { font-size: 28px; font-weight: 800; }
.import-stat-ok  .import-stat-num  { color: var(--green); }
.import-stat-err .import-stat-num  { color: var(--red); }
.import-stat-label { font-size: 11px; color: var(--muted); text-transform: uppercase; font-weight: 600; margin-top: 2px; }

/* ── Tabs ────────────────────────────────────────────── */
.tabs { display: flex; gap: 4px; border-bottom: 2px solid var(--border); padding-bottom: 0; }
.tab-btn { background: none; border: none; padding: 8px 18px; font-size: 14px; font-weight: 600; color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; border-radius: 6px 6px 0 0; transition: .15s; }
.tab-btn:hover { color: var(--text); background: var(--bg3); }
.tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: none; }
.tab-panel { padding-top: 20px; }

/* ── Badges extra ────────────────────────────────────── */
.badge-ok     { background: #d1fae5; color: #065f46; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 700; }
.badge-danger { background: #fee2e2; color: #991b1b; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 700; }
.badge-warn   { background: #fef3c7; color: #92400e; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 700; }
.req { color: var(--red); }

/* ── Responsive (tablets y móviles) ───────────────────── */
@media (max-width: 1024px) {
  #sidebar { transform: translateX(-100%); transition: transform .25s; box-shadow: 4px 0 24px #0008; }
  #sidebar.open { transform: translateX(0); }
  #main-wrap { margin-left: 0; }
  #sidebar-toggle { display: block; }
  .venta-layout { grid-template-columns: 1fr; }
  .venta-sidebar { position: static; }
}

@media (max-width: 768px) {
  .form-grid-2, .form-grid-3, .form-grid-4 { grid-template-columns: 1fr; }
  .stats-grid { grid-template-columns: 1fr 1fr; }
}

@media (min-width: 769px) and (max-width: 900px) {
  /* El modal ancho (820px) todavía queda algo justo para 3-4 columnas en este
     rango — bajar un escalón evita labels/inputs demasiado angostos. */
  .form-grid-3 { grid-template-columns: 1fr 1fr; }
  .form-grid-4 { grid-template-columns: 1fr 1fr; }
}

/* ── Sidebar compacto (solo íconos) ─────────────────────
   Solo aplica en desktop: en móvil el sidebar ya es un overlay a ancho completo
   (ver bloque @media max-width:1024px arriba) y no tiene sentido combinarlo. */
@media (min-width: 1025px) {
  #sidebar-compact-toggle { display: block; }
  #app-shell.sidebar-compact #sidebar { width: 64px; min-width: 64px; }
  #app-shell.sidebar-compact #main-wrap { margin-left: 64px; }
  /* El ícono grande (32px, para la vista expandida) no entra junto al botón
     de expandir/colapsar en los 64px del modo compacto — se achica acá para
     que no se superpongan. */
  #app-shell.sidebar-compact .sidebar-logo { justify-content: center; padding: 16px 4px; gap: 4px; }
  #app-shell.sidebar-compact .logo-icon { font-size: 22px; }
  #app-shell.sidebar-compact .sidebar-logo-text,
  #app-shell.sidebar-compact .nav-label,
  #app-shell.sidebar-compact #empresa-selector-wrap { display: none; }
  #app-shell.sidebar-compact #sidebar-compact-toggle { transform: rotate(180deg); }
  #app-shell.sidebar-compact .nav-item { justify-content: center; padding: 8px 4px; gap: 0; }
  /* Mismo ancho/alto fijo en los 3 (tema, notif, cuenta): si cada uno se
     achica a su propio contenido (emoji vs. avatar redondo) terminan con
     tamaños distintos y se ven "desalineados" en la columna aunque estén
     centrados — con una caja igual para los tres, quedan en fila prolija. */
  #app-shell.sidebar-compact #sidebar-footer { align-items: center; padding: 6px 4px; gap: 6px; }
  #app-shell.sidebar-compact #user-menu-btn,
  #app-shell.sidebar-compact #notif-btn,
  #app-shell.sidebar-compact #theme-toggle-btn { width: 40px; height: 40px; padding: 0; justify-content: center; }
  #app-shell.sidebar-compact .user-menu-name,
  #app-shell.sidebar-compact .user-menu-caret,
  #app-shell.sidebar-compact .sidebar-footer-label { display: none; }

  /* El topbar de arriba de cada página solo sirve para 2 cosas: el botón ☰
     (que ya está oculto en desktop, es solo para abrir el sidebar en móvil) y
     el título de la página — que ya se repite como <h2> en cada .page-header
     (oculto por CSS, ver más arriba) por eso queda vacío/redundante en
     desktop. Se oculta acá para recuperar esos ~46px en pantallas donde el
     espacio vertical es más ajustado (POS, laptops 1280x720) — en móvil sigue
     visible porque ahí sí hace falta el botón ☰. */
  #topbar { display: none; }
  /* Ventas debe entrar entera en la pantalla, sin scrollear la página: antes
     .venta-sidebar usaba max-height:calc(100vh - Npx), pero ese cálculo asume
     que el panel empieza pegado arriba del viewport — en realidad las pestañas
     "Nueva Venta/Historial" (arriba de .venta-layout) ya ocupan ~50-60px, así
     que el panel podía terminar más abajo del borde inferior real de la
     pantalla SIN que su propio scroll interno se activara (el contenido no
     superaba su propio presupuesto de alto, mal calculado). Con .venta-page a
     una altura real (no min-height) y #ventas-tab-nueva/.venta-layout como
     flex/grid que reparten ese alto exacto entre header, catálogo y carrito,
     el sobrante real (sea cual sea el alto de lo que esté arriba) siempre
     termina dentro del catálogo (#venta-productos-grid) y el carrito
     (#venta-carrito), que son los que de verdad tienen su propio scroll. */
  .venta-page { height: calc(100vh - 24px); min-height: 0; }
  #ventas-tab-nueva { flex: 1 1 auto; min-height: 0; overflow: hidden; }
  .venta-layout { height: 100%; align-items: stretch; }
  .venta-main, .venta-sidebar { min-height: 0; }
  .venta-sidebar { max-height: none; position: static; }
}
@media (max-width: 1024px) {
  #sidebar-compact-toggle { display: none; }
}

/* ── Configuración de comprobantes: formulario + vista previa en vivo en un
   panel lateral (mismo criterio de layout que .venta-layout/.venta-sidebar:
   grid de 2 columnas, panel lateral angosto y sticky con scroll interno). ── */
.cc-layout { display: grid; grid-template-columns: minmax(0, 1fr) clamp(340px, 30vw, 440px); gap: 14px; align-items: start; }
.cc-main { min-width: 0; }
.cc-preview {
  background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 10px;
  position: sticky; top: 8px;
  display: flex; flex-direction: column;
  /* height (no solo max-height): así el panel ocupa todo el alto visible
     disponible y el iframe (flex:1 abajo) puede estirarse a ocuparlo, en vez
     de quedar del alto mínimo de su contenido. */
  height: calc(100vh - 16px);
  max-height: calc(100vh - 16px);
}
.cc-preview-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; flex: 0 0 auto; }
.cc-preview-header h3 { font-size: 13px; margin: 0; }
.cc-preview-status { font-size: 11px; color: var(--muted); }
.cc-preview-frame-wrap {
  flex: 1 1 auto; min-height: 0; border-radius: 10px; overflow: hidden; background: #fff;
  border: 1px solid var(--border); box-shadow: 0 8px 24px -14px rgba(0,0,0,.5);
}
.cc-preview-frame { width: 100%; height: 100%; min-height: 480px; border: none; display: block; }
@media (max-width: 1024px) {
  .cc-layout { grid-template-columns: 1fr; }
  .cc-preview { position: static; height: auto; max-height: none; }
  .cc-preview-frame { min-height: 600px; }
}

/* ── Comprobantes: rediseño del formulario (tarjetas con más aire/profundidad,
   controles a medida en vez del look nativo del navegador) — todo escopeado
   bajo .cc-main para no tocar .card/.input/checkbox del resto de la app. ──── */
.cc-main .card {
  position: relative; overflow: hidden;
  background: linear-gradient(180deg, color-mix(in srgb, var(--bg2) 100%, white 2%), var(--bg2));
  border-radius: 14px; padding: 18px 20px;
  box-shadow: 0 1px 2px rgba(0,0,0,.15), 0 12px 28px -18px rgba(0,0,0,.45);
  transition: border-color .2s, box-shadow .2s;
}
.cc-main .card::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: linear-gradient(90deg, var(--accent), transparent);
  opacity: .8;
}
.cc-main .card:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); }
.cc-main .card-title {
  font-size: 13px; letter-spacing: .2px; padding-bottom: 10px; margin-bottom: 14px;
  border-bottom: 1px solid var(--border);
}
.cc-main .form-group label { font-size: 10.5px; letter-spacing: .5px; }
.cc-main select.input {
  appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>");
  background-repeat: no-repeat; background-position: right 10px center; background-size: 16px;
  padding-right: 34px; border-radius: 9px;
}
.cc-main select.input:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--border)); }
.cc-main .card p.text-muted { line-height: 1.5; }

/* Checkboxes a medida (el navegador los dibuja como cuadraditos planos que
   desentonan con el resto del panel) — check de tilde puro en CSS, sin JS. */
.cc-main .usr-check-item { padding: 3px 0; }
.cc-main input[type=checkbox] {
  appearance: none; flex-shrink: 0;
  width: 18px; height: 18px; border-radius: 6px;
  border: 1.5px solid var(--border); background: var(--bg3);
  cursor: pointer; position: relative;
  transition: background .15s, border-color .15s;
}
.cc-main input[type=checkbox]:hover { border-color: color-mix(in srgb, var(--accent) 50%, var(--border)); }
.cc-main input[type=checkbox]:checked { background: var(--accent); border-color: var(--accent); }
.cc-main input[type=checkbox]:checked::after {
  content: ''; position: absolute; left: 5px; top: 1px;
  width: 5px; height: 9px; border: solid #fff; border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}

/* Selectores de color: swatch grande y redondeado en vez del rectángulo
   angosto por defecto del navegador. */
.cc-main input[type=color] {
  width: 52px; height: 34px; padding: 3px; border-radius: 9px;
  border: 1.5px solid var(--border); background: var(--bg3); cursor: pointer;
}
.cc-main input[type=color]:hover { border-color: color-mix(in srgb, var(--accent) 50%, var(--border)); }
.cc-main input[type=color]::-webkit-color-swatch-wrapper { padding: 0; }
.cc-main input[type=color]::-webkit-color-swatch { border: none; border-radius: 6px; }
.cc-main input[type=color]::-moz-color-swatch { border: none; border-radius: 6px; }

/* Selector de archivo: el <input type=file> nativo (botón "Elegir archivo" +
   texto "Sin archivos seleccionados") desentona con el resto — queda oculto
   y en su lugar un <label> hace de botón (dispara el picker sin JS) + un
   span propio muestra el nombre elegido. */
.cc-file-picker { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cc-file-picker-nombre { font-size: 12px; }
.permission-toolbar{display:flex;gap:16px;align-items:end;flex-wrap:wrap;margin-bottom:12px}.permission-toolbar .form-group{min-width:220px;margin:0}.permission-select{min-width:132px}.permission-matrix th{white-space:nowrap}.permission-matrix td{padding:6px}.impersonation-banner,#impersonation-banner:not(.hidden){display:flex;align-items:center;justify-content:center;gap:12px;padding:8px 16px;background:#fff3cd;color:#664d03;border-bottom:1px solid #ffda6a;font-size:13px}
.nav-section-title{padding:14px 16px 5px;font-size:10px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);opacity:.8}.sidebar-compact .nav-section-title{height:1px;padding:0;margin:8px 10px;background:var(--border);font-size:0}

/* Densidad visual alineada con 1000tonInventario. */
.icon{width:1em;height:1em;flex-shrink:0;vertical-align:-.15em}
.sidebar-logo{gap:10px;padding:14px 16px}
.logo-icon{font-size:22px}.logo-title{font-size:14px}.logo-sub{font-size:11px}
#sidebar-nav{padding:4px 0}
.nav-item{gap:10px;width:100%;min-height:0;margin:0;padding:5px 14px;border-radius:0;border-left:3px solid transparent;font-size:12px}
.nav-item.active{color:var(--text);background:var(--bg3);border-left-color:var(--accent);box-shadow:none}
.nav-item .nav-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;font-size:14px}
.nav-section-title{padding:12px 14px 4px;font-size:10px;letter-spacing:.05em}
#sidebar-footer{gap:4px;padding:8px;border-top:1px solid var(--border)}
#sidebar-footer #notif-btn,#sidebar-footer #theme-toggle-btn{min-height:40px;gap:10px;padding:7px 9px;border-radius:8px;font-size:17px}
#sidebar-footer .sidebar-footer-label{font-size:13px}.sidebar-footer .user-avatar{width:30px;height:30px;font-size:12px}
.categoria-tab{min-height:30px;padding:5px 14px;font-size:12px}
.btn{padding:6px 10px;font-size:12px;line-height:1.25}.btn-sm{padding:3px 7px;font-size:11px}.btn-icon{padding:5px 7px}
.td-actions{gap:4px}

/* Densidad compacta global: formularios, tablas, paneles y flujos operativos. */
#page-content{padding:10px 16px}
#topbar{height:42px;padding:0 16px}
#modal-header{padding:14px 16px 10px}
#modal-body{padding:14px}
#confirm-box{padding:18px 18px;max-width:340px}
#confirm-msg{margin-bottom:14px;font-size:13px;line-height:1.45}
.form-group{margin-bottom:7px}
.form-group label{font-size:10.5px;margin-bottom:3px}
.input{min-height:30px;padding:5px 9px;font-size:12px;border-radius:6px}
textarea.input{min-height:64px;line-height:1.35}
.form-grid-2,.form-grid-3,.form-grid-4{gap:0 12px}
.form-actions{gap:7px;margin-top:10px}
.filters{gap:7px;margin-bottom:10px}
.filters .input{min-width:140px;max-width:240px}
.card{padding:11px 12px;margin-bottom:10px;border-radius:8px}
.card-title{font-size:13px;margin-bottom:8px;gap:6px}
.stats-grid{grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px;margin-bottom:14px}
.stat-card{padding:10px 12px;border-radius:8px}
.stat-card .stat-value{font-size:21px;margin:2px 0}
.stat-card .stat-label,.stat-card .stat-sub{font-size:10.5px}
.table-wrap{border-radius:8px}
thead th{padding:5px 9px;font-size:10px;letter-spacing:.45px}
tbody td{padding:4px 9px;font-size:12px;white-space:nowrap}
.empty-row td{padding:16px;font-size:12px}
.badge{padding:2px 7px;font-size:10px}
.report-card{padding:12px;gap:7px}
.report-row{padding:8px 0}
.report-row-icon{font-size:15px}
.inv-select-bar{gap:8px;margin-bottom:12px}
.permission-toolbar{gap:10px;margin-bottom:8px}.permission-toolbar .form-group{min-width:190px}.permission-select{min-width:112px}
.permission-matrix th,.permission-matrix td{padding:4px 6px}
.venta-layout{gap:10px;grid-template-columns:minmax(0,1fr) clamp(290px,24vw,380px)}
.venta-main{padding:9px;border-radius:8px}
.venta-sidebar{padding:8px;border-radius:8px}
.venta-main #venta-buscar-producto{min-height:34px;font-size:13px}
.venta-carrito-header{margin-bottom:5px}.venta-carrito-header h3{font-size:12px}
.venta-total-box{padding:5px;margin:5px 0;border-radius:7px}
.venta-total-label{font-size:9px}.venta-total-monto{font-size:18px}
.input-monto-grande{font-size:17px;padding:6px}
.btn-lg{padding:8px;font-size:13px;min-height:36px}
.producto-grid{grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:8px}
.producto-card{padding:8px;border-radius:8px}
.producto-card-img{border-radius:7px;margin-bottom:5px}
.producto-card-placeholder{font-size:27px}
.producto-card-nombre,.producto-card-precio{font-size:11.5px}
.producto-card-agregar{min-height:36px;font-size:14px}
.producto-card-agregar .plus-icon{font-size:20px}
.carrito-stepper-btn{width:26px;height:26px;font-size:14px;border-radius:6px}
.carrito-quitar-btn{min-width:29px;min-height:29px;font-size:13px}
.autocomplete-list{max-height:180px}.autocomplete-item{padding:6px 9px;font-size:12px}
.selected-chip{padding:4px 6px 4px 10px;font-size:12px}
.doc-total-row{font-size:14px;margin:9px 0;padding-top:8px}
.import-drop-zone{padding:22px 16px}.import-stat{padding:10px 6px}.import-stat-num{font-size:21px}
.mapa-toolbar{gap:8px}.mapa-panel{font-size:12px}
