* { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: 'Segoe UI', system-ui, sans-serif; background: #f1f5f9; color: #0f172a; } .app { display: flex; height: 100vh; overflow: hidden; } /* ── Sidebar fija ── */ .sidebar { width: 240px; background: #0f172a; color: #e2e8f0; display: flex; flex-direction: column; flex-shrink: 0; height: 100vh; position: sticky; top: 0; } .sidebar-logo { padding: 22px 18px; font-size: 18px; font-weight: 700; border-bottom: 1px solid rgba(255,255,255,0.08); } .sidebar-logo span { color: #60a5fa; } .nav { padding: 12px 8px; } .nav-item { width: 100%; text-align: left; padding: 11px 14px; margin-bottom: 4px; background: transparent; border: none; color: #cbd5e1; border-radius: 8px; cursor: pointer; font-size: 14px; display: flex; align-items: center; gap: 10px; } .nav-item:hover { background: rgba(255,255,255,0.06); } .nav-item.active { background: #2563eb; color: #fff; font-weight: 600; } .main { flex: 1; padding: 24px 28px; overflow-y: auto; height: 100vh; } .page-title { font-size: 24px; font-weight: 700; margin-bottom: 18px; color: #0f172a; } /* ── Filtros ── */ .filters { display: flex; gap: 14px; flex-wrap: wrap; align-items: flex-end; margin-bottom: 20px; } .filter-group { display: flex; flex-direction: column; gap: 4px; } .filter-group label { font-size: 11px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: .3px; } .filter-group select { padding: 8px 12px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 14px; background: #fff; min-width: 130px; cursor: pointer; } /* ── KPIs ── */ .kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-bottom: 18px; } .kpi { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 16px; } .kpi .ico { font-size: 22px; margin-bottom: 6px; } .kpi .label { font-size: 13px; font-weight: 600; color: #475569; } .kpi .value { font-size: 26px; font-weight: 800; color: #0f172a; margin: 4px 0; } .kpi .sub { font-size: 11px; color: #94a3b8; } /* tarjeta compuesta (varios sub-kpis) */ .kpi-multi { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 14px 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); } .kpi-row { display: flex; align-items: center; gap: 12px; padding: 9px 0; } .kpi-row + .kpi-row { border-top: 1px solid #f1f5f9; } .kpi-row .ico { font-size: 24px; width: 34px; text-align: center; flex-shrink: 0; } .kpi-row .txt { line-height: 1.25; } .kpi-row .txt .label { font-size: 12px; font-weight: 600; color: #64748b; } .kpi-row .txt .value { font-size: 21px; font-weight: 800; color: #0f172a; } /* ── Tablas ── */ .table-wrap { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; overflow: auto; } table { width: 100%; border-collapse: collapse; } th { background: #1e3a5f; color: #f1f5f9; padding: 10px 12px; font-size: 12px; font-weight: 700; text-align: center; white-space: nowrap; } td { padding: 9px 12px; font-size: 13px; border-bottom: 1px solid #f1f5f9; text-align: center; } tr:last-child td { border-bottom: none; } .total-row td { background: #eff6ff; font-weight: 700; } .col-name { text-align: left !important; } /* ── Loader / error ── */ .loader-wrap { display: flex; flex-direction: column; align-items: center; padding: 50px; color: #64748b; } .spinner { width: 36px; height: 36px; border: 4px solid #e2e8f0; border-top-color: #2563eb; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .loader-text { margin-top: 12px; font-size: 14px; } .error-box { background: #fee2e2; color: #991b1b; padding: 14px 18px; border-radius: 10px; font-size: 14px; } .card { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; } .card-title { font-size: 14px; font-weight: 700; color: #1e293b; margin-bottom: 12px; } /* Matriz "Detalle por Curso": líneas verticales suaves entre columnas (solo cuerpo) */ .matriz-grid tbody td { border-right: 1px solid #eef2f7; } .matriz-grid tbody td:last-child { border-right: none; }