/* ==========================================================================
   Emperador POS — piel «ePOS»
   --------------------------------------------------------------------------
   Repinta AdminLTE 2 con la paleta del proyecto ePOS del usuario
   (C:\Users\Admin\Documents\_ePOS\ePOS): oscuro azul-noche y dorado #D3AF35.

   SOLO ESTILO. Este archivo no cambia marcado, formularios ni lógica: se
   carga al final de plantilla.php y sobrescribe. Para volver al POS de antes
   basta quitar ese <link>.

   Se usa !important en varios sitios porque AdminLTE.css y _all-skins.css
   traen selectores muy específicos y estilos en línea que hay que vencer sin
   editar las vistas.
   ========================================================================== */

:root {
  /* superficies, de más profunda a más elevada */
  --pos-bg:        #0b0b11;
  --pos-surface:   #13131a;
  --pos-surface-2: #17171f;
  --pos-surface-3: #1a1a20;
  --pos-hover:     #1e1e2a;
  --pos-sidebar:   #0d0d14;
  --pos-submenu:   #0a0a10;
  --pos-inactivo:  #101018;   /* campos de solo lectura o deshabilitados */
  --pos-invertir-logo: 1;   /* el logotipo es negro: en oscuro se invierte */

  /* líneas */
  --pos-line:      #1e1e2a;
  --pos-line-2:    #2a2a38;

  /* texto */
  --pos-text:        #e9e9f2;
  --pos-text-strong: #ffffff;   /* el énfasis del tema; en claro se invierte */
  --pos-text-soft:   #b9b9cc;
  --pos-muted:       #8a8aa0;
  --pos-faint:       #666580;

  /* marca y estados */
  --pos-gold:      #D3AF35;
  --pos-gold-dark: #b8962c;
  --pos-gold-soft: rgba(211, 175, 53, .12);
  --pos-gold-hover: #e6c65a;   /* oro mas claro: destaca sobre fondo oscuro */
  --pos-on-gold:   #14140c;
  --pos-ok:        #4ade9b;
  --pos-warn:      #f0b34a;
  --pos-danger:    #f87575;
  --pos-info:      #5b7cfa;

  --pos-radius:    12px;
  --pos-radius-sm: 9px;
}

/* ==========================================================================
   TEMA CLARO
   Toda la piel está escrita con variables, así que el modo claro es reasignar
   este bloque. Lo activa la clase .tema-claro en <html>, que pone y recuerda
   vistas/js/tema.js.
   ========================================================================== */

html.tema-claro {
  --pos-bg:        #f4f6fa;
  --pos-surface:   #ffffff;
  --pos-surface-2: #f8fafc;
  --pos-surface-3: #f1f5f9;
  --pos-hover:     #e8edf4;
  --pos-sidebar:   #ffffff;
  --pos-submenu:   #f6f8fb;
  --pos-inactivo:  #eef2f7;
  --pos-invertir-logo: 0;   /* en claro el logotipo negro va tal cual */

  --pos-line:      #e2e8f0;
  --pos-line-2:    #cbd5e1;

  --pos-text:        #0f172a;
  --pos-text-strong: #0f172a;
  --pos-text-soft:   #334155;
  --pos-muted:       #64748b;
  --pos-faint:       #94a3b8;

  /* el dorado se mantiene, pero los estados se oscurecen para que contrasten
     sobre fondo claro */
  --pos-gold-soft: rgba(211, 175, 53, .16);
  --pos-gold-hover: #a07f18;   /* oro mas oscuro: destaca sobre fondo claro */
  --pos-ok:        #15803d;
  --pos-warn:      #b45309;
  --pos-danger:    #dc2626;
  --pos-info:      #2563eb;
  --pos-green-dark:#15803d;
}

/* ajustes que no salen solos de las variables */
html.tema-claro .bg-aqua, html.tema-claro .bg-blue    { background-color: rgba(37,99,235,.10) !important;  color: #1d4ed8 !important; }
html.tema-claro .bg-green, html.tema-claro .bg-olive  { background-color: rgba(21,128,61,.10) !important;  color: #15803d !important; }
html.tema-claro .bg-red, html.tema-claro .bg-maroon   { background-color: rgba(220,38,38,.10) !important;  color: #b91c1c !important; }
html.tema-claro .btn-success { background: rgba(21,128,61,.12) !important;  border-color: rgba(21,128,61,.34) !important;  color: #15803d !important; }
html.tema-claro .btn-info    { background: rgba(37,99,235,.12) !important;  border-color: rgba(37,99,235,.34) !important;  color: #1d4ed8 !important; }
html.tema-claro .btn-danger  { background: rgba(220,38,38,.12) !important;  border-color: rgba(220,38,38,.34) !important;  color: #b91c1c !important; }
html.tema-claro .btn-warning { background: rgba(180,83,9,.12) !important;   border-color: rgba(180,83,9,.34) !important;   color: #b45309 !important; }
html.tema-claro .table > tbody > tr:hover { background-color: var(--pos-hover) !important; }
html.tema-claro .table-striped > tbody > tr:nth-of-type(odd) { background-color: rgba(15,23,42,.02); }
html.tema-claro .quote,
html.tema-claro .swal2-container { background: rgba(15, 23, 42, .34) !important; }
html.tema-claro .modal-backdrop.in { background: #0f172a; opacity: .42; }
/* --- profundidad y color en el tema claro --------------------------------- */
/* Sin esto el claro queda plano: todo blanco sobre gris, sin jerarquía. Se le
   dan sombras suaves, un fondo con un punto de temperatura, y se recupera el
   color en los indicadores, que era lo que más lo apagaba. */

html.tema-claro body,
html.tema-claro .wrapper,
html.tema-claro .content-wrapper {
  background-color: #eef1f6 !important;   /* algo más frío que el blanco */
}

/* las tarjetas se levantan del fondo */
html.tema-claro .box,
html.tema-claro .small-box,
html.tema-claro .nav-tabs-custom {
  box-shadow: 0 1px 2px rgba(15, 23, 42, .06), 0 4px 12px rgba(15, 23, 42, .04) !important;
}
html.tema-claro .small-box:hover {
  box-shadow: 0 2px 4px rgba(15, 23, 42, .08), 0 10px 24px rgba(15, 23, 42, .09) !important;
}

/* cabecera y menú con separación real, no solo una línea */
html.tema-claro .skin-black .main-header {
  box-shadow: 0 1px 3px rgba(15, 23, 42, .07) !important;
}
html.tema-claro .skin-black .main-sidebar {
  box-shadow: 1px 0 3px rgba(15, 23, 42, .05);
}
html.tema-claro .box-header.with-border { background: rgba(15, 23, 42, .015); }

/* Indicadores: el tinte solo no basta. Cada uno recupera su color en el
   número y en el icono grande, que es lo que da vida sin ensuciar. */
html.tema-claro .small-box { background: var(--pos-surface) !important; }
html.tema-claro .small-box.bg-aqua,   html.tema-claro .small-box.bg-blue   { background: linear-gradient(180deg, rgba(37,99,235,.07), rgba(37,99,235,.02)) !important; }
html.tema-claro .small-box.bg-green,  html.tema-claro .small-box.bg-olive  { background: linear-gradient(180deg, rgba(21,128,61,.07), rgba(21,128,61,.02)) !important; }
html.tema-claro .small-box.bg-yellow, html.tema-claro .small-box.bg-orange { background: linear-gradient(180deg, rgba(211,175,53,.12), rgba(211,175,53,.03)) !important; }
html.tema-claro .small-box.bg-teal                                        { background: linear-gradient(180deg, rgba(20,166,150,.07), rgba(20,166,150,.02)) !important; }
html.tema-claro .small-box.bg-red,    html.tema-claro .small-box.bg-maroon { background: linear-gradient(180deg, rgba(220,38,38,.07), rgba(220,38,38,.02)) !important; }

html.tema-claro .small-box.bg-aqua h3,   html.tema-claro .small-box.bg-blue h3   { color: #1d4ed8 !important; }
html.tema-claro .small-box.bg-green h3,  html.tema-claro .small-box.bg-olive h3  { color: #15803d !important; }
html.tema-claro .small-box.bg-yellow h3, html.tema-claro .small-box.bg-orange h3 { color: #a17d12 !important; }
html.tema-claro .small-box.bg-teal h3                                            { color: #0f766e !important; }
html.tema-claro .small-box.bg-red h3,    html.tema-claro .small-box.bg-maroon h3 { color: #b91c1c !important; }

html.tema-claro .small-box .icon { opacity: .16; }
html.tema-claro .small-box.bg-aqua .icon,   html.tema-claro .small-box.bg-blue .icon   { color: #2563eb; }
html.tema-claro .small-box.bg-green .icon,  html.tema-claro .small-box.bg-olive .icon  { color: #15803d; }
html.tema-claro .small-box.bg-yellow .icon, html.tema-claro .small-box.bg-orange .icon { color: var(--pos-gold); opacity: .3; }
html.tema-claro .small-box.bg-teal .icon                                               { color: #0f766e; }
html.tema-claro .small-box.bg-red .icon,    html.tema-claro .small-box.bg-maroon .icon { color: #dc2626; }

html.tema-claro .shot, html.tema-claro .term__box { box-shadow: 0 8px 24px rgba(15,23,42,.10); }
html.tema-claro .chart-legend li { color: var(--pos-text-soft); }

/* --- base ----------------------------------------------------------------- */

body,
body.skin-black,
body.hold-transition {
  background-color: var(--pos-bg) !important;
  color: var(--pos-text);
  font-family: "Source Sans Pro", system-ui, -apple-system, "Segoe UI", sans-serif;
  -webkit-font-smoothing: antialiased;
}

.wrapper,
.content-wrapper,
.right-side {
  background-color: var(--pos-bg) !important;
  color: var(--pos-text);
}

/* AdminLTE deja `.wrapper` con overflow-x:hidden y overflow-y:auto. Eso lo
   convierte en contenedor de desplazamiento, y cualquier `position: sticky`
   de dentro se ancla a ese contenedor —más alto que la pantalla— en vez de a
   la ventana: el botón «Guardar venta» nunca llegaba a fijarse.

   No se puede pasar a `visible` sin más, porque el recorte horizontal es el
   que evita la barra lateral cuando se repliega el menú. `clip` recorta igual
   pero NO crea contenedor de desplazamiento, que es justo lo que hace falta. */
.wrapper {
  overflow-x: clip !important;
  overflow-y: visible !important;
}

a { color: var(--pos-gold); }
a:hover, a:focus { color: #e6c66a; }

::selection { background: var(--pos-gold); color: var(--pos-on-gold); }

/* barras de desplazamiento acordes al tema */
* { scrollbar-color: var(--pos-line-2) var(--pos-bg); scrollbar-width: thin; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--pos-bg); }
::-webkit-scrollbar-thumb {
  background: var(--pos-line-2);
  border-radius: 6px;
  border: 2px solid var(--pos-bg);
}
::-webkit-scrollbar-thumb:hover { background: #3a3a4e; }

/* --- cabezote ------------------------------------------------------------- */

.skin-black .main-header {
  background: var(--pos-surface) !important;
  border-bottom: 1px solid var(--pos-line) !important;
  box-shadow: none !important;
}
.skin-black .main-header .navbar,
.skin-black .main-header > .navbar {
  background-color: transparent !important;
  border: 0 !important;
}
.skin-black .main-header .logo {
  background: var(--pos-surface) !important;
  border-right: 1px solid var(--pos-line) !important;
  border-bottom: 0 !important;
  color: var(--pos-text) !important;
  font-weight: 600;
  letter-spacing: .01em;
}
.skin-black .main-header .logo:hover { background: var(--pos-surface-2) !important; }

.skin-black .main-header .navbar .nav > li > a {
  color: var(--pos-text-soft) !important;
  transition: background .18s ease, color .18s ease;
}
.skin-black .main-header .navbar .nav > li > a:hover,
.skin-black .main-header .navbar .nav > li > a:focus,
.skin-black .main-header .navbar .nav .open > a,
.skin-black .main-header .navbar .nav .open > a:hover {
  background: var(--pos-surface-3) !important;
  color: var(--pos-text) !important;
}
.skin-black .main-header .navbar .sidebar-toggle {
  color: var(--pos-text-soft) !important;
}
.skin-black .main-header .navbar .sidebar-toggle:hover {
  background: var(--pos-surface-3) !important;
  color: var(--pos-gold) !important;
}

/* nombre de la empresa / usuario en el cabezote */
.navbar-custom-menu .user-menu > .dropdown-toggle > .user-image { border-radius: 50%; }

/* El logotipo del cabezote es negro y sobre el fondo oscuro no se veía. Se
   invierte en tema oscuro y se deja tal cual en claro. */
.main-header .logo-lg img {
  filter: invert(var(--pos-invertir-logo));
  width: auto !important;
  height: 34px !important;
  max-width: 165px;
}

/* botón para cambiar entre claro y oscuro */
.tema-btn {
  background: transparent;
  border: 0;
  color: var(--pos-text-soft);
  padding: 15px 15px;
  font-size: 16px;
  line-height: 20px;
  cursor: pointer;
  transition: background .18s ease, color .18s ease;
}
.tema-btn:hover { background: var(--pos-surface-3); color: var(--pos-gold); }
.tema-btn:focus-visible { outline: 2px solid var(--pos-gold); outline-offset: -2px; }
/* se muestra el icono del tema al que se va a cambiar */
.tema-btn .fa-sun-o  { display: none; }
html.tema-claro .tema-btn .fa-moon-o { display: none; }
html.tema-claro .tema-btn .fa-sun-o  { display: inline-block; }

/* --- menú lateral --------------------------------------------------------- */

.skin-black .main-sidebar,
.skin-black .left-side,
.skin-black .wrapper > .main-sidebar {
  background-color: var(--pos-sidebar) !important;
  border-right: 1px solid var(--pos-line);
}
.skin-black .sidebar-menu > li > a {
  color: var(--pos-text-soft) !important;
  border-left: 3px solid transparent !important;
  font-size: 14px;
  transition: background .18s ease, color .18s ease, border-color .18s ease;
}
.skin-black .sidebar-menu > li:hover > a,
.skin-black .sidebar-menu > li.active > a,
.skin-black .sidebar-menu > li.menu-open > a {
  background: var(--pos-surface-2) !important;
  color: var(--pos-text-strong) !important;
  border-left-color: var(--pos-gold) !important;
}
.skin-black .sidebar-menu > li.active > a > i,
.skin-black .sidebar-menu > li:hover > a > i { color: var(--pos-gold) !important; }

.skin-black .sidebar-menu .treeview-menu {
  background: var(--pos-submenu) !important;
  border-left: 1px solid var(--pos-line);
  margin-left: 3px;
}
.skin-black .sidebar-menu .treeview-menu > li > a { color: var(--pos-muted) !important; font-size: 13.5px; }
.skin-black .sidebar-menu .treeview-menu > li.active > a,
.skin-black .sidebar-menu .treeview-menu > li > a:hover {
  color: var(--pos-gold) !important;
  background: transparent !important;
}
.skin-black .sidebar-menu li.header {
  background: transparent !important;
  color: var(--pos-faint) !important;
  font-size: 10.5px;
  letter-spacing: .16em;
  text-transform: uppercase;
  padding: 18px 15px 8px;
}
.skin-black .user-panel,
.skin-black .user-panel > .info,
.skin-black .user-panel > .info > a {
  color: var(--pos-text) !important;
}
.skin-black .user-panel { border-bottom: 1px solid var(--pos-line); }
.skin-black .sidebar-form input[type="text"],
.skin-black .sidebar-form .btn {
  background: var(--pos-surface-2) !important;
  border-color: var(--pos-line-2) !important;
  color: var(--pos-text) !important;
}

/* --- encabezado de contenido --------------------------------------------- */

.content-header { padding: 22px 22px 6px; }
.content-header > h1 {
  color: var(--pos-text);
  font-size: 25px;
  font-weight: 600;
  letter-spacing: -.01em;
  margin: 0;
}
.content-header > h1 > small { color: var(--pos-muted); font-size: 14px; }

.content-header > .breadcrumb {
  background: transparent !important;
  padding: 0;
  top: 24px;
  right: 22px;
  font-size: 12.5px;
  border-radius: 0;
}
.content-header > .breadcrumb > li > a { color: var(--pos-muted); }
.content-header > .breadcrumb > li > a:hover { color: var(--pos-gold); }
.content-header > .breadcrumb > .active { color: var(--pos-faint); }
.content-header > .breadcrumb li + li:before { color: var(--pos-line-2); }

/* --- cajas (paneles) ------------------------------------------------------ */

.box {
  background: var(--pos-surface) !important;
  border: 1px solid var(--pos-line) !important;
  border-top: 1px solid var(--pos-line) !important;
  border-radius: var(--pos-radius) !important;
  box-shadow: none !important;
  color: var(--pos-text);
}
.box.box-primary, .box.box-info, .box.box-success,
.box.box-warning, .box.box-danger, .box.box-default {
  border-top-color: var(--pos-line) !important;
}
/* El color del panel se reduce a un filete superior. Se usa border-top y no
   box-shadow porque el inset se veía como un contorno dorado completo. */
.box.box-primary { border-top: 2px solid var(--pos-gold) !important; }
.box.box-info    { border-top: 2px solid var(--pos-info) !important; }
.box.box-success { border-top: 2px solid var(--pos-ok) !important; }
.box.box-warning { border-top: 2px solid var(--pos-warn) !important; }
.box.box-danger  { border-top: 2px solid var(--pos-danger) !important; }

.box-header { color: var(--pos-text) !important; padding: 16px 26px; }

/* Varias vistas abren el panel con un <div class="box-header with-border"></div>
   vacío: sin título ni herramientas. Solo aporta alto y una línea divisoria que
   no divide nada. Se oculta desde aquí para no tocar cuatro vistas. */
.box-header:empty { display: none !important; }
.box-header.with-border { border-bottom: 1px solid var(--pos-line) !important; }
.box-header > .box-title {
  font-size: 15.5px;
  font-weight: 600;
  letter-spacing: -.005em;
}
.box-header > .box-tools .btn-box-tool {
  color: var(--pos-faint) !important;
  background: transparent !important;
}
.box-header > .box-tools .btn-box-tool:hover { color: var(--pos-gold) !important; }
/* 18px dejaba los campos casi pegados a los bordes del panel */
.box-body { padding: 22px 26px; color: var(--pos-text); }

/* Paneles lado a lado a la misma altura.
   Bootstrap 3 coloca las columnas con `float`, y una columna flotada solo mide
   lo que mide su contenido: por eso el panel más corto terminaba más arriba.
   Convirtiendo la fila en flex, las columnas se estiran a la altura de la más
   alta y los paneles cierran al mismo nivel.

   Se limita a las filas que contienen paneles (`:has`) para no alterar las
   demás filas de la interfaz —formularios, modales—, que sí dependen del
   comportamiento original. Si el navegador no soporta `:has`, simplemente no
   se aplica y todo queda como antes. */
.content .row:has(> [class*="col-"] > .box) {
  display: flex;
  flex-wrap: wrap;
}
.content .row:has(> [class*="col-"] > .box) > [class*="col-"] {
  display: flex;
  flex-direction: column;
}
.content .row:has(> [class*="col-"] > .box) > [class*="col-"] > .box {
  flex: 1 1 auto;
}

/* Varias vistas usan un <div class="box"> anidado dentro del box-body solo
   para agrupar campos. Al ser un .box hereda borde, fondo y esquinas, pero no
   relleno —ese vive en .box-body—, así que los campos quedaban pegados a ese
   borde interior. Un panel dentro de un panel no aporta nada: se neutraliza. */
.box-body > .box {
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  margin-bottom: 0;
}
.box-body > .box > .box-body { padding: 0; }
.box-footer {
  background: var(--pos-surface-2) !important;
  border-top: 1px solid var(--pos-line) !important;
  color: var(--pos-text-soft);
  border-radius: 0 0 var(--pos-radius) var(--pos-radius);
}

/* --- etiquetas al lado del campo, no encima ------------------------------- */
/* Vendedor, Número de factura y Cliente tenían la etiqueta arriba, y en un
   formulario que pelea por cada píxel de alto eso gastaba tres líneas. Al
   ponerlas al lado se recupera ese alto y, de paso, quedan igual que
   Descuento, Impuesto y Total, que ya usan etiqueta a la izquierda.
   Solo aplica donde hay etiqueta seguida de un grupo con icono. */

.formularioVenta .form-group:has(> label + .input-group),
.formularioGasto .form-group:has(> label + .input-group) {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 10px;
}
.formularioVenta .form-group:has(> label + .input-group) > label,
.formularioGasto .form-group:has(> label + .input-group) > label {
  flex: 0 0 120px;
  margin: 0;
  line-height: 1.3;
}
.formularioVenta .form-group:has(> label + .input-group) > .input-group,
.formularioGasto .form-group:has(> label + .input-group) > .input-group {
  flex: 1 1 auto;
  min-width: 0;
}

/* en pantallas estrechas no hay ancho para las dos cosas: vuelven a apilarse */
@media (max-width: 991px) {
  .formularioVenta .form-group:has(> label + .input-group),
  .formularioGasto .form-group:has(> label + .input-group) {
    display: block;
  }
  .formularioVenta .form-group:has(> label + .input-group) > label,
  .formularioGasto .form-group:has(> label + .input-group) > label {
    margin-bottom: 6px;
  }
}

/* --- descuento e impuesto plegables --------------------------------------- */

.fila-plegable-cabecera th { padding: 4px 12px !important; border: 0 !important; }

.plegar-ajustes {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 4px 2px;
  border: 0;
  background: transparent;
  color: var(--pos-muted);
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: .02em;
  cursor: pointer;
  transition: color .16s ease;
}
.plegar-ajustes:hover { color: var(--pos-gold); }
.plegar-ajustes:focus-visible { outline: 2px solid var(--pos-gold); outline-offset: 2px; }
.plegar-ajustes i { font-size: 13px; width: 10px; }

/* señal de que hay un ajuste aplicado, visible aun con el bloque plegado */
.plegar-ajustes__aviso {
  padding: 2px 8px;
  border-radius: 999px;
  background: var(--pos-gold-soft);
  color: var(--pos-gold);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
}
.plegar-ajustes__aviso[hidden] { display: none; }

/* al intentar plegar con un ajuste aplicado */
.plegar-ajustes--negado { color: var(--pos-warn) !important; }

.fila-ajuste[hidden] { display: none; }

/* --- el Total, con el peso que le corresponde ------------------------------ */
/* El número del total se muestra a 17px por estilo en línea, pero la palabra
   «Total» iba al tamaño normal de la tabla y quedaba pequeña al lado. */
.formularioVenta table.table > tbody > tr > th,
.formularioGasto table.table > tbody > tr > th { font-size: 14px; }

.formularioVenta table.table > tbody > tr:last-child > th {
  font-size: 17px;
  font-weight: 700;
  color: var(--pos-text);
  letter-spacing: -.01em;
}

/* --- resumen de la venta: ítems y unidades -------------------------------- */

.venta-resumen {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  padding: 5px 10px;
  border-radius: 999px;
  background: var(--pos-surface-3);
  border: 1px solid var(--pos-line);
  width: max-content;
  font-size: 11.5px;
  letter-spacing: .03em;
  color: var(--pos-muted);
}
.venta-resumen b {
  color: var(--pos-text);
  font-size: 13px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.venta-resumen__sep {
  width: 1px;
  height: 12px;
  background: var(--pos-line-2);
}
.venta-resumen[hidden] { display: none; }

/* --- la lista de productos de la venta se desplaza sola ------------------- */
/* Fijar solo el botón no bastaba: para cerrar la venta hay que elegir método
   de pago y escribir el valor recibido o el código de transacción, y esos
   campos van DEBAJO de la lista, así que también se iban de la pantalla.

   La solución es la de cualquier POS: que crezca la lista dentro de su propia
   caja, no la página. Así los totales, el método de pago y el botón se quedan
   siempre a la vista, y solo se desplaza lo que debe.

   El alto se da en `vh` para que se adapte a la pantalla: en un portátil deja
   ver unos cuatro productos, en un monitor grande el doble. */
/* El alto fijo no bastaba: la lista va ANTES de los totales y del método de
   pago, así que al llenarse seguía empujándolos fuera de pantalla y había que
   bajar igual.

   Ahora el formulario se limita al alto de la ventana y reparte: los campos de
   arriba y el bloque de cierre —totales, método de pago, botón— ocupan lo suyo,
   y la lista se queda con TODO lo que sobra. Crezca lo que crezca la venta,
   nada del cierre se mueve. */
.formularioVenta {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 150px);
  min-height: 420px;   /* en pantallas bajas no se comprime hasta ser inútil */
}
.formularioVenta > .box-body {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;       /* sin esto un hijo desplazable no encoge */
  overflow: hidden;
}
/* Toda la venta —campos, lista, totales y método de pago— vive dentro de un
   .box anidado, así que el reparto tiene que hacerse ahí dentro: si se le da
   tamaño fijo, la lista nunca recibe el espacio sobrante. */
.formularioVenta > .box-body > .box {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
/* todo mantiene su tamaño natural… */
.formularioVenta > .box-body > .box > * { flex: 0 0 auto; }
/* …salvo la lista, que absorbe lo que sobre y cede cuando algo se despliega */
.formularioVenta > .box-body > .box > .nuevoProducto { flex: 1 1 auto; min-height: 0; }

.nuevoProducto {
  overflow-y: auto;
  overflow-x: hidden;
  margin-left: 0;
  margin-right: 0;
  /* sitio para la barra, para que no tape el botón de quitar */
  padding-right: 4px;
}
/* sin productos aún, la caja no debe reclamar espacio */
.nuevoProducto:empty { flex: 0 0 auto; overflow: visible; padding-right: 0; }

/* En pantallas pequeñas se vuelve al comportamiento normal: ahí el alto fijo
   estorba más de lo que ayuda y es preferible desplazar la página entera. */
@media (max-width: 991px) {
  .formularioVenta { display: block; max-height: none; min-height: 0; }
  .formularioVenta > .box-body { display: block; overflow: visible; }
  .nuevoProducto { max-height: 40vh; }
}

/* aviso visual de que hay más arriba o abajo */
.nuevoProducto {
  scrollbar-width: thin;
  border-radius: var(--pos-radius-sm);
}

/* El pie de los formularios largos —donde vive «Guardar venta»— se queda
   pegado a la parte baja de la pantalla mientras el panel siga a la vista.
   Junto con la lista desplazable de arriba, el bloque de cierre completo
   —totales, método de pago y botón— permanece accesible. */
.formularioVenta > .box-footer,
.formularioGasto > .box-footer,
form[class*="formulario"] > .box-footer {
  position: sticky;
  bottom: 0;
  z-index: 20;
  /* opaco de verdad: por debajo pasan las filas de la tabla */
  background: var(--pos-surface-2) !important;
  box-shadow: 0 -6px 18px rgba(0, 0, 0, .28);
}
html.tema-claro .formularioVenta > .box-footer,
html.tema-claro .formularioGasto > .box-footer,
html.tema-claro form[class*="formulario"] > .box-footer {
  box-shadow: 0 -6px 18px rgba(15, 23, 42, .10);
}

/* --- tarjetas de indicadores --------------------------------------------- */
/* AdminLTE las pinta de colores planos y saturados. Aquí pasan a ser tarjetas
   oscuras con el color solo como acento: el número manda, no el fondo. */

.small-box {
  background: var(--pos-surface) !important;
  border: 1px solid var(--pos-line);
  border-radius: var(--pos-radius);
  box-shadow: none !important;
  overflow: hidden;
  position: relative;
  transition: border-color .2s ease, transform .2s ease;
}
.small-box:hover { border-color: var(--pos-line-2); transform: translateY(-2px); }
.small-box > .inner { padding: 18px 18px 12px; }
.small-box h3 {
  color: var(--pos-text) !important;
  font-size: 27px !important;
  font-weight: 700;
  letter-spacing: -.02em;
  margin: 0 0 6px;
  white-space: nowrap;
}
.small-box p {
  color: var(--pos-muted) !important;
  font-size: 12.5px;
  letter-spacing: .04em;
  text-transform: uppercase;
  margin: 0;
}
.small-box > .small-box-footer {
  background: transparent !important;
  border-top: 1px solid var(--pos-line);
  color: var(--pos-faint) !important;
  font-size: 12px;
  padding: 9px 18px;
  transition: color .18s ease, background .18s ease;
}
.small-box > .small-box-footer:hover {
  background: var(--pos-surface-2) !important;
  color: var(--pos-gold) !important;
}
.small-box .icon {
  top: 12px;
  right: 14px;
  font-size: 56px !important;
  opacity: .13;
  color: var(--pos-text-strong);
  transition: opacity .2s ease;
}
.small-box:hover .icon { opacity: .2; }

/* El acento por tipo va como BORDE, no como box-shadow: así la sombra queda
   libre para dar profundidad sin borrar el acento (que es lo que pasaba en el
   tema claro, donde las tarjetas quedaban lavadas). */
.small-box { border-left: 3px solid var(--pos-line) !important; }
.small-box.bg-aqua,   .small-box.bg-blue   { border-left-color: var(--pos-info) !important; }
.small-box.bg-green,  .small-box.bg-olive  { border-left-color: var(--pos-ok) !important; }
.small-box.bg-yellow, .small-box.bg-orange { border-left-color: var(--pos-gold) !important; }
.small-box.bg-teal                          { border-left-color: #34d3c0 !important; }
.small-box.bg-red,    .small-box.bg-maroon  { border-left-color: var(--pos-danger) !important; }
.small-box.bg-purple                        { border-left-color: #a78bfa !important; }

.small-box.bg-aqua   .icon, .small-box.bg-blue   .icon { color: var(--pos-info); opacity: .22; }
.small-box.bg-green  .icon, .small-box.bg-olive  .icon { color: var(--pos-ok); opacity: .22; }
.small-box.bg-yellow .icon, .small-box.bg-orange .icon { color: var(--pos-gold); opacity: .22; }
.small-box.bg-teal   .icon                             { color: #34d3c0; opacity: .22; }
.small-box.bg-red    .icon, .small-box.bg-maroon .icon { color: var(--pos-danger); opacity: .22; }
.small-box.bg-purple .icon                             { color: #a78bfa; opacity: .22; }

/* los mismos bg-* usados fuera de small-box (etiquetas, cabeceras) */
.bg-aqua, .bg-blue    { background-color: rgba(91,124,250,.14) !important; color: #9db1ff !important; }
.bg-green, .bg-olive  { background-color: rgba(74,222,155,.14) !important; color: var(--pos-ok) !important; }
.bg-yellow, .bg-orange{ background-color: var(--pos-gold-soft) !important;  color: var(--pos-gold) !important; }
.bg-teal              { background-color: rgba(52,211,192,.14) !important;  color: #34d3c0 !important; }
.bg-red, .bg-maroon   { background-color: rgba(248,117,117,.14) !important; color: var(--pos-danger) !important; }
.bg-gray              { background-color: var(--pos-surface-3) !important;  color: var(--pos-text-soft) !important; }
/* dentro de small-box el fondo lo maneja .small-box, no estas reglas */
.small-box.bg-aqua, .small-box.bg-blue, .small-box.bg-green, .small-box.bg-olive,
.small-box.bg-yellow, .small-box.bg-orange, .small-box.bg-teal,
.small-box.bg-red, .small-box.bg-maroon, .small-box.bg-purple, .small-box.bg-gray {
  background: var(--pos-surface) !important;
  color: var(--pos-text) !important;
}

/* --- tablas --------------------------------------------------------------- */

.table { color: var(--pos-text); }
.table > thead > tr > th {
  background: var(--pos-surface-2);
  border-bottom: 1px solid var(--pos-line-2) !important;
  border-top: 0 !important;
  color: var(--pos-muted);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .07em;
  text-transform: uppercase;
  padding: 9px 12px;
}
.table > tbody > tr > td {
  border-top: 1px solid var(--pos-line) !important;
  padding: 9px 12px;   /* 11 era demasiado, 6 quedó apretado */
  vertical-align: middle;
  font-size: 13.5px;
}

/* Los botones dentro de las celdas —el stock, «Agregar», editar y borrar—
   traen el relleno de un botón normal y son los que estiraban la fila mucho
   más que el propio texto. Dentro de una tabla van compactos. */
.table > tbody > tr > td .btn {
  padding: 5px 12px;
  font-size: 12.5px;
  line-height: 1.5;
}
.table > tbody > tr > td .btn-group .btn { padding: 5px 10px; }
.table > tbody > tr > td .img-thumbnail { padding: 2px !important; }
.table-hover > tbody > tr:hover,
.table > tbody > tr:hover { background-color: var(--pos-surface-2) !important; }
.table-striped > tbody > tr:nth-of-type(odd) { background-color: rgba(255,255,255,.015); }
.table-bordered, .table-bordered > thead > tr > th,
.table-bordered > tbody > tr > td, .table-bordered > tbody > tr > th {
  border-color: var(--pos-line) !important;
}

/* DataTables */
.dataTables_wrapper { color: var(--pos-text-soft); }

/* Las tablas anchas se cortaban contra el borde del panel y la columna de
   Acciones quedaba fuera de alcance: sin barra de desplazamiento no había
   forma de pulsar sus botones. Ahora la tabla se desplaza en horizontal
   dentro de su panel. Se aplica al envoltorio de DataTables y no a .box-body,
   porque hacer de este último un contenedor de desplazamiento recortaría los
   menús desplegables que se abren dentro. */
/* Sin recorte ni barras. Se probó `overflow-x: auto` para las tablas anchas,
   pero arrastraba dos problemas: el navegador forzaba también la barra
   vertical, y al taparla con `overflow-y: hidden` se recortaba el paginador,
   que queda al final del envoltorio. Como la causa del desbordamiento eran los
   márgenes negativos de los controles —ya corregidos abajo— y la tabla ahora
   se ajusta al 100%, no hace falta ningún recorte. */
.dataTables_wrapper { overflow: visible; }

/* DataTables le fija a la tabla un ancho en PÍXELES calculado al arrancar. Si
   mide antes de que el panel se asiente, se pasa por uno o dos píxeles y salta
   la barra horizontal aunque a la vista quepa. Forzando el 100% la tabla se
   adapta al panel y solo se desplaza cuando las columnas de verdad no caben. */
.dataTables_wrapper table.dataTable {
  width: 100% !important;
  max-width: 100% !important;
}

/* LA CAUSA REAL de la barra horizontal: DataTables mete los controles de
   «Mostrar» y «Buscar» y la paginación en <div class="row"> de Bootstrap, que
   lleva márgenes negativos de 15px a cada lado. Dentro de un contenedor con
   desplazamiento esos 30px sobresalen y disparan la barra aunque la tabla
   quepa. Quitar la columna Imagen no podía arreglarlo porque no era la tabla
   la que se desbordaba, sino sus controles. */
.dataTables_wrapper > .row {
  margin-left: 0 !important;
  margin-right: 0 !important;
}
.dataTables_wrapper > .row > [class*="col-"] {
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* las tablas sueltas, fuera de DataTables */
.box-body > .table-responsive { overflow-x: auto; }

/* --- producto dentro de la celda de descripción --------------------------- */
/* Reemplaza a la columna «Imagen», que ocupaba un ancho entero para un botón.
   El ojo va a la izquierda del nombre, discreto, y solo se enciende al pasar. */

.celda-producto {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  text-align: left;
}
.ojo-imagen {
  flex: 0 0 auto;
  padding: 0 !important;
  border: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
  color: var(--pos-faint) !important;
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  transition: color .16s ease;
}
.ojo-imagen:hover { color: var(--pos-gold) !important; }
.ojo-imagen:focus-visible { outline: 2px solid var(--pos-gold); outline-offset: 2px; }

/* la descripción se lee mejor alineada a la izquierda que centrada */
table.dataTable td .celda-producto { justify-content: flex-start; }
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate { color: var(--pos-muted) !important; font-size: 13px; }

/* Paginación de DataTables.
   Según la integración que use, el botón puede ser un <a class="paginate_button">
   o un <li><a> de Bootstrap. Antes solo se cubría el primero, y por eso
   «Anterior», «…» y «Siguiente» salían en blanco y aparecían recuadros vacíos.
   Aquí se cubren las dos, y se ordena el flujo para que no salte de línea. */

.dataTables_wrapper .dataTables_paginate {
  float: none !important;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
  gap: 4px;
  padding-top: 8px;
}
.dataTables_wrapper .pagination {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin: 0 !important;
}
/* El <li> nunca debe pintar: DataTables pone la clase `paginate_button` en el
   <li>, no en el enlace, así que el borde le caía al <li> Y al <a> de dentro —
   de ahí el recuadro dentro de otro recuadro. Estos selectores llevan un
   elemento más para ganarle en especificidad a la regla de abajo. */
.dataTables_wrapper .dataTables_paginate li,
.dataTables_wrapper .dataTables_paginate li.paginate_button,
.dataTables_wrapper .pagination > li,
.pagination > li {
  background: transparent !important;
  border: 0 !important;
  padding: 0 !important;
  box-shadow: none !important;
}
.dataTables_wrapper .pagination > li:empty,
.pagination > li:empty { display: none !important; }

/* solo se pinta el elemento que el usuario pulsa */
.dataTables_wrapper .dataTables_paginate a.paginate_button,
.dataTables_wrapper .pagination > li > a,
.dataTables_wrapper .pagination > li > span,
.pagination > li > a,
.pagination > li > span {
  background: var(--pos-surface-2) !important;
  border: 1px solid var(--pos-line) !important;
  border-radius: 7px !important;
  color: var(--pos-text-soft) !important;
  margin: 0 !important;
  padding: 6px 12px !important;
  font-size: 13px;
  float: none !important;
  min-width: 34px;
  text-align: center;
  transition: background .16s ease, border-color .16s ease, color .16s ease;
}

.dataTables_wrapper .dataTables_paginate a.paginate_button:hover,
.dataTables_wrapper .pagination > li > a:hover,
.pagination > li > a:hover {
  background: var(--pos-surface-3) !important;
  border-color: var(--pos-line-2) !important;
  color: var(--pos-text-strong) !important;
}

/* página actual */
.dataTables_wrapper .dataTables_paginate a.paginate_button.current,
.dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,
.dataTables_wrapper .pagination > .active > a,
.dataTables_wrapper .pagination > .active > span,
.dataTables_wrapper .pagination > .active > a:hover,
.pagination > .active > a,
.pagination > .active > span {
  background: var(--pos-gold) !important;
  border-color: var(--pos-gold) !important;
  color: var(--pos-on-gold) !important;
  font-weight: 700;
}

/* deshabilitados: «Anterior» en la primera página, «Siguiente» en la última */
.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,
.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,
.dataTables_wrapper .pagination > .disabled > a,
.dataTables_wrapper .pagination > .disabled > span,
.pagination > .disabled > a,
.pagination > .disabled > span {
  background: transparent !important;
  border-color: var(--pos-line) !important;
  color: var(--pos-faint) !important;
  cursor: default;
}

/* los puntos suspensivos no son un botón */
.dataTables_wrapper .dataTables_paginate .ellipsis,
.dataTables_wrapper .pagination > li > span.ellipsis {
  background: transparent !important;
  border-color: transparent !important;
  color: var(--pos-faint) !important;
}
table.dataTable thead .sorting:after, table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after { color: var(--pos-faint); opacity: .8; }

/* --- formularios ---------------------------------------------------------- */

.form-control,
select.form-control,
textarea.form-control {
  background-color: var(--pos-surface-2) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius-sm) !important;
  box-shadow: none !important;
  color: var(--pos-text) !important;
  transition: border-color .18s ease, box-shadow .18s ease;
}
.form-control:focus {
  border-color: var(--pos-gold) !important;
  box-shadow: 0 0 0 3px rgba(211,175,53,.16) !important;
}
.form-control::placeholder { color: var(--pos-faint) !important; }
.form-control[disabled], .form-control[readonly] {
  background-color: var(--pos-inactivo) !important;
  color: var(--pos-muted) !important;
}
label, .control-label { color: var(--pos-text-soft); font-weight: 600; font-size: 13px; }

.input-group-addon {
  background-color: var(--pos-surface-3) !important;
  border: 1px solid var(--pos-line-2) !important;
  color: var(--pos-muted) !important;
}
/* Botón dentro de un complemento de campo (la X de quitar producto en una
   venta). Su relleno propio estiraba el complemento y la fila quedaba más alta
   que los campos vecinos: aquí se le quita el cuerpo y queda solo el icono. */
.input-group-addon > .btn {
  padding: 0 3px !important;
  margin: 0 !important;
  border: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
  font-size: 14px;
  line-height: 1;
  height: auto;
  vertical-align: middle;
}
.input-group-addon > .btn.btn-danger { color: var(--pos-danger) !important; }
.input-group-addon > .btn.btn-danger:hover { color: #ff9a9a !important; }
.input-group-addon > .btn.btn-primary { color: var(--pos-gold) !important; }
.input-group-addon > .btn:focus { box-shadow: none !important; outline: 2px solid var(--pos-gold); outline-offset: 2px; }

/* complemento que además es un botón (p. ej. «crear cliente») */
.input-group-addon.addon-accion {
  cursor: pointer;
  color: var(--pos-gold) !important;
  transition: background .16s ease, color .16s ease;
}
.input-group-addon.addon-accion:hover {
  background-color: var(--pos-gold-soft) !important;
  color: var(--pos-gold) !important;
}

/* Los campos de solo lectura llevan un dato válido, solo que no editable. Se
   distinguen por el fondo, no por el borde: probé con borde punteado y rompía
   la unión con el icono del grupo, que es sólido — quedaba un corte visible
   justo donde deben empalmar. */
.form-control[readonly] { cursor: default; }
/* Esquinas del grupo campo + icono.
   Antes se resolvía con :first-child / :last-child, pero varios grupos llevan
   un <input type="hidden"> detrás del campo visible (idVendedor, numresol…).
   Ese campo oculto ocupa el lugar de «último hijo», así que el visible no
   perdía sus esquinas redondeadas del lado del icono y quedaba un hueco entre
   ambos. Con el selector de hermano adyacente la posición final da igual. */

/* icono a la izquierda */
.input-group > .input-group-addon:first-child {
  border-radius: var(--pos-radius-sm) 0 0 var(--pos-radius-sm) !important;
  border-right-width: 0 !important;
}
.input-group > .input-group-addon:first-child + .form-control {
  border-radius: 0 var(--pos-radius-sm) var(--pos-radius-sm) 0 !important;
}

/* icono a la derecha (el % y el $) */
.input-group > .form-control:first-child {
  border-radius: var(--pos-radius-sm) 0 0 var(--pos-radius-sm) !important;
}
.input-group > .form-control + .input-group-addon {
  border-radius: 0 var(--pos-radius-sm) var(--pos-radius-sm) 0 !important;
  border-left-width: 0 !important;
}

.help-block { color: var(--pos-faint); }
.has-error .form-control { border-color: var(--pos-danger) !important; }
.has-error .control-label, .has-error .help-block { color: var(--pos-danger); }

/* --- botones -------------------------------------------------------------- */

.btn {
  border-radius: var(--pos-radius-sm);
  font-weight: 600;
  font-size: 13.5px;
  letter-spacing: .005em;
  transition: filter .18s ease, background .18s ease, border-color .18s ease;
}
.btn:focus, .btn:active:focus {
  outline: 0;
  box-shadow: 0 0 0 3px rgba(211,175,53,.24) !important;
}

.btn-primary,
.btn-primary:focus {
  background: linear-gradient(180deg, #e0c052, var(--pos-gold-dark)) !important;
  border-color: var(--pos-gold-dark) !important;
  color: var(--pos-on-gold) !important;
}
.btn-primary:hover, .btn-primary:active, .btn-primary.active {
  background: linear-gradient(180deg, #e8cc6a, #c5a231) !important;
  border-color: var(--pos-gold) !important;
  color: var(--pos-on-gold) !important;
  filter: none;
}

.btn-default {
  background: var(--pos-surface-3) !important;
  border-color: var(--pos-line-2) !important;
  color: var(--pos-text-soft) !important;
}
.btn-default:hover, .btn-default:focus {
  background: var(--pos-hover) !important;
  border-color: #3a3a4e !important;
  color: var(--pos-text-strong) !important;
}

.btn-success { background: rgba(74,222,155,.16) !important;  border-color: rgba(74,222,155,.4) !important;  color: var(--pos-ok) !important; }
.btn-info    { background: rgba(91,124,250,.16) !important;  border-color: rgba(91,124,250,.4) !important;  color: #9db1ff !important; }
.btn-warning { background: var(--pos-gold-soft) !important;  border-color: rgba(211,175,53,.4) !important;  color: var(--pos-gold) !important; }
.btn-danger  { background: rgba(248,117,117,.16) !important; border-color: rgba(248,117,117,.4) !important; color: var(--pos-danger) !important; }
/* Los botones de borrar están escritos como btn-primary en el código, así que
   salían dorados e idénticos a los de editar. Al lado uno del otro eso invita
   al clic equivocado, y borrar no se deshace. Se distinguen por su clase de
   comportamiento, sin tocar el PHP que los genera. */
.btn[class*="btnEliminar"] {
  background: rgba(248, 117, 117, .16) !important;
  border-color: rgba(248, 117, 117, .42) !important;
  color: var(--pos-danger) !important;
}
.btn[class*="btnEliminar"]:hover {
  background: rgba(248, 117, 117, .3) !important;
  border-color: var(--pos-danger) !important;
  color: #ff9a9a !important;
}
html.tema-claro .btn[class*="btnEliminar"] {
  background: rgba(220, 38, 38, .1) !important;
  border-color: rgba(220, 38, 38, .34) !important;
  color: #b91c1c !important;
}
html.tema-claro .btn[class*="btnEliminar"]:hover {
  background: rgba(220, 38, 38, .18) !important;
  color: #991b1b !important;
}

.btn-success:hover { background: rgba(74,222,155,.26) !important;  color: #7ff0bb !important; }
.btn-info:hover    { background: rgba(91,124,250,.26) !important;  color: #b9c7ff !important; }
.btn-warning:hover { background: rgba(211,175,53,.24) !important;  color: #e6c66a !important; }
.btn-danger:hover  { background: rgba(248,117,117,.26) !important; color: #ffa0a0 !important; }

/* --- ventanas modales ----------------------------------------------------- */

.modal-content {
  background: var(--pos-surface) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius) !important;
  box-shadow: 0 30px 80px rgba(0,0,0,.6) !important;
  color: var(--pos-text);
}
.modal-header {
  background: var(--pos-surface-2) !important;
  border-bottom: 1px solid var(--pos-line) !important;
  border-radius: var(--pos-radius) var(--pos-radius) 0 0;
  padding: 16px 20px;
}
.modal-header .modal-title { color: var(--pos-text); font-weight: 600; font-size: 16px; }
.modal-header .close { color: var(--pos-muted); opacity: 1; text-shadow: none; font-size: 24px; }
.modal-header .close:hover { color: var(--pos-danger); }
.modal-body { padding: 20px; }
.modal-footer {
  background: var(--pos-surface-2) !important;
  border-top: 1px solid var(--pos-line) !important;
  border-radius: 0 0 var(--pos-radius) var(--pos-radius);
}
.modal-backdrop.in { background: #05050a; opacity: .78; }

/* --- etiquetas, alertas, misceláneos ------------------------------------- */

.label { border-radius: 999px; font-weight: 600; font-size: 11px; padding: 4px 9px; letter-spacing: .04em; }
.label-success { background: rgba(74,222,155,.16) !important;  color: var(--pos-ok) !important; }
.label-danger  { background: rgba(248,117,117,.16) !important; color: var(--pos-danger) !important; }
.label-warning { background: var(--pos-gold-soft) !important;  color: var(--pos-gold) !important; }
.label-info    { background: rgba(91,124,250,.16) !important;  color: #9db1ff !important; }
.label-primary { background: var(--pos-gold-soft) !important;  color: var(--pos-gold) !important; }
.label-default { background: var(--pos-surface-3) !important;  color: var(--pos-text-soft) !important; }

.alert { border-radius: var(--pos-radius-sm); border-width: 1px; }
.alert-success { background: rgba(74,222,155,.1) !important;  border-color: rgba(74,222,155,.3) !important;  color: var(--pos-ok) !important; }
.alert-danger  { background: rgba(248,117,117,.1) !important; border-color: rgba(248,117,117,.3) !important; color: var(--pos-danger) !important; }
.alert-warning { background: rgba(211,175,53,.1) !important;  border-color: rgba(211,175,53,.3) !important;  color: var(--pos-gold) !important; }
.alert-info    { background: rgba(91,124,250,.1) !important;  border-color: rgba(91,124,250,.3) !important;  color: #9db1ff !important; }

/* Bootstrap pinta <legend> en gris oscuro con línea inferior clara: sobre el
   fondo oscuro quedaba invisible (ej. «Resumen caja» en Administrar ventas). */
fieldset { border: 0; margin: 0; padding: 0; }
fieldset > legend,
legend {
  width: 100%;
  margin-bottom: 16px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--pos-line) !important;
  color: var(--pos-text) !important;
  font-size: 16px;
  font-weight: 600;
  letter-spacing: -.005em;
}

.nav-tabs { border-bottom: 1px solid var(--pos-line); }
.nav-tabs > li > a { color: var(--pos-muted); border: 0 !important; border-bottom: 2px solid transparent !important; background: transparent !important; }
.nav-tabs > li > a:hover { color: var(--pos-text); }
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
  background: transparent !important;
  color: var(--pos-gold) !important;
  border-bottom-color: var(--pos-gold) !important;
}
.nav-tabs-custom { background: var(--pos-surface) !important; border-radius: var(--pos-radius); border: 1px solid var(--pos-line); box-shadow: none; }
.nav-tabs-custom > .nav-tabs { border-bottom-color: var(--pos-line); }

.pagination > li > a, .pagination > li > span {
  background: var(--pos-surface-2);
  border-color: var(--pos-line);
  color: var(--pos-text-soft);
}
.pagination > .active > a, .pagination > .active > span {
  background: var(--pos-gold);
  border-color: var(--pos-gold);
  color: var(--pos-on-gold);
}

.dropdown-menu {
  background: var(--pos-surface-2) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius-sm);
  box-shadow: 0 18px 44px rgba(0,0,0,.55);
}
.dropdown-menu > li > a { color: var(--pos-text-soft) !important; }
.dropdown-menu > li > a:hover { background: var(--pos-surface-3) !important; color: var(--pos-text-strong) !important; }
.dropdown-menu .divider { background: var(--pos-line); }

/* Desplegables del cabezote (notificaciones y usuario). AdminLTE le pone fondo
   blanco a la cabecera y al pie por separado del menú, así que quedaban dos
   bandas claras dentro de un panel oscuro. */
.navbar-custom-menu .dropdown-menu > li.header,
.navbar-nav > li > .dropdown-menu > li.header {
  background: var(--pos-surface-3) !important;
  border-bottom: 1px solid var(--pos-line) !important;
  color: var(--pos-text) !important;
  border-radius: var(--pos-radius-sm) var(--pos-radius-sm) 0 0;
  padding: 12px 16px;
}
.navbar-custom-menu .dropdown-menu > li.header h4,
.navbar-custom-menu .dropdown-menu > li.header p,
.navbar-custom-menu .dropdown-menu > li.header span {
  color: var(--pos-text) !important;
}
.navbar-custom-menu .dropdown-menu > li.header p { color: var(--pos-muted) !important; }

.navbar-custom-menu .dropdown-menu > li.footer > a,
.navbar-nav > li > .dropdown-menu > li.footer > a {
  background: var(--pos-surface-3) !important;
  border-top: 1px solid var(--pos-line) !important;
  color: var(--pos-gold) !important;
  border-radius: 0 0 var(--pos-radius-sm) var(--pos-radius-sm);
  padding: 11px 16px;
  font-size: 13px;
  font-weight: 600;
}
.navbar-custom-menu .dropdown-menu > li.footer > a:hover {
  background: var(--pos-hover) !important;
  color: var(--pos-gold-hover) !important;
}

/* la lista interior del desplegable */
.navbar-custom-menu .dropdown-menu .menu { background: var(--pos-surface-2) !important; }
.navbar-custom-menu .dropdown-menu .menu > li > a {
  background: transparent !important;
  border-bottom: 1px solid var(--pos-line) !important;
  color: var(--pos-text-soft) !important;
  font-size: 13.5px;
}
.navbar-custom-menu .dropdown-menu .menu > li:last-child > a { border-bottom: 0 !important; }
.navbar-custom-menu .dropdown-menu .menu > li > a:hover {
  background: var(--pos-surface-3) !important;
  color: var(--pos-text) !important;
}

/* panel del usuario dentro de su desplegable */
.navbar-custom-menu .user-menu .dropdown-menu > li.user-header {
  background: var(--pos-surface-3) !important;
  color: var(--pos-text) !important;
  border-bottom: 1px solid var(--pos-line);
}
.navbar-custom-menu .user-menu .dropdown-menu > li.user-header p { color: var(--pos-muted) !important; }
.navbar-custom-menu .user-menu .dropdown-menu > .user-body {
  background: var(--pos-surface-2) !important;
  border-bottom: 1px solid var(--pos-line) !important;
}
.navbar-custom-menu .user-menu .dropdown-menu > .user-body a { color: var(--pos-gold) !important; }
.navbar-custom-menu .user-menu .dropdown-menu > .user-footer {
  background: var(--pos-surface-3) !important;
}
.navbar-custom-menu .user-menu .dropdown-menu > .user-footer .btn-default {
  background: var(--pos-surface) !important;
  border-color: var(--pos-line-2) !important;
  color: var(--pos-text-soft) !important;
}

.progress { background: var(--pos-surface-3); border-radius: 999px; box-shadow: none; }
.progress-bar { background: var(--pos-gold); }

hr { border-top-color: var(--pos-line); }
.text-muted { color: var(--pos-faint) !important; }
.close { color: var(--pos-muted); text-shadow: none; opacity: 1; }

/* --- resumen de inventario (pie de Administrar productos) ----------------- */

.resumen-inv {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  margin-top: 22px;
  padding-top: 20px;
  border-top: 1px solid var(--pos-line);
}
.resumen-inv__item {
  flex: 1 1 240px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 16px 18px;
  border: 1px solid var(--pos-line);
  border-radius: var(--pos-radius-sm);
  background: var(--pos-surface-2);
}
.resumen-inv__label {
  font-family: var(--mono, inherit);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pos-muted);
}
.resumen-inv__valor {
  font-size: 25px;
  font-weight: 700;
  letter-spacing: -.02em;
  color: var(--pos-text);
  line-height: 1.1;
}
.resumen-inv__valor--destacado { color: var(--pos-gold); }

@media (max-width: 560px) {
  .resumen-inv__item { flex-basis: 100%; }
  .resumen-inv__valor { font-size: 21px; }
}

/* --- listas de productos del inicio -------------------------------------- */
/* AdminLTE pinta estas listas para fondo blanco: los nombres quedaban casi
   ilegibles, las miniaturas con recuadro blanco y las etiquetas de precio como
   parches claros. */

/* el filete de color del panel es solo arriba; los otros tres lados, discretos */
.box[class*="box-"] {
  border-left-color: var(--pos-line) !important;
  border-right-color: var(--pos-line) !important;
  border-bottom-color: var(--pos-line) !important;
}

/* «Productos recien agregados» */
.products-list > .item {
  background: transparent !important;
  border-bottom: 1px solid var(--pos-line) !important;
  box-shadow: none !important;
  padding: 12px 0;
}
.products-list > .item:last-child { border-bottom: 0 !important; }
.products-list > .item:hover { background: var(--pos-surface-2) !important; }
.product-list-in-box > .item { border-bottom: 1px solid var(--pos-line) !important; }

.products-list .product-title {
  color: var(--pos-text) !important;
  font-weight: 600;
  font-size: 14px;
}
.products-list a .product-title,
.products-list .product-title a { color: var(--pos-text) !important; }
.products-list a:hover .product-title { color: var(--pos-gold) !important; }
.products-list .product-description {
  color: var(--pos-muted) !important;
  font-size: 12.5px;
}
.products-list .product-img { padding-right: 12px; }
.products-list .product-img img {
  background: var(--pos-surface-3);
  border: 1px solid var(--pos-line);
  border-radius: 8px;
  padding: 3px;
}

/* imagen sustituida por el respaldo: se atenúa para que se lea como
   «sin foto» y no como una foto real */
.img-respaldo { opacity: .5; filter: grayscale(1); }

/* la miniatura de Bootstrap trae fondo blanco y borde claro */
.img-thumbnail {
  background-color: var(--pos-surface-3) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: 8px !important;
  padding: 3px !important;
}

/* «Productos más vendidos»: la lista va en nav-pills, que AdminLTE deja en
   gris oscuro sobre blanco */
.nav-pills > li > a,
.nav-stacked > li > a {
  color: var(--pos-text) !important;
  background: transparent !important;
  border-radius: 0;
  border-bottom: 1px solid var(--pos-line);
  font-size: 13.5px;
  transition: background .18s ease;
}
.nav-pills > li:last-child > a,
.nav-stacked > li:last-child > a { border-bottom: 0; }
.nav-pills > li > a:hover,
.nav-stacked > li > a:hover { background: var(--pos-surface-2) !important; }
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
  background: var(--pos-gold) !important;
  color: var(--pos-on-gold) !important;
}

/* --- dona de productos más vendidos --------------------------------------- */

.dona { position: relative; }
.dona__centro {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  pointer-events: none;   /* no debe estorbar al tooltip del gráfico */
  text-align: center;
}
.dona__cifra {
  font-size: 30px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -.02em;
  color: var(--pos-text);
}
.dona__nota {
  margin-top: 4px;
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pos-muted);
}

/* la dona no debe ocupar todo el ancho del panel ahora que va sola */
.dona { max-width: 340px; margin: 0 auto; }

/* lista de más vendidos: punto de color + foto + nombre + porcentaje */
.mas-vendido {
  display: flex !important;
  align-items: center;
  gap: 12px;
}
.mas-vendido__punto {
  flex: 0 0 auto;
  width: 9px;
  height: 9px;
  border-radius: 50%;
}
.mas-vendido__img { flex: 0 0 auto; margin: 0 !important; }
.mas-vendido__nombre {
  flex: 1 1 auto;
  color: var(--pos-text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.mas-vendido__pct {
  flex: 0 0 auto;
  font-weight: 700;
  font-size: 13px;
  color: var(--pos-text);
  font-variant-numeric: tabular-nums;
}

/* leyenda: cada fila dice su porcentaje, así se entiende sin cruzar colores */
.chart-legend, .leyenda { list-style: none; padding: 0; margin: 0; }
.chart-legend li { color: var(--pos-text) !important; font-size: 13.5px; margin-bottom: 5px; }

.leyenda li {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 5px 0;
  font-size: 13px;
  border-bottom: 1px solid var(--pos-line);
}
.leyenda li:last-child { border-bottom: 0; }
.leyenda__punto {
  flex: 0 0 auto;
  width: 9px;
  height: 9px;
  border-radius: 50%;
}
.leyenda__nombre {
  flex: 1 1 auto;
  color: var(--pos-text-soft);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.leyenda__pct {
  flex: 0 0 auto;
  font-weight: 700;
  font-size: 12.5px;
  color: var(--pos-text);
  font-variant-numeric: tabular-nums;
}

/* las etiquetas de precio se veían como parches blancos */
.label.label-warning { background: var(--pos-gold-soft) !important; color: var(--pos-gold) !important; }
.label.label-success { background: rgba(74, 222, 155, .16) !important; color: var(--pos-ok) !important; }
.label.label-danger  { background: rgba(248, 117, 117, .16) !important; color: var(--pos-danger) !important; }
.label.label-info    { background: rgba(91, 124, 250, .16) !important; color: #9db1ff !important; }
.label.label-primary { background: var(--pos-gold-soft) !important; color: var(--pos-gold) !important; }
.label.label-default { background: var(--pos-surface-3) !important; color: var(--pos-text-soft) !important; }

/* --- diálogos (SweetAlert2 7.1.2) ---------------------------------------- */
/* Los usa todo el POS para confirmar y avisar; venían en blanco sobre el tema
   oscuro. Se estilan de forma global, no solo el del login. */

.swal2-container { background: rgba(5, 5, 10, .72) !important; }

.swal2-popup {
  background: var(--pos-surface-2) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius) !important;
  box-shadow: 0 34px 90px rgba(0, 0, 0, .62) !important;
  color: var(--pos-text) !important;
  font-family: "Source Sans Pro", system-ui, sans-serif !important;
  padding: 26px 26px 22px !important;
}
.swal2-popup .swal2-title {
  color: var(--pos-text) !important;
  font-size: 21px !important;
  font-weight: 700 !important;
  letter-spacing: -.01em;
}
.swal2-popup .swal2-content,
.swal2-popup #swal2-content {
  color: var(--pos-text-soft) !important;
  font-size: 14.5px !important;
  line-height: 1.6 !important;
}
.swal2-popup .swal2-content b { color: var(--pos-text) !important; }

.swal2-popup .swal2-styled {
  border-radius: var(--pos-radius-sm) !important;
  font-weight: 600 !important;
  font-size: 14px !important;
  padding: 10px 22px !important;
  box-shadow: none !important;
}
/* El principal manda: dorado lleno. El de cancelar es secundario y debe
   verse como tal —contorno, sin relleno—, no competir con el otro. Antes
   llevaba un azul marino fijo desde el JS que en tema claro dejaba letra gris
   sobre fondo oscuro. */
.swal2-popup .swal2-confirm {
  background: var(--pos-gold) !important;
  border: 1px solid var(--pos-gold) !important;
  color: var(--pos-on-gold) !important;
}
.swal2-popup .swal2-confirm:hover {
  background: var(--pos-gold-dark) !important;
  border-color: var(--pos-gold-dark) !important;
}

.swal2-popup .swal2-cancel {
  background: transparent !important;
  border: 1px solid var(--pos-line-2) !important;
  color: var(--pos-text) !important;
}
.swal2-popup .swal2-cancel:hover {
  background: var(--pos-hover) !important;
  border-color: var(--pos-muted) !important;
  color: var(--pos-text-strong) !important;
}
.swal2-popup .swal2-styled:focus { box-shadow: 0 0 0 3px rgba(211, 175, 53, .26) !important; }

/* los iconos de v7 llevan colores fijos que chocan con el fondo oscuro */
.swal2-popup .swal2-icon.swal2-warning { border-color: var(--pos-warn) !important; color: var(--pos-warn) !important; }
.swal2-popup .swal2-icon.swal2-error   { border-color: var(--pos-danger) !important; }
.swal2-popup .swal2-icon.swal2-error [class^="swal2-x-mark-line"] { background-color: var(--pos-danger) !important; }
.swal2-popup .swal2-icon.swal2-success { border-color: var(--pos-ok) !important; }
.swal2-popup .swal2-icon.swal2-success [class^="swal2-success-line"] { background-color: var(--pos-ok) !important; }
.swal2-popup .swal2-icon.swal2-success .swal2-success-ring { border-color: rgba(74, 222, 155, .32) !important; }
.swal2-popup .swal2-icon.swal2-info,
.swal2-popup .swal2-icon.swal2-question { border-color: var(--pos-info) !important; color: var(--pos-info) !important; }

.swal2-popup .swal2-close { color: var(--pos-muted) !important; }
.swal2-popup .swal2-close:hover { color: var(--pos-danger) !important; }
.swal2-popup .swal2-input,
.swal2-popup .swal2-select,
.swal2-popup .swal2-textarea {
  background: var(--pos-surface-3) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius-sm) !important;
  color: var(--pos-text) !important;
  box-shadow: none !important;
}
.swal2-popup .swal2-validationerror {
  background: rgba(248, 117, 117, .12) !important;
  color: var(--pos-danger) !important;
}

/* --- pie ------------------------------------------------------------------ */

.main-footer {
  background: var(--pos-surface) !important;
  border-top: 1px solid var(--pos-line) !important;
  color: var(--pos-muted) !important;
  font-size: 12.5px;
}
.main-footer a { color: var(--pos-gold) !important; }

/* --- gráficos ------------------------------------------------------------- */
/* Morris y Chart.js pintan con colores fijados en JS; lo que sí se puede
   ajustar por CSS son las rejillas, las etiquetas y el globo de datos. */

.morris-hover {
  background: var(--pos-surface-2) !important;
  border: 1px solid var(--pos-line-2) !important;
  border-radius: var(--pos-radius-sm) !important;
  color: var(--pos-text) !important;
  box-shadow: 0 14px 34px rgba(0,0,0,.5);
}
.morris-hover-row-label { color: var(--pos-muted) !important; font-weight: 600; }
svg text { fill: var(--pos-faint) !important; }
svg .morris-grid-line, svg path[stroke="#aaa"], svg line[stroke="#aaa"] { stroke: var(--pos-line) !important; }

/* --- login ---------------------------------------------------------------- */
/* Dos paneles, como la referencia que pasó el usuario: a la izquierda la marca,
   a la derecha el formulario. La referencia usaba un bloque azul saturado con
   el formulario en blanco; aquí se invierte la relación porque en esta marca el
   bloque fuerte es el dorado: panel dorado con texto oscuro, formulario sobre
   el fondo noche. */

/* OJO: la clase `login-page` está fija en el <body> de plantilla.php, así que
   la llevan TODAS las pantallas, no solo el login. Por eso aquí no se puede
   tocar el layout del body: hacerlo flex centrado colapsaba el dashboard.
   El centrado de la tarjeta lo resuelve `position: fixed` en .login-split. */
body.login-page { background: var(--pos-bg) !important; }

.login-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  /* Centrado absoluto: no depende de que el body sea flex, que es lo que
     estaba fallando y dejaba la tarjeta pegada arriba. */
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: calc(100% - 8vmin);
  max-width: 780px;
  max-height: calc(100vh - 6vmin);
  overflow-y: auto;
  border-radius: 18px;
  overflow: hidden;
  border: 1px solid var(--pos-line-2);
  box-shadow: 0 40px 110px rgba(0, 0, 0, .6);
}

/* --- panel de marca --- */

.login-split__brand {
  position: relative;
  padding: 30px 28px;
  background: linear-gradient(160deg, #e6c765 0%, var(--pos-gold) 42%, #a8871f 100%);
  color: #191509;
  display: flex;
  flex-direction: column;
}
/* rejilla tenue para que el dorado no quede plano */
.login-split__brand::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: .5;
  background-image:
    linear-gradient(rgba(25, 21, 9, .05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(25, 21, 9, .05) 1px, transparent 1px);
  background-size: 34px 34px;
  -webkit-mask-image: radial-gradient(circle at 30% 20%, black, transparent 82%);
          mask-image: radial-gradient(circle at 30% 20%, black, transparent 82%);
}
.login-split__brand > * { position: relative; z-index: 1; }

/* Logotipo negro sobre transparente, directo sobre el dorado: el contraste es
   alto y se ahorra el recuadro blanco, que partía el panel en dos. */
.login-split__logo { margin-bottom: 24px; text-align: center; }
.login-split__logo a { display: block; }
.login-split__logo img { width: 100%; max-width: 218px; height: auto; display: block; margin: 0 auto; }

.login-split__title {
  margin: 0;
  font-size: 21px;
  font-weight: 700;
  line-height: 1.22;
  letter-spacing: -.015em;
  color: #14110a;
  text-wrap: balance;
}
.login-split__tagline {
  margin: 8px 0 0;
  font-size: 13.5px;
  font-style: italic;
  color: rgba(25, 21, 9, .72);
}

.login-split__feats {
  list-style: none;
  margin: 22px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 11px;
}
.login-split__feats li {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  font-weight: 600;
  color: #1d1809;
}
.login-split__feats i {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  background: rgba(25, 21, 9, .12);
  font-size: 14px;
}

.login-split__mark {
  margin-top: auto;
  padding-top: 18px;
  display: flex;
  align-items: center;
  gap: 12px;
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: .04em;
  color: rgba(25, 21, 9, .66);
}
.login-split__mark span {
  width: 26px;
  height: 1.5px;
  background: rgba(25, 21, 9, .4);
}

/* --- panel del formulario --- */

.login-split__form {
  background: var(--pos-surface-2);
  padding: 30px 30px 26px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.login-split__h1 {
  margin: 0;
  font-size: 22px;
  font-weight: 700;
  letter-spacing: -.015em;
  color: var(--pos-text);
}
.login-split__sub {
  margin: 5px 0 20px;
  font-size: 13.5px;
  color: var(--pos-muted);
}

.login-split__form .form-group { margin-bottom: 14px; }
.login-split__form label {
  display: block;
  margin-bottom: 6px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pos-muted);
}
.login-split__form .form-control {
  height: auto;
  padding: 10px 14px 10px 40px;   /* hueco para el icono de la izquierda */
  font-size: 14px;
}
/* AdminLTE deja el icono a la derecha; la referencia lo tiene a la izquierda */
.login-split__form .has-feedback .form-control-feedback {
  left: 0;
  right: auto;
  top: auto;
  bottom: 1px;
  width: 40px;
  height: 40px;
  line-height: 40px;
  color: var(--pos-faint);
  pointer-events: none;
}

/* ojo para mostrar u ocultar la contraseña */
.login-split__form .has-feedback { position: relative; }
/* el campo de la clave necesita hueco a la derecha para el botón */
#ingPassword { padding-right: 42px !important; }

.login-split__eye {
  position: absolute;
  right: 1px;
  bottom: 1px;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pos-faint);
  font-size: 14px;
  cursor: pointer;
  border-radius: 0 var(--pos-radius-sm) var(--pos-radius-sm) 0;
  transition: color .16s ease, background .16s ease;
}
.login-split__eye:hover { color: var(--pos-gold); background: rgba(211, 175, 53, .08); }
.login-split__eye[aria-pressed="true"] { color: var(--pos-gold); }
.login-split__eye:focus-visible { outline: 2px solid var(--pos-gold); outline-offset: -2px; }

/* casilla de «recordar mis datos» */
.login-split__remember { margin: 2px 0 16px; }
.login-split__remember label {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  margin: 0;
  cursor: pointer;
  font-size: 13.5px;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pos-text-soft);
}
.login-split__remember input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 17px;
  height: 17px;
  margin: 0;
  flex: 0 0 auto;
  border: 1px solid var(--pos-line-2);
  border-radius: 5px;
  background: var(--pos-surface-3);
  cursor: pointer;
  position: relative;
  transition: background .16s ease, border-color .16s ease;
}
.login-split__remember input[type="checkbox"]:hover { border-color: var(--pos-gold); }
.login-split__remember input[type="checkbox"]:checked {
  background: var(--pos-gold);
  border-color: var(--pos-gold);
}
.login-split__remember input[type="checkbox"]:checked::after {
  content: "";
  position: absolute;
  left: 5px;
  top: 1px;
  width: 5px;
  height: 10px;
  border: solid var(--pos-on-gold);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.login-split__remember input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--pos-gold);
  outline-offset: 2px;
}

.login-split__btn {
  width: 100%;
  padding: 11px 18px;
  font-size: 14.5px;
  margin-top: 2px;
}

.login-split__foot {
  margin: 18px 0 0;
  text-align: center;
  font-size: 12px;
  color: var(--pos-faint);
}

/* los avisos de error del controlador, dentro del panel oscuro */
.login-split__form .alert { margin-top: 16px; margin-bottom: 0; font-size: 13.5px; }

@media (max-width: 860px) {
  .login-split { grid-template-columns: 1fr; max-width: 460px; }
  /* en móvil la marca se reduce a lo esencial: logo y título */
  .login-split__brand { padding: 26px 26px 24px; }
  .login-split__logo { margin-bottom: 20px; padding: 12px; }
  .login-split__logo img { width: 74px; }
  .login-split__title { font-size: 21px; }
  .login-split__feats, .login-split__mark { display: none; }
  .login-split__form { padding: 30px 24px 26px; }
}

/* --- responsive ----------------------------------------------------------- */

@media (max-width: 767px) {
  .content-header { padding: 16px 14px 4px; }
  .content-header > .breadcrumb { position: static; margin-top: 8px; float: none; }
  .box-body, .box-header { padding: 16px !important; }
  .small-box h3 { font-size: 23px !important; }
  .login-box, .register-box { width: 92%; }
}

/* --- menos movimiento ----------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
  * { transition-duration: .001ms !important; animation-duration: .001ms !important; }
  /* Lleva !important porque el zoom del dashboard usa un selector con :has(),
     más específico que este: sin ello, quien pide movimiento reducido seguiría
     viendo la card saltar. El relieve se conserva; lo que se quita es el salto. */
  .small-box:hover { transform: none !important; }
}


/* ==========================================================================
   PyG — el año arriba, los doce meses en lo que resta de pantalla
   --------------------------------------------------------------------------
   Antes cada mes traía su encabezado y cuatro tarjetas grandes: doce meses
   eran varias pantallas de desplazamiento, y nunca se veían dos meses juntos
   —justo lo que hace falta para comparar—. Ahora el resumen del año manda
   arriba y el detalle mensual va en tabla, que cabe entero.
   ========================================================================== */

.pyg {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 140px);
  min-height: 420px;
}

/* --- título de sección --- */
.pyg-titulo {
  flex: 0 0 auto;
  margin: 0 0 12px;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--pos-muted);
}
.pyg-titulo strong { color: var(--pos-text-strong); }

/* --- resumen del año: es el dato principal, que se note --- */
.pyg-tarjetas { flex: 0 0 auto; margin-bottom: 4px; }
.pyg-tarjetas .small-box { margin-bottom: 16px; }
.pyg-tarjetas .small-box .inner { padding: 16px 18px; }
.pyg-tarjetas .small-box h4 {
  margin: 0 0 2px;
  font-size: 22px;
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.pyg-tarjetas .small-box p {
  margin: 0;
  font-size: 12px;
  letter-spacing: .03em;
  opacity: .9;
}

/* --- detalle mensual: ocupa todo el alto sobrante --- */
.pyg-meses {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  margin-bottom: 0;
}
.pyg-meses__cuerpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;   /* si un año completo no cupiera, se desplaza aquí dentro
                         y no arrastra la página entera */
  padding: 0;
}

.pyg-tabla { margin-bottom: 0; }

/* el encabezado se queda fijo al desplazar los meses */
.pyg-tabla > thead > tr > th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--pos-surface);
  border-bottom: 1px solid var(--pos-line);
  font-size: 11px;
  letter-spacing: .05em;
  text-transform: uppercase;
  color: var(--pos-muted);
  white-space: nowrap;
}

.pyg-tabla > tbody > tr > td { vertical-align: middle; }

.pyg-tabla__mes {
  width: 1%;
  white-space: nowrap;
  font-weight: 600;
}
.pyg-tabla__num {
  text-align: right;
  white-space: nowrap;
  /* cifras de igual ancho: las columnas quedan alineadas y se comparan de un
     vistazo, que es el motivo de haberlas puesto en tabla */
  font-variant-numeric: tabular-nums;
}
/* costo y gasto son de apoyo; ventas y saldo son los que se leen */
.pyg-tabla__num--tenue { color: var(--pos-muted); }

/* --- saldo del mes: el color reemplaza a la tarjeta verde o roja --- */
.pyg-saldo {
  display: inline-block;
  min-width: 108px;
  padding: 3px 10px;
  border-radius: 999px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.pyg-saldo--positivo {
  color: var(--pos-ok);
  background: rgba(74,222,155,.14);
}
.pyg-saldo--negativo {
  color: var(--pos-danger);
  background: rgba(248,117,117,.14);
}

/* En pantallas pequeñas se vuelve al desplazamiento normal de la página:
   atar el alto a la ventana ahí estorba más de lo que ayuda. */
@media (max-width: 991px) {
  .pyg { display: block; max-height: none; min-height: 0; }
  .pyg-meses { display: block; }
  .pyg-meses__cuerpo { overflow: visible; }
  .pyg-tabla > thead > tr > th { position: static; }
  .pyg-saldo { min-width: 0; }
}


/* ==========================================================================
   Crear gasto — un formulario corto no necesita toda la pantalla
   ========================================================================== */

.gasto-crear .box { margin-bottom: 0; }
.gasto-crear .box-body { padding: 20px 20px 6px; }

.gasto-crear label {
  display: block;
  margin-bottom: 6px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .03em;
  color: var(--pos-text-soft);
}

.gasto-crear textarea.form-control {
  resize: vertical;
  min-height: 90px;
}

.gasto-crear .help-block {
  margin: 6px 0 0;
  font-size: 11.5px;
  color: var(--pos-muted);
}

/* El icono de la izquierda del proveedor abre el modal: que se note que se
   puede pulsar. Antes lo resolvía un onmouseover que reescribía el style. */
.input-group-addon.addon-accion {
  cursor: pointer;
  color: var(--pos-gold);
  transition: background-color .15s ease, color .15s ease;
}
.input-group-addon.addon-accion:hover {
  background: var(--pos-gold);
  color: var(--pos-on-gold);
}


/* ==========================================================================
   Reportes de ventas — las cifras, siempre a la vista
   --------------------------------------------------------------------------
   El total vendido solo existía como globito al pasar por encima de un punto
   de la gráfica. Ahora encabeza la pantalla.
   ========================================================================== */


.reporte-kpis { margin-bottom: 4px; }

.kpi {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 16px 18px;
  margin-bottom: 15px;
  border: 1px solid var(--pos-line);
  border-left: 3px solid var(--pos-line-2);
  border-radius: var(--pos-radius-sm);
  background: var(--pos-surface-2);
}
/* el total vendido es el dato que se viene a buscar: se distingue */
.kpi--fuerte {
  border-left-color: var(--pos-gold);
  background: var(--pos-gold-soft);
}

.kpi__valor {
  font-size: 24px;
  line-height: 1.15;
  font-weight: 700;
  color: var(--pos-text-strong);
  font-variant-numeric: tabular-nums;
  /* cifras largas no deben romper la tarjeta */
  overflow-wrap: anywhere;
}
.kpi--fuerte .kpi__valor { color: var(--pos-gold); }

.kpi__rotulo {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .05em;
  text-transform: uppercase;
  color: var(--pos-muted);
}

.reporte-vacio {
  margin: 0;
  padding: 22px 4px;
  text-align: center;
  font-size: 13px;
  color: var(--pos-muted);
}

@media (max-width: 991px) {
  .kpi { padding: 13px 14px; }
  .kpi__valor { font-size: 20px; }
}


/* ==========================================================================
   Dashboard — detalle dentro de cada caja y selector de años
   ========================================================================== */

/* Caja partida: la cifra grande a la izquierda, los datos de apoyo apilados a
   la derecha. Antes ese lado lo ocupaba un icono decorativo. */
.caja-partida {
  display: flex;
  align-items: center;
  gap: 14px;
}
.caja-partida__izq {
  flex: 1 1 55%;
  min-width: 0;   /* sin esto una cifra larga desborda en vez de encoger */
}
.caja-partida__der {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding-left: 14px;
  border-left: 1px solid currentColor;
  /* el borde hereda el color del texto de la caja, que cambia con el tema */
  border-left-color: rgba(128, 128, 128, .28);
  text-align: right;
}
.caja-partida__izq h4 { margin: 0 0 2px; }
.caja-partida__izq p  { margin: 0; }

.caja-dato {
  font-size: 11.5px;
  line-height: 1.35;
  white-space: nowrap;
  opacity: .82;
}
.caja-dato b {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  opacity: 1;
}
.caja-dato--vacio { font-style: italic; }

.anios-grafica {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 12px;
}
.anios-grafica label {
  margin: 0;
  font-size: 12px;
  font-weight: 600;
  color: var(--pos-text-soft);
}
.anios-grafica select.form-control {
  width: auto;
  min-width: 88px;
}
.anios-grafica__limpiar {
  font-size: 12px;
  color: var(--pos-muted);
  text-decoration: underline;
}
.anios-grafica__limpiar:hover { color: var(--pos-gold); }

/* En pantallas estrechas no caben las dos mitades lado a lado: se apilan y los
   datos pasan a leerse de izquierda a derecha, sin el borde separador. */
@media (max-width: 991px) {
  .caja-partida { flex-direction: column; align-items: flex-start; gap: 8px; }
  .caja-partida__der {
    flex-direction: row;
    flex-wrap: wrap;
    gap: 4px 12px;
    padding-left: 0;
    border-left: 0;
    text-align: left;
  }
}


/* ==========================================================================
   Avatar por iniciales
   --------------------------------------------------------------------------
   Cuando no hay foto, o el archivo no carga. Antes caía el marcador genérico
   de productos —un dibujo de una caja— en el lugar de la cara.
   ========================================================================== */

.user-iniciales {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--pos-gold);
  color: var(--pos-on-gold);
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: .02em;
  line-height: 1;
  /* el <img> que sustituye venía con estos márgenes de AdminLTE */
  margin-right: 10px;
  margin-top: -2px;
  /* que dos letras nunca deformen el círculo */
  flex: 0 0 30px;
  text-transform: uppercase;
  user-select: none;
}


/* ==========================================================================
   Dashboard — la card crece por encima de las vecinas al pasar el mouse
   --------------------------------------------------------------------------
   Se usa transform: scale, que NO ocupa espacio en el diseño: la card se
   superpone a las de al lado en vez de empujarlas, así que nada se mueve.
   El z-index es lo que la pone encima; sin él crecería por debajo.

   Va acotado a las cards del dashboard —las que llevan el bloque partido—
   porque PyG usa la misma clase .small-box y allí este efecto sobra.
   ========================================================================== */

.small-box:has(.caja-partida) {
  transition: transform .18s ease, box-shadow .18s ease, border-color .2s ease;
  will-change: transform;
}

.small-box:has(.caja-partida):hover {
  transform: translateY(-3px) scale(1.04);
  z-index: 5;
  box-shadow: 0 4px 10px rgba(15, 23, 42, .10),
              0 18px 40px rgba(15, 23, 42, .16) !important;
  border-color: var(--pos-gold) !important;
}

/* En el tema oscuro una sombra negra no se ve: el relieve lo da un halo. */
html:not(.tema-claro) .small-box:has(.caja-partida):hover {
  box-shadow: 0 0 0 1px rgba(211, 175, 53, .35),
              0 18px 44px rgba(0, 0, 0, .55) !important;
}

/* El contenedor no debe recortar la card que sobresale. */
.content-wrapper .row:has(> [class*="col-"] > .small-box) { overflow: visible; }


/* ==========================================================================
   Dashboard — la tarjeta ampliada al hacer clic
   --------------------------------------------------------------------------
   El detalle de cada tarjeta va en letra pequeña para caber al lado de la
   cifra. Aquí se muestra la misma tarjeta, sin datos nuevos, a un tamaño que
   se lee de lejos.
   ========================================================================== */

/* Solo la zona de arriba responde al clic; el pie «Más info» es un enlace y
   conserva su propio comportamiento. */
.tarjeta-ampliable { cursor: zoom-in; }
.tarjeta-ampliable:focus-visible {
  outline: 2px solid var(--pos-gold);
  outline-offset: 2px;
  border-radius: 6px;
}
/* pista discreta de que se puede ampliar, solo cuando el mouse está encima */
.small-box:hover .tarjeta-ampliable .caja-partida__der { border-left-color: var(--pos-gold); }

.zoom-tarjeta {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(8, 8, 14, .72);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
  cursor: zoom-out;
  animation: zoomTarjetaEntra .16s ease-out;
}

@keyframes zoomTarjetaEntra {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* La copia deja de ser media tarjeta: aquí hay sitio de sobra, así que la
   cifra y el detalle se reparten el ancho con holgura. */
.zoom-tarjeta__caja {
  display: flex;
  align-items: center;
  gap: 40px;
  width: min(760px, 100%);
  padding: 44px 48px;
  border-radius: var(--pos-radius);
  background: var(--pos-surface);
  border: 1px solid var(--pos-line);
  border-left: 4px solid var(--pos-gold);
  box-shadow: 0 30px 80px rgba(0, 0, 0, .5);
  cursor: default;
  animation: zoomTarjetaSube .18s ease-out;
}

@keyframes zoomTarjetaSube {
  from { transform: scale(.94); }
  to   { transform: scale(1); }
}

.zoom-tarjeta__caja .caja-partida__izq { flex: 1 1 auto; }

.zoom-tarjeta__caja h4 {
  margin: 0 0 8px;
  font-size: 40px !important;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  color: var(--pos-text-strong) !important;
}
.zoom-tarjeta__caja p {
  margin: 0;
  font-size: 15px !important;
  letter-spacing: .06em;
  color: var(--pos-muted) !important;
}

.zoom-tarjeta__caja .caja-partida__der {
  gap: 10px;
  padding-left: 40px;
  border-left-width: 1px;
}
.zoom-tarjeta__caja .caja-dato {
  font-size: 19px;
  line-height: 1.3;
  opacity: 1;
  color: var(--pos-text);
}
.zoom-tarjeta__caja .caja-dato b { color: var(--pos-text-strong); }

.zoom-tarjeta__cerrar {
  position: absolute;
  top: 18px;
  right: 22px;
  width: 42px;
  height: 42px;
  border: 1px solid rgba(255, 255, 255, .25);
  border-radius: 50%;
  background: rgba(255, 255, 255, .08);
  color: #fff;
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}
.zoom-tarjeta__cerrar:hover {
  background: rgba(255, 255, 255, .18);
  border-color: rgba(255, 255, 255, .45);
}

/* En pantallas estrechas la tarjeta ampliada se apila, igual que la original */
@media (max-width: 767px) {
  .zoom-tarjeta__caja {
    flex-direction: column;
    align-items: flex-start;
    gap: 18px;
    padding: 30px 26px;
  }
  .zoom-tarjeta__caja h4 { font-size: 32px !important; }
  .zoom-tarjeta__caja .caja-partida__der {
    flex-direction: column;
    padding-left: 0;
    border-left: 0;
    text-align: left;
  }
}

@media (prefers-reduced-motion: reduce) {
  .zoom-tarjeta,
  .zoom-tarjeta__caja { animation: none; }
}
