/* ==========================================================================
   ft-movil.css — FlexigoTech · movil de verdad y bloques de codigo
   10-09-2026

   Esta hoja hace tres cosas y nada mas (las secciones 2.12 a 2.14 van al final
   del fichero, detras de la 3, porque se anadieron despues de medir; el orden
   de la cascada no las afecta, todas van con !important dentro de su media
   query):

     1. BLOQUES DE CODIGO. <pre class="article-code"> no tenia NI UNA regla en
        todo el sitio: el navegador aplicaba su white-space:pre por defecto y
        las lineas largas se salian del articulo. En movil el texto quedaba
        cortado por el borde y era imposible llegar a el, porque el bloque no
        tenia scroll propio. Ahora cada bloque hace scroll dentro de si mismo
        y se puede alcanzar con el teclado.

     2. DESBORDAMIENTO HORIZONTAL. Se ataca el elemento que lo causa, uno por
        uno. NUNCA con overflow:hidden en <body>: eso no arregla el ancho, solo
        esconde la parte del contenido que se sale y ademas rompe el
        position:sticky de la cabecera.

     3. EL PANEL DEL MENU MOVIL. Que la altura la ponga el viewport real del
        movil (dvh) y que el panel no se coma la barra del sistema.

   NO se toca la paleta. Fondo blanco.
   ========================================================================== */

/* ==========================================================================
   1. BLOQUES DE CODIGO — scroll propio, y alcanzables
   ========================================================================== */

pre,
pre.article-code,
.code-block {
  /* El ancho manda el contenedor, no la linea mas larga. */
  max-width: 100% !important;
  box-sizing: border-box;
  /* Scroll propio: la linea larga se recorre dentro del bloque, sin arrastrar
     la pagina entera hacia la derecha.
     Va con !important porque esta hoja se carga arriba del <head> y varias
     paginas traen su propio <style> con reglas para `pre` mas abajo: a igual
     especificidad ganaban ellas y el bloque volvia a desbordarse (medido:
     744px de ancho en /sincronizar-stock-fba-odoo.html a 320px). */
  overflow-x: auto !important;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  /* En un contenedor flex o grid, min-width:auto impide encoger. */
  min-width: 0;
}

pre.article-code,
.article-content pre {
  margin: 22px 0 28px;
  padding: 18px 20px;
  background: #0F172A;
  color: #E2E8F0;
  border: 1px solid #1E293B;
  border-radius: 12px;
  font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13.5px;
  line-height: 1.65;
  tab-size: 2;
}

pre.article-code code,
.article-content pre code,
.code-block code {
  display: block;
  background: none;
  padding: 0;
  border: 0;
  color: inherit;
  font: inherit;
  /* Dentro de un pre las lineas NO se parten: para eso esta el scroll. */
  white-space: pre;
  min-width: 0;
}

/* Un bloque con scroll es una region que hay que poder recorrer con el
   teclado. El tabindex="0" va en el HTML de los articulos; aqui se le da un
   foco visible para que se vea donde esta uno. */
pre[tabindex]:focus-visible,
.code-block[tabindex]:focus-visible {
  outline: 2px solid #6366F1;
  outline-offset: 2px;
}

/* El codigo SUELTO dentro de un parrafo si se parte: si no, una ruta larga
   (odoo/addons/base/models/ir_cron.py) empuja el parrafo entero y desborda. */
p > code,
li > code,
td > code,
h2 > code, h3 > code, h4 > code,
.article-content p code,
.article-content li code {
  overflow-wrap: anywhere;
  word-break: break-word;
}

@media (max-width: 640px) {
  pre.article-code,
  .article-content pre {
    padding: 14px 16px;
    font-size: 12.5px;
    /* Los articulos ya llevan 20px de padding lateral en movil: el bloque de
       codigo los aprovecha en vez de sobresalir. */
    border-radius: 10px;
  }
}

/* ==========================================================================
   2. DESBORDAMIENTO HORIZONTAL — al elemento que lo causa
   ========================================================================== */

/* 2.0 box-sizing. 400 de las 631 paginas NO declaran el reset border-box, y
 *     styles.css —que si lo trae— solo esta en 404. En las que se quedan sin
 *     el, una tarjeta con `padding:26px` en linea mide 266 + 52 = 318px dentro
 *     de un contenedor de 276: se sale 22px. Medido en /pay-equity-de.html.
 *     Solo se toca box-sizing: NO se resetean margenes ni paddings, que eso si
 *     movería el diseño de las paginas que ya estaban bien.
 */
*, *::before, *::after { box-sizing: border-box; }

/* 2.1 Palabras que no caben: correos, URLs y nombres de modulo largos.
       Se limita a los sitios donde de verdad aparecen, para no partir titulos
       normales por la mitad. */
a[href^="mailto:"],
a[href^="http"]:not([class]),
.article-content a,
.footer a,
address,
.ft-break { overflow-wrap: anywhere; }

/* Y en el cuerpo del texto, una palabra que no cabe se parte en vez de salirse.
   `break-word` solo actua cuando la palabra NO cabe de ninguna manera, asi que
   no cambia nada del texto normal. Medido: el identificador
   GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA sacaba 107px al parrafo en
   /sincronizar-stock-fba-odoo.html a 320px, y ningun elemento se ensanchaba
   —era el TEXTO el que se salia de su caja. */
@media (max-width: 640px) {
  p, li, dd, dt, figcaption, blockquote,
  h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }
}

/* 2.2 TABLAS — la causa numero uno del desbordamiento en este sitio.
 *
 * Muchas paginas llevan en su <style> en linea algo asi:
 *     table            { min-width: 640px }
 *     @media(max-width:768px) table { min-width: 560px }
 *     @media(max-width:480px) table { min-width: 520px }
 * y styles.css, ademas, le pone a la propia tabla
 *     @media(max-width:768px) table { display:block; overflow-x:auto }
 *
 * O sea: la tabla es a la vez el marco que hace scroll Y el contenido que mide
 * 520px. Un marco de 520px no cabe en una pantalla de 320px, asi que quien se
 * desplazaba en horizontal era la PAGINA ENTERA, no la tabla. Medido en
 * /sincronizar-stock-marketplaces-odoo.html: 544px de ancho en un viewport de
 * 320. Lo tapaba el `body{overflow-x:hidden}` de styles.css, que no arregla
 * nada: solo recorta la columna que se sale.
 *
 * Arreglo: cada <table> del sitio va ahora dentro de <div class="ft-tabla-scroll">.
 * El marco es el div (ancho del contenedor, scroll propio) y la tabla vuelve a
 * ser una tabla, con su min-width intacto: se lee bien y el scroll se queda
 * dentro del recuadro.
 */
.table-wrap,
.ft-tabla-scroll {
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  /* En una rejilla o un flex hace falta para poder encoger por debajo del
     min-content de la tabla. */
  min-width: 0;
}

.ft-tabla-scroll > table {
  /* Deshace el `display:block` que styles.css le pone a la tabla en movil: el
     que hace scroll ahora es el div, y la tabla necesita ser tabla para que las
     columnas de <thead> y <tbody> sigan alineadas. */
  display: table !important;
  max-width: none;
}

/* Un recuadro con scroll tiene que poder recorrerse con el teclado. */
.ft-tabla-scroll:focus-visible {
  outline: 2px solid #2563EB;
  outline-offset: 2px;
}

/* 2.4 Medios incrustados (mapas, vídeos, Calendly). Un iframe con width fijo
       es una de las causas mas frecuentes de desbordamiento en movil. */
iframe,
video,
embed,
object { max-width: 100%; }

/* 2.5 Una imagen con atributo width grande y sin CSS se sale del contenedor. */
img { max-width: 100%; height: auto; }

/* 2.6 Rejillas con columnas de ancho minimo fijo.
 *
 * 222 paginas del sitio llevan escrito en el propio atributo style algo asi:
 *     grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))
 * Ese 320px es un MINIMO: en una pantalla de 320px la columna mide 320 dentro
 * de un contenedor de 276, y la tarjeta se sale por la derecha. Es la causa de
 * los desbordamientos de 12 a 56px que quedaban en /pay-equity-de.html,
 * /odoo-sso-saml.html, /partners.html, /verifactu.html y una veintena mas.
 *
 * Por debajo de 640px pasan a una sola columna, que es lo unico que cabe de
 * verdad. Se filtra por la primera cifra del minimo para no tocar los
 * minmax(0, 1fr), que ya estan bien.
 */
@media (max-width: 640px) {
  [style*="minmax(2"],
  [style*="minmax(3"],
  [style*="minmax(4"],
  [style*="minmax(5"],
  [style*="minmax(6"],
  [style*="minmax( 2"],
  [style*="minmax( 3"] {
    grid-template-columns: 1fr !important;
  }

  [style*="grid-template-columns:repeat(6"],
  [style*="grid-template-columns: repeat(6"],
  [style*="grid-template-columns:repeat(5"],
  [style*="grid-template-columns: repeat(5"],
  [style*="grid-template-columns:repeat(4"],
  [style*="grid-template-columns: repeat(4"] {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
  }

  /* Botones de llamada a la accion que iban en una sola linea forzada
     (`white-space:nowrap`): con una etiqueta larga el boton medía mas que la
     pantalla. Medido: 295px de ancho empezando en x=107, /modules/mrw.html. */
  .article-cta a,
  .cta-box a,
  .btn,
  .module-btn,
  .nav-cta { white-space: normal; max-width: 100%; }
}

/* 2.6.bis Columnas de botones de la barra lateral de las fichas de modulo: era
   un flex sin `wrap`, asi que el segundo boton se salia (medido: x=107 + 295px
   de ancho = 402 en una pantalla de 320, /modules/mrw.html).
   OJO: solo filas. Poner `flex-wrap:wrap` en un flex en COLUMNA (como .cta-box,
   que las plantillas pasan a `flex-direction:column` en movil) hace justo lo
   contrario: le deja crear una segunda COLUMNA y el bloque se ensancha. Probado
   y revertido: /canal-denuncias-odoo-de.html pasaba de 0 a 13px de
   desbordamiento. */
.mod-sidebar-ctas,
.hero-actions { flex-wrap: wrap; }

.mod-sidebar-ctas > *,
.hero-actions > * { max-width: 100%; }

/* La caja de llamada a la accion, con menos aire lateral en movil: 48px por
   lado sobre una pantalla de 320 dejan 224px utiles para un titular. */
@media (max-width: 640px) {
  .cta-box,
  .article-cta { padding-left: 20px !important; padding-right: 20px !important; max-width: 100%; }
  .cta-box > *,
  .cta-box p { max-width: 100% !important; }
}

/* 2.7 Cualquier hijo de una rejilla o un flex necesita min-width:0 para poder
       encoger. Sin esto, un bloque con texto largo fija el ancho de la columna
       y la fila entera se sale. */
/*
 * El caso es SIEMPRE el mismo y aparecia en decenas de plantillas distintas:
 * en una rejilla, `1fr` significa `minmax(auto, 1fr)`, y ese `auto` es el
 * min-content de lo que hay dentro; en un flex, el `min-width:auto` de los
 * hijos hace lo propio. Por eso una columna «de una sola columna» medía 337,
 * 400 o 520px dentro de una pantalla de 320. Declarar `min-width:0` es decir
 * lo que se queria decir: esto puede encoger.
 *
 * Se excluye <table>, porque ahi el min-width SI es deliberado: es lo que hace
 * que la tabla se pueda leer y haga scroll dentro de .ft-tabla-scroll.
 * La especificidad es baja a proposito (0,0,2): cualquier regla de clase del
 * sitio que ponga un min-width a conciencia sigue ganando.
 */
@media (max-width: 980px) {
  body *:not(table) { min-width: 0; }
}

/* 2.8 Filas flex con icono + texto. El texto no encogia porque en flex el
       min-width por defecto es auto (= el min-content del contenido), asi que
       un nombre tecnico largo estiraba la fila entera.
       Medido: .include-item 459px de ancho en /sincronizar-stock-fba-odoo.html
       y .dep-item 280px en /modules/oca-prestashop.html, ambos a 320px. */
.include-item,
.dep-item,
.hero-point,
.feature-item { flex-wrap: wrap; }

.include-item > *,
.dep-item > *,
.hero-point > *,
.feature-item > * { min-width: 0; }

.include-item strong,
.dep-name,
.dep-desc { overflow-wrap: anywhere; }

/* 2.8.bis La rejilla de las fichas de modulo.
 *   styles.css la pasa a `grid-template-columns: 1fr` en movil, pero `1fr` es
 *   `minmax(auto, 1fr)`: el minimo de la pista es el min-content de lo que
 *   lleva dentro, y la barra lateral pedia 520px. Resultado: en una pantalla de
 *   320px la columna medía 520 y TODA la ficha se salía 214px
 *   (/modules/mirakl.html, /modules/amazon.html, /modules/mrw.html y 7 más,
 *   por duplicado en castellano e inglés).
 *   `minmax(0, 1fr)` dice lo que de verdad se quiere: la columna puede encoger.
 */
@media (max-width: 980px) {
  .mod-content-layout { grid-template-columns: minmax(0, 1fr) !important; }
  .mod-content-layout > * { min-width: 0; }
  .mod-sidebar,
  .mod-sidebar-card { min-width: 0; max-width: 100%; }
}

/* 2.9 Las paginas legales (agpl, license) usan
         .legal-layout { display:flex; gap:60px }
       sin `wrap`: en movil las dos columnas siguen una al lado de la otra y la
       segunda se va a x=809 con la pantalla en 320. Medido: 1310px de ancho de
       documento en /agpl.html. */
@media (max-width: 900px) {
  .legal-layout { flex-direction: column !important; gap: 32px !important; }
}
.legal-layout > * { min-width: 0; max-width: 100%; }

/* 2.10 El pie de 4 columnas a uno solo cuando ya no caben. */
@media (max-width: 640px) {
  .footer-grid { grid-template-columns: 1fr !important; }
  .footer-bottom { flex-direction: column; text-align: center; }
}

/* 2.11 320px es el suelo real (iPhone SE 1.ª gen y modo texto grande). El
        contenedor deja de reservar 24px por lado que no existen. */
@media (max-width: 360px) {
  .container { padding-left: 16px !important; padding-right: 16px !important; }
}

/* ==========================================================================
   2.bis  LA CABECERA A 320px
   --------------------------------------------------------------------------
   shop.js inyecta en .header-actions un bloque .ft-headicons (boton «Probar
   demo» + cuenta + carrito). Sumado al logotipo, al selector de tres idiomas y
   a la hamburguesa, la fila pedia mas de 410px: medido, la hamburguesa
   empezaba en x=366 con la pantalla en 320 (/license.html, /partners.html,
   /egypt-eta-odoo.html y 9 mas).

   Se compacta por orden de prescindibilidad, y el ultimo en caer es la
   hamburguesa, que es lo unico que abre el menu. El boton «Probar demo» de la
   cabecera se retira por debajo de 400px porque esa misma accion la sigue
   ofreciendo el boton flotante, asi que no se pierde ninguna via.
   ========================================================================== */
@media (max-width: 480px) {
  #header .header-inner,
  .header-inner { gap: 6px !important; flex-wrap: nowrap !important; }
  #header .header-actions,
  .header-actions { gap: 6px !important; min-width: 0 !important; flex: 0 1 auto !important; }
  #header .ft-headicons,
  .ft-headicons { gap: 4px !important; margin-left: 0 !important; min-width: 0 !important; }
  /* El logotipo se REDUCE, no se recorta. ft-2026.css le pone
     `height:28px; max-width:none !important`, asi que en las paginas cuyo
     logotipo es un .png (main.js solo cambia al icono compacto cuando el
     fichero es .svg) la imagen sobresalia; taparlo con overflow:hidden dejaba
     leer «lexig» en vez de «FlexigoTech». Con un limite de ancho y la altura
     libre entra entero y sin deformarse. */
  #header .logo,
  .logo { min-width: 0 !important; }

  #header .logo img,
  .header .logo img {
    max-width: 132px !important;
    object-fit: contain;
    object-position: left center;
  }
  .mobile-toggle { flex: 0 0 auto !important; }
}

@media (max-width: 400px) {
  /* La misma llamada a la accion sigue viva en el boton flotante. */
  #header .ft-demobtn,
  .ft-demobtn { display: none !important; }
  #header .lang-selector,
  .lang-selector { padding: 1px !important; }
  #header .lang-opt,
  .lang-opt { font-size: 10px !important; padding: 3px 4px !important; }
}

/* ==========================================================================
   3. PANEL DEL MENU MOVIL
   ========================================================================== */

/* 3.1 100vh en movil cuenta la barra del navegador, asi que el final del panel
       queda por debajo del borde de la pantalla y el ultimo enlace no se
       alcanza. dvh mide el viewport que de verdad se ve. */
@supports (height: 100dvh) {
  @media (max-width: 980px) {
    #header .nav.open,
    .nav.open { height: calc(100dvh - 80px) !important; }
  }
}

/* 3.2 El panel llega hasta abajo del todo: se respeta la zona segura del
       movil para que el ultimo enlace no quede bajo la barra de gestos. */
@media (max-width: 980px) {
  .nav.open { padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px)) !important; }
}

/* 3.3 Foco visible dentro del panel: al abrirlo el foco entra en el primer
       enlace y hay que VER donde esta. */
.nav.open a:focus-visible,
.nav.open button:focus-visible {
  outline: 2px solid #2563EB;
  outline-offset: 2px;
  border-radius: 8px;
}

/* 3.4 El boton de la hamburguesa por encima del panel: es tambien el boton de
       cerrar, y si el panel lo tapara no habria forma de cerrarlo con el raton. */
.mobile-toggle { position: relative; z-index: 10001; }

/* 2.12 min-width en el atributo style de la propia pagina.
 *
 * Patron encontrado 37 veces: <div style="flex:1;min-width:280px">. En un
 * escritorio es lo que hace que la tarjeta no se estreche demasiado; en una
 * pantalla de 320px con 14px de margen a cada lado hay 268px utiles, asi que
 * ese suelo de 280 empuja la fila fuera de la pantalla (medido en
 * /partners.html: 19px de desbordamiento).
 *
 * Un min-width en linea gana a cualquier hoja, asi que hace falta !important.
 * Se filtra por la primera cifra (2 a 9) para NO tocar los min-width de dos y
 * tres cifras que empiezan por 1 (120, 130, 150px), que a 320px caben de sobra
 * y suelen ser anchos de boton buscados a proposito.
 */
@media (max-width: 640px) {
  [style*="min-width:2"]:not(table), [style*="min-width: 2"]:not(table),
  [style*="min-width:3"]:not(table), [style*="min-width: 3"]:not(table),
  [style*="min-width:4"]:not(table), [style*="min-width: 4"]:not(table),
  [style*="min-width:5"]:not(table), [style*="min-width: 5"]:not(table),
  [style*="min-width:6"]:not(table), [style*="min-width: 6"]:not(table),
  [style*="min-width:7"]:not(table), [style*="min-width: 7"]:not(table),
  [style*="min-width:8"]:not(table), [style*="min-width: 8"]:not(table),
  [style*="min-width:9"]:not(table), [style*="min-width: 9"]:not(table) {
    min-width: 0 !important;
    /* Ademas de dejarlo encoger, cada tarjeta ocupa su propia fila: si solo se
       quita el suelo, dos tarjetas caben una al lado de la otra y el texto de
       la segunda se sale igual (/partners.html pasaba de 19 a 26px). */
    flex-basis: 100% !important;
  }
}

/* 2.13 white-space:nowrap escrito en el atributo style.
 *   Un <span style="white-space:nowrap"> con «49 EUR - paiement unique, sans
 *   abonnement SaaS» mide 342px: no cabe en ninguna pantalla de movil, y como
 *   el texto se sale del bloque sin ensanchar ninguna CAJA, ni siquiera aparece
 *   al inspeccionar los rectangulos de los elementos — solo al medir el texto.
 *   Medido en /facture-electronique-pdp-odoo.html.
 *   Las celdas de tabla se quedan como estan: ahi el nowrap es lo que mantiene
 *   la columna legible, y la tabla ya hace scroll dentro de su marco.
 */
@media (max-width: 640px) {
  [style*="white-space:nowrap"]:not(td):not(th),
  [style*="white-space: nowrap"]:not(td):not(th) { white-space: normal !important; }
}

/* 2.14 Rejillas de varias columnas escritas en el atributo style, sin ninguna
 *   media query detras. El pie de las paginas legales es
 *      <div style="display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:48px">
 *   y en un movil coloca la cuarta columna en x=276 de una pantalla de 320.
 *   Se selecciona por el hueco («fr ») que solo aparece cuando hay MAS de una
 *   pista, de modo que los `1fr` y los `repeat(n, minmax(0,1fr))` no se tocan.
 */
@media (max-width: 640px) {
  [style*="grid-template-columns"][style*="fr "] { grid-template-columns: 1fr !important; }
}

/* ==========================================================================
   4. EL PASO FINAL DE MOVIL — 10-09-2026
   --------------------------------------------------------------------------
   Todo lo de arriba ataca al elemento que desborda. Faltaba retirar la MANTA
   que tapaba el resultado, y quedaba un desbordamiento de verdad sin arreglar.
   ========================================================================== */

/* 4.1 SE RETIRA `overflow-x:hidden` DE <html> Y <body>.
 *
 * Habia TRES sitios poniendolo:
 *   · styles.css                     -> `body { overflow-x: hidden }`   (404 paginas)
 *   · ft-proyectos.css               -> `body.ft-proyectos { ... }`
 *   · main.js, dentro del <style id="ft-responsive-fixes"> que inyecta en
 *     <body> -> `html, body { overflow-x: hidden }`                     (626 paginas)
 *
 * Eso no arregla ningun ancho: recorta en silencio la parte del contenido que
 * se sale, de modo que en un movil hay texto y botones que sencillamente no
 * existen —y, peor, hace que el siguiente desbordamiento que se cuele en el
 * sitio no se note al mirarlo: el ancho del documento sigue diciendo que todo
 * cabe. Es una venda, no un arreglo.
 *
 * Antes de quitarlo se midieron las 631 paginas a 320 y a 390 px con la manta
 * levantada: 1.262 comprobaciones, 3 desbordamientos reales, todos en
 * /esignature-eu-connector*.html y todos de la misma causa, arreglada en 4.2.
 * Con eso la manta ya no tapa nada, asi que sobra.
 *
 * `!important` porque el <style> de main.js se inyecta en <body>, o sea DESPUES
 * de esta hoja: sin el, gana el suyo.
 *
 * Solo se toca el eje X. El eje Y se deja intacto a proposito: el menu movil
 * bloquea el desplazamiento de fondo con `body.style.overflow='hidden'` en
 * linea, y un `overflow-y:visible !important` aqui lo anularia.
 */
html,
body,
body.ft-proyectos { overflow-x: visible !important; }

/* 4.2 minmax() con un minimo fijo escrito en la HOJA de la pagina, no en el
 *   atributo style. La regla 2.6 solo cazaba los `style="...minmax(300px..."`;
 *   este vive en el <style> de la propia pagina:
 *       .feat-grid { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)) }
 *   En una pantalla de 320px el contenedor mide 276 y la pista sigue pidiendo
 *   300: la tarjeta se salia 2px por la derecha y la pagina entera se movia en
 *   horizontal. Medido en /esignature-eu-connector.html, -en y -de.
 */
@media (max-width: 700px) {
  .feat-grid { grid-template-columns: minmax(0, 1fr) !important; }
  .feat-grid > * { min-width: 0; max-width: 100%; }
}

/* 4.3 EL BLOQUE DE CODIGO TIENE QUE PARECER QUE SE DESPLAZA.
 *
 * Con la seccion 1 ya no se sale de la pagina: hace scroll dentro de si mismo.
 * Pero en un movil la barra de desplazamiento es invisible (barras superpuestas)
 * y no habia NADA que dijera que a la derecha queda mas texto: el visitante veia
 * la linea cortada a mitad y daba por hecho que el sitio estaba roto.
 *
 * Se le ponen sombras de desplazamiento: dos degradados fijados al borde con
 * `background-attachment: scroll` y dos mascaras del color del propio bloque
 * fijadas al contenido con `local`. La mascara tapa la sombra cuando se llega
 * al extremo, asi que la sombra SOLO se ve mientras de verdad queda contenido
 * hacia ese lado. No hace falta ni una linea de JavaScript.
 *
 * No se cambia ningun color: el 0F172A es el fondo que ya tenian.
 */
pre.article-code,
.article-content pre,
.code-block {
  /* `!important` porque casi todas estas paginas declaran despues, en su propio
     <style>, el atajo `background:#0F172A`, y un atajo REINICIA background-image
     a `none`: sin esto las sombras no llegaban a pintarse nunca. */
  background-color: #0F172A !important;
  background-image:
    linear-gradient(to right,  #0F172A 45%, rgba(15, 23, 42, 0)),
    linear-gradient(to left,   #0F172A 45%, rgba(15, 23, 42, 0)),
    linear-gradient(to right,  rgba(148, 163, 184, .55), rgba(148, 163, 184, 0)),
    linear-gradient(to left,   rgba(148, 163, 184, .55), rgba(148, 163, 184, 0)) !important;
  background-position: left center, right center, left center, right center !important;
  background-repeat: no-repeat !important;
  background-size: 34px 100%, 34px 100%, 16px 100%, 16px 100% !important;
  background-attachment: local, local, scroll, scroll !important;
  /* Y donde el sistema si pinta barra, que se vea y sea agarrable. */
  scrollbar-width: thin;
  scrollbar-color: #475569 rgba(148, 163, 184, .15);
}

pre.article-code::-webkit-scrollbar,
.article-content pre::-webkit-scrollbar,
.code-block::-webkit-scrollbar { height: 9px; }

pre.article-code::-webkit-scrollbar-thumb,
.article-content pre::-webkit-scrollbar-thumb,
.code-block::-webkit-scrollbar-thumb { background: #475569; border-radius: 9px; }

pre.article-code::-webkit-scrollbar-track,
.article-content pre::-webkit-scrollbar-track,
.code-block::-webkit-scrollbar-track { background: rgba(148, 163, 184, .15); border-radius: 9px; }

/* Los `.code-block` que envuelven el texto (white-space:pre-wrap) no se
   desplazan nunca: ahi las sombras solo estorbarian. */
.code-block[style*="pre-wrap"],
.code-block:not([tabindex]) { background-image: none !important; }

/* El recuadro que hace scroll es una region: se llega con el tabulador y se
   recorre con las flechas. El tabindex="0" va en el HTML; aqui, el foco visible. */
.code-block[tabindex]:focus-visible,
pre.article-code:focus-visible {
  outline: 2px solid #6366F1;
  outline-offset: 2px;
}

/* 4.4 EL BLOQUE DE CODIGO DE LAS FICHAS DE MODULO PERDIA LOS SALTOS DE LINEA.
 *
 * En las 18 fichas OCA el bloque es un <div class="code-block"> cuyo contenido
 * (que main.js pinta desde data-es / data-en / data-ca) trae saltos de linea de
 * verdad. Pero ni la hoja de la pagina ni ninguna otra le daban `white-space`,
 * asi que un <div> los colapsa: las siete lineas de configuracion se leian como
 * un unico parrafo corrido —«... # 6 chars, tu n° cuenta UPS # Token OAuth 2.0
 * (gestionado automaticamente) # POST https://onlinetools...»— y ademas la URL
 * larga se salia del recuadro y quedaba cortada contra el borde.
 *
 * Con `pre` vuelve a haber una linea por linea y lo que no cabe se recorre
 * dentro del bloque (seccion 1: overflow-x:auto), con las sombras de 4.3 para
 * que se vea que hay mas. Se acota a los que llevan tabindex —los que de verdad
 * son un bloque de codigo desplazable— para no pisar a las paginas que a
 * proposito envuelven el texto con `white-space:pre-wrap`.
 */
.code-block[tabindex] {
  white-space: pre;
  tab-size: 2;
}

/* ==========================================================================
   5. LO QUE QUEDABA: CONTENIDO RECORTADO DENTRO DE SU PROPIA CAJA — 11-09-2026
   --------------------------------------------------------------------------
   Medido a 390, 360 y 320px en las 15 paginas de referencia: el ANCHO DEL
   DOCUMENTO ya era correcto en las 45 comprobaciones (scrollWidth == innerWidth,
   con html y body en `overflow-x: visible`, o sea sin manta que tape nada).

   Pero un documento que mide bien no significa que se vea todo. Quedaban dos
   sitios donde el texto se salia de SU CAJA y un `overflow:hidden` local se lo
   comia: no ensanchaban la pagina —por eso no aparecian al medir el documento—
   pero en un movil el visitante veia la frase cortada a media palabra.

   Se localizaron recorriendo el DOM y comparando, en cada elemento que clipa,
   su scrollWidth con su clientWidth. Se descartan a proposito:
     · .ftb-band      — el carrusel de etiquetas, que clipa porque es su efecto.
     · .ft-h-bar b    — la barra del marco de la portada, que lleva
                        `text-overflow: ellipsis`: se degrada con puntos
                        suspensivos a conciencia (ft-2026.css § 2032).
     · .ft-h-sr, .ft-sr-only, .ft-form-honey — invisibles a proposito
                        (clientWidth de 1px): son para el lector de pantalla y
                        el cazabobos del formulario.

   NO se toca la paleta ni el fondo. Sigue siendo blanco.
   ========================================================================== */

/* 5.1 BOTONES CON ETIQUETA LARGA: LA ETIQUETA SE CORTABA.
 *
 * styles.css, en su regla base, dice:
 *     .btn { white-space: nowrap; overflow: hidden; }
 * Las dos juntas son el problema: `nowrap` obliga a la etiqueta a ir en una
 * sola linea y `overflow:hidden` se come lo que sobresalga. El boton no se
 * ensancha ni empuja la pagina —por eso el documento medía bien— pero el texto
 * desaparece sin mas, sin puntos suspensivos ni nada que avise.
 *
 * Medido en /modules/mrw.html, con el boton «Ver Correos Express (en
 * produccion)»: le faltaban 28px a 390, 43px a 360 y 63px a 320 — o sea que a
 * 320px se leia «Ver Correos Express (en pro». El enlace seguia funcionando,
 * pero no decia adonde llevaba.
 *
 * La seccion 2.6 ya intentaba esto mismo, pero sin `!important`: styles.css se
 * enlaza DESPUES de esta hoja (linea 35 de /modules/mrw.html, contra la 33 de
 * ft-movil.css) y, a igual especificidad (0,1,0), gana el que va despues. Con
 * `!important` la intencion de 2.6 por fin se cumple.
 *
 * `white-space: normal` NO parte ningun boton que ya cupiera: solo actua cuando
 * la etiqueta no cabe de ninguna manera, y entonces baja a una segunda linea en
 * vez de perderse. Se deja el `overflow:hidden` como estaba, porque es lo que
 * recorta el velo `.btn::after` (position:absolute; inset:0) contra el
 * border-radius del boton; quitarlo dejaria la esquina del velo cuadrada al
 * pasar el raton por encima.
 *
 * El menu de cabecera se queda como estaba: ft-2026.css le pone a `.nav-cta`
 * su propio `white-space: nowrap !important`, que es deliberado y sigue ganando.
 */
@media (max-width: 640px) {
  .btn,
  .btn-lg, .btn-md, .btn-sm,
  .module-btn,
  .article-cta a,
  .cta-box a {
    white-space: normal !important;
    /* Con dos lineas, el texto centrado respecto al icono del boton. */
    text-align: center;
    /* El boton crece hacia abajo en lugar de recortar. */
    height: auto;
    max-width: 100%;
  }
}

/* 5.2 LA CAJA DE CIERRE `.cta-box-sleek`: SE COMIA SU PROPIO CONTENIDO.
 *
 * La declaran en su <style> /about.html (padding: 44px 52px) y /partners.html
 * (padding: 48px 56px), las dos igual en lo que importa:
 *     display: flex; align-items: center; justify-content: space-between;
 *     gap: 40px; overflow: hidden;
 * y ni una media query detras. O sea: en un movil las dos columnas —el texto a
 * la izquierda, el boton a la derecha— siguen UNA AL LADO DE LA OTRA.
 *
 * Las cuentas a 320px: la pantalla deja 292px para la caja, de los que 104 se
 * los lleva el padding lateral (52 + 52). Quedan 188px utiles para meter un
 * titular, un parrafo, un boton con `white-space: nowrap` y un enlace. El
 * contenido pedia 360. Como `.cta-action` lleva ademas `flex-shrink: 0`, no
 * cedia ni un pixel, asi que el `overflow:hidden` de la caja se comia 70px:
 * el boton «Agendar sesion gratuita →» quedaba partido contra el borde
 * —y en /about.html a 320px, ademas, `.cta-btn-light` se salia 3px de la
 * pantalla antes de que lo recortaran.
 *
 * Medido: 70px recortados en /about.html a 320, 30px a 360; 9px en
 * /partners.html a 320.
 *
 * El arreglo es el que pedia el diseño desde el principio: por debajo de 720px
 * las dos columnas se apilan, el aire lateral baja a algo que cabe en un movil
 * y el boton pasa a ocupar el ancho de la caja. Asi no hay nada que recortar y
 * el `overflow:hidden` puede quedarse, que es lo que mantiene los dos circulos
 * de luz de ::before y ::after dentro del borde redondeado.
 *
 * Van con `!important` porque estas reglas viven en el <style> de la propia
 * pagina, o sea siempre por detras de esta hoja en la cascada.
 */
@media (max-width: 720px) {
  .cta-box-sleek {
    flex-direction: column !important;
    align-items: stretch !important;
    justify-content: flex-start !important;
    gap: 24px !important;
    /* 22px por lado en vez de 52: sobre una pantalla de 320 pasan de 188 a
       248px utiles, y el titular deja de ir a una palabra por linea. */
    padding: 30px 22px !important;
    max-width: 100%;
  }

  .cta-box-sleek .cta-text { min-width: 0; }
  /* El parrafo tenia un tope de 380px que a 320 no significa nada. */
  .cta-box-sleek .cta-text p { max-width: 100% !important; }

  /* Era `flex-shrink: 0` + `align-items: flex-end`: la columna del boton no
     cedia y ademas se pegaba a la derecha. Apilada ocupa el ancho entero. */
  .cta-box-sleek .cta-action {
    flex-shrink: 1 !important;
    align-items: stretch !important;
    width: 100%;
    min-width: 0;
  }

  /* El boton llevaba `white-space: nowrap`: con la etiqueta larga en catalan
     («Reservar sessio gratuita →») es justo lo que no cabia. */
  .cta-box-sleek .cta-btn-light {
    white-space: normal !important;
    justify-content: center;
    text-align: center;
  }

  .cta-box-sleek .cta-link-sm { justify-content: center; text-align: center; }
}
