/* ═══════════════════════════════════════════════════════════════════════
   SISTEMA DE DISEÑO — César Cardona · Analítica & IA
   Estructura y lenguaje visual del Diseño 1 (bento minimal claro) con la
   paleta original del sitio intacta: navy #0B1426, teal #00C9A7,
   blue #1A56E8, amber #F5A623 y la escala de grises existente.
   Hoja compartida por index.html, dashboards.html, Tendencias.html y
   (junto a wrg-theme.css) proposals/WRG.html.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
  color-scheme: light;

  /* Tokens del sistema de diseño (paleta original) */
  --bg: #F7F8FA;
  --surface: #FFFFFF;
  --surface-warm: #FAFBFD;
  --ink: #0B1426;
  --ink-70: rgba(11, 20, 38, .72);
  --ink-50: rgba(11, 20, 38, .55);
  --ink-45: rgba(11, 20, 38, .46);
  --ink-35: rgba(11, 20, 38, .36);
  --hairline: rgba(11, 20, 38, .08);
  --hairline-strong: rgba(11, 20, 38, .20);
  --nav-bg: rgba(247, 248, 250, .88);
  --pill-bg: rgba(255, 255, 255, .92);
  --accent: #00C9A7;
  --accent-soft: #E0FAF4;
  --accent-text: #009E85;
  --radius: 16px;
  --font-sans: 'Geist', system-ui, sans-serif;
  --font-mono: 'Geist Mono', monospace;

  /* Curvas de easing — nuevas (Fase 0, criterio de emil-design-eng): los
     easings nativos de CSS (ease, ease-out) son débiles y se sienten
     "blandos"; estas versiones con más caída al inicio hacen que un
     botón/dropdown se sienta más responsivo al mismo tiempo (200ms). Se
     usan en .theme-toggle-btn y en los estados :active nuevos de abajo;
     el resto de transiciones existentes en el archivo (con "ease"/"all"
     genérico) se deja igual por ahora — no se reescriben una por una. */
  --ease-out: cubic-bezier(.23, 1, .32, 1);
  --ease-in-out: cubic-bezier(.77, 0, .175, 1);

  /* Escala de espaciado — nueva (Fase 0). No reemplaza todos los pixeles
     sueltos que ya existen en el archivo (sería un cambio enorme y
     riesgoso de una sola vez); de acá en adelante, código nuevo debe usar
     esta escala en vez de un pixel suelto. */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 48px;
  --space-8: 64px;

  /* Escala de radios — nueva (Fase 0). --radius (16px) se conserva tal
     cual para no romper los 8 usos existentes; --radius-pill documenta
     el valor 999px ya usado 25 veces (no se reemplazan esos usos, son
     válidos y explícitos, pero el código nuevo puede referenciar el
     token en vez de repetir el número mágico). */
  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 20px;
  --radius-pill: 999px;

  /* Paleta original del sitio (identidad visual intacta) */
  --navy: #0B1426;
  --navy-mid: #162040;
  --blue: #1A56E8;
  --blue-light: #4B7BFF;
  --blue-soft: #EBF1FF;
  --teal: #00C9A7;
  --teal-soft: #E0FAF4;
  --amber: #F5A623;
  --amber-soft: #FEF3DC;
  --gray-50: #F7F8FA;
  --gray-100: #EDF0F5;
  --gray-200: #D8DCE6;
  --gray-400: #8B93A8;
  --gray-700: #3D4558;
  --white: #FFFFFF;
  --text: #0B1426;
  --text-muted: #5A6275;
  --mstr-color: #D9232E;
  --pbi-color: #F2C811;
  --tableau-color: #E97627;

  /* Tokens "fijos" — Fase 0 (modo oscuro): --navy y --gray-700 se usaban
     a la vez como color de TEXTO (debe aclararse en oscuro) y como fondo
     de botón/insignia de marca (debe quedarse igual en los dos temas).
     Esa mezcla es la razón por la que no se puede simplemente redefinir
     --navy bajo un selector de modo oscuro sin romper los botones — los
     usos de fondo/borde ya se migraron a estos tokens fijos en todo el
     archivo (ver .btn-cta, .lang-btn.active, .hero-btn-primary, etc.),
     dejando a --navy libre para volverse claro en modo oscuro más abajo. */
  --navy-fixed: #0B1426;
  --navy-mid-fixed: #162040;
  --gray-700-fixed: #3D4558;
}

/* ── MODO OSCURO (Fase 0) ──
   Detección automática (prefers-color-scheme) + anulación manual vía
   [data-theme] en <html>, que pone/lee core.js (ver initThemeToggle()).
   Solo cambian acá los tokens que son genuinamente "superficie" o
   "texto" — los tokens "-fixed" y los colores de marca (--teal, --amber,
   --blue, --white) se quedan iguales en los dos temas a propósito. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --bg: #0A0F1A;
    --surface: #121927;
    --surface-warm: #151D2E;
    --ink: #EDF0F5;
    --ink-70: rgba(237, 240, 245, .72);
    --ink-50: rgba(237, 240, 245, .55);
    --ink-45: rgba(237, 240, 245, .46);
    --ink-35: rgba(237, 240, 245, .36);
    --hairline: rgba(237, 240, 245, .10);
    --hairline-strong: rgba(237, 240, 245, .22);
    --nav-bg: rgba(10, 15, 26, .85);
    --pill-bg: rgba(18, 25, 39, .92);
    --navy: #EDF0F5;
    --accent-soft: rgba(0, 201, 167, .14);
    --accent-text: #2EE6C4;
    --amber-soft: rgba(245, 166, 35, .14);
    --teal-soft: rgba(0, 201, 167, .14);
    --blue-soft: rgba(26, 86, 232, .16);
    --gray-50: #17202F;
    --gray-100: #1C2536;
    --gray-200: #2A3448;
    --gray-400: #8891A3;
    --gray-700: #E4E8F0;
    --text-muted: #9AA3B5;
  }
}

:root[data-theme="dark"] {
  color-scheme: dark;
  --bg: #0A0F1A;
  --surface: #121927;
  --surface-warm: #151D2E;
  --ink: #EDF0F5;
  --ink-70: rgba(237, 240, 245, .72);
  --ink-50: rgba(237, 240, 245, .55);
  --ink-45: rgba(237, 240, 245, .46);
  --ink-35: rgba(237, 240, 245, .36);
  --hairline: rgba(237, 240, 245, .10);
  --hairline-strong: rgba(237, 240, 245, .22);
  --nav-bg: rgba(10, 15, 26, .85);
  --pill-bg: rgba(18, 25, 39, .92);
  --navy: #EDF0F5;
  --accent-soft: rgba(0, 201, 167, .14);
  --accent-text: #2EE6C4;
  --amber-soft: rgba(245, 166, 35, .14);
  --gray-50: #17202F;
  --gray-100: #1C2536;
  --gray-200: #2A3448;
  --gray-400: #8891A3;
  --gray-700: #E4E8F0;
  --text-muted: #9AA3B5;
}

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

body { transition: background-color .25s ease, color .25s ease; }

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

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  font-family: var(--font-sans);
  background: var(--bg);
  color: var(--ink);
  line-height: 1.65;
  font-size: 15px;
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* ── LÓGICA BILINGÜE ── */
body.lang-es .en { display: none !important; }
body.lang-en .es { display: none !important; }

/* ── KEYFRAMES ── */
@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
@keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .4; transform: scale(.7); } }
@keyframes pulse-dot { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.25); } }
@keyframes float-y { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }
@keyframes spin-slow { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@keyframes fadeIn { to { opacity: 1; transform: translateY(0); } }

/* ── CAMPO DE PUNTOS INTERACTIVO (interactive-dots.js) ── */
#dot-field {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

/* El contenido se apila por encima de la malla de puntos.
   .index2-tendencias-section (el mini-carrusel "Últimas publicaciones" de
   index.html) vive fuera de <main> a propósito (ver comentario junto a
   </main> — necesita ser 100% ancho), así que se había quedado fuera de
   esta lista: sin position:relative + z-index, un elemento no
   posicionado pinta DEBAJO de #dot-field (que sí está posicionado, con
   z-index:0) según el orden de apilamiento de CSS, dejando ver los
   puntos por encima de las tarjetas — no era transparencia de las
   imágenes, era que la sección entera pintaba detrás de la malla. */
main, .main, footer, .newsletter-section, .index2-tendencias-section { position: relative; z-index: 1; }

/* ── NAV ── */
nav {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--nav-bg);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border-bottom: 1px solid var(--hairline);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 40px;
  height: 64px;
  gap: 16px;
}

.nav-logo {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--ink);
  letter-spacing: .18em;
  white-space: nowrap;
  text-transform: uppercase;
  position: relative;
  text-decoration: none;
  font-weight: 500;
}

.nav-logo::before {
  content: '●';
  color: var(--teal);
  margin-right: 8px;
  font-size: 8px;
  vertical-align: 2px;
  animation: pulse 2.4s ease-in-out infinite;
}

.nav-logo span { color: var(--accent-text); }

.nav-links {
  display: flex;
  gap: 26px;
  list-style: none;
  flex-wrap: wrap;
  justify-content: center;
}

.nav-links a {
  color: var(--ink-45);
  text-decoration: none;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .14em;
  text-transform: uppercase;
  transition: color .2s;
  position: relative;
}

.nav-links a::after {
  content: '';
  position: absolute;
  bottom: -5px;
  left: 0;
  width: 0;
  height: 1px;
  background: var(--teal);
  transition: width .25s;
}

.nav-links a:hover { color: var(--ink); }
.nav-links a:hover::after { width: 100%; }

.nav-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-shrink: 0;
}

.btn-dash {
  background: var(--surface);
  color: var(--ink-70);
  text-decoration: none;
  padding: 7px 15px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 500;
  border: 1px solid var(--hairline);
  transition: all .2s;
  white-space: nowrap;
  display: flex;
  align-items: center;
  gap: 5px;
  letter-spacing: .04em;
}

.btn-dash:hover {
  border-color: color-mix(in srgb, var(--teal) 50%, transparent);
  color: var(--accent-text);
  background: var(--surface);
}

.btn-dash.disabled {
  opacity: .4;
  pointer-events: none;
  cursor: not-allowed;
}

/* Retroalimentación táctil (Fase 0, criterio de emil-design-eng): un
   botón que se "hunde" un poco al presionar se siente más responsivo.
   Nada de esto anima acciones repetidas cientos de veces al día
   (atajos de teclado) — son botones de navegación, se pulsan poco. */
.btn-dash:active { transform: scale(.97); }

.btn-cta {
  background: var(--navy-fixed);
  color: #fff;
  text-decoration: none;
  padding: 7px 17px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  transition: all .2s;
  white-space: nowrap;
  border: 1px solid var(--navy-fixed);
  cursor: pointer;
  font-family: inherit;
  /* Sin esto, un <button> (Académicos/Aplicaciones/Propuestas, que abren
     un desplegable) queda 4px más bajo que un <a> con la misma clase
     (Dashboard/Tendencias/Contáctanos): el navegador le da a <button> un
     line-height:normal propio que no hereda el de la página, mientras
     que <a> sí lo hereda (1.65, el line-height global del body) — mismo
     padding, alturas distintas. Se fija el mismo 1.65 explícito acá para
     que ambos terminen exactamente igual, en vez de depender de la
     herencia (que es justo lo que fallaba en el <button>).*/
  line-height: 1.65;
}

.btn-cta:hover { background: var(--navy-mid-fixed); box-shadow: 0 6px 18px rgba(11, 20, 38, .25); }
.btn-cta:active { transform: scale(.97); }

.btn-cta[disabled], .btn-cta.disabled {
  opacity: .4;
  pointer-events: none;
  cursor: not-allowed;
  box-shadow: none;
}

.proposal-nav {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.proposal-dropdown {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  min-width: 220px;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 14px;
  box-shadow: 0 18px 40px rgba(11, 20, 38, .10);
  display: none;
  flex-direction: column;
  padding: 6px;
  z-index: 1100;
}

.proposal-dropdown.active { display: flex; }

.proposal-dropdown a {
  text-decoration: none;
  color: var(--ink);
  padding: 9px 12px;
  border-radius: 9px;
  font-size: 12px;
  font-weight: 500;
  transition: background .2s, color .2s;
}

.proposal-dropdown a:hover { background: var(--gray-100); color: var(--accent-text); }

.proposal-dropdown-label {
  padding: 8px 12px 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink-35);
}

.proposal-dropdown-label:not(:first-child) {
  margin-top: 4px;
  padding-top: 10px;
  border-top: 1px solid var(--hairline);
}

.nav-search-btn {
  background: var(--surface);
  border: 1px solid var(--hairline);
  color: var(--ink-45);
  border-radius: 50%;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all .2s;
  font-size: 13px;
  flex-shrink: 0;
  padding: 0;
}

.nav-search-btn:hover {
  border-color: color-mix(in srgb, var(--teal) 50%, transparent);
  color: var(--accent-text);
}

.lang-btn {
  background: transparent;
  border: 1px solid var(--hairline);
  color: var(--ink-45);
  border-radius: 999px;
  padding: 5px 11px;
  font-size: 10.5px;
  font-weight: 600;
  cursor: pointer;
  font-family: var(--font-mono);
  transition: all .2s;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* Los ES/EN sueltos que cada página trae hardcodeados en su <nav> quedan
   ocultos desde el primer pintado (no solo cuando corre core.js) — si
   dependiéramos solo de btn.style.display='none' en JS, se alcanzan a ver
   un instante con su look viejo antes de que el widget 🎨 los reemplace.
   Como esta regla vive en una hoja de estilos (bloquea el render), no hay
   flash. Selector de dos niveles porque WRG.html envuelve sus dos
   botones en un <div class="lang-toggle"> intermedio; las demás páginas
   los cuelgan directo de .nav-actions. No afecta a los ES/EN clonados
   dentro de .palette-widget — esos no son hijos directos de .nav-actions. */
.nav-actions > .lang-btn,
.nav-actions .lang-toggle > .lang-btn {
  display: none;
}

.lang-btn:hover { color: var(--ink); border-color: var(--hairline-strong); }
.lang-btn:active { transform: scale(.94); }

.lang-btn.active {
  background: var(--navy-fixed);
  color: #fff;
  border-color: var(--navy-fixed);
}

.lang-toggle { display: flex; gap: 6px; align-items: center; }

/* ── WIDGET DE PALETA (🎨) — inyectado por core.js initPaletteWidget(),
   no vive en el HTML de ninguna página. Reemplaza los ES/EN sueltos del
   nav (que quedan ocultos) y el viejo botón ☀️/🌙 independiente: un solo
   botón circular (mismo tamaño que .nav-search-btn) que abre un panel con
   Modo de Color, Idioma y Presets Ejecutivos. Inspirado en el selector de
   tema de GA Abogados. */
.palette-widget { position: relative; flex-shrink: 0; }

.palette-btn {
  background: var(--surface);
  border: 1px solid var(--hairline);
  color: var(--ink-45);
  border-radius: 50%;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: transform 160ms var(--ease-out, ease-out), border-color .2s, background .2s;
  font-size: 14px;
  line-height: 1;
  flex-shrink: 0;
  padding: 0;
}

.palette-btn:hover { border-color: color-mix(in srgb, var(--teal) 50%, transparent); }
.palette-btn:active { transform: scale(.92); }

.palette-dropdown {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  min-width: 220px;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 14px;
  box-shadow: 0 18px 40px rgba(11, 20, 38, .10);
  display: none;
  flex-direction: column;
  padding: 6px;
  z-index: 1100;
}

.palette-dropdown.active { display: flex; }

.palette-mode-row, .palette-lang-row {
  display: flex;
  gap: 6px;
  padding: 2px 8px 8px;
}

.palette-mode-btn, .palette-widget .lang-btn {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 5px;
  background: transparent;
  border: 1px solid var(--hairline);
  color: var(--ink-45);
  border-radius: 999px;
  padding: 6px 10px;
  font-size: 11px;
  font-weight: 600;
  cursor: pointer;
  font-family: var(--font-mono);
  transition: all .2s;
  letter-spacing: .04em;
}

.palette-mode-btn:hover, .palette-widget .lang-btn:hover { color: var(--ink); border-color: var(--hairline-strong); }
.palette-mode-btn:active, .palette-widget .lang-btn:active { transform: scale(.96); }

.palette-mode-btn.active, .palette-widget .lang-btn.active {
  background: var(--navy-fixed);
  color: #fff;
  border-color: var(--navy-fixed);
}

.palette-preset-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
  padding: 2px 8px 8px;
}

.palette-preset-btn {
  display: flex;
  align-items: center;
  gap: 7px;
  background: transparent;
  border: 1px solid var(--hairline);
  color: var(--ink-70);
  border-radius: 10px;
  padding: 7px 10px;
  font-size: 11px;
  font-weight: 500;
  cursor: pointer;
  transition: all .2s;
}

.palette-preset-btn:hover { border-color: var(--hairline-strong); }
.palette-preset-btn:active { transform: scale(.97); }

.palette-preset-btn.active {
  border-color: var(--accent);
  background: var(--accent-soft);
  color: var(--accent-text);
  font-weight: 700;
}

.palette-preset-swatch {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  flex-shrink: 0;
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1);
}

@media(max-width: 820px) {
  .nav-links { display: none; }
  nav {
    padding: 12px 16px;
    height: auto;
    flex-wrap: wrap;
    justify-content: center;
  }
  .nav-actions { width: 100%; justify-content: center; flex-wrap: wrap; }
}

/* ── TEXTO REVELADO CON EL SCROLL (scroll-reveal-text.js) ──
   Cada palabra arranca tenue y sube a opacidad completa según el scroll
   la va "alcanzando" — ver scroll-reveal-text.js para el cálculo de
   progreso. Sin JS (o con prefers-reduced-motion) el texto queda intacto:
   no depende de la animación para ser legible. */
.rv-word {
  opacity: .2;
  transition: opacity .3s ease;
}
.rv-word.rv-visible { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .rv-word { opacity: 1 !important; transition: none; }
}

/* ── TARJETAS QUE CRECEN CON EL SCROLL (scroll-scale-cards.js) ──
   --rv-scale/--rv-card-opacity las controla el JS según la cercanía de
   la tarjeta al centro de la pantalla. Se combinan con el propio
   transform de :hover de cada tarjeta (ver .pillar:hover) en vez de
   pisarlo — por eso .pillar declara su transform incluyendo scale(). */
.scroll-scale-card {
  opacity: var(--rv-card-opacity, 1);
  transition: border-color .25s, transform .2s ease, opacity .2s ease;
}

@media (prefers-reduced-motion: reduce) {
  .scroll-scale-card { opacity: 1 !important; }
}

/* ── HERO ── */
.hero {
  /* transparente: la malla de puntos interactiva (#dot-field) se ve a través */
  background: transparent;
  position: relative;
  overflow: hidden;
  min-height: 480px;
  display: flex;
  flex-direction: column;
  border-bottom: 1px solid var(--hairline);
  z-index: 1;
}

/* La trama estática se reemplaza por el canvas interactivo */
.hero::before { content: none; }

.hero::after {
  content: '';
  position: absolute;
  top: -120px;
  right: -120px;
  width: 460px;
  height: 460px;
  background: radial-gradient(circle, color-mix(in srgb, var(--teal) 12%, transparent) 0%, transparent 65%);
  pointer-events: none;
  z-index: 0;
}

.hero-inner {
  max-width: 1140px;
  width: 100%;
  margin: 0 auto;
  padding: 76px 48px;
  position: relative;
  z-index: 1;
}

/* Decoraciones flotantes: fuera del lenguaje bento minimal */
.hero-circuit-lines, .hero-deco { display: none; }

.hero-left { display: flex; flex-direction: column; }

.hero-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--accent-soft);
  border: 1px solid color-mix(in srgb, var(--teal) 30%, transparent);
  color: var(--accent-text);
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  padding: 6px 14px;
  border-radius: 999px;
  margin-bottom: 26px;
  width: fit-content;
}

.hero-eyebrow::before {
  content: '';
  width: 6px;
  height: 6px;
  background: var(--teal);
  border-radius: 50%;
  animation: pulse 2s ease-in-out infinite;
}

/* Tipografía Fraunces (serif) para los títulos de hero — mismo tipo de
   letra que index.html (antes Index2.html). Solo cambia font-family/weight/
   tamaño; el color sigue viniendo de var(--ink)/var(--accent-text), o sea
   que cada página conserva su propio patrón de colores intacto. */
.hero h1 {
  font-family: 'Fraunces', var(--font-sans);
  font-weight: 600;
  font-size: clamp(34px, 5vw, 60px);
  color: var(--ink);
  line-height: 1.04;
  letter-spacing: -.03em;
  text-transform: none;
  margin-bottom: 14px;
}

.hero h1 em {
  font-style: normal;
  color: var(--accent-text);
}

.hero-h1-accent {
  font-family: 'Fraunces', var(--font-sans);
  font-weight: 600;
  font-size: clamp(26px, 3.6vw, 40px);
  color: var(--accent-text);
  letter-spacing: -.01em;
  line-height: 1;
  margin-top: -8px;
  margin-bottom: 14px;
}

.hero-tagline {
  font-size: clamp(13px, 1.6vw, 15px);
  font-weight: 500;
  color: var(--ink-70);
  letter-spacing: .01em;
  margin-bottom: 14px;
}

.hero-sub {
  font-size: 17px;
  color: var(--text-muted);
  max-width: 480px;
  line-height: 1.6;
  margin-bottom: 32px;
}

.hero-buttons {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 44px;
}

.hero-btn-primary {
  background: var(--navy-fixed);
  color: #fff;
  text-decoration: none;
  padding: 12px 28px;
  border-radius: 999px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: .02em;
  transition: all .25s;
  border: none;
  cursor: pointer;
}

.hero-btn-primary:hover {
  background: var(--navy-mid-fixed);
  transform: translateY(-2px);
  box-shadow: 0 10px 24px rgba(11, 20, 38, .18);
}

.hero-btn-primary:active { transform: translateY(-2px) scale(.97); }

.hero-btn-outline {
  background: var(--surface);
  color: var(--ink);
  text-decoration: none;
  padding: 11px 28px;
  border-radius: 999px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: .02em;
  border: 1px solid var(--hairline);
  transition: all .25s;
}

.hero-btn-outline:hover {
  border-color: color-mix(in srgb, var(--teal) 50%, transparent);
  color: var(--accent-text);
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(11, 20, 38, .08);
}

.hero-btn-outline:active { transform: translateY(-2px) scale(.97); }

.hero-stats {
  display: flex;
  gap: 28px;
  flex-wrap: wrap;
  padding-top: 28px;
  border-top: 1px solid var(--hairline);
}

.hero-stat { display: flex; flex-direction: column; gap: 4px; }

.hero-stat-val {
  font-family: var(--font-mono);
  font-size: 24px;
  font-weight: 500;
  color: var(--accent-text);
  line-height: 1;
}

.hero-stat-lbl {
  font-size: 10px;
  font-family: var(--font-mono);
  color: var(--ink-35);
  text-transform: uppercase;
  letter-spacing: .16em;
  display: flex;
  align-items: center;
  gap: 6px;
}

.hero-stat-sep { width: 1px; background: var(--hairline); align-self: stretch; }

/* Columna derecha: avatar */
.hero-right {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.hero-avatar-ring {
  width: 280px;
  height: 280px;
  border-radius: 50%;
  background: var(--surface);
  padding: 6px;
  border: 1px solid var(--hairline);
  box-shadow: 0 24px 60px rgba(11, 20, 38, .08);
  position: relative;
  z-index: 2;
}

.hero-avatar-ring::before {
  content: '';
  position: absolute;
  inset: -14px;
  border-radius: 50%;
  border: 1px dashed color-mix(in srgb, var(--teal) 35%, transparent);
  animation: spin-slow 30s linear infinite;
}

.hero-avatar-inner {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  overflow: hidden;
  background: var(--navy-fixed);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Insignia circular con logo (index, WRG y EAFIT comparten el mismo tratamiento) */
.hero-avatar-inner.wrg-logo-circle { padding: 24px; }
.wrg-logo-img { width: 74%; height: auto; display: block; margin: 0 auto; }

.hero-badge {
  position: absolute;
  bottom: 8px;
  right: -8px;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 14px;
  padding: 12px 18px;
  text-align: center;
  box-shadow: 0 14px 30px rgba(11, 20, 38, .10);
  z-index: 3;
}

.hero-badge-val {
  font-family: var(--font-mono);
  font-size: 24px;
  font-weight: 500;
  color: var(--accent-text);
  line-height: 1;
}

.hero-badge-lbl {
  font-size: 9.5px;
  font-family: var(--font-mono);
  color: var(--ink-35);
  text-transform: uppercase;
  letter-spacing: .14em;
  margin-top: 3px;
}

/* Insignia "Analítica & IA" del index: ambas palabras con igual peso visual */
.hero-badge-brand .hero-badge-val,
.hero-badge-brand .hero-badge-lbl {
  font-size: 13px;
  font-weight: 600;
  color: var(--accent-text);
  text-transform: uppercase;
  letter-spacing: .06em;
  line-height: 1.3;
  margin-top: 0;
}

/* ── PUNTOS DECORATIVOS: orbitan el avatar CC; al hover forman { } ── */
.avatar-dot-canvas {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
}

/* ── ÓRBITA: satélites de roles alrededor del avatar CC ── */
.orbit-field {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  --orbit-radius: clamp(168px, 20vw, 200px);
}

/* Guía circular punteada del recorrido (puramente decorativa) */
.orbit-field::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: calc(var(--orbit-radius) * 2);
  height: calc(var(--orbit-radius) * 2);
  transform: translate(-50%, -50%);
  border-radius: 50%;
  border: 1px dashed color-mix(in srgb, var(--teal) 16%, transparent);
}

.orbit-ring {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  animation: orbit-spin 80s linear infinite;
}

@keyframes orbit-spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.orbit-sat {
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  /* Posiciona el satélite sobre el círculo; el ángulo también rota con .orbit-ring */
  transform: rotate(var(--angle)) translateX(var(--orbit-radius));
}

.orbit-label {
  position: absolute;
  top: 0;
  left: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1px;
  padding: 6px 11px;
  border-radius: 10px;
  background: var(--pill-bg);
  backdrop-filter: blur(4px);
  border: 1px solid var(--hairline);
  box-shadow: 0 8px 20px rgba(11, 20, 38, .08);
  white-space: nowrap;
  pointer-events: auto;
  transition: border-color .2s, box-shadow .2s, transform .2s;
  /* Contrarrota en el mismo periodo que .orbit-ring (80s) para cancelar tanto
     el giro continuo del anillo como el ángulo estático del satélite, de modo
     que el texto permanezca siempre horizontal a lo largo de toda la órbita. */
  animation: orbit-counter-spin 80s linear infinite;
}

.orbit-label:hover {
  border-color: color-mix(in srgb, var(--teal) 50%, transparent);
  box-shadow: 0 10px 24px rgba(11, 20, 38, .14);
}

@keyframes orbit-counter-spin {
  from { transform: translate(-50%, -50%) rotate(calc(var(--angle) * -1)) rotate(0deg); }
  to { transform: translate(-50%, -50%) rotate(calc(var(--angle) * -1)) rotate(-360deg); }
}

.orbit-role {
  font-size: 10px;
  font-weight: 600;
  color: var(--navy);
  line-height: 1.2;
}

.orbit-skill {
  font-family: var(--font-mono);
  font-size: 8.5px;
  font-weight: 500;
  color: var(--accent-text);
  text-transform: uppercase;
  letter-spacing: .1em;
  line-height: 1.2;
}

@media(max-width: 1020px) {
  .orbit-field { --orbit-radius: clamp(150px, 17vw, 175px); }
}

/* ═══════════════════════════════════════════════════════════════════════
   MANCHA GOOEY DEL AVATAR — masa de manchas fusionándose (filtro SVG "goo":
   blur + contraste de alfa) alrededor del círculo del logo, con sesgo de
   movimiento hacia arriba-derecha y esquive de mouse. Comparte estas clases
   cualquier página con .hero-avatar-ring — el JS (blob-dots.js) solo
   necesita el filtro SVG #goo-teal + el marcado de .blob-field en el HTML.
   Inspirada en el efecto de blob de francoisrisoud.com/about, en teal.
   ═══════════════════════════════════════════════════════════════════════ */
.blob-field {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  overflow: visible;
}

.blob-goo {
  position: absolute;
  inset: 0;
  filter: url(#goo-teal);
}

/* Envoltura de cada mancha: el JS del mouse mueve ESTA capa (repulsión),
   la mancha interior sigue con su propio flotado CSS — así los dos
   movimientos (idle + esquive del mouse) no se pisan entre sí. */
.blob-circle-wrap {
  position: absolute;
  transition: transform .5s cubic-bezier(.22, .9, .32, 1);
  will-change: transform;
}

.blob-circle {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--teal);
  opacity: .85;
}

/* Masa central grande, pegada al cuadrante superior-derecho del anillo
   (se solapa con su borde a propósito, como si "emergiera" del logo);
   cada mancha respira con un recorrido propio y amplio hacia arriba-
   derecha, para que el movimiento se note (no quede plano). */
.blob-c1-wrap { width: 300px; height: 300px; top: -40px; right: -132px; }
.blob-c2-wrap { width: 195px; height: 195px; top: -32px; right: -14px; }
.blob-c3-wrap { width: 145px; height: 145px; top: -97px; right: 22px; }
.blob-c4-wrap { width: 120px; height: 120px; top: -64px; right: 117px; }
.blob-c5-wrap { width: 240px; height: 240px; top: -52px; right: -127px; }
.blob-c6-wrap { width: 100px; height: 100px; top: 12px;  right: 86px; }
.blob-c7-wrap { width: 165px; height: 165px; top: 37px;  right: -127px; }

.blob-c1 { animation: blob-float-1 12s ease-in-out infinite; }
.blob-c2 { animation: blob-float-2 9.5s ease-in-out infinite; animation-delay: -2.4s; }
.blob-c3 { animation: blob-float-3 8s  ease-in-out infinite; animation-delay: -5s; }
.blob-c4 { animation: blob-float-4 10s ease-in-out infinite; animation-delay: -1.2s; }
.blob-c5 { animation: blob-float-5 14s ease-in-out infinite; animation-delay: -7s; }
.blob-c6 { animation: blob-float-6 7.5s ease-in-out infinite; animation-delay: -3.6s; }
.blob-c7 { animation: blob-float-7 11s ease-in-out infinite; animation-delay: -4.4s; }

@keyframes blob-float-1 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  30%      { transform: translate(30px, -36px) scale(1.12); }
  60%      { transform: translate(-12px, -54px) scale(.92); }
  85%      { transform: translate(18px, -14px) scale(1.05); }
}
@keyframes blob-float-2 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  25%      { transform: translate(34px, -24px) scale(1.16); }
  55%      { transform: translate(8px, -44px) scale(.9); }
  80%      { transform: translate(-16px, -8px) scale(1.06); }
}
@keyframes blob-float-3 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  35%      { transform: translate(-22px, -30px) scale(1.14); }
  70%      { transform: translate(14px, -16px) scale(.88); }
}
@keyframes blob-float-4 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  40%      { transform: translate(24px, -38px) scale(1.18); }
  75%      { transform: translate(-14px, -10px) scale(.92); }
}
@keyframes blob-float-5 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  30%      { transform: translate(-16px, -26px) scale(1.08); }
  65%      { transform: translate(20px, -46px) scale(.95); }
  88%      { transform: translate(-8px, -10px) scale(1.03); }
}
@keyframes blob-float-6 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  45%      { transform: translate(30px, -20px) scale(1.22); }
  80%      { transform: translate(-10px, -6px) scale(.86); }
}
@keyframes blob-float-7 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  38%      { transform: translate(-20px, -28px) scale(1.1); }
  72%      { transform: translate(16px, -12px) scale(.9); }
}

.hero-social {
  margin-top: 34px;
  padding-top: 20px;
  border-top: 1px solid var(--hairline);
  display: flex;
  align-items: center;
  gap: 14px;
}

.hero-social-label {
  font-size: 10px;
  font-family: var(--font-mono);
  color: var(--ink-35);
  text-transform: uppercase;
  letter-spacing: .16em;
}

.hero-social a {
  color: var(--ink-35);
  font-size: 15px;
  text-decoration: none;
  transition: color .2s;
  line-height: 1;
}

.hero-social a:hover { color: var(--accent-text); }

@media(max-width: 820px) {
  .hero-inner { padding: 52px 24px; }
}

@media(max-width: 640px) {
  .hero-buttons { flex-direction: column; align-items: stretch; }
  .hero-btn-primary, .hero-btn-outline { width: 100%; text-align: center; }
  .hero-stats { flex-wrap: wrap; }
  .hero-stat-sep { display: none; }
}

/* ── CONTENEDOR PRINCIPAL ── */
.main {
  max-width: 940px;
  margin: 0 auto;
  padding: 72px 40px 96px;
}

/* ── ENCABEZADOS DE SECCIÓN ── */
.section-head { margin-bottom: 32px; }

.section-tag {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--blue);
  margin-bottom: 10px;
}

.section-title {
  font-family: var(--font-sans);
  font-weight: 300;
  font-size: 32px;
  color: var(--navy);
  letter-spacing: -.02em;
  line-height: 1.15;
}

.section-desc {
  font-size: 14.5px;
  color: var(--text-muted);
  margin-top: 8px;
  max-width: 640px;
  line-height: 1.75;
}

.divider { border: none; border-top: 1px solid var(--hairline); margin: 64px 0; }

/* ── TARJETA DE PERFIL (bento card clara) ── */
.profile-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 24px;
  padding: 44px 48px;
  margin-bottom: 56px;
  position: relative;
  overflow: hidden;
  transition: border-color .3s;
}

.profile-card:hover { border-color: var(--hairline-strong); }

.profile-card::after {
  content: '';
  position: absolute;
  top: -80px;
  right: -80px;
  width: 320px;
  height: 320px;
  background: radial-gradient(circle, color-mix(in srgb, var(--teal) 8%, transparent) 0%, transparent 70%);
  pointer-events: none;
}

.profile-top {
  display: flex;
  align-items: flex-start;
  gap: 24px;
  margin-bottom: 28px;
  position: relative;
  z-index: 1;
}

.profile-avatar {
  width: 72px;
  height: 72px;
  border-radius: 22px;
  background: linear-gradient(135deg, var(--teal) 0%, var(--blue) 100%);
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 26px;
  color: var(--white);
  flex-shrink: 0;
  letter-spacing: -1px;
}

.profile-name {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 25px;
  letter-spacing: -.02em;
  color: var(--navy);
  margin-bottom: 4px;
}

.profile-role {
  font-size: 13px;
  color: var(--accent-text);
  font-weight: 500;
  margin-bottom: 10px;
}

.profile-contact { display: flex; gap: 18px; flex-wrap: wrap; }

.profile-contact a, .profile-contact span {
  font-size: 12px;
  color: var(--ink-45);
  text-decoration: none;
  transition: color .2s;
}

.profile-contact a:hover { color: var(--accent-text); }

.profile-bio {
  font-size: 14px;
  color: var(--ink-70);
  line-height: 1.85;
  margin-bottom: 30px;
  position: relative;
  z-index: 1;
  max-width: 800px;
}

.profile-pillars {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
  position: relative;
  z-index: 1;
  margin-bottom: 26px;
}

.pillar {
  background: var(--gray-50);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 18px 20px;
  transform: scale(var(--rv-scale, 1));
}

.pillar:hover { border-color: color-mix(in srgb, var(--teal) 45%, transparent); transform: scale(var(--rv-scale, 1)) translateY(-3px); }

.pillar-icon { font-size: 18px; margin-bottom: 10px; }

.pillar-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--navy);
  margin-bottom: 8px;
  letter-spacing: -.01em;
}

.pillar-items { list-style: none; }

.pillar-items li {
  font-size: 12px;
  color: var(--text-muted);
  padding: 3px 0;
  display: flex;
  align-items: flex-start;
  gap: 6px;
  line-height: 1.5;
}

.pillar-items li::before { content: '·'; color: var(--teal); flex-shrink: 0; }

.profile-skills { position: relative; z-index: 1; }

.profile-skills-label {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--ink-35);
  margin-bottom: 12px;
}

.skill-row { display: flex; gap: 7px; flex-wrap: wrap; }

.skill-tag {
  font-size: 11px;
  padding: 4px 12px;
  border-radius: 999px;
  font-weight: 500;
  font-family: var(--font-mono);
}

.skill-adv {
  background: var(--accent-soft);
  color: var(--accent-text);
  border: 1px solid color-mix(in srgb, var(--teal) 30%, transparent);
}

.skill-mid {
  background: var(--gray-50);
  color: var(--gray-700);
  border: 1px solid var(--hairline);
}

/* ── COMPETENCIAS PROFESIONALES ── */
.competencies-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
  position: relative;
  z-index: 1;
}

.competency-card {
  background: var(--gray-50);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 18px 20px;
  transition: border-color .25s, transform .25s;
  transform: scale(var(--rv-scale, 1));
}

.competency-card:hover { border-color: color-mix(in srgb, var(--teal) 45%, transparent); transform: scale(var(--rv-scale, 1)) translateY(-3px); }

.competency-icon { font-size: 18px; margin-bottom: 10px; }

.competency-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--navy);
  margin-bottom: 6px;
  letter-spacing: -.01em;
}

.competency-desc { font-size: 12px; color: var(--text-muted); line-height: 1.6; }

/* ── ROLES ── */
.roles-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-top: 4px;
}

.role-box {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 26px 28px;
  transition: border-color .25s, transform .25s;
  transform: scale(var(--rv-scale, 1));
}

.role-box:hover { border-color: var(--hairline-strong); transform: scale(var(--rv-scale, 1)) translateY(-3px); }

.role-box-head {
  font-size: 13px;
  font-weight: 600;
  color: var(--navy);
  margin-bottom: 14px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--hairline);
  display: flex;
  align-items: center;
  gap: 8px;
}

.role-list { list-style: none; }

.role-list li {
  font-size: 13.5px;
  color: var(--text-muted);
  padding: 7px 0;
  border-bottom: 1px dashed var(--gray-100);
  display: flex;
  align-items: center;
  gap: 8px;
}

.role-list li:last-child { border-bottom: none; }

.role-list li::before {
  content: '·';
  color: var(--teal);
  font-size: 18px;
  font-weight: bold;
  line-height: 1;
}

/* ── LOGROS ── */
.logros-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px;
}

.logro-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 26px;
  transition: border-color .25s, transform .25s, box-shadow .25s;
  transform: scale(var(--rv-scale, 1));
}

.logro-card:hover {
  border-color: var(--hairline-strong);
  transform: scale(var(--rv-scale, 1)) translateY(-3px);
  box-shadow: 0 14px 30px rgba(11, 20, 38, .06);
}

.logro-icon {
  width: 40px;
  height: 40px;
  border-radius: 12px;
  background: var(--accent-soft);
  border: 1px solid color-mix(in srgb, var(--teal) 20%, transparent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 17px;
  margin-bottom: 16px;
}

.logro-icon.blue-bg { background: rgba(26, 86, 232, .08); border-color: rgba(26, 86, 232, .18); }
.logro-icon.amber-bg { background: var(--amber-soft); border-color: rgba(245, 166, 35, .3); }

.logro-title {
  font-size: 14px;
  font-weight: 600;
  color: var(--navy);
  margin-bottom: 6px;
  letter-spacing: -.01em;
}

.logro-desc { font-size: 13px; color: var(--text-muted); line-height: 1.7; }

.logro-clients { margin-top: 14px; display: flex; flex-wrap: wrap; gap: 6px; }

.client-chip {
  font-size: 10.5px;
  font-family: var(--font-mono);
  background: var(--gray-50);
  border: 1px solid var(--hairline);
  color: var(--gray-700);
  padding: 3px 10px;
  border-radius: 999px;
  font-weight: 500;
  letter-spacing: .04em;
}

/* ── DOCENCIA ── */
.docencia-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
}

.docencia-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 26px;
  transition: border-color .25s, transform .25s;
  transform: scale(var(--rv-scale, 1));
}

.docencia-card:hover { border-color: var(--hairline-strong); transform: scale(var(--rv-scale, 1)) translateY(-3px); }

.docencia-label {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--blue);
  margin-bottom: 6px;
}

.docencia-title {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 19px;
  letter-spacing: -.01em;
  color: var(--navy);
  margin-bottom: 10px;
}

.docencia-desc { font-size: 13px; color: var(--text-muted); line-height: 1.7; margin-bottom: 14px; }

.subject-chips { display: flex; flex-wrap: wrap; gap: 5px; }

.subject-chip {
  font-size: 11px;
  background: rgba(26, 86, 232, .06);
  border: 1px solid rgba(26, 86, 232, .15);
  color: var(--blue);
  padding: 3px 10px;
  border-radius: 999px;
  font-weight: 500;
}

/* ── HABILIDADES ── */
.skills-groups {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
}

.skills-group {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 24px 26px;
  transition: border-color .25s;
}

.skills-group:hover { border-color: var(--hairline-strong); }

.skills-group-label {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gray-400);
  margin-bottom: 14px;
}

.skills-tags { display: flex; flex-wrap: wrap; gap: 6px; }

.stag {
  font-size: 11.5px;
  padding: 5px 12px;
  border-radius: 999px;
  font-weight: 500;
  font-family: var(--font-mono);
}

.stag-teal {
  background: var(--accent-soft);
  color: var(--accent-text);
  border: 1px solid color-mix(in srgb, var(--teal) 30%, transparent);
}

.stag-blue {
  background: rgba(26, 86, 232, .07);
  color: var(--blue);
  border: 1px solid rgba(26, 86, 232, .15);
}

.stag-gray {
  background: var(--gray-50);
  color: var(--gray-700);
  border: 1px solid var(--hairline);
}

/* ── HABILIDADES: ACORDEÓN DE TECNOLOGÍAS POR CATEGORÍA ── */
.tech-accordion {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.tech-category {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  overflow: hidden;
  transition: border-color .25s, transform .2s ease;
  transform: scale(var(--rv-scale, 1));
}

.tech-category:hover { border-color: var(--hairline-strong); }
.tech-category[open] { border-color: color-mix(in srgb, var(--teal) 35%, transparent); }

.tech-category-summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 20px 24px;
  -webkit-user-select: none;
  user-select: none;
}

.tech-category-summary::-webkit-details-marker { display: none; }
.tech-category-summary::marker { content: ''; }

.tech-category-icon {
  font-size: 18px;
  width: 40px;
  height: 40px;
  border-radius: 12px;
  background: var(--accent-soft);
  border: 1px solid color-mix(in srgb, var(--teal) 20%, transparent);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.tech-category-name {
  font-size: 14.5px;
  font-weight: 600;
  color: var(--navy);
  flex: 1;
  letter-spacing: -.01em;
}

.tech-category-chevron {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--accent-soft);
  border: 1px solid color-mix(in srgb, var(--teal) 35%, transparent);
  color: var(--accent-text);
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  transition: background .25s, transform .25s;
}

.tech-category-chevron::before { content: '+'; }

.tech-category[open] .tech-category-chevron {
  background: var(--teal);
  color: var(--white);
  transform: rotate(180deg);
}

.tech-category[open] .tech-category-chevron::before { content: '−'; }

.tech-category-body {
  padding: 4px 24px 24px;
  border-top: 1px solid var(--hairline);
}

.tech-subgrid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 12px;
  margin-top: 16px;
}

.tech-subcard {
  background: var(--gray-50);
  border: 1px solid var(--hairline);
  border-radius: 12px;
  padding: 16px 18px;
  transition: border-color .25s, transform .25s;
}

.tech-subcard:hover { border-color: color-mix(in srgb, var(--teal) 35%, transparent); transform: translateY(-2px); }

.tech-subcard-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--navy);
  margin-bottom: 10px;
}

.level-meter {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 12px;
}

.level-dots { display: flex; gap: 3px; }

.level-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--gray-200);
}

.level-dot.filled { background: var(--teal); }

.level-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--gray-400);
  font-weight: 500;
}

.tech-subcard .skills-tags { margin-top: 2px; }

.tech-subcard-desc { font-size: 11.5px; color: var(--text-muted); line-height: 1.5; margin-top: 2px; }

@media(max-width: 640px) {
  .tech-category-summary { padding: 16px 18px; gap: 10px; }
  .tech-category-body { padding: 4px 18px 18px; }
}

/* ── CERTIFICACIONES ── */
.certs-row { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 4px; }

.cert-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 20px 24px;
  display: flex;
  align-items: center;
  gap: 14px;
  flex: 1;
  min-width: 240px;
  transition: border-color .25s, transform .25s;
  transform: scale(var(--rv-scale, 1));
}

.cert-card:hover { border-color: var(--hairline-strong); transform: scale(var(--rv-scale, 1)) translateY(-3px); }

.cert-icon {
  width: 44px;
  height: 44px;
  border-radius: 12px;
  background: var(--amber-soft);
  border: 1px solid rgba(245, 166, 35, .3);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 19px;
  flex-shrink: 0;
}

.cert-name { font-size: 14px; font-weight: 600; color: var(--navy); margin-bottom: 2px; }
.cert-detail { font-size: 12px; color: var(--text-muted); }

/* Certificaciones enlazadas (tarjeta clicable con insignia SVG) */
.cert-link {
  text-decoration: none;
  align-items: flex-start;
  cursor: pointer;
}

.cert-link:hover {
  border-color: color-mix(in srgb, var(--teal) 50%, transparent);
  transform: translateY(-3px);
  box-shadow: 0 14px 30px rgba(11, 20, 38, .07);
}

.cert-badge {
  width: 52px;
  height: 52px;
  border-radius: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  padding: 10px;
}

.cert-badge svg { width: 100%; height: auto; display: block; }

.cert-badge-teal { background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--teal) 30%, transparent); }
.cert-badge-blue { background: rgba(26, 86, 232, .07); border: 1px solid rgba(26, 86, 232, .18); }

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

.cert-link .cert-name { font-size: 13.5px; line-height: 1.45; }

.cert-meta {
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--ink-35);
  letter-spacing: .04em;
}

.cert-cta {
  font-size: 12px;
  font-weight: 600;
  color: var(--accent-text);
  margin-top: 6px;
}

.cert-link:hover .cert-cta { text-decoration: underline; }

/* ── CTA BANNER ── */
.cta-banner {
  background: var(--navy-fixed);
  border-radius: 24px;
  padding: 52px 48px;
  position: relative;
  overflow: hidden;
  text-align: center;
}

.cta-banner::before {
  content: '';
  position: absolute;
  top: -100px;
  right: -100px;
  width: 380px;
  height: 380px;
  background: radial-gradient(circle, color-mix(in srgb, var(--teal) 14%, transparent) 0%, transparent 70%);
  pointer-events: none;
}

.cta-banner h2 {
  font-family: var(--font-sans);
  font-weight: 300;
  font-size: 30px;
  letter-spacing: -.02em;
  color: var(--white);
  margin-bottom: 10px;
  position: relative;
  z-index: 1;
}

.cta-banner p {
  font-size: 14.5px;
  color: rgba(255, 255, 255, .55);
  margin-bottom: 30px;
  position: relative;
  z-index: 1;
}

.cta-buttons {
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
  position: relative;
  z-index: 1;
}

.btn-primary {
  background: var(--teal);
  color: var(--navy-fixed);
  text-decoration: none;
  padding: 12px 26px;
  border-radius: 999px;
  font-size: 13.5px;
  font-weight: 700;
  transition: opacity .2s, transform .2s;
}

.btn-primary:hover { opacity: .88; transform: translateY(-2px); }

.btn-secondary {
  background: rgba(255, 255, 255, .08);
  color: var(--white);
  text-decoration: none;
  padding: 12px 26px;
  border-radius: 999px;
  font-size: 13.5px;
  font-weight: 500;
  border: 1px solid rgba(255, 255, 255, .18);
  transition: background .2s, transform .2s;
}

.btn-secondary:hover { background: rgba(255, 255, 255, .14); transform: translateY(-2px); }

/* ── CONTROLES (búsqueda y filtros — dashboards / tendencias) ── */
.search-input {
  width: 100%;
  padding: 13px 16px 13px 44px;
  border: 1px solid var(--hairline);
  border-radius: 999px;
  font-family: inherit;
  font-size: 14px;
  background: var(--surface);
  color: var(--ink);
  outline: none;
  transition: border-color .2s, box-shadow .2s;
}

.search-input:focus {
  border-color: var(--teal);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--teal) 12%, transparent);
}

.search-input::placeholder { color: var(--ink-35); }

.search-icon {
  position: absolute;
  left: 17px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--ink-35);
  font-size: 15px;
}

/* Filtros: dos grupos independientes — Categoría (única, siempre visible) y
   Tema (multi-select, solo aparece tras elegir una categoría). Cada grupo
   lleva su título y un divisor los separa visualmente como filtros distintos. */
.filters { display: flex; flex-direction: column; gap: 12px; }
.filter-group { display: flex; flex-direction: column; gap: 8px; }
.filter-group-title {
  font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em;
  color: var(--gray-400);
}
.filter-divider { height: 1px; background: var(--hairline); margin: 2px 0; }
.filter-row { display: flex; gap: 8px; flex-wrap: wrap; }

.filter-btn {
  background: var(--surface);
  border: 1px solid var(--hairline);
  padding: 9px 20px;
  border-radius: 999px;
  font-size: 12.5px;
  font-weight: 500;
  cursor: pointer;
  transition: all .2s;
  font-family: inherit;
  color: var(--ink-70);
}

.filter-btn:hover { border-color: color-mix(in srgb, var(--teal) 50%, transparent); color: var(--accent-text); }

.filter-btn.active {
  background: var(--navy-fixed);
  color: var(--white);
  border-color: var(--navy-fixed);
}

/* Categoría Principal activa: usa su propio color en vez del navy genérico,
   para que el usuario asocie color -> categoría en todo el sitio. */
.filter-btn-cat.active {
  background: var(--chip-color, var(--navy-fixed));
  border-color: var(--chip-color, var(--navy-fixed));
  color: var(--chip-text-color, var(--white));
}

/* Tema: chip secundario, mismo color que la categoría pero más claro (tint) —
   deliberadamente distinto del chip de categoría para que se lea como un nivel jerárquico menor. */
.filter-btn-tema {
  padding: 7px 16px;
  font-size: 11.5px;
  background: color-mix(in srgb, var(--chip-color, var(--teal)) 10%, var(--surface));
  border-color: color-mix(in srgb, var(--chip-color, var(--teal)) 30%, var(--hairline));
  color: color-mix(in srgb, var(--chip-color, var(--teal)) 75%, var(--ink));
}
.filter-btn-tema.active {
  background: var(--chip-color, var(--teal));
  border-color: var(--chip-color, var(--teal));
  color: var(--white);
}

.sort-container {
  display: flex;
  align-items: center;
  gap: 10px;
  align-self: flex-end;
}

.sort-select {
  padding: 8px 14px;
  border-radius: 999px;
  border: 1px solid var(--hairline);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 13px;
  outline: none;
  cursor: pointer;
}

/* ── GRID DE DASHBOARDS ── */
.dashboards-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 20px;
}

.dash-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 20px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform .3s, box-shadow .3s, border-color .3s;
}

.dash-card:hover {
  transform: translateY(-5px);
  box-shadow: 0 20px 44px rgba(11, 20, 38, .09);
  border-color: var(--hairline-strong);
}

.dash-img-container {
  width: 100%;
  height: 190px;
  position: relative;
  background: var(--gray-100);
  border: none;
  border-bottom: 1px solid var(--hairline);
  padding: 0;
  overflow: hidden;
  cursor: pointer;
  font: inherit;
}

.dash-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity .3s, transform .5s;
}

.dash-img-overlay {
  position: absolute;
  inset: 0;
  background: var(--nav-bg);
  backdrop-filter: blur(2px);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transition: opacity .3s;
  color: var(--navy);
  font-weight: 600;
  font-size: 13px;
  gap: 8px;
}

.dash-img-container:hover .dash-img { transform: scale(1.04); }
.dash-img-container:hover .dash-img-overlay { opacity: 1; }

.dash-content { padding: 24px; flex: 1; display: flex; flex-direction: column; }

.dash-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  margin-bottom: 14px;
  gap: 12px;
}

.dash-tech-tag {
  font-size: 10px;
  font-family: var(--font-mono);
  font-weight: 600;
  padding: 4px 11px;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: .08em;
  white-space: nowrap;
}

.tech-pbi { background: var(--amber-soft); color: #B97700; border: 1px solid rgba(245, 166, 35, .3); }
.tech-mstr { background: rgba(217, 35, 46, .08); color: var(--mstr-color); border: 1px solid rgba(217, 35, 46, .2); }
.tech-tableau { background: rgba(233, 118, 39, .1); color: var(--tableau-color); border: 1px solid rgba(233, 118, 39, .3); }

.dash-logo { height: 22px; max-width: 100px; object-fit: contain; }

.dash-title {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 19px;
  letter-spacing: -.01em;
  color: var(--navy);
  margin-bottom: 8px;
  line-height: 1.25;
}

.dash-objective {
  font-size: 12px;
  font-weight: 600;
  color: var(--accent-text);
  margin-bottom: 12px;
  display: flex;
  align-items: center;
  gap: 6px;
}

.dash-desc {
  font-size: 13.5px;
  color: var(--text-muted);
  line-height: 1.65;
  margin-bottom: 24px;
  flex: 1;
}

.dash-action {
  background: var(--navy-fixed);
  color: var(--white);
  text-align: center;
  padding: 11px 16px;
  border-radius: 999px;
  font-size: 13px;
  font-weight: 500;
  transition: background .2s;
  width: 100%;
  border: none;
  cursor: pointer;
  font-family: inherit;
}

.dash-action:hover { background: var(--blue); }
.dash-action[disabled] { opacity: .35; cursor: not-allowed; }

/* ── FEED DE TENDENCIAS ── */
.feed-grid { display: flex; flex-direction: column; gap: 28px; }

/* ── PAGINACIÓN DEL FEED ── */
.pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 40px;
}

.page-btn {
  background: var(--surface);
  border: 1px solid var(--hairline);
  min-width: 38px;
  height: 38px;
  padding: 0 12px;
  border-radius: 999px;
  font-size: 12.5px;
  font-weight: 500;
  font-family: inherit;
  color: var(--ink-70);
  cursor: pointer;
  transition: all .2s;
}

.page-btn:hover:not(:disabled) { border-color: color-mix(in srgb, var(--teal) 50%, transparent); color: var(--accent-text); }

.page-btn.active {
  background: var(--navy-fixed);
  color: var(--white);
  border-color: var(--navy-fixed);
  cursor: default;
}

.page-btn:disabled { opacity: .4; cursor: not-allowed; }

.page-btn.page-nav { padding: 0 16px; }

.page-ellipsis {
  color: var(--ink-35);
  padding: 0 4px;
  font-family: var(--font-mono);
  font-size: 13px;
}

.pub-image-btn {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  cursor: pointer;
  display: block;
  outline: none;
  color: inherit;
  text-align: inherit;
}

.pub-image-btn:focus-visible {
  outline: 2px solid var(--teal);
  outline-offset: 4px;
  border-radius: 4px;
}

.pub-card {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 20px;
  overflow: hidden;
  display: flex;
  flex-direction: column; /* Stack vertically */
  box-shadow: none;
  transition: transform .3s ease, box-shadow .3s ease, border-color .3s ease;
  /* Antes: animation: fadeIn .6s forwards; opacity: 0; con animation-delay
     escalonado por tarjeta (ver Tendencias.html, renderFeed). El navegador
     no cuenta un elemento como "pintado" mientras opacity:0, así que la
     tarjeta LCP (la primera del feed) esperaba a que terminara su propio
     fade-in — quitado para que el feed pinte de inmediato. */
}

.pub-card:hover {
  transform: translateY(-5px);
  box-shadow: 0 20px 44px rgba(11, 20, 38, .08);
  border-color: color-mix(in srgb, var(--teal) 45%, transparent);
}

.pub-img-container {
  width: 100%;
  /* Las 109 imágenes de publicaciones se generan siempre a 2400×1254 (ver
     scripts/generar-imagen-publicacion o similar) — reservar ese ratio
     evita el salto de layout al cargar cada imagen (antes: CLS 0.27 en
     móvil, ver Speed Insights). */
  aspect-ratio: 2400 / 1254;
  position: relative;
  background: var(--gray-100);
  overflow: hidden;
  cursor: zoom-in;
  display: flex;
}

.pub-img { width: 100%; height: 100%; object-fit: contain; transition: transform .5s ease; }
.pub-img-container:hover .pub-img { transform: scale(1.04); }

.pub-new-badge {
  position: absolute;
  top: 10px;
  left: 10px;
  background: #FFD400;
  color: #0B1426;
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.3px;
  text-transform: uppercase;
  padding: 3px 9px;
  border-radius: 999px;
  box-shadow: 0 2px 6px rgba(11, 20, 38, 0.25);
  pointer-events: none;
  z-index: 2;
}

/* Badge de conteo (círculo amarillo) sobre el enlace a Tendencias, cuando hay publicaciones de hoy */
.tendencias-badge {
  position: absolute;
  top: -8px;
  right: -10px;
  background: #FFD400;
  color: #0B1426;
  font-size: 11px;
  font-weight: 800;
  min-width: 18px;
  height: 18px;
  padding: 0 4px;
  border-radius: 999px;
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  box-shadow: 0 1px 4px rgba(11, 20, 38, 0.3);
}

.pub-content {
  width: 100%;
  padding: 40px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.pub-temas-container {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 12px;
}

/* Categoría Principal: chip sólido en la paleta navy/teal ya usada en todo el
   sitio (no el color por categoría de los filtros) — así el feed se mantiene
   consistente en vez de verse como un arcoíris al mezclar categorías. Es el
   nivel jerárquico superior, por eso lleva más peso visual que los temas. */
.pub-categoria {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 11px;
  color: var(--white);
  background: var(--navy-fixed);
  padding: 3px 11px;
  border-radius: 999px;
  white-space: nowrap;
}

/* Tema: mismo color por categoría que ya se usa en los chips de filtro
   (--chip-color), en tinta — la diferencia de peso visual frente a
   .pub-categoria (sólido, navy) es lo que comunica la jerarquía
   categoría > tema, no el color en sí. */
.pub-tema {
  font-family: var(--font-mono);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: .12em;
  color: color-mix(in srgb, var(--chip-color, var(--teal)) 80%, var(--ink));
  background: color-mix(in srgb, var(--chip-color, var(--teal)) 12%, transparent);
  padding: 3px 9px;
  border-radius: 999px;
}

.pub-tipo-badge {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 10.5px;
  color: var(--ink-70);
  border: 1px solid var(--hairline);
  padding: 2px 10px;
  border-radius: 999px;
}

.pub-topico {
  font-family: var(--font-sans);
  font-weight: 300;
  font-size: 27px;
  letter-spacing: -.02em;
  color: var(--navy);
  line-height: 1.2;
  margin-bottom: 18px;
}

.pub-desc {
  font-size: 15px;
  color: var(--ink-70);
  line-height: 1.85;
  white-space: pre-wrap;
  margin-bottom: 24px;
  flex: 1;
}

.pub-actions {
  display: flex;
  gap: 16px;
  border-top: 1px solid var(--hairline);
  padding-top: 16px;
  margin-top: auto;
}

.action-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: transparent;
  border: none;
  color: var(--gray-400);
  font-size: 13px;
  font-weight: 500;
  font-family: var(--font-mono);
  cursor: pointer;
  transition: all .2s;
}

.action-btn.no-hover { cursor: default; }
.action-btn:not(.no-hover):hover { color: var(--navy); transform: translateY(-1px); }
.action-btn.liked { color: #e63946; }
.action-btn .icon { font-size: 15px; }

.share-container { position: relative; }

.share-menu {
  position: absolute;
  bottom: 100%;
  left: 0;
  margin-bottom: 8px;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 12px;
  box-shadow: 0 12px 28px rgba(11, 20, 38, .12);
  display: flex;
  flex-direction: column;
  min-width: 170px;
  opacity: 0;
  pointer-events: none;
  transform: translateY(10px);
  transition: all .2s;
  z-index: 10;
  overflow: hidden;
}

.share-menu.active { opacity: 1; pointer-events: auto; transform: translateY(0); }

.share-menu button {
  background: transparent;
  border: none;
  padding: 10px 16px;
  text-align: left;
  font-family: inherit;
  font-size: 13px;
  cursor: pointer;
  color: var(--ink);
  transition: background .2s, color .2s;
}

.share-menu button:hover { background: var(--gray-50); color: var(--accent-text); }

.empty-state {
  text-align: center;
  padding: 60px 20px;
  color: var(--gray-400);
  font-size: 16px;
}

/* ── MODALES (galería / imagen) ── */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: var(--nav-bg);
  backdrop-filter: blur(10px);
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s ease;
}

.modal-overlay.active { opacity: 1; pointer-events: auto; }

.modal-content {
  position: relative;
  max-width: 90vw;
  max-height: 90vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  cursor: default;
}

.modal-header {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: var(--navy);
  margin-bottom: 15px;
}

.modal-title {
  font-family: var(--font-sans);
  font-weight: 400;
  letter-spacing: -.01em;
  font-size: 22px;
}

.modal-counter { font-family: var(--font-mono); font-size: 12px; color: var(--ink-45); }

.modal-img-wrapper {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.modal-img {
  max-width: 100%;
  max-height: 78vh;
  border-radius: 16px;
  border: 1px solid var(--hairline);
  box-shadow: 0 30px 70px rgba(11, 20, 38, .20);
  object-fit: contain;
  transition: opacity .2s, transform .3s ease;
}

.modal-overlay.active .modal-img { transform: scale(1); }

.modal-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: var(--surface);
  border: 1px solid var(--hairline);
  color: var(--navy);
  width: 44px;
  height: 44px;
  border-radius: 50%;
  font-size: 18px;
  cursor: pointer;
  transition: all .2s;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 8px 20px rgba(11, 20, 38, .10);
}

.modal-btn:hover { background: var(--teal); color: var(--navy-fixed); border-color: var(--teal); }

.modal-prev { left: -60px; }
.modal-next { right: -60px; }

.modal-close {
  background: transparent;
  color: var(--ink-45);
  border: none;
  font-size: 26px;
  cursor: pointer;
  transition: color .2s;
  line-height: 1;
}

.modal-close:hover { color: var(--accent-text); }

.close-modal {
  position: absolute;
  top: -40px;
  right: 0;
  color: var(--ink-45);
  font-size: 28px;
  cursor: pointer;
  font-weight: 300;
  transition: color .2s;
  background: none;
  border: none;
}

.close-modal:hover { color: var(--accent-text); }

/* ── TOAST ── */
.toast-container {
  position: fixed;
  bottom: 40px;
  left: 50%;
  transform: translateX(-50%) translateY(100px);
  background: var(--navy-fixed);
  color: var(--white);
  padding: 12px 24px;
  border-radius: 999px;
  font-size: 13.5px;
  font-weight: 500;
  box-shadow: 0 14px 34px rgba(11, 20, 38, .25);
  z-index: 2000;
  transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  display: flex;
  align-items: center;
  gap: 10px;
  pointer-events: none;
}

.toast-container.active { transform: translateX(-50%) translateY(0); }

.toast-icon { color: var(--teal); font-size: 17px; }

/* ── WHATSAPP FLOAT (verde de marca, intacto) ── */
.wa-float {
  position: fixed;
  bottom: 28px;
  right: 28px;
  z-index: 999;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: #25D366;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 20px rgba(37, 211, 102, .4);
  transition: transform .2s;
  text-decoration: none;
}

.wa-float:hover { transform: scale(1.08); }

.wa-float svg { width: 26px; height: 26px; fill: white; }

/* ── BOTÓN FLOTANTE "COMPARTIR" (solo se inyecta por JS en móvil/tablet,
   ver initShareButton() en core.js) — mismo patrón que .wa-float (que hoy
   no se usa en ninguna página activa del sitio), esquina inferior derecha.
   En páginas con la barra fija .index2-stickybar (index.html, Perfil.html)
   se empuja hacia arriba con :has() para no quedar tapado por ella. */
.site-share-btn {
  position: fixed;
  bottom: 28px;
  right: 28px;
  z-index: 999;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: var(--teal);
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 20px rgba(0, 201, 167, .4);
  transition: transform .2s;
  cursor: pointer;
  padding: 0;
}

.site-share-btn:hover { transform: scale(1.08); }
.site-share-btn:active { transform: scale(.96); }

.site-share-btn svg { width: 22px; height: 22px; stroke: var(--navy-fixed); }

body:has(.index2-stickybar) .site-share-btn { bottom: 92px; }

@media (min-width: 900px) {
  .site-share-btn { display: none; }
}

/* ── BUSCADOR GLOBAL (overrides sobre site-search.js) ── */
body .site-search-modal { background: var(--nav-bg); backdrop-filter: blur(8px); }

body .site-search-panel {
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: 20px;
  box-shadow: 0 30px 70px rgba(11, 20, 38, .16);
  color: var(--ink);
}

body .site-search-input {
  border: 1px solid var(--hairline);
  border-radius: 999px;
  font-family: inherit;
}

body .site-search-input:focus {
  border-color: var(--teal);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--teal) 12%, transparent);
}

body .site-search-result {
  background: var(--gray-50);
  border: 1px solid var(--hairline);
  border-radius: 14px;
  color: var(--ink);
}

body .site-search-result:hover { background: var(--gray-100); border-color: color-mix(in srgb, var(--teal) 50%, transparent); }
body .site-search-result span { color: var(--text-muted); }
body .site-search-close { color: var(--ink-45); }

/* ── ACCESIBILIDAD / UTILIDADES ── */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

:focus-visible { outline: 2px solid var(--teal); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ── RESPONSIVE GENERAL ── */
@media(max-width: 820px) {
  .pub-content { padding: 30px 24px; }
  .sort-container { align-self: stretch; justify-content: space-between; }
  .modal-prev { left: 10px; }
  .modal-next { right: 10px; }
}

@media(max-width: 640px) {
  .main { padding: 44px 20px 64px; }
  .hero-inner { padding: 48px 20px; }
  .profile-card, .cta-banner { padding: 28px 22px; }
  .profile-top { flex-direction: column; }
  .roles-grid { grid-template-columns: 1fr; }
  .hero h1 { font-size: 32px; }
}

/* Letra mínima legible en teléfonos: varias etiquetas mono quedaban en 9-10px */
@media(max-width: 480px) {
  body { font-size: 15.5px; }
  .section-tag, .docencia-label, .hero-stat-lbl, .hero-meta-lbl,
  .level-label, .client-chip, .subject-chip,
  .skill-tag, .stag { font-size: 11px; }
  .section-desc, .pillar-items li, .tech-subcard-desc, .loss-item-desc { font-size: 13px; }
  .tech-subcard-title, .pillar-title, .role-box-head { font-size: 13.5px; }
}
