/**
 * CMS Admin - Rediseño v2 (estética Tailwind UI, CSS plano)
 *
 * @package     CMS Berta Rojas
 * @author      Jorge Buffa <giorgiobuffa@gmail.com>
 * @copyright   2025 Berta Rojas
 * @version     2.0.0
 *
 * Capa visual que emula la estética de Tailwind UI SIN usar Tailwind:
 * no hay utility classes en el markup, no hay build step, no hay dependencia.
 * Solo tokens y componentes escritos a mano que sobreescriben al template GO.
 *
 * Se carga DESPUES de vendor.css, style.css, cms.css y del CSS de DataTables,
 * por eso gana por orden de cascada sin necesidad de !important en la mayoria
 * de los casos. Donde el template GO usa !important, se replica.
 *
 * Para volver al diseño anterior: CMS_THEME=v1 en .env (ver partials/css.php).
 *
 * Secciones:
 *   1. Tokens
 *   2. Base y tipografia
 *   3. Navbar (application shell "stacked")
 *   4. Page header
 *   5. Botones
 *   6. Cards y paneles
 *   7. Tablas
 *   8. DataTables
 *   9. Formularios
 *  10. Badges y alerts
 *  11. Dashboard
 *  12. Logs
 *  13. Login y pantallas sin sesion
 *  14. Footer
 *  15. Responsive
 */


/* ============================================================
   1. TOKENS — escala de Tailwind, portada a custom properties
   ============================================================ */

:root {
    /* Grises: la escala CALIDA (la "stone" de Tailwind), no la fria por
       defecto. La gris fria tira a azul (su 900 es #111827, un azul marino)
       y sobre una marca de dorados y cremas se lee como un azul que nadie
       pidio. Si aparece un valor azulado aca, es un resto del port original
       y hay que corregirlo, no imitarlo. */
    --c-gray-50:  #fafaf9;
    --c-gray-100: #f5f5f4;
    --c-gray-200: #e7e5e4;
    --c-gray-300: #d6d3d1;
    --c-gray-400: #a8a29e;
    --c-gray-500: #78716c;
    --c-gray-600: #57534e;
    --c-gray-700: #44403c;
    --c-gray-800: #292524;
    --c-gray-900: #1c1917;
    --c-gray-950: #0c0a09;

    /* Identidad Berta Rojas, extraida de berta-estilos.css de la web:
       el dorado #b08f66 es EL color de marca (68 usos), con sus variantes
       oscuras, el marron profundo y los cremas. */
    --brand-gold:        #b08f66;
    --brand-gold-dark:   #8b6f4d;   /* dorado oscurecido: AA con texto blanco */
    --brand-gold-deep:   #75593c;   /* hover de los botones */
    --brand-gold-soft:   #f6f1ea;   /* crema dorado para fondos suaves */
    --brand-brown:       #241917;   /* marron profundo de la web */
    --brand-brown-soft:  #382a26;   /* hover sobre el marron */
    --brand-cream:       #faf8f5;   /* fondo general, calido */

    /* Color de accion: el dorado de la marca (antes negro) */
    --c-accent:        var(--brand-gold-dark);
    --c-accent-hover:  var(--brand-gold-deep);
    --c-accent-soft:   var(--brand-gold-soft);

    /* Tipografia de titulares: la Cinzel de la web (las capitales tipo
       Trajan). SOLO para titulos de pagina y fichas: en celdas de tabla a
       13px se vuelve ilegible, ahi sigue Inter. */
    --font-display: 'Cinzel', 'Times New Roman', serif;

    --c-green-50:  #f0fdf4;
    --c-green-600: #16a34a;
    --c-green-700: #15803d;
    --c-green-ring: rgba(22, 163, 74, 0.2);

    --c-amber-50:  #fffbeb;
    --c-amber-700: #b45309;
    --c-amber-800: #92400e;
    --c-amber-ring: rgba(217, 119, 6, 0.2);

    --c-red-50:  #fef2f2;
    --c-red-500: #ef4444;
    --c-red-600: #dc2626;
    --c-red-700: #b91c1c;
    --c-red-ring: rgba(220, 38, 38, 0.2);

    --c-info-bg:   #f6f1ea;   /* dorado muy claro: reemplaza al azul de info */
    --c-info:      #8b6f4d;
    --c-info-text: #75593c;
    --c-info-ring: rgba(139, 111, 77, 0.25);

    /* Radios */
    --r-sm:   0.25rem;
    --r-md:   0.375rem;
    --r-lg:   0.5rem;
    --r-xl:   0.75rem;
    --r-full: 9999px;

    /* Sombras SATURADAS: llevan el matiz del marron de la marca, no negro
       puro. Un rgba(0,0,0,.1) funciona sobre blanco, pero el fondo del CMS
       es crema (--brand-cream): el negro sin matiz se mezcla y da una sombra
       gris apagada, "sucia". Bajando la luminosidad del propio marron la
       sombra se lee como falta de luz y no como suciedad.
       Las opacidades y geometrias son las de Tailwind (shadow-sm / shadow /
       shadow-md / shadow-lg): lo unico que cambia es el matiz.
       Desplazamiento vertical SIEMPRE positivo: la luz viene de arriba. */
    --sombra-h: 20;
    --sombra-s: 25%;
    --sombra-l: 12%;

    --sh-xs: 0 1px 2px 0 hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.05);
    --sh-sm: 0 1px 3px 0 hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10),
             0 1px 2px -1px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10);
    --sh-md: 0 4px 6px -1px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10),
             0 2px 4px -2px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10);
    --sh-lg: 0 10px 15px -3px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10),
             0 4px 6px -4px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.10);

    /* El "ring" de Tailwind: borde de 1px hecho con box-shadow, no ocupa layout */
    --ring-card: 0 0 0 1px hsla(var(--sombra-h), var(--sombra-s), var(--sombra-l), 0.06);

    /* Tipografia */
    --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
                 'Helvetica Neue', Arial, sans-serif;
    --font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas,
                 'Liberation Mono', monospace;

    /* --- ESCALA DE ESPACIADO ---------------------------------------
       Base 4px, no lineal. TODO padding, margin y gap nuevo sale de aca:
       elegir un numero a ojo es lo que hace que dos pantallas correctas por
       separado se sientan desprolijas juntas.
       Los pasos son los que el CMS ya usaba de hecho; lo que queda afuera
       (0.3rem, 0.1875rem, 0.3125rem, 0.4375rem) son valores sueltos que
       sobrevivieron al port y hay que ir llevando al escalon vecino. */
    --space-0-5: 0.125rem;   /*  2px */
    --space-1:   0.25rem;    /*  4px */
    --space-1-5: 0.375rem;   /*  6px */
    --space-2:   0.5rem;     /*  8px — el mas usado */
    --space-2-5: 0.625rem;   /* 10px */
    --space-3:   0.75rem;    /* 12px */
    --space-3-5: 0.875rem;   /* 14px — padding lateral del boton */
    --space-4:   1rem;       /* 16px — padding de tarjeta */
    --space-5:   1.25rem;    /* 20px — separacion entre campos */
    --space-6:   1.5rem;     /* 24px */
    --space-7:   1.75rem;    /* 28px — respiro del hero, hueco del chevron */
    --space-8:   2rem;       /* 32px — entre bloques */
    --space-9:   2.25rem;    /* 36px — hueco del chevron en los select */
    --space-10:  2.5rem;     /* 40px */
    --space-12:  3rem;       /* 48px */
    --space-16:  4rem;       /* 64px — alto del header */

    /* --- ESCALA TIPOGRAFICA ----------------------------------------
       Nueve pasos elegidos a mano sobre los que el CMS ya usaba. Tenia 21
       tamaños distintos, con vecinos que nadie distingue (0.8125 / 0.875 /
       0.9375 conviviendo). Jerarquia por PESO y CONTRASTE antes que por
       tamaño: para bajar un dato de rango, primero --c-gray-500. */
    --fs-3xs:  0.625rem;     /* 10px — rotulos del calendario en miniatura */
    --fs-2xs:  0.6875rem;    /* 11px — cabeceras de tabla, badges */
    --fs-xs:   0.75rem;      /* 12px — linea de apoyo */
    --fs-sm:   0.8125rem;    /* 13px — dato de tabla */
    --fs-base: 0.875rem;     /* 14px — cuerpo del CMS */
    --fs-md:   1rem;         /* 16px — controles en tactil (evita el zoom de iOS) */
    --fs-lg:   1.125rem;     /* 18px — titulo de tarjeta */
    --fs-xl:   1.25rem;      /* 20px — h2 */
    --fs-2xl:  1.5rem;       /* 24px — h1 */
    --fs-3xl:  1.875rem;     /* 30px — cifras del bento */
    --fs-4xl:  2.25rem;      /* 36px */

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

    /* Heroicons exclamation-circle, para que el error de un campo no dependa
       solo del color. Se pinta con mask-image, asi hereda el currentColor. */
    --icono-error: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z'/%3E%3C/svg%3E");
}


/* ============================================================
   2. BASE Y TIPOGRAFIA
   ============================================================ */

body,
body.bg-light {
    font-family: var(--font-sans);
    font-size: var(--fs-base);      /* text-sm */
    line-height: 1.5rem;
    color: var(--c-gray-700);
    background-color: var(--brand-cream) !important;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    letter-spacing: 0;
}

/* Inter tiene sus propias variantes opticas; desactivar ligaduras raras */
body {
    font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--font-sans);
    color: var(--c-gray-900);
    font-weight: 600;
    letter-spacing: -0.011em;
    margin-top: 0;
}

h1, .h1 { font-size: var(--fs-2xl);   line-height: 2rem;    font-weight: 700; letter-spacing: -0.02em; }
h2, .h2 { font-size: var(--fs-xl);  line-height: 1.75rem; }
h3, .h3 { font-size: var(--fs-lg); line-height: 1.75rem; }
h4, .h4 { font-size: var(--fs-md);     line-height: 1.5rem; }
h5, .h5 { font-size: var(--fs-base); line-height: 1.25rem; }
h6, .h6 { font-size: var(--fs-sm); line-height: 1.25rem; }

p { margin-bottom: var(--space-3); }

a {
    color: var(--c-gray-900);
    text-decoration: none;
    transition: color 0.15s ease;
}

a:hover {
    color: var(--c-gray-600);
    text-decoration: none;
}

small, .small { font-size: var(--fs-sm); line-height: 1.25rem; }

code, kbd, pre, samp {
    font-family: var(--font-mono);
    font-size: var(--fs-sm);
}

code {
    color: var(--c-gray-700);
    background: var(--c-gray-100);
    padding: var(--space-0-5) var(--space-1-5);
    border-radius: var(--r-sm);
}

hr, .separator-top {
    border-color: var(--c-gray-200);
}

.text-muted   { color: var(--c-gray-500) !important; }
.text-dark    { color: var(--c-gray-900) !important; }
.text-primary { color: var(--c-gray-900) !important; }
.text-success { color: var(--c-green-700) !important; }
.text-danger  { color: var(--c-red-600) !important; }
.text-info    { color: var(--c-info-text) !important; }
.text-warning { color: var(--c-amber-700) !important; }

/* El template GO abusa de font-weight-bold; en Tailwind UI el peso fuerte es 600 */
.font-weight-bold { font-weight: 600 !important; }

/* Foco visible y consistente en todo el CMS (accesibilidad) */
a:focus-visible,
button:focus-visible,
[role="button"]:focus-visible,
.btn:focus-visible,
.btn-action:focus-visible {
    outline: 2px solid var(--c-gray-900);
    outline-offset: 2px;
    box-shadow: none;
}


/* ============================================================
   3. NAVBAR — application shell de Tailwind UI
   ============================================================

   En escritorio (>=1200px) el header deja de ser una barra superior y pasa a
   ser el sidebar oscuro fijo del shell "Sidebar with dark background". El
   markup no cambia: se reinterpretan las piezas que ya emite header.php.

     .navbar               -> columna de altura completa
     .nav-link (dropdown)  -> encabezado de grupo ("Contenido", "Multimedia")
     .dropdown-menu        -> lista de items del grupo, siempre visible
     ul.navbar-nav.mr-0    -> bloque de usuario, anclado abajo

   Por debajo de 1200px vuelve a ser una barra superior con menu colapsable,
   que es lo que sirve en pantallas chicas (ver seccion 15).
   ============================================================ */

.header-sticky.header-dark,
.header-dark,
.header-dark[class*="-not-top"][class*="-pinned"] {
    background: var(--brand-brown) !important;
    box-shadow: none;
    border-bottom: 1px solid var(--brand-brown-soft);
}

/* Altura del header fijada en 4rem para poder compensarla en el page header */
.header-sticky.header-dark {
    padding-top: 0;
    padding-bottom: 0;
}

.header-dark .navbar {
    padding-top: 0;
    padding-bottom: 0;
    height: 4rem;
    min-height: 4rem;
}

.header-dark .navbar-brand {
    height: 4rem !important;
    display: flex;
    align-items: center;
    padding: 0;
    margin-right: var(--space-8);
}

.header-dark .navbar-brand .navbar-logo {
    height: 1.75rem;
    min-height: 0;
    width: auto;
}

/* Links del nav: pill gris que se ilumina en hover — patron Tailwind UI */
.header-dark .navbar-nav .nav-item .nav-link,
.header-dark .navbar-nav .nav-link {
    color: var(--c-gray-300) !important;
    /* GO tipografia los nav-link en 11px mayusculas con tracking */
    font-size: var(--fs-base) !important;
    font-weight: 500 !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    line-height: 1.25rem;
    padding: var(--space-2) var(--space-3) !important;
    margin: 0 var(--space-0-5);
    border-radius: var(--r-md);
    transition: background-color 0.15s ease, color 0.15s ease;
}

.header-dark .navbar-nav .nav-item .nav-link:hover,
.header-dark .navbar-nav .nav-link:hover {
    background-color: var(--brand-brown-soft);
    color: #fff !important;
}

/* Seccion activa: el header.php le agrega font-weight-bold */
.header-dark .navbar-nav .nav-link.font-weight-bold {
    background-color: var(--brand-brown-soft);
    color: #fff !important;
    font-weight: 600 !important;
}

/* Quitar el caret del framework, Tailwind UI no lo usa en nav horizontal */
.header-dark .navbar-nav .dropdown-toggle::after {
    border: none;
    content: '';
    margin: 0;
    width: 0;
}

/* --- Dropdowns: panel blanco flotante con ring, como los menus de Tailwind UI --- */
.header-dark .dropdown-menu,
.navbar .dropdown-menu {
    background: #fff;
    border: none;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-lg), var(--ring-card);
    padding: var(--space-2);
    margin-top: var(--space-2);
    min-width: 15rem;
}

/* Grilla de dos columnas — icono | texto — en vez de flex: el item tiene el
   icono y DOS hermanos de texto (span + p) sin wrapper, y con flex esos tres
   quedarian en la misma fila. Con grid el icono ocupa las dos filas. */
.navbar .dropdown-menu .dropdown-item {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    column-gap: var(--space-3);
    align-items: center;
    border-radius: var(--r-md);
    padding: var(--space-2) var(--space-3);
    margin-bottom: 0;
    color: var(--c-gray-700);
    white-space: normal;
    transition: background-color 0.12s ease;
}

.navbar .dropdown-menu .dropdown-item > i {
    grid-column: 1;
    grid-row: 1 / span 2;
    align-self: center;
    font-size: var(--fs-lg);
    color: var(--c-gray-400);
    transition: color 0.12s ease;
}

.navbar .dropdown-menu .dropdown-item > span,
.navbar .dropdown-menu .dropdown-item > p {
    grid-column: 2;
}

.navbar .dropdown-menu .dropdown-item:hover > i {
    color: var(--c-gray-600);
}

.navbar .dropdown-menu .dropdown-item.active > i {
    color: var(--c-gray-900);
}

.navbar .dropdown-menu .dropdown-item span {
    display: block;
    font-size: var(--fs-base);
    font-weight: 500;
    line-height: 1.25rem;
    color: var(--c-gray-900);
}

.navbar .dropdown-menu .dropdown-item p {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-500);
}

.navbar .dropdown-menu .dropdown-item:hover,
.navbar .dropdown-menu .dropdown-item:focus {
    background-color: var(--c-gray-50);
    color: var(--c-gray-900);
}

.navbar .dropdown-menu .dropdown-item.active,
.navbar .dropdown-menu .dropdown-item:active {
    background-color: var(--c-gray-100);
}

.navbar .dropdown-menu .dropdown-item.active span,
.navbar .dropdown-menu .dropdown-item.active p {
    color: var(--c-gray-900);
}

/* Los dividers sobran cuando cada item ya es una fila con padding propio */
.navbar .dropdown-menu .dropdown-divider {
    display: none;
}

/* Item de logout dentro del dropdown de usuario */
.navbar .dropdown-menu form .dropdown-item {
    width: 100%;
    text-align: left;
    background: none;
    border: none;
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--c-red-600) !important;
    cursor: pointer;
}

.navbar .dropdown-menu form .dropdown-item:hover {
    background-color: var(--c-red-50);
    color: var(--c-red-700) !important;
}

/* Separador real antes del logout */
.navbar .dropdown-menu form {
    border-top: 1px solid var(--c-gray-200);
    margin-top: var(--space-2);
    padding-top: var(--space-2);
    display: block !important;
}

/* Nombre de usuario en el nav */
.header-dark #navDropUser i {
    margin-right: var(--space-1-5);
    opacity: 0.7;
}

/* Indicador de base de datos (solo ROOT) */
#btnToggleDb {
    border: none !important;
    border-radius: var(--r-md);
    font-size: var(--fs-xs);
    font-weight: 500;
    line-height: 1rem;
    padding: var(--space-1-5) var(--space-2-5);
    box-shadow: none;
    display: inline-flex;
    align-items: center;
    gap: var(--space-1-5);
}

/* strong/i heredan el color del boton, si no quedan ilegibles sobre el nav oscuro */
#btnToggleDb strong,
#btnToggleDb i {
    color: inherit !important;
    font-weight: 600;
}

#btnToggleDb.db-production {
    background: rgba(220, 38, 38, 0.15) !important;
    color: #fca5a5 !important;
    box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.35);
}

#btnToggleDb.db-production:hover {
    background: rgba(220, 38, 38, 0.25) !important;
}

#btnToggleDb.db-beta {
    background: rgba(22, 163, 74, 0.15) !important;
    color: #86efac !important;
    box-shadow: inset 0 0 0 1px rgba(22, 163, 74, 0.35);
}

#btnToggleDb.db-beta:hover {
    background: rgba(22, 163, 74, 0.25) !important;
}

.cms-beta-banner {
    background: var(--c-green-600);
    font-size: var(--fs-xs);
    line-height: 1rem;
    padding: var(--space-2) 0;
    font-weight: 500;
}

/* Hamburger */
.header-dark .navbar-toggler {
    border: none !important;
    padding: var(--space-2);
    border-radius: var(--r-md);
}

.header-dark .navbar-toggler:hover {
    background: var(--brand-brown-soft);
}


/* ------------------------------------------------------------
   3b. SIDEBAR (escritorio) — shell "Sidebar with dark background"
   ------------------------------------------------------------ */

@media (min-width: 1200px) {

    :root { --sidebar-w: 17rem; }

    /* El contenido se corre para dejarle lugar al sidebar */
    body,
    body.bg-light {
        padding-left: var(--sidebar-w);
    }

    /* ...salvo en las pantallas sin sesion (login, recuperar clave, codigo de
       acceso), que no incluyen header.php y por lo tanto no tienen sidebar:
       sin esto les queda un hueco blanco de 17rem a la izquierda.

       Se escribe en negativo a proposito. Si un navegador no soporta :has(),
       ignora la regla entera y vuelve el hueco en el login; al reves —poner el
       padding solo cuando hay header— el sidebar se montaria encima del
       contenido en TODAS las paginas internas, que es mucho peor. */
    body:not(:has(> header.header-dark)) {
        padding-left: 0;
    }

    /* Las secciones full-bleed usan 100vw, que ignora el padding del body
       y se desbordaria por debajo del sidebar */
    .vw-100 { width: 100% !important; }

    header.header-sticky.header-dark,
    header.header-dark {
        position: fixed;
        top: 0;
        left: 0;
        bottom: 0;
        width: var(--sidebar-w);
        height: 100vh;
        background: var(--brand-brown) !important;
        border-right: 1px solid var(--brand-brown-soft);
        border-bottom: none;
        padding: 0;
        z-index: 1030;
        /* GO mueve el header con transform al hacer scroll (headroom) */
        transform: none !important;
        transition: none;
    }

    .header-dark > .container {
        width: 100%;
        max-width: none;
        height: 100%;
        padding: 0;
        margin: 0;
    }

    .header-dark .navbar {
        display: flex;
        flex-direction: column;
        align-items: stretch;
        height: 100%;
        min-height: 0;
        padding: var(--space-6) var(--space-3) var(--space-4);
        overflow-y: auto;
        overflow-x: hidden;
    }

    /* Logo */
    .header-dark .navbar-brand {
        height: auto !important;
        flex: 0 0 auto;
        padding: 0 var(--space-2);
        margin: 0 0 var(--space-7);
    }

    .header-dark .navbar-brand .navbar-logo { height: 1.75rem; }

    .header-dark .navbar-toggler { display: none; }

    /* El colapsable no colapsa: es la columna del sidebar */
    .header-dark .navbar-collapse {
        display: flex !important;
        flex-direction: column;
        align-items: stretch;
        flex: 1 1 auto;
        min-height: 0;
    }

    .header-dark .navbar-nav {
        display: block;
        width: 100%;
        margin: 0;
    }

    .header-dark .navbar-nav.mr-auto { flex: 0 0 auto; }

    .header-dark .navbar-nav .nav-item { display: block; width: 100%; }

    .header-dark .navbar-nav .nav-item.dropdown { margin-bottom: var(--space-6); }

    /* El link del grupo pasa a ser un encabezado de seccion, no un boton */
    /* Solo el nav principal (.mr-auto): el bloque del usuario vive en .mr-0 y
       su link SI tiene que poder tocarse, es el acceso al perfil. */
    .header-dark .navbar-nav.mr-auto .nav-item.dropdown > .nav-link.dropdown-toggle,
    .header-dark .navbar-nav.mr-auto .nav-item.dropdown > .nav-link.dropdown-toggle:hover {
        display: block;
        padding: 0 var(--space-3) var(--space-2) !important;
        margin: 0;
        background: none !important;
        color: var(--c-gray-500) !important;
        font-size: var(--fs-2xs) !important;
        font-weight: 600 !important;
        line-height: 1rem;
        text-transform: uppercase !important;
        letter-spacing: 0.06em !important;
        pointer-events: none;
        cursor: default;
    }

    /* Los items del grupo estan siempre a la vista (solo el nav principal:
       el menu de usuario sigue siendo un popup, mas abajo) */
    .header-dark .navbar-nav.mr-auto .nav-item.dropdown > .dropdown-menu {
        display: block !important;
        position: static !important;
        float: none;
        width: 100%;
        min-width: 0;
        margin: 0;
        padding: 0;
        background: transparent;
        border: none;
        box-shadow: none;
        transform: none !important;
    }

    /* header.php marca los items inactivos con .text-dark, que sobre el
       sidebar oscuro los volveria invisibles: acá el color lo manda el item */
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item,
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item.text-dark {
        padding: var(--space-2) var(--space-3);
        border-radius: var(--r-md);
        color: var(--c-gray-400) !important;
        font-size: var(--fs-base);
        font-weight: 500 !important;
        line-height: 1.5rem;
    }

    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item span {
        color: inherit;
        font-size: inherit;
        font-weight: inherit;
        line-height: inherit;
    }

    /* Icono del item, como en el bloque sidebar-navigation de Tailwind UI:
       apagado por defecto, se enciende junto con el texto */
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item > i {
        grid-row: 1;
        font-size: var(--fs-lg);
        color: var(--c-gray-500);
    }

    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item:hover > i,
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item.active > i {
        color: #fff;
    }

    /* En el sidebar los items son de una linea: la descripcion es ruido */
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item p { display: none; }

    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item:hover {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item.active,
    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item.active:hover {
        background: var(--brand-brown-soft);
        color: #fff !important;
        font-weight: 600 !important;
    }

    .header-dark .navbar-nav.mr-auto .dropdown-menu .dropdown-item.active span { color: #fff; }

    /* Bloque inferior: indicador de DB + usuario */
    .header-dark .navbar-text#dbIndicator,
    .header-dark .navbar-collapse > .navbar-text {
        order: 2;
        margin: 0 0 var(--space-2) !important;
        padding: 0 var(--space-3);
        flex-wrap: wrap;
    }

    .header-dark .navbar-nav.mr-0 {
        order: 3;
        margin-top: auto;
        padding-top: var(--space-4);
        border-top: 1px solid var(--brand-brown-soft);
    }

    /* Selector largo a proposito: GO tipografia este link en 11px mayusculas
       desde una regla mas especifica, y hay que ganarle */
    .header-dark .navbar .navbar-collapse .navbar-nav.mr-0 .nav-item .nav-link,
    .header-dark .navbar-nav.mr-0 .nav-link {
        display: flex;
        align-items: center;
        gap: var(--space-2-5);
        padding: var(--space-2) var(--space-3) !important;
        color: var(--c-gray-300) !important;
        font-size: var(--fs-base) !important;
        font-weight: 500 !important;
        text-transform: none !important;
        letter-spacing: 0 !important;
    }

    .header-dark .navbar-nav.mr-0 .nav-link:hover { background: var(--brand-brown-soft); }

    /* El menu de usuario si es un popup: se abre hacia arriba, sobre el shell */
    .header-dark .navbar-nav.mr-0 .dropdown-menu {
        position: absolute !important;
        top: auto !important;
        bottom: calc(100% + 0.5rem) !important;
        left: 0 !important;
        right: auto !important;
        transform: none !important;
        width: calc(var(--sidebar-w) - 1.5rem);
        min-width: 0;
        background: #fff;
        box-shadow: var(--sh-lg), var(--ring-card);
        padding: var(--space-2);
    }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item {
        color: var(--c-gray-700);
        border-radius: var(--r-md);
    }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item span { color: var(--c-gray-900); }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item p {
        display: block;
        color: var(--c-gray-500);
    }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item:hover {
        background: var(--c-gray-50);
        color: var(--c-gray-900);
    }

    /* Sin barra superior, el page header ya no tiene nada que compensar */
    .hero.hero-with-header {
        padding-top: var(--space-8) !important;
    }

    /* Mas aire lateral, como el area de contenido de Tailwind UI */
    .container,
    .container-fluid {
        max-width: none;
        width: 100%;
        padding-left: var(--space-8);
        padding-right: var(--space-8);
    }
}


/* ============================================================
   4. PAGE HEADER — la franja blanca con titulo y acciones
   ============================================================ */

/* El header es position:fixed y mide 4rem, hay que compensarlo aca arriba */
.hero.hero-with-header {
    background: #fff;
    border-bottom: 1px solid var(--c-gray-200);
    padding-top: calc(var(--space-16) + var(--space-7)) !important;
    padding-bottom: var(--space-7) !important;
    min-height: 0;
}

.hero.hero-with-header h1 {
    font-family: var(--font-display);
    /* El titulo de pagina va al doble: 3.25rem en escritorio. Con clamp()
       baja solo en pantallas chicas, para que "Homepage Slides" no ocupe
       tres renglones en un telefono. */
    font-size: clamp(2rem, 4.2vw, 3.25rem);
    line-height: 1.1;
    font-weight: 600;
    letter-spacing: 0.01em;
    color: var(--c-gray-900);
    margin-bottom: var(--space-2) !important;
}

.hero.hero-with-header p {
    font-size: var(--fs-base);
    line-height: 1.25rem;
    color: var(--c-gray-500);
}

.page-header-actions {
    gap: var(--space-3);
}

/* La seccion de contenido que sigue al hero no necesita su propio borde */
section.border-top {
    border-top: none !important;
}


/* ============================================================
   5. BOTONES — patron de Tailwind UI
   ============================================================ */

.btn {
    font-family: var(--font-sans);
    font-size: var(--fs-base);
    line-height: 1.25rem;
    font-weight: var(--fw-semibold);
    padding: var(--space-2) var(--space-3-5);
    border-radius: var(--r-md) !important;
    border: none;
    box-shadow: var(--sh-xs);
    text-transform: none !important;
    letter-spacing: 0;
    transition: background-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;
}

.btn:active { transform: none; }

.btn-sm {
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    padding: var(--space-1-5) var(--space-2-5);
}

.btn-lg {
    font-size: var(--fs-md);
    line-height: 1.5rem;
    padding: var(--space-2-5) var(--space-4);
}

/* btn-rounded del framework: en v2 todos los botones usan el mismo radio */
.btn-rounded { border-radius: var(--r-md) !important; }

/* Primario: negro solido */
.btn-primary,
.btn-primary:not(:disabled):not(.disabled) {
    background-color: var(--c-accent) !important;
    border-color: var(--c-accent) !important;
    color: #fff !important;
}

.btn-primary:hover,
.btn-primary:focus,
.btn-primary:not(:disabled):not(.disabled):hover {
    background-color: var(--c-accent-hover) !important;
    border-color: var(--c-accent-hover) !important;
    color: #fff !important;
}

/* Secundario: blanco con ring gris (el "white button" de Tailwind UI) */
.btn-outline-primary,
.btn-outline-dark,
.btn-outline-secondary,
.btn-secondary,
.btn-light,
.btn-outline-gray-dark {
    background-color: #fff !important;
    color: var(--c-gray-900) !important;
    border: none !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
}

.btn-outline-primary:hover,
.btn-outline-dark:hover,
.btn-outline-secondary:hover,
.btn-secondary:hover,
.btn-light:hover,
.btn-outline-gray-dark:hover {
    background-color: var(--c-gray-50) !important;
    color: var(--c-gray-900) !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
}

/* Destructivo */
.btn-danger {
    background-color: var(--c-red-600) !important;
    border-color: var(--c-red-600) !important;
    color: #fff !important;
}

.btn-danger:hover {
    background-color: var(--c-red-500) !important;
    border-color: var(--c-red-500) !important;
}

.btn-outline-danger {
    background-color: #fff !important;
    color: var(--c-red-600) !important;
    border: none !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px rgba(220, 38, 38, 0.4);
}

.btn-outline-danger:hover {
    background-color: var(--c-red-50) !important;
    color: var(--c-red-700) !important;
}

/* Exito */
.btn-success {
    background-color: var(--c-green-600) !important;
    border-color: var(--c-green-600) !important;
    color: #fff !important;
}

.btn-success:hover {
    background-color: var(--c-green-700) !important;
}

.btn-outline-success {
    background-color: #fff !important;
    color: var(--c-green-700) !important;
    border: none !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px rgba(22, 163, 74, 0.4);
}

.btn-outline-success:hover {
    background-color: var(--c-green-50) !important;
    color: var(--c-green-700) !important;
}

.btn:disabled,
.btn.disabled {
    opacity: 0.5;
    box-shadow: none;
    cursor: not-allowed;
}

/* Botones de accion en tablas: iconos con hover suave, no de color pleno */
.btn-action {
    width: 1.75rem;
    height: 1.75rem;
    border-radius: var(--r-md);
    color: var(--c-gray-400);
    font-size: var(--fs-base);
    box-shadow: none;
    transition: background-color 0.12s ease, color 0.12s ease;
    /* En algunos listados el boton de accion es un <button> y no un <a>
       (locations.php, por ejemplo): sin este reset le queda el marco gris
       que dibuja el navegador alrededor del icono. */
    border: none;
    background: none;
    padding: 0;
    margin: 0;
    font-family: inherit;
    line-height: 1;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
}

.btn-action > i {
    font-size: var(--fs-md);
    pointer-events: none;   /* el clic siempre es del boton, no del icono */
}

.btn-action + .btn-action { margin-left: var(--space-0-5); }

.btn-action:hover,
.btn-action.btn-action-view:hover,
.btn-action.btn-action-edit:hover,
.btn-action.btn-action-duplicate:hover {
    background: var(--c-gray-100);
    color: var(--c-gray-900);
}

.btn-action.btn-action-delete:hover {
    background: var(--c-red-50);
    color: var(--c-red-600);
}


/* ============================================================
   6. CARDS Y PANELES
   ============================================================ */

.card {
    background: #fff;
    border: none;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
}

/* El framework y las paginas usan shadow-sm de Bootstrap; unificar */
.card.shadow-sm,
.card.shadow {
    box-shadow: var(--sh-xs), var(--ring-card) !important;
}

.card-header,
.card-header.bg-white {
    background: #fff !important;
    border-bottom: 1px solid var(--c-gray-200);
    padding: var(--space-3-5) var(--space-5);
    border-radius: var(--r-lg) var(--r-lg) 0 0;
    font-size: var(--fs-base);
    line-height: 1.25rem;
}

.card-header strong {
    font-weight: 600;
    color: var(--c-gray-900);
    font-size: var(--fs-base);
}

.card-body { padding: var(--space-5); }

.card-footer,
.card-footer.bg-white {
    background: var(--c-gray-50) !important;
    border-top: 1px solid var(--c-gray-200);
    padding: var(--space-3) var(--space-5);
    border-radius: 0 0 var(--r-lg) var(--r-lg);
}

.card-footer a {
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-600) !important;
}

.card-footer a:hover { color: var(--c-gray-900) !important; }


/* ============================================================
   7. TABLAS
   ============================================================ */

.table {
    color: var(--c-gray-600);
    font-size: var(--fs-base);
    margin-bottom: 0;
}

.table thead th,
.table .thead-light th {
    background: transparent !important;
    border: none;
    border-bottom: 1px solid var(--c-gray-300);
    color: var(--c-gray-900);
    font-size: var(--fs-xs);
    line-height: 1rem;
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    padding: var(--space-3) var(--space-4);
    white-space: nowrap;
}

.table tbody td {
    border: none;
    border-top: 1px solid var(--c-gray-200);
    padding: var(--space-3) var(--space-4);
    vertical-align: middle;
    color: var(--c-gray-600);
}

.table tbody tr:first-child td { border-top: none; }

.table tbody tr:hover td {
    background-color: var(--c-gray-50);
}

.table a {
    color: var(--c-gray-900);
    font-weight: var(--fw-medium);
}

.table a:hover {
    color: var(--c-gray-600);
    text-decoration: none;
}

/* Tablas dentro de cards: alinear el padding con el del card */
.card .table thead th:first-child,
.card .table tbody td:first-child { padding-left: var(--space-5); }

.card .table thead th:last-child,
.card .table tbody td:last-child { padding-right: var(--space-5); }

.table-dashboard td,
.table-dashboard th {
    padding: var(--space-2-5) var(--space-4);
    font-size: var(--fs-sm);
}

/* Celdas editables inline */
.editable-cell:hover {
    background-color: var(--c-gray-50);
    outline: 1px dashed var(--c-gray-400);
    outline-offset: -1px;
}

.editable-cell input,
.editable-cell textarea,
.editable-cell select {
    border: none;
    box-shadow: inset 0 0 0 2px var(--c-accent);
    border-radius: var(--r-sm);
    padding: var(--space-1-5) var(--space-2);
    font-size: var(--fs-base);
}


/* ============================================================
   8. DATATABLES — reescritura completa del look CDN
   ============================================================ */

table.dataTable {
    border-collapse: separate !important;
    border-spacing: 0;
    width: 100% !important;
}

table.dataTable thead th,
table.dataTable thead td {
    background: transparent;
    border-bottom: 1px solid var(--c-gray-300) !important;
    color: var(--c-gray-900);
    font-size: var(--fs-xs);
    line-height: 1rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    padding: var(--space-3) var(--space-4);
    white-space: nowrap;
}

table.dataTable thead th small {
    font-size: inherit;
    font-weight: inherit;
    letter-spacing: inherit;
}

table.dataTable tbody td {
    border-top: 1px solid var(--c-gray-200);
    padding: var(--space-3) var(--space-4);
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-600);
    vertical-align: middle;
}

table.dataTable tbody tr { background: transparent; }

table.dataTable tbody tr:hover td { background-color: var(--c-gray-50); }

table.dataTable.stripe tbody tr.odd,
table.dataTable.display tbody tr.odd { background: transparent; }

table.dataTable.display tbody tr.odd:hover td,
table.dataTable.display tbody tr.even:hover td { background-color: var(--c-gray-50); }

table.dataTable tbody td small { font-size: inherit; }

/* Las paginas de listado envuelven la tabla en .table-responsive:
   convertirla en el "panel" blanco que Tailwind UI pone bajo el page header */
.table-responsive {
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    padding: var(--space-1) 0 0;
    overflow-x: auto;
}

/* Barra superior de controles (buscador + length + botones export) */
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_length {
    padding: var(--space-3-5) var(--space-4);
    font-size: var(--fs-sm);
    color: var(--c-gray-600);
}

.dataTables_wrapper .dataTables_filter label,
.dataTables_wrapper .dataTables_length label {
    font-weight: 500;
    color: var(--c-gray-600);
    margin-bottom: 0;
    display: flex;
    align-items: center;
    gap: var(--space-2);
}

.dataTables_wrapper .dataTables_filter input,
.dataTables_wrapper .dataTables_length select {
    border: none !important;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    padding: var(--space-1-5) var(--space-3);
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-900);
    background-color: #fff;
    margin: 0;
    transition: box-shadow 0.15s ease;
}

.dataTables_wrapper .dataTables_filter input {
    min-width: 16rem;
}

.dataTables_wrapper .dataTables_length select {
    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 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");
    background-position: right 0.375rem center;
    background-repeat: no-repeat;
    background-size: 1.125rem 1.125rem;
    padding-right: var(--space-7);
}

.dataTables_wrapper .dataTables_filter input::placeholder {
    color: var(--c-gray-500);
}

.dataTables_wrapper .dataTables_filter input:focus,
.dataTables_wrapper .dataTables_length select:focus {
    outline: none;
    box-shadow: var(--sh-xs), inset 0 0 0 2px var(--c-accent);
}

/* Botones de export (Buttons extension) */
.dt-buttons {
    padding: var(--space-3-5) var(--space-4) 0;
    display: flex;
    gap: var(--space-2);
    flex-wrap: wrap;
}

.dt-button,
.dt-buttons .dt-button {
    background: #fff !important;
    background-image: none !important;
    border: none !important;
    border-radius: var(--r-md) !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300) !important;
    color: var(--c-gray-700) !important;
    font-size: var(--fs-sm) !important;
    font-weight: 500 !important;
    line-height: 1.25rem;
    padding: var(--space-1-5) var(--space-3) !important;
    margin: 0 !important;
    transition: background-color 0.15s ease;
}

.dt-button:hover,
.dt-buttons .dt-button:hover:not(.disabled) {
    background: var(--c-gray-50) !important;
    background-image: none !important;
    color: var(--c-gray-900) !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300) !important;
}

/* La barra de controles y la de paginacion se leen como header y footer del
   panel, igual que en las tablas de Tailwind UI */
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter {
    margin-bottom: 0;
}

.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
    background: var(--c-gray-50);
    border-top: 1px solid var(--c-gray-200);
    margin: 0;
}

.dataTables_wrapper .dataTables_info {
    padding: var(--space-3-5) var(--space-4);
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
}

.dataTables_wrapper .dataTables_paginate {
    padding: var(--space-2-5) var(--space-4);
}

/* DataTables tiñe de gris la columna por la que se ordena; las tablas de
   Tailwind UI no lo hacen y solo agrega ruido visual */
table.dataTable tbody tr > .sorting_1,
table.dataTable tbody tr > .sorting_2,
table.dataTable tbody tr > .sorting_3,
table.dataTable.display tbody tr.odd > .sorting_1,
table.dataTable.display tbody tr.even > .sorting_1 {
    background: transparent !important;
}

table.dataTable tbody tr:hover > .sorting_1,
table.dataTable tbody tr:hover > .sorting_2,
table.dataTable tbody tr:hover > .sorting_3 {
    background: var(--c-gray-50) !important;
}

/* Mensaje de tabla vacia */
.dataTables_empty,
td.dataTables_empty {
    padding: var(--space-12) var(--space-4) !important;
    text-align: center;
    color: var(--c-gray-500);
    font-size: var(--fs-base);
}

/* Celdas centradas: que el contenido tambien lo este */
table.dataTable td.text-center,
table.dataTable th.text-center { text-align: center; }

/* Los headers centrados dejan lugar a la flecha de orden sin descentrarse */
table.dataTable thead th.text-center { padding-right: var(--space-4); }

table.dataTable thead th.text-center.sorting::after,
table.dataTable thead th.text-center.sorting_asc::after,
table.dataTable thead th.text-center.sorting_desc::after {
    position: static;
    transform: none;
    margin-left: var(--space-1);
}

/* Enlaces externos dentro de las tablas (destinos de los links cortos) */
table.dataTable tbody td a {
    color: var(--c-gray-700);
    text-decoration: none;
    border-bottom: 1px solid var(--c-gray-300);
}

table.dataTable tbody td a:hover {
    color: var(--c-gray-900);
    border-bottom-color: var(--c-gray-900);
}

/* Los botones de accion no son enlaces de texto */
table.dataTable tbody td a.btn-action { border-bottom: none; }

.dataTables_wrapper .dataTables_paginate .paginate_button {
    border: none !important;
    background: transparent !important;
    border-radius: var(--r-md) !important;
    color: var(--c-gray-600) !important;
    font-size: var(--fs-sm);
    font-weight: 500;
    padding: var(--space-1-5) var(--space-3) !important;
    margin: 0 var(--space-0-5);
    transition: background-color 0.12s ease;
}

.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
    background: var(--c-gray-100) !important;
    border: none !important;
    color: var(--c-gray-900) !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button.current,
.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
    background: var(--c-accent) !important;
    border: none !important;
    color: #fff !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover {
    background: transparent !important;
    color: var(--c-gray-300) !important;
    cursor: default;
}

/* Flechas de ordenamiento: reemplazar las imagenes por chevrons discretos */
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc {
    background-image: none !important;
    position: relative;
    cursor: pointer;
    padding-right: var(--space-6);
}

table.dataTable thead .sorting::after,
table.dataTable thead .sorting_asc::after,
table.dataTable thead .sorting_desc::after {
    position: absolute;
    right: 0.5rem;
    top: 50%;
    transform: translateY(-50%);
    font-size: var(--fs-xs);
    line-height: 1;
    color: var(--c-gray-400);
}

/* Como en las tablas de Tailwind UI: el indicador aparece al pasar el mouse
   y queda fijo solo en la columna por la que se esta ordenando */
table.dataTable thead .sorting::after       { content: '\2195'; opacity: 0; }
table.dataTable thead .sorting:hover::after { opacity: 0.5; }
table.dataTable thead .sorting_asc::after   { content: '\2191'; color: var(--c-gray-900); }
table.dataTable thead .sorting_desc::after  { content: '\2193'; color: var(--c-gray-900); }

table.dataTable thead th:hover { color: var(--c-gray-900); }


/* ============================================================
   9. FORMULARIOS
   ============================================================ */

/* Espaciado inequivoco: la distancia label -> campo (--space-1-5, 6px) tiene
   que ser MUCHO menor que la distancia campo -> campo siguiente
   (--space-5, 20px). Si se parecen, no se lee a que campo pertenece cada
   etiqueta y el formulario obliga a pensar en cada fila. */
label,
.form-group label,
.col-form-label {
    display: block;
    font-size: var(--fs-base);
    line-height: 1.5rem;
    font-weight: var(--fw-medium);
    color: var(--c-gray-900);
    margin-bottom: var(--space-1-5);
    text-transform: none;      /* GO pone uppercase en los labels */
    letter-spacing: 0;
}

/* El template GO esconde los <select> nativos con opacity:0 porque espera un
   plugin JS que los reemplace por un dropdown custom. El CMS usa selects
   nativos (y DataTables genera los suyos), asi que hay que devolverlos. */
select,
select.form-control,
.custom-select,
.dataTables_length select {
    opacity: 1 !important;
    visibility: visible !important;
    position: static;
    height: auto;
}

/* El input de Tailwind UI: sin borde real, ring interior via box-shadow */
.form-control,
input[type="text"].form-control,
input[type="email"].form-control,
input[type="password"].form-control,
input[type="number"].form-control,
input[type="date"].form-control,
input[type="url"].form-control,
input[type="search"].form-control,
textarea.form-control,
select.form-control,
.custom-select {
    display: block;
    width: 100%;
    height: auto;
    background-color: #fff;
    background-image: none;
    border: none !important;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    padding: var(--space-2) var(--space-3);
    font-family: var(--font-sans);
    font-size: var(--fs-base);
    line-height: 1.5rem;
    color: var(--c-gray-900);
    transition: box-shadow 0.15s ease;
}

/* --- Anchos proporcionales al contenido ---------------------------------
   Un campo ancho promete un dato largo. Una fecha estirada a 1400px se lee
   como si esperara un parrafo, y ademas obliga al ojo a cruzar toda la
   pantalla para volver del label al valor.
   Solo se pone max-width: el ancho sigue siendo 100% dentro de columnas mas
   angostas, asi que estas reglas nunca ensanchan nada, solo recortan.
   Para dejar uno a ancho completo: data-ancho-completo en el input. */
input[type="date"].form-control    { max-width: 11rem; }
input[type="time"].form-control    { max-width: 8rem;  }
input[type="number"].form-control  { max-width: 9rem;  }
input[type="color"].form-control   { max-width: 4rem; padding: var(--space-1); }

input[data-ancho-completo].form-control { max-width: none; }

/* El placeholder va en gray-500 y no en gray-400: el 400 sobre blanco da
   2.52:1 de contraste, muy por debajo del 4.5:1 que pide AA, y a 14px se
   lee con esfuerzo. El 500 da 4.80:1 y sigue leyendose como apagado. */
.form-control::placeholder { color: var(--c-gray-500); }

.form-control:focus,
.custom-select:focus,
textarea.form-control:focus,
select.form-control:focus {
    outline: none;
    background-color: #fff;
    color: var(--c-gray-900);
    box-shadow: var(--sh-xs), inset 0 0 0 2px var(--c-accent);
}

.form-control:disabled,
.form-control[readonly] {
    background-color: var(--c-gray-50);
    color: var(--c-gray-500);
    cursor: not-allowed;
}

/* Ancho de lectura: nunca estirar prosa de lado a lado. Los textareas de
   biografia y criticas viven en col-lg-12, o sea ~1500px en un monitor
   ancho: unos 200 caracteres por linea, cuando el ojo pierde el renglon
   pasando de 75. Solo recorta (los textareas en columnas angostas no se
   enteran) y no toca las vistas previas, que replican el CSS de la web. */
textarea.form-control {
    min-height: 6rem;
    resize: vertical;
    max-width: 75ch;
}

textarea[data-ancho-completo].form-control { max-width: none; }

select.form-control,
.custom-select {
    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 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");
    background-position: right 0.5rem center;
    background-repeat: no-repeat;
    background-size: 1.25rem 1.25rem;
    padding-right: var(--space-9);
}

.form-control-sm {
    padding: var(--space-1) var(--space-2);
    font-size: var(--fs-sm);
    line-height: 1.25rem;
}

.form-group { margin-bottom: var(--space-5); }

.form-text,
small.form-text {
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-500);
    margin-top: var(--space-1-5);
    max-width: 65ch;           /* texto de ayuda: tambien es prosa */
}

/* Validacion */
.is-invalid,
.form-control.is-invalid {
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-red-500) !important;
}

.is-invalid:focus,
.form-control.is-invalid:focus {
    box-shadow: var(--sh-xs), inset 0 0 0 2px var(--c-red-500) !important;
}

.invalid-feedback,
.text-danger.small {
    font-size: var(--fs-sm);
    color: var(--c-red-600);
}

/* El error no puede depender SOLO del color: quien no distingue el rojo ve
   un borde igual al normal y un texto igual al de ayuda. El icono lo hace
   inequivoco.
   Va en ::before y NO se toca el display del bloque: Bootstrap muestra y
   esconde .invalid-feedback justamente con display, y pisarlo aca dejaria
   el mensaje visible siempre. */
.invalid-feedback::before {
    content: '';
    display: inline-block;
    width: 1em;
    height: 1em;
    margin-right: var(--space-1);
    vertical-align: -0.15em;
    background-color: currentColor;
    mask-image: var(--icono-error);
    -webkit-mask-image: var(--icono-error);
    mask-size: contain;
    -webkit-mask-size: contain;
    mask-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
}

/* Checkbox y radio */
.form-check { padding-left: var(--space-7); }

.form-check-input,
input[type="checkbox"],
input[type="radio"] {
    width: 1rem;
    height: 1rem;
    accent-color: var(--c-accent);
    /* Fuera de escala a proposito: no es espaciado sino un ajuste optico
       para que el cuadro quede sobre la linea de base de su etiqueta. */
    margin-top: 0.3rem;
}

.form-check-label {
    font-weight: 400;
    color: var(--c-gray-700);
    margin-bottom: 0;
}

/* Inputs de archivo */
input[type="file"] {
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
}

input[type="file"]::file-selector-button {
    border: none;
    border-radius: var(--r-md);
    background: #fff;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    color: var(--c-gray-900);
    font-family: var(--font-sans);
    font-size: var(--fs-sm);
    font-weight: 600;
    padding: var(--space-1-5) var(--space-3);
    margin-right: var(--space-3);
    cursor: pointer;
    transition: background-color 0.15s ease;
}

input[type="file"]::file-selector-button:hover { background: var(--c-gray-50); }

/* Spinner de submit */
.btn-submit-spinner .spinner-border {
    border-width: 0.125em;
    width: 0.875rem;
    height: 0.875rem;
}

/* Formularios dentro de cards: el patron "form section" de Tailwind UI */
form .card + .card { margin-top: var(--space-6); }


/* ============================================================
   10. BADGES Y ALERTS
   ============================================================ */

/* Badge de Tailwind UI: pill claro con ring del mismo tono */
.badge-estado {
    display: inline-flex;
    align-items: center;
    padding: var(--space-0-5) var(--space-2);
    border-radius: var(--r-md);
    font-size: var(--fs-xs);
    line-height: 1rem;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
}

.badge-estado-aprobado {
    background: var(--c-green-50);
    color: var(--c-green-700);
    box-shadow: inset 0 0 0 1px var(--c-green-ring);
}

.badge-estado-postergado {
    background: var(--c-amber-50);
    color: var(--c-amber-800);
    box-shadow: inset 0 0 0 1px var(--c-amber-ring);
}

.badge-estado-cancelado {
    background: var(--c-red-50);
    color: var(--c-red-700);
    box-shadow: inset 0 0 0 1px var(--c-red-ring);
}

.badge-estado-negociacion {
    background: var(--c-info-bg);
    color: var(--c-info-text);
    box-shadow: inset 0 0 0 1px var(--c-info-ring);
}

.badge-estado-borrador {
    background: var(--c-gray-50);
    color: var(--c-gray-600);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
}

.badge {
    font-weight: 500;
    font-size: var(--fs-xs);
    line-height: 1rem;
    padding: var(--space-0-5) var(--space-2);
    border-radius: var(--r-md);
}

/* Alerts: barra de color a la izquierda, fondo muy claro */
.alert {
    border: none;
    border-radius: var(--r-md);
    padding: var(--space-4);
    font-size: var(--fs-base);
    line-height: 1.25rem;
    box-shadow: none;
}

.alert-success {
    background: var(--c-green-50);
    color: var(--c-green-700);
    box-shadow: inset 0 0 0 1px var(--c-green-ring);
}

.alert-danger {
    background: var(--c-red-50);
    color: var(--c-red-700);
    box-shadow: inset 0 0 0 1px var(--c-red-ring);
}

.alert-warning {
    background: var(--c-amber-50);
    color: var(--c-amber-800);
    box-shadow: inset 0 0 0 1px var(--c-amber-ring);
}

.alert-info {
    background: var(--c-info-bg);
    color: var(--c-info-text);
    box-shadow: inset 0 0 0 1px var(--c-info-ring);
}

.alert strong { font-weight: 600; }

.security-alert { border-left: none; }

/* Toasts */
.cms-notification {
    top: 5rem;
    right: 1.25rem;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-lg), var(--ring-card);
    font-size: var(--fs-base);
}

/* Modales */
.modal-content {
    border: none;
    border-radius: var(--r-xl);
    box-shadow: var(--sh-lg), var(--ring-card);
}

.modal-header,
.modal-footer {
    border-color: var(--c-gray-200);
    padding: var(--space-4) var(--space-6);
}

.modal-body { padding: var(--space-6); }

.modal-title { font-size: var(--fs-lg); font-weight: 600; }


/* ============================================================
   11. DASHBOARD
   ============================================================ */

/* Stat cards: el patron "stats with icon" de Tailwind UI */
.stat-card {
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    transition: box-shadow 0.15s ease;
}

.stat-card:hover {
    transform: none;
    box-shadow: var(--sh-md), var(--ring-card);
}

.stat-card .card-body { padding: var(--space-5) var(--space-4) !important; }

.stat-card .stat-number {
    font-size: var(--fs-3xl);
    line-height: 2.25rem;
    font-weight: 600;
    letter-spacing: -0.02em;
    color: var(--c-gray-900) !important;
}

.stat-card .stat-label {
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    color: var(--c-gray-500);
    margin-top: var(--space-0-5);
}

/* Los iconos de color quedan fuera de una paleta neutra: gris uniforme */
.stat-card .stat-icon,
.stat-card .stat-icon.bg-primary-light,
.stat-card .stat-icon.bg-success-light,
.stat-card .stat-icon.bg-info-light,
.stat-card .stat-icon.bg-warning-light {
    width: 2.25rem;
    height: 2.25rem;
    font-size: var(--fs-md);
    border-radius: var(--r-lg);
    background: var(--c-gray-100);
    color: var(--c-gray-600);
    margin-bottom: var(--space-2-5);
    transition: background-color 0.15s ease, color 0.15s ease;
}

.stat-card:hover .stat-icon {
    background: var(--c-gray-900);
    color: #fff;
}

/* Quick links */
.quick-link {
    padding: var(--space-2) var(--space-2-5);
    border-radius: var(--r-md);
    color: var(--c-gray-700);
    font-size: var(--fs-base);
    font-weight: 500;
    line-height: 1.25rem;
}

.quick-link:hover {
    background: var(--c-gray-50);
    color: var(--c-gray-900);
}

.quick-link i {
    margin-right: var(--space-2-5);
    width: 1rem;
    color: var(--c-gray-400);
    opacity: 1;
}

.quick-link:hover i { color: var(--c-gray-900); }


/* ============================================================
   12. LOGS
   ============================================================ */

.log-container {
    border: none;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    max-height: 38rem;
}

.log-entry {
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    line-height: 1.25rem;
    padding: var(--space-2) var(--space-4);
    border-bottom: 1px solid var(--c-gray-100);
}

.log-entry:hover { background: var(--c-gray-50); }

.log-timestamp { color: var(--c-gray-400); }
.log-ip        { color: var(--c-gray-500); }
.log-user      { color: var(--c-gray-700); font-weight: 500; }
.log-message   { color: var(--c-gray-900); }

.badge-log-info,
.badge-log-warning,
.badge-log-error,
.badge-log-security {
    font-family: var(--font-sans);
    font-size: var(--fs-2xs);
    font-weight: 500;
    padding: var(--space-0-5) var(--space-2);
    border-radius: var(--r-md);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

.badge-log-info {
    background-color: var(--c-green-50);
    color: var(--c-green-700);
    box-shadow: inset 0 0 0 1px var(--c-green-ring);
}

.badge-log-warning {
    background-color: var(--c-amber-50);
    color: var(--c-amber-800);
    box-shadow: inset 0 0 0 1px var(--c-amber-ring);
}

.badge-log-error {
    background-color: var(--c-red-50);
    color: var(--c-red-700);
    box-shadow: inset 0 0 0 1px var(--c-red-ring);
}

.badge-log-security {
    background-color: var(--c-info-bg);
    color: var(--c-info-text);
    box-shadow: inset 0 0 0 1px var(--c-info-ring);
}


/* ============================================================
   13. LOGIN Y PANTALLAS SIN SESION
   ============================================================ */

/* login.php arma la card con .accordion-group-portal del template GO */

/* Ese acordeon dibuja su indicador de plegado en .accordion-control::after:
   un "+" de la font icomoon que, al estar el acordeon abierto, GO rota 45
   grados. O sea una X en la esquina de la tarjeta, que se lee como un boton
   de cerrar —y no cierra nada, porque la tarjeta es toda la pantalla y el
   acordeon es unico y esta siempre abierto—.
   Solo lo usan login, login_codigo, forgot_password y reset_password_confirm. */
.accordion-group-portal .accordion-control::after { content: none; }

/* Un boton que se lee como enlace. El "Reenviar código" tiene que ser un
   <button> dentro de un form —manda un POST con token, no es navegacion—,
   pero al lado de "Usar otro email" debe verse igual. */
.btn-enlace {
    border: none;
    background: none;
    padding: 0;
    font: inherit;
    color: inherit;
    text-decoration: underline;
    cursor: pointer;
}

.btn-enlace:hover { color: var(--c-gray-900); }

.accordion-group-portal {
    background: #fff;
    border: none;
    border-radius: var(--r-xl);
    box-shadow: var(--sh-lg), var(--ring-card);
    overflow: hidden;
}

.accordion-group-portal .accordion-control {
    padding: var(--space-6) var(--space-8) 0;
    border: none;
}

.accordion-group-portal .accordion-control h5 {
    font-size: var(--fs-lg);
    line-height: 1.75rem;
    font-weight: 600;
    color: var(--c-gray-900);
    margin: 0;
}

.accordion-group-portal .accordion-content-wrapper {
    padding: var(--space-6) var(--space-8) var(--space-8);
}

.accordion-group-portal .btn-block {
    margin-top: var(--space-2);
    padding: var(--space-2) var(--space-3-5);
}

.accordion-group-portal .text-muted.small {
    font-size: var(--fs-sm);
    color: var(--c-gray-500) !important;
}

.accordion-group-portal a.text-muted:hover {
    color: var(--c-gray-900) !important;
}

/* Checkbox custom de Bootstrap: el input real esta oculto y el control se
   dibuja en ::before del label. GO lo deja casi invisible, se rehace acá. */
.custom-control-label::before {
    border: 1px solid var(--c-gray-300) !important;
    background-color: #fff !important;
    border-radius: var(--r-sm) !important;
    box-shadow: none !important;
    width: 1rem;
    height: 1rem;
    top: 0.3rem;
}

.custom-control-input:checked ~ .custom-control-label::before {
    background-color: var(--c-accent) !important;
    border-color: var(--c-accent) !important;
}

.custom-control-input:focus ~ .custom-control-label::before {
    box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--c-gray-900) !important;
}

.custom-control-label::after {
    width: 1rem;
    height: 1rem;
    top: 0.3rem;
}

.custom-control-label {
    font-weight: 400;
    color: var(--c-gray-600);
    cursor: pointer;
}


/* ============================================================
   14. FOOTER
   ============================================================ */

.cms-footer {
    margin-top: var(--space-12);
    border-top: 1px solid var(--c-gray-200);
    background: transparent;
}

.cms-footer small,
.cms-footer a {
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-400) !important;
}

.cms-footer a:hover { color: var(--c-gray-700) !important; }


/* ============================================================
   15. RESPONSIVE
   ============================================================ */

@media (max-width: 1199px) {
    header.header-dark,
    header.header-sticky.header-dark {
        background: var(--c-gray-900) !important;
        margin: 0 !important;
        border-radius: 0 !important;
        width: 100% !important;
    }

    /* El menu desplegado es un panel opaco propio: sin fondo se superpone
       de forma ilegible sobre el contenido de la pagina. */
    .header-dark .navbar-collapse {
        background: var(--c-gray-900);
        margin: 0 calc(var(--space-4) * -1);
        padding: var(--space-2) var(--space-4) var(--space-5);
        max-height: calc(100vh - 4rem);
        overflow-y: auto;
        border-top: 1px solid var(--brand-brown-soft);
    }

    .header-dark .navbar-collapse .navbar-text {
        margin: var(--space-2) 0 !important;
    }

    .header-dark .navbar-nav .nav-link {
        padding: var(--space-2) var(--space-3) !important;
    }

    /* En mobile el dropdown se despliega inline: quitar el panel flotante */
    .header-dark .navbar-collapse .dropdown-menu {
        background: transparent;
        box-shadow: none;
        padding: 0 0 0 var(--space-3);
        margin-top: 0;
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item span {
        color: var(--c-gray-200);
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item p {
        color: var(--c-gray-500);
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item:hover {
        background: var(--brand-brown-soft);
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item:hover span {
        color: #fff;
    }

    /* La seccion activa no puede heredar el fondo claro del menu de escritorio */
    .header-dark .navbar-collapse .dropdown-menu .dropdown-item.active {
        background: var(--brand-brown-soft);
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item.active span {
        color: #fff;
    }

    .header-dark .navbar-collapse .dropdown-menu .dropdown-item.active p {
        color: var(--c-gray-400);
    }
}

@media (max-width: 767px) {
    /* Mantener la compensacion del header fijo, solo achicar el aire propio */
    .hero.hero-with-header {
        padding-top: calc(var(--space-16) + var(--space-5)) !important;
        padding-bottom: var(--space-5) !important;
    }

    /* El tamaño del titulo lo resuelve clamp(); aca solo el interlineado */
    .hero.hero-with-header h1 { line-height: 1.15; }

    .page-header-actions {
        margin-top: var(--space-3);
        flex-wrap: wrap;
    }

    .dataTables_wrapper .dataTables_filter input { min-width: 0; width: 100%; }

    .dataTables_wrapper .dataTables_filter label { width: 100%; }
}


/* ============================================================
   16. ICONOS — Heroicons via mask-image
   ============================================================

   El template GO trae la font icomoon, con un trazo mas pesado y una grilla
   distinta a la de Tailwind UI. Acá se reemplazan los glifos por Heroicons
   (outline 24, stroke 1.5) SIN tocar el markup: cada clase .icon-* deja de
   pintar el glifo de la font (content: none) y pasa a ser una caja cuyo
   background es currentColor recortado por la mask del SVG. Asi el icono
   hereda el color del texto igual que antes.

   Solo se redefinen las clases realmente usadas en el CMS. Cualquier otra
   .icon-* sigue funcionando con la font original.

   Generado con scratchpad/gen_icons.py — para agregar un icono, sumar el
   path de Heroicons a ese script y volver a correrlo.
   ============================================================ */

.icon-pencil,
.icon-edit-3,
.icon-trash,
.icon-link,
.icon-more-vertical,
.icon-eye,
.icon-copy,
.icon-check,
.icon-sol,
.icon-nube,
.icon-lluvia,
.icon-reloj,
.icon-calendar,
.icon-tag,
.icon-comment,
.icon-disc,
.icon-video-camera,
.icon-user,
.icon-shield,
.icon-settings,
.icon-rocket,
.icon-map-pin,
.icon-list,
.icon-envelope,
.icon-chart,
.icon-camera,
.icon-document-text,
.icon-home,
.icon-users,
.icon-share,
.icon-award {
    display: inline-block;
    width: 1.15em;
    height: 1.15em;
    vertical-align: -0.2em;
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
    font-style: normal;
}

.icon-pencil::before,
.icon-edit-3::before,
.icon-trash::before,
.icon-link::before,
.icon-more-vertical::before,
.icon-eye::before,
.icon-copy::before,
.icon-check::before,
.icon-sol::before,
.icon-nube::before,
.icon-lluvia::before,
.icon-reloj::before,
.icon-calendar::before,
.icon-tag::before,
.icon-comment::before,
.icon-disc::before,
.icon-video-camera::before,
.icon-user::before,
.icon-shield::before,
.icon-settings::before,
.icon-rocket::before,
.icon-map-pin::before,
.icon-list::before,
.icon-envelope::before,
.icon-chart::before,
.icon-camera::before,
.icon-document-text::before,
.icon-home::before,
.icon-users::before,
.icon-share::before,
.icon-award::before {
    content: none !important;
}

.icon-pencil {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125'/%3E%3C/svg%3E");
}

.icon-edit-3 {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125'/%3E%3C/svg%3E");
}

.icon-trash {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0'/%3E%3C/svg%3E");
}

.icon-link {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244'/%3E%3C/svg%3E");
}

.icon-more-vertical {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z'/%3E%3C/svg%3E");
}

.icon-eye {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 12a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 12a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3C/svg%3E");
}

.icon-copy {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75'/%3E%3C/svg%3E");
}

.icon-sol {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z'/%3E%3C/svg%3E");
}

.icon-nube {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.25 15a4.5 4.5 0 0 0 4.5 4.5H18a3.75 3.75 0 0 0 1.332-7.257 3 3 0 0 0-3.758-3.848 5.25 5.25 0 0 0-10.233 2.33A4.502 4.502 0 0 0 2.25 15Z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.25 15a4.5 4.5 0 0 0 4.5 4.5H18a3.75 3.75 0 0 0 1.332-7.257 3 3 0 0 0-3.758-3.848 5.25 5.25 0 0 0-10.233 2.33A4.502 4.502 0 0 0 2.25 15Z'/%3E%3C/svg%3E");
}

.icon-lluvia {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 9.75 14.25 12m0 0 2.25 2.25M14.25 12l2.25-2.25M14.25 12 12 14.25m-2.58 4.92-6.374 6.375a1.125 1.125 0 0 1-1.591-1.591l6.375-6.375m4.109-4.109a2.25 2.25 0 0 1 2.25-2.25h1.5'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 9.75 14.25 12m0 0 2.25 2.25M14.25 12l2.25-2.25M14.25 12 12 14.25m-2.58 4.92-6.374 6.375a1.125 1.125 0 0 1-1.591-1.591l6.375-6.375m4.109-4.109a2.25 2.25 0 0 1 2.25-2.25h1.5'/%3E%3C/svg%3E");
}

.icon-reloj {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z'/%3E%3C/svg%3E");
}

.icon-check {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='m4.5 12.75 6 6 9-13.5'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='m4.5 12.75 6 6 9-13.5'/%3E%3C/svg%3E");
}

.icon-calendar {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5'/%3E%3C/svg%3E");
}

.icon-tag {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 6h.008v.008H6V6z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 6h.008v.008H6V6z'/%3E%3C/svg%3E");
}

.icon-comment {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 01-.825-.242m9.345-8.334a2.126 2.126 0 00-.476-.095 48.64 48.64 0 00-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0011.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 01-.825-.242m9.345-8.334a2.126 2.126 0 00-.476-.095 48.64 48.64 0 00-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0011.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155'/%3E%3C/svg%3E");
}

.icon-disc {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 9l10.5-3m0 6.553v3.75a2.25 2.25 0 01-1.632 2.163l-1.32.377a1.803 1.803 0 11-.99-3.467l2.31-.66a2.25 2.25 0 001.632-2.163zm0 0V2.25L9 5.25v10.303m0 0v3.75a2.25 2.25 0 01-1.632 2.163l-1.32.377a1.803 1.803 0 01-.99-3.467l2.31-.66A2.25 2.25 0 009 15.553z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 9l10.5-3m0 6.553v3.75a2.25 2.25 0 01-1.632 2.163l-1.32.377a1.803 1.803 0 11-.99-3.467l2.31-.66a2.25 2.25 0 001.632-2.163zm0 0V2.25L9 5.25v10.303m0 0v3.75a2.25 2.25 0 01-1.632 2.163l-1.32.377a1.803 1.803 0 01-.99-3.467l2.31-.66A2.25 2.25 0 009 15.553z'/%3E%3C/svg%3E");
}

.icon-video-camera {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z'/%3E%3C/svg%3E");
}

.icon-user {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z'/%3E%3C/svg%3E");
}

.icon-shield {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z'/%3E%3C/svg%3E");
}

.icon-settings {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 12a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 12a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3C/svg%3E");
}

.icon-rocket {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.59 14.37a6 6 0 01-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 006.16-12.12A14.98 14.98 0 009.631 8.41m5.96 5.96a14.926 14.926 0 01-5.841 2.58m-.119-8.54a6 6 0 00-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 00-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 01-2.448-2.448 14.9 14.9 0 01.06-.312m-2.24 2.39a4.493 4.493 0 00-1.757 4.306 4.493 4.493 0 004.306-1.758M16.5 9a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.59 14.37a6 6 0 01-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 006.16-12.12A14.98 14.98 0 009.631 8.41m5.96 5.96a14.926 14.926 0 01-5.841 2.58m-.119-8.54a6 6 0 00-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 00-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 01-2.448-2.448 14.9 14.9 0 01.06-.312m-2.24 2.39a4.493 4.493 0 00-1.757 4.306 4.493 4.493 0 004.306-1.758M16.5 9a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z'/%3E%3C/svg%3E");
}

.icon-map-pin {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 10.5a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 10.5a3 3 0 11-6 0 3 3 0 016 0z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z'/%3E%3C/svg%3E");
}

.icon-list {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z'/%3E%3C/svg%3E");
}

.icon-envelope {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75'/%3E%3C/svg%3E");
}

.icon-chart {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z'/%3E%3C/svg%3E");
}

.icon-camera {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z'/%3E%3C/svg%3E");
}

.icon-document-text {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z'/%3E%3C/svg%3E");
}

.icon-home {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25'/%3E%3C/svg%3E");
}

.icon-users {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z'/%3E%3C/svg%3E");
}

.icon-share {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M7.217 10.907a2.25 2.25 0 100 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186l9.566-5.314m-9.566 7.5l9.566 5.314m0 0a2.25 2.25 0 103.935 2.186 2.25 2.25 0 00-3.935-2.186zm0-12.814a2.25 2.25 0 103.933-2.185 2.25 2.25 0 00-3.933 2.185z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M7.217 10.907a2.25 2.25 0 100 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186l9.566-5.314m-9.566 7.5l9.566 5.314m0 0a2.25 2.25 0 103.935 2.186 2.25 2.25 0 00-3.935-2.186zm0-12.814a2.25 2.25 0 103.933-2.185 2.25 2.25 0 00-3.933 2.185z'/%3E%3C/svg%3E");
}

.icon-award {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M7.73 9.728a6.726 6.726 0 002.748 1.35m8.272-6.842V4.5c0 2.108-.966 3.99-2.48 5.228m2.48-5.492a46.32 46.32 0 012.916.52 6.003 6.003 0 01-5.395 4.972m0 0a6.726 6.726 0 01-2.749 1.35m0 0a6.772 6.772 0 01-3.044 0'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M7.73 9.728a6.726 6.726 0 002.748 1.35m8.272-6.842V4.5c0 2.108-.966 3.99-2.48 5.228m2.48-5.492a46.32 46.32 0 012.916.52 6.003 6.003 0 01-5.395 4.972m0 0a6.726 6.726 0 01-2.749 1.35m0 0a6.772 6.772 0 01-3.044 0'/%3E%3C/svg%3E");
}


/* ============================================================
   17. SELECTOR DE VISTA (Lista / Calendario)
   ============================================================

   Control segmentado, como los "button group" de Tailwind UI: una sola
   pieza con ring exterior y el segmento activo en negro.
   ============================================================ */

.cms-view-toggle {
    display: inline-flex;
    background: #fff;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    padding: var(--space-0-5);
}

.cms-view-toggle a {
    display: inline-block;
    padding: var(--space-1) var(--space-3);
    border-radius: calc(var(--r-md) - 0.0625rem);
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: 1.25rem;
    color: var(--c-gray-600);
    transition: background-color 0.15s ease, color 0.15s ease;
}

.cms-view-toggle a:hover {
    color: var(--c-gray-900);
    background: var(--c-gray-50);
}

.cms-view-toggle a.is-active,
.cms-view-toggle a.is-active:hover {
    background: var(--c-accent);
    color: #fff;
}


/* ============================================================
   18. CALENDARIO DE AGENDA
   ============================================================

   Emula el bloque "Month view" de los calendarios de Tailwind UI.
   Las lineas divisorias de la grilla se hacen con el fondo gris del
   contenedor asomando por un gap de 1px, en vez de bordes por celda:
   asi no se duplican en los limites ni desalinean las columnas.
   ============================================================ */

.cms-calendar {
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    overflow: hidden;
}

/* --- Barra superior: mes y navegacion --- */

/* Barra de navegacion del periodo. Vive por ENCIMA de la tarjeta del
   calendario, no adentro, para que sirva igual a la vista de mes y a la de año. */
.cms-calendar-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
    padding: 0 var(--space-1) var(--space-4);
}

.cms-calendar-title {
    margin: 0;
    font-size: var(--fs-md);
    line-height: 1.5rem;
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-calendar-title span {
    color: var(--c-gray-400);
    font-weight: 400;
    margin-left: var(--space-1);
}

.cms-calendar-nav {
    display: inline-flex;
    align-items: stretch;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    overflow: hidden;
}

.cms-calendar-nav a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: #fff;
    color: var(--c-gray-500);
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: 1.25rem;
    padding: var(--space-1-5) var(--space-3);
    transition: background-color 0.15s ease, color 0.15s ease;
}

.cms-calendar-nav a:hover {
    background: var(--c-gray-50);
    color: var(--c-gray-900);
}

.cms-calendar-arrow {
    font-size: var(--fs-lg) !important;
    line-height: 1 !important;
    padding: var(--space-1-5) var(--space-2-5) !important;
}

.cms-calendar-today {
    box-shadow: inset 1px 0 0 var(--c-gray-300), inset -1px 0 0 var(--c-gray-300);
}

/* --- Grilla --- */

.cms-calendar-weekdays {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    background: var(--c-gray-50);
    border-bottom: 1px solid var(--c-gray-200);
}

.cms-calendar-weekday {
    padding: var(--space-2) var(--space-3);
    font-size: var(--fs-2xs);
    font-weight: 600;
    line-height: 1rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--c-gray-500);
    text-align: center;
}

.cms-calendar-days {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 1px;
    background: var(--c-gray-200);
}

/* Los dias con eventos son <button> (abren el drawer) y los vacios <div>:
   se resetean los estilos propios del boton para que no se distingan. */
.cms-calendar-day {
    position: relative;
    min-height: 7.5rem;
    background: #fff;
    padding: var(--space-2);
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    width: 100%;
    border: none;
    margin: 0;
    text-align: left;
    font-family: inherit;
    font-size: inherit;
    color: inherit;
}

button.cms-calendar-day {
    cursor: pointer;
    transition: background-color 0.12s ease;
}

button.cms-calendar-day:hover {
    background: var(--c-gray-50);
}

button.cms-calendar-day:focus-visible {
    outline: 2px solid var(--c-gray-900);
    outline-offset: -2px;
}

/* Dias del mes anterior o siguiente: presentes pero en segundo plano */
.cms-calendar-day.is-outside { background: var(--c-gray-50); }

.cms-calendar-day.is-outside .cms-calendar-daynum { color: var(--c-gray-400); }

.cms-calendar-day.is-outside .cms-calendar-event { opacity: 0.65; }

.cms-calendar-daynum {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    flex: 0 0 auto;
    align-self: flex-start;
    border-radius: var(--r-full);
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: 1;
    color: var(--c-gray-700);
}

/* Hoy: disco oscuro, como en Tailwind UI */
.cms-calendar-day.is-today .cms-calendar-daynum {
    background: var(--c-accent);
    color: #fff;
    font-weight: 600;
}

/* --- Eventos dentro de un dia --- */

.cms-calendar-events {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-0-5);
    min-width: 0;
}

.cms-calendar-event {
    display: flex;
    align-items: center;
    gap: var(--space-1-5);
    /* Fuera de escala a proposito: 3px. Llevarlo a 4 agrega 2px de alto a
       cada evento, y una celda con tres eventos crece 6px: el mes deja de
       entrar en el alto de la grilla. La densidad manda sobre la escala. */
    padding: 0.1875rem 0.375rem;
    border-radius: var(--r-sm);
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-700);
    min-width: 0;
    transition: background-color 0.12s ease;
}

/* Los eventos ya no son enlaces: el clickeable es el dia entero, que abre el
   drawer. El hover se resuelve a nivel de celda. */
button.cms-calendar-day:hover .cms-calendar-event {
    color: var(--c-gray-900);
}

.cms-calendar-event-time {
    flex: 0 0 auto;
    color: var(--c-gray-400);
    font-variant-numeric: tabular-nums;
}

.cms-calendar-event:hover .cms-calendar-event-time { color: var(--c-gray-500); }

/* El titulo se recorta con puntos suspensivos en vez de romper la celda */
.cms-calendar-event-name {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cms-calendar-more {
    padding: var(--space-0-5) var(--space-1-5);
    font-size: var(--fs-2xs);
    line-height: 1rem;
    font-weight: 500;
    color: var(--c-gray-400);
}

/* --- Puntos de estado --- */

.cms-calendar-dot {
    flex: 0 0 auto;
    width: 0.375rem;
    height: 0.375rem;
    border-radius: var(--r-full);
    background: var(--c-gray-400);
}

.cms-calendar-dot-aprobado    { background: var(--c-green-600); }
.cms-calendar-dot-postergado  { background: #d97706; }
.cms-calendar-dot-cancelado   { background: var(--c-red-600); }
.cms-calendar-dot-negociacion { background: var(--c-info); }
.cms-calendar-dot-borrador    { background: var(--c-gray-400); }

/* --- Referencias --- */

.cms-calendar-legend {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
    padding: var(--space-3) var(--space-5);
    background: var(--c-gray-50);
    border-top: 1px solid var(--c-gray-200);
}

.cms-calendar-legend-item {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1-5);
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-500);
}

/* --- Responsive --- */

@media (max-width: 767px) {
    /* En pantallas chicas la grilla de 7 columnas deja celdas ilegibles:
       se achica la altura y se ocultan los horarios, no los eventos. */
    .cms-calendar-day {
        min-height: 4.5rem;
        padding: var(--space-1);
    }

    .cms-calendar-daynum {
        width: 1.25rem;
        height: 1.25rem;
        font-size: var(--fs-xs);
    }

    .cms-calendar-event-time { display: none; }

    .cms-calendar-event {
        padding: var(--space-0-5) var(--space-1);
        font-size: var(--fs-2xs);
    }

    .cms-calendar-weekday {
        padding: var(--space-1-5) var(--space-1);
        font-size: var(--fs-3xs);
    }

    .cms-calendar-toolbar {
        flex-direction: column;
        align-items: stretch;
        gap: var(--space-3);
    }
}


/* ============================================================
   19. MAPA DE UBICACIONES DE LA AGENDA
   ============================================================

   Leaflet trae su propio look (bordes azules, sombras, popups con punta).
   Aca se lo lleva al sistema de la v2: panel con ring, pines monocromos y
   popups con la misma forma que los dropdowns.
   ============================================================ */

.cms-map-panel {
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    overflow: hidden;
}

.cms-map {
    height: 34rem;
    width: 100%;
    background: var(--c-gray-100);
}

/* Los tiles de OSM vienen a todo color y desentonan con la paleta neutra del
   CMS. Se desaturan por CSS —no hace falta otro proveedor de tiles— y asi los
   pines oscuros quedan como el unico elemento con peso visual. */
.cms-map .leaflet-tile-pane {
    filter: grayscale(1) contrast(0.92) brightness(1.06);
}

/* --- Pines --- */

/* circleMarker se pinta con atributos SVG, por eso van via fill/stroke */
.cms-map-marker {
    fill: var(--c-gray-900);
    fill-opacity: 0.75;
    stroke: #fff;
    stroke-opacity: 0.9;
    transition: fill-opacity 0.15s ease;
    cursor: pointer;
}

.cms-map-marker:hover {
    fill-opacity: 1;
}

/* --- Popup --- */

.leaflet-popup-content-wrapper {
    border-radius: var(--r-lg);
    box-shadow: var(--sh-lg), var(--ring-card);
    padding: 0;
}

.leaflet-popup-content {
    margin: 0;
    font-family: var(--font-sans);
}

.leaflet-popup-tip {
    box-shadow: none;
}

.cms-map-popup {
    display: flex;
    flex-direction: column;
    gap: var(--space-0-5);
    padding: var(--space-3-5) var(--space-4);
    min-width: 11rem;
}

.cms-map-popup strong {
    font-size: var(--fs-base);
    font-weight: 600;
    line-height: 1.25rem;
    color: var(--c-gray-900);
}

.cms-map-popup span {
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-500);
}

.cms-map-popup .cms-map-popup-count {
    color: var(--c-gray-900);
    font-weight: 500;
    margin-top: var(--space-1);
}

.cms-map-popup .cms-map-popup-range {
    font-variant-numeric: tabular-nums;
}

.cms-map-popup a {
    margin-top: var(--space-2);
    padding-top: var(--space-2);
    border-top: 1px solid var(--c-gray-200);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-900);
}

.cms-map-popup a:hover {
    color: var(--c-gray-600);
}

/* --- Tooltip --- */

.leaflet-tooltip {
    background: var(--c-gray-900);
    border: none;
    border-radius: var(--r-md);
    box-shadow: var(--sh-md);
    color: #fff;
    font-family: var(--font-sans);
    font-size: var(--fs-xs);
    font-weight: 500;
    line-height: 1rem;
    padding: var(--space-1) var(--space-2);
}

.leaflet-tooltip-top::before { border-top-color: var(--c-gray-900); }
.leaflet-tooltip-bottom::before { border-bottom-color: var(--c-gray-900); }

/* --- Controles --- */

.leaflet-bar,
.leaflet-bar a {
    border: none !important;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    color: var(--c-gray-700);
}

.leaflet-bar a:hover {
    background: var(--c-gray-50);
    color: var(--c-gray-900);
}

.leaflet-control-attribution {
    background: rgba(255, 255, 255, 0.85) !important;
    font-family: var(--font-sans);
    font-size: var(--fs-3xs);
    color: var(--c-gray-400);
}

.leaflet-control-attribution a { color: var(--c-gray-500); }

/* --- Referencias --- */

.cms-map-legend {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-5);
    padding: var(--space-3) var(--space-5);
    background: var(--c-gray-50);
    border-top: 1px solid var(--c-gray-200);
}

.cms-map-legend-item {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-500);
}

.cms-map-dot {
    display: inline-block;
    border-radius: var(--r-full);
    background: var(--c-gray-900);
    opacity: 0.75;
}

.cms-map-dot-sm { width: 0.5rem;   height: 0.5rem; }
.cms-map-dot-md { width: 0.75rem;  height: 0.75rem; }
.cms-map-dot-lg { width: 1rem;     height: 1rem; }

@media (max-width: 767px) {
    .cms-map { height: 22rem; }

    .cms-map-legend {
        gap: var(--space-3);
        padding: var(--space-2-5) var(--space-3-5);
    }

    /* El texto de ayuda sobra cuando el espacio es poco */
    .cms-map-legend-item.ml-auto { display: none; }
}


/* Heroicon agregado despues del bloque 16 (menu: Mapa). Repite las
   propiedades base porque vive fuera de la lista compartida. */
.icon-globe {
    display: inline-block;
    width: 1.15em;
    height: 1.15em;
    vertical-align: -0.2em;
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
    font-style: normal;
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418'/%3E%3C/svg%3E");
}

.icon-globe::before { content: none !important; }


/* ============================================================
   20. CALENDARIO — VISTA ANUAL
   ============================================================

   Doce meses en miniatura, como el bloque "Year view" de Tailwind UI.
   A esta escala no entra el titulo de cada evento: cada dia con actividad
   muestra hasta tres puntos de estado y el detalle se ve en el drawer.
   ============================================================ */

.cms-year-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
    gap: 1px;
    background: var(--c-gray-200);
}

.cms-year-month {
    background: #fff;
    padding: var(--space-4) var(--space-4) var(--space-5);
}

.cms-year-month-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2);
    margin-bottom: var(--space-2-5);
}

.cms-year-month-name {
    font-size: var(--fs-base);
    font-weight: 600;
    line-height: 1.25rem;
    color: var(--c-gray-900);
}

.cms-year-month-name:hover {
    color: var(--c-gray-600);
    text-decoration: underline;
}

/* Cuantos eventos tiene el mes */
.cms-year-month-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.25rem;
    height: 1.25rem;
    padding: 0 var(--space-1-5);
    border-radius: var(--r-full);
    background: var(--c-gray-100);
    color: var(--c-gray-600);
    font-size: var(--fs-2xs);
    font-weight: 600;
    line-height: 1;
}

.cms-year-weekdays,
.cms-year-days {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: var(--space-0-5);
}

.cms-year-weekdays {
    margin-bottom: var(--space-1);
}

.cms-year-weekdays span {
    text-align: center;
    font-size: var(--fs-3xs);
    font-weight: 600;
    line-height: 1rem;
    letter-spacing: 0.04em;
    color: var(--c-gray-400);
}

.cms-year-day {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--space-0-5);
    min-height: 2rem;
    /* Fuera de escala a proposito, misma razon que .cms-calendar-event: en
       la vista anual entran doce meses en miniatura y no sobra un pixel. */
    padding: 0.1875rem 0;
    border: none;
    background: none;
    border-radius: var(--r-sm);
    font-family: inherit;
}

.cms-year-daynum {
    font-size: var(--fs-xs);
    line-height: 1;
    color: var(--c-gray-700);
    font-variant-numeric: tabular-nums;
}

.cms-year-day.is-outside { visibility: hidden; }

.cms-year-day.has-events {
    background: var(--c-gray-50);
    cursor: pointer;
    transition: background-color 0.12s ease;
}

.cms-year-day.has-events:hover {
    background: var(--c-gray-200);
}

.cms-year-day.is-today .cms-year-daynum {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.25rem;
    height: 1.25rem;
    border-radius: var(--r-full);
    background: var(--c-accent);
    color: #fff;
    font-weight: 600;
}

.cms-year-dots {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-0-5);
    height: 0.375rem;
}

.cms-year-dots .cms-calendar-dot {
    width: 0.25rem;
    height: 0.25rem;
}


/* ============================================================
   21. DRAWER LATERAL (slide-over)
   ============================================================

   Panel que entra desde la derecha con el detalle de un dia, siguiendo el
   bloque "Slide-over" de Tailwind UI.
   ============================================================ */

.cms-drawer {
    position: fixed;
    inset: 0;
    z-index: 1080;   /* por encima del sidebar, que esta en 1030 */
}

.cms-drawer[hidden] { display: none; }

.cms-drawer-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(17, 24, 39, 0.4);
    opacity: 0;
    transition: opacity 0.2s ease;
}

.cms-drawer.is-open .cms-drawer-backdrop { opacity: 1; }

.cms-drawer-panel {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: var(--drawer-ancho, min(26rem, 100vw));
    display: flex;
    flex-direction: column;
    background: #fff;
    box-shadow: var(--sh-lg);
    transform: translateX(100%);
    transition: transform 0.2s ease;
    outline: none;
}

.cms-drawer.is-open .cms-drawer-panel { transform: translateX(0); }

/* Cuando el drawer esta abierto la pagina de atras no scrollea */
body.cms-drawer-abierto { overflow: hidden; }

.cms-drawer-head {
    /* GO posiciona los <header> en absolute (los usa para la barra del sitio),
       asi que este se salia del flujo y el cuerpo se le montaba encima */
    position: relative;
    /* flex:0 0 auto o el cuerpo, que es alto, la aplasta hasta superponerse */
    flex: 0 0 auto;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-5) var(--space-6);
    border-bottom: 1px solid var(--c-gray-200);
}

.cms-drawer-title {
    margin: 0;
    font-size: var(--fs-md);
    line-height: 1.5rem;
    font-weight: 600;
    color: var(--c-gray-900);
}

/* La fecha llega en minusculas desde el JS. Se capitaliza solo la primera
   letra: `capitalize` pondria "Sabado 11 De Julio De 2026", que en español
   esta mal. */
.cms-drawer-title::first-letter {
    text-transform: uppercase;
}

.cms-drawer-subtitle {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-500);
}

.cms-drawer-close {
    flex: 0 0 auto;
    width: 1.75rem;
    height: 1.75rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: none;
    border-radius: var(--r-md);
    color: var(--c-gray-400);
    font-size: var(--fs-xl);
    line-height: 1;
    cursor: pointer;
    transition: background-color 0.12s ease, color 0.12s ease;
}

.cms-drawer-close:hover {
    background: var(--c-gray-100);
    color: var(--c-gray-900);
}

.cms-drawer-body {
    flex: 1 1 auto;
    min-height: 0;   /* sin esto el hijo flex no scrollea, se estira */
    overflow-y: auto;
    padding: var(--space-5) var(--space-6) var(--space-8);
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
}

/* --- Tarjeta de evento --- */

.cms-drawer-event {
    padding: var(--space-4);
    border-radius: var(--r-lg);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
}

.cms-drawer-event-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-3);
    margin-bottom: var(--space-3);
}

.cms-drawer-event-head h3 {
    margin: 0;
    font-size: var(--fs-base);
    line-height: 1.25rem;
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-drawer-event-head .badge-estado { flex: 0 0 auto; }

/* Etiqueta y valor en dos columnas */
.cms-drawer-meta {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: var(--space-1) var(--space-3);
    margin: 0;
    font-size: var(--fs-sm);
    line-height: 1.25rem;
}

.cms-drawer-meta dt {
    color: var(--c-gray-500);
    font-weight: 400;
}

.cms-drawer-meta dd {
    margin: 0;
    color: var(--c-gray-900);
}

.cms-drawer-links {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    margin-top: var(--space-3);
}

.cms-drawer-links a {
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-700);
    border-bottom: 1px solid var(--c-gray-300);
}

.cms-drawer-links a:hover {
    color: var(--c-gray-900);
    border-bottom-color: var(--c-gray-900);
}

.cms-drawer-actions {
    display: flex;
    gap: var(--space-2);
    margin-top: var(--space-4);
    padding-top: var(--space-3-5);
    border-top: 1px solid var(--c-gray-200);
}

.cms-drawer-vacio {
    margin: 0;
    padding: var(--space-8) 0;
    text-align: center;
    font-size: var(--fs-base);
    color: var(--c-gray-500);
}

@media (max-width: 767px) {
    .cms-drawer-panel { width: 100vw; }

    .cms-year-grid { grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr)); }
}


/* ============================================================
   22. STATS Y FILTRO DE RANGO
   ============================================================

   Fila de estadisticas segun el bloque "Stats" de Tailwind UI: una grilla de
   celdas blancas separadas por lineas de 1px, sin bordes por celda.
   ============================================================ */

.cms-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
    gap: 1px;
    margin: 0 0 var(--space-4);
    background: var(--c-gray-200);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
    overflow: hidden;
}

.cms-stat {
    background: #fff;
    padding: var(--space-4) var(--space-5);
}

.cms-stat dt {
    margin: 0;
    font-size: var(--fs-xs);
    line-height: 1rem;
    font-weight: 500;
    color: var(--c-gray-500);
}

.cms-stat dd {
    margin: var(--space-1) 0 0;
    font-size: var(--fs-2xl);
    line-height: 2rem;
    font-weight: 600;
    letter-spacing: -0.02em;
    color: var(--c-gray-900);
    font-variant-numeric: tabular-nums;
}

/* El unico dato con color: lo que todavia no paso */
.cms-stat dd.is-proximo { color: var(--c-green-700); }

/* --- Filtro por rango --- */

.cms-filtros {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3) var(--space-6);
    padding: var(--space-3) var(--space-4);
    margin-bottom: var(--space-4);
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
}

.cms-filtros-campos {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2);
}

/* Los labels y los inputs del CMS son display:block y width:100%; en esta
   barra tienen que ir en linea o cada campo se lleva un renglon entero.
   El selector es largo a proposito: la regla de formularios de la seccion 9
   incluye `input[type="date"].form-control`, que le gana a dos clases. */
.cms-filtros .cms-filtros-campos label {
    display: inline-block;
    margin: 0;
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: 1.25rem;
    color: var(--c-gray-500);
}

.cms-filtros .cms-filtros-campos input.form-control {
    display: inline-block;
    width: auto;
    min-width: 9.5rem;
}

.cms-filtros-atajos {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-1);
}

.cms-filtros-atajos a {
    padding: var(--space-1) var(--space-2-5);
    border-radius: var(--r-md);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-600);
    transition: background-color 0.12s ease, color 0.12s ease;
}

.cms-filtros-atajos a:hover {
    background: var(--c-gray-100);
    color: var(--c-gray-900);
}


/* ============================================================
   23. PROXIMOS EVENTOS
   ============================================================ */

.cms-proximos {
    margin-bottom: var(--space-4);
    padding: var(--space-3-5) var(--space-5) var(--space-4);
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs), var(--ring-card);
}

.cms-proximos-titulo {
    margin: 0 0 var(--space-2);
    font-size: var(--fs-xs);
    line-height: 1rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--c-gray-500);
}

.cms-proximos-lista {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-0-5);
}

/* Cada proximo evento centra el mapa en su ciudad */
.cms-proximo {
    display: flex;
    align-items: center;
    gap: var(--space-2-5);
    width: 100%;
    padding: var(--space-1-5) var(--space-2);
    border: none;
    background: none;
    border-radius: var(--r-md);
    font-family: inherit;
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    text-align: left;
    cursor: pointer;
    transition: background-color 0.12s ease;
}

.cms-proximo:hover { background: var(--c-gray-50); }

.cms-proximo:focus-visible {
    outline: 2px solid var(--c-gray-900);
    outline-offset: -2px;
    background: var(--c-gray-50);
}

.cms-proximo-fecha {
    flex: 0 0 auto;
    color: var(--c-gray-900);
    font-weight: 500;
    font-variant-numeric: tabular-nums;
}

.cms-proximo-lugar {
    flex: 0 0 auto;
    color: var(--c-gray-600);
}

/* El titulo cede espacio primero cuando la fila no entra */
.cms-proximo-titulo {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--c-gray-400);
}

@media (max-width: 767px) {
    .cms-proximo { flex-wrap: wrap; gap: var(--space-1) var(--space-2); }
    .cms-proximo-titulo { flex-basis: 100%; }
}


/* ============================================================
   24. PINES DEL MAPA POR CERCANIA TEMPORAL
   ============================================================

   El verde es el unico color del mapa, para que los proximos eventos se
   encuentren de un vistazo entre trescientos pines.
   ============================================================ */

.cms-map-marker.is-proximo {
    fill: var(--c-green-600);
    fill-opacity: 0.9;
    stroke: #fff;
}

.cms-map-marker.is-proximo:hover { fill-opacity: 1; }

.cms-map-marker.is-futuro {
    fill: var(--c-gray-900);
    fill-opacity: 0.8;
}

.cms-map-marker.is-pasado {
    fill: var(--c-gray-400);
    fill-opacity: 0.65;
}

.cms-map-marker.is-pasado:hover { fill-opacity: 0.95; }

/* Puntos de la leyenda y de la lista de proximos */
.cms-map-dot-proximo { background: var(--c-green-600); opacity: 1; }
.cms-map-dot-futuro  { background: var(--c-gray-900); opacity: 0.8; }
.cms-map-dot-pasado  { background: var(--c-gray-400); opacity: 1; }

.cms-map-dot-proximo,
.cms-map-dot-futuro,
.cms-map-dot-pasado {
    width: 0.625rem;
    height: 0.625rem;
    flex: 0 0 auto;
}

.cms-map-popup-proximo {
    color: var(--c-green-700) !important;
    font-weight: 500;
}


/* ============================================================
   25. CODIGO DE ACCESO EN CASILLAS (OTP)
   ============================================================

   Una casilla grande por digito, como en el resto de los sistemas que piden
   un codigo. El campo que se envia es un input oculto que mantiene el JS.
   ============================================================ */

.cms-otp {
    display: flex;
    gap: var(--space-2);
    justify-content: space-between;
    margin-top: var(--space-1);
}

.cms-otp-box {
    flex: 1 1 0;
    min-width: 0;
    height: 3.5rem;
    padding: 0;
    text-align: center;
    font-family: var(--font-sans);
    font-size: var(--fs-2xl);
    font-weight: 600;
    line-height: 1;
    color: var(--c-gray-900);
    background: #fff;
    border: none;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    font-variant-numeric: tabular-nums;
    transition: box-shadow 0.15s ease;
    /* Oculta las flechitas que algunos navegadores agregan */
    appearance: none;
    -webkit-appearance: none;
}

.cms-otp-box:focus {
    outline: none;
    box-shadow: var(--sh-xs), inset 0 0 0 2px var(--c-accent);
}

/* Una casilla ya cargada se distingue de una vacia */
.cms-otp-box:not(:placeholder-shown) {
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-400);
}

@media (max-width: 400px) {
    .cms-otp { gap: var(--space-1); }
    .cms-otp-box { height: 2.75rem; font-size: var(--fs-lg); }
}


/* ============================================================
   26. MODAL DE CONFIRMACION
   ============================================================

   Bloque "Simple with gray footer" de los Modal Dialogs de Tailwind UI:
   icono de alerta, texto al costado y pie gris con los dos botones.
   ============================================================ */

.cms-modal {
    position: fixed;
    inset: 0;
    z-index: 1090;   /* por encima del drawer (1080) y del sidebar (1030) */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-4);
}

.cms-modal[hidden] { display: none; }

.cms-modal-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(17, 24, 39, 0.5);
    opacity: 0;
    transition: opacity 0.15s ease;
}

.cms-modal.is-open .cms-modal-backdrop { opacity: 1; }

.cms-modal-dialog {
    position: relative;
    width: 100%;
    max-width: 32rem;
    background: #fff;
    border-radius: var(--r-xl);
    box-shadow: var(--sh-lg), var(--ring-card);
    overflow: hidden;
    /* Entra desde un poco mas abajo y achicado, como el de Tailwind UI */
    opacity: 0;
    transform: translateY(0.75rem) scale(0.97);
    transition: opacity 0.15s ease, transform 0.15s ease;
}

.cms-modal.is-open .cms-modal-dialog {
    opacity: 1;
    transform: translateY(0) scale(1);
}

body.cms-modal-abierto { overflow: hidden; }

.cms-modal-cuerpo {
    display: flex;
    align-items: flex-start;
    gap: var(--space-4);
    padding: var(--space-6);
}

.cms-modal-icono {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: var(--r-full);
    background: var(--c-gray-100);
    color: var(--c-gray-600);
}

.cms-modal-icono.is-peligro {
    background: var(--c-red-50);
    color: var(--c-red-600);
}

.cms-modal-icono svg {
    width: 1.375rem;
    height: 1.375rem;
}

.cms-modal-titulo {
    margin: var(--space-1) 0 0;
    font-size: var(--fs-md);
    line-height: 1.5rem;
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-modal-mensaje {
    margin: var(--space-2) 0 0;
    font-size: var(--fs-base);
    line-height: 1.25rem;
    color: var(--c-gray-500);
}

.cms-modal-mensaje[hidden] { display: none; }

.cms-modal-pie {
    display: flex;
    justify-content: flex-end;
    gap: var(--space-2);
    padding: var(--space-3-5) var(--space-6);
    background: var(--c-gray-50);
    border-top: 1px solid var(--c-gray-200);
}

@media (max-width: 480px) {
    /* En pantallas chicas los botones ocupan el ancho, como en Tailwind UI */
    .cms-modal-pie { flex-direction: column-reverse; }
    .cms-modal-pie .btn { width: 100%; }
}


/* ============================================================
   27. DRAWER: BOTON DE CERRAR POR FUERA
   ============================================================

   Variante "With close button on outside": la X vive sobre el fondo, a la
   izquierda del panel, en vez de dentro de la cabecera.
   ============================================================ */

.cms-drawer-close-fuera {
    position: absolute;
    top: 1rem;
    /* Se corre segun el ancho REAL del panel: estaba escrito a mano como
       26rem, asi que sobre el drawer ancho (32rem) la X caia adentro del
       panel, encima del titulo. */
    right: calc(var(--drawer-ancho, min(26rem, 100vw)) + 0.75rem);
    z-index: 2;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border: none;
    background: none;
    border-radius: var(--r-full);
    color: rgba(255, 255, 255, 0.8);
    font-size: var(--fs-2xl);
    line-height: 1;
    cursor: pointer;
    opacity: 0;
    transition: opacity 0.2s ease, color 0.15s ease, background-color 0.15s ease;
}

.cms-drawer.is-open .cms-drawer-close-fuera { opacity: 1; }

.cms-drawer-close-fuera:hover {
    color: #fff;
    background: rgba(255, 255, 255, 0.12);
}

.cms-drawer-close-fuera:focus-visible {
    outline: 2px solid #fff;
    outline-offset: 2px;
}

@media (max-width: 767px) {
    /* Con el panel a pantalla completa no hay "afuera": vuelve adentro */
    .cms-drawer-close-fuera {
        right: 0.75rem;
        color: var(--c-gray-500);
    }

    .cms-drawer-close-fuera:hover {
        color: var(--c-gray-900);
        background: var(--c-gray-100);
    }
}


/* ============================================================
   28. SELECTS — bloque "Select menus" de Tailwind UI
   ============================================================

   El select nativo, llevado al mismo lenguaje que el resto de los campos:
   sin borde propio, ring interior, chevron gris a la derecha y la misma
   altura que un input de texto para que las filas de un form no bailen.
   ============================================================ */

select,
select.form-control,
.custom-select,
.dataTables_length select {
    /* El chevron lo dibuja el CSS: se oculta el del sistema */
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M4 6l4 4 4-4' stroke='%236b7280' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.625rem center;
    background-size: 1rem 1rem;
    padding-right: var(--space-9);
    cursor: pointer;
    /* Sin esto Safari le pone un degrade propio */
    background-color: #fff;
}

select.form-control:hover:not(:disabled),
.custom-select:hover:not(:disabled) {
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-400);
}

select.form-control:disabled,
.custom-select:disabled {
    background-color: var(--c-gray-50);
    color: var(--c-gray-400);
    cursor: not-allowed;
}

/* Los option heredan del sistema operativo; solo se puede el color de fondo */
select.form-control option {
    color: var(--c-gray-900);
    background: #fff;
}

/* Un select sin elegir se lee como placeholder, igual que un input vacio */
select.form-control:invalid,
select.form-control option[value=""] {
    color: var(--c-gray-500);
}

/* Multiple: no lleva chevron ni padding extra, se ve como una lista */
select[multiple].form-control {
    background-image: none;
    padding-right: var(--space-3);
    min-height: 8rem;
}

select[multiple].form-control option {
    padding: var(--space-1-5) var(--space-2);
    border-radius: var(--r-sm);
}


/* ============================================================
   29. BARRA DE FORMATO DE TEXTO (negrita / enfasis / italica)
   ============================================================ */

.cms-formato {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin-bottom: var(--space-2);
    flex-wrap: wrap;
}

/* Grupo segmentado: una sola pieza, como el "button group" de Tailwind UI */
.cms-formato-grupo {
    display: inline-flex;
    background: #fff;
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    overflow: hidden;
}

.cms-formato-btn {
    width: 2rem;
    height: 1.875rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: none;
    color: var(--c-gray-600);
    font-family: var(--font-sans);
    font-size: var(--fs-sm);
    line-height: 1;
    cursor: pointer;
    transition: background-color 0.12s ease, color 0.12s ease;
}

.cms-formato-btn + .cms-formato-btn {
    box-shadow: inset 1px 0 0 var(--c-gray-200);
}

.cms-formato-btn:hover {
    background: var(--c-gray-50);
    color: var(--c-gray-900);
}

.cms-formato-btn:active {
    background: var(--c-gray-100);
}

.cms-formato-btn:focus-visible {
    outline: 2px solid var(--c-gray-900);
    outline-offset: -2px;
}

/* La tecla rapida, discreta al lado del boton */
.cms-formato-ayuda {
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-400);
}

.cms-formato-ayuda kbd {
    display: inline-block;
    padding: var(--space-0-5) var(--space-1-5);
    border-radius: var(--r-sm);
    background: var(--c-gray-100);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    color: var(--c-gray-600);
    font-family: var(--font-sans);
    font-size: var(--fs-2xs);
    font-weight: 500;
}


/* ============================================================
   30. MODAL CON CAMPO DE TEXTO (prompt)
   ============================================================ */

.cms-modal-campo {
    margin-top: var(--space-3-5);
}

.cms-modal-campo label {
    display: block;
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-700);
    margin-bottom: var(--space-1-5);
}

.cms-modal-campo[hidden] { display: none; }


/* ============================================================
   31. DRAWER CON FORMULARIO
   ============================================================

   Variante del drawer para dar de alta un registro sin perder de vista el
   listado que quedo atras. El pie queda fijo abajo y el cuerpo scrollea.
   ============================================================ */

.cms-drawer-foot {
    flex: 0 0 auto;
    display: flex;
    justify-content: flex-end;
    gap: var(--space-2);
    padding: var(--space-3-5) var(--space-6);
    background: var(--c-gray-50);
    border-top: 1px solid var(--c-gray-200);
}

/* Dentro del drawer los campos van uno debajo del otro, a todo el ancho */
.cms-drawer-body .form-group {
    margin-bottom: var(--space-4);
}

.cms-drawer-body .form-group:last-child {
    margin-bottom: 0;
}

/* El drawer del calendario apila tarjetas; el de formulario, campos */
.cms-drawer-body form {
    display: block;
}


/* ============================================================
   32. AJUSTES DE LA AUDITORIA MOBILE
   ============================================================ */

/* Las tablas del dashboard viven en un .card-body sin .table-responsive:
   en 375px desbordaban la pagina entera. El scroll queda dentro del card. */
.card-body:has(> .table-dashboard) {
    overflow-x: auto;
}

/* Fallback amplio para navegadores sin :has() — el card nunca desborda */
@supports not selector(:has(> *)) {
    .card-body { overflow-x: auto; }
}

/* Avatar del perfil, en el page header */
.cms-perfil-avatar {
    width: 4rem;
    height: 4rem;
    object-fit: cover;
    border-radius: var(--r-full);
    box-shadow: var(--sh-xs), 0 0 0 2px #fff, var(--ring-card);
}

/* Stat en alerta (intentos fallidos > 0): el unico rojo de la fila */
.cms-stat dd.is-alerta { color: var(--c-red-600); }

/* Tabs del perfil al lenguaje de Tailwind UI: subrayado fino, sin cajas */
.nav-tabs {
    border-bottom: 1px solid var(--c-gray-200);
    gap: var(--space-6);
}

.nav-tabs .nav-link {
    border: none;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    padding: var(--space-2-5) var(--space-0-5);
    margin-bottom: -1px;
    font-size: var(--fs-base) !important;
    font-weight: 500 !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    color: var(--c-gray-500);
    background: none;
}

.nav-tabs .nav-link:hover {
    color: var(--c-gray-700);
    border-bottom-color: var(--c-gray-300);
}

.nav-tabs .nav-link.active {
    color: var(--c-gray-900);
    border-bottom-color: var(--c-accent);
    background: none;
}

/* Chip informativo neutro (plataformas de streaming, etiquetas breves) */
.cms-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.375rem;
    height: 1.25rem;
    padding: 0 var(--space-1-5);
    margin-right: var(--space-0-5);
    border-radius: var(--r-sm);
    background: var(--c-gray-100);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    color: var(--c-gray-600);
    font-size: var(--fs-2xs);
    font-weight: 600;
    line-height: 1;
    cursor: default;
}

.cms-chip:hover {
    background: var(--c-gray-900);
    box-shadow: none;
    color: #fff;
}

/* Icono decorativo dentro de una celda (el trofeo de premio) */
.cms-icono-suave {
    color: var(--c-gray-400);
    font-size: var(--fs-md);
}

/* Etiqueta de tipo de registro en las tablas (Concierto, Album, ...) */
.cms-tipo {
    font-size: var(--fs-2xs);
    font-weight: 500;
    line-height: 1rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--c-gray-500);
    white-space: nowrap;
}

/* Badges contextuales de Bootstrap al lenguaje suave del sistema: fondo
   claro + ring del mismo tono, en vez del color pleno saturado. Aplica a
   cualquier pagina que use badge-success / danger / warning / info / etc. */
.badge.badge-success  { background: var(--c-green-50) !important; color: var(--c-green-700) !important; box-shadow: inset 0 0 0 1px var(--c-green-ring); }
.badge.badge-danger   { background: var(--c-red-50) !important;   color: var(--c-red-700) !important;   box-shadow: inset 0 0 0 1px var(--c-red-ring); }
.badge.badge-warning  { background: var(--c-amber-50) !important; color: var(--c-amber-800) !important; box-shadow: inset 0 0 0 1px var(--c-amber-ring); }
.badge.badge-info     { background: var(--c-info-bg) !important;  color: var(--c-info-text) !important;  box-shadow: inset 0 0 0 1px var(--c-info-ring); }
.badge.badge-primary  { background: var(--c-gray-100) !important; color: var(--c-gray-700) !important;  box-shadow: inset 0 0 0 1px var(--c-gray-200); }
.badge.badge-secondary,
.badge.badge-dark,
.badge.badge-light    { background: var(--c-gray-50) !important;  color: var(--c-gray-600) !important;  box-shadow: inset 0 0 0 1px var(--c-gray-200); }


/* ============================================================
   33. SEGUIMIENTO DE UNA FECHA (hilo de negociacion)
   ============================================================

   Linea de tiempo dentro del drawer: comentarios, cambios de estado y
   adjuntos en orden, del mas nuevo al mas viejo.
   ============================================================ */

.cms-hilo-item {
    padding: var(--space-3-5) var(--space-4);
    border-radius: var(--r-lg);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    background: #fff;
}

.cms-hilo-item + .cms-hilo-item { margin-top: var(--space-3); }

/* Los cambios de estado y las entradas del sistema son cronologia, no
   conversacion: se muestran mas discretos que un comentario. */
.cms-hilo-estado-item,
.cms-hilo-sistema {
    background: var(--c-gray-50);
    box-shadow: none;
}

.cms-hilo-meta {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--space-3);
    margin-bottom: var(--space-1-5);
}

.cms-hilo-meta strong {
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-hilo-meta span {
    font-size: var(--fs-xs);
    color: var(--c-gray-400);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.cms-hilo-mensaje {
    margin: 0;
    font-size: var(--fs-base);
    line-height: 1.375rem;
    color: var(--c-gray-700);
    overflow-wrap: anywhere;
}

.cms-hilo-estado {
    margin: 0;
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-600);
}

.cms-hilo-estado em {
    font-style: normal;
    color: var(--c-gray-500);
}

.cms-hilo-adjuntos {
    list-style: none;
    margin: var(--space-2-5) 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
}

.cms-hilo-adjuntos a {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-1-5) var(--space-2);
    border-radius: var(--r-md);
    background: var(--c-gray-50);
    font-size: var(--fs-sm);
    color: var(--c-gray-700);
    overflow-wrap: anywhere;
}

.cms-hilo-adjuntos a:hover {
    background: var(--c-gray-100);
    color: var(--c-gray-900);
}

.cms-hilo-adjuntos i { color: var(--c-gray-400); flex: 0 0 auto; }

.cms-hilo-adjuntos span {
    color: var(--c-gray-400);
    font-size: var(--fs-xs);
    white-space: nowrap;
}

/* --- Formulario del pie --- */

/* El pie del drawer es flex-end por defecto; aca el form ocupa todo el ancho */
.cms-seguimiento-form {
    display: block;
    padding: var(--space-3-5) var(--space-5) var(--space-4);
}

.cms-seguimiento-form textarea.form-control {
    min-height: 4.5rem;
    resize: vertical;
}

.cms-seguimiento-acciones {
    display: flex;
    align-items: center;
    gap: var(--space-2-5);
    margin-top: var(--space-2-5);
}

.cms-seguimiento-acciones .btn { margin-left: auto; }

/* El input de archivo real se oculta: el label es el boton */
.cms-seguimiento-adjuntar input[type="file"] {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}

.cms-seguimiento-adjuntar {
    margin: 0;
    cursor: pointer;
}

.cms-seguimiento-adjuntar span {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1-5);
    padding: var(--space-1-5) var(--space-2-5);
    border-radius: var(--r-md);
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
    background: #fff;
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-700);
    transition: background-color 0.12s ease;
}

.cms-seguimiento-adjuntar:hover span {
    background: var(--c-gray-50);
    color: var(--c-gray-900);
}

.cms-seguimiento-adjuntar input:focus-visible + span {
    outline: 2px solid var(--c-gray-900);
    outline-offset: 2px;
}

.cms-seguimiento-archivos {
    font-size: var(--fs-xs);
    color: var(--c-gray-500);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}


/* --- Adjuntos que son imagenes: se muestran, no se enumeran -------------
   Un nombre de archivo como "Captura de pantalla 2025-07-09 a la(s)
   10.40.06.png" no dice nada; la miniatura si. Los PDF y las planillas
   siguen en la lista de arriba, que para ellos es lo correcto. */

.cms-hilo-imagenes {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    margin: var(--space-2) 0 0;
    padding: 0;
    list-style: none;
}

.cms-hilo-miniatura {
    display: block;
    width: 5.5rem;
    height: 5.5rem;
    padding: 0;
    border: none;
    border-radius: var(--r-md);
    overflow: hidden;
    background: var(--c-gray-100);
    box-shadow: var(--ring-card);
    cursor: zoom-in;
    transition: box-shadow 0.15s ease, transform 0.15s ease;
}

.cms-hilo-miniatura img {
    display: block;
    width: 100%;
    height: 100%;
    /* cover y no contain: la grilla se lee pareja. El recorte no pierde
       nada, porque el visor muestra la imagen entera. */
    object-fit: cover;
}

.cms-hilo-miniatura:hover,
.cms-hilo-miniatura:focus-visible {
    box-shadow: var(--ring-card), var(--sh-md);
    transform: translateY(-1px);
}


/* --- Lo elegido, antes de publicar -------------------------------------- */

.cms-seguimiento-elegidos {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    margin: var(--space-2) 0 0;
    padding: 0;
    list-style: none;
}

.cms-elegido {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-1) var(--space-2);
    border-radius: var(--r-md);
    background: var(--c-gray-50);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    font-size: var(--fs-xs);
}

.cms-elegido img {
    width: 2rem;
    height: 2rem;
    border-radius: var(--r-sm);
    object-fit: cover;
    flex: 0 0 auto;
}

.cms-elegido > i {
    width: 1.25rem;
    height: 1.25rem;
    color: var(--c-gray-400);
    flex: 0 0 auto;
}

.cms-elegido-nombre {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--c-gray-700);
}

.cms-elegido-peso {
    flex: 0 0 auto;
    color: var(--c-gray-500);
    font-variant-numeric: tabular-nums;
}


/* --- Progreso de la subida ---------------------------------------------- */

.cms-seguimiento-progreso {
    margin-top: var(--space-2);
}

.cms-seguimiento-barra {
    height: 0.375rem;
    border-radius: var(--r-full);
    background: var(--c-gray-200);
    overflow: hidden;
}

.cms-seguimiento-barra > span {
    display: block;
    width: 0;
    height: 100%;
    border-radius: var(--r-full);
    background: var(--c-accent);
    transition: width 0.2s ease;
}

.cms-seguimiento-progreso-texto {
    margin: var(--space-1) 0 0;
    font-size: var(--fs-xs);
    color: var(--c-gray-500);
    font-variant-numeric: tabular-nums;
}

/* Mientras sube, el formulario entero queda quieto: apagar solo el boton
   deja escribir sobre un mensaje que ya salio. */
.cms-seguimiento-form form.esta-subiendo .cms-seguimiento-adjuntar {
    opacity: 0.5;
    pointer-events: none;
}


/* ============================================================
   33 bis. VISOR DE UN ADJUNTO
   ============================================================

   Va en 1100: por encima del drawer del seguimiento (1080) y del lightbox
   de vista previa (1090), porque se abre DESDE el drawer y tiene que
   taparlo.
   ============================================================ */

.cms-visor {
    position: fixed;
    inset: 0;
    z-index: 1100;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-4);
}

.cms-visor[hidden] { display: none; }

.cms-visor-fondo {
    position: absolute;
    inset: 0;
    /* Mas oscuro que el del drawer: la foto tiene que ser lo unico que se
       mire, y muchas capturas son de fondo claro. */
    background: rgba(28, 25, 23, 0.85);
}

.cms-visor-panel {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    /* Ancho del contenedor y no del contenido: con una imagen chica el panel
       se encogia a su tamaño y la cabecera cambiaba de lugar segun que
       archivo se abriera. */
    width: min(64rem, 100%);
    max-height: 100%;
}

/* GO posiciona TODOS los <header> en absolute (el mismo problema que ya tuvo
   el header del drawer). Sin esto la cabecera se sale del flujo, se monta
   sobre la imagen y ademas arrastra su fondo blanco. */
.cms-visor-head {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    background: none;
    padding: 0;
    margin: 0;          /* GO le mete margen lateral y desalinea con la imagen */
    color: #fff;
}

.cms-visor-title {
    margin: 0;
    min-width: 0;
    font-size: var(--fs-sm);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cms-visor-acciones {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    flex: 0 0 auto;
}

.cms-visor-descargar {
    color: #fff;
    font-size: var(--fs-sm);
    font-weight: var(--fw-medium);
    text-decoration: underline;
}

.cms-visor-descargar:hover { color: #fff; }

.cms-visor-cerrar {
    border: none;
    background: none;
    padding: 0;
    color: #fff;
    font-size: var(--fs-2xl);
    line-height: 1;
    cursor: pointer;
}

.cms-visor-cuerpo {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 0;
    /* Deja lugar a las flechas para que no queden sobre la imagen */
    padding: 0 3.5rem;
}

.cms-visor-cuerpo img {
    max-width: 100%;
    /* Descontando la cabecera y el padding del contenedor */
    max-height: calc(100vh - 8rem);
    border-radius: var(--r-md);
    background: #fff;
    object-fit: contain;
}

.cms-visor-nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 2.75rem;
    height: 2.75rem;
    border: none;
    border-radius: var(--r-full);
    background: rgba(28, 25, 23, 0.55);
    color: #fff;
    font-size: var(--fs-2xl);
    line-height: 1;
    cursor: pointer;
}

.cms-visor-nav:hover { background: rgba(28, 25, 23, 0.8); }
.cms-visor-nav[hidden] { display: none; }

.cms-visor-prev { left: 0; }
.cms-visor-next { right: 0; }

/* Con el visor abierto la pagina de atras no se mueve */
body.cms-visor-abierto { overflow: hidden; }

@media (max-width: 767.98px) {
    .cms-hilo-miniatura { width: 4.5rem; height: 4.5rem; }
    .cms-visor { padding: var(--space-2); }
    .cms-visor-cuerpo { padding: 0 2.5rem; }
    .cms-visor-cuerpo img { max-height: calc(100vh - 7rem); }
    .cms-visor-nav { width: 2.25rem; height: 2.25rem; }
}


/* ============================================================
   34. VISTA PREVIA DE CONTENIDO
   ============================================================ */

/* Drawer mas ancho: la tarjeta de la web necesita aire para verse real */
.cms-drawer:has(.cms-drawer-ancho),
.cms-drawer-panel.cms-drawer-ancho {
    --drawer-ancho: min(32rem, 100vw);
}

.cms-preview-cuerpo {
    padding: 0;
    background: var(--c-gray-100);
}

.cms-preview-cuerpo iframe {
    display: block;
    width: 100%;
    height: 100%;
    min-height: 30rem;
    border: 0;
    background: #fff;
}


/* ============================================================
   35. FEED DE ACTIVIDAD
   ============================================================

   Linea de tiempo del bloque "Feeds" de Tailwind UI: una guia vertical
   conecta los eventos, cada uno con su icono en un nodo circular, y el texto
   dice quien hizo que y hace cuanto. Se usa en el seguimiento de una fecha y
   en la actividad reciente del dashboard.
   ============================================================ */

.cms-feed {
    list-style: none;
    margin: 0;
    padding: 0;
}

.cms-feed-item {
    position: relative;
    display: flex;
    gap: var(--space-3);
    padding-bottom: var(--space-5);
}

/* La guia vertical: nace bajo el nodo y muere en el ultimo item */
.cms-feed-item::before {
    content: '';
    position: absolute;
    left: 0.9375rem;              /* centro del nodo de 1.875rem */
    top: 2rem;
    bottom: -0.25rem;
    width: 1px;
    background: var(--c-gray-200);
}

.cms-feed-item:last-child { padding-bottom: var(--space-1); }
.cms-feed-item:last-child::before { display: none; }

/* Nodo circular con el icono del tipo de accion */
.cms-feed-icono {
    position: relative;
    z-index: 1;
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.875rem;
    height: 1.875rem;
    border-radius: var(--r-full);
    background: var(--c-gray-100);
    box-shadow: 0 0 0 3px #fff;   /* separa el nodo de la guia */
    color: var(--c-gray-500);
    font-size: var(--fs-base);
}

/* El cambio de estado es el hito importante: nodo dorado */
.cms-feed-icono-estado {
    background: var(--c-accent-soft);
    color: var(--c-accent);
}

.cms-feed-icono-sistema {
    background: var(--c-gray-50);
    color: var(--c-gray-400);
}

.cms-feed-cuerpo {
    flex: 1 1 auto;
    min-width: 0;
    padding-top: var(--space-1);
}

/* "Jorge cambió el estado a Confirmado · hace 2 h" */
.cms-feed-accion {
    margin: 0;
    font-size: var(--fs-sm);
    line-height: 1.25rem;
    color: var(--c-gray-500);
    overflow-wrap: anywhere;
}

.cms-feed-accion strong {
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-feed-accion .badge-estado { margin: 0 var(--space-0-5); }

.cms-feed-cuando {
    font-size: var(--fs-xs);
    color: var(--c-gray-400);
    white-space: nowrap;
}

/* El comentario en si, como burbuja bajo la accion */
.cms-feed-mensaje {
    margin: var(--space-1-5) 0 0;
    padding: var(--space-2-5) var(--space-3);
    border-radius: var(--r-md);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    background: #fff;
    font-size: var(--fs-base);
    line-height: 1.375rem;
    color: var(--c-gray-700);
    overflow-wrap: anywhere;
}

.cms-feed .cms-hilo-adjuntos { margin-top: var(--space-2); }


/* ============================================================
   36. CABECERA DE PAGINA: ACCIONES A LA DERECHA
   ============================================================

   Las paginas de formulario maquetan la cabecera con un col-md-6 para el
   titulo y un col-auto para las acciones, asi que el boton quedaba pegado a
   la mitad de la pantalla en vez de al margen derecho. Se corrige por CSS
   (margin-left auto) para no tocar el markup de cada pagina.
   ============================================================ */

.hero .row > .page-header-actions {
    margin-left: auto;
    align-self: center;
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    justify-content: flex-end;
}

@media (max-width: 767.98px) {
    .hero .row > .page-header-actions {
        margin-left: 0;
        width: 100%;
        margin-top: var(--space-3);
        justify-content: flex-start;
    }
}


/* ============================================================
   37. SELECT PROPIO (bloque "Select menus" de Tailwind UI)
   ============================================================

   El <select> nativo dibuja su lista con el widget del sistema operativo:
   en macOS aparece con el color de acento del usuario (ese azul/violeta que
   no es nuestro) y con una tipografia que no controlamos. Es el unico
   control que rompia la coherencia visual.

   La solucion NO reemplaza el <select>: lo deja en el formulario, oculto
   pero funcional, y le dibuja al lado un boton + listbox accesibles. Asi
   el POST, la validacion y todo el JS que lee `.value` siguen igual, y si
   el JS no corre el formulario sigue siendo usable con el control nativo.
   ============================================================ */

.cms-select {
    position: relative;
    width: 100%;
}

/* El nativo sigue ahi (accesible al form), pero no se ve.
   Lleva !important porque mas arriba (seccion de formularios) hay una regla
   que RESTITUYE los select que el template GO escondia; sin esto conviven el
   nativo y el boton, uno debajo del otro. */
.cms-select > select,
.cms-select > select.form-control,
.cms-select > select.custom-select {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    min-height: 0 !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0 0 0 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
    border: 0 !important;
    opacity: 0 !important;
    pointer-events: none !important;
}

.cms-select-boton {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2);
    width: 100%;
    min-height: 2.625rem;
    padding: var(--space-2) var(--space-3);
    border: 0;
    border-radius: var(--r-md);
    background: #fff;
    box-shadow: inset 0 0 0 1px var(--c-gray-300);
    font-family: inherit;
    font-size: var(--fs-base);
    line-height: 1.375rem;
    color: var(--c-gray-900);
    text-align: left;
    cursor: pointer;
    transition: box-shadow .15s ease;
}

.cms-select-boton:hover { box-shadow: inset 0 0 0 1px var(--c-gray-400); }

.cms-select-boton:focus-visible,
.cms-select.is-open .cms-select-boton {
    outline: none;
    box-shadow: inset 0 0 0 2px var(--c-accent);
}

/* Cuando no hay nada elegido, el texto va apagado como un placeholder */
.cms-select-boton.is-vacio .cms-select-valor { color: var(--c-gray-500); }

.cms-select-valor {
    flex: 1 1 auto;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Chevron doble (arriba/abajo), como el del bloque de Tailwind UI */
.cms-select-flecha {
    flex: 0 0 auto;
    width: 1.25rem;
    height: 1.25rem;
    color: var(--c-gray-400);
    background-color: currentColor;
    -webkit-mask-image: var(--icono-selector);
            mask-image: var(--icono-selector);
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: 1.25rem 1.25rem;
            mask-size: 1.25rem 1.25rem;
}

.cms-select-lista {
    position: absolute;
    z-index: 40;
    top: calc(100% + 0.25rem);
    left: 0;
    right: 0;
    max-height: 15rem;
    margin: 0;
    padding: var(--space-1);
    overflow-y: auto;
    list-style: none;
    background: #fff;
    border-radius: var(--r-md);
    box-shadow: var(--sh-lg), var(--ring-card);
}

.cms-select-lista[hidden] { display: none; }

/* Se abre hacia arriba si abajo no hay lugar */
.cms-select.abre-arriba .cms-select-lista {
    top: auto;
    bottom: calc(100% + 0.25rem);
}

.cms-select-opcion {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2);
    padding: var(--space-2) var(--space-2-5);
    border-radius: var(--r-sm);
    font-size: var(--fs-base);
    line-height: 1.25rem;
    color: var(--c-gray-900);
    cursor: pointer;
    user-select: none;
}

/* Resaltado con el dorado de la marca: el acento del sistema no entra aca */
.cms-select-opcion.is-activa {
    background: var(--c-accent);
    color: #fff;
}

.cms-select-opcion[aria-selected="true"] { font-weight: 600; }

.cms-select-opcion[aria-disabled="true"] {
    color: var(--c-gray-400);
    cursor: not-allowed;
}

/* El tilde de la opcion elegida */
.cms-select-tilde {
    flex: 0 0 auto;
    width: 1.125rem;
    height: 1.125rem;
    background-color: currentColor;
    -webkit-mask-image: var(--icono-tilde);
            mask-image: var(--icono-tilde);
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: 1.125rem 1.125rem;
            mask-size: 1.125rem 1.125rem;
    color: var(--c-accent);
    opacity: 0;
}

.cms-select-opcion[aria-selected="true"] .cms-select-tilde { opacity: 1; }
.cms-select-opcion.is-activa .cms-select-tilde { color: #fff; }

/* Los controles que SIGUEN siendo nativos (fecha, hora, checkbox, radio)
   pintan su UI con el acento del sistema; se les pasa el dorado. */
:root {
    --icono-selector: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9'/%3E%3C/svg%3E");
    --icono-tilde: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='m4.5 12.75 6 6 9-13.5'/%3E%3C/svg%3E");
}

html {
    accent-color: var(--brand-gold-dark);
}


/* ============================================================
   38. ESPACIADO ENTRE LA CABECERA Y EL CONTENIDO
   ============================================================

   El template GO da 100px de padding superior a cada <section>, pensado para
   landing pages. En una pantalla de formulario eso abre un hueco enorme entre
   el titulo y el primer campo. Se baja a una medida de panel.

   Los listados no se ven afectados: ya traen .pt-0, que en Bootstrap es
   !important y gana.
   ============================================================ */

.hero-with-header + section {
    padding-top: var(--space-10);
}

@media (max-width: 767.98px) {
    .hero-with-header + section {
        padding-top: var(--space-6);
    }
}


/* ============================================================
   39. TABLAS DE LISTADO — bloque "Tables" de Tailwind UI
   ============================================================

   Dos problemas que arrastraban los listados:

   1. La tabla flotaba sobre el fondo, sin contenedor, asi que no se leia
      como una tabla: no habia donde empezaba ni donde terminaba.
   2. El estilo colgaba de `table.dataTable`, una clase que agrega DataTables
      al inicializar. Si el CDN no carga —o la tabla no es un DataTable— la
      tabla quedaba completamente desnuda. Ahora el aspecto sale de la tabla
      en si, y DataTables solo se suma.

   Las celdas admiten dos lineas (dato principal + apoyo), que es como
   Tailwind UI resuelve las tablas con mucha informacion por fila.
   ============================================================ */

/* La tabla vive dentro de una tarjeta con borde y esquinas redondeadas */
.table-responsive {
    background: #fff;
    border-radius: var(--r-lg);
    box-shadow: var(--ring-card), var(--sh-xs);
    /* auto y no hidden: con hidden la tabla ancha quedaba recortada y las
       ultimas columnas eran inalcanzables, sin barra para llegar a ellas. */
    overflow-x: auto;
    overflow-y: visible;
}


table#dataTable,
table.dataTable,
.table-responsive > table {
    width: 100%;
    margin: 0;
    border-collapse: collapse;
    font-size: var(--fs-base);
    color: var(--c-gray-700);
}

/* Cabecera: mayusculas chicas, gris medio, linea de base marcada */
table#dataTable > thead > tr > th,
table.dataTable > thead > tr > th,
.table-responsive > table > thead > tr > th {
    padding: var(--space-3) var(--space-4);
    border: 0;
    border-bottom: 1px solid var(--c-gray-200);
    background: var(--c-gray-50);
    font-size: var(--fs-2xs);
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--c-gray-500);
    white-space: nowrap;
    vertical-align: middle;
}

table#dataTable > tbody > tr > td,
table.dataTable > tbody > tr > td,
.table-responsive > table > tbody > tr > td {
    padding: var(--space-3) var(--space-4);
    border: 0;
    border-top: 1px solid var(--c-gray-100);
    vertical-align: middle;
    line-height: 1.375rem;
}

table#dataTable > tbody > tr:first-child > td,
table.dataTable > tbody > tr:first-child > td,
.table-responsive > table > tbody > tr:first-child > td {
    border-top: 0;
}

table#dataTable > tbody > tr:hover > td,
table.dataTable > tbody > tr:hover > td,
.table-responsive > table > tbody > tr:hover > td {
    background: var(--c-gray-50);
}

/* ---- Celdas de dos lineas ---------------------------------- */

/* El dato principal de la fila: es lo que se lee al barrer la tabla */
.celda-principal {
    display: block;
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--c-gray-900);
}

/* La linea de apoyo: contexto, no protagonismo */
.celda-apoyo {
    display: block;
    margin-top: var(--space-0-5);
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
}

/* Rutas, slugs y codigos: monoespaciado para que se lean como tales */
.celda-ruta {
    font-family: var(--font-mono);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-900);
    white-space: nowrap;
}

/* Las URLs largas se cortan por CSS, con el original entero en el title:
   recortarlas en PHP tapaba justo la parte que distingue una de otra. */
.celda-url {
    display: block;
    max-width: 22rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--c-gray-500);
    font-size: var(--fs-sm);
    /* Sin subrayado: al ser display:block la linea cruzaba toda la celda y
       parecia el borde de un campo de formulario. Aparece al pasar por encima. */
    text-decoration: none;
}

/* La v2 subraya los enlaces de tabla con un border-bottom, pensado para
   enlaces cortos en linea. Este ocupa la celda entera, asi que la linea la
   cruzaba de lado a lado y parecia el borde de un campo. Hace falta ganarle
   en especificidad a `table.dataTable tbody td a`. */
table#dataTable tbody td a.celda-url,
table.dataTable tbody td a.celda-url,
.table-responsive table tbody td a.celda-url {
    border-bottom: 0;
    text-decoration: none;
}

table#dataTable tbody td a.celda-url:hover,
table.dataTable tbody td a.celda-url:hover,
.table-responsive table tbody td a.celda-url:hover {
    color: var(--c-accent);
    text-decoration: underline;
}

.celda-url:hover strong { color: var(--c-accent); }

.celda-url strong {
    font-weight: 500;
    color: var(--c-gray-700);
}

/* Numeros comparables entre filas: cifras de ancho fijo, a la derecha */
.celda-numero {
    font-variant-numeric: tabular-nums;
    text-align: right;
    color: var(--c-gray-700);
}

/* Etiqueta neutra para valores tecnicos cortos (301, 302, tipos) */
.etiqueta-tecnica {
    display: inline-block;
    padding: var(--space-0-5) var(--space-2);
    border-radius: var(--r-sm);
    background: var(--c-gray-100);
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    font-weight: 500;
    color: var(--c-gray-600);
}

/* Las acciones no compiten con el contenido: aparecen al pasar por la fila,
   y quedan siempre visibles en tactil, donde no hay hover. */
.celda-acciones {
    white-space: nowrap;
    text-align: right;
}

@media (hover: hover) {
    .celda-acciones .btn-action {
        opacity: 0;
        transition: opacity .12s ease;
    }

    tr:hover .celda-acciones .btn-action,
    .celda-acciones .btn-action:focus-visible {
        opacity: 1;
    }
}

/* Fila apagada cuando el registro esta inactivo */
tr.fila-inactiva .celda-principal,
tr.fila-inactiva .celda-ruta { color: var(--c-gray-500); }

/* En pantallas chicas la tabla scrollea dentro de su tarjeta */
@media (max-width: 767.98px) {
    .celda-url { max-width: 12rem; }

    table#dataTable > thead > tr > th,
    table.dataTable > thead > tr > th,
    table#dataTable > tbody > tr > td,
    table.dataTable > tbody > tr > td {
        padding: var(--space-2-5) var(--space-3);
    }
}


/* ============================================================
   40. ESTADO VACIO — bloque "Empty states" de Tailwind UI
   ============================================================

   Una tabla con cero filas no explica nada: se ve igual que una tabla rota.
   El estado vacio dice que no hay nada, por que sirve la seccion, y ofrece
   la accion para empezar.
   ============================================================ */

.listado-vacio {
    padding: var(--space-12) var(--space-6);
    border-radius: var(--r-lg);
    background: #fff;
    box-shadow: var(--ring-card), var(--sh-xs);
    text-align: center;
}

.listado-vacio > i {
    display: inline-block;
    width: 2.5rem;
    height: 2.5rem;
    margin-bottom: var(--space-3);
    color: var(--c-gray-400);
}

.listado-vacio-titulo {
    margin: 0 0 var(--space-1);
    font-size: var(--fs-md);
    font-weight: 600;
    color: var(--c-gray-900);
}

.listado-vacio-texto {
    max-width: 26rem;
    margin: 0 auto var(--space-5);
    font-size: var(--fs-base);
    line-height: 1.375rem;
    color: var(--c-gray-500);
}

/* Con el listado vacio quedan DOS primarios dorados en pantalla apuntando al
   mismo lado: el "+ Nuevo X" de la cabecera y el "Crear el primero" del
   estado vacio. Dos llamadas del mismo peso obligan a elegir entre botones
   identicos.
   Gana el del estado vacio —es el proposito entero de esa pantalla— y el de
   la cabecera baja a secundario, con la misma forma que el resto de los
   botones blancos. Se resuelve con :has() para no tocar el markup: la
   cabecera y el estado vacio son secciones distintas, asi que el vinculo hay
   que hacerlo desde el body. */
body:has(.listado-vacio) .page-header-actions .btn-primary {
    background-color: #fff !important;
    border-color: transparent !important;
    color: var(--c-gray-900) !important;
    box-shadow: var(--sh-xs), inset 0 0 0 1px var(--c-gray-300);
}

body:has(.listado-vacio) .page-header-actions .btn-primary:hover {
    background-color: var(--c-gray-50) !important;
    color: var(--c-gray-900) !important;
}


/* ============================================================
   41. EL AZUL MARINO QUE SOBREVIVIA EN LA BARRA SUPERIOR
   ============================================================

   El CMS v1 pintaba el header de azul marino (#1a1a2e). La v2 lo pasa al
   marron de la marca, pero solo le ganaba en escritorio: por debajo de
   1200px, cms.css tiene `header.header-dark` DENTRO de un media query, un
   selector mas especifico (elemento + clase) y tambien con !important. Asi
   que la barra superior colapsada seguia azul.

   Se repite el selector con la misma forma para poder ganarle.
   ============================================================ */

@media (max-width: 1199.98px) {
    header.header-dark,
    header.header-sticky.header-dark,
    header.header-dark[class*="-not-top"][class*="-pinned"] {
        background: var(--brand-brown) !important;
    }

    /* El panel desplegable del menu comparte el fondo, no el azul */
    header.header-dark .navbar-collapse,
    header.header-dark .navbar-collapse.show {
        background: var(--brand-brown) !important;
    }
}


/* ============================================================
   42. ICONO DEL SERVICIO DE DESTINO (links cortos)
   ============================================================

   Un link corto casi siempre apunta a una sala de reunion. Reconocer el
   servicio de un vistazo evita tener que leer la URL entera.

   Los iconos son propios, monocromos y heredan el gris de la celda: usar el
   azul de Zoom o los colores de Meet meteria justo la paleta ajena que el
   rediseño saco de encima. El nombre del servicio va en el `title`.
   ============================================================ */

.celda-destino {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    min-width: 0;
}

.icono-servicio {
    flex: 0 0 auto;
    width: 1.125rem;
    height: 1.125rem;
    color: var(--c-gray-400);
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}

tr:hover .icono-servicio { color: var(--c-accent); }

/* Camara de video: Zoom, Meet y cualquier sala de reunion */
.icono-servicio-videollamada {
    -webkit-mask-image: var(--icono-videocamara);
            mask-image: var(--icono-videocamara);
}

/* Play: YouTube y video en general */
.icono-servicio-video {
    -webkit-mask-image: var(--icono-play);
            mask-image: var(--icono-play);
}

/* Eslabon: destino generico */
.icono-servicio-enlace {
    -webkit-mask-image: var(--icono-eslabon);
            mask-image: var(--icono-eslabon);
}

:root {
    --icono-videocamara: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z'/%3E%3C/svg%3E");
    --icono-play: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z'/%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.91 11.672a.375.375 0 0 1 0 .656l-5.603 3.113a.375.375 0 0 1-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112Z'/%3E%3C/svg%3E");
    --icono-eslabon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='black'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244'/%3E%3C/svg%3E");
}


/* ============================================================
   43. LOS CIANES DEL CMS v1
   ============================================================

   cms.css usa el cian de Bootstrap (#17a2b8) y su azul (#007bff) para el
   boton de duplicar, las IPs de los logs, el badge de seguridad y el icono
   "info" del dashboard. Sobre la paleta calida saltan como manchas frias.
   Se repintan con los tonos de la marca.
   ============================================================ */

.btn-action.btn-action-duplicate:hover {
    background: var(--c-accent);
    color: #fff;
}

.log-ip {
    color: var(--brand-gold);
}

.badge-log-security {
    background-color: var(--c-info-bg);
    color: var(--c-info-text);
}

.stat-card .stat-icon.bg-info-light {
    background: var(--c-info-bg);
    color: var(--c-info-text);
}


/* ============================================================
   44. INPUT GROUP — "Input with inline leading add-on" de Tailwind UI
   ============================================================

   La v2 pone `display: block; width: 100%` en los .form-control para que
   todos los campos se vean igual. Eso rompe el input-group de Bootstrap, que
   necesita que el input sea un item flexible al lado del prefijo: el
   "bertarojas.com/" terminaba en su propia linea, encima del campo.

   Aca el prefijo y el campo forman un solo control: un unico marco, con el
   prefijo en gris adentro.
   ============================================================ */

.input-group {
    display: flex;
    align-items: stretch;
    width: 100%;
    border-radius: var(--r-md);
    background: #fff;
    box-shadow: inset 0 0 0 1px var(--c-gray-300);
    transition: box-shadow .15s ease;
}

/* El foco ilumina el grupo entero, no solo el input de adentro */
.input-group:focus-within {
    box-shadow: inset 0 0 0 2px var(--c-accent);
}

.input-group > .input-group-prepend,
.input-group > .input-group-append {
    display: flex;
    align-items: center;
    flex: 0 0 auto;
}

.input-group .input-group-text {
    display: flex;
    align-items: center;
    height: 100%;
    padding: 0 var(--space-1) 0 var(--space-3);
    border: 0;
    background: transparent;
    font-size: var(--fs-base);
    color: var(--c-gray-500);
    white-space: nowrap;
}

/* El campo se funde en el grupo: el marco ya lo pone el contenedor */
.input-group > .form-control,
.input-group > input.form-control {
    flex: 1 1 auto;
    width: 1%;
    min-width: 0;
    margin: 0;
    border: 0;
    background: transparent;
    box-shadow: none;
}

.input-group > .form-control:focus {
    box-shadow: none;
    outline: none;
}

/* El error pinta el marco del grupo, no un borde suelto adentro */
.input-group:has(> .form-control.is-invalid) {
    box-shadow: inset 0 0 0 1px var(--c-red-500);
}

.input-group > .form-control.is-invalid {
    box-shadow: none;
    background-image: none;
}

/* invalid-feedback es display:none salvo que siga a un .is-invalid; dentro
   del grupo queda fuera de esa relacion y no se mostraria nunca. */
.input-group > .invalid-feedback {
    display: block;
    flex: 1 0 100%;
    order: 99;
    padding: 0 var(--space-3) var(--space-2);
}


/* ============================================================
   45. CAMPO PARA COPIAR (el link que se comparte)
   ============================================================

   En un link corto, la direccion final es el producto: es lo que se pega en
   un mail o se dicta por telefono. Estaba como un <code> suelto dentro de un
   alert gris, sin forma de copiarlo mas que seleccionandolo a mano.
   ============================================================ */

.campo-copiar {
    margin-top: var(--space-2);
    padding: var(--space-3-5) var(--space-4);
    border-radius: var(--r-lg);
    background: var(--c-accent-soft);
    box-shadow: inset 0 0 0 1px var(--c-info-ring);
}

.campo-copiar-titulo {
    display: block;
    margin-bottom: var(--space-1-5);
    font-size: var(--fs-xs);
    font-weight: 600;
    letter-spacing: .03em;
    text-transform: uppercase;
    color: var(--c-info-text);
}

.campo-copiar-fila {
    display: flex;
    align-items: center;
    gap: var(--space-2);
}

.campo-copiar-valor {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-family: var(--font-mono);
    font-size: var(--fs-base);
    color: var(--c-gray-900);
}

.campo-copiar .btn-copiar {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: var(--space-1-5);
    padding: var(--space-1-5) var(--space-3);
    border: 0;
    border-radius: var(--r-md);
    background: #fff;
    box-shadow: inset 0 0 0 1px var(--c-gray-300), var(--sh-xs);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--c-gray-700);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}

.campo-copiar .btn-copiar:hover {
    background: var(--c-accent);
    color: #fff;
    box-shadow: inset 0 0 0 1px var(--c-accent);
}

.campo-copiar .btn-copiar i {
    width: 1rem;
    height: 1rem;
}

/* Confirmacion en el lugar: el aviso flotante puede pasar desapercibido */
.campo-copiar .btn-copiar.recien-copiado {
    background: var(--c-green-600);
    color: #fff;
    box-shadow: inset 0 0 0 1px var(--c-green-600);
}


/* ============================================================
   46. MENU EN MOBILE Y TABLET: LOS ITEMS, DESPLEGADOS
   ============================================================

   Al abrir el hamburguesa solo aparecian los cuatro encabezados de grupo
   —Contenido, Multimedia, Web, Sistema—: los items reales quedaban detras de
   un segundo toque sobre un dropdown de Bootstrap, que en tactil no responde
   de forma confiable. Resultado practico: el menu no servia en el telefono ni
   en la tablet.

   Se replica lo que ya hace el sidebar de escritorio: todo desplegado, los
   encabezados como titulo de seccion y los items como lista debajo. Sin
   dropdowns, sin segundo toque, sin depender del JS del template.
   ============================================================ */

@media (max-width: 1199.98px) {

    header.header-dark .navbar-collapse {
        max-height: calc(100vh - 5rem);
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        padding: var(--space-2) 0 var(--space-4);
    }

    /* Los submenus dejan de ser desplegables: quedan siempre a la vista */
    header.header-dark .navbar-nav .nav-item.dropdown > .dropdown-menu {
        display: block !important;
        position: static !important;
        float: none;
        width: 100%;
        min-width: 0;
        margin: 0 0 var(--space-2);
        padding: 0;
        border: 0;
        border-radius: 0;
        background: transparent;
        box-shadow: none;
        transform: none !important;
    }

    /* El encabezado del grupo pasa a ser un rotulo, no un boton */
    header.header-dark .navbar-nav.mr-auto .nav-item.dropdown > .nav-link {
        margin: var(--space-3) 0 var(--space-1);
        padding: 0 var(--space-5) !important;
        font-size: var(--fs-2xs) !important;
        font-weight: 600 !important;
        letter-spacing: .08em !important;
        text-transform: uppercase !important;
        color: var(--c-gray-400) !important;
        pointer-events: none;   /* ya no abre nada: es un titulo */
        /* GO resalta el grupo de la seccion activa; como rotulo, ese fondo
           lo hacia parecer un item seleccionado */
        background: transparent !important;
    }

    /* La flechita del dropdown no tiene sentido si nunca se pliega */
    header.header-dark .navbar-nav .nav-item.dropdown > .nav-link::after {
        display: none !important;
    }

    /* El Dashboard no vive dentro de un .dropdown-menu sino suelto en la
       lista (.nav-item-suelto), asi que los selectores de item de grupo no lo
       alcanzaban: abajo de 1200px se quedaba con el .text-dark de Bootstrap,
       marron oscuro sobre el marron del menu, o sea invisible. Sus reglas de
       color solo existian dentro del @media de escritorio. */
    header.header-dark .navbar-nav .dropdown-menu .dropdown-item,
    header.header-dark .navbar-nav .dropdown-menu .dropdown-item.text-dark,
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item,
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item.text-dark {
        display: flex;
        align-items: center;
        gap: var(--space-3);
        /* Alto comodo para el dedo: 44px es el minimo que recomienda Apple */
        min-height: 2.75rem;
        padding: var(--space-2) var(--space-5) !important;
        border-radius: 0;
        color: rgba(255, 255, 255, .78) !important;
        font-size: var(--fs-md);
        font-weight: 500 !important;
        white-space: normal;
    }

    header.header-dark .navbar-nav .dropdown-menu .dropdown-item:hover,
    header.header-dark .navbar-nav .dropdown-menu .dropdown-item:active,
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item:hover,
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item:active {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    header.header-dark .navbar-nav .dropdown-menu .dropdown-item.active,
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item.active {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    header.header-dark .navbar-nav .dropdown-menu .dropdown-item i[class^="icon-"],
    header.header-dark .navbar-nav .nav-item-suelto .dropdown-item i[class^="icon-"] {
        flex: 0 0 auto;
        width: 1.25rem;
        height: 1.25rem;
        opacity: .75;
    }

    /* El texto de apoyo de cada item satura la lista en pantalla chica */
    header.header-dark .navbar-nav .dropdown-menu .dropdown-item p {
        display: none;
    }
}


/* ============================================================
   47. EL ICONO DEL MENU, ANIMADO POR EL ESTADO DEL COLLAPSE
   ============================================================

   El template animaba el icono a "X" agregando .clicked desde su handler de
   overlay, que esta desactivado (ver assets/js/app.js). La animacion ahora
   cuelga de [aria-expanded], el atributo que Bootstrap mantiene solo al abrir
   y cerrar el collapse: asi el icono refleja el estado REAL del menu y no
   depende de ningun JS nuestro.
   ============================================================ */

/* Ojo con el !important: cms.css (el v1) pinta las TRES barras de blanco con
   `background: #fff !important` para que se vean sobre el header oscuro, y le
   gana a un `background-color: transparent` a secas. Resultado: al abrir, la
   barra del medio seguia visible y las otras dos ya estaban rotadas 45 y -45
   grados, o sea un asterisco en vez de una X. */
.navbar-toggler[aria-expanded="true"] .burger span,
header.header-dark .navbar-toggler[aria-expanded="true"] .burger span {
    background: transparent !important;
}

.navbar-toggler[aria-expanded="true"] .burger span::before {
    transform: translateY(6px) rotate(45deg);
}

.navbar-toggler[aria-expanded="true"] .burger span::after {
    transform: translateY(-6px) rotate(-45deg);
}


/* ============================================================
   48. SIN ZOOM EN EL PANEL
   ============================================================

   El zoom llega por tres caminos distintos y el meta viewport solo tapa uno.
   Los tres se atienden por separado:

   1. Pellizco  -> `user-scalable=no, maximum-scale=1` en el viewport.
      OJO: iOS Safari IGNORA eso a proposito desde iOS 10, por accesibilidad.
      En iPhone/iPad el pellizco va a seguir funcionando y no hay forma
      soportada de impedirlo. Sirve en Android y en Chrome de escritorio.

   2. Doble toque -> `touch-action: manipulation`. Este SI lo respeta iOS, y
      es el que mas molesta: el zoom accidental al tocar dos veces seguidas
      un boton o una celda.

   3. Foco en un campo -> iOS agranda la pagina automaticamente cuando el
      campo tiene una tipografia menor a 16px, y despues no vuelve sola.
      Es el zoom que aparece "sin que uno lo pida" al tocar un input. Se
      corrige dandole 16px a los controles en pantallas tactiles, no
      desactivando nada.
   ============================================================ */

html {
    -webkit-text-size-adjust: 100%;
       -moz-text-size-adjust: 100%;
            text-size-adjust: 100%;
}

/* Mata el zoom por doble toque sin tocar el desplazamiento ni el pellizco */
body {
    touch-action: manipulation;
}

@media (max-width: 1199.98px) {
    /* 16px exactos: por debajo de eso iOS agranda la pagina al enfocar */
    /* Los selectores llevan .form-control porque las reglas de formulario de
       mas arriba usan esa forma (input[type=x].form-control) y con el
       selector suelto ganaban ellas, dejando los campos en 14px. */
    input[type="text"], input[type="text"].form-control,
    input[type="email"], input[type="email"].form-control,
    input[type="password"], input[type="password"].form-control,
    input[type="number"], input[type="number"].form-control,
    input[type="search"], input[type="search"].form-control,
    input[type="tel"], input[type="tel"].form-control,
    input[type="url"], input[type="url"].form-control,
    input[type="date"], input[type="date"].form-control,
    input[type="time"], input[type="time"].form-control,
    input[type="datetime-local"], input[type="datetime-local"].form-control,
    select, select.form-control, .custom-select,
    textarea, textarea.form-control,
    .form-control,
    .cms-select-boton {
        font-size: 16px;
    }
}


/* ============================================================
   49. SELECTOR DE IDIOMA DE LA VISTA PREVIA
   ============================================================

   La biografia tiene version en español y en ingles, y la vista previa sirve
   justamente para revisar las dos. Dos botones en la cabecera del drawer,
   al estilo del bloque "Button groups" de Tailwind UI.
   ============================================================ */

.cms-preview-idiomas {
    display: inline-flex;
    flex: 0 0 auto;
    border-radius: var(--r-md);
    box-shadow: inset 0 0 0 1px var(--c-gray-300);
    overflow: hidden;
}

.cms-preview-idioma {
    padding: var(--space-1-5) var(--space-2-5);
    border: 0;
    background: #fff;
    font-family: inherit;
    font-size: var(--fs-xs);
    font-weight: 500;
    color: var(--c-gray-600);
    cursor: pointer;
}

.cms-preview-idioma + .cms-preview-idioma {
    box-shadow: inset 1px 0 0 var(--c-gray-300);
}

.cms-preview-idioma:hover { background: var(--c-gray-50); }

.cms-preview-idioma.is-activo {
    background: var(--c-accent);
    color: #fff;
}


/* ============================================================
   50. TABLAS DE LISTADO: LEGIBILIDAD, PRIORIDAD Y ACCIONES FIJAS
   ============================================================

   Tres problemas concretos de los listados grandes (agenda tiene 14
   columnas, criticas 13):

   1. Todo el contenido va envuelto en <small>, que encima del tamaño ya
      reducido de la celda lo dejaba en 11px.
   2. En pantallas chicas no entra nada y hay que arrastrar la tabla de lado.
   3. La columna de acciones queda al final del scroll horizontal: para
      editar una fila habia que llegar hasta el fondo.
   ============================================================ */

/* El <small> del markup no puede achicar mas la celda: el tamaño ya lo
   define la tabla. Se conserva para los rotulos de la cabecera. */
table#dataTable > tbody > tr > td small,
table.dataTable > tbody > tr > td small,
.table-responsive table > tbody > tr > td small {
    font-size: inherit;
}

/* ---- Prioridad de columnas ---------------------------------
   La clase va SOLO en el <th>; cms-tablas.js la replica en las celdas de
   esa columna. Asi cada listado declara su prioridad en un unico lugar,
   en vez de repetir la clase en cada fila. */

/* Los cortes estan elegidos para que el conjunto visible ENTRE de verdad en
   el ancho disponible. Con la media en 1100px la agenda seguia desbordando
   por unos 80px, y la columna fija de acciones terminaba tapando Estado. */

@media (max-width: 1599.98px) {
    .col-prio-baja { display: none !important; }
}

@media (max-width: 1279.98px) {
    .col-prio-media { display: none !important; }
}

@media (max-width: 899.98px) {
    .col-prio-alta { display: none !important; }
}

/* ---- Acciones siempre a la vista ---------------------------
   Se fijan al borde derecho: con scroll horizontal la columna acompaña, en
   vez de quedar al final del recorrido. */

.table-responsive {
    position: relative;
}

/* SOLO cuando la tabla desborda. Con `right: 0` y sin desborde, el navegador
   igual pega la celda al borde del contenedor, y como ahi ya no hay nada que
   scrollear termina montada encima de la columna anterior: tapaba Estado.
   La clase la pone cms-tablas.js midiendo el ancho real. */
.table-responsive.tiene-scroll table > thead > tr > th:last-child,
.table-responsive.tiene-scroll table > tbody > tr > td:last-child {
    position: sticky;
    right: 0;
    z-index: 2;
    background: #fff;
    /* Linea sutil que separa la columna fija del contenido que pasa debajo */
    box-shadow: -1px 0 0 var(--c-gray-200);
}

.table-responsive.tiene-scroll table > thead > tr > th:last-child {
    background: var(--c-gray-50);
    z-index: 3;
}

/* El hover de la fila tambien pinta la celda fija, o queda un hueco blanco */
.table-responsive.tiene-scroll table > tbody > tr:hover > td:last-child {
    background: var(--c-gray-50);
}

/* En la columna fija las acciones no se ocultan: son su unico contenido */
@media (hover: hover) {
    td:last-child .btn-action { opacity: 1; }
}

/* ---- Densidad, como las tarjetas del dashboard -------------- */

/* Nada de `overflow-wrap: anywhere` aca: partia las palabras a la mitad
   ("Corrale / s, NM", "EEU / U"). Los datos cortos —fechas, pais, hora,
   estado— no se parten nunca; el texto largo se recorta con .celda-texto. */
table#dataTable > tbody > tr > td,
table.dataTable > tbody > tr > td,
.table-responsive table > tbody > tr > td {
    overflow-wrap: normal;
    word-break: normal;
}

/* Columnas de dato corto: una sola linea siempre */
.col-dato-corto,
td.col-dato-corto {
    white-space: nowrap;
}

/* Columnas de texto largo: una linea recortada, para que la fila no crezca
   a tres renglones y la tabla siga siendo un listado y no un documento.
   El valor completo queda en el title de la celda. */
td.col-texto-largo {
    max-width: 20rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

@media (max-width: 1599.98px) {
    td.col-texto-largo { max-width: 14rem; }
}

/* Las columnas de texto largo no pueden empujar la tabla a lo ancho */
.celda-texto {
    display: block;
    max-width: 18rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

@media (max-width: 1599.98px) {
    .celda-texto { max-width: 12rem; }
}


/* ============================================================
   51. REMATE DE LAS TABLAS: BARRA DE SCROLL Y ETIQUETAS DE TIPO
   ============================================================

   La barra de scroll horizontal de la tabla se dibujaba con el estilo del
   sistema —en macOS, una franja oscura pegada al pie— y cortaba la tarjeta
   con una linea negra. Se pasa a una barra fina y gris, del ancho justo para
   agarrarla, que aparece sobre el fondo de la propia tabla.
   ============================================================ */

.table-responsive {
    /* Firefox */
    scrollbar-width: thin;
    scrollbar-color: var(--c-gray-300) transparent;
}

.table-responsive::-webkit-scrollbar {
    height: 0.5rem;
}

.table-responsive::-webkit-scrollbar-track {
    background: transparent;
}

.table-responsive::-webkit-scrollbar-thumb {
    border-radius: var(--r-full);
    background: var(--c-gray-300);
}

.table-responsive::-webkit-scrollbar-thumb:hover {
    background: var(--c-gray-400);
}

/* Y el borde inferior de la tarjeta no puede quedar cortado por el scroll */
.table-responsive {
    padding-bottom: 0;
    border-bottom: 0;
}


/* ---- Etiqueta de tipo (Concierto, Masterclass, …) -----------
   Era texto gris en mayusculas, que a simple vista se confundia con un
   encabezado. Pasa a ser una pildora neutra y chica: se lee como un valor
   clasificado, no como titulo, y no compite con el dato principal de la
   fila. Estilo del bloque "Badges" de Tailwind UI, variante gris. */

.cms-tipo {
    display: inline-block;
    padding: var(--space-0-5) var(--space-2);
    border-radius: var(--r-full);
    background: var(--c-gray-100);
    box-shadow: inset 0 0 0 1px var(--c-gray-200);
    font-size: var(--fs-3xs);
    font-weight: 500;
    line-height: 1rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--c-gray-600);
    white-space: nowrap;
}

/* Dentro de una celda editable el hover ya marca que se puede tocar; la
   pildora no necesita repetirlo con otro borde. */
.editable-cell:hover .cms-tipo {
    background: #fff;
}


/* ============================================================
   52. BENTO DEL DASHBOARD
   ============================================================

   Bloque de arriba del dashboard: el proximo evento ocupa el doble de ancho
   y a su lado van las dos ciudades del equipo. Sigue el bloque "Stats" y las
   tarjetas de Tailwind UI: fondo blanco, borde de 1px por sombra interior,
   esquinas de 0.75rem y jerarquia por tamaño y color, no por adornos.

   Las tres tarjetas tienen la MISMA altura porque la grilla las estira
   (`align-items: stretch` es el default): antes cada tarjeta media distinto
   segun su contenido y la fila quedaba dentada.
   ============================================================ */

.bento {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: var(--space-4);
}

/* El proximo evento pesa el doble: es lo que uno viene a mirar */
.bento-destacada { grid-column: span 2; }

@media (max-width: 991.98px) {
    .bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .bento-destacada { grid-column: span 2; }
}

@media (max-width: 575.98px) {
    .bento { grid-template-columns: minmax(0, 1fr); }
    .bento-destacada { grid-column: span 1; }
}

.bento-card {
    display: flex;
    flex-direction: column;
    min-width: 0;                 /* sin esto el texto largo estira la celda */
    padding: var(--space-5);
    border-radius: var(--r-xl);
    background: #fff;
    box-shadow: var(--ring-card), var(--sh-xs);
}

/* Rotulo de la tarjeta: chico, en mayusculas, gris */
.bento-rotulo {
    margin: 0;
    font-size: var(--fs-2xs);
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--c-gray-500);
}

/* ---- Tarjeta del proximo evento ---------------------------- */

.bento-cuenta {
    margin: var(--space-2-5) 0 0;
    font-family: var(--font-display);
    font-size: var(--fs-3xl);
    line-height: 2rem;
    font-weight: 600;
    color: var(--c-accent);
}

.bento-titulo {
    margin: var(--space-1) 0 var(--space-4);
    font-family: inherit;         /* Cinzel a este tamaño se lee peor */
    font-size: var(--fs-md);
    line-height: 1.5rem;
    font-weight: 600;
    color: var(--c-gray-900);
    /* Dos lineas y corta: el titulo de un evento puede ser larguisimo */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* Lista de datos, al estilo "Description list" de Tailwind UI */
.bento-datos {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-3) var(--space-4);
    margin: 0 0 var(--space-4);
}

.bento-datos dt {
    margin: 0;
    font-size: var(--fs-2xs);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--c-gray-400);
}

.bento-datos dd {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-base);
    line-height: 1.25rem;
    color: var(--c-gray-900);
    /* Una linea: el lugar puede ser "Corrales, Nuevo Mexico, Estados Unidos" */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.bento-enlace {
    margin-top: auto;             /* pegado abajo, alineado entre tarjetas */
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--c-accent);
    text-decoration: none;
}

.bento-enlace:hover { color: var(--c-accent-hover); text-decoration: underline; }

.bento-vacio {
    margin: var(--space-3) 0 var(--space-4);
    font-size: var(--fs-base);
    color: var(--c-gray-500);
}

/* ---- Tarjetas de ciudad (hora + clima) --------------------- */

/* Cinzel SOLO en el nombre de la ciudad. La hora y la temperatura quedan en
   Inter: son cifras, y a ese tamaño se leen mejor con la tipografia de
   interfaz —ademas Cinzel no trae cifras de ancho fijo—. */
.bento-ciudad .bento-rotulo {
    font-family: var(--font-display);
    font-size: var(--fs-md);
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: none;
}

.bento-ciudad-cabecera {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-2);
    min-width: 0;
}

/* Sin esto el bloque de texto no encoge —el minimo de un item flex es su
   contenido— y termina empujando el icono FUERA de la tarjeta. Se veia con
   "Berklee College of Music", que es el detalle mas largo. */
.bento-ciudad-cabecera > div {
    min-width: 0;
}

.bento-ciudad-detalle {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-xs);
    line-height: 1rem;
    color: var(--c-gray-500);
    /* Dos lineas antes que recortar: "Berklee College of Music" es el dato
       que le da sentido a la tarjeta, no un accesorio. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.bento-clima-icono {
    flex: 0 0 auto;
    width: 1.5rem;
    height: 1.5rem;
    color: var(--c-gray-400);
}

/* La hora en cifras de ancho fijo: si no, "11:38" y "12:41" bailan al pasar
   los segundos y la tarjeta parece temblar. */
.bento-hora {
    margin: var(--space-3) 0 0;
    font-size: var(--fs-3xl);
    line-height: 2.25rem;
    font-weight: 600;
    letter-spacing: -.02em;
    font-variant-numeric: tabular-nums;
    color: var(--c-gray-900);
}

.bento-ciudad-dia {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-xs);
    color: var(--c-gray-500);
    text-transform: capitalize;
}

.bento-clima {
    display: flex;
    align-items: baseline;
    gap: var(--space-2);
    margin: auto 0 0;             /* al pie, para que todas coincidan */
    padding-top: var(--space-3);
}

.bento-temp {
    font-size: var(--fs-lg);
    font-weight: 600;
    color: var(--c-gray-900);
    font-variant-numeric: tabular-nums;
}

.bento-clima-texto {
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.bento-clima-sindato {
    font-size: var(--fs-sm);
    color: var(--c-gray-400);
}


/* ============================================================
   53. SANGRIA DE LOS GRUPOS DEL SIDEBAR
   ============================================================

   El template GO separa los items del navbar con
   `.nav-item + .nav-item { margin-left: 1rem }`, que en una barra HORIZONTAL
   es el espacio entre secciones. En el sidebar vertical ese margen se
   convierte en sangria: Contenido quedaba alineado a la izquierda y
   Multimedia, Web y Sistema 16px mas adentro, como si estuvieran tabulados.
   ============================================================ */

.header-dark .navbar-nav .nav-item + .nav-item,
.header-dark .navbar-nav.mr-auto .nav-item + .nav-item,
.header-dark .navbar-nav.mr-0 .nav-item + .nav-item {
    margin-left: 0;
}


/* ============================================================
   54. COLOR DE LAS TARJETAS DE CIUDAD
   ============================================================

   Las dos ciudades del equipo se distinguen por color, para encontrarlas de
   un vistazo: Asuncion en el dorado de la marca y Boston en el crema. Son
   los dos tonos de la identidad, asi que el dashboard gana vida sin salirse
   de la paleta.
   ============================================================ */

.bento-ciudad-asuncion {
    background: linear-gradient(160deg, var(--brand-gold-soft) 0%, #fff 62%);
    box-shadow: inset 0 0 0 1px rgba(139, 111, 77, .22), var(--sh-xs);
}

.bento-ciudad-asuncion .bento-rotulo,
.bento-ciudad-asuncion .bento-hora,
.bento-ciudad-asuncion .bento-temp { color: var(--brand-gold-deep); }

.bento-ciudad-asuncion .bento-clima-icono { color: var(--brand-gold); }

.bento-ciudad-boston {
    background: linear-gradient(160deg, var(--brand-cream) 0%, #fff 62%);
    box-shadow: inset 0 0 0 1px rgba(36, 25, 23, .12), var(--sh-xs);
}

.bento-ciudad-boston .bento-rotulo,
.bento-ciudad-boston .bento-hora,
.bento-ciudad-boston .bento-temp { color: var(--brand-brown); }

.bento-ciudad-boston .bento-clima-icono { color: var(--c-gray-400); }


/* ============================================================
   55. FILA DE GESTION DEL DASHBOARD
   ============================================================

   Segunda fila del bento: el estado del pipeline, la carga del proximo mes
   y las negociaciones que quedaron quietas. Las dos primeras son numeros
   grandes (bloque "Stats" de Tailwind UI); la tercera, una lista corta y
   accionable, ocupa el doble de ancho.
   ============================================================ */

.bento-numero {
    margin: var(--space-2) 0 0;
    font-size: var(--fs-4xl);
    line-height: 2.5rem;
    font-weight: 600;
    letter-spacing: -.02em;
    font-variant-numeric: tabular-nums;
    color: var(--c-gray-900);
}

.bento-nota {
    margin: var(--space-0-5) 0 var(--space-4);
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
}

.bento-pipeline {
    list-style: none;
    margin: var(--space-3) 0 var(--space-4);
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-1-5);
}

.bento-pipeline li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2);
}

.bento-pipeline-num {
    font-size: var(--fs-sm);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--c-gray-700);
}

.bento-quietas {
    list-style: none;
    margin: var(--space-3) 0 0;
    padding: 0;
}

.bento-quietas li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: var(--space-2) 0;
    border-top: 1px solid var(--c-gray-100);
}

.bento-quietas li:first-child { border-top: 0; }

.bento-quietas a {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--c-gray-900);
    text-decoration: none;
}

.bento-quietas a:hover { color: var(--c-accent); text-decoration: underline; }

.bento-quietas-meta {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-xs);
    color: var(--c-gray-500);
    white-space: nowrap;
}


/* ============================================================
   56. AVATARES — bloque "Avatars" de Tailwind UI
   ============================================================

   Foto de perfil circular, con las iniciales como respaldo. El fondo de las
   iniciales sale del nombre, asi que cada persona tiene siempre el mismo
   color: en una lista, el color ya identifica antes de leer.

   Los tonos son de la paleta calida de la marca, no colores al azar.

   SE LLAMAN cms-avatar-* Y NO avatar-*: el template GO ya define un `.avatar`
   de 60px, y su variante `[class*="-sm"]` lleva `height: auto`, que dentro de
   un contenedor flex se estira a lo alto. El avatar salia como una capsula
   deformada. Ademas le gana en especificidad a `.avatar-sm`.
   ============================================================ */

.cms-avatar {
    display: inline-flex;
    /* Dentro de un flex, sin esto el avatar se estira a la altura de la fila */
    align-self: flex-start;
    aspect-ratio: 1 / 1;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    overflow: hidden;
    border-radius: var(--r-full);
    background: var(--c-gray-200);
    color: var(--c-gray-700);
    font-weight: 600;
    line-height: 1;
    text-transform: uppercase;
    user-select: none;
}

.cms-avatar img {
    width: 100%;
    height: 100%;
    object-fit: cover;   /* sin deformar: recorta y centra */
    display: block;
}

.cms-avatar-sm { width: 1.75rem; height: 1.75rem; font-size: var(--fs-3xs); }
.cms-avatar-md { width: 2.25rem; height: 2.25rem; font-size: var(--fs-xs); }
.cms-avatar-lg { width: 3rem;    height: 3rem;    font-size: var(--fs-md); }

/* Tonos derivados del nombre: estables y dentro de la paleta */
.cms-avatar-tono-1 { background: var(--brand-gold-soft);  color: var(--brand-gold-deep); }
.cms-avatar-tono-2 { background: #e9e2d8;                 color: #6b543a; }
.cms-avatar-tono-3 { background: var(--c-gray-200);       color: var(--c-gray-700); }
.cms-avatar-tono-4 { background: #efe6dd;                 color: #7a5c46; }
.cms-avatar-tono-5 { background: #e5e7e2;                 color: #4a5347; }
.cms-avatar-tono-6 { background: #ece4e2;                 color: #6d5350; }

/* Sobre el sidebar oscuro el avatar necesita separarse del fondo */
.header-dark .cms-avatar {
    box-shadow: 0 0 0 1px var(--brand-brown-soft);
}

/* En el feed de actividad el avatar reemplaza al nodo con icono */
.cms-feed-item > .cms-avatar {
    margin-top: var(--space-0-5);
    box-shadow: 0 0 0 3px #fff;
}


/* Persona en una celda de tabla: foto + nombre en una linea */
.celda-persona {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    min-width: 0;
    color: var(--c-gray-900);
    text-decoration: none;
}

.celda-persona-nombre {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 500;
}

.celda-persona:hover .celda-persona-nombre { color: var(--c-accent); }

/* El usuario en sesion, dentro del sidebar */
.header-dark .navbar-nav.mr-0 .nav-link {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
}


/* ============================================================
   57. MAPA: RANKINGS Y DETALLE DE CIUDAD
   ============================================================

   El mapa deja de ser solo una ilustracion: los rankings mueven el mapa y
   cada pin abre el detalle de su ciudad, desde donde se llega a la vista
   previa y a la edicion sin salir de la pantalla.
   ============================================================ */

.cms-rankings {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-4);
    margin-top: var(--space-4);
}

@media (max-width: 767.98px) {
    .cms-rankings { grid-template-columns: minmax(0, 1fr); }
}

.cms-ranking {
    padding: var(--space-5);
    border-radius: var(--r-xl);
    background: #fff;
    box-shadow: var(--ring-card), var(--sh-xs);
}

.cms-ranking-titulo {
    margin: 0 0 var(--space-3);
    font-family: inherit;
    font-size: var(--fs-2xs);
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--c-gray-500);
}

.cms-ranking-lista {
    list-style: none;
    margin: 0;
    padding: 0;
}

/* Cada fila es un boton: mueve el mapa al lugar que nombra */
.cms-ranking-fila {
    display: grid;
    grid-template-columns: 1.25rem minmax(0, 1fr) 4.5rem 2.25rem;
    align-items: center;
    gap: var(--space-2-5);
    width: 100%;
    padding: var(--space-2) var(--space-1-5);
    border: 0;
    border-radius: var(--r-md);
    background: none;
    font: inherit;
    text-align: left;
    cursor: pointer;
}

.cms-ranking-fila:hover { background: var(--c-gray-50); }

.cms-ranking-pos {
    font-size: var(--fs-2xs);
    font-weight: 600;
    color: var(--c-gray-400);
    font-variant-numeric: tabular-nums;
}

.cms-ranking-nombre {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--c-gray-900);
}

.cms-ranking-nombre small {
    margin-left: var(--space-1-5);
    font-size: var(--fs-xs);
    font-weight: 400;
    color: var(--c-gray-400);
}

/* La barra da la proporcion de un vistazo, sin leer los numeros */
.cms-ranking-barra {
    height: 0.375rem;
    border-radius: var(--r-full);
    background: var(--c-gray-100);
    overflow: hidden;
}

.cms-ranking-barra > span {
    display: block;
    height: 100%;
    border-radius: var(--r-full);
    background: var(--brand-gold);
}

.cms-ranking-num {
    font-size: var(--fs-sm);
    font-weight: 600;
    text-align: right;
    font-variant-numeric: tabular-nums;
    color: var(--c-gray-700);
}

/* ---- Boton del popup del pin ------------------------------- */

.cms-map-popup-ver {
    display: block;
    width: 100%;
    margin-top: var(--space-2);
    padding: var(--space-1-5) var(--space-2-5);
    border: 0;
    border-radius: var(--r-md);
    background: var(--c-accent);
    color: #fff;
    font: inherit;
    font-size: var(--fs-xs);
    font-weight: 600;
    cursor: pointer;
}

.cms-map-popup-ver:hover { background: var(--c-accent-hover); }

/* ---- Eventos de la ciudad, en el drawer -------------------- */

.cms-ciudad-eventos {
    list-style: none;
    margin: 0;
    padding: 0;
}

.cms-ciudad-eventos li {
    display: grid;
    grid-template-columns: 5.5rem minmax(0, 1fr) auto;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-3) 0;
    border-top: 1px solid var(--c-gray-100);
}

.cms-ciudad-eventos li:first-child { border-top: 0; }

/* Lo que todavia no paso se destaca: es lo que se gestiona */
.cms-ciudad-eventos li.es-futuro .cms-ciudad-evento-fecha { color: var(--c-accent); font-weight: 600; }

.cms-ciudad-evento-fecha {
    font-size: var(--fs-sm);
    font-variant-numeric: tabular-nums;
    color: var(--c-gray-500);
}

.cms-ciudad-evento-fecha small {
    display: block;
    font-size: var(--fs-2xs);
    color: var(--c-gray-400);
}

.cms-ciudad-evento-datos { min-width: 0; }

.cms-ciudad-evento-titulo {
    margin: 0 0 var(--space-1);
    font-size: var(--fs-base);
    line-height: 1.25rem;
    color: var(--c-gray-900);
    /* Dos lineas: los titulos de agenda pueden ser larguisimos */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.cms-ciudad-evento-acciones {
    display: flex;
    gap: var(--space-1);
    white-space: nowrap;
}

/* En el drawer las acciones no se ocultan: son el motivo de abrirlo */
.cms-ciudad-evento-acciones .btn-action { opacity: 1; }


/* ============================================================
   58. ITEM SUELTO DEL MENU (Dashboard)
   ============================================================

   El Dashboard no pertenece a ningun grupo: es la pantalla de entrada. Va
   arriba de todo, sin rotulo de seccion, y necesita el mismo tratamiento que
   los items que viven dentro de un `.dropdown-menu` —de ahi cuelgan las
   reglas de sangria, icono y estado activo del sidebar.
   ============================================================ */

.header-dark .navbar-nav .nav-item-suelto {
    width: 100%;
}

/* Separa el Dashboard del primer rotulo de grupo */
.header-dark .navbar-nav .nav-item-suelto + .nav-item {
    margin-top: var(--space-2);
}

/* style.css pinta `.dropdown-item span { color: #333 }`, y TODAS las reglas
   que lo corrigen estan acotadas a `.dropdown-menu .dropdown-item span`. El
   Dashboard no vive dentro de un .dropdown-menu —es el unico item suelto de
   la lista—, asi que su etiqueta se quedaba en gris oscuro sobre el marron
   del menu: se leia apagada al lado de las demas, tanto en el sidebar como
   en el menu colapsado. El color lo manda el item; el span solo hereda. */
.header-dark .navbar-nav .nav-item-suelto .dropdown-item span {
    color: inherit;
    font-size: inherit;
    font-weight: inherit;
    line-height: inherit;
}

@media (min-width: 1200px) {
    /* Mismo formato que un item de grupo: grilla icono | texto */
    .header-dark .navbar-nav .nav-item-suelto .dropdown-item {
        display: grid;
        grid-template-columns: 1.25rem 1fr;
        align-items: center;
        gap: var(--space-3);
        padding: var(--space-2) var(--space-3);
        border-radius: var(--r-md);
        color: var(--c-gray-400) !important;
        font-size: var(--fs-base);
        font-weight: 500 !important;
        line-height: 1.5rem;
    }

    .header-dark .navbar-nav .nav-item-suelto .dropdown-item:hover {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    .header-dark .navbar-nav .nav-item-suelto .dropdown-item.active {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    .header-dark .navbar-nav .nav-item-suelto .dropdown-item i[class^="icon-"] {
        width: 1.25rem;
        height: 1.25rem;
    }
}


/* ============================================================
   59. BIOGRAFIA: LA VISTA REAL DE LA WEB
   ============================================================

   La pantalla volcaba el HTML de la biografia dentro del panel, asi que los
   enlaces tomaban el color del CMS en vez del dorado en italica del sitio, y
   habria que mantener esos estilos sincronizados a mano. Ahora se muestra el
   contenido con la hoja de estilos real de la web, dentro de un marco.
   ============================================================ */

.bio-vista {
    border-radius: var(--r-xl);
    background: #fff;
    box-shadow: var(--ring-card), var(--sh-xs);
    overflow: hidden;
}

.bio-vista-barra {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-3-5) var(--space-5);
    border-bottom: 1px solid var(--c-gray-200);
    background: var(--c-gray-50);
}

.bio-vista-titulo {
    margin: 0;
    font-family: inherit;
    font-size: var(--fs-2xs);
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--c-gray-500);
}

/* Alto generoso: la biografia es larga y el iframe scrollea por dentro */
.bio-vista-marco {
    display: block;
    width: 100%;
    height: 40rem;
    border: 0;
    background: #ebebeb;
}

@media (max-width: 767.98px) {
    .bio-vista-marco { height: 28rem; }
    .bio-vista-barra { flex-wrap: wrap; }
}

/* ---- Estado de los PDF ------------------------------------- */

.bio-pdfs {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-4);
    margin-top: var(--space-4);
}

@media (max-width: 767.98px) {
    .bio-pdfs { grid-template-columns: minmax(0, 1fr); }
}

.bio-pdf {
    padding: var(--space-4) var(--space-5);
    border-radius: var(--r-lg);
    background: #fff;
    box-shadow: var(--ring-card), var(--sh-xs);
}

/* Si falta el PDF, en la web no hay que descargar: se avisa fuerte */
.bio-pdf-falta {
    background: var(--c-red-50);
    box-shadow: inset 0 0 0 1px var(--c-red-ring);
}

.bio-pdf-rotulo {
    display: block;
    margin-bottom: var(--space-2);
    font-size: var(--fs-2xs);
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--c-gray-500);
}

.bio-pdf-error {
    margin: 0;
    font-size: var(--fs-base);
    color: var(--c-red-700);
}

.bio-pdf-archivo {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--c-gray-900);
    text-decoration: none;
}

.bio-pdf-archivo:hover { color: var(--c-accent); }

.bio-pdf-archivo i { width: 1rem; height: 1rem; }

.bio-pdf-peso {
    display: block;
    margin-top: var(--space-1);
    font-size: var(--fs-xs);
    color: var(--c-gray-400);
}


/* ============================================================
   60. LIGHTBOX DE VISTA PREVIA (secciones visuales)
   ============================================================

   Discografia, videos, fotografos, proyectos, contacto y el slider del home
   son grillas y pantallas completas: en un drawer de 32rem no se entiende
   nada. Van en un lightbox centrado y ancho.

   El selector de dispositivo cambia el ANCHO del iframe, no el zoom: asi el
   documento de adentro cruza sus propios puntos de corte y muestra el diseño
   que de verdad le toca a un telefono, en vez de una version achicada del de
   escritorio.

   Bloque de referencia: Overlays -> Modal dialogs de Tailwind UI.
   ============================================================ */

.cms-lightbox {
    position: fixed;
    inset: 0;
    z-index: 1080;   /* encima de los drawers */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-6);
}

.cms-lightbox[hidden] { display: none; }

.cms-lightbox-fondo {
    position: absolute;
    inset: 0;
    background: rgba(28, 25, 23, .6);
    opacity: 0;
    transition: opacity .18s ease;
}

.cms-lightbox.is-open .cms-lightbox-fondo { opacity: 1; }

.cms-lightbox-panel {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    max-width: 78rem;
    height: 100%;
    max-height: 52rem;
    border-radius: var(--r-xl);
    background: #fff;
    box-shadow: var(--sh-lg);
    overflow: hidden;
    opacity: 0;
    transform: translateY(0.75rem) scale(.99);
    transition: opacity .18s ease, transform .18s ease;
}

.cms-lightbox.is-open .cms-lightbox-panel {
    opacity: 1;
    transform: none;
}

.cms-lightbox-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
    flex-wrap: wrap;
    padding: var(--space-3-5) var(--space-5);
    border-bottom: 1px solid var(--c-gray-200);
    background: #fff;
}

.cms-lightbox-titulos { min-width: 0; }

.cms-lightbox-title {
    margin: 0;
    font-family: inherit;
    font-size: var(--fs-md);
    font-weight: 600;
    color: var(--c-gray-900);
}

.cms-lightbox-sub {
    margin: var(--space-0-5) 0 0;
    font-size: var(--fs-sm);
    color: var(--c-gray-500);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cms-lightbox-controles {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    flex: 0 0 auto;
}

.cms-lightbox-cerrar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border: 0;
    border-radius: var(--r-md);
    background: none;
    font-size: var(--fs-2xl);
    line-height: 1;
    color: var(--c-gray-500);
    cursor: pointer;
}

.cms-lightbox-cerrar:hover { background: var(--c-gray-100); color: var(--c-gray-900); }

/* El cuerpo es el "escritorio" gris donde se apoya la pantalla simulada */
.cms-lightbox-cuerpo {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    justify-content: center;
    padding: var(--space-4);
    background: var(--c-gray-100);
    overflow: auto;
}

.cms-lightbox-marco {
    width: 100%;
    height: 100%;
    background: #fff;
    box-shadow: var(--sh-sm);
    transition: width .2s ease, max-width .2s ease;
}

/* Ancho de telefono: 390px es un iPhone actual, el corte donde la web
   cambia a su diseño movil. */
.cms-lightbox-marco.es-movil {
    width: 390px;
    max-width: 100%;
    border-radius: var(--r-lg);
    overflow: hidden;
}

.cms-lightbox-marco iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
}

@media (max-width: 767.98px) {
    .cms-lightbox { padding: 0; }

    .cms-lightbox-panel {
        max-height: none;
        border-radius: 0;
    }

    /* En un telefono el selector de dispositivo no aporta: ya estas en uno */
    .cms-lightbox-controles [data-box-ancho] { display: none; }
}


/* Campo que se acaba de completar solo: un destello corto para que se note
   que el sistema lo lleno y no quedo asi de antes. */
.campo-autocompletado {
    background-color: var(--c-accent-soft) !important;
    transition: background-color .4s ease;
}

/* ---------------------------------------------------------------------------
   "Ver la web" es el unico item del menu que es un <button> dentro de un
   <form>: encender el modo vista previa emite un token, o sea una accion, y
   va por POST con CSRF. El <form> se saca del layout con display: contents
   para que el boton siga siendo, visualmente, un item mas de la lista.
   --------------------------------------------------------------------------- */
.header-dark .navbar-nav .nav-item-suelto form {
    display: contents;
}
.header-dark .navbar-nav .nav-item-suelto button.dropdown-item {
    cursor: pointer;
    font-family: inherit;
    text-align: left;
}

/* ---------------------------------------------------------------------------
   Campos JSON (tracks, libro, schema)

   `.font-monospace` es una clase de Bootstrap 5 y este CMS usa Bootstrap 4:
   no existe en ninguna hoja, asi que el JSON se venia mostrando en Inter. Con
   tipografia proporcional las comillas y las llaves no se alinean y un objeto
   de 5 KB se vuelve ilegible.
   --------------------------------------------------------------------------- */
.font-monospace,
textarea.font-monospace {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
                 "Liberation Mono", monospace !important;
    font-size: var(--fs-xs);
    line-height: 1.55;
    /* Una linea larga de JSON no se parte en palabras: sin esto, cada
       propiedad se corta donde cae y cuesta seguir la estructura. */
    white-space: pre;
    overflow-wrap: normal;
    overflow-x: auto;
    tab-size: 2;
}

/* El campo trae miles de caracteres: cuatro renglones no alcanzan ni para
   ver una linea entera. Se puede agrandar arrastrando. */
textarea.font-monospace {
    min-height: 14rem;
    resize: vertical;
}

/* Fila de acciones del campo JSON */
.json-acciones {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin-top: var(--space-2);
    flex-wrap: wrap;
}
.json-estado {
    font-size: var(--fs-xs);
    font-weight: 600;
}
.json-estado-ok { color: var(--c-ok-text, #3f6b45); }
.json-estado-mal { color: var(--c-danger-text, #a4382f); }

/* ---------------------------------------------------------------------------
   Tablas que no son listados de DataTables

   El template GO pone `.table { table-layout: fixed }`, que reparte el ancho
   en partes iguales sin mirar el contenido. En Contactos eso daba columnas de
   132px para todo: el email necesitaba 249px y, como las celdas no recortan,
   el texto se salia por encima de la columna de al lado. Se veia "encimado".

   Solo se corrige aca: los listados con DataTables manejan su propio ancho y
   tienen las clases de prioridad de columnas, asi que no se tocan.
   --------------------------------------------------------------------------- */
.table-responsive > table:not(#dataTable),
.card .table:not(#dataTable) {
    table-layout: auto;
}

/* Un email largo no tiene espacios donde cortar: sin esto ensancha la tabla
   entera y empuja las demas columnas. */
.table-responsive > table:not(#dataTable) td,
.card .table:not(#dataTable) td {
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Los botones de accion no se apilan uno debajo del otro. */
.table-responsive > table:not(#dataTable) td:last-child,
.card .table:not(#dataTable) td:last-child {
    width: 1%;
    white-space: nowrap;
}

/* La columna de orden es un numero: no necesita mas que su ancho. */
.table-responsive > table:not(#dataTable) td:first-child,
.table-responsive > table:not(#dataTable) th:first-child {
    width: 1%;
    white-space: nowrap;
}

/* ---------------------------------------------------------------------------
   Bloque de usuario del menu: perfil y cerrar sesion

   Estaban dentro de un dropdown que en el sidebar no abria nunca: la regla que
   convierte los encabezados de grupo en rotulos le sacaba los pointer-events
   tambien a este link, asi que el clic sobre el nombre no hacia nada y no
   habia forma de cerrar sesion desde escritorio.

   En vez de depender de que el desplegable abra, sus dos items quedan siempre
   a la vista, igual que los del resto del menu.
   --------------------------------------------------------------------------- */
/* El avatar con el nombre es identidad, no una accion: si fuera clickeable
   habria dos accesos al mismo lugar —el nombre y el item "Mi Perfil" de
   abajo— y se lee como si el perfil estuviera duplicado. Las acciones son
   las dos de abajo. */
.header-dark .navbar-nav.mr-0 .nav-item.dropdown > .nav-link.dropdown-toggle {
    pointer-events: none;
    cursor: default;
    background: transparent !important;
}

/* GO dibuja una flecha de desplegable; aca ya no despliega nada */
.header-dark .navbar-nav.mr-0 .nav-item.dropdown > .nav-link.dropdown-toggle::after {
    display: none !important;
}

@media (min-width: 1200px) {
    .header-dark .navbar-nav.mr-0 .dropdown-menu {
        display: block !important;
        position: static !important;
        width: 100%;
        min-width: 0;
        margin: var(--space-1) 0 0;
        padding: 0;
        background: transparent;
        border: none;
        box-shadow: none;
        transform: none !important;
    }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item,
    .header-dark .navbar-nav.mr-0 .dropdown-menu button.dropdown-item {
        display: flex;
        align-items: center;
        gap: var(--space-3);
        width: 100%;
        min-height: 2.5rem;
        padding: var(--space-2) var(--space-5) !important;
        border: 0;
        background: transparent;
        color: rgba(255, 255, 255, .78) !important;
        font-size: var(--fs-sm);
        font-weight: 500 !important;
        text-align: left;
    }

    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item:hover,
    .header-dark .navbar-nav.mr-0 .dropdown-menu button.dropdown-item:hover {
        background: var(--brand-brown-soft);
        color: #fff !important;
    }

    /* GO pinta `.dropdown-item span` en gris oscuro desde style.css: sobre el
       marron del menu el texto quedaba invisible y solo se veia el icono. El
       span tiene que heredar del item, no pintarse aparte. */
    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item span {
        color: inherit !important;
        font-size: inherit;
    }

    /* El rol, debajo del nombre, es informacion y no una accion */
    .header-dark .navbar-nav.mr-0 .dropdown-menu .dropdown-item p {
        display: none;
    }

    /* Cerrar sesion se distingue del resto */
    .header-dark .navbar-nav.mr-0 .dropdown-menu button.dropdown-item {
        color: var(--brand-gold) !important;
    }

    .header-dark .navbar-nav.mr-0 .dropdown-divider {
        border-top-color: rgba(255, 255, 255, .12);
        margin: var(--space-2) var(--space-5);
    }
}

/* ---------------------------------------------------------------------------
   Vista previa del archivo elegido (cms-imagen-preview.js)

   El navegador solo muestra el nombre del archivo: no se sabe si se eligio la
   imagen correcta hasta despues de guardar.
   --------------------------------------------------------------------------- */
.cms-archivo-elegido {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    margin-top: var(--space-2);
    padding: var(--space-2) var(--space-3);
    background: var(--c-gray-50, #fafaf9);
    border: 1px solid var(--c-gray-200, #e7e5e4);
    border-radius: var(--r-md);
}

.cms-archivo-miniatura {
    width: 4.5rem;
    height: 4.5rem;
    object-fit: cover;
    border-radius: var(--r-sm);
    background: #fff;
    /* Un SVG de icono suele venir sin fondo: sin esto se pierde sobre el gris */
    box-shadow: inset 0 0 0 1px var(--c-gray-200, #e7e5e4);
    flex: none;
}

.cms-archivo-datos {
    display: grid;
    gap: 2px;
    min-width: 0;
}

.cms-archivo-datos strong {
    font-size: var(--fs-sm);
    font-weight: 600;
    /* Los nombres de captura de pantalla son larguisimos */
    overflow-wrap: anywhere;
}

.cms-archivo-datos span {
    font-size: var(--fs-xs);
    color: var(--c-gray-500);
}

.cms-archivo-aviso {
    color: var(--c-danger-text, #a4382f) !important;
    font-weight: 600;
}

/* ---------------------------------------------------------------------------
   Archivo elegido: vista previa antes de subir
   --------------------------------------------------------------------------- */
.cms-archivo-elegido {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    margin-top: var(--space-2);
    padding: var(--space-2) var(--space-3);
    border: 1px solid var(--c-gray-200);
    border-radius: var(--r-md);
    background: var(--c-gray-50);
}
.cms-archivo-miniatura {
    width: 3.5rem;
    height: 3.5rem;
    object-fit: cover;
    border-radius: var(--r-sm);
    border: 1px solid var(--c-gray-200);
    background: #fff;
    flex: none;
}
.cms-archivo-datos {
    display: grid;
    gap: 2px;
    min-width: 0;
    font-size: var(--fs-xs);
}
.cms-archivo-datos strong {
    color: var(--c-gray-800);
    font-weight: 600;
    /* Un nombre de archivo largo no puede ensanchar el formulario */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.cms-archivo-datos span { color: var(--c-gray-500); }
.cms-archivo-aviso { color: var(--c-danger-text, #a4382f) !important; font-weight: 600; }

/* ---------------------------------------------------------------------------
   Invitados de una reunion
   --------------------------------------------------------------------------- */
.cms-invitados { display: grid; gap: var(--space-2); }

.cms-invitado {
    display: grid;
    grid-template-columns: 1fr 1fr auto auto;
    align-items: center;
    gap: var(--space-2);
}
.cms-invitado .btn-action { flex: none; }

/* La respuesta de cada invitado se lee de un vistazo */
.cms-invitado-respuesta {
    font-size: var(--fs-2xs);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    padding: 2px 9px;
    border-radius: 999px;
    white-space: nowrap;
}
.respuesta-pendiente { background: var(--c-gray-100); color: var(--c-gray-500); }
.respuesta-acepta    { background: var(--c-ok-bg, #e8f2ea); color: var(--c-ok-text, #3f6b45); }
.respuesta-rechaza   { background: var(--c-danger-bg, #f7e9e7); color: var(--c-danger-text, #a4382f); }
.respuesta-quizas    { background: var(--c-info-bg); color: var(--c-info-text); }

@media (max-width: 700px) {
    /* En el telefono las dos columnas de texto no entran una al lado de la
       otra: el email queda de 90px y no se lee nada. */
    .cms-invitado { grid-template-columns: 1fr auto; }
    .cms-invitado input[name="invitado_nombre[]"] { grid-column: 1 / -1; }
}
