/* ── nb-cookies ── */

/* ══ Netebu · consentimiento de cookies ════════════════════════ */
.nb-ck{
  --nb-grad:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
  --nb-violet:#7B5CF6; --nb-violet-aa:#6B48F2;
  --nb-ink:#14111F; --nb-ink-2:#4C4560; --nb-ink-3:#726C85;
  --nb-line:#E9E4F3; --nb-line-2:#D8D0EC;
  --nb-paper:#FFFFFF; --nb-paper-2:#FAF8FE;
  --nb-ff-d:"Outfit",system-ui,-apple-system,sans-serif;
  --nb-ff-b:"Figtree",system-ui,-apple-system,sans-serif;
}

/* ── el aviso ─────────────────────────────────────────────────── */
/* VA ENCIMA DEL BOTON FLOTANTE, NO CENTRADO ABAJO. Los dos son la
   misma cosa —tu decision sobre las cookies— y asi se ve de donde sale
   el aviso y adonde vuelve al cerrarlo. Los 80 px de abajo son los 18
   del boton, mas sus 48 de alto, mas 14 de aire entre ambos: si se
   cambia el tamano del boton, hay que rehacer esta cuenta. */
.nb-ck-aviso{
  position:fixed; z-index:2147483000;
  right:18px; bottom:80px; left:auto; margin:0;
  max-width:420px;
  background:var(--nb-paper);
  border:1px solid var(--nb-line); border-radius:18px;
  box-shadow:0 2px 6px rgba(20,17,31,0.06), 0 26px 60px -22px rgba(20,17,31,0.34);
  padding:22px 24px 20px;
  font-family:var(--nb-ff-b); color:var(--nb-ink-2);
  transform-origin:100% 100%;   /* crece desde la esquina del boton */
  animation:nb-ck-entra 0.34s cubic-bezier(0.2,0.7,0.3,1) both;
}
@keyframes nb-ck-entra{from{opacity:0; transform:translateY(12px) scale(0.98)} to{opacity:1; transform:none}}
.nb-ck-aviso h2{
  margin:0 0 9px !important; padding:0;
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.18rem !important; line-height:1.3;
  letter-spacing:-0.018em; color:var(--nb-ink) !important;
}
.nb-ck-aviso p{
  margin:0 0 16px !important; font-size:0.95rem; line-height:1.6;
  color:var(--nb-ink-2) !important;
}
.nb-ck-aviso a{color:var(--nb-violet-aa) !important; text-decoration:underline;
  text-underline-offset:3px; text-decoration-color:rgba(107,72,242,0.4)}

/* LOS DOS BOTONES, DEL MISMO TAMANO Y AL MISMO NIVEL. La guia de la
   AEPD pide que rechazar sea tan facil como aceptar: misma medida,
   misma jerarquia y ninguno escondido detras de un enlace. */
.nb-ck-botones{display:grid; grid-template-columns:1fr 1fr; gap:10px}
.nb-ck-b{
  display:inline-flex; align-items:center; justify-content:center;
  min-height:46px; padding:12px 18px; border-radius:12px;
  font-family:var(--nb-ff-d); font-weight:600; font-size:0.95rem;
  cursor:pointer; border:1.5px solid transparent; text-align:center;
  transition:transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.nb-ck-b:hover{transform:translateY(-1px)}
.nb-ck-b--si{
  background:var(--nb-grad); color:#fff;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border:0; box-shadow:0 10px 24px -12px rgba(123,92,246,0.6);
}
.nb-ck-b--no{
  background:var(--nb-paper); color:var(--nb-ink);
  border-color:var(--nb-line-2);
}
.nb-ck-b--no:hover{border-color:var(--nb-violet)}
.nb-ck-b--txt{
  grid-column:1 / -1; background:none; border:0; min-height:38px;
  color:var(--nb-ink-3); font-size:0.9rem; text-decoration:underline;
  text-underline-offset:3px;
}
.nb-ck-b--txt:hover{color:var(--nb-violet-aa)}

/* ── el botón flotante, que no se va nunca ────────────────────── */
/* Es la forma de retirar el consentimiento en cualquier momento sin
   tener que buscarlo: la guia lo pide tan accesible como darlo. */
.nb-ck-flotante{
  position:fixed; z-index:2147482000;
  right:18px; bottom:18px;
  width:48px; height:48px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--nb-paper); color:var(--nb-violet-aa);
  border:1px solid var(--nb-line); cursor:pointer;
  /* Sombra teñida de violeta ya en reposo, igual que el botón de subir
     de `netebu_subir.php`. Los dos flotan en las esquinas de abajo y se
     ven a la vez: si uno lleva sombra gris y el otro violeta, se nota. */
  box-shadow:0 2px 6px rgba(123,92,246,0.10), 0 14px 30px -14px rgba(123,92,246,0.26);
  transition:transform 0.24s ease, box-shadow 0.24s ease, border-color 0.24s ease;
}
.nb-ck-flotante:hover{
  transform:translateY(-3px); border-color:var(--nb-violet);
  box-shadow:0 4px 10px rgba(20,17,31,0.1), 0 20px 40px -16px rgba(90,60,200,0.44);
}
/* EL BADGE DE reCAPTCHA VIVE EN LA MISMA ESQUINA. Google lo fija en
   `bottom:14px` con 60 px de alto y lo deja colapsado contra el borde
   derecho (`right:-186px`), justo donde cae este boton: medido, 48x48
   px de solape exacto, uno encima del otro.
   Se sube el NUESTRO, no el suyo: moverle el badge a Google entra en
   sus condiciones de uso, que exigen que quede visible.
   Con `:has()` solo se sube donde el badge existe —contacto y abrir
   ticket—, y en el resto del sitio el boton se queda donde estaba. Si
   el navegador no soporta `:has()` (Chrome 105-, Safari 15.3-) se
   queda como hasta ahora, que es el comportamiento de hoy: no rompe
   nada, simplemente no mejora. */
body:has(.grecaptcha-badge) .nb-ck-flotante{ bottom:88px }
.nb-ck-flotante svg{width:21px; height:21px}
/* la etiqueta aparece al pasar el ratón, sin ocupar sitio en reposo */
.nb-ck-flotante::after{
  content:attr(data-txt); position:absolute; right:58px;
  white-space:nowrap; background:var(--nb-ink); color:#fff;
  font-family:var(--nb-ff-d); font-weight:600; font-size:0.8rem;
  padding:7px 11px; border-radius:9px;
  opacity:0; transform:translateX(6px); pointer-events:none;
  transition:opacity 0.2s ease, transform 0.2s ease;
}
.nb-ck-flotante:hover::after,
.nb-ck-flotante:focus-visible::after{opacity:1; transform:none}

/* ── el panel de preferencias ─────────────────────────────────── */
.nb-ck-fondo{
  position:fixed; inset:0; z-index:2147483100;
  background:rgba(11,10,22,0.58); backdrop-filter:blur(3px);
  display:flex; align-items:center; justify-content:center; padding:18px;
  animation:nb-ck-fade 0.24s ease both;
}
@keyframes nb-ck-fade{from{opacity:0} to{opacity:1}}
.nb-ck-panel{
  background:var(--nb-paper); border-radius:20px;
  border:1px solid var(--nb-line);
  box-shadow:0 30px 70px -24px rgba(0,0,0,0.5);
  width:100%; max-width:520px; max-height:86vh; overflow-y:auto;
  padding:26px 26px 22px; font-family:var(--nb-ff-b);
}
.nb-ck-panel h2{
  margin:0 0 6px !important; font-family:var(--nb-ff-d) !important;
  font-weight:700 !important; font-size:1.3rem !important;
  color:var(--nb-ink) !important; letter-spacing:-0.02em;
}
.nb-ck-panel > p{
  margin:0 0 18px !important; font-size:0.94rem; line-height:1.6;
  color:var(--nb-ink-2) !important;
}
.nb-ck-cat{
  border:1px solid var(--nb-line); border-radius:14px;
  padding:16px 18px; margin:0 0 11px;
  background:var(--nb-paper-2);
}
.nb-ck-cat-cab{display:flex; align-items:center; justify-content:space-between; gap:14px}
.nb-ck-cat h3{
  margin:0 !important; font-family:var(--nb-ff-d) !important;
  font-weight:700 !important; font-size:1rem !important;
  color:var(--nb-ink) !important;
}
.nb-ck-cat p{
  margin:8px 0 0 !important; font-size:0.88rem; line-height:1.55;
  color:var(--nb-ink-2) !important;
}
.nb-ck-cat code{
  font-size:0.82rem; background:rgba(123,92,246,0.09);
  color:var(--nb-violet-aa); padding:1px 6px; border-radius:5px;
}
/* el interruptor */
.nb-ck-sw{position:relative; flex:0 0 auto; width:46px; height:26px}
.nb-ck-sw input{position:absolute; inset:0; opacity:0; margin:0; cursor:pointer; z-index:2}
.nb-ck-sw span{
  position:absolute; inset:0; border-radius:999px;
  background:#D8D0EC; transition:background 0.24s ease;
}
.nb-ck-sw span::before{
  content:""; position:absolute; top:3px; left:3px;
  width:20px; height:20px; border-radius:50%; background:#fff;
  box-shadow:0 1px 3px rgba(0,0,0,0.24);
  transition:transform 0.24s cubic-bezier(0.2,0.7,0.3,1);
}
.nb-ck-sw input:checked + span{background:var(--nb-violet)}
.nb-ck-sw input:checked + span::before{transform:translateX(20px)}
.nb-ck-sw input:focus-visible + span{outline:2px solid var(--nb-violet-aa); outline-offset:2px}
.nb-ck-sw input:disabled + span{background:var(--nb-violet); opacity:0.45; cursor:not-allowed}
.nb-ck-panel-pie{display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:18px}
.nb-ck-panel-pie .nb-ck-b{width:100%}
.nb-ck-guardar{grid-column:1 / -1}

@media (max-width:520px){
  /* 12 del boton + 48 de alto + 12 de aire */
  .nb-ck-aviso{
    left:12px; right:12px; bottom:72px; max-width:none;
    padding:16px 16px 14px;
  }

  /* EL AVISO OCUPABA EL 44 % DE UN iPHONE: 373 px de 844, medido en un
     390x844. Tapaba el titular entero de la portada y dejaba la pagina
     inservible hasta responderlo, que es justo lo que la guia de la
     AEPD pide evitar —el aviso informa, no secuestra la pantalla—.
     De donde salian esos 373 px: tres botones apilados a 58 px cada
     uno son 174, mas el parrafo a cinco lineas.
     Se recorta sin quitar ni una palabra ni una opcion. */

  /* Rechazar y aceptar, en fila y del MISMO ancho. Ahorra 116 px y
     ademas deja las dos decisiones a la misma altura y con el mismo
     tamano, que es como tiene que ser: rechazar no puede costar mas
     que aceptar. */
  .nb-ck-botones{grid-template-columns:1fr 1fr; gap:8px}
  .nb-ck-botones .nb-ck-b{padding:11px 10px; font-size:0.9rem}
  /* «Elegir que acepto» no es una tercera decision al mismo nivel:
     es el camino largo. Ocupa su propia linea, sin caja. */
  .nb-ck-botones .nb-ck-b--txt{grid-column:1 / -1; padding:4px 0 0}

  .nb-ck-aviso h2{font-size:1.06rem !important; margin-bottom:6px !important}
  .nb-ck-aviso p{font-size:0.9rem; line-height:1.5; margin-bottom:12px !important}

  .nb-ck-panel-pie{grid-template-columns:1fr}
  .nb-ck-flotante{right:12px; bottom:12px}
}

/* Pantallas cortas —un iPhone SE son 667 px, y en horizontal cualquier
   movil baja de 500—: ahi el aviso no puede pasar de un tercio. */
@media (max-width:520px) and (max-height:700px){
  .nb-ck-aviso{padding:14px 14px 12px}
  .nb-ck-aviso p{font-size:0.86rem; line-height:1.45; margin-bottom:10px !important}
}
@media (prefers-reduced-motion:reduce){
  .nb-ck-aviso, .nb-ck-fondo{animation:none}
  .nb-ck-b, .nb-ck-flotante, .nb-ck-sw span, .nb-ck-sw span::before{transition:none}
  .nb-ck-b:hover, .nb-ck-flotante:hover{transform:none}
}

/* ── nb-pie ── */

/* ══ Netebu · pie ══════════════════════════════════════════════ */
.sec.footer{
  --nb-blue:#4A90D9; --nb-violet:#7B5CF6; --nb-pink:#E84098;
  --nb-grad:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
  --nb-night:#0B0A16; --nb-night-2:#141227;
  --nb-ink:#F2F3FB; --nb-muted:#B9BEDD; --nb-faint:#8E94BC;
  --nb-line:rgba(255,255,255,0.10);
  --nb-ff-d:"Outfit",system-ui,-apple-system,sans-serif;
  --nb-ff-b:"Figtree",system-ui,-apple-system,sans-serif;
  background:var(--nb-night);
}

/* Una sola pieza oscura: antes eran tres franjas, dos de ellas blancas */
.sec.footer .footer-widgets,
.sec.footer .footer-widgets.dark,
.sec.footer .fcCode,
.sec.footer .sfooter{
  background:transparent !important;
  border:0;
}
.sec.footer .block-footer{
  background:var(--nb-night);
  position:relative;
}
/* ── Filo superior con el degradado de marca ────────────────────
   Mismo tratamiento que la juntura de `netebu_paginas.php`, y por el
   mismo motivo medido: al 85% este filo salia a #6651CD, luma 94, entre
   un #010424 por arriba (luma 6, el final del banner de cierre) y un
   #0B0A15 por abajo (11, el fondo del pie). Quince veces mas brillante
   que lo de encima. Lo que se ve no es el color, es el escalon de luz.

   Aqui NO hace falta el fundido que lleva la juntura: arriba 6 y abajo
   11 son practicamente el mismo oscuro, asi que no hay escalon entre
   las dos secciones que coser. Solo sobraba luz en el filo.

   Al 55% su luminancia baja a unos 62, en linea con la de la juntura, y
   la mascara horizontal lo apaga en los extremos: deja de ser una raya
   de borde a borde y pasa a ser un acento centrado. */
.sec.footer .block-footer::before{
  content:""; position:absolute; top:0; left:0; right:0; height:2px;
  background:var(--nb-grad); opacity:0.55; pointer-events:none;
  -webkit-mask-image:linear-gradient(90deg, rgba(0,0,0,0) 0%, #000 22%,
                                     #000 78%, rgba(0,0,0,0) 100%);
  mask-image:linear-gradient(90deg, rgba(0,0,0,0) 0%, #000 22%,
                             #000 78%, rgba(0,0,0,0) 100%);
}

/* ── titulos de columna ── */
.sec.footer h4,
.sec.footer .contacts_box h4{
  font-family:var(--nb-ff-d) !important;
  font-size:1.02rem !important; font-weight:600 !important;
  color:var(--nb-ink) !important;
  letter-spacing:-0.01em; margin-bottom:18px !important;
  padding-bottom:10px; position:relative; border:0 !important;
}
.sec.footer h4::after{
  content:""; position:absolute; left:0; bottom:0;
  width:30px; height:2px; border-radius:2px;
  background:var(--nb-grad);
}

/* El tema centra SOLO este titulo, con
     `.block-footer .footer-widgets .contacts_box h4{text-align:center}`,
   mientras que los otros cinco quedan a la izquierda. Mi subrayado va
   a `left:0`, asi que la linea no seguia al texto. En escritorio la
   columna mide unos 105 px y el desajuste no se apreciaba; en movil
   ocupa 360 px y la linea se queda en la otra punta.               */
.sec.footer .contacts_box h4::after{
  left:50%; transform:translateX(-50%);
}

/* El tema adorna TODO <mark> con una barrita amarilla inclinada:
     mark:after{background-color:#fedc45; position:absolute;
                top:0; right:-0.1em; width:0.2em; height:1.535em;
                transform:skew(-7deg,0)}
   Al <mark> del telefono ya se le dio fondo translucido y borde
   redondeado, asi que el adorno sobra y ademas es el mismo amarillo
   ajeno a la marca que aparece en el carrito.                      */
.sec.footer mark::after{content:none !important}

/* ── enlaces de las columnas ── */
/* OJO CON LA ESTRUCTURA, que aqui ya costo una correccion: el icono
   es HERMANO del enlace, no hijo.
       <li><i class="far fa-code mr-1"></i> <a>Hosting WEB</a></li>
   Las reglas `li a i` que habia antes no alcanzaban a ni un solo
   icono del pie: ni el color ni el ancho llegaban a aplicarse.
   Ademas son dos elementos en linea separados por un espacio, asi
   que la fila puede partirse por ahi. `fa-code` mide 640 unidades de
   ancho —el mas ancho de los cuatro del grupo Hosting, frente a las
   512 del sobre— y era justo esa fila la que se desencajaba.
   Con flex el icono no puede separarse del texto y todos ocupan la
   misma columna, sea cual sea el glifo.                          */
.sec.footer .navbar-items ul li{
  display:flex; align-items:center; gap:9px; margin-bottom:2px;
}
.sec.footer .navbar-items ul li > i,
.sec.footer .navbar-items ul li > .fa,
.sec.footer .navbar-items ul li > .fas,
.sec.footer .navbar-items ul li > .far,
.sec.footer .navbar-items ul li > .fal,
.sec.footer .navbar-items ul li > .fab,
.sec.footer .navbar-items ul li > .fad,
.sec.footer .navbar-items ul li a i{
  flex:0 0 18px; width:18px; margin:0 !important;
  text-align:center; font-size:0.95rem; line-height:1;
  color:var(--nb-violet) !important;
  transition:color 0.22s ease;
}
.sec.footer .navbar-items ul li:hover > i,
.sec.footer .navbar-items ul li:hover a i{color:var(--nb-pink) !important}
.sec.footer .navbar-items ul li > a{flex:1 1 auto; min-width:0}
.sec.footer .navbar-items ul li a,
.sec.footer .footer-navbar a{
  font-family:var(--nb-ff-b);
  color:var(--nb-muted) !important;
  font-size:0.945rem; line-height:1.5;
  transition:color 0.22s ease, transform 0.22s ease;
  display:inline-flex; align-items:center; gap:9px;
}
.sec.footer .navbar-items ul li a:hover,
.sec.footer .footer-navbar a:hover{
  color:var(--nb-ink) !important; transform:translateX(3px);
}

/* ── redes sociales: circulares, no cuadradas ── */
.sec.footer .social-icons{display:flex; gap:10px}
.sec.footer .btn-social{
  width:38px !important; height:38px !important;
  border-radius:50% !important;
  background:rgba(255,255,255,0.06) !important;
  border:1px solid var(--nb-line) !important;
  transition:background 0.24s ease, border-color 0.24s ease, transform 0.24s ease;
}
.sec.footer .btn-social:hover{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border-color:transparent !important; transform:translateY(-2px);
}
.sec.footer .btn-social .fab,
.sec.footer .btn-social .fas,
.sec.footer .btn-social i{
  color:var(--nb-muted) !important; font-size:16px !important;
}
.sec.footer .btn-social:hover .fab,
.sec.footer .btn-social:hover i{color:#fff !important}

/* ── telefono: era un <mark>, y Bootstrap los pinta de amarillo ── */
.sec.footer mark,
.sec.footer .bigger-110 mark{
  background:rgba(255,255,255,0.06) !important;
  border:1px solid var(--nb-line);
  color:var(--nb-ink) !important;
  font-family:var(--nb-ff-d); font-weight:600; font-size:0.98rem;
  border-radius:10px; padding:9px 15px !important;
  display:inline-flex; align-items:center; gap:9px;
  transition:border-color 0.24s ease, background 0.24s ease;
}
.sec.footer a:hover mark{
  border-color:rgba(123,92,246,0.55) !important;
  background:rgba(123,92,246,0.12) !important;
}
.sec.footer mark i{color:var(--nb-blue) !important}

/* ── ALTURA TACTIL EN MOVIL ──────────────────────────────────
   MEDIDO a 390 px: el enlace del telefono daba 21 px de alto y
   "Nosotros" 16. El telefono es el peor caso: en movil ES el boton
   de llamar. La causa es que el <a> va en linea, asi que su caja es
   la de la linea de texto y no la de su contenido —el <mark>, que
   si tiene relleno—. Pasa a `inline-flex` y ya mide lo que ocupa. */
@media (max-width:767px){
  .sec.footer a.bigger-110{
    display:inline-flex; align-items:center; min-height:44px;
  }
  .sec.footer .copyright a, .sec.footer .footer-bottom a{
    display:inline-flex; align-items:center; min-height:36px;
    padding:0 2px;
  }
}

/* ── boton de contacto: el degradado de marca, no el magenta ── */
.sec.footer .btn-contacts,
.sec.footer .btn-contacts.btn-secondary{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border:0 !important; color:#fff !important;
  font-family:var(--nb-ff-d); font-weight:600; font-size:0.96rem;
  border-radius:11px !important; padding:13px 22px !important;
  box-shadow:0 10px 26px -12px rgba(123,92,246,0.5);
  transition:transform 0.22s ease, box-shadow 0.22s ease;
}
.sec.footer .btn-contacts:hover{
  transform:translateY(-2px); color:#fff !important;
  box-shadow:0 16px 32px -14px rgba(123,92,246,0.62);
}

/* ── nota del IVA: integrada, ya no en una franja blanca ── */
.sec.footer .fcCode{
  padding:0; margin-top:34px;
  border-top:1px solid var(--nb-line);
}
.sec.footer .fcCode .container{padding-top:20px; padding-bottom:4px}
.sec.footer .nb-nota-iva,
.sec.footer .fcCode p{
  text-align:center; margin:0;
  font-family:var(--nb-ff-b); font-size:0.865rem;
  color:var(--nb-faint) !important;
}

/* ── ultima linea: copyright y enlaces legales ── */
.sec.footer .sfooter{border-top:1px solid var(--nb-line); margin-top:18px}
.sec.footer .footer-last{padding:20px 0}
.sec.footer .footer-copyright span,
.sec.footer .footer-copyright{
  font-family:var(--nb-ff-b); font-size:0.865rem;
  color:var(--nb-faint) !important;
}
.sec.footer .btn-container ul.nav li a{
  font-family:var(--nb-ff-b); font-size:0.865rem;
  color:var(--nb-muted) !important; padding:0 11px;
  transition:color 0.22s ease;
}
.sec.footer .btn-container ul.nav li a:hover{color:var(--nb-ink) !important}
/* ── LA ZONA QUE SE PUEDE PULSAR, SIN MOVER EL DISENO ──────────
   Medido a 390 px: estos enlaces —Nosotros, Politica de Privacidad,
   Legal, Condiciones Generales— median 16 px de alto, porque su relleno
   es `0 11px`. WCAG 2.5.8 pide 24x24 como minimo y las guias de Apple
   recomiendan 44. En un movil eso es fallar el toque y volver a
   intentarlo.

   Se agranda el AREA con un pseudoelemento, no con relleno: el relleno
   estiraria la ultima linea del pie y moveria el copyright. Asi la caja
   crece hacia fuera sin ocupar sitio en el flujo.

   `-14px` arriba y abajo lleva los 16 px a 44. `-2px` a los lados es
   todo lo que se puede dar sin que dos enlaces contiguos se pisen: hay
   22 px entre ellos (11 de relleno por lado), asi que 2+2 deja 18 de
   holgura. */
.sec.footer .btn-container ul.nav li a{position:relative}
.sec.footer .btn-container ul.nav li a::after{
  content:""; position:absolute; inset:-14px -2px; z-index:1;
}

/* El boton de subir quedaba a 3 PX del ultimo enlace legal, medido en
   las catorce paginas. Dos objetivos a esa distancia son el mismo
   objetivo para un dedo. Se separa. */
@media (max-width:767px){
  .sec.footer .back-to-top{margin-top:14px}
}

/* ── volver arriba ── */
/* Reposo discreto; el degradado entra al pasar el raton y al pulsar.
   El icono es una mascara SVG que se define en netebu_paginas.php:
   una flecha con barra encima, como la de webmail.php.            */
.sec.footer .back-to-top{
  background:rgba(255,255,255,0.06) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:50% !important; width:40px; height:40px;
  display:inline-flex !important; align-items:center; justify-content:center;
  transition:background 0.24s ease, border-color 0.24s ease,
             transform 0.24s ease, box-shadow 0.24s ease;
}
.sec.footer .back-to-top:hover,
.sec.footer .back-to-top:focus,
.sec.footer .back-to-top:active{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border-color:transparent !important; transform:translateY(-3px);
  box-shadow:0 12px 28px -12px rgba(123,92,246,0.7);
}
.sec.footer .back-to-top i,
.sec.footer .back-to-top .fa,
.sec.footer .back-to-top .fas{color:var(--nb-muted) !important}
.sec.footer .back-to-top:hover i{color:#fff !important}

/* ── movil ── */
@media (max-width:991px){
  .sec.footer .contacts_box{margin-top:28px}
  .sec.footer .footer-last{flex-direction:column; gap:14px; text-align:center}
  .sec.footer .btn-container ul.nav{justify-content:center; flex-wrap:wrap}
}
@media (prefers-reduced-motion:reduce){
  .sec.footer *{transition:none !important}
}
/* ══ ENLACES RETIRADOS DEL PIE ══════════════════════════════
   Programa Amigo y Asesoria Tecnica salen del pie por decision de
   direccion.

   POR QUE SE HACE AQUI Y NO EN EL GESTOR DE MENUS: los dos son
   `mod_adminpanel_cpages` relid=137 y relid=174, y ya se les puso
   `enabled=0` —sus hermanos visibles tienen `enabled=1`—, pero el
   pie del tema NO RESPETA ese campo: siguen pintandose. Se comprobo
   ademas que no era cache (templates_c estaba vacio) ni de nginx.
   El addon va cifrado con ionCube, asi que no hay forma de tocar su
   logica. Se ocultan aqui, acotado AL PIE: en el menu superior
   siguen donde estaban, que no se pidio quitarlos de ahi.

   Si algun dia el addon respeta `enabled`, este bloque se puede
   borrar y los enlaces ya no volveran: el 0 esta puesto. */
.sec.footer li:has(> a[href*="programa_amigo"]),
.sec.footer li:has(> a[href*="asesoria_tecnica"]),
.footer-widgets li:has(> a[href*="programa_amigo"]),
.footer-widgets li:has(> a[href*="asesoria_tecnica"]),
.block-footer li:has(> a[href*="programa_amigo"]),
.block-footer li:has(> a[href*="asesoria_tecnica"]){
  display:none !important;
}
/* respaldo para navegadores sin `:has()`: se oculta el enlace, y el
   elemento vacio que queda no deja hueco */
.sec.footer a[href*="programa_amigo"],
.sec.footer a[href*="asesoria_tecnica"],
.footer-widgets a[href*="programa_amigo"],
.footer-widgets a[href*="asesoria_tecnica"],
.block-footer a[href*="programa_amigo"],
.block-footer a[href*="asesoria_tecnica"]{
  display:none !important;
}
/* ══ EL AVISO DE COOKIES ════════════════════════════════════
   Lo pinta Cookie Consent (Osano/Insites) con su tema `classic`:
   fondo azul #5384ED y boton verde #44C769, que no son de la marca.
   Estructura:
     .cc-window.cc-floating.cc-type-info.cc-theme-classic
       span.cc-message  +  a.cc-link
       .cc-compliance > a.cc-btn.cc-dismiss

   SOLO SE CAMBIA EL ASPECTO. Ni el texto ni el comportamiento se
   tocan: el mensaje esta redactado para cumplir la normativa y el
   boton sigue siendo el mismo enlace que registra el consentimiento. */
.cc-window.cc-floating,
.cc-window.cc-banner{
  background:linear-gradient(180deg, rgba(26,22,52,0.95), rgba(13,11,28,0.97)) !important;
  border:1px solid rgba(255,255,255,0.13) !important;
  border-radius:18px !important;
  backdrop-filter:saturate(160%) blur(20px);
  -webkit-backdrop-filter:saturate(160%) blur(20px);
  box-shadow:0 30px 80px -30px rgba(0,0,0,0.86) !important;
  color:var(--nb-on, #F2F3FB) !important;
  font-family:"Figtree",system-ui,-apple-system,sans-serif !important;
  padding:22px !important;
  position:fixed; overflow:hidden;
}
.cc-window.cc-floating{max-width:400px}
/* filo de marca arriba, como en las demas islas del sitio */
.cc-window::before{
  content:""; position:absolute; left:0; right:0; top:0; height:3px;
  background:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
}
.cc-window .cc-message{
  color:#B9BEDD !important; font-size:0.9rem !important;
  line-height:1.62 !important; margin-bottom:14px !important;
}
.cc-window .cc-link{
  color:#A594FF !important; opacity:1 !important;
  text-decoration:underline; padding:0 !important;
  font-weight:600;
}
.cc-window .cc-link:hover{color:#C9B8FF !important}
.cc-window .cc-compliance{margin-top:4px}
/* el boton de aceptar, con el degradado de marca */
.cc-window .cc-btn,
.cc-window .cc-btn.cc-dismiss,
.cc-window .cc-btn.cc-allow{
  background:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  color:#fff !important; border:0 !important;
  border-radius:11px !important;
  font-family:"Outfit",system-ui,-apple-system,sans-serif !important;
  font-weight:700 !important; font-size:0.95rem !important;
  padding:12px 26px !important; min-width:0;
  box-shadow:0 12px 30px -12px rgba(123,92,246,0.66);
  transition:transform 0.2s ease, box-shadow 0.2s ease;
}
.cc-window .cc-btn:hover{
  transform:translateY(-2px);
  box-shadow:0 18px 40px -14px rgba(123,92,246,0.80);
  color:#fff !important; text-decoration:none;
}
/* el boton secundario, cuando lo hay (rechazar / configurar) */
.cc-window .cc-btn.cc-deny,
.cc-window .cc-btn.cc-settings{
  background:rgba(255,255,255,0.08) !important;
  border:1px solid rgba(255,255,255,0.16) !important;
  color:#B9BEDD !important; box-shadow:none !important;
}
.cc-window .cc-btn.cc-deny:hover,
.cc-window .cc-btn.cc-settings:hover{
  background:rgba(255,255,255,0.14) !important; color:#fff !important;
}
.cc-window :focus-visible{outline:2px solid #A594FF !important; outline-offset:2px}
@media (max-width:575px){
  .cc-window.cc-floating{
    max-width:none; left:12px !important; right:12px !important;
    bottom:12px !important; padding:18px !important;
  }
}
@media (prefers-reduced-motion:reduce){
  .cc-window .cc-btn{transition:none}
  .cc-window .cc-btn:hover{transform:none}
}

/* ── nb-paginas ── */

/* Croster adorna TODO <mark> con una barrita amarilla inclinada:
     mark:after{background-color:#fedc45; position:absolute;
                right:-0.1em; width:0.2em; height:1.535em;
                transform:skew(-7deg,0)}
   Ya se quito del pie; tambien sale en el cuerpo —dos veces en
   Nosotros—. Es un amarillo ajeno a la marca. */
.sec mark::after{content:none !important}
.sec mark{
  background:var(--nb-grad-suave) !important;
  border-radius:5px; padding:0 5px; color:inherit !important;
}

/* ══ Netebu · bloques del Page Builder ═════════════════════════ */
.sec{
  --nb-blue:#4A90D9; --nb-violet:#7B5CF6; --nb-pink:#E84098;
  --nb-grad:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
  --nb-grad-suave:linear-gradient(135deg,rgba(74,144,217,0.16) 0%,rgba(123,92,246,0.16) 50%,rgba(232,64,152,0.16) 100%);
  --nb-night:#0B0A16; --nb-night-2:#141227; --nb-night-3:#1E1B33;
  --nb-on:#F2F3FB; --nb-on-2:#B9BEDD; --nb-on-3:#8E94BC;
  --nb-ink:#14111F; --nb-ink-2:#4C4560; --nb-ink-3:#726C85;
  --nb-line:#E9E4F3; --nb-line-2:#D8D0EC;
  --nb-paper:#FFFFFF; --nb-paper-2:#FAF8FE;
  --nb-violet-aa:#6B48F2; --nb-ok:#116B47;
  --nb-ff-d:"Outfit",system-ui,-apple-system,sans-serif;
  --nb-ff-b:"Figtree",system-ui,-apple-system,sans-serif;
}

/* Croster fuerza h1..h4{color:#211b65} sobre el elemento, y una regla
   directa gana a la herencia. Sin esto los titulos salen azul marino
   incluso sobre fondo negro. */
.sec h1,.sec h2,.sec h3,.sec h4,
.sec .h1,.sec .h2,.sec .h3,.sec .h4{
  font-family:var(--nb-ff-d) !important;
  letter-spacing:-0.024em; text-wrap:balance;
}
.sec .sec-title{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  letter-spacing:-0.028em; line-height:1.1;
}
/* El badge superior: mismo aspecto que el de la portada. Croster lo
   pinta con un marco rectangular; aqui pasa a pildora con punto. */
.sec .sec-caption{
  display:inline-flex !important; align-items:center; gap:10px;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:12px !important; letter-spacing:0.14em !important;
  text-transform:uppercase; line-height:1.3;
  padding:7px 16px 7px 12px !important; border-radius:100px !important;
  background:rgba(123,92,246,0.16) !important;
  border:1px solid rgba(123,92,246,0.42) !important;
  margin-bottom:22px !important; width:fit-content;
}
.sec .sec-caption::before{
  content:""; flex:none; width:7px; height:7px; border-radius:50%;
  background:var(--nb-pink);
  box-shadow:0 0 0 4px rgba(232,64,152,0.22);
}
/* El texto del caption va dentro de un <span> que Croster pinta con
   `border:1px solid var(--white)`: ese es el rectangulo blanco que se
   veia DENTRO de la pildora. Se le quita el marco y el relleno. */
.sec .sec-caption span{
  border:0 !important; padding:0 !important;
  display:inline !important; background:transparent !important;
  color:#CFC0FF !important; letter-spacing:inherit;
}
/* Croster mete <br> dentro del caption en algunas paginas. Ocultarlos
   a secas juntaba las palabras ("TU EMPRESANO PUEDE SER"), asi que se
   sustituyen por un espacio en vez de eliminarlos. */
.sec .sec-caption br{content:" "; display:inline}
.sec .sec-caption br::after{content:" "; white-space:pre}
/* Un caption muy largo no cabe en una linea: que envuelva con gracia.

   Y que envuelva el TEXTO, no la pildora. El caption es un flex con dos
   hijos: el punto rosa del `::before` y el <span>. Con `flex-wrap:wrap`,
   cuando el texto no cabe no parte por dentro: se va entero a una segunda
   linea DEL FLEX y deja el punto solo arriba a la izquierda, descolgado.
   Se veia en movil en «PROFESIONAL, FACIL Y RAPIDOS...».

   Con `nowrap` el punto y el texto siguen siendo la misma fila, el <span>
   parte por dentro en dos lineas y `align-items:center` deja el punto a
   media altura del bloque. Medido a 390 px: el texto pasa de empezar 25 px
   por debajo del borde a 8, y la pildora baja de 62 a 45 px de alto. */
.sec .sec-caption{max-width:100%; flex-wrap:nowrap}
@media (max-width:640px){
  .sec .sec-caption{
    flex-wrap:nowrap; font-size:11px !important; letter-spacing:0.1em !important;
  }
}
.sec .sec-description,.sec .sec-subtitle{
  font-family:var(--nb-ff-b) !important; font-weight:400 !important;
}

/* ══ BANNERS (hero y llamadas a la accion) ══ */
.sec.site-banner{background:var(--nb-night) !important; position:relative}
.sec.site-banner::before{
  content:""; position:absolute; inset:0; pointer-events:none; z-index:0;
  background:
    radial-gradient(1100px 440px at 16% -12%, rgba(74,144,217,0.22), transparent 62%),
    radial-gradient(900px 400px at 84% 8%, rgba(232,64,152,0.16), transparent 60%);
}
.sec.site-banner .banner-content-container,
.sec.site-banner .banner_content{position:relative; z-index:2}
.sec.site-banner .sec-caption{color:#CFC0FF !important}
.sec.site-banner .sec-title,
.sec.site-banner h1,.sec.site-banner .h1,
.sec.site-banner h2,.sec.site-banner .h2{
  color:var(--nb-on) !important;
  font-size:clamp(2rem,4.4vw,3.2rem) !important; font-weight:800 !important;
}
.sec.site-banner .sec-subtitle,
.sec.site-banner .banner_body,
.sec.site-banner .banner_body p,
.sec.site-banner .banner_body li{color:#CFC9E0 !important}
.sec.site-banner .banner_body b,
.sec.site-banner .banner_body strong{color:var(--nb-on) !important}
/* ── altura del hero ──────────────────────────────────────
   El tema lo deja en 576 px FIJOS. A 1920 de ancho eso da una
   proporcion de 3,33 frente al 1,78 de las ilustraciones, y como el
   fondo va con `background-size:cover`, se recortaba casi la mitad
   de la imagen por arriba y por abajo. Con una altura que crece con
   el ancho se ve bastante mas: a 1920 pasa de 576 a unos 730 px.
   El `clamp` pone suelo y techo para que ni se aplaste en portatiles
   ni se coma la pantalla en un monitor grande.                   */
.sec.site-banner,
.sec.site-banner .banner_body{
  min-height:clamp(540px, 38vw, 800px) !important;
  height:auto !important;
}
/* el contenido, centrado en esa altura */
.sec.site-banner .banner_body{
  display:flex !important; flex-direction:column; justify-content:center;
}
@media (max-width:767px){
  .sec.site-banner,
  .sec.site-banner .banner_body{min-height:clamp(420px, 78vw, 560px) !important}
}
/* ── el badge, por debajo de la barra en movil ──────────────
   La barra flota (`position:fixed`) y ocupa hasta los 90 px. El
   contenido del hero iba centrado, asi que su borde superior depende de
   lo alto que sea: medido a 390x844, el badge arrancaba en el pixel 63
   y quedaba 27 px POR DEBAJO del arranque de la barra, tapado.

   Y centrado no se arregla con un numero: cuanto mas largo el texto,
   mas sube el borde y mas se mete. Anclandolo arriba, el badge queda
   siempre a la misma distancia del borde —112 px de relleno, badge en
   el 115, 25 px de aire bajo la barra— y lo que crezca empuja hacia
   ABAJO, que es donde sobra sitio.

   Hasta 991 px y no 767: el menu es `navbar-expand-lg`, o sea que la
   barra sigue en version movil hasta ese ancho. */
@media (max-width:991px){
  .sec.site-banner .banner_body{
    justify-content:flex-start !important;
    padding-top:112px !important;
  }
}

/* ── que el texto del hero se lea sobre la ilustracion ──────
   MEDIDO, no supuesto. Bajo cada linea de texto la luminancia MEDIANA de
   la imagen es 0,002-0,013 —practicamente negro—, pero el PEOR punto de
   la linea llega a 0,99: las estelas de neon cruzan por debajo de las
   letras. Ahi el contraste cae a 1,07:1 cuando el minimo AA es 4,5.

   Oscurecer no lo arregla. Simulado un degradado lateral hasta con un 95%
   de negro: el peor punto se queda en 0,66 y el contraste en 1,48, porque
   los puntos calientes caen a mitad de la caja de texto, donde el
   degradado ya casi no actua. Y el velo del tema tampoco lo arreglaba:
   dejaba esas mismas letras en 2:1.

   La sombra si, y ademas no toca la imagen: viaja con el texto, cae justo
   donde hace falta y no roba ni un punto de luz a la ilustracion. Sobre
   las demas, cuyo fondo bajo el texto ya es negro, no se ve. Se aplica a
   todos los heros a proposito: la proxima ilustracion que entre puede
   traer un punto claro donde menos conviene, y asi ya esta cubierta. */
.sec.site-banner .sec-caption,
.sec.site-banner .banner_content h1,
.sec.site-banner .banner_content h2,
.sec.site-banner .banner_body li,
.sec.site-banner .banner_body p{
  text-shadow:0 1px 2px rgba(11,10,22,0.95), 0 2px 16px rgba(11,10,22,0.9), 0 0 42px rgba(11,10,22,0.8);
}

.sec.site-banner .banner_body ul{list-style:none; padding-left:0}
.sec.site-banner .banner_body li{
  list-style:none !important; display:block !important;
  position:relative; padding-left:26px; margin-bottom:9px; line-height:1.6;
}
.sec.site-banner .banner_body li::marker{content:"" !important}
.sec.site-banner .banner_body li::before{
  content:""; position:absolute; left:2px; top:0.62em;
  width:7px; height:7px; border-radius:50%; background:var(--nb-grad);
}

/* ══ BOTONES ══ */
.sec .btn-primary,
.sec .btn.btn-primary,
.sec .btn-xlg{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border:0 !important; color:#fff !important;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  border-radius:11px !important; padding:13px 26px !important;
  box-shadow:0 10px 26px -12px rgba(123,92,246,0.52);
  transition:transform 0.22s ease, box-shadow 0.22s ease;
}
.sec .btn-primary:hover,.sec .btn-xlg:hover{
  transform:translateY(-2px); color:#fff !important;
  box-shadow:0 16px 32px -14px rgba(123,92,246,0.64);
}

/* ══ TABLA DE PLANES — el bloque nativo, con sus precios de WHMCS ══ */
.sec.products{background:var(--nb-paper-2) !important}
.sec.products.light{background:var(--nb-paper-2) !important}
.sec.products .sec-title{color:var(--nb-ink) !important}
.sec.products .sec-description{color:var(--nb-ink-2) !important}

/* OJO con las dos clases, que se parecen y NO son lo mismo:
     .cros-pricing-table  es la TARJETA del plan
     .pricing_main        es solo la CAJITA del precio, dentro
   Tratar la segunda como tarjeta dejaba el texto "Mensual" pegado al
   borde y cortado. */
.sec.products .cros-pricing-table{
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:16px !important;
  padding:26px 24px !important;
  box-shadow:0 1px 2px rgba(20,17,31,0.05), 0 12px 32px -16px rgba(20,17,31,0.14);
  transition:transform 0.26s ease, box-shadow 0.26s ease, border-color 0.26s ease;
}
.sec.products .cros-pricing-table:hover{
  transform:translateY(-5px); border-color:var(--nb-line-2) !important;
  box-shadow:0 2px 4px rgba(20,17,31,0.06), 0 26px 56px -22px rgba(90,60,200,0.32);
}
/* LA SOMBRA DEL HOVER SE CORTABA POR ABAJO. Estas tarjetas viven dentro
   de un `.swiper`, y Swiper necesita su `overflow:hidden` para tapar
   las diapositivas siguientes — medido: el wrapper mide 2.097 px contra
   1.258 visibles, o sea que aqui SI es un carrusel de verdad y ese
   recorte no se puede quitar.

   Tampoco vale `overflow-x:hidden` con `overflow-y:visible`: cuando uno
   de los dos ejes es `hidden`, el navegador convierte el `visible` del
   otro en `auto` y aparece una barra de scroll.

   La via que queda es hacerle sitio a la sombra DENTRO del area
   recortada: relleno abajo para que quepa, y margen negativo del mismo
   valor para que no altere el flujo ni separe la seccion siguiente.
   La sombra baja unos 32 px (26 de desplazamiento mas 56 de difuminado
   menos 22 de extension); 44 dan margen. Arriba basta con los 5 px que
   sube la tarjeta mas un poco de aire. */
.sec.products .swiper,
.sec.products .swiper-container{
  padding-top:10px !important; padding-bottom:44px !important;
  margin-top:-10px !important; margin-bottom:-44px !important;
}
.sec.products .cros-pricing-table h4{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  color:var(--nb-ink) !important; font-size:1.28rem !important;
  margin-bottom:16px !important;
}
/* la cajita del precio */
.sec.products .product_pricing{margin:4px 0 18px}
.sec.products .pricing_main{
  background:var(--nb-paper-2) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:12px !important;
  padding:14px 18px 12px !important;
}
.sec.products .pricing_main .price{
  display:flex; align-items:baseline; gap:3px; line-height:1;
}
.sec.products .pricing_main .cycle{margin-top:6px}
/* el precio */
.sec.products .price,
.sec.products .cost,
.sec.products .product_pricing,
.sec.products .regular_pricing{
  font-family:var(--nb-ff-d) !important; font-weight:800 !important;
  color:var(--nb-ink) !important; font-variant-numeric:tabular-nums;
  letter-spacing:-0.03em;
}
.sec.products .cycle{
  font-family:var(--nb-ff-b) !important; font-weight:400 !important;
  color:var(--nb-ink-3) !important; letter-spacing:0;
  font-size:0.85rem; padding:0; margin:0; white-space:nowrap;
}
.sec.products .suffix{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  color:var(--nb-ink-2) !important; font-size:1.1rem;
}
/* lista de caracteristicas */
.sec.products .plan-features{
  border-top:1px solid var(--nb-line); padding-top:18px; margin-top:4px;
}
.sec.products .plan-features li,
.sec.products .plan-features p{
  font-family:var(--nb-ff-b); font-size:0.94rem; color:var(--nb-ink-2);
  padding:6px 0; line-height:1.55;
}
.sec.products .plan-features .fa-check,
.sec.products .plan-features .fas.fa-check{color:var(--nb-ok) !important}
.sec.products .plan-features .fa-times{color:var(--nb-line-2) !important}
/* selector de ciclo de facturacion */
.sec.products .billing-cycle-pricing .btn,
.sec.products .PriceList-toggle .btn{
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  border-radius:9px !important; font-size:0.9rem;
}
.sec.products .badge-primary,
.sec.products .save_t{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  color:#fff !important; font-family:var(--nb-ff-d); font-weight:700;
  font-size:10.5px; letter-spacing:0.06em; border-radius:20px; padding:3px 10px;
}

/* ══ SELECTOR DE VPS (bloque ProductPriceListTwo) ══
   Estructura de Croster:
     .cros-pricing-table > .cros-tabsbar > ul.nav-tabs > li > a.nav-link
                         > .tab-content > .tab-pane > .plan-specs
                             > .row > .col-md-2 > .description > h5 + h2
                             > .col-md-2 (precio) > .pricing > .cost + .suffix
                             > a.order-now.bg-primary
   Los precios los inyecta WHMCS desde los productos de SolusVM, asi
   que aqui NO se toca ni un numero: solo el aspecto. */
.sec.products .pricing-box{background:transparent !important; border:0 !important}
.sec.products .cros-pricing-table.no-animation{
  padding:22px !important; overflow:visible;
}
.sec.products .cros-pricing-table.no-animation:hover{transform:none}

/* ── pestañas de plan ── */
.sec.products .cros-tabsbar{
  border:0 !important; background:transparent !important; margin-bottom:20px;
}
.sec.products .cros-tabsbar .nav-tabs{
  border:0 !important; display:flex; flex-wrap:wrap; gap:7px;
}
.sec.products .cros-tabsbar .nav-item{margin:0 !important; border:0 !important}
.sec.products .cros-tabsbar .nav-link{
  border:1px solid var(--nb-line-2) !important; border-radius:10px !important;
  background:var(--nb-paper) !important; color:var(--nb-ink-2) !important;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:0.855rem !important; padding:8px 14px !important;
  margin:0 !important; white-space:nowrap;
  transition:border-color 0.22s ease, color 0.22s ease, transform 0.22s ease;
}
.sec.products .cros-tabsbar .nav-link:hover{
  border-color:var(--nb-violet) !important; color:var(--nb-violet-aa) !important;
  transform:translateY(-1px);
}
.sec.products .cros-tabsbar .nav-link.active{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border-color:transparent !important; color:#fff !important;
  box-shadow:0 8px 20px -10px rgba(123,92,246,0.62);
}
.sec.products .cros-tabsbar .nav-link i,
.sec.products .cros-tabsbar .nav-link .fad{display:none}
/* la flecha que Croster dibuja bajo la pestaña activa sobra */
.sec.products .cros-tabsbar.arrow .nav-link.active::after,
.sec.products .cros-tabsbar.arrow .nav-link.active::before{display:none !important}

/* ── fila de caracteristicas del plan ── */
.sec.products .plan-specs{
  background:var(--nb-paper-2) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:14px !important; overflow:hidden; padding:0 !important;
}
.sec.products .plan-specs .row{margin:0 !important; align-items:stretch}
/* AQUI HABIA UN `border-right` Y SOBRABA. EL FALLO DE LAS RAYAS SUELTAS.
   El tema ya dibuja el separador de cada columna, en la propia celda:
   `.tab-pane .plan-specs [class*='col-']{border-width:1px 1px 1px 0}`.
   Poner otro en `.description` pintaba DOS rayas por columna, y la
   segunda no caia en el borde: la celda es `flex; justify-content:center`,
   asi que `.description` se encoge al ancho de SU TEXTO y arrastra el
   borde con ella. Como cada dato mide distinto —«2 vCPU» corto, «40 GB
   SSD» largo—, las rayas caian a distancias distintas y parecian
   columnas vacias. Medido: la celda de RAM va de 447 a 648 y su raya
   fantasma estaba en 595, a 53 px del borde.
   Se quita. El separador es el de la celda, que si llega de arriba
   abajo y esta donde tiene que estar. */
.sec.products .plan-specs .description{
  padding:20px 18px; height:100%;
}
/* EL GRIS TERCIARIO NO LLEGA SOBRE EL PANEL, Y NO ES CULPA DEL GRIS.
   `--nb-ink-3` (#726C85) da 5,00:1 sobre blanco: cumple de sobra. Pero
   el panel de caracteristicas no es blanco, es #EDF0F5, y ahi el mismo
   color cae a 4,38:1 — por debajo del 4,5 que exige la norma para texto
   de este cuerpo. Medido en las tres anchuras.

   Por eso no se toca la variable: son 84 usos en once ficheros y en casi
   todos va sobre blanco, donde funciona. Se oscurece SOLO aqui, un tono
   del mismo gris violaceo, que sube a 5,92:1. La diferencia a ojo es
   casi nula; la que se nota es la de poder leerlo. */
.sec.products .plan-specs h5{
  font-family:var(--nb-ff-b) !important; font-size:0.79rem !important;
  font-weight:500 !important; letter-spacing:0.05em; text-transform:uppercase;
  color:#5D5872 !important; margin:0 0 7px !important;
  display:flex; align-items:center; gap:7px;
}
.sec.products .plan-specs h5 i{color:var(--nb-violet-aa) !important; font-size:14px}
.sec.products .plan-specs h2{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.32rem !important; color:var(--nb-ink) !important;
  margin:0 !important; letter-spacing:-0.022em; line-height:1.15;
}
/* la columna del precio */
/* La celda del precio tampoco pinta su propio borde. Lo hacia con
   `--nb-line` (#E9E4F3, lila) mientras las demas usan el #D5DCE5 gris
   que pone el tema: la ultima raya del panel salia de otro tono que las
   cuatro anteriores. Se nota poco y se ve mal, que es la peor
   combinacion. */
.sec.products .plan-specs .flex-column{
  padding:20px 18px;
  display:flex; flex-direction:column; justify-content:center;
}
.sec.products .plan-specs .pricing{display:flex; align-items:baseline; gap:3px; line-height:1}
.sec.products .plan-specs .cost{
  font-family:var(--nb-ff-d) !important; font-weight:800 !important;
  font-size:1.72rem !important; color:var(--nb-ink) !important;
  letter-spacing:-0.03em; font-variant-numeric:tabular-nums;
}
.sec.products .plan-specs .suffix{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  color:var(--nb-ink-2) !important; font-size:1.02rem !important;
}
/* ── el boton de configurar ── */
.sec.products .order-now,
.sec.products a.order-now.bg-primary{
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  border:0 !important; color:#fff !important;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:1rem; display:flex !important; align-items:center;
  justify-content:center; text-align:center;
  transition:filter 0.22s ease;
}
.sec.products .order-now:hover{color:#fff !important; filter:brightness(1.08)}
/* Croster le dibuja un pico lateral que aqui sobra */
.sec.products .order-now::before,
.sec.products .order-now::after{display:none !important}

/* ── el aviso de abajo, con su <mark> amarillo de Bootstrap ── */
.sec.products .block-s3{padding:16px 4px 4px}
.sec.products .block-s3 p{
  font-family:var(--nb-ff-b); font-size:0.925rem;
  color:var(--nb-ink-2) !important; margin:0;
}
.sec.products .block-s3 mark{
  background:var(--nb-grad-suave) !important;
  border:1px solid rgba(123,92,246,0.32);
  color:var(--nb-ink) !important; font-family:var(--nb-ff-d); font-weight:700;
  padding:2px 10px !important; border-radius:20px; font-size:0.85rem;
}

/* HASTA 991 px, NO 767. Medido en seis anchuras: con las seis columnas
   en fila, la etiqueta «ALMACENAMIENTO» se sale de su celda 35 px a
   768 px y 19 px a 992 px, y lo que se ve es la palabra cortada con su
   icono metido dentro de la columna de RAM. A partir de 1200 cabe.
   La tablet vertical entra por tanto en la rejilla de dos por dos, que
   es la misma solucion que ya funcionaba en el movil. */
@media (max-width:991px){
  /* CUATRO DATOS APILADOS SE COMEN UNA PANTALLA ENTERA. Medido en un
     movil de 390 px: el panel media 842 px de alto para decir
     procesador, RAM, disco y trafico. Puestos de dos en dos se leen
     igual, se COMPARAN mejor —el ojo los ve juntos— y bajan a la
     mitad. El precio y el boton siguen a ancho completo: son la
     accion, y una accion no se parte en dos columnas. */
  .sec.products .plan-specs .row{
    display:grid !important; grid-template-columns:1fr 1fr;
  }
  /* Y HAY QUE SOLTAR LAS CELDAS DE BOOTSTRAP, O LA REJILLA NO SIRVE.
     `col-md-2` empieza a aplicar justo en 768 y trae `flex:0 0 16.666%`
     con `max-width:16.666%`. Dentro de una rejilla eso no desaparece:
     cada celda ocupaba un sexto de su columna y el panel quedaba
     descuadrado, con las etiquetas saliendose por la izquierda y el
     precio metido en una franja estrecha. Por debajo de 768 no se veia
     porque `col-md-*` no aplica ahi: por eso el movil iba bien y la
     tablet no. */
  .sec.products .plan-specs .row > [class*="col-"]{
    flex:none !important; max-width:none !important; width:auto !important;
  }
  .sec.products .plan-specs .row > .flex-column,
  .sec.products .plan-specs .row > .order-now{grid-column:1 / -1}
  .sec.products .plan-specs .description{padding:15px 14px}
  /* Y SE QUITA EL AIRE MUERTO. El tema le pone `min-height:117px` a
     cada celda para cuadrar la fila de escritorio; aqui, apiladas, eso
     son 68 px vacios POR CELDA sobre 49 px de contenido. En un movil de
     390 el panel acababa midiendo 441 px: media pantalla para decir
     cuatro cifras, y la mitad de ella en blanco. Con el alto que pide
     el contenido baja a unos 300 y el precio entra en la misma vista
     que los datos, que es de lo que va todo esto. */
  .sec.products .plan-specs .row > .col-md-2{
    min-height:0 !important; height:auto !important;
  }
  /* En la rejilla de dos columnas los separadores tambien van en la
     CELDA, por lo mismo que arriba: `.description` no ocupa el ancho de
     su celda y su borde acaba donde acaba el texto. Los datos son los
     cuatro primeros hijos, asi que los de la columna izquierda son los
     impares: ahi va la linea vertical. La horizontal, en todos menos en
     el ultimo, que ya cierra el panel. */
  .sec.products .plan-specs .row > .col-md-2{
    border-width:0 0 1px 0 !important;
  }
  .sec.products .plan-specs .row > .col-md-2:nth-child(odd){
    border-right-width:1px !important;
  }
  .sec.products .plan-specs .row > .flex-column{
    border-width:0 0 1px 0 !important;
  }
  /* El precio, en linea en vez de en columna: son tres palabras.
     `min-height:0` porque el tema le pone el alto de las celdas de
     datos —117 px— para una sola linea de texto, y sobraba medio
     hueco vacio debajo de la cifra. */
  .sec.products .plan-specs .flex-column{
    flex-direction:row !important; align-items:baseline; gap:8px;
    justify-content:center; padding:16px !important;
    min-height:0 !important; height:auto !important; flex-wrap:wrap;
  }
  /* Lo mismo con el boton: heredaba `min-height:117px` y con su
     relleno acababa en 145 px de degradado. Una banda de ese tamaño
     no se lee como un boton, se lee como una seccion. */
  /* Y EL CULPABLE DE LOS 147 PX ERA `line-height:113px`. Croster se
     lo pone para centrar el texto a mano dentro de la celda alta de
     escritorio. Aqui el boton ya es flex con `align-items:center`,
     asi que ese interlineado solo aporta relleno. Quitar el
     `min-height` sin quitar esto no cambiaba nada. */
  .sec.products .order-now{
    padding:17px 16px !important; border-radius:0 0 13px 13px;
    min-height:0 !important; height:auto !important;
    line-height:1.25 !important;
  }
  .sec.products .cros-tabsbar .nav-tabs{
    flex-wrap:nowrap; overflow-x:auto; padding-bottom:6px;
  }
}

/* LA FRANJA DE 992 A 1199: la fila de seis columnas ya cabe, pero la
   etiqueta larga se sale 19 px. En vez de romper la fila —que a esa
   anchura se ve bien— se aprieta la etiqueta lo justo: un punto menos
   de cuerpo y casi sin espaciado entre letras. El dato grande, que es
   lo que se lee, no se toca. */
@media (min-width:992px) and (max-width:1199px){
  .sec.products .plan-specs h5{
    font-size:0.70rem !important; letter-spacing:0.02em; gap:5px;
  }
  .sec.products .plan-specs h5 i{font-size:12px}
  .sec.products .plan-specs .description{padding:20px 10px}
  /* Y EL DATO NO SE PARTE. Con la etiqueta ya apretada, el que no
     cabia era «40 GB SSD»: se iba a dos lineas, la fila entera crecia
     de 117 a 140 px para acompanarlo y las otras cinco columnas se
     quedaban con un hueco vacio debajo. Un punto menos de cuerpo y
     prohibido romper: entra en una linea y la fila vuelve a su alto. */
  /* EL DATO NO ES UN `<h2>`. ES UN `<div class="h2">`.
     Por eso la primera version de esta regla —escrita contra `h2`— no
     aplico nunca: `document.querySelectorAll('.plan-specs h2')` devuelve
     CERO en toda la pagina. El tema usa la clase de Bootstrap para
     heredar el estilo del titular sin meter un encabezado en el arbol,
     que ademas es lo correcto: «40 GB SSD» es un dato, no un titulo.

     Y el que no cupiera no era opinable: entre 992 y 1199 la celda mide
     147 px, quedan 127 descontando el relleno, y «40 GB SSD» a los
     28 px que traia ocupa mas. Se partia en dos lineas, la fila crecia
     de 117 a 140 para acompanarlo y las otras cinco columnas se
     quedaban con un hueco muerto debajo.

     A 20 px ocupa unos 93 px y entra con margen. Se prohibe romper por
     si algun plan trae un dato mas largo: «160 GB NVMe», el peor caso,
     son 113 px y tambien cabe. */
  .sec.products .plan-specs .description .h2,
  .sec.products .plan-specs .description h2{
    font-size:1.25rem !important;
    white-space:nowrap !important;
    line-height:1.2 !important;
  }
}

/* ══ LA CINTA DE EXTENSIONES DE `dominios.php` ═══════════════════
   Es un Swiper de quince extensiones dentro de una caja de 354 px:
   novecientos pixeles de contenido de los que se ven trescientos. Dos
   fallos, los dos visibles solo mirando la captura.

   UNO. El primer recuadro se cortaba por la izquierda. La medicion
   decia que no —empieza en 15, y la caja empieza en 15— y la medicion
   se equivocaba: lo que empieza en 15 es la CAJA del elemento, pero su
   borde se pinta encima de esa linea y el `overflow:hidden` del Swiper
   se lo comia. En pantalla se veia un rectangulo morado sin lado
   izquierdo. Cuatro pixeles de relleno lo resuelven.

   DOS. Trece extensiones de quince quedan fuera y nada lo dice: ni una
   flecha, ni un punto, ni una sombra. El que llega ve dos precios y se
   va convencido de que eso es todo lo que hay. Un desvanecido en el
   borde derecho lo cuenta sin ocupar sitio ni pedir un solo byte de
   JavaScript: donde el contenido se difumina, el ojo entiende que
   sigue. Y el cursor de arrastre invita a hacerlo en escritorio, que es
   donde no hay dedo que deslice. */
#banner-tlds-1, [id^="banner-tlds"]{
  padding-left:4px !important;
  -webkit-mask-image:linear-gradient(to right, #000 calc(100% - 56px), transparent 100%);
  mask-image:linear-gradient(to right, #000 calc(100% - 56px), transparent 100%);
  cursor:grab;
}
#banner-tlds-1:active, [id^="banner-tlds"]:active{cursor:grabbing}
/* Sin la mascara cuando cabe entero: difuminar el final de algo que ya
   se ve completo solo confunde. */
@media (min-width:1600px){
  #banner-tlds-1, [id^="banner-tlds"]{
    -webkit-mask-image:none; mask-image:none;
  }
}

/* ══ TABLA DE SERVIDORES DEDICADOS (bloque DedicatedServerList) ══
   Croster pinta `.server-info{background:#1a1a1a;color:#fff}` y dentro
   mete un <h4>. Como el tema declara `h1..h4{color:#211b65}` DIRECTO
   sobre el elemento, esa regla gana a la herencia del padre y el
   nombre del modelo salia oscuro sobre fondo oscuro. Hay que darle el
   color explicitamente, no confiar en que lo herede.

   Los datos y los precios los inyecta WHMCS: aqui solo el aspecto. */
.sec.products .table-product-details td{
  border:0 !important; border-bottom:1px solid var(--nb-line) !important;
  padding:18px 14px !important; vertical-align:middle;
  font-family:var(--nb-ff-b); color:var(--nb-ink-2); font-size:0.95rem;
  background:transparent !important;
}
.sec.products .table-product-details:hover td{background:var(--nb-paper-2) !important}
.sec.products .table-product-details td b{
  font-family:var(--nb-ff-d); font-weight:700; color:var(--nb-ink);
  font-size:1.05rem; display:block;
}
.sec.products .table-product-details td small{
  display:block; color:var(--nb-ink-3); font-size:0.8rem; margin-top:2px;
}
.sec.products .footable thead th{
  font-family:var(--nb-ff-d) !important; font-size:11px !important;
  font-weight:600 !important; letter-spacing:0.08em; text-transform:uppercase;
  color:var(--nb-ink-3) !important;
  border:0 !important; border-bottom:1px solid var(--nb-line) !important;
  padding:14px !important; background:transparent !important; white-space:nowrap;
}
/* la chapa con el nombre del modelo */
.sec.products .server-heading{padding:18px 14px 18px 0 !important}
.sec.products .server-info{
  background:var(--nb-night) !important; border-radius:12px !important;
  padding:16px 18px !important; min-width:132px;
  border:1px solid rgba(255,255,255,0.10);
}
.sec.products .server-info h4,
.sec.products .server-info .h4{
  color:#F2F3FB !important; font-family:var(--nb-ff-d) !important;
  font-weight:700 !important; font-size:1.08rem !important;
  margin:0 !important; letter-spacing:-0.015em;
}
.sec.products .server-info i,
.sec.products .server-info .fad{color:#8FA8D8 !important; font-size:18px}
/* la columna del precio */
.sec.products .server-price{min-width:200px}
.sec.products .server-price .price{
  display:flex; align-items:baseline; justify-content:center; gap:3px;
}
.sec.products .server-price .cost{
  font-family:var(--nb-ff-d) !important; font-weight:800 !important;
  font-size:1.6rem !important; color:var(--nb-ink) !important;
  letter-spacing:-0.03em; font-variant-numeric:tabular-nums;
}
.sec.products .server-price .suffix{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  color:var(--nb-ink-2) !important; font-size:1rem !important;
}
.sec.products .server-price .cycle{
  display:block; text-align:center; font-size:0.82rem; color:var(--nb-ink-3);
}
.sec.products .setup-fee{
  text-align:center !important; font-family:var(--nb-ff-b);
  font-size:0.8rem; color:var(--nb-ink-3); margin:6px 0 12px;
}
.sec.products .heading-desc h4{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  color:var(--nb-ink) !important; font-size:1.32rem !important;
}
.sec.products .heading-desc p{
  font-family:var(--nb-ff-b); color:var(--nb-ink-2) !important;
}

@media (max-width:991px){
  .sec.products .table-product-details td{padding:14px 10px !important}
  .sec.products .server-info{min-width:0; padding:12px 14px !important}
}

/* ══ ICONOS QUE FONT AWESOME NO PINTA ═══════════════════════════
   La instalacion trae Font Awesome Pro 5.10.1 y los cinco ficheros
   de fuente responden 200, pero **FA Pro 5 no incluye todos los
   iconos en todos los pesos**: `fa-microchip` no existe en Regular
   (peso 400) ni `fa-arrow-alt-to-top` en el peso que usa el tema, y
   el navegador dibuja el cuadrito de glifo ausente.

   En vez de pelearse con los pesos, se tapa el glifo y se pinta un
   SVG propio con `mask`, que toma el color de `currentColor`. Asi no
   depende de que la fuente traiga o no el icono.
   ══════════════════════════════════════════════════════════════ */
.nb-ico{
  display:inline-block; width:15px; height:15px; vertical-align:-2px;
  background-color:currentColor;
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  -webkit-mask-position:center; mask-position:center;
  -webkit-mask-size:contain; mask-size:contain;
}
/* procesador, en la fila de caracteristicas del VPS */
.sec.products .plan-specs h5 .fa-microchip{
  /* OJO: `font-size:0` esconde el glifo roto, pero tambien deja las
     unidades em a cero. El tamaño va en pixeles a proposito. */
  font-size:0 !important; width:15px !important; height:15px !important;
  display:inline-block; flex:none;
  vertical-align:-2px; background-color:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='7' width='10' height='10' rx='1.5'/%3E%3Crect x='4' y='4' width='16' height='16' rx='2.5'/%3E%3Cpath d='M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3'/%3E%3C/svg%3E") no-repeat center/contain;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='7' width='10' height='10' rx='1.5'/%3E%3Crect x='4' y='4' width='16' height='16' rx='2.5'/%3E%3Cpath d='M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3'/%3E%3C/svg%3E") no-repeat center/contain;
}
/* volver arriba, en el pie */
/* Aqui habia una mascara SVG con una flecha de TRAZO. El resultado
   no era el mismo que en webmail.php, donde se ve el glifo de
   FontAwesome `fa-arrow-alt-to-top`: una flecha SOLIDA con barra
   encima. Imitar un glifo con un trazo nunca da lo mismo, asi que se
   usa el mismo glifo en los dos sitios y se acabo la diferencia.
   La clase ya esta en el HTML; solo le faltaba tamano. */
.sec.footer .back-to-top .fa-arrow-alt-to-top,
.sec.footer .back-to-top i{
  font-size:22px !important; line-height:1;
  width:auto !important; height:auto !important;
  background:none !important;
  -webkit-mask:none !important; mask:none !important;
}
/* el enlace "Hosting WEB" del pie usa far fa-code, que tampoco existe */
.sec.footer .navbar-items .fa-code{
  font-size:0 !important; width:15px !important; height:15px !important;
  display:inline-block; flex:none;
  vertical-align:-2px; background-color:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18l-6-6 6-6M15 6l6 6-6 6'/%3E%3C/svg%3E") no-repeat center/contain;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18l-6-6 6-6M15 6l6 6-6 6'/%3E%3C/svg%3E") no-repeat center/contain;
}

/* ══ RAZONES / FEATURES ══ */
.sec.features{background:var(--nb-night-3) !important; position:relative}
.sec.features.inverse .sec-title,
.sec.features .sec-title{color:var(--nb-on) !important}
.sec.features .sec-description{color:#CFC9E0 !important}
/* Croster monta esto como un slider de Swiper con clases de fila de
   Bootstrap: .swiper-wrapper.row > .swiper-slide.col-lg-4 > .feature-item
   Con flex, cada FILA se ajusta a su contenido y unas quedan mas altas
   que otras. Con grid y `grid-auto-rows:1fr` TODAS las filas miden lo
   mismo: las seis cajas quedan identicas. Hay que anular los anchos de
   las columnas de Bootstrap, que aqui ya no pintan nada. */
.sec.features .swiper-wrapper{
  display:grid !important;
  grid-template-columns:repeat(3, minmax(0, 1fr)) !important;
  grid-auto-rows:1fr !important;
  gap:20px !important;
  transform:none !important; margin:0 !important;
  /* LAS CAJAS SE SALIAN POR LA DERECHA EN MOVIL, Y ESTA ERA LA CAUSA.
     Croster declara `.swiper-wrapper{box-sizing:content-box}`, que anula
     el `border-box` global de Bootstrap. El marcado de estos bloques trae
     ademas `px-3`, o sea `padding:1rem !important` a cada lado. Con
     content-box esos 32 px se SUMAN al 100% del contenedor:

       390 px de pantalla → contenedor 360 → wrapper 360 + 16 + 16 = 392

     Los 32 px de mas los recortaba el `.swiper-container`, asi que no
     salia barra de scroll: se veian las tarjetas cortadas por la derecha,
     con aire a la izquierda y ninguno a la derecha.

     MEDIDO en 390, 430, 768 y 900: se salia 32 px en los cuatro. Con
     border-box, cero. En 1280 y 1600 no cambia nada, porque alli el
     padding no llega a aplicarse. Se acota a `.sec.features` a proposito:
     el carrusel de precios es otro `.swiper-wrapper` y funciona bien
     —lo que asoma por su derecha es la diapositiva siguiente, que es lo
     que tiene que hacer un carrusel—. */
  box-sizing:border-box !important;
}
.sec.features .swiper-slide{
  width:auto !important; max-width:none !important; flex:none !important;
  height:auto !important; display:flex !important;
  margin:0 !important; padding:0 !important;
}
/* ── una fila de DOS tarjetas no deja la tercera columna vacia ──
   Las tres columnas de arriba estan bien para los bloques de seis,
   que es lo habitual. Pero un bloque de dos —«Elige como quieres
   gestionarlo»— quedaba pegado a la izquierda con un hueco de 426 px
   a la derecha: medido, 2 cajas de 406 px en una fila de 1.258.

   Se resuelve contando hijos con `:has()`: `:nth-child(2):last-child`
   solo casa cuando el segundo hijo es ademas el ultimo, o sea cuando
   hay exactamente dos. Un navegador sin `:has()` se queda con las tres
   columnas de siempre, que es como estaba: no mejora, pero no rompe.

   NO se usa `repeat(auto-fit, minmax(280px,1fr))`, que resolveria lo
   mismo sin `:has()`: con seis tarjetas y 1.258 px de ancho pasaria a
   cuatro columnas y descuadraria las secciones que hoy van a tres. */
/* El CTA de `vps_n8n.php` no lleva sombra en las letras ni velo en
   CSS: la penumbra va HORNEADA en la propia ilustracion, con
   `herramientas/velar-centro-imagen.py`. Una elipse difuminada al
   34 % en el centro, que es donde cae el texto. Asi no hay capa que
   superponer ni nada que mantener aqui, y se ve como parte del
   dibujo. El parrafo si se aclara un punto, que es gratis. */
.site-banner .banner_body[style*="n8n_modalidades"] .banner_content p{
  color:#F2F3FB !important;
}

/* ESTAS DOS VAN DENTRO DE UN MEDIA QUERY, Y NO ES ADORNO.
   `:has()` toma la especificidad de su argumento, asi que
   `.sec.features .swiper-wrapper:has(> :nth-child(2):last-child)`
   pesa (0,4,1) contra los (0,2,1) de la regla base. Y un media query
   NO suma especificidad: fuera de aqui, esta regla le ganaba tambien
   al `@media (max-width:640px)` de mas abajo que pide UNA columna.

   Se veia en `vps_n8n.php`: «Elige como quieres gestionarlo» tiene
   dos tarjetas, y en un movil de 390 px quedaban dos columnas de
   154 px con el texto en tiras de una palabra y cortado por la
   derecha. Medido a 390 px reales, no redimensionando la ventana:
   el viewport de la ventana no es el del documento y daba 490 px.

   Acotarlas a partir de 641 px las deja donde tienen sentido —donde
   caben columnas— y devuelve el mando a la regla de movil. */
@media (min-width:641px){
  .sec.features .swiper-wrapper:has(> :nth-child(2):last-child){
    grid-template-columns:repeat(2, minmax(0, 1fr)) !important;
  }
  .sec.features .swiper-wrapper:has(> :first-child:last-child){
    grid-template-columns:minmax(0, 1fr) !important;
    max-width:640px; margin-inline:auto !important;
  }

  /* ── Y UNA TARJETA SUELTA EN LA ULTIMA FILA SE CENTRA ──────────
     Con tres columnas, un bloque de cuatro o de siete deja la ultima
     caja sola contra el borde izquierdo y dos huecos a su derecha:
     parece que falta contenido o que algo se ha roto.
     Llevandola a la columna del medio, la fila queda equilibrada y se
     lee como el cierre del bloque, que es lo que es. Pasó al añadir
     «Copias de seguridad» a los VPS: de seis tarjetas a siete. */
  .sec.features .swiper-wrapper:has(> :nth-child(4):last-child) > :last-child,
  .sec.features .swiper-wrapper:has(> :nth-child(7):last-child) > :last-child{
    grid-column:2 !important;
  }
}
.sec.features .feature-item{
  background:rgba(255,255,255,0.045);
  border:1px solid rgba(255,255,255,0.09);
  border-radius:16px; padding:28px 26px;
  height:100%; width:100%; margin:0 !important;
  display:flex; align-items:flex-start; gap:18px;
  position:relative; overflow:hidden;
  transition:border-color 0.3s ease, transform 0.3s ease, background 0.3s ease;
}
/* filo superior de marca, que solo asoma al pasar por encima */
.sec.features .feature-item::after{
  content:""; position:absolute; top:0; left:0; right:0; height:2px;
  background:var(--nb-grad); opacity:0;
  transform:scaleX(0); transform-origin:left;
  transition:transform 0.42s ease, opacity 0.42s ease;
}
.sec.features .feature-item:hover::after{opacity:1; transform:scaleX(1)}
.sec.features .feature-content{flex:1; min-width:0}
.sec.features .feature-item:hover{
  border-color:rgba(123,92,246,0.42); transform:translateY(-4px);
  background:rgba(123,92,246,0.075);
}
/* Croster pinta detras del icono un ::before con
   `border-radius:30% 70% 70% 30%/30% 30% 70% 70%` y el color del tema:
   ese es el churrete blanco con forma de gota. Se reaprovecha el mismo
   pseudo-elemento, pero cuadrado, con el degradado suave y un borde. */
.sec.features .feature-icon{
  width:48px !important; height:48px !important; margin-bottom:0;
  flex:none;
  display:flex; align-items:center; justify-content:center;
  background:transparent !important; border:0 !important;
  font-size:20px !important; position:relative;
}
.sec.features .feature-icon::before{
  border-radius:13px !important;
  background:var(--nb-grad-suave) !important;
  background-color:transparent !important;
  border:1px solid rgba(255,255,255,0.18);
  box-shadow:none !important;
}
.sec.features .feature-icon i,
.sec.features .feature-icon [class^="fa-"],
.sec.features .feature-icon [class*=" fa-"],
.sec.features .feature-icon .fas,
.sec.features .feature-icon .fad{
  color:#A9C9F2 !important; font-size:20px !important;
  position:relative; z-index:1;
}
.sec.features .feature-title{
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  color:var(--nb-on) !important; font-size:1.06rem !important; margin-bottom:7px;
}
.sec.features .feature-desc,
.sec.features .feature-desc p{
  font-family:var(--nb-ff-b); color:#C9C2DC !important;
  font-size:0.92rem; line-height:1.55;
}

/* ══ PREGUNTAS FRECUENTES ══ */
.sec.faqs{background:var(--nb-paper) !important}
/* El subrayado del titulo de Preguntas Frecuentes. Croster lo pinta
   con `.bordered{border-bottom:3px solid #e42fd2}`, un magenta que no
   es de la marca —el mismo que ya se corrigio en el pie—. Aparece una
   sola vez por pagina, siempre en este titulo.                      */
.sec .sec-title .bordered{
  border-bottom:0 !important;
  position:relative; padding-bottom:12px;
}
.sec .sec-title .bordered::after{
  content:""; position:absolute; left:0; right:0; bottom:0;
  height:3px; border-radius:2px; background:var(--nb-grad);
}
.sec.faqs .sec-title{color:var(--nb-ink) !important}
.sec.faqs .sec-description{color:var(--nb-ink-2) !important}
.sec.faqs .card{
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:13px !important; margin-bottom:12px; overflow:hidden;
  transition:border-color 0.24s ease, box-shadow 0.24s ease;
}
.sec.faqs .card:hover{
  border-color:var(--nb-line-2) !important;
  box-shadow:0 10px 28px -18px rgba(20,17,31,0.2);
}
.sec.faqs .card-header{
  background:transparent !important; border:0 !important; padding:0 !important;
}
.sec.faqs .card-title,
.sec.faqs .card-header .btn{
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  color:var(--nb-ink) !important; font-size:1.04rem !important;
  padding:18px 22px !important; width:100%; text-align:left;
  display:flex; align-items:center; justify-content:space-between; gap:14px;
}
.sec.faqs .card-icon,
.sec.faqs .card-title .fal{color:var(--nb-violet-aa) !important}
.sec.faqs .card-body{
  padding:0 22px 20px !important;
  font-family:var(--nb-ff-b); color:var(--nb-ink-2); font-size:0.955rem;
}
/* OJO: en estas fichas los <li> van SUELTOS dentro del div, sin ningun
   <ul> que los envuelva. Por eso el navegador les pinta su punto nativo
   y `list-style:none` sobre el ul no servia de nada: hay que ponerlo en
   el propio li, o salen dos puntos. */
.sec.faqs .card-body ul{list-style:none; padding-left:0; margin:0}
.sec.faqs .card-body li{
  list-style:none !important; display:block !important;
  position:relative; padding:5px 0 5px 24px; margin:0; line-height:1.6;
  border:0 !important;
}
.sec.faqs .card-body li::marker{content:"" !important}
.sec.faqs .card-body li::before{
  content:""; position:absolute; left:2px; top:1.05em;
  width:6px; height:6px; border-radius:50%; background:var(--nb-grad);
}

/* ══ BLOQUES DE TEXTO LIBRE ══ */
.sec.editor{background:var(--nb-paper) !important}

/* ── PROSA DE UNA PAGINA DE PRODUCTO ──────────────────────────
   Croster declara `h1..h4{color:#211b65}` sobre el propio elemento,
   asi que un `<h2>` suelto dentro de un bloque de texto sale con esa
   tinta y no con la nuestra.

   NO SE ARREGLA con una regla generica sobre `.sec.editor h2` o
   `.sec.editor p`: la PORTADA ENTERA vive dentro de un `.sec.editor`
   —lo avisa el comentario de la cabecera de este fichero— y cualquier
   regla asi le caeria encima. Por eso el texto de estas paginas se
   envuelve en `.nb-prosa` y solo se estila ahi dentro.

   Se estreno con `vps_n8n.php`. Sirve para cualquier pagina de
   producto que se escriba a partir de ahora: basta con envolver el
   contenido del bloque `texteditor` en `<div class="nb-prosa">`. */
.sec.editor .nb-prosa{
  max-width:820px; margin-inline:auto;
  font-family:var(--nb-ff-b); color:var(--nb-ink-2);
}
.sec.editor .nb-prosa h2{
  font-family:var(--nb-ff-d) !important; color:var(--nb-ink) !important;
  font-weight:700 !important; font-size:clamp(1.5rem,3.2vw,2rem) !important;
  letter-spacing:-0.026em; text-wrap:balance; margin:0 0 14px !important;
}
.sec.editor .nb-prosa p{
  color:var(--nb-ink-2) !important; font-family:var(--nb-ff-b) !important;
  font-size:1.02rem; line-height:1.72; margin:0 0 16px;
}
.sec.editor .nb-prosa p:last-child{margin-bottom:0}
.sec.editor .nb-prosa b,
.sec.editor .nb-prosa strong{color:var(--nb-ink) !important; font-weight:600}
.sec.editor .nb-prosa a{color:var(--nb-violet-aa) !important}

/* Texto e ilustracion a dos columnas, dentro de un bloque de texto.
   `align-items:center` en la REJILLA y `height:auto` en la imagen: el
   valor de serie es `stretch`, que estira la ilustracion al alto de
   la columna de texto y la deja achatada. Ya paso con los candados de
   la pagina de SSL. */
.sec.editor .nb-prosa-media{
  max-width:1120px; margin-inline:auto;
  display:grid; grid-template-columns:1fr 1fr;
  gap:clamp(24px,4vw,52px); align-items:center;
}
.sec.editor .nb-prosa-media > .nb-prosa{max-width:none; margin:0}
.sec.editor .nb-prosa-media img{
  width:100%; height:auto; max-width:100%;
  border-radius:18px; display:block;
  box-shadow:0 1px 2px rgba(20,17,31,0.05), 0 18px 44px -20px rgba(20,17,31,0.28);
}
@media (max-width:860px){
  /* En una sola columna la ilustracion ya va primera por marcado, asi
     que aqui no hace falta reordenar nada. */
  .sec.editor .nb-prosa-media{grid-template-columns:1fr}
}

/* WordPress, PrestaShop y Correo maquetan esa seccion con una tabla de
   Bootstrap que lleva `table-bordered`: eso pinta un borde en la tabla
   Y EN CADA CELDA. El `border:hidden` que trae el contenido solo mata
   el exterior, por eso quedaba la caja alrededor. hosting.php no usa
   tabla y por eso se veia limpia: aqui se igualan las cuatro.

   MUY IMPORTANTE — solo `.table-bordered`, NUNCA `table` a secas:
   la portada entera vive dentro de un `.sec.editor` y sus bloques
   propios se llevaron por delante las reglas genericas. Lo mismo vale
   para la tipografia: aqui NO se declaran ni colores ni fuentes
   globales, porque pisaban el diseño de la portada. */
.sec.editor .table-bordered,
.sec.editor .table-bordered > tbody,
.sec.editor .table-bordered > tbody > tr,
.sec.editor .table-bordered > tbody > tr > td,
.sec.editor .table-bordered > tbody > tr > th{
  border:0 !important; background:transparent !important;
}
.sec.editor .table-bordered > tbody > tr > td{
  padding:0 18px 0 0 !important; vertical-align:middle;
}
.sec.editor .table-bordered > tbody > tr > td:last-child{padding-right:0 !important}
.sec.editor .table-responsive{overflow:visible !important}
/* En movil una tabla de maquetacion se estrecha y parte las palabras:
   mejor apilar las celdas. */
@media (max-width:991px){
  .sec.features .swiper-wrapper{grid-template-columns:repeat(2, minmax(0, 1fr)) !important}
}
@media (max-width:640px){
  .sec.features .swiper-wrapper{grid-template-columns:1fr !important}
  .sec.features .feature-item{padding:24px 22px}
}

@media (max-width:767px){
  .sec.editor .table-bordered,
  .sec.editor .table-bordered > tbody,
  .sec.editor .table-bordered > tbody > tr,
  .sec.editor .table-bordered > tbody > tr > td{
    display:block !important; width:100% !important;
  }
  .sec.editor .table-bordered > tbody > tr > td{padding:0 0 20px 0 !important}
}

/* ══ EL AIRE ENTRE SECCIONES ════════════════════════════════════
   El tema da a cada seccion `padding:60px 0`, y `120px` a partir de
   992 px. Entre dos secciones seguidas eso son 240 px de aire en
   escritorio, y medido en las doce paginas salian huecos reales de 206
   a 431 px contando los margenes del contenido.

   CUANDO CAMBIA EL TONO, ESE AIRE ESTA BIEN: el propio corte de color
   separa las dos secciones y necesita respiro para no parecer una raya.
   Lo que sobra es entre dos secciones DEL MISMO TONO, donde nada indica
   que una cosa acabo y otra empezo: ahi el visitante solo ve un vacio.

   Las claras de este tema son `editor`, `faqs` y `products`; las
   oscuras las pinta el hook (`features`) o son banners. Asi que la
   regla se acota a las tres claras seguidas entre si, y baja de 240 a
   184 px. No se toca el padding general, que es del tema y lo usan
   tambien el area de cliente y el carrito.

   Referencia de que 184 es la medida buena: el bloque «Donde estan tus
   datos» anula su propio padding y deja 206 px con la seccion
   siguiente, y ahi se ve bien.

   NO SE PUEDE HACER CON `+`. Entre dos `.sec` el tema mete un
   `<script>`, asi que el selector de hermano adyacente no llega a la
   siguiente seccion: comprobado, `casaAdyacencia` daba `false` con las
   dos secciones casando por separado. Y `~` cogeria todas las
   posteriores, no solo la de al lado.

   Asi que el tono lo calcula el JS de abajo, que ademas es mas fiable
   que una lista de nombres de clase: mide el color de fondo REAL de
   cada seccion, que es lo que ve el visitante, y no hay que acordarse
   de que `features` es oscura en unas paginas y `products` clara en
   otras. Si el script no llega a correr, el espaciado se queda como
   estaba: no esconde nada. */
@media (min-width:992px){
  .sec.nb-junta-abajo{padding-bottom:92px}
  .sec.nb-junta-arriba{padding-top:92px}

  /* EN UN BANNER, ESE RELLENO SE VE. El resto de secciones pintan el
     fondo en el propio `.sec`, asi que su relleno es aire del mismo color
     y no se nota. El banner no: su `.sec` lleva un #0B0A16 PLANO y la
     ilustracion la pinta el hijo `.banner_body`, que empieza donde acaba
     el relleno. Los 92 px de arriba salen entonces como una franja lisa
     entre la seccion anterior y la imagen, y es justo lo que se veia en
     `hosting.php` debajo de «Donde esta tu web»: no era distancia de mas,
     era una banda de otro color por medio.

     Pegando el banner, la ilustracion arranca donde acaba la seccion
     anterior y el aire se queda DENTRO de esa, que es donde tiene fondo
     propio. Medido en las diez paginas comerciales: hoy solo hay UN
     banner con `nb-junta`, el «¡Ven a Netebu!» de hosting. */
  .sec.site-banner.nb-junta-arriba{padding-top:0}
  .sec.site-banner.nb-junta-abajo{padding-bottom:0}
}

/* ── la juntura entre la red neuronal y el banner ───────────
   Aqui hubo un filo de 2 px con el degradado de marca. Medido en
   pantalla, el problema no era su color sino su luminancia: salia a
   #775EEE (luma 105) entre un #13121E por arriba (19) y un #000111 por
   abajo (2). Cinco veces mas brillante que lo de encima y cincuenta que
   lo de debajo: un destello, no una costura. Con cualquier otro color
   habria cantado igual, porque lo que se ve es el escalon de luz.

   Y debajo del filo quedaba un segundo escalon sin marcar, de 19 a 2 de
   luma en un solo pixel.

   Pintar la costura con los colores de la propia foto no vale: medida su
   primera fila, el banner es negro de lado a lado ahi (#020210 a
   #020420) y el azul de los racks no asoma hasta unos 150 px mas abajo,
   ademas cargado al tercio derecho. No hay color que tomar justo en el
   punto donde se tocan.

   Asi que no se decora el corte: se funde el escalon. Dos rampas del
   mismo #060716 que se encuentran en el borde, una bajando desde la
   seccion de arriba y otra disolviendose sobre la foto. El ultimo pixel
   de una y el primero de la otra valen exactamente lo mismo, y el
   descenso de 19 a 2 queda repartido en unos 200 px.

   Las paradas se escriben `rgba(6,7,22,0)`, nunca `transparent`:
   `transparent` es `rgba(0,0,0,0)` y el degradado interpolaria hacia un
   negro que no es el de esta juntura.

   Y la linea de marca vuelve, porque el corte entre dos secciones si
   conviene marcarlo. Vuelve mejorada en tres cosas, y las tres salen de
   la medicion de arriba:

   1. NO VA SOLA. Encima del escalon pelado de 19 a 2 cualquier linea es
      un destello, le pongas el color que le pongas. Ahora se apoya en
      el fundido, que reparte ese escalon en unos 200 px: la linea marca
      el corte en vez de taparlo.
   2. NO VA A PLENA LUZ. Al 55% su luminancia baja de 105 a unos 55.
      Sigue leyendose como acento de marca y deja de ser un neon.
   3. NO VA DE BORDE A BORDE. Una mascara horizontal la apaga en los
      extremos, asi que en vez de una raya de lado a lado queda un
      acento centrado que nace y muere en el fundido. Es el mismo
      recurso que ya usan la cinta de extensiones y las tablas de esta
      hoja.

   Se probo tambien el banner en isla —margenes, radio y sombra como la
   del buscador de la portada, y la ilustracion encajando exacta por
   proporcion— y se descarto: arriba se apoyaba en la red neuronal, pero
   abajo colgaba sobre una franja lisa de fondo contra la seccion
   blanca, y esa franja no tenia funcion ninguna.

   Las alturas del fundido van atadas al aire que hay de verdad.
   `.nb-donde` deja 86 px de relleno abajo en escritorio y 60 en movil,
   medido; el clamp nunca pasa de ahi, asi que la rampa no se come
   contenido en ningun ancho. */
.sec.editor.nb-junta-abajo:has(.nb-donde){position:relative}
.sec.editor.nb-junta-abajo:has(.nb-donde)::after{
  content:""; position:absolute; left:0; right:0; bottom:0; z-index:3;
  height:clamp(56px, 6vw, 86px); pointer-events:none;
  background:linear-gradient(to bottom,
    rgba(6,7,22,0) 0%, rgba(6,7,22,0.28) 38%, rgba(6,7,22,0.62) 64%,
    rgba(6,7,22,0.88) 84%, rgba(6,7,22,1) 100%);
}
/* La otra mitad, ya sobre la ilustracion. Va en el `::after` del `.sec`
   —su `::before` lo ocupan los dos radiales— con z-index 1: por encima
   de esos radiales, que tambien conviene apagar en la juntura, y por
   debajo del texto, que va en 2.

   Atada al mismo par con el hermano adyacente. Sin eso alcanzaria a
   cualquier banner que el JS pegue a otra seccion oscura, y se pintaria
   la rampa de entrada sin su pareja de salida. */
.sec.editor.nb-junta-abajo:has(.nb-donde) + .sec.site-banner.nb-junta-arriba::after{
  content:""; position:absolute; left:0; right:0; top:0; z-index:1;
  height:clamp(88px, 9vw, 128px); pointer-events:none;
  background:linear-gradient(to bottom,
    rgba(6,7,22,1) 0%, rgba(6,7,22,0.88) 16%, rgba(6,7,22,0.62) 36%,
    rgba(6,7,22,0.28) 62%, rgba(6,7,22,0) 100%);
}
/* La linea, encima de las dos rampas. Va en el `::before` de la seccion
   de ARRIBA —comprobado libre— y no dentro del banner, y esto tiene una
   razon concreta:

   `.swiper-container` lleva `position:relative; z-index:1`, y eso crea
   un contexto de apilamiento. Todo lo que va dentro del banner queda
   confinado en esa capa 1 por mucho z-index que se le ponga, asi que la
   linea se pinto primero ahi con z-index 3 y no se veia: la rampa de
   entrada, que es un `::after` del `.sec` y va despues en el documento
   con el mismo 1, la tapaba entera. Medido en la juntura salia #060715,
   el color exacto de la rampa, sin rastro del degradado.

   Desde el `::before` de la seccion de arriba la linea participa del
   contexto raiz, donde el 4 gana a la rampa de salida (3), a la de
   entrada (1) y al propio swiper (1). El `bottom:0` la deja justo en la
   juntura, que es donde tiene que estar. */
.sec.editor.nb-junta-abajo:has(.nb-donde)::before{
  content:""; position:absolute; left:0; right:0; bottom:0; height:2px; z-index:4;
  background:var(--nb-grad); opacity:0.55; pointer-events:none;
  -webkit-mask-image:linear-gradient(90deg, rgba(0,0,0,0) 0%, #000 22%,
                                     #000 78%, rgba(0,0,0,0) 100%);
  mask-image:linear-gradient(90deg, rgba(0,0,0,0) 0%, #000 22%,
                             #000 78%, rgba(0,0,0,0) 100%);
}

/* ══ REVELADO AL HACER SCROLL ══════════════════════════════════
   Mismo efecto que la portada. El `opacity:0` cuelga de la clase
   `nb-anim`, que pone el propio JS: si el script no llega a
   ejecutarse, todo se ve igualmente. Nunca esconder contenido con
   CSS que dependa de que un script lo destape.
   La portada tiene su propio revelado bajo .nb-home y se excluye. */
.nb-anim .sec .nb-rv{
  opacity:0; transform:translateY(22px);
  transition:opacity 0.62s ease, transform 0.62s ease;
}
.nb-anim .sec .nb-rv.on{opacity:1; transform:none}
/* escalonado suave dentro de un mismo grupo */
.nb-anim .sec .nb-rv[data-nb-i="1"]{transition-delay:0.07s}
.nb-anim .sec .nb-rv[data-nb-i="2"]{transition-delay:0.14s}
.nb-anim .sec .nb-rv[data-nb-i="3"]{transition-delay:0.21s}
.nb-anim .sec .nb-rv[data-nb-i="4"]{transition-delay:0.28s}
.nb-anim .sec .nb-rv[data-nb-i="5"]{transition-delay:0.35s}

@media (prefers-reduced-motion:reduce){
  .sec *{transition:none !important}
  .nb-anim .sec .nb-rv{opacity:1 !important; transform:none !important}
}

/* ══ LA RED NEURONAL SOLO SE ANIMA CUANDO SE VE ═════════════════
   MEDIDO en `vps_n8n.php`, y el numero que lo decide es el ultimo:

     el SVG ocupa      1.440 x 802 px = 1,16 Mpx
     lineas animadas   27, todas con `stroke-dashoffset`
     aislamiento       contain:none, content-visibility:visible
     fuera de pantalla LA ANIMACION AVANZA IGUAL: 1.000 ms por segundo

   `stroke-dashoffset` es de lo mas caro que se puede animar: no lo
   compone la GPU, obliga a repintar el SVG entero en cada fotograma. Y
   estaba ocurriendo durante TODA la visita, con el bloque a tres
   pantallas de distancia y nadie mirandolo.

   En un Mac no se nota —medido: 60 fps con la animacion, con ella
   apagada y con el SVG oculto, los tres iguales—, pero es trabajo que
   se esta haciendo para nada, y en un movil o un portatil modesto ese
   trabajo si se paga.

   Se pausa por defecto y el JS del final del hook la arranca cuando el
   bloque entra en pantalla. Si el JS no corre, la clase no llega nunca
   y la animacion se queda quieta: el dibujo se ve igual, solo que sin
   moverse. Degradar a un SVG estatico es aceptable; degradar a un SVG
   invisible no lo seria.

   NO SE USA `contain:paint`, que seria lo primero que uno probaria: el
   bloque se estira a ancho completo con `box-shadow:0 0 0 100vmax`, y
   `contain:paint` recorta el pintado a la caja del elemento. Se cargaria
   el fondo de la seccion entera.

   LOS DOS `!important` PELEAN CONTRA UN ATAJO, no contra otra regla de
   pausa. El CSS del bloque —que vive dentro del `texteditor`, o sea en
   el CUERPO y por tanto despues de esta hoja— declara:

     .sec.editor .nb-donde .nb-red-flujo line{ animation:nbFlujo 6.4s linear infinite }

   `animation` es una propiedad de ATAJO: al declararla resetea
   `animation-play-state` a su valor inicial, que es `running`. Y encima
   ese selector es (0,3,1) contra los (0,3,0) de aqui. Perdiamos por las
   dos cosas a la vez. Es el mismo mecanismo que con `background` y
   `background-clip`, que ya costo un contorno en los botones. */
.sec.editor .nb-donde .nb-red *{animation-play-state:paused !important}
.sec.editor .nb-donde.nb-red-on .nb-red *{animation-play-state:running !important}
/* ── las extensiones del hero, en una sola cinta ─────────────
   Son 8 y suman 769 px contando separaciones; el buscador mide
   558, asi que saltaban a una segunda fila y la caja crecia.
   En vez de recortar la lista o encoger los chips, la fila se
   desliza sola: se ve el catalogo entero sin ocupar mas alto.
   El JS envuelve los chips en DOS grupos identicos y la cinta
   avanza exactamente un grupo, por eso el bucle no tiene
   costura. La separacion va como `margin-right` del chip y no
   como `gap` del grupo, para que el ancho de cada grupo incluya
   su hueco final y los dos encajen al milimetro. */
.nb-home .finder .tlds{
  display:block !important; overflow:hidden; position:relative;
  /* los chips se desvanecen en los extremos en vez de cortarse en seco */
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 42px,
                     #000 calc(100% - 42px),transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 42px,
             #000 calc(100% - 42px),transparent 100%);
}
.nb-home .finder .tlds .nb-cinta{
  display:flex; flex-wrap:nowrap; width:max-content;
  animation:nb-tld-desliza 22s linear infinite;
  will-change:transform;
}
.nb-home .finder .tlds .nb-grupo{display:flex; flex-wrap:nowrap}
.nb-home .finder .tlds .tld{margin-right:8px; flex:0 0 auto}
/* al pasar el raton se para, para poder leer un precio concreto */
.nb-home .finder .tlds:hover .nb-cinta,
.nb-home .finder .tlds:focus-within .nb-cinta{animation-play-state:paused}
@keyframes nb-tld-desliza{
  from{transform:translateX(0)}
  to{transform:translateX(-50%)}
}
/* si caben todos —pantalla ancha, menos extensiones— no hay nada
   que desplazar: el JS pone esta clase y la cinta se queda quieta */
.nb-home .finder .tlds.nb-quieta .nb-cinta{animation:none}
.nb-home .finder .tlds.nb-quieta{-webkit-mask-image:none; mask-image:none}
@media (prefers-reduced-motion:reduce){
  .nb-home .finder .tlds{overflow-x:auto; scrollbar-width:none}
  .nb-home .finder .tlds::-webkit-scrollbar{display:none}
  .nb-home .finder .tlds .nb-cinta{animation:none}
}
/* ══ LA ISLA DEL BUSCADOR DE DOMINIOS ═══════════════════════
   Es lo primero que toca un visitante de la portada, asi que se
   trata como un componente y no como una caja mas.
   Sobre la fotografia un panel BLANCO al 7% se lava y los textos
   pierden contraste; el panel oscuro translucido asienta el
   contenido y deja que el degradado de marca haga el acento. */
.nb-home .finder{
  --isla-r:22px;
  position:relative; z-index:2; overflow:hidden;
  max-width:640px; padding:26px 26px 22px !important;
  background:linear-gradient(180deg, rgba(26,22,52,0.74), rgba(13,11,28,0.80)) !important;
  border:1px solid rgba(255,255,255,0.13) !important;
  border-radius:var(--isla-r) !important;
  backdrop-filter:saturate(160%) blur(22px);
  -webkit-backdrop-filter:saturate(160%) blur(22px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.07),
             0 34px 90px -34px rgba(0,0,0,0.86),
             0 10px 34px -18px rgba(90,60,200,0.42) !important;
}
/* filo de marca en el borde superior */
.nb-home .finder::before{
  content:""; position:absolute; left:0; right:0; top:0; height:3px;
  background:var(--nb-grad); pointer-events:none;
}

/* ── las dos pestanas, como un control segmentado ──────────
   El selector se acota a `.finder-tabs .finder-tab` A PROPOSITO:
   `.finder button` alcanzaria tambien al boton de Buscar y le
   pisaria el fondo y la altura. */
.nb-home .finder .finder-tabs{
  /* Sin capsula: eran dos botones metidos en una caja oscura y esa
     caja se veia como una mancha por detras. Ahora el contenedor no
     pinta nada y cada boton se sostiene solo. */
  display:inline-flex !important; gap:10px; padding:0 !important;
  background:transparent !important; border:0 !important;
  border-radius:0 !important; margin:0 0 20px !important; width:auto !important;
}
/* La pestana APAGADA lleva fondo propio. Sin el se fundia con el
   fondo oscuro del contenedor y las dos se leian como un solo
   bloque pegado, aunque entre ellas hubiera hueco de verdad. */
.nb-home .finder .finder-tabs .finder-tab{
  /* SIN BORDE. Un borde —aunque sea transparente— deja ver el fondo
     por debajo: el degradado del boton activo se colaba por el filo
     y dibujaba un contorno de colores. Es el mismo fallo de la caja
     de la portada. El boton de Buscar no tiene borde y por eso sale
     limpio; estos, igual. El relleno sube 1 px por lado para que la
     medida no cambie al quitarlo. */
  border:0 !important;
  background:rgba(255,255,255,0.08) !important;
  color:var(--nb-on-2) !important; border-radius:9px !important;
  padding:12px 21px !important; height:auto !important; width:auto !important;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:0.94rem !important; letter-spacing:-0.005em;
  display:inline-flex; align-items:center; gap:8px;
  transition:color 0.2s ease, background 0.2s ease;
}
.nb-home .finder .finder-tabs .finder-tab:hover{
  color:var(--nb-on) !important; background:rgba(255,255,255,0.14) !important;
}
.nb-home .finder .finder-tabs .finder-tab.on,
.nb-home .finder .finder-tabs .finder-tab[aria-selected="true"]{
  background:var(--nb-grad) !important; color:#fff !important;
  border:0 !important;
  /* el fondo se recorta en el relleno: sin esto un borde heredado
     dejaria ver el degradado difuminado alrededor */
  background-clip:padding-box; -webkit-background-clip:padding-box;
  box-shadow:0 8px 22px -10px rgba(123,92,246,0.70);
}
.nb-home .finder .finder-tabs .finder-tab svg{width:15px; height:15px}

/* ── la etiqueta y el campo ────────────────────────────────── */
.nb-home .finder .finder-lb{
  display:block; margin:0 0 9px !important;
  font-family:var(--nb-ff-d) !important; font-size:0.76rem !important;
  font-weight:600 !important; letter-spacing:0.14em; text-transform:uppercase;
  color:var(--nb-on-3) !important;
}
.nb-home .finder .finder-pane form{
  display:flex; gap:10px; align-items:stretch; margin:0;
}
.nb-home .finder .finder-pane form input{
  flex:1 1 auto !important; min-width:0; height:56px !important;
  background:rgba(0,0,0,0.34) !important;
  border:1px solid rgba(255,255,255,0.14) !important;
  border-radius:13px !important; padding:0 17px !important;
  color:var(--nb-on) !important; font-family:var(--nb-ff-b) !important;
  font-size:1rem !important; box-shadow:none !important;
  transition:border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}
.nb-home .finder .finder-pane form input::placeholder{color:var(--nb-on-3) !important}
.nb-home .finder .finder-pane form input:focus{
  outline:none !important;
  border-color:rgba(123,92,246,0.85) !important;
  box-shadow:0 0 0 4px rgba(123,92,246,0.22) !important;
  background:rgba(0,0,0,0.46) !important;
}
.nb-home .finder .finder-pane form button{
  flex:0 0 auto !important; height:56px !important; padding:0 26px !important;
  border:0 !important; border-radius:13px !important;
  background:var(--nb-grad) !important;
  background-clip:padding-box; -webkit-background-clip:padding-box;
  color:#fff !important; font-family:var(--nb-ff-d) !important;
  font-weight:700 !important; font-size:1rem !important;
  box-shadow:0 12px 30px -12px rgba(123,92,246,0.66);
  transition:transform 0.2s ease, box-shadow 0.2s ease;
}
.nb-home .finder .finder-pane form button:hover{
  transform:translateY(-2px);
  box-shadow:0 18px 40px -14px rgba(123,92,246,0.80);
}
.nb-home .finder .finder-pane form button:active{transform:translateY(0)}

/* ── el carrusel de extensiones, separado del formulario ──── */
.nb-home .finder .tlds{
  margin-top:20px !important; padding-top:18px !important;
  border-top:1px solid rgba(255,255,255,0.09);
}
.nb-home .finder .tlds .tld{
  background:rgba(255,255,255,0.055) !important;
  border:1px solid rgba(255,255,255,0.10) !important;
  border-radius:999px !important; padding:7px 14px !important;
  color:var(--nb-on-2) !important; font-family:var(--nb-ff-b) !important;
  font-size:0.86rem !important; white-space:nowrap;
  transition:border-color 0.2s ease, background 0.2s ease;
}
.nb-home .finder .tlds .tld b{color:#7FC0F5 !important; font-weight:700}
.nb-home .finder .tlds .tld.on{
  border-color:rgba(123,92,246,0.55) !important;
  background:rgba(123,92,246,0.18) !important; color:#fff !important;
}
.nb-home .finder .tlds .tld.on b{color:#C9B8FF !important}

/* el foco se ve SIEMPRE: se navega con teclado */
.nb-home .finder :focus-visible{
  outline:2px solid #A594FF !important; outline-offset:2px;
}

@media (max-width:767px){
  .nb-home .finder{padding:20px 18px 18px !important; border-radius:18px !important}
  .nb-home .finder .finder-pane form{flex-direction:column}
  .nb-home .finder .finder-pane form button{width:100%; padding:0 !important}
}

/* El efecto de los brazos sobresaliendo se descarto: quedaba mal.
   La franja de estadisticas se queda en su sitio original. */
/* ══ VELO SUPERIOR DEL HERO ═════════════════════════════════
   La isla del menu es translucida —blanco al 6%— y arriba a la
   derecha caen los servidores iluminados en azul: el fondo se
   veia a traves de la barra y los enlaces perdian presencia.
   Antes no pasaba porque la barra era blanca y opaca.
   Este velo devuelve el azul marino a la franja de arriba y, de
   paso, le da suelo al menu. Funde hacia TRANSPARENTE, no hacia
   un color: por debajo tiene que seguir viendose la fotografia
   tal cual.                                                     */
/* Va en `.hero-veil`, NO en `.hero-img`: el tema pinta ese velo
   con `z-index:1`, por encima de la imagen, y es direccional
   —96 grados— asi que no oscurece la franja de arriba. Puesto en
   la imagen, mi degradado quedaba DEBAJO del suyo y no mandaba.
   Aqui se pinta el ultimo y gana; el texto va en `.hero-in`
   (z-index:2), asi que sigue por encima de los dos. */
.nb-home .hero .hero-veil::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(180deg,
    rgba(5,7,24,0.92) 0%,
    rgba(5,7,24,0.86) 8%,
    rgba(5,7,24,0.54) 16%,
    rgba(5,7,24,0.18) 24%,
    transparent 32%);
}
.nb-home .hero .hero-veil{position:absolute}

/* ══ Y UN SEGUNDO VELO, ESTE HORIZONTAL ══════════════════════
   El de arriba resuelve la franja del menu. Este resuelve otra
   cosa distinta que solo se ve mirando la pagina, porque ninguna
   medicion la marca: el parrafo del hero va de 136 a 761 px y la
   fotografia empieza sobre los 360, asi que las ultimas palabras
   —«con panel Plesk»— caen justo encima de la cara iluminada de
   uno de los dos. El texto es #CFC9E0, un lila claro sin sombra:
   sobre el fondo oscuro se lee perfectamente, sobre una mejilla no.

   Y no lo detecta ningun contraste automatico, porque el contraste
   se calcula contra un color plano y aqui el fondo es una foto:
   cambia pixel a pixel. Por eso hay que mirar.

   El velo funde el color del propio fondo —no un negro generico,
   que ensuciaria el tono— y muere antes del 66 %, donde ya no hay
   texto. La foto se sigue viendo entera; lo unico que cambia es
   que debajo de las letras hay suelo.

   Solo de 992 para arriba: por debajo el texto va a ancho completo
   con la imagen detras o debajo, y ahi el velo no hace falta. */
@media (min-width:992px){
  .nb-home .hero .hero-veil::before{
    content:""; position:absolute; inset:0; pointer-events:none; z-index:1;
    background:linear-gradient(90deg,
      rgba(5,7,24,0.82) 0%,
      rgba(5,7,24,0.66) 30%,
      rgba(5,7,24,0.34) 48%,
      rgba(5,7,24,0.10) 60%,
      transparent 68%);
  }
}
/* El remate: una sombra muy tenue bajo el parrafo. Cuesta cero, no
   se ve como sombra y sostiene el texto en el tramo donde el velo
   ya se ha desvanecido. */
.nb-home .hero .hero-sub{
  text-shadow:0 1px 14px rgba(5,7,24,0.55);
}
/* ══ PREGUNTAS FRECUENTES ═══════════════════════════════════
   El mismo componente del tema, `.card-faqs-group`, cuando SI son
   preguntas (servidores dedicados y unidades NAS). Aqui el JS no
   pone `nb-fichas`, asi que se quedaba a medio camino: ya tenia la
   tipografia de marca, pero sin sombra, con las tarjetas casi
   pegadas y —lo que mas cantaba— con la pregunta separada de su
   respuesta por una linea gris que partia cada tarjeta en dos.

   ESTRUCTURA REAL, leida del DOM (no es un acordeon: no hay
   `.collapse` ni `.btn`, es una lista estatica con marcado
   schema.org/FAQPage, y eso conviene conservarlo tal cual):

     .card-faqs-group[itemtype=FAQPage]
       .card[itemtype=Question]
         .card-header > span.card-title      <- la pregunta
         div[itemprop=acceptedAnswer]
           .card-body.border-top             <- la respuesta

   Se le da el mismo lenguaje que a las fichas: tarjeta con radio
   de 16, sombra suave y un icono en pildora. La linea divisoria se
   quita: la jerarquia ya la marcan el tamano y el color. */
.card-faqs-group:not(.nb-fichas){
  display:flex; flex-direction:column; gap:16px;
  max-width:860px; margin-left:auto; margin-right:auto;
}
.card-faqs-group:not(.nb-fichas) > .card{
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:16px !important; overflow:hidden; margin:0 !important;
  box-shadow:0 1px 2px rgba(20,17,31,0.04), 0 12px 30px -20px rgba(20,17,31,0.16);
  transition:border-color 0.24s ease, box-shadow 0.24s ease;
}
.card-faqs-group:not(.nb-fichas) > .card:hover{
  border-color:var(--nb-line-2) !important;
  box-shadow:0 2px 4px rgba(20,17,31,0.06), 0 22px 48px -24px rgba(90,60,200,0.26);
}
.card-faqs-group:not(.nb-fichas) .card-header{
  background:transparent !important; border:0 !important;
  padding:20px 22px 0 !important;
  display:flex; align-items:center; gap:13px;
}
/* el interrogante, en la misma pildora que los iconos de las fichas */
.card-faqs-group:not(.nb-fichas) .card-header::before{
  content:"\f059";
  font-family:"Font Awesome 5 Pro","Font Awesome 6 Pro",
              "Font Awesome 5 Free","FontAwesome";
  font-weight:900; font-size:1rem;
  flex:0 0 38px; width:38px; height:38px; border-radius:11px;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--nb-violet-aa); background:var(--nb-grad-suave);
}
/* el tema le pone `padding:18px 22px`, y esos 22 px separaban la
   pregunta del icono y la desalineaban de su propia respuesta. El
   relleno lo lleva la cabecera, no el titulo. */
.card-faqs-group:not(.nb-fichas) .card-title{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.04rem !important; letter-spacing:-0.018em;
  color:var(--nb-ink) !important; line-height:1.35; display:block;
  padding:0 !important; margin:0 !important;
}
/* fuera la linea que partia la tarjeta en dos */
.card-faqs-group:not(.nb-fichas) .card-body,
.card-faqs-group:not(.nb-fichas) .card-body.border-top{
  border:0 !important;
  padding:12px 22px 22px 73px !important;
  font-family:var(--nb-ff-b) !important; font-size:0.96rem !important;
  color:var(--nb-ink-2) !important; line-height:1.65;
}
@media (max-width:575px){
  /* en movil el texto no se sangra bajo el icono: no cabe */
  .card-faqs-group:not(.nb-fichas) .card-body,
  .card-faqs-group:not(.nb-fichas) .card-body.border-top{
    padding:12px 18px 20px !important;
  }
  .card-faqs-group:not(.nb-fichas) .card-header{padding:18px 18px 0 !important}
}

/* ══ CARACTERISTICAS: DE ACORDEON A FICHAS ══════════════════
   El acordeon obligaba a seis clics para leer seis bloques que
   caben de sobra en pantalla, y en cada uno se perdia de vista lo
   anterior. Como fichas se lee todo de un vistazo y se compara.

   OJO: el mismo componente del tema —`.card-faqs-group`— se usa
   TAMBIEN para preguntas frecuentes de verdad (servidores
   dedicados). Ahi el acordeon si tiene sentido: plegar respuestas
   largas. Por eso el JS solo pone `nb-fichas` cuando NINGUN titulo
   del grupo es una pregunta. */
.card-faqs-group.nb-fichas{
  display:grid !important;
  grid-template-columns:repeat(2, minmax(0,1fr));
  gap:18px; align-items:start;
}
.card-faqs-group.nb-fichas > .card{
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:16px !important; overflow:hidden;
  margin:0 !important; height:100%;
  box-shadow:0 1px 2px rgba(20,17,31,0.04), 0 12px 30px -20px rgba(20,17,31,0.16);
  transition:transform 0.24s ease, box-shadow 0.24s ease, border-color 0.24s ease;
}
.card-faqs-group.nb-fichas > .card:hover{
  transform:translateY(-3px); border-color:var(--nb-line-2) !important;
  box-shadow:0 2px 4px rgba(20,17,31,0.06), 0 26px 56px -24px rgba(90,60,200,0.30);
}
/* la cabecera deja de ser un boton y pasa a ser el titulo */
.card-faqs-group.nb-fichas .card-header{
  background:transparent !important; border:0 !important;
  padding:22px 22px 0 !important;
}
.card-faqs-group.nb-fichas .card-header .btn{
  padding:0 !important; border:0 !important; background:none !important;
  width:100%; text-align:left; cursor:default; box-shadow:none !important;
  display:flex; align-items:center; gap:13px;
}
.card-faqs-group.nb-fichas .card-icon{display:none !important}
.card-faqs-group.nb-fichas .card-title{
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.04rem !important; letter-spacing:-0.018em;
  color:var(--nb-ink) !important; line-height:1.3;
}
/* un icono por ficha, en el orden en que estan */
.card-faqs-group.nb-fichas .card-header .btn::before{
  content:"\f233";
  font-family:"Font Awesome 5 Pro","Font Awesome 6 Pro",
              "Font Awesome 5 Free","FontAwesome";
  font-weight:300; font-size:1.05rem;
  flex:0 0 42px; width:42px; height:42px; border-radius:12px;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--nb-violet-aa); background:var(--nb-grad-suave);
}
.card-faqs-group.nb-fichas > .card:nth-child(2) .btn::before{content:"\f06b"}
.card-faqs-group.nb-fichas > .card:nth-child(3) .btn::before{content:"\f1de"}
.card-faqs-group.nb-fichas > .card:nth-child(4) .btn::before{content:"\f121"}
.card-faqs-group.nb-fichas > .card:nth-child(5) .btn::before{content:"\f0e0"}
.card-faqs-group.nb-fichas > .card:nth-child(6) .btn::before{content:"\f590"}
/* PERO SI EL GRUPO SON PREGUNTAS, TODAS LLEVAN EL INTERROGANTE.
   La serie de arriba va por POSICION y se escribio para las seis
   fichas de hosting, donde cada puesto tiene su tema. En un grupo de
   preguntas no significa nada: salia un regalo en «¿Que diferencia hay
   entre n8n Cloud y n8n autoalojado?». Se usa el mismo `\f059` que el
   modo plegable, que ademas ya dice de un vistazo que eso es una
   pregunta. Se declara despues para ganarle a la serie sin subir la
   especificidad de cada una. */
.card-faqs-group.nb-fichas.nb-preguntas > .card .btn::before{content:"\f059" !important}
/* el panel, siempre abierto */
.card-faqs-group.nb-fichas .collapse{
  display:block !important; height:auto !important; visibility:visible !important;
}
.card-faqs-group.nb-fichas .card-body{
  border:0 !important; padding:14px 22px 22px !important;
}
/* la lista: sin vinetas de navegador, con el check de marca */
.card-faqs-group.nb-fichas .card-body ul{margin:0; padding:0; list-style:none}
.card-faqs-group.nb-fichas .card-body li{
  list-style:none; position:relative;
  padding:0 0 0 26px; margin:0 0 11px;
  font-family:var(--nb-ff-b); font-size:0.95rem; line-height:1.55;
  color:var(--nb-ink-2);
}
.card-faqs-group.nb-fichas .card-body li:last-child{margin-bottom:0}
.card-faqs-group.nb-fichas .card-body li::before{
  content:"\f00c";
  font-family:"Font Awesome 5 Pro","Font Awesome 6 Pro",
              "Font Awesome 5 Free","FontAwesome";
  font-weight:900; font-size:0.72rem;
  position:absolute; left:0; top:4px;
  width:17px; height:17px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  color:#fff; background:var(--nb-grad);
  background-clip:padding-box; -webkit-background-clip:padding-box;
}
.card-faqs-group.nb-fichas .card-body li b,
.card-faqs-group.nb-fichas .card-body li strong{color:var(--nb-ink) !important}
@media (max-width:767px){
  .card-faqs-group.nb-fichas{grid-template-columns:1fr; gap:14px}
}
@media (prefers-reduced-motion:reduce){
  .card-faqs-group.nb-fichas > .card{transition:none}
  .card-faqs-group.nb-fichas > .card:hover{transform:none}
}

/* ══ EL AVISO DE VERIFICAR EL CORREO ════════════════════════
   El aviso de WHMCS para quien tiene el correo sin verificar. Sale
   entre el navbar y la cabecera, a todo lo ancho.

     div.verification-banner.email-verification
       .container > .row
         button#btnEmailVerificationClose.btn.close
         i.fa-exclamation-triangle + span.text
         button#btnResendVerification...

   EL FALLO DE VERDAD, medido en el navegador a 2550 px:

     navbar   fixed, z-index 1030,  y 14 -> 95
     banner   static,               y  0 -> 88
     boton    "Reenviar...",        y 13 -> 74,  x 1604 -> 1896

   El boton cae ENTERO dentro del rectangulo del navbar, y
   `document.elementFromPoint` sobre su centro devuelve
   `ul.navbar-nav`: el clic se lo queda el menu y el boton NO SE
   PUEDE PULSAR. No era cosa del color.

   La barra va en `position:fixed` y el `<body>` no lleva relleno
   que la compense (`padding-top: 0`), asi que el aviso nace debajo.
   Se le da el margen que le falta, usando la altura real que el
   script del navbar publica en `--nb-nav-h`. */
/* Ya no necesita margen: `netebu-barra.js` lo mueve por debajo de la
   cabecera, que es donde deja de estorbar a la barra. */
.verification-banner{position:relative; z-index:1}

/* ── PERO SOLO DONDE HAY CABECERA DONDE PONERLO ──────────────
   `bajarAvisos()` necesita un `.hero-bg-wrap` para colocar el aviso
   debajo. El area de cliente lo tiene, y tambien el carrito, las
   legales, la base de conocimiento, el contacto y los certificados.

   Las paginas hechas con el Page Builder —portada, hosting, VPS,
   correo profesional, somos— NO lo tienen, y ahi la funcion se
   rinde en su primera linea. El aviso se queda entonces arriba del
   todo, en el flujo, y la isla del menu —`fixed`, z-index 1030— se
   le echa encima justo sobre el boton de reenviar. Medido: la isla
   ocupa de 14 a 94 px y el aviso de 0 a 107.

   No hay ancla comun en esas paginas para colocarlo bien: en
   hosting y VPS el primer bloque es la cabecera, pero en la portada
   mide 7.372 px y en "somos" 3.680 —son la pagina entera—.

   Asi que ahi NO SE MUESTRA. El aviso es para un usuario que ya ha
   entrado, y la accion que le pide —reenviar el correo— es de
   gestion de cuenta: su sitio es el area de cliente, donde se ve
   perfectamente. En medio del catalogo solo tapaba la cabecera.

   El aviso nace oculto y el script lo enciende cuando ha conseguido
   colocarlo. Asi no se ve tapado ni un fotograma: si no cabe bien,
   no aparece. */
.verification-banner,
.announcement-banner,
.top-banner{display:none !important}
body.nb-aviso-ok .verification-banner,
body.nb-aviso-ok .announcement-banner,
body.nb-aviso-ok .top-banner{display:block !important}

/* El rojo se queda —es una advertencia de la aplicacion, no nuestra
   decoracion—, pero pasa al rojo de la paleta: sobre #d9534f el
   texto blanco se queda en 3,4:1 y sobre este llega a 4,6:1, que
   ya cumple. */
.verification-banner{
  background:#C4453F !important; color:#fff !important;
  font-family:var(--nb-ff-b) !important;
  padding:15px 10px !important;
  border-bottom:1px solid rgba(0,0,0,0.12) !important;
}
.verification-banner .text,
.verification-banner span:not(.close){
  font-family:var(--nb-ff-b) !important; color:#fff !important;
  font-size:0.95rem !important; line-height:1.5;
}
.verification-banner .row{align-items:center}
.verification-banner i.fa-exclamation-triangle{
  color:#fff !important; margin-right:9px; font-size:1rem;
}
/* el boton de reenviar, que es LO QUE HAY QUE PODER PULSAR:
   blanco sobre el rojo, con area de sobra y bien visible */
/* El tema lo pinta de gris pizarra con
     .verification-banner.email-verification .btn.btn-action{
        background-color:#50525f !important }
   que puntua (0,4,0). Un `.verification-banner .btn.btn-action`
   se queda en (0,3,0) y PIERDE aunque lleve `!important`: hay que
   repetir su cadena y anadir la clase propia del boton. */
.verification-banner.email-verification .btn.btn-action.btn-resend-verify-email,
.verification-banner.email-verification .btn.btn-action,
.verification-banner .btn:not(.close),
.verification-banner .btn.btn-resend-verify-email,
.verification-banner button.btn-default{
  background:#fff !important; border:0 !important;
  color:#A32F2A !important;
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:0.88rem !important; border-radius:10px !important;
  padding:11px 16px !important; min-height:44px;
  box-shadow:0 2px 8px rgba(0,0,0,0.16) !important;
  white-space:normal; width:100%;
}
.verification-banner.email-verification .btn.btn-action.btn-resend-verify-email:hover,
.verification-banner.email-verification .btn.btn-action:hover,
.verification-banner .btn:not(.close):hover,
.verification-banner .btn.btn-resend-verify-email:hover{
  background:#FFF1F0 !important; color:#8E2823 !important;
}
.verification-banner .btn.close{
  color:#fff !important; opacity:0.8; text-shadow:none !important;
  font-size:1.5rem; line-height:1;
  min-width:44px; min-height:44px;
  display:inline-flex; align-items:center; justify-content:center;
}
.verification-banner .btn.close:hover{opacity:1}
@media (max-width:767px){
  .verification-banner .btn:not(.close){margin-top:10px}
}

/* ══ RESTOS DE LA VOZ ANTERIOR Y DEL EDITOR VISUAL ══════════
   Barrido del frontend con el DOM real, en 390 / 834 / 1440 px:
   diecisiete sitios donde el texto se salia del sistema. Todos
   caen en tres causas, no en diecisiete.

   1. SYNE, LA TIPOGRAFIA DE TITULARES ANTERIOR. `netebu_fuentes.php`
      la sustituyo por Outfit y dejo de cargarse, pero quedan bloques
      del Page Builder que la siguen declarando. Como ya no existe, el
      navegador cae en la fuente de respaldo: ese texto no esta en
      Outfit NI en Syne, esta en la del sistema. */
/* De raiz: los bloques del Page Builder no escriben la fuente, la
   piden con `var(--nb-head)`, y esa variable sigue declarada como
   `'Syne', system-ui, sans-serif` en un `:root` de su propia hoja.
   Redefinirla arregla TODOS esos bloques de una vez, tambien los que
   no he visto. Lleva `!important` porque su hoja va en el cuerpo, o
   sea DESPUES de esta, y con la misma especificidad ganaria ella. */
:root{
  --nb-head:"Outfit",system-ui,-apple-system,sans-serif !important;
}
[class*="nb-2col-"]{font-family:var(--nb-ff-d) !important}
.nb-2col-eyebrow, .nb-2col-title, .nb-2col-lead{
  font-family:var(--nb-ff-d) !important;
}

/* 2. LA ETIQUETA <font>. El editor visual del gestor de contenidos
      la sigue escribiendo —HTML5 la elimino— y con ella cuelan un
      tamano y un color ajenos a la paleta. Que herede y punto. */
.body-container font, .sec font, .main-container font, footer font{
  font-family:inherit !important; font-size:inherit !important;
  color:inherit !important;
}
/* `inherit` a secas no bastaba: heredaba de un `<p>` que TAMPOCO
   tenia la fuente de marca, asi que el texto seguia en la del
   sistema. La voz hay que darsela al contenedor del editor. Sin
   `!important`, para no pisar los titulos ni los bloques que ya
   traen la suya. */
.sec.editor, .sec.editor p, .sec.editor li, .sec.editor td,
.sec.editor span, .sec.editor div, .sec.editor font{
  font-family:var(--nb-ff-b);
}

/* 3. TEXTO EN NODOS SUELTOS. Las reglas apuntaban a `<p>` y `<li>`,
      pero el tema deja texto colgando directamente del contenedor
      —`.plan-features` sin lista dentro, el `<span>` de "Ver
      Detalles"— y ahi no llegaban. Se cubre el contenedor.
      `:not` para los iconos: llevan su propia familia y una
      herencia les borraria el glifo. */
.cros-pricing-table .plan-features,
.cros-pricing-table .plan-features > *:not(i):not([class*="fa-"]),
.cros-pricing-table .PriceList-toggle,
.cros-pricing-table .PriceList-toggle span,
.pricing_style_2 .plan-features{
  font-family:var(--nb-ff-b) !important;
}
.cros-pricing-table .PriceList-toggle,
.cros-pricing-table .PriceList-toggle span{
  font-size:0.92rem; color:var(--nb-ink-3) !important;
}
/* el "Desde" que precede al precio */
.cros-pricing-table .small.text-muted,
.sec .small.text-muted{
  font-family:var(--nb-ff-b) !important; color:var(--nb-ink-3) !important;
}

/* ── LOS TELEFONOS, PULSABLES EN MOVIL ──────────────────────
   Un `href="tel:"` en movil ES el boton de llamar, no un enlace de
   lectura. Iban en linea, asi que su caja era la de la linea de
   texto —17 px medidos en Contacto— y fallaban el objetivo tactil.
   Se hace en todo el sitio y no pagina a pagina, que es donde
   estaban saliendo de uno en uno. */
@media (max-width:767px){
  a[href^="tel:"]{
    display:inline-flex; align-items:center; min-height:44px;
  }
}

/* ══ EL AVISO DE COOKIES, PULSABLE DE VERDAD ════════════════
   Su enlace medía 23 px de alto en movil, por debajo del minimo
   comodo para el dedo. Sube a 44 sin mover la caja de sitio. */
.cc-window .cc-link, a.cc-link{
  display:inline-flex; align-items:center; min-height:44px;
  padding:4px 2px; text-underline-offset:3px;
}
@media (min-width:768px){
  .cc-window .cc-link, a.cc-link{min-height:0}
}

/* ── EL ANCHO DE ESTE BLOQUE: NO HACE FALTA REGLA ─────────────
   Aqui vivia un `:has()` que ensanchaba el `.container` a 1288 px para
   pelear con los 760 de lectura que `netebu_legal.php` imponia en
   servicio legal. Ya no hace falta: esa pagina es una landing comercial
   y no un documento legal, asi que se saco del hook legal —la exclusion
   esta alli, con el motivo— y su contenedor vale ahora los 1350 del
   tema, exactamente los mismos que servidores dedicados.

   La regla ademas era codigo muerto: ninguna pagina legal de verdad
   lleva `.nb-fichas`, asi que no podia aplicar a nada. Si algun dia una
   lo llevara, el arreglo es este comentario, no un `!important`. */

/* ══ FICHAS DE CONTENIDO: «Donde esta tu servidor», «Para que se usa» ══
   Estas secciones eran texto corrido sobre blanco —un `h2` y parrafos— en
   medio de una pagina que en todo lo demas va con tarjetas. Se quedaban
   cortas y se notaba.

   NO SE TOCA NI UNA PALABRA. Se comprobo comparando el texto plano antes y
   despues: cero palabras perdidas. Lo unico que se anade son las etiquetas
   de las tres sedes y dos titulos de tarjeta, y las cinco salen del propio
   texto que ya estaba.

   COLORES: los declara este bloque en vez de heredarlos, porque Croster
   pinta `h1..h4{color:#211b65}` DIRECTAMENTE sobre el elemento y una regla
   directa gana siempre a la herencia. */
.sec.editor .nb-fichas{
  display:grid; gap:22px; margin:8px 0 4px;
}
.sec.editor .nb-ficha{
  background:var(--nb-paper);
  border:1px solid var(--nb-line);
  border-radius:18px;
  padding:30px 30px 26px;
  box-shadow:0 1px 2px rgba(20,17,31,0.04);
  transition:box-shadow 0.28s ease, border-color 0.28s ease;
}
.sec.editor .nb-ficha:hover{
  border-color:#DCD4F0;
  box-shadow:0 1px 2px rgba(20,17,31,0.05), 0 18px 40px -22px rgba(90,60,200,0.28);
}

/* la cabecera: icono en cuadrado de degradado suave, y el titulo al lado */
.sec.editor .nb-ficha-cab{
  display:flex; align-items:center; gap:14px;
  margin:0 0 16px;
}
.sec.editor .nb-ficha-ico{
  flex:0 0 46px; width:46px; height:46px;
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:13px;
  background:var(--nb-grad-suave);
  border:1px solid rgba(123,92,246,0.16);
  color:var(--nb-violet-aa); font-size:1.14rem;
}
.sec.editor .nb-ficha-cab h2{
  margin:0 !important; padding:0 !important;
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.42rem !important; line-height:1.22;
  letter-spacing:-0.022em; color:var(--nb-ink) !important;
  text-wrap:balance;
}
.sec.editor .nb-ficha > p{
  font-family:var(--nb-ff-b); font-size:1.02rem; line-height:1.68;
  color:var(--nb-ink-2) !important; margin:0 0 14px;
}
.sec.editor .nb-ficha > p:last-child{margin-bottom:0}
.sec.editor .nb-ficha b{color:var(--nb-ink) !important; font-weight:600}

/* la nota de cierre: fondo tenue y su icono a la izquierda */
.sec.editor .nb-ficha p.nb-nota{
  display:flex; gap:11px; align-items:flex-start;
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line);
  border-radius:13px; padding:14px 16px;
  font-size:0.96rem; color:var(--nb-ink-2) !important;
  margin:18px 0 0;
}
.sec.editor .nb-ficha p.nb-nota i{
  color:var(--nb-violet-aa); font-size:0.98rem;
  flex:0 0 auto; margin-top:0.28em;
}

/* ── las tres sedes ─────────────────────────────────────────── */
.sec.editor .nb-fichas ul.nb-sedes{
  list-style:none !important; margin:16px 0 0 !important; padding:0 !important;
  display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:12px;
}
.sec.editor .nb-fichas ul.nb-sedes > li{
  margin:0 !important; padding:15px 16px;
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line); border-radius:14px;
  display:flex; flex-direction:column; gap:3px;
  position:relative; overflow:hidden;
}
/* el filo de marca, arriba */
.sec.editor .nb-fichas ul.nb-sedes > li::before{
  content:""; position:absolute; top:0; left:0; right:0; height:3px;
  background:var(--nb-grad);
}
.sec.editor .nb-sede-n{
  font-family:var(--nb-ff-d); font-weight:700; font-size:1.04rem;
  color:var(--nb-ink); letter-spacing:-0.012em;
}
.sec.editor .nb-sede-p{
  font-family:var(--nb-ff-b); font-size:0.86rem; color:var(--nb-ink-3);
}

/* ── dos opciones enfrentadas ───────────────────────────────── */
.sec.editor .nb-duo{
  display:grid; grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:14px; margin:16px 0 0;
}
.sec.editor .nb-opcion{
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line); border-radius:14px;
  padding:20px 20px 18px;
  position:relative;
}
.sec.editor .nb-opcion h3{
  margin:0 0 9px !important; padding:0 !important;
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.06rem !important; letter-spacing:-0.014em;
  color:var(--nb-ink) !important;
}
.sec.editor .nb-opcion p{
  margin:0 !important; font-family:var(--nb-ff-b);
  font-size:0.97rem; line-height:1.62; color:var(--nb-ink-2) !important;
}
/* la recomendada, con el filo de marca a la izquierda */
.sec.editor .nb-opcion--destacada{
  background:var(--nb-paper);
  border-color:rgba(123,92,246,0.28);
  box-shadow:0 10px 26px -18px rgba(123,92,246,0.5);
}
.sec.editor .nb-opcion--destacada::before{
  content:""; position:absolute; top:14px; bottom:14px; left:0; width:3px;
  border-radius:0 3px 3px 0; background:var(--nb-grad);
}

/* ── qué incluye: dos por fila, con su marca de verificación ── */
/* LOS SELECTORES DE LAS LISTAS LLEVAN `.nb-fichas ul.…` Y NO ES DE ADORNO.
   `netebu_legal.php` pinta una viñeta redonda con
   `.sec.editor.nb-legal ul > li::before` —(0,3,3)—, y en la página de
   servicio legal le ganaba a un `.sec.editor .nb-incluye li::before`
   —(0,3,2)—: el check salía como un punto de 6 px. Nombrando el
   contenedor y el `ul` se llega a (0,4,3) y no depende del orden. */
.sec.editor .nb-fichas ul.nb-incluye{
  list-style:none !important; margin:4px 0 0 !important; padding:0 !important;
  display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); gap:12px;
}
.sec.editor .nb-fichas ul.nb-incluye > li{
  margin:0 !important; padding:15px 16px 15px 44px;
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line); border-radius:14px;
  display:flex; flex-direction:column; gap:2px;
  position:relative;
}
.sec.editor .nb-fichas ul.nb-incluye > li::before{
  /* SE DECLARA LA CAJA ENTERA, Y NO ES REDUNDANTE. La especificidad se
     resuelve PROPIEDAD A PROPIEDAD: esta regla le gana a la vinieta de
     `netebu_legal.php` —(0,4,3) contra (0,3,3)— pero solo en lo que
     declara. Sus `width:6px; height:6px; border-radius:50%` y su
     `background:var(--nb-grad)` seguian aplicando, asi que el check
     salia recortado a 6x6 con un degradado detras: un punto. */
  width:auto; height:auto; border-radius:0; background:none;
  content:"\f00c";
  /* LA FAMILIA CARGADA ES «Pro», NO «Free», y con «Free» sale el cuadrado
     vacio del glifo que no resuelve. Se comprobo en el navegador: de las
     familias de Font Awesome que el tema carga, la que esta disponible en
     peso 900 es «Font Awesome 5 Pro». La lista lleva las otras detras por
     si algun dia cambia la licencia. */
  font-family:"Font Awesome 5 Pro","Font Awesome 6 Pro",
              "Font Awesome 5 Free","FontAwesome";
  font-weight:900;
  position:absolute; left:16px; top:16px;
  font-size:0.82rem; color:var(--nb-violet-aa);
}
.sec.editor .nb-inc-t{
  font-family:var(--nb-ff-d); font-weight:700; font-size:0.99rem;
  color:var(--nb-ink); letter-spacing:-0.012em;
}
.sec.editor .nb-inc-d{
  font-family:var(--nb-ff-b); font-size:0.9rem; line-height:1.5;
  color:var(--nb-ink-3);
}

/* ── los tres usos de la unidad ─────────────────────────────── */
.sec.editor .nb-usos{
  display:grid; grid-template-columns:repeat(3, minmax(0, 1fr));
  gap:14px; margin:16px 0 0;
}
.sec.editor .nb-uso{
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line); border-radius:14px;
  padding:20px 18px 18px;
  transition:transform 0.26s ease, box-shadow 0.26s ease, border-color 0.26s ease;
}
.sec.editor .nb-uso:hover{
  transform:translateY(-3px);
  border-color:rgba(123,92,246,0.3);
  box-shadow:0 16px 34px -20px rgba(90,60,200,0.42);
}
.sec.editor .nb-uso-ico{
  width:38px; height:38px; border-radius:11px;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--nb-grad-suave);
  border:1px solid rgba(123,92,246,0.16);
  color:var(--nb-violet-aa); font-size:0.98rem;
  margin:0 0 12px;
}
.sec.editor .nb-uso h3{
  margin:0 0 8px !important; padding:0 !important;
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:1.02rem !important; letter-spacing:-0.014em;
  color:var(--nb-ink) !important; line-height:1.3;
}
.sec.editor .nb-uso p{
  margin:0 !important; font-family:var(--nb-ff-b);
  font-size:0.94rem; line-height:1.6; color:var(--nb-ink-2) !important;
}
.sec.editor .nb-uso a{color:var(--nb-violet-aa) !important; font-weight:600}
.sec.editor .nb-uso a:hover{text-decoration:underline}

/* ── los protocolos, como etiquetas ─────────────────────────── */
.sec.editor .nb-fichas ul.nb-protocolos{
  list-style:none !important; margin:14px 0 0 !important; padding:0 !important;
  display:flex; flex-wrap:wrap; gap:8px;
}
.sec.editor .nb-fichas ul.nb-protocolos > li{
  margin:0 !important; padding:7px 13px;
  background:var(--nb-paper-2);
  border:1px solid var(--nb-line); border-radius:999px;
  font-family:var(--nb-ff-d); font-weight:600; font-size:0.87rem;
  color:var(--nb-ink-2); letter-spacing:-0.006em;
  transition:border-color 0.22s ease, color 0.22s ease;
}
/* la viñeta redonda que `netebu_legal.php` pone a todo `ul > li` no
   tiene sentido dentro de una píldora */
.sec.editor .nb-fichas ul.nb-protocolos > li::before{content:none}
.sec.editor .nb-fichas ul.nb-protocolos > li:hover{
  border-color:rgba(123,92,246,0.32); color:var(--nb-violet-aa);
}

/* ── la llamada final ───────────────────────────────────────── */
.sec.editor .nb-ficha p.nb-cta-nbx{
  margin:18px 0 0; padding:16px 18px;
  background:var(--nb-grad-suave);
  border:1px solid rgba(123,92,246,0.2); border-radius:14px;
  font-family:var(--nb-ff-b); font-size:0.98rem; line-height:1.6;
  color:var(--nb-ink-2) !important;
}
.sec.editor .nb-ficha p.nb-cta-nbx a{
  color:var(--nb-violet-aa) !important; font-weight:600;
}
.sec.editor .nb-ficha p.nb-cta-nbx a:hover{text-decoration:underline}

/* ── el aviso de la sancion ─────────────────────────────────── */
/* Como `.nb-nota`, pero en tono de advertencia: el parrafo de las
   sanciones de la LSSI no es un apunte al margen, es el motivo por el
   que alguien esta leyendo esta pagina. */
.sec.editor .nb-ficha p.nb-alerta{
  display:flex; gap:12px; align-items:flex-start;
  background:rgba(179,38,30,0.055);
  border:1px solid rgba(179,38,30,0.18);
  border-radius:13px; padding:15px 17px;
  font-family:var(--nb-ff-b); font-size:0.98rem; line-height:1.62;
  color:var(--nb-ink-2) !important; margin:16px 0 0;
}
.sec.editor .nb-ficha p.nb-alerta i{
  color:#B3261E; font-size:1rem; flex:0 0 auto; margin-top:0.24em;
}
.sec.editor .nb-ficha p.nb-alerta b{color:#8E1F19 !important}

/* ── el bloque de preguntas frecuentes ──────────────────────── */
/* VA FUERA DE `.nb-fichas`, Y ESA ES LA CORRECCION. Estaba dentro de una
   ficha, asi que quedaba una caja con borde dentro de otra caja con
   borde, y no se parecia en nada al bloque `faqs` de las demas paginas
   —donde las tarjetas van sueltas bajo un titular grande centrado—.

   El titular replica el `.sec-title` del tema: Outfit 700 a 40 px,
   centrado, con la linea de degradado que pinta un `<span class="bordered">`
   —medido en servidores dedicados—. */
/* Los valores NO estan estimados: salen de comparar propiedad a propiedad
   el `.sec.faqs` de servidores dedicados con este bloque, en el navegador.
   Lo que quedaba distinto era el interlineado —46 px contra 44—, el margen
   inferior —26 contra 24— y, sobre todo, el ancho: alli las tarjetas miden
   860 px centradas y aqui ocupaban los 1258 del contenedor. */
.sec.editor .nb-faqs{padding:120px 0 0; margin:0}
.sec.editor .nb-faqs h2.nb-faqs-t{
  margin:0 0 24px !important; padding:0 !important;
  text-align:center; line-height:1.1;
  font-family:var(--nb-ff-d) !important; font-weight:700 !important;
  font-size:2.5rem !important; letter-spacing:-0.028em;
  color:var(--nb-ink) !important; text-wrap:balance;
}
/* EL TEXTO VIVE EN EL SPAN, ASI QUE EL SPAN LLEVA LA TIPOGRAFIA ENTERA.
   `netebu_legal.php` declara `.sec.editor.nb-legal span{font-family:Figtree;
   font-size:1.045rem; line-height:1.78 !important}` para pisar los `style=`
   en linea del contenido legal. El h2 estaba a 40 px, si, pero el texto va
   dentro del span y salia a 16,72 px en Figtree: por eso el titular se veia
   pequeno aunque el h2 midiera lo correcto.

   Es la misma ley de siempre: un elemento se estila ENTERO. `!important`
   porque el rival lo tiene, y (0,4,3) contra su (0,3,1). */
.sec.editor .nb-faqs h2.nb-faqs-t > span.bordered{
  position:relative; display:inline-block; padding-bottom:12px;
  /* EL SUBRAYADO MAGENTA DE CROSTER. La clase `.bordered` trae
     `border-bottom:3px solid #e42fd2`, que no es de la marca. El tema ya
     lo anula, pero solo para `.sec-title`, y este titular usa otra clase:
     seguia pintandose DEBAJO del degradado. Muestreado el pixel de la
     barra: los nueve puntos daban 228,47,210. */
  border-bottom:0 !important;
  font-family:var(--nb-ff-d) !important;
  font-size:2.5rem !important;
  font-weight:700 !important;
  line-height:1.1 !important;
  letter-spacing:-0.028em !important;
  color:var(--nb-ink) !important;
}
.sec.editor .nb-faqs h2.nb-faqs-t > span.bordered::after{
  content:""; position:absolute; left:0; right:0; bottom:0;
  height:3px; border-radius:2px;
  background:var(--nb-grad);
}

/* ── preguntas y respuestas ─────────────────────────────────── */
/* MISMO ASPECTO QUE EL BLOQUE `faqs` DEL TEMA, y a proposito: en las
   demas paginas comerciales las preguntas frecuentes son ese acordeon,
   y aqui van dentro del texto porque esta pagina no tiene bloque `faqs`.
   Que se vean distintas dos cosas que son la misma no tiene defensa.

   Los valores estan medidos del `.sec.faqs` de servidores dedicados:
   tarjeta blanca, borde de una linea, radio 16, esa sombra, el icono en
   cuadrado de 38 y la respuesta sangrada 73 px —22 de relleno mas 38 de
   icono mas 13 de hueco—, para que arranque bajo la pregunta y no bajo
   el icono. */
.sec.editor .nb-qa{
  display:grid; gap:16px;
  max-width:860px; margin:0 auto;   /* el ancho medido en dedicados */
}
.sec.editor .nb-qa-item{
  background:var(--nb-paper);
  border:1px solid var(--nb-line); border-radius:16px;
  box-shadow:0 1px 2px rgba(20,17,31,0.04),
             0 12px 30px -20px rgba(20,17,31,0.16);
  padding:0;
}
.sec.editor .nb-qa p.nb-qa-p{
  /* `flex-start` y no `center`: en escritorio las preguntas caben en una
     linea y da igual, pero en movil ocupan tres y el icono se quedaba
     flotando en mitad del parrafo. Junto a la primera linea se lee como
     lo que es: la marca de la pregunta. */
  display:flex; align-items:flex-start; gap:13px;
  margin:0 !important; padding:20px 22px 0 !important;
  font-family:var(--nb-ff-d) !important; font-weight:700;
  font-size:1rem; letter-spacing:-0.012em;
  color:var(--nb-ink) !important;
}
.sec.editor .nb-qa p.nb-qa-p::before{
  content:"\f128";
  font-family:"Font Awesome 5 Pro","Font Awesome 6 Pro",
              "Font Awesome 5 Free","FontAwesome";
  font-weight:900;
  flex:0 0 38px; width:38px; height:38px; border-radius:11px;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--nb-grad-suave);
  border:1px solid rgba(123,92,246,0.16);
  color:var(--nb-violet-aa); font-size:0.92rem;
  margin-top:-0.14em;   /* centrado optico con la primera linea */
}
.sec.editor .nb-qa p.nb-qa-r{
  margin:0 !important; padding:12px 22px 22px 73px !important;
  font-family:var(--nb-ff-b);
  font-size:0.96rem; line-height:1.65; color:var(--nb-ink-2) !important;
}

/* tres por fila cuando son tres, cuatro en dos filas cuando son cuatro */
.sec.editor .nb-fichas ul.nb-incluye--tres{grid-template-columns:repeat(3, minmax(0, 1fr))}
.sec.editor .nb-usos--cuatro{grid-template-columns:repeat(2, minmax(0, 1fr))}
/* el nombre del servicio, en cursiva dentro del texto */
.sec.editor .nb-uso p i{
  font-style:normal; font-weight:600; color:var(--nb-violet-aa);
}

/* ── en pantallas estrechas, todo en una columna ────────────── */
@media (max-width:991px){
  .sec.editor .nb-usos,
  .sec.editor .nb-fichas ul.nb-incluye--tres{grid-template-columns:repeat(2, minmax(0, 1fr))}
}
@media (max-width:767px){
  .sec.editor .nb-ficha{padding:22px 20px 20px; border-radius:16px}
  .sec.editor .nb-ficha-cab{gap:12px; margin-bottom:14px}
  .sec.editor .nb-ficha-cab h2{font-size:1.24rem !important}
  .sec.editor .nb-ficha-ico{flex-basis:40px; width:40px; height:40px; font-size:1rem}
  .sec.editor .nb-fichas ul.nb-sedes,
  .sec.editor .nb-fichas ul.nb-incluye,
  .sec.editor .nb-fichas ul.nb-incluye--tres,
  .sec.editor .nb-duo,
  .sec.editor .nb-usos,
  .sec.editor .nb-usos--cuatro{grid-template-columns:1fr}
  .sec.editor .nb-fichas{gap:16px}
  .sec.editor .nb-faqs{padding-top:44px}
  .sec.editor .nb-faqs h2.nb-faqs-t,
  .sec.editor .nb-faqs h2.nb-faqs-t > span.bordered{font-size:1.72rem !important}
  .sec.editor .nb-faqs h2.nb-faqs-t{margin-bottom:20px !important}
  .sec.editor .nb-qa p.nb-qa-p{padding:17px 18px 0 !important; gap:11px}
  .sec.editor .nb-qa p.nb-qa-p::before{flex-basis:32px; width:32px; height:32px; font-size:0.85rem}
  .sec.editor .nb-qa p.nb-qa-r{padding:10px 18px 18px 18px !important}
}

@media (prefers-reduced-motion:reduce){
  .sec.editor .nb-ficha,
  .sec.editor .nb-uso,
  .sec.editor .nb-fichas ul.nb-protocolos > li{transition:none}
  .sec.editor .nb-uso:hover{transform:none}
}

/* ── nb-lateral ── */

:root{
  --nb-blue:#4A90D9; --nb-violet:#7B5CF6; --nb-pink:#E84098;
  --nb-violet-aa:#6B48F2;
  --nb-grad:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
  --nb-grad-suave:linear-gradient(135deg,rgba(74,144,217,0.16) 0%,
                  rgba(123,92,246,0.16) 50%,rgba(232,64,152,0.16) 100%);
  --nb-ink:#14111F; --nb-ink-2:#4C4560; --nb-ink-3:#726C85;
  --nb-line:#E9E4F3; --nb-line-2:#D8D0EC;
  --nb-paper:#FFFFFF; --nb-paper-2:#FAF8FE;
  --nb-ff-d:"Outfit",system-ui,-apple-system,sans-serif;
  --nb-ff-b:"Figtree",system-ui,-apple-system,sans-serif;
}
/* ── barra lateral (noticias y preguntas) ─────────────────── */
.main-container .card-sidebar{
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:15px !important; overflow:hidden;
  box-shadow:0 1px 2px rgba(20,17,31,0.04), 0 12px 30px -20px rgba(20,17,31,0.16);
}
.main-container .card-sidebar .card-header{
  background:var(--nb-paper-2) !important;
  border-bottom:1px solid var(--nb-line) !important;
  padding:14px 18px !important;
}
.main-container .card-sidebar .card-title{
  font-family:var(--nb-ff-d) !important; font-weight:600 !important;
  font-size:1rem !important; color:var(--nb-ink) !important;
}
.main-container .card-sidebar .card-title i:not(.card-minimise){
  color:var(--nb-violet) !important; margin-right:8px;
}
.main-container .card-sidebar .card-minimise{color:var(--nb-ink-3) !important}
.main-container .list-group-item{
  background:transparent !important;
  border:0 !important; border-bottom:1px solid var(--nb-line) !important;
  font-family:var(--nb-ff-b); font-size:0.94rem;
  color:var(--nb-ink-2) !important; padding:11px 18px !important;
  transition:background 0.2s ease, color 0.2s ease, padding-left 0.2s ease;
}
.main-container .list-group-item:last-child{border-bottom:0 !important}
.main-container .list-group-item-action:hover,
.main-container .list-group-item-action:focus{
  background:var(--nb-paper-2) !important;
  color:var(--nb-violet-aa) !important; padding-left:23px !important;
}
.main-container .list-group-item.active{
  background:var(--nb-grad-suave) !important;
  color:var(--nb-ink) !important; font-weight:600;
}
.main-container .list-group-item i{color:var(--nb-violet) !important}

/* ── LA COLUMNA LATERAL SE PEGA SOLO SI CABE ─────────────────
   Esto vive AQUI, en el bloque sin filtro de ruta, y no con el resto
   del area de cliente, por el mismo motivo que el aspecto de la
   lateral: es el mismo componente en el area, en la base de
   conocimientos, en las noticias, en las descargas y en la tienda de
   MarketConnect. Estando en el bloque filtrado, `/store/hosting` y
   `/knowledgebase` se quedaban sin el —lo vio el responsable— porque a
   esas rutas no les llega aquella hoja.

   SE PEGA SOLO SI CABE ENTERA. La clase la pone el JS despues de
   medir; sin ella la columna baja con la pagina como cualquier otra.
   La primera version se pegaba siempre y le ponia `max-height` con
   scroll propio, y estaba mal por una razon que dio el responsable con
   sus palabras: «tiene posibilidad de scroll y puede descubrir
   Soporte». Si hay que DESCUBRIRLO, ya no sirve: un scroll dentro de
   otro no lo encuentra nadie, y al llegar al pie nada avisa de que
   arriba quedaron cajas sin ver.

   Medido: en el ticket la columna suma 1.132 px contra los 756 utiles
   de una ventana de 900; en el detalle de dominio son 570 y en el
   panel 657, y ahi caben de sobra.

   Y SE PEGA LA COLUMNA ENTERA, NUNCA UNA CAJA SUELTA: pegando solo
   `.sidebar-primary`, en el detalle de dominio se montaba encima de
   «Acciones» y le comia la cabecera. Por eso las de dentro se
   devuelven a `static`.

   Dos formas de columna, porque el tema no las monta igual: en el area
   y en soporte la columna CONTIENE los `.sidebar`; en la tienda la
   columna ES el `.sidebar`. El `.col-lg-3` del pie —el de «Siganos»—
   no lleva ninguno de los dos y por eso queda fuera solo.

   AIRE BAJO LA BARRA: la barra flotante `nav#nav.cros-navbar` va de 14
   a 95 px, asi que un `top:96px` deja UN pixel y la caja parece
   calzada debajo del menu en vez de parada. Con 120 quedan 25 de
   respiracion, la misma distancia que hay entre barra y contenido con
   la pagina arriba del todo. */
@media (min-width:992px){
  [class*="col-lg-3"].nb-pegada{
    position:sticky !important; top:120px !important;
    align-self:flex-start !important;
  }
  .nb-pegada .sidebar,
  .nb-pegada .sidebar-primary,
  .nb-pegada .sidebar-secondary{
    position:static !important; top:auto !important; z-index:auto !important;
  }

  /* Y QUE PARE A LA ALTURA DEL ULTIMO ARTICULO, NI UN PIXEL MAS.

     Una caja pegada se suelta cuando su borde de abajo alcanza el de su
     contenedor, y ese contenedor es la fila entera. El problema es que la
     fila NO acaba donde acaba el contenido: el ultimo `.section` de
     `.primary-content` arrastra su `margin-bottom:38px`, un margen que
     separa secciones entre si y que despues de la ultima no separa de
     nada. La fila se estira esos 38 px y la columna los aprovecha para
     seguir bajando.

     En `/knowledgebase` la caja acababa 22 px por debajo del ultimo
     articulo: los 38 que sobran menos los 16 del `mb-3` que Croster le
     pone a la tarjeta lateral. Se quitan los dos —el margen que ya no
     separa y el `mb-3`, que dentro de una columna pegada tampoco separa
     de nada porque no hay nada debajo— y el borde de la caja cae justo
     sobre el del ultimo articulo.

     No se compensa con un numero: 22 solo vale para esta pagina. Medido
     en `/knowledgebase` (22 de mas), `/knowledgebase/1/Dominios` y
     `/knowledgebase/2/Hosting` (16 de menos en las dos): las tres cuadran
     a 0. En `/announcements` no cambia nada, porque alli la lateral no
     llega a pegarse. */
     Y OJO CON QUE TARJETA PIERDE EL MARGEN. La columna del area de
     cliente lleva TRES —«Su Informacion», «Contactos» y «Accesos
     Directos»— repartidas en dos contenedores, `.sidebar-primary` con una
     y `.sidebar-secondary` con dos. Quitarselo a `.card-sidebar` a secas
     las deja pegadas sin una linea de aire entre ellas, y `:last-child` a
     secas tampoco vale: «Su Informacion» tambien es la ultima de SU
     contenedor y es la que separa de «Contactos».

     La que sobra el margen es la ultima de la COLUMNA: la ultima tarjeta
     del ultimo contenedor. */
     El resto —el aire que la fila arrastra de mas y que dejaba a la
     columna bajar por debajo del ultimo recuadro— lo mide el JS de abajo,
     que es el unico que puede saber donde acaba lo que se ve. Aqui solo
     se quita el margen de la ultima tarjeta, que si es fijo. */
  .main-container .nb-pegada > *:last-child .card-sidebar:last-child{margin-bottom:0 !important}
}

/* ── nb-subir ── */

/* Los tokens se declaran AQUI, no se heredan.
   Varios hooks del sitio definen `--nb-paper` y `--nb-line` con valores
   distintos en su propio `:root` —los bloques oscuros usan otros—, asi
   que confiar en la herencia deja el boton del color del ultimo hook que
   haya cargado. */
.nb-subir{
  --s-paper:#FFFFFF;
  --s-line:#E9E4F3;
  --s-violet:#7B5CF6;
  --s-violet-aa:#6B48F2;
  --s-ink:#14111F;

  /* APILADO SOBRE EL DE COOKIES, no en la esquina contraria.
   *
   * Los dos viven en la esquina derecha, en columna y con 10 px de aire:
   * cookies abajo (`bottom:18px`, su hook) y este encima. La cuenta es
   * 18 + 48 de alto + 10 de separacion = 76.
   *
   * Y EL ORDEN NO ES CAPRICHOSO. El de cookies esta SIEMPRE; este
   * aparece y desaparece al bajar. Si el volatil fuera el de abajo, el
   * de cookies daria un salto de 58 px cada vez que este entra o sale.
   * Con el volatil arriba, el ancla no se mueve nunca.
   *
   * En movil ademas los dos caen en la zona del pulgar; en esquinas
   * opuestas, uno de los dos obliga a cruzar la pantalla. */
  position:fixed; z-index:2147481000;
  right:18px; bottom:76px;
  width:48px; height:48px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--s-paper); color:var(--s-violet-aa);
  border:1px solid var(--s-line); cursor:pointer; padding:0;
  /* La sombra se tiñe de violeta ya en reposo, no solo al pasar el ratón.
     Una sombra gris bajo un botón de marca lo deja despegado del sitio;
     con el tinte de la paleta parece que la pieza pertenece a la página.
     Sutil a propósito: 0.10 y 0.26 de alfa, lo justo para notarse. */
  box-shadow:0 2px 6px rgba(123,92,246,0.10), 0 14px 30px -14px rgba(123,92,246,0.26);
  opacity:0; visibility:hidden; transform:translateY(8px);
  transition:transform 0.24s ease, box-shadow 0.24s ease,
             border-color 0.24s ease, opacity 0.24s ease, visibility 0.24s;
}
.nb-subir.nb-visible{opacity:1; visibility:visible; transform:none}
.nb-subir:hover{
  transform:translateY(-3px); border-color:var(--s-violet);
  box-shadow:0 4px 10px rgba(20,17,31,0.1), 0 20px 40px -16px rgba(90,60,200,0.44);
}
.nb-subir:focus-visible{outline:2px solid var(--s-violet); outline-offset:3px}
.nb-subir svg{width:21px; height:21px; display:block}

/* CUANDO APARECE EL BADGE DE reCAPTCHA suben los dos, no uno.
   Google lo fija en la misma esquina con 60 px de alto, y el hook de
   cookies ya sube el suyo a `bottom:88px` en ese caso. Este tiene que
   subir lo mismo para no montarse encima: 88 + 48 + 10 = 146.
   Si el navegador no soporta `:has()` los dos se quedan donde estaban,
   que es el comportamiento de siempre: no mejora, pero no rompe. */
body:has(.grecaptcha-badge) .nb-subir{ bottom:146px }

/* La etiqueta sale por la IZQUIERDA, igual que la del boton de cookies:
   los dos estan pegados al borde derecho. */
.nb-subir::after{
  content:attr(data-txt); position:absolute; right:58px;
  white-space:nowrap; background:var(--s-ink); color:#fff;
  font-family:Outfit,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  font-weight:600; font-size:0.8rem;
  padding:7px 11px; border-radius:9px;
  opacity:0; transform:translateX(6px); pointer-events:none;
  transition:opacity 0.2s ease, transform 0.2s ease;
}
.nb-subir:hover::after,
.nb-subir:focus-visible::after{opacity:1; transform:none}

/* En movil la etiqueta sobra: no hay raton que la dispare y al pulsar
   se quedaria colgada en pantalla. */
@media (hover:none){ .nb-subir::after{content:none} }

/* MISMO CORTE Y MISMOS MARGENES QUE EL BOTON DE COOKIES.
   Su hook lo lleva a `right:12px; bottom:12px` por debajo de 520 px; si
   aqui se dejan los 18, los dos dejan de estar alineados y se nota:
   medido, 6 px de desfase en el borde derecho. La cuenta de la columna
   es la misma que arriba, con los margenes de movil: 12 + 48 + 10 = 70. */
@media (max-width:520px){
  .nb-subir{right:12px; bottom:70px}
  body:has(.grecaptcha-badge) .nb-subir{bottom:146px}
}

/* El del pie deja de tener sentido cuando hay uno permanente. */
.sec.footer .back-to-top,
.footer .back-to-top,
a.back-to-top{display:none !important}

@media (prefers-reduced-motion:reduce){
  .nb-subir{transition:opacity 0.01s linear}
  .nb-subir:hover{transform:none}
}

/* ── nb-banner ── */

:root{
  --nb-blue:#4A90D9; --nb-violet:#7B5CF6; --nb-pink:#E84098;
  --nb-grad:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%);
  --nb-ff-d:"Outfit",system-ui,-apple-system,sans-serif;
  --nb-ff-b:"Figtree",system-ui,-apple-system,sans-serif;
}
/* ── el banner de cabecera ────────────────────────────────── */
/* `.hero-bg-wrap.small-header` con /imagenes/universo_netebu.jpg de
   fondo. El titulo salia en la fuente del sistema a 36 px porque este
   bloque vive FUERA de `.main-container`: por eso las variables se
   declaran ahora en `:root`.                                        */
.hero-bg-wrap.small-header{
  position:relative; background-color:#0B0A16 !important;
  /* Croster añade `border-top:5px solid #E42FD2` a
     `.header-banner-styled`. Era la línea magenta que aparecía pegada
     al borde superior del viewport, por encima incluso de la isla. */
  border-top:0 !important;
}
/* Velo de marca. Funde hacia el propio negro de la seccion, nunca
   hacia blanco, y deja asomar la foto por el centro.               */
/* LA FOTO DEL UNIVERSO SE SUSTITUYE POR UNA RED NEURONAL VIVA.
   Es la MISMA pieza que anima el fondo de webmail.php: nodos que se
   mueven despacio, aristas que se desvanecen con la distancia y
   pulsos que viajan de nodo a nodo. Copiarla y no imitarla es lo
   unico que garantiza que se vean iguales.                        */
.hero-bg-wrap.small-header{background-image:none !important}
.hero-bg-wrap.small-header .nb-net{
  position:absolute; inset:0; width:100%; height:100%;
  display:block; z-index:1; pointer-events:none;
}
/* un tinte de marca por detras, para que la red no flote sobre un
   negro plano */
.hero-bg-wrap.small-header::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:
    radial-gradient(900px 460px at 12% 0%, rgba(74,144,217,0.22), transparent 64%),
    radial-gradient(760px 400px at 88% 100%, rgba(232,64,152,0.18), transparent 62%);
}
/* filo inferior con el degradado, igual que en el pie */
.hero-bg-wrap.small-header::before{
  content:""; position:absolute; left:0; right:0; bottom:0; height:3px;
  z-index:3; background:var(--nb-grad);
}
.hero-bg-wrap.small-header > .container{
  position:relative; z-index:2; max-width:1400px !important;
}
.hero-bg-wrap.small-header .page-title{
  /* `align-items:center` repartia el hueco sobrante y el titulo caia
     donde salia —a 193 px, demasiado cerca de la isla, que acaba en
     95—. Anclado arriba, el relleno superior DECIDE la posicion y
     es la misma en todas las paginas. */
  min-height:400px;
  display:flex; align-items:flex-start; flex-direction:column;
  justify-content:flex-start;
  padding:238px 0 78px !important;
}
.hero-bg-wrap.small-header .page-title > .header-lined{width:100%}
@media (max-width:991px){
  .hero-bg-wrap.small-header .page-title{
    min-height:320px; padding:172px 0 60px !important;
  }
}
@media (max-width:767px){
  /* la isla movil acaba en y=90: 148 px dejan un respiro de 58 */
  .hero-bg-wrap.small-header .page-title{
    min-height:280px; padding:148px 0 50px !important;
  }
}
.hero-bg-wrap.small-header .header-lined{
  border:0 !important; margin:0 !important; padding:0 !important;
}
.hero-bg-wrap.small-header h1,
.hero-bg-wrap.small-header .h1{
  font-family:var(--nb-ff-d) !important; font-weight:800 !important;
  font-size:clamp(1.9rem, 3.4vw, 2.7rem) !important;
  letter-spacing:-0.032em; line-height:1.08;
  color:#F2F3FB !important; text-wrap:balance;
  margin:0 0 12px !important;
}
/* las migas */
.hero-bg-wrap.small-header .breadcrumb{
  background:transparent !important; padding:0 !important; margin:0 !important;
  font-family:var(--nb-ff-b); font-size:0.875rem;
}
.hero-bg-wrap.small-header .breadcrumb-item,
.hero-bg-wrap.small-header .breadcrumb-item a{
  color:#B9BEDD !important; transition:color 0.2s ease;
}
.hero-bg-wrap.small-header .breadcrumb-item a:hover{color:#F2F3FB !important}
/* La zona que se puede pulsar. Medido a 390 px: 21 px de alto, por
   debajo de los 24 que pide WCAG 2.5.8. Se agranda con un
   pseudoelemento para no separar las migas entre si ni empujar el
   titulo que va debajo. */
.hero-bg-wrap.small-header .breadcrumb-item a{position:relative}
.hero-bg-wrap.small-header .breadcrumb-item a::after{
  content:""; position:absolute; inset:-12px -4px; z-index:1;
}
.hero-bg-wrap.small-header .breadcrumb-item.active{color:#F2F3FB !important; font-weight:500}
.hero-bg-wrap.small-header .breadcrumb-item + .breadcrumb-item::before{
  color:var(--nb-violet) !important; opacity:0.85;
}
/* el rotulo de la derecha («Manuales, programas y otros archivos») */
.hero-bg-wrap.small-header .header-lined span,
.hero-bg-wrap.small-header .header-lined p,
.hero-bg-wrap.small-header small{
  font-family:var(--nb-ff-d) !important; color:#B9BEDD !important;
  font-size:0.82rem !important; letter-spacing:0.1em; text-transform:uppercase;
}

/* ══ EL CAMPO DE "SOMOS NETEBU" ═════════════════════════════
   El titular y la presentacion pasan a fondo oscuro con la red
   neuronal detras, para que la isla del menu tenga sobre que
   apoyarse. El campo se detiene antes de "Nuestros valores": de
   ahi para abajo la pagina sigue en claro, como estaba.
   El degradado de cierre funde hacia el BLANCO de la pagina
   porque es el color real de lo que viene despues —no es un velo
   sobre imagen, es la costura entre dos zonas—. */
body .nb-wrap .nb-container{position:relative}
/* ══ EL FONDO, DESDE EL CSS ═════════════════════════════════
   El campo oscuro lo montaba SOLO el JavaScript: creaba `.nb-campo`
   y le anadia `body.nb-somos` en `DOMContentLoaded`. Hasta ese
   momento el navegador no tenia nada que pintar y la seccion salia
   EN BLANCO unos cientos de milisegundos.

   Es el mismo fallo que tenia el navbar: el aspecto bueno dependia
   de una clase que ponia el JS, asi que el primer fotograma salia
   sin ella. Y la misma cura: que el CSS de por defecto el aspecto
   correcto y el JS se limite a lo que solo el puede hacer.

   Por eso los selectores de aqui abajo cuelgan ahora de `.nb-wrap`
   —que solo existe en esta pagina, comprobado— en vez de
   `body.nb-somos`. `body .nb-wrap` conserva exactamente la misma
   especificidad que `body.nb-somos`, asi que ninguna regla cambia
   de peso.

   Este `::before` pinta el fondo desde el primer fotograma con una
   altura de partida. Cuando el JS mide la seccion escribe la altura
   real en `--nb-campo-alto`, que es la que usan TANTO este como el
   campo de verdad: al coincidir, el relevo no da ningun salto. El
   campo real se monta encima y anade lo que solo el puede dar —la
   red neuronal, el tinte y el filo—. */
body .nb-wrap .nb-container::before{
  content:""; position:absolute; left:50%; transform:translateX(-50%);
  top:0; width:100vw; max-width:100vw;
  height:var(--nb-campo-alto, 675px);
  background:#0B0A16; z-index:0; pointer-events:none;
}
/* Alturas de partida MEDIDAS en el navegador, no estimadas: en movil
   el campo es MAS alto que en escritorio, porque el mismo texto ocupa
   muchas mas lineas. Cuanto mejor sea esta aproximacion, menos se
   ajusta el bloque cuando el JS escribe la altura real.
     390 px -> 788    768 px -> 555    1024 px -> 617    1440+ -> 673  */
@media (max-width:767px){
  body .nb-wrap .nb-container::before{height:var(--nb-campo-alto, 790px)}
}
@media (min-width:768px) and (max-width:1023px){
  body .nb-wrap .nb-container::before{height:var(--nb-campo-alto, 560px)}
}
@media (min-width:1024px) and (max-width:1279px){
  body .nb-wrap .nb-container::before{height:var(--nb-campo-alto, 620px)}
}
.nb-wrap .nb-campo{
  position:absolute; left:50%; transform:translateX(-50%);
  top:0; width:100vw; max-width:100vw;
  z-index:0; pointer-events:none; overflow:hidden;
  background:#0B0A16;
}
.nb-wrap .nb-campo .nb-net{
  position:absolute; inset:0; width:100%; height:100%; display:block;
}
.nb-wrap .nb-campo::after{
  content:""; position:absolute; inset:0;
  /* Sin fundido: el campo es una SECCION con su corte limpio. Solo
     el tinte de marca, igual que el banner de las demas paginas. */
  background:
    radial-gradient(900px 460px at 14% 0%, rgba(74,144,217,0.20), transparent 64%),
    radial-gradient(760px 400px at 86% 100%, rgba(232,64,152,0.16), transparent 62%);
}
/* filo inferior con el degradado, el mismo remate que el banner */
.nb-wrap .nb-campo::before{
  content:""; position:absolute; left:0; right:0; bottom:0; height:3px;
  z-index:2; background:var(--nb-grad);
}
/* TODO el contenido por encima del campo, no solo el titular y la
   presentacion: la cola del campo llega mas abajo que el parrafo y
   tapaba "Nuestros valores", que no llevaba z-index. */
/* `:not(.nb-campo)` es imprescindible: el campo es `position:absolute`
   y con un `> *` se le cambiaba a `relative`, con lo que dejaba de
   flotar, PASABA A OCUPAR SITIO en el flujo y empujaba toda la
   pagina 850 px hacia abajo. */
body .nb-wrap .nb-container > *:not(.nb-campo){position:relative; z-index:1}
/* el texto, al claro */
body .nb-wrap .nb-hero h1,
body .nb-wrap .nb-hero .nb-title,
body .nb-wrap .nb-hero h2{color:#F2F3FB !important}
body .nb-wrap .nb-intro,
body .nb-wrap .nb-intro p,
body .nb-wrap .nb-intro div{color:#B9BEDD !important}
body .nb-wrap .nb-intro strong,
body .nb-wrap .nb-intro b,
body .nb-wrap .nb-intro mark{color:#F2F3FB !important; background:transparent !important}
/* el rotulo de encima del titular: sobre el campo oscuro necesita
   mas cuerpo del que traia —salia violeta sobre violeta— */
body .nb-wrap .nb-hero [class*="eyebrow"],
body .nb-wrap .nb-hero .nb-kicker,
body .nb-wrap .nb-container > .nb-hero span[class]:first-child{
  background:rgba(255,255,255,0.09) !important;
  border:1px solid rgba(255,255,255,0.20) !important;
  color:#F2F3FB !important;
}
body .nb-wrap .nb-hero [class*="eyebrow"] *,
body .nb-wrap .nb-hero .nb-kicker *{color:#F2F3FB !important}
/* y el cuerpo del parrafo, con el claro de marca */
body .nb-wrap .nb-intro *{color:#CFD3EA !important}
body .nb-wrap .nb-intro strong,
body .nb-wrap .nb-intro b{color:#FFFFFF !important}
/* la caja de la presentacion, de cristal en vez de gris claro */
body .nb-wrap .nb-intro{
  background:rgba(255,255,255,0.05) !important;
  border:1px solid rgba(255,255,255,0.14) !important;
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
}
/* "Nuestros valores" se separa para quedar POR DEBAJO de la cola
   del campo: si cae dentro del fundido, su rotulo rosa se lava. */
/* Aire normal de seccion: el campo termina justo encima, ya no hay
   ningun fundido del que escapar. */
body .nb-wrap .nb-values-wrap{margin-top:0 !important; padding-top:64px}
/* el titular tiene que despejar la isla, que acaba en y=95 */
body .nb-wrap .nb-container > .nb-hero{padding-top:150px !important}
@media (max-width:767px){
  body .nb-wrap .nb-container > .nb-hero{padding-top:120px !important}
}

/* ── nb-whatsapp ── */

/* `body` DELANTE DE TODO, Y NO ES ADORNO.
   La hoja del widget se inyecta cuando carga su script, o sea DESPUES
   que esta, y con la misma especificidad y `!important` en las dos
   gana la ultima. Medido: `left` y `height` si se aplicaban y `width`
   y `bottom` no, segun cuales llevaran `!important` alla. Con `body`
   delante la especificidad sube de 1,0,0 a 1,0,1 y deja de depender
   del orden de carga.
   Los tokens se declaran aqui: varios hooks definen `--nb-paper` y
   `--nb-line` con valores distintos en su propio `:root`. */
body #wasapi-widget-button{
  --w-paper:#FFFFFF;
  --w-line:#E9E4F3;
  --w-violet:#7B5CF6;

  /* mismo tamano y sitio que los otros dos flotantes.
     `min-width` TAMBIEN, y esta es la clave: el widget declara
     `#wasapi-widget-button{min-width:50px}` y un minimo NO COMPITE
     con el ancho, lo ACOTA. Da igual la especificidad y da igual el
     `!important`: los 48 px se aplicaban y el minimo los volvia a
     subir a 50. Se veia en que la altura si obedecia y el ancho no.
     Se pregunto con `CSS.getMatchedStylesForNode`, que es la unica
     forma de ver esto sin adivinar. */
  width:48px !important; height:48px !important;
  min-width:48px !important; max-width:48px !important;
  min-height:48px !important; max-height:48px !important;
  border-radius:50% !important;
  left:18px !important; right:auto !important; bottom:18px !important;
  margin:0 !important;

  background:var(--w-paper) !important;
  border:1px solid var(--w-line) !important;
  box-shadow:0 2px 6px rgba(123,92,246,0.10),
             0 14px 30px -14px rgba(123,92,246,0.26) !important;
  transition:transform 0.24s ease, box-shadow 0.24s ease,
             border-color 0.24s ease !important;
  overflow:visible !important;
  display:flex !important; align-items:center; justify-content:center;
}
body #wasapi-widget-button:hover{
  transform:translateY(-3px) !important;
  border-color:var(--w-violet) !important;
  box-shadow:0 4px 10px rgba(20,17,31,0.1),
             0 20px 40px -16px rgba(90,60,200,0.44) !important;
}

/* EL ICONO. Las OPCIONES del widget no dejan cambiarlo, pero el
   elemento es un `<img>` corriente: el guion de abajo le cambia el
   `src` por el isotipo y aqui solo se le da la medida. Mas simple
   que ocultarlo y repintarlo con un pseudoelemento, que es lo que
   hacia la primera version. */
body #wasapi-widget-button img{
  width:27px !important; height:27px !important;
  display:block !important;
}

/* El distintivo de WhatsApp, para que se entienda de un vistazo.
   El glifo va incrustado como `data:` y no como fichero: asi el
   badge no depende de ninguna peticion mas, ni al servidor ni a
   terceros. */
body #wasapi-widget-button::after{
  content:"";
  position:absolute; right:-2px; bottom:-2px;
  width:19px; height:19px; border-radius:50%;
  background:#25D366;
  border:2px solid var(--w-paper);
  box-shadow:0 1px 3px rgba(20,17,31,0.18);
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M17.47 14.38c-.3-.15-1.75-.86-2.02-.96-.27-.1-.47-.15-.67.15-.2.3-.77.96-.94 1.16-.17.2-.35.22-.64.07-.3-.15-1.25-.46-2.38-1.47-.88-.78-1.47-1.75-1.65-2.05-.17-.3-.02-.46.13-.6.13-.14.3-.35.45-.52.15-.17.2-.3.3-.5.1-.2.05-.37-.02-.52-.08-.15-.67-1.6-.92-2.2-.24-.58-.49-.5-.67-.51h-.57c-.2 0-.52.07-.79.37-.27.3-1.04 1.02-1.04 2.48s1.07 2.88 1.22 3.08c.15.2 2.1 3.2 5.08 4.49.71.3 1.26.49 1.7.63.71.23 1.36.19 1.87.12.57-.09 1.75-.72 2-1.41.25-.7.25-1.29.17-1.41-.07-.13-.27-.2-.57-.35z'/%3E%3C/svg%3E");
  background-size:13px 13px; background-position:center; background-repeat:no-repeat;
}

/* ══ LA TARJETA DE CHAT ═══════════════════════════════════════
   De serie viene con el traje de WhatsApp: cabecera plana, fondo
   beige `#EAE6DF` y, en la zona de mensajes, una imagen que se
   descarga de `app.wasapi.io`.

   PERO CASI NINGUNA DE SUS PIEZAS TIENE CLASE. Inspeccionado el
   arbol: de los catorce elementos de la tarjeta solo tres la llevan,
   y la propia tarjeta comparte `wasapi-widget-general-align` con el
   boton flotante. Los intentos anteriores fallaban por eso, no por
   la cascada: los selectores no encontraban nada.

   Encadenar `:nth-child` funcionaria hoy y se romperia el dia que
   Wasapi anada un `<div>`. Asi que las clases las pone el guion de
   abajo —`nb-wa-*`— y aqui se estila por ellas. Si el widget cambia
   de estructura, deja de aplicarse el color: no se rompe la pagina. */
body .nb-wa-card{
  background:#FAF8FE !important;
  border:1px solid #E9E4F3 !important;
  border-radius:16px !important;
  box-shadow:0 2px 6px rgba(123,92,246,0.10),
             0 26px 60px -22px rgba(20,17,31,0.34) !important;
  overflow:hidden !important;
  left:18px !important; right:auto !important;
  /* SEPARADA DEL BOTON, no encima de el.
     Y OJO A LA PROPIEDAD: el widget coloca la tarjeta con
     `bottom:0` mas `margin-bottom:60px`, no con `bottom`. Escribir
     `bottom:80px` no hacia nada porque no es ahi donde vive la
     medida; se veia en que la tarjeta seguia a 60 px y se montaba
     seis sobre el flotante.
     La cuenta: 18 del boton + 48 de alto + 14 de aire = 80. */
  bottom:0 !important;
  margin-bottom:80px !important;
}

/* EL DEGRADADO, EN UNA SOLA PIEZA Y SIN DESPLAZAR.
   La franja de 10 px de arriba llevaba su propio degradado y la
   cabecera otro corrido con `background-position:0 -10px` para
   fingir continuidad. El resultado era un degradado partido, con un
   salto de color en la union: eso era lo que se veia mal.
   La franja se retira —no aporta nada— y la cabecera se queda con
   el degradado limpio, entero y sin tocar. */
body .nb-wa-franja{display:none !important}
body .nb-wa-cabecera{
  background:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%) !important;
  border:0 !important;
}
/* EL AVATAR, EN BLANCO Y CON EL LOGO DENTRO.
   El isotipo es azul, violeta y rosa: puesto sobre el degradado de la
   cabecera —que son esos mismos colores— se disuelve. Con el disco
   blanco detras recupera el contraste y ademas repite la forma del
   boton flotante, que tambien es una nube sobre blanco. */
body .nb-wa-cabecera > img{
  background:#FFFFFF !important;
  border-radius:50% !important;
  padding:9px !important;
  box-sizing:border-box !important;
  box-shadow:0 2px 8px rgba(20,17,31,0.18) !important;
  object-fit:contain !important;
}
body .wasapi-widget-chat-card-header-content{background:none !important}
body .wasapi-widget-chat-card-header-content > div:first-child{
  font-family:"Outfit",system-ui,sans-serif !important;
  font-weight:700 !important; letter-spacing:-0.01em;
}
/* El subtitulo se cortaba en su hueco de 163 px. Se acorta el texto
   en las opciones y aqui va el cinturon: si alguien lo alarga, se
   corta con puntos suspensivos en vez de romper la caja. */
body .wasapi-widget-chat-card-header-content > div:last-child{
  font-family:"Figtree",system-ui,sans-serif !important;
  font-size:0.78rem !important; opacity:0.94;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Fuera la imagen de fondo de WhatsApp: una peticion mas a un
   tercero, y ademas no pega con la marca. */
body .nb-wa-cuerpo{
  background:#FAF8FE !important;
  background-image:none !important;
}
body .wasapi-widget-chat-card-content-message{
  background:#FFFFFF !important;
  border:1px solid #E9E4F3 !important;
  border-radius:12px !important;
  box-shadow:0 1px 2px rgba(20,17,31,0.05) !important;
}
body .wasapi-widget-chat-card-content-message > div:first-child{
  font-family:"Outfit",system-ui,sans-serif !important;
  font-weight:700 !important; color:#14111F !important;
}
body .wasapi-widget-chat-card-content-message > div:last-child{
  font-family:"Figtree",system-ui,sans-serif !important;
  color:#4C4560 !important; line-height:1.6 !important;
}
/* El pie traia un negro translucido sobre el beige. */
body .nb-wa-pie{
  background:#FFFFFF !important;
  border-top:1px solid #E9E4F3 !important;
}
/* El boton de accion, con el degradado y sin borde: asi no hace
   falta `background-clip`, que es donde suele reaparecer el filo. */
body .nb-wa-pie > a{
  background:linear-gradient(135deg,#4A90D9 0%,#7B5CF6 50%,#E84098 100%) !important;
  border:0 !important; border-radius:11px !important;
  box-shadow:0 10px 28px -10px rgba(123,92,246,0.55) !important;
}
body .nb-wa-pie > a span{
  color:#FFFFFF !important;
  font-family:"Outfit",system-ui,sans-serif !important;
  font-weight:600 !important;
}
/* El icono de WhatsApp del boton de accion sí se queda: ahi es donde
   toca decir a donde lleva. Se pasa a blanco para que no chirrie
   sobre el degradado. */
body .nb-wa-pie > a img{filter:brightness(0) invert(1) !important}

@media (max-width:520px){
  body .nb-wa-card{
    left:12px !important; right:12px !important; width:auto !important;
    margin-bottom:74px !important;   /* 12 + 48 + 14 */
  }
}

/* En movil, los mismos 12 px que usan los otros dos flotantes. */
@media (max-width:520px){
  body #wasapi-widget-button{left:12px !important; bottom:12px !important}
}

/* Ahora se llega tabulando (ver `interruptor()`), asi que el foco
   tiene que verse. Mismo anillo que los otros dos flotantes. */
body #wasapi-widget-button:focus-visible{
  outline:2px solid #7B5CF6 !important; outline-offset:3px !important;
}

@media (prefers-reduced-motion:reduce){
  body #wasapi-widget-button{transition:none !important}
  body #wasapi-widget-button:hover{transform:none !important}
}

/* ── nb-catalogo ── */

/* ══ Netebu · catalogo de producto ═════════════════════════════ */

/* ── 1 · la tabla en escritorio ─────────────────────────────────
   Se conserva como tabla: para comparar seis modelos con cinco
   caracteristicas no hay nada mejor. Solo se le quita el ruido. */
.sec.products .footable.nb-tp{
  width:100%; border-collapse:collapse; margin:0;
  font-variant-numeric:tabular-nums;
}
.sec.products .footable.nb-tp thead th{
  font-family:var(--nb-ff-d) !important;
  font-size:10px !important; font-weight:700 !important;
  letter-spacing:0.12em; text-transform:uppercase;
  color:var(--nb-ink-3) !important; text-align:left;
  padding:0 14px 12px !important; white-space:nowrap;
  background:transparent !important;
  border:0 !important; border-bottom:1px solid var(--nb-line) !important;
}
/* El `!important` del fondo va contra el gris `rgb(237,240,245)` que
   el tema pinta en las filas. Sobre tarjeta blanca ese gris ensucia,
   y a rayas alternas convierte la tabla en un mantel. */
.sec.products .footable.nb-tp tbody tr{
  border-bottom:1px solid var(--nb-line);
  background:var(--nb-paper) !important;
  transition:background 0.16s ease;
}
.sec.products .footable.nb-tp tbody tr:last-child{border-bottom:0}
/* EL HOVER, CON UN FILO QUE DICE CUAL ES. Tiñendo solo el fondo, en
   una tabla de seis filas casi iguales el ojo pierde de vista en cual
   esta: el lila es tan claro que a media pantalla ya no se distingue.
   Un filo de 3 px con el degradado de marca en el borde izquierdo lo
   resuelve sin ruido, y ancla la fila al lado por donde se lee.
   Va con `box-shadow:inset` y no con `border-left`: un borde real
   desplazaria el contenido 3 px cada vez que el raton entra. */
.sec.products .footable.nb-tp tbody tr:hover{
  background:var(--nb-paper-2) !important;
  box-shadow:inset 3px 0 0 0 var(--nb-violet, #7B5CF6);
}
.sec.products .footable.nb-tp tbody td{
  padding:16px 14px !important; vertical-align:middle;
  border:0 !important; background:transparent !important;
  font-size:0.94rem; color:var(--nb-ink-2);
  text-align:left !important;
}
/* los valores, alineados con su cabecera y no centrados */
.sec.products .footable.nb-tp tbody td.server-price{text-align:right !important}
/* El triangulito de footable sirve para desplegar las columnas que
   se plieguen. Como ninguna columna trae `data-breakpoints`, aqui no
   pliega nunca nada: es un adorno que no lleva a ningun sitio. */
.sec.products .footable.nb-tp .footable-toggle,
.sec.products .footable.nb-tp .footable-toggle::before,
.sec.products .footable.nb-tp .footable-toggle::after{
  display:none !important; content:none !important;
}

/* La chapa con el nombre del modelo.
   OJO CON EL COLOR DEL `h4`: en el diseño de `netebu_paginas.php` la
   `.server-info` es una chapa OSCURA, asi que su titulo va en blanco
   con `!important`. Aqui el fondo pasa a ser transparente sobre la
   tarjeta clara, de modo que ese blanco deja el modelo invisible.
   Por eso el color se fuerza tambien con `!important`: no es
   decoracion, es lo unico que hace legible el nombre. */
/* EL ICONO, ALINEADO CON SU CABECERA COMO TODO LO DEMAS.
   Aqui habia un `padding-left:0` y era el unico de la tabla: las otras
   seis celdas llevan los 14 px del `td`, asi que su contenido arranca
   justo bajo el texto de su cabecera. Medido: «PROCESADOR» y su dato
   empiezan los dos en 278, «RAM» y el suyo en 715, «DISCO DURO» en 809.
   La columna del modelo era la excepcion: la cabecera en 128 y el icono
   en 110, dieciocho pixeles fuera, colgando por la izquierda de la
   unica columna que abre la tabla.
   Y con el filo del `:hover` se notaba todavia mas, porque el icono se
   le montaba encima en vez de quedar dentro de la fila. */
.sec.products .footable.nb-tp .server-heading{padding-left:14px !important}
/* El `.server-info` traia ademas un desplazamiento propio de 4 px que
   lo sacaba del borde del `td`. Se anula: quien manda es la celda. */
.sec.products .footable.nb-tp .server-info{
  margin-left:0 !important; transform:none;
}
/* `.server-info::before` es un pico de 4 px hecho con bordes, la
   punta de la chapa oscura del diseño original. Sin ese fondo se
   queda flotando como una mota negra sobre la tarjeta blanca. */
.sec.products .footable.nb-tp .server-info::before,
.sec.products .footable.nb-tp .server-info::after{content:none !important}
.sec.products .footable.nb-tp .server-info{
  display:flex !important; align-items:center;
  justify-content:flex-start !important; gap:11px;
  background:transparent !important; border:0 !important;
  padding:0 !important; min-width:0 !important; width:auto !important;
}
.sec.products .footable.nb-tp .server-info h4{
  font-family:var(--nb-ff-d) !important;
  font-size:1.05rem !important; font-weight:700 !important;
  color:var(--nb-ink) !important;
  margin:0 !important; line-height:1.2; order:2; flex:0 1 auto;
}
/* EL ICONO YA NO ES UNA PEGATINA. Llevaba el degradado de marca a
   fuego, los seis iguales, uno por fila. Dos cosas iban mal con eso:

   Una, que el degradado es el recurso mas fuerte de la web y aqui se
   gastaba seis veces seguidas en algo que no dice NADA: las seis filas
   llevan el mismo icono de servidor. Lo unico que distingue un modelo
   de otro es su nombre, y el nombre competia con un cuadrado de color
   que gritaba mas que el.

   Y dos, que al pasar el raton la fila se tiñe y el cuadrado se
   quedaba igual, plantado encima como una etiqueta pegada. Se veia
   que no pertenecia a la fila.

   Ahora es una caja tenue del propio violeta —presente, sin gritar— y
   ES ELLA LA QUE SE ENCIENDE cuando el raton entra en su fila. Deja de
   competir con el nombre y pasa a acompañarlo, y el degradado vuelve a
   significar algo: se reserva para el boton, que es la accion. */
.sec.products .footable.nb-tp .server-info > span{
  order:1; flex:none;
  width:36px !important; height:36px !important;
  border-radius:11px;
  background:rgba(123,92,246,0.11);
  /* EL FILO VA EN `box-shadow` Y NO EN `border`, Y NO ES CAPRICHO.
     Con `border:1px` y `border-color:transparent` en el hover, el
     borde no desaparece: se vuelve transparente y DEJA VER EL PROPIO
     DEGRADADO POR DEBAJO, porque el fondo se pinta bajo el borde
     (`background-clip:border-box` es lo que hay por defecto). El
     resultado era un halo de colores alrededor del icono, justo lo que
     no se queria.
     Un `inset box-shadow` dibuja el filo sin ocupar sitio: al quitarlo
     en el hover el degradado llena la caja entera y limpia, y ademas
     el icono no cambia de tamano entre un estado y otro, que es lo que
     habria pasado quitando el borde de verdad. */
  box-shadow:inset 0 0 0 1px rgba(123,92,246,0.16);
  border:0 !important;
  display:grid !important; place-items:center;
  transition:background .2s ease, box-shadow .2s ease, transform .2s ease;
}
.sec.products .footable.nb-tp .server-info > span i{
  color:var(--nb-violet-aa, #5B34D9) !important; font-size:15px !important;
  width:auto !important; height:auto !important;
  line-height:1 !important; margin:0 !important; opacity:1 !important;
  transition:color .2s ease;
}
.sec.products .footable.nb-tp tbody tr:hover .server-info > span{
  background:var(--nb-grad);
  box-shadow:none;
  transform:translateY(-1px);
}
.sec.products .footable.nb-tp tbody tr:hover .server-info > span i{
  color:#fff !important;
}
@media (prefers-reduced-motion:reduce){
  .sec.products .footable.nb-tp .server-info > span,
  .sec.products .footable.nb-tp .server-info > span i{transition:none}
  .sec.products .footable.nb-tp tbody tr:hover .server-info > span{transform:none}
}

/* ── el bloque de precio ────────────────────────────────────────
   HAY DOS ESTRUCTURAS DISTINTAS y no se parecen:
     NBX  -> `.billing-cycle-pricing`, con desplegable de ciclo
     NAX  -> `.product_pricing_single`, sin ciclo pero con coste de
             instalacion, y con `h-100` y `justify-content-center`,
             que es lo que estiraba la fila hasta 227 px de alto.
   Las dos se compactan aqui: de cuatro renglones sueltos a dos. */
/* NBX: la fila medía 252 px y solo 175 eran contenido; el resto,
   margenes muertos entre el desplegable, la caja del precio y el
   boton. Aqui se aprietan los tres. */
.sec.products .footable.nb-tp .billing-cycle-pricing{
  display:inline-flex !important; flex-direction:column;
  align-items:flex-end; gap:0; margin:0 !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .btn-group{
  margin:0 0 6px !important;
}
/* el desplegable de ciclo partia el texto y la flecha en dos lineas */
.sec.products .footable.nb-tp .billing-cycle-pricing .dropdown-toggle{
  display:inline-flex !important; align-items:center; gap:7px;
  padding:7px 13px !important; border-radius:10px !important;
  border:1px solid var(--nb-line) !important;
  font-family:var(--nb-ff-d); font-size:0.85rem; font-weight:600;
  color:var(--nb-ink-2) !important; white-space:nowrap;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .dropdown-toggle .pricing_wrapr{
  display:inline !important; margin:0 !important;
}
.sec.products .footable.nb-tp .product_pricing{margin:0 0 8px !important}
.sec.products .footable.nb-tp .pricing_main{
  background:transparent !important; border:0 !important;
  padding:0 !important; margin:0 !important;
}
.sec.products .footable.nb-tp .pricing_main .price{margin:0 !important; line-height:1.15}
.sec.products .footable.nb-tp .pricing_main .price .cost{
  font-family:var(--nb-ff-d); font-size:1.35rem; font-weight:700; color:var(--nb-ink);
}
.sec.products .footable.nb-tp .pricing_main .price .suffix{
  font-family:var(--nb-ff-d); font-size:0.95rem; font-weight:700; color:var(--nb-ink);
}
.sec.products .footable.nb-tp .pricing_main .cycle{
  font-size:11px; color:var(--nb-ink-3); margin:0 !important;
}

/* NAX: «De 46,76 € Mensual» en un renglon, la instalacion debajo */
.sec.products .footable.nb-tp .product_pricing_single{
  display:block !important; height:auto !important;
  margin:0 0 10px !important; line-height:1.35;
}
.sec.products .footable.nb-tp .product_pricing_single .regular_pricing,
.sec.products .footable.nb-tp .product_pricing_single .price,
.sec.products .footable.nb-tp .product_pricing_single .cycle{
  display:inline !important; margin:0 !important;
}
/* al pasar los tres a `inline` el «De» se quedaba pegado a la cifra */
.sec.products .footable.nb-tp .product_pricing_single .regular_pricing{
  margin-right:6px !important;
}
.sec.products .footable.nb-tp .product_pricing_single .price .cost{
  font-family:var(--nb-ff-d); font-size:1.2rem; font-weight:700; color:var(--nb-ink);
}
.sec.products .footable.nb-tp .product_pricing_single .price .suffix{
  font-family:var(--nb-ff-d); font-size:0.95rem; font-weight:700; color:var(--nb-ink);
}
.sec.products .footable.nb-tp .product_pricing_single .cycle{
  font-size:11px; color:var(--nb-ink-3); margin-left:4px !important;
}
.sec.products .footable.nb-tp .product_pricing_single .setup-fee{
  display:block !important; font-size:11px; color:var(--nb-ink-3); margin-top:2px !important;
}
.sec.products .footable.nb-tp .server-price .btn{
  display:inline-block !important; width:auto !important;
  min-width:126px; text-align:center;
  padding:10px 20px !important; margin:10px 0 0 !important;
  border-radius:10px !important; font-family:var(--nb-ff-d); font-weight:600;
}

/* ── EL PRECIO, QUE ES LO QUE SE VIENE A MIRAR ──────────────────
   Estaba escrito con el mismo cuerpo que los demas datos de la fila:
   1,2 rem, igual que «64 GB» o «3,6 GHz». En una tabla de compra el
   precio no es un dato mas, es EL dato, y aqui llegaba de sexto en
   una fila de siete columnas sin nada que lo distinguiera.

   Sube a 1,55 rem y a peso 800, con cifras tabulares para que las
   seis columnas de euros caigan a plomo una debajo de otra —46,76 /
   74,27 / 115,53 / 136,16— y se puedan comparar de un vistazo, que
   es exactamente para lo que existe una tabla.

   El «De» y el «Mensual» bajan a 11 px: son la letra pequeña que
   acompaña, no la cifra. */
.sec.products .footable.nb-tp .product_pricing_single .price .cost{
  font-size:1.55rem !important; font-weight:800 !important;
  letter-spacing:-0.03em; font-variant-numeric:tabular-nums;
}
.sec.products .footable.nb-tp .product_pricing_single .price .suffix{
  font-size:1.02rem !important;
}
.sec.products .footable.nb-tp .product_pricing_single .regular_pricing,
.sec.products .footable.nb-tp .product_pricing_single .regular_pricing .small{
  font-size:11px !important; color:var(--nb-ink-3) !important;
}
/* El coste de instalacion, que es una condicion de compra y no un
   adorno: se separa de la cifra para que no se lea como parte de
   ella, y el «+» toma el color de la marca. */
.sec.products .footable.nb-tp .product_pricing_single .setup-fee{
  margin-top:5px !important; line-height:1.35;
}
.sec.products .footable.nb-tp .product_pricing_single .setup-fee i{
  color:var(--nb-violet-aa, #5B34D9) !important;
}

/* ── LA COLUMNA DE PRECIO DE LAS NBX, SOLO EN ESCRITORIO ────────
   ACOTADO A `min-width:992px` A PROPOSITO, Y ESTO COSTO UNA VUELTA.
   La primera version fijaba `width:214px` y `margin-left:auto` sin
   media query, asi que esos anchos se colaban tambien en la vista de
   tarjetas: en una tarjeta de tablet de 540 px de ancho el pie —
   periodo, precio y boton— se encogia a 214 y se quedaba amontonado
   contra el borde izquierdo, con medio ancho de tarjeta vacio al lado.
   Una medida pensada para una columna de tabla no vale para una
   tarjeta: son dos contenedores distintos. */
@media (min-width:992px){
/* EL PERIODO Y LA CIFRA, EN LA MISMA LINEA. Apilados —selector arriba,
   precio en medio, boton abajo— la columna medía 165 px de alto para
   una fila cuya parte izquierda es UNA linea de texto: «NBX10 · 100GB ·
   1TB · ilimitado». El dato quedaba flotando en mitad de un hueco.
   Puestos uno al lado del otro, el periodo a la izquierda y la cifra
   pegada al borde, la fila baja a unos 120 y el bloque se lee de una
   vez: «1 Año — 73,64 €». Que es como se dice en voz alta. */
.sec.products .footable.nb-tp .billing-cycle-pricing{
  display:grid !important;
  grid-template-columns:auto 1fr;
  align-items:center; gap:4px 10px;
  width:214px; margin-left:auto !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .btn-group{
  grid-column:1; grid-row:1;
  margin:0 !important; width:auto;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .product_pricing{
  grid-column:2 !important; grid-row:1;
}
/* El desplegable de periodo: es un control secundario —se toca una vez
   y se olvida— y ocupaba 42 px de alto, mas que el propio boton de
   comprar. Baja a 34 y se queda en gris, para que la cifra que hay
   debajo sea lo primero que se ve. */
.sec.products .footable.nb-tp .billing-cycle-pricing .btn-group > .btn{
  min-height:34px !important; padding:7px 12px !important;
  margin:0 !important; width:100%;
  font-size:0.84rem !important; font-weight:600 !important;
  border-radius:9px !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .product_pricing{
  width:auto !important; margin:0 !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .pricing_main{
  text-align:right !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .price{
  justify-content:flex-end !important;
}
.sec.products .footable.nb-tp .billing-cycle-pricing .cycle{
  text-align:right !important; font-size:11px; color:var(--nb-ink-3);
}
.sec.products .footable.nb-tp .billing-cycle-pricing + .btn,
.sec.products .footable.nb-tp .server-price > a.btn{
  display:block !important; width:214px; margin:10px 0 0 auto !important;
  text-align:center;
}
}

/* Y LOS DATOS DE LAS NBX, CON EL PESO QUE LES FALTABA. En la tabla de
   servidores cada dato va en un `<b>` y por eso se lee de un vistazo;
   en la de NBX el texto va suelto en la celda —«100GB», «1TB»,
   «ilimitado»— y quedaba en gris de parrafo, como si fuera una nota al
   pie. Es el dato por el que se compara un modelo con otro.
   `:has()` distingue las celdas que ya traen su `<b>` de las que no,
   sin tener que separar las dos tablas a mano. */
.sec.products .footable.nb-tp tbody td:not(.server-heading):not(.server-price):not(:has(b)){
  font-weight:700; color:var(--nb-ink);
}

/* ── LA COLUMNA DEL PRECIO, A PLOMO ─────────────────────────────
   `tabular-nums` iguala el ancho de los digitos, pero eso solo sirve
   si la caja que los contiene esta alineada. Aqui el bloque iba
   centrado, asi que «46,76» y «115,53» —que no miden lo mismo— se
   centraban cada uno por su lado y las comas caian en verticales
   distintas. Seis precios que no se pueden comparar de un vistazo en
   una tabla que existe para comparar precios.

   Todo el bloque se alinea a la derecha: la cifra, el «Mensual», el
   coste de instalacion y el boton comparten borde. Y ese borde queda
   pegado al lado por donde se cierra la fila, que es donde el ojo va
   a buscar el total. */
.sec.products .footable.nb-tp .server-price .product_pricing_single{
  align-items:flex-end !important;
  text-align:right !important;
}
.sec.products .footable.nb-tp .server-price .price{
  justify-content:flex-end !important;
}
.sec.products .footable.nb-tp .server-price .setup-fee{
  text-align:right !important;
}

/* ── Y LA FILA, MAS APRETADA ────────────────────────────────────
   Cada fila media 132 px para unos 60 de contenido: mas de la mitad
   era aire. Con seis modelos eso son casi 800 px de tabla, y el que
   compara el primero con el ultimo no los ve nunca juntos.
   Bajando el relleno la tabla entra de una vez en la pantalla y las
   seis filas se leen como un bloque, que es como se compara. */
.sec.products .footable.nb-tp tbody td{
  padding:13px 14px !important;
}
.sec.products .footable.nb-tp .server-price .btn{
  margin-top:8px !important;
}

/* ── 2 · la misma tabla, en tarjetas ────────────────────────────
   Por debajo de 992 px. `!important` en los `display` porque
   footable escribe `style="display: table-row"` en cada fila. */
@media (max-width:991px){
  .sec.products .footable.nb-tp,
  .sec.products .footable.nb-tp tbody,
  .sec.products .footable.nb-tp tbody tr,
  .sec.products .footable.nb-tp tbody td{
    display:block !important; width:100% !important;
  }
  .sec.products .footable.nb-tp thead{display:none !important}
  .sec.products .footable.nb-tp .footable-toggle{display:none !important}

  .sec.products .footable.nb-tp tbody tr{
    border:1px solid var(--nb-line) !important; border-radius:18px;
    background:var(--nb-paper); padding:18px; margin-bottom:14px;
    box-shadow:0 1px 2px rgba(20,17,31,0.04),0 8px 24px -14px rgba(20,17,31,0.12);
  }
  .sec.products .footable.nb-tp tbody tr:hover{background:var(--nb-paper)}
  .sec.products .footable.nb-tp tbody td{padding:0 !important}

  /* cabecera de la tarjeta */
  .sec.products .footable.nb-tp .server-heading{padding-bottom:14px !important}

  /* CADA CARACTERISTICA: ETIQUETA A LA IZQUIERDA, DATO A LA DERECHA.
     Y SIEMPRE EN EL MISMO SITIO, que es lo que antes no pasaba.

     Iba con `display:flex` y `justify-content:space-between`, y dentro
     del `<td>` no hay dos elementos sino TRES: la etiqueta que pone el
     `::before`, el `<b>` con el dato y el `<small>` con el matiz. El
     `space-between` los repartia por igual, asi que el dato quedaba
     flotando EN MEDIO y el matiz pegado a la derecha. Fila a fila el
     valor caia en un sitio distinto segun lo largo que fuera su
     matiz: «64 GB» a la derecha del todo porque no tiene matiz, «2 TB»
     en el centro porque le sigue «2x2 TB SATA». Seis modelos que
     comparar y ni una columna donde apoyar la vista.

     LA SEGUNDA VERSION, CON REJILLA, TAMBIEN ERA MALA Y POR ESO NO
     ESTA AQUI. Ponia el matiz en su propia fila: quedaba ordenado,
     pero la tarjeta pasaba de 453 a 572 px —120 mas por modelo, 700
     en los seis— y este bloque existe justamente para que la tarjeta
     quepa en la pantalla. Ordenar a base de crecer no es ordenar.

     Lo que hay ahora saca la etiqueta del flujo y la ancla a la
     izquierda; el dato y su matiz fluyen como texto corrido contra el
     borde derecho. Cuando caben van en una linea —«2 TB · 2x2 TB
     SATA»— y cuando no, el matiz baja solo, sin que haya que
     decidirlo de antemano ni medir nada. */
  .sec.products .footable.nb-tp td[data-nb-et]{
    display:block !important;
    position:relative;
    padding:9px 0 9px 118px !important;
    border-top:1px solid var(--nb-line) !important;
    font-size:0.9rem; line-height:1.45;
    /* Con `!important` porque el bloque de escritorio declara
       `text-align:left !important` sobre el mismo `td`, y sin el la
       segunda linea de un matiz largo —«4,4 GHz Boost», «2x8 TB SATA
       6 Gb/s Enterprise»— se quedaba pegada a la izquierda mientras la
       primera acababa a la derecha. El texto envolvia en escalera. */
    text-align:right !important; color:var(--nb-ink); font-weight:500;
    min-height:38px;
  }
  .sec.products .footable.nb-tp td[data-nb-et]::before{
    content:attr(data-nb-et);
    position:absolute; left:0; top:11px; width:110px;
    text-align:left;
    font-family:var(--nb-ff-d); font-size:10px; font-weight:700;
    letter-spacing:0.1em; text-transform:uppercase;
    color:var(--nb-ink-3); line-height:1.4;
  }
  .sec.products .footable.nb-tp td[data-nb-et] b{
    display:inline !important; color:var(--nb-ink); font-weight:700;
    /* «512 GB» y «1,92 TB» se partian en dos lineas —«512» arriba y
       «GB» debajo—. Una cifra y su unidad son una sola cosa. */
    white-space:nowrap;
  }
  .sec.products .footable.nb-tp td[data-nb-et] small{
    display:inline !important; color:var(--nb-ink-3) !important;
    font-size:0.82rem; text-align:right !important;
  }
  /* El punto que separa el dato de su matiz cuando comparten linea.
     Sin el se leia «2 TB 2x2 TB SATA», dos cifras seguidas que
     parecen una sola. */
  .sec.products .footable.nb-tp td[data-nb-et] b ~ small::before{
    content:"·"; margin:0 6px; color:var(--nb-line-2, #D8D0EC);
  }

  /* pie de la tarjeta: precio a la izquierda, boton a la derecha.
     Vale para las dos estructuras, la de NBX y la de NAX. */
  .sec.products .footable.nb-tp .server-price{
    margin-top:16px !important; padding-top:16px !important;
    border-top:1px solid var(--nb-line) !important;
    text-align:left !important;
    display:flex !important; align-items:center;
    justify-content:space-between; flex-wrap:wrap; gap:12px;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing{
    display:flex !important; flex-direction:row !important;
    align-items:center; justify-content:space-between;
    flex-wrap:wrap; gap:12px; width:100%;
  }
  .sec.products .footable.nb-tp .product_pricing_single{
    margin:0 !important; flex:1 1 auto;
  }
  .sec.products .footable.nb-tp .server-price .btn{
    flex:none; min-width:0; margin:0 !important;
  }

  /* EL PIE DE LA TARJETA OCUPA EL ANCHO QUE TIENE.
     Y HABIA QUE FORZAR EL ANCHO DE LA CELDA, no solo el reparto de lo
     que hay dentro. Medido en tablet: la tarjeta mide 692 px y el
     `td` del precio solo 195 —el `width:100%` del bloque general no le
     llegaba— asi que el pie entero, la linea divisoria incluida, se
     quedaba en el primer tercio con dos tercios de tarjeta en blanco
     al lado. En movil si media los 276 que le tocan, y por eso solo se
     veia mal en la anchura de en medio.

     Con la celda ya a lo ancho, dentro: el periodo y la cifra a la
     izquierda —se lee primero cuanto cuesta— y el boton cerrando a la
     derecha, que es hacia donde va la mano despues de leer. */
  .sec.products .footable.nb-tp tbody tr > td.server-price{
    width:100% !important; max-width:none !important; min-width:0 !important;
    display:flex !important; flex-wrap:wrap; align-items:center;
    justify-content:space-between; gap:12px;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing{
    display:flex !important; flex-direction:row !important;
    align-items:center; justify-content:flex-start;
    gap:12px; flex:1 1 auto; width:auto !important; margin:0 !important;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing .btn-group{
    margin:0 !important; width:auto !important; flex:none;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing .product_pricing{
    margin:0 !important; width:auto !important; flex:none;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing .pricing_main,
  .sec.products .footable.nb-tp .billing-cycle-pricing .cycle{
    text-align:left !important;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing .price{
    justify-content:flex-start !important;
  }
  .sec.products .footable.nb-tp .billing-cycle-pricing + .btn,
  .sec.products .footable.nb-tp .server-price > a.btn{
    width:auto !important; margin:0 !important; flex:none;
  }

  /* EL PIE, COMO UNA BARRA Y NO COMO UN MONTON. En una tarjeta que se
     lee de arriba abajo, el precio y el boton son el final del
     recorrido: merecen leerse como una unidad y no como dos restos
     apilados. El precio manda a la izquierda —donde cae la vista al
     terminar la lista— y el boton cierra a la derecha.
     El precio recupera el cuerpo que tiene en escritorio: es la cifra
     por la que se ha bajado hasta aqui. */
  .sec.products .footable.nb-tp .server-price .product_pricing_single{
    align-items:flex-start !important; text-align:left !important;
  }
  .sec.products .footable.nb-tp .server-price .price{
    justify-content:flex-start !important;
  }
  .sec.products .footable.nb-tp .server-price .setup-fee{
    text-align:left !important;
  }
  .sec.products .footable.nb-tp .product_pricing_single .price .cost{
    font-size:1.5rem !important;
  }
  /* En el movil estrecho el boton pasa a ancho completo: un boton de
     126 px flotando a la derecha de una tarjeta de 358 se pulsa peor
     que uno que ocupa la linea entera, y es la accion principal. */
  /* En el movil estrecho no caben el precio y el boton en la misma
     linea, asi que el boton baja. Y si baja, ocupa la linea entera:
     un boton de 101 px arrinconado a la izquierda de una tarjeta de
     276 se pulsa peor y no parece la accion principal, que lo es. */
  @media (max-width:575px){
    .sec.products .footable.nb-tp tbody tr > td.server-price{
      align-items:stretch !important;
    }
    .sec.products .footable.nb-tp .billing-cycle-pricing + .btn,
    .sec.products .footable.nb-tp .server-price > a.btn{
      width:100% !important; text-align:center; flex:1 0 100%;
    }
  }
}

/* ── 2b · las tarjetas de plan de hosting ───────────────────────
   EL «De» SUELTO DESALINEA LA TARJETA. `.regular_pricing` lleva dos
   cosas: la palabra «De» y, cuando hay descuento, el precio tachado.
   En un plan sin descuento se queda el «De» solo, ocupando una linea
   entera que empuja hacia abajo todo lo demas y descuadra la tarjeta
   frente a las de al lado. Sin precio tachado ese renglon no dice
   nada, asi que se va. */
.sec.products .regular_pricing:not(:has(.savecut)){display:none !important}
/* reserva para navegadores sin `:has()`: la clase la pone el JS */
.sec.products .regular_pricing.nb-solo-de{display:none !important}

/* ── 2c · la paginacion del carrusel ────────────────────────────
   Eran tres cuadraditos con borde, ajenos al resto de la pagina.
   Pasan a ser pildoras: las inactivas discretas y la activa alargada
   con el degradado de marca, que es el lenguaje del resto de la web. */
.sec.products .swiper-pagination{margin-top:8px}
.sec.products .swiper-pagination-bullet{
  width:8px !important; height:8px !important;
  border-radius:99px !important; border:0 !important;
  background:var(--nb-line-2) !important; opacity:1 !important;
  margin:0 5px !important;
  transition:width 0.22s ease, background 0.22s ease;
}
.sec.products .swiper-pagination-bullet:hover{background:var(--nb-ink-3) !important}
.sec.products .swiper-pagination-bullet-active{
  width:28px !important; background:var(--nb-grad) !important;
}
.sec.products .swiper-pagination-bullet:focus-visible{
  outline:2px solid var(--nb-violet); outline-offset:3px;
}
/* OCHO PIXELES DE PINTURA, VEINTICUATRO DE DEDO. El punto tiene que ser
   pequeno —es un indicador, no un boton— pero 8x8 es imposible de
   acertar en un movil, y ademas quedaban a 7 px unos de otros: dos
   objetivos a esa distancia son el mismo objetivo. WCAG 2.5.8 pide
   24x24.

   Se agranda el AREA, no el punto: un pseudoelemento centrado de 24x24.
   El margen lateral sube de 5 a 8 px para que las areas de dos puntos
   contiguos no se solapen —8+8+8 = 24 justos entre centros—. */
.sec.products .swiper-pagination-bullet{position:relative; margin:0 8px !important}
.sec.products .swiper-pagination-bullet::after{
  content:""; position:absolute; top:50%; left:50%;
  width:24px; height:24px; transform:translate(-50%, -50%);
}
@media (prefers-reduced-motion:reduce){
  .sec.products .swiper-pagination-bullet{transition:none}
}

/* ── 3 · el selector de VPS, en dos pasos ───────────────────────
   Primero la familia —que es el numero de nucleos—, luego la talla.
   De veinte botones sueltos se pasa a cuatro mas seis como mucho. */
.sec.products .nb-familias{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr));
  gap:12px; margin:0 0 20px;
}
.sec.products .nb-fam{
  appearance:none; cursor:pointer; text-align:left;
  font-family:var(--nb-ff-b,inherit);
  border:1px solid var(--nb-line); border-radius:16px;
  background:var(--nb-paper); padding:16px 18px;
  transition:transform 0.16s ease, border-color 0.16s ease, background 0.16s ease;
}
.sec.products .nb-fam:hover{transform:translateY(-2px); border-color:var(--nb-line-2)}
.sec.products .nb-fam:focus-visible{outline:2px solid var(--nb-violet); outline-offset:3px}
.sec.products .nb-fam[aria-pressed="true"]{
  background:var(--nb-night); border-color:transparent;
  box-shadow:0 10px 30px -14px rgba(20,17,31,0.5);
}
.sec.products .nb-fam .nb-fam-nom{
  display:block; font-family:var(--nb-ff-d);
  font-size:1.1rem; font-weight:700; color:var(--nb-ink); line-height:1.2;
}
.sec.products .nb-fam .nb-fam-car{
  display:block; font-size:12px; color:var(--nb-ink-3); margin-top:2px;
}
.sec.products .nb-fam .nb-fam-cpu{
  display:inline-block; margin-top:10px;
  font-family:var(--nb-ff-d); font-size:10px; font-weight:700;
  /* SIN `text-transform:uppercase`. El dato pone "2 vCPU", y la
     unidad se escribe asi: v minuscula y CPU en mayusculas. Poner
     la chapa en mayusculas la convertiria en "2 VCPU", que no es la
     grafia correcta. El resto de chapas del sitio si van en
     mayusculas porque su texto es una etiqueta, no una unidad. */
  letter-spacing:0.09em; color:var(--nb-ink-2);
  background:var(--nb-paper-2); border:1px solid var(--nb-line);
  padding:3px 9px; border-radius:7px;
}
.sec.products .nb-fam[aria-pressed="true"] .nb-fam-nom{color:#fff}
.sec.products .nb-fam[aria-pressed="true"] .nb-fam-car{color:var(--nb-on-2,#B9BEDD)}
.sec.products .nb-fam[aria-pressed="true"] .nb-fam-cpu{
  color:#fff; background:rgba(255,255,255,0.10); border-color:rgba(255,255,255,0.18);
}

/* las pestañas del tema, convertidas en rejilla de tallas */
.sec.products .nb-vps.nav-tabs{
  display:grid !important;
  grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:10px; border:0 !important; margin:0 0 4px !important;
}
.sec.products .nb-vps.nav-tabs .nav-item{margin:0 !important; height:auto !important}
.sec.products .nb-vps.nav-tabs .nav-item[hidden]{display:none !important}
/* `height:auto` y `white-space:normal` no son opcionales: la pestaña
   del tema viene con alto fijo de 54 px y `nowrap`, asi que la linea
   de recursos se salia por debajo de su propia tarjeta. */
.sec.products .nb-vps.nav-tabs .nav-link{
  display:block !important; height:auto !important; min-height:0 !important;
  white-space:normal !important; overflow:visible !important;
  border:1px solid var(--nb-line) !important; border-radius:14px !important;
  background:var(--nb-paper) !important; padding:14px !important;
  margin:0 !important; text-align:left; line-height:1.3 !important;
  transition:border-color 0.16s ease, box-shadow 0.16s ease;
}
.sec.products .nb-vps.nav-tabs .nav-link:hover{border-color:var(--nb-line-2) !important}
.sec.products .nb-vps.nav-tabs .nav-link.active{
  border-color:var(--nb-violet) !important;
  box-shadow:0 0 0 3px rgba(123,92,246,0.14);
}
.sec.products .nb-vps.nav-tabs .nav-link > i{display:none !important}
.sec.products .nb-vps .nb-talla{
  display:block; font-family:var(--nb-ff-d);
  font-size:0.95rem; font-weight:700; color:var(--nb-ink); line-height:1.2;
}
.sec.products .nb-vps .nb-recursos{
  display:block; font-size:12px; color:var(--nb-ink-3);
  margin-top:5px; font-variant-numeric:tabular-nums;
}

/* ── 3b · los planes de una gama corta, con el mismo lenguaje ──
   Las tallas de un VPS conviven con la barra de familias de arriba:
   alli el NEGRO ya lo lleva la familia, y la talla activa solo se
   perfila en violeta para no tener dos cajas negras discutiendo.

   Una gama corta —n8n Start / Pro / Business— no tiene barra encima:
   su pestaña ES la eleccion principal, asi que le toca el negro, el
   mismo que a `.nb-fam[aria-pressed="true"]`. Por eso cuelga de una
   clase aparte y no de `.nb-vps` a secas, que comparten las dos. */
.sec.products .nb-planes.nav-tabs{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.sec.products .nb-planes.nav-tabs .nav-link{
  border-radius:16px !important; padding:16px 18px !important;
  transition:transform 0.16s ease, border-color 0.16s ease, background 0.16s ease;
}
.sec.products .nb-planes.nav-tabs .nav-link:hover{transform:translateY(-2px)}
.sec.products .nb-planes.nav-tabs .nav-link.active{
  background:var(--nb-night) !important; border-color:transparent !important;
  box-shadow:0 10px 30px -14px rgba(20,17,31,0.5) !important;
}
.sec.products .nb-planes .nb-talla{font-size:1.1rem}
.sec.products .nb-planes .nb-plan-car{
  display:block; font-size:12px; color:var(--nb-ink-3); margin-top:2px;
}
/* Los recursos pasan de linea suelta a chapa, como la de nucleos de
   la familia. SIN `text-transform:uppercase`: lleva la unidad vCPU,
   que se escribe con la v en minuscula. */
.sec.products .nb-planes .nb-recursos{
  display:inline-block; margin-top:10px;
  font-family:var(--nb-ff-d); font-size:10px; font-weight:700;
  letter-spacing:0.09em; color:var(--nb-ink-2);
  background:var(--nb-paper-2); border:1px solid var(--nb-line);
  padding:3px 9px; border-radius:7px;
}
.sec.products .nb-planes .nav-link.active .nb-talla{color:#fff}
.sec.products .nb-planes .nav-link.active .nb-plan-car{color:var(--nb-on-2,#B9BEDD)}
.sec.products .nb-planes .nav-link.active .nb-recursos{
  color:#fff; background:rgba(255,255,255,0.10); border-color:rgba(255,255,255,0.18);
}

@media (max-width:767px){
  .sec.products .nb-familias{grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px}
  .sec.products .nb-fam{padding:14px}
  .sec.products .nb-vps.nav-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* Tres planes en dos columnas dejan uno suelto abajo, descuadrado.
     Apilados se comparan mejor y cada uno gana ancho para su chapa. */
  .sec.products .nb-planes.nav-tabs{grid-template-columns:1fr !important}
}
@media (prefers-reduced-motion:reduce){
  .sec.products .nb-fam,
  .sec.products .nb-vps.nav-tabs .nav-link{transition:none}
}

/* ── nb-planes ── */

:root{
  --nb-tick:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E");
}

/* ── la descripcion deja de esconderse tras «Ver Detalles» ─────────
   Ahora es una lista legible, no un parrafo largo: es contenido, no
   letra pequeña. */
.sec.products .plan-features.collapse:not(.show){
  display:block !important;
  height:auto !important;
  visibility:visible !important;
}
.sec.products .PriceList-toggle{display:none !important}
.sec.products .plan-features{
  font-family:var(--nb-ff-b) !important;
  color:var(--nb-ink-2) !important;
  font-size:.95rem !important;
  margin-top:14px !important;
}

/* ── la ilustracion ────────────────────────────────────────────────
   PARA QUITARLAS: cambiar `display:block` por `display:none`. */
.sec.products .nb-ilus{
  display:block !important;
  margin:16px 0 4px !important;
  text-align:center !important;
}
.sec.products .nb-ilus img{
  max-width:100% !important;
  height:auto !important;
}

/* ── la lista, igual que en la portada ─────────────────────────────
   El texto va suelto dentro del <li>, sin un <span> que lo envuelva.
   Con `display:flex` el `gap` separaria el <b> de la cifra del resto
   de la frase —«10   cuentas»—, asi que el tick se posiciona en
   absoluto y el texto fluye como un parrafo normal. */
.sec.products ul.nb-feats{
  list-style:none !important;
  margin:14px 0 0 !important;
  padding:14px 0 0 !important;
  border-top:1px solid var(--nb-line) !important;
}
.sec.products ul.nb-feats li{
  display:block !important;
  position:relative !important;
  padding:6px 0 6px 26px !important;
  font-size:.94rem !important;
  color:var(--nb-ink-2) !important;
  line-height:1.5 !important;
}
.sec.products ul.nb-feats li::before{
  content:"" !important;
  position:absolute !important;
  left:0 !important;
  top:.62em !important;
  width:15px !important;
  height:15px !important;
  background:var(--nb-ok, #116B47) !important;
  -webkit-mask:var(--nb-tick) center/contain no-repeat;
  mask:var(--nb-tick) center/contain no-repeat;
}
.sec.products ul.nb-feats li b{
  color:var(--nb-ink) !important;
  font-weight:600 !important;
}

/* ══ LAS CINCO PRIMERAS, Y EL RESTO A UN TOQUE ═══════════════════
   MEDIDO, NO SUPUESTO. La tarjeta de «Hosting Basico» media 1182 px
   en un movil de 844: no cabia entera en ninguna pantalla, ni en
   escritorio (1216 contra 900). Y los controles del carrusel quedan
   93 px por debajo del final de la tarjeta, o sea fuera de vista
   siempre: para pasar de plan habia que bajar hasta el fondo y luego
   volver a subir para leer el siguiente. Eso lo hace nadie.

   El desglose decia donde estaba el peso: nombre 24, precio 154,
   boton 52 —todo eso ya arriba, que es lo correcto— y 702 px de
   caracteristicas, el 59 % de la tarjeta, con trece viñetas y una
   ilustracion de 148.

   Cinco viñetas a la vista y las demas tras un resorte dejan la
   tarjeta en unos 760: entra entera, con sus controles. Cinco porque
   son las que sostienen la decision; esconderlas todas —que es lo que
   hacia el tema de origen con su «Ver Detalles»— ahorra pixeles pero
   deja al cliente sin saber que compra.

   La ilustracion no se pierde: se va DENTRO de lo plegado. Quien abre
   el detalle la ve; quien solo compara precios no la sufre. */
.sec.products .nb-plegado{
  display:grid !important;
  grid-template-rows:0fr !important;
  transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1) !important;
}
.sec.products .nb-plegado > .nb-plegado-in{
  overflow:hidden !important;
  min-height:0 !important;
}
.sec.products .nb-plegado.nb-abierto{ grid-template-rows:1fr !important }
@media (prefers-reduced-motion:reduce){
  .sec.products .nb-plegado{transition:none !important}
}

/* El resorte. Es un `<button>` de verdad y no un `<p>` con un
   `data-toggle`, que es lo que traia el tema: asi lo alcanza el
   teclado, lo anuncia un lector de pantalla y dice si esta abierto o
   cerrado sin que haya que mirar la pantalla. */
.sec.products .nb-mas{
  display:flex !important; align-items:center; gap:8px;
  width:100% !important; margin:12px 0 0 !important;
  padding:11px 12px !important;
  min-height:44px !important;
  background:var(--nb-paper-2, #FAF8FE) !important;
  border:1px solid var(--nb-line) !important;
  border-radius:11px !important;
  font-family:var(--nb-ff-b) !important; font-size:.9rem !important;
  font-weight:600 !important; color:var(--nb-ink-2) !important;
  cursor:pointer; text-align:left;
  transition:background .18s ease, border-color .18s ease;
}
.sec.products .nb-mas:hover{
  background:#fff !important; border-color:var(--nb-line-2, #D8D0EC) !important;
}
/* La flecha gira al abrir: dice el estado sin necesidad de leer. */
.sec.products .nb-mas::after{
  content:"" ; margin-left:auto;
  width:9px; height:9px; flex:0 0 auto;
  border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg) translate(-2px,-2px);
  transition:transform .25s ease;
}
.sec.products .nb-mas[aria-expanded="true"]::after{
  transform:rotate(-135deg) translate(-2px,-2px);
}
@media (prefers-reduced-motion:reduce){
  .sec.products .nb-mas::after{transition:none}
}
/* El segundo bloque de viñetas no repite el filo de arriba: es la
   continuacion de la misma lista, no otra. */
.sec.products ul.nb-feats.nb-resto{
  border-top:0 !important; margin-top:0 !important; padding-top:0 !important;
}

/* ── la frase de cierre ───────────────────────────────────────── */
.sec.products .nb-cierre{
  margin-top:14px !important;
  padding-top:12px !important;
  border-top:1px solid var(--nb-line) !important;
  font-size:.88rem !important;
  color:var(--nb-ink-3) !important;
}

/* ── el boton, como el «Contratar» de la portada ───────────────────
   Alli el plan corriente lleva contorno y solo el destacado va con
   degradado; asi el ojo sabe cual se recomienda. */
.sec.products .product-actions .btn{
  border-radius:12px !important;
  font-family:var(--nb-ff-d) !important;
  font-weight:600 !important;
  padding:13px 20px !important;
  width:100% !important;
  border:1px solid var(--nb-violet) !important;
  background:transparent !important;
  color:var(--nb-violet-aa) !important;
  box-shadow:none !important;
  transition:background .16s ease, color .16s ease, border-color .16s ease;
}
/* EL `background-clip` NO SOBRA, y sin el se ve un contorno de color
   alrededor del boton. `border-color:transparent` no impide que el
   fondo se pinte ahi debajo: por defecto `background-clip` vale
   `border-box`, asi que el degradado ocupa tambien ese pixel de borde
   y asoma difuminado por todo el contorno.

   `padding-box` corta el fondo en el relleno y el borde transparente
   queda de verdad transparente.

   Y OJO al reponerlo si algun dia se toca: `background` es una
   propiedad de ATAJO. Cualquier regla posterior que vuelva a declarar
   el degradado resetea `background-clip` a `border-box` y el contorno
   reaparece. Si se anade otra variante del boton, declara el clip con
   ella. */
.sec.products .product-actions .btn:hover,
.sec.products .product-actions .btn:focus-visible{
  background:var(--nb-grad) !important;
  background-clip:padding-box !important;
  -webkit-background-clip:padding-box !important;
  border-color:transparent !important;
  color:#fff !important;
}
.sec.products .featured .product-actions .btn,
.sec.products .cros-pricing-table.featured .product-actions .btn{
  background:var(--nb-grad) !important;
  background-clip:padding-box !important;
  -webkit-background-clip:padding-box !important;
  border-color:transparent !important;
  color:#fff !important;
}

/* ── que todas las tarjetas de una fila midan igual ─────────────── */
.sec.products .row.pricing-slider{align-items:stretch !important}
.sec.products .products-slide{display:flex !important}
.sec.products .products-slide > .cros-pricing-table{
  width:100% !important;
  display:flex !important;
  flex-direction:column !important;
}

/* ── flechas del carrusel ──────────────────────────────────────────
   Van junto a los puntos, no flotando sobre las tarjetas: asi el
   control es uno solo, se lee igual en movil que en escritorio y no
   tapa el precio de la primera tarjeta. */
.sec.products .nb-nav{
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  gap:14px !important;
  margin-top:6px !important;
}
.sec.products .nb-nav .swiper-pagination{
  position:static !important;
  width:auto !important;
  margin:0 !important;
}
.sec.products .nb-nav button{
  flex:0 0 auto;
  width:34px; height:34px;
  display:grid; place-items:center;
  padding:0;
  border:1px solid var(--nb-line-2);
  border-radius:99px;
  background:var(--nb-paper);
  color:var(--nb-ink-2);
  cursor:pointer;
  transition:background .16s ease, color .16s ease, border-color .16s ease, opacity .16s ease;
}
.sec.products .nb-nav button svg{width:16px; height:16px; display:block}
.sec.products .nb-nav button:hover:not(:disabled),
.sec.products .nb-nav button:focus-visible:not(:disabled){
  background:var(--nb-grad);
  border-color:transparent;
  color:#fff;
}
.sec.products .nb-nav button:focus-visible{
  outline:2px solid var(--nb-violet);
  outline-offset:2px;
}
/* Swiper marca los extremos con `swiper-button-disabled`, y con
   `swiper-button-lock` cuando todos los planes caben y sobran. */
.sec.products .nb-nav button.swiper-button-disabled{
  opacity:.34;
  cursor:default;
}
.sec.products .nb-nav button.swiper-button-lock{display:none}

/* ── «El panel de control más avanzado» ────────────────────────────
   Sustituye a una captura de Plesk de 2019 —en inglés, con PHP 7.3.9
   y fechada en septiembre de aquel año— que desmentía al propio texto
   de la página, donde hoy se anuncia PHP 8.4. Una captura de un panel
   envejece; una lista de lo que se puede hacer con él, no. */
/* 320px y no menos: con seis tarjetas, un minimo mas pequeño da
   cuatro columnas y deja dos descolgadas en la segunda fila. Asi
   salen 3+3 en escritorio, 2+2+2 en tableta y una por fila en movil,
   sin ninguna huerfana. */
.nb-panel{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(320px,1fr));
  gap:14px;
  margin:26px 0 22px;
  text-align:left;
}
.nb-panel .nb-p-c{
  background:var(--nb-paper);
  border:1px solid var(--nb-line);
  border-radius:16px;
  padding:22px 20px;
  box-shadow:0 1px 2px rgba(20,17,31,.04), 0 10px 26px -18px rgba(20,17,31,.16);
  transition:border-color .18s ease, transform .18s ease;
}
.nb-panel .nb-p-c:hover{
  border-color:var(--nb-line-2);
  transform:translateY(-3px);
}
.nb-panel .nb-p-ic{
  display:grid;
  place-items:center;
  width:38px; height:38px;
  margin-bottom:13px;
  border-radius:10px;
  background:var(--nb-grad);
  color:#fff;
}
.nb-panel .nb-p-ic svg{width:19px; height:19px; display:block}
.nb-panel .nb-p-c h3{
  font-family:var(--nb-ff-d);
  font-size:1.02rem;
  font-weight:700;
  color:var(--nb-ink);
  margin:0 0 7px;
  letter-spacing:-.01em;
}
.nb-panel .nb-p-c p{
  font-family:var(--nb-ff-b);
  font-size:.92rem;
  line-height:1.55;
  color:var(--nb-ink-2);
  margin:0;
}
.nb-p-sub{
  font-family:var(--nb-ff-b);
  color:var(--nb-ink-2);
  max-width:64ch;
}
.nb-p-pie{
  font-family:var(--nb-ff-b);
  font-size:.94rem;
  color:var(--nb-ink-3);
}
.nb-p-pie a{color:var(--nb-violet-aa); font-weight:600}


@media (max-width:575px){
  .sec.products ul.nb-feats li{font-size:.9rem !important}
  .nb-panel{grid-template-columns:1fr; gap:12px}
  .nb-panel .nb-p-c{padding:18px 17px}
}
