/* ==========================================================================
   METROL — Componentes: header, footer, WhatsApp flotante, tarjetas, formularios
   ========================================================================== */

/* ---------- Fallback de navegación sin JavaScript (ver components.js) ----------
   Mejora progresiva real: el fallback estático (.no-js-nav) es visible por
   defecto en #site-header/#site-footer. Cada contenedor lo oculta SOLO cuando
   ÉL MISMO terminó de construir su navegación dinámica con éxito — es
   components.js (renderHeader/renderFooter), no un script inline en <head>,
   quien agrega "js-nav-ready" a header/footer, y solo después de un
   try/catch exitoso. Si components.js no carga, falla, o un adblocker lo
   bloquea, esa clase nunca se agrega y el fallback permanece visible: nunca
   depende de que JS "exista", sino de que la navegación real haya funcionado. */
#site-header .no-js-nav, #site-footer .no-js-nav{ display:block; }
#site-header.js-nav-ready .no-js-nav, #site-footer.js-nav-ready .no-js-nav{ display:none; }
.no-js-nav a{ color: inherit; text-decoration: underline; margin-right: 14px; }
header .no-js-nav{ padding: 14px 20px; }
footer .no-js-nav{ padding: 24px 20px; }

/* ---------- Header ---------- */
.site-header{
  position: fixed; top:0; left:0; right:0; z-index:200;
  background: rgba(255,255,255,.9);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: var(--shadow-sm);
  transition: background var(--transition), box-shadow var(--transition);
  transform: translateY(-100%);
  animation: header-drop 640ms var(--ease-out-expo) 80ms forwards;
}
@keyframes header-drop{ to{ transform: translateY(0); } }
@media (prefers-reduced-motion: reduce){ .site-header{ animation:none; transform:none; } }

.site-header.scrolled{ box-shadow: var(--shadow-md); }
.site-header.scrolled .header-inner{ height: var(--header-h-scrolled); }
.site-header.scrolled .brand-logo{ height:52px; }

/* Barra de progreso de scroll */
.header-progress{
  position:absolute; left:0; bottom:0; height:2px; width:0%;
  background: linear-gradient(90deg, var(--color-accent), var(--color-primary));
  transition: width 100ms linear;
  pointer-events:none;
}

.topbar{
  background: var(--color-surface);
  color: var(--color-muted);
  font-size: 12.5px;
  border-bottom: 1px solid var(--color-border);
  overflow: hidden;
  transition: max-height var(--transition), opacity var(--transition);
  max-height: 36px;
}
.site-header.scrolled .topbar{ max-height:0; opacity:0; border-bottom-color: transparent; }
.topbar-inner{
  display:flex; justify-content:space-between; align-items:center;
  padding: 7px 24px;
}
.topbar-info a{ color: var(--color-secondary-dark); margin-right:10px; }
.topbar-info a:hover{ color: var(--color-accent); }
.topbar-sep{ opacity:.5; margin: 0 6px; }
.topbar-social{ display:flex; gap:14px; }
.topbar-social a{ display:flex; align-items:center; color: var(--color-secondary-dark); font-size:11px; letter-spacing:.06em; opacity:.85; }
.topbar-social a:hover{ opacity:1; color: var(--color-accent); }

.header-inner{
  display:flex; align-items:center; justify-content:space-between;
  height: var(--header-h);
  transition: height var(--transition);
  max-width: 1600px; margin: 0 auto; padding: 0 24px;
}
.header-left{ display:flex; align-items:center; gap: 32px; min-width:0; }
.brand{ display:flex; align-items:center; flex-shrink:0; }
.brand-logo{ height: 70px; width:auto; object-fit:contain; transition: height var(--transition), transform 420ms var(--ease-out-expo); }
.brand:hover .brand-logo{ transform: scale(1.045) rotate(-1deg); }
@media (max-width: 1440px){ .header-left{ gap:22px; } }

.main-nav ul{ display:flex; gap: 0; align-items:center; position:relative; }
.main-nav > ul > li{ position:relative; }
.nav-highlight{
  position:absolute; top:0; left:0; height:100%; width:0;
  background: rgba(27,59,140,.07); border-radius: var(--radius-sm);
  transform: translateX(0); opacity:0; pointer-events:none; z-index:0;
  transition: transform 320ms var(--ease-out-expo), width 320ms var(--ease-out-expo), opacity 180ms;
}
.main-nav.nav-hovering .nav-highlight{ opacity:1; }
.main-nav > ul > li > a{
  position:relative; z-index:1; white-space:nowrap;
  display:flex; align-items:center; gap:6px;
  padding: 10px 14px; border-radius: var(--radius-sm);
  font-family: var(--font-display); font-weight:600; font-size:.88rem;
  color: var(--color-secondary-dark);
  transition: color var(--transition);
}
.main-nav > ul > li > a::after{
  content:""; position:absolute; left:11px; right:11px; bottom:4px; height:2px;
  background: var(--color-accent); border-radius:2px;
  transform: scaleX(0); transform-origin:left; transition: transform var(--transition);
}
.main-nav > ul > li > a:hover{ color: var(--color-primary); }
.main-nav > ul > li > a:hover::after{ transform: scaleX(1); }
.main-nav > ul > li.active > a{ color: var(--color-primary); }
.main-nav > ul > li.active > a::after{ transform: scaleX(1); }

/* ---------- Dropdown de Certificación (desktop) ---------- */
.main-nav > ul > li.has-dropdown > a{ padding-right:10px; }
.nav-caret{ transition: transform var(--transition); flex-shrink:0; }
.main-nav > ul > li.has-dropdown:hover .nav-caret,
.main-nav > ul > li.has-dropdown.dropdown-open .nav-caret{ transform: rotate(180deg); }

.nav-dropdown{
  position:absolute; top:100%; left:50%; transform: translate(-50%, 6px) scale(.96);
  min-width: 320px; padding-top:14px;
  opacity:0; visibility:hidden; pointer-events:none;
  transition: opacity 260ms cubic-bezier(.2,1,.3,1), transform 320ms cubic-bezier(.2,1,.3,1), visibility 260ms;
  z-index: 210;
}
.nav-dropdown::before{
  content:""; position:absolute; top:8px; left:50%; transform: translateX(-50%) rotate(45deg);
  width:12px; height:12px; background:#fff; border-left:1px solid var(--color-border); border-top:1px solid var(--color-border);
  z-index:1;
}
.main-nav > ul > li.has-dropdown:hover .nav-dropdown,
.main-nav > ul > li.has-dropdown.dropdown-open .nav-dropdown{
  opacity:1; visibility:visible; pointer-events:auto; transform: translate(-50%, 0) scale(1);
}
.nav-dropdown ul{
  display:grid; grid-template-columns: 1fr; gap:2px;
  flex-direction:column; align-items:stretch;
  background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg); padding:10px; position:relative;
}
.nav-dropdown-title{
  display:block; background:#fff; border:1px solid var(--color-border); border-bottom:none;
  border-radius: var(--radius-md) var(--radius-md) 0 0; padding:10px 14px 6px;
  font-size:.72rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color: var(--color-muted); position:relative; margin-top:0;
}
.nav-dropdown-title + ul{ border-radius: 0 0 var(--radius-md) var(--radius-md); margin-top:-1px; }
.nav-dropdown li{ position:static; }
.nav-dropdown a{
  display:flex; align-items:center; gap:10px;
  padding: 11px 14px; border-radius: var(--radius-sm);
  font-family: var(--font-body); font-weight:600; font-size:.86rem;
  color: var(--color-secondary-dark); white-space:nowrap;
  transition: background var(--transition), color var(--transition), transform var(--transition);
}
.nav-dropdown a::before{
  content:""; width:6px; height:6px; border-radius:50%; background: var(--color-accent);
  opacity:.4; flex-shrink:0; transition: opacity var(--transition), transform var(--transition);
}
.nav-dropdown a:hover{ background: rgba(27,59,140,.07); color: var(--color-primary); transform: translateX(3px); }
.nav-dropdown a:hover::before{ opacity:1; transform: scale(1.3); }
.nav-dropdown a[aria-current="page"]{ color: var(--color-primary); background: rgba(27,59,140,.06); }

.nav-dropdown li{ opacity:0; transform: translateY(-6px); transition: opacity 260ms ease, transform 260ms ease; }
.main-nav > ul > li.has-dropdown:hover .nav-dropdown li,
.main-nav > ul > li.has-dropdown.dropdown-open .nav-dropdown li{ opacity:1; transform:none; }
.nav-dropdown li:nth-child(1){ transition-delay:20ms; } .nav-dropdown li:nth-child(2){ transition-delay:40ms; }
.nav-dropdown li:nth-child(3){ transition-delay:60ms; } .nav-dropdown li:nth-child(4){ transition-delay:80ms; }
.nav-dropdown li:nth-child(5){ transition-delay:100ms; } .nav-dropdown li:nth-child(6){ transition-delay:120ms; }
.nav-dropdown li:nth-child(7){ transition-delay:140ms; } .nav-dropdown li:nth-child(8){ transition-delay:160ms; }
.nav-dropdown li:nth-child(9){ transition-delay:180ms; }

.header-actions{ display:flex; align-items:center; gap:10px; flex-shrink:0; }
.header-wa{ display:none; }
@media (min-width: 1320px){ .header-wa{ display:inline-flex; } }

.header-actions .btn-primary{ overflow:hidden; }
.header-actions .btn-primary::before{
  content:""; position:absolute; inset:0; z-index:-1;
  background: linear-gradient(115deg, transparent 40%, rgba(255,255,255,.35) 50%, transparent 60%);
  transform: translateX(-120%); transition: transform 650ms var(--ease-out-expo);
}
.header-actions .btn-primary:hover::before{ transform: translateX(120%); }

.menu-toggle{
  display:flex; flex-direction:column; justify-content:center; align-items:center; gap:5px;
  width:44px; height:44px; background:transparent; border:1px solid var(--color-border);
  border-radius: var(--radius-sm); transition: border-color var(--transition), background var(--transition);
}
.menu-toggle:hover{ border-color: var(--color-primary); }
.menu-toggle span{ display:block; height:2px; width:20px; background: var(--color-secondary-dark); transition: transform var(--transition), opacity var(--transition); }
.menu-toggle.is-active span:nth-child(1){ transform: translateY(7px) rotate(45deg); }
.menu-toggle.is-active span:nth-child(2){ opacity:0; }
.menu-toggle.is-active span:nth-child(3){ transform: translateY(-7px) rotate(-45deg); }

@media (min-width: 1320px){ .menu-toggle{ display:none; } }
@media (max-width: 1319px){ .main-nav{ display:none; } }

/* ---------- Menú móvil: panel de pantalla completa premium ---------- */
.mobile-nav{
  position: fixed; inset: 0; z-index: 190;
  background: linear-gradient(160deg, #fff 0%, var(--color-surface) 100%);
  visibility:hidden; opacity:0;
  transition: opacity var(--transition-slow), visibility var(--transition-slow);
  display:flex; flex-direction:column;
}
.mobile-nav.open{ visibility:visible; opacity:1; }
.mobile-nav::before{
  content:"";
  position:absolute; inset:0; pointer-events:none; opacity:.6;
  background-image: linear-gradient(rgba(27,59,140,.05) 1px, transparent 1px), linear-gradient(90deg, rgba(27,59,140,.05) 1px, transparent 1px);
  background-size: 36px 36px;
  mask-image: radial-gradient(ellipse at 100% 0%, #000 0%, transparent 70%);
}
.mobile-nav-head{
  display:flex; align-items:center; justify-content:space-between;
  padding: 20px 24px; border-bottom:1px solid var(--color-border); position:relative; z-index:1;
}
.mobile-nav-head img{ height:40px; }
.mobile-nav-close{
  width:44px; height:44px; border-radius: var(--radius-sm); border:1px solid var(--color-border);
  background:#fff; position:relative;
}
.mobile-nav-close::before, .mobile-nav-close::after{
  content:""; position:absolute; top:50%; left:50%; width:18px; height:2px; background: var(--color-secondary-dark);
}
.mobile-nav-close::before{ transform: translate(-50%,-50%) rotate(45deg); }
.mobile-nav-close::after{ transform: translate(-50%,-50%) rotate(-45deg); }

.mobile-nav-body{ flex:1; overflow-y:auto; padding: 20px 24px 32px; position:relative; z-index:1; }
.mobile-nav-body > ul > li{ border-bottom:1px solid var(--color-border); }
.mobile-nav-body a{ font-family: var(--font-display); font-weight:700; font-size:1.3rem; }
.mobile-nav-row{ display:flex; justify-content:space-between; align-items:center; padding: 16px 0; }
.mobile-nav-row a{
  transform: translateX(-14px); opacity:0;
  transition: transform 500ms var(--ease-out-expo), transform var(--transition), color var(--transition), opacity 500ms var(--ease-out-expo);
}
.mobile-nav.open .mobile-nav-row a{ transform:none; opacity:1; }
.mobile-nav-body > ul > li:nth-child(1) a{ transition-delay: 60ms; }
.mobile-nav-body > ul > li:nth-child(2) a{ transition-delay: 100ms; }
.mobile-nav-body > ul > li:nth-child(3) a{ transition-delay: 140ms; }
.mobile-nav-body > ul > li:nth-child(4) a{ transition-delay: 180ms; }
.mobile-nav-body > ul > li:nth-child(5) a{ transition-delay: 220ms; }
.mobile-nav-body > ul > li:nth-child(6) a{ transition-delay: 260ms; }
.mobile-nav-body > ul > li:nth-child(7) a{ transition-delay: 300ms; }
.mobile-nav-body > ul > li:nth-child(8) a{ transition-delay: 340ms; }
.mobile-nav-row a:hover{ color: var(--color-primary); }

/* ---------- Submenú de Certificación (móvil) ---------- */
.has-mobile-submenu .mobile-nav-row{ padding-right:0; }
.mobile-submenu-toggle{
  width:38px; height:38px; flex-shrink:0; border-radius:50%; background: var(--color-surface);
  border:1px solid var(--color-border); color: var(--color-secondary-dark);
  display:flex; align-items:center; justify-content:center;
  transition: transform var(--transition), background var(--transition), border-color var(--transition);
}
.mobile-submenu-toggle svg{ transition: transform var(--transition); }
.has-mobile-submenu.open .mobile-submenu-toggle{ background: var(--color-primary); border-color: var(--color-primary); color:#fff; }
.has-mobile-submenu.open .mobile-submenu-toggle svg{ transform: rotate(180deg); }
.mobile-submenu{
  max-height:0; overflow:hidden; opacity:0;
  transition: max-height 420ms var(--ease-out-expo), opacity 320ms var(--ease-out-expo), padding var(--transition);
  padding-left:6px;
}
.has-mobile-submenu.open .mobile-submenu{ max-height:640px; opacity:1; padding-bottom:10px; }
.mobile-submenu-title{
  font-size:.7rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color: var(--color-muted); padding:8px 10px 4px; border-bottom:0 !important;
}
.mobile-submenu li{ border-bottom:0 !important; }
.mobile-submenu a{
  font-family: var(--font-body); font-weight:600; font-size:.94rem; color: var(--color-muted);
  padding:10px 0 10px 18px; display:flex; align-items:center; gap:10px; opacity:1; transform:none;
}
.mobile-submenu a::before{ content:""; width:5px; height:5px; border-radius:50%; background: var(--color-accent); flex-shrink:0; }
.mobile-submenu a:hover{ color: var(--color-primary); }

.mobile-nav-foot{ margin-top:28px; display:flex; flex-direction:column; gap:14px; position:relative; z-index:1; }
.mobile-nav-social{ display:flex; gap:18px; }
.mobile-nav-social a{ display:flex; align-items:center; gap:6px; font-weight:700; font-size:.85rem; color: var(--color-muted); }
.mobile-nav-contact{ font-size:.85rem; color: var(--color-muted); line-height:1.7; }
body.nav-locked{ overflow:hidden; }

/* ---------- Lightbox de imágenes (galería / logos / servicios) ---------- */
[data-lightbox]{ cursor: zoom-in; }
.lightbox-overlay{
  position: fixed; inset:0; z-index:400;
  background:
    radial-gradient(900px 560px at 80% 10%, rgba(47,91,199,.35), transparent 60%),
    rgba(10,21,48,.72);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  display:flex; align-items:center; justify-content:center; padding:24px;
  opacity:0; visibility:hidden; pointer-events:none;
  transition: opacity 320ms var(--ease-out-expo), visibility 320ms;
}
.lightbox-overlay.open{ opacity:1; visibility:visible; pointer-events:auto; }
.lightbox-panel{
  background:#fff; border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
  max-width: 920px; width:100%; max-height:88vh; overflow:auto;
  display:grid; grid-template-columns: 1.05fr 1fr; position:relative;
  transform: scale(.92) translateY(16px); opacity:0;
  transition: transform 380ms var(--ease-out-expo), opacity 380ms var(--ease-out-expo);
}
.lightbox-overlay.open .lightbox-panel{ transform:none; opacity:1; }
.lightbox-media{
  background: var(--color-surface); display:flex; align-items:center; justify-content:center;
  padding:36px; min-height:280px;
}
.lightbox-media img{ max-width:100%; max-height:420px; object-fit:contain; }
.lightbox-info{ padding:36px 36px 36px 30px; display:flex; flex-direction:column; gap:6px; }
.lightbox-info .eyebrow{ margin-bottom:6px; }
.lightbox-title{ font-family:var(--font-display); font-weight:700; font-size:1.4rem; color:var(--color-secondary-dark); margin-bottom:10px; line-height:1.25; }
.lightbox-link{ align-self:flex-start; margin-top: 22px; }
.lightbox-features{ display:flex; flex-direction:column; gap:11px; margin-top:6px; }
.lightbox-features li{
  display:flex; gap:10px; align-items:flex-start; font-size:.92rem; line-height:1.5;
  color: var(--color-muted);
  opacity:0; transform: translateX(-8px);
  transition: opacity 420ms var(--ease-out-expo), transform 420ms var(--ease-out-expo);
}
.lightbox-overlay.open .lightbox-features li{ opacity:1; transform:none; }
.lightbox-overlay.open .lightbox-features li:nth-child(1){ transition-delay:80ms; }
.lightbox-overlay.open .lightbox-features li:nth-child(2){ transition-delay:140ms; }
.lightbox-overlay.open .lightbox-features li:nth-child(3){ transition-delay:200ms; }
.lightbox-overlay.open .lightbox-features li:nth-child(4){ transition-delay:260ms; }
.lightbox-overlay.open .lightbox-features li:nth-child(5){ transition-delay:320ms; }
.lightbox-features li::before{
  content:"✓"; flex-shrink:0; width:20px; height:20px; border-radius:50%;
  background: rgba(15,163,74,.12); color:#0FA34A; font-size:12px; font-weight:800;
  display:flex; align-items:center; justify-content:center; margin-top:1px;
}
.lightbox-close{
  position:absolute; top:14px; right:14px; z-index:2;
  width:38px; height:38px; border-radius:50%; background:#fff; border:1px solid var(--color-border);
  font-size:20px; line-height:1; color:var(--color-secondary-dark);
  display:flex; align-items:center; justify-content:center;
  transition: background var(--transition), border-color var(--transition), transform var(--transition);
}
.lightbox-close:hover{ background: var(--color-surface); border-color: var(--color-primary); transform: rotate(90deg); }
@media (max-width:720px){
  .lightbox-panel{ grid-template-columns:1fr; }
  .lightbox-media{ min-height:200px; padding:24px; }
  .lightbox-media img{ max-height:220px; }
  .lightbox-info{ padding:24px; }
}

/* ---------- WhatsApp flotante ---------- */
#wa-float{ position: fixed; right: 22px; bottom: 22px; z-index: 150; }
.wa-float-btn{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px;
  position:relative;
  transition: transform 320ms var(--ease-out-expo);
}
.wa-float-circle{
  display:flex; align-items:center; justify-content:center;
  width:64px; height:64px; border-radius:50%; color:#fff;
  background: radial-gradient(120% 120% at 30% 20%, #3EE887 0%, #25D366 45%, #1DAF54 100%);
  box-shadow: 0 1px 0 rgba(255,255,255,.25) inset, 0 14px 28px rgba(15,60,32,.38);
  border: 2px solid rgba(255,255,255,.5);
  position:relative; overflow:visible;
  transition: transform 320ms var(--ease-out-expo), box-shadow var(--transition), filter var(--transition);
  animation: wa-attention 7s ease-in-out 3s infinite;
}
.wa-float-circle::before{
  content:""; position:absolute; inset:-8px; border-radius:50%; border:2px solid rgba(37,211,102,.4);
  animation: wa-ring 2.8s ease-out infinite;
}
.wa-float-circle::after{
  content:""; position:absolute; inset:0; border-radius:50%; pointer-events:none;
  background: radial-gradient(circle, rgba(255,255,255,.55) 0%, transparent 60%);
  opacity:0; transform: scale(0);
  transition: transform 520ms var(--ease-out-expo), opacity 520ms var(--ease-out-expo);
}
.wa-float-btn:active .wa-float-circle::after{ opacity:.5; transform: scale(1.6); transition: transform 0ms, opacity 0ms; }
@keyframes wa-ring{ 0%{ transform:scale(.92); opacity:.9; } 100%{ transform:scale(1.35); opacity:0; } }
@keyframes wa-attention{
  0%, 88%, 100%{ transform: scale(1) rotate(0); }
  90%{ transform: scale(1.06) rotate(-2deg); }
  93%{ transform: scale(1.06) rotate(2deg); }
  96%{ transform: scale(1) rotate(0); }
}
.wa-float-circle svg{ transition: transform 320ms var(--ease-out-expo); }
.wa-float-btn:hover .wa-float-circle{ transform: scale(1.08) translateY(-2px); box-shadow: 0 1px 0 rgba(255,255,255,.25) inset, 0 20px 38px rgba(15,60,32,.44); filter: brightness(1.05); }
.wa-float-btn:hover .wa-float-circle svg{ transform: rotate(-8deg) scale(1.08); }
.wa-float-label{
  font-size:.92rem; font-weight:700; white-space:nowrap; line-height:1; color: var(--color-secondary-dark, #1a2b4c);
  background:#fff; padding:10px 18px; border-radius:999px;
  box-shadow: 0 8px 20px rgba(15,30,60,.18), 0 1px 0 rgba(255,255,255,.6) inset;
  border: 1px solid rgba(15,30,60,.06);
  transition: transform var(--transition), box-shadow var(--transition);
}
.wa-float-btn:hover .wa-float-label{ transform: translateY(-1px); box-shadow: 0 10px 24px rgba(15,30,60,.22); }
.wa-tooltip{
  position:absolute; right: calc(100% + 12px); top:32px; transform: translateY(-50%) translateX(6px);
  background: var(--color-secondary-dark); color:#fff; padding:9px 15px; border-radius:8px; font-size:.82rem;
  white-space:nowrap; opacity:0; pointer-events:none; transition: opacity var(--transition), transform var(--transition);
}
.wa-float-btn:hover .wa-tooltip{ opacity:1; transform: translateY(-50%) translateX(0); }
@media (prefers-reduced-motion: reduce){ .wa-float-circle{ animation:none; } }
@media (max-width: 640px){
  #wa-float{ right:16px; bottom: calc(16px + env(safe-area-inset-bottom, 0px)); }
  .wa-float-circle{ width:56px; height:56px; animation:none; }
  .wa-float-label{ font-size:.85rem; padding:8px 14px; }
}

/* ---------- Footer ---------- */
.site-footer{
  background:
    radial-gradient(900px 420px at 12% 0%, rgba(47,91,199,.18), transparent 55%),
    linear-gradient(175deg, var(--color-ink-2) 0%, var(--color-ink) 100%);
  color: var(--color-ink-muted); padding: var(--space-5) 0 0; position:relative; overflow:hidden;
}
.site-footer::before{
  content:""; position:absolute; top:0; left:0; right:0; height:3px;
  background: linear-gradient(90deg, var(--color-primary), var(--color-accent), var(--color-primary));
}
.site-footer::after{
  content:""; position:absolute; inset:0; pointer-events:none; opacity:.4; z-index:0;
  background-image:
    linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.05) 1px, transparent 1px);
  background-size: 42px 42px;
  mask-image: radial-gradient(ellipse at 15% 0%, #000 0%, transparent 60%);
}
.site-footer > *{ position:relative; z-index:1; }
.footer-grid{ display:grid; grid-template-columns: 1.4fr 1fr 1fr 1.2fr; gap: 40px; padding-bottom: 44px; }
.footer-logo{ height:48px; margin-bottom:16px; background:#fff; padding:8px 14px; border-radius: var(--radius-sm); box-shadow: var(--shadow-sm); }
.footer-social{ display:flex; gap:14px; margin-top:14px; }
.footer-social a{
  display:flex; align-items:center; gap:7px;
  font-size:.8rem; font-weight:700; color: var(--color-ink-text);
  border:1px solid var(--color-ink-border); padding:8px 14px; border-radius:999px;
  transition: border-color var(--transition), color var(--transition), background var(--transition);
}
.footer-social a:hover{ color:#8FB0FF; border-color:#8FB0FF; background: rgba(255,255,255,.06); }
.footer-col h4{ color: var(--color-ink-text); font-size:.95rem; margin-bottom:18px; letter-spacing:.02em; }
.footer-col h4::before{ content:""; display:inline-block; width:16px; height:2px; background:var(--color-accent); margin-right:8px; vertical-align:middle; }
.footer-col ul li{ margin-bottom:11px; font-size:.9rem; }
.footer-col a{ color: var(--color-ink-muted); }
.footer-col a:hover{ color:#8FB0FF; }
.footer-bottom{
  border-top: 1px solid var(--color-ink-border); padding: 22px 24px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
  font-size:.82rem;
}
.footer-legal{ display:flex; gap:20px; }
.footer-legal a:hover{ color:#8FB0FF; }
@media (max-width: 900px){ .footer-grid{ grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px){ .footer-grid{ grid-template-columns: 1fr; } }

/* ---------- Tarjetas de servicio ---------- */
.card-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap: 26px; }
@media (max-width: 980px){ .card-grid{ grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px){ .card-grid{ grid-template-columns: 1fr; } }

.service-card{
  background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-md);
  overflow:hidden; transition: transform var(--transition), box-shadow var(--transition), border-color var(--transition);
  display:flex; flex-direction:column; position:relative;
}
.service-card::before{
  content:""; position:absolute; inset:0; z-index:2; pointer-events:none; border-radius:inherit;
  background: radial-gradient(220px circle at var(--mx,50%) var(--my,0%), rgba(var(--color-accent-rgb),.12), transparent 70%);
  opacity:0; transition: opacity var(--transition);
}
.service-card:hover::before{ opacity:1; }
.service-card::after{
  content:""; position:absolute; inset:0; border-radius: inherit; padding:1px;
  background: linear-gradient(135deg, rgba(var(--color-accent-rgb),.5), transparent 40%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  opacity:0; transition: opacity var(--transition); pointer-events:none;
}
.service-card:hover{ transform: translateY(-8px); box-shadow: var(--shadow-lg); border-color: transparent; }
.service-card:hover::after{ opacity:1; }
.service-card-media{ aspect-ratio: 4/3; overflow:hidden; position:relative; background: var(--color-secondary); }
.service-card-media img{ width:100%; height:100%; object-fit:cover; transition: transform 600ms var(--ease-out-expo); }
.service-card:hover .service-card-media img{ transform: scale(1.08); }
.service-card-media::after{
  content:""; position:absolute; inset:0;
  background: linear-gradient(180deg, transparent 60%, rgba(15,31,69,.35));
  opacity:0; transition: opacity var(--transition);
}
.service-card:hover .service-card-media::after{ opacity:1; }
.service-card-body{ padding: 24px 24px 26px; display:flex; flex-direction:column; gap:10px; flex:1; }
.service-card-body h3{ font-size:1.15rem; margin:0; }
.service-card-body p{ font-size:.92rem; margin:0; flex:1; }
.service-card-link{ font-weight:700; color: var(--color-primary); display:inline-flex; align-items:center; gap:6px; font-size:.88rem; }
.service-card:hover .service-card-link{ gap:10px; }

/* Variante compacta usada como enlace de "servicios relacionados" */
a.service-card{ padding: 26px 24px; justify-content:space-between; }
a.service-card h3{ margin-bottom:6px; }
a.service-card p{ margin:0; font-size:.9rem; }
a.service-card::before{
  content:"→"; position:absolute; top:22px; right:22px; color: var(--color-border-strong);
  font-family: var(--font-display); font-weight:700; font-size:1.1rem; transition: color var(--transition), transform var(--transition);
}
a.service-card:hover::before{ color: var(--color-primary); transform: translate(3px,-3px); }

/* ---------- Grilla editorial de servicios de metrología y calibración ----------
   Reemplaza la cuadrícula uniforme de 4 columnas (Fase 5/6) por una
   composición tipo "bento" con jerarquía real: un servicio destacado más
   grande, dos medianos, tres pequeños del mismo tamaño entre sí y un
   séptimo a todo el ancho con número editorial grande. Los 7 siguen siendo
   el mismo <button data-lightbox>, con igual comportamiento de clic/teclado
   — la jerarquía es solo de tamaño y posición, nunca de accesibilidad: no
   hay ningún servicio a más de un clic de distancia que los demás. */
.metrology-grid{
  display:grid; grid-template-columns: repeat(6, 1fr); grid-auto-rows: minmax(150px, auto);
  gap: 20px;
}
.metrology-card{ grid-column: span 2; grid-row: span 1; }
.metrology-card[data-size="feature"]{ grid-column: span 3; grid-row: span 2; }
.metrology-card[data-size="wide"]{ grid-column: span 3; grid-row: span 1; }
.metrology-card[data-size="banner"]{ grid-column: span 6; grid-row: span 1; }

@media (max-width: 900px){
  .metrology-grid{ grid-template-columns: repeat(2, 1fr); }
  .metrology-card, .metrology-card[data-size="wide"], .metrology-card[data-size="feature"]{ grid-column: span 1; grid-row: span 1; }
  .metrology-card[data-size="feature"]{ grid-column: span 2; }
  .metrology-card[data-size="banner"]{ grid-column: span 2; }
}
@media (max-width: 560px){
  .metrology-grid{ grid-template-columns: 1fr; }
  .metrology-card, .metrology-card[data-size="wide"], .metrology-card[data-size="feature"], .metrology-card[data-size="banner"]{ grid-column: span 1; }
}

.metrology-card{
  position:relative; display:block; text-align:left; height:100%;
  background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-md);
  overflow:hidden; cursor:pointer; padding:0; font-family:inherit;
  transition: transform var(--transition), box-shadow var(--transition), border-color var(--transition);
}
.metrology-card:hover, .metrology-card:focus-visible{
  transform: translateY(-6px); box-shadow: var(--shadow-lg); border-color: transparent; outline:none;
}
.metrology-card-media{ position:absolute; inset:0; overflow:hidden; background: var(--color-ink); }
.metrology-card[data-size]:not([data-size="banner"]) .metrology-card-media,
.metrology-card:not([data-size]) .metrology-card-media{ position:relative; aspect-ratio:4/3; }
.metrology-card[data-size="feature"] .metrology-card-media,
.metrology-card[data-size="wide"] .metrology-card-media,
.metrology-card[data-size="banner"] .metrology-card-media{ position:absolute; inset:0; aspect-ratio:auto; }
.metrology-card-media img{ width:100%; height:100%; object-fit:cover; transition: transform 600ms var(--ease-out-expo); }
.metrology-card:hover .metrology-card-media img{ transform: scale(1.08) rotate(-1deg); }
.metrology-card-media::after{
  content:""; position:absolute; inset:0;
  background: linear-gradient(180deg, transparent 40%, rgba(10,21,48,.8) 100%);
}
.metrology-card[data-size="banner"] .metrology-card-media::after{
  background: linear-gradient(90deg, rgba(10,21,48,.85) 0%, rgba(10,21,48,.35) 55%, transparent 100%);
}
.metrology-card-num{
  position:absolute; top:14px; left:16px; z-index:1;
  font-family: var(--font-display); font-weight:800; font-size:.78rem; letter-spacing:.08em;
  color: rgba(255,255,255,.85); background: rgba(6,12,28,.5); padding:4px 10px; border-radius:999px;
}
.metrology-card[data-size="feature"] .metrology-card-num,
.metrology-card[data-size="banner"] .metrology-card-num{ font-size:.9rem; padding:6px 14px; }
.metrology-card-zoom{
  position:absolute; top:14px; right:14px; z-index:1;
  width:34px; height:34px; border-radius:50%;
  background: rgba(255,255,255,.16); backdrop-filter: blur(6px);
  border:1px solid rgba(255,255,255,.3); color:#fff;
  display:flex; align-items:center; justify-content:center;
  opacity:0; transform: scale(.8); transition: opacity var(--transition), transform var(--transition);
}
.metrology-card:hover .metrology-card-zoom{ opacity:1; transform:scale(1); }
.metrology-card-label{
  position:absolute; left:18px; right:18px; bottom:16px; z-index:1;
  color:#fff; font-family: var(--font-display); font-weight:700; font-size:1.05rem;
  display:flex; align-items:center; justify-content:space-between; gap:8px;
}
.metrology-card[data-size="feature"] .metrology-card-label{ font-size:1.5rem; }
.metrology-card[data-size="banner"] .metrology-card-label{ font-size:1.3rem; left:26px; right:26px; bottom:22px; }
.metrology-card-label svg{ flex-shrink:0; opacity:.75; transition: transform var(--transition), opacity var(--transition); }
.metrology-card:hover .metrology-card-label svg{ transform: translate(3px,-3px); opacity:1; }
/* Alto explícito por tamaño de celda (grid-auto-rows por sí solo no basta
   cuando el contenido es absolute — position:absolute lo sacaría del flujo
   sin darle altura al elemento padre .metrology-card, colapsando la celda). */
.metrology-card{ min-height: 190px; }
.metrology-card[data-size="feature"]{ min-height: 400px; }
.metrology-card[data-size="wide"]{ min-height: 190px; }
.metrology-card[data-size="banner"]{ min-height: 220px; }

/* ---------- Paneles de datos técnicos (usados en fichas de certificación) ---------- */
.equip-grid{ display:grid; grid-template-columns: repeat(4,1fr); gap: 14px; }
.equip-chip{
  background:#fff; border:1px solid var(--color-border); border-radius: var(--radius-sm);
  padding: 16px; font-size:.86rem; font-weight:600; color: var(--color-secondary-dark);
  display:flex; align-items:center; gap:10px; transition: border-color var(--transition), color var(--transition), transform var(--transition), box-shadow var(--transition), background var(--transition);
  position:relative; cursor:pointer;
}
.equip-chip::before{ content:""; width:8px; height:8px; border-radius:2px; background: var(--hero-accent); flex-shrink:0; transform: rotate(45deg); transition: background var(--transition), transform var(--transition); }
.equip-chip:hover{ border-color: var(--hero-accent); color: var(--hero-accent); transform: translateY(-3px); box-shadow: var(--shadow-sm); }
.equip-chip:focus-visible{ outline:2px solid var(--hero-accent); outline-offset:2px; }
.equip-chip.is-active{
  border-color: var(--hero-accent); color: var(--hero-accent);
  background: rgba(var(--color-accent-rgb),.06); box-shadow: var(--shadow-sm);
}
.equip-chip.is-active::before{ background: var(--hero-accent); transform: rotate(45deg) scale(1.3); }
@media (max-width: 900px){ .equip-grid{ grid-template-columns: repeat(2,1fr); } }

/* -- Hotspots interactivos sobre la foto de "Elementos evaluados" (inspirado
   en el patrón de puntos de producto de "Veyra Electric"): puntos que se
   activan junto con el chip correspondiente de la cuadrícula de abajo. Solo
   se agregan sobre fotos con 4-8 elementos evaluados (ver
   initEquipHotspots() en components.js); en el resto, la foto y los chips
   quedan exactamente igual que antes. -- */
/* .split-media recorta su contenido (overflow:hidden) para las esquinas
   redondeadas — pero eso también cortaría las etiquetas flotantes de los
   hotspots cuando aparecen cerca del borde. Se anula ese recorte solo aquí
   (selector de dos clases, más específico que ".split-media" a secas, así
   gana sin importar el orden de los archivos CSS) y el redondeado de esquina
   pasa a la propia imagen. */
.split-media.equip-hotspot-media{ overflow:visible; isolation:isolate; }
.equip-hotspot-media img{ border-radius: inherit; }
.equip-hotspot{
  position:absolute; left: var(--hx); top: var(--hy); transform: translate(-50%,-50%);
  width:36px; height:36px; padding:0; margin:0; border:none; border-radius:50%; cursor:pointer;
  background: rgba(255,255,255,.92); backdrop-filter: blur(2px);
  box-shadow: 0 2px 10px rgba(10,21,48,.35), 0 0 0 2px rgba(255,255,255,.6);
  display:flex; align-items:center; justify-content:center; z-index:2;
  transition: transform 240ms cubic-bezier(.34,1.56,.64,1), background 200ms ease;
}
.equip-hotspot-plus{
  font-size:1.1rem; font-weight:800; line-height:1; color: var(--color-primary);
  transition: transform 220ms ease, color 200ms ease;
}
.equip-hotspot-ring{
  position:absolute; inset:-9px; border-radius:50%; border:2px solid rgba(255,255,255,.85);
  opacity:0; animation: equip-hotspot-pulse 2.4s ease-out infinite;
}
@keyframes equip-hotspot-pulse{
  0%{ transform:scale(.65); opacity:.85; }
  100%{ transform:scale(1.55); opacity:0; }
}
.equip-hotspot:hover, .equip-hotspot:focus-visible{ transform: translate(-50%,-50%) scale(1.12); }
.equip-hotspot:focus-visible{ outline:2px solid #fff; outline-offset:2px; }
.equip-hotspot.is-active{ background: var(--color-primary); }
.equip-hotspot.is-active .equip-hotspot-plus{ color:#fff; transform: rotate(45deg); }
.equip-hotspot.is-active .equip-hotspot-ring{ animation-play-state: paused; opacity:0; }
@media (prefers-reduced-motion: reduce){ .equip-hotspot-ring{ animation:none; opacity:0; } }

.equip-hotspot-label{
  position:absolute; left: var(--hx); top: var(--hy); transform: translate(-50%, calc(-100% - 22px));
  background: var(--color-secondary-dark); color:#fff; font-size:.78rem; font-weight:700;
  padding:7px 13px; border-radius:999px; white-space:nowrap; max-width:200px; text-align:center;
  box-shadow: 0 8px 20px rgba(10,21,48,.3); pointer-events:none; z-index:3;
  opacity:0; transition: opacity 200ms ease, transform 200ms ease;
}
.equip-hotspot-label::after{
  content:""; position:absolute; top:100%; left:50%; transform:translateX(-50%);
  border:5px solid transparent; border-top-color: var(--color-secondary-dark);
}
.equip-hotspot-label.is-visible{ opacity:1; transform: translate(-50%, calc(-100% - 28px)); white-space:normal; }
@media (prefers-reduced-motion: reduce){ .equip-hotspot-label, .equip-hotspot{ transition-duration:.01ms; } }
@media (max-width: 640px){
  .equip-hotspot-label{ font-size:.72rem; max-width:150px; }
}

/* ---------- FAQ (tarjetas individuales, look "faqs-1" adaptado a Metrol) ----------
   Mismo componente reutilizado tal cual en preguntas-frecuentes/index.html y
   en la sección FAQ de cada página de servicio — un solo cambio de CSS
   alcanza a ambos, sin duplicar reglas. La viveza viene de la composición
   (acento lateral, tipografía, sombra) y de la respuesta al hover/foco, no
   de elementos en movimiento constante. */
.faq-wrap{ display:flex; flex-direction:column; gap:16px; }
.faq-item{
  position:relative; border:1px solid var(--color-border); border-radius: var(--radius-lg, 18px);
  background:#fff; overflow:hidden;
  transition: border-color var(--transition), box-shadow var(--transition), background var(--transition), transform var(--transition);
}
.faq-item::before{
  content:""; position:absolute; inset:0 auto 0 0; width:4px;
  background: linear-gradient(180deg, var(--color-primary), var(--color-accent));
  transform: scaleY(0); transform-origin:top; transition: transform 260ms var(--ease-out-expo);
}
.faq-item:hover{ border-color: rgba(var(--color-primary-rgb),.35); box-shadow: var(--shadow-sm); }
.faq-item.open{
  border-color: var(--color-primary); box-shadow: var(--shadow-md);
  background: rgba(var(--color-primary-rgb),.03); transform: translateY(-1px);
}
.faq-item.open::before{ transform: scaleY(1); }
.faq-question{
  width:100%; background:none; border:none; text-align:left; padding: 22px 26px 22px 30px;
  display:flex; justify-content:space-between; align-items:center; gap:18px; cursor:pointer;
  font-family: var(--font-display); font-weight:700; font-size:1.04rem; color: var(--color-secondary-dark);
  transition: color var(--transition), background var(--transition);
}
.faq-question:hover{ color: var(--color-primary); background: rgba(var(--color-primary-rgb),.02); }
.faq-question:focus-visible{ outline:2px solid var(--color-accent); outline-offset:-3px; border-radius: var(--radius-sm); }
.faq-question .plus{
  flex-shrink:0; transition: transform 280ms var(--ease-out-expo), background var(--transition), color var(--transition), box-shadow var(--transition);
  width:32px; height:32px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  font-size:1.25rem; font-weight:400; color: var(--color-primary); background: var(--hero-accent-soft);
}
.faq-item.open .faq-question{ color: var(--color-primary); }
.faq-item.open .plus{
  transform: rotate(135deg) scale(1.08); background: var(--color-primary); color:#fff;
  box-shadow: 0 0 0 5px rgba(var(--color-primary-rgb),.14);
}
/* max-height medido en JS (ver main.js), no grid-template-rows: un padding
   dentro del elemento que colapsa (el <p>) siempre aporta una altura mínima
   no comprimible aunque el row sea "0fr" y tenga overflow:hidden -- eso
   dejaba ~22px de la respuesta visibles incluso cerrada. Con la altura real
   medida por JS, nunca se corta una respuesta larga ni queda un hueco al
   cerrar, sin importar cuánto texto tenga. */
.faq-answer{ max-height:0; overflow:hidden; transition: max-height var(--transition-slow); }
.faq-answer p{ margin:0; padding: 2px 26px 24px 30px; color: var(--color-muted); font-size:.96rem; line-height:1.6; border-top:1px solid var(--color-border); padding-top:14px; margin-top:2px; }
@media (prefers-reduced-motion: reduce){
  .faq-item, .faq-item::before, .faq-question, .faq-question .plus{ transition-duration:.01ms; }
}

/* ---------- Formularios ---------- */
.quote-form h4{
  font-size:.82rem; text-transform:uppercase; letter-spacing:.08em; color: var(--color-primary);
  margin: 26px 0 14px; padding-top:18px; border-top:1px solid var(--color-border);
}
.quote-form h4:first-of-type{ margin-top:0; padding-top:0; border-top:none; }
.form-grid{ display:grid; grid-template-columns: repeat(2, 1fr); gap: 18px; }
@media (max-width:700px){ .form-grid{ grid-template-columns: 1fr; } }
.field{ display:flex; flex-direction:column; gap:7px; }
.field.full{ grid-column: 1 / -1; }
.field label{ font-size:.83rem; font-weight:600; color: var(--color-secondary-dark); }
.field input, .field select, .field textarea{
  height:48px; padding: 0 15px; border:1px solid var(--color-border); border-radius: var(--radius-sm);
  font-family: var(--font-body); font-size: .95rem; background: var(--color-surface); color: var(--color-text);
  transition: border-color var(--transition), box-shadow var(--transition), background var(--transition);
}
.field textarea{ height:auto; padding:12px 15px; resize:vertical; }
.field input:hover, .field select:hover, .field textarea:hover{ border-color: var(--color-border-strong); }
.field input:focus, .field select:focus, .field textarea:focus{
  outline:none; border-color: var(--color-primary); background:#fff; box-shadow: 0 0 0 4px rgba(27,59,140,.10);
}
.field-hint{ font-size:.78rem; color: var(--color-muted); }
.honeypot{ position:absolute; left:-9999px; opacity:0; }
.form-msg{ padding:14px 16px; border-radius: var(--radius-sm); font-size:.9rem; display:none; }
.form-msg.success{ display:block; background: rgba(31,138,76,.1); color: var(--color-success); }
.form-msg.error{ display:block; background: rgba(194,59,50,.1); color: var(--color-error); }
.form-msg.notice{ display:block; background: rgba(var(--color-accent-rgb),.12); color: var(--color-secondary-dark); border:1px solid rgba(var(--color-accent-rgb),.25); }
.form-msg.notice a{ color: var(--color-primary); font-weight:600; }
.quote-form .btn{ width:100%; margin-top:8px; }
.form-unavailable-notice{
  display:flex; flex-wrap:wrap; gap:10px; align-items:center; justify-content:space-between;
  padding:16px 18px; margin-bottom:20px; border-radius: var(--radius-sm);
  background: rgba(var(--color-accent-rgb),.12); border:1px solid rgba(var(--color-accent-rgb),.25);
  color: var(--color-secondary-dark); font-size:.92rem;
}
.form-unavailable-notice .btn{ width:auto; margin-top:0; flex-shrink:0; }

/* Panel que envuelve el formulario en las páginas */
.form-panel{
  background:#fff; border: 1px solid var(--color-border); border-radius: var(--radius-lg);
  padding: clamp(24px, 4vw, 40px); box-shadow: var(--shadow-md); position:relative; overflow:hidden;
}
.form-panel::before{
  content:""; position:absolute; top:0; left:0; right:0; height:3px;
  background: linear-gradient(90deg, var(--hero-accent), var(--color-accent));
}

/* ---------- Breadcrumbs ---------- */
.breadcrumbs{ display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:.85rem; color: var(--color-muted); margin-bottom: 18px; }
.breadcrumbs a{ color: var(--color-muted); transition: color var(--transition); }
.breadcrumbs a:hover{ color: var(--color-primary); }
.breadcrumbs span{ opacity:.4; }

/* ---------- Proceso orbital (mejora de ".process-track"; ver initOrbitalProcess/buildOrbitalProcess) ----------
   Vive dentro de una sección ".section-dark" (superficie navy protagonista,
   ver 404/README): el orbital y el panel de detalle están pensados para esa
   superficie por defecto (colores claros sobre navy), no como una excepción
   condicional — es la única superficie donde aparece este componente.
   La representación (orbital+detalle en escritorio, lista en pantallas
   angostas) la decide SOLO JavaScript, alternando el atributo `hidden` según
   el ancho de viewport (ver applyMode() en components.js). A propósito no
   hay aquí ninguna regla de media query que también intente mostrar/ocultar
   estos mismos elementos por `display` — esa duplicación de fuente de verdad
   fue justo el bug de una versión anterior (dos reglas de igual especificidad
   peleando por orden de cascada). Todo lo que hace falta es que `[hidden]`
   gane siempre, de ahí los overrides explícitos de abajo. */
.orbital-process{ margin-top: 28px; }

/* -- Escritorio: círculos alrededor de un centro. Anillo fino y sin relleno
   (ni disco de fondo ni glow que llene el círculo) — solo una línea nítida
   y los nodos alrededor, como en la referencia adjuntada. -- */
.orbital-stage{
  position:relative; width:100%; max-width:720px; aspect-ratio:1/1; margin:0 auto;
}
.orbital-ring{
  position:absolute; inset:7%; border-radius:50%;
  border:1.5px solid rgba(255,255,255,.4);
}
@media (prefers-reduced-motion: reduce){ .orbital-ring{ transition:none; } }

/* El logo ahora es el emblema COMPLETO (aro azul + instrumento + texto),
   ya circular y con fondo transparente por sí mismo — el contenedor ya NO
   necesita pintar su propio fondo/aro/borde blanco detrás (eso duplicaría
   el aro que el propio archivo ya trae). Solo una sombra de profundidad,
   nunca un círculo o borde visible extra. Padding mínimo (antes 12%, que
   dejaba el logo ocupando apenas ~76% del contenedor): con ~3% el logo
   llena ~94% del círculo central, cumpliendo el 90-95% pedido. */
/* Bug real encontrado: ".orbital-center-dot" está en position:absolute, así
   que su "containing block" para resolver porcentajes de PADDING es
   ".orbital-stage" (el círculo grande), no el propio 34% del centro — un
   padding:3% aquí se calculaba como 3% del escenario completo (~21px），no
   3% del círculo central, y por eso el logo terminaba ocupando ~82% en vez
   del 90-95% pedido pese a que el número en el CSS decía "3%". width/height
   en un hijo flex normal sí se resuelven contra la caja del propio padre,
   así que el tamaño del logo se fija directamente en la imagen (94%) en vez
   de con padding en el contenedor — evita el mismo bug de raíz. */
.orbital-center-dot{
  position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); z-index:2;
  width:34%; aspect-ratio:1/1; border-radius:50%;
  filter: drop-shadow(0 10px 22px rgba(0,0,0,.35));
  display:flex; align-items:center; justify-content:center;
}
.orbital-center-logo{ width:94%; height:94%; object-fit:contain; aspect-ratio:1/1; }

/* La posición (--x/--y) se actualiza en cada fotograma desde JS mientras
   gira el orbital: a propósito NO hay transition sobre transform aquí, para
   que ninguna transición CSS compita con esas actualizaciones continuas. El
   resaltado (color/escala del punto) si tiene transición propia, más abajo,
   porque es un cambio discreto (clic), no una actualización por fotograma. */
.orbital-node{
  position:absolute; top:50%; left:50%; z-index:3;
  transform: translate(calc(-50% + var(--x,0px)), calc(-50% + var(--y,0px)));
  display:flex; flex-direction:column; align-items:center; gap:8px;
  background:none; border:none; cursor:pointer; padding:4px; width:104px;
}
.orbital-node-dot{
  width:44px; height:44px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  background:#fff; border:2px solid rgba(255,255,255,.4); color: var(--color-secondary-dark);
  font-family: var(--font-display); font-weight:800; font-size:1.05rem;
  box-shadow: 0 8px 20px rgba(0,0,0,.28);
  transition: background 200ms ease, border-color 200ms ease, color 200ms ease, box-shadow 200ms ease, transform 280ms cubic-bezier(.34,1.56,.64,1);
}
/* Chip de apoyo detrás de la etiqueta: además del alto contraste de
   --color-ink-text sobre navy, un fondo propio evita que el anillo, el
   conector de la tarjeta o el logo del centro crucen justo detrás de la
   letra y le resten legibilidad en algún ángulo de la rotación — una sombra
   de texto sola no lo garantiza en todos los fondos posibles. */
.orbital-node-label{
  font-size:.82rem; font-weight:700; color: var(--color-ink-text); line-height:1.2; text-align:center;
  background: rgba(6,12,28,.55); padding:3px 9px; border-radius:999px; backdrop-filter: blur(2px);
}
.orbital-node:hover .orbital-node-dot{ transform: scale(1.08); }
.orbital-node:focus-visible .orbital-node-dot{ outline:2px solid #fff; outline-offset:3px; }
.orbital-node.is-active .orbital-node-dot{
  background: var(--color-accent); border-color:#fff; color:#fff; transform: scale(1.14);
  box-shadow: 0 0 0 7px rgba(143,176,255,.22), 0 10px 26px rgba(0,0,0,.35);
}
.orbital-node.is-active .orbital-node-label{ color:#fff; }
@media (prefers-reduced-motion: reduce){
  .orbital-node-dot{ transition-duration: .01ms; }
}

/* -- Control de pausa/reanudación (accesible, discreto) -- */
.orbital-controls{ display:flex; justify-content:center; margin-top:20px; }
.orbital-controls[hidden]{ display:none; }
.orbital-pause-toggle{
  display:inline-flex; align-items:center; padding:9px 20px; border-radius:999px;
  border:1px solid rgba(255,255,255,.5); background:#fff; color: var(--color-secondary-dark);
  font-size:.82rem; font-weight:700; cursor:pointer; transition: border-color var(--transition), color var(--transition), transform var(--transition);
  min-height:38px;
}
.orbital-pause-toggle:hover{ border-color: var(--color-primary); color: var(--color-primary); transform: translateY(-1px); }
.orbital-pause-toggle:focus-visible{ outline:2px solid #fff; outline-offset:2px; }
.orbital-pause-toggle[hidden]{ display:none; }

/* -- Panel de detalle (escritorio): flota anclado justo debajo del nodo
   seleccionado (que centerNode() siempre lleva a la posición superior), con
   un pequeño conector — como en la referencia "radial orbital timeline"
   adjuntada. Reemplaza la variante de columna lateral de una actualización
   anterior. Más ancho que el primer intento de esta variante flotante, para
   que el párrafo ampliado y los puntos prácticos quepan sin reducir la
   letra ni recortar contenido. -- */
.orbital-detail{
  position:absolute; left:50%; transform:translateX(-50%); z-index:5;
  width:min(380px, 94%);
}
.orbital-detail[hidden]{ display:none; }
.orbital-detail-connector{
  position:absolute; left:50%; top:-14px; transform:translateX(-50%);
  width:2px; height:14px; border-radius:2px;
  background: linear-gradient(to bottom, rgba(255,255,255,.05), rgba(255,255,255,.6));
}
@media (prefers-reduced-motion: reduce){ .orbital-detail-connector{ transition:none; } }
/* Entrada con un pequeño rebote (overshoot) en vez de un fundido plano: se
   siente inmediata y elástica, no un trámite lento. La posición nunca
   compite con animación por fotograma (eso es exclusivo de .orbital-node),
   así que aquí sí puede llevar una transition normal de CSS. */
.orbital-detail-card{
  position:relative; width:100%; background:#fff; border-radius: var(--radius-md);
  box-shadow: 0 24px 60px rgba(0,0,0,.45);
  padding: clamp(22px,2.6vw,28px) clamp(24px,2.8vw,30px) 26px; opacity:1; transform: translateY(0) scale(1);
  transition: opacity 220ms cubic-bezier(.34,1.56,.64,1), transform 320ms cubic-bezier(.34,1.56,.64,1);
  overflow:hidden;
}
.orbital-detail-card::before{
  content:""; position:absolute; inset:0 0 auto 0; height:5px;
  background: linear-gradient(90deg, var(--color-primary), var(--color-accent));
}
.orbital-detail-card.is-fading, .orbital-detail-card.is-entering{ opacity:0; transform: translateY(10px) scale(.95); }
.orbital-detail-close{
  position:absolute; top:14px; right:14px; width:28px; height:28px; border-radius:50%;
  border:1px solid var(--color-border); background:#fff; color: var(--color-muted);
  display:flex; align-items:center; justify-content:center; cursor:pointer;
  transition: color 160ms ease, border-color 160ms ease, background 160ms ease, transform 160ms ease;
}
.orbital-detail-close:hover{ color:#fff; background: var(--color-primary); border-color: var(--color-primary); transform: rotate(90deg); }
.orbital-detail-close:focus-visible{ outline:2px solid var(--color-primary); outline-offset:2px; }
.orbital-detail-num{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:30px; height:30px; padding:0 6px; border-radius:999px; margin-bottom:12px;
  background: rgba(var(--color-primary-rgb),.1); color: var(--color-primary);
  font-family: var(--font-display); font-weight:800; font-size:.85rem;
}
/* Bug real confirmado (prioridad de legibilidad, Fase 7): ".section-dark
   h4"/".section-dark p" (global.css) tienen más especificidad — clase+
   etiqueta — que ".orbital-detail-title"/".orbital-detail-desc" solas (una
   sola clase), así que esas reglas de la sección oscura ganaban y pintaban
   el título y la descripción de la tarjeta con los colores CLAROS pensados
   para fondo navy, sobre la tarjeta BLANCA de detalle — texto casi
   invisible (gris muy claro sobre blanco). La tarjeta debe verse igual sin
   importar el tema de la sección que la contiene, así que aquí se califica
   con el propio contenedor (".orbital-detail" + clase = más específico que
   la regla del tema oscuro) en vez de subir la especificidad con !important. */
.orbital-detail .orbital-detail-title{ font-size:1.28rem; margin:0 0 10px; line-height:1.2; padding-right:26px; color: var(--color-secondary-dark); }
.orbital-detail .orbital-detail-desc{ font-size:1rem; color: var(--color-muted); margin:0; line-height:1.65; }
.orbital-detail-points{ list-style:none; margin:18px 0 0; padding:0; display:flex; flex-direction:column; gap:9px; }
.orbital-detail-points[hidden]{ display:none; }
.orbital-detail-points li{
  font-size:.88rem; color: var(--color-secondary-dark); line-height:1.4;
  padding-left:22px; position:relative;
}
.orbital-detail-points li::before{ content:"→"; position:absolute; left:0; top:0; color: var(--color-primary); font-weight:800; }
@media (prefers-reduced-motion: reduce){
  .orbital-detail-card, .orbital-detail-close{ transition-duration:.01ms; }
}

/* -- Móvil / sin espacio suficiente: única alternativa, lista vertical desplegable -- */
.orbital-list[hidden]{ display:none; }
.orbital-list{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:12px; max-width:560px; margin-inline:auto; }
.orbital-list-item{ border:1px solid var(--color-ink-border); border-radius: var(--radius-md); background: var(--color-ink-surface); overflow:hidden; }
.orbital-list-item.open{ border-color: var(--color-accent); }
.orbital-list-toggle{
  width:100%; display:flex; align-items:center; gap:14px; padding:16px 18px;
  background:none; border:none; text-align:left; cursor:pointer;
  font-family: var(--font-display); font-weight:600; color: var(--color-ink-text);
}
.orbital-list-toggle:focus-visible{ outline:2px solid #fff; outline-offset:-2px; }
.orbital-list-num{
  flex-shrink:0; width:28px; height:28px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  background: rgba(143,176,255,.16); color:#8FB0FF;
  font-size:.82rem; font-weight:800;
}
.orbital-list-title{ flex:1; }
.orbital-list-chevron{
  flex-shrink:0; width:9px; height:9px; border-right:2px solid var(--color-ink-muted); border-bottom:2px solid var(--color-ink-muted);
  transform: rotate(45deg); transition: transform var(--transition);
}
.orbital-list-item.open .orbital-list-chevron{ transform: rotate(-135deg); border-color:#8FB0FF; }
.orbital-list-panel{ display:grid; grid-template-rows:0fr; transition: grid-template-rows var(--transition-slow); overflow:hidden; }
.orbital-list-panel[hidden]{ display:none; }
.orbital-list-item.open .orbital-list-panel{ grid-template-rows:1fr; }
.orbital-list-panel p{ padding: 0 18px 12px; margin:0; min-height:0; overflow:hidden; color: var(--color-ink-muted); font-size:.9rem; line-height:1.55; }
.orbital-list-panel ul{ list-style:none; margin:0; padding:0 18px 18px; display:flex; flex-direction:column; gap:8px; }
.orbital-list-panel ul li{ font-size:.85rem; color: var(--color-ink-muted); padding-left:20px; position:relative; }
.orbital-list-panel ul li::before{ content:"→"; position:absolute; left:0; top:0; color:#8FB0FF; font-weight:800; }

/* -- Respaldo sin JS / si falla la construcción del orbital: el
   ".process-track" original vive dentro de la misma sección navy, así que
   sus textos y su numeración también necesitan color claro. -- */
.section-dark .process-track::before{ background: rgba(255,255,255,.18); }
.section-dark .process-track .process-fill{ background:#8FB0FF; }
.section-dark .process-step h4{ color: var(--color-ink-text); }
.section-dark .process-step p{ color: var(--color-ink-muted); }
.section-dark .process-step-points{ list-style:none; margin:10px 0 0; padding:0; display:flex; flex-direction:column; gap:6px; }
.section-dark .process-step-points li{ font-size:.82rem; color: var(--color-ink-muted); padding-left:18px; position:relative; }
.section-dark .process-step-points li::before{ content:"→"; position:absolute; left:0; top:0; color:#8FB0FF; font-weight:800; }
.process-step-points{ list-style:none; margin:10px auto 0; padding:0; display:flex; flex-direction:column; gap:6px; text-align:left; max-width:230px; }
.process-step-points li{ font-size:.82rem; color: var(--color-muted); padding-left:18px; position:relative; }
.process-step-points li::before{ content:"→"; position:absolute; left:0; top:0; color: var(--color-primary); font-weight:800; }
