/* ============================================================
   ExpoDestinos 360° — Admin Dashboard (Leads Web)
   ============================================================ */

:root,
[data-theme="light"] {
  color-scheme: light;

  /* Tipografía Global - Regla Fija */
  --font-family-main: "Montserrat", sans-serif;

  /* Pesos */
  --fw-normal: 400;
  --fw-medium: 500;
  --fw-semibold: 600;
  --fw-bold: 700;

  /* Escala de Tamaños */
  --fs-micro: 10px;
  --fs-xs: 12px;
  --fs-sm: 14px;
  --fs-lg: 20px;
  /* Peldaño para el título de cada sección. Se añadió en vez de subir --fs-lg
     porque esa variable también gobierna iconos (p. ej. la X de los modales),
     que no debían crecer. */
  --fs-xl: 22px;

  /* Superficies y Fondos */
  --bg-page: #f7f4ec;
  --bg-surface: #fffdf9;
  --bg-surface-secondary: #f8fafc;
  --bg-input: #ffffff;
  --bg-hover: #f1f5f9;
  --bg-selected: #eff6ff;
  
  /* Navbar y Sidebar (Se mantienen oscuros por diseño original, pero podemos mapearlos semánticamente) */
  --bg-sidebar: #07111F;
  --theme-sidebar-text: #F7F1E7;

  /* Textos */
  --text-primary: #0f172a;
  --text-secondary: #475569;
  --text-muted: #64748b;
  --text-placeholder: #64748b;
  --text-disabled: #94a3b8;
  --text-on-primary: #ffffff;

  /* Bordes y Foco */
  --border-default: #d8d5cc;
  --border-strong: #94a3b8;
  --border-focus: #2563eb;

  /* Colores de Estado / Semánticos */
  --color-primary: #2563eb;
  --color-primary-hover: #1d4ed8;
  --color-success: #15803d;
  --color-success-bg: rgba(21, 128, 61, 0.15);
  --color-danger: #dc2626;
  --color-danger-bg: rgba(220, 38, 38, 0.15);
  --color-warning: #b45309;
  --color-warning-bg: rgba(180, 83, 9, 0.15);
  --color-info: #2563eb;
  --color-info-bg: rgba(37, 99, 235, 0.15);

  --focus-ring: rgba(37, 99, 235, 0.35);
  --overlay-backdrop: rgba(15, 23, 42, 0.55);
  
  /* Legacy compatibility (to be removed gradually) */
  --bg-body: var(--bg-page);
  --bg-card: var(--bg-surface);
  --text-main: var(--text-primary);
  --border-light: var(--border-default);
  
  /* Radius & Shadows */
  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 16px;
  --shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
  --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1);
  --shadow-lg: 0 10px 25px -5px rgba(0,0,0,0.1);
}

[data-theme="dark"] {
  color-scheme: dark;

  /* Superficies y Fondos */
  --bg-page: #0f172a;
  --bg-surface: #1e293b;
  --bg-surface-secondary: #243147;
  --bg-input: #171f2c;
  --bg-hover: #2b3950;
  --bg-selected: #20395f;
  
  --bg-sidebar: #050b14;
  --theme-sidebar-text: #f8fafc;

  /* Textos */
  --text-primary: #f8fafc;
  --text-secondary: #cbd5e1;
  --text-muted: #94a3b8;
  --text-placeholder: #94a3b8;
  --text-disabled: #64748b;
  --text-on-primary: #ffffff;

  /* Bordes y Foco */
  --border-default: #3e4b61;
  --border-strong: #64748b;
  --border-focus: #60a5fa;

  /* Colores de Estado / Semánticos */
  --color-primary: #3b82f6;
  --color-primary-hover: #60a5fa;
  --color-success: #22c55e;
  --color-success-bg: rgba(34, 197, 94, 0.15);
  --color-danger: #f87171;
  --color-danger-bg: rgba(248, 113, 113, 0.15);
  --color-warning: #fbbf24;
  --color-warning-bg: rgba(251, 191, 36, 0.15);
  --color-info: #60a5fa;
  --color-info-bg: rgba(96, 165, 250, 0.15);

  --focus-ring: rgba(96, 165, 250, 0.40);
  --overlay-backdrop: rgba(0, 0, 0, 0.65);
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html, body, button, input, select, textarea {
  font-family: var(--font-family-main);
  color: var(--text-main);
  background-color: var(--bg-body);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3 { font-weight: var(--fw-bold); color: var(--text-primary); }
a { text-decoration: none; color: inherit; }
button { font-family: inherit; cursor: pointer; border: none; }

/* ── Buttons ───────────────────────────────────────── */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
  font-size: var(--fs-xs);
  font-weight: var(--fw-semibold);
  border-radius: 8px;
  transition: all 0.2s ease;
}
.btn:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 2px;
}
.btn-primary { background-color: var(--color-primary); color: var(--text-on-primary); border: 1px solid var(--color-primary); }
.btn-primary:hover { background-color: var(--color-primary-hover); }
.btn-success { background-color: var(--color-success); color: var(--text-on-primary); }
.btn-success:hover { filter: brightness(0.9); }
.btn-danger { background-color: var(--color-danger); color: var(--text-on-primary); }
.btn-danger:hover { filter: brightness(0.9); }
.btn-outline { background-color: transparent !important; border: 1px solid var(--border-default) !important; color: var(--text-primary) !important; }
.btn-outline:hover { background-color: var(--bg-surface-secondary) !important; color: var(--text-primary) !important; border-color: var(--border-strong) !important; }

/* ── Login ─────────────────────────────────────────── */
/* 🔒 Login 🔒 */
.login-body {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  position: relative;
  overflow-x: hidden;
  margin: 0;

  background:
    radial-gradient(
        circle at 50% 48%,
        rgba(42, 111, 255, 0.42) 0%,
        rgba(20, 67, 150, 0.24) 27%,
        transparent 52%
    ),
    radial-gradient(
        circle at 12% 50%,
        rgba(24, 82, 190, 0.15) 0%,
        transparent 34%
    ),
    radial-gradient(
        circle at 88% 28%,
        rgba(25, 79, 175, 0.13) 0%,
        transparent 30%
    ),
    linear-gradient(
        135deg,
        #020713 0%,
        #07182f 48%,
        #020916 100%
    );
  background-attachment: fixed;
}

/* LÍNEAS TOPOGRÁFICAS Y PUNTOS LUMINOSOS */
.login-body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 0;
    pointer-events: none;
    background-image: url("data:image/svg+xml,%3Csvg width='1600' height='900' viewBox='0 0 1600 900' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' stroke='%233478e8' stroke-width='1.2' stroke-opacity='.20'%3E%3Cpath d='M-150 590C10 360 190 370 270 510S460 690 610 515 920 320 1100 470 1420 620 1680 360'/%3E%3Cpath d='M-150 640C20 400 210 420 300 555S490 710 640 545 930 360 1120 500 1440 640 1680 400'/%3E%3Cpath d='M-150 690C30 445 225 470 320 600S510 735 665 575 955 400 1140 530 1450 665 1680 440'/%3E%3Cpath d='M1050 -120C900 30 925 180 1060 240S1240 380 1165 520 1200 760 1430 820'/%3E%3Cpath d='M1120 -130C960 40 990 200 1125 260S1300 410 1230 545 1280 760 1500 850'/%3E%3C/g%3E%3Cg fill='%233b82f6' fill-opacity='.8'%3E%3Ccircle cx='85' cy='300' r='3'/%3E%3Ccircle cx='180' cy='405' r='2.5'/%3E%3Ccircle cx='285' cy='575' r='3'/%3E%3Ccircle cx='410' cy='620' r='2.4'/%3E%3Ccircle cx='1250' cy='145' r='2.7'/%3E%3Ccircle cx='1370' cy='245' r='3'/%3E%3Ccircle cx='1465' cy='365' r='2.5'/%3E%3Ccircle cx='1530' cy='520' r='3'/%3E%3C/g%3E%3C/svg%3E");
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    opacity: 0.85;
}

/* OSCURECIMIENTO SUAVE EN LOS BORDES */
.login-body::after {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 0;
    pointer-events: none;
    background: radial-gradient(
        circle at center,
        transparent 32%,
        rgba(0, 3, 12, 0.28) 70%,
        rgba(0, 2, 8, 0.58) 100%
    );
}

.login-container {
  position: relative;
  z-index: 1;
  background-color: rgba(15, 23, 42, 0.6);
  backdrop-filter: blur(15px);
  -webkit-backdrop-filter: blur(15px);
  border: 1px solid rgba(255, 255, 255, 0.1);
  width: 100%;
  max-width: 420px;
  padding: 2.5rem;
  border-radius: var(--radius-lg);
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
  text-align: center;
}
.login-logo {
  width: 140px;
  height: 140px;
  margin: 0 auto 1.5rem;
  border-radius: 50%;
  object-fit: contain;
  background-color: var(--bg-body);
  padding: 12px;
  box-shadow: 0 0 15px rgba(59, 130, 246, 0.2);
  border: 1px solid rgba(255, 255, 255, 0.1);
  display: block;
}
.login-header h1 { font-size: var(--fs-lg); margin-bottom: 0.25rem; }
.login-header p { color: var(--text-muted); font-size: var(--fs-sm); margin-bottom: 2rem; }
.login-error {
  background-color: rgba(239, 68, 68, 0.15);
  color: #f87171;
  border: 1px solid rgba(239, 68, 68, 0.35);
  padding: 0.75rem 1rem;
  border-radius: 8px;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  margin-bottom: 1.25rem;
  text-align: center;
}
.form-group { margin-bottom: 1.25rem; text-align: left; }
.form-group label { display: block; font-size: var(--fs-sm); font-weight: var(--fw-semibold); margin-bottom: 0.5rem; }
.form-group input {
  width: 100%;
  padding: 0.75rem 1rem;
  background-color: var(--bg-input);
  color: var(--text-main);
  border: 1px solid var(--border-light);
  border-radius: 8px;
  font-size: var(--fs-lg);
  transition: border-color 0.2s;
}
.form-group input:focus { outline: none; border-color: var(--color-blue); box-shadow: 0 0 0 3px rgba(14,165,233,0.1); }

.password-wrapper {
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
}

.password-wrapper input {
  padding-right: 42px !important;
}

.toggle-password-btn {
  position: absolute;
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
  background: transparent;
  border: none;
  color: var(--text-muted);
  font-size: 1.1rem;
  cursor: pointer;
  padding: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color 0.2s ease, transform 0.15s ease;
  outline: none;
  z-index: 10;
}

.toggle-password-btn:hover {
  color: var(--color-accent);
  transform: translateY(-50%) scale(1.1);
}

.caps-warning {
  color: #f59e0b;
  font-size: 0.78rem;
  font-weight: 500;
  margin-top: 6px;
  display: flex;
  align-items: center;
  gap: 6px;
}

.login-form .btn-primary { width: 100%; margin-top: 1rem; }

/* ── Dashboard Layout (App Shell) ───────────────────────── */
.app-layout {
  display: flex;
  height: 100vh;
  width: 100%;
  overflow: hidden;
  background-color: var(--bg-body);
}

/* ── Sidebar ───────────────────────────────────────── */
.sidebar {
  width: 260px;
  min-width: 260px;
  background-color: var(--bg-sidebar);
  display: flex;
  flex-direction: column;
  border-right: 1px solid var(--border-light);
  z-index: 10;
  transition: margin-left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.app-layout.sidebar-collapsed .sidebar {
  margin-left: -260px;
}

/* Pestañita Azul Flotante (Sidebar Toggle Tab) */
.sidebar-toggle-tab {
  position: fixed;
  left: 260px;
  top: 50%;
  transform: translateY(-50%);
  z-index: 999;
  background-color: #2563eb;
  color: #ffffff;
  border: none;
  border-radius: 0 10px 10px 0;
  width: 26px;
  height: 52px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 3px 0 10px rgba(0, 0, 0, 0.25);
  transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s ease, width 0.2s ease;
}

.sidebar-toggle-tab:hover {
  background-color: #1d4ed8;
  width: 30px;
}

.app-layout.sidebar-collapsed .sidebar-toggle-tab {
  left: 0;
}

.sidebar-toggle-tab i {
  transition: transform 0.3s ease;
  font-size: 0.85rem;
}

.app-layout.sidebar-collapsed .sidebar-toggle-tab i {
  transform: rotate(180deg);
}

.sidebar-header {
  padding: 1.5rem 1rem 1.5rem 0.85rem;
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.sidebar-logo {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  object-fit: cover;
}

.sidebar-brand {
  display: flex;
  flex-direction: column;
}

.brand-title {
  color: #fff;
  font-weight: 800;
  font-size: var(--fs-lg);
  letter-spacing: 0.5px;
}

.brand-subtitle {
  color: var(--color-accent);
  font-weight: var(--fw-bold);
  font-size: var(--fs-sm);
}

.sidebar-nav {
  padding: 1rem 0;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  flex: 1;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.85rem 1.5rem;
  color: var(--text-muted);
  font-weight: var(--fw-medium);
  transition: all 0.2s;
}

.nav-item:hover {
  color: #fff;
  background-color: rgba(255, 255, 255, 0.05);
}

.nav-item.active {
  color: #fff;
  background-color: var(--color-primary);
  border-radius: 0 20px 20px 0;
  margin-right: 1rem;
}

.sidebar-illustration {
  position: relative;
  margin-top: auto;
  padding: 2rem 1.5rem;
  text-align: left;
  font-size: var(--fs-micro);
  font-weight: var(--fw-semibold);
  line-height: 1.4;
}

.illust-img {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  opacity: 0.5;
  z-index: 0;
  pointer-events: none;
}

.illust-text {
  position: relative;
  z-index: 1;
}

.text-highlight { color: #f59e0b; }
.text-orange { color: #ea580c; }
.text-yellow { color: #eab308; }
.text-purple { color: #8b5cf6; }
.text-blue { color: #3b82f6; }
.text-accent { color: var(--color-accent); }

/* ── Main Wrapper ──────────────────────────────────── */
.main-wrapper {
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background-color: var(--bg-body);
}

/* ── Topbar ────────────────────────────────────────── */
.topbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.25rem 2rem;
  border-bottom: 1px solid var(--border-light);
}

.search-container {
  position: relative;
  width: 400px;
}

.search-icon {
  position: absolute;
  left: 1rem;
  top: 50%;
  transform: translateY(-50%);
  color: var(--text-muted);
}

.search-input {
  width: 100%;
  background-color: var(--bg-input);
  border: 1px solid var(--border-light);
  color: var(--text-main);
  padding: 0.75rem 1rem 0.75rem 3rem;
  border-radius: 20px;
  font-size: var(--fs-sm);
}

.search-input:focus {
  outline: none;
  border-color: var(--border-focus);
}

.search-shortcut {
  position: absolute;
  right: 1rem;
  top: 50%;
  transform: translateY(-50%);
  background-color: var(--bg-hover);
  color: var(--text-muted);
  font-size: var(--fs-micro);
  padding: 0.2rem 0.4rem;
  border-radius: 4px;
}

.topbar-actions {
  display: flex;
  align-items: center;
  gap: 1.5rem;
}

.notify-btn {
  position: relative;
  background: none;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  transition: color 0.2s;
}

.notify-btn:hover { color: #fff; }

.notify-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  background-color: var(--color-danger);
  color: #fff;
  font-size: var(--fs-micro);
  font-weight: var(--fw-bold);
  width: 16px;
  height: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
}

.user-profile {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  cursor: pointer;
}

.user-avatar {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  object-fit: cover;
}

.user-name {
  color: #fff;
  font-weight: var(--fw-semibold);
  font-size: var(--fs-sm);
}

.chevron-down {
  color: var(--text-muted);
}

/* ── Content Area ──────────────────────────────────── */
.dashboard-content {
  flex: 1;
  overflow-y: auto;
  padding: 2rem;
}

/* ── Stats ─────────────────────────────────────────── */
.stats-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem;
  margin-bottom: 2rem;
}

.stat-card {
  background-color: var(--bg-card);
  border-radius: var(--radius-lg);
  padding: 1.25rem;
  display: flex;
  align-items: center;
  gap: 1rem;
  border: 1px solid var(--border-light);
  box-shadow: var(--shadow-md);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.stat-card:hover {
  transform: translateY(-3px);
  box-shadow: var(--shadow-lg);
}

.stat-icon {
  width: 54px;
  height: 54px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.icon-blue { background-color: var(--color-info-bg); color: var(--color-info); }
.icon-cyan { background-color: rgba(6, 182, 212, 0.15); color: #06b6d4; }
.icon-green { background-color: var(--color-success-bg); color: var(--color-success); }
.icon-orange { background-color: var(--color-warning-bg); color: var(--color-warning); }
.icon-yellow { background-color: rgba(234, 179, 8, 0.15); color: #eab308; }

.stat-info {
  display: flex;
  flex-direction: column;
}

.stat-label {
  color: var(--text-muted);
  font-size: var(--fs-xs);
  font-weight: var(--fw-semibold);
  text-transform: uppercase;
}

.stat-value {
  color: #fff;
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
  line-height: 1.2;
}

.stat-sub {
  color: var(--text-muted);
  font-size: var(--fs-micro);
}

/* ── Table Section ─────────────────────────────────── */
.table-section {
  background-color: var(--bg-card);
  border-radius: var(--radius-lg);
  border: 1px solid var(--border-light);
  box-shadow: var(--shadow-md);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.table-header-block {
  padding: 1.5rem 1.5rem 0 1.5rem;
  border-bottom: 1px solid var(--border-light);
}

.th-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1.5rem;
}

.th-top h2 {
  color: #fff;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: var(--fs-lg);
}

.th-actions {
  display: flex;
  gap: 0.75rem;
}

.table-search-bar {
  position: relative;
  margin-bottom: 1rem;
}

.table-search-bar svg {
  position: absolute;
  left: 1rem;
  top: 50%;
  transform: translateY(-50%);
  color: var(--text-muted);
}

.table-search-bar input {
  width: 100%;
  background-color: var(--bg-body);
  border: 1px solid var(--border-light);
  padding: 0.75rem 1rem 0.75rem 2.5rem;
  border-radius: 8px;
  color: #fff;
}

.table-search-bar input:focus {
  outline: none;
  border-color: var(--color-primary);
}

.table-filters-row {
  display: flex;
  justify-content: space-between;
  margin-bottom: 1rem;
}

.filter-group {
  display: flex;
  gap: 0.5rem;
}

.filter-btn {
  background-color: transparent;
  border: 1px solid var(--border-light);
  color: var(--text-muted);
  padding: 0.4rem 1rem;
  border-radius: 20px;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  transition: all 0.2s;
}

.filter-btn:hover {
  background-color: var(--bg-hover);
  color: #fff;
}

.filter-btn.active {
  background-color: var(--color-primary);
  color: #fff;
  border-color: var(--color-primary);
}

.filter-select select {
  background-color: transparent;
  color: var(--text-muted);
  border: 1px solid var(--border-light);
  padding: 0.4rem 2rem 0.4rem 1rem;
  border-radius: 20px;
  appearance: none;
  cursor: pointer;
}

/* ── Compact Table ─────────────────────────────────── */
.table-container {
  overflow-x: auto;
}

.data-table {
  width: 100%;
  border-collapse: collapse;
  text-align: left;
}

.data-table th {
  background-color: var(--bg-hover);
  color: var(--text-muted);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-xs);
  text-transform: uppercase;
  padding: 1rem 1.5rem;
}

.data-table td {
  padding: 1rem 1.5rem;
  border-bottom: 1px solid var(--border-light);
  color: #fff;
  font-size: var(--fs-sm);
}

.data-table tbody tr {
  transition: background-color 0.2s;
}

.data-table tbody tr:hover {
  background-color: rgba(255, 255, 255, 0.02);
}

/* Specific Columns Styling */
.client-cell {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.client-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  object-fit: cover;
}

.client-name {
  font-weight: var(--fw-semibold);
}

.company-name {
  color: var(--text-muted);
  font-size: var(--fs-sm);
}

/* ── Badges ────────────────────────────────────────── */
.badge {
  display: inline-block;
  padding: 0.25rem 0.75rem;
  border-radius: 20px;
  font-size: var(--fs-micro);
  font-weight: var(--fw-semibold);
}

.badge-outline {
  border: 1px solid currentColor;
  background-color: transparent;
}

.badge-filled {
  color: #fff;
}

/* Existing badge classes adapted for Dark Theme */
.badge-principal { border-color: var(--color-info); color: var(--color-info); }
.badge-congreso { border-color: var(--color-success); color: var(--color-success); }
.badge-antigua { border-color: var(--color-warning); color: var(--color-warning); }

/* ── Action Buttons ────────────────────────────────── */
.actions-cell {
  display: flex;
  gap: 0.5rem;
}

.action-btn {
  background-color: transparent;
  color: var(--text-muted);
  border: 1px solid var(--border-light);
  width: 32px;
  height: 32px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s;
  cursor: pointer;
}

.action-btn:hover {
  color: #fff;
  background-color: var(--bg-hover);
  border-color: #fff;
}

.table-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 1.5rem;
  border-top: 1px solid var(--border-light);
}

.pagination-info {
  color: var(--text-muted);
  font-size: var(--fs-sm);
}

.pagination-controls {
  display: flex;
  gap: 0.25rem;
}

.page-btn {
  background-color: var(--bg-body);
  border: 1px solid var(--border-light);
  color: var(--text-muted);
  width: 32px;
  height: 32px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-sm);
}

.page-btn:hover {
  background-color: var(--bg-hover);
  color: #fff;
}

.page-btn.active {
  background-color: var(--color-primary);
  color: #fff;
  border-color: var(--color-primary);
}

.page-size-select select {
  background-color: transparent;
  color: var(--text-muted);
  border: none;
  font-size: var(--fs-sm);
  cursor: pointer;
}

/* ── Right Panel (Details & Users) ─────────────────── */
.toggle-rp-btn {
  position: fixed;
  right: 340px;
  top: 50%;
  transform: translateY(-50%);
  background-color: var(--color-primary);
  color: #fff;
  border-radius: 8px 0 0 8px;
  padding: 12px 6px;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: right 0.3s ease;
  box-shadow: -2px 0 10px rgba(0,0,0,0.5);
}
.toggle-rp-btn.collapsed {
  right: 0;
}
.toggle-rp-btn svg {
  transition: transform 0.3s ease;
}
.toggle-rp-btn.collapsed svg {
  transform: rotate(180deg);
}

.right-panel {
  width: 340px;
  min-width: 340px;
  max-width: 340px;
  background-color: var(--bg-card);
  border-left: 1px solid var(--border-light);
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  transition: all 0.3s ease;
}
.right-panel.collapsed {
  width: 0;
  min-width: 0;
  max-width: 0;
  border-left: none;
  overflow: hidden;
  padding: 0;
}

.right-panel-section {
  padding: 1.5rem;
  border-bottom: 1px solid var(--border-light);
}

.right-panel-section.is-hidden {
  display: none;
}

.rp-header {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  color: #fff;
  margin-bottom: 1.5rem;
}

.rp-header h3 {
  font-size: var(--fs-lg);
  flex: 1;
}

.close-rp {
  background: none;
  color: var(--text-muted);
  cursor: pointer;
}

.close-rp:hover { color: #fff; }

.client-profile {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-bottom: 1.5rem;
}

.cp-avatar {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  object-fit: cover;
}

.cp-info h4 {
  color: #fff;
  font-size: var(--fs-lg);
  margin-bottom: 0.25rem;
}

.cp-company {
  color: var(--text-muted);
  font-size: var(--fs-sm);
  display: block;
  margin-bottom: 0.25rem;
}

.cp-contact {
  color: var(--text-muted);
  font-size: var(--fs-xs);
  display: flex;
  align-items: center;
  gap: 0.25rem;
  margin-bottom: 0.25rem;
}

.cp-contact svg { color: var(--color-success); }

.rp-details {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  margin-bottom: 1.5rem;
}

.rp-details-row {
  display: flex;
  justify-content: space-between;
  border-bottom: 1px solid var(--border-light);
  padding-bottom: 0.5rem;
}

.rp-details-label {
  color: var(--text-muted);
  font-size: var(--fs-sm);
}

.rp-details-value {
  color: #fff;
  font-size: var(--fs-sm);
  font-weight: var(--fw-medium);
  text-align: right;
}

.rp-details-value.highlight {
  color: var(--color-info);
}

.rp-actions {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.rp-btn-row {
  display: flex;
  gap: 0.5rem;
}

.btn-outline-dark {
  flex: 1;
  background-color: transparent;
  border: 1px solid var(--border-light);
  color: #fff;
  font-size: var(--fs-sm);
  padding: 0.5rem;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
}

.btn-outline-dark:hover {
  background-color: var(--bg-hover);
}

.btn-primary-full {
  background-color: transparent;
  border: 1px solid var(--border-light);
  color: #fff;
  width: 100%;
  padding: 0.75rem;
  border-radius: 8px;
  font-weight: var(--fw-semibold);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  transition: all 0.2s;
}

.btn-primary-full:hover {
  background-color: var(--bg-hover);
}

.btn-create-user {
  background-color: rgba(59, 130, 246, 0.1);
  color: var(--color-info);
  border: none;
  border-radius: 20px;
  padding: 0.3rem 0.75rem;
  font-size: var(--fs-micro);
  font-weight: var(--fw-semibold);
  display: flex;
  align-items: center;
  gap: 0.25rem;
}

.users-list {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.user-item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.user-item img {
  width: 32px;
  height: 32px;
  border-radius: 50%;
}

.ui-info {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.ui-name {
  color: #fff;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
}

.ui-role {
  font-size: var(--fs-micro);
}

.role-asesor { color: var(--color-success); }
.role-coord { color: var(--color-warning); }

.ui-status {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}

.status-online { background-color: var(--color-success); }
.status-offline { background-color: var(--text-muted); }

.view-all-link {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  color: var(--color-info);
  font-size: var(--fs-xs);
  font-weight: var(--fw-semibold);
  margin-top: 1rem;
}

.view-all-link:hover {
  text-decoration: underline;
}

/* ── Modal ─────────────────────────────────────────── */
.modal-overlay {
  position: fixed;
  inset: 0;
  background-color: rgba(0, 0, 0, 0.5);
  backdrop-filter: blur(4px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s ease, visibility 0.25s ease;
}
.modal-overlay.is-visible { opacity: 1; visibility: visible; }

.modal-card {
  background-color: var(--bg-card);
  border-radius: var(--radius-lg);
  box-shadow: 0 25px 50px -12px rgba(0,0,0,0.25);
  width: 100%;
  max-width: 560px;
  max-height: 90vh;
  overflow-y: auto;
  transform: translateY(20px) scale(0.97);
  transition: transform 0.25s ease;
}
.modal-overlay.is-visible .modal-card { transform: translateY(0) scale(1); }

.modal-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.5rem 2rem 1rem;
  border-bottom: 1px solid var(--border-default);
}
.modal-header h2 { font-size: var(--fs-lg); }

.modal-close-btn {
  background: none;
  border: none;
  color: var(--text-muted);
  padding: 0.25rem;
  border-radius: 6px;
  transition: all 0.15s;
}
.modal-close-btn:hover { background-color: var(--color-danger-bg); color: var(--color-danger); }

/* Premium Close Button (Global) */
.premium-close-btn {
  color: var(--text-muted) !important;
  transition: all 0.2s ease !important;
  z-index: 100;
  position: relative;
  background: none !important;
  border: none !important;
  cursor: pointer;
  font-size: var(--fs-lg); !important; /* Mismo tamaño de icono */
  width: 32px;
  height: 32px;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
.premium-close-btn:hover {
  color: #ef4444 !important;
  transform: rotate(90deg);
}

.modal-body { padding: 1.5rem 2rem; }

.detail-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.25rem;
}
.detail-item { display: flex; flex-direction: column; gap: 0.25rem; }
.detail-full { grid-column: 1 / -1; }
.detail-label { font-size: var(--fs-micro); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-secondary); }
.detail-value { font-size: var(--fs-sm); color: var(--text-primary); word-break: break-word; }
.detail-value a { color: var(--color-primary); }
.detail-value a:hover { text-decoration: underline; }

.modal-footer {
  display: flex;
  gap: 0.75rem;
  padding: 1rem 2rem 1.5rem;
  border-top: 1px solid var(--border-default);
}

.btn-modal-email {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
  border-radius: 8px;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  background-color: var(--color-info);
  color: var(--text-on-primary);
  transition: all 0.2s;
}
.btn-modal-email:hover { filter: brightness(0.9); }

.btn-modal-whatsapp {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
  border-radius: 8px;
  font-size: var(--fs-sm);
  font-weight: var(--fw-semibold);
  background-color: var(--color-success);
  color: var(--text-on-primary);
  transition: all 0.2s;
}
.btn-modal-whatsapp:hover { filter: brightness(0.9); }

/* ── Proposal Button & Form ────────────────────────── */
.btn-proposal {
  background: var(--color-primary);
  color: var(--text-on-primary);
}
.btn-proposal:hover {
  background: var(--color-primary-hover);
}

.btn-proposal-generate {
  display: inline-flex;
  align-items: center;
  padding: 0.75rem 2rem;
  border-radius: 8px;
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
  background: linear-gradient(135deg, #7c3aed, #6d28d9);
  color: #fff;
  transition: all 0.2s;
  border: none;
  cursor: pointer;
}
.btn-proposal-generate:hover {
  background: linear-gradient(135deg, #6d28d9, #5b21b6);
  transform: translateY(-1px);
  box-shadow: 0 6px 16px rgba(109, 40, 217, 0.3);
}

.modal-card-wide { max-width: 680px; }

.proposal-form { padding: 1.5rem 2rem !important; }

.form-description {
  font-size: var(--fs-sm);
  color: var(--text-muted);
  margin-bottom: 1.5rem;
  line-height: 1.5;
}

.form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem;
  margin-bottom: 1rem;
}

.proposal-form .form-group { margin-bottom: 0; }

.proposal-form select {
  width: 100%;
  padding: 0.75rem 1rem;
  border: 1px solid var(--border-light);
  border-radius: 8px;
  font-size: var(--fs-lg);
  font-family: inherit;
  background-color: #fff;
  transition: border-color 0.2s;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%2364748b' viewBox='0 0 16 16'%3E%3Cpath d='M8 11L3 6h10z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
}
.proposal-form select:focus {
  outline: none;
  border-color: var(--color-blue);
  box-shadow: 0 0 0 3px rgba(14,165,233,0.1);
}

/* ── Utilities ─────────────────────────────────────── */
.text-center { text-align: center !important; }

/* ── Responsive ────────────────────────────────────── */
@media (max-width: 768px) {
  .header-container { flex-direction: column; gap: 1rem; }
  .header-actions { flex-wrap: wrap; justify-content: center; }
  .stats-row { grid-template-columns: repeat(2, 1fr); }
  .detail-grid { grid-template-columns: 1fr; }
  .modal-card { margin: 1rem; }
  .form-row { grid-template-columns: 1fr; }
  .data-table th.col-documento,
  .data-table td.col-documento { display: none; }
}

/* ============================================================
   Accordion Benefits (Registrar Cliente)
   ============================================================ */
.benefit-accordion {
  margin-bottom: 0.75rem;
  background-color: rgba(255, 255, 255, 0.02);
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-light);
  overflow: hidden;
}

.benefit-accordion summary {
  padding: 0.75rem 1rem;
  cursor: pointer;
  font-weight: var(--fw-semibold);
  font-size: var(--fs-sm);
  display: flex;
  justify-content: space-between;
  align-items: center;
  list-style: none; /* Hide default arrow */
  background-color: rgba(255, 255, 255, 0.03);
  transition: background-color 0.2s;
  color: var(--text-main);
}

.benefit-accordion summary::-webkit-details-marker {
  display: none;
}

.benefit-accordion summary:hover {
  background-color: rgba(255, 255, 255, 0.08);
}

.benefit-accordion summary i.fa-chevron-down {
  transition: transform 0.3s ease;
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.benefit-accordion[open] summary i.fa-chevron-down {
  transform: rotate(180deg);
}

.benefit-accordion-content {
  padding: 1rem 1rem 0.5rem;
  animation: slideDown 0.3s ease-in-out;
}

@keyframes slideDown {
  0% { opacity: 0; transform: translateY(-5px); }
  100% { opacity: 1; transform: translateY(0); }
}

.benefit-accordion .benefit-item {
  border-bottom: 1px dashed var(--border-light);
  margin-bottom: 0.75rem;
  padding-bottom: 0.75rem;
}
.benefit-accordion .benefit-item:last-child {
  border-bottom: none;
  margin-bottom: 0;
  padding-bottom: 0;
}

.custom-date-filter { 
    width:100%; 
    padding:0.6rem; 
    padding-right:2.5rem; 
    background-color:var(--bg-body); 
    border:1px solid var(--border-light); 
    border-radius:var(--radius-sm); 
    color:#fff; 
    font-family:inherit; 
    cursor:pointer; 
    outline: none; 
    box-sizing: border-box;
} 
.custom-date-filter:focus { 
    border-color: #fff; 
}

/* Make sure dropdown options in Flatpickr are readable */
.flatpickr-monthDropdown-months option {
    background-color: var(--bg-card);
    color: #fff;
}

/* Hide scrollbar for custom year list */
.custom-year-list::-webkit-scrollbar { display: none; }
.custom-year-list { -ms-overflow-style: none; scrollbar-width: none; }

/* Allow flatpickr year dropdown to overflow */
.flatpickr-months .flatpickr-month, .flatpickr-current-month { overflow: visible !important; }

/* Fix para hacer visible y nítido el icono del calendario: Negro en modo claro, Blanco en modo oscuro */
input[type='date']::-webkit-calendar-picker-indicator {
    filter: brightness(0);
    opacity: 0.9;
    cursor: pointer;
    transition: opacity 0.15s ease;
}

input[type='date']::-webkit-calendar-picker-indicator:hover {
    opacity: 1;
}

html[data-theme="dark"] input[type='date']::-webkit-calendar-picker-indicator {
    filter: brightness(0) invert(1);
    opacity: 0.9;
}

/* ============================================================
   FASE 2: CONEXI�N TEMPORAL DE ELEMENTOS GLOBALES AL TEMA
   ============================================================ */
html, body, .app-layout, .main-content {
    background-color: var(--theme-bg-main) !important;
    color: var(--theme-text-main) !important;
}

/* ============================================================
   FASE 2.1: CORRECCI�N M�DULO "REGISTRAR CLIENTE"
   ============================================================ */
#view-registrar {
    background-color: var(--theme-bg-main);
    color: var(--theme-text-main);
}
#view-registrar .crm-card,
#view-registrar .table-header-block,
#view-registrar .summary-box,
#view-registrar .crm-summary {
    background-color: var(--theme-surface-main);
    border: 1px solid var(--theme-border);
}
#view-registrar .card-title,
#view-registrar h2,
#view-registrar h3,
#view-registrar h4,
#view-registrar .input-group label,
#view-registrar .toggle-label,
#view-registrar .summary-item .value {
    color: var(--theme-text-main) !important;
}
#view-registrar .input-group input, 
#view-registrar .input-group select,
#view-registrar .input-with-icon input {
    background-color: var(--theme-surface-secondary);
    color: var(--theme-text-main);
    border: 1px solid var(--theme-border);
}
#view-registrar .input-group input:disabled {
    background-color: var(--theme-bg-secondary);
    color: var(--theme-text-secondary);
}
#view-registrar .input-group input::placeholder,
#view-registrar .input-with-icon input::placeholder {
    color: var(--theme-text-secondary);
    opacity: 1;
}
#view-registrar .input-hint,
#view-registrar .text-gray,
#view-registrar .text-muted,
#view-registrar .summary-title-wrapper span,
#view-registrar .summary-footer span,
#view-registrar .summary-item .label {
    color: var(--theme-text-secondary) !important;
}
#view-registrar .plan-card {
    background-color: var(--theme-bg-secondary);
    border-color: var(--theme-border);
}
#view-registrar .plan-card span {
    color: var(--theme-text-main);
}
[data-theme="dark"] #view-registrar .plan-card.selected {
    background-color: var(--theme-surface-secondary) !important;
}

/* ============================================================
   FASE 3: ACTUALIZACI�N DE PALETA DE COLORES
   ============================================================ */
:root {
  --theme-bg-main: #F5F1E8;
  --theme-bg-secondary: #EEE8DC;
  --theme-surface-main: #FFFCF7;
  --theme-surface-secondary: #F8F3EA;
  --theme-sidebar-bg: #FFFCF7;
  --theme-header-bg: #FFFCF7;
  --theme-border: #DDD5C8;
  --theme-text-main: #172033;
  --theme-text-secondary: #667085;
  --theme-text-disabled: #98A0AD;
  --theme-primary: #2F6FED;
  --theme-primary-hover: #255BC7;
  --theme-accent: #D89A2B;
  
  /* Retrocompatibilidad */
  --bg-body: var(--theme-bg-main);
  --bg-card: var(--theme-surface-main);
  --bg-sidebar: var(--theme-sidebar-bg);
  --bg-hover: var(--theme-surface-secondary);
  --bg-input: var(--theme-surface-secondary);
  
  --border-light: var(--theme-border);
  --border-focus: var(--theme-primary);
  
  --text-main: var(--theme-text-main);
  --text-muted: var(--theme-text-secondary);
  --text-dark: var(--theme-text-main);
  
  --color-primary: var(--theme-primary);
  --color-primary-dark: var(--theme-primary-hover);
  --color-accent: var(--theme-accent);
}

[data-theme="dark"] {
  --theme-bg-main: #07111F;
  --theme-bg-secondary: #0B1627;
  --theme-surface-main: #111E31;
  --theme-surface-secondary: #16253A;
  --theme-sidebar-bg: #050C17;
  --theme-header-bg: #07101D;
  --theme-border: #293950;
  --theme-text-main: #F7F1E7;
  --theme-text-secondary: #AAB5C5;
  --theme-text-disabled: #68768A;
  --theme-primary: #4B86F7;
  --theme-primary-hover: #6A9BFF;
  --theme-accent: #F0B44C;
}

/* Forzar Header y Sidebar a usar estos colores fijos en todo el sistema */
.sidebar, .sidebar-header { background-color: var(--theme-sidebar-bg) !important; border-right-color: var(--theme-border) !important; color: #F7F1E7 !important; }
.topbar { background-color: var(--theme-header-bg) !important; border-bottom-color: var(--theme-border) !important; color: #F7F1E7 !important; }
.topbar .search-input { background-color: rgba(255, 255, 255, 0.05) !important; color: #F7F1E7 !important; border-color: rgba(255, 255, 255, 0.1) !important; }
.topbar .search-input::placeholder { color: rgba(255, 255, 255, 0.5) !important; }

/* Forzar botones hover y textos deshabilitados */
.btn-primary:hover { background-color: var(--theme-primary-hover) !important; }
input:disabled, select:disabled { color: var(--theme-text-disabled) !important; }

/* ============================================================
   FASE 4: CORRECCI�N DEL DASHBOARD Y SIDEBAR
   ============================================================ */

/* 1. Tarjetas del Dashboard (Stats) */
.stat-card {
  background-color: var(--theme-surface-main) !important;
  border-color: var(--theme-border) !important;
}
.stat-value {
  color: var(--theme-text-main) !important;
}
.stat-label, .stat-sub {
  color: var(--theme-text-secondary) !important;
}

/* 2. Sidebar Nav Items y Textos (Siempre claros, pues el fondo siempre es oscuro) */
.sidebar .nav-item {
  color: #AAB5C5 !important;
}
.sidebar .nav-item:hover, .sidebar .nav-item.active {
  color: #FFFFFF !important;
}
.sidebar .text-highlight { color: #FFFFFF !important; font-weight: var(--fw-bold); }
.sidebar .text-orange { color: var(--theme-accent) !important; }
.sidebar .theme-text { color: #AAB5C5 !important; }
.sidebar-brand .brand-title, .sidebar-brand .brand-subtitle { color: #FFFFFF !important; }

/* 3. Header / Topbar */
.topbar .profile-info .profile-name,
.topbar .profile-name { color: #FFFFFF !important; }
.topbar .profile-info .profile-role,
.topbar .profile-role { color: #AAB5C5 !important; }
.topbar i, .topbar svg, .topbar .notification-btn { color: #F7F1E7 !important; }

/* ============================================================
   FASE 4.3: SIDEBAR Y TOPBAR DIN�MICOS (CLARO/OSCURO)
   ============================================================ */
/* Sidebar and Header backgrounds are now dynamic (Light/Dark) */
.sidebar, .sidebar-header { 
    background-color: var(--theme-sidebar-bg) !important; 
    border-right-color: var(--theme-border) !important; 
}
.topbar { 
    background-color: var(--theme-header-bg) !important; 
    border-bottom-color: var(--theme-border) !important; 
}

/* Sidebar texts */
.sidebar .nav-item {
  color: var(--theme-text-secondary) !important;
  font-weight: var(--fw-medium); !important;
}
.sidebar .nav-item:hover {
  background-color: var(--theme-surface-secondary) !important;
  color: var(--theme-text-main) !important;
}
.sidebar .nav-item.active {
  background-color: var(--theme-primary) !important;
  color: #FFFFFF !important;
}
.sidebar .text-highlight { color: var(--theme-text-main) !important; font-weight: var(--fw-bold); }
.sidebar .theme-text { color: var(--theme-text-secondary) !important; }
.sidebar-brand .brand-title { color: var(--theme-text-main) !important; }
.sidebar-brand .brand-subtitle { color: var(--theme-text-secondary) !important; }

/* Topbar elements */
.topbar .user-name { color: var(--theme-text-main) !important; font-weight: var(--fw-semibold); !important; }
.topbar .profile-role { color: var(--theme-text-secondary) !important; }
.topbar .user-avatar { border: 2px solid var(--theme-border) !important; }
.topbar .chevron-down { color: var(--theme-text-main) !important; }
.topbar .user-dropdown-menu a { color: var(--theme-text-main) !important; }
.topbar i, .topbar svg, .topbar .notification-btn { color: var(--theme-text-main) !important; }

/* Search Input */
.topbar .search-input { 
    background-color: var(--theme-surface-secondary) !important; 
    color: var(--theme-text-main) !important; 
    border: 1px solid var(--theme-border) !important; 
    border-radius: 8px !important; 
}
.topbar .search-input::placeholder { color: var(--theme-text-secondary) !important; }
.topbar .search-shortcut {
    background-color: var(--theme-bg-main) !important;
    color: var(--theme-text-secondary) !important;
    border: 1px solid var(--theme-border) !important;
    font-weight: var(--fw-medium); !important;
}

/* ============================================================
   FASE 4.4: TIPOGRAF�A GLOBAL MONTSERRAT
   ============================================================ */
body, h1, h2, h3, h4, h5, h6, p, a, input, button, select, textarea, label, table, th, td, div {
    font-family: var(--font-family-main);
}
/* Proteger FontAwesome expl�citamente para evitar que desaparezcan los �conos */
i, [class^="fa-"], [class*=" fa-"], .fa, .fas, .far, .fab {
    font-family: "Font Awesome 6 Free", "Font Awesome 5 Free", "FontAwesome" !important;
}

/* ============================================================
   FASE 4.5: CORRECCI�N DE COLORES EN TABLAS
   ============================================================ */
/* Asegurar que las tablas, como la de Buscar Cliente, respeten el texto din�mico y no queden invisibles */
.table-client-name, table, th, td, tr, .table td, .table th, .table-client-info span {
    color: var(--theme-text-main) !important;
}
.table-client-type {
    color: var(--theme-text-secondary) !important;
}

/* ============================================================
   FASE 4.7: CORRECCION DE ACORDEONES (BENEFICIOS) EN MODO OSCURO
   ============================================================ */
.benefit-accordion summary {
    color: var(--theme-text-main) !important;
}
.benefit-item .benefit-text span {
    color: var(--theme-text-secondary) !important;
}
.benefit-item .benefit-text strong {
    color: var(--theme-text-main) !important;
}

/* ============================================================
   FASE 4.8: CORRECCI�N DE CHECKBOXES Y FONDOS PASTEL EN MODO OSCURO
   ============================================================ */
/* Eliminar el blanco fijo de los checkboxes (Adicionales) */
.checkmark {
    background-color: var(--theme-surface-main) !important;
    border-color: var(--theme-border) !important;
}
.custom-checkbox:hover input ~ .checkmark {
    border-color: var(--theme-primary) !important;
}
.topbar .user-dropdown-menu a { color: var(--theme-text-main) !important; }
.topbar i, .topbar svg, .topbar .notification-btn { color: var(--theme-text-main) !important; }

/* Search Input */
.topbar .search-input { 
    background-color: var(--theme-surface-secondary) !important; 
    color: var(--theme-text-main) !important; 
    border: 1px solid var(--theme-border) !important; 
    border-radius: 8px !important; 
}
.topbar .search-input::placeholder { color: var(--theme-text-secondary) !important; }
.topbar .search-shortcut {
    background-color: var(--theme-bg-main) !important;
    color: var(--theme-text-secondary) !important;
    border: 1px solid var(--theme-border) !important;
    font-weight: var(--fw-medium); !important;
}

/* ============================================================
   FASE 4.4: TIPOGRAFA GLOBAL MONTSERRAT
   ============================================================ */
body, h1, h2, h3, h4, h5, h6, p, a, input, button, select, textarea, label, table, th, td, div {
    font-family: var(--font-family-main);
}
/* Proteger FontAwesome explcitamente para evitar que desaparezcan los conos */
i, [class^="fa-"], [class*=" fa-"], .fa, .fas, .far, .fab {
    font-family: "Font Awesome 6 Free", "Font Awesome 5 Free", "FontAwesome" !important;
}

/* ============================================================
   FASE 4.5: CORRECCIN DE COLORES EN TABLAS
   ============================================================ */
/* Asegurar que las tablas, como la de Buscar Cliente, respeten el texto dinmico y no queden invisibles */
.table-client-name, table, th, td, tr, .table td, .table th, .table-client-info span {
    color: var(--theme-text-main) !important;
}
.table-client-type {
    color: var(--theme-text-secondary) !important;
}

/* ============================================================
   FASE 4.7: CORRECCION DE ACORDEONES (BENEFICIOS) EN MODO OSCURO
   ============================================================ */
.benefit-accordion summary {
    color: var(--theme-text-main) !important;
}
.benefit-item .benefit-text span {
    color: var(--theme-text-secondary) !important;
}
.benefit-item .benefit-text strong {
    color: var(--theme-text-main) !important;
}

/* ============================================================
   FASE 4.8: CORRECCIN DE CHECKBOXES Y FONDOS PASTEL EN MODO OSCURO
   ============================================================ */
/* Eliminar el blanco fijo de los checkboxes (Adicionales) */
.checkmark {
    background-color: var(--theme-surface-main) !important;
    border-color: var(--theme-border) !important;
}
.custom-checkbox:hover input ~ .checkmark {
    border-color: var(--theme-primary) !important;
}
.custom-checkbox input:checked ~ .checkmark {
    background-color: var(--theme-primary) !important;
    border-color: var(--theme-primary) !important;
}

/* Efecto Premium Glass/Neon para los iconos de planes en modo oscuro */
[data-theme="dark"] .bg-gray-main { background-color: rgba(107, 114, 128, 0.2) !important; color: #9ca3af !important; }
[data-theme="dark"] .bg-blue-light, [data-theme="dark"] .bg-blue-main { background-color: rgba(59, 130, 246, 0.2) !important; color: #60a5fa !important; }
[data-theme="dark"] .bg-orange { background-color: rgba(249, 115, 22, 0.2) !important; color: #fb923c !important; }
[data-theme="dark"] .bg-yellow { background-color: rgba(234, 179, 8, 0.2) !important; color: #facc15 !important; }
[data-theme="dark"] .bg-purple { background-color: rgba(139, 92, 246, 0.2) !important; color: #a78bfa !important; }
[data-theme="dark"] .bg-pink { background-color: rgba(217, 70, 239, 0.2) !important; color: #e879f9 !important; }
.bg-lime-main { background-color: rgba(118, 184, 43, 0.15) !important; color: rgb(118, 184, 43) !important; }
[data-theme="dark"] .bg-lime-main { background-color: rgba(118, 184, 43, 0.25) !important; color: rgb(118, 184, 43) !important; }

.plan-card[data-plan="Especial CG"].selected .plan-icon {
    background-color: rgb(118, 184, 43) !important;
    color: #fff !important;
}
.plan-card[data-plan="Especial CG"].selected {
    border-color: rgb(118, 184, 43) !important;
    box-shadow: 0 0 15px rgba(118, 184, 43, 0.3) !important;
}

/* Dynamic Theme Colors for Summary Panel based on selected plan */
body[data-theme-plan="Artesanos"], body[data-theme-plan="Artesanos-Calzado"] { --theme-color: #a78bfa; --theme-primary: #8b5cf6; }
body[data-theme-plan="Calzado"] { --theme-color: #22d3ee; --theme-primary: #06b6d4; }
body[data-theme-plan="Gastronomía"], body[data-theme-plan="Gastronómico"], body[data-theme-plan="Gastronomía Esencial"], body[data-theme-plan="Gastronomía Profesional"], body[data-theme-plan="Gastronomía Premium"] { --theme-color: #e879f9; --theme-primary: #d946ef; }
body[data-theme-plan="Counter Especial"] { --theme-color: #9ca3af; --theme-primary: #6b7280; }
body[data-theme-plan="Esencial"] { --theme-color: #60a5fa; --theme-primary: #3b82f6; }
body[data-theme-plan="Profesional"] { --theme-color: #fb923c; --theme-primary: #f97316; }
body[data-theme-plan="Premium 360"] { --theme-color: #facc15; --theme-primary: #eab308; }
body[data-theme-plan="Especial CG"] { --theme-color: rgb(118, 184, 43); --theme-primary: rgb(118, 184, 43); }

body[data-theme-plan="Especial CG"] .summary-panel .theme-text,
body[data-theme-plan="Especial CG"] .summary-benefits .theme-text,
body[data-theme-plan="Especial CG"] .summary-panel .benefit-desc,
body[data-theme-plan="Especial CG"] .summary-panel .benefit-icon i {
    color: rgb(118, 184, 43) !important;
}

body[data-theme-plan="Gastronomía"] .summary-panel .theme-text,
body[data-theme-plan="Gastronomía"] .summary-benefits .theme-text,
body[data-theme-plan="Gastronomía"] .summary-panel .benefit-desc,
body[data-theme-plan="Gastronomía"] .summary-panel .benefit-icon i,
body[data-theme-plan="Gastronómico"] .summary-panel .theme-text,
body[data-theme-plan="Gastronómico"] .summary-benefits .theme-text,
body[data-theme-plan="Gastronómico"] .summary-panel .benefit-desc,
body[data-theme-plan="Gastronómico"] .summary-panel .benefit-icon i {
    color: #e879f9 !important;
}

/* FIX: Select options color for Light/Dark Mode (OS native fallback) */
select option {
    background-color: #FFFCF7;
    color: #172033;
}
[data-theme="dark"] select option {
    background-color: #111E31;
    color: #F7F1E7;
}

/* Resaltado Inteligente Morado para Stands Libres por Categoría (Planimetría v3.2) */
@keyframes freeStandGlowPurple {
    0% {
        box-shadow: 0 0 6px rgba(168, 85, 247, 0.5), inset 0 0 8px rgba(168, 85, 247, 0.2);
    }
    50% {
        box-shadow: 0 0 18px rgba(168, 85, 247, 0.9), inset 0 0 14px rgba(168, 85, 247, 0.4);
    }
    100% {
        box-shadow: 0 0 6px rgba(168, 85, 247, 0.5), inset 0 0 8px rgba(168, 85, 247, 0.2);
    }
}

.stand-highlight-free-purple {
    border: 2.5px solid #a855f7 !important;
    background-color: rgba(203, 213, 225, 0.45) !important;
    animation: freeStandGlowPurple 2s infinite ease-in-out !important;
    z-index: 30 !important;
}


/* Icon alignment fixes */
#theme-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
}
#theme-toggle svg {
    transform: translateY(-2px);
}
.notify-btn {
    display: flex;
    align-items: center;
    justify-content: center;
}

/* ── Glassmorphism Modals (SweetAlert2 & Custom) ────── */
.swal2-popup,
.modal-card {
  background: var(--theme-surface-main) !important;
  backdrop-filter: blur(20px) saturate(180%) !important;
  -webkit-backdrop-filter: blur(20px) saturate(180%) !important;
  border: 1px solid var(--theme-border) !important;
  border-radius: 24px !important;
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.3) !important;
  color: var(--theme-text-main) !important;
}

.swal2-title {
  color: var(--theme-text-main) !important;
  font-weight: var(--fw-bold); !important;
  letter-spacing: -0.02em !important;
}

.swal2-html-container {
  color: var(--theme-text-main) !important;
}

.swal2-actions button {
  border-radius: 12px !important;
  font-weight: var(--fw-semibold); !important;
  padding: 0.7rem 1.5rem !important;
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
}

.swal2-styled.swal2-confirm {
  background: var(--theme-primary) !important;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.2) !important;
}

.swal2-styled.swal2-confirm:hover {
  background: var(--theme-primary-hover) !important;
  transform: translateY(-1px) !important;
}

.swal2-styled.swal2-cancel {
  background: var(--theme-bg-secondary) !important;
  color: var(--theme-text-secondary) !important;
  border: 1px solid var(--theme-border) !important;
}

.swal2-styled.swal2-cancel:hover {
  background: var(--theme-surface-secondary) !important;
  color: var(--theme-text-main) !important;
}

/* Glassmorphism Cards inside Modals */
.tramite-card {
  background: var(--theme-surface-secondary) !important;
  border: 1px solid rgba(255, 255, 255, 0.08) !important;
  backdrop-filter: blur(8px) !important;
  border-radius: 16px !important;
  transition: all 0.25s ease !important;
}

.tramite-card:hover {
  background: rgba(255, 255, 255, 0.08) !important;
  border-color: rgba(255, 255, 255, 0.2) !important;
  transform: translateY(-2px) !important;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3) !important;
}

/* Dinamic Border for Adicionales Nota matching active Plan Theme */
#adicionales-nota {
  border: 1.5px solid var(--theme-primary) !important;
  transition: border-color 0.3s ease, box-shadow 0.3s ease !important;
}

#adicionales-nota:focus {
  border-color: var(--theme-primary) !important;
  box-shadow: 0 0 0 3px rgba(120, 120, 255, 0.25) !important;
  outline: none !important;
}

/* ============================================================
   Terceros / Plugins Dark Mode Overrides (Flatpickr / MDTimePicker)
   ============================================================ */
   
/* Evitar que MDTimePicker y Flatpickr hereden el texto blanco del body oscuro, 
   ya que sus fondos internos no cambian y el texto se vuelve invisible. */
.mdtp__wrapper, .flatpickr-calendar {
    color: #1a1a1a;
}

/* Invertimos dinámicamente el widget cuando está activo el tema oscuro.
   Invert(0.9) hue-rotate(180deg) hace que los fondos claros se vuelvan oscuros,
   el texto negro se vuelva blanco, y el color verde de acento (hue=160) se mantenga! */
html[data-theme="dark"] .flatpickr-calendar,
html[data-theme="dark"] .mdtp__wrapper {
    filter: invert(0.92) hue-rotate(180deg) brightness(1.2) contrast(1.1) !important;
}



/* Ensure SweetAlert2 is always on top of all custom modals */
.swal2-container { z-index: 10000 !important; }

/* ============================================================
   Barra de búsqueda y filtros
   La clase .search-box se usaba en el módulo Gastos y Costos sin
   estar definida en ninguna hoja de estilos, por lo que el ícono
   de lupa quedaba fuera del campo y el input tomaba la apariencia
   por defecto del navegador, desalineado frente a los selectores.
   ============================================================ */
.search-filter-container {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-bottom: 15px;
}

.search-filter-container .search-box {
    position: relative;
    flex: 1 1 260px;
    max-width: 420px;
    min-width: 220px;
}

.search-filter-container .search-box i {
    position: absolute;
    left: 0.9rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--text-muted);
    font-size: var(--fs-sm);
    pointer-events: none;
}

.search-filter-container .search-box input {
    width: 100%;
    height: 42px;
    padding: 0 1rem 0 2.4rem;
    border: 1px solid var(--border-light);
    border-radius: 8px;
    background-color: var(--bg-surface);
    color: var(--text-primary);
    font-family: inherit;
    font-size: var(--fs-sm);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.search-filter-container .search-box input::placeholder {
    color: var(--text-muted);
}

.search-filter-container .search-box input:focus {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

/* Selectores de filtro. Se limitan a .search-filter-container para no
   alterar las barras de otros módulos que ya traen estilos propios. */
.search-filter-container select {
    flex: 0 1 190px;
    min-width: 160px;
    height: 42px;
    padding: 0 2.2rem 0 0.9rem;
    border: 1px solid var(--border-light);
    border-radius: 8px;
    background-color: var(--bg-surface);
    color: var(--text-primary);
    font-family: inherit;
    font-size: var(--fs-sm);
    cursor: pointer;
    appearance: none;
    -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.75rem center;
    background-size: 1em;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.search-filter-container select:focus {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

.search-filter-container select:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

html[data-theme="dark"] .search-filter-container select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2394a3b8'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
}

@media (max-width: 640px) {
    .search-filter-container .search-box,
    .search-filter-container select {
        flex: 1 1 100%;
        max-width: none;
    }
}

/* ============================================================
   Módulo Gastos y Costos — modales
   ============================================================ */

/* Título de modal. Antes eran <h3> sin peso ni tamaño propios,
   por lo que no se leían como encabezado. */
.gc-modal-title {
    margin: 0;
    color: var(--text-primary);
    font-size: var(--fs-lg);
    font-weight: var(--fw-bold);
    letter-spacing: -0.01em;
    line-height: 1.3;
}

/* Desplegables. Se reemplaza la apariencia nativa por una flecha propia
   para que respeten el tema y se vean iguales en todos los navegadores. */
.gc-select {
    width: 100%;
    min-height: 38px;
    padding: 8px 2.1rem 8px 10px;
    border: 1px solid var(--border-light);
    border-radius: 6px;
    background-color: var(--bg-surface);
    color: var(--text-primary);
    font-family: inherit;
    font-size: var(--fs-sm);
    cursor: pointer;
    appearance: none;
    -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.7rem center;
    background-size: 0.9em;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.gc-select:focus {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

.gc-select:disabled {
    opacity: 0.55;
    cursor: not-allowed;
    background-color: var(--bg-hover);
}

/* Las opciones heredan el fondo del sistema operativo, no del tema.
   Se fuerzan para que el desplegable abierto no aparezca en blanco. */
.gc-select option {
    background-color: var(--bg-card);
    color: var(--text-primary);
}

html[data-theme="dark"] .gc-select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2394a3b8'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
}

/* ==========================================================
   MODAL ENGINE PARA GASTOS (RESPONSIVE VIEWPORT 14" Y DESKTOP)
   ========================================================== */
.gc-modal {
    display: flex;
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background: rgba(0, 0, 0, 0.6);
    backdrop-filter: blur(4px);
    z-index: 1200;
    justify-content: center;
    align-items: center;
    padding: 15px;
    box-sizing: border-box;
    /* .modal-overlay deja opacity:0 y visibility:hidden, y estos modales
       comparten ambas clases. Sin restaurarlas aquí, abrirlos con
       style.display='flex' los dejaba presentes pero invisibles e inertes:
       cargaban sus datos y no se veía nada. Se muestran únicamente cuando el
       JS les quita el display:none con el que todos arrancan en el HTML. */
    opacity: 1;
    visibility: visible;
}

.gc-modal .modal-content {
    background: var(--bg-card);
    width: 520px;
    max-width: 95vw;
    max-height: 88vh;
    display: flex;
    flex-direction: column;
    border-radius: 12px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
    border: 1px solid var(--border-light);
    overflow: hidden;
    position: relative;
    padding: 0 !important;
    margin: auto;
}

.gc-modal .modal-header {
    position: relative;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 14px 20px;
    border-bottom: 1px solid var(--border-light);
    background: var(--bg-card);
    flex-shrink: 0;
    z-index: 5;
    margin-bottom: 0 !important;
}

.gc-modal .modal-header h3 {
    margin: 0;
    color: var(--text-primary);
    font-weight: 700;
    font-size: 1.15rem;
    line-height: 1.25;
}

.gc-modal .modal-body {
    padding: 16px 20px;
    overflow-y: auto;
    max-height: calc(88vh - 125px);
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 13px;
    scrollbar-width: thin;
    scrollbar-color: var(--border-strong) transparent;
}

.gc-modal .modal-body::-webkit-scrollbar {
    width: 6px;
}

.gc-modal .modal-body::-webkit-scrollbar-track {
    background: transparent;
}

.gc-modal .modal-body::-webkit-scrollbar-thumb {
    background-color: var(--border-strong);
    border-radius: 4px;
}

.gc-modal .modal-body::-webkit-scrollbar-thumb:hover {
    background-color: var(--color-accent);
}

.gc-modal .modal-footer {
    padding: 12px 20px;
    border-top: 1px solid var(--border-light);
    background: var(--bg-card);
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 12px;
    flex-shrink: 0;
    z-index: 5;
    margin-top: 0 !important;
    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);
}

.gc-modal .premium-close-btn {
    position: relative;
    z-index: 30;
    flex-shrink: 0;
}

/* Botón de actualizar datos, en la cabecera del módulo.
   Recarga las cuatro pestañas a la vez, por eso vive fuera de ellas. */
.gc-refresh-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    flex-shrink: 0;
    padding: 0;
    border: 1px solid var(--border-light);
    border-radius: 8px;
    background-color: var(--bg-surface);
    color: var(--color-accent);
    font-size: var(--fs-lg);
    cursor: pointer;
    transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.gc-refresh-btn:hover:not(:disabled) {
    background-color: var(--color-accent);
    border-color: var(--color-accent);
    color: #ffffff;
}

.gc-refresh-btn:focus-visible {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

.gc-refresh-btn:disabled {
    cursor: wait;
    opacity: 0.75;
}

/* Giro continuo mientras se recargan los datos. */
.gc-refresh-btn.is-loading i {
    animation: gc-spin 0.8s linear infinite;
}

@keyframes gc-spin {
    to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .gc-refresh-btn.is-loading i { animation: none; }
}

/* Separador entre el botón de actualizar y las pestañas. */
.gc-header-divider {
    width: 1px;
    height: 24px;
    flex-shrink: 0;
    background-color: var(--border-light);
}

/* Campos de texto y fecha, con las mismas medidas que .gc-select para que
   queden a la misma altura cuando comparten fila. */
.gc-input {
    width: 100%;
    min-height: 38px;
    padding: 8px 10px;
    border: 1px solid var(--border-light);
    border-radius: 6px;
    background-color: var(--bg-surface);
    color: var(--text-primary);
    font-family: inherit;
    font-size: var(--fs-sm);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.gc-input:focus {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

textarea.gc-input {
    min-height: 0;
    resize: none;
}

/* Campos de moneda: se ocultan las flechas del control numérico, porque el
   valor se digita y se formatea con separadores de miles. */
.gc-modal input[type="number"]::-webkit-outer-spin-button,
.gc-modal input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.gc-modal input[type="number"] {
    -moz-appearance: textfield;
    appearance: textfield;
}

/* Icono del almanaque en los campos de fecha.
   El navegador lo dibuja oscuro por defecto, lo cual sirve en modo claro pero
   queda invisible sobre el fondo oscuro; ahí se invierte a blanco. */
.gc-modal input[type="date"]::-webkit-calendar-picker-indicator {
    cursor: pointer;
    opacity: 0.85;
    filter: none;
}

.gc-modal input[type="date"]::-webkit-calendar-picker-indicator:hover {
    opacity: 1;
}

html[data-theme="dark"] .gc-modal input[type="date"]::-webkit-calendar-picker-indicator {
    filter: invert(1);
}

/* Fila de etiqueta con acción a la derecha (el "+" de crear al vuelo). */
.gc-label-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 5px;
    min-height: 20px;
}

.gc-label-row label {
    margin: 0;
}

.gc-add-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    flex-shrink: 0;
    padding: 0;
    border: 1px solid var(--color-accent);
    border-radius: 5px;
    background: transparent;
    color: var(--color-accent);
    font-size: var(--fs-micro);
    line-height: 1;
    cursor: pointer;
    transition: background-color 0.2s ease, color 0.2s ease;
}

.gc-add-btn:hover {
    background-color: var(--color-accent);
    color: #ffffff;
}

/* Estado activo: el botón pasa a cancelar y volver al desplegable. */
.gc-add-btn.is-active {
    border-color: #ef4444;
    color: #ef4444;
}

.gc-add-btn.is-active:hover {
    background-color: #ef4444;
    color: #ffffff;
}

/* Nota de ayuda dentro de los formularios. */
.gc-hint {
    margin: 0;
    color: var(--text-muted);
    font-size: var(--fs-micro);
    line-height: 1.4;
}

.gc-hint i {
    margin-right: 4px;
}

/* Rejilla de dos columnas para los modales.
   Las celdas se estiran a la misma altura y el control se ancla abajo, de modo
   que los campos quedan alineados aunque una etiqueta ocupe dos renglones y la
   otra sólo uno. Ese era el origen del descuadre en el modal de abonos. */
.gc-grid-2 {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
    align-items: end;
}

.gc-grid-2 > div {
    display: flex;
    flex-direction: column;
}

@media (max-width: 480px) {
    .gc-grid-2 {
        grid-template-columns: 1fr;
    }
}

/* Desplegable con buscador.
   Un <select> nativo no permite escribir dentro, así que se arma con un campo
   de texto y una lista propia. Arranca en sólo lectura (se comporta como un
   desplegable) y al segundo clic se habilita la escritura para filtrar. */
.gc-combo {
    position: relative;
}

.gc-combo-input {
    cursor: pointer;
}

.gc-combo-input:not([readonly]) {
    cursor: text;
}

.gc-combo-list {
    display: none;
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    right: 0;
    z-index: 40;
    max-height: 220px;
    overflow-y: auto;
    background-color: var(--bg-card);
    border: 1px solid var(--border-light);
    border-radius: 8px;
    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.18);
}

.gc-combo.is-open .gc-combo-list {
    display: block;
}

.gc-combo-item {
    padding: 8px 10px;
    font-size: var(--fs-sm);
    color: var(--text-primary);
    cursor: pointer;
    border-bottom: 1px solid var(--border-light);
}

.gc-combo-item:last-child {
    border-bottom: 0;
}

.gc-combo-item:hover,
.gc-combo-item.is-active {
    background-color: var(--bg-hover);
}

.gc-combo-vacio {
    padding: 12px 10px;
    font-size: var(--fs-sm);
    color: var(--text-muted);
    text-align: center;
}

/* Recuadro informativo del movimiento en el modal de abonos. */
.gc-info-box {
    background: var(--bg-surface);
    padding: 12px;
    border-radius: 8px;
    border: 1px solid var(--border-light);
}

.gc-info-box p {
    margin: 0;
    color: var(--text-secondary);
    font-size: var(--fs-sm);
}

.gc-info-box p + p {
    margin-top: 5px;
}

/* ==========================================================================
   BREAKPOINTS GLOBALES & RESPONSIVE
   ========================================================================== */
   
/* 1. MOBILE (<= 767px) - BLOQUEO TOTAL */
@media (max-width: 767px) {
    .app-layout, .login-container { display: none !important; }
    .mobile-blocker-overlay {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        position: fixed;
        inset: 0;
        background-color: var(--bg-page);
        z-index: 999999;
        text-align: center;
        padding: 2rem;
    }
    .mobile-blocker-content svg { display: block; margin: 0 auto 1.5rem auto; color: var(--color-danger); }
    .mobile-blocker-content h2 { margin-bottom: 1rem; color: var(--color-danger); font-size: var(--fs-lg); }
    .mobile-blocker-content p { color: var(--text-primary); font-size: var(--fs-sm); }
}

/* Ocultar modal en Desktop/Tablet */
@media (min-width: 768px) {
    .mobile-blocker-overlay { display: none !important; }
}

/* 2. TABLET (768px - 1023px) */
@media (min-width: 768px) and (max-width: 1023px) {
    .dashboard-body, .main-content { padding: 1rem; }
    .table-responsive-wrapper, .data-table-container, .table-container {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        width: 100%;
        display: block;
    }
    
    /* Limitar altura del contenido del CRM para que scrollee internamente */
    main.crm-main-content {
        max-height: calc(100vh - 190px);
        overflow-y: auto;
        padding-right: 10px;
    }
    main.crm-main-content::-webkit-scrollbar {
        width: 6px;
    }
    main.crm-main-content::-webkit-scrollbar-thumb {
        background-color: var(--border-strong);
        border-radius: 10px;
    }
}



/* ============================================================
   Rediseo Ingresos y Egresos (Sticky Header y Tabs)
   ============================================================ */
.dashboard-header-block {
    position: sticky;
    top: 0;
    /* Debe quedar por encima del contenido pero POR DEBAJO de los modales
       (z-index 1200) y de SweetAlert (10000). Con 9999 tapaba las ventanas
       emergentes del módulo. */
    z-index: 100;
    background-color: var(--bg-body);
    box-shadow: 0 -25px 0 0 var(--bg-body), 0 5px 10px -5px rgba(0,0,0,0.05);
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--border-light);
    margin-bottom: 1rem;
}

.dashboard-header-block .us-btn.active {
    border-bottom: 3px solid var(--theme-text-main);
    border-radius: 8px 8px 0 0;
    color: var(--theme-text-main);
}

/* Estilos para botones de accion de gastos */
.btn-abonar-icon {
    color: var(--theme-text-main);
}
.btn-abonar-icon:hover {
    background-color: var(--theme-text-main) !important;
    color: var(--theme-bg-main) !important;
}

.btn-anular-icon {
    color: #ff3b30 !important;
}
.btn-anular-icon:hover {
    border-color: #ff3b30 !important;
    background-color: transparent !important;
    color: #ff3b30 !important;
}

/* ========================================= */
/* RESUMEN GERENCIAL GASTOS (GGS)            */
/* ========================================= */
.ggs-container {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1.5rem;
    padding: 0.5rem 0;
    max-width: 100%;
    box-sizing: border-box;
    overflow: hidden;
}

.ggs-cards {
    display: flex;
    gap: 1rem;
    flex: 1;
    flex-wrap: wrap;
}

.ggs-card {
    display: flex;
    align-items: center;
    background: var(--bg-card);
    border: 1px solid var(--border-light);
    border-radius: 10px;
    padding: 0.75rem 1rem;
    flex: 1;
    min-width: 0;
    box-shadow: 0 2px 5px rgba(0,0,0,0.02);
}

.ggs-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 8px;
    margin-right: 1rem;
    font-size: 1.1rem;
}

.ggs-info {
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

.ggs-label {
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.ggs-value {
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--theme-text-main);
    line-height: 1.2;
}

/* Colores spec�ficos */
.ggs-total .ggs-icon {
    background: rgba(59, 130, 246, 0.1);
    color: #3b82f6;
}
.ggs-favor .ggs-icon {
    background: rgba(34, 197, 94, 0.1);
    color: #22c55e;
}
.ggs-deuda .ggs-icon {
    background: rgba(239, 68, 68, 0.1);
    color: #ef4444;
}
.ggs-cobrar .ggs-icon {
    background: rgba(14, 165, 233, 0.1);
    color: #0ea5e9;
}
.ggs-pagar .ggs-icon {
    background: rgba(249, 115, 22, 0.1);
    color: #f97316;
}

.ggs-favor .ggs-value {
    color: #22c55e;
}
.ggs-deuda .ggs-value {
    color: #ef4444;
}
.ggs-cobrar .ggs-value {
    color: #0ea5e9;
}
.ggs-pagar .ggs-value {
    color: #f97316;
}

/* Badges de Tipo de Flujo y Vencimiento */
.badge-flujo-ingreso,
.badge-flujo-egreso,
.badge-flujo-trabajador,
.badge-flujo-socio {
    width: 96px;
    box-sizing: border-box;
    padding: 2px 6px;
    border-radius: 6px;
    font-size: 0.72rem;
    font-weight: 600;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 5px;
    flex-shrink: 0;
    text-align: center;
}

.badge-flujo-ingreso {
    background-color: rgba(34, 197, 94, 0.12);
    color: #15803d;
    border: 1px solid rgba(34, 197, 94, 0.25);
}

.badge-flujo-egreso {
    background-color: rgba(249, 115, 22, 0.12);
    color: #c2410c;
    border: 1px solid rgba(249, 115, 22, 0.25);
}

.badge-flujo-trabajador {
    background-color: rgba(59, 130, 246, 0.12);
    color: #1d4ed8;
    border: 1px solid rgba(59, 130, 246, 0.25);
}

.badge-flujo-socio {
    background-color: rgba(168, 85, 247, 0.12);
    color: #7e22ce;
    border: 1px solid rgba(168, 85, 247, 0.25);
}

.badge-vencido {
    background-color: rgba(239, 68, 68, 0.12);
    color: #b91c1c;
    border: 1px solid rgba(239, 68, 68, 0.25);
    padding: 1px 6px;
    border-radius: 4px;
    font-size: 0.7rem;
    font-weight: 700;
}

/* Formato homogéneo para N.º Orden y Persona */
.gc-orden-tag {
    display: inline-block;
    padding: 4px 10px;
    font-weight: 700;
    font-size: 0.85rem;
    background: var(--bg-surface);
    color: var(--text-primary);
    border: 1px solid var(--border-light);
    border-radius: 6px;
    letter-spacing: 0.5px;
    white-space: nowrap;
    box-shadow: 0 1px 3px rgba(0,0,0,0.04);
}

.gc-persona-cell {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    width: 100%;
}

.gc-persona-info {
    display: flex;
    flex-direction: column;
    gap: 3px;
    flex: 1;
    min-width: 0;
}

.gc-persona-badge-wrap {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex-shrink: 0;
}

.gc-persona-name {
    font-weight: 600;
    font-size: 0.88rem;
    color: var(--text-primary);
    text-transform: capitalize;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.gc-persona-meta {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.75rem;
    color: var(--text-muted);
    flex-wrap: wrap;
}

.gc-meta-tel, .gc-meta-factura, .gc-meta-vence {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.gc-persona-vence {
    display: flex;
    align-items: center;
    margin-top: 2px;
}

.ggs-chart-wrapper {
    width: 70px;
    height: 70px;
    position: relative;
    flex-shrink: 0;
}

/* ============================================================
   Análisis gerencial del módulo Ingresos y Egresos
   Vive fuera de .dashboard-header-block a propósito: ese bloque es sticky
   y un panel de gráficos dentro lo volvería una franja enorme.
   Tamaños según la escala tipográfica global (11-14px de contenido).
   ============================================================ */
.gc-analisis {
    margin-bottom: 1.5rem;
    padding: 1rem 1.25rem 1.25rem;
    border: 1px solid var(--border-light);
    border-radius: 12px;
    background-color: var(--bg-card);
}

.gc-analisis-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.gc-analisis-titulo {
    margin: 0;
    font-size: 14px;
    font-weight: 700;
    color: var(--text-primary);
}

.gc-analisis-titulo i {
    color: var(--color-accent);
    margin-right: 6px;
}

.gc-analisis-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    border: 1px solid var(--border-light);
    border-radius: 999px;
    background-color: var(--bg-surface);
    color: var(--text-secondary);
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    transition: border-color 0.2s ease, color 0.2s ease;
}

.gc-analisis-toggle:hover {
    border-color: var(--color-accent);
    color: var(--color-accent);
}

.gc-analisis.is-collapsed .gc-analisis-cuerpo { display: none; }
.gc-analisis.is-collapsed .gc-analisis-head { margin-bottom: 0; }

/* Barra de avance de pago */
.gc-avance { margin-bottom: 1.25rem; }

.gc-avance-cab {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 6px;
    font-size: 12px;
    color: var(--text-muted);
}

.gc-avance-cab strong {
    font-size: 14px;
    font-weight: 700;
    color: var(--text-primary);
}

.gc-avance-pista {
    height: 8px;
    border-radius: 999px;
    background-color: var(--bg-hover);
    overflow: hidden;
}

.gc-avance-relleno {
    height: 100%;
    width: 0;
    border-radius: 999px;
    background: linear-gradient(90deg, #22c55e, #4ade80);
    transition: width 0.6s ease;
}

/* Rejilla de gráficos */
.gc-chart-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 12px;
}

.gc-chart-card {
    min-width: 0; /* permite que la celda se encoja y no desborde la rejilla */
    padding: 12px 14px;
    border: 1px solid var(--border-light);
    border-radius: 10px;
    background-color: var(--bg-surface);
}

.gc-chart-titulo {
    margin: 0 0 10px 0;
    font-size: 13px;
    font-weight: 600;
    color: var(--text-secondary);
}

/* Altura fija: sin ella Chart.js en modo responsive crece sin límite. */
.gc-chart-caja {
    position: relative;
    height: 230px;
}

.gc-analisis-nota {
    margin: 12px 0 0 0;
    font-size: 11px;
    color: var(--text-muted);
}


/* ============================================================
   SIN DESPLAZAMIENTO — bloque solicitado por el usuario
   ============================================================
   Anula el desplazamiento en todo el panel. El contenido que no quepa en
   pantalla queda recortado y SIN forma de alcanzarse.

   PARA REVERTIR: borrar este bloque completo. No se modificó ninguna otra
   regla del archivo, así que el comportamiento anterior vuelve tal cual.

   Qué deja de ser alcanzable en cada contenedor:
   - .dashboard-content ......... cualquier sección más alta que la ventana.
   - .modal-card ................ el final de los modales largos.
   - .table-container / wrappers  las columnas que excedan el ancho.
   - .right-panel ............... el final del panel de detalle de cliente.
   - .gc-combo-list ............. los movimientos que pasen de la altura fija.
   - main.crm-main-content ...... el contenido en tablet.
   ============================================================ */

html,
body {
    overflow: hidden !important;
}

.dashboard-content,
.right-panel,
.modal-card,
.gc-combo-list,
.table-container,
.table-responsive-wrapper,
.data-table-container,
.table-responsive,
main.crm-main-content {
    overflow: hidden !important;
}


/* ============================================================
   EXCEPCIÓN al bloque SIN DESPLAZAMIENTO
   ============================================================
   El listado de movimientos sí desplaza, porque crece sin límite.
   Se le devuelve el scroll vertical y se fija la cabecera, para no perder
   de vista las columnas al bajar.
   ============================================================ */
/* La tabla ya NO desplaza por su cuenta: lo hace el contenedor del módulo, de
   modo que quede una sola barra en vez de dos anidadas. */
#gastos-tab-movimientos .table-responsive {
    overflow: visible !important;
    border: 1px solid var(--border-light);
    border-radius: 8px;
}

/* Cabecera fija dentro del propio contenedor que desplaza.
   Son DOS filas —totales y títulos de columna— y hay que escalonarlas: si
   ambas se anclan en top:0 se montan una sobre otra al desplazar.
   La altura real de la fila de totales la mide el JS y la publica en
   --gc-totales-alto; el valor de respaldo cubre el primer pintado. */
#gastos-tab-movimientos .table-responsive thead tr.totales-row th {
    position: sticky;
    /* Se anclan bajo la cabecera del módulo, que también es fija. Su alto lo
       mide el JS y lo publica en --gc-cabecera-alto. */
    top: var(--gc-cabecera-alto, 200px);
    z-index: 4;
    background-color: var(--bg-hover);
    /* Sin borde inferior: era la grieta visible entre esta fila y la de
       títulos. La separación con los datos la marca la fila de títulos. */
    border-bottom: 0;
}

#gastos-tab-movimientos .table-responsive thead tr:not(.totales-row) th {
    position: sticky;
    /* Se descuentan 2px para que las dos filas se solapen de verdad. Con menos
       margen, cualquier redondeo de medio pixel abre una grieta por la que se
       ven pasar las filas al desplazar. */
    top: calc(var(--gc-cabecera-alto, 200px) + var(--gc-totales-alto, 42px) - 2px);
    z-index: 3;
    background-color: var(--bg-card);
    border-top: 0;
    margin: 0;
}

/* Nada debe separar las dos filas fijas: ni espaciado de tabla, ni márgenes. */
#gastos-tab-movimientos .table-responsive table {
    border-collapse: collapse;
    border-spacing: 0;
}

#gastos-tab-movimientos .table-responsive thead,
#gastos-tab-movimientos .table-responsive thead tr {
    margin: 0;
    padding: 0;
    border: 0;
}

/* Con border-collapse: collapse los bordes de una celda fija no se pintan al
   desplazar, así que la línea separadora se hace con sombra. */
#gastos-tab-movimientos .table-responsive thead tr:not(.totales-row) th {
    box-shadow: inset 0 -1px 0 var(--border-light);
}

/* Barra discreta, acorde al panel. */
#gastos-tab-movimientos .table-responsive::-webkit-scrollbar {
    width: 10px;
    height: 10px;
}

#gastos-tab-movimientos .table-responsive::-webkit-scrollbar-track {
    background: transparent;
}

#gastos-tab-movimientos .table-responsive::-webkit-scrollbar-thumb {
    background-color: var(--border-light);
    border-radius: 999px;
}

#gastos-tab-movimientos .table-responsive::-webkit-scrollbar-thumb:hover {
    background-color: var(--text-muted);
}

/* ============================================================
   Cabecera de Ingresos y Egresos: alineación a la izquierda
   ============================================================
   .dashboard-header-block trae align-items: flex-end desde dashboard.css.
   En esta vista el bloque es una columna, así que ese valor empujaba título,
   pestañas y franja de totales contra el borde derecho, encogidos al ancho
   de su contenido y dejando un hueco a la izquierda.
   ============================================================ */
#view-gastos .dashboard-header-block {
    align-items: stretch;
}

/* ============================================================
   Globo de los gráficos (tooltip fuera del lienzo)
   ============================================================
   Vive en el <body>, no dentro del canvas, para que ni el tamaño del lienzo
   ni el overflow: hidden de .ggs-container puedan recortarlo.
   ============================================================ */
#gc-tooltip {
    position: fixed;
    z-index: 9500;
    top: 0;
    left: 0;
    padding: 6px 10px;
    border-radius: 6px;
    background-color: rgba(17, 24, 39, 0.94);
    color: #ffffff;
    font-family: 'Montserrat', sans-serif;
    font-size: 11px;
    font-weight: 500;
    line-height: 1.3;
    white-space: nowrap;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.22);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.12s ease;
}

/* ============================================================
   Desplazamiento interno: Ingresos y Egresos, y Dashboard
   ============================================================
   Una sola barra, desde justo debajo del encabezado hacia abajo. Ese bloque
   es sticky dentro de este mismo contenedor, así que permanece quieto y la
   barra arranca por debajo, sin atravesarlo.
   El padding-right separa la barra de las tarjetas: no queda pegada a ellas.
   No se toca el desplazamiento de la página: sigue anulado.
   ============================================================ */
#view-gastos,
#view-dashboard,
#view-ordenes-compra {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;

    /* Aire entre el contenido y la barra, para que no se toquen. */
    padding-right: 14px;

    /* Firefox */
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

/* --- Chrome, Edge y Safari --- */
#view-gastos::-webkit-scrollbar,
#view-dashboard::-webkit-scrollbar,
#view-ordenes-compra::-webkit-scrollbar {
    width: 10px;
}

#view-gastos::-webkit-scrollbar-track,
#view-dashboard::-webkit-scrollbar-track,
#view-ordenes-compra::-webkit-scrollbar-track {
    background: transparent;
}

/* El borde transparente con background-clip deja el pulgar más delgado y
   despegado del borde: son 10px de canal con 6px de pulgar visible. */
#view-gastos::-webkit-scrollbar-thumb,
#view-dashboard::-webkit-scrollbar-thumb,
#view-ordenes-compra::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.15s ease;
}

#view-gastos::-webkit-scrollbar-thumb:hover,
#view-dashboard::-webkit-scrollbar-thumb:hover,
#view-ordenes-compra::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

/* Firefox no distingue el hover del pulgar, solo el del contenedor. */
#view-gastos:hover,
#view-dashboard:hover,
#view-ordenes-compra:hover {
    scrollbar-color: #64748b transparent;
}

/* --- Tema oscuro: gris suave en reposo, azul brillante al pasar --- */
html[data-theme="dark"] #view-gastos,
html[data-theme="dark"] #view-dashboard,
html[data-theme="dark"] #view-ordenes-compra {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-gastos::-webkit-scrollbar-thumb,
html[data-theme="dark"] #view-dashboard::-webkit-scrollbar-thumb,
html[data-theme="dark"] #view-ordenes-compra::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-gastos::-webkit-scrollbar-thumb:hover,
html[data-theme="dark"] #view-dashboard::-webkit-scrollbar-thumb:hover,
html[data-theme="dark"] #view-ordenes-compra::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

html[data-theme="dark"] #view-gastos:hover,
html[data-theme="dark"] #view-dashboard:hover,
html[data-theme="dark"] #view-ordenes-compra:hover {
    scrollbar-color: #60a5fa transparent;
}

/* ============================================================
   Fila de TOTALES como mini tarjetas
   ============================================================
   Cada tarjeta vive dentro de la celda de su propia columna, de modo que
   queda alineada con las cifras que resume.
   ============================================================ */
#gastos-tab-movimientos .totales-row .gc-tot-rotulo {
    text-align: right;
    padding-right: 1.25rem;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-muted);
    vertical-align: middle;
}

#gastos-tab-movimientos .totales-row .gc-tot-celda {
    padding: 8px 6px;
    vertical-align: middle;
}

.gc-tot-card {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
    border-radius: 8px;
    /* Fondo y borde derivados del color del estado, apenas insinuados. */
    background-color: color-mix(in srgb, var(--gc-tot-color) 10%, transparent);
    border: 1px solid color-mix(in srgb, var(--gc-tot-color) 28%, transparent);
    white-space: nowrap;
}

.gc-tot-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    flex-shrink: 0;
    border-radius: 6px;
    background-color: color-mix(in srgb, var(--gc-tot-color) 18%, transparent);
    color: var(--gc-tot-color);
    font-size: 11px;
}

.gc-tot-datos {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
}

.gc-tot-label {
    font-size: 9px;
    font-weight: 500;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-muted);
}

.gc-tot-monto {
    font-size: 13px;
    font-weight: 700;
    color: var(--gc-tot-color);
}

/* Colores por estado */
.gc-tot--valor   { --gc-tot-color: #6366f1; }
.gc-tot--abonado { --gc-tot-color: #22c55e; }
.gc-tot--saldo   { --gc-tot-color: #ef4444; }

/* Respaldo para navegadores sin color-mix: se pierde el tinte, no la lectura. */
@supports not (background-color: color-mix(in srgb, red 10%, transparent)) {
    .gc-tot-card {
        background-color: var(--bg-surface);
        border-color: var(--border-light);
    }
    .gc-tot-icono {
        background-color: var(--bg-hover);
    }
}

/* ============================================================
   Símbolo $ centrado en el donut de la franja de totales
   ============================================================
   Va como elemento del documento sobre el lienzo, no pintado en el canvas:
   así hereda el color del tema y se puede rotar sin tocar Chart.js.
   El donut tiene cutout del 70%, de modo que el centro queda libre.
   ============================================================ */
.ggs-chart-simbolo {
    /* Se centra ocupando todo el hueco y repartiendo con flex, no con
       translate: así queda recto y sin depender de ninguna transformación. */
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    transform: none;
    font-family: 'Montserrat', sans-serif;
    font-size: 18px;
    font-weight: 700;
    line-height: 1;
    color: var(--color-accent);
    pointer-events: none;
    user-select: none;
}


/* ============================================================
   Borde de foco y hover de los campos
   ============================================================
   Sustituye el anillo verde anterior por un gris acorde al tema.
   ============================================================ */
:root {
    --gc-borde-foco: #CBD5E1;
}

html[data-theme="dark"] {
    --gc-borde-foco: #64748B;
}

/* Hover: solo el borde cambia, sin anillo, para que sea apenas un indicio. */
.gc-input:hover:not(:disabled),
.gc-select:hover:not(:disabled),
.search-filter-container .search-box input:hover,
.search-filter-container select:hover:not(:disabled) {
    border-color: var(--gc-borde-foco);
}

/* Respaldo para navegadores sin color-mix. */
@supports not (box-shadow: 0 0 0 3px color-mix(in srgb, red 40%, transparent)) {
    .gc-input:focus,
    .gc-select:focus,
    .search-filter-container .search-box input:focus,
    .search-filter-container select:focus,
    .gc-refresh-btn:focus-visible {
        box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.35);
    }
}

/* ============================================================
   Brillo animado de la barra de avance
   ============================================================
   El destello vive dentro del relleno verde y queda recortado por su
   overflow, de modo que nunca se sale de la parte ya completada.
   ============================================================ */
.gc-avance-relleno {
    position: relative;
    overflow: hidden;
}

.gc-avance-relleno::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(
        100deg,
        rgba(255, 255, 255, 0) 25%,
        rgba(255, 255, 255, 0.42) 50%,
        rgba(255, 255, 255, 0) 75%
    );
    transform: translateX(-100%);
    animation: gc-shimmer 3s ease-in-out infinite;
}

/* El destello recorre la barra y luego descansa, para no resultar insistente. */
@keyframes gc-shimmer {
    0%   { transform: translateX(-100%); }
    55%  { transform: translateX(100%); }
    100% { transform: translateX(100%); }
}

@media (prefers-reduced-motion: reduce) {
    .gc-avance-relleno::after {
        animation: none;
        opacity: 0;
    }
}

/* ============================================================
   Icono de la bolsa: oscuro en tema claro, claro en tema oscuro
   ============================================================ */
#view-gastos .dashboard-title i {
    color: var(--text-primary);
}

/* ============================================================
   Tarjetas de métricas: acento propio por indicador
   ============================================================
   El color vive en el icono, el borde izquierdo y el detalle. El fondo se
   mantiene limpio para que el tablero siga leyéndose corporativo.
   ============================================================ */
.metric-card {
    --kpi-color: var(--text-muted);
    position: relative;
    border-left: 3px solid var(--kpi-color);
}

.metric-card:hover {
    border-color: var(--border-strong);
    border-left-color: var(--kpi-color);
}

/* El icono pasa a un recuadro teñido, en vez de texto gris suelto. */
.metric-card .metric-card__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    flex-shrink: 0;
    border-radius: 10px;
    background-color: color-mix(in srgb, var(--kpi-color) 12%, transparent);
    color: var(--kpi-color);
    opacity: 1;
}

/* Un color por indicador */
.metric-card--empresarios   { --kpi-color: #3b82f6; }
.metric-card--oportunidades { --kpi-color: #8b5cf6; }
.metric-card--ventas        { --kpi-color: #22c55e; }
.metric-card--conversion    { --kpi-color: #06b6d4; }
.metric-card--cotizaciones  { --kpi-color: #f97316; }

/* Plan Estrella: el color lo fija el JS según el plan más vendido.
   El azul de arranque es el identificador de Esencial. */
.metric-card--plan {
    --kpi-color: #3b82f6;
    border-color: color-mix(in srgb, var(--kpi-color) 32%, var(--border-default));
    background-image: linear-gradient(
        135deg,
        color-mix(in srgb, var(--kpi-color) 9%, transparent) 0%,
        transparent 55%
    );
}

.metric-card--plan .metric-card__value {
    color: var(--kpi-color);
}

/* Respaldo sin color-mix: se pierde el tinte, no la lectura. */
@supports not (background-color: color-mix(in srgb, red 12%, transparent)) {
    .metric-card .metric-card__icon { background-color: var(--bg-hover); }
    .metric-card--plan {
        background-image: none;
        border-color: var(--border-strong);
    }
}

/* ============================================================
   Dashboard: hover de las tarjetas y comportamiento responsivo
   ============================================================ */

/* --- Hover premium de los KPI --- */
.metric-card {
    transition: background-color 0.18s ease,
                border-color 0.18s ease,
                transform 0.18s ease,
                box-shadow 0.18s ease;
}

.metric-card:hover {
    /* Tinte al 10%: se percibe el color sin comprometer el contraste del
       texto, que sigue leyéndose sobre un fondo casi blanco. */
    background-color: color-mix(in srgb, var(--kpi-color) 10%, var(--bg-surface));
    border-color: color-mix(in srgb, var(--kpi-color) 45%, var(--border-default));
    border-left-color: var(--kpi-color);
    transform: translateY(-2px) scale(1.008);
    box-shadow: 0 6px 18px color-mix(in srgb, var(--kpi-color) 18%, transparent);
}

.metric-card:hover .metric-card__icon {
    background-color: color-mix(in srgb, var(--kpi-color) 22%, transparent);
}

@media (prefers-reduced-motion: reduce) {
    .metric-card:hover {
        transform: none;
    }
}

@supports not (background-color: color-mix(in srgb, red 10%, transparent)) {
    .metric-card:hover {
        background-color: var(--bg-hover);
        box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
    }
}

/* --- Rejilla de KPI: 3, 2 o 1 columna según el ancho --- */
.metric-grid {
    grid-template-columns: repeat(3, 1fr);
}

@media (max-width: 1400px) {
    .metric-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 900px) {
    .metric-grid {
        grid-template-columns: 1fr;
    }
}

/* --- Bloque de gráficos y tablas ---
   Estaba fijo en 2fr 1fr dentro del HTML, así que en monitores pequeños la
   columna derecha se estrangulaba y el contenido se desalineaba. */
.dash-split {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: 1.5rem;
    align-items: start;
}

@media (max-width: 1400px) {
    .dash-split {
        grid-template-columns: 1fr;
    }
}

/* Las tarjetas no deben encogerse por debajo de su contenido: sin esto una
   celda de rejilla se desborda en vez de reorganizarse. */
.metric-card,
.dash-split > * {
    min-width: 0;
}

/* ============================================================
   Registrar cliente: encabezado fijo y scroll interno
   ============================================================
   Mismo patrón que Dashboard e Ingresos y Egresos: el contenedor de la vista
   es el que desplaza y el encabezado queda sticky dentro de él, de modo que
   sólo el título permanece quieto. No se toca ninguna medida del formulario.
   ============================================================ */
#view-registrar {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;

    /* Aire entre el contenido y la barra, igual que en el Dashboard. */
    padding-right: 14px;

    /* Firefox */
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

#view-registrar::-webkit-scrollbar {
    width: 10px;
}

#view-registrar::-webkit-scrollbar-track {
    background: transparent;
}

#view-registrar::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.15s ease;
}

#view-registrar::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

#view-registrar:hover {
    scrollbar-color: #64748b transparent;
}

html[data-theme="dark"] #view-registrar {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-registrar::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-registrar::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

html[data-theme="dark"] #view-registrar:hover {
    scrollbar-color: #60a5fa transparent;
}

/* .table-section trae overflow: hidden para recortar sus esquinas redondeadas.
   Ese overflow en un ancestro impide que el encabezado se ancle: es la causa
   habitual de que un position: sticky no pegue. Se libera sólo aquí.
   Las esquinas se conservan pasándole el radio al propio encabezado. */
#view-registrar .table-section {
    overflow: visible;
    /* Sin borde ni curva arriba: al liberar el overflow, esa curva y ese
       trazo asomaban por las esquinas mientras el formulario pasaba por
       detrás del encabezado. */
    border-top: 0;
    border-top-left-radius: 0;
    border-top-right-radius: 0;
}

/* Sólo el encabezado queda fijo. El fondo es el de la tarjeta que lo
   contiene, no el de la página: si no coincide, el formulario se vería pasar
   por detrás con otro color. */
#view-registrar .table-header-block {
    position: sticky;
    top: 0;
    z-index: 100;
    background-color: var(--bg-card);
    border-radius: 0;
    /* Se extiende 1px a cada lado para tapar los bordes laterales de la
       tarjeta: sin esto quedaban dos trazos cortos en las esquinas. */
    margin-left: -1px;
    margin-right: -1px;
    padding-left: calc(1.5rem + 1px);
    padding-right: calc(1.5rem + 1px);
    /* Mismo equilibrio vertical que en Buscar clientes. */
    padding-top: 1.15rem;
    padding-bottom: 1.15rem;
}

/* El formulario no debe desplazar por su cuenta: lo hace el contenedor, para
   que no queden dos barras anidadas. Se anula la regla de tablet. */
#view-registrar main.crm-main-content {
    max-height: none;
    overflow: visible !important;
    padding-right: 0;
}

/* Título en Montserrat 22px, tomando el peldaño ya definido en la escala.
   El peso baja a 600: la regla global de h2 lo dejaba en 700. */
#view-registrar .th-top h2 {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    font-family: 'Montserrat', sans-serif;
    font-size: var(--fs-xl);
    font-weight: var(--fw-semibold);
    line-height: 1.2;
    color: var(--text-primary);
}

#view-registrar .th-top h2 .th-icono {
    flex-shrink: 0;
    /* currentColor: sigue al texto y por tanto al tema. */
    color: currentColor;
    /* Compensa el peso óptico del trazo frente a la altura de la mayúscula. */
    margin-top: 1px;
}

/* ============================================================
   Buscar clientes: encabezado fijo, filtros compactos y tabla proporcionada
   ============================================================
   Mismo patrón de desplazamiento que Registrar cliente y Dashboard.
   ============================================================ */
#view-buscar {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;
    padding-right: 14px;

    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

#view-buscar::-webkit-scrollbar {
    width: 10px;
}

#view-buscar::-webkit-scrollbar-track {
    background: transparent;
}

#view-buscar::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.15s ease;
}

#view-buscar::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

#view-buscar:hover {
    scrollbar-color: #64748b transparent;
}

html[data-theme="dark"] #view-buscar {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-buscar::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-buscar::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

html[data-theme="dark"] #view-buscar:hover {
    scrollbar-color: #60a5fa transparent;
}

/* El overflow de la tarjeta impide anclar el encabezado; se libera y el
   borde superior se retira para que no asome por las esquinas. */
#view-buscar .table-section {
    overflow: visible;
    border-top: 0;
    border-top-left-radius: 0;
    border-top-right-radius: 0;
}

#view-buscar .table-header-block {
    position: sticky;
    top: 0;
    z-index: 100;
    background-color: var(--bg-card);
    border-radius: 0;
    margin-left: -1px;
    margin-right: -1px;
    padding-left: calc(1.5rem + 1px);
    padding-right: calc(1.5rem + 1px);
    /* Aire equilibrado arriba y abajo: la regla base deja 1.5rem arriba y
       cero abajo, así que el título quedaba descentrado en su banda y la
       primera fila se le pegaba al pie al desplazar. */
    padding-top: 1.15rem;
    padding-bottom: 1.15rem;
}

/* Título oscuro con lupa. La regla global .th-top h2 lo fijaba en #fff, que
   sobre la tarjeta clara resultaba ilegible. */
#view-buscar .th-top h2 {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    font-family: 'Montserrat', sans-serif;
    font-size: var(--fs-xl);
    font-weight: var(--fw-semibold);
    line-height: 1.2;
    color: var(--text-primary);
}

#view-buscar .th-top h2 .th-icono {
    flex-shrink: 0;
    color: currentColor;
    margin-top: 1px;
}

/* --- Buscador y filtros compactos --- */
#view-buscar .filters-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    gap: 0.75rem;
    align-items: end;
}

#view-buscar .bc-label {
    display: block;
    margin-bottom: 0.25rem;
    font-size: var(--fs-xs);
    font-weight: var(--fw-medium);
    color: var(--text-muted);
}

#view-buscar .bc-select {
    width: 100%;
    min-height: 38px;
    padding: 0 2rem 0 0.7rem;
    border: 1px solid var(--border-light);
    border-radius: var(--radius-sm);
    background-color: var(--bg-body);
    color: var(--theme-text-main);
    font-family: inherit;
    font-size: var(--fs-xs);
    cursor: pointer;
    appearance: none;
    -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.6rem center;
    background-size: 0.9em;
}

html[data-theme="dark"] #view-buscar .bc-select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2394a3b8'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
}

#view-buscar .bc-select:focus {
    outline: none;
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

/* --- Tabla: proporción sin imponer un reparto fijo ---
   NO usar table-layout: fixed aquí. Tres celdas del cuerpo (agendamiento,
   asesor y acciones) no llevan clase col-* y traen su propio min-width en
   línea, así que con reparto fijo la cabecera y el cuerpo dejan de coincidir
   y las columnas se desalinean. Se deja el reparto automático y sólo se
   limita el ancho de las columnas de texto libre. */
#leads-table {
    width: 100%;
}

/* El desplegable de estado no debe desbordar su celda e invadir la
   siguiente columna. */
#leads-table td.col-estado .estado-select {
    max-width: 100%;
}

/* La tabla necesita desplazamiento horizontal: el bloque SIN DESPLAZAMIENTO
   dejó .table-container en overflow: hidden, lo que recortaba las últimas
   columnas sin forma de alcanzarlas. Se restituye sólo en esta tabla, que es
   la única con doce columnas. */
#table-container-leads {
    overflow-x: auto !important;
}

#table-container-leads::-webkit-scrollbar {
    height: 10px;
}

#table-container-leads::-webkit-scrollbar-track {
    background: transparent;
}

#table-container-leads::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
}

#table-container-leads::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

html[data-theme="dark"] #table-container-leads::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #table-container-leads::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

/* Estos dos anchos coinciden con los que la tabla ya trae en línea: se
   declaran igual para que el CSS no contradiga lo que realmente se aplica.
   El 50px además debe coincidir con el left de la segunda columna fija. */
/* Sólo las columnas que SÍ llevan clase en cabecera y cuerpo. Las demás
   conservan el reparto que ya tenían. */
#leads-table .col-cliente  { max-width: 210px; }
#leads-table .col-empresa  { max-width: 175px; }
#leads-table .col-email    { max-width: 200px; }

/* Con table-layout fijo el texto largo desbordaría la celda: se recorta con
   puntos suspensivos en las columnas de texto libre. */
#leads-table tbody td.col-cliente,
#leads-table tbody td.col-empresa,
#leads-table tbody td.col-email {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ============================================================
   Panel lateral derecho: se retira la pestaña azul
   ============================================================
   El panel sigue funcionando: el módulo de clientes lo abre solo al
   seleccionar un cliente (ui.js) y se cierra con su propia X. Lo que
   desaparece es el interruptor manual, que aparecía en todas las vistas.
   ============================================================ */
#toggle-right-panel {
    display: none !important;
}

/* Icono de calendario del filtro de fecha.
   Llevaba #cbd5e1 fijo, que sobre la tarjeta clara apenas se distinguía.
   Con la variable del tema gana contraste en claro y lo conserva en oscuro. */
#view-buscar .bc-icono-fecha {
    color: var(--text-secondary);
    font-size: 0.95rem;
}

/* Se refuerza al enfocar o pasar el cursor por el campo. */
#view-buscar .custom-date-filter:hover + .bc-icono-fecha,
#view-buscar .custom-date-filter:focus + .bc-icono-fecha {
    color: var(--text-primary);
}

/* Campo de fecha del filtro: mismas medidas y tipografía que .bc-select.
   No declaraba font-size, así que heredaba 16px frente a los 12px de los
   selectores, y llevaba color:#fff, ilegible sobre la tarjeta clara. */
#view-buscar .custom-date-filter {
    min-height: 38px;
    padding: 0 2.4rem 0 0.7rem;
    border-radius: var(--radius-sm);
    font-family: inherit;
    font-size: var(--fs-xs);
    color: var(--theme-text-main);
}

#view-buscar .custom-date-filter::placeholder {
    color: var(--text-muted);
    font-size: var(--fs-xs);
}

/* Mismo anillo de foco que el resto de los campos del panel. */
#view-buscar .custom-date-filter:focus {
    border-color: var(--gc-borde-foco);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--gc-borde-foco) 40%, transparent);
}

/* ============================================================
   Disponibilidad de Espacios: cabecera y botonería
   ============================================================
   Sólo cabecera y barra de herramientas. El contenedor del plano
   (#plano-container / #plano-map) NO se toca: está blindado.
   ============================================================ */
/* El contenedor de vistas trae 2rem de relleno superior. Aquí se recupera
   parte de ese espacio para que el bloque suba, sin alterar el relleno global
   que usan las demás secciones. */
#view-planimetria {
    margin-top: -1rem;
    max-height: calc(100vh - 100px);
    overflow-y: auto;
    padding-right: 6px;
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

/* --- Scrollbar Personalizado para Planimetría --- */
#view-planimetria::-webkit-scrollbar {
    width: 10px;
}

#view-planimetria::-webkit-scrollbar-track {
    background: transparent;
}

#view-planimetria::-webkit-scrollbar-thumb {
    background-color: #cbd5e1; /* Gris clarito */
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.2s ease;
}

#view-planimetria::-webkit-scrollbar-thumb:hover {
    background-color: #475569; /* Oscuro al pasar el mouse */
}

#view-planimetria::-webkit-scrollbar-thumb:active {
    background-color: #2563eb; /* Oscuro de color azul */
}

/* Tema Oscuro */
html[data-theme="dark"] #view-planimetria {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-planimetria::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-planimetria::-webkit-scrollbar-thumb:hover {
    background-color: #3b82f6; /* Azul al pasar el mouse */
}

html[data-theme="dark"] #view-planimetria::-webkit-scrollbar-thumb:active {
    background-color: #1d4ed8;
}

.pl-cabecera {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.85rem;
    /* Compacto arriba, con algo más de aire abajo para separar del plano.
       La botonería conserva su margen lateral. */
    padding: 0.7rem 1.25rem 0.9rem;
}

.pl-cabecera .header-title {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.3rem;
    min-width: 0;
}

.pl-cabecera .header-title h2 {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    margin: 0;
    font-family: 'Montserrat', sans-serif;
    font-size: var(--fs-xl);
    font-weight: var(--fw-semibold);
    line-height: 1.2;
    color: var(--text-primary);
}

.pl-cabecera .header-title h2 .pl-icono {
    flex-shrink: 0;
    color: currentColor;
    margin-top: 1px;
}

/* La insignia de versión pasa a ser texto secundario bajo el título:
   se conserva como insignia, pero más discreta. */
.pl-insignia {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 999px;
    background: rgba(16, 185, 129, 0.12);
    border: 1px solid rgba(16, 185, 129, 0.28);
    color: #10b981;
    font-size: var(--fs-micro);
    font-weight: var(--fw-medium);
    letter-spacing: 0.02em;
    line-height: 1.6;
}

/* Botonería: más aire entre controles y con los bordes. */
.pl-botonera {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    /* Separación suficiente para no amontonar, pero sin desperdiciar alto
       cuando los controles envuelven en dos filas. */
    gap: 0.5rem;
    row-gap: 0.45rem;
    flex: 1 1 auto;
    justify-content: flex-end;
    min-width: 0;
}

/* Botones algo más bajos: son diez controles en una barra, y cada píxel de
   alto que se ahorra aquí sube el plano. */
.pl-botonera .btn {
    padding-top: 0.35rem;
    padding-bottom: 0.35rem;
}

/* Separador vertical entre grupos de botones. */
.pl-botonera > div[style*="width: 1px"] {
    align-self: stretch;
    min-height: 26px;
}

@media (max-width: 1100px) {
    .pl-cabecera {
        padding: 1rem 1.15rem;
    }
    .pl-botonera {
        justify-content: flex-start;
    }
}

/* ============================================================
   Directivos: encabezado fijo y desplazamiento interno
   ============================================================
   Mismo patrón que las demás vistas. Sólo distribución visual: no se toca
   el organigrama ni su lógica de renderizado.
   ============================================================ */

/* Recupera parte del relleno superior del contenedor de vistas, que es de
   2rem y lo comparten todas las secciones. */
#view-directivos {
    margin-top: -1rem;
    height: calc(100% + 1rem);
    overflow-y: auto;
    /* El organigrama va en nowrap y puede exceder el ancho: se conserva el
       desplazamiento lateral para no dejar ramas inalcanzables. */
    overflow-x: auto;
    padding-right: 14px;

    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

#view-directivos::-webkit-scrollbar {
    width: 10px;
    height: 10px;
}

#view-directivos::-webkit-scrollbar-track {
    background: transparent;
}

#view-directivos::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.15s ease;
}

#view-directivos::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

#view-directivos:hover {
    scrollbar-color: #64748b transparent;
}

html[data-theme="dark"] #view-directivos {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-directivos::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-directivos::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

html[data-theme="dark"] #view-directivos:hover {
    scrollbar-color: #60a5fa transparent;
}

/* Encabezado fijo. La clase ya es sticky; aquí sólo se le da el aire
   necesario para que el organigrama no le pase pegado por debajo. */
#view-directivos .dashboard-header-block {
    padding-top: 0.75rem;
    padding-bottom: 0.85rem;
    margin-bottom: 0.5rem;
    background-color: var(--bg-body);
}

/* El organigrama arrancaba con 2rem de aire bajo el encabezado. */
#view-directivos .org-chart-wrapper {
    padding: 0.75rem 0 1.25rem;
}

#view-directivos .org-chart-container {
    padding: 0.25rem;
}

/* ============================================================
   Ingresos y Egresos: contener los desbordes al desplazar
   ============================================================ */

/* La franja de totales llevaba overflow: hidden, así que al no caber recortaba
   el texto de las tarjetas y el donut a media figura. Ahora envuelve. */
#view-gastos .ggs-container {
    flex-wrap: wrap;
    overflow: visible;
    gap: 1rem;
    row-gap: 0.75rem;
}

#view-gastos .ggs-cards {
    flex: 1 1 420px;
    min-width: 0;
}

#view-gastos .ggs-card {
    flex: 1 1 190px;
    min-width: 0;
}

/* El donut deja de ser empujado al extremo, donde quedaba bajo la barra de
   desplazamiento. */
#view-gastos .ggs-chart-wrapper {
    margin-left: auto;
}

/* --- La tabla recupera su propio desplazamiento, acotado ---
   Sin él, con diez columnas la tabla desbordaba y quedaba recortada en
   ESTADO, sin forma de llegar a las últimas columnas. */
#gastos-tab-movimientos .table-responsive {
    overflow: auto !important;
    max-height: calc(100vh - 24rem);
    min-height: 200px;
}

/* Al volver a desplazar la propia tabla, sus filas fijas se anclan de nuevo
   respecto a ella, no respecto a la cabecera del módulo. */
#gastos-tab-movimientos .table-responsive thead tr.totales-row th {
    top: 0;
}

#gastos-tab-movimientos .table-responsive thead tr:not(.totales-row) th {
    top: calc(var(--gc-totales-alto, 42px) - 2px);
}

/* Nada debe sobresalir del módulo por los lados. */
#view-gastos .gastos-tab-content,
#view-gastos .dashboard-header-block {
    max-width: 100%;
    min-width: 0;
    box-sizing: border-box;
}

/* ============================================================
   Movimientos: la tabla cabe, así que sobra la barra horizontal
   ============================================================
   Objetivo: una sola barra en todo el módulo, la vertical del contenedor.
   Para eso las diez columnas deben entrar en el ancho disponible.
   ============================================================ */

/* Reparto fijo por porcentaje. Aquí SÍ es seguro: las celdas del cuerpo las
   genera renderMovimientosTable sin anchos propios, así que siguen al
   encabezado sin pelearse con él. */
.gc-tabla-compacta {
    width: 100%;
    min-width: 1160px;
    border-collapse: collapse;
    font-size: var(--fs-xs);
}

.gc-tabla-compacta th,
.gc-tabla-compacta td {
    padding: 0.6rem 0.5rem;
    vertical-align: middle;
}

.gc-tabla-compacta thead th {
    font-size: var(--fs-micro);
    letter-spacing: 0.02em;
    font-weight: 700;
}

/* Anchos mínimos por columna para evitar que las celdas colapsen en pantallas estándar */
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(1)  { width: 80px; min-width: 80px; text-align: center; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(2)  { min-width: 270px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(3)  { min-width: 150px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(4)  { min-width: 110px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(5)  { min-width: 110px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(6)  { min-width: 125px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(7)  { min-width: 115px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(8)  { min-width: 125px; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(9)  { width: 95px; min-width: 95px; text-align: center; }
.gc-tabla-compacta thead tr:not(.totales-row) th:nth-child(10) { width: 80px; min-width: 80px; text-align: center; }

/* Contenedor responsive con desplazamiento horizontal suave si la pantalla es estrecha */
#gastos-tab-movimientos .table-responsive,
.table-responsive {
    width: 100%;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch;
}

/* Barra de scroll estilizada y sutil para tablas */
.table-responsive::-webkit-scrollbar {
    height: 6px;
}
.table-responsive::-webkit-scrollbar-track {
    background: var(--bg-surface);
    border-radius: 4px;
}
.table-responsive::-webkit-scrollbar-thumb {
    background: var(--border-light);
    border-radius: 4px;
}
.table-responsive::-webkit-scrollbar-thumb:hover {
    background: var(--text-muted);
}

/* ============================================================
   Generador de Propuesta: rejilla adaptable
   ============================================================
   El formulario pasa de filas fijas a una sola rejilla. Así, al ocultar los
   campos que la propuesta elegida no usa, los restantes se reacomodan solos
   y la tarjeta encoge sin dejar huecos.
   ============================================================ */
.pg-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.75rem 1rem;
    align-items: start;
}

.pg-grid .form-group {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-width: 0;
    margin: 0;
}

.pg-grid .pg-span-2 {
    grid-column: 1 / -1;
}

/* El botón cierra el formulario, centrado y ajustado a su contenido. */
.pg-grid .pg-accion {
    grid-column: 1 / -1;
    margin-top: 0.75rem;
    display: flex;
    /* En fila y no en columna: .form-group impone flex-direction: column, y
       dentro de una columna el hijo se estira a todo el ancho mientras
       justify-content centra en vertical. Ahí seguía saliendo a lo ancho. */
    flex-direction: row;
    justify-content: center;
    align-items: center;
}

.pg-grid .pg-accion .btn {
    /* Ancho según el texto y el icono, no toda la fila. */
    width: auto;
    flex: 0 0 auto;
    align-self: center;
    /* Misma altura que los campos del formulario, para que el bloque se lea
       proporcionado. El relleno vertical va en cero: la altura la fija
       min-height y el contenido se centra con el flex heredado de .btn. */
    min-height: 38px;
    padding: 0 1.75rem;
    border-radius: 10px;
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
    line-height: 1.2;
    gap: 0.5rem;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
    transition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;
}

.pg-grid .pg-accion .btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);
    filter: brightness(1.06);
}

.pg-grid .pg-accion .btn:active {
    transform: translateY(0);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.14);
}

/* El icono acompaña al texto sin separarse de más, y algo más pequeño para
   no dominar sobre la letra de 12px. */
.pg-grid .pg-accion .btn svg {
    margin-right: 0 !important;
    flex-shrink: 0;
    width: 16px;
    height: 16px;
}

@media (prefers-reduced-motion: reduce) {
    .pg-grid .pg-accion .btn:hover {
        transform: none;
    }
}

/* Campos ocultos: el atributo hidden no basta cuando el elemento es un
   contenedor de rejilla, hay que anular el display explícitamente. */
.pg-grid .form-group[hidden] {
    display: none !important;
}

.pg-grid label {
    font-size: var(--fs-xs);
    font-weight: var(--fw-medium);
    color: var(--text-secondary);
    margin: 0;
}

.pg-grid input,
.pg-grid select {
    width: 100%;
    min-height: 38px;
    box-sizing: border-box;
}

/* Una sola columna en pantallas estrechas. */
@media (max-width: 768px) {
    .pg-grid {
        grid-template-columns: minmax(0, 1fr);
    }
    .pg-grid .pg-span-2,
    .pg-grid .pg-accion {
        grid-column: 1 / -1;
    }
}

/* La tarjeta ya no necesita alto fijo: crece y encoge con los campos
   visibles, y sigue centrada cuando quedan pocos. */
#view-generador .card {
    height: auto;
}

/* ============================================================
   Generador de Propuesta: tres columnas y desplazamiento invisible
   ============================================================ */

/* Desplazamiento sin barra: la rueda y el panel táctil siguen funcionando,
   pero no se dibuja ningún riel. Misma técnica que ya usa .custom-year-list. */
#view-generador {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;

    scrollbar-width: none;       /* Firefox */
    -ms-overflow-style: none;    /* Edge heredado */
}

#view-generador::-webkit-scrollbar {
    display: none;               /* Chrome, Edge y Safari */
}

/* Tres columnas cuando hay ancho: los campos entran en menos filas y el
   formulario cabe sin necesidad de bajar. */
@media (min-width: 1200px) {
    .pg-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: 0.85rem 1.25rem;
    }

    /* "Tipo de propuesta" y "Monto en letras" ocupaban toda la fila. Con tres
       columnas basta con dos: así no quedan campos desmedidos. */
    .pg-grid .pg-span-2 {
        grid-column: span 2;
    }
}

/* ============================================================
   Generador de Propuesta: icono del calendario en negro
   ============================================================
   El navegador dibuja ese indicador con opacidad reducida, por eso se veía
   apagado. Cubre los dos campos de fecha del formulario, y con ello los
   cuatro tipos de propuesta: P1 a P4 comparten el mismo formulario.
   ============================================================ */
#view-generador input[type="date"]::-webkit-calendar-picker-indicator,
#view-ordenes-compra input[type="date"]::-webkit-calendar-picker-indicator,
#panel-crear-oc input[type="date"]::-webkit-calendar-picker-indicator,
#modal-nueva-orden-compra input[type="date"]::-webkit-calendar-picker-indicator {
    opacity: 0.95;
    cursor: pointer;
    /* brightness(0) lo lleva a negro pleno, no al gris del navegador. */
    filter: brightness(0);
    transition: opacity 0.15s ease;
}

#view-generador input[type="date"]::-webkit-calendar-picker-indicator:hover,
#view-ordenes-compra input[type="date"]::-webkit-calendar-picker-indicator:hover,
#panel-crear-oc input[type="date"]::-webkit-calendar-picker-indicator:hover,
#modal-nueva-orden-compra input[type="date"]::-webkit-calendar-picker-indicator:hover {
    opacity: 0.7;
}

/* En tema oscuro debe ser blanco: negro sobre fondo oscuro no se vería. */
html[data-theme="dark"] #view-generador input[type="date"]::-webkit-calendar-picker-indicator,
html[data-theme="dark"] #view-ordenes-compra input[type="date"]::-webkit-calendar-picker-indicator,
html[data-theme="dark"] #panel-crear-oc input[type="date"]::-webkit-calendar-picker-indicator,
html[data-theme="dark"] #modal-nueva-orden-compra input[type="date"]::-webkit-calendar-picker-indicator {
    filter: brightness(0) invert(1);
    opacity: 0.95;
}

/* ============================================================
   Registrar cliente: los botones inferiores no deben quedar tapados
   ============================================================
   La tarjeta del resumen lleva position: sticky. Un elemento posicionado se
   pinta por encima de sus hermanos estáticos, así que al desplazar se
   deslizaba sobre los botones y los recortaba.
   ============================================================ */
#view-registrar .crm-acciones-inferiores {
    position: relative;
    z-index: 2;
    /* Vuelven a su separación normal: los 2.5cm eran un parche para esquivar
       la tarjeta fija, y ya no hacen falta desde que ésta tiene su propio
       contenedor y no invade esta zona. */
    margin-top: 1.25rem;
    padding-bottom: 0.75rem;
}


/* ============================================================
   Registro de Auditoría
   ============================================================
   Reutiliza los componentes que ya existen: .search-filter-container y su
   .search-box, .gc-select para los desplegables, .gc-input para las fechas,
   .data-table para el listado y .gc-refresh-btn para actualizar. Aquí sólo
   se añade lo propio de esta vista.
   ============================================================ */

/* Mismo patrón de desplazamiento que las demás secciones. */
#view-auditoria {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;
    padding-right: 14px;

    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

#view-auditoria::-webkit-scrollbar {
    width: 10px;
}

#view-auditoria::-webkit-scrollbar-track {
    background: transparent;
}

#view-auditoria::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
    transition: background-color 0.15s ease;
}

#view-auditoria::-webkit-scrollbar-thumb:hover {
    background-color: #64748b;
}

html[data-theme="dark"] #view-auditoria {
    scrollbar-color: #475569 transparent;
}

html[data-theme="dark"] #view-auditoria::-webkit-scrollbar-thumb {
    background-color: #475569;
}

html[data-theme="dark"] #view-auditoria::-webkit-scrollbar-thumb:hover {
    background-color: #60a5fa;
}

#view-auditoria .aud-cabecera {
    align-items: center;
    padding-bottom: 1rem;
    margin-bottom: 1.25rem;
    border-bottom: 1px solid var(--border-light);
    background-color: var(--bg-body);
}

#view-auditoria .dashboard-title i {
    color: var(--color-accent);
}

/* --- Listado --- */
.aud-tabla {
    font-size: var(--fs-xs);
}

.aud-tabla th,
.aud-tabla td {
    padding: 0.55rem 0.6rem;
    vertical-align: top;
}

.aud-tabla thead th {
    font-size: var(--fs-micro);
    letter-spacing: 0.02em;
}

.aud-tabla .aud-fecha {
    white-space: nowrap;
    color: var(--text-secondary);
}

.aud-tabla .aud-usuario {
    font-weight: var(--fw-semibold);
    color: var(--text-primary);
}

.aud-id {
    margin-top: 2px;
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

/* Etiqueta de la acción, con el mismo lenguaje visual de los estados de
   Ingresos y Egresos. */
.aud-badge {
    display: inline-block;
    padding: 3px 8px;
    border-radius: 12px;
    font-size: var(--fs-micro);
    font-weight: var(--fw-bold);
    letter-spacing: 0.02em;
    white-space: nowrap;
}

.aud-badge--crear       { background: #22c55e22; color: #22c55e; }
.aud-badge--actualizar  { background: #3b82f622; color: #3b82f6; }
.aud-badge--estado      { background: #f59e0b22; color: #f59e0b; }
.aud-badge--anular      { background: #6b728022; color: #6b7280; }
.aud-badge--eliminar    { background: #ef444422; color: #ef4444; }

/* --- Valores antes y después --- */
.aud-cambios {
    display: flex;
    flex-direction: column;
    gap: 3px;
    font-size: var(--fs-micro);
    line-height: 1.45;
}

.aud-cambios span {
    display: inline-block;
    min-width: 46px;
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

.aud-antes {
    color: var(--text-muted);
}

.aud-antes span {
    color: #ef4444;
}

.aud-despues {
    color: var(--text-secondary);
}

.aud-despues span {
    color: #22c55e;
}

/* --- Pie con conteo y paginación --- */
.aud-pie {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-top: 1rem;
    padding-bottom: 1rem;
}

.aud-conteo {
    font-size: var(--fs-xs);
    color: var(--text-muted);
}

.aud-paginacion {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}

.aud-paginacion .btn {
    padding: 0.4rem 0.9rem;
    font-size: var(--fs-xs);
}

.aud-paginacion .btn:disabled {
    opacity: 0.45;
    cursor: not-allowed;
}

.aud-pagina {
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    color: var(--text-secondary);
    min-width: 56px;
    text-align: center;
}

/* ============================================================
   Ordenes de Compra: Formulario Compacto Ejecutivo
   ============================================================ */
@media (max-width: 900px) {
    #panel-crear-oc #form-orden-directa > div:first-of-type {
        grid-template-columns: 1fr !important;
    }
}


/* ============================================================
   Soporte Verificado
   ============================================================
   Reutiliza .metric-card para los indicadores, .search-filter-container para
   el buscador y .gc-modal para las ventanas. Sólo se añade lo propio.
   ============================================================ */
#view-reportes {
    height: 100%;
    overflow-y: auto;
    overflow-x: hidden;
    padding-right: 14px;
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}

#view-reportes::-webkit-scrollbar { width: 10px; }
#view-reportes::-webkit-scrollbar-track { background: transparent; }

#view-reportes::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
}

#view-reportes::-webkit-scrollbar-thumb:hover { background-color: #64748b; }

html[data-theme="dark"] #view-reportes { scrollbar-color: #475569 transparent; }
html[data-theme="dark"] #view-reportes::-webkit-scrollbar-thumb { background-color: #475569; }
html[data-theme="dark"] #view-reportes::-webkit-scrollbar-thumb:hover { background-color: #60a5fa; }

#view-reportes .sv-cabecera {
    align-items: center;
    padding-bottom: 1rem;
    margin-bottom: 1.25rem;
    border-bottom: 1px solid var(--border-light);
    background-color: var(--bg-body);
}

#view-reportes .dashboard-title i { color: var(--color-accent); }

/* Indicadores: se apoyan en .metric-card y solo cambian de acento. */
.metric-card--sv-completos   { --kpi-color: #22c55e; }
.metric-card--sv-incompletos { --kpi-color: #ef4444; }
.metric-card--sv-marketing   { --kpi-color: #ec4899; }
.metric-card--sv-tecno       { --kpi-color: #06b6d4; }

.sv-conteo {
    font-size: var(--fs-xs);
    color: var(--text-muted);
    white-space: nowrap;
}

/* --- Fichas pequenas --- */
.sv-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 12px;
    padding-bottom: 1.5rem;
}

.sv-vacio {
    grid-column: 1 / -1;
    padding: 2.5rem 1rem;
    text-align: center;
    font-size: var(--fs-xs);
    color: var(--text-muted);
}

.sv-ficha {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 14px;
    border: 1px solid var(--border-light);
    border-radius: 12px;
    background-color: var(--bg-card);
    text-align: left;
    cursor: pointer;
    font-family: inherit;
    transition: border-color 0.18s ease, transform 0.18s ease, box-shadow 0.18s ease;
}

.sv-ficha:hover {
    border-color: var(--color-accent);
    transform: translateY(-2px);
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.10);
}

.sv-ficha-cab {
    display: flex;
    align-items: center;
    gap: 10px;
}

/* Marco del expositor. No hay logo en la base: se usan las iniciales. */
.sv-logo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    flex-shrink: 0;
    border-radius: 10px;
    border: 2px solid var(--sv-color, var(--color-accent));
    background-color: color-mix(in srgb, var(--sv-color, #6366f1) 14%, transparent);
    color: var(--sv-color, #6366f1);
    font-size: var(--fs-sm);
    font-weight: var(--fw-bold);
}

.sv-logo--grande {
    width: 64px;
    height: 64px;
    border-radius: 14px;
    font-size: 20px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.10);
}

.sv-ficha-datos {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1;
}

.sv-ficha-nombre {
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    color: var(--text-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sv-ficha-empresa {
    font-size: var(--fs-micro);
    color: var(--text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sv-sello {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 24px;
    height: 24px;
    padding: 0 6px;
    border-radius: 999px;
    font-size: var(--fs-micro);
    font-weight: var(--fw-bold);
    flex-shrink: 0;
}

.sv-sello--ok   { background: #22c55e22; color: #22c55e; font-size: var(--fs-xs); }
.sv-sello--pend { background: #ef444422; color: #ef4444; }

.sv-mini-ramas {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
}

.sv-mini {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 7px 9px;
    border-radius: 8px;
    border: 1px solid var(--border-light);
    min-width: 0;
}

.sv-mini--tecno { border-left: 3px solid #06b6d4; }
.sv-mini--mkt   { border-left: 3px solid #ec4899; }

.sv-mini-titulo {
    font-size: 9px;
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sv-mini-dato {
    font-size: var(--fs-micro);
    font-weight: var(--fw-semibold);
    color: var(--text-primary);
}

/* --- Barra de cumplimiento --- */
.sv-barra-cab {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 5px;
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

.sv-barra-cab strong {
    font-size: var(--fs-xs);
    color: var(--text-primary);
}

.sv-barra-pista {
    height: 7px;
    border-radius: 999px;
    background-color: var(--bg-hover);
    overflow: hidden;
}

.sv-barra-relleno {
    height: 100%;
    border-radius: 999px;
    background: linear-gradient(90deg, #22c55e, #4ade80);
    transition: width 0.5s ease;
}

.sv-anuladas {
    font-size: var(--fs-micro);
    color: #ef4444;
}

/* --- Ficha grande --- */
.sv-ficha-grande {
    background: var(--bg-card);
    width: 900px;
    max-width: 94vw;
    max-height: 88vh;
    overflow-y: auto;
    border-radius: 12px;
    padding: 20px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    border: 1px solid var(--border-light);
}

.sv-encabezado {
    display: flex;
    align-items: center;
    gap: 14px;
}

.sv-nombre-grande {
    margin: 0;
    font-size: var(--fs-sm);
    font-weight: var(--fw-bold);
    color: var(--text-primary);
}

.sv-plan {
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

.sv-resumen-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.sv-chip {
    padding: 3px 10px;
    border-radius: 999px;
    font-size: var(--fs-micro);
    font-weight: var(--fw-semibold);
}

.sv-chip--pend { background: #f59e0b22; color: #f59e0b; }
.sv-chip--ok   { background: #22c55e22; color: #22c55e; }
.sv-chip--anu  { background: #6b728022; color: #6b7280; }

.sv-columnas {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px;
}

@media (max-width: 900px) {
    .sv-columnas { grid-template-columns: 1fr; }
}

.sv-columna {
    min-width: 0;
    padding: 12px;
    border: 1px solid var(--border-light);
    border-radius: 10px;
    background-color: var(--bg-surface);
}

.sv-columna-titulo {
    margin: 0 0 10px 0;
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
    color: var(--text-primary);
}

.sv-columna-titulo i { margin-right: 6px; color: var(--text-muted); }

.sv-sin-tareas {
    margin: 0;
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

/* --- Tarea --- */
.sv-tarea {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 9px 0;
    border-bottom: 1px solid var(--border-light);
}

.sv-tarea:last-child { border-bottom: 0; }

.sv-tarea--completada .sv-tarea-texto {
    color: var(--text-muted);
    text-decoration: line-through;
}

.sv-tarea--anulada { opacity: 0.75; }

.sv-tarea--anulada .sv-tarea-texto {
    color: var(--text-muted);
    text-decoration: line-through;
    text-decoration-color: #ef4444;
}

.sv-tarea-acciones {
    display: flex;
    gap: 5px;
    flex-shrink: 0;
}

/* Chulo y equis: contorno negro en reposo; al activarse se rellenan de verde
   y rojo respectivamente. */
.sv-marca {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    padding: 0;
    border-radius: 6px;
    border: 1.5px solid var(--text-primary);
    background: transparent;
    color: var(--text-primary);
    font-size: 11px;
    cursor: pointer;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.sv-marca:hover:not(:disabled) {
    background-color: var(--bg-hover);
}

.sv-marca:disabled {
    opacity: 0.35;
    cursor: not-allowed;
}

.sv-marca--check.is-activa {
    background-color: #22c55e;
    border-color: #22c55e;
    color: #ffffff;
}

.sv-marca--equis.is-activa {
    background-color: #ef4444;
    border-color: #ef4444;
    color: #ffffff;
}

.sv-tarea-cuerpo {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
}

.sv-tarea-momento {
    font-size: 9px;
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--text-muted);
}

.sv-tarea-texto {
    font-size: var(--fs-micro);
    line-height: 1.45;
    color: var(--text-secondary);
}

.sv-ojo {
    flex-shrink: 0;
    width: 24px;
    height: 24px;
    border: 1px solid var(--border-light);
    border-radius: 6px;
    background: transparent;
    color: var(--text-muted);
    font-size: 11px;
    cursor: pointer;
}

.sv-ojo:hover {
    color: var(--color-accent);
    border-color: var(--color-accent);
}

/* --- Ventana de la observacion --- */
.sv-obs-tarea {
    margin: 0;
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

.sv-obs-texto {
    padding: 12px;
    border-radius: 8px;
    border: 1px solid var(--border-light);
    background-color: var(--bg-surface);
    font-size: var(--fs-xs);
    line-height: 1.5;
    color: var(--text-primary);
    white-space: pre-wrap;
}

.sv-obs-firma {
    margin: 0;
    font-size: 9px;
    color: var(--text-muted);
}

/* ============================================================
   Ordenes de Compra: buscador de cliente y consecutivo bloqueado
   ============================================================ */

/* La cabecera es una columna; .dashboard-header-block trae
   align-items: flex-end desde dashboard.css y eso empujaba la fila del
   titulo contra el borde derecho. Con stretch ocupa todo el ancho. */
#view-ordenes-compra .dashboard-header-block {
    align-items: stretch;
}

.oc-buscador {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}

.oc-buscador-campo {
    position: relative;
    flex: 1 1 340px;
    min-width: 240px;
    max-width: 520px;
}

.oc-buscador-lupa {
    position: absolute;
    left: 12px;
    top: 50%;
    transform: translateY(-50%);
    font-size: var(--fs-xs);
    color: var(--text-muted);
    pointer-events: none;
}

.oc-buscador-input {
    width: 100%;
    padding: 0.45rem 0.75rem 0.45rem 2.2rem;
    font-size: var(--fs-xs);
}

/* --- Lista de coincidencias --- */
.oc-resultados {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    right: 0;
    z-index: 300;
    max-height: 280px;
    overflow-y: auto;
    background-color: var(--bg-card);
    border: 1px solid var(--border-light);
    border-radius: 8px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
    scrollbar-width: thin;
}

.oc-resultado {
    display: flex;
    flex-direction: column;
    gap: 2px;
    width: 100%;
    padding: 8px 12px;
    border: 0;
    border-bottom: 1px solid var(--border-light);
    background: transparent;
    text-align: left;
    font-family: inherit;
    cursor: pointer;
}

.oc-resultado:last-child { border-bottom: 0; }

.oc-resultado:hover {
    background-color: var(--bg-hover);
}

.oc-resultado-nombre {
    font-size: var(--fs-xs);
    font-weight: var(--fw-semibold);
    color: var(--text-primary);
}

.oc-resultado-detalle {
    font-size: var(--fs-micro);
    color: var(--text-muted);
}

.oc-resultado-vacio {
    padding: 12px;
    font-size: var(--fs-micro);
    color: var(--text-muted);
    text-align: center;
}

/* --- Boton Cargar --- */
.oc-btn-cargar {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 0.45rem 1.1rem;
    border: 1px solid var(--color-primary);
    border-radius: 8px;
    background-color: var(--color-primary);
    color: #ffffff;
    font-family: inherit;
    font-size: var(--fs-xs);
    font-weight: var(--fw-bold);
    white-space: nowrap;
    cursor: pointer;
    transition: filter 0.15s ease, opacity 0.15s ease;
}

.oc-btn-cargar:hover:not(:disabled) { filter: brightness(1.08); }

.oc-btn-cargar:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

/* --- Sello del cliente ya elegido --- */
.oc-cliente-elegido {
    display: none;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 999px;
    background-color: color-mix(in srgb, #10b981 14%, transparent);
    color: #10b981;
    font-size: var(--fs-micro);
    font-weight: var(--fw-semibold);
    max-width: 260px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.oc-cliente-elegido.is-visible { display: inline-flex; }

/* --- Consecutivo: lo asigna el sistema, no se edita --- */
.oc-input-bloqueado {
    cursor: not-allowed;
    background-color: var(--bg-hover) !important;
    border-style: dashed !important;
}

.oc-input-bloqueado:focus {
    outline: none;
    box-shadow: none;
}

/* ============================================================
   EDICIÓN QUIRÚRGICA — barra flotante (tema claro y oscuro)
   Todo va acotado a #plano-surgical-toolbar / .sq-* para no
   alcanzar al resto de la planimetría ni a otros módulos.
   ============================================================ */

#plano-surgical-toolbar,
#plano-fragments-layer,
.sq-confirm,
.sq-toast {
  /* Acento corporativo de la herramienta: turquesa oscuro en claro
     (contraste AA sobre blanco) y turquesa luminoso en oscuro. */
  --sq-accent: #0f766e;
  --sq-accent-hover: #115e56;
  --sq-accent-text: #ffffff;
  --sq-surface: var(--theme-surface-main, #fffcf7);
  --sq-surface-2: var(--theme-surface-secondary, #f8f3ea);
  --sq-border: var(--theme-border, #ddd5c8);
  --sq-text: var(--theme-text-main, #172033);
  --sq-muted: var(--theme-text-secondary, #667085);
  --sq-disabled: var(--theme-text-disabled, #98a0ad);
  --sq-rect: #b45309;
  --sq-poly: #4f46e5;
  --sq-info: #0369a1;
  --sq-danger: #b91c1c;
  --sq-shadow: 0 6px 18px rgba(23, 32, 51, 0.14);
}

[data-theme="dark"] #plano-surgical-toolbar,
[data-theme="dark"] #plano-fragments-layer,
[data-theme="dark"] .sq-confirm,
[data-theme="dark"] .sq-toast {
  --sq-accent: #2dd4bf;
  --sq-accent-hover: #5eead4;
  --sq-accent-text: #04241f;
  --sq-rect: #f59e0b;
  --sq-poly: #a5b4fc;
  --sq-info: #7dd3fc;
  --sq-danger: #fca5a5;
  --sq-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
}

#plano-surgical-toolbar {
  position: absolute;
  top: 1rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 100;
  display: none;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.5rem;
  /* Con `left: 50%` el ancho disponible se reduce a la mitad del contenedor y la
     barra envolvería aun sobrando sitio; `max-content` la deja ocupar lo suyo y
     el `max-width` la obliga a envolver sólo cuando de verdad no cabe. */
  width: max-content;
  max-width: calc(100% - 1.5rem);
  padding: 0.5rem 0.85rem;
  background: var(--sq-surface);
  border: 1px solid var(--sq-border);
  border-radius: 12px;
  box-shadow: var(--sq-shadow);
  color: var(--sq-text);
}

#plano-surgical-toolbar.is-open {
  display: flex;
}

#plano-surgical-toolbar .sq-label {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  color: var(--sq-accent);
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-bold, 700);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  white-space: nowrap;
}

#plano-surgical-toolbar .sq-sep {
  width: 1px;
  height: 24px;
  background: var(--sq-border);
}

/* Base común de todos los botones de la barra y del confirmador */
.sq-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  min-height: 44px;
  min-width: 44px;
  padding: 0.4rem 0.75rem;
  border-radius: 8px;
  border: 1px solid var(--sq-border);
  background: var(--sq-surface-2);
  color: var(--sq-text);
  font-family: inherit;
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-semibold, 600);
  line-height: 1;
  cursor: pointer;
  /* Sin transición de color: estos botones comunican disponibilidad
     (habilitado / activo / guardando) y ese cambio debe leerse al instante. */
}

.sq-btn:hover:not(:disabled) {
  background: var(--sq-hover-bg, var(--theme-bg-secondary, #eee8dc));
  border-color: var(--sq-text);
}

[data-theme="dark"] .sq-btn:hover:not(:disabled) {
  --sq-hover-bg: rgba(255, 255, 255, 0.09);
}

.sq-btn:focus-visible {
  outline: 2px solid var(--sq-accent);
  outline-offset: 2px;
}

.sq-btn:active:not(:disabled) {
  transform: translateY(1px);
}

.sq-btn:disabled {
  cursor: not-allowed;
  color: var(--sq-disabled);
  border-color: var(--sq-border);
  background: transparent;
}

/* Herramientas de trazado: color propio, y relleno al quedar activas */
.sq-btn--rect { color: var(--sq-rect); }
.sq-btn--poly { color: var(--sq-poly); }
.sq-btn--info { color: var(--sq-info); }

.sq-btn.is-active {
  background: var(--sq-accent);
  border-color: var(--sq-accent);
  color: var(--sq-accent-text);
}

/* Acciones primarias: Recortar / Eliminar y Guardar cambios */
.sq-btn--primary {
  background: var(--sq-accent);
  border-color: var(--sq-accent);
  color: var(--sq-accent-text);
}

.sq-btn--primary:hover:not(:disabled) {
  background: var(--sq-accent-hover);
  border-color: var(--sq-accent-hover);
  color: var(--sq-accent-text);
}

.sq-btn--primary:disabled {
  background: transparent;
  color: var(--sq-disabled);
  border-color: var(--sq-border);
}

/* Cancelar: secundario, nunca protagonista */
.sq-btn--cancel {
  color: var(--sq-danger);
  border-color: var(--sq-border);
  background: var(--sq-surface-2);
}

.sq-btn--cancel:hover:not(:disabled) {
  border-color: var(--sq-danger);
}

/* Botonera de confirmación bajo el área seleccionada */
.sq-confirm {
  position: absolute;
  z-index: 100;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  padding: 0.5rem;
  background: var(--sq-surface);
  border: 1px solid var(--sq-accent);
  border-radius: 10px;
  box-shadow: var(--sq-shadow);
}

.sq-confirm__title {
  color: var(--sq-text);
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-semibold, 600);
  text-align: center;
  white-space: nowrap;
}

.sq-confirm__actions {
  display: flex;
  gap: 0.5rem;
}

/* Aviso breve tras guardar (sin modal) */
.sq-toast {
  position: absolute;
  top: 4.75rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 120;
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.5rem 0.9rem;
  background: var(--sq-surface);
  border: 1px solid var(--sq-accent);
  border-radius: 999px;
  box-shadow: var(--sq-shadow);
  color: var(--sq-text);
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-semibold, 600);
  opacity: 0;
  transition: opacity 0.2s ease;
  pointer-events: none;
}

.sq-toast.is-visible { opacity: 1; }
.sq-toast--error { border-color: var(--sq-danger); color: var(--sq-danger); }

/* Pantallas estrechas: la barra envuelve en vez de desbordar */
@media (max-width: 900px) {
  #plano-surgical-toolbar {
    left: 0.75rem;
    right: 0.75rem;
    transform: none;
    /* `width: auto` es imprescindible: con `max-content` el ancho ganaría al par
       left/right y la barra se saldría del plano, dejando Guardar y Cancelar
       fuera de alcance. Aquí debe envolver dentro del ancho disponible. */
    width: auto;
    max-width: none;
    justify-content: flex-start;
  }
  #plano-surgical-toolbar .sq-sep { display: none; }
  .sq-btn { padding: 0.4rem 0.6rem; }
}

/* ── Marco de ajuste del fragmento insertado ──────────────────
   Vive en #plano-fragments-layer, se posiciona en % del plano y por eso
   aguanta zoom, paneo y cambios de tamaño. Es interfaz, no composición. */
#plano-fragments-layer { pointer-events: none; }

.sq-frame {
  position: absolute;
  pointer-events: auto;
  cursor: move;
  outline: 2px dashed var(--sq-accent, #0f766e);
  outline-offset: 0;
  background: transparent;
  touch-action: none;
}

.sq-handle {
  position: absolute;
  width: 12px;
  height: 12px;
  margin: -6px 0 0 -6px;
  border-radius: 3px;
  background: var(--sq-accent, #0f766e);
  border: 2px solid #fff;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
  pointer-events: auto;
  touch-action: none;
}

[data-theme="dark"] .sq-handle {
  background: #2dd4bf;
  border-color: #04241f;
}

.sq-handle--nw { cursor: nwse-resize; }
.sq-handle--n  { cursor: ns-resize; }
.sq-handle--ne { cursor: nesw-resize; }
.sq-handle--w  { cursor: ew-resize; }
.sq-handle--e  { cursor: ew-resize; }
.sq-handle--sw { cursor: nesw-resize; }
.sq-handle--s  { cursor: ns-resize; }
.sq-handle--se { cursor: nwse-resize; }

/* Cajas seleccionables de las dos capas independientes.
   Sólo existen mientras la barra de Edición Quirúrgica está abierta. */
.sq-imgbox,
.sq-cutbox {
  position: absolute;
  pointer-events: auto;
  cursor: pointer;
  background: transparent;
  touch-action: none;
}

.sq-imgbox { outline: 1px dashed var(--sq-accent, #0f766e); outline-offset: 0; opacity: 0.65; }
.sq-imgbox:hover { opacity: 1; }

/* El recorte no se mueve: sólo se puede elegir para eliminarlo. */
.sq-cutbox { outline: 1px dotted var(--sq-danger, #b91c1c); opacity: 0.5; }
.sq-cutbox:hover { opacity: 1; }
.sq-cutbox.is-selected {
  outline: 2px solid var(--sq-danger, #b91c1c);
  opacity: 1;
  background: color-mix(in srgb, var(--sq-danger, #b91c1c) 12%, transparent);
}

/* ============================================================
   ÓRDENES DE COMPRA — modal de validación de pagos
   Acotado a #modal-oc-pagos para no alcanzar otros módulos.
   ============================================================ */

#modal-oc-pagos .ocp-resumen {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}

#modal-oc-pagos .ocp-kpi {
  background: var(--theme-surface-secondary, #f8f3ea);
  border: 1px solid var(--theme-border, #ddd5c8);
  border-radius: 10px;
  padding: 0.6rem 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

#modal-oc-pagos .ocp-kpi span {
  font-size: var(--fs-micro, 10px);
  text-transform: uppercase;
  letter-spacing: 0.4px;
  font-weight: var(--fw-semibold, 600);
  color: var(--theme-text-secondary, #667085);
}

#modal-oc-pagos .ocp-kpi strong {
  font-size: var(--fs-sm, 14px);
  font-weight: var(--fw-bold, 700);
  color: var(--theme-text-main, #172033);
}

#modal-oc-pagos .ocp-titulo {
  margin: 0 0 6px;
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-bold, 700);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--theme-text-secondary, #667085);
}

#modal-oc-pagos .ocp-label {
  display: block;
  margin-bottom: 4px;
  font-size: var(--fs-xs, 12px);
  font-weight: var(--fw-medium, 500);
  color: var(--theme-text-secondary, #667085);
}

/* La tabla puede crecer: se desplaza dentro de su caja en vez de
   desbordar el modal a lo ancho. */
#modal-oc-pagos .ocp-tabla-wrap {
  max-height: 190px;
  overflow-y: auto;
  overflow-x: auto;
  border: 1px solid var(--theme-border, #ddd5c8);
  border-radius: 10px;
}

#modal-oc-pagos .ocp-tabla {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-xs, 12px);
}

#modal-oc-pagos .ocp-tabla thead th {
  position: sticky;
  top: 0;
  background: var(--theme-surface-secondary, #f8f3ea);
  color: var(--theme-text-secondary, #667085);
  font-weight: var(--fw-semibold, 600);
  text-align: left;
  padding: 0.5rem 0.6rem;
  white-space: nowrap;
  border-bottom: 1px solid var(--theme-border, #ddd5c8);
}

#modal-oc-pagos .ocp-tabla tbody td {
  padding: 0.5rem 0.6rem;
  border-bottom: 1px solid var(--theme-border, #ddd5c8);
  color: var(--theme-text-main, #172033);
}

#modal-oc-pagos .ocp-tabla tbody tr:last-child td {
  border-bottom: none;
}
