/* =============================================================================
   Sillas y Mesas de Madera — hoja del child theme
   =============================================================================

   PrestaShop registra este fichero como `theme-custom` con priority 1000, así
   que carga SIEMPRE después del `theme.css` de Hummingbird.

   Además, Hummingbird envuelve todo su CSS en capas en cascada:

       @layer vendors, bs-base, bs-components, bs-custom-components,
              ps-base, ps-components, ps-pages, ps-modules, utilities;

   El CSS sin capa gana a cualquier CSS en capa, sea cual sea la especificidad.
   Por eso aquí NO hace falta ni un solo `!important` ni selectores inflados:
   basta con escribir la regla fuera de `@layer` y ya manda.

   Estructura del fichero:
     0. Tipografía      — Figtree autoalojada (los titulares; el cuerpo es Inter)
     1. Tokens          — la única capa donde hay colores literales
     2. Puente Bootstrap — mapea los tokens a las variables --bs-*
     3. Base            — tipografía, contenedores, foco accesible
     4. Componentes     — cabecera, tarjeta de producto, footer, breadcrumb…
     5. Módulos Nexir   — ritmo vertical de los bloques nxr_* de la home

   Esta hoja SÍ lleva la marca: es el tema del cliente, no el tema base. La
   paleta del bloque 1 es la de la web anterior (tema Panda) leída de su CSS y
   de la configuración `STSN_*` de producción — negro y salvia #7caead sobre
   grises claros — con dos correcciones:

     · el salvia pasa a token decorativo (`--sm-sage`) y NO a acento. Sobre
       blanco da 2,5:1 y sobre él sólo se lee texto oscuro: como color de
       botones y precios no llega a AA por ningún lado. Se usa donde estaba en
       la web vieja (bandas, iconos, subrayado del menú), que es lo que se ve.
     · los grises neutros (#f2f2f2) viran a crema cálida. Es una tienda de
       muebles de madera: el neutro frío peleaba con la fotografía.
   ========================================================================== */

/* =============================================================================
   0. TIPOGRAFÍA AUTOALOJADA
   -----------------------------------------------------------------------------
   Figtree es la tipografía de los titulares. Sustituye a Vollkorn —la serif de
   la web anterior— el 2026-08-30, por decisión del cliente: su contraste alto y
   sus remates finos daban un aire de libro decimonónico que chocaba con el
   Inter del cuerpo y con el tono limpio del resto de la tienda.

   Va servida desde el propio tema, igual que iba Vollkorn: sin petición a un
   tercero, sin aviso de RGPD que dar y sin el salto de layout de la hoja
   externa. Pesa 30 KB contra los 84 KB de Vollkorn.

   Es una fuente VARIABLE: un solo fichero por subconjunto cubre de 400 a 900 y
   el navegador interpola. Los `unicode-range` son los de Google tal cual: sin
   ellos el navegador se baja el latin-ext aunque la página sea toda ASCII.

   ⚠️ El formato se declara `woff2` a secas, NO `woff2-variations` como estaba
   escrito para Vollkorn: aquel valor salió de un borrador de la especificación
   que ya no existe, y un navegador que no lo reconozca descarta la fuente
   entera y cae al fallback sin dar ningún error. Es lo que sirve Google.
   ========================================================================== */
@font-face {
  font-family: Figtree;
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url("../fonts/figtree-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: Figtree;
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url("../fonts/figtree-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* =============================================================================
   1. TOKENS
   -----------------------------------------------------------------------------
   Único sitio del theme con colores literales. Los valores por defecto son
   neutros a propósito: el theme no impone marca, la recibe.

   Los tres primeros (--nxr-accent, --nxr-accent-contrast, --nxr-accent-dark)
   son el contrato compartido con los 26 módulos nxr_*, que los consumen con
   fallback propio. Al declararlos aquí, todos viran a la vez.
   ========================================================================== */
:root {
  /* --- Acento de marca ---
     El negro de la web anterior (`STSN_MENU_COLOR`, `STSN_FOOTER_PRIMARY_COLOR`
     y `STSN_S_TITLE_BLOCK_COLOR` valían todos #000000), con el matiz verde del
     salvia de marca para que no cante junto a las bandas. */
  --nxr-accent: #1f2422;
  /* Los mismos canales del acento en formato `R, G, B`. Bootstrap construye con
     él los rgba() de sus utilidades (.text-primary, .bg-primary…) y CSS no sabe
     descomponer un hex, así que hay que darlo aparte. Mantener sincronizado con
     --nxr-accent; nxr_themeconfig lo calcula solo. */
  --nxr-accent-rgb: 31, 36, 34;
  --nxr-accent-contrast: #ffffff;
  --nxr-accent-dark: color-mix(in srgb, var(--nxr-accent) 80%, #000);
  /* Texto sobre `--nxr-accent-dark`. Parece redundante con
     `--nxr-accent-contrast` y NO lo es: ese token dice qué se lee sobre el
     ACENTO, y el theme lo estaba reutilizando también sobre el acento oscuro,
     dando por hecho que los dos tienen una luminosidad parecida. Con un acento
     medio-oscuro (el teal de serie) se cumple; con uno LUMINOSO no, y los dos
     tokens colapsan en el mismo valor.
     Pasó de verdad: con el lima de Europa 3G, `--nxr-accent-dark` y
     `--nxr-accent-contrast` valen los dos `#212529`, así que el hover de
     `.btn-primary` era tinta sobre tinta —contraste 1:1— y el texto de
     «Añadir al carrito» y «Finalizar compra» DESAPARECÍA al pasar el ratón.
     `nxr_themeconfig` lo calcula por luminancia cuando no se configura. */
  --nxr-accent-dark-contrast: #ffffff;
  --nxr-accent-soft: var(--nxr-surface-alt);
  --nxr-accent-line: var(--nxr-line);

  /* --- Texto y superficies --- */
  --nxr-ink: var(--nxr-accent);
  --nxr-ink-soft: #626a67;
  --nxr-surface: #ffffff;
  /* Crema, no el #f2f2f2 de la web vieja: el gris frío apagaba las fotos de
     madera, que es prácticamente todo el catálogo. */
  --nxr-surface-alt: #f1f2ee;
  /* El filete NO puede ser el mismo valor que la superficie —están a distancia
     25 y hacen trabajos opuestos: un fondo tiene que ser imperceptible sobre el
     blanco (1,12:1) y un borde tiene que percibirse—, pero sí puede salir de
     ella. Al 93% da exactamente el `#e2e4e0` de antes: cero cambio a la vista,
     un literal menos, y el filete queda atado al neutro para siempre. */
  --nxr-line: color-mix(in srgb, var(--nxr-surface-alt) 93%, var(--nxr-ink));

  /* --- Salvia de marca ---
     El #7caead de la web anterior: fondo de la banda de newsletter, color de
     los iconos de la home y subrayado del menú al pasar el ratón
     (`STSN_MENU_BOTTOM_BORDER_HOVER_COLOR`) y, desde el rediseño de la
     cabecera, fondo de la barra superior. Decorativo: sobre él sólo se lee
     texto OSCURO —la tinta o `--sm-sage-ink`—, nunca blanco (2,5:1).
     No se toca `--nxr-accent` con él (ver cabecera del fichero). */
  --sm-sage: #7caead;
  --sm-sage-rgb: 124, 174, 173;
  --sm-sage-ink: var(--nxr-ink);
  --sm-sage-soft: var(--nxr-surface-alt);

  /* --- Semánticos --- */
  /* El precio va al acento OSCURO, no al acento. Es texto sobre fondo claro, y
     ahí el acento no llega a AA con ningún valor luminoso: con el lima #ccff00
     de Europa 3G da 1,18:1 (invisible) y con el teal #2ec4b6 de serie, 2,3:1
     (tampoco pasa). Un precio es el dato que más se mira de una tarjeta: no
     puede depender de que el cliente elija un acento oscuro.
     Lo consumen la tarjeta de producto (§4.5) y la ficha (§4.6). */
  --nxr-price: var(--nxr-accent-dark);
  --nxr-sale: #b91c1c;
  --nxr-success: #15803d;
  --nxr-warning: #b45309;
  /* Los mismos tres en canales `R, G, B`. Bootstrap pinta sus utilidades de
     color semántico con `rgba(var(--bs-*-rgb), …)` y CSS no sabe descomponer un
     hex, igual que pasa con el acento. Mantener sincronizado con los tres de
     arriba; el de rebaja lo recalcula `nxr_themeconfig` cuando se configura. */
  --nxr-sale-rgb: 185, 28, 28;
  --nxr-success-rgb: 21, 128, 61;
  --nxr-warning-rgb: 180, 83, 9;

  /* --- Cabecera --- */
  /* La barra superior es la ÚNICA franja de color de la cabecera, y es salvia:
     es el color que la web anterior repartía por toda la página (banda de
     newsletter, iconos, subrayado del menú) y aquí se concentra donde rinde.
     Es el único sitio donde el salvia lleva texto encima, y por eso el texto es
     la tinta y no el blanco: #1f2422 sobre #7caead da 6,3:1 (AA de sobra),
     mientras que el blanco se queda en 2,5:1. Ver la nota de `--sm-sage`. */
  --nxr-topbar-bg: var(--sm-sage);
  --nxr-topbar-fg: var(--nxr-ink);
  --nxr-header-bg: var(--nxr-surface);
  --nxr-header-fg: var(--nxr-ink);
  --nxr-menubar-bg: var(--nxr-surface);
  --nxr-menubar-fg: var(--nxr-ink);

  /* --- Pie --- */
  --nxr-footer-bg: var(--nxr-accent);
  /* Salvia pálido, no un gris. Era `#c3cfcd`: un literal suelto heredado, el
     único color de la paleta que no salía de ningún sitio, con la saturación
     al 11% —un gris con un recuerdo de verde— y a 9,84:1 sobre el fondo,
     cuando los títulos que tiene justo encima van a 15,75. Ese salto era lo
     que lo hacía parecer apagado.
     Derivado del salvia queda en 24% de saturación (la misma del salvia) y
     12,77:1, y deja de ser un color propio: la paleta baja a nueve. */
  --nxr-footer-fg: color-mix(in srgb, #fff 74%, var(--sm-sage));
  --nxr-footer-heading: #ffffff;
  --nxr-footer-line: rgb(255 255 255 / 12%);

  /* --- Forma --- */
  /* Dos radios y sólo dos: 8 px para controles y tarjetas, 16 px para los
     bloques grandes (banda de la home, tarjetas de categoría, modales). */
  --nxr-radius: 8px;
  --nxr-radius-sm: 8px;
  --nxr-radius-lg: 16px;
  --nxr-radius-pill: 999px;
  --nxr-shadow: 0 1px 2px rgb(17 24 39 / 6%), 0 4px 16px rgb(17 24 39 / 6%);
  --nxr-shadow-lg: 0 8px 32px rgb(17 24 39 / 12%);
  --nxr-container: 1280px;

  /* --- Tipografía --- */
  /* Inter viene autoalojada con Hummingbird: sin CDN externo, sin RGPD.
     Figtree, la de los titulares, se autoaloja igual (§0), no se tira de
     fonts.googleapis.com como hacía el tema Panda.

     Las dos son sans, así que el contraste entre titular y cuerpo NO lo da la
     forma de la letra sino el peso y el tamaño: si algún día se sube el cuerpo
     de peso o se baja el de los titulares, los dos papeles se confunden. */
  --nxr-font-body: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --nxr-font-heading: Figtree, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --nxr-heading-weight: 600;
  --nxr-heading-tracking: -0.005em;

  /* --- Ritmo vertical de las secciones de la home ---
     Lo consume el `row-gap` del grid de la home. Se queda corto a propósito:
     varios módulos (brandslider, newsletter, customtext) traen ya 32-48 px de
     padding vertical propio, que se suma a esta separación. */
  --nxr-section-gap: clamp(1.75rem, 3vw, 2.75rem);

  /* --- Interruptores que lee el JS ---
     assets/js/custom.js consulta esta property antes de montar la cabecera
     pegajosa, sin que nadie tenga que escribir CSS que deshaga lo que hizo otro
     CSS. El JS trata «ausente o distinto de 0» como ENCENDIDO.

     Va a 0 y NO es cosmético: la cabecera de esta tienda son tres franjas y
     Hummingbird ya declara `.header { position: sticky }` para el <header>
     entero, así que se quedan arriba solas. El sticky del tema pasa a `fixed`
     sólo `.header-bottom`, lo que suelta la franja del menú de sus dos
     compañeras y mete el espaciador como hueco en blanco entre ellas.

     Lo escribía `nxr_themeconfig` desde el back office; al desinstalarse ese
     módulo (ver `scripts/php/limpiar-modulos.php`) el 0 vive aquí, que es el
     único sitio que queda. Si alguien lo sube a 1, la cabecera se rompe. */
  --nxr-sticky-header: 0;
}

/* =============================================================================
   2. PUENTE A BOOTSTRAP
   -----------------------------------------------------------------------------
   Bootstrap 5.3 expone casi todo como custom properties, pero unos pocos
   componentes traen el azul de Hummingbird (#0b69f6) compilado a hex. La lista
   de abajo es exactamente esa: se obtuvo grepeando el hex en theme.css, no de
   memoria. Si se actualiza Hummingbird conviene rehacer el grep.
   ========================================================================== */
:root,
[data-bs-theme="light"] {
  --bs-primary: var(--nxr-accent);
  --bs-primary-rgb: var(--nxr-accent-rgb);
  --bs-primary-text-emphasis: var(--nxr-accent-dark);
  --bs-primary-bg-subtle: var(--nxr-accent-soft);
  --bs-primary-border-subtle: var(--nxr-accent-line);

  --bs-link-color: var(--nxr-accent);
  --bs-link-color-rgb: var(--nxr-accent-rgb);
  --bs-link-hover-color: var(--nxr-accent-dark);
  --bs-focus-ring-color: color-mix(in srgb, var(--nxr-accent) 25%, transparent);

  --bs-body-color: var(--nxr-ink);
  --bs-body-bg: var(--nxr-surface);
  --bs-secondary-color: var(--nxr-ink-soft);
  --bs-secondary-bg: var(--nxr-surface-alt);
  --bs-tertiary-bg: var(--nxr-surface-alt);
  --bs-heading-color: var(--nxr-ink);
  --bs-border-color: var(--nxr-line);
  --bs-emphasis-color: var(--nxr-ink);

  --bs-border-radius: var(--nxr-radius);
  --bs-border-radius-sm: var(--nxr-radius-sm);
  --bs-border-radius-lg: var(--nxr-radius-lg);
  --bs-border-radius-pill: var(--nxr-radius-pill);

  --bs-body-font-family: var(--nxr-font-body);
}

/* Las utilidades de Bootstrap (.text-primary, .bg-primary…) ya se derivan de
   --bs-primary-rgb, así que viran solas con el bloque de arriba. La única
   excepción es el hover de .link-primary, que Bootstrap compila a hex.

   Y esa excepción NO se puede arreglar desde fuera de las capas: en las
   declaraciones `!important` el orden de la cascada se invierte y el CSS sin
   capa pasa a ser el más débil de todos. Hay que entrar en la misma capa
   `utilities` y ganar por orden de aparición. */
@layer utilities {
  .link-primary:hover,
  .link-primary:focus {
    color: rgba(var(--nxr-accent-rgb), var(--bs-link-opacity, 1)) !important;
  }
}

/* --- Botones --- */
.btn-primary {
  --bs-btn-bg: var(--nxr-accent);
  --bs-btn-border-color: var(--nxr-accent);
  --bs-btn-color: var(--nxr-accent-contrast);
  /* En hover y en activo el FONDO pasa a `--nxr-accent-dark`, así que el texto
     tiene que ser el que contrasta con ÉSE, no el que contrasta con el acento.
     Ver la nota de `--nxr-accent-dark-contrast` en el bloque 1: con un acento
     luminoso los dos tokens colapsan y el botón se quedaba sin texto visible. */
  --bs-btn-hover-bg: var(--nxr-accent-dark);
  --bs-btn-hover-border-color: var(--nxr-accent-dark);
  --bs-btn-hover-color: var(--nxr-accent-dark-contrast);
  --bs-btn-active-bg: var(--nxr-accent-dark);
  --bs-btn-active-border-color: var(--nxr-accent-dark);
  --bs-btn-active-color: var(--nxr-accent-dark-contrast);
  --bs-btn-disabled-bg: var(--nxr-accent);
  --bs-btn-disabled-border-color: var(--nxr-accent);
  --bs-btn-disabled-color: var(--nxr-accent-contrast);
}

/* El botón fantasma es, en reposo, TEXTO Y UNA LÍNEA DE 1 px sobre fondo claro:
   los dos usos que el acento no puede cubrir. Con el lima da 1,18:1 —el botón
   sencillamente no se ve— y con el teal de serie, 2,3:1. Por eso el reposo va en
   acento oscuro y el acento aparece sólo al pasar por encima, que es cuando se
   convierte en FONDO y tiene área. Mismo criterio que la pastilla de hover del
   mega-menú (§4.3) y que el subrayado descartado de la paleta.
   El estado deshabilitado va en tinta suave: en acento oscuro se confundía con
   el botón activo, y un botón que no se puede pulsar tiene que parecerlo. */
.btn-outline-primary {
  --bs-btn-color: var(--nxr-accent-dark);
  --bs-btn-border-color: var(--nxr-accent-dark);
  --bs-btn-hover-bg: var(--nxr-accent);
  --bs-btn-hover-border-color: var(--nxr-accent);
  --bs-btn-hover-color: var(--nxr-accent-contrast);
  --bs-btn-active-bg: var(--nxr-accent);
  --bs-btn-active-border-color: var(--nxr-accent);
  --bs-btn-active-color: var(--nxr-accent-contrast);
  --bs-btn-disabled-color: var(--nxr-ink-soft);
  --bs-btn-disabled-border-color: var(--nxr-line);
}

.btn {
  --bs-btn-border-radius: var(--nxr-radius);
  font-weight: 600;
  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

/* --- Formularios --- */
.form-control,
.form-select {
  border-radius: var(--nxr-radius-sm);
}

.form-control:focus,
.form-select:focus,
.form-check-input:focus,
.nav-link:focus-visible {
  border-color: var(--nxr-accent-line);
  box-shadow: 0 0 0 0.25rem var(--bs-focus-ring-color);
}

.form-check-input:checked,
.form-check-input[type="checkbox"]:indeterminate {
  background-color: var(--nxr-accent);
  border-color: var(--nxr-accent);
}

.form-range::-webkit-slider-thumb {
  background-color: var(--nxr-accent);
}

.form-range::-moz-range-thumb {
  background-color: var(--nxr-accent);
}

/* --- Otros componentes con el azul compilado --- */
.dropdown-menu,
.dropdown-menu-dark {
  --bs-dropdown-link-active-bg: var(--nxr-accent);
  --bs-dropdown-link-active-color: var(--nxr-accent-contrast);
  --bs-dropdown-border-radius: var(--nxr-radius);
}

/* Colores semánticos. Sin este bloque conviven DOS juegos que no coinciden: el
   theme declara `--nxr-sale` / `--nxr-success` / `--nxr-warning` y los usa en
   los `.alert-*`, mientras que `.text-danger`, `.link-danger`, `.btn-danger`,
   `.badge.bg-success` y compañía seguían con los de Hummingbird. Se notaba: su
   rojo es `#ff4657`, que sobre blanco da **3,16:1** y no pasa AA para texto
   normal — el «Eliminar» de las tarjetas de dirección del checkout, por ejemplo.
   Con `--nxr-sale` (#e11d48 en Europa 3G) sube a 4,8:1.

   Los `-rgb` van aparte porque Bootstrap aplica opacidad por `rgba()`; los
   emite `nxr_themeconfig` para el de rebaja y salen del bloque 1 para los otros
   dos. */
:root,
[data-bs-theme="light"] {
  --bs-danger: var(--nxr-sale);
  --bs-danger-rgb: var(--nxr-sale-rgb);
  --bs-success: var(--nxr-success);
  --bs-success-rgb: var(--nxr-success-rgb);
  --bs-warning: var(--nxr-warning);
  --bs-warning-rgb: var(--nxr-warning-rgb);
}

.list-group {
  --bs-list-group-active-bg: var(--nxr-accent);
  --bs-list-group-active-border-color: var(--nxr-accent);
  --bs-list-group-active-color: var(--nxr-accent-contrast);
}

.nav-pills {
  --bs-nav-pills-link-active-bg: var(--nxr-accent);
  --bs-nav-pills-link-active-color: var(--nxr-accent-contrast);
}

.progress,
.progress-stacked {
  --bs-progress-bar-bg: var(--nxr-accent);
}

.accordion {
  --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem var(--bs-focus-ring-color);
  /* El rótulo de la sección abierta va en acento OSCURO sobre el fondo suave.
     En acento se leía lima sobre lima pálido (~1,1:1): al desplegar un acordeón
     el título DESAPARECÍA, justo cuando más se necesita. Lo destapan a la vez
     el cupón del carrito y los filtros por facetas. */
  --bs-accordion-active-color: var(--nxr-accent-dark);
  --bs-accordion-active-bg: var(--nxr-accent-soft);
}

.btn-close {
  --bs-btn-close-focus-shadow: 0 0 0 0.25rem var(--bs-focus-ring-color);
}

.pagination {
  --bs-pagination-active-bg: var(--nxr-accent);
  --bs-pagination-active-border-color: var(--nxr-accent);
  --bs-pagination-active-color: var(--nxr-accent-contrast);
  --bs-pagination-focus-box-shadow: 0 0 0 0.25rem var(--bs-focus-ring-color);
}

/* =============================================================================
   3. BASE
   ========================================================================== */
body {
  font-family: var(--nxr-font-body);
  color: var(--nxr-ink);
  background-color: var(--nxr-surface);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
  font-family: var(--nxr-font-heading);
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  color: var(--nxr-ink);
}

/* Contenedor un poco más ancho que el de Bootstrap: las rejillas de 4 productos
   respiran mejor y las imágenes de catálogo (720 px) no se quedan cortas. */
.container,
.container-md,
.container-lg,
.container-xl {
  max-width: var(--nxr-container);
}

/* El margen lateral de la tienda en móvil: 16 px, no 12.

   Los 12 px son el `--bs-gutter-x: 1.5rem` que Bootstrap trae de fábrica, y
   nadie los había ajustado. En escritorio da igual —con `max-width: 1280px`
   sobra aire por los lados—, pero en una pantalla de 390 px son 12 px de
   nada: los párrafos largos van de borde a borde. Se nota sobre todo en el
   texto SEO al pie de categoría y en el pie de la web, que es donde hay
   columnas enteras de prosa.

   16 px es lo que usan iOS, Material y prácticamente cualquier tienda; 20
   empezaba a comerse el ancho de las fichas de producto, que en móvil ya van
   a dos columnas de 155 px.

   Basta con tocar el `.container` porque **las tres plantillas cuelgan de él
   por caminos distintos que acaban en el mismo sitio**: la portada lo aplica
   directamente (`.nxr-home.container`), la ficha también
   (`.columns-container.container`), y la categoría lo hereda por el rodeo de
   Bootstrap —el `.container` empuja 16, la `.row` resta 12 con su margen
   negativo y la `.col` vuelve a sumar 12—, que da los mismos 16 px. Verificado
   en las cuatro páginas después del cambio, no supuesto.

   No se toca `--bs-gutter-x`: esa variable la usan también las `.row` para el
   hueco entre columnas, y aunque hoy cada `.row` la redeclara (`.row` trae la
   suya, y las de este tema van con `gx-2`), cambiarla en el contenedor sería
   apuntar a la separación entre columnas para mover el margen de la página. Se
   escribe el relleno y ya está. */
@media (max-width: 767.98px) {
  .container,
  .container-sm,
  .container-md,
  .container-lg,
  .container-xl,
  .container-xxl,
  .container-fluid {
    padding-inline: 1rem;
  }
}

/* Foco visible y consistente en toda la tienda (WCAG 2.4.7 y 2.4.11).
   Hummingbird lo deja al navegador en varios sitios y con fondos oscuros
   desaparece.

   Van DOS anillos, y no es un adorno: el indicador de foco tiene que contrastar
   3:1 con lo que tenga al lado, y ninguno de los dos colores lo consigue solo.
   El anillo interior es el acento oscuro —tinta— que se ve sobre la página
   blanca pero se pierde en la barra superior de lima, en el pie negro y en
   cualquier bloque de acento; el halo exterior es el acento, que se ve
   justamente ahí y desaparece sobre claro. Con los dos, siempre hay uno que
   contrasta, sea cual sea el fondo.

   Antes era un solo anillo en `--nxr-accent`: sobre el blanco de la tienda daba
   1,18:1, o sea que quien navega con teclado no sabía dónde estaba. Es el mismo
   error que la regla de oro de la paleta describe para el texto, aplicado a una
   línea de 2 px. */
a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible,
summary:focus-visible {
  outline: 2px solid var(--nxr-accent-dark);
  outline-offset: 2px;
  box-shadow: 0 0 0 5px rgb(var(--nxr-accent-rgb) / 55%);
  border-radius: var(--nxr-radius-sm);
}

/* El salto al ancla no debe esconder el contenido bajo la cabecera sticky. */
:target {
  scroll-margin-top: 6rem;
}

/* Las imágenes de catálogo nunca deben desbordar su columna. */
img {
  max-width: 100%;
  height: auto;
}

/* El enlace «saltar al contenido» lo trae ya Hummingbird (a.skip-link); aquí
   sólo se le da el color de la marca, en vez de duplicarlo. */
.skip-link {
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
}

/* =============================================================================
   4. COMPONENTES
   ========================================================================== */

/* --- 4.1 Barra superior (displayNav1 / displayNav2) ----------------------- */
.header-top {
  background: var(--nxr-topbar-bg);
  color: var(--nxr-topbar-fg);
  font-size: 0.8125rem;
  padding-block: 0.4rem;
}

/* Todo el contenido, no sólo los <a>: ps_shoppingcart pinta el carrito vacío
   como <span> (no como enlace) y sus iconos Material heredaban --nxr-ink, o sea
   casi negro sobre fondo casi negro. */
.header-top a,
.header-top button,
.header-top .btn-link,
.header-top .dropdown-toggle,
.header-top .header-block__action-btn,
.header-top .header-block__icon,
.header-top .header-block__title {
  color: var(--nxr-topbar-fg);
  text-decoration: none;
}

/* El hover NO cambia de color, subraya. La barra es salvia y el texto es la
   tinta: aclararlo hacia el blanco lo mandaría a 2,5:1, o sea casi ilegible, y
   oscurecerlo no se nota sobre 6,3:1. */
.header-top a:hover,
.header-top button:hover,
.header-top .dropdown-toggle:hover {
  text-decoration: underline;
}

.header-top__right {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  /* Mismo hueco que entre los reclamos del otro extremo, para que las dos
     mitades de la barra tengan el mismo ritmo. */
  gap: 1.25rem;
}

/* Reclamos (izq) y enlaces (der) a los dos extremos. Era una `.row` de dos
   columnas fijas (col-md-4 / col-md-8) y ahora es flex: los reclamos miden lo
   que miden y los enlaces se pegan al borde, sin que un texto más largo se
   parta contra un límite de columna que no le corresponde. */
.header-top__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
}

.sm-topbar__claims {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
  min-width: 0;
}

.sm-topbar__claim {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-weight: 500;
  white-space: nowrap;
}

.sm-topbar__icon {
  display: inline-flex;
  flex: 0 0 auto;
}

.sm-topbar__icon svg {
  width: 15px;
  height: 15px;
}

/* Los enlaces se distinguen del texto plano por el PESO, no por el color:
   sobre la barra de salvia todo es la misma tinta. */
.sm-topbar__link {
  font-weight: 600;
  white-space: nowrap;
}

/* La barra en móvil: los dos reclamos y el enlace no caben en un viewport de
   390 px —los textos llevan `white-space: nowrap`, así que no se parten, se
   salen—, de modo que se recorta a lo que cabe.

   Quien toque los textos, que vuelva a medir, y que mida los HIJOS: con
   `justify-content: space-between` el `scrollWidth` del contenedor iguala
   siempre a su ancho y da «no desborda» aunque desborde. */
@media (max-width: 767.98px) {
  .header-top {
    font-size: 0.75rem;
    padding-block: 0.35rem;
  }

  .header-top__inner,
  .header-top__right,
  .sm-topbar__claims {
    gap: 0.75rem;
  }

  /* Se queda el primero, que es el argumento de venta de la marca; el conteo
     de modelos lo dice ya el propio catálogo. */
  .sm-topbar__claim:nth-child(2) {
    display: none;
  }
}

.header-top .header-block {
  display: inline-flex;
  align-items: center;
}

/* El badge del carrito se posiciona en absoluto: necesita un ancestro
   posicionado también aquí, no sólo en la cabecera principal. */
.header-top .header-block__action-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

/* --- 4.2 Cabecera principal ----------------------------------------------- */
.header-bottom {
  background: var(--nxr-header-bg);
  color: var(--nxr-header-fg);
  border-bottom: 1px solid var(--nxr-line);
  padding-block: 0.85rem;
}

.header-bottom__logo img {
  max-height: 56px;
  width: auto;
}

/* La home mete el logo dentro de un <h1> por SEO; que no herede el tamaño. */
.header-bottom__h1 {
  font-size: inherit;
  line-height: 0;
  margin: 0;
}

/* Iconos de cuenta/carrito: círculo neutro, badge con el acento.
   Acotado a .header-bottom a propósito: ps_customersignin y ps_shoppingcart
   también se pintan en la barra superior (displayNav2), y allí el círculo de
   42 px no cabe — se montaba encima del selector de moneda. */
.header-bottom .header-block__action-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-surface-alt);
  color: var(--nxr-ink);
  position: relative;
  text-decoration: none;
  transition: background-color 0.15s ease;
}

.header-bottom .header-block__action-btn:hover {
  background: var(--nxr-accent-soft);
  color: var(--nxr-accent-dark);
}

.header-block__badge {
  position: absolute;
  top: -2px;
  inset-inline-end: -2px;
  min-width: 19px;
  height: 19px;
  padding-inline: 4px;
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-size: 0.6875rem;
  font-weight: 700;
  line-height: 19px;
  text-align: center;
}

/* Cabecera pegajosa. La clase la pone assets/js/nxr-theme.js; sin JS la
   cabecera se comporta como siempre, así que no hay dependencia dura. */
.nxr-header-sticky .header-bottom {
  position: fixed;
  top: 0;
  inset-inline: 0;
  z-index: 1030;
  box-shadow: var(--nxr-shadow);
  padding-block: 0.5rem;
}

.nxr-header-sticky .header-bottom__logo img {
  max-height: 40px;
}

/* Reserva el hueco que deja la cabecera al pasar a fixed: sin esto la página
   pega un salto justo al cruzar el umbral. La altura la escribe el JS. */
.nxr-header-spacer {
  display: none;
}

.nxr-header-sticky .nxr-header-spacer {
  display: block;
}

/* --- 4.2 bis Cabecera de Sillas y Mesas -----------------------------------
   Acompaña a templates/_partials/header.tpl, que parte en dos la fila única de
   Hummingbird:

     fila 1  logo · buscador · cuenta · carrito
     fila 2  mega-menú · CTA de teléfono

   Sin esa plantilla ninguna de estas reglas llega a aplicarse (las clases
   `sm-header__*` sólo existen allí y en el ps_searchbar.tpl del child).
   -------------------------------------------------------------------------- */

/* El buscador ocupa el hueco libre entre el logo y los iconos. `.ps-searchbar`
   trae `min-width: 19rem` de Hummingbird: dentro de una columna flexible eso
   le impide encogerse y desborda la fila en pantallas medias. */
.sm-header__search {
  min-width: 0;
}

.sm-header__search .ps-searchbar {
  width: 100%;
  min-width: 0;
  max-width: 42rem;
  margin-block: 0;
}

/* Cuenta y carrito. La regla de .header-bottom los pinta como un círculo de
   42 px, que es lo correcto para los marcadores de móvil (sólo icono) pero
   recorta el rótulo en escritorio: aquí el botón crece para llevar icono y
   texto en línea. */
.sm-header__block .header-block__action-btn {
  width: auto;
  height: auto;
  min-height: 42px;
  padding-inline: 0.85rem;
  gap: 0.45rem;
}

.sm-header__block .header-block__title {
  font-size: 0.875rem;
  font-weight: 600;
  line-height: 1;
  white-space: nowrap;
}

/* El contador del carrito. En el botón redondo va en absoluto sobre el icono,
   pero aquí el botón lleva rótulo y ese anclaje lo dejaría flotando en medio
   del texto: pasa a ser una pastilla en línea, detrás de «Carrito». Anclarlo
   al icono no es opción — el badge es hermano suyo, no hijo, así que habría
   que colocarlo con medidas fijas del icono y del padding. */
.sm-header__block .header-block__badge {
  position: static;
  inset: auto;
}

/* Carrito CON productos: `ps_shoppingcart` le pone `header-block--active` y
   Hummingbird tiñe el icono de `--bs-primary`, que aquí es el acento oscuro
   sobre la pastilla crema. Se deja seguir al botón con `inherit` para que en
   hover cambie con él en vez de quedarse fijo. */
.header-bottom .header-block--active,
.header-bottom .header-block--active .header-block,
.header-bottom .header-block--active .header-block__icon {
  color: inherit;
}

/* Con el carrito vacío el contador sería un «0» permanente. La clase
   `inactive` la pone ps_shoppingcart cuando products_count es 0.

   La regla cuelga de `.header-bottom` y NO de `.sm-header__block`, que sería
   lo natural en esta sección: en móvil el JS responsive de Hummingbird MUEVE el
   bloque real de ps_shoppingcart dentro de `#_mobile_ps_shoppingcart`, que no
   lleva esa clase — y ahí volvía a aparecer el «0». El `{if}` de la plantilla
   sólo cubre el marcador de posición, o sea el rato entre el HTML y el swap. */
.header-bottom .inactive .header-block__badge {
  display: none;
}

/* Fila 2: la franja del mega-menú.
   OJO: nada de `position` aquí ni en el contenedor. El panel desplegable de
   nxr_megamenu es `position: absolute` respecto al <header> para salir a ancho
   completo; cualquier ancestro posicionado por el medio se lo recortaría al
   ancho de la pestaña (está documentado en la cabecera de megamenu.css). */
.sm-header__nav {
  background: var(--nxr-menubar-bg);
  border-top: 1px solid var(--nxr-line);
  border-bottom: 1px solid var(--nxr-line);
}

/* El subrayado de las pestañas en salvia, que es exactamente lo que hacía la
   web anterior (`STSN_MENU_BOTTOM_BORDER_HOVER_COLOR`). El módulo lo pinta con
   el acento; aquí el acento es casi negro y la línea no se distinguía del
   texto. A 3 px el salvia sobre blanco se lee de sobra como decoración —no
   lleva texto encima, así que la regla de contraste no aplica. */
.sm-header__nav .nxr-mm-tab-link::after {
  background: var(--sm-sage);
  height: 3px;
  /* A plomo con el `padding-inline` de la pestaña, que aquí es más apretado que
     el del resto del tema (más abajo). El módulo lo posiciona con el suyo
     (0,9rem): si se toca uno, hay que mover el otro. */
  left: 0.5rem;
  right: 0.5rem;
}

/* La barra del menú va pegada a los bordes de la franja: el padding lo ponen
   los propios enlaces (.nxr-mm-tab-link), que así tienen toda la altura de
   la franja como zona de click. */
.sm-header__nav .nxr-mm {
  padding-inline: 0;
}

/* Icono y flecha de cada pestaña. El icono repite el de su panel (o el de la
   categoría a la que enlaza), y la flecha marca cuáles despliegan: hasta ahora
   sólo se sabía pasando el ratón por encima.

   Los dos son SVG del mismo sprite que ya carga el panel (`_iconos.tpl`), así
   que no añaden ni una petición ni un dibujo nuevo al HTML: sólo la referencia.

   `flex: 0 0 auto` en ambos: `.nxr-mm-tab-link` es flex y sin eso los SVG se
   comprimen antes que el texto, que es justo al revés de lo que interesa. */
.sm-header__nav .nxr-mm-tab-link {
  gap: 0.35rem;
}

.sm-mm-tab-icon {
  width: 15px;
  height: 15px;
  flex: 0 0 auto;
  color: var(--nxr-ink-soft);
}

/* Los iconos SÓLO a partir de 1400 px. Entre 1200 —donde arranca el menú de
   escritorio— y 1400, las nueve pestañas con icono piden 1.108 px y la franja
   da 1.025: se parten en dos líneas, que es justo lo que se arregló acortando
   los rótulos. Sin ellos sobran más de 100 px.

   Se esconde el icono y no la flecha porque la flecha es información —dice qué
   pestaña despliega— y el icono es decoración. */
@media (max-width: 1399.98px) {
  .sm-mm-tab-icon {
    display: none;
  }
}

/* Al abrir o pasar el ratón, el icono deja su salvia y sigue al texto: la
   pestaña entera responde como una pieza. */
.sm-header__nav .nxr-mm-tab-link:hover .sm-mm-tab-icon,
.sm-header__nav .nxr-mm-tab-link:focus-visible .sm-mm-tab-icon,
.sm-header__nav .nxr-mm-tab.is-open .sm-mm-tab-icon {
  color: inherit;
}

.sm-mm-tab-caret {
  width: 11px;
  height: 11px;
  flex: 0 0 auto;
  opacity: 0.5;
  transition: transform 0.18s ease;
}

.sm-header__nav .nxr-mm-tab.is-open .sm-mm-tab-caret {
  transform: rotate(180deg);
  opacity: 1;
}

/* Las nueve pestañas del cliente NO caben en una línea junto al CTA: piden
   1.496 px y en una ventana de 1.440 quedan 1.105. Envuelven (§6.1) y ocupan
   dos líneas, así que se alinean a la IZQUIERDA —a plomo con el logo de la
   fila de arriba— en vez de centradas: con el CTA anclado a la derecha, una
   segunda línea centrada se lee como un renglón suelto.
   Si algún día el menú baja de siete entradas, esto no estorba: con una sola
   línea, alineado a la izquierda es exactamente lo mismo que sin envolver. */
.sm-header__nav .nxr-mm-bar {
  justify-content: flex-start;
}

/* Y se aprieta cada pestaña un poco más que en el resto del tema: aquí compiten
   con el CTA y con los iconos por el ancho de la franja. El subrayado del hover
   está posicionado con los mismos valores que el padding: si se cambia uno, hay
   que mover el otro (§6.1). */
.sm-header__nav .nxr-mm-tab-link {
  padding-inline: 0.5rem;
}

/* Entre md y xl la franja se queda sólo con la hamburguesa del módulo y el
   CTA; sin esto hereda el alto de una barra de pestañas vacía. */
@media (max-width: 1199.98px) {
  .sm-header__nav {
    padding-block: 0.35rem;
  }
}

/* CTA del teléfono, al final de la franja del menú. Pastilla de acento con el
   número en blanco: es el único botón de la cabecera y tiene que leerse como
   tal, no como una pestaña más. El salvia no sirve aquí —sobre él el blanco da
   2,5:1— y ya tiene su sitio en la barra de arriba. */
.sm-header__cta {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.4rem 1rem;
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-weight: 700;
  font-size: 0.9375rem;
  line-height: 1.2;
  white-space: nowrap;
  text-decoration: none;
  transition: background-color 0.15s ease, color 0.15s ease;
}

/* Mismo gesto que el botón primario del tema: en hover el fondo va al acento
   oscuro y el texto al token que le corresponde. */
.sm-header__cta:hover,
.sm-header__cta:focus-visible {
  background: var(--nxr-accent-dark);
  color: var(--nxr-accent-dark-contrast);
  text-decoration: none;
}

.sm-header__cta-icon {
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
}

/* Móvil: la hamburguesa sube a la fila del logo y la franja del menú se vacía.

   El botón lo pinta header.tpl con la clase del módulo (`.nxr-mm-burger`), así
   que hereda sus 44×44 y sus tres barras; megamenu.js enlaza todas las que
   encuentra en el documento, de modo que abre el mismo offcanvas. La del módulo
   se esconde aquí.

   La franja NO se puede quitar con `display: none`: dentro vive
   `#nxr-mm-offcanvas`, que es `position: fixed` pero deja de pintarse si un
   ancestro está oculto. Se le quitan fondo, bordes y relleno y se colapsa sola,
   porque no le queda ningún hijo visible. */
.sm-header__burger {
  /* Las tres barras miden 22 px dentro de un botón de 44: sin esto el logo
     arranca con 11 px de aire de más respecto al borde del contenedor. */
  margin-inline-start: -0.6rem;
}

@media (max-width: 767.98px) {
  .sm-header__nav {
    padding-block: 0;
    background: none;
    border-top: 0;
    border-bottom: 0;
  }

  .sm-header__nav .nxr-mm-burger,
  .sm-header__cta {
    display: none;
  }

  /* Con la hamburguesa en esta fila son cinco piezas —hamburguesa, logo, lupa,
     cuenta y carrito—: el logo baja de 56 px de alto para que quepan todas en
     un viewport de 360. */
  .header-bottom__logo img {
    max-height: 42px;
  }
}

/* --- 4.3 Menú principal (ps_mainmenu) ------------------------------------- */
.header-nav-full-width,
#_desktop_top_menu {
  background: var(--nxr-menubar-bg);
}

#_desktop_top_menu .top-menu > li > a {
  color: var(--nxr-menubar-fg);
  font-weight: 600;
  text-decoration: none;
}

#_desktop_top_menu .top-menu > li > a:hover,
#_desktop_top_menu .top-menu > li.sfHoverForce > a {
  color: var(--nxr-accent);
}

#_desktop_top_menu .top-menu .sub-menu a:hover {
  color: var(--nxr-accent);
}

/* --- 4.4 Migas de pan ------------------------------------------------------ */
.breadcrumb__wrapper {
  padding-block: 0.75rem;
  font-size: 0.8125rem;
}

.breadcrumb {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.breadcrumb-item + .breadcrumb-item::before {
  content: "›";
  color: var(--nxr-ink-soft);
  padding-inline-end: 0.35rem;
}

.breadcrumb-link {
  color: var(--nxr-ink-soft);
  text-decoration: none;
}

.breadcrumb-link:hover {
  color: var(--nxr-accent);
  text-decoration: underline;
}

.breadcrumb-item:last-child {
  color: var(--nxr-ink);
  font-weight: 600;
}

/* --- 4.5 Tarjeta de producto ---------------------------------------------- */
.product-miniature__inner {
  height: 100%;
  display: flex;
  flex-direction: column;
  background: var(--nxr-surface);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  overflow: hidden;
  transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease;
}

.product-miniature__inner:hover {
  border-color: var(--nxr-accent-line);
  box-shadow: var(--nxr-shadow);
  transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
  .product-miniature__inner,
  .product-miniature__inner:hover {
    transform: none;
    transition: none;
  }
}

/* Fondo blanco y no el alterno: las fotos de catálogo suelen venir recortadas
   sobre blanco y el gris dibujaba un marco alrededor de cada una. */
.product-miniature__top {
  position: relative;
  background: var(--nxr-surface);
}

.product-miniature__bottom {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  gap: 0.75rem;
  padding: 0.9rem 1rem 1rem;
}

.product-miniature__infos {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

/* Título a dos líneas fijas: así los precios quedan alineados en toda la fila
   aunque los nombres tengan longitudes muy distintas. */
.product-miniature__title {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 2.8em;
  color: var(--nxr-ink);
  font-size: 0.9375rem;
  font-weight: 600;
  line-height: 1.4;
  text-decoration: none;
}

.product-miniature__title:hover {
  color: var(--nxr-accent);
}

.product-miniature__prices {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: auto;
}

.product-miniature__price {
  color: var(--nxr-price);
  font-size: 1.125rem;
  font-weight: 700;
}

.product-miniature__regular-price {
  color: var(--nxr-ink-soft);
  font-size: 0.875rem;
  text-decoration: line-through;
}

/* El botón de compra a ancho completo, pero SIN arrastrar los del selector de
   cantidad: son .btn también, y al estirarlos el grupo se apilaba en vertical y
   la tarjeta crecía hasta 124 px de alto. */
.product-miniature__actions > .btn,
.product-miniature__form > .btn,
.product-miniature__details {
  width: 100%;
}

.product-miniature__form {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.product-miniature__form .quantity-button {
  flex: 0 0 auto;
}

.product-miniature__add {
  flex: 1 1 auto;
}

/* Etiquetas de producto (rebaja, novedad…). */
.product-flags {
  position: absolute;
  top: 0.6rem;
  inset-inline-start: 0.6rem;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  margin: 0;
  padding: 0;
  list-style: none;
  pointer-events: none;
}

/* Hummingbird pinta cada etiqueta como <li class="badge …">, no .product-flag.
   El `.badge` del selector no es decorativo: el padre pinta con
   `.product-flags .badge` (0,2,0) y hace falta empatar en clases para ganarle.
   Un `.product-flags > li` a secas (0,1,1) perdería y las etiquetas volverían
   al azul de Bootstrap. */
.product-flags > li.badge {
  padding: 0.2rem 0.55rem;
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-size: 0.6875rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  line-height: 1.5;
}

.product-flags > li.discount,
.product-flags > li.on-sale,
.product-flags > li[class*="discount-"] {
  background: var(--nxr-sale);
  color: #fff;
}

/* PrestaShop emite el tipo con GUION BAJO (`out_of_stock`, ProductLazyArray:760),
   no con guion: la regla anterior decía `.out-of-stock` y no casaba con nada, así
   que un producto agotado llevaba la pastilla de acento igual que una novedad.
   `used` y `refurbished` (:266-286) comparten el gris: son estados del artículo,
   no un reclamo, y en lima competían con el precio. */
.product-flags > li.out_of_stock,
.product-flags > li.used,
.product-flags > li.refurbished {
  background: var(--nxr-ink-soft);
  color: #fff;
}

/* Título de sección.
   En Hummingbird `.section-title` sólo aporta el margen: el tamaño y el grosor
   los heredaba de ser un <h2>. Como el theme baja a <div> los títulos que no
   describen el producto («Comentarios», «otros productos de la misma
   categoría» — ver templates/modules/), hay que fijarlos aquí o esos bloques
   se quedarían con el texto del cuerpo. Vale igual para los que siguen siendo
   <h2>, así que los dos se ven idénticos. */
.section-title {
  font-family: var(--nxr-font-heading);
  font-size: 1.5rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  line-height: 1.25;
  color: var(--nxr-ink);
}

/* --- 4.6 Ficha de producto ------------------------------------------------- */
.product__prices .current-price-value,
.product-prices .current-price-value {
  color: var(--nxr-price);
  font-size: 1.75rem;
  font-weight: 700;
}

.product__prices .regular-price,
.product-prices .regular-price {
  color: var(--nxr-ink-soft);
  text-decoration: line-through;
}

.product-add-to-cart .btn-add-to-cart {
  padding-block: 0.7rem;
  font-size: 1rem;
}

.product-tabs .nav-tabs .nav-link.active {
  color: var(--nxr-accent);
  border-bottom-color: var(--nxr-accent);
}

/* --- 4.7 Listado de categoría ---------------------------------------------- */
.products {
  --bs-gutter-x: 1.25rem;
  --bs-gutter-y: 1.25rem;
}

@media (min-width: 992px) {
  /* 4 por fila en escritorio; Hummingbird trae 3. */
  .products > .js-product,
  .products > .product {
    flex: 0 0 auto;
    width: 25%;
  }
}

.search-filters,
.facet {
  border-radius: var(--nxr-radius);
}

.search-filters__title,
.facet__title {
  color: var(--nxr-ink);
  font-weight: 700;
}

/* --- 4.8 Checkout ----------------------------------------------------------
   Hummingbird pinta el paso activo con un gris muy oscuro fijo (#212529), que
   no dice nada. Con el acento se ve de un vistazo por dónde va la compra. */
.checkout-steps__step--current .checkout-steps__number,
.checkout-steps__step--reachable.checkout-steps__step--current .checkout-steps__number {
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
}

.checkout-steps__step--current .checkout-steps__btn {
  color: var(--nxr-accent);
  font-weight: 700;
}

/* --- 4.9 Pie de página -----------------------------------------------------
   El pie entero lo pinta `templates/_partials/footer.tpl`, que sustituye al de
   Hummingbird. Son cuatro franjas:

     __cta      reclamo sobre salvia, con el teléfono y «pedir presupuesto»
     __main     cuerpo oscuro: marca+redes y cuatro columnas
     __trust    garantías de marca y medios de pago
     __bottom   copyright y enlaces legales

   Colores: todo sale de los tokens del bloque 1. El cuerpo usa
   `--nxr-footer-bg` (= el acento, #23302e), `--nxr-footer-fg` (#c3cfcd) y
   `--nxr-footer-heading` (#fff). El salvia aparece SOLO como superficie —el
   fondo de la franja de llamada a la acción, el trazo bajo cada título de
   columna, el relleno de los iconos sociales al pasar por encima—, nunca como
   texto sobre claro: sobre blanco da 2,5:1 (ver la nota de `--sm-sage`).

   La rejilla la lleva este CSS y no las columnas de Bootstrap de cada módulo:
   `ps_linklist` emite sus bloques con `col-md-6 col-lg-3` propias y, si
   mandaran ellas, el ancho del pie dependería de cuántas columnas de enlaces
   tenga configuradas el cliente. Por eso hay copia de sus plantillas en
   `modules/` (las `col-*` son utilidades con `!important` dentro de
   `@layer utilities` y desde aquí no se pueden pisar).
   ========================================================================== */
.sm-foot {
  --sm-foot-gap: clamp(1.75rem, 3vw, 2.75rem);
  margin-top: var(--nxr-section-gap);
}

/* --- 1. Franja de llamada a la acción --------------------------------------
   Es la única franja de color del pie, y es la misma salvia de la barra
   superior de la cabecera: el pie cierra con el color con el que abre la
   página. El texto va en la tinta —#1f2422 sobre #7caead da 6,3:1—, nunca en
   blanco. */
.sm-foot__cta {
  background: var(--sm-sage);
  color: var(--nxr-ink);
  padding-block: 1.25rem;
}

.sm-foot__cta-inner {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1rem;
}

@media (width >= 62em) {
  .sm-foot__cta-inner {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 2rem;
  }
}

.sm-foot__cta-text {
  margin: 0;
  font-family: var(--nxr-font-heading);
  font-weight: 600;
  font-size: 1.125rem;
  line-height: 1.35;
  max-width: 52ch;
}

.sm-foot__cta-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem;
}

/* El botón sólido es el acento con el texto en blanco: sobre salvia, un botón
   claro no se despegaría del fondo. El fantasma invierte los dos. */
.sm-foot__cta-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.65rem 1.25rem;
  border: 2px solid var(--nxr-accent);
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-weight: 600;
  font-size: 0.95rem;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.sm-foot__cta-btn svg {
  width: 18px;
  height: 18px;
  flex: none;
}

.sm-foot__cta-btn:hover,
.sm-foot__cta-btn:focus-visible {
  background: transparent;
  color: var(--nxr-accent);
}

.sm-foot__cta-btn--ghost {
  background: transparent;
  color: var(--nxr-accent);
}

.sm-foot__cta-btn--ghost:hover,
.sm-foot__cta-btn--ghost:focus-visible {
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
}

/* --- 2. Cuerpo -------------------------------------------------------------- */
.sm-foot__before,
.sm-foot__main {
  background: var(--nxr-footer-bg);
  color: var(--nxr-footer-fg);
}

.sm-foot__before {
  padding-block: 1.5rem;
  border-bottom: 1px solid var(--nxr-footer-line);
}

.sm-foot__main {
  padding-block: clamp(2rem, 4vw, 3rem) clamp(1.5rem, 3vw, 2.25rem);
}

/* Móvil: una sola columna, con los bloques plegados en acordeón.
   Tableta: la marca a lo ancho y las tres columnas debajo (2 + 1).
   Escritorio: la marca a la izquierda y las tres a su derecha.

   Son TRES desde el 2026-09-01, cuando se quitó «Tu cuenta» del pie: si algún
   día se reactiva `ps_customeraccountlinks`, este `repeat(3, …)` hay que
   volver a subirlo a 4 o la cuarta columna se irá a una fila nueva. */
.sm-foot__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0 var(--sm-foot-gap);
}

@media (width >= 48em) {
  .sm-foot__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .sm-foot__brand {
    grid-column: 1 / -1;
  }
}

@media (width >= 62em) {
  .sm-foot__grid {
    grid-template-columns: minmax(0, 19rem) repeat(3, minmax(0, 1fr));
  }

  .sm-foot__brand {
    grid-column: auto;
  }
}

/* --- La columna de marca --- */
.sm-foot__brand {
  padding-block: 0.5rem 1.5rem;
}

.sm-foot__logo {
  display: inline-block;
  margin-bottom: 1.15rem;
}

.sm-foot__logo img {
  width: auto;
  height: 52px;
}

.sm-foot__claim {
  margin: 0 0 1.15rem;
  font-size: 0.9rem;
  line-height: 1.65;
  max-width: 40ch;
}

/* Redes sociales: círculo con filete, que se rellena de salvia al pasar. El
   icono pasa entonces a la tinta, que es lo único que se lee sobre salvia. */
.sm-foot__social ul {
  gap: 0.5rem;
}

.sm-foot__social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  padding: 0 !important; /* la plantilla del módulo trae `p-2` de Bootstrap */
  border: 1px solid var(--nxr-footer-line);
  border-radius: 50%;
  color: var(--nxr-footer-fg);
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.sm-foot__social a:hover,
.sm-foot__social a:focus-visible {
  background: var(--sm-sage);
  border-color: var(--sm-sage);
  color: var(--nxr-ink);
}

/* --- Bloques de columnas (ps_linklist, tu cuenta, la tienda) --- */
.sm-foot__block {
  padding-block: 0.35rem;
  border-top: 1px solid var(--nxr-footer-line);
}

@media (width >= 48em) {
  /* Fuera el acordeón: de tableta para arriba los bloques quedan abiertos.
     Hummingbird hace lo mismo con `.footer-block__content.collapse`, pero esa
     regla mira SUS clases y aquí las hemos renombrado; sin esto las cuatro
     columnas salen con el título y la lista en `display: none`.
     Gana por ir sin capa, no hace falta `!important`. */
  .sm-foot__block-content.collapse {
    display: block;
  }

  /* El filete de arriba sobra: separa el título de su propia lista en vez de
     separar bloques. El subrayado de salvia hace ya de marca de columna. */
  .sm-foot__block {
    border-top: 0;
  }
}

.sm-foot__block-title {
  position: relative;
  margin: 0;
  padding-block: 0.85rem;
  color: var(--nxr-footer-heading);
  font-weight: 600;
  font-size: 0.8125rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.sm-foot__block-title a {
  color: inherit;
  text-decoration: none;
}

/* El trazo de salvia bajo el título: sólo de escritorio para arriba, porque en
   móvil el título es el tirador del acordeón y el filete ya lo delimita. */
@media (width >= 48em) {
  .sm-foot__block-title {
    padding-block: 0 0.9rem;
    margin-bottom: 0.35rem;
  }

  .sm-foot__block-title::after {
    content: "";
    position: absolute;
    inset-block-end: 0;
    inset-inline-start: 0;
    width: 2rem;
    height: 2px;
    background: var(--sm-sage);
  }
}

/* Botón de acordeón (sólo móvil): ocupa el ancho del título para que se pueda
   pulsar en cualquier punto, sin `.stretched-link` (que se sale del bloque). */
.sm-foot__toggle {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
}

.sm-foot__toggle i {
  font-size: 1.5rem;
  transition: transform 0.2s ease;
}

.sm-foot__toggle:not(.collapsed) i {
  transform: rotate(180deg);
}

.sm-foot__block-content {
  padding-bottom: 1rem;
}

.sm-foot__list {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 0.55rem;
}

.sm-foot__list a,
.sm-foot__contact a,
.sm-foot__store-link {
  color: var(--nxr-footer-fg);
  font-size: 0.9rem;
  text-decoration: none;
}

.sm-foot__list a:hover,
.sm-foot__list a:focus-visible,
.sm-foot__contact a:hover,
.sm-foot__contact a:focus-visible {
  color: var(--nxr-footer-heading);
  text-decoration: underline;
}

/* --- Columna «La tienda» --- */
.sm-foot__contact {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 0.85rem;
  font-size: 0.9rem;
  line-height: 1.5;
}

.sm-foot__contact li {
  display: flex;
  gap: 0.65rem;
  align-items: flex-start;
}

.sm-foot__contact-icon {
  flex: none;
  display: inline-flex;
  width: 20px;
  height: 20px;
  margin-top: 0.1rem;
  color: var(--sm-sage);
}

.sm-foot__contact-icon svg {
  width: 100%;
  height: 100%;
}

.sm-foot__addr {
  margin: 0;
  font-style: normal;
}

.sm-foot__muted {
  color: color-mix(in srgb, var(--nxr-footer-fg) 72%, var(--nxr-footer-bg));
}

.sm-foot__store-link {
  display: inline-block;
  margin-top: 1rem;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.sm-foot__store-link:hover,
.sm-foot__store-link:focus-visible {
  color: var(--nxr-footer-heading);
}

/* Cajones para lo que se enganche mañana a los hooks del pie. */
.sm-foot__extra,
.sm-foot__after {
  border-top: 1px solid var(--nxr-footer-line);
  padding-top: 1.5rem;
  margin-top: 1.5rem;
}

/* --- 3. Garantías y medios de pago ------------------------------------------
   Tarjeta bancaria (Visa y Mastercard), PayPal, Bizum y transferencia,
   según la revisión del cliente del 2026-09-11. */
.sm-foot__trust {
  background: var(--nxr-footer-bg);
  color: var(--nxr-footer-fg);
  border-top: 1px solid var(--nxr-footer-line);
  padding-block: 1.35rem;
}

.sm-foot__trust-inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1.25rem 2rem;
}

.sm-foot__promises {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem 2rem;
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: 0.85rem;
  line-height: 1.45;
}

.sm-foot__promises li {
  display: flex;
  align-items: center;
  gap: 0.7rem;
}

.sm-foot__promises strong {
  color: var(--nxr-footer-heading);
  font-weight: 600;
}

.sm-foot__promise-icon {
  flex: none;
  display: inline-flex;
  width: 26px;
  height: 26px;
  color: var(--sm-sage);
}

.sm-foot__promise-icon svg {
  width: 100%;
  height: 100%;
}

.sm-foot__payments {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
}

.sm-foot__payments-label {
  color: var(--nxr-footer-fg);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
}

/* Las marcas de tarjeta son logotipos de color: van sobre tarjeta blanca, que
   es como se reproducen bien y como esperan sus guías de marca. */
.sm-foot__pay {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 3.25rem;
  height: 1.75rem;
  padding-inline: 0.55rem;
  border-radius: var(--nxr-radius-sm);
  background: #fff;
  color: #1a1f71; /* el azul de Visa: el SVG pinta con currentColor */
}

.sm-foot__pay svg {
  height: 0.9rem;
  width: auto;
}

.sm-foot__pay img {
  display: block;
  width: auto;
  height: 1.1rem;
  max-width: 5rem;
  object-fit: contain;
}

/* El wordmark oficial es blanco; sobre esta pastilla se reproduce en negro. */
.sm-foot__pay--paypal img {
  height: 1.5rem;
  filter: brightness(0);
}

.sm-foot__pay--card {
  gap: 0.5rem;
}

.sm-foot__pay--bank {
  color: var(--nxr-ink);
}

.sm-foot__pay--bank svg {
  height: 1.3rem;
}

/* --- 4. Copyright ------------------------------------------------------------ */
.sm-foot__bottom {
  background: var(--nxr-accent-dark);
  color: color-mix(in srgb, var(--nxr-footer-fg) 78%, var(--nxr-accent-dark));
  padding-block: 1rem;
  font-size: 0.8125rem;
}

.sm-foot__bottom-inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem 1.5rem;
}

.sm-foot__legal {
  margin: 0;
}

.sm-foot__legal-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Hueco para el botón flotante de WhatsApp (`nxr_whatsapp`), que es
   `position: fixed` en la esquina inferior derecha y taparía el último enlace.
   Sólo de escritorio para arriba: en móvil los enlaces van en su propia línea,
   debajo del copyright y a la izquierda, y ese hueco sólo serviría para partir
   la lista en tres renglones. */
@media (width >= 62em) {
  .sm-foot__legal-links {
    padding-inline-end: 4.5rem;
  }
}

.sm-foot__legal-links a {
  color: inherit;
  text-decoration: none;
}

.sm-foot__legal-links a:hover,
.sm-foot__legal-links a:focus-visible {
  color: var(--nxr-footer-heading);
  text-decoration: underline;
}

/* Franjas del pie que se quedan sin contenido.
   La plantilla decide si pintarlas con `{if $smarty.capture.…}`, y esa captura
   no viene vacía aunque no haya nada que enseñar: los módulos que no pintan
   dejan igualmente sus comentarios HTML de apertura y cierre. El resultado es
   una banda de color con su padding y cero contenido (se vio al desactivar
   ps_emailsubscription: ps_socialfollow sin redes configuradas dejaba 56 px de
   franja vacía). Hoy vuelve a hacer falta con `blockreassurance`, que está
   enganchado a los dos hooks del pie pero trae `PSR_HOOK_FOOTER = 0`.

   `:empty` no sirve —hay nodos de texto y comentarios—; `:not(:has(*))` mira si
   queda algún hijo ELEMENTO, que es la pregunta real. */
.sm-foot__before:not(:has(*)),
.sm-foot__extra:not(:has(*)),
.sm-foot__after:not(:has(*)) {
  display: none;
}
/* =============================================================================
   5. MÓDULOS NEXIR
   -----------------------------------------------------------------------------
   Los módulos nxr_* traen su propio CSS y consumen los tokens de arriba, así que
   aquí sólo se resuelve lo que un módulo no puede saber por su cuenta: el ritmo
   vertical entre bloques de la home y el ancho de sus contenedores.
   ========================================================================== */
/* La home va contenida (ver templates/index.tpl). Varios módulos traen su propio
   .container dentro del bloque; anidado en el de la home sumaría otro ancho
   máximo y otro padding, y esos bloques saldrían más estrechos que el resto.
   Aquí se neutralizan: manda el contenedor de la home. */
.nxr-home .container,
.nxr-home .container-md,
.nxr-home .container-lg,
.nxr-home .container-xl {
  max-width: none;
  width: 100%;
  padding-inline: 0;
}

/* Escotilla para el bloque que sí deba ir a sangre (un slider de cabecera, por
   ejemplo). El margen negativo se calcula desde el ancho real del contenedor,
   así que funciona con cualquier valor de --nxr-container. */
.nxr-home > .nxr-bleed {
  width: 100vw;
  margin-inline: calc(50% - 50vw);
}

/* Hummingbird ya monta la home como un grid de una columna con su propio
   `gap`, así que la separación entre bloques se ajusta AHÍ. Antes esto añadía
   un `margin-top` a cada hijo y el resultado era la suma de los dos
   (40 px de gap + 72 px de margen = 112 px entre bloque y bloque).
   Un solo mecanismo: el row-gap del grid. */
.page-content--home {
  row-gap: var(--nxr-section-gap);
  padding-block-start: 1.75rem;
}

.page-content--home > * {
  margin-block: 0;
}

/* Los módulos cuelgan de displayHome su marcado Y sus <script> sueltos. En un
   contenedor grid, cada script ocupa su propia celda y arrastra otro row-gap:
   un hueco fantasma del que no hay ni rastro en el HTML visible. */
.page-content--home > script,
.page-content--home > link,
.page-content--home > style {
  display: none;
}

/* El popup de nxr_popups se pinta al final del body; su z-index debe superar
   la cabecera sticky (1030) sin taparse con los modales de Bootstrap (1055). */
.nxr-popup__overlay,
.nxr-popup__bar {
  z-index: 1040;
}

/* El botón flotante de WhatsApp: dos correcciones sobre lo que trae el módulo.

   1. `nxr_whatsapp` lo publica con `z-index: 99999`, que es la guerra de
      z-index de siempre: por encima de TODO, incluidos el menú de móvil, los
      modales de Bootstrap (1055) y el buscador a pantalla completa. Un botón
      decorativo no puede ganarle a un diálogo. Se baja por debajo de la
      cabecera (1021), y con eso queda también por debajo de la barra de compra
      (1035), de los popups (1040), de los modales, del menú (§6.1 ter) y de
      los toasts (1090) — pero sigue por encima de todo el contenido normal,
      que no tiene z-index.

   2. Estaba a `bottom: 5rem` en móvil «para no solaparse con el aviso de
      cookies de PrestaShop». **Ese aviso no existe**: no hay ningún módulo de
      cookies instalado en esta tienda (está en «Pendiente para el paso a
      producción»). O sea que compensaba algo que no está y, a cambio, plantaba
      un círculo de 56 px en mitad de la zona baja de la pantalla: tapaba el
      campo de correo del formulario de contacto y las líneas de «Descuento(s)»
      y «Transporte» del resumen del carrito — el importe del envío, oculto.

      Vuelve a la esquina. El día que se instale el aviso de cookies hay que
      añadir su selector a la regla `:has()` de §7.9, junto a la barra de
      compra, en vez de subir el botón a ciegas en todas las páginas.

   Las dos son correcciones del MÓDULO, no de esta tienda: van anotadas en
   «Pendiente» para llevarlas al almacén canónico. Aquí se parchean desde el
   tema para no divergir del almacén por una regla de una línea. */
.nxr-whatsapp__btn {
  z-index: 1020;
}

@media (max-width: 767.98px) {
  .nxr-whatsapp__btn {
    bottom: 1rem;
  }
}

/* =============================================================================
   6. AJUSTES DE ESTA TIENDA
   -----------------------------------------------------------------------------
   Lo que sólo aplica aquí: el menú con las nueve pestañas del cliente, los
   bloques de la home y la banda de preguntas frecuentes. Todo consume los
   tokens del bloque 1; no hay un solo hex de marca en esta sección.
   ========================================================================== */

/* --- 6.1 Megamenú: nueve pestañas no caben en una línea ---------------------
   El menú de la tienda tiene nueve entradas y algunas son largas
   («Complementos de Hostelería», «Parasoles y Sombrillas»). `.nxr-mm-bar` es un
   flex sin `wrap`, así que la barra medía 2.364 px en una ventana de 1.200 y
   arrastraba a TODA la página al scroll horizontal.

   Se deja envolver y se aprieta un poco cada pestaña. El menú es configurable
   desde el BO, así que el número de entradas puede cambiar en cualquier
   momento: la barra tiene que aguantar cualquier cantidad sin desbordar, no
   caber justo con estas nueve. */
.nxr-mm-bar {
  flex-wrap: wrap;
  justify-content: center;
}

.nxr-mm-tab-link {
  padding-inline: 0.7rem;
  font-size: 0.875rem;
}

/* El subrayado del hover está posicionado con los mismos valores que el padding
   original (0.9rem); al cambiarlo hay que moverlo o queda descuadrado. */
.nxr-mm-tab-link::after {
  left: 0.7rem;
  right: 0.7rem;
}

/* --- 6.1 bis Desplegables del menú: rejilla de iconos ----------------------
   Acompaña a `modules/nxr_megamenu/views/templates/hook/megamenu.tpl` del tema,
   que añade un icono a cada entrada. Sin esa plantilla estas reglas no llegan a
   aplicarse.

   El panel del módulo es una lista a `column-count: 4`: con nueve entradas
   llenaba tres columnas y dejaba media pantalla en blanco, y sin más pista
   visual que el texto. Aquí pasa a rejilla de tarjetas con icono, que llena el
   ancho y da algo que mirar.

   Los iconos son SVG de trazo en un sprite del propio HTML: ni una petición de
   red, y escalan sin pesar. Dentro de un panel algunos se repiten (las nueve
   entradas de «Sillas» son nueve sillas) y es lo correcto: el icono da ritmo y
   familia, el rótulo es el que informa.

   OJO con la especificidad: todo cuelga de `.nxr-mm-panel` (o de
   `.nxr-mm-acc-panel`) a propósito. El CSS del módulo trae `.nxr-mm-cols a`,
   que con una clase y un elemento gana a un `.sm-mm-card` a secas: la tarjeta
   se quedaba en `display: block` —con lo que el icono se iba a la izquierda y
   el `align-items` no hacía nada— y encima el menú se pintaba «bien», sólo que
   descuadrado. Con el prefijo son dos clases y manda esta hoja. Nada de
   `!important`: aquí no hace falta, y en este tema apenas se usa (cuatro
   declaraciones en total, ver §6.4).
   -------------------------------------------------------------------------- */
.sm-mm-sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}

/* `columns` explícito: `column-count` no aplica a un contenedor de rejilla, así
   que bastaría con el `display: grid`, pero dejarlo escrito evita que el día
   que esto vuelva a ser un bloque reaparezcan las columnas del módulo. */
.nxr-mm-panel .sm-mm-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.25rem 1rem;
  columns: unset;
  padding-block: 1.5rem;
}

/* Por debajo de 1400 px, tres columnas: con cuatro, «Sillas de Terraza Especial
   verano» —el rótulo más largo del menú— se parte en dos líneas y descuadra la
   fila. */
@media (max-width: 1399.98px) {
  .nxr-mm-panel .sm-mm-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.nxr-mm-panel .sm-mm-grid li {
  margin: 0;
}

/* La tarjeta es HORIZONTAL —icono a la izquierda, rótulo a la derecha— y no en
   vertical con el rótulo centrado debajo. Se probaron las dos sobre la página
   ya montada: así los rótulos quedan alineados a la izquierda y se recorren de
   un vistazo, ninguno se parte en dos líneas y el panel de «Sillas» baja de 278
   a 241 px de alto. */
.nxr-mm-panel .sm-mm-card {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  height: 100%;
  padding: 0.55rem 0.5rem;
  color: var(--nxr-ink);
  text-decoration: none;
}

/* El hover no pinta la fila: sólo responde el rótulo, con el verde oscuro y su
   subrayado. Se probó con la tarjeta entera en crema y con el icono saltando a
   salvia pleno, y cambiaban tres cosas a la vez para señalar una. */
.nxr-mm-panel .sm-mm-card:hover .sm-mm-card__label,
.nxr-mm-panel .sm-mm-card:focus-visible .sm-mm-card__label {
  color: var(--nxr-accent-dark);
  text-decoration: underline;
}

/* El icono va SUELTO, sin pastilla de fondo: con 24 cuadros de color seguidos
   el panel pesaba más como retícula de cajas que como lista de enlaces. Solo el
   dibujo, y en tinta suave.

   No cambia al pasar el ratón: es decorativo puro —el rótulo dice lo mismo—,
   así que ni le aplica el mínimo de contraste de texto ni tiene que responder.

   `flex: 0 0 auto` y medidas fijas para que no se comprima cuando el rótulo es
   largo: sin eso el cuadro se estrecha y el dibujo sale ovalado. Además ancla
   todos los rótulos de una columna a la misma sangría. */
.nxr-mm-panel .sm-mm-card__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  color: var(--nxr-ink-soft);
}

.nxr-mm-panel .sm-mm-card__icon svg {
  width: 24px;
  height: 24px;
}

.nxr-mm-panel .sm-mm-card__label {
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1.3;
}

/* --- Acordeón de móvil ---
   El mismo icono, en línea antes del rótulo. Aquí no lleva pastilla: son 24
   entradas seguidas en una columna estrecha y 24 cuadros de color pesarían más
   de lo que ayudan. */
.nxr-mm-acc-panel .sm-mm-acc-link {
  display: flex;
  align-items: center;
  gap: 0.65rem;
}

.nxr-mm-acc-panel .sm-mm-acc-icon {
  width: 22px;
  height: 22px;
  flex: 0 0 auto;
  color: var(--nxr-ink-soft);
}

/* --- 6.1 ter El menú de móvil se abre DENTRO de la cabecera -----------------
   `#nxr-mm-offcanvas` y su `.nxr-mm-backdrop` cuelgan del `<header>` (fila 2 de
   `_partials/header.tpl`), y el `<header>` es `position: sticky` con
   `z-index: 1021` — o sea que **crea un contexto de apilamiento**. Los z-index
   que el módulo le pone al panel (1075) y al velo (1070) se resuelven DENTRO de
   ese contexto: hacia fuera, el menú entero vale 1021.

   Consecuencia: todo lo que viva en el contexto raíz por encima de 1021 se
   pinta ENCIMA del menú abierto, y el velo no lo tapa. Con el menú abierto en
   una ficha, `elementFromPoint()` sobre la barra de compra devolvía
   `.sm-buybar__add`: se podía pulsar «Añadir al carrito» a través del menú.
   La lista completa de lo que se colaba: `.sm-buybar` (1035),
   `.nxr-popup__*` (1040), `#product-modal` (1055) y `.nxr-whatsapp__btn`
   (99999, ver §5).

   Se eleva la cabecera ENTERA mientras el menú esté abierto. No se toca el
   z-index del panel ni el del velo —el problema no es suyo, y son del módulo—:
   se sube el contexto que los encierra, que es lo que este tema ha creado.

   1080 y no más: los toasts (`#js-toast-container`, 1090) tienen que seguir
   viéndose por encima, y el buscador a pantalla completa de `nxr_search`
   también, que se abre desde la propia cabecera.

   `:has()` en vez de una clase en el `<body>`: el JS del módulo no marca el
   body al abrir (sólo pone `is-open` en el panel y el velo), y tocar el módulo
   por esto crearía divergencia con el almacén canónico por una regla que es
   culpa del tema. Es el mismo recurso que ya usa §7.9 con la barra de compra. */
body:has(#nxr-mm-offcanvas.is-open) .header {
  z-index: 1080;
}

/* --- 6.2 «Cuatro razones» (nxr_homefeatures) -------------------------------
   Ver la plantilla propia en `modules/nxr_homefeatures/…/home.tpl`. */
/* Va en la crema, no en el acento: por debajo vienen «Los más vendidos» (que
   `nxr_hotproducts` pinta con el acento) y la banda de presupuesto en salvia.
   Con este bloque también oscuro, la home eran tres franjas de color seguidas. */
.sm-razones {
  background: var(--nxr-surface-alt);
  color: var(--nxr-ink);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  /* El mínimo del clamp baja de 1.75rem a 1.25rem: con el margen de página ya
     en 16 px, 28 px de relleno dejaban el texto de la tarjeta en 302 px de los
     390 de la pantalla. Sólo cambia por debajo de 500 px de ventana, que es
     donde 4vw se queda corto; de ahí para arriba manda el 4vw como antes. */
  padding: clamp(1.25rem, 4vw, 3rem);
  display: grid;
  grid-template-columns: minmax(0, 20rem) minmax(0, 1fr);
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}

@media (width < 62em) {
  .sm-razones {
    grid-template-columns: minmax(0, 1fr);
  }
}

.sm-razones__title {
  font-size: clamp(1.5rem, 2.5vw, 2rem);
  margin-bottom: 0.75rem;
  color: inherit;
}

/* La segunda mitad del título (lo que va tras la coma) en el salvia de marca:
   es el único sitio de la home donde el salvia lleva texto encima, y sobre el
   fondo oscuro del bloque da 5,5:1. */
.sm-razones__title .title-after {
  color: var(--sm-sage-ink);
}

.sm-razones__subtitle {
  color: var(--nxr-ink-soft);
  margin-bottom: 1.25rem;
}

/* El botón se queda con el `.btn-primary` del tema (acento sobre crema, 13,8:1):
   no hace falta invertir nada. */

/* Dos columnas fijas, no `auto-fit`: con `minmax(13rem, 1fr)` en el hueco que
   queda al lado de la columna de texto caben tres, y la cuarta razón se quedaba
   sola en una fila colgando bajo la primera. Cuatro razones piden 2×2. */
.sm-razones__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.5rem 2rem;
}

@media (width < 40em) {
  .sm-razones__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.sm-razones__item {
  display: flex;
  gap: 1rem;
  align-items: start;
  font-size: 0.9375rem;
  line-height: 1.6;
}

.sm-razones__img {
  width: 3rem;
  height: 3rem;
  object-fit: contain;
  flex: none;
}

/* El módulo emite el rótulo de cada razón como `<strong>`: se le da el peso de
   un encabezado sin serlo, que es lo correcto — son cuatro reclamos, no
   secciones del documento. */
.sm-razones__text strong {
  display: block;
  color: var(--nxr-ink);
  font-family: var(--nxr-font-heading);
  font-size: 1.0625rem;
  font-weight: 600;
  margin-bottom: 0.35rem;
}

.sm-razones__text {
  color: var(--nxr-ink-soft);
}

/* --- 6.3 Preguntas frecuentes del texto SEO --------------------------------
   Cada pregunta es un `<h3>` con su respuesta debajo, en una tarjeta. No se usa
   `<details>`: PrestaShop pasa el cuerpo de `nxr_customtext` por HTMLPurifier al
   guardarlo y esas etiquetas no están en su lista blanca — desaparecen sin dar
   error y las preguntas quedan como texto suelto. */
.sm-faq {
  display: grid;
  gap: 0.5rem;
  margin-top: 2rem;
  text-align: start;
}

.sm-faq__item {
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius);
  background: var(--nxr-surface);
}

.sm-faq__q {
  margin: 0;
  padding: 1.125rem 1.25rem 0.5rem;
  font-family: var(--nxr-font-heading);
  font-size: 1.0625rem;
  font-weight: 600;
  color: var(--nxr-ink);
  /* Barra de acento a la izquierda: da a la lista un ritmo visible sin
     depender de un icono ni de JavaScript. */
  border-inline-start: 3px solid var(--sm-sage);
  margin-inline-start: -1px;
  padding-inline-start: 1.25rem;
}

.sm-faq__a {
  padding: 0 1.25rem 1.125rem;
  color: var(--nxr-ink-soft);
}

.sm-faq__a p:last-child {
  margin-bottom: 0;
}


/* --- 6.3 bis Iconos de las cuatro razones ----------------------------------
   Un icono de trazo por razón, del sprite propio del tema
   (`_partials/sm-iconos-razones.tpl`). Van en salvia: aquí el color es
   decoración, no información, y el texto de al lado sigue en tinta. */
.sm-razones__item {
  display: flex;
  align-items: flex-start;
  gap: 0.875rem;
}

.sm-razones__ico {
  flex: 0 0 auto;
  width: 1.75rem;
  height: 1.75rem;
  /* Alinea el icono con la primera línea del rótulo, no con la caja. */
  margin-top: 0.125rem;
  fill: none;
  stroke: var(--sm-sage);
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Por debajo de móvil grande el icono roba ancho al texto y las razones se
   parten en tres líneas: se reduce, no se esconde (es lo que da el vistazo). */
@media (width < 30em) {
  .sm-razones__ico {
    width: 1.5rem;
    height: 1.5rem;
  }
}

/* --- 6.4 «Los más vendidos» (nxr_hotproducts) ------------------------------
   El módulo pinta el bloque Y su cabecera con
   `background-color: var(--nxr-accent) !important`, así que salía un panel de
   750 px de tinta en mitad de la home. Aquí se sirve en claro: fondo de página
   y la columna de texto en el neutro.

   ⚠️ `!important` aquí es deliberado y excepcional: en la cascada de
   declaraciones «important» sólo se gana con más especificidad Y otro
   `!important`, así que contra el del módulo no hay otra salida. Con éstos, el
   tema entero tiene cuatro declaraciones `!important` —las otras dos son el
   `link-primary` del §2 y el `padding` del botón del pie— y ninguna más.
   Lo suyo sería que el módulo no forzara el color; pendiente de corregir en el
   almacén canónico. */
.nxr-home .nxr_hotproducts {
  background-color: var(--nxr-surface) !important;
}

.nxr-home #nxr_hotproducts-cabecera {
  background-color: var(--nxr-surface-alt) !important;
  border-radius: var(--nxr-radius-lg);
}

/* El módulo escribe los textos en blanco, para el fondo oscuro que ya no hay. */
.nxr_hotproducts h2,
.nxr_hotproducts .h2,
.nxr_hotproducts .cab_izda,
.nxr_hotproducts .cab_izda * {
  color: var(--nxr-ink);
}

.nxr_hotproducts #nxr_hotproducts-cabecera {
  display: flex;
  align-items: center;
}

.nxr_hotproducts .cab_izda .title {
  font-family: var(--nxr-font-heading);
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  line-height: 1.15;
  margin-bottom: 0.75rem;
}

/* El módulo pinta esta línea con `font-weight: 200`. El color cumple AA
   (4,94:1 sobre el neutro), pero a peso 200 el texto se lee desvaído igual: el
   contraste se mide sobre el color y el trazo fino no entra en la cuenta. Con
   peso normal se lee, sin tocar el color. */
.nxr_hotproducts .cab_izda .description {
  color: var(--nxr-ink-soft);
  font-weight: 400;
  line-height: 1.6;
  margin-bottom: 0;
  max-width: 24ch;
}

/* El «Ver más» fuera: la plantilla del módulo lo pinta siempre, así que se
   esconde desde aquí —igual que las muestras y el bloque de compra— en vez de
   copiar la plantilla al tema por un solo elemento. El `link` sigue guardado en
   `ps_nxr_hotproducts.link` por si se quiere recuperar. */
#nxr_hotproducts-cabecera .cab_izda a.btn {
  display: none;
}

/* Flechas redondas y en claro: sobre fondo blanco el cuadrado gris del módulo
   se lee como un recorte. No se sacan al hueco entre columnas aunque quepan:
   el carrusel es `overflow: hidden` y saldrían partidas por la mitad. */
#splide_nxr_hotproducts .splide__arrow {
  background-color: var(--nxr-surface);
  border: 1px solid var(--nxr-line);
  border-radius: 50%;
}

/* --- 6.4 bis Fichas de los dos carruseles de la portada ---------------------
   «Los más vendidos» y «Productos destacados» se pintaban distinto entre sí. Van
   iguales: tarjeta blanca con filete, sin muestras de acabado y sin bloque de
   compra —desde la portada se entra al producto, que es donde se elige acabado
   y cantidad—. */
.nxr_hotproducts .splide__slide > .product-miniature,
.nxr-featured-products .splide__slide > .product-miniature {
  background-color: var(--nxr-surface);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  overflow: hidden;
}

/* Fuera las muestras de acabado: son hasta 16 cuadraditos que estiraban una
   tarjeta 126 px por encima de las demás, y no se pueden elegir sin entrar. */
.nxr_hotproducts .product-miniature__variants,
.nxr-featured-products .product-miniature__variants {
  display: none;
}

/* Fuera el bloque de compra: cantidad y «Añadir al carrito». En una tienda que
   vende packs y presupuesta por proyecto, comprar de una en una desde la
   portada aporta poco y ocupa dos líneas de cada tarjeta. */
.nxr_hotproducts .product-miniature__actions,
.nxr-featured-products .product-miniature__actions {
  display: none;
}

/* Splide iguala las diapositivas pero NO las tarjetas de dentro. Se estira la
   tarjeta y el precio, que ahora es lo último, se ancla al pie: así todos
   quedan en la misma línea. */
.nxr_hotproducts .splide__slide > .product-miniature,
.nxr-featured-products .splide__slide > .product-miniature,
.nxr_hotproducts .product-miniature__inner,
.nxr-featured-products .product-miniature__inner {
  height: 100%;
}

.nxr_hotproducts .product-miniature__inner,
.nxr-featured-products .product-miniature__inner,
.nxr_hotproducts .product-miniature__bottom,
.nxr-featured-products .product-miniature__bottom,
.nxr_hotproducts .product-miniature__infos,
.nxr-featured-products .product-miniature__infos {
  display: flex;
  flex-direction: column;
}

.nxr_hotproducts .product-miniature__bottom,
.nxr-featured-products .product-miniature__bottom,
.nxr_hotproducts .product-miniature__infos,
.nxr-featured-products .product-miniature__infos {
  flex: 1 1 auto;
}

.nxr_hotproducts .product-miniature__prices,
.nxr-featured-products .product-miniature__prices {
  margin-top: auto;
  padding-top: 0.5rem;
}

@media (width < 62em) {
  .nxr_hotproducts .cab_izda .description {
    max-width: none;
  }
}

/* --- 6.5 Titular de la portada (index.tpl) ---------------------------------
   El `<h1>` real de la home, que Hummingbird no pone. Va sobre el carrusel:
   es lo primero que lee un rastreador y lo primero que confirma al visitante
   dónde ha caído. */
.sm-home-intro {
  text-align: center;
  max-width: 46rem;
  margin-inline: auto;
  padding-block: 0.5rem 0.25rem;
}

.sm-home-intro__title {
  font-size: clamp(1.75rem, 3.5vw, 2.5rem);
  margin-bottom: 0.5rem;
}

.sm-home-intro__lead {
  color: var(--nxr-ink-soft);
  font-size: 1.0625rem;
  line-height: 1.6;
  margin-bottom: 0;
}

/* --- 6.6 Carrusel de cabecera (nxr_banners) --------------------------------
   El módulo pinta la imagen a ancho completo sin fijar proporción, así que la
   altura del carrusel es la de la imagen más alta. Con una pieza cuadrada de
   600×600 el bloque medía 1.176 px de alto y dejaba media pantalla de hueco.
   Se fija la proporción del banner ancho y se recorta lo que sobre: así el
   carrusel mide lo mismo suba el cliente la imagen que suba. */
.nxr_banners_home img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: var(--nxr-radius-lg);
}

.nxr_banners_home picture,
.nxr_banners_home .ntb-slide,
.nxr_banners_home .swiper-slide {
  display: block;
  aspect-ratio: 1920 / 500;
}

@media (width < 48em) {
  .nxr_banners_home picture,
  .nxr_banners_home .ntb-slide,
  .nxr_banners_home .swiper-slide {
    aspect-ratio: 16 / 9;
  }
}


/* --- 6.6 bis Estructura 1+2 del carrusel (nxr_banners, format_2) ------------
   El módulo declara el reparto con `width: calc(75% - 20px)` + `margin-right`
   sobre dos items shrinkables. Esos 20 px de margen desbordan la línea por
   redondeo y flexbox encoge AMBOS hasta repartirlos a partes iguales: sale un
   50/50 que no está escrito en ninguna parte. Se rehace con `gap` y `flex` sin
   base automática, que no depende del subpíxel.
   (Pendiente de llevar al almacén canónico: el fallo es del módulo, no del tema.) */
.nxr_banners_home.format_2 {
  gap: 20px;
  align-items: stretch;
}

.format_2 .ntb-slider {
  flex: 3 1 0;
  min-width: 0;
  margin-right: 0;
}

.format_2 .ntb-slider_small {
  flex: 1 1 0;
  min-width: 0;
}

/* La proporción del hueco grande la fija el slider; el 1920/500 de arriba es
   la del formato 1 y aquí sobra. A 9/4 el banner gana 46 px de alto sobre la
   proporción nativa de la imagen (2,53) y `cover` recorta un 11 % del ancho,
   repartido a los lados: se va parte del olivo y de la pérgola, nada del
   titular, que va centrado. */
.format_2 .ntb-slider picture {
  aspect-ratio: 9 / 4;
}

/* Los dos pequeños reparten la altura que deje el grande, sea cual sea el
   ancho de ventana, y la foto se recorta con `cover`. Casar tres proporciones
   a mano sólo cuadraría a un ancho concreto. */
.format_2 .ntb-slider_small .banner_homesmall {
  flex: 1 1 0;
  min-height: 0;
}

.format_2 .banner_homesmall a,
.format_2 .banner_homesmall picture {
  display: block;
  height: 100%;
  aspect-ratio: auto;
}

/* Y la imagen dentro, que es donde se rompía la cadena: el módulo trae
   `.nxr_banners_home .ntb-slider_small img { height: auto }` con dos clases
   (0,2,1) y le gana a la regla del tema (0,1,1), así que la foto se quedaba a
   su alto natural y dejaba el hueco vacío bajo cada banner. Se nota sólo
   cuando el hueco deja de coincidir con la proporción de la imagen —pasó al
   subir el slider a 9/4— y hasta entonces cuadraba por casualidad. */
.format_2 .ntb-slider_small .banner_homesmall img {
  height: 100%;
  object-fit: cover;
}

/* En móvil el 1+2 se apila: el grande recupera su proporción y los pequeños
   dejan de repartir altura porque ya no hay ninguna que repartir. */
@media (width < 62em) {
  /* El módulo apila con `width: 100%`, pero un `flex-basis: 0` gana a
     cualquier `width`: hay que revertir el flex, no sólo el ancho. */
  .format_2 .ntb-slider,
  .format_2 .ntb-slider_small {
    flex: 1 1 100%;
  }
  .format_2 .ntb-slider_small .banner_homesmall {
    flex: 0 0 auto;
  }
  /* La misma proporción que tienen las imágenes (640×406), que es la del
     hueco en escritorio. Con otra, `cover` recorta por los lados y se lleva
     el rótulo, que arranca al 6 % del ancho. */
  .format_2 .banner_homesmall a,
  .format_2 .banner_homesmall picture,
  .format_2 .ntb-slider_small .banner_homesmall img {
    height: auto;
    aspect-ratio: 640 / 406;
  }
}

/* --- 6.7 Rejilla de categorías destacadas (nxr_homecategories) --------------
   Fotos reales del catálogo, configuradas como imágenes propias del módulo.
   El marco 4:3 y contain muestran patas y respaldos completos. Las miniaturas
   de origen son cuadradas. darken integra el blanco con el fondo de la tarjeta
   y mantiene las zonas oscuras y las sombras de la foto. Es una presentación
   CSS: los JPG originales no pasan a tener transparencia. */
.item_nxr_homecategories .img_nxr_homecategories {
  display: block;
  width: 100%;
  max-width: none;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: contain;
  background: transparent;
  mix-blend-mode: darken;
  border-radius: var(--nxr-radius);
}

.item_nxr_homecategories {
  padding: 16px 16px 18px;
  isolation: isolate;
}

/* En móvil, el formato cuadrado deja reconocer el mueble a dos columnas. */
@media (max-width: 575.98px) {
  .item_nxr_homecategories {
    padding: 10px 10px 14px;
  }
  .item_nxr_homecategories .img_nxr_homecategories {
    aspect-ratio: 1 / 1;
  }
  .item_nxr_homecategories .title_nxr_homecategories {
    font-size: 0.875rem;
    line-height: 1.4;
  }
}

/* --- 6.8 Página de contacto (templates/contact.tpl) -------------------------
   Acompaña a templates/contact.tpl y al <h2> de
   modules/contactform/views/templates/widget/contactform.tpl.

   Móvil primero: una sola columna con el FORMULARIO delante de las tarjetas
   (`order: -1`), porque en un móvil el teléfono y el WhatsApp ya están a un
   toque en la cabecera y en el botón flotante de nxr_whatsapp; lo que no hay
   en ningún otro sitio es el formulario. A partir de 992 px, dos columnas con
   los canales a la izquierda.

   Sólo tokens, ni un hexadecimal. Dos reglas de la paleta mandan aquí:
   `--nxr-accent` es la tinta y va de FONDO con `--nxr-accent-contrast` dentro;
   el salvia es decorativo y sólo admite texto oscuro encima (`--sm-sage-ink`,
   6,3:1), nunca blanco (2,5:1). */

/* El layout de contacto es layout-left-column (config/theme.yml) y contact.tpl
   vacía el bloque `left_column` entero, así que no queda ni el <div>: aquí sólo
   hay que devolverle el ancho al centro. Las clases de rejilla de Bootstrap
   (col-*) no llevan `!important` —eso es cosa de las utilidades, ver §4.8—, así
   que desde fuera de las capas se pisan sin pelea. */
#contact #center-column {
  flex: 0 0 100%;
  max-width: 100%;
  width: 100%;
}

.sm-contact {
  max-width: 1180px;
  margin: 0 auto 3rem;
}

/* --- Hero --- */
.sm-contact__head {
  text-align: center;
  margin-bottom: 2rem;
}

.sm-contact__eyebrow {
  display: inline-block;
  margin-bottom: 0.75rem;
  padding: 0.3rem 0.9rem;
  border-radius: var(--nxr-radius-pill);
  background: var(--sm-sage);
  color: var(--sm-sage-ink);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

.sm-contact__title {
  font-family: var(--nxr-font-heading);
  font-size: clamp(1.75rem, 4.5vw, 2.4rem);
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  line-height: 1.15;
  color: var(--nxr-ink);
  margin: 0 0 0.75rem;
}

.sm-contact__lead {
  max-width: 42rem;
  margin: 0 auto;
  font-size: 1.02rem;
  line-height: 1.65;
  color: var(--nxr-ink-soft);
}

/* --- Rejilla --- */
.sm-contact__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.25rem;
}

.sm-contact__info {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  min-width: 0;
}

/* En móvil el formulario va primero (ver cabecera de la sección). */
.sm-contact__form {
  order: -1;
  min-width: 0;
}

@media (width >= 62em) {
  .sm-contact__grid {
    grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
    gap: 1.75rem;
    align-items: start;
  }

  .sm-contact__form {
    order: 0;
  }
}

/* --- Tarjetas --- */
.sm-contact__card {
  display: flex;
  gap: 1rem;
  padding: 1.25rem;
  background: var(--nxr-surface);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  box-shadow: var(--nxr-shadow);
  transition: transform 0.15s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}

.sm-contact__card:hover {
  transform: translateY(-2px);
  border-color: var(--nxr-ink-soft);
  box-shadow: var(--nxr-shadow-lg);
}

/* Hummingbird fija --bs-heading-color en h1..h6 con más especificidad que el
   `color` del contenedor; sin esto los títulos de tarjeta se van a su gris. */
.sm-contact h1,
.sm-contact h2 {
  color: inherit;
}

.sm-contact__icon {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--nxr-radius);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
}

.sm-contact__icon svg {
  width: 22px;
  height: 22px;
}

.sm-contact__card-body {
  min-width: 0;
}

.sm-contact__card-title {
  font-family: var(--nxr-font-heading);
  font-size: 1.05rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  color: var(--nxr-ink);
  margin: 0 0 0.5rem;
}

.sm-contact__note {
  margin: 0.35rem 0 0;
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--nxr-ink-soft);
}

/* El dato grande: teléfono y correo. `word-break` porque el correo de la tienda
   mide 30 caracteres y en un móvil estrecho se sale de la tarjeta. */
.sm-contact__big {
  display: inline-block;
  font-size: 1.2rem;
  font-weight: 700;
  color: var(--nxr-ink);
  text-decoration: none;
  word-break: break-word;
}

.sm-contact__big:hover,
.sm-contact__big:focus-visible {
  color: var(--nxr-ink);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* El botón de WhatsApp va en el acento de marca, no en el verde corporativo de
   WhatsApp: en esta hoja no entran hexadecimales de marca ajena (§1). */
.sm-contact__wa {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: 0.9rem;
  padding: 0.6rem 1.1rem;
  border-radius: var(--nxr-radius);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-size: 0.93rem;
  font-weight: 600;
  line-height: 1;
  text-decoration: none;
  transition: transform 0.15s ease, box-shadow 0.18s ease;
}

.sm-contact__wa svg {
  width: 18px;
  height: 18px;
  flex: none;
}

.sm-contact__wa:hover,
.sm-contact__wa:focus-visible {
  color: var(--nxr-accent-contrast);
  transform: translateY(-2px);
  box-shadow: var(--nxr-shadow);
}

/* --- Horario --- */
.sm-contact__hours {
  list-style: none;
  margin: 0;
  padding: 0;
  font-size: 0.95rem;
}

.sm-contact__hours li {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.4rem 0;
  border-bottom: 1px dashed var(--nxr-line);
  color: var(--nxr-ink-soft);
}

.sm-contact__hours li:last-child {
  border-bottom: 0;
}

.sm-contact__hours strong {
  color: var(--nxr-ink);
  font-weight: 600;
}

.sm-contact__closed {
  color: var(--nxr-sale);
}

/* --- Reclamo de presupuesto ---
   Mismo lenguaje visual que la franja `sm-foot__cta` del pie (§4.9): salvia de
   fondo, tinta encima, botón sólido de acento y botón fantasma. Se repite
   porque es el mismo mensaje, y repetirlo con otra forma lo debilitaría. */
.sm-contact__quote {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1.25rem;
  margin-top: 1.75rem;
  padding: 1.75rem 1.5rem;
  border-radius: var(--nxr-radius-lg);
  background: var(--sm-sage);
  color: var(--sm-sage-ink);
}

/* A lo ancho la franja se pone en fila, como la del pie. El texto se queda a
   52ch: a 1.180 px de contenedor, una línea corrida sería ilegible. */
@media (width >= 62em) {
  .sm-contact__quote {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 2rem;
    padding: 1.75rem 2rem;
  }

  .sm-contact__quote-copy {
    max-width: 52ch;
  }
}

.sm-contact__quote-title {
  font-family: var(--nxr-font-heading);
  font-size: 1.15rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  line-height: 1.3;
  margin: 0 0 0.5rem;
}

.sm-contact__quote-text {
  margin: 0;
  font-size: 0.97rem;
  line-height: 1.55;
}

.sm-contact__quote-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem;
}

.sm-contact__quote-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.65rem 1.25rem;
  border: 2px solid var(--nxr-accent);
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-weight: 600;
  font-size: 0.95rem;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.sm-contact__quote-btn svg {
  width: 18px;
  height: 18px;
  flex: none;
}

.sm-contact__quote-btn:hover,
.sm-contact__quote-btn:focus-visible {
  background: transparent;
  color: var(--nxr-accent);
}

.sm-contact__quote-btn--ghost {
  background: transparent;
  color: var(--nxr-accent);
}

.sm-contact__quote-btn--ghost:hover,
.sm-contact__quote-btn--ghost:focus-visible {
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
}

/* --- Dirección fiscal ---
   Sin tarjeta ni icono a propósito: es un pie de página de la columna, no un
   canal de contacto. Si se le pone la misma caja que a las demás, vuelve a
   parecer una invitación a ir. */
.sm-contact__legal {
  margin-top: 1.25rem;
  padding: 0 0.25rem;
  font-size: 0.85rem;
  line-height: 1.55;
  text-align: center;
  color: var(--nxr-ink-soft);
}

.sm-contact__legal-note {
  margin: 0 0 0.3rem;
}

.sm-contact__legal-addr {
  font-style: normal;
  margin: 0;
}

/* --- Formulario ---
   El widget trae su propia `section.contact-form`; aquí sólo se le da la caja
   para que pese lo mismo que las tarjetas de al lado. */
.sm-contact__form .contact-form {
  padding: 1.5rem;
  background: var(--nxr-surface);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  box-shadow: var(--nxr-shadow);
}

.sm-contact-form__title {
  font-family: var(--nxr-font-heading);
  font-size: 1.35rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  color: var(--nxr-ink);
  margin: 0 0 0.4rem;
}

.sm-contact-form__hint {
  margin: 0 0 1.25rem;
  font-size: 0.93rem;
  line-height: 1.55;
  color: var(--nxr-ink-soft);
}
/* --- 6.9 Botón del panel de presupuesto (nxr_advice) ------------------------
   El módulo pinta su botón como un contorno: `background: transparent` con un
   borde de 1px del color del texto. Sobre el panel salvia de la portada eso
   deja LA llamada a la acción principal de la home reducida a una línea de un
   píxel: el texto se lee sin problema (tinta sobre salvia, 6,3:1), pero la
   caja no se ve, y un botón que no parece un botón no se pulsa.

   Se sirve sólido en tinta, que es el patrón del resto de la web: el CTA de
   las «cuatro razones», el del teléfono de la cabecera y el del teléfono del
   pie. En este tema el salvia marca SUPERFICIE y lo accionable va siempre en
   la tinta (ver §1). Blanco sólido se habría visto casi tan poco: sobre salvia
   da 1,99:1 de superficie contra los 6,3:1 de la tinta.

   No se toca el módulo, que es del almacén canónico: ahí el contorno es el
   comportamiento correcto por defecto —el banner puede llevar cualquier color
   de fondo configurado desde el BO— y esto es una decisión de marca de ESTA
   tienda. Misma norma que la sección 7.

   Especificidad: el módulo escribe `.nxr_advice_home_btn:hover span` (0,2,1),
   así que las reglas de aquí llevan el contenedor delante para superarla.
   `custom.css` se carga el último, pero contra (0,2,1) no bastaba con ir
   después. */
.nxr_advice_home .nxr_advice_home_btn {
  background: var(--nxr-accent);
  border-color: var(--nxr-accent);
  color: var(--nxr-surface);
}

.nxr_advice_home .nxr_advice_home_btn span,
.nxr_advice_home .nxr_advice_home_btn svg {
  color: var(--nxr-surface);
}

/* Al pasar el ratón se invierte a superficie con la tinta encima. NO al salvia
   del panel: dejaría el botón otra vez fundido con su propio fondo, que es el
   defecto que arregla este bloque. */
.nxr_advice_home .nxr_advice_home_btn:hover,
.nxr_advice_home .nxr_advice_home_btn:focus-visible {
  background: var(--nxr-surface);
  border-color: var(--nxr-surface);
}

.nxr_advice_home .nxr_advice_home_btn:hover span,
.nxr_advice_home .nxr_advice_home_btn:hover svg,
.nxr_advice_home .nxr_advice_home_btn:focus-visible span,
.nxr_advice_home .nxr_advice_home_btn:focus-visible svg {
  color: var(--nxr-accent);
}


/* --- 6.10 Dos bloques de la portada sangran el texto sin motivo -------------
   `nxr_customtext` y `nxr_findus` traen `padding-inline: 16px` en su
   contenedor (`.nxr-customtext` y `.nxr-findus__inner`). En escritorio es el
   relleno de un bloque ancho y no molesta, pero **ninguno de los dos pinta
   fondo, borde ni sombra**: en móvil ese relleno no rellena nada, sólo mete el
   texto 16 px más adentro que el resto de la portada. Medido: su titular
   arrancaba en 28 px cuando el de los demás bloques arranca en el margen de
   página.

   Es la única sangría de este tipo en toda la tienda: se barrieron portada,
   categoría, ficha, buscador, carrito, checkout y contacto buscando elementos
   anchos con relleno lateral y sin nada que pintar, y sólo salieron estos dos.

   Ojo con confundirlo con el relleno de las cajas que SÍ tienen fondo —la
   crema de «Cuatro razones», el panel salvia de presupuesto, la cabecera de
   «Los más vendidos»—: ahí los 15-28 px son el aire de la tarjeta y tienen que
   quedarse. La diferencia no es cuánto relleno hay, es si hay algo pintado
   detrás. */
@media (max-width: 767.98px) {
  .nxr-customtext,
  .nxr-findus__inner {
    padding-inline: 0;
  }
}

/* =============================================================================
   7. COLORES QUE SE COLABAN DESDE LOS MÓDULOS
   -----------------------------------------------------------------------------
   Siete colores que no salían de ningún token: los traían los módulos `nxr_*`
   con literales en vez de `var(--nxr-*)`, y por eso no se enteraban de un
   cambio de marca desde el back office. Ninguno rompía el contraste; el
   problema era que multiplicaban la paleta (cinco grises distintos para el
   mismo papel, cuatro «blancos» a distancia 7 unos de otros).

   Se corrigen DESDE AQUÍ y no en `../prestashop/modules/`, que es el almacén
   canónico compartido: un cambio allí lo heredarían todas las tiendas que
   monten esos módulos, y esto es una decisión de marca de ESTA tienda.

   Gana por orden de carga: `custom.css` se registra como `theme-custom` con
   priority 1000, así que va después del CSS de los módulos, y los selectores
   son de la misma especificidad (una clase). No hace falta `!important`.

   Se respetan a propósito los colores de logotipo: `.nxr-findus__icon--wa`
   conserva el verde de WhatsApp, igual que las pastillas de Visa y Mastercard
   del pie. Son marcas registradas, no decoración.
   ========================================================================== */

/* nxr_homecategories: fondo #f7f8fa y título #344054 (gris azulado). Es el
   bloque con más superficie de la portada. */
.item_nxr_homecategories {
  background: var(--nxr-surface-alt);
}

.title_nxr_homecategories {
  color: var(--nxr-ink);
}

/* nxr_findus y nxr_customtext: #333 para el cuerpo de texto. */
.nxr-findus__text,
.nxr-customtext__body,
.nxr-customtext__body p {
  color: var(--nxr-ink);
}

/* nxr_findus: los iconos venían sobre `rgba(0, 58, 238, .08)` — un AZUL, el
   único color de toda la web fuera del rango de la marca. */
.nxr-findus__icon:not(.nxr-findus__icon--wa) {
  background: var(--nxr-accent-soft);
  color: var(--nxr-ink);
}

/* Preguntas frecuentes del texto SEO: heredaban el #212529 de Hummingbird
   porque son `<h3>` y el tema padre pinta los encabezados con su propio gris. */
.sm-faq__q {
  color: var(--nxr-ink);
}

/* Estos tres necesitan MÁS especificidad que la clase suelta: los módulos los
   pintan con un selector descendente (0,1,1 y 0,2,0), y una regla de una sola
   clase pierde por mucho que vaya después en el fichero. Se igualan aquí.

   Es la misma trampa que la de las utilidades de Bootstrap, pero al revés: no
   es que no se pueda pisar, es que hay que hacerlo con la misma arma. */

/* nxr_customtext pinta sus encabezados con #212529 escrito a mano. Es el que
   se lleva las preguntas frecuentes de la portada. */
.nxr-customtext__body h2,
.nxr-customtext__body h3 {
  color: var(--nxr-ink);
}

/* Los tres titulos SEO que la tienda anterior pintaba en la portada y la
   migracion no trajo (ver `scripts/php/restaurar-seo-home.php`). Comparten
   cuerpo con el parrafo de bienvenida y con el acordeon, y Hummingbird no da
   margen superior a sus <h3>: con `margin-top: 0` los 16px que los separan del
   parrafo de ARRIBA son exactamente los mismos que los separan del suyo, o sea
   que cada titulo queda equidistante y no se lee de que parrafo es titulo. No
   es un fallo visible, es un texto que se lee peor sin saber por que.

   Se les da el aire que ya tiene el acordeon de preguntas frecuentes, que va
   justo debajo y en el mismo cuerpo. */
.nxr-customtext__body .sm-seo__q {
  margin-top: 32px;
}

/* nxr_homefeaturedproducts: #1a1a1a en el título de la sección. */
.nxr-featured-products .products-section-title {
  color: var(--nxr-ink);
}

/* Las flechas de Splide vienen con el gris de la librería. */
.splide__arrow {
  background: var(--nxr-surface-alt);
}

/* =============================================================================
   7. FICHA DE PRODUCTO
   -----------------------------------------------------------------------------
   La ficha era lo último que quedaba de Hummingbird sin tocar: al desinstalar
   `nxr_freeshippingbar` desapareció `catalog/product.tpl` del tema y la página
   volvió a heredarla entera del padre.

   El problema que ordena todo lo demás: la galería mide 810 px de alto y el
   bloque de compra 486, pero el contenedor es una rejilla con `align-items:
   normal`, así que la columna derecha se ESTIRA hasta 810 y deja medio folio
   en blanco bajo el botón de comprar. En las fichas de una sola foto —la Silla
   Napoleón, por ejemplo— es peor.

   Va con `templates/catalog/product.tpl`, que mete la descripción DENTRO de la
   misma rejilla. Ese fichero explica por qué.
   ========================================================================== */

/* --- 7.1 Galería, compra y descripción en una sola rejilla ------------------
   Tres hijos y cuatro celdas: la compra ocupa las dos filas de la derecha y se
   queda pegada mientras se lee la descripción de la izquierda.

       ┌────────────┬────────┐
       │ gallery    │  buy   │
       ├────────────┤ (fija) │
       │ info       │        │
       └────────────┴────────┘

   Tres cosas que hay que saber, porque las tres fallan en silencio:

     · `align-items: start` es OBLIGATORIO para que el sticky exista. Un grid
       item estirado ya ocupa toda su fila, así que nunca tiene margen para
       despegarse: se queda quieto y no hay ni un aviso de por qué.
     · El carril del pegado es el CONTENEDOR, no la página. Con la descripción
       fuera de la rejilla —que es como viene de Hummingbird— la columna se
       despega en cuanto acaba la galería, justo cuando empieza lo que hay que
       leer. Por eso la descripción tuvo que entrar aquí dentro.
     · El `top` tiene que despejar la cabecera, que es sticky y va a lo ancho.
       Las alturas están MEDIDAS: 176 px entre 992 y 1199 —donde el megamenú aún
       no se ha desplegado a su barra— y 164 px de 1200 arriba. Más 1 rem.

   Por debajo de 992 Hummingbird deja el contenedor en una columna, y ahí no
   hace falta ni rejilla ni áreas: el orden del DOM ya es el bueno —foto,
   precio y botón, y al final el texto largo—, que es justo por lo que la
   descripción va la TERCERA en la plantilla y no la segunda.
   ------------------------------------------------------------------------- */
@media (min-width: 992px) {
  .page-product .sm-pdp {
    align-items: start;
    grid-template-areas:
      "gallery buy"
      "info    buy";
  }

  .page-product .sm-pdp .product__left {
    grid-area: gallery;
  }

  .page-product .sm-pdp .sm-pdp__info {
    grid-area: info;
  }

  .page-product .sm-pdp .product__right {
    grid-area: buy;
    position: sticky;
    top: 12rem; /* 176 px de cabecera + 16 de aire */
  }
}

@media (min-width: 1200px) {
  .page-product .sm-pdp .product__right {
    top: 11.25rem; /* 164 px de cabecera + 16 de aire */
  }
}

/* La descripción necesita aire respecto a la galería; en móvil, respecto al
   bloque de compra que ahora tiene encima. */
.sm-pdp__info {
  margin-block-start: 2.5rem;
}

/* --- 7.2 La galería no manda sobre el alto de la página ---------------------
   Las imágenes de producto son cuadradas (`product_main`, 720×720) y la columna
   izquierda se lleva el 55 % del contenedor, así que la foto salía a 691 px de
   alto y arrastraba con ella toda la primera pantalla.

   Se acota con `max-block-size` + `object-fit: contain`: la silla se sigue
   viendo entera —sólo sobra aire a los lados— y quien quiera el detalle tiene
   el botón de zoom, que Hummingbird ya trae.
   ------------------------------------------------------------------------- */
@media (min-width: 992px) {
  .page-product .product__carousel .carousel-item img {
    max-block-size: 32rem;
    object-fit: contain;
  }
}

/* --- 7.3 Las garantías, en el panel crema del sitio -------------------------
   `blockreassurance` vivía en `.product__bottom-right`, una columna estrecha al
   lado de la descripción, con los cuatro reclamos apilados. Al mover la
   descripción a la rejilla de arriba se queda sin sitio, y de paso gana.

   Se le da el MISMO envoltorio que a las «cuatro razones» de la portada (§6.2):
   panel crema, filete de 1 px y radio grande. No es una decisión estética
   suelta —es que los dos bloques dicen casi lo mismo (fabricación propia,
   envío, presupuesto) y verlos con dos formas distintas en dos páginas hace
   pensar que son cosas diferentes.

   El módulo separa el rótulo de su texto con un `<br>`; aquí el rótulo ya es
   `display: block`, así que ese salto sobra y se esconde.
   ------------------------------------------------------------------------- */
.sm-pdp__reassurance {
  margin-block: 3rem;
  padding: clamp(1.5rem, 3vw, 2.25rem);
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  background: var(--nxr-surface-alt);
}

.sm-pdp__reassurance .blockreassurance {
  display: grid;
  gap: 1.75rem;

  /* El módulo trae un `margin-bottom: 2rem` propio. Dentro del panel eso no es
     separación entre bloques, es un hueco muerto bajo la última línea: el panel
     medía 197 px para 91 de contenido y se veía descentrado. */
  margin: 0;
}

@media (min-width: 768px) {
  .sm-pdp__reassurance .blockreassurance {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.75rem 2rem;
  }
}

@media (min-width: 992px) {
  .sm-pdp__reassurance .blockreassurance {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

.sm-pdp__reassurance .reassurance {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
}

.sm-pdp__reassurance .reassurance__image {
  flex: none;
  inline-size: 2.25rem;
}

.sm-pdp__reassurance .reassurance__image img,
.sm-pdp__reassurance .reassurance__image svg {
  inline-size: 2.25rem;
  block-size: 2.25rem;
}

.sm-pdp__reassurance .reassurance__content br {
  display: none;
}

.sm-pdp__reassurance .reassurance__title {
  display: block;
  margin-block-end: 0.3rem;
  font-family: var(--nxr-font-heading);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--nxr-ink);
}

.sm-pdp__reassurance .reassurance__desc {
  display: block;
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--nxr-ink-soft);
}

/* --- 7.4 Referencia y datos, al pie de la descripción -----------------------
   Una tira en línea, no el acordeón cerrado del padre: casi siempre contiene
   una sola línea —la referencia—, porque `ps_feature` está vacía, y abrir un
   desplegable para leer siete caracteres no tiene sentido.

   Va al final de la descripción (2026-09-01, decisión del cliente). Antes
   estaba en la columna de compra, junto al precio. El filete de arriba la ata
   visualmente al texto que la precede, como un pie; sin él quedaría flotando a
   media página. En las 17 fichas sin descripción no hay texto al que atarla, y
   entonces el filete sobra: sería una raya suelta bajo la columna de compra.
   ------------------------------------------------------------------------- */
.sm-pdp__data-foot {
  margin-block: 0 2.5rem;
  padding-block-start: 0.9rem;
  border-block-start: 1px solid var(--nxr-line);
}

.sm-pdp__data-foot--alone {
  padding-block-start: 0;
  border-block-start: 0;
}

.sm-pdp__data {
  margin-block: 0;
}

.sm-pdp__data-list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.15rem 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sm-pdp__data-item {
  display: flex;
  gap: 0.4rem;
  font-size: 0.875rem;
  color: var(--nxr-ink-soft);
}

.sm-pdp__data-value {
  color: var(--nxr-ink);
  font-weight: 600;
}

/* --- 7.5 El precio dice de una vez que es sin IVA ---------------------------
   La tienda muestra los precios SIN impuestos, igual que la web anterior
   —«89,99 € (impuestos excl.)»—: es una decisión del cliente, no un descuido de
   la migración, y aquí no se cambia. Lo que sí se cambia es cómo se lee.

   Hummingbird lo deja debajo, en gris claro y a 12 px: parece la letra pequeña
   de una condición, cuando es la diferencia entre 89,99 y 108,89 €. Pasa a la
   MISMA línea del precio y con peso, para que se lea a la vez que la cifra y no
   después.

   El precio tachado, cuando lo hay, se lleva su propia línea con un
   `flex-basis: 100%` — que es lo que corresponde en un contenedor flexible, y
   no un `width`: un ancho sobre un item encogible es una base que puede ceder.
   ------------------------------------------------------------------------- */
.page-product .product__prices-block {
  display: flex;
  flex-direction: row; /* Hummingbird lo trae en `column`: sin esto no pasa nada */
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: 0.65rem;
}

/* Lo que NO comparte línea con el precio: el tachado va encima y el precio de
   pack, debajo. Se les da `flex-basis: 100%` y no un `width`, que en un item
   encogible es una base que puede ceder. */
.page-product .product__prices-block > .product__discount-price,
.page-product .product__prices-block > .product__pack-price,
.page-product .product__prices-block > .product__taxless-price {
  flex-basis: 100%;
}

.page-product .product__tax-infos {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--nxr-ink-soft);
}

/* --- 7.6 Tramos de descuento por volumen ------------------------------------
   309 productos de esta tienda tienen escalado por cantidad y 280 reglas
   arrancan por encima de una unidad. Hummingbird lo pintaba como una tabla de
   tres columnas al final del formulario: información correcta y completamente
   inerte.

   Aquí son botones que escriben su cantidad en el campo (§ initQuantityTiers
   de custom.js). El tramo aplicado se marca solo, que es lo que le falta a
   quien escribe «60» a mano y no sabe si ya tiene el descuento de 50.

   El activo se marca con un `box-shadow: inset` y NO con un borde más grueso:
   engordar el borde mueve el contenido un píxel y la fila entera da un salto al
   pasar de un tramo a otro.
   ------------------------------------------------------------------------- */
.sm-tiers {
  margin-block: 1.1rem;
}

.sm-tiers__title {
  margin-block-end: 0.5rem;
  font-size: 0.875rem;
  font-weight: 700;
  color: var(--nxr-ink);
}

.sm-tiers__list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sm-tiers__item {
  display: flex;
  flex-direction: column;
  gap: 0.05rem;
  padding: 0.5rem 0.8rem;
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius);
  background: var(--nxr-surface);
  color: var(--nxr-ink);
  text-align: start;
  cursor: pointer;
}

.sm-tiers__item:hover {
  border-color: var(--nxr-accent);
}

.sm-tiers__item.is-active {
  border-color: var(--nxr-accent);
  background: var(--nxr-surface-alt);
  box-shadow: inset 0 0 0 1px var(--nxr-accent);
}

.sm-tiers__qty {
  font-size: 0.875rem;
  font-weight: 700;
}

.sm-tiers__off {
  font-weight: 700;
  color: var(--nxr-sale);
}

.sm-tiers__save {
  font-size: 0.75rem;
  color: var(--nxr-ink-soft);
}

/* --- 7.7 La segunda vía: presupuesto ----------------------------------------
   La tienda vende por carrito Y por teléfono, y la ficha sólo conocía el
   primero.

   Va en SALVIA, y eso no es decoración: en esta web el salvia es el color de
   «pedir presupuesto». Lo son la franja del pie (`sm-foot__cta`) y el reclamo
   de la página de contacto (`sm-contact__quote`), los otros dos sitios donde se
   pide lo mismo. Quien haya visto cualquiera de los dos reconoce éste sin leerlo.

   Sobre salvia sólo se lee texto oscuro —da 2,47:1 sobre blanco—, así que todo
   lo de dentro va en la tinta: 6,3:1. La jerarquía entre los dos enlaces la da
   la forma, no el color, igual que en el pie: el teléfono sólido y el WhatsApp
   en contorno.

   Y sigue sin competir con «Añadir al carrito»: el botón de compra es tinta
   sólida sobre blanco a plena anchura; esto es un bloque aparte, más abajo y
   con otro fondo. Son dos caminos, no dos botones iguales.
   ------------------------------------------------------------------------- */
.sm-pdp__quote {
  margin-block-start: 1.5rem;
  padding: 1.25rem 1.35rem;
  border-radius: var(--nxr-radius-lg);
  background: var(--sm-sage);
  color: var(--sm-sage-ink);
}

.sm-pdp__quote-title {
  margin: 0 0 0.4rem;
  font-family: var(--nxr-font-heading);
  font-size: 1.0625rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  line-height: 1.3;
  color: inherit;
}

/* El cuerpo NO se atenúa con `opacity`: sobre el salvia, bajar la tinta se
   come el contraste enseguida. La diferencia con el título la dan el tamaño y
   el peso, que es lo que se hace en el resto de la tienda. */
.sm-pdp__quote-text {
  margin: 0 0 1rem;
  font-size: 0.9rem;
  line-height: 1.55;
  color: inherit;
}

.sm-pdp__quote-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}

.sm-pdp__quote-link {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.5rem 0.95rem;
  border: 1px solid var(--nxr-accent);
  border-radius: var(--nxr-radius-pill);
  background: var(--nxr-accent);
  color: var(--nxr-accent-contrast);
  font-size: 0.9rem;
  font-weight: 600;
  text-decoration: none;
}

.sm-pdp__quote-link--ghost {
  background: transparent;
  color: var(--sm-sage-ink);
}

.sm-pdp__quote-link:hover {
  background: var(--nxr-accent-dark);
  border-color: var(--nxr-accent-dark);
  color: var(--nxr-accent-dark-contrast);
}

.sm-pdp__quote-link svg {
  flex: none;
  inline-size: 1.05em;
  block-size: 1.05em;
}

/* --- 7.8 Las tablas de la descripción son la ficha técnica -------------------
   109 fichas traen dentro de la descripción una tabla de medidas y materiales
   —la Silla Napoleón, trece filas: altura, respaldo, asiento, resistencia—.
   Es la información que decide la compra en hostelería, y venía como un
   `<table>` pelado, sin una clase ni un borde: la tabla por defecto del
   navegador en mitad de un párrafo.

   No se puede hacer una ficha técnica de verdad —`ps_feature` está vacía en las
   1.486 y rellenarla es tocar el catálogo—, pero sí se puede hacer que la que
   YA está escrita se lea como tal. Todo por CSS: no se cambia un carácter de la
   descripción.

   La cebra va sobre `tr:nth-child(even)` del `tbody`: estas tablas no traen
   `thead` ni `th`, sólo `<td><strong>Clave</strong></td><td>Valor</td>`.

   El envoltorio `.sm-table-scroll` lo pone el JS (§ initDescriptionTables).
   Una tabla ancha tiene que desbordar DENTRO de su caja; si desborda la página,
   el móvil entero se mueve de lado.
   ------------------------------------------------------------------------- */
.sm-table-scroll {
  overflow-x: auto;
  margin-block: 1.25rem;
}

.product__description table {
  inline-size: 100%;
  margin-block: 1.25rem;
  border-collapse: collapse;
  font-size: 0.9375rem;
}

/* Dentro del envoltorio el margen ya lo pone él. */
.sm-table-scroll > table {
  margin-block: 0;
}

.product__description table th,
.product__description table td {
  padding: 0.55rem 0.75rem;
  border-block-end: 1px solid var(--nxr-line);
  text-align: start;
  vertical-align: top;
}

.product__description table tbody tr:nth-child(even) {
  background: var(--nxr-surface-alt);
}

/* La fila entera pierde el filete al final, que si no la tabla queda subrayada
   por debajo y parece que sigue. */
.product__description table tbody tr:last-child th,
.product__description table tbody tr:last-child td {
  border-block-end: 0;
}

/* --- 7.9 Barra de compra de móvil -------------------------------------------
   Sólo por debajo de 992 px: en escritorio la columna de compra ya va pegada
   (§7.1) y el botón nunca se pierde de vista.

   La regla de `display: none` para escritorio va con `!important` porque quien
   enseña y esconde la barra es el atributo `hidden` desde el JS, y `[hidden]`
   de Bootstrap ya lleva `!important`: sin él, un `hidden` retirado en un móvil
   girado a horizontal dejaría la barra visible en una anchura de escritorio.
   Es una de las poquísimas excepciones de este fichero, y por el mismo motivo
   que las otras: se compite contra una declaración `important` ajena.
   ------------------------------------------------------------------------- */
.sm-buybar {
  position: fixed;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 1035; /* por encima de la cabecera (1021) y por debajo de los modales */
  display: flex;
  align-items: center;
  gap: 0.75rem;
  /* 1rem lateral, no 0.9: así el precio de la barra cae en la misma vertical
     que el <h1> y el resto de la ficha, que van al margen de página de 16 px
     (§3). Con 0.9rem quedaba a 14 y la barra iba 2 px desalineada con todo lo
     que tiene encima. */
  padding: 0.6rem 1rem;
  padding-block-end: calc(0.6rem + env(safe-area-inset-bottom, 0px));
  border-block-start: 1px solid var(--nxr-line);
  background: var(--nxr-surface);
  box-shadow: var(--nxr-shadow-lg);
}

.sm-buybar[hidden] {
  display: none;
}

@media (min-width: 992px) {
  .sm-buybar {
    display: none !important;
  }
}

.sm-buybar__price {
  font-size: 1.125rem;
  font-weight: 700;
  color: var(--nxr-price);
  white-space: nowrap;
}

/* El teléfono es un icono y no un botón con texto: en 390 px de ancho, el
   precio y «Añadir al carrito» ya se comen la fila. */
.sm-buybar__tel {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  inline-size: 2.75rem;
  block-size: 2.75rem;
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius);
  color: var(--nxr-ink);
}

.sm-buybar__tel svg {
  inline-size: 1.25rem;
  block-size: 1.25rem;
}

/* El botón se lleva el hueco que sobre, sea cual sea el largo del precio. */
.sm-buybar__add {
  flex: 1 1 auto;
  min-inline-size: 0;
  white-space: nowrap;
}

/* El botón flotante de WhatsApp comparte esquina con la barra: se sube por
   encima mientras esté visible. Sin `:has()` habría que tocarlo desde el JS. */
body:has(.sm-buybar:not([hidden])) .nxr-whatsapp__btn {
  inset-block-end: 6.25rem;
}

/* --- 7.10 La descripción, sin acordeón --------------------------------------
   Hummingbird mete la descripción en un acordeón que nace abierto
   (`collapse show`): un desplegable de un solo elemento que nunca se pliega,
   con su barra gris y su flecha. Desde que la compra vive en su propia columna
   no compite con nada por el sitio, así que se queda como sección normal, con
   un titular y un filete (ver `templates/catalog/product.tpl`).

   El acordeón sigue existiendo debajo para lo que sí conviene plegado —ficha
   técnica, adjuntos y lo que cuelguen los módulos—, y sólo se pinta si hay algo
   dentro.
   ------------------------------------------------------------------------- */
.sm-pdp__section-title {
  margin: 0 0 1.15rem;
  padding-block-end: 0.7rem;
  border-block-end: 1px solid var(--nxr-line);
  font-family: var(--nxr-font-heading);
  font-size: 1.375rem;
  font-weight: var(--nxr-heading-weight);
  letter-spacing: var(--nxr-heading-tracking);
  line-height: 1.25;
  color: var(--nxr-ink);
}

/* =============================================================================
   8. ERGONOMÍA TÁCTIL EN MÓVIL
   -----------------------------------------------------------------------------
   Lo que sale de la revisión de móvil del 2026-08-30 y no es margen ni
   apilamiento: el tamaño de lo que se pulsa con el dedo y un rótulo que no
   cabía.

   Todo va dentro de `max-width: 767.98px` a propósito. En escritorio el puntero
   es un ratón y 24 px sobran; agrandar los controles allí sólo emborronaría un
   diseño que ya funciona. El dedo es el que necesita sitio.
   ========================================================================== */

/* --- 8.1 Los controles que se pulsan, a 44 px -------------------------------
   WCAG 2.5.8 pide 24×24 px como mínimo y la tienda ya lo cumplía, pero 44 px es
   lo que recomiendan Apple y Google y es lo que de verdad se acierta con el
   pulgar. Medido antes: 109 objetivos por debajo de 40 px en una sola página de
   categoría.

   Los tres controles del listado (`−`, `+` y la vista rápida) son
   `.btn-square-icon`, de 38×38. Se acota a `.product-miniature` y a la ficha en
   vez de subir `.btn-square-icon` a secas: es una clase de Hummingbird y no hay
   forma de saber dónde más la usa. La cabecera, que es lo que más cerca estaba
   de romperse, va por otra clase (`.header-block__action-btn`, 42 px) y no la
   alcanza esta regla —comprobado— pero el acotado la deja fuera de dudas. */
@media (max-width: 767.98px) {
  .product-miniature .btn-square-icon,
  .product__container .btn-square-icon,
  .product-miniature__quickview-touch {
    min-width: 44px;
    min-height: 44px;
  }

  /* Los quince barnizados de la ficha eran cuadrados de 24 px: elegir acabado
     es una decisión de compra y se estaba fallando el tiro. A 44 px caben seis
     por fila en vez de once, así que el selector pasa de dos filas a tres —unos
     100 px más en una ficha que ya mide 5.900—. Es el precio correcto por poder
     acertar el color que uno quiere.

     Acotado a `.product-variant__colors`, que es el selector de la ficha, y no
     a `.color` a secas: esa clase la llevan también las muestras de las
     tarjetas del listado (83 de las 98 de esta página), que son decorativas y
     no se pulsan. Agrandarlas reventaría la rejilla. */
  .product-variant__colors .color {
    width: 44px;
    height: 44px;
  }

  /* La paginación era lo peor del listado: números de 27×40 px. Con 168
     productos en «Sillas Nórdicas» se pagina de verdad, y fallar el 3 y caer en
     el 4 es de las cosas que más irritan navegando con el pulgar. */
  .page-link {
    min-width: 44px;
    min-height: 44px;
  }

  /* El desplegable de orden ya tenía 358 px de ancho; sólo le faltaba alto. */
  .products__sort-dropdown-button {
    min-height: 44px;
  }

  /* Los dos iconos de redes del pie, que iban a 38×38. Se les da altura sin
     tocar el ancho: son enlaces en línea dentro de una fila y estirarlos a lo
     ancho separaría los iconos más de la cuenta. */
  .sm-foot__social a,
  .sm-foot a.p-2 {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 44px;
    min-height: 44px;
  }
}

/* --- 8.2 «Añadir al carrito» no cabe en una tarjeta de 167 px ---------------
   El botón dispone de 133 px; descontando relleno, icono y hueco quedan 97 px
   para un rótulo que a 16 px pide 138. Se partía en dos líneas y la tarjeta
   crecía.

   Se quita el icono y se baja el cuerpo: quedan 125 px para 112 de texto. Pero
   la holgura de 13 px no es garantía de nada —basta que alguien reescriba el
   rótulo desde el back office, o que la tienda pase a otro idioma, para que
   vuelva a partirse—, así que además va `nowrap` con elipsis: pase lo que pase,
   una línea. Recortado se entiende; partido en dos deforma la rejilla entera.

   El icono se va y no el texto porque un carrito solo, sin palabra, obliga a
   interpretar; «Añadir al carrito» se lee. En la ficha, donde hay sitio, el
   botón conserva su icono. */
@media (max-width: 767.98px) {
  .product-miniature__add {
    font-size: 0.8125rem;
    padding-inline: 0.25rem;
  }

  .product-miniature__add .material-icons {
    display: none;
  }

  .product-miniature__add-text {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
}

/* --- 8.3 El botón de WhatsApp se aparta al bajar ----------------------------
   Volver a la esquina (§5) quitó lo peor —tapaba el campo de correo del
   formulario y el importe del transporte—, pero en un texto largo y continuo,
   como el SEO al pie de categoría, cualquier elemento fijo acaba encima de
   algo. Moverlo otra vez sólo cambiaría a quién estorba.

   Así que se aparta mientras se baja y vuelve en cuanto se sube, que es cuando
   alguien busca cómo preguntar. Lo mueve `initWhatsappAutoHide()` de
   `assets/js/custom.js` poniendo y quitando una clase; la decisión de si eso
   hace algo o no vive AQUÍ, dentro de la media query. En escritorio la clase
   está igualmente puesta y no hace nada, que es lo que se quiere: sin sitio que
   disputar, el botón no tiene por qué esconderse.

   `visibility` además de `transform` para que no quede un objetivo táctil
   invisible flotando sobre el texto. */
@media (max-width: 767.98px) {
  .nxr-whatsapp__btn {
    transition: transform 0.25s ease, opacity 0.25s ease, visibility 0.25s;
  }

  .nxr-whatsapp__btn.is-tucked {
    transform: translateY(calc(100% + 1.5rem));
    opacity: 0;
    visibility: hidden;
  }
}

/* Quien pide menos movimiento no pide menos sitio: el botón se sigue apartando,
   pero sin recorrido. */
@media (prefers-reduced-motion: reduce) {
  .nxr-whatsapp__btn {
    transition: none;
  }
}

/* =============================================================================
   9. LA CUENTA DEL CLIENTE (templates/customer/)
   -----------------------------------------------------------------------------
   Hummingbird pintaba la portada de la cuenta con la misma navegación DOS veces
   —una columna de siete enlaces a la izquierda y siete tarjetas grises con los
   mismos siete a la derecha— y sin un solo color del tema. El único color de la
   página era el rojo de «Cerrar sesión»: el color de peligro para la acción más
   inocua que hay ahí.

   La columna se quita en la portada desde `customer/page.tpl` (en las páginas de
   dentro se queda, que es donde sirve para saltar de sección). Lo demás es esto.

   ⚠️ LOS ICONOS VAN POR `mask-image`, NO CON EL SPRITE `<use>` DEL MEGAMENÚ.
   No es por gusto: de las siete tarjetas, DOS las pintan módulos —«Mis alertas»
   es `ps_emailalerts` y «RGPD» es `psgdpr`, las dos por `displayCustomerAccount`—
   y su marcado no se puede tocar desde el tema. Lo único que llega a todas es el
   CSS, colgando del `id` o de la clase modificadora del enlace. Ventaja de
   propina: el día que otro módulo añada su tarjeta, cae en el icono genérico y
   no desentona.
   ============================================================================= */

/* --- 9.1 Encabezado ---------------------------------------------------------
   El <h1> lo pinta `components/page-title-section.tpl` desde page.tpl; aquí sólo
   se aprieta el aire que deja debajo y se le cuelga quién ha entrado. */
#my-account .page-header {
  margin-bottom: .25rem;
}

.sm-acc__who {
  margin: 0 0 2rem;
  color: var(--nxr-ink-soft);
  font-size: .95rem;
}

.sm-acc__mail::before {
  content: " · ";
}

/* --- 9.2 Las dos rejillas ---------------------------------------------------
   `auto-fit` + `minmax` y no un número fijo de columnas: las tarjetas de la
   segunda rejilla dependen de qué módulos estén instalados (hoy salen cuatro,
   mañana pueden ser tres o cinco) y con `repeat(4, 1fr)` la fila quedaría coja
   en cuanto cambie. Así cierran solas a cualquier ancho. */
.sm-acc__grid {
  display: grid;
  gap: 1rem;
  margin-bottom: 1rem;
}

.sm-acc__grid--primary {
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
}

.sm-acc__grid--secondary {
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  margin-bottom: 2rem;
}

/* --- 9.3 La tarjeta ---------------------------------------------------------
   Doble selector (`.sm-acc__grid .account-menu__link`, 0,2,0) porque
   `.account-menu__link` (0,1,0) es de Hummingbird y hay que ganarle sin
   `!important` — que en este tema es la excepción, no la regla. */
.sm-acc__grid .account-menu__link {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  gap: .35rem;
  min-height: 44px;               /* §8.1: nada pulsable por debajo de 44 px */
  padding: 1.25rem 1.25rem 1.35rem;
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  background: var(--nxr-surface);
  color: var(--nxr-ink);
  font-family: var(--nxr-font-heading);
  font-weight: 600;
  line-height: 1.25;
  text-decoration: none;
  transition: border-color .18s ease, background-color .18s ease, transform .18s ease;
  /* ⚠️ El icono GENÉRICO se declara AQUÍ, en el enlace, y no dentro del
     `::before` que lo usa. Una custom property declarada en el propio
     pseudo-elemento GANA a la que heredaría del elemento que lo origina, así
     que con el fallback ahí dentro pisaba a los ocho iconos específicos y las
     siete tarjetas salían con el mismo cuadrado — sin ningún error, y con los
     ocho selectores aparentemente bien escritos. */
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='16' height='16' rx='3'/%3E%3C/svg%3E");
}

.sm-acc__grid--secondary .account-menu__link {
  padding: 1rem 1.1rem;
  background: var(--nxr-surface-alt);
  border-color: transparent;
}

.sm-acc__grid .account-menu__link:hover,
.sm-acc__grid .account-menu__link:focus-visible {
  border-color: var(--sm-sage);
  background: var(--nxr-surface-alt);
  transform: translateY(-2px);
}

.sm-acc__grid--secondary .account-menu__link:hover,
.sm-acc__grid--secondary .account-menu__link:focus-visible {
  background: var(--nxr-surface);
  border-color: var(--sm-sage);
}

.sm-acc__label {
  font-family: var(--nxr-font-heading);
  font-weight: 600;
  line-height: 1.25;
}

.sm-acc__grid--primary .sm-acc__label {
  font-size: 1.15rem;
}

/* Vuelve al cuerpo: el rótulo lleva Figtree 600 desde el ENLACE (para que lo
   hereden también las dos tarjetas de módulo, cuyo texto es un nodo suelto sin
   span propio) y el subtítulo tiene que deshacerlo. */
.sm-acc__sub {
  font-family: var(--bs-body-font-family, inherit);
  font-weight: 400;
  color: var(--nxr-ink-soft);
  font-size: .875rem;
  line-height: 1.35;
}

/* --- 9.4 Iconos -------------------------------------------------------------
   Los `<i class="material-icons">` del marcado se ocultan en vez de borrarse:
   quitarlos de la plantilla no serviría de nada porque los de `ps_emailalerts` y
   `psgdpr` seguirían ahí. El dibujo se pinta con `mask-image` sobre `::before`,
   así el color sale de `background` y lo puede cambiar el hover. */
.sm-acc .account-menu__icon,
.sm-acc .material-icons {
  display: none;
}

.sm-acc__grid .account-menu__link::before,
.sm-acc__signout::before {
  content: "";
  display: block;
  width: 26px;
  height: 26px;
  margin-bottom: .1rem;
  background-color: var(--sm-sage);
  transition: background-color .18s ease;
  -webkit-mask: var(--sm-acc-ico) center / contain no-repeat;
  mask: var(--sm-acc-ico) center / contain no-repeat;
}

.sm-acc__grid--secondary .account-menu__link::before {
  width: 22px;
  height: 22px;
}

.sm-acc__grid .account-menu__link:hover::before,
.sm-acc__grid .account-menu__link:focus-visible::before {
  background-color: var(--nxr-ink);
}

#identity_main_link,
#identity_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='3.5'/%3E%3Cpath d='M4.5 20c0-3.6 3.4-6 7.5-6s7.5 2.4 7.5 6'/%3E%3C/svg%3E");
}

#addresses_main_link,
#address_main_link,
#addresses_link,
#address_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s7-5.6 7-11a7 7 0 1 0-14 0c0 5.4 7 11 7 11z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E");
}

#history_main_link,
#history_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 7.5 12 3l8.5 4.5v9L12 21l-8.5-4.5z'/%3E%3Cpath d='M3.5 7.5 12 12l8.5-4.5M12 12v9'/%3E%3C/svg%3E");
}

#order_slips_main_link,
#order-slips_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 3h8l4 4v14H6z'/%3E%3Cpath d='M14 3v4h4M9 12.5h6M9 16h4'/%3E%3C/svg%3E");
}

#discounts_main_link,
#discounts_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 11.8 11.8 3.5H20v8.3l-8.3 8.3z'/%3E%3Ccircle cx='16' cy='8' r='1.4'/%3E%3C/svg%3E");
}

#returns_main_link,
#returns_link {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5 4.5 9.5 9 14'/%3E%3Cpath d='M4.5 9.5H15a4.5 4.5 0 0 1 0 9H8'/%3E%3C/svg%3E");
}

/* Con el contenedor delante (0,2,0): la clase sola (0,1,0) perdía contra el
   icono genérico y estas dos tarjetas salían con el cuadrado. */
.sm-acc__grid .account-menu__link--emailalerts,
.account-menu--sidebar .account-menu__nav .account-menu__link--emailalerts {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 9.5a6 6 0 1 0-12 0c0 4.8-2 6.3-2 6.3h16s-2-1.5-2-6.3z'/%3E%3Cpath d='M10.4 19.2a2 2 0 0 0 3.2 0'/%3E%3C/svg%3E");
}

/* Con el contenedor delante (0,2,0): la clase sola (0,1,0) perdía contra el
   icono genérico y estas dos tarjetas salían con el cuadrado. */
.sm-acc__grid .account-menu__link--psgdpr,
.account-menu--sidebar .account-menu__nav .account-menu__link--psgdpr {
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l7 2.8v5.4c0 4.5-2.9 7.8-7 9.6-4.1-1.8-7-5.1-7-9.6V5.8z'/%3E%3Cpath d='m9 12 2.2 2.2L15.4 10'/%3E%3C/svg%3E");
}

/* --- 9.5 Cerrar sesión ------------------------------------------------------
   Era lo único con color en toda la página, y encima el rojo de peligro. Cerrar
   sesión no destruye nada: va en tinta suave, fuera de la rejilla y separado por
   un filete, para que se distinga de los siete accesos sin gritar. */
.sm-acc__foot {
  padding-top: 1.25rem;
  border-top: 1px solid var(--nxr-line);
}

.sm-acc .account-menu__link--signout,
.sm-acc .account-menu__link--signout:hover {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  gap: .5rem;
  min-height: 44px;
  padding: .5rem 0;
  border: 0;
  background: none;
  color: var(--nxr-ink-soft);
  text-decoration: none;
}

.sm-acc .account-menu__link--signout::before,
.account-menu--sidebar .account-menu__link--signout::before {
  margin-bottom: 0;
  width: 20px;
  height: 20px;
  background-color: var(--nxr-ink-soft);
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h4a1.5 1.5 0 0 1 1.5 1.5v13A1.5 1.5 0 0 1 18 20h-4'/%3E%3Cpath d='m10 8-4 4 4 4M6 12h9'/%3E%3C/svg%3E");
}

.sm-acc .account-menu__link--signout:hover,
.sm-acc .account-menu__link--signout:focus-visible {
  color: var(--nxr-ink);
  text-decoration: underline;
}

.sm-acc .account-menu__link--signout:hover::before {
  background-color: var(--nxr-ink);
}

/* --- 9.6 Móvil --------------------------------------------------------------
   La rejilla principal apila sola (`minmax(230px, 1fr)` no cabe dos veces en
   390 px), pero la secundaria sí entraría a dos columnas de 180 y las tarjetas
   quedan estrechas para rótulos como «Facturas por abono». Se bajan a dos
   columnas explícitas con menos hueco. */
@media (max-width: 575.98px) {
  .sm-acc__grid--secondary {
    grid-template-columns: repeat(2, 1fr);
    gap: .75rem;
  }

  .sm-acc__grid--secondary .account-menu__link {
    padding: .9rem;
  }

  .sm-acc__grid--primary .sm-acc__label {
    font-size: 1.05rem;
  }
}

/* --- 9.7 Menú lateral de las páginas de dentro ------------------------------
   En la portada no se pinta (lo quita `customer/page.tpl`); aquí sí, porque es
   lo que deja saltar de «Mis datos» a «Mis pedidos» sin volver atrás. Lo que
   hacía falta era que hablara el mismo idioma visual que las tarjetas: iconos de
   trazo en salvia en vez de los sólidos de Material, la sección actual marcada
   de verdad, y «Cerrar sesión» sin el rojo de peligro.

   ⚠️ Los iconos se resuelven por `id`, y los del lateral NO son los mismos que
   los de la portada: allí son `identity_main_link`, aquí `identity_link`. Los
   dos van en el mismo selector, más abajo. */
.account-menu--sidebar {
  padding-right: 1rem;
}

.account-menu--sidebar .account-menu__title {
  margin-bottom: 1.25rem;
  font-family: var(--nxr-font-heading);
  font-size: 1.4rem;
}

.account-menu--sidebar .account-menu__nav {
  display: flex;
  flex-direction: column;
  gap: .15rem;
}

.account-menu--sidebar .account-menu__link {
  position: relative;
  display: flex;
  align-items: center;
  gap: .65rem;
  min-height: 44px;              /* §8.1 */
  padding: .6rem .75rem;
  border-radius: var(--nxr-radius);
  color: var(--nxr-ink);
  text-decoration: none;
  line-height: 1.3;
  transition: background-color .15s ease, color .15s ease;
  /* Genérico. Va ANTES que los específicos a propósito: los de módulo empatan
     en especificidad (0,2,0) y se resuelven por orden de aparición. */
  --sm-acc-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='16' height='16' rx='3'/%3E%3C/svg%3E");
}

.account-menu--sidebar .account-menu__link::before {
  content: "";
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  background-color: var(--sm-sage);
  transition: background-color .15s ease;
  -webkit-mask: var(--sm-acc-ico) center / contain no-repeat;
  mask: var(--sm-acc-ico) center / contain no-repeat;
}

.account-menu--sidebar .account-menu__icon,
.account-menu--sidebar .material-icons {
  display: none;
}

.account-menu--sidebar .account-menu__link:hover,
.account-menu--sidebar .account-menu__link:focus-visible {
  background: var(--nxr-surface-alt);
}

/* La sección actual: fondo crema y un filete salvia a la izquierda. Hummingbird
   sólo le cambiaba el fondo, y con siete entradas costaba ver dónde estabas. */
.account-menu--sidebar .account-menu__link--active {
  background: var(--nxr-surface-alt);
  font-weight: 600;
}

.account-menu--sidebar .account-menu__link--active::after {
  content: "";
  position: absolute;
  inset: .35rem auto .35rem 0;
  width: 3px;
  border-radius: 3px;
  background: var(--sm-sage);
}

.account-menu--sidebar .account-menu__link--signout {
  margin-top: .5rem;
  padding-top: 1rem;
  border-top: 1px solid var(--nxr-line);
  border-radius: 0;
  color: var(--nxr-ink-soft);
}

.account-menu--sidebar .account-menu__link--signout::before {
  background-color: var(--nxr-ink-soft);
}

.account-menu--sidebar .account-menu__link--signout:hover {
  background: none;
  color: var(--nxr-ink);
  text-decoration: underline;
}

.account-menu--sidebar .account-menu__link--signout:hover::before {
  background-color: var(--nxr-ink);
}

/* --- 9.8 «Eliminar» de una dirección tampoco es rojo por defecto ------------
   Borrar una dirección SÍ destruye algo, así que aquí el rojo no sobra del todo;
   lo que sobra es que grite más que «Modificar», que es lo que se pulsa el 95 %
   de las veces. Se iguala el peso de los dos y el rojo se reserva para el hover,
   cuando ya se sabe lo que se va a hacer. */
.address-card__actions .address-card__delete {
  color: var(--nxr-ink-soft);
  text-decoration: none;
}

.address-card__actions .address-card__delete:hover,
.address-card__actions .address-card__delete:focus-visible {
  color: var(--nxr-sale);
  text-decoration: underline;
}

/* --- 9.9 Los avisos de la cuenta, en la paleta ------------------------------
   «Todavía no has hecho ningún pedido» salía en el `alert-info` de Bootstrap:
   un panel azul celeste que no aparece en ninguna otra parte de la web. No es
   un error ni una advertencia, es un estado vacío, así que va en el crema de la
   casa con el filete salvia. Se toca sólo dentro de las páginas de cliente: el
   `alert-info` de otras zonas (avisos del checkout) se queda como está. */
.page-content--customer .alert-info {
  border: 1px solid var(--nxr-line);
  border-left: 3px solid var(--sm-sage);
  background: var(--nxr-surface-alt);
  color: var(--nxr-ink);
}

/* =============================================================================
   10. LOS FORMULARIOS DE CLIENTE (entrar, registrarse, contraseña, datos)
   -----------------------------------------------------------------------------
   Estas páginas son Hummingbird de serie y funcionaban, pero a 1440 px el campo
   del correo medía 1.750 px de ancho. Eso no es un formulario: es una línea que
   cruza la pantalla, y obliga al ojo a recorrerla entera para llegar al
   siguiente campo. Lo único que hace falta en casi todas es CONTENER el ancho.

   Los `body id` son `authentication`, `registration`, `password`,
   `guest-tracking`, `identity` y `address`.
   ============================================================================= */

/* --- 10.1 Ancho legible -----------------------------------------------------
   Dos medidas, no una: las páginas de un solo campo (entrar, recuperar
   contraseña, seguir un pedido) se quedan en 34rem —una columna de formulario
   de las de siempre— y las de formulario largo (registro, tus datos, una
   dirección) en 44rem, que es donde caben dos columnas de campos cortos el día
   que se quieran.

   El título va con el mismo tope que el formulario: si sólo se limita
   `#content`, el `<h1>` sigue a 1.400 px y queda flotando sobre una columna
   estrecha. */
#authentication .page-header,
#authentication #content,
#password .page-header,
#password #content,
#guest-tracking .page-header,
#guest-tracking #content {
  max-width: 34rem;
}

#registration .page-header,
#registration #content,
#identity .page-header,
#identity #content,
#address .page-header,
#address #content {
  max-width: 44rem;
}

/* --- 10.2 «¿Todavía no tienes cuenta?», en su propia caja -------------------
   Estaba debajo de una `<hr>`, con un botón de contorno a ancho completo que
   pesaba más que el «Iniciar sesión» sólido de arriba: la acción secundaria se
   comía a la principal. Ahora es un panel crema —el mismo recurso que la ficha
   y la portada— y su botón deja de estirarse. */
#authentication .login hr {
  display: none;
}

.login__register-prompt {
  /* Flex para poder ORDENAR: la explicación se pinta con un `::before`, que
     nace delante del <h2>, y `order` sólo lo mueve si el contenedor establece
     un contexto flex. Sin esto la caja empieza por el párrafo y el título sale
     debajo — se ve raro y no da ningún error. */
  display: flex;
  flex-direction: column;
  margin-top: 2rem;
  padding: 1.5rem;
  border: 1px solid var(--nxr-line);
  border-radius: var(--nxr-radius-lg);
  background: var(--nxr-surface-alt);
}

.login__register-prompt h2 {
  order: 1;
  margin-bottom: .35rem;
  font-family: var(--nxr-font-heading);
}

/* La explicación que no traía: quién debería crearse una cuenta y para qué. */
.login__register-prompt::before {
  content: "Guarda tus direcciones, consulta tus pedidos y repite compra sin volver a escribirlo todo.";
  display: block;
  order: 2;
  margin-bottom: 1rem;
  color: var(--nxr-ink-soft);
  font-size: .925rem;
  line-height: 1.45;
}

/* `d-grid` es una utilidad de Bootstrap (`display: grid !important` en
   @layer utilities) y desde aquí no se le gana; lo que sí se puede es dejar de
   estirar el botón dentro de esa rejilla. */
.login__register-prompt .d-grid {
  order: 3;
  justify-items: start;
}

/* --- 10.3 El ojo de la contraseña no es una acción principal ----------------
   Hummingbird lo pinta con `.btn-primary`, o sea el mismo negro sólido que
   «Iniciar sesión»: dos botones idénticos pegados, y el que más pesa es el que
   sólo enseña los caracteres. Se queda como un icono dentro del campo. */
.password-field .btn-primary {
  border: 1px solid var(--nxr-line);
  border-left: 0;
  background: var(--nxr-surface);
  color: var(--nxr-ink-soft);
}

.password-field .btn-primary:hover,
.password-field .btn-primary:focus-visible {
  background: var(--nxr-surface-alt);
  color: var(--nxr-ink);
}

/* --- 10.4 El aviso de privacidad del registro ------------------------------
   Es un texto legal y estaba en cursiva, suelto bajo su casilla, con el mismo
   peso que una nota al pie. Se le da la caja crema para que se lea como lo que
   es: la información que hay que leer ANTES de marcar. */
#registration .form-check .form-text,
#registration .custom-checkbox em,
#registration em {
  display: block;
  margin-top: .5rem;
  padding: .75rem 1rem;
  border-left: 3px solid var(--sm-sage);
  background: var(--nxr-surface-alt);
  color: var(--nxr-ink-soft);
  font-size: .875rem;
  font-style: normal;
  line-height: 1.5;
}

/* --- 10.5 Móvil ------------------------------------------------------------
   Los topes de arriba son `max-width`, así que en móvil no hacen nada; lo único
   que hay que tocar es el panel de registro, que a 390 px con 1,5rem de relleno
   deja el botón muy justo. */
@media (max-width: 575.98px) {
  .login__register-prompt {
    padding: 1.1rem;
  }
}


/* =============================================================================
   11. REVISIÓN DEL CLIENTE DEL 2026-09-02 — PORTADA
   -----------------------------------------------------------------------------
   Las cinco peticiones del PDF «Revisión Migración». Tres de ellas no son de
   estilo sino de marcado —dos títulos que dejan de ser encabezados y tres que
   suben de nivel—, y lo que hay aquí es lo que evita que ese cambio de etiqueta
   se note en pantalla: el cliente pidió cambiar la jerarquía del documento, no
   el diseño de la portada.
   ========================================================================== */

/* --- 11.1 Dos títulos que dejan de ser encabezados -------------------------
   `nxr_hotproducts` («Los más vendidos») y `nxr_findus` («Fabricamos en La
   Gineta») pintan ahora su rótulo con `<p>`, desde las dos plantillas copiadas
   al tema.

   Casi todo su aspecto ya venía por CLASE y sobrevive al cambio de etiqueta.
   Lo que NO sobrevive son las dos cosas que un `<h2>` traía de serie:

     · el margen — un `<p>` tiene `margin-block: 1em` en vez del `margin-top: 0`
       de un encabezado, así que el rótulo se despegaba hacia abajo;
     · la tipografía de `nxr_findus`, que la heredaba de la regla de `h2` de
       Hummingbird y no de su propia clase. Sin esto cae a Inter y el rótulo se
       lee con la letra del cuerpo, que es el único cambio que de verdad se
       vería.

   Se escriben las dos a mano. `nxr_hotproducts` ya declara su familia en §6.4. */
.nxr_hotproducts .cab_izda .title {
  margin-top: 0;
}

.nxr-findus__title {
  font-family: var(--nxr-font-heading);
  margin-top: 0;
}

/* --- 11.2 Los cuatro encabezados del texto SEO -----------------------------
   Los tres títulos SEO pasan de `<h3>` a `<h2>` y el del catálogo baja debajo
   de ellos, dentro del mismo cuerpo (`scripts/php/revision-home.php`). Los
   cuatro son ahora hermanos, así que tienen que pesar lo mismo: el del catálogo
   venía de `.nxr-customtext__title`, que lo pintaba a 1,9rem —el tamaño de un
   título de sección, porque lo era— y al lado de los otros tres cantaba.

   `.nxr-customtext__body h2` ya les da color y peso; aquí sólo se iguala el
   tamaño y se le quita al del catálogo el estilo que tenía de contenedor. */
.nxr-customtext__body .sm-seo__q {
  font-size: 1.25rem;
  line-height: 1.3;
}

/* El primero del bloque no lleva el aire de separación de §6: no hay nada
   encima de lo que separarlo. Lo hace ya `.nxr-customtext__body :first-child`
   del módulo, y se deja escrito aquí para que se vea al leer esta sección. */

/* --- 11.3 Las preguntas frecuentes, en acordeón ----------------------------
   Cinco preguntas abiertas ocupaban media portada y se leían como un muro. El
   marcado NO cambia: siguen siendo `<h3 class="sm-faq__q">` + `<div
   class="sm-faq__a">`, que es lo que sobrevive a HTMLPurifier (§6.3). Lo que
   hace el JS es envolver el texto de la pregunta en un `<button>` y marcar el
   contenedor con `sm-faq--js`.

   ⚠️ Todo lo que pliega cuelga de esa clase, y es deliberado: sin JavaScript
   no se añade, no se oculta nada y las cinco respuestas siguen a la vista. Un
   acordeón que esconde el contenido antes de saber si se puede volver a abrir
   es contenido perdido — y aquí, además, contenido que el cliente quiere
   indexado. */

.sm-faq--js .sm-faq__q {
  padding: 0;
  /* La barra de acento se mueve al botón, que es quien ocupa toda la fila. */
  border-inline-start: 0;
  margin-inline-start: 0;
  padding-inline-start: 0;
}

.sm-faq--js .sm-faq__btn {
  display: flex;
  align-items: start;
  gap: 1rem;
  width: 100%;
  /* Un `<button>` no hereda ni la letra ni la alineación: hay que dárselas. */
  font: inherit;
  color: inherit;
  text-align: start;
  background: none;
  border: 0;
  border-inline-start: 3px solid var(--sm-sage);
  border-radius: 0;
  margin-inline-start: -1px;
  padding: 1.125rem 1.25rem;
  cursor: pointer;
}

.sm-faq--js .sm-faq__btn:hover {
  background: var(--nxr-surface-alt);
}

.sm-faq--js .sm-faq__btn:focus-visible {
  outline: 2px solid var(--nxr-ink);
  outline-offset: -2px;
}

/* La flecha gira al abrir. Es la única señal de que la fila se puede pulsar,
   así que va siempre visible, no sólo al pasar el ratón. */
.sm-faq--js .sm-faq__caret {
  flex: none;
  width: 1.25rem;
  height: 1.25rem;
  margin-inline-start: auto;
  color: var(--nxr-ink-soft);
  transition: transform 0.18s ease;
}

.sm-faq--js .sm-faq__item.is-open .sm-faq__caret {
  transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {
  .sm-faq--js .sm-faq__caret {
    transition: none;
  }
}

/* El plegado es `hidden` desde el JS, no `display: none` desde aquí: así el
   estado vive en un solo sitio y el buscador del navegador (Ctrl+F) no
   encuentra texto que luego no puede enseñar. */
.sm-faq--js .sm-faq__a {
  padding-block: 0 1.125rem;
  padding-inline: 1.25rem;
}

.sm-faq--js .sm-faq__item.is-open {
  background: var(--nxr-surface);
}

/* En móvil la pregunta ocupa varias líneas y el objetivo táctil ya pasa de
   sobra los 44 px (§8.1); lo único que aprieta es el relleno lateral. */
@media (max-width: 575.98px) {
  .sm-faq--js .sm-faq__btn {
    gap: 0.75rem;
    padding-inline: 1rem;
  }

  .sm-faq--js .sm-faq__a {
    padding-inline: 1rem;
  }
}

/* --- 11.4 El título de la tarjeta de producto vuelve a ser un <h3> ---------
   Petición del cliente: «marcame los titulos de los productos como H3 porfa,
   en toda la web», que es lo que hace la tienda viva.

   El enlace no cambia —sigue siendo `.product-miniature__title` y conserva
   todos sus estilos—; lo que hay que apagar es lo que un `<h3>` trae de serie
   de Hummingbird y descuadraría la tarjeta: su tamaño, su peso, su tipografía
   de titulares y sus márgenes.

   Se escribe con las propiedades sueltas y NO con `font: inherit`: la forma
   abreviada reinicia también `font-variant`, `font-stretch` y `line-height` a
   sus valores iniciales, o sea que apagaría de paso el `line-height` que la
   tarjeta hereda del contenedor. */
.product-miniature__title-heading {
  margin: 0;
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  line-height: inherit;
  letter-spacing: inherit;
  color: inherit;
}

/* --- 11.5 El tercer nivel del menú -----------------------------------------
   El menú volvió a la estructura de producción el 2026-09-02, con sus tres
   niveles (revisión del cliente: «es mejor que dejes la estructura igual, son
   categorías y subcategorías desplegables»).

   Un hijo CON hijos deja de ser una tarjeta suelta y pasa a ser la cabecera de
   su grupo. Son tres en toda la tienda: «Sillas de Terraza», «Mobiliario
   Vintage» y «Mobiliario Nórdico» — y las dos últimas son justamente las
   categorías que no tienen productos propios, así que como cabecera funcionan
   mejor que como destino.

   No hace falta tocar el ancho de la barra: con SEIS rótulos largos pide
   1.067 px a 1440 y 943 a 1200, y hay 1.105 y 1.025. Los nueve rótulos largos
   de antes pedían 1.453, que era lo que la partía en dos líneas. La cabecera
   sigue en 164 px. */

/* La cabecera del grupo pesa más que sus hijos: es lo único que los agrupa,
   porque la rejilla no dibuja ninguna caja alrededor. */
.nxr-mm-panel .sm-mm-group > .sm-mm-card .sm-mm-card__label {
  font-weight: 600;
}

/* ⚠️ Y hay que devolverle el alto automático. `.sm-mm-card` lleva
   `height: 100%` para que en una rejilla de celdas iguales toda la tarjeta sea
   pulsable, no sólo la línea del rótulo. En una celda con sublista eso se come
   la altura ENTERA de la celda y empuja la lista fuera: medido, los nietos de
   «Mobiliario Vintage» salían 106 px por debajo de su propio `<li>`, pintados
   encima de lo que hubiera detrás.

   No se ve como un error —el panel sale, los enlaces funcionan— sino como un
   panel recortado, que es de esas cosas que uno achaca al `overflow` y no a un
   `height` heredado tres reglas más arriba. */
.nxr-mm-panel .sm-mm-group > .sm-mm-card {
  height: auto;
}

/* Los nietos se alinean con el RÓTULO de su cabecera, no con su icono: la
   sangría es exactamente el relleno de la tarjeta más el icono más su hueco
   (0,5rem + 24px + 0,6rem). Escrito así y no con un número redondo para que
   siga cuadrando si mañana cambia el tamaño del icono. */
.nxr-mm-panel .sm-mm-sub {
  list-style: none;
  margin: 0 0 0.35rem;
  padding-inline-start: calc(0.5rem + 24px + 0.6rem);
}

.nxr-mm-panel .sm-mm-sub li {
  margin: 0;
}

/* El filete de la izquierda es lo que dice «esto cuelga de lo de arriba». Va en
   salvia, que es el color identitario, y sobre él no se apoya ningún texto: es
   decoración, así que su 2,47:1 sobre blanco no entra en la cuenta de
   contraste. */
.nxr-mm-panel .sm-mm-sub__link {
  display: block;
  border-inline-start: 2px solid var(--sm-sage);
  padding: 0.3rem 0 0.3rem 0.7rem;
  color: var(--nxr-ink-soft);
  font-size: 0.8125rem;
  line-height: 1.3;
  text-decoration: none;
}

.nxr-mm-panel .sm-mm-sub__link:hover,
.nxr-mm-panel .sm-mm-sub__link:focus-visible {
  color: var(--nxr-accent-dark);
  text-decoration: underline;
}

/* --- El tercer nivel en el acordeón de móvil ---
   Aquí NO se pliega: sería un desplegable dentro de otro, y llegar a «Sillas
   Rattán y mimbre» costaría tres toques. Se ven siempre, sangrados bajo su
   cabecera y con el mismo filete que en escritorio.

   La sangría se alinea con el rótulo de la cabecera igual que arriba, pero con
   las medidas del acordeón: su icono mide 22px y el hueco es 0,65rem. */
.nxr-mm-acc-panel .sm-mm-acc-sub {
  list-style: none;
  margin: 0;
  padding-inline-start: calc(22px + 0.65rem);
}

.nxr-mm-acc-panel .sm-mm-acc-sub li {
  margin: 0;
}

.nxr-mm-acc-panel .sm-mm-acc-sub__link {
  display: block;
  border-inline-start: 2px solid var(--sm-sage);
  /* 44px de alto con el relleno, que es el mínimo táctil de §8.1: estos
     enlaces son el nivel más profundo del menú y en un móvil se pulsan con el
     pulgar igual que los demás. */
  padding: 0.7rem 0 0.7rem 0.8rem;
  color: var(--nxr-ink-soft);
  font-size: 0.9375rem;
  line-height: 1.3;
  text-decoration: none;
}

.nxr-mm-acc-panel .sm-mm-acc-sub__link:hover,
.nxr-mm-acc-panel .sm-mm-acc-sub__link:focus-visible {
  color: var(--nxr-accent-dark);
}
