/* ============================================================
   CEOS Networking Hub — Maquetación V2
   Tokens extraídos de docs/maquetacion_v2/referencia/css/styles.css
   Reglas scopeadas bajo .ceos-v2 para convivir con la maquetación legacy.
   Fuentes: se cargan via <link> en App.razor (CDN por ahora); pendiente
   localizarlas en wwwroot/fonts antes de producción.
   ============================================================ */

.ceos-v2 {
    /* ---- Tokens de color (oklch, copiados del diseño) ---- */
    --cv2-radius: 0.625rem;
    --cv2-navy: oklch(0.29 0.075 263);
    --cv2-background: oklch(0.20 0.035 263);
    --cv2-surface: oklch(0.29 0.075 263);
    --cv2-surface-elevated: oklch(0.33 0.08 263);
    --cv2-foreground: oklch(0.95 0.004 250);
    --cv2-popover: oklch(0.32 0.08 263);
    --cv2-primary: oklch(0.70 0.092 80);
    --cv2-primary-foreground: oklch(0.18 0.035 263);
    --cv2-gold: oklch(0.72 0.088 82);
    --cv2-gold-hex: #be9353;
    --cv2-gold-hover: #a87f44;
    /* Texto e iconos SOBRE dorado (botón primario, flotante, icono de KPI). Antes era el color
       de fondo: en oscuro salía navy sobre oro y se leía, pero en claro salía casi blanco sobre
       oro y los botones no se veían. Es un token propio para que cada tema elija. */
    --cv2-on-gold: oklch(0.16 0.04 263);
    --cv2-gold-soft: oklch(0.78 0.075 84);
    --cv2-gold-muted: oklch(0.70 0.088 82 / 0.14);
    --cv2-secondary: oklch(0.34 0.015 250);
    --cv2-muted: oklch(0.32 0.03 263);
    --cv2-muted-foreground: oklch(0.84 0.008 250);
    --cv2-accent: oklch(0.34 0.02 260);
    --cv2-success: oklch(0.68 0.10 165);
    --cv2-warning: oklch(0.72 0.10 75);
    --cv2-destructive: oklch(0.6 0.16 25);
    --cv2-border: oklch(0.64 0.018 255 / 0.30);
    --cv2-input: oklch(0.66 0.022 255 / 0.44);
    --cv2-ring: oklch(0.70 0.092 80 / 0.55);
    --cv2-chart-1: oklch(0.68 0.08 82);
    --cv2-chart-2: oklch(0.55 0.06 80);
    --cv2-chart-3: oklch(0.50 0.01 250);
    --cv2-chart-4: oklch(0.68 0.10 165);
    --cv2-chart-5: oklch(0.55 0.08 255);
    /* Quicksand y no Caviar Dreams: misma familia geometrica redondeada, pero con pesos
       reales 400/500/600. Caviar Dreams solo publica Regular y Bold, asi que cualquier
       font-weight intermedio se renderizaba como 400 y el chrome se veia fino. */
    --cv2-font-display: 'Quicksand', 'Caviar Dreams', -apple-system, sans-serif;
    --cv2-font-serif: 'Cormorant Garamond', Georgia, serif;
    --cv2-font-text: 'Inter', -apple-system, sans-serif;

    /* ---- Base (equivale al preflight, pero solo dentro de .ceos-v2) ---- */
    color-scheme: dark;
    background-color: var(--cv2-background);
    background-image: radial-gradient(ellipse 80% 50% at 50% -10%, oklch(0.66 0.085 80 / 0.04), transparent 60%),
                      radial-gradient(ellipse 60% 40% at 100% 100%, oklch(0.40 0.06 263 / 0.25), transparent 70%);
    color: var(--cv2-foreground);
    font-family: var(--cv2-font-text);
    font-size: 14px;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
}

/* Preflight de medios (equivale al de Tailwind del mock) */
.ceos-v2 img, .ceos-v2 video {
    max-width: 100%;
    height: auto;
}

/* El fondo del rediseño se pinta DENTRO de .ceos-v2; el documento se queda con el gris claro del
   diseño clásico (codebase.css) y en móvil eso se ve: al rebotar el scroll asoma una franja blanca
   por arriba y por abajo. Con el rediseño en pantalla se tiñe también el documento. Va en
   hexadecimal porque <body> está fuera de .ceos-v2 y no ve sus variables; son --cv2-background de
   cada tema, convertido de oklch. */
body:has(.ceos-v2) { background-color: #0e1626; }
body:has(.ceos-v2--light) { background-color: #f7f5ef; }

/* ============================================================
   Tema claro (día): misma identidad, luminosidad invertida.
   Solo redefine tokens — todos los componentes lo heredan.
   ============================================================ */
.ceos-v2.ceos-v2--light {
    color-scheme: light;
    --cv2-navy: oklch(0.29 0.075 263);
    --cv2-background: oklch(0.97 0.008 85);
    --cv2-surface: oklch(0.995 0.003 85);
    --cv2-surface-elevated: oklch(1 0 0);
    --cv2-foreground: oklch(0.27 0.045 263);
    --cv2-popover: oklch(1 0 0);
    --cv2-primary: oklch(0.60 0.10 80);
    --cv2-primary-foreground: oklch(0.98 0.005 85);
    --cv2-gold: oklch(0.58 0.105 82);
    /* Oro un punto más oscuro que en el tema nocturno: sobre un fondo casi blanco el #be9353 se
       lavaba y el botón primario apenas se distinguía de la tarjeta. */
    --cv2-gold-hex: #a87f44;
    --cv2-gold-hover: #93702f;
    --cv2-on-gold: oklch(0.99 0.004 85);
    --cv2-gold-soft: oklch(0.66 0.09 84);
    --cv2-gold-muted: oklch(0.58 0.105 82 / 0.10);
    --cv2-secondary: oklch(0.92 0.008 260);
    --cv2-muted: oklch(0.93 0.008 260);
    --cv2-muted-foreground: oklch(0.45 0.025 260);
    --cv2-accent: oklch(0.93 0.012 85);
    --cv2-success: oklch(0.55 0.11 165);
    --cv2-warning: oklch(0.58 0.12 75);
    --cv2-destructive: oklch(0.55 0.18 25);
    --cv2-border: oklch(0.45 0.02 255 / 0.22);
    --cv2-input: oklch(0.45 0.025 255 / 0.35);
    --cv2-ring: oklch(0.60 0.10 80 / 0.45);
    --cv2-chart-1: oklch(0.58 0.09 82);
    --cv2-chart-2: oklch(0.48 0.07 80);
    --cv2-chart-3: oklch(0.55 0.01 250);
    --cv2-chart-4: oklch(0.55 0.11 165);
    --cv2-chart-5: oklch(0.50 0.09 255);
    background-image: radial-gradient(ellipse 80% 50% at 50% -10%, oklch(0.66 0.085 80 / 0.07), transparent 60%),
                      radial-gradient(ellipse 60% 40% at 100% 100%, oklch(0.40 0.06 263 / 0.06), transparent 70%);
}

.ceos-v2 *, .ceos-v2 *::before, .ceos-v2 *::after {
    box-sizing: border-box;
    border-color: var(--cv2-border);
}

.ceos-v2 h1, .ceos-v2 h2, .ceos-v2 h3, .ceos-v2 h4 {
    margin: 0;
    font-weight: 400;
}

/* Pantalla completa (para páginas V2 con layout propio) */
.cv2-page {
    min-height: 100vh;
    padding: 2rem;
}

/* ---- Tipografía de marca ---- */
.cv2-display {
    font-family: var(--cv2-font-display);
}

.cv2-serif-title {
    font-family: var(--cv2-font-serif);
    font-size: 1.875rem;
    line-height: 1.2;
    font-weight: 500;
    color: color-mix(in oklab, var(--cv2-foreground) 92%, transparent);
}

.cv2-serif-title em {
    color: var(--cv2-gold);
    font-style: italic;
}

.cv2-eyebrow {
    font-family: var(--cv2-font-display);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    color: var(--cv2-muted-foreground);
    font-weight: 600;
}

.cv2-text-muted { color: var(--cv2-muted-foreground); }
.cv2-text-gold { color: var(--cv2-gold); }
.cv2-text-success { color: var(--cv2-success); }
.cv2-text-warning { color: var(--cv2-warning); }
.cv2-text-destructive { color: var(--cv2-destructive); }

/* Aviso/alerta en bloque (p.ej. admin viendo una página sin datos propios) */
.ceos-v2 .cv2-alert {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    padding: 0.9rem 1.25rem;
    border: 1px solid color-mix(in oklab, var(--cv2-warning) 45%, transparent);
    border-radius: 0.75rem;
    background: color-mix(in oklab, var(--cv2-warning) 10%, transparent);
    color: var(--cv2-foreground);
    font-size: 14px;
    line-height: 1.55;
}
.ceos-v2 .cv2-alert svg { width: 1.1rem; height: 1.1rem; flex-shrink: 0; margin-top: 2px; color: var(--cv2-warning); }

/* Variante de ÉXITO del mismo bloque: una operación irreversible que ha salido bien no puede
   leerse como advertencia, porque invita a repetirla. No existía ninguna variante equivalente en
   el kit (las pantallas solo tenían .aso-alert-error, y además scopeada por página). */
.ceos-v2 .cv2-alert--ok {
    border-color: color-mix(in oklab, var(--cv2-success) 45%, transparent);
    background: color-mix(in oklab, var(--cv2-success) 10%, transparent);
}
.ceos-v2 .cv2-alert--ok svg { color: var(--cv2-success); }

/* ---- Card ---- */
.cv2-card {
    border: 1px solid var(--cv2-border);
    border-radius: 0.75rem;
    background: var(--cv2-surface);
    overflow: hidden;
    transition: background 150ms ease;
}

.cv2-card:hover { background: var(--cv2-surface-elevated); }

.cv2-card--static:hover { background: var(--cv2-surface); }

.cv2-card--highlight {
    box-shadow: 0 0 0 1px var(--cv2-gold-muted);
    background-image: linear-gradient(to bottom right, var(--cv2-gold-muted), transparent 40%);
}

.cv2-card-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    /* wrap + gap: en columnas estrechas (p.ej. calendario de Reuniones) las acciones
       saltan de línea en vez de montarse sobre el título */
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    padding: 1.25rem 1.5rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-card-body { padding: 1.25rem 1.5rem; }

/* ---- KPI card ---- */
.cv2-kpi { padding: 1.25rem; }

.cv2-kpi-top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.75rem;
}

.cv2-kpi-label {
    font-family: var(--cv2-font-display);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.15em;
    font-weight: 600;
    color: color-mix(in oklab, var(--cv2-foreground) 88%, transparent);
}

.cv2-kpi-value {
    margin-top: 0.75rem;
    font-size: 2.25rem;
    line-height: 1;
    font-weight: 500;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.025em;
}

/* Escalado por longitud: importes de 6 cifras (--sm) y millones (--xs) en una sola línea. */
.cv2-kpi-value--sm { font-size: 1.65rem; }
.cv2-kpi-value--xs { font-size: 1.3rem; }

.cv2-kpi-icon {
    height: 2.25rem;
    width: 2.25rem;
    flex-shrink: 0;
    display: grid;
    place-items: center;
    border-radius: 0.5rem;
    border: 1px solid var(--cv2-gold-hex);
    background: var(--cv2-gold-hex);
    color: var(--cv2-on-gold);
}

.cv2-kpi-icon svg { height: 1rem; width: 1rem; }

.cv2-kpi-foot {
    margin-top: 1.25rem;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 12px;
    color: var(--cv2-muted-foreground);
}

/* ---- Botones ---- */
.cv2-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    height: 2.25rem;
    padding: 0 0.75rem;
    border-radius: 0.375rem;
    font-family: var(--cv2-font-text);
    font-size: 0.875rem;
    font-weight: 600;
    cursor: pointer;
    transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
    /* Borde y fondo un punto por encima de la tarjeta: el botón vivía sobre .cv2-card con el
       MISMO fondo (--cv2-surface) y un borde al 30 %, y en los modales de aportaciones
       «Cancelar» y «Cerrar» se fundían con el panel, sobre todo en el tema nocturno. */
    border: 1px solid var(--cv2-input);
    background: var(--cv2-surface-elevated);
    color: var(--cv2-foreground);
}

.cv2-btn:hover { background: var(--cv2-accent); border-color: color-mix(in oklab, var(--cv2-gold) 45%, transparent); }

.cv2-btn--primary {
    border-color: var(--cv2-gold-hex);
    background: var(--cv2-gold-hex);
    color: var(--cv2-on-gold);
}

.cv2-btn--primary:hover {
    background: var(--cv2-gold-hover);
    border-color: var(--cv2-gold-hover);
}

/* Acciones destructivas (eliminar una entidad de la Estructura). Se pinta en hueco y no en rojo
   macizo a propósito: es un botón que no debe llamar al clic, solo dejar claro qué hace. */
.cv2-btn--danger {
    border-color: color-mix(in oklab, var(--cv2-destructive) 45%, transparent);
    background: transparent;
    color: var(--cv2-destructive);
}

.cv2-btn--danger:hover {
    background: color-mix(in oklab, var(--cv2-destructive) 14%, transparent);
}

.cv2-btn--ghost {
    border-color: transparent;
    background: transparent;
    color: var(--cv2-muted-foreground);
}

.cv2-btn--ghost:hover { color: var(--cv2-gold); background: transparent; border-color: transparent; }

.cv2-btn svg { height: 1rem; width: 1rem; }

/* ---- Badges / pills ---- */
.cv2-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    border-radius: 9999px;
    border: 1px solid var(--cv2-border);
    background: color-mix(in oklab, var(--cv2-background) 40%, transparent);
    padding: 0.25rem 0.75rem;
    font-size: 12px;
    color: var(--cv2-muted-foreground);
}

.cv2-badge--gold {
    border-color: color-mix(in oklab, var(--cv2-gold) 40%, transparent);
    color: color-mix(in oklab, var(--cv2-foreground) 80%, transparent);
}

.cv2-badge-dot {
    height: 0.375rem;
    width: 0.375rem;
    border-radius: 9999px;
    background: var(--cv2-gold);
}

/* ---- Selector de periodo (pills) ---- */
.cv2-pills {
    display: inline-flex;
    /* Con seis periodos (semana, 4 semanas, 3, 6, 12 meses y todo) la fila no cabe en móvil:
       que baje a dos líneas antes que desbordar la cabecera. */
    flex-wrap: wrap;
    border: 1px solid var(--cv2-border);
    border-radius: 0.5rem;
    background: var(--cv2-surface);
    padding: 0.25rem;
    gap: 0.125rem;
}

.cv2-pill {
    height: 2rem;
    padding: 0 0.875rem;
    font-size: 12px;
    border-radius: 0.375rem;
    border: 1px solid transparent;
    background: transparent;
    color: var(--cv2-muted-foreground);
    cursor: pointer;
    white-space: nowrap;
    transition: color 150ms ease, border-color 150ms ease;
}

.cv2-pill:hover { color: var(--cv2-gold); border-color: color-mix(in oklab, var(--cv2-gold) 40%, transparent); }

.cv2-pill--active {
    background: color-mix(in oklab, var(--cv2-background) 60%, transparent);
    color: var(--cv2-gold);
    border-color: color-mix(in oklab, var(--cv2-gold) 40%, transparent);
}

/* ---- Formularios ---- */
.cv2-label {
    display: block;
    font-family: var(--cv2-font-display);
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: 0.14em;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
    margin-bottom: 0.375rem;
}

.cv2-input, .cv2-select {
    width: 100%;
    height: 2.5rem;
    padding: 0 0.75rem;
    border-radius: 0.375rem;
    border: 1px solid var(--cv2-input);
    background: color-mix(in oklab, var(--cv2-background) 60%, transparent);
    color: var(--cv2-foreground);
    font-family: var(--cv2-font-text);
    font-size: 0.875rem;
    transition: border-color 150ms ease, box-shadow 150ms ease;
}

.cv2-input:focus, .cv2-select:focus {
    outline: none;
    border-color: var(--cv2-gold-hex);
    box-shadow: 0 0 0 3px var(--cv2-ring);
}

.cv2-input::placeholder { color: color-mix(in oklab, var(--cv2-muted-foreground) 70%, transparent); }

/* ---- Tabla ---- */
.cv2-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.875rem;
}

.cv2-table th {
    font-family: var(--cv2-font-display);
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: 0.14em;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
    text-align: left;
    padding: 0.75rem 1rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-table td {
    padding: 0.875rem 1rem;
    border-bottom: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
}

.cv2-table tbody tr:hover { background: color-mix(in oklab, var(--cv2-accent) 40%, transparent); }

.cv2-table tbody tr:last-child td { border-bottom: none; }

/* ---- Utilidades mínimas de layout ---- */
.cv2-grid-kpi {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    gap: 1rem;
}

.cv2-stack > * + * { margin-top: 1.5rem; }

/* ============================================================
   Shell de aplicación: sidebar + topbar + header (Fase 1)
   ============================================================ */
/* En un móvil, 100vh es la altura CON la barra del navegador escondida: siempre MÁS de lo que se
   ve. Midiendo el shell así, el último tramo de cada página queda tapado por la barra del
   navegador y no hay forma de subirlo. 100dvh mide lo que de verdad se ve en cada momento, que es
   lo que ya se usaba en el login y en el cajón lateral. Se deja el 100vh delante como respaldo
   para el navegador que aún no entienda dvh: en escritorio las dos unidades valen lo mismo. */
.cv2-shell {
    height: 100vh;
    height: 100dvh;
    display: flex;
    overflow: hidden;
}

/* Scrollbars discretas en todo el ámbito V2 */
.ceos-v2 * {
    scrollbar-width: thin;
    scrollbar-color: color-mix(in oklab, var(--cv2-muted-foreground) 25%, transparent) transparent;
}

.ceos-v2 *::-webkit-scrollbar { width: 6px; height: 6px; }
.ceos-v2 *::-webkit-scrollbar-track { background: transparent; }
.ceos-v2 *::-webkit-scrollbar-thumb {
    background: color-mix(in oklab, var(--cv2-muted-foreground) 25%, transparent);
    border-radius: 9999px;
}
.ceos-v2 *::-webkit-scrollbar-thumb:hover {
    background: color-mix(in oklab, var(--cv2-muted-foreground) 45%, transparent);
}

/* ---- Sidebar ---- */
.cv2-sidebar {
    width: 16rem;
    flex-shrink: 0;
    border-right: 1px solid var(--cv2-border);
    background: color-mix(in oklab, var(--cv2-surface) 50%, transparent);
    display: flex;
    flex-direction: column;
    height: 100vh;
    height: 100dvh;
    overflow-y: auto;
    overflow-x: hidden;
}

.cv2-sidebar-logo {
    padding: 1.75rem 1.5rem 1.5rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-sidebar-logo img { height: 2.75rem; width: auto; max-width: 100%; object-fit: contain; }

/* El lettering hereda currentColor: blanco en noche, tinta oscura en día. */
.cv2-logo { height: 2.75rem; width: auto; max-width: 100%; color: var(--cv2-foreground); }

.cv2-sidebar-user {
    padding: 1.5rem 1.25rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-sidebar-user a {
    display: flex;
    align-items: center;
    gap: 0.875rem;
    border-radius: 0.5rem;
    margin: 0 -0.5rem;
    padding: 0.5rem;
    text-decoration: none;
    color: inherit;
    transition: background 150ms ease;
}

.cv2-sidebar-user a:hover { background: color-mix(in oklab, var(--cv2-accent) 40%, transparent); }

.cv2-avatar {
    height: 2.75rem;
    width: 2.75rem;
    border-radius: 9999px;
    overflow: hidden;
    border: 1px solid color-mix(in oklab, var(--cv2-gold) 25%, transparent);
    background: var(--cv2-secondary);
    display: grid;
    place-items: center;
    font-family: var(--cv2-font-display);
    color: var(--cv2-gold);
    flex-shrink: 0;
}

.cv2-avatar img { height: 100%; width: 100%; object-fit: cover; }

.cv2-sidebar-user-name {
    font-family: var(--cv2-font-display);
    font-size: 14.5px;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.cv2-sidebar-user-role {
    font-family: var(--cv2-font-display);
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: 0.13em;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
    margin-top: 0.25rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.cv2-nav { flex: 1; padding: 1.5rem 0.75rem; overflow-y: auto; }

/* Cabecera de grupo: desde que el menú pliega es un <button>, no un <div>. El reseteo no es
   decorativo — el reboot de Bootstrap de codebase.css se carga también en /v2/*, y sin él el botón
   sale con el fondo, el borde y la tipografía del navegador. Es el mismo reseteo que ya lleva
   .cv2-nav-link. */
.cv2-nav-section {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    background: transparent;
    border: none;
    cursor: pointer;
    text-align: left;
    font-family: var(--cv2-font-display);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.22em;
    color: color-mix(in oklab, var(--cv2-foreground) 65%, transparent);
    padding: 0.375rem 0.75rem;
    margin-bottom: 0.625rem;
    font-weight: 500;
    transition: color 150ms ease;
}

.cv2-nav-section:hover { color: var(--cv2-foreground); }

/* La separación entre grupos cuelga del envoltorio, NO del <ul>: al plegar, el <ul> desaparece del
   DOM y la regla de antes («.cv2-nav ul + .cv2-nav-section») dejaba de aplicar, con lo que las
   cabeceras cerradas se apelotonaban unas sobre otras. No la devuelvas al <ul>. */
.cv2-nav-grupo + .cv2-nav-grupo { margin-top: 2rem; }

.cv2-nav ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.375rem; }

.cv2-nav-link {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.625rem 0.75rem;
    border-radius: 0.375rem;
    font-family: var(--cv2-font-display);
    font-size: 14px;
    font-weight: 500;
    color: color-mix(in oklab, var(--cv2-foreground) 90%, transparent);
    text-decoration: none;
    background: transparent;
    border: none;
    cursor: pointer;
    transition: background 150ms ease, color 150ms ease;
}

.cv2-nav-link:hover { color: var(--cv2-foreground); background: color-mix(in oklab, var(--cv2-accent) 40%, transparent); }

.cv2-nav-link.active { color: var(--cv2-gold); background: color-mix(in oklab, var(--cv2-accent) 55%, transparent); }

/* Pantalla aún no abierta en la demo: mismo aspecto, sin respuesta al puntero. */
.cv2-nav-link:disabled { cursor: default; }
.cv2-nav-link:disabled:hover { background: transparent; color: color-mix(in oklab, var(--cv2-foreground) 90%, transparent); }

.cv2-nav-link svg { height: 1rem; width: 1rem; color: var(--cv2-muted-foreground); flex-shrink: 0; }

.cv2-nav-link.active svg { color: var(--cv2-gold); }

/* Chevron de estado de los plegadores: apunta a la derecha cerrado y gira hacia abajo al abrir.
   Lo usan las cabeceras de grupo (.cv2-nav-section) y la de «Reuniones e IA», que es un
   .cv2-nav-link. En esa segunda gana en especificidad a «.cv2-nav-link svg», que si no le impondría
   el tamaño del icono de la izquierda. */
.cv2-nav-chevron { flex-shrink: 0; transition: transform 150ms ease; }
.cv2-nav-section .cv2-nav-chevron { height: 0.8rem; width: 0.8rem; }
.cv2-nav-link .cv2-nav-chevron { height: 0.85rem; width: 0.85rem; margin-left: auto; }
.cv2-nav-section[aria-expanded="true"] > .cv2-nav-chevron,
.cv2-nav-link[aria-expanded="true"] > .cv2-nav-chevron { transform: rotate(90deg); }

.cv2-nav-sub {
    margin: 0.375rem 0 0.5rem 1.75rem;
    border-left: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
    padding-left: 0.75rem;
}

.cv2-nav-sub .cv2-nav-link { padding: 0.5rem 0.625rem; font-size: 13.5px; color: color-mix(in oklab, var(--cv2-foreground) 78%, transparent); }

/* ---- Topbar (selectores contexto) ---- */
/* overscroll-behavior: al llegar al final de la página, el gesto de seguir deslizando se quedaba
   encadenado al documento; el navegador escondía su barra y con ella se iba de la pantalla la
   barra de contexto, que es sticky respecto a este contenedor y no respecto a la pantalla. */
.cv2-main {
    flex: 1;
    min-width: 0;
    height: 100vh;
    height: 100dvh;
    overflow-y: auto;
    overflow-x: hidden;
    overscroll-behavior-y: contain;
}

.cv2-topbar {
    position: sticky;
    top: 0;
    z-index: 30;
    backdrop-filter: blur(24px);
    background: color-mix(in oklab, var(--cv2-background) 80%, transparent);
    border-bottom: 1px solid var(--cv2-border);
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0 2rem;
    height: 4rem;
}

.cv2-topbar-selects { display: flex; align-items: center; gap: 1rem; min-width: 0; overflow-x: auto; }

/* Envoltorio del bloque de contexto. En escritorio es transparente (display:contents): los tres
   selectores siguen siendo hijos directos de la barra, exactamente como antes. En móvil pasa a ser
   el ancla del desplegable que los agrupa. */
.cv2-topbar-context { display: contents; }

/* Control compacto que sustituye a los tres selectores en móvil. */
.cv2-context-trigger { display: none; }

/* Fondo que cierra el desplegable al tocar fuera. Oculto de base: si la ventana se ensancha con el
   desplegable abierto, en escritorio ya no hay desplegable y este fondo se quedaría comiéndose los
   clics de toda la página. */
.cv2-context-backdrop { display: none; }

.cv2-context-select {
    position: relative;
    flex-shrink: 0;
    border: 1px solid var(--cv2-border);
    border-radius: 0.375rem;
    background: var(--cv2-surface);
    padding: 0.375rem 0.75rem;
    min-width: 180px;
    transition: border-color 150ms ease;
}

.cv2-context-select:hover { border-color: color-mix(in oklab, var(--cv2-gold) 40%, transparent); }

/* "MASTER FRANQUICIA" no cabe en 124px y partía en dos líneas, dejando ese selector más alto que
   los otros dos. Se recorta antes que crecer: la etiqueta solo dice de qué nivel es el selector. */
.cv2-context-select-label {
    display: block;
    font-family: var(--cv2-font-display);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.13em;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
    line-height: 1;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.cv2-context-select select {
    appearance: none;
    background: transparent;
    border: none;
    color: var(--cv2-foreground);
    font-size: 0.875rem;
    font-weight: 500;
    width: 100%;
    margin-top: 0.25rem;
    cursor: pointer;
    font-family: var(--cv2-font-text);
}

.cv2-context-select select:focus { outline: none; }

.cv2-context-select option { background: var(--cv2-popover); color: var(--cv2-foreground); }

.cv2-topbar-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; }

/* ---- Page header (breadcrumb + acciones) ---- */
/* min-height y no height: con alto fijo, las acciones que no cabían quedaban recortadas por el
   overflow-x:hidden de .cv2-main y no había forma de llegar a ellas. Ahora la fila de acciones
   puede envolver y la cabecera crece lo justo. */
.cv2-pageheader {
    position: sticky;
    top: 4rem;
    z-index: 20;
    backdrop-filter: blur(24px);
    background: color-mix(in oklab, var(--cv2-background) 70%, transparent);
    border-bottom: 1px solid var(--cv2-border);
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    padding: 0.5rem 2rem;
    min-height: 4rem;
}

/* Acciones de la cabecera. Deliberadamente NO reutiliza .cv2-topbar-right: aquella nunca encoge
   (flex-shrink:0) y lo que sobraba se salía de pantalla. Aquí, sin min-width:0, el ancho mínimo
   sigue siendo el del botón más ancho: quien cede es el breadcrumb (que sí lleva min-width:0 y se
   recorta con puntos suspensivos), y si aún así no cabe, esta fila baja entera a la línea de
   abajo. Ningún botón queda cortado ni fuera de alcance. */
.cv2-pageheader-acciones {
    margin-left: auto;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex-wrap: wrap;
    gap: 0.5rem;
}

/* Columna izquierda de la cabecera: breadcrumb y, si la pantalla la pasa, su línea distintiva. */
.cv2-pageheader-main { display: flex; flex-direction: column; justify-content: center; gap: 0.125rem; min-width: 0; }

/* Frase que separa pantallas de nombre parecido (Personas / Asociados, Permisos /
   Administradores). Se recorta antes que crecer: la cabecera es una banda, no un bloque de texto. */
.cv2-pageheader-sub {
    margin: 0;
    font-size: 0.75rem;
    line-height: 1.2;
    color: var(--cv2-muted-foreground);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.cv2-breadcrumb { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; min-width: 0; overflow: hidden; }

.cv2-breadcrumb .sep { color: color-mix(in oklab, var(--cv2-muted-foreground) 60%, transparent); flex-shrink: 0; }

/* Lo demás de la miga (raíz, separadores, distintivos) se queda entero; el que cede es el título. */
.cv2-breadcrumb-raiz, .cv2-breadcrumb .cv2-badge { flex-shrink: 0; }

.cv2-breadcrumb-titulo {
    font-weight: 500;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Miga navegable (fichas con jerarquía: Estructura › Master › Franquicia › Hub) */
.cv2-breadcrumb .cv2-miga {
    color: var(--cv2-muted-foreground);
    text-decoration: none;
    white-space: nowrap;
    transition: color 150ms ease;
}

.cv2-breadcrumb .cv2-miga:hover { color: var(--cv2-gold); }

/* ---- Contenido ---- */
.cv2-content {
    padding: 1.5rem 2rem 2rem;
    max-width: 1480px;
}

/* ---- Hero (Inicio) ---- */
.cv2-hero {
    position: relative;
    overflow: hidden;
    border-radius: 1rem;
    border: 1px solid var(--cv2-border);
}

img.cv2-hero-bg, .cv2-hero-bg {
    position: absolute;
    inset: 0;
    height: 100%;
    width: 100%;
    object-fit: cover;
    opacity: 0.6;
    transform: scale(1.05);
}

.cv2-hero-overlay {
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom right,
        color-mix(in oklab, var(--cv2-background) 80%, transparent),
        color-mix(in oklab, var(--cv2-background) 55%, transparent),
        color-mix(in oklab, var(--cv2-navy) 45%, transparent));
}

.cv2-hero-inner { position: relative; padding: 3rem 2.5rem; }

/* ---- Timeline actividad ---- */
.cv2-timeline { position: relative; list-style: none; margin: 0; padding: 1.25rem 1.5rem; }

.cv2-timeline::before {
    content: '';
    position: absolute;
    left: 2.6rem;
    top: 1.75rem;
    bottom: 1.75rem;
    width: 1px;
    background: var(--cv2-border);
}

.cv2-timeline li { position: relative; display: flex; align-items: flex-start; gap: 1rem; padding: 0.875rem 0; }

.cv2-timeline-icon {
    position: relative;
    z-index: 1;
    height: 2.25rem;
    width: 2.25rem;
    flex-shrink: 0;
    display: grid;
    place-items: center;
    border-radius: 9999px;
    border: 1px solid var(--cv2-border);
    background: var(--cv2-background);
    color: var(--cv2-gold);
}

.cv2-timeline-icon--active { border-color: var(--cv2-gold-hex); background: var(--cv2-gold-hex); color: var(--cv2-on-gold); }

.cv2-timeline-icon svg { height: 1rem; width: 1rem; }

/* ---- Notificaciones (campana del topbar) ---- */
.cv2-notif-bell { position: relative; }

.cv2-notif-dot {
    position: absolute;
    top: 0.4rem;
    right: 0.45rem;
    height: 0.5rem;
    width: 0.5rem;
    border-radius: 9999px;
    background: var(--cv2-gold-hex);
    box-shadow: 0 0 0 2px var(--cv2-background);
}

/* Click-catcher: cierra el panel al pulsar fuera (paridad con el dropdown Bootstrap legacy). */
.cv2-notif-backdrop { position: fixed; inset: 0; z-index: 40; }

.cv2-notif-panel {
    position: absolute;
    right: 0;
    top: calc(100% + 0.5rem);
    width: min(24rem, calc(100vw - 2rem));
    z-index: 50;
    padding: 0;
    overflow: hidden;
    box-shadow: 0 12px 32px rgb(0 0 0 / 0.35);
}

.cv2-notif-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.75rem 1rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-notif-empty { padding: 2rem 1rem; text-align: center; }

.cv2-notif-empty p { margin: 0.75rem 0 0; font-size: 0.8rem; line-height: 1.6; }

.cv2-notif-list {
    list-style: none;
    margin: 0;
    padding: 0.375rem;
    max-height: 22rem;
    overflow-y: auto;
}

.cv2-notif-item {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    padding: 0.625rem 0.625rem;
    border-radius: 0.5rem;
}

.cv2-notif-item + .cv2-notif-item { margin-top: 0.125rem; }

.cv2-notif-item--nueva { background: color-mix(in oklab, var(--cv2-gold) 10%, transparent); }

.cv2-notif-icon {
    flex-shrink: 0;
    height: 2rem;
    width: 2rem;
    display: grid;
    place-items: center;
    border-radius: 9999px;
    border: 1px solid var(--cv2-border);
    background: color-mix(in oklab, var(--cv2-background) 40%, transparent);
    color: var(--cv2-gold);
}

.cv2-notif-icon svg { height: 0.95rem; width: 0.95rem; }

.cv2-notif-body { min-width: 0; flex: 1; }

.cv2-notif-body p {
    margin: 0;
    font-size: 0.8rem;
    line-height: 1.45;
    overflow-wrap: anywhere;
}

.cv2-notif-body span {
    display: block;
    margin-top: 0.2rem;
    font-size: 0.7rem;
    color: var(--cv2-muted-foreground);
}

/* ---- Login (página completa, fuera del shell) ---- */
.cv2-login {
    min-height: 100dvh;
    display: grid;
    place-items: center;
    padding: 1.5rem;
}

.cv2-login-checking {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1.25rem;
    font-size: 0.85rem;
}

.cv2-login-checking .cv2-logo { height: 3rem; }

.cv2-login-card {
    width: 100%;
    max-width: 26rem;
    background: color-mix(in oklab, var(--cv2-surface) 70%, transparent);
    border: 1px solid var(--cv2-border);
    border-radius: 1rem;
    padding: 2.5rem 2.25rem;
    box-shadow: 0 24px 64px rgb(0 0 0 / 0.35);
}

.cv2-login-logo { display: flex; justify-content: center; margin-bottom: 1.75rem; }

.cv2-login-logo .cv2-logo { height: 3rem; }

.cv2-login-head { text-align: center; margin-bottom: 1.75rem; }

.cv2-login-head .cv2-serif-title { margin: 0.5rem 0 0.375rem; font-size: 1.65rem; }

.cv2-login-field { margin-bottom: 1.25rem; }

.cv2-login-field .cv2-input { height: 2.75rem; }

.cv2-login-label {
    display: block;
    font-family: var(--cv2-font-display);
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: 0.13em;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
    margin-bottom: 0.375rem;
}

.cv2-login-pass { position: relative; }

.cv2-login-pass .cv2-input { padding-right: 2.75rem; }

.cv2-login-eye {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 2.5rem;
    display: grid;
    place-items: center;
    background: transparent;
    border: none;
    color: var(--cv2-muted-foreground);
    cursor: pointer;
}

.cv2-login-eye:hover { color: var(--cv2-foreground); }

.cv2-login-eye svg { height: 1rem; width: 1rem; }

.cv2-login-error {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    border: 1px solid color-mix(in oklab, var(--cv2-destructive) 45%, transparent);
    background: color-mix(in oklab, var(--cv2-destructive) 12%, transparent);
    border-radius: 0.5rem;
    padding: 0.625rem 0.75rem;
    font-size: 0.8rem;
    line-height: 1.5;
    margin-bottom: 1.25rem;
}

.cv2-login-btn {
    width: 100%;
    justify-content: center;
    height: 2.75rem;
    font-size: 0.9rem;
    margin-top: 0.25rem;
}

.cv2-login-links {
    margin-top: 1.5rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    text-align: center;
    font-size: 0.8rem;
}

.cv2-login-links a { color: var(--cv2-muted-foreground); text-decoration: none; transition: color 150ms ease; }

.cv2-login-links a:hover { color: var(--cv2-gold); }

.cv2-input:disabled, .cv2-btn:disabled { opacity: 0.6; cursor: default; }

@media (max-width: 480px) {
    .cv2-login { padding: 1rem; }
    .cv2-login-card { padding: 2rem 1.5rem; }
}

/* ---- Responsive ----
   Desktop (>=1200px): sidebar fijo, hamburguesa oculta.
   Por debajo de 1200px: el sidebar pasa a drawer deslizante controlado por el layout
   (hamburguesa en topbar + overlay + botón cerrar). */

.cv2-hamburger { display: none; }

.cv2-sidebar-close { display: none; }

.cv2-overlay {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 90;
    background: rgb(0 0 0 / 0.5);
    backdrop-filter: blur(2px);
}

/* Atajo permanente para registrar una aportación (BotonNuevaAportacionV2). Mismo tamaño y misma
   esquina que el botón propio de la pantalla de Aportaciones, para que al llegar allí no dé un
   salto. Por debajo del cajón lateral y de sus fondos, que sí deben taparlo. */
.cv2-fab {
    position: fixed;
    bottom: 1.5rem;
    right: 1.5rem;
    z-index: 40;
    height: 3.5rem;
    width: 3.5rem;
    display: grid;
    place-items: center;
    border-radius: 9999px;
    border: 1px solid var(--cv2-gold-hex);
    background: var(--cv2-gold-hex);
    color: var(--cv2-on-gold);
    cursor: pointer;
    box-shadow: 0 12px 30px -8px oklch(0.1 0.04 263 / 0.7);
    transition: background 150ms ease, border-color 150ms ease;
}

.cv2-fab:hover { background: var(--cv2-gold-hover); border-color: var(--cv2-gold-hover); color: var(--cv2-on-gold); }

.cv2-fab svg { height: 1.5rem; width: 1.5rem; }

@media (max-width: 1199.98px) {
    .cv2-hamburger {
        display: flex;
        width: 2.5rem;
        padding: 0;
        justify-content: center;
        flex-shrink: 0;
    }

    .cv2-overlay { display: block; }

    .cv2-sidebar {
        position: fixed;
        top: 0;
        left: 0;
        height: 100dvh;
        z-index: 100;
        width: min(18rem, 85vw);
        background: var(--cv2-surface);
        box-shadow: 0 0 48px rgb(0 0 0 / 0.45);
        transform: translateX(-105%);
        transition: transform 250ms ease;
    }

    .cv2-sidebar--open { transform: translateX(0); }

    .cv2-sidebar-logo {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 0.75rem;
    }

    .cv2-sidebar-close {
        display: grid;
        place-items: center;
        flex-shrink: 0;
        height: 2.25rem;
        width: 2.25rem;
        border: 1px solid var(--cv2-border);
        border-radius: 0.375rem;
        background: transparent;
        color: var(--cv2-muted-foreground);
        cursor: pointer;
    }

    .cv2-sidebar-close:hover { color: var(--cv2-foreground); background: color-mix(in oklab, var(--cv2-accent) 40%, transparent); }

    .cv2-sidebar-close svg { height: 1.1rem; width: 1.1rem; }

    .cv2-topbar { padding: 0 1rem; gap: 0.5rem; }

    .cv2-topbar-selects { gap: 0.5rem; }

    .cv2-context-select { min-width: 150px; }

    .cv2-pageheader, .cv2-content { padding-left: 1rem; padding-right: 1rem; }

    .cv2-topbar-email { display: none; }
}

@media (max-width: 767.98px) {
    /* Botón "Diseño clásico" queda solo con icono. */
    .cv2-btn-label { display: none; }

    /* ---- Contexto colapsado ----
       Los tres selectores piden ~390px y aquí no hay ni 160px. Se esconden dentro de un
       desplegable anclado a un único control que dice dónde estás. */
    .cv2-topbar-context { display: block; position: relative; flex: 1; min-width: 0; }

    .cv2-context-trigger {
        display: flex;
        align-items: center;
        gap: 0.5rem;
        width: 100%;
        /* Por encima del fondo que cierra el desplegable, para que volver a tocarlo lo cierre. */
        position: relative;
        z-index: 50;
        border: 1px solid var(--cv2-border);
        border-radius: 0.375rem;
        background: var(--cv2-surface);
        color: var(--cv2-foreground);
        font-family: var(--cv2-font-text);
        text-align: left;
        padding: 0.3rem 0.55rem;
        cursor: pointer;
    }

    .cv2-context-trigger > svg { height: 1rem; width: 1rem; flex-shrink: 0; color: var(--cv2-muted-foreground); }

    .cv2-context-trigger-textos { flex: 1; min-width: 0; }

    .cv2-context-trigger-valor {
        display: block;
        margin-top: 0.15rem;
        font-size: 0.8rem;
        font-weight: 500;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

    .cv2-context-trigger-flecha { transition: transform 150ms ease; }

    .cv2-context-trigger--abierto .cv2-context-trigger-flecha { transform: rotate(180deg); }

    .cv2-topbar-selects {
        position: absolute;
        top: calc(100% + 0.5rem);
        left: 0;
        z-index: 60;
        display: none;
        flex-direction: column;
        align-items: stretch;
        gap: 0.5rem;
        width: min(20rem, calc(100vw - 2rem));
        padding: 0.75rem;
        overflow: visible;
        border: 1px solid var(--cv2-border);
        border-radius: 0.625rem;
        background: var(--cv2-popover);
        box-shadow: 0 18px 48px rgb(0 0 0 / 0.35);
    }

    .cv2-topbar-selects--abierto { display: flex; }

    /* height:100vh y no inset:0 porque el backdrop-filter de .cv2-topbar la convierte en el bloque
       contenedor de lo que lleve dentro en position:fixed: con inset:0 solo taparía la franja. */
    .cv2-context-backdrop { display: block; position: fixed; inset: 0; height: 100vh; z-index: 40; }

    .cv2-context-select { width: 100%; min-width: 0; padding: 0.375rem 0.6rem; }

    .cv2-context-select select { font-size: 0.85rem; }

    .cv2-topbar { height: 3.5rem; }

    .cv2-pageheader { top: 3.5rem; min-height: 3.25rem; padding: 0.4rem 1rem; }

    /* La cabecera de móvil es una banda estrecha: el subtítulo ya no cabe bajo el breadcrumb. */
    .cv2-pageheader-sub { display: none; }

    /* "CEOS ›" no aporta nada en una pantalla estrecha y se come el sitio del título. */
    .cv2-breadcrumb-raiz, .cv2-breadcrumb-raiz + .sep { display: none; }

    /* Los botones de acción se quedan con el icono. La etiqueta se anula por tamaño y no con
       display:none porque las pantallas la escriben como texto suelto dentro del <button>, sin
       ningún elemento al que apuntar; el :has(> svg) protege a los botones sin icono, que se
       quedarían mudos. El texto sigue en el DOM: el nombre accesible no cambia. */
    .cv2-pageheader-acciones .cv2-btn:has(> svg) { font-size: 0; gap: 0; padding: 0 0.6rem; }

    .cv2-content { padding: 1rem 1rem 1.5rem; }

    .cv2-hero-inner { padding: 1.75rem 1.25rem; }
}

/* ============================================================
   Modal V2 (wizard "Nuevo asociado" y futuros diálogos)
   ============================================================ */
.cv2-modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.55);
    z-index: 1050;
}

/* El scroll va POR DENTRO, no sobre el cuadro entero. Con el cuadro entero desplazándose, en un
   móvil apaisado el diálogo se hacía más alto que el área visible y sus botones («Guardar»,
   «Cancelar») caían fuera sin nada que desplazar. Mismo patrón que ya funciona en Aportaciones:
   cabecera y pie fijos, y el cuerpo con su propio scroll. Y la altura se mide en dvh, que es lo
   que de verdad se ve con la barra del navegador puesta. */
.cv2-modal {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: min(640px, calc(100vw - 2rem));
    max-height: calc(100vh - 3rem);
    max-height: calc(100dvh - 3rem);
    overflow: hidden;
    background: var(--cv2-surface);
    border: 1px solid var(--cv2-border);
    border-radius: 1rem;
    box-shadow: 0 24px 64px rgba(15, 23, 42, 0.25);
    z-index: 1060;
    display: flex;
    flex-direction: column;
}

/* Todo lo que cuelga del diálogo mantiene su tamaño (cabecera, pasos, pie, avisos): el único que
   cede y se desplaza es el cuerpo. Así el pie con los botones no se puede quedar fuera. */
.cv2-modal > * { flex-shrink: 0; }

.cv2-modal-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding: 1.25rem 1.5rem 0.75rem;
}

.cv2-modal-etiqueta {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--cv2-muted-foreground);
}

.cv2-modal-titulo {
    font-size: 1.15rem;
    font-weight: 700;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.cv2-modal-cerrar {
    border: none;
    background: none;
    color: var(--cv2-muted-foreground);
    cursor: pointer;
    padding: 0.25rem;
}

.cv2-modal-cerrar svg { height: 1.1rem; width: 1.1rem; }

.cv2-modal-pasos {
    display: flex;
    gap: 0.5rem;
    padding: 0 1.5rem 0.75rem;
    flex-wrap: wrap;
}

.cv2-paso {
    font-size: 0.78rem;
    padding: 0.3rem 0.65rem;
    border-radius: 999px;
    background: color-mix(in oklab, var(--cv2-muted-foreground) 12%, transparent);
    color: var(--cv2-muted-foreground);
}

.cv2-paso--activo {
    background: var(--cv2-gold);
    color: var(--cv2-primary-foreground);
    font-weight: 600;
}

.cv2-paso--hecho {
    background: color-mix(in oklab, var(--cv2-gold) 18%, transparent);
    color: var(--cv2-gold);
}

.cv2-modal-body {
    padding: 0.25rem 1.5rem 1rem;
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    /* min-height:0 es imprescindible: sin él un hijo flex no baja de su tamaño de contenido y
       el cuerpo empujaría el pie fuera del cuadro en vez de desplazarse por dentro. */
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* Algunos diálogos (edición y borrado de entidad) añaden un SEGUNDO cuerpo debajo solo con el
   mensaje de error del guardado. Ese no compite por el hueco: se enseña entero. */
.cv2-modal-body + .cv2-modal-body {
    flex: 0 0 auto;
    overflow: visible;
}

.cv2-modal-intro { margin: 0; font-size: 0.86rem; line-height: 1.5; }

.cv2-modal-buscar { display: flex; gap: 0.5rem; }
.cv2-modal-buscar .cv2-input { flex: 1; }

.cv2-modal-resultados {
    border: 1px dashed var(--cv2-border);
    border-radius: 0.75rem;
}

.cv2-modal-alta-nueva {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    flex-wrap: wrap;
    padding: 0.75rem 1rem;
    border-radius: 0.75rem;
    background: color-mix(in oklab, var(--cv2-gold) 8%, transparent);
    font-size: 0.86rem;
}

.cv2-modal-form {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.75rem 1rem;
}

.cv2-modal-form label {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--cv2-muted-foreground);
}

.cv2-modal-nota { margin: 0; font-size: 0.82rem; line-height: 1.5; }

.cv2-modal-resumen {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    border: 1px solid var(--cv2-border);
    border-radius: 0.75rem;
    padding: 0.85rem 1rem;
    font-size: 0.86rem;
}

.cv2-modal-resumen > div {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
}

.cv2-modal-resumen span { color: var(--cv2-muted-foreground); }

.cv2-modal-pie {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.75rem 1.5rem 1.25rem;
    border-top: 1px solid var(--cv2-border);
    flex-wrap: wrap;
}

.cv2-modal-pie-hueco { flex: 1; }

.cv2-modal-aviso {
    padding: 0.6rem 1.5rem 1rem;
    font-size: 0.82rem;
    color: var(--cv2-warning);
}

@media (max-width: 575.98px) {
    .cv2-modal-form { grid-template-columns: 1fr; }
}

/* Bandeja de conciliación: secciones por hub */
.con-hub { padding: 0.25rem 0 0.75rem; }

.con-hub + .con-hub { border-top: 1px solid var(--cv2-border); }

.con-hub-head {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding: 0.85rem 1.25rem 0.5rem;
}

.con-hub-nombre { font-weight: 700; font-size: 0.95rem; }

.con-hub-num {
    margin-left: auto;
    font-size: 0.78rem;
    color: var(--cv2-muted-foreground);
}

/* Los desplegables nativos de <select> heredan el tema (evita popup blanco en modo noche) */
.ceos-v2 select option {
    background-color: var(--cv2-surface);
    color: var(--cv2-foreground);
}

/* ============================================================
   KIT DE PANTALLAS V2 (fase de cobertura, ago/2026)
   ------------------------------------------------------------
   Clases COMPARTIDAS por las pantallas nuevas de /v2/*. Viven aquí y no
   en un .razor.css porque el CSS isolation de Blazor no comparte clases
   entre páginas: cada pantalla que las necesitara tendría que duplicarlas
   (ver gotcha de las clases aso-* en AsociadosV2).
   Promueve los patrones ya repetidos en Asociados/Conciliación: KPIs que
   filtran, tabla compacta, chips de estado, persona en tabla.
   Convención: cv2- para lo compartido; prefijo propio de página para lo
   específico de una sola pantalla.
   ============================================================ */

/* Aviso de cabecera en pantallas de maqueta (discreto, una línea) */
.cv2-maqueta-nota {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.7rem 0.9rem;
    border: 1px dashed color-mix(in oklab, var(--cv2-warning) 45%, transparent);
    border-radius: var(--cv2-radius, 10px);
    background: color-mix(in oklab, var(--cv2-warning) 7%, transparent);
    font-size: 0.8rem;
    color: var(--cv2-muted-foreground);
    line-height: 1.5;
}

.cv2-maqueta-nota svg { width: 1rem; height: 1rem; flex-shrink: 0; margin-top: 2px; color: var(--cv2-warning); }

.cv2-maqueta-nota strong { color: var(--cv2-foreground); font-weight: 600; }

/* ---- Pestañas de ficha (Datos / Roles / Hijos...) ---- */
.cv2-tabs {
    display: flex;
    gap: 0.25rem;
    border-bottom: 1px solid var(--cv2-border);
    overflow-x: auto;
}

.cv2-tab {
    position: relative;
    padding: 0.65rem 1rem;
    border: none;
    background: transparent;
    color: var(--cv2-muted-foreground);
    font-family: var(--cv2-font-text);
    font-size: 0.85rem;
    font-weight: 600;
    cursor: pointer;
    white-space: nowrap;
    transition: color 150ms ease;
}

.cv2-tab:hover { color: var(--cv2-foreground); }

.cv2-tab--active { color: var(--cv2-gold); }

.cv2-tab--active::after {
    content: "";
    position: absolute;
    left: 0.75rem;
    right: 0.75rem;
    bottom: -1px;
    height: 2px;
    border-radius: 2px;
    background: var(--cv2-gold);
}

.cv2-tab-count {
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    border-radius: 999px;
    background: var(--cv2-muted);
    color: var(--cv2-muted-foreground);
    font-size: 0.68rem;
    font-weight: 700;
}

/* ---- Barra de filtros / acciones sobre un listado ---- */
.cv2-toolbar {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
}

.cv2-toolbar-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }

.cv2-search {
    width: 260px;
    max-width: 100%;
    height: 2.25rem;
    font-size: 0.8rem;
    padding: 0 0.6rem;
}

.cv2-select--inline {
    width: auto;
    min-width: 150px;
    height: 2.25rem;
    font-size: 0.8rem;
    padding: 0 0.6rem;
}

/* ---- KPIs clicables que hacen de filtro (promovido de .aso-kpis) ---- */
.cv2-kpis {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    gap: 0.75rem;
}

.cv2-kpi-btn {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.85rem 1rem;
    border: 1px solid var(--cv2-border);
    border-radius: var(--cv2-radius, 10px);
    background: var(--cv2-surface);
    cursor: pointer;
    text-align: left;
    transition: border-color 150ms ease, box-shadow 150ms ease;
}

.cv2-kpi-btn:hover { border-color: var(--cv2-gold); }

.cv2-kpi-btn--activo {
    border-color: var(--cv2-gold);
    box-shadow: 0 0 0 1px var(--cv2-gold);
}

.cv2-kpi-num {
    font-size: 1.45rem;
    font-weight: 700;
    line-height: 1.1;
}

.cv2-kpi-num--warn { color: var(--cv2-warning); }
.cv2-kpi-num--danger { color: var(--cv2-destructive); }
.cv2-kpi-num--ok { color: var(--cv2-success); }

.cv2-kpi-cap {
    font-size: 0.72rem;
    color: var(--cv2-muted-foreground);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}

/* ---- Chip de estado genérico (promovido de .aso-estado) ---- */
.cv2-chip {
    display: inline-block;
    padding: 0.2rem 0.55rem;
    border-radius: 999px;
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    white-space: nowrap;
}

.cv2-chip--ok      { background: color-mix(in srgb, var(--cv2-success) 14%, transparent); color: var(--cv2-success); }
.cv2-chip--warn    { background: color-mix(in srgb, var(--cv2-warning) 16%, transparent); color: var(--cv2-warning); }
.cv2-chip--danger  { background: color-mix(in srgb, var(--cv2-destructive) 14%, transparent); color: var(--cv2-destructive); }
.cv2-chip--gold    { background: color-mix(in srgb, var(--cv2-gold) 18%, transparent); color: var(--cv2-gold); }
.cv2-chip--info    { background: color-mix(in srgb, #7C3AED 14%, transparent); color: #7C3AED; }
.cv2-chip--muted   { background: var(--cv2-muted); color: var(--cv2-muted-foreground); }
.cv2-chip--outline { background: transparent; color: var(--cv2-muted-foreground); border: 1px dashed var(--cv2-muted-foreground); }

/* ---- Persona en tabla (avatar + nombre + email) ---- */
.cv2-persona {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    text-decoration: none;
    color: inherit;
    min-width: 0;
}

.cv2-persona:hover .cv2-persona-nombre { color: var(--cv2-gold); }

.cv2-avatar-sm {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background: var(--cv2-muted);
    color: var(--cv2-muted-foreground);
    font-size: 0.7rem;
    font-weight: 700;
    flex-shrink: 0;
}

.cv2-persona-datos { display: flex; flex-direction: column; min-width: 0; }
.cv2-persona-nombre { font-weight: 600; font-size: 0.85rem; }
.cv2-persona-email { font-size: 0.72rem; color: var(--cv2-muted-foreground); }

/* ---- Tabla: envoltorio con scroll propio (el body nunca scrollea en X) ---- */
/* Las tablas anchas se desplazan en horizontal, pero sin ninguna pista de que se puede
   hacer el usuario cree que la tabla esta cortada. Este es el truco clasico de "sombra de
   scroll": el degradado 'local' viaja con el contenido y tapa la sombra 'scroll' cuando ya
   se ha llegado al final, asi que la sombra SOLO se ve mientras queda tabla por ver. */
.cv2-tabla-wrap {
    overflow-x: auto;
    background:
        linear-gradient(to left, var(--cv2-surface) 45%, transparent) right center / 32px 100% no-repeat local,
        radial-gradient(farthest-side at 100% 50%, rgba(0, 0, 0, 0.3), transparent) right center / 14px 100% no-repeat scroll;
}

/* Columna de identidad fija. Opcional (hay que pedirla con la clase) porque solo tiene sentido
   cuando la primera columna dice DE QUIEN es la fila: sin esto, al desplazar una tabla ancha se
   acaban leyendo telefonos y estados sin saber a quien pertenecen. */
.cv2-tabla--identidad th:first-child,
.cv2-tabla--identidad td:first-child {
    position: sticky;
    left: 0;
    z-index: 2;
    /* Fondo opaco obligatorio: una celda fija sin fondo deja ver el contenido pasando por debajo.
       Es el de la tarjeta que contiene la tabla. */
    background: var(--cv2-surface);
    box-shadow: 1px 0 0 var(--cv2-border);
}

/* El hover de fila pinta sobre transparente; en la celda fija hay que componerlo sobre el fondo
   opaco o la fila se resaltaria entera menos su primera columna. */
.cv2-tabla--identidad tbody tr:hover th:first-child,
.cv2-tabla--identidad tbody tr:hover td:first-child {
    background: color-mix(in oklab, var(--cv2-accent) 40%, var(--cv2-surface));
}

.cv2-tabla-compacta th,
.cv2-tabla-compacta td { white-space: nowrap; vertical-align: middle; }

.cv2-num { text-align: right; font-variant-numeric: tabular-nums; }

/* La cabecera de tabla fuerza text-align:left con mas especificidad que .cv2-num, asi que las
   columnas numericas necesitan esta regla para que el <th> quede alineado con sus celdas. */
.cv2-table th.cv2-num { text-align: right; }

/* ---- Acciones por fila ---- */
.cv2-acciones { display: inline-flex; gap: 0.35rem; }

.cv2-btn-mini {
    height: auto;
    padding: 0.3rem 0.45rem;
    line-height: 1;
}

.cv2-btn-mini svg { width: 14px; height: 14px; }

.cv2-btn-mini--activo { border-color: var(--cv2-gold); color: var(--cv2-gold); }

/* ---- Ficha de datos: lista etiqueta -> valor ---- */
.cv2-def { display: flex; flex-direction: column; }

.cv2-def-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.7rem 1.25rem;
    border-bottom: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
    font-size: 0.85rem;
}

.cv2-def-row:last-child { border-bottom: none; }

.cv2-def-label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--cv2-muted-foreground);
    font-size: 0.8rem;
}

.cv2-def-label svg { width: 0.95rem; height: 0.95rem; opacity: 0.8; }

.cv2-def-value { font-weight: 600; text-align: right; word-break: break-word; }

/* ---- Rejillas de contenido ---- */
.cv2-grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1.5rem; }
.cv2-grid-3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem; }

/* Rejilla de formulario (columnas que colapsan) */
.cv2-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem 1.25rem; }
.cv2-form-grid .cv2-col-full { grid-column: 1 / -1; }

/* Misma utilidad dentro del formulario de los modales (cv2-modal-form ya es una rejilla). */
.cv2-modal-form .cv2-col-full { grid-column: 1 / -1; }

/* ---- Estado vacío ---- */
.cv2-empty {
    padding: 2.5rem 1.5rem;
    text-align: center;
    color: var(--cv2-muted-foreground);
    font-size: 0.85rem;
}

.cv2-empty svg { width: 1.75rem; height: 1.75rem; opacity: 0.5; margin-bottom: 0.5rem; }

/* ---- Nota al pie de una card ---- */
.cv2-nota {
    margin: 0;
    padding: 0.75rem 1.25rem;
    border-top: 1px solid var(--cv2-border);
    font-size: 0.75rem;
    color: var(--cv2-muted-foreground);
    line-height: 1.6;
}

.cv2-nota a { color: var(--cv2-gold); }

/* ---- Tarjetas de rol (Estructura y Roles Hub) ---- */
.cv2-roles-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; }

.cv2-rol-card {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 1rem;
    border: 1px solid var(--cv2-border);
    border-radius: var(--cv2-radius, 10px);
    background: var(--cv2-surface);
}

.cv2-rol-card--vacante { border-style: dashed; }

.cv2-rol-nombre {
    font-family: var(--cv2-font-display);
    font-size: 0.78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--cv2-muted-foreground);
}

.cv2-rol-persona { display: flex; align-items: center; gap: 0.6rem; min-width: 0; }

.cv2-rol-vacante { font-size: 0.85rem; color: var(--cv2-muted-foreground); font-style: italic; }

.cv2-rol-pie {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    flex-wrap: wrap;
    font-size: 0.72rem;
    color: var(--cv2-muted-foreground);
}

/* ---- Navegación jerárquica (Estructura) ---- */
.cv2-nodo {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    width: 100%;
    padding: 0.85rem 1.25rem;
    border: none;
    border-bottom: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
    background: transparent;
    color: inherit;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: background 150ms ease;
}

.cv2-nodo:last-child { border-bottom: none; }
.cv2-nodo:hover { background: color-mix(in oklab, var(--cv2-accent) 40%, transparent); }
.cv2-nodo:hover .cv2-nodo-nombre { color: var(--cv2-gold); }

.cv2-nodo-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 8px;
    background: color-mix(in oklab, var(--cv2-gold) 12%, transparent);
    color: var(--cv2-gold);
    flex-shrink: 0;
}

.cv2-nodo-icono svg { width: 1.05rem; height: 1.05rem; }

.cv2-nodo-datos { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.cv2-nodo-nombre { font-weight: 600; font-size: 0.9rem; transition: color 150ms ease; }
.cv2-nodo-sub { font-size: 0.75rem; color: var(--cv2-muted-foreground); }

.cv2-nodo-metricas { display: flex; align-items: center; gap: 1.25rem; flex-shrink: 0; }

.cv2-nodo-metrica { display: flex; flex-direction: column; align-items: flex-end; }
.cv2-nodo-metrica-num { font-weight: 700; font-size: 0.95rem; font-variant-numeric: tabular-nums; }
.cv2-nodo-metrica-cap { font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--cv2-muted-foreground); }

.cv2-nodo-chevron { color: var(--cv2-muted-foreground); flex-shrink: 0; }
.cv2-nodo-chevron svg { width: 1rem; height: 1rem; }

/* ---- Cabecera de entidad (fichas de Estructura) ---- */
.cv2-entidad {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    flex-wrap: wrap;
    padding: 1.25rem;
}

.cv2-entidad-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 48px;
    height: 48px;
    border-radius: 12px;
    background: color-mix(in oklab, var(--cv2-gold) 12%, transparent);
    color: var(--cv2-gold);
    flex-shrink: 0;
}

.cv2-entidad-icono svg { width: 1.4rem; height: 1.4rem; }

.cv2-entidad-datos { min-width: 0; flex: 1; }

.cv2-entidad-nombre {
    font-family: var(--cv2-font-serif);
    font-size: 1.5rem;
    font-weight: 500;
    line-height: 1.2;
    margin: 0;
}

.cv2-entidad-sub { font-size: 0.8rem; color: var(--cv2-muted-foreground); margin-top: 0.25rem; }

.cv2-entidad-acciones { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }

/* ---- Feed vertical (actividad / historial) ---- */
.cv2-feed { display: flex; flex-direction: column; }

.cv2-feed-item {
    display: flex;
    gap: 0.85rem;
    padding: 0.8rem 1.25rem;
    border-bottom: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
}

.cv2-feed-item:last-child { border-bottom: none; }

.cv2-feed-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background: var(--cv2-muted);
    color: var(--cv2-muted-foreground);
    flex-shrink: 0;
}

.cv2-feed-icono svg { width: 0.9rem; height: 0.9rem; }

.cv2-feed-cuerpo { min-width: 0; flex: 1; }
.cv2-feed-texto { font-size: 0.85rem; line-height: 1.5; }
.cv2-feed-meta { font-size: 0.72rem; color: var(--cv2-muted-foreground); margin-top: 0.15rem; }

@media (max-width: 720px) {
    .cv2-search, .cv2-select--inline { width: 100%; }
    .cv2-toolbar-right { margin-left: 0; width: 100%; }
    .cv2-nodo-metricas { display: none; }
    .cv2-def-row { flex-direction: column; align-items: flex-start; gap: 0.25rem; }
    .cv2-def-value { text-align: left; }
}

/* ============================================================
   AVISO LOPD BLOQUEANTE (MainLayoutV2 + AvisoLopdV2)
   ------------------------------------------------------------
   Sustituye al shell mientras el usuario no acepta la versión
   vigente de la política. Vive aquí y no en un .razor.css porque
   el texto legal entra como MarkupString: sus <p>, <ul> y <h*> NO
   reciben el atributo de scope de Blazor, así que una regla
   aislada que los apuntara sería ignorada.
   ============================================================ */

.cv2-lopd {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 2rem 1rem;
    background: var(--cv2-background);
}

.cv2-lopd-card {
    width: min(820px, 100%);
    max-height: 92vh;
    display: flex;
    flex-direction: column;
    background: var(--cv2-surface);
    border: 1px solid var(--cv2-border);
    border-radius: 1rem;
    box-shadow: 0 24px 64px rgba(15, 23, 42, 0.35);
    overflow: hidden;
}

.cv2-lopd-head {
    padding: 1.5rem 1.75rem 1rem;
    border-bottom: 1px solid var(--cv2-border);
}

.cv2-lopd-head .cv2-serif-title { margin: 0.4rem 0 0.6rem; font-size: 1.5rem; }

.cv2-lopd-meta {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
}

.cv2-lopd-doc { font-size: 0.85rem; color: var(--cv2-muted-foreground); }

.cv2-lopd-alert { margin: 1.25rem 1.75rem 0; }

/* Texto legal inyectado como MarkupString: se le da tipografía del kit sin tocar su HTML. */
.cv2-lopd-body {
    flex: 1;
    overflow-y: auto;
    max-height: 50vh;
    padding: 1.25rem 1.75rem;
    font-size: 0.9rem;
    line-height: 1.65;
}

.cv2-lopd-body p, .cv2-lopd-body li { font-size: 0.9rem; line-height: 1.65; margin: 0 0 0.75rem; }
.cv2-lopd-body ul, .cv2-lopd-body ol { padding-left: 1.25rem; margin: 0 0 0.75rem; }
.cv2-lopd-body li { list-style: disc; }
.cv2-lopd-body ol li { list-style: decimal; }
.cv2-lopd-body h1, .cv2-lopd-body h2, .cv2-lopd-body h3, .cv2-lopd-body h4 {
    font-family: var(--cv2-font-display);
    font-size: 1rem;
    font-weight: 700;
    margin: 1.25rem 0 0.5rem;
}
.cv2-lopd-body a { color: var(--cv2-gold); text-decoration: underline; }
.cv2-lopd-body strong { font-weight: 700; }
.cv2-lopd-body table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
.cv2-lopd-body td, .cv2-lopd-body th { border: 1px solid var(--cv2-border); padding: 0.4rem 0.6rem; }

.cv2-lopd-pie {
    border-top: 1px solid var(--cv2-border);
    padding: 1.25rem 1.75rem 1.5rem;
    background: color-mix(in oklab, var(--cv2-border) 12%, transparent);
}

.cv2-lopd-pdf {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    margin-bottom: 1rem;
}

.cv2-lopd-ok {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--cv2-success);
}

.cv2-lopd-ok svg { width: 1rem; height: 1rem; }

/* Las casillas son el consentimiento en sí: área de clic grande y estado deshabilitado evidente. */
.cv2-lopd-check {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    margin-bottom: 0.75rem;
    font-size: 0.85rem;
    line-height: 1.55;
}

.cv2-lopd-check input[type="checkbox"] {
    width: 1rem;
    height: 1rem;
    margin-top: 0.2rem;
    flex-shrink: 0;
    accent-color: var(--cv2-gold);
    cursor: pointer;
}

.cv2-lopd-check input[type="checkbox"]:disabled { cursor: default; opacity: 0.5; }
.cv2-lopd-check label { cursor: pointer; }

.cv2-lopd-nota {
    display: block;
    margin: 0.5rem 0 0;
    font-size: 0.75rem;
    line-height: 1.6;
    color: var(--cv2-muted-foreground);
}

.cv2-lopd-acciones {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    flex-wrap: wrap;
    margin-top: 1rem;
}

.cv2-lopd-acciones .cv2-lopd-nota { margin: 0; }

/* Salida de emergencia: discreta, separada de la acción principal. */
.cv2-lopd-salida {
    margin-top: 0.85rem;
    padding-top: 0.85rem;
    border-top: 1px solid var(--cv2-border);
}

@media (max-width: 720px) {
    .cv2-lopd { padding: 0; }
    .cv2-lopd-card { max-height: none; min-height: 100vh; border: none; border-radius: 0; box-shadow: none; }
    .cv2-lopd-head, .cv2-lopd-body, .cv2-lopd-pie { padding-left: 1.1rem; padding-right: 1.1rem; }
    .cv2-lopd-alert { margin-left: 1.1rem; margin-right: 1.1rem; }
    .cv2-lopd-body { max-height: none; }
}

/* ============================================================
   Promovido para el kit de maquetación (02/09/2026): patrones que se repetían
   en los .razor.css de las pantallas. Solo clases NUEVAS; nada de lo anterior cambia.
   Las pantallas siguen usando sus copias aisladas hasta que se migren.
   ============================================================ */

/* ---- 1. Aviso de ERROR (variante de .cv2-alert, hermana de .cv2-alert--ok) ----
   Origen: AdministradoresV2.razor.css (.cv2-alert.adm-alert--error), la copia que calca el
   patrón de .cv2-alert--ok (borde al 45% y fondo al 10% del color); el tinte del icono, de
   InvitadosV2.razor.css (.inv-aviso--error svg). Las otras copias (aso-, lop-, aju-, per-, pmr-,
   perfil-, rhb-alert-error) solo cambiaban borde y texto y dejaban el fondo ámbar debajo. */
.ceos-v2 .cv2-alert--error {
    border-color: color-mix(in oklab, var(--cv2-destructive) 45%, transparent);
    background: color-mix(in oklab, var(--cv2-destructive) 10%, transparent);
}

.ceos-v2 .cv2-alert--error svg { color: var(--cv2-destructive); }

/* ---- 2. Pie de página ----
   Origen: la familia con línea superior, que es la más repetida (adm-, roy-, cer-, aju-footer y
   los cuatro est-footer de Estructura: 8 de 14 copias); el lado derecho y su icono, de
   HomeV2.razor.css (.cv2-home-footer-right). Las otras seis (Home, InfoHub, Aportaciones,
   Perfil, RoyaltiesLogs, RolesHub) iban sin línea y con 2rem de aire por debajo. */
.ceos-v2 .cv2-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    padding-top: 1rem;
    border-top: 1px solid var(--cv2-border);
    font-size: 0.75rem;
    color: var(--cv2-muted-foreground);
}

.ceos-v2 .cv2-footer-right { display: inline-flex; align-items: center; gap: 0.5rem; }

.ceos-v2 .cv2-footer-right svg { height: 0.75rem; width: 0.75rem; }

/* ---- 3. Cabecera de sección: título a la izquierda, selector de periodo (.cv2-pills) a la derecha ----
   Origen: HomeV2.razor.css (.cv2-section-head), idéntica a est-head de EstadisticasV2.razor.css
   y a ih-heading de InfoHubV2.razor.css. */
.ceos-v2 .cv2-section-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1.5rem;
    flex-wrap: wrap;
}

/* ---- 4. Hero: contenido interior (va dentro de .cv2-hero-inner) ----
   Origen: HomeV2.razor.css, copiado tal cual (llevaba prefijo cv2- pero vivía aislado). */
.ceos-v2 .cv2-hero-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    border-radius: 9999px;
    border: 1px solid color-mix(in oklab, var(--cv2-gold) 40%, transparent);
    background: color-mix(in oklab, var(--cv2-background) 40%, transparent);
    padding: 0.25rem 0.75rem;
    font-family: var(--cv2-font-display);
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    font-weight: 600;
    color: var(--cv2-gold);
}

.ceos-v2 .cv2-hero-eyebrow svg { height: 0.75rem; width: 0.75rem; }

.ceos-v2 .cv2-hero-title {
    margin-top: 1.25rem;
    font-family: var(--cv2-font-serif);
    font-size: clamp(1.875rem, 4vw, 3rem);
    line-height: 1.05;
    font-weight: 500;
    color: color-mix(in oklab, var(--cv2-foreground) 85%, transparent);
}

.ceos-v2 .cv2-hero-title em { color: var(--cv2-gold); font-style: italic; }

.ceos-v2 .cv2-hero-lead {
    margin-top: 1rem;
    max-width: 36rem;
    font-size: 0.9375rem;
    line-height: 1.6;
    color: var(--cv2-muted-foreground);
}

.ceos-v2 .cv2-hero-chips {
    margin-top: 1.75rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem;
}

.ceos-v2 .cv2-hero-chips svg { height: 0.875rem; width: 0.875rem; }

/* ---- 5. Timeline: cuerpo de cada <li> (va al lado de .cv2-timeline-icon) ----
   Origen: HomeV2.razor.css, copiado tal cual (mismo caso que el hero). */
.ceos-v2 .cv2-timeline-body {
    min-width: 0;
    flex: 1;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.25rem 1rem;
}

.ceos-v2 .cv2-timeline-title { font-size: 0.875rem; font-weight: 500; color: var(--cv2-foreground); }

.ceos-v2 .cv2-timeline-detail { margin-top: 0.125rem; font-size: 0.75rem; color: var(--cv2-muted-foreground); }

.ceos-v2 .cv2-timeline-time {
    font-size: 0.6875rem;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
    color: color-mix(in oklab, var(--cv2-muted-foreground) 80%, transparent);
}

/* ---- 6. Campo con etiqueta encima, dentro de una barra de filtros (.cv2-toolbar) ----
   Origen: ActividadV2.razor.css (act-campo, act-campo-lab, act-campo--crece y su corte a 720px),
   la copia más completa; est-, sim-, rlog-, roy-, per- y adm-campo son la misma idea. Se escribe
   como <label> para que pulsar el rótulo enfoque el control. */
.ceos-v2 .cv2-campo {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    min-width: 0;
}

.ceos-v2 .cv2-campo-lab {
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--cv2-muted-foreground);
}

.ceos-v2 .cv2-campo--crece { flex: 1 1 220px; min-width: 200px; }

.ceos-v2 .cv2-campo--crece .cv2-search { width: 100%; }

@media (max-width: 720px) {
    .ceos-v2 .cv2-campo { width: 100%; }
    .ceos-v2 .cv2-campo--crece { flex: 1 1 100%; }
}

/* ---- 7. Lista de resultados de un buscador de personas (dentro de .cv2-modal-resultados) ----
   Origen: RolesHubV2.razor.css (rhb-lista, rhb-item, rhb-item--sel, rhb-item-datos, -nombre,
   -sub, rhb-vacio), la copia más completa; el estado :disabled sale de adm-item
   (AdministradoresV2.razor.css). cv2-modal-lista-* de NuevoAsociadoModalV2.razor.css es la misma
   lista sin selección. Cada <li> es flexible porque el botón de "invitar" va FUERA del de
   seleccionar (un botón dentro de otro no es HTML válido). */
.ceos-v2 .cv2-lista-personas {
    list-style: none;
    margin: 0;
    padding: 0.25rem;
    display: flex;
    flex-direction: column;
    max-height: 240px;
    overflow-y: auto;
}

.ceos-v2 .cv2-lista-personas li { display: flex; align-items: center; gap: 0.35rem; }

.ceos-v2 .cv2-lista-personas-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex: 1;
    min-width: 0;
    padding: 0.55rem 0.75rem;
    border: none;
    border-radius: 0.5rem;
    background: transparent;
    color: inherit;
    font: inherit;
    text-align: left;
    cursor: pointer;
    transition: background 150ms ease;
}

.ceos-v2 .cv2-lista-personas-item:hover:not(:disabled) { background: color-mix(in oklab, var(--cv2-gold) 6%, transparent); }

.ceos-v2 .cv2-lista-personas-item:disabled { opacity: 0.55; cursor: default; }

.ceos-v2 .cv2-lista-personas-item--sel {
    background: color-mix(in oklab, var(--cv2-gold) 12%, transparent);
    box-shadow: inset 0 0 0 1px var(--cv2-gold);
}

.ceos-v2 .cv2-lista-personas-datos { display: flex; flex-direction: column; min-width: 0; flex: 1; }

.ceos-v2 .cv2-lista-personas-nombre { font-weight: 600; font-size: 0.86rem; }

.ceos-v2 .cv2-lista-personas-sub {
    font-size: 0.74rem;
    color: var(--cv2-muted-foreground);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ceos-v2 .cv2-lista-personas-vacia {
    padding: 1.25rem;
    text-align: center;
    font-size: 0.82rem;
    color: var(--cv2-muted-foreground);
}

/* ---- 8. Fila de tabla plegable con subtabla ----
   Origen: RoyaltiesV2.razor.css (roy-hub, roy-hub--abierto, roy-flecha, roy-detalle, roy-subtabla),
   idéntico a rlog-* de RoyaltiesLogsV2.razor.css y a est-fila-reunion / est-detalle /
   est-subtabla de EstadisticasV2.razor.css. .cv2-fila-detalle es la <tr> que contiene la subtabla
   (roy-detalle en el original): sin ella su celda conservaría el padding normal de .cv2-table td. */
.ceos-v2 .cv2-fila-plegable { cursor: pointer; }

.ceos-v2 .cv2-fila-plegable:hover td { background: color-mix(in srgb, var(--cv2-gold) 6%, transparent); }

.ceos-v2 .cv2-fila-plegable--abierta td { background: color-mix(in srgb, var(--cv2-gold) 10%, transparent); }

.ceos-v2 .cv2-fila-flecha {
    display: inline-block;
    width: 1rem;
    color: var(--cv2-muted-foreground);
    font-size: 0.8rem;
}

.ceos-v2 .cv2-fila-detalle > td { padding: 0 0 0 1.5rem; background: var(--cv2-muted); }

.ceos-v2 .cv2-subtabla { margin: 0; }

/* ---- 9. Barra de progreso ----
   Origen: EstadisticasV2.razor.css (est-progress, est-progress-fill, est-progress-legend); la
   transición del relleno, de LopdV2.razor.css (lop-bar-fill). El margin-top:1rem de est-progress
   era de su tarjeta y se queda fuera: lo pone quien la coloca. El ancho del relleno va en línea
   (style="width:64%"). */
.ceos-v2 .cv2-progress {
    display: block;
    height: 0.375rem;
    border-radius: 9999px;
    background: var(--cv2-muted);
    overflow: hidden;
}

.ceos-v2 .cv2-progress-fill {
    display: block;
    height: 100%;
    border-radius: 9999px;
    background: var(--cv2-gold);
    transition: width 200ms ease;
}

.ceos-v2 .cv2-progress-legend {
    margin-top: 0.5rem;
    display: flex;
    justify-content: space-between;
    font-size: 0.625rem;
    color: var(--cv2-muted-foreground);
    font-variant-numeric: tabular-nums;
}

/* ---- 10. Casilla nativa con texto (<label> que envuelve al <input type="checkbox">) ----
   Origen: LopdV2.razor.css (lop-check), la única copia que vestía también la etiqueta; aju-check,
   per-check y pmr-check solo daban tamaño y accent-color al <input>. Tamaño 1rem, que es el de
   per-, pmr- y .cv2-lopd-check (lop- usaba 15px). */
.ceos-v2 .cv2-check {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.8rem;
    color: var(--cv2-muted-foreground);
    cursor: pointer;
    user-select: none;
}

.ceos-v2 .cv2-check input[type="checkbox"] {
    width: 1rem;
    height: 1rem;
    flex-shrink: 0;
    accent-color: var(--cv2-gold);
    cursor: pointer;
}

.ceos-v2 .cv2-check input[type="checkbox"]:disabled { cursor: not-allowed; opacity: 0.5; }

/* ---- 11. Área de texto ----
   Origen: AportacionesV2.razor.css (apo-textarea) y BienvenidaV2.razor.css (acc-textarea): las dos
   se escribían como class="cv2-input apo-textarea". Aquí es autónoma (repite el dibujo de
   .cv2-input y suelta su altura fija) para que <textarea class="cv2-textarea"> baste. */
.ceos-v2 .cv2-textarea {
    display: block;
    width: 100%;
    height: auto;
    min-height: 6rem;
    padding: 0.625rem 0.75rem;
    border-radius: 0.375rem;
    border: 1px solid var(--cv2-input);
    background: color-mix(in oklab, var(--cv2-background) 60%, transparent);
    color: var(--cv2-foreground);
    font-family: var(--cv2-font-text);
    font-size: 0.875rem;
    line-height: 1.5;
    resize: vertical;
    transition: border-color 150ms ease, box-shadow 150ms ease;
}

.ceos-v2 .cv2-textarea:focus {
    outline: none;
    border-color: var(--cv2-gold-hex);
    box-shadow: 0 0 0 3px var(--cv2-ring);
}

.ceos-v2 .cv2-textarea::placeholder { color: color-mix(in oklab, var(--cv2-muted-foreground) 70%, transparent); }

.ceos-v2 .cv2-textarea:disabled { opacity: 0.6; cursor: default; }

/* ---- 12. Zona de peligro: acción destructiva con su explicación ----
   Origen: SimulacionReunionesV2.razor.css (sim-peligro, -cab, -titulo, -texto, -acciones), la copia
   con la estructura completa; perfil-zona-baja de PerfilV2.razor.css es la misma caja en una sola
   fila. El botón de dentro es un .cv2-btn.cv2-btn--danger. */
.ceos-v2 .cv2-zona-peligro {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    padding: 1.1rem 1.25rem;
    border: 1px solid color-mix(in srgb, var(--cv2-destructive) 45%, transparent);
    border-radius: var(--cv2-radius, 10px);
    background: color-mix(in srgb, var(--cv2-destructive) 7%, transparent);
}

.ceos-v2 .cv2-zona-peligro-cab { display: flex; align-items: flex-start; gap: 0.75rem; }

.ceos-v2 .cv2-zona-peligro-cab > svg {
    width: 1.3rem;
    height: 1.3rem;
    flex-shrink: 0;
    margin-top: 2px;
    color: var(--cv2-destructive);
}

.ceos-v2 .cv2-zona-peligro-titulo { font-weight: 700; font-size: 0.95rem; color: var(--cv2-destructive); }

.ceos-v2 .cv2-zona-peligro-texto {
    margin: 0.4rem 0 0;
    font-size: 0.82rem;
    line-height: 1.6;
    color: var(--cv2-muted-foreground);
}

.ceos-v2 .cv2-zona-peligro-texto strong { color: var(--cv2-foreground); }

.ceos-v2 .cv2-zona-peligro-acciones { display: flex; gap: 0.5rem; flex-wrap: wrap; }

/* ---- 13. Paginación al pie de una tabla (dentro de la card, bajo .cv2-tabla-wrap) ----
   Origen: ActividadV2.razor.css (act-paginacion, act-paginacion-txt). El texto llevaba además
   .cv2-text-muted en el DOM; aquí el color va ya en la clase. */
.ceos-v2 .cv2-paginacion {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    flex-wrap: wrap;
    padding: 0.85rem 1.25rem;
    border-top: 1px solid var(--cv2-border);
}

.ceos-v2 .cv2-paginacion-txt { font-size: 0.78rem; color: var(--cv2-muted-foreground); }

/* ---- 14. Segunda línea discreta dentro de una celda ----
   Origen: InvitadosV2.razor.css (inv-sub); cer-origen-sub (CertificadosV2), per-sub (PersonasV2)
   y roy-de (RoyaltiesV2) son la misma línea entre 0.7 y 0.72rem. Sirve en <div> y en <span>. */
.ceos-v2 .cv2-celda-sub {
    display: block;
    margin-top: 0.1rem;
    font-size: 0.72rem;
    color: var(--cv2-muted-foreground);
}

/* ---- 15. Enlace con aspecto de botón ----
   Origen: per-btn-link (PersonasV2.razor.css) y sus clones aju-, rhb-, rlog- y roy-btn-link, más
   el a.cv2-btn aislado de LopdV2.razor.css. El navegador subraya los <a> y .cv2-btn no lo quitaba.
   La regla general lo arregla para cualquier <a class="cv2-btn">; .cv2-btn-link queda como nombre
   explícito, por si se quiere decir en el HTML. */
.ceos-v2 a.cv2-btn, .ceos-v2 a.cv2-btn:hover { text-decoration: none; }

.ceos-v2 .cv2-btn-link, .ceos-v2 .cv2-btn-link:hover { text-decoration: none; }

/* ---- 16. Botón X para cerrar un .cv2-alert ----
   Origen: InvitadosV2.razor.css (.inv-aviso .inv-aviso-cerrar). Va encadenado a .cv2-alert para
   ganar a `.ceos-v2 .cv2-alert svg`, que pintaría la X en ámbar y 2px más abajo. */
.ceos-v2 .cv2-alert .cv2-alert-cerrar {
    margin-left: auto;
    flex-shrink: 0;
    border: none;
    background: none;
    padding: 0.15rem;
    color: var(--cv2-muted-foreground);
    cursor: pointer;
    line-height: 0;
}

.ceos-v2 .cv2-alert .cv2-alert-cerrar:hover { color: var(--cv2-foreground); }

.ceos-v2 .cv2-alert .cv2-alert-cerrar svg { width: 0.9rem; height: 0.9rem; margin-top: 0; color: inherit; }

/* ---- 17. Tarjeta de persona en rejilla (asociados de un hub) ----
   Origen: InfoHubV2.razor.css (ih-members, ih-member, ih-member-avatar, -info, -name, -role), con
   sus dos cortes (640px y 1200px). El avatar va sobre .cv2-avatar, como en el original
   (class="cv2-avatar cv2-persona-card-avatar"). Se llama cv2-persona-card-* para no mezclarse
   con .cv2-persona / .cv2-persona-datos / -nombre / -email, que es la persona en fila de tabla. */
.ceos-v2 .cv2-persona-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.5rem 1rem;
    padding: 1rem 1.5rem 1.5rem;
}

@media (min-width: 640px) {
    .ceos-v2 .cv2-persona-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 1200px) {
    .ceos-v2 .cv2-persona-grid { grid-template-columns: repeat(3, 1fr); }
}

.ceos-v2 .cv2-persona-card {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.625rem 0.75rem;
    border-radius: 0.625rem;
    border: 1px solid color-mix(in oklab, var(--cv2-border) 60%, transparent);
    background: color-mix(in oklab, var(--cv2-background) 40%, transparent);
    min-width: 0;
}

.ceos-v2 .cv2-persona-card-avatar {
    height: 2.5rem;
    width: 2.5rem;
    flex-shrink: 0;
    font-size: 0.8125rem;
    object-fit: cover;
}

.ceos-v2 .cv2-persona-card-info { min-width: 0; }

.ceos-v2 .cv2-persona-card-name {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--cv2-foreground);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ceos-v2 .cv2-persona-card-role {
    font-size: 0.75rem;
    color: var(--cv2-muted-foreground);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ---- 18. Cabecera de card con icono dorado + título (más compacta que .cv2-card-header) ----
   Origen: PerfilV2.razor.css (perfil-card-head, perfil-card-icon, perfil-card-title), idéntica a
   ih-card-head / ih-head-icon / ih-card-title de InfoHubV2.razor.css. El icono es el <svg> hijo
   directo (no necesita clase); el título lleva .cv2-card-head-icono-titulo. */
.ceos-v2 .cv2-card-head-icono {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    padding: 1rem 1.5rem;
    border-bottom: 1px solid var(--cv2-border);
}

.ceos-v2 .cv2-card-head-icono > svg { height: 1rem; width: 1rem; color: var(--cv2-gold); flex-shrink: 0; }

.ceos-v2 .cv2-card-head-icono-titulo {
    margin: 0;
    font-family: var(--cv2-font-display);
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    font-weight: 500;
    color: var(--cv2-foreground);
}

/* ---- 19. Rejillas de 2 y 3 columnas FIJAS a partir de 640px (formularios de ficha) ----
   Origen: PerfilV2.razor.css (perfil-grid, perfil-grid--2, perfil-grid--3). Distintas de
   .cv2-grid-2 / .cv2-grid-3, que son auto-fit por ancho mínimo. */
.ceos-v2 .cv2-grid-2-fija,
.ceos-v2 .cv2-grid-3-fija {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.25rem 1.5rem;
}

@media (min-width: 640px) {
    .ceos-v2 .cv2-grid-2-fija { grid-template-columns: repeat(2, 1fr); }
    .ceos-v2 .cv2-grid-3-fija { grid-template-columns: repeat(3, 1fr); }
}

/* ---- 20. Estado final con icono grande (operación terminada, dentro de .cv2-login-card) ----
   Origen: RecuperarV2.razor.css (acc-estado, -icono, -titulo, -texto), copia idéntica en
   RestablecerV2.razor.css, de donde sale también el modificador --alerta (enlace caducado). */
.ceos-v2 .cv2-estado-final { text-align: center; padding: 0.5rem 0 1.25rem; }

.ceos-v2 .cv2-estado-final-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 3rem;
    height: 3rem;
    border-radius: 50%;
    background: color-mix(in oklab, var(--cv2-success) 16%, transparent);
    color: var(--cv2-success);
    margin-bottom: 0.9rem;
}

.ceos-v2 .cv2-estado-final-icono--alerta {
    background: color-mix(in oklab, var(--cv2-warning) 16%, transparent);
    color: var(--cv2-warning);
}

.ceos-v2 .cv2-estado-final-icono svg { width: 1.4rem; height: 1.4rem; }

.ceos-v2 .cv2-estado-final-titulo {
    font-family: var(--cv2-font-serif);
    font-size: 1.35rem;
    font-weight: 500;
    margin: 0 0 0.5rem;
}

.ceos-v2 .cv2-estado-final-texto {
    margin: 0;
    font-size: 0.85rem;
    line-height: 1.6;
    color: var(--cv2-muted-foreground);
}

.ceos-v2 .cv2-estado-final-texto strong { color: var(--cv2-foreground); font-weight: 600; }

/* ---- 21. Enlaces con aspecto de botón: color al pasar el ratón ----
   reboot.css (codebase.css) trae a:hover { color: #014162 } con más especificidad que .cv2-btn (sin
   prefijo), así que cualquier <a class="cv2-btn"> se volvía azul oscuro al pasar el ratón: le pasa a
   «Volver al inicio» de BloqueoAccesoV2 y a los enlaces-botón de Personas, Ajustes, Roles y Royalties.
   Se repite el color de cada variante para el hover del enlace. Detectado al montar el kit (02/09/2026). */
.ceos-v2 a.cv2-btn:hover { color: var(--cv2-foreground); }
.ceos-v2 a.cv2-btn--primary:hover { color: var(--cv2-on-gold); }
.ceos-v2 a.cv2-btn--danger:hover { color: var(--cv2-destructive); }
.ceos-v2 a.cv2-btn--ghost:hover { color: var(--cv2-gold); }
