/*
 * La barra de navegación de netebu.com, servida por el tema.
 *
 * POR QUÉ EXISTE ESTE FICHERO. El aspecto de la barra lo inyectaba
 * `includes/hooks/netebu_navbar.php` desde fuera del tema, y por eso el
 * 81 % de sus bloques de reglas llevaban `!important`: un hook no puede ganarle a la
 * hoja del tema por orden, solo por especificidad. Desde que
 * `templates/netebu` es nuestro, sí se puede ganar por orden, y este
 * fichero se carga DESPUÉS de `themes/style.min.css`.
 *
 * ESE HOOK YA NO EXISTE. Se retiró el 03-09-2026, cuando su última regla
 * acabó de mudarse aquí: empezó con 1.604 líneas y 367 `!important` y
 * terminó sin una sola. Su JavaScript vive en `assets/js/netebu-barra.js`.
 *
 * LA REGLA QUE GOBIERNA ESTE FICHERO. Por cada `!important` que se
 * escriba aquí hay que anotar contra qué regla concreta pelea, y abrir la
 * pregunta de si esa regla debería seguir existiendo. El objetivo
 * declarado es terminar con cero.
 *
 * DÓNDE SE ENLAZA, Y POR QUÉ IMPORTA. En `header.tpl`, la última del
 * `<head>`, DESPUÉS de `{$headoutput}`. Los hooks inyectan su CSS ahí, así
 * que un `<link>` puesto en `includes/head.tpl` cargaba antes que ellos:
 * medido, el tema en el byte 1.834 y el hook en el 10.366. Desde el final
 * ganamos por orden a los dos.
 *
 * CARGAR DESPUÉS NO BASTA, Y ESTO COSTÓ UN DESPLIEGUE. El hook escribe
 * `body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav.cros-navbar`,
 * y sus tres `:not()` cuentan como tres clases: (1,4,1). Contra un
 * `body.nb-hero #nav.cros-navbar`, que es (1,3,1), gana el hook por
 * especificidad aunque carguemos después — y si además lleva
 * `!important`, no hay orden que valga. Por eso los selectores de aquí
 * llevan `.nb-hero:not(.login):not(.nb-claro)`: tres clases, las mismas
 * que sus tres `:not()`. Empatando en especificidad, decide el orden, y
 * el orden ya es nuestro. Cuando el bloque correspondiente se retire del
 * hook, estos `:not()` y estos `!important` se van con él.
 */

/* LOS TOKENS VAN EN LOS TRES SELECTORES A LA VEZ, Y NO ES ADORNO.

   `:root` los pone a disposición de todo el documento. `#nav` y
   `.navbar-side` los blindan dentro de la barra, y eso es lo que hacía
   el hook antes de retirarse.

   POR QUÉ HACE FALTA EL BLINDAJE: otros hooks declaran ESTOS MISMOS
   nombres con OTROS valores en su propio `:root`, porque su bloque es
   oscuro. `netebu_footer.php` y `netebu_webmail.php` ponen
   `--nb-ink:#F2F3FB` —tinta blanca— y `--nb-line` en un blanco
   translúcido. Hoy esta hoja carga la última y gana por orden, pero un
   hook nuevo que inyecte en `ClientAreaFooterOutput` cargaría después y
   dejaría la barra con la tinta del pie: texto blanco sobre barra
   blanca. Un `#nav` con id gana a cualquier `:root`, cargue cuando
   cargue, y eso no depende de que nadie recuerde esta nota. */
:root,
#nav,
.navbar-side {
  /* Marca. El violeta AA es el que pasa contraste sobre papel: el violeta
     puro se queda en 4,46:1 y este llega a 6,2:1. */
  --nb-blue:       #4A90D9;
  --nb-violet:     #7B5CF6;
  --nb-pink:       #E84098;
  --nb-violet-aa:  #6B48F2;
  --nb-grad: linear-gradient(135deg, #4A90D9 0%, #7B5CF6 50%, #E84098 100%);

  /* Tinta sobre fondo claro. */
  --nb-ink:        #14111F;
  --nb-ink-2:      #4C4560;
  --nb-ink-3:      #726C85;

  /* Papel y filos. */
  --nb-paper:      #FFFFFF;
  --nb-paper-2:    #FAF8FE;
  --nb-line:       #E9E4F3;
  --nb-line-2:     #D8D0EC;

  /* Noche: el fondo de las cabeceras oscuras y del panel lateral. */
  --nb-night:      #0B0A16;

  /* Tinta sobre fondo oscuro. */
  --nb-on:         #F2F3FB;
  --nb-on-2:       #B9BEDD;
  --nb-on-3:       #8E94BC;

  /* Tipografía. Las carga `netebu_fuentes.php` en todo el sitio. */
  --nb-ff-display: "Outfit", "Trebuchet MS", system-ui, sans-serif;
  --nb-ff-body:    "Figtree", "Helvetica Neue", Arial, sans-serif;

  /* PUENTE HASTA F6, Y POR ESO ESTÁN DUPLICADOS. El hook declara sus
     tokens en `#nav, .navbar-side`, que gana a este `:root` para todo
     lo que cuelga de la barra. Mientras el hook siga vivo, un bloque
     migrado que use `--nb-ff-display` cambiaría la pila de respaldo
     —la del hook no lleva Trebuchet— y movería el `font-family`
     calculado sin que nadie lo haya pedido.

     Así que lo migrado usa los nombres del hook y sus valores exactos,
     y aquí quedan declarados para el día en que el hook desaparezca.
     En F6 se unifican los dos juegos y estos cinco se borran. */
  --nb-ff-d:       "Outfit", system-ui, -apple-system, sans-serif;
  --nb-ff-b:       "Figtree", system-ui, -apple-system, sans-serif;
  --nb-night-2:    #141227;
  --nb-night-3:    #1E1B33;
  --nb-grad-suave: linear-gradient(135deg, rgba(74,144,217,0.14) 0%, rgba(123,92,246,0.14) 50%, rgba(232,64,152,0.14) 100%);
}


/* ══════════════════════════════════════════════════════════════════
   LA BARRA, Y LA ISLA                                        (F3.3)

   Migrado del hook `netebu_navbar.php`. De los 40 `!important` que
   traía el bloque sobreviven DOS propiedades, justificadas abajo. El
   resto sobraban: se comprobó en el navegador, propiedad por
   propiedad, quién declara cada una y con qué fuerza.

   LO QUE SE MIDIÓ, porque «lo quito y a ver» no es un método:

     propiedad        rival más fuerte de Croster     ¿pierde?
     ───────────────  ─────────────────────────────   ────────
     background       .cros-navbar            (0,1,0)  sí
     position         .navbar                 (0,1,0)  sí
     box-shadow       .cros-navbar !important (0,1,0)  NO ◄ móvil
     border-radius    .cros-navbar !important (0,1,0)  NO ◄
     padding-top      nadie                            —
     margin-top       body                    (0,0,1)  sí
     color (enlaces)  .cros-navbar .navbar-nav li a (0,2,2) sí
     display (logo)   body .logo-dark         (0,1,1)  sí

   Todas nuestras reglas llevan `#nav`, así que un id contra clases:
   ganan por especificidad y esta hoja carga después. Los dos que sí
   necesitan `!important` son `border-radius` y `box-shadow`, porque
   Croster los declara con `!important`, y contra eso no hay
   especificidad que valga.

   Y AQUÍ HAY UNA LECCIÓN QUE COSTÓ UN DESPLIEGUE. La primera versión
   de esta tabla decía que `box-shadow` no lo necesitaba, porque el
   interrogatorio se hizo SOLO a 1600 px. El `!important` de Croster
   está dentro de un media query de móvil, así que en escritorio no
   aparece. Se desplegó, y la barra se quedó sin sombra en los tres
   anchos pequeños —60 medidas del oráculo—; en escritorio, perfecta.
   Preguntar quién manda hay que hacerlo en TODOS los anchos: una
   regla que no existe a 1600 px puede estar mandando a 390.

   LO QUE NO SE MIGRA AQUÍ. Las reglas de tinta blanca del hook
   —`body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav …`— NO
   se traen: ya las cubre, con más especificidad, el bloque de scroll
   de más arriba. Se comprobó en las diez páginas reales del sitio y
   con sesión de cliente que `nb-hero` y `nb-claro` son EXCLUYENTES
   —toda página con barra lleva una, nunca ninguna ni las dos—, así
   que `:not(.nb-claro)` y `.nb-hero` seleccionan el mismo conjunto.
   Traerlas sería duplicar la misma decisión en dos sitios, que es
   como se rompió el fundido.
   ══════════════════════════════════════════════════════════════════ */

/* ── la barra ──────────────────────────────────────────────────── */
/* AQUÍ HUBO UN `backdrop-filter` Y HUBO QUE QUITARLO. Crea un
   CONTEXTO DE APILAMIENTO propio —igual que `transform`, `filter` u
   `opacity` menor que 1—, y eso metía TODA la barra, desplegables
   incluidos, por debajo del contenido: el menú de Hosting quedaba
   tapado por `.hero-in` en la portada, por el banner en hosting, por
   el `h1` en SSL. Subir el z-index a 1030 NO lo arregló: el contexto
   se crea igual y el menú no puede escapar de él. El cristal acabó
   en un `::after`, al final de este bloque. */
#nav.cros-navbar {
  background: var(--nb-paper);
  /* FIJA AL BAJAR, y con `fixed`, no con `sticky`. `position:sticky`
     deja de funcionar si CUALQUIER ancestro tiene `overflow` distinto
     de `visible`, y Croster declara `body{overflow-x:hidden}` —del que
     depende el full-bleed de la portada, así que no se puede quitar—.
     Medido: con sticky la barra se iba con el scroll (top=-1400 tras
     bajar 1400 px). `fixed` no depende del overflow de los ancestros;
     la altura se compensa con un padding en el body que pone el
     script del hook. */
  position: fixed; top: 0; left: 0; right: 0; z-index: 1030;
  padding-top: 11px; padding-bottom: 11px;
  border-bottom: 1px solid var(--nb-line);
  box-shadow: 0 1px 2px rgba(20, 17, 31, .04) !important;  /* Croster: none !important en móvil */
  /* La transición completa. En el hook estaba declarada dos veces
     —primero solo `box-shadow`, luego la lista entera— y la segunda
     anulaba a la primera por ser shorthand. Aquí va una sola vez. */
  transition: background .3s ease, border-color .3s ease,
              border-radius .3s ease, box-shadow .3s ease,
              left .3s ease, right .3s ease, top .3s ease;
}
/* al bajar, la barra se despega un poco del contenido */
body.nb-scrolled #nav.cros-navbar {
  box-shadow: 0 1px 2px rgba(20, 17, 31, .05),
              0 10px 30px -14px rgba(20, 17, 31, .22) !important;
}

/* ── cristal, SOLO EN ESCRITORIO ───────────────────────────────── */
/* Deja entrever lo que pasa por debajo. Muestreada la franja de la
   barra en home/hosting/ssl/store a tres alturas de scroll, el peor
   fondo es el #241D3C de la home: al 0,86 compone #E0DFE4 y el texto
   queda en 14,0:1, muy por encima del 4,5:1 de AA. 0,80 ya NO vale:
   sobre esas secciones oscuras compone #D3D2D8 y la barra deja de
   leerse blanca. El desenfoque sube a 26 px y la saturación a 180%
   para que lo de debajo se insinúe con su color y no como una mancha.
   En móvil NO: el panel lateral se apoya en esta barra y desenfocar
   un fondo en movimiento cuesta batería sin aportar nada. */
@media (min-width: 992px) {
  #nav.cros-navbar {
    background: rgba(255, 255, 255, .86);
    backdrop-filter: saturate(180%) blur(26px);
    -webkit-backdrop-filter: saturate(180%) blur(26px);
  }
  body.nb-scrolled #nav.cros-navbar { background: rgba(255, 255, 255, .86); }
}
/* si el navegador no sabe de backdrop-filter, blanco entero */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  #nav.cros-navbar { background: var(--nb-paper); }
}

/* ── el modo isla ──────────────────────────────────────────────── */
/* Arriba del todo, y solo en las páginas con cabecera oscura debajo,
   la barra se despega de los bordes y se vuelve translúcida: se
   integra con el hero y el logo pasa a su versión blanca. Al bajar
   recupera el fondo sólido y el logo en color.

   POR QUÉ NO EN TODAS: el script marca `body.nb-hero` solo cuando
   encuentra una de las cabeceras oscuras conocidas, así que no se
   decide muestreando colores —que falla con imágenes— sino por la
   estructura real de la página. */

/* Croster declara `body{margin-top:57px}` SOLO EN MÓVIL para dejar
   sitio a su barra. Con la isla flotando sobre el hero ese margen
   sobra: empujaba la cabecera a y=57 y la isla quedaba 47 px sobre
   fondo BLANCO, con el texto claro encima. */
body.nb-hero { margin-top: 0; }

/* LA FORMA DE ISLA SE MANTIENE SIEMPRE. Lo único que cambia al bajar
   es el color: de translúcida sobre el hero a blanca y sólida. Antes
   la barra recuperaba el ancho completo al hacer scroll y se perdía
   el efecto; así se conserva de arriba abajo. */
body.nb-hero #nav.cros-navbar {
  /* EL ÚNICO `!important` DE ESTE BLOQUE, Y NO ES PEREZA. El <body>
     lleva la clase `no-radius` del tema y Croster declara
     `.cros-navbar{border-radius:0 !important}`. Contra un !important
     no hay especificidad que valga: hace falta otro. Lo correcto
     sería quitarlo del LESS de Croster, pero el LESS ya no tiene
     dueño y recompilarlo afecta a todo el sitio. */
  border-radius: 18px !important;
  left: 16px; right: 16px;
  max-width: 1400px; margin-inline: auto;
  top: 14px;
}

/* arriba del todo: translúcida, integrada con la cabecera.
   El fondo y el filo los conduce el bloque de scroll de más arriba;
   aquí queda lo que no se anima: el desenfoque y la sombra. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav.cros-navbar {
  background: rgba(255, 255, 255, .06);
  backdrop-filter: saturate(150%) blur(16px);
  -webkit-backdrop-filter: saturate(150%) blur(16px);
  border: 1px solid rgba(255, 255, 255, .16);
  box-shadow: 0 18px 50px -22px rgba(0, 0, 0, .75) !important;
}
/* al bajar: la misma isla, ahora blanca. En MÓVIL casi opaca, porque
   allí no hay `backdrop-filter` y sin desenfoque el contenido se
   vería nítido a través. */
body.nb-hero.nb-scrolled #nav.cros-navbar {
  background: rgba(255, 255, 255, .97);
  border: 1px solid var(--nb-line);
  box-shadow: 0 2px 6px rgba(20, 17, 31, .06),
              0 18px 44px -20px rgba(20, 17, 31, .34) !important;
}
@media (min-width: 992px) {
  body.nb-hero.nb-scrolled #nav.cros-navbar { background: rgba(255, 255, 255, .86); }
}

/* EL LOGO. Croster ya trae las dos versiones en el HTML, pero la de
   modo oscuro —logonetebudarkmode.webp— viene con FONDO SÓLIDO
   #1D1D1D, sin transparencia: sobre la isla se veía su recuadro. Se
   generó una versión con alfa real (logonetebu_blanco_2026.webp)
   quitando ese fondo y desmultiplicando el color, para que los bordes
   no quedaran sucios de gris. El script le cambia el `src`. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .logo-light { display: none; }
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .logo-dark  { display: block; }
#nav .logo-light, #nav .logo-dark { transition: opacity .25s ease; }

/* en móvil la isla se ajusta a los bordes */
@media (max-width: 767px) {
  body.nb-hero #nav.cros-navbar {
    left: 10px; right: 10px; top: 10px;
    border-radius: 14px !important;   /* mismo motivo que arriba */
  }
}

/* ── lo que pasa al pasar el ratón, arriba del todo ────────────── */
/* SEPARADO A PROPÓSITO. Estas dos reglas no las ve la simulación
   —mide el estado en reposo, sin puntero encima— así que se
   comprueban a mano en el navegador.

   LLEVABAN `!important` HASTA F3.4, y ya no: el hover base vivía en
   el hook con `#nav .navbar-nav > li > a:hover{color:… !important}`
   y no había especificidad que valiera. Migrado ese bloque aquí
   abajo, sin `!important`, estas (1,5,3) le ganan a su (1,2,2) por
   las buenas. La deuda tenía fecha y se ha pagado. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav > li > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav > li:hover > a {
  color: #fff;
  background: rgba(255, 255, 255, .10);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) .navbar-toggler:hover {
  background: rgba(255, 255, 255, .10);
}

/* ── el cristal, en un pseudoelemento ──────────────────────────── */
/* ESTE BLOQUE VA EL ÚLTIMO DE LOS TRES, Y EL ORDEN ES LA REGLA. No
   lleva `!important`: gana porque su lista de selectores EMPATA en
   especificidad con las reglas de fondo de arriba —(1,1,0), (1,2,1) y
   (1,4,1), una por cada estado— y va después. Si alguien mueve este
   bloque por encima de ellas, la barra de escritorio se vuelve blanca
   opaca y el cristal desaparece. No se mueve.

   EL PORQUÉ DEL PSEUDOELEMENTO. Un elemento con `backdrop-filter` se
   convierte en BACKDROP ROOT: sus descendientes solo pueden desenfocar
   lo que se pinta dentro de él, no la página. Los desplegables cuelgan
   fuera de la barra, así que su backdrop root ahí estaba vacío y el
   desenfoque no hacía nada. Medido: la nitidez del interior del menú
   daba 63,4 —el texto de la sección de debajo se leía entero a través
   del menú—, justo lo que había que evitar.

   Moviéndolo a un `::after`, `#nav` ya no filtra y deja de ser backdrop
   root; el que filtra es el pseudoelemento, que no es ancestro de los
   menús. `z-index:-1` lo pinta bajo el contenido de la barra pero
   dentro de su contexto de apilamiento, así que no se va detrás de la
   página. Solo en escritorio: en móvil no hay menús flotantes. */
@media (min-width: 992px) {
  #nav.cros-navbar,
  body.nb-scrolled #nav.cros-navbar,
  body.nb-hero #nav.cros-navbar,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav.cros-navbar,
  body.nb-hero.nb-scrolled #nav.cros-navbar {
    background: transparent;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  #nav.cros-navbar::after {
    content: ""; position: absolute; inset: 0; z-index: -1;
    border-radius: inherit; pointer-events: none;
    background: rgba(255, 255, 255, .86);
    backdrop-filter: saturate(180%) blur(26px);
    -webkit-backdrop-filter: saturate(180%) blur(26px);
    transition: background .3s ease;
  }
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav.cros-navbar::after {
    background: rgba(255, 255, 255, .06);
  }
  /* sin `backdrop-filter` el cristal sería una ventana: mejor sólido */
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    #nav.cros-navbar::after { background: var(--nb-paper); }
    body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav.cros-navbar::after {
      background: rgba(20, 17, 31, .55);
    }
  }
}


/* ══════════════════════════════════════════════════════════════════
   LOS ENLACES Y SUS DESPLEGABLES                             (F3.4)

   Migrado del hook. Aquí NO queda ni un `!important`, y no es que se
   hayan quitado a ojo: se preguntó al navegador quién declara cada
   propiedad, a 390 y a 1600 px con el menú abierto, y Croster no usa
   `!important` en ninguna. Su rival más fuerte es
   `.cros-navbar .navbar-header .secondary-menu-mobile.nav li a`
   —(0,5,2)—, y un `#nav …` con id le gana siempre.

   EL HOOK DECLARABA ESTO DOS VECES, y solo una ganaba. Los iconos y
   el hover del desplegable estaban escritos en dos sitios separados
   por 130 líneas, y el segundo pisaba al primero por orden. Lo que
   quedaba muerto, medido en el navegador en diez combinaciones de
   ancho y estado:

     · icono del desplegable:  var(--nb-violet) #7B5CF6  →  ganaba #5B3FD6
     · hover, fondo:           var(--nb-paper-2)         →  ganaba rgba(123,92,246,.15)
     · hover, tinta:           var(--nb-violet-aa)       →  ganaba #4C2FC0
     · hover en escritorio:    rgba(123,92,246,.09)      →  ganaba el .15 de fuera

   Aquí va solo lo que estaba VIVO. Dejar las dos versiones invita a
   que alguien ajuste la muerta y no entienda por qué no pasa nada.
   ══════════════════════════════════════════════════════════════════ */

/* ── los enlaces de primer nivel ───────────────────────────────── */
#nav .navbar-nav > li > a {
  font-family: var(--nb-ff-d);
  font-size: 1.055rem; font-weight: 600;
  color: var(--nb-ink);
  letter-spacing: -0.006em;
  border-radius: 10px; margin: 0 2px;
  transition: color 0.22s ease, background 0.22s ease;
}
/* Sin pastilla: los <a> no tienen la misma altura entre sí —el de
   Soporte y el del carrito son más cortos— y el fondo salía
   descuadrado, sobresaliendo por arriba y por abajo. Solo color. */
#nav .navbar-nav > li > a:hover,
#nav .navbar-nav > li:hover > a,
#nav .navbar-nav > li.active > a {
  color: var(--nb-violet-aa);
  background: transparent;
}
/* la flechita del desplegable */
#nav .navbar-nav > li > a .caret,
#nav .navbar-nav > li > a:after {
  color: var(--nb-ink-3); transition: transform 0.22s ease;
}
#nav .navbar-nav > li:hover > a:after { transform: rotate(180deg); }

/* ── los desplegables ──────────────────────────────────────────── */
/* El tema los deja cuadrados, sin sombra y pegados a la barra. */
#nav .dropdown-menu {
  background: var(--nb-paper);
  border: 1px solid var(--nb-line);
  border-radius: 14px;
  /* El margen se cuenta desde el ENLACE, no desde la barra, y la barra
     tiene 11 px de relleno inferior: con 9 px el menú acababa 3 px
     METIDO DENTRO de ella. Se suma ese relleno más el aire que se
     quiere de verdad. */
  padding: 8px; margin-top: 23px;
  min-width: 212px;
  box-shadow: 0 2px 4px rgba(20, 17, 31, 0.05),
              0 20px 44px -18px rgba(20, 17, 31, 0.26);
}
/* Ese margen deja una franja muerta entre el enlace y el menú: al
   bajar el ratón hacia el submenú se pierde el hover y el menú se
   cierra en la cara. Un puente invisible la cubre. Nada de
   `overflow:hidden` en el menú, o recortaría este pseudoelemento. */
#nav .dropdown-menu::before {
  content: ""; position: absolute; left: 0; right: 0; top: -24px; height: 24px;
}
#nav .dropdown-menu > li > a,
#nav .dropdown-menu li a {
  font-family: var(--nb-ff-b);
  font-size: 1rem; font-weight: 500;
  color: var(--nb-ink-2);
  padding: 10px 14px; border-radius: 9px;
  display: flex; align-items: center; gap: 10px;
  transition: background 0.2s ease, color 0.2s ease, padding-left 0.2s ease;
}
/* El violeta de marca puro se queda en 4,46:1 sobre blanco: no llega a
   AA y en un icono pequeño se ve lavado. Se baja a un violeta más
   profundo —6,2:1— que sigue siendo de la familia. */
#nav .dropdown-menu li a i,
#nav .dropdown-menu li a .fa,
#nav .dropdown-menu li a .fas,
#nav .dropdown-menu li a .far,
#nav .dropdown-menu li a .fab {
  flex: 0 0 19px; width: 19px; text-align: center;
  color: #5B3FD6; font-size: 0.98rem;
  transition: color 0.2s ease;
}
#nav .dropdown-menu > li > a:hover,
#nav .dropdown-menu li a:hover {
  background: rgba(123, 92, 246, 0.15);
  color: #4C2FC0; padding-left: 17px;
}
#nav .dropdown-menu > li > a:hover i { color: var(--nb-pink); }
#nav .dropdown-menu .divider,
#nav .dropdown-menu .dropdown-divider {
  background: var(--nb-line); margin: 6px 4px;
}

/* ── el mismo cristal que la barra, solo en escritorio ─────────── */
/* La barra y su menú tienen que ser LA MISMA superficie: si la barra
   deja pasar el fondo y el menú no, el menú parece pegado encima en
   vez de desplegado desde ella.
   Solo en escritorio: en móvil los submenús viven dentro del panel
   lateral, que es opaco y oscuro y tiene sus propias reglas. Y sin
   `backdrop-filter` el texto de la página se leería a través del
   menú, que es justo lo que hay que evitar. */
@media (min-width: 992px) {
  #nav .dropdown-menu {
    background: rgba(255, 255, 255, 0.86);
    backdrop-filter: saturate(180%) blur(26px);
    -webkit-backdrop-filter: saturate(180%) blur(26px);
    border-color: rgba(233, 228, 243, 0.8);
  }
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  #nav .dropdown-menu { background: var(--nb-paper); }
}

/* ── y arriba del todo, el tono de la isla ─────────────────────── */
/* Dos capas: un velo oscuro que garantiza el contraste sobre CUALQUIER
   hero, y encima el mismo blanco al 7% que lleva la barra. Sin el velo
   no sale: muestreado el hero de la home bajo el menú de Dominios, sus
   píxeles más claros llegan a #6152C0 y ahí el blanco al 6% deja el
   texto en 4,82:1 —pasa AA por los pelos, y en otro hero más claro no
   pasaría—. Con el velo al 0,42 ese peor caso sube a 7,5:1 y el menú
   sigue dejando pasar el hero casi como la barra. Al 0,55 daba 11,7:1
   pero se veía más oscuro que ella, y tienen que parecer la misma
   superficie.
   El orden importa: en `background` la PRIMERA capa va encima. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu {
  background: linear-gradient(rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.07)),
              rgba(20, 17, 31, 0.42);
  border: 1px solid rgba(255, 255, 255, 0.16);
  box-shadow: 0 18px 50px -22px rgba(0, 0, 0, 0.75);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu > li > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a {
  color: var(--nb-on);
}
/* el padding-left del hover lo pone la regla clara de arriba; aquí
   solo cambian los colores */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu > li > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a:hover {
  background: rgba(255, 255, 255, 0.10); color: #fff;
}
/* el violeta de marca se apaga sobre fondo oscuro: se aclara al tono
   que ya usa el sitio para iconos en oscuro */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a i,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a .fa,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a .fas,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a .far,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu li a .fab {
  color: #A594FF;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu > li > a:hover i {
  color: var(--nb-pink);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu .divider,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu .dropdown-divider {
  background: rgba(255, 255, 255, 0.14);
}





/* ══════════════════════════════════════════════════════════════════
   EL ÁREA DE CLIENTE: MEGAMENÚ, SALIR, SEPARADOR Y CAMPANA  (F3.5-F3.6)

   Migrado del hook. De los ~130 `!important` que traían estos bloques
   quedan los que Croster y Bootstrap OBLIGAN a conservar, y cada uno
   lleva al lado contra qué pelea. Son estos, y se sacaron preguntando
   al navegador CON SESIÓN —el megamenú y la campana solo existen con
   ella— a 390, 1280 y 1600 px, con `:hover` forzado:

     Croster  .dropdown-menu.dropdown-mega .mega-menu ul li a   padding:0
     Croster  .mega-menu ul li a:hover           background-color:transparent · color:#8f1faf
     Croster  .dropdown-menu.dropdown-mega .html-item a        padding:0 · background-color:transparent
     Croster  .cros-navbar .dropdown-scroll li a  color:#211b65 · font-size:14px
     Croster  .cros-navbar .dropdown-tasks li a:hover          background-color:#edf0f5
     Croster  .cros-navbar .dropdown-scroll li a .btn           padding:4px 10px
     Bootstrap .text-info / .text-danger / .text-warning        color
     Croster  .container (solo móvil)                          width · max-width:100%

   Y UNA LECCIÓN DE MÉTODO, porque la primera versión de esta lista
   tenía UNA entrada y era falsa. El interrogatorio preguntaba por
   `padding-top`, `background-color`, `margin-top`… y Croster declara
   los SHORTHANDS: `padding`, `background`, `margin`. El navegador
   lista cada declaración con el nombre tal cual se escribió, así que
   los `!important` en shorthands no aparecían. Y tampoco se forzaba
   `:hover`. Se desplegó a la simulación —no a producción— y salieron
   veintitrés diferencias con el morado de Croster asomando en el hover.
   Preguntar «quién manda» es preguntar por TODAS las declaraciones
   con `!important` que alcanzan al elemento, sin filtrar por
   propiedad, y con los pseudo-estados forzados.

   LO QUE NO SE PUEDE VERIFICAR MIDIENDO, y se dice aquí para que nadie
   se fíe de más: `.item-icon`, `a.item-heading` y `.badge` no existen
   hoy en el DOM —dependen de lo que haya en `mod_adminpanel_cmegamenu`—
   y la campana solo se pinta cuando WHMCS tiene alertas para el
   cliente. Esas reglas van LITERALES, sin consolidar, porque no hay
   forma de comprobar una consolidación.

   LO QUE SÍ SE CONSOLIDÓ, porque se midió antes y después en cuatro
   combinaciones de ancho y estado, con cincuenta propiedades cada una:
   el hook declaraba `.item-with-icons` tres veces, `h4.menu-name` dos,
   `.menu-small-box` dos y `.html-item` tres, en bloques escritos en
   días distintos que se iban pisando por orden. Aquí cada elemento
   está UNA vez, con los valores que de verdad ganaban.
   ══════════════════════════════════════════════════════════════════ */

/* ── el panel del megamenú ─────────────────────────────────────── */
/* Estructura real (core/includes/mega-menu.tpl):

     ul.dropdown-menu.dropdown-mega
       li > div.mega-menu > div.container > div.row
         div.menu-small-box            <- una por columna
           div.item-with-icons
             span.item-icon > i
             h4.menu-name              <- título de la columna
           ul.menu-list > li > a.nav-link > span.item

   Este panel mide ~1100×360 y heredaba el cristal de los desplegables
   normales, pensado para menús de 200 px. Con esa superficie, un velo
   al 42% deja leer TODA la página por debajo y el panel se vuelve
   ilegible. Un menú grande necesita fondo denso. */
#nav .dropdown-menu.dropdown-mega {
  background: rgba(255, 255, 255, 0.97);
  backdrop-filter: saturate(150%) blur(20px);
  -webkit-backdrop-filter: saturate(150%) blur(20px);
  border: 1px solid var(--nb-line);
  border-radius: 18px;
  padding: 10px;
  box-shadow: 0 4px 10px rgba(20, 17, 31, 0.06),
              0 34px 80px -30px rgba(20, 17, 31, 0.42);
}
/* sobre cabecera oscura, el mismo tono que la isla pero DENSO */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu.dropdown-mega {
  background: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05)),
              rgba(11, 10, 22, 0.95);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: 0 30px 80px -30px rgba(0, 0, 0, 0.88);
}

/* ── la rejilla ────────────────────────────────────────────────── */
#nav .dropdown-mega .mega-menu,
#nav .dropdown-mega .mega-menu > .container {
  /* los dos `!important` del bloque: Croster pone `width:100%
     !important; max-width:100% !important` al `.container` en móvil */
  width: 100% !important; max-width: none !important;
  padding: 0; margin: 0;
}
#nav .dropdown-mega .mega-menu > .container > .row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 6px 10px; margin: 0; width: 100%;
}
#nav .dropdown-mega .menu-small-box {
  display: flex; flex-direction: column;
  padding: 14px 14px 12px; margin: 0;
  max-width: none; flex: none; width: auto;
  border-radius: 12px;
}

/* ── la cabecera de cada columna ───────────────────────────────── */
/* mega-menu.tpl genera DOS variantes según si la columna enlaza a
   algún sitio:

     URI "#"  ->  div.item-with-icons
     URI real ->  a.item-heading > div.item-with-icons.no-margin

   Ese envoltorio añadía 10 px por arriba y quitaba el margen inferior:
   su título, su línea y su enlace caían más abajo que los de las otras
   columnas. Se neutraliza el <a> y se da a las dos variantes LA MISMA
   caja: misma altura mínima, mismo margen, mismo relleno. */
#nav .dropdown-mega a.item-heading {
  display: block; margin: 0; padding: 0;
  line-height: normal; text-decoration: none;
  border: 0; background: none;
}
#nav .dropdown-mega .item-with-icons,
#nav .dropdown-mega .item-with-icons.no-margin,
#nav .dropdown-mega a.item-heading .item-with-icons {
  display: flex; align-items: center; gap: 9px;
  min-height: 34px;
  margin: 0 0 10px; padding: 0 0 9px;
  border-bottom: 1px solid var(--nb-line);
}
#nav .dropdown-mega .item-icon {
  flex: 0 0 auto; display: inline-flex; align-items: center; line-height: 1;
}
#nav .dropdown-mega .item-icon i {
  color: var(--nb-violet-aa); font-size: 0.95rem;
}
#nav .dropdown-mega h4.menu-name {
  font-family: var(--nb-ff-d); font-weight: 700;
  font-size: 0.78rem; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--nb-ink-3); margin: 0; padding: 0; line-height: 1.2;
  flex: 1 1 auto;
}
#nav .dropdown-mega a.item-heading:hover h4.menu-name { color: var(--nb-violet-aa); }
/* la misma cabecera, sobre cabecera oscura */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega .item-with-icons,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega .item-with-icons.no-margin,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega a.item-heading .item-with-icons {
  border-bottom-color: rgba(255, 255, 255, 0.14);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega .item-icon i {
  color: #A594FF;
}
/* La primera columna no usa `.item-with-icons` como las demás, sino
   `a.item-heading` envolviendo el título: el color de enlace del tema
   ganaba y salía en violeta apagado sobre fondo oscuro. Se nombra el
   <ul> entero para ganarle al tema por especificidad. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega h4.menu-name,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega a.item-heading h4.menu-name,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega a.item-heading {
  color: var(--nb-on-3);
  font-family: var(--nb-ff-d); font-weight: 700;
  font-size: 0.78rem; letter-spacing: 0.12em; text-transform: uppercase;
}

/* ── los enlaces de cada columna ───────────────────────────────── */
#nav .dropdown-mega ul.menu-list { list-style: none; margin: 0; padding: 0; }
#nav .dropdown-mega ul.menu-list > li { margin: 0; }
#nav .dropdown-mega ul.menu-list > li > a {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 10px !important;   /* Croster: .dropdown-mega .mega-menu ul li a{padding:0 !important} */
  border-radius: 9px;
  font-family: var(--nb-ff-b); font-size: 0.94rem;
  font-weight: 500; color: var(--nb-ink-2);
  transition: background 0.2s ease, color 0.2s ease, padding-left 0.2s ease;
}
/* los tres con `!important`: Croster `.mega-menu ul li a:hover` pone
   `background-color:transparent` y `color:#8f1faf` con !important, y su
   `padding:0 !important` alcanza también al padding-left del hover */
#nav .dropdown-mega ul.menu-list > li > a:hover {
  background: rgba(123, 92, 246, 0.15) !important;
  color: #4C2FC0 !important; padding-left: 13px !important;
}
#nav .dropdown-mega ul.menu-list > li > a i {
  flex: 0 0 17px; width: 17px; text-align: center;
  color: #5B3FD6; font-size: 0.92rem;
}
#nav .dropdown-mega ul.menu-list > li > a:hover i { color: var(--nb-pink); }
/* el badge que WHMCS puede colgar de una entrada */
#nav .dropdown-mega .badge {
  background: var(--nb-grad); color: #fff;
  border-radius: 999px; padding: 2px 8px; font-size: 0.7rem;
  font-family: var(--nb-ff-d); font-weight: 700; margin-left: auto;
}
/* los mismos enlaces, sobre cabecera oscura. Se nombra el <ul> por lo
   mismo que arriba: "Panel Principal" salía en azul de enlace. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega ul.menu-list > li > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega ul.menu-list > li > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega ul.menu-list > li > a span,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .menu-small-box > a {
  color: var(--nb-on);
  font-family: var(--nb-ff-b); font-size: 0.94rem;
  text-transform: none; letter-spacing: 0;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega ul.menu-list > li > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega ul.menu-list > li > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega ul.menu-list > li > a:hover span {
  background: rgba(255, 255, 255, 0.10) !important; color: #fff !important;  /* mismo hover de Croster */
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega ul.menu-list > li > a i {
  color: #A594FF;
}

/* ── la columna de HTML libre ──────────────────────────────────── */
/* LO QUE HAY DE VERDAD, leído del inspector, porque aquí el contenido
   lo pone el gestor de menús con su editor visual:

     div.menu-small-box.col-md-3.col-html
       div.item-with-icons          <- VACÍO
       div.html-item
         h3   "Área de Cliente"     <- EL TÍTULO ESTÁ AQUÍ
         p    <a><font color="#00A2D4" size="3">Panel Principal</font></a>
         p    "Para acceder y crear VPS... <a>Registrarse</a>"

   Sale con `<font color size>` —etiqueta que HTML5 eliminó— y un cian
   que NO está en la paleta. Se neutraliza el atributo. Y se separan DOS
   casos: un enlace que ocupa el párrafo entero es un ELEMENTO DE MENÚ y
   va como los de las otras columnas; un enlace dentro de una frase es
   un ENLACE DE TEXTO y conserva su subrayado. */
#nav .dropdown-mega .col-html > .item-with-icons:empty,
#nav .dropdown-mega .col-html > .item-with-icons { display: none; }
/* el recuadro gris que el tema pinta sobre algunos `.html-item`, y el
   relleno lateral que desplazaba sus enlaces 10 px respecto a los de
   las otras columnas: se le quita a él y se reparte al párrafo */
#nav .dropdown-mega .html-item {
  /* el 2px/8px vertical venía de netebu_clientes.php; el 0 lateral, de
     aquí: juntos daban `2px 0 8px`, que es lo que se conserva */
  padding: 2px 0 8px; margin: 0 0 8px;
  background: transparent; border: 0; border-radius: 0;
  /* el texto suelto que WHMCS puede colgar fuera de un <p>. Esto vivía
     en netebu_clientes.php, con !important, y desde allí le ganaba a
     esta hoja el color de los enlaces de la columna. Ahora está aquí,
     con el resto del megamenú. */
  font-family: var(--nb-ff-b); font-size: 0.88rem; line-height: 1.5;
  color: var(--nb-ink-3);
}
#nav .dropdown-mega .col-html .html-item { margin: 0; padding: 0; }
#nav .dropdown-mega .html-item font {
  color: inherit; font-size: inherit; font-family: inherit;
}
#nav .dropdown-mega .html-item br { display: none; }
#nav .dropdown-mega .html-item > p { margin-bottom: 9px; padding: 0 10px; }
/* el <h3> pasa a ser el título de columna, idéntico a los `h4` de las
   otras, con el icono que las suyas traen en `span.item-icon` */
body #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h3,
body #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h2,
body #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h4 {
  font-family: var(--nb-ff-d); font-weight: 700;
  font-size: 0.78rem; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--nb-ink-3);
  margin: 0 0 10px; padding: 0 0 9px;
  min-height: 34px; display: flex; align-items: center; gap: 9px;
  border-bottom: 1px solid var(--nb-line);
  line-height: 1.2;
}
body #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h3::before {
  content: "\f2bd";
  font-family: "Font Awesome 5 Pro", "Font Awesome 6 Pro",
               "Font Awesome 5 Free", "FontAwesome";
  font-weight: 300; font-size: 0.95rem; line-height: 1;
  color: var(--nb-violet-aa); flex: 0 0 auto;
}
/* los párrafos, como texto de apoyo */
#nav .dropdown-mega .col-html .html-item p {
  font-family: var(--nb-ff-b); font-size: 0.88rem;
  line-height: 1.55; margin: 0 0 9px;
  text-transform: none; letter-spacing: 0;
  color: var(--nb-ink-2);
}
#nav .dropdown-mega .col-html .html-item p:last-child { margin-bottom: 0; }
/* caso 1: el enlace que es un elemento de menú */
#nav .dropdown-mega .html-item > a,
#nav .dropdown-mega .html-item > p > a:only-child {
  display: block; margin: 0;
  padding: 8px 10px !important;   /* Croster: .dropdown-mega .html-item a{padding:0 !important} */
  border-radius: 9px;
  font-family: var(--nb-ff-b); font-size: 0.94rem;
  font-weight: 500; color: var(--nb-ink-2);
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, padding-left 0.2s ease;
}
#nav .dropdown-mega .html-item > p > a:only-child { margin-left: -10px; }
#nav .dropdown-mega .html-item > a:hover,
#nav .dropdown-mega .html-item > p > a:only-child:hover {
  /* Croster: .dropdown-mega .html-item a:hover{background-color:transparent !important} */
  background: rgba(123, 92, 246, 0.15) !important;
  color: #4C2FC0; padding-left: 13px !important;
}
/* caso 2: el enlace dentro de una frase */
#nav .dropdown-mega .col-html .html-item a {
  color: var(--nb-violet-aa); text-decoration: none; font-weight: 600;
}
#nav .dropdown-mega .col-html .html-item a:hover { text-decoration: underline; }
#nav .dropdown-mega .html-item p > a:not(:only-child) {
  color: var(--nb-violet-aa); text-decoration: underline;
  font-size: 0.88rem;
}
/* la misma columna, sobre cabecera oscura */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h3,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h2,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h4 {
  color: var(--nb-on-3);
  border-bottom-color: rgba(255, 255, 255, 0.14);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .col-html .html-item h3::before {
  color: #A594FF;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega .col-html .html-item p {
  color: var(--nb-on-2);
}
/* `:not(h1)…:not(a):not(font)` es imprescindible: sin eso este `*`,
   más específico que las reglas del título y del enlace, les imponía
   0,88rem y `text-transform:none` al <h3> y dejaba los enlaces del
   gris del texto de apoyo. */
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item *:not(h1):not(h2):not(h3):not(h4):not(h5):not(a):not(font) {
  color: var(--nb-on-2);
  font-family: var(--nb-ff-b); font-size: 0.88rem;
  line-height: 1.55; text-transform: none; letter-spacing: 0;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-mega .col-html .html-item a {
  color: #A594FF;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item > p > a:only-child {
  color: var(--nb-on); text-decoration: none;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item > p > a:only-child:hover {
  background: rgba(255, 255, 255, 0.10) !important; color: #fff;
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.dropdown-menu.dropdown-mega .html-item p > a:not(:only-child) {
  color: #A594FF; text-decoration: underline;
}

/* ── en móvil, dentro del panel lateral ────────────────────────── */
@media (max-width: 991px) {
  /* las columnas van una debajo de otra */
  #nav .dropdown-mega .mega-menu > .container > .row { grid-template-columns: 1fr; }
  #nav .dropdown-menu.dropdown-mega {
    background: transparent; border: 0; box-shadow: none; padding: 0;
  }
}

/* ── programa amigo, fuera del megamenú ────────────────────────── */
/* Retirado por decisión de dirección, igual que en el pie. En la base
   de datos es `mod_adminpanel_cmegamenu` relid=108 (affiliates.php) y
   ya lleva `enabled=0`; hoy no aparece en el DOM. Esto es el respaldo,
   porque el pie demostró que el addon no siempre respetaba ese campo.
   Acotado AL MEGAMENÚ: si el enlace existe en otro sitio, ahí sigue. */
#nav .dropdown-mega .menu-list li:has(> a[href*="affiliates.php"]),
#nav .dropdown-mega .menu-list li:has(> a[href*="programa_amigo"]) { display: none; }
/* respaldo para navegadores sin `:has()` */
#nav .dropdown-mega .menu-list a[href*="affiliates.php"],
#nav .dropdown-mega .menu-list a[href*="programa_amigo"] { display: none; }

/* el icono de inicio que la plantilla antepone al menú */
#nav .navbar-nav > li.home-item > a { display: flex; align-items: center; gap: 7px; }

/* ── el botón de salir ─────────────────────────────────────────── */
/* navbar-right.tpl:  li.dropdown.nocaret > a.nav-link > i.fa-sign-out-alt
   Al ser `.nav-link` heredaba el relleno de 16 px de los enlaces del
   menú —medido: 49×57— y su hover pintaba un rectángulo grande y
   descentrado respecto al círculo del avatar. Pasa a ser un círculo
   del mismo tamaño, con su aire a la derecha del usuario.
   La tinta de los dos estados la pone el bloque de scroll, que ya
   lista `a[href*="logout"]`; aquí solo la forma y el hover. */
#nav .navbar-nav > li > a[href*="logout"],
#nav li.nocaret > a[href*="logout"] {
  width: 40px; height: 40px;
  padding: 0; margin-left: 8px;
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  transition: background 0.2s ease, color 0.2s ease;
}
#nav li > a[href*="logout"] i { margin: 0; font-size: 1.02rem; }
#nav li > a[href*="logout"]:hover {
  background: rgba(123, 92, 246, 0.13); color: var(--nb-violet-aa);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav li > a[href*="logout"]:hover {
  background: rgba(255, 255, 255, 0.14); color: #fff;
}
/* el carrito y el avatar, con la misma separación entre ellos */
#nav .navbar-nav > li.nocaret { display: flex; align-items: center; }

/* ── el menú y las acciones, separados ─────────────────────────── */
/* MEDIDO a 1440 px, con y sin sesión: el menú principal terminaba en
   1221 y las acciones empezaban en 1221. Cero. "Soporte" y el carrito
   se tocaban y el chevron de "Soporte" parecía del carrito. Se separan
   y un filo tenue deja claro que son cosas distintas: navegar y actuar.
   Los colores del filo en cada estado los pone el bloque del avatar. */
@media (min-width: 992px) {
  #nav ul.navbar-nav.navbar-right, #nav ul#header {
    margin-left: 20px; padding-left: 20px;
    position: relative;
  }
  #nav ul.navbar-nav.navbar-right::before, #nav ul#header::before {
    content: ""; position: absolute; left: 0; top: 50%;
    transform: translateY(-50%);
    width: 1px; height: 22px; background: var(--nb-line-2);
  }
}

/* ── el panel de la campana ────────────────────────────────────── */
/* NO VERIFICABLE HOY: navbar-right.tpl solo lo pinta con
   `{if count($clientAlerts) > 0}`, y la cuenta con la que se mide no
   tiene alertas. Va literal, sin consolidar nada, con sus comentarios.

   ESTRUCTURA REAL, leída del DOM cuando sí había alertas:

     ul.dropdown-menu.dropdown-tasks
       li.dropdown-header > i.fa-info-circle + "(1) Notificaciones"
       li#taskScroll > ul.list-unstyled
         li > a > i.fa-info-circle + texto + button.btn.btn-xs.btn-info

   El texto salía CASI INVISIBLE: el panel cuelga del navbar, y sobre
   cabecera oscura las reglas de la barra pintan sus enlaces en blanco.
   Aquí el fondo es blanco. Y el botón "Pagar Ahora" va DENTRO del <a>:
   el enlace pasa a rejilla para que icono, texto y botón tengan sitio. */
#nav .dropdown-menu.dropdown-tasks {
  min-width: 340px; max-width: 380px;
  padding: 0; overflow: hidden; border-radius: 13px;
}
/* Solo estas cuatro llevan también el estado de la isla: son las que la
   regla genérica de los desplegables sobre cabecera oscura —(1,4,1),
   más específica— le cambiaba, y el panel es claro SIEMPRE. Las demás
   se quedan en (1,2,0) a propósito, para que el media query de móvil
   de más abajo pueda ganarles la anchura. */
#nav .dropdown-menu.dropdown-tasks,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu.dropdown-tasks {
  border: 1px solid var(--nb-line);
  background: var(--nb-paper);
  backdrop-filter: none; -webkit-backdrop-filter: none;
  box-shadow: 0 4px 10px rgba(20, 17, 31, 0.07),
              0 22px 48px -20px rgba(20, 17, 31, 0.34);
}
#nav .dropdown-menu.dropdown-tasks .dropdown-header {
  font-family: var(--nb-ff-d); font-weight: 600;
  font-size: 0.92rem; color: var(--nb-ink);
  background: var(--nb-paper-2);
  border-bottom: 1px solid var(--nb-line);
  padding: 13px 16px; margin: 0;
  display: flex; align-items: center; gap: 9px;
}
#nav .dropdown-menu.dropdown-tasks .dropdown-header i {
  color: var(--nb-violet); font-size: 0.95rem;
}
#nav .dropdown-menu.dropdown-tasks ul { margin: 0; padding: 0; list-style: none; }
#nav .dropdown-menu.dropdown-tasks li > a {
  display: grid;
  grid-template-columns: 22px 1fr; gap: 4px 11px;
  align-items: start;
  padding: 14px 16px;
  font-family: var(--nb-ff-b);
  font-size: 0.92rem !important;   /* Croster: .dropdown-scroll li a{font-size:14px !important} */
  line-height: 1.5; text-decoration: none;
  border-bottom: 1px solid var(--nb-line);
  transition: background 0.2s ease;
}
#nav .dropdown-menu.dropdown-tasks li:last-child > a { border-bottom: 0; }
#nav .dropdown-menu.dropdown-tasks li > a:hover {
  background: var(--nb-paper-2) !important;   /* Croster: .dropdown-tasks li a:hover{background-color:#edf0f5 !important} */
}
/* la tinta, también sobre cabecera oscura: el panel es claro */
#nav .dropdown-menu.dropdown-tasks li > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu.dropdown-tasks li > a,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu.dropdown-tasks li > a span,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .dropdown-menu.dropdown-tasks .dropdown-header {
  color: var(--nb-ink-2) !important;   /* Croster: .dropdown-scroll li a{color:#211b65 !important} */
}
#nav .dropdown-menu.dropdown-tasks li > a > i {
  grid-column: 1; margin-top: 2px; font-size: 0.95rem;
}
/* Bootstrap declara `.text-*{color:… !important}`: no hay otra */
#nav .dropdown-menu.dropdown-tasks li > a > i.text-info    { color: var(--nb-blue) !important; }
#nav .dropdown-menu.dropdown-tasks li > a > i.text-danger  { color: #C4453F !important; }
#nav .dropdown-menu.dropdown-tasks li > a > i.text-warning { color: #B87C0A !important; }
/* el botón, en su propia línea y dentro de la caja */
#nav .dropdown-menu.dropdown-tasks li > a > .btn {
  grid-column: 2; justify-self: start; margin-top: 9px;
  background: var(--nb-grad); border: 0;
  color: #fff;
  font-family: var(--nb-ff-d); font-weight: 600;
  font-size: 0.82rem; border-radius: 9px;
  padding: 8px 15px !important;   /* Croster: .dropdown-scroll li a .btn{padding:4px 10px !important} */
  min-height: 36px;
  /* En el hook, `background:… !important` expandía a `background-clip:
     border-box !important` y se comía este `padding-box`. Ahora aplica,
     como se pretendía; sin borde, no cambia ni un píxel. */
  background-clip: padding-box; -webkit-background-clip: padding-box;
  white-space: nowrap; box-shadow: none;
}
#nav .dropdown-menu.dropdown-tasks li > a > .btn:hover { filter: brightness(1.06); }
/* si no hay nada que avisar */
#nav .dropdown-menu.dropdown-tasks .no-tasks,
#nav .dropdown-menu.dropdown-tasks li > a.text-center {
  color: var(--nb-ink-3); justify-items: center;
  grid-template-columns: 1fr;
}
@media (max-width: 575px) {
  #nav .dropdown-menu.dropdown-tasks { min-width: 0; width: calc(100vw - 32px); max-width: none; }
}

/* ── quien pide menos movimiento ───────────────────────────────── */
/* `!important` JUSTIFICADO: esta regla existe para ganar a todas las
   transiciones de la barra y del panel, incluidas las que alguien
   añada mañana. Es la única propiedad de esta hoja donde la fuerza
   bruta es la intención. */
@media (prefers-reduced-motion: reduce) {
  #nav *, .navbar-side * { transition: none !important; }
}


/* ══════════════════════════════════════════════════════════════════
   EL ESTADO DE SCROLL, CONDUCIDO POR EL NAVEGADOR

   QUÉ HACÍA FALTA. Al bajar, la isla pasa de translúcida a clara y la
   tinta gira de #F2F3FB a #14111F. Hasta ahora eso lo decidía un
   listener de `scroll` en JavaScript que añadía la clase `nb-scrolled`
   al cruzar un umbral: un salto brusco, calculado en el hilo principal,
   en cada gesto de scroll de cada visitante.

   QUÉ HACE AHORA. Una sola variable registrada, `--nb-scroll`, va de 0
   a 1 en los primeros 72 px de recorrido, y de ella cuelgan el fondo,
   el filo y la tinta. La conduce `animation-timeline: scroll()`: el
   navegador YA conoce la posición del scroll, así que no hay nada que
   calcular ni ningún evento que atender. Y como la anima el compositor,
   no compite con el resto de la página.

   POR QUÉ 72 px Y NO UN SALTO. Con la posición disponible como número
   continuo, mantener el salto sería desaprovecharla. El fundido corto
   se lee como peso, no como un parpadeo.

   SOPORTE, medido en septiembre de 2026: Chrome y Edge desde la 115,
   Safari desde la 26 (septiembre de 2025, así que iOS entra). Firefox
   todavía no: sigue tras bandera en la 152. Por eso todo va dentro de
   `@supports`. Donde no hay soporte NO se rompe nada: sigue mandando la
   clase `nb-scrolled`, que pone `netebu-barra.js`, exactamente como
   hasta hoy. El modo de fallo es «no hay animación», no «página rota».

AQUÍ NO HAY UN SOLO `!important`, y hasta hoy había cinco. Existían
   para ganar a las reglas equivalentes de `netebu_navbar.php`, que las
   declaraba también con `!important`. Retirado el hook, sus únicos
   rivales son reglas de esta misma hoja —las de la isla, más arriba—,
   a las que estas ganan por especificidad y por orden. Comprobado
   además en el navegador que ninguna regla ajena con `!important`
   alcanza a estas propiedades: las de Croster que llegan a la barra
   son `border-radius`, `box-shadow`, `outline`, `text-decoration` y
   `text-shadow`, ninguna de las que se tocan aquí.

   LO QUE NO SE ANIMA AQUÍ, y es deliberado:
     · la sombra, que no interpola bien por `calc()`; la cambia la regla
       de `nb-scrolled` de más arriba, y una sombra no se percibe saltar
       como sí lo hace un color.
     · el logotipo, que alterna con `display` y por tanto no es animable.
       Su umbral se subió de 12 a 36 px —la mitad de 72— para que gire
       cuando el contraste del fondo ya ha girado.
   ══════════════════════════════════════════════════════════════════ */

/* LA TINTA DE REPOSO: BLANCA HASTA QUE EL FONDO CRUZA LA MITAD.

   Esta regla GANA a la animada de abajo mientras no haya `nb-scrolled`, y
   es a propósito. Su `:not(.nb-scrolled)` cuenta como una clase, así que
   queda en (1,5,3) frente a la animada en (1,4,3); con `!important` en
   las dos, manda esta. Efecto: de 0 a 36 px el texto se queda blanco
   mientras el fondo va aclarando; a los 36, el hook añade `nb-scrolled`,
   esta regla deja de aplicar y la animada toma el relevo a media mezcla
   y termina en tinta oscura a los 72.

   NO ES UN DESCUIDO, Y SE PROBÓ LO CONTRARIO ANTES DE DEJARLO ASÍ. Un
   fondo que pasa de oscuro a claro pide un texto que AGUANTE claro
   mientras el fondo siga mayormente oscuro y cambie cuando el fondo
   cruce la mitad. Se probó el «texto y fondo en el mismo reloj» —el
   texto fundiéndose desde el primer píxel— y a mitad de recorrido se
   cruzan en gris sobre gris: peor contraste que el salto. Y se probó
   igualar especificidades con `:where()` para que la animada mandara
   desde 0: eso destapó lo de abajo.

   LO QUE NO SE PUEDE HACER, medido en el navegador del usuario con
   sesión e historial reales (03-09-2026): en los enlaces VISITADOS
   —la casa, el carrito, el botón de salir, que apuntan a URLs reales,
   no a `#`— cualquier `color` que dependa de una propiedad ANIMADA se
   pinta violeta arriba del todo, aunque `getComputedStyle` diga blanco.
   Pasa con `color-mix()` sobre `--nb-scroll` y pasa igual con una
   `@property` de tipo `<color>` animada. Es el pase privado de
   `:visited` de Chrome, que no aplica animaciones y no deja leer el
   resultado. Solo sobrevive un `var()` estático como este. Por eso
   esta regla tiene que ser la que mande arriba del todo, y por eso no
   hay que «arreglarla». */
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav > li > a,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav > li > a .caret,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .user_icon > a,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .cart-icon a,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav [class*="Cart"] > a,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav li > a[href*="logout"],
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) .navbar-toggler {
  color: var(--nb-on);
}

@property --nb-scroll {
  syntax: "<number>";
  inherits: true;
  initial-value: 0;
}

@keyframes nb-al-bajar {
  to { --nb-scroll: 1; }
}

@supports (animation-timeline: scroll()) {

  body.nb-hero {
    animation: nb-al-bajar linear both;
    animation-timeline: scroll(root block);
    animation-range: 0 72px;
  }

  /* El cristal. En escritorio vive en `::after` con `z-index:-1`, porque
     `backdrop-filter` sobre `#nav` lo convierte en backdrop root y el
     desplegable dejaba ver el texto de debajo a través de sí mismo. En
     móvil vive en el propio `#nav`. Dos sitios, un solo recorrido. */
  @media (min-width: 992px) {
    body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar::after {
      background: rgb(255 255 255 / calc(0.06 + 0.80 * var(--nb-scroll)));
      transition: none;
    }
  }
  @media (max-width: 991px) {
    body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar {
      background: rgb(255 255 255 / calc(0.06 + 0.91 * var(--nb-scroll)));
    }
  }

  /* El filo: rgba(255,255,255,0.16) -> #E9E4F3 */
  body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar {
    border-color: color-mix(in srgb,
      var(--nb-line) calc(var(--nb-scroll) * 100%),
      rgb(255 255 255 / 0.16));
  }

  /* LA TINTA CONMUTA, NO SE FUNDE, Y ESTO SE APRENDIÓ MIRANDO.
     Aquí había un `color-mix()` que llevaba la tinta de #F2F3FB a
     #14111F a la vez que el fondo. Suena bien y está mal: a mitad de
     recorrido el texto es gris medio sobre un fondo gris medio y los
     enlaces se vuelven ilegibles. Medido con lupa a 36 px: «Dominios»,
     «Hosting» y «Servidores» casi no se leían.

     Un texto no puede cruzar por el punto en que se parece a su fondo.
     Así que el FONDO se funde —ahí el gradiente sí aporta— y la TINTA
     conmuta de golpe en `nb-scrolled`, es decir a los 36 px, que es
     justo donde el fondo cruza la mitad y donde ya gira el logotipo.
     Todo cambia a la vez, y no hay ningún instante ilegible.

     El blanco de reposo lo pone la base de más arriba, con
     `:not(.nb-scrolled)`; esta es su pareja para el otro lado. Misma
     lista de elementos que ella: si uno entra en una, entra en la otra. */
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav .navbar-nav > li > a,
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav .navbar-nav > li > a .caret,
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav .user_icon > a,
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav .cart-icon a,
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav [class*="Cart"] > a,
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) #nav li > a[href*="logout"],
  body.nb-hero.nb-scrolled:not(.login):not(.nb-claro) .navbar-toggler {
    color: var(--nb-ink);
  }

  /* Quien pide menos movimiento no pide menos legibilidad: la barra
     sigue cambiando con el scroll, pero sin recorrido intermedio.

     EL RANGO ES 36-37 Y NO 0-1, Y ESTO SE MIDIÓ. El logotipo lo cambia el
     hook al cruzar los 36 px, con `display`, fuera de esta animación. Con
     el snap en 1 px la barra se volvía sólida a los 10 px y el logotipo
     seguía siendo la versión blanca hasta los 36: logo blanco sobre barra
     blanca durante 26 px de scroll, invisible. Haciendo que el snap caiga
     justo donde cambia el logotipo, todo cambia a la vez, como antes. */
  @media (prefers-reduced-motion: reduce) {
    body.nb-hero { animation-range: 36px 37px; }
  }
}


/* ══════════════════════════════════════════════════════════════════
   LA FRANJA DE TABLET: LA ISLA SE CIÑE A LO QUE LLEVA DENTRO

   EL HUECO. La geometría de la barra cambia en 767 px y su
   comportamiento en 991: entre esos dos números hay 224 px de pantalla
   donde la isla tiene márgenes y radio de escritorio pero menú, cristal
   y hamburguesa de móvil. Nadie decidió que fuera así; es lo que queda
   cuando dos media queries de ficheros distintos cortan en sitios
   distintos.

   POR QUÉ NO SE ARREGLA MOVIENDO EL CORTE. Lo primero que parece es
   subir el menú horizontal a 768 y acabar con la franja. Medido: el
   menú necesita 902 px y a 768 quedan 397 libres. No es que quepa
   apretado, es que no cabe. Y bajar la geometría a móvil tampoco
   resuelve nada, porque el problema real no es el radio.

   EL PROBLEMA REAL, que solo se ve mirando. A 900 px la isla mide 868
   y su contenido 836... de los cuales 500 son aire: logo a la
   izquierda, dos iconos a la derecha y un vacío enorme en medio. La
   isla no está mal proporcionada, está VACÍA.

   QUÉ SE HACE. En esa franja la barra deja de ocupar todo el ancho y
   se ciñe a su contenido, centrada. Medido: pasa de 736-959 px a 421,
   con el hero visible a los lados.

   POR QUÉ SIN `transform`. El hook ya declara `margin-inline:auto`, así
   que con `left:16px; right:16px` y un ancho menor que el hueco, el
   margen automático la centra solo. Un `transform` sobre un elemento
   con `backdrop-filter` crearía además un contexto de apilamiento que
   aquí no hace falta.

   VA FUERA DEL `@supports` de arriba a propósito: esto es geometría, no
   animación, y tiene que aplicarse en todos los navegadores.
   ══════════════════════════════════════════════════════════════════ */

@media (min-width: 768px) and (max-width: 991px) {
  body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar {
    width: max-content;
    max-width: calc(100% - 32px);
    padding-inline: 10px;
  }

  /* EL PANEL LATERAL TIENE QUE SEGUIR A LA ISLA, Y ESTO SE VIO TARDE. El
     hook lo coloca en `left:12px` (netebu_navbar.php:475), que era
     correcto mientras la barra ocupaba todo el ancho y su botón estaba
     pegado al borde. Con la isla contenida y centrada, el botón queda en
     x≈266 a 900 px y el panel se abría en x=12: 253 px de desfase,
     medido. Un panel que no cuelga de su botón no parece suyo.

     Se centra con la misma lógica que la isla —`50%` menos la mitad de su
     ancho, que el hook fija en `min(84vw,330px)`—, así queda dentro del
     vano de la isla en toda la franja. Y hay que reescribir también el
     estado cerrado: el `translateX(calc(-100% - 16px))` del hook
     (:530) partía de `left:12px`; desde el centro dejaba 200 px del
     panel asomando. El abierto no se toca: el hook pone `transform:none`
     en `.display` y desde `left` centrado eso ya es el sitio correcto.
     Los dos `!important` que llevaban estas reglas peleaban con el hook
     (:475 y :530) y se fueron con él: hoy sus rivales son las reglas del
     panel de más abajo, de esta misma hoja, a las que ganan por
     especificidad. */
  body.nb-hero:not(.login):not(.nb-claro) .navbar-side {
    left: calc(50% - min(84vw, 330px) / 2);
  }
  body.nb-hero:not(.login):not(.nb-claro) .navbar-side:not(.display):not(.show):not(.open) {
    transform: translateX(calc(-50vw - 100% - 16px));
  }
}


/* ══════════════════════════════════════════════════════════════════
   EL RECORTE DEL IPHONE

   Con `viewport-fit=cover` en el meta viewport (header.tpl), la página
   se extiende bajo el recorte de la cámara y bajo el indicador de
   inicio. Es lo que queremos para los fondos —el hero llega hasta el
   borde físico, como en una app— pero todo lo que está FIJO a un borde
   tiene que apartarse: la isla, el panel lateral y la última línea del
   pie. Antes de este cambio `env(safe-area-inset-top)` valía 0 en todos
   los dispositivos, medido; el recorte no existía para esta web.

   `max(10px, env(...))` conserva exactamente lo de antes donde no hay
   recorte —Android, escritorio, iPad— y solo se mueve donde lo hay. En
   retrato, el recorte está arriba (≈47-59 px); en apaisado, a los lados
   (≈47-59 px) y el indicador abajo (≈21 px). Un iPhone apaisado mide
   844-932 px de ancho: cae en la franja de tablet, no en la de móvil,
   por eso las dos franjas llevan compensación.

   El `top` del panel repite la fórmula del hook (`--nb-nav-h + 12`)
   sumándole el recorte, de forma que sin recorte da los mismos 90 px
   de siempre. Los `!important` del panel pelean con :474-478 del hook,
   que los lleva; se van con ellos. Los de la isla no hacen falta: el
   hook no los usa ahí.

   Comprobado emulando el recorte con `Emulation.setSafeAreaInsetsOverride`
   en retrato (59/34) y apaisado (59 laterales, 21 abajo), antes de
   desplegar.
   ══════════════════════════════════════════════════════════════════ */

@media (max-width: 767px) {
  body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar {
    top:   max(10px, env(safe-area-inset-top));
    left:  max(10px, env(safe-area-inset-left));
    right: max(10px, env(safe-area-inset-right));
  }
  body.nb-hero:not(.login):not(.nb-claro) .navbar-side {
    top:  calc(max(10px, env(safe-area-inset-top)) + var(--nb-nav-h, 78px) + 2px) !important;
    left: max(12px, env(safe-area-inset-left)) !important;
    max-height: calc(100dvh - max(10px, env(safe-area-inset-top)) - var(--nb-nav-h, 78px) - 14px - env(safe-area-inset-bottom)) !important;
  }
}

@media (min-width: 768px) and (max-width: 991px) {
  body.nb-hero:not(.login):not(.nb-claro) #nav.cros-navbar {
    top:   max(14px, env(safe-area-inset-top));
    left:  max(16px, env(safe-area-inset-left));
    right: max(16px, env(safe-area-inset-right));
  }
  body.nb-hero:not(.login):not(.nb-claro) .navbar-side {
    top: calc(max(14px, env(safe-area-inset-top)) + var(--nb-nav-h, 78px) - 2px) !important;
    max-height: calc(100dvh - max(14px, env(safe-area-inset-top)) - var(--nb-nav-h, 78px) - 10px - env(safe-area-inset-bottom)) !important;
  }
}

/* ══════════════════════════════════════════════════════════════════
   EL FOCO SE VE

   El hook anula el anillo de foco del botón de menú
   (`.navbar-toggler:focus{box-shadow:none;outline:none}`, :453) y no
   dice nada del foco en el panel: ahí manda el tema, que al enfocar un
   enlace lo pinta con su color oscuro sobre el fondo oscuro del panel.
   Visto en captura con el drawer accesible (netebu-drawer.js): «Hosting»
   con el foco, casi invisible. Un foco que no se ve no es accesible
   (WCAG 2.4.7). `:focus-visible` y no `:focus`: el anillo aparece con
   teclado y no con el dedo.

   EL ÚNICO `!important` ES EL DEL `outline`, y está medido: Croster
   declara `a, a:focus, a:active, a:hover { outline: 0 none !important }`.
   Sin él no habría anillo de foco en ningún enlace de la barra. Los
   otros tres que había aquí peleaban con el hook y se fueron con él.
   ══════════════════════════════════════════════════════════════════ */
.navbar-side .side-nav > li > a:focus,
.navbar-side .side-nav ul > li > a:focus {
  color: var(--nb-on);
  background-color: rgba(255, 255, 255, 0.07);
}
.navbar-side .side-nav > li > a:focus-visible,
.navbar-side .side-nav ul > li > a:focus-visible,
.navbar-side .input-menu:focus-visible,
#nav .navbar-nav > li > a:focus-visible,
#nav .navbar-toggler:focus-visible {
  outline: 2px solid var(--nb-violet) !important;   /* Croster: a:focus{outline:0 none !important} */
  outline-offset: 2px;
  box-shadow: none;
}

/* ══════════════════════════════════════════════════════════════════
   ZONAS TÁCTILES DE 44 PX, SIN MOVER UN PÍXEL VISIBLE

   Medido en móvil (393 px): el botón de menú renderiza 23×40 —el hook
   le pone `width:40px` pero es `display:flex` y algo con más peso lo
   deja al ancho del contenido—, y carrito, campana y avatar 40×40. El
   mínimo de WCAG 2.5.5 y de las guías de Apple es 44×44.

   NO SE AGRANDAN LAS CAJAS. Agrandar el toggler desplazaría el logotipo
   21 px; agrandar el avatar ensancharía su anillo, que es el borde del
   propio enlace. En su lugar, cada uno lleva un pseudoelemento absoluto
   que sobresale 2 px por cada lado (11/10 en el toggler, que es más
   estrecho): el toque cae en el enlace, lo visible no cambia, y el
   oráculo —que mide la caja del elemento, no la del pseudo— tampoco.

   QUÉ PSEUDO Y POR QUÉ. En carrito, campana y avatar el `::after` ya lo
   ocupa el caret de Bootstrap (`.dropdown-toggle::after`, oculto por
   `.nocaret`); se usa `::before`, que está libre (medido). En el toggler
   ninguno está en uso (las rayas viven en su `<span>`).

   EL BADGE DE LA CAMPANA no se mueve: es `position:absolute` anclado al
   `<li>`, no al `<a>`, y ahí sigue. Se comprobó midiendo su desplazamiento
   antes y después. Hay 24 px entre iconos, así que las áreas no se
   solapan. Solo ≤991: en escritorio no hay toggler ni menú móvil.
   ══════════════════════════════════════════════════════════════════ */
@media (max-width: 991px) {
  #nav .navbar-toggler { position: relative; }
  #nav .navbar-toggler::after {
    content: ""; position: absolute;
    top: -2px; bottom: -2px; left: -11px; right: -10px;
  }
  #nav .secondary-menu-mobile > li > a { position: relative; }
  #nav .secondary-menu-mobile > li > a::before {
    content: ""; position: absolute; inset: -2px; border-radius: 50%;
  }
  /* El avatar lleva su anillo como borde de 1 px del propio enlace, y un
     `inset` absoluto se mide desde el borde INTERIOR: con -2px se quedaba
     en 42×42 y un toque a 1 px por la derecha o por abajo no caía en él
     (medido). Un píxel más por lado, solo aquí. */
  #nav .secondary-menu-mobile > li.user_icon > a::before { inset: -3px; }
}

/* ══════════════════════════════════════════════════════════════════
   F3.1 · LOS ICONOS DE ACCIÓN          (migrado de netebu_navbar.php)

   Procede de las líneas 707-806 del hook, donde llevaba 24 `!important`.
   Aquí no queda ninguno, y no por gusto: se midió con
   `CSS.getMatchedStylesForNode` contra qué competía cada uno.
     · El `col-md-2` de Soporte: el tema declara `max-width`, `width` y
       `padding` SIN `!important` y desde `.col-md-2`, que es (0,1,0);
       `#nav .navbar-nav > li` es (1,1,1) y gana por especificidad sola.
     · El `border:0` del botón de menú: NADIE declara ese borde. El
       `!important` no peleaba contra nada.
     · El resto compite con reglas del tema sin `!important`, y esta hoja
       carga la última del `<head>`.
   ══════════════════════════════════════════════════════════════════ */

/* EL ÚLTIMO ELEMENTO DEL MENÚ. «Soporte» viene con `col-md-2` desde el
   gestor de menús: una clase de rejilla que se coló al montarlo y le pone
   un ancho porcentual sobre el <ul>, así que según la pantalla el elemento
   mide de 96 a 230 px y su enlace, que es `block`, estira el fondo del
   hover por debajo del carrito y del avatar. Con ancho automático mide su
   texto. `width:auto` es imprescindible: las clases `col-*` traen
   `width:100%` y sin él el elemento pasaba de 96 px a 548.
   Solo en escritorio: en el panel móvil sí deben ocupar todo el ancho. */
@media (min-width: 992px) {
  #nav .navbar-nav > li {
    flex: 0 0 auto; width: auto; max-width: none;
    padding-left: 0; padding-right: 0;
  }
}

/* EL AVATAR Y EL CARRITO, en su estado de reposo. Vienen de las líneas
   427-444 del hook. Van juntos con lo de abajo por la misma razón que el
   botón de menú: son el mismo elemento repartido en dos sitios del
   fichero, y migrar media regla deja la otra media ganando. */
/* Los dos selectores nombran el <ul> a propósito. El avatar también es un
   `#nav .navbar-nav > li > a` —(1,1,2)—, y esa regla genérica del hook le
   ponía `border-radius:10px`; un `#nav .user_icon > a` es (1,1,1) y perdía.
   El hook lo resolvía con `!important`; nombrando la lista se llega a
   (1,2,2) y gana por especificidad, sin depender del orden ni del día en
   que esa regla genérica se migre también. La simulación lo cazó: el
   avatar pasaba de círculo a rectángulo redondeado. */
#nav .navbar-nav li.user_icon > a,
#nav .navbar-nav li.Secondary_Navbar-Account > a,
#nav .secondary-menu-mobile li.user_icon > a,
#nav .secondary-menu-mobile li.Secondary_Navbar-Account > a {
  border: 1px solid var(--nb-line-2); border-radius: 50%;
  width: 40px; height: 40px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--nb-ink);
  transition: border-color .22s ease, color .22s ease, transform .22s ease;
}
#nav .navbar-nav li.user_icon > a:hover,
#nav .secondary-menu-mobile li.user_icon > a:hover {
  border-color: var(--nb-violet); color: var(--nb-violet-aa);
  transform: translateY(-1px);
}

/* ARRIBA DEL TODO, EL CÍRCULO ES BLANCO. Y esto se me escapó al migrar
   la isla: di por redundante el bloque del hook que ponía este estado
   porque su `color` ya lo cubría la tinta de reposo… y el bloque
   también traía el `border-color`. Resultado: el círculo se quedaba en
   #D8D0EC —nuestro `--nb-line-2`, pensado para la barra clara— sobre
   la isla oscura. Lo cazó la simulación antes de desplegar.

   Es la primera ley de esta fase, otra vez: un elemento se migra
   ENTERO. Mirar solo la propiedad que uno tiene en la cabeza deja la
   otra mitad huérfana. */
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav li.user_icon > a,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile li.user_icon > a {
  border-color: rgba(255, 255, 255, .28);
}
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-nav li.user_icon > a:hover,
body.nb-hero:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile li.user_icon > a:hover {
  border-color: #fff; color: #fff;
}
#nav .cart-icon a,
#nav [class*="Cart"] > a {
  color: var(--nb-ink); transition: color .22s ease;
}
#nav .cart-icon a:hover { color: var(--nb-violet-aa); }

/* EL SEPARADOR VERTICAL, TAMBIÉN CON LOS DOS ESTADOS.

   La rayita que separa los enlaces de los iconos es un pseudoelemento
   del <ul> de acciones. Estaba en `rgba(255,255,255,0.16)` sobre el
   hero —tan tenue que casi no se veía— y en `#D8D0EC` sobre la isla
   clara, el mismo lila pálido que tenía el círculo del avatar.

   Ahora acompaña a la tinta: blanco legible arriba, tinta abajo. No usa
   `currentColor` como el avatar porque es un `background`, y el <ul>
   que lo hospeda no conmuta de color; los dos valores van explícitos.

   `body:not(.nb-hero)` cubre las páginas sin cabecera oscura, donde la
   barra es clara desde el primer momento. Solo ≥992: por debajo no hay
   separador, porque no hay enlaces a la izquierda que separar. */
@media (min-width: 992px) {
  /* Sin `!important` desde F3.5: el filo base —`var(--nb-line-2)`, en el
     bloque del área de cliente— vive ahora en esta misma hoja, y estas
     dos, con su clase de estado, le ganan por especificidad. */
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul#header::before,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav ul.navbar-nav.navbar-right::before {
    background: rgba(255, 255, 255, .42);
  }
  body.nb-scrolled #nav ul#header::before,
  body.nb-scrolled #nav ul.navbar-nav.navbar-right::before,
  body:not(.nb-hero) #nav ul#header::before,
  body:not(.nb-hero) #nav ul.navbar-nav.navbar-right::before {
    background: var(--nb-ink);
  }
}

/* EL CÍRCULO DEL AVATAR SIGUE A LA TINTA.

   El círculo que se ve NO es el borde del enlace —ese mide 0,55 px y no
   se aprecia—, sino el del propio icono: `i.fa-user` con
   `border:1.67px solid #D5DCE5`, uno de los grises de Croster. Sobre la
   barra clara quedaba casi invisible mientras el icono de dentro, el
   carrito y el botón de salir ya eran negros: desparejado.

   `currentColor` lo resuelve de una vez para los dos estados, porque el
   color del enlace ya conmuta con el scroll: negro sobre la isla clara,
   blanco sobre el hero. Una regla en lugar de dos, y ningún color
   literal que se quede desincronizado el día que cambie la paleta.

   `!important` porque el gris viene de `#d5dce5` declarado por el tema
   sobre el propio icono, y aquí no hay especificidad razonable que gane
   sin nombrar media cadena. */
#nav .user_icon .user-avatar i,
#nav .user_icon .avatar-navbar i,
#nav .Secondary_Navbar-Account .user-avatar i,
#nav .secondary-menu-mobile .avatar-navbar i {
  border-color: currentColor !important;
}

/* EL BOTÓN DE MENÚ, ENTERO. Procede de las líneas 446-453 del hook, que
   están fuera del bloque 707-806 pero gobiernan el mismo elemento: allí
   `padding:8px !important` y aquí abajo `padding:0` para móvil. Migrar
   solo la mitad dejaba el botón partido entre dos ficheros, y el
   `!important` de la otra mitad ganaba — la simulación lo cazó: 8 px de
   relleno de más y los iconos de la derecha desplazados 4 px.
   Un elemento se migra entero o no se migra.

   El `:focus` que anula el anillo viene tal cual del hook; se conserva
   para no cambiar comportamiento en esta fase, y el `:focus-visible` de
   más arriba en este mismo fichero sigue devolviendo el anillo al
   teclado, que es lo que importa para WCAG 2.4.7. */
.navbar-toggler {
  border: 0; color: var(--nb-ink);
  padding: 8px; border-radius: 10px;
  transition: background .2s ease;
}
.navbar-toggler:hover { background: var(--nb-paper-2); }
.navbar-toggler:focus { box-shadow: none; outline: none; }

/* El carrito, con la misma zona de pulsación que el avatar. */
#nav .cart-icon > a,
#nav [class*="Cart"] > a {
  width: 40px; height: 40px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  transition: background .2s ease, color .2s ease;
}
#nav .cart-icon > a:hover,
#nav [class*="Cart"] > a:hover {
  background: rgba(123, 92, 246, .12); color: var(--nb-violet-aa);
}
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .cart-icon > a:hover,
body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav [class*="Cart"] > a:hover {
  background: rgba(255, 255, 255, .14); color: #fff;
}

/* MÓVIL: LOS DOS ICONOS DE LA DERECHA. Viven en un <ul> de 102 px y sus
   dos elementos suman 98 más separaciones: en Chromium entran por los
   pelos, pero Safari redondea el texto de otra forma y NO caben, hacen
   `wrap` y se apilan — el carrito se sale por arriba de la isla y el
   avatar por abajo. `nowrap` con ancho automático lo impide en los dos.

   Y el color hay que decírselo a los HIJOS. Se pone en el <button> y en
   el <a>, pero el glifo va dentro de un <span> o un <i> que traen color
   propio del tema y no lo heredan: por eso las tres barras del menú se
   veían moradas sobre el fondo oscuro en vez de blancas. */
@media (max-width: 991px) {
  #nav .secondary-menu-mobile {
    display: flex; flex-wrap: nowrap; align-items: center; gap: 4px;
    width: auto; margin: 0; padding: 0;
  }
  #nav .secondary-menu-mobile > li {
    flex: 0 0 auto; width: auto;
    /* EL ÚNICO `!important` DE ESTE BLOQUE, y no pelea contra Croster: el
       <li> del carrito lleva la clase `mr-1` del gestor de menús, y las
       utilidades de espaciado de Bootstrap se declaran con `!important`
       por convención del framework —`.mr-1,.mx-1{margin-right:.25rem
       !important}`—. Sin esto el <ul> crecía 4 px, y al crecer dejaba
       menos sitio al botón de menú, que encogía otros 0,75. La simulación
       lo cazó como dos diferencias distintas; era una sola causa. */
    margin: 0 !important;
    display: flex; align-items: center;
  }
  #nav .secondary-menu-mobile > li > a {
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; padding: 0; border-radius: 50%;
    transition: background .2s ease;
  }
  #nav .secondary-menu-mobile .fa-shopping-cart { font-size: 18px; }
  #nav .navbar-toggler {
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; padding: 0; border: 0;
  }

  /* arriba del todo, sobre la cabecera oscura */
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-toggler,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .navbar-toggler *,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile a,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile i,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile span {
    color: var(--nb-on);
  }
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .user-avatar,
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .avatar-navbar {
    border-color: rgba(255, 255, 255, .34);
  }

  /* al bajar, sobre la isla clara */
  body.nb-scrolled #nav .navbar-toggler,
  body.nb-scrolled #nav .navbar-toggler *,
  body.nb-scrolled #nav .secondary-menu-mobile a,
  body.nb-scrolled #nav .secondary-menu-mobile i,
  body.nb-scrolled #nav .secondary-menu-mobile span,
  body:not(.nb-hero) #nav .navbar-toggler,
  body:not(.nb-hero) #nav .navbar-toggler * {
    color: var(--nb-ink);
  }

  #nav .secondary-menu-mobile > li > a:hover { background: rgba(123, 92, 246, .14); }
  body:not(.login):not(.nb-claro):not(.nb-scrolled) #nav .secondary-menu-mobile > li > a:hover {
    background: rgba(255, 255, 255, .14);
  }
}

/* ══════════════════════════════════════════════════════════════════
   F3.2 · EL PANEL LATERAL DEL MÓVIL     (migrado de netebu_navbar.php)

   Procede de las líneas 429-626 del hook, donde llevaba 68 `!important`.
   Se conservan sus comentarios: documentan mediciones, no decoran.
   Los `!important` que sobrevivan aquí abajo llevan escrito contra qué
   pelean; el resto se quitaron y la simulación confirmó que no movían
   nada.

   El bloque de `prefers-reduced-motion` llegó en F3.5, con la barra ya
   migrada; está al final del bloque del área de cliente.
   ══════════════════════════════════════════════════════════════════ */

/* ══ panel lateral en movil ════════════════════════════════ */
/* Croster lo pinta en #edf0f5 y lo deja en 270 px fijos. */
.navbar-side{
  background:var(--nb-night);
  width:min(86vw, 340px);
  border-right:1px solid rgba(255,255,255,0.08);
  box-shadow:0 0 60px rgba(0,0,0,0.5);
  /* EL TEMA LO ESCONDE CON `translateX(-280px)`, UN VALOR FIJO
     calculado para su ancho original de 270 px. Al ensancharlo a 335
     quedaban 55 px asomando por la izquierda EN TODAS LAS PAGINAS,
     con el panel cerrado. Con -100% se esconde entero sea cual sea
     el ancho. La clase que lo abre (`.display`) lo devuelve a 0.  */
  transition:transform 0.3s ease;
  /* PANEL FLOTANTE: separado de la barra y de los bordes, como una
     tarjeta. La altura de la barra la publica el script en
     `--nb-nav-h`; aqui un desajuste de unos pixeles no se nota,
     porque la separacion es intencionada —al contrario que cuando
     iba pegado, donde cualquier desfase se veia como una franja
     blanca—.                                                     */
  /* `!important` JUSTIFICADO: el tema declara `.navbar-side{top:0
     !important}`. Sin esto, en escritorio el panel se quedaba con top:0
     en lugar de colgar de la barra. Hoy no se ve —lleva `d-lg-none`—,
     pero un panel mal anclado esperando a que alguien mueva el
     breakpoint es una bomba silenciosa. El oráculo lo cazó: 93px → 0. */
  top:calc(var(--nb-nav-h, 78px) + 12px) !important;
  left:12px; right:auto;
  width:min(84vw, 330px);
  height:auto;
  max-height:calc(100dvh - var(--nb-nav-h, 78px) - 24px);
  border-radius:18px;
  border:1px solid rgba(255,255,255,0.10);
  box-shadow:0 26px 64px -18px rgba(0,0,0,0.7),
             0 2px 8px rgba(0,0,0,0.4);
  z-index:1020;
}
/* ── EL VELO DEL MENU MOVIL ─────────────────────────────────
   El panel abierto se recortaba contra la pagina viva: se veian el
   buscador de dominios y los chips de extensiones justo al lado, y
   los dos competian. Faltaba el velo, que el tema no trae.

   NO puede colgar del propio panel: `.navbar-side` lleva
   `transform`, y un elemento con transform crea contenedor para sus
   descendientes `position:fixed` —el velo quedaria atrapado dentro
   del panel en vez de cubrir la pantalla—. Por eso va en la raiz,
   con una clase que pone el script al abrirse el menu.

   `pointer-events:none` a proposito: el tema no cierra el menu al
   tocar fuera, y un velo que traga el toque sin cerrar nada seria
   peor que no tenerlo. */
html.nb-menu-abierto::before{
  content:""; position:fixed; inset:0; z-index:1010;
  background:rgba(6,5,14,0.62);
  -webkit-backdrop-filter:blur(2px); backdrop-filter:blur(2px);
  pointer-events:none;
  animation:nb-velo 0.25s ease both;
}
@keyframes nb-velo{from{opacity:0} to{opacity:1}}
@media (prefers-reduced-motion:reduce){
  html.nb-menu-abierto::before{animation:none}
}
@media (min-width:992px){ html.nb-menu-abierto::before{display:none} }

/* ── EL "AREA DE CLIENTES" DUPLICADO DEL PANEL MOVIL ────────
   El panel movil listaba DOS entradas para lo mismo:

     li.home-item          "Área de Clientes"  -> /clientarea.php
     li.dropdown-megamenu  "Área de Cliente"   -> las cinco columnas

   La primera NO viene del gestor de menus —no lleva
   `data-menuitemname`—: la escribe la plantilla del tema como
   enlace fijo. La segunda es el megamenu, que ya contiene "Panel
   Principal", o sea el MISMO destino, ademas de Netebu Cloud,
   Dominios, Hosting y Facturacion. Sobra la del tema.

   Se oculta por CSS y no en el gestor porque ahi no aparece: no es
   suya. (La tilde que le faltaba al megamenu ya se corrigio en
   mod_adminpanel_cmegamenu, relid 147.) */
.navbar-side li.home-item{display:none}

/* al cerrarse tiene que salirse del todo, contando ese margen */
.navbar-side{transform:translateX(calc(-100% - 16px))}
/* EL ESTADO ABIERTO NO NECESITA REGLA. El tema ya declara
   `.navbar-side.display{transform:none !important}`, que es lo mismo que
   `translateX(0)` y además gana con `!important`. El hook llevaba aquí un
   `translateX(0) !important` que nunca hacía nada. Se conservan `.show` y
   `.open` porque el tema solo cubre `.display` y el script del panel
   reconoce las tres. */
.navbar-side.show,
.navbar-side.open{transform:translateX(0)}
/* slimScroll fija una altura al vuelo —378 px— y el panel se
   quedaba a media pantalla. Ademas su gestion de scroll compite con
   la del navegador y el submenu de Soporte no se podia recorrer.
   Se aparta: el scroll lo lleva el panel entero, que es lo simple y
   lo que funciona en cualquier movil. */
.navbar-side{
  overflow-y:auto; overflow-x:hidden;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
}
.navbar-side .slimScrollDiv,
.navbar-side .sidebar-scroll{
  width:100%; background:transparent;
  height:auto; max-height:none;
  overflow:visible;
}
.navbar-side .slimScrollBar,
.navbar-side .slimScrollRail{display:none}
/* aire al final para que el ultimo submenu no quede pegado abajo */
.navbar-side .side-nav{padding-bottom:40px}
.navbar-side .media-search{
  background:transparent;
  border-bottom:1px solid rgba(255,255,255,0.09);
  padding:14px 16px;
}
/* El input del panel es `.input-menu`, no `.form-control`, y el
   tema lo pinta con: hace falta mas especificidad.
   Se queda BLANCO: sobre el panel oscuro destaca y se ve mejor que
   translucido, que es como estaba y no acababa de leerse.        */
nav.navbar-side .media-search input.input-menu,
.navbar-side .input-menu,
.navbar-side .media-search input,
.navbar-side .media-search .form-control,
.navbar-side .input-icon input,
.navbar-side input[type="text"],
.navbar-side input[type="search"]{
  /* `!important` JUSTIFICADO: el tema declara
     `.navbar-side .media-search .input-menu{background-color:#fafbfc
     !important}`. Contra un `!important` no hay especificidad ni orden
     que valgan; es la única salida sin tocar el LESS. Sin esto el campo
     quedaba en #FAFBFC en vez de blanco: sutil, pero medido. */
  background:var(--nb-paper) !important;
  border:1px solid var(--nb-line-2);
  border-radius:11px; color:var(--nb-ink);
  font-family:var(--nb-ff-b); height:44px;
}
.navbar-side .input-menu::placeholder,
.navbar-side .media-search .form-control::placeholder{color:var(--nb-ink-3)}
.navbar-side .media-search .fa-search{color:var(--nb-ink-3)}
.navbar-side .media-search i{color:var(--nb-on-3)}

/* Croster pinta los <li> y sus enlaces con fondos CLAROS propios
   (#edf0f5 y blanco). Con el panel en oscuro, el texto blanco caia
   sobre esos fondos claros y quedaba ilegible. Hay que apagarlos
   todos, no solo el del panel.                                    */
.navbar-side .side-nav,
.navbar-side .side-nav > li,
.navbar-side .side-nav > li > a,
.navbar-side .side-nav ul,
.navbar-side .side-nav ul li,
.navbar-side .side-nav ul li a,
.navbar-side .panel,
.navbar-side .panel-collapse,
.navbar-side .panel-body,
.navbar-side .card,
.navbar-side .list-group-item{
  background-color:transparent;
  background-image:none;
  box-shadow:none;
  border-color:transparent;
}
.navbar-side .side-nav{padding:6px 10px}
/* El segundo selector NO es redundante: los <li> del acordeón llevan la
   clase `panel`, y el tema declara `.navbar-side .side-nav li.panel
   {border-width:0}` —(0,3,1)— que gana a un `> li` de (0,2,1). Nombrando
   la clase se empata y decide el orden, que ya es nuestro. El hook lo
   resolvía con `!important`; la simulación lo cazó midiendo el <li>: cada
   uno perdía 1 px y el panel entero 4. */
.navbar-side .side-nav > li,
.navbar-side .side-nav > li.panel{
  border-bottom:1px solid rgba(255,255,255,0.07);
  /* El <li> de Soporte lleva ademas `col-md-2`, que le mete relleno
     lateral de rejilla y lo desalinea respecto a los otros cinco. */
  padding-left:0; padding-right:0;
  max-width:none; flex:none;
}
.navbar-side .side-nav > li:last-child{border-bottom:0}
.navbar-side .side-nav > li > a{
  font-family:var(--nb-ff-d);
  font-size:1.1rem; font-weight:600;
  color:var(--nb-on);
  padding:15px 12px; border-radius:11px;
  display:flex; align-items:center; justify-content:space-between;
  transition:background 0.2s ease, color 0.2s ease;
}
.navbar-side .side-nav > li > a:hover,
.navbar-side .side-nav > li.active > a{
  background-color:rgba(255,255,255,0.07);
  color:var(--nb-on);
}
.navbar-side .side-nav ul{background-color:rgba(255,255,255,0.03)}
/* Las flechas apuntan a la izquierda («<») cuando lo que hacen es
   abrir hacia abajo. Se giran 90 grados y giran otra vez al abrir. */
.navbar-side .side-nav > li > a .arrow,
.navbar-side .side-nav > li > a [class*="fa-angle"],
.navbar-side .side-nav > li > a [class*="fa-chevron"]{
  color:var(--nb-on-3); font-size:0.95rem;
  transition:transform 0.24s ease, color 0.24s ease;
  transform:rotate(-90deg);
}
.navbar-side .side-nav > li.active > a .arrow,
.navbar-side .side-nav > li[aria-expanded="true"] > a .arrow{
  transform:rotate(90deg); color:var(--nb-violet);
}
/* submenus del panel */
.navbar-side .side-nav ul{
  background:rgba(255,255,255,0.03);
  border-radius:11px; margin:0 0 8px; padding:5px 0;
  list-style:none;
}
.navbar-side .side-nav ul li a{
  font-family:var(--nb-ff-b); font-size:1.02rem;
  color:var(--nb-on-2); padding:10px 14px 10px 24px;
  display:flex; align-items:center; gap:10px;
  transition:color 0.2s ease, padding-left 0.2s ease;
}
.navbar-side .side-nav ul li a:hover{
  color:var(--nb-on); padding-left:28px;
}
.navbar-side .side-nav ul li a i{color:var(--nb-violet); width:16px; text-align:center}

/* EL SUBMENÚ ABIERTO. Regresión de F3.2 que ni la simulación ni el oráculo
   cazaron, porque en ambos el acordeón estaba CERRADO: al abrirlo, el
   toggle, el <ul> y sus enlaces salían en #8F1FAF, el morado de Croster.

   El tema lo pinta desde dos reglas de especificidad alta, y los
   `!important` del hook eran lo único que las tapaba:
     `.navbar-side .side-nav li.panel.open a{background-color:#8f1faf}` (0,4,2)
     `.navbar-side .side-nav .nav{background:#8f1faf}`                  (0,3,0)
   Mis reglas migradas son (0,2,1) y perdían. Se igualan nombrando las
   clases que el tema ataca —`ul.nav`, `li.panel.open`— en lugar de subir
   a `!important`: (0,3,1) y (0,4,2)/(0,4,3), que ganan por especificidad
   o empatan y ganan por orden.

   LECCIÓN: un bloque con estados —acordeón, desplegable, pestaña— hay que
   medirlo ABIERTO. El oráculo mide el panel cerrado, así que esto no lo
   ve nadie salvo que se mire. */
.navbar-side .side-nav ul.nav {
  background: rgba(255, 255, 255, .03);
}
.navbar-side .side-nav li.panel.open > a {
  background-color: rgba(255, 255, 255, .07);
  color: var(--nb-on);
}
.navbar-side .side-nav li.panel.open ul li a {
  background-color: transparent;
  color: var(--nb-on-2);
}
.navbar-side .side-nav li.panel.open ul li a:hover {
  color: var(--nb-on);
}
.navbar-side .home-item > a{color:var(--nb-violet-aa)}


/* La última línea del pie, para que el indicador de inicio no la tape.
   Está aquí y no en netebu_footer.php porque es consecuencia directa del
   `viewport-fit=cover` que activa esta hoja; sin recorte, `env()` es 0 y
   quedan los 20 px de siempre. Misma especificidad que la regla del hook
   (:231), y esta hoja carga después. */
.sec.footer .footer-last {
  padding-bottom: calc(20px + env(safe-area-inset-bottom));
}
