/* =========================================================================
   VISTA EXPRESS — CSS aislado
   -------------------------------------------------------------------------
   Reglas:
   - TODAS las clases usan el prefijo "vexpress-" (nunca clases genéricas)
     para que nada de esto pueda chocar con el CSS existente de Dinerius.
   - Reutiliza las variables de color ya definidas en :root de index.html
     (--gold, --success, --brick, --paper, --ink-dark, --bg-0, --bg-1, etc.)
     — no se redefine ninguna paleta nueva.
   - Este archivo se puede borrar completo sin afectar ningún otro estilo
     de la app (junto con quitar el <link> que lo carga en index.html).
   - Pasada visual (V1.1): la superficie de trabajo ahora es clara/crema
     ("--paper"), como una planilla premium sobre el fondo oscuro de
     Dinerius. Todo lo demás sigue siendo solo estructura visual — sin
     datos reales conectados todavía.
   ========================================================================= */

.vexpress-outer{
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding-top: 2px;
}

/* ---- Título + aviso BETA, reducido a una línea discreta ---- */
.vexpress-titulo-row{
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 2px;
}
.vexpress-titulo-row .vexpress-titulo-txt{
  font-family: 'DM Serif Display', serif;
  font-size: 0.95rem;
  color: var(--text-on-dark);
}
.vexpress-titulo-row .vexpress-titulo-sub{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  color: var(--text-on-dark);
  opacity: 0.55;
  font-style: italic;
}
/* Tarea 23: la frase se saca de arriba (empujaba la tabla) y pasa a un
   pie discreto, centrado, debajo de todo el contenido — solo Desktop. */
.vexpress-titulo-sub-pie{
  text-align: center; font-family: 'IBM Plex Sans', sans-serif; font-style: italic;
  font-size: 0.72rem; color: rgba(255,255,255,0.75); margin: 34px 0 4px;
}

.vexpress-beta-tag{
  font-family: 'IBM Plex Mono', monospace;
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  padding: 2px 7px;
  border-radius: 6px;
  background: rgba(192,138,40,0.18);
  color: var(--gold-bright);
  border: 1px solid var(--line-gold);
  margin-left: 6px;
  vertical-align: middle;
}

/* ---- Zona superior compacta (fila 1: modo + negocio + período + agregar) ---- */
.vexpress-fila1{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  justify-content: space-between;
  padding: 10px 12px;
  border-radius: 12px;
  background: var(--bg-1);
  border: 1px solid rgba(192,138,40,0.22);
}

.vexpress-fila1-izq{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
}

.vexpress-modo-toggle{
  display: inline-flex;
  border: 1px solid var(--line-gold);
  border-radius: 9px;
  overflow: hidden;
}

.vexpress-modo-btn{
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.78rem;
  padding: 7px 15px;
  background: transparent;
  color: var(--text-on-dark);
  border: none;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}
.vexpress-modo-btn.active{
  background: var(--gold);
  color: #14181D;
}
.vexpress-modo-btn:not(.active):hover{
  background: rgba(192,138,40,0.14);
}

.vexpress-negocio-select-wrap{
  display: none;
  align-items: center;
  gap: 6px;
}
.vexpress-negocio-select-wrap.visible{ display: flex; }

.vexpress-negocio-select-label{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.68rem;
  color: var(--text-on-dark);
  opacity: 0.7;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.vexpress-negocio-select{
  font-family: 'Quicksand', sans-serif;
  font-weight: 600;
  font-size: 0.8rem;
  padding: 6px 10px;
  border-radius: 7px;
  border: 1px solid var(--line-gold);
  background: var(--bg-0);
  color: var(--text-on-dark);
  min-width: 160px;
}

.vexpress-periodo-bar{
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'DM Serif Display', serif;
  font-size: 0.9rem;
  color: var(--text-on-dark);
  white-space: nowrap;
}

.vexpress-periodo-flecha{
  background: rgba(192,138,40,0.14);
  border: 1px solid var(--line-gold);
  color: var(--gold-bright);
  border-radius: 7px;
  width: 26px;
  height: 26px;
  font-size: 0.9rem;
  line-height: 1;
  cursor: pointer;
  transition: background 0.15s ease;
}
.vexpress-periodo-flecha:hover{ background: rgba(192,138,40,0.26); }

.vexpress-agregar-btn{
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 0.82rem;
  padding: 8px 16px;
  border-radius: 8px;
  border: none;
  background: linear-gradient(135deg, var(--gold) 0%, var(--gold-bright) 100%);
  color: #14181D;
  cursor: pointer;
  box-shadow: 0 6px 14px -6px rgba(192,138,40,0.6);
  white-space: nowrap;
}
.vexpress-agregar-btn:hover{ filter: brightness(1.05); }
.vexpress-agregar-btn:disabled{
  opacity: 0.45;
  cursor: not-allowed;
  box-shadow: none;
  filter: none;
}

/* ---- 3 indicadores (superficie clara individual, compactos) ---- */
.vexpress-totales-bar{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
}
@media (max-width: 640px){
  .vexpress-totales-bar{ grid-template-columns: 1fr; }
}

.vexpress-total-card{
  border-radius: 10px;
  padding: 10px 14px;
  background: #EDECE4;
  border: 1px solid rgba(28,50,71,0.08);
  box-shadow: 0 2px 8px -4px rgba(0,0,0,0.25);
}
.vexpress-total-label{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.62rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  opacity: 0.6;
  color: var(--ink-dark);
}
.vexpress-total-monto{
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 1.3rem;
  margin-top: 2px;
}
.vexpress-total-card.ingreso .vexpress-total-monto{ color: var(--success-dark); }
.vexpress-total-card.egreso .vexpress-total-monto{ color: var(--brick-dark); }
.vexpress-total-card.resultado .vexpress-total-monto{ color: var(--gold-dark); }
.vexpress-total-card.resultado.negativo .vexpress-total-monto{ color: var(--brick-dark); }

/* ---- GRAN SUPERFICIE CENTRAL (clara/crema) — toolbar + tabla + totales ---- */
.vexpress-panel-claro{
  background: #EDECE4;
  border-radius: 14px;
  padding: 12px 14px 0;
  box-shadow: 0 8px 24px -12px rgba(0,0,0,0.4);
  overflow: hidden;
}

/* ---- Barra de herramientas: buscar / filtros / columnas (fila 2, dentro del panel claro) ---- */
.vexpress-toolbar{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding-bottom: 10px;
}
/* Wrapper nuevo, solo para poder colapsarlo en mobile (ver bloque
   "MOBILE — Financial Ledger" al final del archivo). display:contents lo
   deja invisible como contenedor en Desktop — ahí los <select> siguen
   siendo ítems sueltos de .vexpress-toolbar, igual que siempre. El botón
   "⚙️ Filtros" que lo abre/cierra tampoco se muestra en Desktop. */
.vexpress-toolbar-filtros-panel{ display: contents; }
.vexpress-filtros-toggle-btn{ display: none; }

.vexpress-buscar-input{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.8rem;
  padding: 7px 12px;
  border-radius: 8px;
  border: 1px solid rgba(28,50,71,0.14);
  background: #fff;
  color: var(--ink-dark);
  min-width: 120px;
  flex: 1 1 120px;
  max-width: 260px;
}

/* AJUSTE BETA — Buscar ahora vive en la fila de herramientas (Desktop),
   junto a Comparar meses / Columnas / Agrupar / Exportar: tamaño acotado
   para que se vea parejo con esos botones, no como un buscador ancho. */
.vexpress-buscar-input-herr{
  flex: 0 1 190px;
  max-width: 220px;
  padding: 5px 10px;
  font-size: 0.72rem;
}

/* AJUSTE BETA — Tipo/Categoría/Cuenta ya no se usan en Desktop (se
   reemplazaron por Buscar + Agrupar en la fila de herramientas). Quedan
   en el DOM intactos (misma lógica, sin tocar) y solo se ocultan acá;
   en mobile se siguen mostrando igual que siempre (ver @media 480px). */
.vexpress-filtro-select-oculto-beta{ display: none; }

.vexpress-chip-btn{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.75rem;
  padding: 6px 12px;
  border-radius: 8px;
  border: 1px solid rgba(28,50,71,0.14);
  background: #fff;
  color: var(--ink-dark);
  cursor: pointer;
  transition: background 0.15s ease;
  white-space: nowrap;
}
.vexpress-chip-btn:hover{ background: rgba(192,138,40,0.1); border-color: var(--line-gold); }

/* ---- Tabla ---- */
.vexpress-tabla-wrap{
  border-top: 1px solid rgba(28,50,71,0.1);
  margin: 0 -14px;
}

.vexpress-tabla-header, .vexpress-tabla-fila{
  display: grid;
  grid-template-columns: 76px 1.7fr 110px 100px 90px 1fr 40px;
  gap: 6px;
  align-items: center;
  padding: 9px 14px;
}
@media (max-width: 780px){
  .vexpress-tabla-header, .vexpress-tabla-fila{
    grid-template-columns: 60px 1.4fr 90px 80px 32px;
  }
  .vexpress-tabla-header .vexpress-col-cuenta,
  .vexpress-tabla-header .vexpress-col-nota,
  .vexpress-tabla-fila .vexpress-col-cuenta,
  .vexpress-tabla-fila .vexpress-col-nota{ display:none; }
}

.vexpress-tabla-header{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.62rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.55;
  background: linear-gradient(180deg, rgba(192,138,40,0.1), rgba(192,138,40,0.03));
}

.vexpress-tabla-fila{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.8rem;
  color: var(--ink-dark);
  border-bottom: 1px solid rgba(28,50,71,0.06);
  transition: background 0.12s ease;
}
.vexpress-tabla-fila:hover{ background: rgba(192,138,40,0.06); }
.vexpress-tabla-fila:last-child{ border-bottom: none; }

/* Edición rápida del Detalle: clic → input inline, sin abrir el
   formulario completo. Mismo tamaño/tipografía que el texto normal para
   que no "salte" el layout al empezar a editar. */
.vexpress-detalle-rapido-input{
  width: 100%; box-sizing: border-box; font-family: inherit; font-size: inherit; color: inherit;
  padding: 3px 6px; border: 1px solid var(--gold); border-radius: 6px; background: #fff;
}
.vexpress-detalle-rapido-input:focus{ outline: none; box-shadow: 0 0 0 2px rgba(192,138,40,0.25); }

.vexpress-col-fecha{ opacity: 0.7; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; }
.vexpress-col-detalle-principal{ font-weight: 600; }
.vexpress-col-detalle-nota{ display: block; font-size: 0.7rem; opacity: 0.55; margin-top: 1px; }
.vexpress-col-monto{ font-family: 'Quicksand', sans-serif; font-weight: 700; }
.vexpress-col-monto.ingreso{ color: var(--success-dark); }
.vexpress-col-monto.egreso{ color: var(--brick-dark); }
.vexpress-col-tipo-pill{
  display: inline-block;
  font-size: 0.64rem;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 999px;
}
.vexpress-col-tipo-pill.ingreso{ background: rgba(63,122,82,0.14); color: var(--success-dark); }
.vexpress-col-tipo-pill.egreso{ background: rgba(193,80,62,0.14); color: var(--brick-dark); }

.vexpress-preview-tag{
  font-family: 'IBM Plex Mono', monospace;
  font-size: 0.58rem;
  letter-spacing: 0.03em;
  color: var(--gold-dark);
  background: rgba(192,138,40,0.12);
  border-radius: 5px;
  padding: 4px 10px;
  margin: 8px 14px 0;
  display: inline-block;
}

/* ---- Barra de totales del período, al pie de la tabla — parte del panel claro ---- */
.vexpress-footer-totales{
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 18px;
  margin: 0 -14px;
  padding: 10px 14px;
  border-top: 1px solid rgba(28,50,71,0.12);
  background: rgba(192,138,40,0.05);
  font-family: 'IBM Plex Mono', monospace;
  font-size: 0.74rem;
  color: var(--ink-dark);
}
.vexpress-footer-totales b.ingreso{ color: var(--success-dark); }
.vexpress-footer-totales b.egreso{ color: var(--brick-dark); }
.vexpress-footer-totales b.resultado{ color: var(--gold-dark); }

/* =========================================================================
   Fase 3A — agregados para datos reales (filtros, orden, columna Negocio).
   No se modifica ninguna regla de arriba — esto es solo aditivo.
   ========================================================================= */

.vexpress-filtro-select{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.74rem;
  padding: 6px 10px;
  border-radius: 8px;
  border: 1px solid rgba(28,50,71,0.1);
  background: #F3F1EA;
  color: var(--ink-dark);
  max-width: 150px;
}

.vexpress-tabla-header.con-negocio, .vexpress-tabla-fila.con-negocio{
  grid-template-columns: 70px 1.5fr 100px 90px 80px 1fr 110px 40px;
}
@media (max-width: 780px){
  .vexpress-tabla-header.con-negocio, .vexpress-tabla-fila.con-negocio{
    grid-template-columns: 60px 1.3fr 90px 80px 32px;
  }
  .vexpress-tabla-header.con-negocio .vexpress-col-negocio,
  .vexpress-tabla-fila.con-negocio .vexpress-col-negocio{ display:none; }
}
.vexpress-col-negocio{ font-size: 0.72rem; opacity: 0.85; display: none; }
.vexpress-tabla-header.con-negocio .vexpress-col-negocio,
.vexpress-tabla-fila.con-negocio .vexpress-col-negocio{ display: block; }

.vexpress-cargando{
  padding: 30px 20px;
  text-align: center;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.82rem;
  color: var(--ink-dark);
  opacity: 0.6;
}
/* Sistema global de conectividad (2da pasada) — estado de error de una
   lectura (con botón Reintentar): a diferencia del "Cargando…" normal, se
   muestra a opacidad completa para que no parezca un simple estado de
   espera, y el botón queda centrado y bien visible. */
.vexpress-error-carga{ opacity: 1; }
.vexpress-error-carga .vexpress-chip-btn{ display: inline-block; }

/* =========================================================================
   Fase 3B-1 — menú "+ Agregar", modal de alta, columna de acciones (hover).
   Todo aditivo, no se modifica nada de lo anterior.
   ========================================================================= */

.vexpress-agregar-wrap{ position: relative; }

.vexpress-agregar-menu{
  display: none;
  position: absolute;
  right: 0;
  top: calc(100% + 6px);
  background: #EDECE4;
  border-radius: 10px;
  box-shadow: 0 10px 26px -8px rgba(0,0,0,0.5);
  overflow: hidden;
  z-index: 20;
  min-width: 150px;
}
.vexpress-agregar-menu.open{ display: block; }
.vexpress-agregar-menu button{
  display: block;
  width: 100%;
  text-align: left;
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.82rem;
  padding: 10px 14px;
  background: none;
  border: none;
  color: var(--ink-dark);
  cursor: pointer;
}
.vexpress-agregar-menu button:hover{ background: rgba(192,138,40,0.12); }
.vexpress-agregar-menu button[data-vexpress-nuevo="ingreso"]{ color: var(--success-dark); }
.vexpress-agregar-menu button[data-vexpress-nuevo="egreso"]{ color: var(--brick-dark); }

.vexpress-col-acciones{
  opacity: 0.55;
  cursor: pointer;
  font-size: 0.75rem;
  text-align: right;
  transition: opacity 0.12s ease;
}
.vexpress-col-acciones:hover{ opacity: 1 !important; }

/* ---- Modal de alta (Ingreso/Egreso) ---- */
.vexpress-form-overlay{
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(10,13,17,0.72);
  z-index: 500;
  align-items: center;
  justify-content: center;
  padding: 16px;
}
.vexpress-form-overlay.open{ display: flex; }

.vexpress-form-modal{
  background: #EDECE4;
  border-radius: 16px;
  width: 100%;
  max-width: 380px;
  max-height: 90vh;
  overflow-y: auto;
  padding: 18px 20px 20px;
  box-shadow: 0 20px 50px -12px rgba(0,0,0,0.6);
}

.vexpress-form-head{
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
  font-family: 'DM Serif Display', serif;
  font-size: 1.05rem;
  color: var(--ink-dark);
}
.vexpress-form-cerrar{
  background: none;
  border: none;
  font-size: 1rem;
  color: var(--ink-dark);
  opacity: 0.6;
  cursor: pointer;
}
.vexpress-form-cerrar:hover{ opacity: 1; }

.vexpress-form-negocio-label{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--gold-dark);
  background: rgba(192,138,40,0.12);
  border-radius: 7px;
  padding: 6px 10px;
  margin-bottom: 10px;
}

.vexpress-form-campo{
  margin-bottom: 10px;
}
.vexpress-form-campo label{
  display: block;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.65;
  margin-bottom: 4px;
}
.vexpress-form-input{
  width: 100%;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.85rem;
  padding: 9px 11px;
  border-radius: 8px;
  border: 1px solid rgba(28,50,71,0.18);
  background: #fff;
  color: var(--ink-dark);
  box-sizing: border-box;
}

.vexpress-form-msg{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.78rem;
  min-height: 1.1em;
  margin-bottom: 6px;
}
.vexpress-form-msg.error{ color: var(--brick-dark); font-weight: 600; }

.vexpress-form-botones{
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 8px;
}

/* =========================================================================
   Fase 3B-2 — edición de movimientos (fila en modo edición, bloqueados).
   Todo aditivo.
   ========================================================================= */

.vexpress-fila-edicion{
  background: rgba(192,138,40,0.08);
}

.vexpress-edit-input{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.78rem;
  padding: 5px 7px;
  border-radius: 6px;
  border: 1px solid rgba(28,50,71,0.22);
  background: #fff;
  color: var(--ink-dark);
  width: 100%;
  box-sizing: border-box;
}
.vexpress-edit-input:disabled{
  background: rgba(28,50,71,0.06);
  color: rgba(28,50,71,0.5);
  cursor: not-allowed;
}

.vexpress-edit-acciones{
  display: flex;
  gap: 6px;
  justify-content: flex-end;
}
.vexpress-edit-guardar-btn{
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.72rem;
  padding: 6px 10px;
  border-radius: 7px;
  border: none;
  background: var(--gold);
  color: #14181D;
  cursor: pointer;
  white-space: nowrap;
}
.vexpress-edit-guardar-btn:disabled{ opacity: 0.5; cursor: not-allowed; }
.vexpress-edit-cancelar-btn{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  padding: 6px 10px;
  border-radius: 7px;
  border: 1px solid rgba(28,50,71,0.2);
  background: #fff;
  color: var(--ink-dark);
  cursor: pointer;
  white-space: nowrap;
}
.vexpress-edit-cancelar-btn:disabled{ opacity: 0.5; cursor: not-allowed; }

.vexpress-fila-edicion-nota{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  color: var(--gold-dark);
  background: rgba(192,138,40,0.1);
  padding: 6px 14px 10px;
  margin-top: -4px;
  grid-column: 1 / -1; /* ahora vive DENTRO del grid de .vexpress-fila-edicion (ver Tarea 5) — sin esto rompería el ancho de columnas en Desktop */
}

/* Indicador de recurrencia dentro del editor inline de un movimiento ya
   existente — de solo lectura (para activar/desactivar hay que ir a
   Recurrentes, evita tocar esa lógica de vinculación desde acá). Pedido
   específico de la sección MOBILE, así que en Desktop queda oculto — el
   editor inline de Desktop no se toca. */
.vexpress-fila-edicion-recurrente-info{ display: none; grid-column: 1 / -1; }
.vexpress-recurrente-linea-readonly{ opacity: 0.75; cursor: default; }
.vexpress-recurrente-linea-readonly input{ cursor: default; }

.vexpress-col-acciones.vexpress-locked{
  opacity: 0.55 !important;
  cursor: help;
}

/* =========================================================================
   Fase 3B-3 — menú de fila (⋮ → Eliminar). Todo aditivo.
   ========================================================================= */

.vexpress-fila-acciones-wrap{
  position: relative;
  display: flex;
  justify-content: flex-end;
  gap: 4px;
}

/* "R" al final de la fila — activar/desactivar recurrencia sin abrir el
   formulario completo. Solo Desktop (pedido explícito); en mobile no
   compite por espacio con el resto de la fila. */
.vexpress-fila-recurrente-toggle{
  width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 0.66rem;
  border: 1.5px solid rgba(28,50,71,0.3); background: transparent; color: rgba(28,50,71,0.55);
  cursor: pointer; opacity: 1; transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.vexpress-fila-recurrente-toggle:hover{ border-color: var(--gold); color: var(--gold-dark); background: rgba(192,138,40,0.08); }
.vexpress-fila-recurrente-toggle.activo{
  opacity: 1; background: var(--gold); border-color: var(--gold); color: #14181D;
}
@media (max-width: 780px){ .vexpress-fila-recurrente-toggle{ display: none !important; } }

.vexpress-fila-menu{
  display: none;
  position: fixed;
  background: #EDECE4;
  border-radius: 8px;
  box-shadow: 0 10px 24px -8px rgba(0,0,0,0.5);
  overflow: hidden;
  z-index: 300;
  min-width: 130px;
}
.vexpress-fila-menu.open{ display: block; }
.vexpress-fila-menu button{
  display: block;
  width: 100%;
  text-align: left;
  font-family: 'IBM Plex Sans', sans-serif;
  font-weight: 600;
  font-size: 0.78rem;
  padding: 9px 12px;
  background: none;
  border: none;
  color: var(--brick-dark);
  cursor: pointer;
  white-space: nowrap;
}
.vexpress-fila-menu button:hover{ background: rgba(193,80,62,0.12); }

/* ---- Popover de edición rápida (Categoría/Subcategoría, Cuenta) ---- */
.vexpress-popover-rapido{
  position: fixed;
  z-index: 400;
  background: #fff;
  border: 1px solid rgba(28,50,71,0.12);
  border-radius: 12px;
  box-shadow: 0 14px 32px -10px rgba(0,0,0,0.35);
  padding: 10px;
  max-width: 320px;
  max-height: 340px;
  overflow-y: auto;
}
.vexpress-popover-cargando{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.78rem; color: rgba(20,24,29,0.5); padding: 8px; text-align: center; }
.vexpress-popover-vacio{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.78rem; color: rgba(20,24,29,0.5); padding: 10px 4px; text-align: center; width: 100%; }
.vexpress-popover-crear{
  display: block; width: 100%; margin-top: 8px; text-align: center;
  font-family: 'Quicksand', sans-serif; font-weight: 700; font-size: 0.76rem; color: var(--gold-dark);
  background: rgba(192,138,40,0.08); border: 1px dashed rgba(192,138,40,0.4); border-radius: 8px;
  padding: 8px; cursor: pointer;
}
.vexpress-popover-crear:hover{ background: rgba(192,138,40,0.16); }
.vexpress-popover-volver{
  display: block; width: 100%; text-align: left; background: none; border: none;
  font-family: 'Quicksand', sans-serif; font-weight: 700; font-size: 0.78rem; color: var(--gold-dark);
  padding: 4px 6px 10px; cursor: pointer;
}
.vexpress-popover-grid{
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px;
}
.vexpress-popover-item{
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  padding: 8px 4px; border-radius: 10px; border: 1px solid transparent; background: rgba(28,50,71,0.03);
  cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease;
}
.vexpress-popover-item:hover{ background: rgba(192,138,40,0.1); border-color: rgba(192,138,40,0.35); }
.vexpress-popover-item-ico{ display: flex; align-items: center; justify-content: center; }
.vexpress-popover-item-nombre{
  font-family: 'IBM Plex Sans', sans-serif; font-size: 0.68rem; text-align: center; color: var(--ink-dark);
  line-height: 1.2; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.vexpress-popover-lista{ display: flex; flex-direction: column; gap: 2px; }
.vexpress-popover-item-lista{
  display: block; width: 100%; text-align: left; background: none; border: none; border-radius: 8px;
  font-family: 'IBM Plex Sans', sans-serif; font-weight: 600; font-size: 0.8rem; color: var(--ink-dark);
  padding: 8px 10px; cursor: pointer;
}
.vexpress-popover-item-lista:hover{ background: rgba(192,138,40,0.1); }
.vexpress-popover-item-lista.activo{ background: var(--gold); color: #14181D; }

/* =========================================================================
   FASE 4 — pulido final desktop. Todo aditivo; nada de lo anterior se borra.
   ========================================================================= */

/* ---- 1) Contenedor: aprovecha mejor el ancho en pantallas grandes ---- */
.vexpress-outer{
  width: 100%;
  max-width: clamp(1180px, 92vw, 1520px);
  margin: 0 auto;
}

/* ---- 5) Tabla: mejor densidad, foco, separación ---- */
.vexpress-tabla-fila{
  padding: 11px 14px;
}
.vexpress-tabla-fila:focus-within{
  background: rgba(192,138,40,0.07);
  outline: none;
}
.vexpress-col-detalle-principal{
  line-height: 1.25;
}
.vexpress-col-monto{
  font-variant-numeric: tabular-nums;
  text-align: right;
}
.vexpress-col-fecha{
  font-variant-numeric: tabular-nums;
}

/* ---- 6) Acciones de fila: más discretas hasta el hover ---- */
.vexpress-locked{
  opacity: 0.5 !important;
}
.vexpress-tabla-fila:hover .vexpress-locked{ opacity: 0.75 !important; }

/* ---- 7) Fila en edición: distinguirla claramente ---- */
.vexpress-fila-edicion{
  background: rgba(192,138,40,0.1);
  border-top: 1px solid var(--gold);
  border-bottom: 1px solid var(--gold);
  box-shadow: inset 0 0 0 1px rgba(192,138,40,0.25);
}
.vexpress-edit-input:focus{
  border-color: var(--gold);
  box-shadow: 0 0 0 2px rgba(192,138,40,0.2);
  outline: none;
}

/* ---- 10) Menú de Columnas ---- */
.vexpress-dropdown-panel{
  display: none;
  position: fixed;
  background: linear-gradient(160deg, #FBF7EC 0%, #F1E6C8 55%, #E9D9AC 100%);
  border: 1px solid rgba(192,138,40,0.35);
  border-radius: 12px;
  box-shadow: 0 16px 34px -10px rgba(0,0,0,0.55);
  padding: 10px;
  z-index: 600;
  min-width: 210px;
}
.vexpress-dropdown-panel.open{ display: block; }
.vexpress-dropdown-titulo{
  font-family: 'DM Serif Display', serif;
  font-size: 0.85rem;
  color: var(--gold-dark);
  padding: 2px 6px 8px;
  border-bottom: 1px solid rgba(192,138,40,0.25);
  margin-bottom: 6px;
}
.vexpress-dropdown-panel label{
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.85rem;
  color: var(--ink-dark);
  padding: 8px 8px;
  cursor: pointer;
  border-radius: 6px;
}
.vexpress-dropdown-panel label:hover{ background: rgba(255,255,255,0.5); }
.vexpress-dropdown-panel input[type="checkbox"]{ width: 17px; height: 17px; accent-color: var(--gold-dark); cursor: pointer; }

/* ---- 12) Estado vacío: con acción rápida ---- */
.vexpress-empty-cta{
  display: block;
  margin: 14px auto 0;
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.82rem;
  padding: 9px 18px;
  border-radius: 9px;
  border: none;
  background: linear-gradient(135deg, var(--gold) 0%, var(--gold-bright) 100%);
  color: #14181D;
  cursor: pointer;
}
.vexpress-empty-cta:hover{ filter: brightness(1.05); }

/* =========================================================================
   FASE 4B — refinamiento visual premium. Todo aditivo/override sobre lo
   anterior (por orden de cascada); ninguna regla anterior se borra.
   ========================================================================= */

/* ---- Título ---- */
.vexpress-titulo-row{ margin-bottom: 6px; }
.vexpress-titulo-row .vexpress-titulo-txt{ font-size: 1.05rem; }

/* ---- 5) Barra superior: más presencia, mejor terminada ---- */
.vexpress-fila1{
  background: linear-gradient(180deg, rgba(255,255,255,0.03), rgba(255,255,255,0));
  border: 1px solid rgba(192,138,40,0.28);
  padding: 12px 16px;
  box-shadow: 0 4px 14px -8px rgba(0,0,0,0.4);
}
.vexpress-modo-toggle{ box-shadow: inset 0 0 0 1px rgba(192,138,40,0.12); }
.vexpress-modo-btn.active{
  box-shadow: 0 3px 10px -4px rgba(192,138,40,0.7);
}
.vexpress-periodo-bar{ font-size: 0.95rem; letter-spacing: 0.01em; }
.vexpress-agregar-btn{
  box-shadow: 0 8px 18px -6px rgba(192,138,40,0.65);
  letter-spacing: 0.01em;
}

/* ---- 4) KPIs: más premium, con icono ---- */
.vexpress-total-card{
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  background: linear-gradient(155deg, #FFFFFF 0%, #F6F1E4 100%);
  border: 1px solid rgba(28,50,71,0.06);
  box-shadow: 0 6px 16px -8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.6);
}
.vexpress-total-icono{
  flex-shrink: 0;
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  font-size: 1.15rem;
  background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.9), rgba(192,138,40,0.14) 70%);
  box-shadow: 0 3px 8px -3px rgba(0,0,0,0.3), inset 0 0 0 1px rgba(28,50,71,0.06);
}
.vexpress-total-card.ingreso .vexpress-total-icono{ background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.9), rgba(63,122,82,0.18) 70%); }
.vexpress-total-card.egreso .vexpress-total-icono{ background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.9), rgba(193,80,62,0.18) 70%); }
.vexpress-total-textos{ display: flex; flex-direction: column; gap: 1px; }
.vexpress-total-label{ font-size: 0.65rem; font-weight: 600; }
.vexpress-total-monto{ font-size: 1.55rem; letter-spacing: -0.01em; }

/* ---- 6) Filtros: más integrados al sistema visual ---- */
.vexpress-buscar-input, .vexpress-filtro-select{
  box-shadow: inset 0 1px 2px rgba(28,50,71,0.06);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.vexpress-buscar-input:focus, .vexpress-filtro-select:focus{
  border-color: var(--gold);
  box-shadow: 0 0 0 2px rgba(192,138,40,0.18);
  outline: none;
}
.vexpress-chip-btn{ font-weight: 600; }

/* ---- 7/8) Tabla y filas: jerarquía, respiración, hover premium ---- */
.vexpress-panel-claro{
  background: linear-gradient(180deg, #FFFFFF 0%, #EDECE4 55%);
}
.vexpress-tabla-header{
  background: linear-gradient(180deg, rgba(192,138,40,0.14), rgba(192,138,40,0.04));
  border-bottom: 1px solid rgba(192,138,40,0.22);
  font-weight: 600;
  letter-spacing: 0.05em;
}
.vexpress-tabla-fila{
  transition: background 0.15s ease;
}
.vexpress-tabla-fila:hover{
  background: linear-gradient(90deg, rgba(192,138,40,0.08), rgba(192,138,40,0.02));
}

/* Categoría + icono badge */
.vexpress-col-detalle{
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}
.vexpress-cat-icono{
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  font-size: 0.95rem;
  background: radial-gradient(circle at 32% 28%, rgba(255,255,255,0.95), rgba(192,138,40,0.16) 75%);
  box-shadow: 0 2px 6px -2px rgba(0,0,0,0.35), inset 0 0 0 1px rgba(28,50,71,0.06);
}
.vexpress-col-detalle-textos{
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.3;
}
.vexpress-col-detalle-principal{
  font-weight: 700;
  color: var(--ink-dark);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.vexpress-col-detalle-nota{
  font-style: italic;
  opacity: 0.6;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Badges de Tipo, con puntito de color */
.vexpress-col-tipo-pill{
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-weight: 700;
  letter-spacing: 0.01em;
}
.vexpress-col-tipo-pill::before{
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  display: inline-block;
}
.vexpress-col-tipo-pill.ingreso::before{ background: var(--success-dark); }
.vexpress-col-tipo-pill.egreso::before{ background: var(--brick-dark); }

/* ---- 9) Acciones de fila: discretas pero elegantes ---- */
.vexpress-col-acciones{
  width: 26px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: background 0.15s ease, opacity 0.15s ease;
}
.vexpress-col-acciones:not(.vexpress-locked):hover{
  background: rgba(192,138,40,0.16);
}
.vexpress-locked{
  width: 26px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(28,50,71,0.05);
}

/* =========================================================================
   FASE 4C — Categoría/Subcategoría, edición por clic, grupos plegables,
   alineación por grid único. Todo aditivo/override por cascada.
   ========================================================================= */

/* ---- KPIs: bordes de color según el pedido (25-27) ---- */
.vexpress-total-card.ingreso{ border: 1px solid rgba(63,122,82,0.35); }
.vexpress-total-card.egreso{ border: 1px solid rgba(193,80,62,0.35); }
.vexpress-total-card.resultado{
  border: 1px solid rgba(192,138,40,0.4);
  background: linear-gradient(155deg, #FFF8E8 0%, #F3E4C2 100%);
}
.vexpress-total-card.resultado.negativo{ border-color: rgba(193,80,62,0.4); }
.vexpress-total-card.resultado .vexpress-total-monto{ color: var(--gold-dark); }
.vexpress-total-card.resultado.negativo .vexpress-total-monto{ color: var(--brick-dark); }

/* ---- Encabezado con líneas verticales entre columnas — visibles pero
   discretas (gris cálido / dorado tenue) ---- */
.vexpress-tabla-header > span,
.vexpress-tabla-fila > span,
.vexpress-tabla-fila > input,
.vexpress-tabla-fila > select{
  border-right: 1px solid rgba(120,90,40,0.22);
  padding-right: 8px;
}
.vexpress-tabla-header > span:last-child,
.vexpress-tabla-fila > *:last-child{ border-right: none; }

/* ---- Campos editables: pista sutil al pasar el mouse ---- */
.vexpress-editable{
  cursor: pointer;
  /* Redondeado solo del lado izquierdo: el derecho es la misma línea
     separadora de columna (border-right), y si también se redondea ahí
     la línea se ve curva en vez de recta (el borde hereda el radio). */
  border-radius: 6px 0 0 6px;
  transition: background 0.12s ease;
  padding: 3px 6px;
  margin: -3px -6px;
}
.vexpress-editable:hover{
  background: rgba(192,138,40,0.12);
  box-shadow: inset 0 0 0 1px rgba(192,138,40,0.25);
}

/* ---- Categoría / Subcategoría separadas ---- */
.vexpress-col-subcat{ font-size: 0.78rem; color: var(--ink-dark); opacity: 0.85; }
.vexpress-subcat-vacia{ opacity: 0.55; font-style: italic; font-size: 0.76rem; }

/* ---- Fila bloqueada (aporte vinculado) ---- */
.vexpress-fila-bloqueada{ opacity: 0.6; }
.vexpress-fila-bloqueada .vexpress-col-monto,
.vexpress-fila-bloqueada .vexpress-col-detalle-principal{ filter: grayscale(0.3); }

/* ---- Grupos INGRESOS / EGRESOS plegables ---- */
.vexpress-grupo{ margin-bottom: 0; border-bottom: 2px solid rgba(120,90,40,0.15); }
.vexpress-grupo:last-child{ border-bottom: none; }
.vexpress-grupo-header{
  width: 100%;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border: none;
  cursor: pointer;
  font-family: 'Quicksand', sans-serif;
  text-align: left;
}
.vexpress-grupo-ingreso .vexpress-grupo-header{
  background: linear-gradient(90deg, rgba(63,122,82,0.14), rgba(63,122,82,0.03));
  border-left: 3px solid var(--success-dark);
}
.vexpress-grupo-egreso .vexpress-grupo-header{
  background: linear-gradient(90deg, rgba(193,80,62,0.14), rgba(193,80,62,0.03));
  border-left: 3px solid var(--brick-dark);
}
.vexpress-grupo-chevron{ font-size: 0.7rem; opacity: 0.6; width: 12px; }
.vexpress-grupo-icono{ font-size: 1rem; }
.vexpress-grupo-nombre{ font-weight: 800; font-size: 0.85rem; letter-spacing: 0.03em; color: var(--ink-dark); flex: 1; }
.vexpress-grupo-total{ font-weight: 800; font-size: 0.95rem; font-variant-numeric: tabular-nums; }
.vexpress-grupo-total.ingreso{ color: var(--success-dark); }
.vexpress-grupo-total.egreso{ color: var(--brick-dark); }
.vexpress-empty-grupo{ padding: 18px 14px; font-size: 0.78rem; }

.vexpress-subcat-modal{ max-width: 340px; }

/* =========================================================================
   FASE 4D — corrección de iconos, foco, totales inferiores más grandes,
   y protecciones defensivas. Todo aditivo/override por cascada.
   ========================================================================= */

/* ---- Protección defensiva: ninguna imagen dentro de Vista Express puede
   salirse de su contenedor, pase lo que pase con el dato guardado.
   Namespaced a .vexpress-outer — no afecta nada fuera de Vista Express. ---- */
.vexpress-outer img{
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

/* ---- Iconos de categoría: overflow:hidden como segunda red de seguridad,
   además del tamaño fijo en px que ya pone vexpressRenderIcono() ---- */
.vexpress-cat-icono{
  overflow: hidden;
  line-height: 1;
}
.vexpress-col-subcat{
  display: inline-flex;
  align-items: center;
  gap: 5px;
}
.vexpress-col-subcat img{
  border-radius: 50%;
  vertical-align: middle;
}

/* ---- KPIs: mejor centrado del icono (corrige el caso "no aparece") ---- */
.vexpress-total-icono{
  overflow: hidden;
  line-height: 1;
  font-size: 1.3rem;
}

/* ---- Totales inferiores: ahora una zona propia, grande y clara ---- */
.vexpress-footer-totales{
  display: block;
  margin: 0 -14px;
  padding: 16px 14px 18px;
  border-top: 2px solid var(--gold);
  background: linear-gradient(180deg, rgba(192,138,40,0.1), rgba(192,138,40,0.03));
  text-align: center;
}
.vexpress-footer-titulo{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--ink-dark);
  opacity: 0.55;
  margin-bottom: 10px;
}
.vexpress-footer-bloques{
  display: flex;
  justify-content: center;
  gap: 48px;
  flex-wrap: wrap;
}
.vexpress-footer-bloque{ min-width: 110px; }
.vexpress-footer-label{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.6;
  margin-bottom: 2px;
}
.vexpress-footer-monto{
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 1.4rem;
  font-variant-numeric: tabular-nums;
}
.vexpress-footer-monto.ingreso{ color: var(--success-dark); }
.vexpress-footer-monto.egreso{ color: var(--brick-dark); }
.vexpress-footer-monto.resultado{ color: var(--gold-dark); }

/* ---- Grupos: chevron e iconos más presentes ---- */
.vexpress-grupo-chevron{ font-size: 0.85rem; width: 16px; }
.vexpress-grupo-icono{
  width: 26px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  font-size: 0.95rem;
  box-shadow: 0 2px 6px -2px rgba(0,0,0,0.35), inset 0 0 0 1px rgba(28,50,71,0.06);
}
.vexpress-grupo-ingreso .vexpress-grupo-icono{ background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.95), rgba(63,122,82,0.2) 75%); }
.vexpress-grupo-egreso .vexpress-grupo-icono{ background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.95), rgba(193,80,62,0.2) 75%); }

/* ---- Anchos de grid ajustados con datos reales (Detalle necesitaba más
   espacio; Subcategoría un poco menos) ---- */

/* =========================================================================
   FASE 4E — divisores + resize, agrupar por categoría/cuenta con
   subgrupos, fila "+ Agregar" inline, orden por clic en columna.
   ========================================================================= */

/* ---- Encabezado: títulos centrados y clicables para ordenar ---- */
.vexpress-tabla-header{ position: relative; }
.vexpress-th{
  position: relative;
  text-align: center;
  cursor: pointer;
  user-select: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
.vexpress-th:hover{ color: var(--gold-dark); }
.vexpress-th-activo{ color: var(--gold-dark); font-weight: 800; }
.vexpress-th-recurrente{ cursor: default; gap: 4px; }
.vexpress-th-recurrente:hover{ color: inherit; }
.vexpress-th-recurrente-r{
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%; border: 1.5px solid currentColor;
  font-size: 0.6rem; font-weight: 800;
}

/* ---- Datos de fila: todos centrados dentro de su columna ---- */
.vexpress-tabla-fila > span,
.vexpress-tabla-fila > input,
.vexpress-tabla-fila > select{ text-align: center; }
.vexpress-col-monto{ text-align: center; display: block; }
.vexpress-col-detalle{ justify-content: center; }
.vexpress-col-detalle-textos{ text-align: left; } /* el bloque icono+nombre se centra como conjunto, el texto adentro queda legible */

/* ---- Manija de redimensionar columnas ---- */
.vexpress-resize-handle{
  position: absolute;
  right: -4px;
  top: 0;
  bottom: 0;
  width: 8px;
  cursor: col-resize;
  z-index: 5;
}
.vexpress-resize-handle:hover{ background: rgba(192,138,40,0.35); }
@media (max-width: 780px){ .vexpress-resize-handle{ display: none; } }

/* ---- Tarea 2 (01/10): reordenar columnas por drag & drop (Desktop) ---- */
.vexpress-th-arrastrable{ cursor: grab; }
.vexpress-th-arrastrable:active{ cursor: grabbing; }
.vexpress-th-arrastrable:hover{ background: rgba(192,138,40,0.08); border-radius: 6px; }
.vexpress-th-arrastrando{
  opacity: 0.55;
  background: rgba(192,138,40,0.14);
  border-radius: 6px;
  box-shadow: 0 2px 8px rgba(20,16,11,0.18);
  transition: opacity 0.12s ease, box-shadow 0.12s ease;
}
.vexpress-th-drop-antes{ box-shadow: inset 3px 0 0 0 var(--brick-dark, #C1503E); transition: box-shadow 0.1s ease; }
.vexpress-th-drop-despues{ box-shadow: inset -3px 0 0 0 var(--brick-dark, #C1503E); transition: box-shadow 0.1s ease; }

/* ---- Divisores verticales: ya recorren cada celda de header y filas
   (border-right ya definido en fases anteriores) — se refuerza aquí para
   que también atraviese subgrupos y la fila de agregar ---- */
.vexpress-subgrupo-header > span,
.vexpress-fila-agregar-trigger > span{ border-right: none; }

/* ---- Agrupar por Categoría: subgrupo de Subcategoría anidado ---- */
.vexpress-subgrupo{ margin-left: 18px; border-left: 2px solid rgba(192,138,40,0.18); }
.vexpress-subgrupo-header{
  width: 100%;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 14px;
  border: none;
  background: rgba(28,50,71,0.03);
  cursor: pointer;
  text-align: left;
  font-family: 'IBM Plex Sans', sans-serif;
}
.vexpress-subgrupo-nombre{ font-weight: 600; font-size: 0.78rem; color: var(--ink-dark); flex: 1; }
.vexpress-grupo-icono-cat{ width: 22px !important; height: 22px !important; }

/* ---- Fila "+ Agregar" al final de un grupo ---- */
.vexpress-fila-agregar-trigger{
  cursor: pointer;
  transition: background 0.12s ease;
}
.vexpress-fila-agregar-trigger:hover{ background: rgba(192,138,40,0.1); }
.vexpress-fila-agregar-texto{
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.8rem;
  color: var(--gold-dark);
  padding: 2px 0;
}
.vexpress-fila-nueva{ background: rgba(63,122,82,0.08); }
.vexpress-fila-nueva.con-negocio{ background: rgba(63,122,82,0.08); }

/* =========================================================================
   Ronda de correcciones — divisores, centrado, "Agrupar" con estilo propio,
   header grande de negocio con nombre editable.
   ========================================================================= */

/* ---- "Agrupar por": ya no es una cajita como los filtros — más discreto,
   parece un control de configuración, no un buscador más ---- */
.vexpress-agrupar-select{
  font-family: 'IBM Plex Sans', sans-serif;
  font-weight: 600;
  font-size: 0.76rem;
  padding: 6px 10px;
  border: none;
  border-radius: 8px;
  background: rgba(192,138,40,0.14);
  color: var(--gold-dark);
  opacity: 1;
  cursor: pointer;
  width: auto;
  min-width: 150px;
  max-width: 190px;
  flex-shrink: 0;
}
.vexpress-agrupar-select:hover{ background: rgba(192,138,40,0.22); }
.vexpress-agrupar-select:focus{ outline: none; border-bottom-style: solid; border-bottom-color: var(--gold); }

/* ---- Agrupar por Categoría: nivel intermedio (categoría dentro del
   bloque grande de Ingresos/Egresos) ---- */
.vexpress-subgrupo-categoria{
  margin-left: 14px;
  border-left: 2px solid rgba(192,138,40,0.2);
  background: rgba(255,255,255,0.35);
}
.vexpress-subgrupo-categoria .vexpress-subgrupo-header{
  padding: 8px 14px;
  font-weight: 700;
}
.vexpress-subgrupo-categoria .vexpress-subgrupo{ margin-left: 16px; }

/* ---- Header grande del negocio activo — usa negocio-card/negocio-card-icono
   reales (definidas globalmente en Dinerius), solo se ajusta el layout
   para que quede horizontal en vez de vertical ---- */
.vexpress-negocio-header-card{
  flex-direction: row !important;
  align-items: center !important;
  gap: 14px;
  min-height: auto !important;
  padding: 14px 20px !important;
  margin-bottom: 4px;
}
.vexpress-negocio-header-nombre{
  font-size: 1.3rem !important;
  cursor: pointer;
  border-radius: 8px;
  padding: 4px 8px;
  margin: -4px -8px;
  transition: background 0.12s ease;
}
.vexpress-negocio-header-nombre:hover{ background: rgba(192,138,40,0.14); }
.vexpress-negocio-header-input{
  font-family: 'League Spartan', sans-serif;
  font-weight: 800;
  font-size: 1.3rem;
  color: var(--ink-dark);
  border: 1px solid var(--gold);
  border-radius: 8px;
  padding: 3px 8px;
  background: #fff;
}

/* =========================================================================
   Ronda 2 de correcciones: header más grande/notorio, negocio-header
   centrado con degradado, KPIs con degradado de color legible.
   ========================================================================= */

.vexpress-tabla-header{
  font-size: 0.78rem !important;
  font-weight: 800 !important;
  letter-spacing: 0.06em !important;
  opacity: 1 !important;
  color: var(--gold-dark) !important;
  background: linear-gradient(180deg, rgba(192,138,40,0.28), rgba(192,138,40,0.08)) !important;
  border-bottom: 2px solid rgba(192,138,40,0.35) !important;
  padding-top: 4px;
  padding-bottom: 4px;
}
.vexpress-th-activo{ color: var(--brick) !important; }

/* ---- Header del negocio activo: centrado, más grande, degradado ---- */
.vexpress-negocio-header-card{
  justify-content: center !important;
  background: linear-gradient(135deg, #FFF8E8 0%, #F3E0AE 100%) !important;
  border-width: 2px !important;
}
.vexpress-negocio-header-card .negocio-card-icono{
  width: 56px !important;
  height: 56px !important;
  font-size: 1.9rem !important;
}
.vexpress-negocio-header-nombre{
  font-size: 1.55rem !important;
}

/* ---- KPIs: fondo degradado de color, texto e icono legibles encima ---- */
.vexpress-total-card.ingreso{
  background: linear-gradient(135deg, #E4F3E9 0%, #B9E2C6 100%) !important;
  border: 1px solid rgba(63,122,82,0.45) !important;
}
.vexpress-total-card.egreso{
  background: linear-gradient(135deg, #FBE6E2 0%, #F0BDB2 100%) !important;
  border: 1px solid rgba(193,80,62,0.45) !important;
}
.vexpress-total-card.ingreso .vexpress-total-label,
.vexpress-total-card.ingreso .vexpress-total-monto{ color: #1F4A2E; }
.vexpress-total-card.egreso .vexpress-total-label,
.vexpress-total-card.egreso .vexpress-total-monto{ color: #7A2B1E; }
.vexpress-total-card.ingreso .vexpress-total-icono{
  background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.95), rgba(255,255,255,0.5) 70%) !important;
}
.vexpress-total-card.egreso .vexpress-total-icono{
  background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.95), rgba(255,255,255,0.5) 70%) !important;
}

/* ---- Cabeceras de grupo Ingresos/Egresos dentro de la tabla: degradado
   verde/rojo más presente, texto y total bien legibles encima ---- */
.vexpress-grupo-ingreso .vexpress-grupo-header{
  background: linear-gradient(90deg, rgba(63,122,82,0.32), rgba(63,122,82,0.08)) !important;
  border-left: 4px solid var(--success-dark) !important;
}
.vexpress-grupo-egreso .vexpress-grupo-header{
  background: linear-gradient(90deg, rgba(193,80,62,0.32), rgba(193,80,62,0.08)) !important;
  border-left: 4px solid var(--brick-dark) !important;
}
.vexpress-grupo-ingreso .vexpress-grupo-nombre{ color: #1F4A2E; }
.vexpress-grupo-egreso .vexpress-grupo-nombre{ color: #7A2B1E; }

/* ---- Continuidad de las líneas verticales dentro de un grupo abierto ---- */
.vexpress-grupo-filas{ border-left: 1px solid transparent; }

/* =========================================================================
   RECURRENTES — toggle de vista, checkbox en el alta, badge "R" flotante,
   y la tabla de recurrentes en sí. Todo aditivo.
   ========================================================================= */

/* ---- Toggle Movimientos / Recurrentes ---- */
.vexpress-vista-toggle{
  display: inline-flex;
  border: 1px solid rgba(192,138,40,0.3);
  border-radius: 9px;
  overflow: hidden;
  margin-bottom: 10px;
}
.vexpress-vista-btn{
  font-family: 'Quicksand', sans-serif;
  font-weight: 700;
  font-size: 0.78rem;
  padding: 7px 16px;
  background: transparent;
  color: var(--ink-dark);
  border: none;
  cursor: pointer;
}
.vexpress-vista-btn.active{ background: var(--gold); color: #14181D; }
.vexpress-vista-btn:not(.active):hover{ background: rgba(192,138,40,0.1); }

/* ---- Checkbox "Hacer recurrente" en el formulario de alta ---- */
.vexpress-form-recurrente{
  background: rgba(192,138,40,0.08);
  border-radius: 8px;
  padding: 8px 10px;
}
.vexpress-check-recurrente{
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--ink-dark);
  cursor: pointer;
}
.vexpress-check-recurrente input{ accent-color: var(--gold); cursor: pointer; }
#vexpressFormRecurrenteDiaWrap{ margin-top: 8px; }
#vexpressFormRecurrenteDiaWrap label{
  display: block;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.65;
  margin-bottom: 3px;
}

/* ---- Badge "R" de recurrente — ficha circular 3D flotante, esquina
   inferior derecha del icono de categoría ---- */
.vexpress-cat-icono-wrap{ position: relative; display: inline-flex; }
.vexpress-badge-recurrente{
  position: absolute;
  bottom: -3px;
  right: -5px;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 0.55rem;
  color: #fff;
  box-shadow: 0 2px 4px -1px rgba(0,0,0,0.5), 0 0 0 2px #EDECE4;
}
.vexpress-badge-recurrente.ingreso{ background: radial-gradient(circle at 35% 30%, #6FCB8A, #2E7D46); }
.vexpress-badge-recurrente.egreso{ background: radial-gradient(circle at 35% 30%, #E58A78, #B23A28); }
.vexpress-badge-recurrente-modal.ingreso{ background: radial-gradient(circle at 35% 30%, #6FCB8A, #2E7D46); }
.vexpress-badge-recurrente-modal.egreso{ background: radial-gradient(circle at 35% 30%, #E58A78, #B23A28); }

/* ---- Tabla de Recurrentes ---- */
.vexpress-grupo-header-static{
  cursor: default;
  width: 100%;
}
.vexpress-recurrente-fila{
  display: grid;
  grid-template-columns: 38px 1.5fr 95px 130px 100px 130px 90px;
  gap: 10px;
  align-items: center;
  padding: 10px 14px;
  border-bottom: 1px solid rgba(120,90,40,0.12);
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.8rem;
  color: var(--ink-dark);
}
.vexpress-recurrente-fila:last-child{ border-bottom: none; }
.vexpress-recurrente-nombre{ font-weight: 700; }
.vexpress-recurrente-fecha{ font-variant-numeric: tabular-nums; opacity: 0.75; text-align: center; }
.vexpress-recurrente-monto{ font-weight: 700; text-align: center; font-variant-numeric: tabular-nums; }
.vexpress-recurrente-fila > [data-vexpress-rec-campo="monto"]{ display: flex; justify-content: center; }
.vexpress-recurrente-monto.ingreso{ color: var(--success-dark); }
.vexpress-recurrente-monto.egreso{ color: var(--brick-dark); }
.vexpress-recurrente-estado{
  text-align: center;
  font-size: 0.68rem;
  font-weight: 700;
  padding: 3px 8px;
  border-radius: 999px;
}
.vexpress-recurrente-estado.pendiente{ background: rgba(192,138,40,0.18); color: var(--gold-dark); }
.vexpress-recurrente-estado.pagado{ background: rgba(63,122,82,0.16); color: var(--success-dark); }
.vexpress-recurrente-acciones{ display: flex; gap: 6px; justify-content: flex-end; flex-wrap: wrap; }
.vexpress-chip-btn-danger{ color: var(--brick-dark); border-color: rgba(193,80,62,0.35); }
.vexpress-chip-btn-danger:hover{ background: rgba(193,80,62,0.1); }


/* =========================================================================
   Ronda 3 — legibilidad de "Egresos recurrentes", toggle centrado + ícono
   R 3D, columna "¿Cuánto falta?", encabezado de tabla Recurrentes,
   interruptor Pendiente/Pagado, y recurrente en la fila rápida inline.
   ========================================================================= */

/* ---- 1) Arreglo de contraste — gana por !important y por ir al final ---- */
.vexpress-grupo-egreso .vexpress-grupo-nombre{ color: #6B1F14 !important; }
.vexpress-grupo-ingreso .vexpress-grupo-nombre{ color: #16341F !important; }
.vexpress-grupo-egreso .vexpress-grupo-icono,
.vexpress-grupo-ingreso .vexpress-grupo-icono{ filter: none; }

/* ---- 2) Toggle Movimientos/Recurrentes centrado + ícono R 3D ---- */
.vexpress-vista-toggle{
  display: flex;
  width: fit-content;
  margin: 0 auto 12px;
}
.vexpress-vista-btn{ display: inline-flex; align-items: center; gap: 6px; }
.vexpress-badge-recurrente-grande{
  position: static;
  width: 17px;
  height: 17px;
  font-size: 0.62rem;
  box-shadow: 0 2px 5px -1px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.5);
}

/* ---- 3) Encabezado de la tabla de Recurrentes ---- */
.vexpress-recurrente-header{
  display: grid;
  grid-template-columns: 38px 1.5fr 95px 130px 100px 130px 90px;
  gap: 10px;
  padding: 8px 14px;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-dark);
  background: linear-gradient(180deg, rgba(192,138,40,0.24), rgba(192,138,40,0.06));
  border-bottom: 2px solid rgba(192,138,40,0.3);
  text-align: center;
}
@media (max-width: 780px){
  .vexpress-recurrente-header{ display: none; }
}

/* ---- Columna "¿Cuánto falta?" ---- */
.vexpress-recurrente-cuantofalta{
  text-align: center;
  font-size: 0.72rem;
  font-weight: 700;
  padding: 3px 6px;
  border-radius: 6px;
}
.vexpress-cf-futuro{ color: var(--ink-dark); opacity: 0.75; }
.vexpress-cf-hoy{ background: rgba(192,138,40,0.2); color: var(--gold-dark); }
.vexpress-cf-vencido{ background: rgba(193,80,62,0.18); color: var(--brick-dark); }
.vexpress-cf-pasado-pagado{ color: var(--ink-dark); opacity: 0.5; }

/* ---- 4) Interruptor Pendiente/Pagado ---- */
.vexpress-switch{
  display: flex;
  align-items: center;
  gap: 6px;
  justify-content: center;
  background: none;
  border: none;
  cursor: pointer;
  padding: 2px;
}
.vexpress-switch[disabled]{ cursor: default; }
.vexpress-switch-track{
  width: 34px;
  height: 18px;
  border-radius: 999px;
  background: rgba(28,50,71,0.18);
  position: relative;
  transition: background 0.15s ease;
  flex-shrink: 0;
}
.vexpress-switch.on .vexpress-switch-track{ background: var(--success-dark); }
.vexpress-switch-thumb{
  position: absolute;
  top: 2px;
  left: 2px;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,0.4);
  transition: left 0.15s ease;
}
.vexpress-switch.on .vexpress-switch-thumb{ left: 18px; }
.vexpress-switch-texto{
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 0.62rem;
  letter-spacing: 0.03em;
  color: var(--ink-dark);
  opacity: 0.7;
}
.vexpress-switch.on .vexpress-switch-texto{ color: var(--success-dark); opacity: 1; }
.vexpress-switch:not([disabled]):hover .vexpress-switch-track{ background: rgba(192,138,40,0.4); }

/* ---- Recurrente en la fila rápida inline (+ Agregar) ---- */
.vexpress-fila-nueva-recurrente{
  padding: 6px 14px 10px;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.76rem;
  color: var(--ink-dark);
  background: rgba(192,138,40,0.06);
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.vexpress-recurrente-dia-input{
  width: 60px;
  padding: 3px 6px;
  border-radius: 6px;
  border: 1px solid rgba(28,50,71,0.2);
  font-size: 0.76rem;
}

/* =========================================================================
   FASE FINAL DESKTOP — cabecera de contexto siempre visible con fondo,
   selector de mes con más jerarquía, KPIs/tabs con íconos, filtros activos,
   edición directa de recurrentes, y arreglo definitivo de estados vacíos.
   ========================================================================= */

/* ---- Estados vacíos: NUNCA tuvieron una regla propia — de ahí la
   ilegibilidad. Ahora con color oscuro forzado, centrado, buen padding. ---- */
.vexpress-empty-state{
  padding: 26px 20px !important;
  text-align: center !important;
  font-family: 'IBM Plex Sans', sans-serif !important;
  font-size: 0.85rem !important;
  color: #2A2118 !important;
  line-height: 1.6 !important;
}
.vexpress-empty-grupo{ padding: 22px 16px !important; }

/* ---- Cabecera de contexto (Personal / Negocio) con fondo de imagen ---- */
.vexpress-negocio-header-card.vexpress-contexto-header{
  background-image: linear-gradient(90deg, rgba(255,253,246,0.86) 0%, rgba(255,253,246,0.6) 60%, rgba(255,253,246,0.4) 100%), url('vista-express-fondo-header.jpg') !important;
  background-size: cover !important;
  background-position: center !important;
}
.vexpress-contexto-header{
  border: 1.5px solid var(--gold);
  border-radius: 14px;
  overflow: hidden;
  position: relative;
  padding: 16px 22px !important;
  transition: background-size 0.7s ease, box-shadow 0.3s ease;
  box-shadow: 0 6px 18px -10px rgba(0,0,0,0.45);
}
.vexpress-contexto-header:hover{
  background-size: 115%;
  box-shadow: 0 10px 26px -10px rgba(192,138,40,0.55);
}
.vexpress-contexto-icono{
  width: 52px !important;
  height: 52px !important;
  font-size: 1.7rem !important;
  box-shadow: 0 6px 14px -4px rgba(0,0,0,0.4), inset 0 0 0 1px rgba(255,255,255,0.6) !important;
}
.vexpress-contexto-icono-avatar{ overflow: hidden; padding: 0 !important; }
.vexpress-contexto-icono-avatar img{ width: 100%; height: 100%; object-fit: cover; border-radius: 50%; display: block; }
.vexpress-negocio-header-card.vexpress-contexto-header .vexpress-negocio-header-nombre{
  font-size: 1.5rem !important;
  color: #2A2118 !important;
}

/* ---- Selector de mes: más jerarquía ---- */
.vexpress-periodo-bar{
  background: rgba(0,0,0,0.22);
  border: 1px solid rgba(192,138,40,0.4);
  border-radius: 10px;
  padding: 5px 12px;
}
.vexpress-periodo-texto-grande{
  font-family: 'DM Serif Display', serif;
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--gold-bright);
  letter-spacing: 0.02em;
}
.vexpress-periodo-flecha:hover{ background: rgba(192,138,40,0.4) !important; }

/* ---- Íconos de las pestañas Movimientos/Recurrentes ---- */
.vexpress-vista-icono{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 17px;
  height: 17px;
  border-radius: 50%;
  font-size: 0.65rem;
  background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.9), rgba(192,138,40,0.25) 75%);
  box-shadow: 0 2px 5px -1px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.4);
}

/* ---- Badge R en KPI (más grande que el de fila) y variante dorada ---- */
.vexpress-badge-kpi{
  display: inline-flex !important;
  position: static !important;
  width: 22px !important;
  height: 22px !important;
  font-size: 0.8rem !important;
  vertical-align: middle;
}
.vexpress-badge-dorado{ background: radial-gradient(circle at 35% 30%, #F3D98A, #C08A28) !important; }

/* ---- Filtros activos: señal visual + botón Limpiar ---- */
.vexpress-toolbar.vexpress-filtros-activos{
  box-shadow: inset 3px 0 0 var(--gold);
  padding-left: 8px;
}
.vexpress-limpiar-filtros{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--brick-dark);
  background: none;
  border: 1px dashed rgba(193,80,62,0.4);
  border-radius: 7px;
  padding: 5px 10px;
  cursor: pointer;
}
.vexpress-limpiar-filtros:hover{ background: rgba(193,80,62,0.08); }

/* ---- Terminar recurrencia: botón mínimo, discreto hasta el hover ---- */
.vexpress-chip-btn-mini{
  padding: 4px 8px !important;
  font-size: 0.72rem !important;
  opacity: 0.55;
}
.vexpress-chip-btn-mini:hover{ opacity: 1; }

/* ---- Edición directa de recurrentes (día + monto + cuenta, 01/10) ----
   La fila de edición reutiliza .vexpress-recurrente-fila (grid de 7
   columnas para la fila normal), pero ahora tiene 9 hijos (se agregó el
   <select> de Cuenta + su etiqueta) — esta regla la redefine solo para
   Desktop; en Mobile ya existe un override a flex-column (ver más abajo,
   @media max-width:640px) que ignora grid-template-columns por completo. */
.vexpress-recurrente-fila-edicion{ background: rgba(192,138,40,0.1); grid-template-columns: 38px 1.2fr 70px 90px 100px 70px 140px 70px 100px; }
.vexpress-rec-edit-dia-wrap .vexpress-edit-input{ width: 100%; text-align: center; }
.vexpress-rec-edit-label{ font-size: 0.68rem; opacity: 0.55; text-align: center; }
#vexpressRecEditCuenta{ width: 100%; }

/* ---- Estado vacío con acción (Recurrentes) ---- */
.vexpress-empty-grupo .vexpress-empty-cta{ margin-top: 12px; }

/* =========================================================================
   Ronda: header de contexto con controles adentro, botones + en KPIs,
   Categoría/Subcategoría a la izquierda, recurrente con ícono R e inline
   en 2 filas, y detalle desplegable de categorías en los KPI.
   ========================================================================= */

/* ---- 3) Categoría y Subcategoría: centradas, igual que el resto de
   columnas (antes quedaban alineadas a la izquierda; ajuste pedido). ---- */
.vexpress-tabla-fila > span[data-vexpress-campo="categoria"],
.vexpress-tabla-fila > span[data-vexpress-campo="subcategoria"],
.vexpress-col-detalle,
.vexpress-col-subcat{
  text-align: center !important;
  justify-content: center !important;
}

/* =========================================================================
   1) Header de contexto — ahora incluye Personal/Negocios + selector de
   mes adentro de la misma franja, con el ícono en círculo 3D flotante.
   ========================================================================= */
.vexpress-contexto-header-outer{
  background-image: linear-gradient(90deg, rgba(255,253,246,0.86) 0%, rgba(255,253,246,0.6) 60%, rgba(255,253,246,0.4) 100%), url('vista-express-fondo-header.jpg');
  background-size: cover;
  background-position: center;
  border: 1.5px solid var(--gold);
  border-radius: 14px;
  overflow: hidden;
  position: relative;
  padding: 16px 22px;
  transition: background-size 0.7s ease, box-shadow 0.3s ease;
  box-shadow: 0 6px 18px -10px rgba(0,0,0,0.45);
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.vexpress-contexto-header-outer:hover{
  background-size: 115%;
  box-shadow: 0 10px 26px -10px rgba(192,138,40,0.55);
}

/* La identidad (ícono + nombre) ya no lleva su propia caja — vive dentro
   de la franja de arriba, sin duplicar borde/fondo. Mismo criterio para
   los selectores gemelos de Resumen mensual/anual (ver index.html). */
#vexpressNegocioHeader .negocio-card,
#resumenMensualNegocioHeader .negocio-card,
#resumenAnualNegocioHeader .negocio-card{
  border: none !important;
  background: none !important;
  box-shadow: none !important;
  padding: 0 !important;
  margin-bottom: 0 !important;
  justify-content: flex-start !important;
}
/* El selector Personal/Negocios de Resumen mensual/anual no vive dentro
   de .vexpress-contexto-controles (esa clase es propia de "Control"), así
   que no hereda su texto oscuro — sin esto, "Negocios" (inactivo) queda
   con texto claro sobre fondo transparente y se vuelve invisible. */
.resumen-contexto-selector .vexpress-modo-btn{
  background: #fff; color: var(--ink-dark);
}
.resumen-contexto-selector .vexpress-modo-btn.active{
  background: var(--gold); color: #14181D;
}
.vexpress-negocio-header-card .negocio-card-icono{
  width: 46px !important;
  height: 46px !important;
  font-size: 1.5rem !important;
  border-radius: 50%;
  box-shadow: 0 6px 14px -4px rgba(0,0,0,0.4), inset 0 0 0 1.5px rgba(192,138,40,0.4), inset 0 -2px 3px rgba(0,0,0,0.08);
  background: radial-gradient(circle at 35% 30%, #FFF8E8, #F3E0AE 75%);
}
.vexpress-negocio-header-nombre{ font-size: 1.25rem !important; }

.vexpress-contexto-controles{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  margin-top: 0px; /* Pedido 30/09 ronda 9b: todavía más pegado a la caja roja de arriba */
  padding-top: 6px;
  border-top: 1px solid rgba(192,138,40,0.3);
}
/* Estos controles vivían sobre fondo oscuro — se adaptan a la franja clara */
.vexpress-contexto-controles .vexpress-modo-btn{ color: var(--ink-dark); }
.vexpress-contexto-controles .vexpress-modo-toggle{ border-color: rgba(192,138,40,0.5); background: rgba(255,255,255,0.5); }
.vexpress-contexto-controles .vexpress-negocio-select-label{ color: var(--ink-dark); opacity: 0.65; }
.vexpress-contexto-controles .vexpress-negocio-select{ background: #fff; color: var(--ink-dark); border-color: rgba(192,138,40,0.5); }
.vexpress-contexto-controles .vexpress-periodo-bar{
  color: var(--ink-dark) !important;
  background: rgba(255,255,255,0.55) !important;
  border-color: rgba(192,138,40,0.4) !important;
}
.vexpress-contexto-controles .vexpress-periodo-texto-grande{ color: var(--gold-dark) !important; }
.vexpress-contexto-controles .vexpress-periodo-flecha:hover{ background: rgba(192,138,40,0.25) !important; }

/* =========================================================================
   2) Botón "+" circular dentro de las tarjetas KPI Ingresos/Egresos
   ========================================================================= */
.vexpress-total-card{ position: relative; }
.vexpress-kpi-add-btn{
  position: absolute;
  right: 10px;
  bottom: 10px;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: none;
  cursor: pointer;
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 1rem;
  line-height: 1;
  color: #fff;
  box-shadow: 0 3px 8px -2px rgba(0,0,0,0.4);
  transition: transform 0.12s ease;
}
.vexpress-kpi-add-btn:hover{ transform: scale(1.08); }
.vexpress-total-card.ingreso .vexpress-kpi-add-btn{ background: var(--success-dark); }
.vexpress-total-card.egreso .vexpress-kpi-add-btn{ background: var(--brick-dark); }
.vexpress-kpi-add-btn:disabled{ opacity: 0.4; cursor: not-allowed; }
.vexpress-total-card[data-vexpress-kpi-toggle]{ cursor: pointer; }
.vexpress-total-card.vexpress-kpi-activo{ box-shadow: 0 0 0 2px var(--gold) inset; }

/* =========================================================================
   4) Fila nueva inline: recurrente + botones centrados en su propia franja
   ========================================================================= */
.vexpress-fila-nueva-recurrente{
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  flex-wrap: wrap;
  padding: 10px 14px;
  background: rgba(192,138,40,0.1);
  border-top: 1px dashed rgba(192,138,40,0.3);
}
.vexpress-check-recurrente{ display: flex; align-items: center; gap: 6px; color: var(--ink-dark) !important; font-size: 0.82rem; font-weight: 600; cursor: pointer; }
.vexpress-fila-nueva-botones{ display: flex; gap: 8px; }

/* =========================================================================
   5) Detalle desplegable de categorías al tocar un KPI
   ========================================================================= */
.vexpress-kpi-detalle{
  background: #EDECE4;
  border: 1.5px solid var(--gold);
  border-radius: 12px;
  padding: 14px 18px;
  margin-top: -6px;
  box-shadow: 0 8px 20px -12px rgba(0,0,0,0.4);
}
.vexpress-kpi-detalle-doble{ display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
@media (max-width: 640px){ .vexpress-kpi-detalle-doble{ grid-template-columns: 1fr; } }
.vexpress-kpi-detalle-titulo{
  font-family: 'DM Serif Display', serif;
  font-size: 0.9rem;
  color: var(--gold-dark);
  margin-bottom: 8px;
}
.vexpress-kpi-detalle-fila{
  display: grid;
  grid-template-columns: 30px 1fr 80px 90px;
  align-items: center;
  gap: 10px;
  padding: 6px 0;
  border-bottom: 1px solid rgba(28,50,71,0.06);
}
.vexpress-kpi-detalle-nombre{ font-size: 0.82rem; color: var(--ink-dark); font-weight: 600; }
.vexpress-kpi-detalle-barra-wrap{ height: 6px; border-radius: 999px; background: rgba(28,50,71,0.08); overflow: hidden; }
.vexpress-kpi-detalle-barra{ display: block; height: 100%; border-radius: 999px; }
.vexpress-kpi-detalle-barra.ingreso{ background: var(--success-dark); }
.vexpress-kpi-detalle-barra.egreso{ background: var(--brick-dark); }
.vexpress-kpi-detalle-monto{ font-size: 0.82rem; font-weight: 700; text-align: right; }
.vexpress-kpi-detalle-monto.ingreso{ color: var(--success-dark); }
.vexpress-kpi-detalle-monto.egreso{ color: var(--brick-dark); }
.vexpress-kpi-detalle-vacio{ font-size: 0.8rem; color: var(--ink-dark); opacity: 0.6; padding: 8px 0; }

/* =========================================================================
   Ronda final: badge R estático (bug corregido), detalle KPI con ancho de
   la tarjeta, y caja de contexto centrada con título en mayúscula y mes
   con fondo llamativo.
   ========================================================================= */

/* ---- Detalle KPI: ancho dinámico via JS, esta regla solo define la base ---- */
.vexpress-totales-bar{ position: relative; }
.vexpress-kpi-detalle-resultado-fila{
  display: flex; align-items: center; justify-content: space-between;
  padding: 7px 0; border-bottom: 1px solid rgba(28,50,71,0.08); font-size: 0.86rem; color: var(--ink-dark);
}
.vexpress-kpi-detalle-resultado-total{ border-bottom: none; margin-top: 4px; padding-top: 10px; border-top: 2px solid rgba(192,138,40,0.3); font-weight: 800; font-size: 0.95rem; }

/* ---- Caja de contexto: todo centrado, título en mayúscula y más grande ---- */
.vexpress-contexto-header-outer{ align-items: center; }
#vexpressNegocioHeader .negocio-card,
#resumenMensualNegocioHeader .negocio-card,
#resumenAnualNegocioHeader .negocio-card{ justify-content: center !important; }
.vexpress-negocio-header-nombre{
  text-transform: uppercase;
  letter-spacing: 0.03em;
  font-size: 1.4rem !important;
}
.vexpress-contexto-controles{ justify-content: center; }

/* ---- Selector de mes: fondo llamativo (degradado cálido rojo/dorado) ---- */
.vexpress-contexto-controles .vexpress-periodo-bar{
  background: linear-gradient(120deg, #C1503E 0%, #C08A28 100%) !important;
  border-color: rgba(122,43,20,0.5) !important;
  padding: 6px 14px !important;
  box-shadow: 0 4px 10px -4px rgba(122,43,20,0.5);
}
.vexpress-contexto-controles .vexpress-periodo-texto-grande{ color: #fff !important; text-shadow: 0 1px 2px rgba(0,0,0,0.3); }
.vexpress-contexto-controles .vexpress-periodo-flecha{ background: rgba(255,255,255,0.25) !important; border-color: rgba(255,255,255,0.4) !important; color: #fff !important; }
.vexpress-contexto-controles .vexpress-periodo-flecha:hover{ background: rgba(255,255,255,0.4) !important; }

/* =========================================================================
   Bloque nuevo, sin relación con nada anterior: ícono + checkbox + texto
   de "Hacer recurrente" en una sola línea, a prueba de conflictos.
   ========================================================================= */
label.vexpress-recurrente-linea{
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: center !important;
  gap: 8px !important;
  width: auto !important;
  cursor: pointer;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--ink-dark) !important;
}
label.vexpress-recurrente-linea input[type="checkbox"]{
  flex: 0 0 auto !important;
  width: 16px !important;
  height: 16px !important;
  margin: 0 !important;
  accent-color: var(--gold);
  cursor: pointer;
}
label.vexpress-recurrente-linea .vexpress-badge-recurrente{
  flex: 0 0 auto !important;
}
label.vexpress-recurrente-linea .vexpress-recurrente-linea-texto{
  flex: 1 1 auto !important;
  text-align: left !important;
}

/* =========================================================================
   Recurrentes: columnas redimensionables + líneas verticales + títulos
   centrados (mismo patrón que la tabla de Movimientos).
   ========================================================================= */
.vexpress-recurrente-header > span,
.vexpress-recurrente-fila > span,
.vexpress-recurrente-fila > button{
  border-right: 1px solid rgba(120,90,40,0.22);
  padding-right: 6px;
}
.vexpress-recurrente-header > span:last-child,
.vexpress-recurrente-fila > *:last-child{ border-right: none; }

.vexpress-recurrente-header .vexpress-th{
  position: relative;
  text-align: center;
  justify-content: center;
  cursor: pointer;
}
.vexpress-recurrente-header .vexpress-th:hover{ color: var(--gold-bright); }

/* =========================================================================
   Total de grupo alineado bajo Monto, sin título en el pie de Movimientos,
   e ícono circular 3D en "+ Agregar nuevo ingreso/egreso".
   ========================================================================= */
.vexpress-grupo-header-izq{ display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1 1 auto; }
.vexpress-grupo-total{ text-align: center; }

.vexpress-fila-agregar-icono{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  color: #fff;
  font-weight: 800;
  font-size: 0.9rem;
  line-height: 1;
  vertical-align: -4px;
  margin-right: 4px;
  box-shadow: 0 3px 7px -2px rgba(0,0,0,0.45), inset 0 -2px 3px rgba(0,0,0,0.12), inset 0 1px 1px rgba(255,255,255,0.4);
}
.vexpress-fila-agregar-icono.ingreso{ background: radial-gradient(circle at 35% 30%, #6FCB8A, var(--success-dark)); }
.vexpress-fila-agregar-icono.egreso{ background: radial-gradient(circle at 35% 30%, #E58A78, var(--brick-dark)); }

/* =========================================================================
   FASE 2 — barra de herramientas secundaria: Subcategorías / Exportar /
   Densidad. Visualmente secundaria respecto a Personal/Negocio, mes,
   + Agregar, Movimientos/Recurrentes.
   ========================================================================= */
.vexpress-herramientas-secundarias{
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 2px 10px;
  flex-wrap: wrap;
}
/* AJUSTE BETA — Buscar/Agrupar quedan a la izquierda; el espaciador
   empuja Comparar meses / Columnas / Exportar al extremo derecho,
   agrupados junto a Exportar en la misma línea. */
.vexpress-herr-secundarias-spacer{ flex: 1 1 auto; }

/* AJUSTE BETA — Comparar meses / Mostrar-ocultar Columnas: misma caja,
   tamaño y color de fondo que Buscar/Agrupar (tono dorado), con el
   ícono en una placa circular "premium" (glossy, con sombra flotante). */
.vexpress-herr-btn-premium{
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: 'IBM Plex Sans', sans-serif;
  font-weight: 600;
  font-size: 0.76rem;
  padding: 6px 14px 6px 8px;
  border: none;
  border-radius: 8px;
  background: rgba(192,138,40,0.14);
  color: var(--gold-dark);
  cursor: pointer;
  white-space: nowrap;
}
.vexpress-herr-btn-premium:hover{ background: rgba(192,138,40,0.22); }

.vexpress-herr-btn-icono{
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  font-size: 0.74rem;
  background: radial-gradient(circle at 32% 28%, rgba(255,255,255,0.95), rgba(192,138,40,0.22) 75%);
  box-shadow: 0 3px 6px -2px rgba(0,0,0,0.4), inset 0 -1px 2px rgba(0,0,0,0.1), inset 0 1px 1px rgba(255,255,255,0.5);
}

/* Exportar: misma caja/tamaño, pero con fondo azul degradado (igual
   paleta que el bloque "HERRAMIENTAS" de mobile, para que combine con
   el resto de la app) y su ícono en la misma placa circular, en tono
   azul en vez de dorado. */
.vexpress-herr-btn-exportar{
  background: linear-gradient(135deg, #2E4A7A 0%, #16213A 100%);
  color: #F3EFE3;
}
.vexpress-herr-btn-exportar:hover{ background: linear-gradient(135deg, #37588F 0%, #1C2B47 100%); }
.vexpress-herr-btn-icono-exportar{
  background: radial-gradient(circle at 32% 28%, rgba(255,255,255,0.95), rgba(74,120,190,0.55) 75%);
}

/* Acceso directo a Categorías (01/10) — misma caja/tamaño que los demás,
   pero en tono oscuro/dorado (negro-crema de Dinerius) para que se lea
   como un ACCESO a otro módulo y no como un filtro/selector más de esta
   pantalla. */
.vexpress-herr-btn-acceso{
  background: linear-gradient(135deg, #2A2118 0%, #14100B 100%);
  color: #F3EFE3;
}
.vexpress-herr-btn-acceso:hover{ background: linear-gradient(135deg, #352A1E 0%, #1B160F 100%); }
.vexpress-herr-btn-icono-acceso{
  background: radial-gradient(circle at 32% 28%, rgba(255,255,255,0.95), rgba(192,138,40,0.55) 75%);
}
.vexpress-herr-btn{
  opacity: 0.9;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.72rem;
  font-weight: 600;
  padding: 5px 10px;
  border-radius: 7px;
  border: 1px solid rgba(28,50,71,0.15);
  background: #fff;
  color: var(--ink-dark);
  cursor: pointer;
}
/* "🗂 Agrupar por" reemplaza a "Mostrar/ocultar Columnas" SOLO en mobile
   (Desktop conserva Columnas tal cual). Oculto por defecto (Desktop);
   Tarea 1 lo muestra dentro del @media 480px. */
.vexpress-agrupar-btn-mobile{ display: none; }
.vexpress-herr-btn:hover{ border-color: var(--gold); }
.vexpress-herr-btn.active{ background: rgba(192,138,40,0.14); border-color: var(--gold); color: var(--gold-dark); }

/* AJUSTE BETA — Densidad ahora vive debajo de la tabla, pegada a la
   esquina inferior derecha, fuera de la fila de herramientas y fuera
   de la tabla misma. */
.vexpress-densidad-abajo-wrap{ display: flex; justify-content: flex-end; padding: 6px 2px 0; }
.vexpress-densidad-wrap{ display: flex; align-items: center; gap: 6px; margin-left: auto; opacity: 0.9; }
.vexpress-herr-label{ font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-dark); opacity: 0.55; }
.vexpress-densidad-grupo{ display: inline-flex; border: 1px solid rgba(28,50,71,0.15); border-radius: 7px; overflow: hidden; }
.vexpress-densidad-btn{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.7rem;
  font-weight: 600;
  padding: 5px 9px;
  border: none;
  background: #fff;
  color: var(--ink-dark);
  cursor: pointer;
  border-right: 1px solid rgba(28,50,71,0.1);
}
.vexpress-densidad-btn:last-child{ border-right: none; }
.vexpress-densidad-btn.active{ background: var(--gold); color: #14181D; }

/* ---- Densidad: cambia altura de fila, padding y tamaño — nunca escala
   toda la página con transform, solo estas propiedades puntuales ---- */
.vexpress-densidad-compacta .vexpress-tabla-fila,
.vexpress-densidad-compacta .vexpress-recurrente-fila{ font-size: 0.72rem; }
.vexpress-densidad-compacta .vexpress-editable,
.vexpress-densidad-compacta .vexpress-col-fecha,
.vexpress-densidad-compacta .vexpress-col-detalle,
.vexpress-densidad-compacta .vexpress-col-subcat,
.vexpress-densidad-compacta .vexpress-col-nota,
.vexpress-densidad-compacta .vexpress-col-monto,
.vexpress-densidad-compacta .vexpress-col-cuenta{ padding-top: 2px; padding-bottom: 2px; }
.vexpress-densidad-compacta .vexpress-cat-icono{ width: 18px !important; height: 18px !important; }
.vexpress-densidad-compacta .vexpress-anual-fila-padre,
.vexpress-densidad-compacta .vexpress-anual-fila-sub,
.vexpress-densidad-compacta .vexpress-anual-fila-total,
.vexpress-densidad-compacta .vexpress-anual-fila-resultado{ font-size: 0.7rem; padding: 3px 0; }

.vexpress-densidad-comoda .vexpress-tabla-fila,
.vexpress-densidad-comoda .vexpress-recurrente-fila{ font-size: 0.88rem; }
.vexpress-densidad-comoda .vexpress-editable,
.vexpress-densidad-comoda .vexpress-col-fecha,
.vexpress-densidad-comoda .vexpress-col-detalle,
.vexpress-densidad-comoda .vexpress-col-subcat,
.vexpress-densidad-comoda .vexpress-col-nota,
.vexpress-densidad-comoda .vexpress-col-monto,
.vexpress-densidad-comoda .vexpress-col-cuenta{ padding-top: 10px; padding-bottom: 10px; }
.vexpress-densidad-comoda .vexpress-cat-icono{ width: 26px !important; height: 26px !important; }
.vexpress-densidad-comoda .vexpress-anual-fila-padre,
.vexpress-densidad-comoda .vexpress-anual-fila-sub,
.vexpress-densidad-comoda .vexpress-anual-fila-total,
.vexpress-densidad-comoda .vexpress-anual-fila-resultado{ font-size: 0.85rem; padding: 10px 0; }

@media (max-width: 640px){
  .vexpress-densidad-wrap{ display: none; } /* densidad es Desktop-friendly, como se pidió */
  .vexpress-densidad-abajo-wrap{ display: none; }
}

/* =========================================================================
   FASE 3 — Comparar meses (nuevo, propio de Vista Express) y menú
   desplegable Exportar (CSV / PDF).
   ========================================================================= */

/* ---- Menú desplegable de Exportar ---- */
.vexpress-exportar-modal-opcion{
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  text-align: left;
  padding: 10px 12px;
  border: 1px solid rgba(192,138,40,0.25);
  border-radius: 8px;
  background: rgba(255,255,255,0.55);
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--ink-dark);
  cursor: pointer;
  margin-bottom: 6px;
}
.vexpress-exportar-modal-opcion:last-child{ margin-bottom: 0; }
.vexpress-exportar-modal-opcion:hover{ background: rgba(255,255,255,0.85); border-color: var(--gold-dark); }

/* ---- Modal Comparar meses ---- */
.vexpress-comparar-modal{ max-width: 620px; max-height: 82vh; overflow-y: auto; }

/* AJUSTE BETA — título grande y centrado ("Comparar :"); el botón ✕ se
   saca del flujo (absolute) para que el centrado no quede descuadrado. */
.vexpress-comparar-head{ position: relative; justify-content: center; }
.vexpress-comparar-head .vexpress-form-cerrar{ position: absolute; right: 0; top: 50%; transform: translateY(-50%); font-size: 1.1rem; }
.vexpress-comparar-titulo{
  font-family: 'DM Serif Display', serif;
  font-size: 1.55rem;
  font-weight: 700;
  color: var(--ink-dark);
  text-align: center;
}

.vexpress-comparar-selector{
  display: flex;
  align-items: center;
  gap: 12px;
  justify-content: center;
  padding: 10px 0 16px;
  border-bottom: 1px solid rgba(192,138,40,0.25);
  margin-bottom: 14px;
}
.vexpress-comparar-mes-actual{
  font-family: 'DM Serif Display', serif;
  font-size: 1rem;
  color: var(--gold-dark);
  background: rgba(192,138,40,0.12);
  padding: 6px 14px;
  border-radius: 8px;
}
/* AJUSTE BETA — "CON" reemplaza "vs": mismo lugar, pero con más
   presencia (dorado, itálica, un poco más grande) para que se note. */
.vexpress-comparar-vs{
  font-family: 'DM Serif Display', serif;
  font-style: italic;
  font-weight: 800;
  font-size: 1.1rem;
  color: var(--gold-dark);
  opacity: 1;
  letter-spacing: 0.03em;
}
/* AJUSTE BETA — el selector del segundo mes, casi con el mismo look que
   el mes actual (misma tipografía/fondo dorado), pero como <select>
   funcional con su propia flechita. */
.vexpress-comparar-mes-select{
  font-family: 'DM Serif Display', serif;
  font-size: 1rem;
  color: var(--gold-dark);
  background-color: rgba(192,138,40,0.12);
  padding: 6px 26px 6px 14px;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  text-align: center;
  text-align-last: center;
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23C08A28' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat: no-repeat;
  background-position: right 8px center;
  background-size: 10px 10px;
}
.vexpress-comparar-mes-select:hover{ background-color: rgba(192,138,40,0.2); }
.vexpress-comparar-mes-select:focus{ outline: none; box-shadow: inset 0 0 0 1px rgba(192,138,40,0.4); }

.vexpress-comp-nota{
  font-size: 0.72rem;
  color: var(--ink-dark);
  opacity: 0.65;
  background: rgba(192,138,40,0.08);
  padding: 6px 10px;
  border-radius: 7px;
  margin-bottom: 12px;
}
.vexpress-comp-resumen-bloque{
  background: rgba(192,138,40,0.08);
  border: 1px solid rgba(192,138,40,0.25);
  border-radius: 10px;
  padding: 4px 8px;
  margin-bottom: 16px;
}
.vexpress-comp-cabecera{
  display: grid;
  grid-template-columns: 1fr 110px 110px 130px;
  gap: 0;
  padding: 6px 4px;
  font-size: 0.66rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.6;
  font-weight: 800;
  border-bottom: 2px solid rgba(192,138,40,0.3);
}
.vexpress-comp-cabecera > span{ text-align: center; border-right: 1px solid rgba(120,90,40,0.2); }
.vexpress-comp-cabecera > span:last-child{ border-right: none; }
.vexpress-comp-mes-nombre{ text-align: center; }
.vexpress-comp-fila{
  display: grid;
  grid-template-columns: 1fr 110px 110px 130px;
  gap: 0;
  align-items: center;
  padding: 8px 4px;
}
.vexpress-comp-resumen-bloque .vexpress-comp-fila:last-child{ border-bottom: none; }
.vexpress-comp-fila > span{ border-right: 1px solid rgba(120,90,40,0.16); text-align: center; }
.vexpress-comp-fila > span:last-child{ border-right: none; }
.vexpress-comp-label{ font-weight: 700; font-size: 0.85rem; color: var(--ink-dark); text-align: center !important; }
.vexpress-comp-monto{ text-align: center; font-weight: 700; font-variant-numeric: tabular-nums; font-size: 0.85rem; }
.vexpress-comp-monto.ingreso{ color: var(--success-dark); }
.vexpress-comp-monto.egreso{ color: var(--brick-dark); }
.vexpress-comp-monto.resultado{ color: var(--gold-dark); }

.vexpress-comp-diff{ text-align: center; font-weight: 800; font-size: 0.82rem; padding: 3px 6px; border-radius: 6px; }
.vexpress-comp-diff.favorable{ background: rgba(63,122,82,0.15); color: var(--success-dark); }
.vexpress-comp-diff.desfavorable{ background: rgba(193,80,62,0.15); color: var(--brick-dark); }
.vexpress-comp-diff.neutro{ background: rgba(28,50,71,0.07); color: var(--ink-dark); opacity: 0.7; }

.vexpress-comp-subtitulo{
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-family: 'DM Serif Display', serif;
  font-size: 0.95rem;
  color: var(--gold-dark);
  margin: 18px 0 8px;
}
.vexpress-comp-tipo-toggle{ display: flex; gap: 6px; }
.vexpress-comp-ver-ingresos{ background: rgba(63,122,82,0.14); border-color: rgba(63,122,82,0.4); color: var(--success-dark); }
.vexpress-comp-ver-ingresos.active{ background: var(--success-dark); border-color: var(--success-dark); color: #fff; }
.vexpress-comp-ver-egresos{ background: rgba(193,80,62,0.14); border-color: rgba(193,80,62,0.4); color: var(--brick-dark); }
.vexpress-comp-ver-egresos.active{ background: var(--brick-dark); border-color: var(--brick-dark); color: #fff; }
.vexpress-comp-fila-resultado{
  background: rgba(192,138,40,0.16);
  border-top: 1px solid rgba(192,138,40,0.3);
  border-radius: 0 0 8px 8px;
}
.vexpress-comp-fila-resultado .vexpress-comp-label{ font-weight: 800; }

.vexpress-comp-cat-cabecera{
  display: grid;
  grid-template-columns: 220px 100px 100px 120px;
  gap: 0;
  padding: 6px 8px;
  font-size: 0.62rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-dark);
  opacity: 0.55;
  font-weight: 800;
  border-bottom: 1px solid rgba(192,138,40,0.2);
}
.vexpress-comp-cat-cabecera > span{ text-align: center; border-right: 1px solid rgba(120,90,40,0.2); position: relative; }
.vexpress-comp-cat-cabecera > span:last-child{ border-right: none; }

.vexpress-comp-cat-lista{ max-height: 260px; overflow-y: auto; scrollbar-gutter: stable; border: 1px solid rgba(28,50,71,0.08); border-radius: 0 0 8px 8px; }
.vexpress-comp-fila-cat{
  display: grid;
  grid-template-columns: 220px 100px 100px 120px;
  gap: 0;
  align-items: center;
  padding: 6px 8px;
  border-bottom: 1px solid rgba(28,50,71,0.06);
}
.vexpress-comp-fila-cat > .vexpress-comp-monto,
.vexpress-comp-fila-cat > .vexpress-comp-diff{ border-left: 1px solid rgba(120,90,40,0.12); }
.vexpress-comp-fila-cat-expandible{ cursor: pointer; }
.vexpress-comp-fila-cat-expandible:hover{ background: rgba(192,138,40,0.08); }
.vexpress-comp-cat-etiqueta{ display: flex; align-items: center; gap: 6px; min-width: 0; }
.vexpress-comp-cat-chevron{ font-size: 0.6rem; opacity: 0.6; flex-shrink: 0; width: 10px; }
.vexpress-comp-cat-nombre{ font-size: 0.78rem; color: var(--ink-dark); font-weight: 600; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vexpress-comp-fila-sub{ background: rgba(28,50,71,0.02); }
.vexpress-comp-fila-sub .vexpress-comp-cat-etiqueta{ padding-left: 16px; }
.vexpress-comp-fila-sub .vexpress-comp-cat-nombre{ font-weight: 500; opacity: 0.85; }
.vexpress-comp-fila-cat .vexpress-comp-monto{ font-size: 0.78rem; text-align: center; }
.vexpress-comp-fila-cat .vexpress-comp-diff{ font-size: 0.72rem; }

/* =========================================================================
   Recordatorios en Recurrentes — solo el estado visual del botón nuevo,
   reutilizando el mismo .vexpress-chip-btn-mini que ya existía.
   ========================================================================= */
.vexpress-recordatorio-activo{
  background: rgba(192,138,40,0.16);
  border-color: var(--gold);
  color: var(--gold-dark);
  opacity: 1;
}

/* =========================================================================
   FASE 4 — Vista Express Anual: selector Mensual/Anual, matriz de 12
   meses por categoría, scroll horizontal contenido, sticky header+columna.
   ========================================================================= */

/* ---- Selector Mensual/Anual — "el selector principal de período" ---- */
.vexpress-nivel-toggle{
  display: inline-flex;
  border-radius: 9px;
  overflow: hidden;
  border: 1.5px solid var(--gold);
  box-shadow: 0 2px 6px -2px rgba(0,0,0,0.3);
}
.vexpress-nivel-btn{
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 0.82rem;
  padding: 7px 16px;
  background: rgba(255,255,255,0.55);
  color: var(--ink-dark);
  border: none;
  cursor: pointer;
}
.vexpress-nivel-btn.active{ background: var(--gold); color: #14181D; }
.vexpress-nivel-btn:not(.active):hover{ background: rgba(192,138,40,0.2); }

/* ---- Matriz Anual ---- */
.vexpress-anual-tabla-scroll{
  overflow-x: auto;
  overflow-y: auto;
  max-height: 460px;
  border-radius: 0 0 10px 10px;
}
.vexpress-anual-fila{
  display: grid;
  grid-template-columns: 170px repeat(12, 72px) 100px;
  align-items: center;
}
.vexpress-anual-header{
  position: sticky;
  top: 0;
  z-index: 5;
  background: linear-gradient(180deg, rgba(192,138,40,0.28), rgba(192,138,40,0.1));
  border-bottom: 2px solid rgba(192,138,40,0.35);
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--gold-dark);
  padding: 8px 0;
}
.vexpress-anual-header > span{ text-align: center; }
.vexpress-anual-header .vexpress-anual-col-cat{ position: sticky; left: 0; z-index: 6; background: inherit; text-align: left; padding-left: 12px; }

.vexpress-anual-fila-padre, .vexpress-anual-fila-sub, .vexpress-anual-fila-total, .vexpress-anual-fila-resultado{
  padding: 6px 0;
  border-bottom: 1px solid rgba(28,50,71,0.07);
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.78rem;
  color: var(--ink-dark);
}
.vexpress-anual-fila-padre > span, .vexpress-anual-fila-sub > span, .vexpress-anual-fila-total > span, .vexpress-anual-fila-resultado > span{
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.vexpress-anual-col-cat{
  text-align: left !important;
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 6px;
  padding-left: 12px;
  position: sticky;
  left: 0;
  background: #EDECE4;
  z-index: 3;
}
.vexpress-anual-fila-sub .vexpress-anual-col-cat{ font-weight: 500; font-size: 0.74rem; padding-left: 26px; opacity: 0.85; }
.vexpress-anual-cero{ opacity: 0.35; }
.vexpress-anual-col-total{
  font-weight: 800 !important;
  background: rgba(192,138,40,0.1);
  border-left: 2px solid var(--gold);
}
.vexpress-anual-fila-total{ background: rgba(192,138,40,0.06); font-weight: 800; }
.vexpress-anual-fila-total .vexpress-anual-col-cat{ background: transparent; }
.vexpress-anual-fila-resultado{
  background: linear-gradient(90deg, rgba(192,138,40,0.14), rgba(192,138,40,0.04));
  font-weight: 800;
  border-top: 2px solid var(--gold);
  border-radius: 0 0 10px 10px;
}
.vexpress-anual-fila-resultado .vexpress-anual-col-cat{ background: transparent; color: var(--gold-dark); }
.vexpress-anual-negativo{ color: var(--brick-dark) !important; }
.vexpress-anual-resultado-wrap{ max-height: none; margin-top: 6px; }

/* Página nunca scrollea horizontal por esto — solo la matriz interna */
#vexpressVistaAnual{ overflow-x: hidden; }

/* =========================================================================
   Anual → Mensual: señal sutil de que un mes/celda es clickeable.
   ========================================================================= */
.vexpress-anual-clickeable{
  cursor: pointer;
  border-radius: 5px;
  transition: background 0.12s ease;
}
.vexpress-anual-clickeable:hover{
  background: rgba(192,138,40,0.16);
  box-shadow: inset 0 0 0 1px rgba(192,138,40,0.3);
}
.vexpress-anual-header .vexpress-anual-clickeable:hover{ background: rgba(255,255,255,0.25); }

/* =========================================================================
   Resaltado de fila/columna en la matriz Anual — faltaba el CSS (la
   lógica JS ya existía, pero nunca se veía nada).
   ========================================================================= */
.vexpress-anual-fila-resaltada{ background: rgba(192,138,40,0.14) !important; }
.vexpress-anual-fila-resaltada .vexpress-anual-col-cat{ background: rgba(192,138,40,0.14) !important; }

.vexpress-anual-tabla-scroll[data-col-resaltada="0"] .vexpress-anual-fila > *:nth-child(2),
.vexpress-anual-tabla-scroll[data-col-resaltada="1"] .vexpress-anual-fila > *:nth-child(3),
.vexpress-anual-tabla-scroll[data-col-resaltada="2"] .vexpress-anual-fila > *:nth-child(4),
.vexpress-anual-tabla-scroll[data-col-resaltada="3"] .vexpress-anual-fila > *:nth-child(5),
.vexpress-anual-tabla-scroll[data-col-resaltada="4"] .vexpress-anual-fila > *:nth-child(6),
.vexpress-anual-tabla-scroll[data-col-resaltada="5"] .vexpress-anual-fila > *:nth-child(7),
.vexpress-anual-tabla-scroll[data-col-resaltada="6"] .vexpress-anual-fila > *:nth-child(8),
.vexpress-anual-tabla-scroll[data-col-resaltada="7"] .vexpress-anual-fila > *:nth-child(9),
.vexpress-anual-tabla-scroll[data-col-resaltada="8"] .vexpress-anual-fila > *:nth-child(10),
.vexpress-anual-tabla-scroll[data-col-resaltada="9"] .vexpress-anual-fila > *:nth-child(11),
.vexpress-anual-tabla-scroll[data-col-resaltada="10"] .vexpress-anual-fila > *:nth-child(12),
.vexpress-anual-tabla-scroll[data-col-resaltada="11"] .vexpress-anual-fila > *:nth-child(13){
  background: rgba(192,138,40,0.16) !important;
}

/* =========================================================================
   Modal de detalle de celda (Anual) — nunca tuvo CSS propio, por eso el
   texto se veía invisible (heredaba color por defecto sin contraste).
   ========================================================================= */
.vexpress-anual-detalle-modal{ max-width: 480px; }
.vexpress-anual-detalle-cuerpo{
  background: rgba(192,138,40,0.08);
  border: 1px solid rgba(192,138,40,0.25);
  border-radius: 10px;
  padding: 12px 16px;
  margin-bottom: 14px;
}
.vexpress-anual-detalle-fila{
  display: flex;
  justify-content: space-between;
  padding: 4px 0;
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.82rem;
  color: var(--ink-dark);
}
.vexpress-anual-detalle-fila span{ opacity: 0.6; }
.vexpress-anual-detalle-fila b{ color: var(--ink-dark); font-weight: 700; }
.vexpress-anual-detalle-monto{
  text-align: center;
  font-family: 'Quicksand', sans-serif;
  font-weight: 800;
  font-size: 1.5rem;
  margin-top: 8px;
  padding-top: 8px;
  border-top: 1px solid rgba(192,138,40,0.25);
}
.vexpress-anual-detalle-monto.ingreso{ color: var(--success-dark); }
.vexpress-anual-detalle-monto.egreso{ color: var(--brick-dark); }
.vexpress-anual-detalle-titulo{
  font-family: 'DM Serif Display', serif;
  font-size: 0.85rem;
  color: var(--gold-dark);
  margin-bottom: 6px;
}
.vexpress-anual-detalle-lista{
  max-height: 220px;
  overflow-y: auto;
  border: 1px solid rgba(28,50,71,0.08);
  border-radius: 8px;
  margin-bottom: 14px;
}
.vexpress-anual-detalle-mov{
  display: grid;
  grid-template-columns: 80px 1fr 90px 90px;
  gap: 8px;
  align-items: center;
  padding: 6px 10px;
  border-bottom: 1px solid rgba(28,50,71,0.06);
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.76rem;
  color: var(--ink-dark);
}
.vexpress-anual-detalle-mov:last-child{ border-bottom: none; }
.vexpress-anual-detalle-mov-nota{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; opacity: 0.85; }
.vexpress-anual-detalle-mov-monto{ text-align: right; font-weight: 700; font-variant-numeric: tabular-nums; }
.vexpress-anual-detalle-mov-monto.ingreso{ color: var(--success-dark); }
.vexpress-anual-detalle-mov-monto.egreso{ color: var(--brick-dark); }
.vexpress-anual-detalle-vacio{ padding: 16px; text-align: center; font-size: 0.8rem; color: var(--ink-dark); opacity: 0.6; }

/* =========================================================================
   Recordarme — ícono flotante 3D (sin texto) + modal de opciones de fecha.
   ========================================================================= */
.vexpress-recordatorio-btn{
  width: 30px;
  height: 30px;
  border-radius: 50%;
  border: none;
  background: linear-gradient(155deg, #FFFFFF 0%, #F0E8D0 100%);
  box-shadow: 0 3px 6px -1px rgba(0,0,0,0.35), 0 0 0 1px rgba(192,138,40,0.25);
  font-size: 0.95rem;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.vexpress-recordatorio-btn:hover{ transform: translateY(-1px) scale(1.06); box-shadow: 0 5px 10px -2px rgba(0,0,0,0.4), 0 0 0 1px rgba(192,138,40,0.35); }
.vexpress-recordatorio-btn:active{ transform: translateY(0) scale(0.96); }
.vexpress-recordatorio-btn.vexpress-recordatorio-activo{
  background: linear-gradient(155deg, #F6DA9A 0%, var(--gold) 100%);
  box-shadow: 0 3px 8px -1px rgba(192,138,40,0.6), 0 0 0 1px var(--gold-dark);
}

.vexpress-recordatorio-modal{ max-width: 380px; }
.vexpress-recordatorio-modal-sub{ font-family: 'DM Serif Display', serif; font-size: 1rem; color: var(--gold-dark); margin: -4px 0 14px; text-align: center; }

/* ---- Modal "Hacer recurrente" — todo centrado ---- */
.vexpress-activar-recurrente-modal{ text-align: center; position: relative; }
.vexpress-activar-recurrente-cerrar{ position: absolute; top: 14px; right: 14px; }
.vexpress-activar-recurrente-head{
  display: flex; flex-direction: column; align-items: center; gap: 10px; margin: 6px 0 12px;
}
.vexpress-badge-recurrente-modal{
  position: static; width: 52px; height: 52px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 1.4rem; color: #fff;
  box-shadow: 0 6px 14px -4px rgba(0,0,0,0.5), inset 0 0 0 1px rgba(255,255,255,0.5);
}
.vexpress-activar-recurrente-titulo{
  font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 1.05rem; letter-spacing: 0.04em;
  color: var(--ink-dark);
}
.vexpress-activar-recurrente-dia-wrap{ margin: 0 auto 4px; max-width: 220px; }
.vexpress-activar-recurrente-dia-wrap label{
  display: block; font-family: 'IBM Plex Sans', sans-serif; font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.04em; opacity: 0.65; margin-bottom: 6px;
}
.vexpress-activar-recurrente-dia-wrap input{ width: 100%; text-align: center; }
.vexpress-activar-recurrente-avisar-check{
  display: flex !important; justify-content: center; margin: 16px 0 0 !important;
}
.vexpress-activar-recurrente-cuando{
  display: flex; align-items: center; justify-content: center; gap: 10px; margin-top: 12px;
}
.vexpress-activar-recurrente-campana{ font-size: 1.6rem; filter: drop-shadow(0 4px 6px rgba(0,0,0,0.35)); }
.vexpress-activar-recurrente-cuando-opciones{ display: flex; gap: 6px; }
.vexpress-activar-recurrente-opcion{
  font-family: 'IBM Plex Sans', sans-serif; font-weight: 600; font-size: 0.72rem;
  padding: 7px 12px; border-radius: 999px; border: 1px solid rgba(28,50,71,0.18);
  background: #fff; color: var(--ink-dark); cursor: pointer;
  transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.vexpress-activar-recurrente-opcion.active{ background: var(--gold); border-color: var(--gold); color: #14181D; }

.vexpress-recordatorio-opciones{ display: flex; flex-direction: column; gap: 6px; }
.vexpress-recordatorio-opcion{
  font-family: 'IBM Plex Sans', sans-serif;
  font-size: 0.82rem;
  font-weight: 600;
  padding: 10px 14px;
  border-radius: 8px;
  border: 1.5px solid rgba(28,50,71,0.12);
  background: #fff;
  color: var(--ink-dark);
  text-align: left;
  cursor: pointer;
}
.vexpress-recordatorio-opcion:hover{ border-color: var(--gold); }
.vexpress-recordatorio-opcion.active{ background: rgba(192,138,40,0.14); border-color: var(--gold); color: var(--gold-dark); font-weight: 800; }

/* =========================================================================
   Tarjetas KPI en Recurrentes — familia de azules, distinta de Movimientos,
   con un matiz propio para Ingresos / Egresos / Resultado.
   ========================================================================= */
.vexpress-totales-bar-recurrente .vexpress-total-card.ingreso{
  background: linear-gradient(155deg, #EAF2FB 0%, #C9DEF5 100%);
  border-color: rgba(46,90,150,0.25);
}
.vexpress-totales-bar-recurrente .vexpress-total-card.egreso{
  background: linear-gradient(155deg, #DCE9FA 0%, #A9C7ED 100%);
  border-color: rgba(35,75,135,0.3);
}
.vexpress-totales-bar-recurrente .vexpress-total-card.resultado{
  background: linear-gradient(155deg, #B9D2F0 0%, #6E97CE 100%);
  border-color: rgba(25,60,115,0.35);
}
.vexpress-totales-bar-recurrente .vexpress-total-card.ingreso .vexpress-total-monto{ color: #1F4E8C; }
.vexpress-totales-bar-recurrente .vexpress-total-card.egreso .vexpress-total-monto{ color: #17416F; }
.vexpress-totales-bar-recurrente .vexpress-total-card.resultado .vexpress-total-monto{ color: #0E2E55; }
.vexpress-totales-bar-recurrente .vexpress-total-card.resultado.negativo .vexpress-total-monto{ color: var(--brick-dark); }
.vexpress-totales-bar-recurrente .vexpress-total-card .vexpress-total-label{ color: #1F4E8C; opacity: 0.75; }

.vexpress-kpi-detalle-recurrente{
  background: linear-gradient(155deg, #EAF2FB 0%, #C9DEF5 100%) !important;
  border-color: rgba(46,90,150,0.3) !important;
}
.vexpress-kpi-detalle-recurrente .vexpress-kpi-detalle-titulo{ color: #1F4E8C; }

/* =========================================================================
   MOBILE — "Financial Ledger" (Propuesta 03), SOLO ≤480px.
   Nada de acá toca Desktop: todo vive dentro de @media (max-width:480px).
   Todas las clases siguen siendo vexpress-* (aisladas) salvo donde se anota
   lo contrario. No se cambió ninguna función de datos/Supabase — solo se
   agregó un botón "Filtros" (colapsa/expande un panel ya existente) y se
   reorganizó/compactó la presentación.
   ========================================================================= */
@media (max-width: 480px){

  /* 1) Header: ocultar el bloque redundante "⚡ Control — Una forma más
     rápida..." (el título real y el selector Control/Resumen mensual/anual
     viven en index.html, fuera de este archivo, y ya tienen su propio
     tratamiento mobile ahí). */
  .vexpress-titulo-row{ display: none; }

  /* Header de contexto: tarjeta "Finanzas Personales" + Mensual/Anual +
     Personal/Negocios + navegación de período, todo compactado. order:3
     lo manda DESPUÉS del overview (ver punto 2 más abajo) — mismo truco
     que ya usamos en Negocios/Categorías para reordenar sin tocar el HTML:
     .vexpress-outer ya es display:flex; flex-direction:column, así que
     "order" en sus hijos directos alcanza. */
  .vexpress-contexto-header-outer{
    order: 3; padding: 10px 12px; border-radius: 14px; gap: 8px;
  }
  .vexpress-negocio-header-card.vexpress-negocio-header-card{ padding: 8px 10px; gap: 8px; }
  .vexpress-contexto-icono{ width: 30px; height: 30px; font-size: 1rem; }
  .vexpress-negocio-header-nombre.vexpress-negocio-header-nombre{ font-size: 0.92rem !important; }
  .vexpress-contexto-controles{ gap: 6px; }
  .vexpress-nivel-toggle, .vexpress-modo-toggle{ width: 100%; }
  .vexpress-nivel-btn, .vexpress-modo-btn{ flex: 1 1 0; padding: 8px 6px; font-size: 0.76rem; }
  .vexpress-negocio-select-wrap{ width: 100%; }
  .vexpress-negocio-select{ width: 100%; }
  .vexpress-periodo-bar{ width: 100%; justify-content: space-between; padding: 6px 10px; }
  .vexpress-periodo-texto-grande{ font-size: 0.82rem !important; }
  .vexpress-periodo-flecha{ width: 28px; height: 28px; }

  /* 2) Overview financiero VA PRIMERO (order:1), antes de Finanzas
     Personales (order:3, ver arriba). Ingresos / Egresos / Resultado en
     una sola fila, con más aire/tamaño, misma altura/ancho/radio/padding
     exactos entre las 3, y sus botones "+" reales intactos. */
  .vexpress-totales-bar{
    order: 1; grid-template-columns: repeat(3, 1fr) !important; gap: 8px; align-items: stretch;
  }
  .vexpress-total-card{
    display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
    gap: 5px; padding: 12px 10px; min-height: 78px; box-sizing: border-box;
  }
  .vexpress-total-icono{ width: 28px; height: 28px; font-size: 0.92rem; }
  .vexpress-total-label{ font-size: 0.56rem; }
  .vexpress-total-monto{
    font-size: 1rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
  }
  .vexpress-kpi-add-btn{ width: 22px; height: 22px; font-size: 0.9rem; top: 7px; right: 7px; }

  /* 4) Panel desplegable del overview: SIEMPRE ancho completo, debajo de
     TODA la fila (nunca una caja angosta bajo una sola tarjeta). El JS
     (vexpressRenderKpiDetalle) fija width/margin-left inline para alinearlo
     con la tarjeta tocada — eso es lo que causaba el problema; acá se
     neutraliza con !important solo en mobile, sin tocar esa función. */
  .vexpress-kpi-detalle{
    order: 2; width: 100% !important; margin-left: 0 !important; box-sizing: border-box;
    padding: 12px 14px; margin-top: 6px;
  }
  .vexpress-kpi-detalle-fila{
    display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; padding: 7px 0;
  }
  .vexpress-kpi-detalle-fila .vexpress-cat-icono{ order: 1; flex: 0 0 auto; width: 22px; height: 22px; font-size: 0.76rem; }
  .vexpress-kpi-detalle-nombre{ order: 2; flex: 1 1 auto; min-width: 0; font-size: 0.78rem; }
  .vexpress-kpi-detalle-monto{ order: 3; flex: 0 0 auto; font-size: 0.78rem; white-space: nowrap; }
  .vexpress-kpi-detalle-barra-wrap{ order: 4; flex-basis: 100%; margin-left: 30px; width: auto; }

  /* 4) Movimientos / Recurrentes: selector segmentado compacto, ancho
     completo, estado activo en dorado — MISMOS botones/click de siempre.
     .vexpress-panel-claro (que contiene el toggle + toolbar + ledger) va
     order:4, después de Finanzas Personales. */
  .vexpress-panel-claro{ order: 4; padding: 10px 10px 0; border-radius: 12px; }
  .vexpress-vista-toggle{ display: flex; width: 100%; margin-bottom: 8px; }
  .vexpress-vista-btn{ flex: 1 1 0; justify-content: center; padding: 9px 6px; font-size: 0.76rem; }

  /* 5) Minimal Smart Bar: Buscar | ⚙️ Filtros | 🗂️ Agrupar en UNA sola
     línea. Filtros sigue abriendo el mismo panel de siempre (Tipo/
     Categoría/Cuenta/Limpiar); Agrupar es el mismo <select> de siempre,
     ahora ubicado directo en la barra (antes vivía dentro de Filtros o en
     una fila aparte) y muestra la agrupación activa discretamente
     ("🗂️ Categoría"). Ningún dato ni función nueva — mismos elementos. */
  .vexpress-toolbar{ gap: 6px; padding-bottom: 8px; flex-wrap: wrap; align-items: center; }
  .vexpress-buscar-input{ flex: 1 1 50px; min-width: 0; padding: 8px 8px; font-size: 0.78rem; }
  .vexpress-filtros-toggle-btn{
    display: inline-flex !important; align-items: center; justify-content: center;
    flex: 0 0 auto; font-family: 'Quicksand', sans-serif; font-weight: 700; font-size: 0.7rem;
    padding: 7px 9px; border-radius: 8px; border: 1px solid rgba(28,50,71,0.16);
    background: #fff; color: var(--ink-dark); white-space: nowrap; cursor: pointer;
  }
  .vexpress-filtros-toggle-btn.active{
    background: var(--gold); border-color: var(--gold); color: #14181D;
  }
  .vexpress-toolbar-filtros-panel{
    display: none; flex-basis: 100%; flex-wrap: wrap; gap: 8px; margin-top: 8px;
  }
  #vexpressVistaMovimientos.vexpress-filtros-abiertos .vexpress-toolbar-filtros-panel{ display: flex; }
  .vexpress-toolbar-filtros-panel .vexpress-filtro-select{ flex: 1 1 140px; max-width: none; }
  /* AJUSTE BETA — en mobile, Tipo/Categoría/Cuenta se siguen mostrando
     igual que siempre dentro del panel de Filtros (el ocultamiento de
     arriba es solo para Desktop). */
  .vexpress-filtro-select-oculto-beta{ display: inline-block; }

  /* "🗂️ Agrupar" — mismo <select> de siempre, ahora tercer ítem de la
     Smart Bar; muestra la opción activa como texto compacto */
  .vexpress-agrupar-btn-mobile{
    display: inline-flex !important; -webkit-appearance: none; -moz-appearance: none; appearance: none;
    flex: 0 0 auto; max-width: 100px; padding: 7px 18px 7px 8px; font-size: 0.68rem; font-weight: 600;
    font-family: 'IBM Plex Sans', sans-serif; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    border-radius: 8px; border: 1px solid rgba(28,50,71,0.16); background-color: #fff; color: var(--ink-dark);
    background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2314181D' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
    background-repeat: no-repeat; background-position: right 5px center; background-size: 9px 9px;
  }
  /* Tarea 2: al abrir Filtros, "Agrupar" se esconde (más ancho libre para
     Tipo/Categoría/Cuenta) — vuelve a aparecer al cerrar Filtros */
  #vexpressVistaMovimientos.vexpress-filtros-abiertos .vexpress-agrupar-btn-mobile{ display: none !important; }

  /* "Mostrar/ocultar Columnas" no aplica en mobile (no hay columnas que
     mostrar/ocultar en la cuadrícula fija); Comparar meses y Exportar se
     movieron al bloque "HERRAMIENTAS" al final de la tabla (más abajo) —
     acá arriba no queda nada visible. */
  #vexpressVistaMovimientos > .vexpress-herramientas-secundarias{ display: none !important; }

  /* Bloque "HERRAMIENTAS" al final de la tabla — Comparar meses y
     Exportar, con fondo degradado azul oscuro premium, título centrado */
  .vexpress-herramientas-final{
    margin: 4px -10px -1px; padding: 16px 14px 18px;
    background: linear-gradient(155deg, #1B2A44 0%, #101827 100%);
    border-top: 1px solid rgba(228,181,76,0.25);
    border-radius: 0 0 12px 12px;
  }
  .vexpress-herramientas-final-titulo{
    text-align: center; font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 0.7rem;
    letter-spacing: 0.12em; color: rgba(237,236,228,0.6); margin-bottom: 10px;
  }
  .vexpress-herramientas-final-btns{ display: flex; gap: 8px; }
  .vexpress-herr-final-btn{
    flex: 1 1 0; min-width: 0; font-family: 'IBM Plex Sans', sans-serif; font-weight: 600; font-size: 0.74rem;
    padding: 10px 8px; border-radius: 9px; border: 1px solid rgba(228,181,76,0.3);
    background: rgba(237,236,228,0.08); color: #EDECE4; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    cursor: pointer;
  }
  .vexpress-herr-final-btn:active{ background: rgba(237,236,228,0.16); }

  /* 6) y 7) Financial Ledger — CUADRÍCULA RÍGIDA con CSS Grid real:
     FECHA (fija) | ÍCONO (fijo) | CONTENIDO (minmax(0,1fr), único que
     puede crecer verticalmente) | MONTO (fijo, pegado al borde derecho).
     El wrapper data-vexpress-campo="categoria" pasa a display:contents en
     mobile, así que sus dos hijos (ícono y contenido) son ítems directos
     del grid y caen cada uno en su propia columna — un texto largo nunca
     puede correr el ícono, la fecha ni el monto, solo hace wrap dentro de
     su columna y la fila crece en alto. Las acciones (⋮ o 🔒) quedan fuera
     del grid, ancladas arriba a la derecha, y tanto la fila como el
     encabezado de grupo reservan el mismo padding-right (44px) para que
     el total del grupo y los montos de cada fila compartan siempre el
     mismo eje vertical derecho. */
  .vexpress-tabla-wrap{ margin: 0 -10px; }
  .vexpress-tabla-header{ display: none; } /* los encabezados de columna no aportan en una tarjeta-fila */

  .vexpress-grupo-header{ padding: 10px 44px 10px 12px; gap: 8px; }
  .vexpress-grupo-nombre{ font-size: 0.8rem; }
  .vexpress-grupo-total{ font-size: 1.02rem; font-weight: 800; white-space: nowrap; flex-shrink: 0; margin-left: auto; }
  .vexpress-subgrupo-header{ padding: 8px 44px 8px 26px; }

  /* Tarea 2 y 3: en mobile el JS no aplica ningún estilo inline al header
     de grupo/subgrupo (vexpressGridTemplate() devuelve '' en mobile), así
     que ".vexpress-grupo-header-izq" (envuelve flecha+ícono+nombre) se
     queda sin display:flex propio — sus hijos se apilaban en líneas
     sueltas y el monto podía terminar pegado al ícono. Estructura FIJA:
     una sola línea [flecha][ícono][nombre-flexible] ... [monto], con el
     monto siempre en el mismo eje derecho (mismo padding-right:44px que
     arriba) sin importar si se agrupa por Tipo, Categoría o Subcategoría. */
  .vexpress-grupo-header-izq{
    display: flex !important; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 0;
  }
  .vexpress-grupo-nombre, .vexpress-subgrupo-nombre{
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
  }

  .vexpress-tabla-fila{
    display: grid !important;
    grid-template-columns: 26px 30px minmax(0, 1fr) auto;
    align-items: start;
    column-gap: 8px;
    padding: 11px 44px 11px 12px !important;
    border-bottom: 1px solid rgba(28,50,71,0.07);
    position: relative;
  }
  .vexpress-tabla-fila > *{ border-right: none !important; padding-right: 0 !important; }

  /* Columna 1 — Fecha, siempre fija */
  .vexpress-tabla-fila > [data-vexpress-campo="fecha"],
  .vexpress-tabla-fila > .vexpress-col-fecha{
    grid-column: 1; display: flex !important; flex-direction: column; align-items: center;
    font-size: 0.58rem; line-height: 1.2; opacity: 0.65; padding-top: 1px;
    border-right: 1px solid rgba(28,50,71,0.08); margin-right: -2px;
  }

  /* El wrapper de "categoría" desaparece como caja (display:contents) para
     que sus dos hijos —ícono y contenido— sean ítems directos del grid */
  .vexpress-tabla-fila > [data-vexpress-campo="categoria"]{ display: contents; }

  /* Columna 2 — Ícono, siempre fijo (subcategoría con fallback a categoría) */
  .vexpress-mg-icono{
    grid-column: 2; display: flex; align-items: center; justify-content: center;
    width: 28px; height: 28px; border-radius: 8px; font-size: 0.86rem;
    background: rgba(28,50,71,0.05); flex-shrink: 0; position: relative;
  }

  /* Columna 3 — Contenido: EL ÚNICO bloque que puede crecer verticalmente.
     Jerarquía Detalle > Subcategoría > Categoría ya resuelta en JS. */
  .vexpress-mg-contenido{
    grid-column: 3; min-width: 0; display: flex; flex-direction: column; gap: 1px;
  }
  .vexpress-mg-contenido .vexpress-col-detalle-principal{
    font-size: 0.84rem; white-space: normal; overflow-wrap: break-word; word-break: break-word;
  }
  .vexpress-col-detalle-meta{
    font-size: 0.66rem; opacity: 0.65; white-space: normal; overflow-wrap: break-word;
  }

  /* Columna 4 — Monto, absolutamente fijo a la derecha, nunca se corta ni
     se desplaza, sin importar cuánto texto haya en el contenido */
  .vexpress-tabla-fila > [data-vexpress-campo="monto"],
  .vexpress-tabla-fila > .vexpress-col-monto{
    grid-column: 4; text-align: right; padding-left: 4px; align-self: start;
  }
  .vexpress-col-monto{ font-size: 0.86rem; white-space: nowrap; display: block; }

  /* Acciones (⋮ o 🔒): fuera del grid, ancladas arriba a la derecha —
     nunca desplazan columnas, y el padding-right:44px reservado arriba
     (igual en .vexpress-grupo-header) es lo que mantiene el eje de montos
     perfectamente alineado entre el total del grupo y cada fila. */
  .vexpress-tabla-fila > .vexpress-fila-acciones-wrap,
  .vexpress-tabla-fila > .vexpress-col-acciones.vexpress-locked{
    position: absolute; right: 10px; top: 11px;
  }
  .vexpress-col-acciones{ width: 24px; height: 24px; }

  /* Fila "+ Agregar nuevo ingreso/egreso" — última fila natural del grupo.
     No usa la cuadrícula de 4 columnas (no tiene fecha/ícono/monto), así
     que vuelve a un simple flex centrado, sobrescribiendo el display:grid
     base de .vexpress-tabla-fila. */
  .vexpress-fila-agregar-trigger{
    display: flex !important; justify-content: center; align-items: center; padding: 12px 12px !important;
  }
  .vexpress-fila-agregar-texto{ font-size: 0.82rem; text-align: center; }

  /* Fila en edición / fila nueva: vuelven a un layout de columna simple
     apilado a lo ancho (no usan la cuadrícula de 4 columnas, son
     formularios) */
  .vexpress-tabla-fila.vexpress-fila-edicion,
  .vexpress-tabla-fila.vexpress-fila-nueva{
    display: flex !important; flex-direction: column !important; align-items: stretch !important;
    padding: 10px 12px !important;
  }
  .vexpress-tabla-fila.vexpress-fila-edicion > *,
  .vexpress-tabla-fila.vexpress-fila-nueva > *{ flex: 1 1 auto !important; margin-left: 0 !important; width: 100%; }

  /* 8), 9), 10), 11) Recurrentes MOBILE — SIN desplegable, siempre 2
     líneas fijas. Línea 1: fecha de pago (mismo formato que Movimientos,
     a la izquierda del ícono, igual que ahí) | ícono | subcategoría
     (crece) | monto | 🔔🗑 chicos — todo bloqueado en su columna. Línea 2:
     Pendiente/Pagado + "¿Cuánto falta?", centrados juntos y compactos.
     Ingresos y Egresos recurrentes comparten exactamente este layout. */
  .vexpress-recurrente-header{ display: none; }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple{
    display: grid !important;
    grid-template-columns: 30px 28px minmax(0, 1fr) minmax(56px, auto) auto !important;
    align-items: center;
    column-gap: 7px;
    padding: 11px 12px 6px !important;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > [data-vexpress-rec-campo="fecha"]{
    display: flex !important; flex-direction: column; align-items: center;
    font-size: 0.56rem; line-height: 1.2; opacity: 0.65; min-width: 28px;
  }
  /* OJO: había una regla vieja (@media max-width:780px, anterior a todo
     este trabajo) que pone display:none directo en .vexpress-recurrente-
     fecha (el span de ADENTRO, no el wrapper) — por eso nunca se veía
     aunque el wrapper sí estuviera visible. Se neutraliza acá mismo. */
  .vexpress-recurrente-fecha{ display: block !important; }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > .vexpress-cat-icono{
    width: 26px; height: 26px; font-size: 0.8rem;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > .vexpress-recurrente-nombre{
    min-width: 0; font-size: 0.8rem; font-weight: 700;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > [data-vexpress-rec-campo="monto"]{
    text-align: right; padding-left: 2px; min-width: 56px;
  }
  .vexpress-recurrente-monto{ font-size: 0.8rem; white-space: nowrap; display: inline !important; }
  /* 🔔 🗑 más chicos, a la derecha del monto */
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > .vexpress-recurrente-acciones{
    display: flex !important; align-items: center; gap: 2px; padding-left: 2px;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > .vexpress-recurrente-acciones .vexpress-recordatorio-btn,
  .vexpress-recurrente-fila.vexpress-recurrente-fila-simple > .vexpress-recurrente-acciones .vexpress-chip-btn-mini{
    width: 22px; height: 22px; font-size: 0.68rem; padding: 0; display: inline-flex; align-items: center; justify-content: center;
  }

  /* Línea 2 — SIEMPRE visible (no hay desplegable), centrada y compacta:
     Pendiente/Pagado + "¿Cuánto falta?" */
  .vexpress-recurrente-linea2{
    display: flex !important; align-items: center; justify-content: center;
    gap: 8px; padding: 0 12px 10px;
  }
  .vexpress-recurrente-linea2 .vexpress-switch{ flex-shrink: 0; padding: 4px 7px; }
  .vexpress-switch-texto{ font-size: 0.54rem; }
  .vexpress-recurrente-linea2 .vexpress-recurrente-cuantofalta{
    flex-shrink: 0; font-size: 0.62rem; opacity: 0.8; white-space: nowrap;
  }

  /* Edición de un recurrente (día de pago / monto): vuelve a un layout de
     columna simple apilado, igual que el editor de Movimientos — no usa
     la cuadrícula (son campos de formulario, no datos) */
  .vexpress-recurrente-fila.vexpress-recurrente-fila-edicion{
    display: flex !important; flex-direction: column !important; gap: 7px !important; padding: 12px !important;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-edicion > *{ width: 100%; }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-edicion .vexpress-edit-acciones{ justify-content: center !important; }
  /* Ícono + subcategoría centrados arriba del formulario */
  .vexpress-recurrente-fila.vexpress-recurrente-fila-edicion > .vexpress-cat-icono{
    width: 40px; height: 40px; font-size: 1.1rem; margin: 0 auto 2px;
  }
  .vexpress-recurrente-fila.vexpress-recurrente-fila-edicion > .vexpress-recurrente-nombre{
    text-align: center; font-size: 0.9rem; white-space: normal;
  }

  /* Fecha compacta "21 / SEP" en dos líneas (ver vexpressFechaCompacta en
     vista-express.js) — nada de "19-09-2026" partido en tres líneas */
  .vexpress-fecha-dia{ display: block; font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 0.78rem; color: var(--ink-dark); opacity: 1; line-height: 1.05; }
  .vexpress-fecha-mes{ display: block; font-size: 0.56rem; letter-spacing: 0.02em; text-transform: uppercase; margin-top: 1px; }

  /* 14) Resumen inferior (Ingresos/Egresos/Resultado): oculto en mobile
     porque repite el overview de arriba y solo agrega scroll — Desktop
     no se toca, sigue mostrándolo. */
  .vexpress-footer-totales{ display: none; }

  /* ===== Corrección — Ronda 2 ===== */

  /* 1) Mensual/Anual + Personal/Negocios comparten una sola fila */
  .vexpress-contexto-controles{ flex-direction: row; flex-wrap: wrap; }
  .vexpress-nivel-toggle, .vexpress-modo-toggle{ width: calc(50% - 3px); }
  .vexpress-periodo-bar{ flex-basis: 100%; }

  /* 2) Ledger: DETALLE (nota) es ahora el dato principal, con fallback a
     subcategoría y luego categoría; ícono con fallback subcategoría→
     categoría (ver vexpressFilaNormalHtml, rama mobile, clases
     .vexpress-mg-icono/.vexpress-mg-contenido más arriba). El tipo
     Ingreso/Egreso YA NO se renderiza en mobile — nada que ocultar acá,
     directamente no se genera. */
  /* 4) "+ Agregar nuevo ingreso/egreso" centrado */
  .vexpress-fila-agregar-trigger{ justify-content: center !important; text-align: center; }
  .vexpress-fila-agregar-texto{ text-align: center; }


  /* 5) Formulario de edición/alta inline: campos compactos y consistentes,
     valores centrados salvo Detalle (texto descriptivo, se deja a la
     izquierda vía style="text-align:left" en el propio input). Detalle
     además se muestra en NEGRITA cuando tiene contenido escrito. */
  .vexpress-edit-input{
    padding: 8px 8px; font-size: 0.82rem; text-align: center; border-radius: 8px; min-height: 38px; box-sizing: border-box;
  }
  #vexpressEditNota:not(:placeholder-shown), #vexpressNuevaNota:not(:placeholder-shown){ font-weight: 700; }
  .vexpress-fila-edicion, .vexpress-fila-nueva{ gap: 7px !important; padding: 12px !important; border-radius: 14px; }
  /* Ícono + categoría centrados arriba del formulario de Movimientos,
     mismo lenguaje visual que el editor de día/monto de Recurrentes */
  .vexpress-fila-edicion-header-movil{
    display: flex !important; flex-direction: column; align-items: center; gap: 2px; margin-bottom: 2px;
  }
  .vexpress-fila-edicion-header-movil .vexpress-cat-icono{ width: 40px; height: 40px; font-size: 1.1rem; }
  .vexpress-fila-edicion-header-movil .vexpress-recurrente-nombre{ font-size: 0.9rem; text-align: center; white-space: normal; }
  /* Recurrente y Guardar/Cancelar pertenecen a LA MISMA tarjeta (mismo
     fondo que el resto del formulario, sin cortes visuales), en ese orden
     — ver vexpressFilaEdicionHtml, que ahora los emite en esa secuencia */
  .vexpress-fila-edicion-recurrente-info{
    display: block; padding: 8px 10px; margin: 2px 0 0; background: rgba(28,50,71,0.05); border-radius: 8px;
  }
  .vexpress-fila-edicion-recurrente-info .vexpress-recurrente-linea-texto{ font-size: 0.7rem; }
  .vexpress-fila-edicion-nota{ border-radius: 8px; margin-top: 2px; }
  .vexpress-edit-acciones{ justify-content: center !important; margin-top: 2px; gap: 10px; }
  .vexpress-edit-guardar-btn, .vexpress-edit-cancelar-btn{ padding: 9px 20px; font-size: 0.78rem; }

  /* ===== F) Comparar meses — responsive mobile ===== */

  /* El modal ocupa el ancho disponible, con padding contenido — nada debe
     salirse de la tarjeta */
  .vexpress-form-modal.vexpress-comparar-modal{ width: auto; max-width: none; margin: 0 10px; padding: 16px 14px; }
  .vexpress-comparar-selector{ gap: 8px; padding: 8px 0 12px; flex-wrap: wrap; }
  .vexpress-comparar-mes-actual{ font-size: 0.86rem; padding: 5px 10px; }
  .vexpress-comparar-mes-select{ font-size: 0.86rem; padding: 5px 24px 5px 10px; }
  .vexpress-comparar-titulo{ font-size: 1.25rem; }
  #vexpressCompararMesB{ max-width: 100%; }

  /* 1) Resumen superior: cuadrícula sólida con columnas fijas para que los
     montos se vean COMPLETOS (nada de truncar con "…") — si no entran en
     el ancho del iPhone, el bloque completo (encabezado + filas, ya
     comparten el mismo contenedor) se desplaza horizontalmente. */
  .vexpress-comp-resumen-bloque{ overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .vexpress-comp-cabecera, .vexpress-comp-fila{
    grid-template-columns: 128px 92px 92px 100px !important; min-width: 412px;
  }
  .vexpress-comp-cabecera{ font-size: 0.56rem; padding: 5px 2px; }
  .vexpress-comp-label{ font-size: 0.72rem !important; text-align: left !important; padding-left: 4px; }
  .vexpress-comp-monto{ font-size: 0.74rem !important; white-space: nowrap; padding: 0 2px; }
  .vexpress-comp-diff{ font-size: 0.68rem !important; white-space: nowrap; padding: 2px 3px; }
  .vexpress-comp-mes-nombre{ font-size: 0.58rem; white-space: nowrap; }

  /* 2) "Por categoría": la primera columna (Categoría) queda sticky y el
     resto se desplaza horizontalmente — encabezado y filas viven en el
     MISMO contenedor de scroll (.vexpress-comp-cat-scroll), así que
     "SEPTIEMBRE 2026"/"AGOSTO 2026" viajan siempre junto con sus propias
     cifras, nunca se desalinean. */
  .vexpress-comp-subtitulo{ font-size: 0.86rem; margin: 14px 0 6px; flex-wrap: wrap; gap: 6px; }
  .vexpress-comp-tipo-toggle .vexpress-chip-btn{ font-size: 0.62rem; padding: 5px 8px; }
  .vexpress-comp-cat-scroll{ overflow-x: auto; -webkit-overflow-scrolling: touch; border: 1px solid rgba(28,50,71,0.08); border-radius: 8px; }
  .vexpress-comp-cat-scroll .vexpress-comp-cat-lista{ border: none; border-radius: 0; max-height: 240px; }
  .vexpress-comp-cat-cabecera, .vexpress-comp-fila-cat{
    grid-template-columns: 132px 78px 78px 84px !important; min-width: 372px;
  }
  .vexpress-comp-cat-cabecera{ font-size: 0.56rem; }
  .vexpress-comp-cat-nombre{ font-size: 0.72rem; }
  .vexpress-comp-fila-cat .vexpress-comp-monto{ font-size: 0.7rem !important; }
  .vexpress-comp-fila-cat .vexpress-comp-diff{ font-size: 0.62rem !important; }
  /* Columna Categoría fija (sticky) mientras el resto se desplaza */
  .vexpress-comp-cat-cabecera > span:first-child,
  .vexpress-comp-fila-cat > .vexpress-comp-cat-etiqueta{
    position: sticky; left: 0; z-index: 2; background: #EDECE4;
  }
  .vexpress-comp-fila-sub > .vexpress-comp-cat-etiqueta{ background: #F3F2EA; }
}

/* =========================================================================
   Pedido (30/09) — la identidad (ícono + nombre) pasa a tener su propio
   rectángulo con el mismo rojo/terracota del módulo "Control y Resumen" en
   el Dashboard (.module-card-lg.resumen-destacado en index.html:
   linear-gradient(155deg, #E4614A 0%, #C1503E 42%, #8A2E1E 100%), borde
   #D98A3E), para que resalte más que antes (antes era transparente sobre
   la franja dorada de #vexpressContextoOuter). Los controles de abajo
   (Mensual/Anual, Personal/Negocios/Espacio, selector de mes) NO se tocan,
   siguen en su franja clara de siempre.
   Especificidad: la regla que hoy deja este fondo en "none" es
   "#vexpressNegocioHeader .negocio-card" (ID + clase). Para ganarle sin
   !important en cascada rara, se usa acá el mismo peso (ID + clase) y se
   coloca DESPUÉS en el archivo, que es como ya se resuelven los otros
   empates de especificidad en este mismo archivo.
   ========================================================================= */
#vexpressNegocioHeader .vexpress-negocio-header-card{
  background: linear-gradient(155deg, #E4614A 0%, #C1503E 42%, #8A2E1E 100%) !important;
  border: 1.5px solid #D98A3E !important;
  border-radius: 14px !important;
  padding: 14px 20px !important;
  margin-bottom: 10px !important;
  box-shadow: 0 10px 22px -12px rgba(122,36,22,0.55), inset 0 1px 0 rgba(255,255,255,0.16);
}
#vexpressNegocioHeader .vexpress-negocio-header-nombre{ color: #FFF6EC !important; }
#vexpressNegocioHeader .vexpress-negocio-header-nombre:hover{ background: rgba(255,255,255,0.14) !important; }
#vexpressNegocioHeader .vexpress-negocio-header-input{ color: var(--ink-dark); }

/* Pedido (30/09, ronda 2) — con la flecha ▾ del recuadro rojo ya se puede
   cambiar de contexto, así que los chips Personal/Negocios/Espacio y sus
   <select> quedan redundantes en "Control" y se ocultan (no se borran del
   DOM: vexpressCambiarContextoDesdeHeaderMenu y vexpressWireEventos los
   siguen usando por dentro para mantener el estado sincronizado, solo que
   ya no se muestran). Solo se oculta acá (#vexpressContextoOuter), nunca
   los selectores gemelos de Resumen mensual/anual, que reutilizan las
   mismas clases pero viven en otro contenedor y no fueron parte de este
   pedido. Con esto fuera, quedan visibles solo Mensual/Anual y el
   selector de mes — el "justify-content:center" ya existente en
   .vexpress-contexto-controles los centra solo. */
#vexpressContextoOuter .vexpress-modo-toggle,
#vexpressContextoOuter .vexpress-negocio-select-wrap{ display: none !important; }

/* ---- Textos apilados (nombre + referencia chica de qué es) ---- */
.vexpress-negocio-header-textos{ display: flex; flex-direction: column; align-items: center; gap: 2px; min-width: 0; }
.vexpress-negocio-header-subtitulo{
  font-family: 'IBM Plex Mono', monospace; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.05em;
  color: rgba(255,246,236,0.72); font-weight: 600;
}

/* ---- Flecha ▾ para abrir el menú de "cambiar de negocio/espacio" ---- */
.vexpress-header-menu-btn{
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%; border: 1.5px solid rgba(255,255,255,0.4);
  background: rgba(255,255,255,0.14); color: #FFF6EC; font-size: 0.72rem; cursor: pointer;
  transition: background 0.15s ease, transform 0.15s ease; flex-shrink: 0;
}
.vexpress-header-menu-btn:hover{ background: rgba(255,255,255,0.26); }
.vexpress-header-menu-btn.abierto{ transform: rotate(180deg); }

/* ---- Panel flotante premium con las otras opciones (Personal/Negocios/Espacios) ---- */
.vexpress-header-menu-panel{
  position: fixed; z-index: 500; max-width: min(320px, calc(100vw - 24px));
  background: var(--pearl, #FBF8F0); border: 1.5px solid var(--gold); border-radius: 14px;
  box-shadow: 0 18px 40px -14px rgba(0,0,0,0.45); padding: 8px; max-height: 340px; overflow-y: auto;
}
.vexpress-header-menu-label{
  font-family: 'IBM Plex Mono', monospace; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.05em;
  color: rgba(20,24,29,0.5); padding: 8px 10px 4px;
}
.vexpress-header-menu-item{
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  border: none; background: none; border-radius: 9px; padding: 9px 10px; margin: 1px 0;
  font-family: 'Quicksand', sans-serif; font-weight: 700; font-size: 0.86rem; color: var(--ink-dark); cursor: pointer;
  transition: background 0.12s ease;
}
.vexpress-header-menu-item:hover{ background: rgba(192,138,40,0.14); }
.vexpress-header-menu-item.activo{ background: rgba(192,138,40,0.22); }
.vexpress-header-menu-item img{ width: 18px; height: 18px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }

/* =========================================================================
   Pedido (30/09, ronda 3) — "repite esto en Resumen mensual y Resumen
   anual": el mismo tratamiento rojo/terracota + flecha ▾ que ya tiene el
   recuadro de identidad de "Control" (arriba) se repite acá en sus
   selectores gemelos (#resumenMensualNegocioHeader / #resumenAnualNegocioHeader),
   que ya comparten las mismas clases .negocio-card/.vexpress-negocio-header-*
   por diseño (ver comentario en la regla de "background:none" más arriba).
   La flecha, el panel y su wiring se arman en index.html (actualizarIconoContextoResumen /
   resumenHeaderMenuAbrir), no acá — este archivo solo aporta el estilo
   compartido, igual que ya hace con #vexpressNegocioHeader.
   Los chips Personal/Negocios y el <select> de estos 2 selectores quedan
   redundantes por la misma razón que en Control, así que también se
   ocultan (scoped a sus propios contenedores, nunca a #vexpressContextoOuter). */
#resumenMensualNegocioHeader .vexpress-negocio-header-card,
#resumenAnualNegocioHeader .vexpress-negocio-header-card{
  background: linear-gradient(155deg, #E4614A 0%, #C1503E 42%, #8A2E1E 100%) !important;
  border: 1.5px solid #D98A3E !important;
  border-radius: 14px !important;
  padding: 14px 20px !important;
  margin-bottom: 10px !important;
  box-shadow: 0 10px 22px -12px rgba(122,36,22,0.55), inset 0 1px 0 rgba(255,255,255,0.16);
}
#resumenMensualNegocioHeader .vexpress-negocio-header-nombre,
#resumenAnualNegocioHeader .vexpress-negocio-header-nombre{ color: #FFF6EC !important; }
#resumenMensualNegocioHeader .vexpress-negocio-header-nombre:hover,
#resumenAnualNegocioHeader .vexpress-negocio-header-nombre:hover{ background: rgba(255,255,255,0.14) !important; }

#resumenMensualContextoOuter .vexpress-modo-toggle,
#resumenMensualContextoOuter .vexpress-negocio-select-wrap,
#resumenAnualContextoOuter .vexpress-modo-toggle,
#resumenAnualContextoOuter .vexpress-negocio-select-wrap{ display: none !important; }

/* =========================================================================
   CIERRE RECURRENTES (02/10) — Formulario propio "Nuevo Ingreso/Egreso
   Recurrente" (.vexpress-nrec-*) y mini-modal "Falta un dato" (.vexpress-crec-*).
   Solo clases NUEVAS: no modifica ninguna regla existente. Reutiliza la
   identidad actual (crema #EDECE4, dorado, Quicksand/IBM Plex, bordes
   redondeados) y el mismo badge circular R verde/rojo de Dinerius.
   ========================================================================= */
.vexpress-form-modal.vexpress-nrec-modal{ max-width: 470px; position: relative; padding: 22px 24px 20px; }
.vexpress-form-modal.vexpress-crec-modal{ max-width: 400px; position: relative; padding: 22px 24px 20px; }
.vexpress-nrec-cerrar{ position: absolute; top: 12px; right: 14px; font-size: 1.05rem; line-height: 1; padding: 4px; }
.vexpress-nrec-head{ display: flex; flex-direction: column; align-items: center; text-align: center; gap: 8px; margin: 2px 0 14px; }
.vexpress-nrec-badge{ width: 46px; height: 46px; font-size: 1.25rem; }
.vexpress-nrec-titulo{ font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 1.12rem; letter-spacing: 0.01em; color: var(--ink-dark); line-height: 1.2; }
.vexpress-nrec-modal.ingreso .vexpress-nrec-titulo{ color: #2E7D46; }
.vexpress-nrec-modal.egreso .vexpress-nrec-titulo{ color: #B23A28; }
.vexpress-nrec-sub{ margin: 0; max-width: 360px; font-family: 'IBM Plex Sans', sans-serif; font-size: 0.76rem; line-height: 1.4; color: var(--ink-dark); opacity: 0.62; }
.vexpress-nrec-contexto{ text-align: center; }
.vexpress-nrec-campo{ margin-bottom: 11px; min-width: 0; }
.vexpress-nrec-campo > label{
  display: block; font-family: 'IBM Plex Sans', sans-serif; font-size: 0.68rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-dark); opacity: 0.7; margin-bottom: 5px;
}
.vexpress-nrec-campo .vexpress-form-input{ min-height: 40px; transition: border-color 0.15s ease, box-shadow 0.15s ease; }
.vexpress-nrec-campo .vexpress-form-input:focus{ outline: none; border-color: var(--gold); box-shadow: 0 0 0 3px rgba(192,138,40,0.18); }
.vexpress-nrec-campo .vexpress-form-input:disabled{ opacity: 0.55; cursor: not-allowed; }
.vexpress-nrec-campo.con-error .vexpress-form-input{ border-color: var(--brick-dark); box-shadow: 0 0 0 3px rgba(143,54,38,0.12); }
.vexpress-nrec-error{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.7rem; font-weight: 600; color: var(--brick-dark); margin-top: 4px; }
.vexpress-nrec-error:empty{ display: none; }
.vexpress-nrec-ayuda{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.68rem; color: var(--ink-dark); opacity: 0.55; margin-top: 4px; }
.vexpress-nrec-cat-nueva{ margin-top: 6px; }
.vexpress-nrec-fila2{ display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.vexpress-nrec-frecuencia{ display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.vexpress-nrec-frecuencia-pill{
  font-family: 'Quicksand', sans-serif; font-weight: 800; font-size: 0.74rem; padding: 6px 14px; border-radius: 999px;
  background: rgba(192,138,40,0.16); border: 1px solid rgba(192,138,40,0.45); color: var(--gold-dark);
}
.vexpress-nrec-frecuencia-texto{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.74rem; color: var(--ink-dark); opacity: 0.65; }
.vexpress-nrec-separador{ height: 1px; background: rgba(192,138,40,0.28); margin: 4px 0 13px; }
.vexpress-nrec-botones{ display: flex; justify-content: flex-end; align-items: center; gap: 8px; margin-top: 6px; }
.vexpress-nrec-botones .vexpress-chip-btn{ min-height: 38px; padding: 8px 16px; font-size: 0.8rem; }
.vexpress-nrec-botones .vexpress-agregar-btn{ min-height: 38px; padding: 9px 20px; }
.vexpress-crec-recurrente{
  font-family: 'IBM Plex Sans', sans-serif; font-size: 0.78rem; font-weight: 700; color: var(--gold-dark);
  background: rgba(192,138,40,0.12); border-radius: 999px; padding: 5px 12px; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Mobile: ancho adaptativo, campos y botones cómodos, sin overflow
   horizontal; scroll vertical solo si la pantalla es baja (max-height). */
@media (max-width: 480px){
  .vexpress-form-modal.vexpress-nrec-modal,
  .vexpress-form-modal.vexpress-crec-modal{ max-width: 100%; padding: 18px 16px 16px; max-height: calc(100dvh - 24px); overflow-x: hidden; }
  .vexpress-nrec-head{ margin-bottom: 12px; }
  .vexpress-nrec-badge{ width: 40px; height: 40px; font-size: 1.1rem; }
  .vexpress-nrec-titulo{ font-size: 1.02rem; padding: 0 22px; }
  .vexpress-nrec-campo .vexpress-form-input{ font-size: 16px; min-height: 44px; } /* 16px evita el zoom automático de iOS */
  .vexpress-nrec-fila2{ grid-template-columns: 1fr; gap: 0; }
  .vexpress-nrec-botones{ gap: 10px; }
  .vexpress-nrec-botones .vexpress-chip-btn,
  .vexpress-nrec-botones .vexpress-agregar-btn{ flex: 1 1 0; min-height: 46px; font-size: 0.85rem; }
}

/* Lectura unificada (02/10): destello breve de la fila a la que se llegó
   desde Recurrentes y Programados ("Ir a Control"). Clase nueva, aditiva. */
.vexpress-recurrente-foco{ animation: vexpressRecFoco 2.4s ease-out 1; }
@keyframes vexpressRecFoco{
  0%, 35%{ background: rgba(192,138,40,0.28); box-shadow: inset 3px 0 0 var(--gold); }
  100%{ background: transparent; box-shadow: inset 3px 0 0 transparent; }
}

/* Doble tap (02/10): estado "procesando" del switch Pendiente/Pagado —
   bloqueado y con un pulso discreto mientras se guarda. Clase nueva. */
.vexpress-switch.vexpress-switch-procesando{ pointer-events: none; cursor: progress; }
.vexpress-switch.vexpress-switch-procesando .vexpress-switch-track{ animation: vexpressSwitchPulso 0.9s ease-in-out infinite; }
.vexpress-switch.vexpress-switch-procesando .vexpress-switch-texto{ opacity: 0.75; }
@keyframes vexpressSwitchPulso{ 0%, 100%{ opacity: 1; } 50%{ opacity: 0.45; } }

/* Cierre Beta 1.0 (02/10) — A1: selector real de frecuencia (clases nuevas).
   Mismo estilo de inputs de Dinerius; nada existente cambia. */
.vexpress-nrec-frecuencia-select{ width: auto; min-width: 128px; flex: 0 0 auto; }
.vexpress-recurrente-frecuencia-select{
  font-family: 'IBM Plex Sans', sans-serif; font-size: 0.74rem; padding: 3px 6px; border-radius: 6px;
  border: 1px solid rgba(28,50,71,0.2); background: #fff; color: var(--ink-dark);
}
.vexpress-recurrente-frecuencia-ayuda{ font-family: 'IBM Plex Sans', sans-serif; font-size: 0.72rem; color: var(--ink-dark); opacity: 0.65; }
@media (max-width: 480px){
  .vexpress-nrec-frecuencia-select{ min-width: 0; width: 100%; }
  .vexpress-recurrente-frecuencia-select{ font-size: 16px; }
}

/* Frecuencia en Control → Recurrentes (07/10) — SOLO DESKTOP. La "R" de la
   fila pasa a ser una etiqueta compacta "(R) Semanal / Mensual / Anual".
   Clases nuevas; en Mobile la etiqueta no se dibuja (esa fila usa su propio
   HTML) y además queda oculta por seguridad. */
@media (min-width: 781px){
  .vexpress-rec-frecuencia-tag{
    display: inline-flex; align-items: center; justify-content: flex-start; gap: 6px;
    justify-self: center; padding: 2px 10px 2px 2px; border-radius: 999px;
    background: rgba(192,138,40,0.10); border: 1px solid rgba(192,138,40,0.32);
    white-space: nowrap;
  }
  .vexpress-recurrente-fila > span.vexpress-rec-frecuencia-tag{ border-right: 1px solid rgba(192,138,40,0.32); padding-right: 10px; }
  .vexpress-rec-frecuencia-texto{
    font-family: 'Quicksand', sans-serif; font-weight: 700; font-size: 0.7rem;
    color: var(--gold-dark); letter-spacing: 0.01em;
  }
  .vexpress-recurrente-header > [data-col="r"]{ display: flex; align-items: center; justify-content: center; }
}
@media (max-width: 780px){
  .vexpress-rec-frecuencia-tag .vexpress-rec-frecuencia-texto{ display: none !important; }
}

/* Desktop: acciones de Recurrentes (🔔/🗑/↗) centradas en su columna y con
   margen derecho, para que no queden pegadas al borde de la tabla. */
@media (min-width: 781px){
  .vexpress-recurrente-fila > .vexpress-recurrente-acciones{ justify-content: center; padding-right: 10px; }
}

/* =====================================================================
   KAIZEN 15/10 — Control: columnas siempre alineadas
   La plantilla de columnas (vexpressGridTemplate) usa minmax(0, Nfr):
   el ancho lo define la estructura. Aquí, además, ninguna celda puede
   pedir más espacio que su columna.
   ===================================================================== */
.vexpress-tabla-header > *,
.vexpress-tabla-fila > *{ min-width: 0; }
.vexpress-tabla-fila > span{ overflow-wrap: anywhere; }
/* Las celdas editables tenían margin: -3px -6px (para el resaltado al pasar
   el mouse): eso corría su línea separadora 6px respecto del encabezado.
   Sin margen lateral, la celda ocupa exactamente su columna. */
.vexpress-tabla-fila > .vexpress-editable{ margin-left: 0; margin-right: 0; }
/* Filas dentro de un grupo: tenían un borde izquierdo invisible de 1px que
   corría toda la grilla 1px respecto del encabezado. */
.vexpress-grupo-filas{ border-left-width: 0; }
/* Encabezado de grupo (Ingresos / Egresos): la barra de color pasa a sombra
   interior, así no ocupa espacio y el total queda alineado con la columna Monto. */
.vexpress-grupo-ingreso .vexpress-grupo-header{ border-left-width: 0 !important; box-shadow: inset 4px 0 0 var(--success-dark); }
.vexpress-grupo-egreso .vexpress-grupo-header{ border-left-width: 0 !important; box-shadow: inset 4px 0 0 var(--brick-dark); }
.vexpress-tabla-fila > [data-vexpress-campo="cuenta"]{ overflow: hidden; }
.vexpress-col-cuenta{ display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
.vexpress-col-cuenta:has(.inst-logo), .vexpress-col-cuenta:has(.inst-efectivo){ display: inline-flex; max-width: 100%; min-width: 0; }
.vexpress-col-cuenta .inst-logo, .vexpress-col-cuenta .inst-efectivo{ flex-shrink: 0; }

/* =====================================================================
   KAIZEN 15/10 — Resumen mensual y anual: período dentro del banner
   ===================================================================== */
#resumenMensualContextoOuter, #resumenAnualContextoOuter{ overflow: visible; padding-bottom: 14px; }
.resumen-en-banner{ width: 100%; box-sizing: border-box; border-top: 1px solid rgba(192,138,40,0.28); padding-top: 12px; }
.resumen-mensual-header.resumen-en-banner{ margin: 0; padding-bottom: 0; border-bottom: none; gap: 8px; }
.resumen-en-banner .resumen-mensual-fecha{ font-size: 1.02rem; color: rgba(20,24,29,0.72); }
.resumen-periodo-nav{ display: flex; align-items: center; justify-content: center; gap: 10px; }
.resumen-periodo-flecha{
  width: 34px; height: 34px; border-radius: 50%; border: 1.5px solid rgba(192,138,40,0.45); background: #fff; cursor: pointer;
  font-size: 1.15rem; line-height: 1; color: var(--gold-dark, #8A6317); display: flex; align-items: center; justify-content: center; flex-shrink: 0;
  transition: background 0.15s ease, transform 0.1s ease;
}
.resumen-periodo-flecha:hover{ background: rgba(192,138,40,0.12); }
.resumen-periodo-flecha:active{ transform: scale(0.94); }
.resumen-periodo-flecha:focus-visible, .resumen-periodo-pill:focus-visible, .detalle-anual-anio-actual:focus-visible{ outline: 2px solid var(--gold-bright, #E4B54C); outline-offset: 2px; }
.resumen-en-banner .resumen-periodo-pill{ min-width: 200px; justify-content: center; font-size: 0.92rem; letter-spacing: 0.04em; }
.resumen-en-banner .resumen-periodo-dropdown{ left: 50%; right: auto; transform: translateX(-50%); width: 280px; max-height: none; }
.resumen-periodo-anio-nav{ display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; font-family: 'DM Serif Display', serif; font-size: 1.1rem; color: var(--ink-dark, #14181D); }
.resumen-periodo-anio-flecha{ width: 30px; height: 30px; border-radius: 50%; border: 1px solid rgba(192,138,40,0.4); background: #fff; cursor: pointer; color: var(--gold-dark, #8A6317); font-size: 1rem; }
.resumen-periodo-anio-flecha:hover{ background: rgba(192,138,40,0.12); }
.resumen-en-banner .resumen-periodo-dropdown-list, .resumen-anio-grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.resumen-en-banner .resumen-periodo-mes-btn, .resumen-anio-grid .resumen-periodo-mes-btn{ text-align: center; padding: 9px 4px; border: 1px solid transparent; }
.resumen-periodo-mes-btn.hoy:not(.active){ border: 1px dashed rgba(192,138,40,0.6); }
/* Resumen anual */
.detalle-anual-anio-nav.resumen-en-banner{ margin: 0; }
.resumen-en-banner .detalle-anual-anio-actual{ cursor: pointer; line-height: 1.1; transition: border-color 0.15s ease; }
.resumen-en-banner .detalle-anual-anio-actual:hover{ border-color: var(--gold, #C08A28); }
.resumen-anio-dropdown{ width: 230px !important; }
@media (max-width: 760px){
  .resumen-en-banner{ padding-top: 10px; }
  .resumen-en-banner .resumen-periodo-pill{ min-width: 0; padding: 9px 14px; font-size: 0.86rem; }
  .resumen-periodo-nav{ gap: 8px; }
  .resumen-periodo-flecha{ width: 38px; height: 38px; }
  .resumen-en-banner .resumen-mensual-fecha{ font-size: 0.92rem; text-align: center; }
  .resumen-en-banner .resumen-periodo-dropdown{ width: min(280px, calc(100vw - 48px)); }
}
#resumenMensualContextoOuter, #resumenAnualContextoOuter{ margin-bottom: 18px; }
@media (max-width: 760px){
  #resumenMensualContextoOuter, #resumenAnualContextoOuter{ margin-bottom: 14px; }
}

/* ===== Títulos de columna debajo de cada grupo (15/10) =====
   Copia de la barra de títulos al inicio de cada grupo abierto; un poco
   más compacta y suave que la de arriba. Se apaga en Mostrar/ocultar
   Columnas → "Títulos de columna en cada grupo". */
.vexpress-tabla-header.vexpress-tabla-header-grupo{
  font-size: 0.7rem !important;
  padding-top: 2px;
  padding-bottom: 2px;
  background: linear-gradient(180deg, rgba(192,138,40,0.16), rgba(192,138,40,0.05)) !important;
  border-bottom: 1px solid rgba(192,138,40,0.28) !important;
}
.vexpress-dropdown-sep{ height: 1px; margin: 6px 0; background: rgba(192,138,40,0.25); }
/* Recurrentes: misma barra de títulos debajo de cada grupo (16/10) */
.vexpress-recurrente-header.vexpress-recurrente-header-grupo{
  padding-top: 2px; padding-bottom: 2px;
  background: linear-gradient(180deg, rgba(192,138,40,0.16), rgba(192,138,40,0.05)) !important;
  border-bottom: 1px solid rgba(192,138,40,0.28) !important;
}
/* Con la barra pegada a las filas se nota cualquier corrimiento: las celdas
   editables de Recurrentes (nombre, fecha, monto) ya no se salen 6px de su
   columna, así su línea vertical coincide con la del título (igual que se
   hizo en Movimientos). Solo Desktop. */
@media (min-width: 781px){
  .vexpress-recurrente-fila > .vexpress-editable{ margin-left: 0; margin-right: 0; }
}
/* Recurrentes (16/10): Fecha de pago y Monto siempre centrados bajo su
   título, y Nombre siempre con la misma sangría — sea la fila editable o
   de suscripción (antes las de suscripción quedaban a la izquierda). */
@media (min-width: 781px){
  .vexpress-recurrente-fila:not(.vexpress-recurrente-fila-simple) > .vexpress-rec-col{ padding-left: 6px; padding-right: 6px; box-sizing: border-box; min-width: 0; }
  .vexpress-recurrente-fila:not(.vexpress-recurrente-fila-simple) > .vexpress-rec-col-fecha,
  .vexpress-recurrente-fila:not(.vexpress-recurrente-fila-simple) > .vexpress-rec-col-monto{ display: flex; align-items: center; justify-content: center; text-align: center; }
  .vexpress-recurrente-fila:not(.vexpress-recurrente-fila-simple) > .vexpress-rec-col-nombre{ display: flex; align-items: center; justify-content: flex-start; text-align: left; }
}

/* v39: ahorro bajo el Resultado — el ahorro no es gasto */
.vexpress-total-ahorro{
  font-family:'Manrope', 'Quicksand', sans-serif; font-size: 0.72rem; font-weight: 700;
  color: #3F7A52; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.vexpress-kpi-detalle-ahorro{ border-top: 1px dashed rgba(63,122,82,0.35); margin-top: 6px; padding-top: 6px; }
.vexpress-kpi-detalle-ahorro .vexpress-kpi-detalle-monto{ color: #3F7A52; }
.vexpress-kpi-detalle-ahorro-nota{ font-family:'Manrope', 'Quicksand', sans-serif; font-size: 0.72rem; line-height: 1.4; color: rgba(20,24,29,0.65); margin-top: 4px; }
.vexpress-kpi-detalle-ahorro-link{ background:none; border:none; padding:0; margin-top:6px; font-family:'Manrope','Quicksand',sans-serif; font-size:0.76rem; font-weight:800; color:#8A6317; cursor:pointer; }
.vexpress-kpi-detalle-ahorro-link:hover{ text-decoration: underline; }
