/* ============================================================
   GeoNet Red CORS — estilos de aplicación
   Requiere: geonet-tokens.css (v2)
   Tema: [data-theme="dark"] declarado en <html>
   ============================================================ */

/* -------------------------------------------------------
   Base y reset
   (consolidado desde geonet-tokens v1 + app.css original)
   ------------------------------------------------------- */

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

html { scroll-behavior: smooth; }

body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  color: var(--text);
  font-family: var(--geo-font-ui);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

main { flex: 1; }
img  { max-width: 100%; }
h1, h2, h3 { line-height: 1.15; }

a       { color: var(--link); text-decoration: none; }
a:hover { color: var(--link-hover); }

:focus-visible { outline: none; box-shadow: var(--focus-ring); }

/* -------------------------------------------------------
   Tipografía utilitaria
   ------------------------------------------------------- */

.gn-display {
  font-family: var(--geo-font-brand);
  font-weight: 800;
  letter-spacing: -0.02em;
  line-height: 1.02;
  font-size: clamp(2.4rem, 6vw, 4.5rem);
}

/* Texto de acento — sustituye al degradado de texto v1.
   Sin background-clip. Color sólido var(--accent) en dark. */
.gn-gradient-text { color: var(--accent); }

/* Micro-label UPPERCASE */
.gn-eyebrow {
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: var(--geo-text-caption);
  font-weight: 600;
  color: var(--text-faint);
}

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

/* -------------------------------------------------------
   Fondo de página
   ------------------------------------------------------- */

/* Reemplaza el fondo radial de v1 (hex prohibidos) por sólido. */
.gn-bg-gradient { background: var(--surface); }

/* -------------------------------------------------------
   Botones (pill)
   ------------------------------------------------------- */

.gn-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 12px 22px;
  border-radius: var(--geo-radius-full);
  font-family: var(--geo-font-ui);
  font-weight: 700;
  font-size: 0.95rem;
  cursor: pointer;
  border: 1px solid transparent;
  transition: transform .15s ease, box-shadow .2s ease, background .2s ease, border-color .2s ease;
}
.gn-btn:active { transform: translateY(1px); }

/* Primary y brand: idénticos, sólido índigo — sin degradado */
.gn-btn--primary,
.gn-btn--brand        { background: var(--primary); color: var(--on-primary); }
.gn-btn--primary:hover,
.gn-btn--brand:hover  { background: var(--primary-hover); }

.gn-btn--ghost        { background: transparent; color: var(--text); border-color: var(--border-strong); }
.gn-btn--ghost:hover  { border-color: var(--accent); color: var(--accent); }

/* -------------------------------------------------------
   Cards / superficies
   ------------------------------------------------------- */

.gn-card {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  border-radius: var(--geo-radius-lg);
  box-shadow: var(--geo-shadow-md);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  padding: 24px;
}
.gn-card--solid {
  background: var(--surface-2);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
a.gn-card h3 { color: var(--text); }

/* Navbar flotante tipo pill */
.gn-navbar {
  display: flex; align-items: center; gap: 20px;
  flex-wrap: nowrap;            /* el nav no se parte en dos renglones */
  padding: 12px 20px;
  border-radius: var(--geo-radius-full);
  background: var(--glass-bg);
  border: 1px solid var(--border);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
}

/* -------------------------------------------------------
   Inputs
   ------------------------------------------------------- */

.gn-input {
  width: 100%;
  padding: 12px 14px;
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  color: var(--text);
  font-family: var(--geo-font-ui);
  font-size: 0.95rem;
  outline: none;
  transition: border-color .2s ease, box-shadow .2s ease;
}
.gn-input::placeholder { color: var(--text-faint); }
.gn-input:focus        { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(24,66,240,0.20); }

/* -------------------------------------------------------
   Badges / chips
   ------------------------------------------------------- */

.gn-badge {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 12px;
  border-radius: var(--geo-radius-full);
  font-size: 0.78rem; font-weight: 600;
  border: 1px solid var(--border);
}
.gn-badge--available { background: rgba(18,183,106,0.15); color: var(--status-fix-fg);   border-color: rgba(18,183,106,0.35); }
.gn-badge--info      { background: rgba(24,66,240,0.15);  color: var(--geo-indigo-200);         border-color: rgba(24,66,240,0.35); }

.gn-chip {
  display: inline-flex; flex-direction: column; gap: 2px;
  padding: 10px 16px;
  border-radius: var(--geo-radius-full);
  background: rgba(255,255,255,0.04);
  border: 1px solid var(--border);
}
.gn-chip__label { font-size: var(--geo-text-caption); letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-faint); }
.gn-chip__value { font-size: 0.9rem; font-weight: 700; }

/* -------------------------------------------------------
   Utilidades
   ------------------------------------------------------- */

.gn-divider   { height: 1px; background: var(--border); border: 0; margin: 20px 0; }
.gn-container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }

.gn-reveal              { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; }
.gn-reveal.is-visible   { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .gn-reveal { opacity: 1; transform: none; transition: none; }
}

/* ============================================================
   App shell
   ============================================================ */

.gn-btn--sm     { padding: 8px 16px; font-size: 0.85rem; }
.gn-btn--lg     { padding: 15px 30px; font-size: 1.05rem; }
.gn-btn--danger { background: var(--geo-status-nosignal-base); color: #fff; }

.gn-linklike        { background: none; border: 0; color: var(--link); cursor: pointer; font: inherit; padding: 0; }
.gn-linklike:hover  { color: var(--link-hover); }

/* ---------- Header / navbar pill flotante ---------- */
.gn-header   { position: sticky; top: 12px; z-index: 1000; padding: 0 16px; }
/* nowrap, no wrap: esta regla es la que partía el nav en dos renglones a
   1568 px. Vuelve a wrap sólo dentro del breakpoint de 1180 px, ya con el
   menú colapsado en hamburguesa. */
.gn-nav-main { max-width: 1280px; margin: 0 auto; flex-wrap: nowrap; }
.gn-brand    { display: inline-flex; align-items: center; gap: 8px; }

.gn-nav-links   { display: flex; gap: 2px; flex: 1; }
.gn-nav-links a { color: var(--text-muted); font-size: 0.88rem; font-weight: 600; padding: 8px 9px; border-radius: var(--geo-radius-full); white-space: nowrap; }
.gn-nav-links a:hover  { color: var(--text); background: rgba(255,255,255,0.05); }
.gn-nav-links a.active { color: var(--text); background: rgba(24,66,240,0.18); }

.gn-nav-actions  { display: flex; align-items: center; gap: 10px; }
.gn-nav-search input { width: 150px; padding: 8px 12px; font-size: 0.82rem; border-radius: var(--geo-radius-full); }
.gn-cart-link    { position: relative; font-size: 1.1rem; text-decoration: none; }
.gn-cart-badge   { position: absolute; top: -6px; right: -10px; background: var(--geo-status-fix-base); color: var(--geo-navy); font-size: var(--geo-text-caption); font-weight: 800; border-radius: 999px; padding: 1px 6px; }
.gn-lang         { font-size: 0.78rem; font-weight: 700; color: var(--text-muted); border: 1px solid var(--border-strong); border-radius: var(--geo-radius-full); padding: 5px 10px; }
.gn-nav-toggle   { display: none; background: none; border: 0; color: var(--text); font-size: 1.4rem; cursor: pointer; }

/* ---------- Hero ---------- */
.gn-hero        { position: relative; padding: 90px 0 70px; overflow: hidden; }
.gn-hero-grid   { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 48px; align-items: center; }
.gn-hero .gn-eyebrow { display: inline-flex; align-items: center; gap: 8px; margin-bottom: 18px; }
.gn-hero p.lead { color: var(--text-muted); font-size: 1.08rem; max-width: 560px; line-height: 1.7; }
.gn-hero-ctas   { display: flex; gap: 14px; margin: 28px 0; flex-wrap: wrap; }
.gn-hero-chips  { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 10px; }

/* Radar / motion graphics del hero */
.gn-radar-wrap { position: relative; aspect-ratio: 1; max-width: 480px; margin: 0 auto; }
.gn-radar      { width: 100%; height: 100%; }
.gn-radar .sweep         { transform-origin: 250px 250px; animation: gn-sweep 4.2s linear infinite; }
@keyframes gn-sweep      { to { transform: rotate(360deg); } }
.gn-radar .sat           { animation: gn-blink 2.4s ease-in-out infinite; }
.gn-radar .sat:nth-child(2n) { animation-delay: 0.9s; }
.gn-radar .ring          { animation: gn-pulse 3.6s ease-out infinite; transform-origin: center; }
@keyframes gn-blink      { 0%, 100% { opacity: 0.35; } 50% { opacity: 1; } }
@keyframes gn-pulse      { 0% { opacity: 0.5; } 70% { opacity: 0.08; } 100% { opacity: 0; } }

.gn-satlock      { position: absolute; left: 50%; bottom: 6%; transform: translateX(-50%); display: flex; gap: 10px; align-items: center; padding: 10px 18px; border-radius: var(--geo-radius-full); background: rgba(10,26,82,0.8); border: 1px solid var(--border-strong); backdrop-filter: blur(8px); font-size: 0.78rem; font-weight: 700; letter-spacing: 0.1em; white-space: nowrap; }
.gn-satlock .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--geo-status-fix-base); box-shadow: 0 0 10px var(--geo-status-fix-base); animation: gn-blink 1.6s infinite; }

@media (prefers-reduced-motion: reduce) {
  .gn-radar .sweep, .gn-radar .sat, .gn-radar .ring, .gn-satlock .dot { animation: none; }
}

/* ---------- Secciones ---------- */
.gn-section       { padding: 70px 0; }
.gn-section--alt  { background: var(--surface); }
.gn-section-head  { max-width: 640px; margin-bottom: 40px; }
.gn-section-head h2 { font-size: clamp(1.6rem, 3.4vw, 2.4rem); font-weight: 800; letter-spacing: -0.02em; margin: 10px 0 12px; }
.gn-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
.gn-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
.gn-grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 22px; }

/* ---------- Cards de producto ---------- */
.gn-prod-card         { display: flex; flex-direction: column; gap: 12px; transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease; }
.gn-prod-card:hover   { transform: translateY(-4px); border-color: var(--primary); box-shadow: 0 0 24px rgba(0,198,255,0.18); }
.gn-prod-img          { display: flex; align-items: center; justify-content: center; background: var(--surface-2); border-radius: 10px; height: 150px; }
.gn-prod-img svg      { width: 84px; height: 84px; }
.gn-prod-card h3      { font-size: 1rem; margin: 0; color: var(--text); }
.gn-prod-card h3 a    { color: inherit; }
.gn-prod-price        { font-weight: 800; font-size: 1.15rem; color: var(--accent); }
.gn-prod-cat          { font-size: var(--geo-text-caption); letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-faint); }
.gn-prod-actions      { display: flex; gap: 10px; margin-top: auto; }

/* ---------- Formularios ---------- */
.gn-form      { display: grid; gap: 16px; }
.gn-field label { display: block; font-size: 0.8rem; font-weight: 600; color: var(--text-muted); margin-bottom: 6px; }
.gn-form-row  { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
select.gn-input, textarea.gn-input { resize: vertical; }
.gn-help      { font-size: 0.78rem; color: var(--text-faint); margin-top: 5px; }

/* ---------- Flash ---------- */
.gn-flash        { max-width: 1200px; margin: 18px auto 0; padding: 14px 20px; border-radius: 10px; font-weight: 600; font-size: 0.92rem; border: 1px solid; }
.gn-flash--ok    { background: rgba(18,183,106,0.12); border-color: rgba(18,183,106,0.4); color: var(--status-fix-fg); }
.gn-flash--error { background: rgba(229,72,77,0.12);  border-color: rgba(229,72,77,0.4);  color: var(--status-nosignal-fg); }
.gn-flash--info  { background: rgba(24,66,240,0.12);  border-color: rgba(24,66,240,0.4);  color: var(--geo-indigo-200); }

/* ---------- Tablas ---------- */
.gn-table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--geo-radius-lg); background: rgba(10,26,82,0.5); }
table.gn-table { width: 100%; border-collapse: collapse; font-size: 0.86rem; min-width: 640px; }
.gn-table th   { text-align: left; padding: 12px 16px; font-size: var(--geo-text-caption); letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-faint); border-bottom: 1px solid var(--border-strong); white-space: nowrap; }
.gn-table td   { padding: 11px 16px; border-bottom: 1px solid var(--border); color: var(--text-muted); }
.gn-table tr:last-child td  { border-bottom: 0; }
.gn-table tr:hover td       { background: rgba(24,66,240,0.05); color: var(--text); }
.gn-table .num { text-align: right; font-variant-numeric: tabular-nums; }

/* Badges de estado */
.gn-st { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; font-size: var(--geo-text-caption); font-weight: 700; }
.gn-st::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: currentColor; }

.gn-st--online, .gn-st--activa, .gn-st--PAID, .gn-st--AL_CORRIENTE,
.gn-st--ok, .gn-st--resuelta, .gn-st--timbrado
  { background: rgba(18,183,106,0.14); color: var(--status-fix-fg); }

.gn-st--degraded, .gn-st--APPROVED, .gn-st--POR_VENCER, .gn-st--monitoreo,
.gn-st--CREATED, .gn-st--pendiente, .gn-st--solicitado
  { background: rgba(247,144,9,0.14); color: var(--status-float-fg); }

.gn-st--offline, .gn-st--revocada, .gn-st--FAILED, .gn-st--BLOQUEADO,
.gn-st--error, .gn-st--critica, .gn-st--abierta, .gn-st--cancelado
  { background: rgba(229,72,77,0.14); color: var(--status-nosignal-fg); }

.gn-st--maintenance, .gn-st--expirada, .gn-st--PENDING,
.gn-st--REFUNDED, .gn-st--mock
  { background: rgba(24,66,240,0.14); color: var(--geo-indigo-200); }

/* ---------- KPIs / stats ---------- */
.gn-kpis   { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin: 20px 0; }
.gn-kpi    { padding: 18px 20px; }
.gn-kpi .v { font-size: 1.5rem; font-weight: 800; letter-spacing: -0.02em; }
.gn-kpi .l { font-size: var(--geo-text-caption); letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-faint); margin-top: 4px; }
.gn-kpi .d { font-size: 0.75rem; margin-top: 6px; }
.gn-kpi .d.up   { color: var(--status-fix-fg); }
.gn-kpi .d.down { color: var(--status-nosignal-fg); }

/* ---------- App shell (distribuidores / admin) ---------- */
.gn-appbar        { position: sticky; top: 0; z-index: 900; background: rgba(10,26,82,0.92); border-bottom: 1px solid var(--border); backdrop-filter: blur(12px); }
.gn-appbar-in     { display: flex; align-items: center; gap: 22px; padding-top: 12px; padding-bottom: 12px; }
.gn-appbar-label  { font-size: var(--geo-text-caption); letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; }
.gn-appnav        { display: flex; gap: 6px; flex: 1; flex-wrap: wrap; }
.gn-appnav a      { color: var(--text-muted); font-size: 0.86rem; font-weight: 600; padding: 8px 14px; border-radius: var(--geo-radius-full); }
.gn-appnav a.active, .gn-appnav a:hover { color: var(--text); background: rgba(24,66,240,0.16); }
.gn-appbar-right  { display: flex; align-items: center; gap: 14px; }
.gn-app-main      { padding-top: 30px; padding-bottom: 60px; width: 100%; }

.gn-usermenu          { position: relative; }
.gn-usermenu summary  { cursor: pointer; list-style: none; font-size: 0.85rem; font-weight: 600; color: var(--text-muted); }
.gn-usermenu[open] summary { color: var(--text); }
.gn-usermenu-panel    { position: absolute; right: 0; top: 130%; background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: 10px; padding: 10px 14px; display: grid; gap: 8px; min-width: 180px; box-shadow: var(--geo-shadow-lg); font-size: 0.85rem; }

/* Campana de notificaciones */
.gn-bell-wrap  { position: relative; }
.gn-bell       { position: relative; background: none; border: 1px solid var(--border-strong); color: var(--text-muted); border-radius: 50%; width: 38px; height: 38px; cursor: pointer; display: grid; place-items: center; }
.gn-bell:hover { color: var(--text); border-color: var(--accent); }
.gn-bell-badge { position: absolute; top: -4px; right: -4px; background: var(--geo-status-nosignal-base); color: #fff; font-size: var(--geo-text-caption); font-weight: 800; border-radius: 999px; padding: 1px 5px; }
.gn-bell-panel { position: absolute; right: 0; top: 120%; width: 330px; max-height: 380px; overflow-y: auto; background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: 10px; box-shadow: var(--geo-shadow-lg); z-index: 950; }

.gn-notif        { display: block; padding: 12px 14px; border-bottom: 1px solid var(--border); font-size: 0.82rem; color: var(--text-muted); }
.gn-notif.unseen { background: rgba(24,66,240,0.08); }
.gn-notif b      { color: var(--text); display: block; margin-bottom: 2px; }
.gn-notif time   { font-size: var(--geo-text-caption); color: var(--text-faint); }

/* ---------- Tabs ---------- */
.gn-tabs          { display: flex; gap: 8px; border-bottom: 1px solid var(--border); margin-bottom: 24px; flex-wrap: wrap; }
.gn-tab           { padding: 10px 18px; font-weight: 700; font-size: 0.9rem; color: var(--text-muted); border: 0; background: none; cursor: pointer; border-bottom: 2px solid transparent; }
.gn-tab.active    { color: var(--text); border-bottom-color: var(--accent); }
.gn-tabpanel[hidden] { display: none; }

/* ---------- Mapa ---------- */
.gn-map          { height: 440px; border-radius: var(--geo-radius-lg); border: 1px solid var(--border-strong); overflow: hidden; background: var(--surface-2); }
.gn-map-fallback { height: 100%; display: block; }
.gn-cors-grid    { display: grid; grid-template-columns: 380px 1fr; gap: 22px; align-items: start; }

.gn-station-item       { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px; margin-bottom: 10px; background: rgba(10,26,82,0.5); }
.gn-station-item.best  { border-color: rgba(0,198,255,0.5); box-shadow: 0 0 16px rgba(0,198,255,0.12); }
.gn-station-item .code { font-weight: 800; font-size: 0.92rem; }
.gn-station-item .meta { font-size: var(--geo-text-caption); color: var(--text-faint); }
.gn-station-item .dist { font-weight: 800; color: var(--accent); white-space: nowrap; }

/* Página de credencial */
.gn-cred-box     { max-width: 760px; margin: 0 auto; }
.gn-cred-fields  { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin: 20px 0; }
.gn-cred-field   { background: var(--surface-2); border: 1px solid var(--border); border-radius: 10px; padding: 14px 16px; }
.gn-cred-field .k { font-size: var(--geo-text-caption); letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-faint); }
.gn-cred-field .v { font-size: 1.05rem; font-weight: 700; margin-top: 4px; word-break: break-all; display: flex; align-items: center; gap: 8px; }

.gn-copy       { background: none; border: 1px solid var(--border-strong); border-radius: 6px; color: var(--text-muted); font-size: var(--geo-text-caption); padding: 3px 8px; cursor: pointer; }
.gn-copy:hover { color: var(--accent); border-color: var(--accent); }

/* Guías por marca (acordeón) */
.gn-guide details  { border: 1px solid var(--border); border-radius: 10px; margin-bottom: 10px; background: rgba(10,26,82,0.5); }
.gn-guide summary  { padding: 14px 18px; font-weight: 700; cursor: pointer; }
.gn-guide .body    { padding: 0 18px 16px; color: var(--text-muted); font-size: 0.9rem; line-height: 1.7; }

/* ---------- Dona (SVG) ---------- */
.gn-dona-wrap         { display: flex; gap: 24px; align-items: center; }
.gn-dona-legend       { display: grid; gap: 8px; font-size: 0.84rem; }
.gn-dona-legend .sw   { display: inline-block; width: 11px; height: 11px; border-radius: 3px; margin-right: 8px; }

/* ---------- Gráfica de barras (SVG server-side) ---------- */
.gn-chart-wrap     { overflow-x: auto; }
.gn-chart-wrap svg { display: block; min-width: 560px; }

/* ---------- Footer ---------- */
.gn-footer         { border-top: 1px solid var(--border); background: var(--surface); margin-top: 60px; }
.gn-footer-grid    { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 32px; padding: 48px 24px 28px; }
.gn-footer nav     { display: grid; gap: 9px; align-content: start; }
.gn-footer nav a   { color: var(--text-muted); font-size: 0.88rem; }
.gn-footer nav a:hover { color: var(--accent); }
.gn-footer h3      { margin: 0 0 6px; }
.gn-footer-tagline { font-size: 0.9rem; max-width: 320px; }
.gn-faint          { color: var(--text-faint); font-size: 0.8rem; }
.gn-social         { display: grid; gap: 8px; }
.gn-social a       { color: var(--text-muted); font-size: 0.88rem; }
.gn-footer-legal   { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding-top: 18px; padding-bottom: 26px; border-top: 1px solid var(--border); font-size: 0.78rem; color: var(--text-muted); }

/* WhatsApp FAB */
.gn-whatsapp-fab       { position: fixed; right: 22px; bottom: 22px; z-index: 1100; width: 56px; height: 56px; border-radius: 50%; display: grid; place-items: center; background: var(--geo-status-fix-base); color: var(--geo-navy); box-shadow: 0 8px 24px rgba(18,183,106,0.45); transition: transform .15s ease; }
.gn-whatsapp-fab:hover { transform: scale(1.08); color: var(--geo-navy); }

/* ---------- Status page ---------- */
.gn-uptime-bars      { display: flex; gap: 2px; align-items: flex-end; height: 34px; }
.gn-uptime-bars span { flex: 1; min-width: 3px; border-radius: 2px; background: var(--geo-status-fix-base); opacity: 0.85; }
.gn-uptime-bars span.warn { background: var(--geo-status-float-base); }
.gn-uptime-bars span.bad  { background: var(--geo-status-nosignal-base); }

/* ---------- Página de login ---------- */
.gn-auth { max-width: 420px; margin: 60px auto; }

/* ---------- PayPal mock ---------- */
.gn-paypal-mock { max-width: 440px; margin: 60px auto; text-align: center; }
.gn-paypal-logo { font-weight: 800; font-size: 1.6rem; font-style: italic; color: var(--geo-indigo-200); }

/* ---------- Skip link (a11y) ---------- */
.gn-skip        { position: absolute; left: -9999px; top: 0; background: var(--primary); color: #fff; padding: 10px 18px; border-radius: 0 0 8px 0; z-index: 2000; }
.gn-skip:focus  { left: 0; }

/* ---------- Responsive ----------
   El nav se partía en dos renglones a 1568 px, que es una laptop normal, no un
   móvil. Con "Nodos" añadido cabe menos todavía. Se ceden piezas por orden de
   prescindibilidad — buscador, luego enlaces — antes de que nada se parta. */
@media (max-width: 1400px) {
  .gn-nav-search   { display: none; }
}
@media (max-width: 1180px) {
  .gn-nav-toggle   { display: block; margin-left: auto; }
  .gn-nav-links    { display: none; flex-direction: column; width: 100%; order: 3; }
  .gn-nav-links.open { display: flex; }
  .gn-nav-actions  { margin-left: auto; }
  .gn-navbar, .gn-nav-main { border-radius: var(--geo-radius-lg); flex-wrap: wrap; }
}
@media (max-width: 1080px) {
  .gn-grid-4       { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 900px) {
  .gn-hero-grid    { grid-template-columns: 1fr; gap: 24px; }
  .gn-grid-3       { grid-template-columns: 1fr 1fr; }
  .gn-cors-grid    { grid-template-columns: 1fr; }
  .gn-footer-grid  { grid-template-columns: 1fr 1fr; }
  .gn-nav-toggle   { display: block; margin-left: auto; }
  .gn-nav-links    { display: none; flex-direction: column; width: 100%; order: 3; }
  .gn-nav-links.open { display: flex; }
  .gn-nav-actions  { margin-left: auto; }
  .gn-navbar       { border-radius: var(--geo-radius-lg); }
}
@media (max-width: 620px) {
  .gn-grid-3, .gn-grid-2, .gn-grid-4, .gn-form-row, .gn-cred-fields { grid-template-columns: 1fr; }
  .gn-footer-grid  { grid-template-columns: 1fr; }
  .gn-hero         { padding: 50px 0 40px; }
  .gn-section      { padding: 46px 0; }
  .gn-nav-actions .gn-btn--brand { display: none; }
  .gn-appbar-in    { flex-wrap: wrap; }
}

@media print {
  body { background: #fff; color: #000; }
  a { color: var(--primary); }
  .gn-header, .gn-footer, .gn-whatsapp-fab, .gn-appbar { display: none; }
}

/* =========================================================
   PORTAL — secciones portadas de la landing (agosto 2026)
   La landing vivía en React + Tailwind + framer-motion. Aquí el movimiento
   se resuelve con .gn-reveal (IntersectionObserver ya existente en app.js)
   y @keyframes, y todo respeta prefers-reduced-motion.
   ========================================================= */

/* ---------- Superficie de vidrio ---------- */
.gn-glass {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border-radius: var(--geo-radius-xl);
}

/* ---------- Escalonado del reveal (sustituye delay de framer-motion) ---------- */
.gn-reveal--d1 { transition-delay: .10s; }
.gn-reveal--d2 { transition-delay: .20s; }
.gn-reveal--d3 { transition-delay: .30s; }
.gn-reveal--d4 { transition-delay: .40s; }

/* ---------- Hero con fotografía ---------- */
.gn-hero-photo {
  position: relative; overflow: hidden;
  min-height: min(88vh, 760px);
  display: flex; flex-direction: column; justify-content: center;
  padding: 72px 0 56px;
}
.gn-hero-photo__img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center bottom;
  animation: gn-kenburns 26s ease-in-out infinite alternate;
}
/* Dos capas de legibilidad: un velo plano y un degradado que ancla el texto
   y funde el borde inferior con la superficie de la página. */
.gn-hero-photo__veil {
  position: absolute; inset: 0;
  background: rgba(10, 26, 82, 0.62);
}
.gn-hero-photo__fade {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,0.45) 0%, rgba(10,26,82,0.15) 42%, var(--surface) 100%);
}
.gn-hero-photo__in { position: relative; z-index: 2; text-align: center; }
.gn-hero-photo__in .gn-display { margin: 0 auto; max-width: 15ch; }
.gn-hero-photo__in .lead { margin: 22px auto 0; max-width: 60ch; }
.gn-hero-photo .gn-hero-ctas { justify-content: center; }
.gn-hero-photo .gn-hero-chips { justify-content: center; }
@keyframes gn-kenburns {
  from { transform: scale(1.06) translate3d(0, 0, 0); }
  to   { transform: scale(1.16) translate3d(0, -2%, 0); }
}

/* ---------- Cinta de credenciales bajo el hero ---------- */
.gn-strip {
  display: flex; flex-wrap: wrap; justify-content: center; gap: 10px 28px;
  padding: 16px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
  font-family: var(--geo-font-data); font-size: var(--geo-text-data-s);
  color: var(--text-muted); letter-spacing: 0.04em;
}

/* ---------- Bloque de enunciado grande ---------- */
.gn-statement { padding: 92px 0 24px; }
.gn-statement h2 {
  font-family: var(--geo-font-brand); font-weight: 700;
  font-size: clamp(2rem, 4.6vw, 3.6rem); line-height: 1.1;
  letter-spacing: -0.02em; margin: 18px 0 0; max-width: 20ch;
}

/* ---------- Video destacado ---------- */
.gn-featured { position: relative; overflow: hidden; border-radius: var(--geo-radius-xl); aspect-ratio: 16 / 9; }
.gn-featured video, .gn-featured img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gn-featured__scrim { position: absolute; inset: 0; background: linear-gradient(0deg, rgba(0,0,0,0.62) 0%, transparent 55%); }
.gn-featured__body {
  position: absolute; inset: auto 0 0 0; z-index: 2;
  display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
  gap: 20px; padding: clamp(18px, 3vw, 40px);
}
.gn-featured__card { max-width: 42ch; padding: 24px; }

/* ---------- Lista del kit ---------- */
.gn-kit { list-style: none; margin: 0; padding: 0; overflow: hidden; }
.gn-kit li { display: flex; align-items: center; gap: 16px; padding: 18px 24px; }
.gn-kit li + li { border-top: 1px solid var(--border); }
.gn-kit__check {
  flex: none; width: 28px; height: 28px; border-radius: 50%;
  display: grid; place-items: center;
  background: rgba(18,183,106,0.16); color: var(--status-fix-fg);
  font-size: 0.9rem; font-weight: 700;
}
.gn-kit__label { font-weight: 600; color: var(--text); }
.gn-kit__meta  { margin-left: auto; font-family: var(--geo-font-data); font-size: var(--geo-text-caption); letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-faint); }

/* ---------- Tarifas ---------- */
.gn-plan { position: relative; display: flex; flex-direction: column; padding: 30px 26px; }
.gn-plan--destacado { border-color: var(--border-strong); box-shadow: 0 0 0 1px var(--glass-border), var(--geo-shadow-lg); }
.gn-plan__ribbon {
  position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
  white-space: nowrap; border-radius: var(--geo-radius-full);
  background: var(--primary); color: var(--on-primary);
  /* 9.92 px reprobaba legibilidad: las etiquetas comerciales suben a 12 px */
  font-size: var(--geo-text-caption); font-weight: 700;
  letter-spacing: 0.10em; text-transform: uppercase; padding: 5px 14px;
}
.gn-plan__dur   { font-size: 0.82rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-muted); }
.gn-plan__price { font-family: var(--geo-font-data); font-size: 2.6rem; font-weight: 500; letter-spacing: -0.03em; color: var(--text); margin: 10px 0 2px; }
.gn-plan__price sup { font-size: 1rem; vertical-align: super; color: var(--text-faint); margin-right: 2px; }
.gn-plan__per   { font-size: 0.78rem; color: var(--text-faint); font-family: var(--geo-font-data); }
.gn-plan__equiv { display: block; margin-top: 4px; font-size: 0.78rem; color: var(--accent); font-family: var(--geo-font-data); }
.gn-plan__feats { list-style: none; margin: 22px 0 26px; padding: 0; display: grid; gap: 10px; }
.gn-plan__feats li { display: flex; gap: 9px; font-size: 0.9rem; color: var(--text-muted); }
.gn-plan__feats li::before { content: "✓"; color: var(--status-fix-fg); font-weight: 700; }
.gn-plan .gn-btn { margin-top: auto; }
.gn-plan-group-title {
  font-family: var(--geo-font-brand); font-size: 1.05rem; font-weight: 700;
  color: var(--text-muted); margin: 0 0 18px;
}
.gn-callout {
  display: inline-block; margin-top: 10px; padding: 10px 18px;
  border-radius: var(--geo-radius-lg); background: rgba(24,66,240,0.10);
  border: 1px solid rgba(24,66,240,0.35); color: var(--text); font-weight: 600;
}

/* ---------- Canales de contacto ---------- */
.gn-channels { display: grid; gap: 12px; margin-top: 28px; }
.gn-channel  { display: flex; align-items: center; gap: 16px; padding: 16px 18px; border-radius: var(--geo-radius-lg); }
.gn-channel__ic { flex: none; width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center; background: rgba(24,66,240,0.18); color: var(--accent); }
.gn-channel__k  { display: block; font-size: var(--geo-text-caption); letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-faint); }
.gn-channel__v  { display: block; font-weight: 600; color: var(--text); }
a.gn-channel { transition: transform .15s ease; }
a.gn-channel:hover { transform: translateX(3px); }

/* ---------- Nodos ---------- */
.gn-nodo-precio { font-family: var(--geo-font-data); font-size: clamp(2rem, 4vw, 3rem); font-weight: 500; letter-spacing: -0.02em; color: var(--text); }
.gn-matriz { width: 100%; border-collapse: collapse; margin-top: 18px; }
.gn-matriz th, .gn-matriz td { padding: 14px 16px; text-align: left; border: 1px solid var(--border); vertical-align: top; }
.gn-matriz thead th { font-size: var(--geo-text-caption); letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-faint); font-weight: 600; }
.gn-matriz tbody th { font-weight: 600; color: var(--text); }
.gn-matriz .pct { font-family: var(--geo-font-data); color: var(--accent); font-size: 1.05rem; }
.gn-fases { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); margin-top: 28px; }
.gn-fase__n { font-family: var(--geo-font-data); font-size: 0.78rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); }

/* ---------- Piso tipográfico de las micro-etiquetas ----------
   Medido en el DOM renderizado: había siete estilos por debajo de 12 px, el
   más chico a 9.92 px. Varios son comerciales (las cintas de tarifas, los
   chips del hero). Todos suben al token de caption, que son 12 px. */
.gn-eyebrow,
.gn-chip__label,
.gn-kpi .l,
.gn-kit__meta,
.gn-prod-cat,
.gn-channel__k,
.gn-plan__per,
.gn-fase__n { font-size: var(--geo-text-caption); }

@media (prefers-reduced-motion: reduce) {
  .gn-hero-photo__img { animation: none; }
  .gn-reveal--d1, .gn-reveal--d2, .gn-reveal--d3, .gn-reveal--d4 { transition-delay: 0s; }
  a.gn-channel:hover { transform: none; }
}

@media (max-width: 900px) {
  .gn-featured__body { flex-direction: column; align-items: stretch; }
  .gn-statement { padding: 64px 0 16px; }
}

/* ---------- Honeypot anti-spam de los formularios de contacto ----------
   Oculto a la vista y a lectores de pantalla (aria-hidden en el propio campo);
   un bot que rellena todos los inputs de un formulario lo llena, una persona
   nunca lo ve. Position:absolute en vez de display:none: algunos bots
   ignoran los campos display:none precisamente para evitar esta trampa. */
.gn-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
