/*
 * child-style.css - Camisas Sin Botones
 *
 * REGLA DE ORO DE ESTE ARCHIVO: nunca escribir un color o una fuente
 * directamente aquí (nada de "color: #6E8B3D"). Todo se referencia con
 * var(--csb-color-primary), var(--csb-font-body), etc. Esas variables se
 * generan automáticamente desde el Customizer (ver inc/customizer.php).
 *
 * Si quieres cambiar un color: Apariencia > Personalizar > Camisas Sin
 * Botones > Colores de marca. NO edites este archivo para eso.
 */

/* ---------------------------------------------------------------------
   Jost, alojada en el tema (assets/fonts): fuente variable, un solo
   archivo por alfabeto para todos los grosores. Ver functions.php.
--------------------------------------------------------------------- */
@font-face {
	font-family: 'Jost';
	font-style: normal;
	font-weight: 100 900;
	font-display: swap;
	src: url('../fonts/jost-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;
}

@font-face {
	font-family: 'Jost';
	font-style: normal;
	font-weight: 100 900;
	font-display: swap;
	src: url('../fonts/jost-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;
}

/* ---------------------------------------------------------------------
   Base general
--------------------------------------------------------------------- */
body,
button,
input,
select,
textarea {
	font-family: var(--csb-font-body);
}

body {
	background-color: var(--csb-color-background);
	color: var(--csb-color-text);
}

/* Desplazamiento suave al pulsar "Diseñar" en el banner de Personalizado
   (baja hasta "#csb-catalogo-grid", justo encima de la cuadrícula de
   productos). Sin efecto en el resto de enlaces internos, salvo que
   también usen "#ancla" -no hay ninguno más ahora mismo en el sitio-. */
html {
	scroll-behavior: smooth;
}

/* Storefront pone "overflow-x: hidden" en body Y en .site (#page) para
   evitar scroll horizontal. Con "hidden" cualquier "position: sticky"
   de un descendiente (la cabecera móvil) deja de funcionar sin avisar,
   así que se cambia a "clip": bloquea igual el scroll horizontal pero
   no rompe sticky. */
body,
.site {
	overflow-x: clip;
}

a,
.woocommerce a.button,
.site-header-cart .cart-contents {
	color: var(--csb-color-primary);
}

/* Botones principales (Storefront ya trae la estructura, solo pintamos) */
.button,
.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

.button:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover {
	background-color: color-mix(in srgb, var(--csb-color-primary) 85%, black);
	border-color: color-mix(in srgb, var(--csb-color-primary) 85%, black);
}

/* ---------------------------------------------------------------------
   Cabecera (escritorio; el móvil tiene su propio bloque más abajo, en
   la media query de "Cabecera en móvil", que gana por ir después en el
   archivo).
--------------------------------------------------------------------- */
.site-header {
	background-color: #ffffff;
	border-bottom: 1px solid rgba(0, 0, 0, 0.08);
	/* Más compacta: Storefront trae 2.617924em arriba y 0 abajo por
	   defecto, bastante espacio suelto. */
	padding-top: 1.3em;
	padding-bottom: 1.3em;
	/* Storefront pone "margin-bottom: 4.235901032em" (~68px) en
	   ".site-header" en TODAS las páginas salvo su propia plantilla
	   "template-homepage.php" (la portada ya lo anula aparte, más abajo
	   en este archivo, "body.page-template-template-inicio-csb-php
	   .site-header"). En el resto de páginas (Tienda, categorías,
	   producto, Personalizado...) ese margen se sumaba al
	   "padding-top" de ".site-main" (otro ~68px, ver más abajo) y dejaba
	   un salto de ~136px de blanco antes del breadcrumb/banner: mucho
	   más aire que el resto del sitio, sensación de hueco "flotante". Un
	   margen mucho más ajustado, a juego con el resto de espaciados
	   compactos de esta cabecera. */
	margin-bottom: 1em;
}

/* ---------------------------------------------------------------------
   Cabecera de escritorio. OJO: aquí hubo un intento de reestructurar
   toda la cabecera en una cuadrícula (logo/buscador/cuenta/carrito +
   menú centrado, con sticky) que rompió la maquetación -se quedaba
   encajonada en una caja estrecha, perdía el fondo con textura, y el
   sticky molestaba al hacer scroll-. Se revirtió: la maquetación de
   escritorio es la de Storefront de toda la vida (dos bloques
   apilados, cada uno a ancho completo), con solo dos retoques propios:
   logo más grande, y menos padding vertical en los enlaces del menú.
   TODO esto va dentro de "min-width: 769px" a propósito, para no tocar
   ni un pixel de la cabecera de móvil (que tiene su propio bloque,
   "max-width: 767px", más abajo). */
@media screen and (min-width: 769px) {
	/* Más estrecha arriba (Storefront trae 2.617924em de serie, y con
	   el logo ya grande sobra aún más). La textura de fondo (imagen de
	   cabecera del Personalizador) no se repite en mosaico: se ajusta
	   para cubrir la franja sin dejar ver la unión ni verse recortada
	   de forma rara en anchos distintos. */
	/* "background-size: 100% auto" (no "cover"): la imagen de fondo de la
	   cabecera trae sus propios elementos decorativos (líneas y puntos
	   verdes) pensados para quedarse pegados arriba del todo. Con "cover"
	   la imagen se estira para llenar TODO el alto de la cabecera -que es
	   bastante más alta que la propia textura, por el logo y el buscador-
	   y esas líneas, en vez de quedarse arriba, se desplazaban hacia
	   abajo hasta caer encima del logo. Con "100% auto" la imagen ocupa
	   el ancho completo pero mantiene su propia proporción (más baja que
	   la cabecera entera), así que sus elementos se quedan donde se
	   diseñaron -pegados al borde de arriba-; el resto de la cabecera,
	   por debajo, se queda con el color de fondo normal (a juego, no se
	   nota la unión). */
	.site-header {
		/* La línea decorativa de la imagen está medida de verdad (no a
		   ojo): un 9,7-10% desde el borde superior de la propia imagen
		   (370px de alto en el archivo original). Como el fondo se
		   escala con "background-size: 100% auto" -ancho completo de la
		   cabecera, alto proporcional-, esa línea se mueve verticalmente
		   según el ancho real de la ventana: a más ancho, más abajo cae
		   en píxeles. Un "padding-top" en "em"/px" (fijo) solo la
		   acompaña bien a UN ancho de pantalla concreto; en "vw" (%
		   del ancho de la ventana) escala en la misma proporción que la
		   propia imagen, así que el logo queda a la misma altura
		   relativa respecto a la línea sea cual sea el ancho de
		   escritorio. 1,5vw deja la línea pasando por detrás de la
		   parte de arriba del logo (el icono/círculo), no a través del
		   texto "Camisas sin botones". */
		padding-top: 1.5vw;
		padding-bottom: 0.6em;
		background-repeat: no-repeat;
		background-size: 100% auto;
		background-position: center top;
		/* La regla de arriba (sin media query) deja ".site-header" en
		   blanco puro -pensado para cuando no había imagen de fondo-. La
		   textura en sí es de un tono crema, así que con "100% auto" (no
		   cubre toda la altura) se notaría un cambio de color justo donde
		   termina la imagen. Con el mismo crema de fondo del sitio, la
		   unión no se ve. */
		background-color: var(--csb-color-background);
	}

	/* LA causa real de que el buscador quedara pegado arriba, sin
	   centrar con el logo: Storefront coloca ".site-branding" y
	   ".site-search" con FLOAT (izquierda/derecha), y los elementos
	   flotados se alinean por defecto arriba de su línea, no al centro.
	   Como el logo ahora es mucho más alto que el buscador, el buscador
	   se quedaba "flotando" arriba en vez de centrado con él. Pasando
	   esta fila a flexbox con "align-items: center", el buscador se
	   centra verticalmente respecto al logo (que es el elemento más
	   alto de la fila), sin necesidad de "position:absolute" ni
	   "transform" a ciegas. */
	/* "justify-content: center" (no "space-between"): con "space-between"
	   el logo se iba pegado del todo al borde izquierdo de la cabecera y
	   el buscador al borde derecho, dejando el logo muy descentrado
	   respecto al ancho total. Centrando el conjunto (logo + buscador,
	   con "gap" en vez de "space-between" para separarlos) el logo queda
	   mucho más hacia el medio. */
	.site-header > .col-full {
		display: flex;
		align-items: center;
		justify-content: center;
		gap: 3em;
		flex-wrap: wrap;
	}

	/* Logo con mucho más protagonismo. Storefront trae
	   ".custom-logo-link img{width:100%;max-width:210px}" -el ancho lo
	   pone la propia imagen al 100%, así que si el CONTENEDOR
	   (.site-branding) no tiene un ancho concreto, el 100% de la imagen
	   no tiene a qué agarrarse y "auto" o un alto fijo pueden no dar el
	   resultado esperado según el navegador-. Se fija un ancho concreto
	   al contenedor Y a la imagen (width:100% del contenedor), doble
	   selector (por la clase del link Y por la clase de la propia
	   imagen) y !important para que no quede ninguna duda de que gana a
	   la regla de Storefront de arriba. object-fit:contain evita que se
	   deforme si la proporción real del archivo no es exacta. */
	.site-branding {
		width: 420px;
		max-width: 420px;
		/* Storefront calcula el alto de la marca a partir de un ancho de
		   logo fijo (210px); con el logo más alto, si no se toca esto se
		   queda corto y recorta el logo por abajo. */
		padding-top: 0.4em;
		padding-bottom: 0.4em;
	}

	.custom-logo-link,
	.custom-logo-link img,
	.custom-logo-link .custom-logo {
		width: 100% !important;
		max-width: none !important;
		height: auto !important;
		max-height: none !important;
		object-fit: contain;
		display: block;
	}

	/* Storefront trae "clear: both" aquí, pensado para la época en la que
	   ".site-branding"/".site-search" iban flotados (despejar los
	   flotantes de la fila de arriba antes de empezar el menú). Ahora esa
	   fila es flexbox (ver ".site-header > .col-full" más arriba): los
	   elementos flexibles ignoran "float" del todo, así que ya no hay
	   ningún flotante que despejar -si en algún navegador ese "clear"
	   seguía calculando espacio de más, esto lo anula-. */
	.storefront-primary-navigation {
		clear: none;
		margin-top: 0;
	}

	/* Menos aire vertical en los enlaces del menú (Storefront trae
	   1.618em de serie): la fila de navegación ocupa menos alto.
	   El espaciado horizontal entre elementos lo pone el "gap" del
	   "ul.menu" de aquí abajo, más un poco de padding en cada
	   enlace (zona de toque más cómoda). "white-space: nowrap" evita
	   que un título de 2 palabras (como "Nuestros diseños") se parta
	   él solo en dos líneas dentro de su propio hueco.
	   OJO: con 6 elementos en el menú (antes había 5), el texto de cada
	   uno YA NO PUEDE encogerse para hacer sitio -"white-space: nowrap"
	   se lo impide-, así que el ancho total es una suma fija. Un "gap"
	   de 24px+ (probado) hacía que la suma superase el ancho disponible
	   en pantallas de escritorio no muy anchas: al no caber, en vez de
	   apretarse se desbordaba hacia la izquierda (herencia de
	   "justify-content: flex-end", que empaqueta desde la derecha) y
	   "empujaba" visualmente el resto de la página -de ahí que se viera
	   todo descolocado, no un problema de centrado real-. Con un gap
	   más moderado y sin "flex-end" (alineado a la izquierda, su
	   comportamiento de toda la vida) vuelve a caber siempre con
	   margen.
	   Se apunta a ".primary-navigation ul.menu" (clase que ya viene en
	   el HTML) y no a "ul.nav-menu": esa la añade el navigation.js de
	   Storefront al terminar de cargar, y mientras tanto el menú salía
	   con el padding de serie, partido en dos filas, y luego "saltaba"
	   toda la página hacia arriba (CLS de 0,26 en escritorio). */
	.main-navigation .primary-navigation ul.menu > li > a {
		padding-top: 1em;
		padding-bottom: 1em;
		padding-left: 0.3em;
		padding-right: 0.3em;
		white-space: nowrap;
	}

	/* "flex-wrap: nowrap" fuerza una sola fila sí o sí (con 6 elementos
	   ya no cabían de serie y el último, "Contacto", se iba a una
	   segunda línea, descuadrando la cabecera). */
	.main-navigation .primary-navigation ul.menu {
		display: flex;
		flex-wrap: nowrap;
		gap: 16px;
	}

	/* Quita la flecha desplegable de "Tienda" (y de cualquier otro
	   elemento con submenú) SOLO en escritorio: es un botón que añade
	   por su cuenta "assets/js/navigation.js" de Storefront -no existe
	   en el HTML servido por PHP, por eso no se puede quitar editando
	   una plantilla-, y usa la misma clase ".dropdown-toggle" tanto aquí
	   (".storefront-primary-navigation", el menú de escritorio) como en
	   el menú de móvil (".handheld-navigation", con su propia regla en
	   la sección de móvil de este mismo archivo -esta de aquí, al vivir
	   dentro de "@media (min-width: 769px)", no llegaría a aplicarse en
	   móvil aunque se apuntara también a ".handheld-navigation"-). */
	.storefront-primary-navigation .dropdown-toggle {
		display: none !important;
	}

	/* No basta con ocultar el botón de arriba: ese solo quita la
	   flechita, pero Storefront sigue abriendo el ".sub-menu" de
	   "Tienda" (o el que sea) al pasar el ratón por encima -por CSS,
	   sin JS de por medio-. "Tienda" tiene que quedar como un enlace
	   normal y corriente, sin desplegable contextual alguno: se anula
	   también el propio submenú en escritorio (el de móvil no se toca,
	   ahí sigue siendo un acordeón útil). */
	.storefront-primary-navigation .sub-menu {
		display: none !important;
	}

	/* LA flecha visible de verdad (la de arriba, ".dropdown-toggle", es
	   inofensiva: "assets/js/navigation.js" del tema padre SOLO la crea
	   dentro de ".handheld-navigation", el menú de MÓVIL -nunca en
	   escritorio-, así que esa regla no llegaba a aplicarse a nada aquí).
	   El icono verde real es un "::after" con Font Awesome que el propio
	   CSS de Storefront (assets/css/base/icons.css) pone SIEMPRE
	   (display:inline-block, sin :hover de por medio) en el enlace de
	   cualquier item de menú con submenú -"Tienda", en este caso-. Se
	   anula aquí, en el mismo sitio que las reglas de arriba. */
	.storefront-primary-navigation .menu-item-has-children > a::after,
	.storefront-primary-navigation .page_item_has_children > a::after {
		content: none !important;
		display: none !important;
		margin-left: 0 !important;
	}

	.storefront-primary-navigation .col-full {
		display: flex;
		align-items: center;
		flex-wrap: nowrap;
		gap: 1.3em;
	}

	.main-navigation {
		float: none;
		width: auto;
		flex: 1 1 auto;
		min-width: 0;
		margin-right: 0;
	}

	.csb-account-item,
	.site-header-cart {
		float: none;
		width: auto;
		flex: 0 0 auto;
	}
}

/* Buscador (WooCommerce): bordes suaves, fondo contrastado, botón en
   verde oliva. Sin media query -así también se ve bien en móvil, en el
   desplegable que abre la lupa-. */
.woocommerce-product-search {
	display: flex;
	align-items: center;
	background-color: #ffffff;
	border: 1px solid rgba(0, 0, 0, 0.12);
	border-radius: 999px;
	padding: 0.3em 0.3em 0.3em 1.1em;
}

.woocommerce-product-search .search-field {
	flex: 1 1 auto;
	min-width: 0;
	/* Storefront pone en TODOS los input[type=search] (no algo pensado
	   para este buscador en concreto, es una regla genérica de todo el
	   sitio) un fondo gris y una sombra interior a modo de borde -eso
	   es lo que se veía como un "recuadro/parche flotante" dentro de
	   nuestra propia píldora-. Border/background/box-shadow a "none"
	   con !important porque, aun ganando por especificidad normal, es
	   una regla muy genérica (aplica a TODOS los campos de texto del
	   sitio) y conviene no depender de que nadie la toque por error. */
	border: none !important;
	background: none !important;
	box-shadow: none !important;
	font-family: var(--csb-font-body);
	font-size: 0.9rem;
	width: 100%;
	height: 100%;
	/* Lupa propia (Storefront traía la suya, un icono de Font Awesome,
	   ya anulado más abajo): un SVG en línea, sin depender de que cargue
	   ninguna fuente de iconos. */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23222222' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M21 21l-4.3-4.3'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: 0.1em center;
	background-size: 16px 16px;
	padding: 0.4em 0.4em 0.4em 1.6em;
}

.woocommerce-product-search .search-field:focus {
	outline: none;
}

.woocommerce-product-search .search-field::placeholder {
	color: var(--csb-color-text);
	opacity: 0.45;
}

.woocommerce-product-search button[type="submit"] {
	flex: 0 0 auto;
	border: none;
	border-radius: 999px;
	padding: 0.5em 1.1em;
	background-color: var(--csb-color-primary);
	color: #ffffff;
	font-size: 0.75rem;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	cursor: pointer;
}

.woocommerce-product-search button[type="submit"]:hover {
	background-color: color-mix(in srgb, var(--csb-color-primary) 85%, black);
}

/* Storefront le dibuja su PROPIA lupa al buscador (un icono de Font
   Awesome puesto por ::before) y le añade padding-left al campo de
   texto para hacerle sitio -con más especificidad que nuestras reglas
   de arriba, así que ganaba igualmente-. Si esa fuente de iconos no
   carga bien, ese ::before se ve como una caja/forma rara -el "doble
   borde" raro que se veía-. Como el diseño en píldora ya tiene su
   propio botón "Buscar", no hace falta ese icono: se anula del todo. */
.widget_product_search form::before,
.widget_product_search form:not(.wp-block-search)::before {
	content: none !important;
}

/* (El padding-left para la lupa ya lo pone ".search-field" de arriba,
   junto con el resto de su estilo -antes había una regla suelta aquí
   que se quedó corta y encima chocaba con el hueco para el icono-.) */

.site-title a {
	font-family: var(--csb-font-body);
	font-weight: 600;
	color: var(--csb-color-text);
}

/* ---------------------------------------------------------------------
   Ficha de producto a ancho completo (ver inc/product-page-layout.php):
   sin la barra lateral de Buscar/Categorías, con más sitio para la foto
   y el resto de la información.
--------------------------------------------------------------------- */
.csb-producto-sin-sidebar #primary {
	width: 100%;
	float: none;
	margin: 0;
}

/* Reparto entre foto y resumen (título/precio/filtros): la foto se
   lleva más proporción a propósito -era lo que se pidió, "mucho más
   grande"-, dejando al resumen el ancho justo para que los pills de
   Técnica/Talla/Color no se vean apretados.
   SOLO A PARTIR DE 768px (el breakpoint real de Storefront): esta regla
   no llevaba media query y se aplicaba también en móvil, aplastando el
   resumen a un 33% del ancho del TELÉFONO (no de la página) -de ahí el
   título partido a media palabra ("Camis eta clásica": a ese ancho
   "Camiseta" ni siquiera cabía entera) y los pills de Talla/Color/Técnica
   amontonados verticalmente, aunque esos ya llevan "flex-wrap" propio y
   no tienen ningún fallo en sí mismos-. Sin esta regla, en móvil
   ".images"/".summary" vuelven al comportamiento de WooCommerce de
   serie: bloques apilados al 100% del ancho, uno debajo del otro. */
@media screen and (min-width: 768px) {
	.csb-producto-sin-sidebar div.product .images,
	.csb-producto-sin-sidebar .woocommerce-product-gallery {
		width: 64%;
		margin-right: 3%;
	}

	.csb-producto-sin-sidebar div.product .summary {
		width: 33%;
	}
}

/* Columna de configuración (título, precio y Técnica/Talla/Color) más
   compacta: de serie, WooCommerce/Storefront dejan bastante aire suelto
   entre estos tres bloques -el propio <h1>, el "margin: 1.41575em 0" de
   "p.price" (~22.6px arriba Y abajo) y el "padding: 1em 0" de
   "form.cart" (el formulario que envuelve toda la tabla de variaciones,
   donde vive el primer bloque de pastillas, "Técnica")-. Se ajustan los
   tres para que el título/precio queden pegados entre sí y el bloque de
   opciones suba justo debajo, sin tocar el tamaño de letra ni las
   pastillas en sí (".csb-variation-pill(s)"), que ya son compactas. */
.summary .product_title {
	margin: 0 0 0.1em;
}

.summary p.price {
	margin: 0 0 0.2em;
}

.summary form.cart {
	padding-top: 0;
	margin-bottom: 0.2em;
}

/* Cabecera móvil de la ficha de producto (título + precio antes de la
   foto): ver inc/product-page-layout.php (imprime el hueco vacío) y
   assets/js/product-mobile-layout.js (lo rellena solo si de verdad se
   está en móvil, moviendo el <h1> y el precio de verdad, no una copia).
   En escritorio este bloque se queda "hidden" y no hace falta tocarlo
   aquí -por eso no lleva "@media": ya no es visible sin más-. */
.csb-producto-cabecera-movil:not([hidden]) {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: baseline;
	gap: 0.2em 0.8em;
	/* Bloque compacto a propósito -pedido explícito-: lo justo para que
	   el precio no toque el título, sin dejar aire de sobra antes de la
	   foto. */
	margin-bottom: 0.35em;
}

.csb-producto-cabecera-movil .product_title {
	margin: 0;
	flex: 1 1 auto;
	min-width: 0; /* Permite que el título encoja/rompa en palabra, no desborde. */
}

/* Precio más grande y en el color de marca -pedido explícito-, en vez
   del gris/negro de serie de WooCommerce. */
.csb-producto-cabecera-movil .price {
	margin: 0;
	flex-shrink: 0;
	font-size: 1.5rem;
	font-weight: 700;
	color: var(--csb-color-primary);
	white-space: nowrap;
}

/* Descripción de la ficha de producto en móvil, como acordeón cerrado:
   ver inc/product-page-layout.php (imprime el hueco) y
   assets/js/product-mobile-layout.js (mueve ahí la descripción real,
   solo en productos con galería por color -ver inc/color-gallery.php-;
   en el resto de productos este hueco se queda vacío y oculto). Reutiliza
   la apariencia de ".csb-technique-accordion" (Inicio, "Ver el proceso
   técnico"): mismo acordeón nativo <details>, no hace falta CSS nuevo
   para el propio desplegable, solo separarlo un poco de lo de arriba. */
.csb-producto-descripcion-movil:not([hidden]) {
	margin-top: 1.5em;
}

/* ---------------------------------------------------------------------
   Banner + franja de beneficios de "Personalizado" (ver
   csb_personalizado_banner_superior() en inc/personalizado-catalogo.php),
   justo antes de la cuadrícula de productos.
--------------------------------------------------------------------- */
/* Contenedor común de título+párrafo y tarjeta -es el que da el contexto
   de posicionamiento ("position:relative") para poder superponer el
   texto sobre la foto en escritorio (ver ".csb-catalogo-hero-text" más
   abajo). En móvil no hace falta nada especial aquí: los hijos van en
   flujo normal, uno debajo del otro. */
.csb-catalogo-hero-wrap {
	position: relative;
}

/* Escritorio: título+párrafo SUPERPUESTOS sobre la foto, en blanco,
   pegados a la esquina superior izquierda (vuelta a este diseño a
   petición del usuario, 2026-09-25). */
.csb-catalogo-hero-text {
	position: absolute;
	top: 1.8em;
	left: 1.8em;
	z-index: 1;
	max-width: 420px;
	color: #ffffff;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7), 0 1px 12px rgba(0, 0, 0, 0.4);
}

.csb-catalogo-hero-text h1 {
	font-size: 1.4rem;
	margin: 0 0 0.4em;
	color: inherit;
}

.csb-catalogo-hero-text p {
	margin: 0;
	font-size: 0.95rem;
	color: inherit;
}

.csb-catalogo-hero {
	position: relative;
	min-height: 340px;
	border-radius: 16px;
	overflow: hidden; /* Recorta las esquinas de ".csb-catalogo-hero-img" (absoluta) y del degradado de abajo. */
	padding: 1.5em;
}

/* La foto ocupa TODO el banner de fondo (position:absolute + inset:0). */
.csb-catalogo-hero-img {
	position: absolute;
	inset: 0;
	background-color: var(--csb-color-background); /* Por si no hay imagen todavía. */
	background-size: cover;
	background-position: center;
}

/* Degradado oscuro arriba y abajo (la foto en sí puede ser clara o
   recargada según la que se suba en Personalizar > Contacto y portada):
   así el texto de la esquina y el botón de abajo se leen bien encima de
   CUALQUIER foto, sin depender de lo oscura que sea. */
.csb-catalogo-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(
		to bottom,
		rgba(0, 0, 0, 0.5) 0%,
		rgba(0, 0, 0, 0) 30%,
		rgba(0, 0, 0, 0) 60%,
		rgba(0, 0, 0, 0.5) 100%
	);
	pointer-events: none;
}

/* Amarillo/naranja suave a propósito distinto del verde de marca -color
   de acento pedido para este botón en concreto, no de la paleta general
   del sitio-. Centrado, algo más arriba del borde inferior (no pegado del
   todo) para no tapar el diseño de la camiseta que suele salir ahí en la
   foto. */
.csb-catalogo-hero-cta {
	position: absolute;
	left: 50%;
	bottom: 2.75em;
	transform: translateX(-50%);
	display: inline-block;
	background-color: #f5c563;
	color: var(--csb-color-text);
	font-weight: 700;
	padding: 0.7em 1.6em;
	border-radius: 999px;
	text-decoration: none;
	box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25);
}

.csb-catalogo-hero-cta:hover {
	background-color: color-mix(in srgb, #f5c563 85%, black);
}

@media screen and (max-width: 767px) {
	/* En móvil NO se superpone el texto a la foto (queda ilegible/apretado
	   en pantalla estrecha): pasa a ser un bloque normal, centrado, ENCIMA
	   de la tarjeta -mismo motivo que en la versión anterior de este
	   banner-. "Camisetas personalizadas" se ve además más grande, casi
	   como un título de página (pedido expreso, 2026-09-25). */
	.csb-catalogo-hero-text {
		position: static;
		max-width: 480px;
		margin: 1.5em auto 0.8em;
		text-align: center;
		color: var(--csb-color-text);
		text-shadow: none;
	}

	.csb-catalogo-hero-text h1 {
		font-size: 1.7rem;
	}

	.csb-catalogo-hero-text p {
		font-size: 0.9rem;
	}

	.csb-catalogo-hero {
		min-height: 300px;
		padding: 1.2em;
	}

	.csb-catalogo-hero-cta {
		bottom: 2.25em;
	}
}

/* ---------------------------------------------------------------------
   Catálogo de "Personalizado" (ver inc/personalizado-catalogo.php):
   cuadrícula sin barra lateral, con tarjetas de producto rediseñadas
   (insignias, valoración con nota numérica, muestras de color). Todo
   dentro de ".csb-personalizado-catalogo" -en Tienda normal no cambia
   nada de esto-.
--------------------------------------------------------------------- */
/* Ensancha "#primary" al quitar la barra lateral -mismo motivo y mismo
   arreglo que ".csb-producto-sin-sidebar #primary" de aquí arriba: sin
   esto se queda al 73,9% de ancho de serie, con un hueco en blanco donde
   antes iba la barra lateral-. */
.csb-personalizado-catalogo #primary {
	width: 100%;
	float: none;
	margin: 0;
}

/* Storefront alinea el título de la página a la izquierda de serie. */
.csb-personalizado-catalogo .woocommerce-products-header__title {
	text-align: center;
}

/* En móvil, con el tamaño de letra fluido de serie de Storefront (~42px
   en pantallas de 390px), "Selecciona la prenda para personalizar" caía
   en 3 líneas. Se reduce el tamaño (probado: ≤38px ya da 2 líneas) para
   que quepa como mucho en 2. */
@media screen and (max-width: 767px) {
	.csb-personalizado-catalogo .woocommerce-products-header__title {
		font-size: 2.2rem;
	}
}

/* Cuadrícula: 4 columnas en escritorio, bajando por pasos hasta 2 en
   móvil. "!important" en el ancho de "li.product": Storefront lo
   maqueta de serie con float + ancho en porcentaje (pensado para SIN CSS
   Grid), y esa regla tiene la misma especificidad que la nuestra -sin
   forzarlo, en algunos anchos ganaba ella y dejaba huecos raros entre
   tarjeta y tarjeta en vez de que cada una ocupe su columna entera-. */
.csb-personalizado-catalogo ul.products {
	display: grid !important;
	grid-template-columns: repeat(4, 1fr);
	gap: 1.8em 1.2em;
}

.csb-personalizado-catalogo ul.products li.product {
	width: 100% !important;
	margin: 0 !important;
	float: none !important;
}

/* WooCommerce trae "ul.products::before { content:' '; display:table; }"
   -un "clearfix" de toda la vida, pensado para cuando "li.product" iba
   flotado-. Con "display: grid" en el padre, ese "::before" (al no ser
   "display: none") pasa a contar como una casilla más de la cuadrícula:
   una tarjeta vacía en la primera posición, empujando a "Camiseta" (el
   primer producto real) a la segunda. Con CSS Grid ya no hace falta
   ningún clearfix -eso era solo para contener flotantes-, así que se
   anula del todo. */
.csb-personalizado-catalogo ul.products::before,
.csb-personalizado-catalogo ul.products::after {
	content: none;
	display: none;
}

@media screen and (max-width: 991px) {
	.csb-personalizado-catalogo ul.products {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media screen and (max-width: 767px) {
	.csb-personalizado-catalogo ul.products {
		grid-template-columns: repeat(2, 1fr);
		gap: 1.2em 0.8em;
	}
}

/* --- Tarjeta de producto --- */
.csb-personalizado-catalogo ul.products li.product a.woocommerce-loop-product__link {
	display: block;
	position: relative; /* Ancla las insignias, que van "position: absolute" encima de la foto. */
	color: inherit;
	text-decoration: none;
}

/* La foto en sí (WooCommerce ya la pone dentro del enlace, sin div
   contenedor propio: no hace falta añadir uno, basta con dar el fondo y
   el redondeado a la propia "img"). */
.csb-personalizado-catalogo ul.products li.product img {
	background-color: #f4f4f4;
	border-radius: 8px;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	display: block;
	width: 100%;
	height: auto;
}

/* Insignia de categoría sobre la foto: PHP ya no la imprime (ver
   inc/personalizado-catalogo.php, quitada a petición expresa). Regla de
   respaldo por si queda algún fragmento cacheado o alguna otra fuente la
   sigue generando -no debería, pero por si acaso-. */
.csb-catalogo-badges,
.csb-catalogo-badge--categoria {
	display: none !important;
}

/* Título, precio, valoración: WooCommerce ya pinta el h2/span.price/
   div.star-rating de serie -aquí solo se retocan tamaños y colores-. */
.csb-personalizado-catalogo ul.products li.product h2.woocommerce-loop-product__title {
	font-size: 0.95rem;
	font-weight: 700;
	margin: 0.8em 0 0.3em;
	color: var(--csb-color-text);
}

.csb-personalizado-catalogo ul.products li.product .star-rating {
	margin: 0 0 0.3em;
	font-size: 0.8em;
	float: none;
	display: inline-block;
	vertical-align: top;
}

/* Estrellas rellenas en el verde de marca (estilo Trustpilot: estrellas
   de color en vez del amarillo de serie de WooCommerce). Las vacías
   ("::before" sin el "span" delante) se quedan con el gris de serie. */
.csb-personalizado-catalogo ul.products li.product .star-rating span::before {
	color: var(--csb-color-primary);
}

.csb-catalogo-valoracion-numero {
	display: inline-block;
	margin-left: 0.4em;
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--csb-color-text);
	vertical-align: top;
}

.csb-personalizado-catalogo ul.products li.product .price {
	display: block;
	font-size: 0.9rem;
	color: #6b6b6b;
	margin-bottom: 0.6em;
}

/* Muestras de color: círculos pequeños con el color aproximado de cada
   término del atributo "Color" (ver csb_color_a_hex()). */
.csb-catalogo-swatches {
	display: flex;
	align-items: center;
	gap: 0.35em;
	flex-wrap: wrap;
	margin-bottom: 0.6em;
}

.csb-catalogo-swatch {
	width: 16px;
	height: 16px;
	border-radius: 50%;
	border: 1px solid rgba(0, 0, 0, 0.15);
	display: inline-block;
}

.csb-catalogo-swatch-mas {
	font-size: 0.7rem;
	color: #6b6b6b;
	margin-left: 0.2em;
}

/* "Personalizar" al pasar el ratón (sustituye al botón "Enviar
   solicitud" fijo de antes, ver csb_personalizado_aviso_hover() en
   inc/personalizado-catalogo.php): la foto se oscurece un poco y aparece
   este aviso centrado, como pista de que toda la tarjeta lleva a la
   ficha del producto. "pointer-events: none" en el aviso: es decorativo,
   el clic lo recoge el enlace de toda la tarjeta, no hace falta que este
   span lo intercepte primero. */
.csb-personalizado-catalogo ul.products li.product a.woocommerce-loop-product__link {
	overflow: hidden; /* Que la foto no se salga de las esquinas redondeadas al hacer zoom/oscurecer. */
}

.csb-personalizado-catalogo ul.products li.product img {
	transition: filter 0.2s ease;
}

.csb-personalizado-catalogo ul.products li.product a.woocommerce-loop-product__link:hover img {
	filter: brightness(0.82);
}

.csb-catalogo-hover-cta {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	opacity: 0;
	transition: opacity 0.2s ease;
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	background-color: #ffffff;
	border: 1.5px solid var(--csb-color-primary);
	color: var(--csb-color-primary);
	padding: 0.5em 1.1em;
	border-radius: 999px;
	font-size: 0.85rem;
	font-weight: 600;
	white-space: nowrap;
	pointer-events: none;
}

.csb-catalogo-hover-cta .csb-icon {
	width: 16px;
	height: 16px;
}

.csb-personalizado-catalogo ul.products li.product a.woocommerce-loop-product__link:hover .csb-catalogo-hover-cta {
	opacity: 1;
}

/* ---------------------------------------------------------------------
   Páginas propias sin barra lateral (Inicio, Empresas, Contacto,
   Nuestros diseños): CAUSA REAL de que estas páginas se vieran
   "descentradas" -contenido desplazado a la izquierda, hueco de más a
   la derecha-. Storefront pone ".content-area" (o sea "#primary") al 73.9% de ancho
   y flotando a la izquierda de SERIE, EN TODAS LAS PÁGINAS, reservando
   sitio a la derecha para la barra lateral -esto NO depende de si la
   página en cuestión llama a get_sidebar(), depende solo de si HAY
   widgets guardados en esa barra lateral en algún sitio (Apariencia >
   Widgets), y aquí SÍ los hay -los filtros de Talla/Color/Categorías
   que se usan en Tienda-. Como ninguna de estas 4 plantillas llama a
   get_sidebar(), ese 26,1% de ancho reservado se quedaba en blanco en
   vez de mostrar la barra lateral, y para colmo las secciones "a
   sangre completa" (".csb-section--bleed": héroe, técnicas, Ejemplos
   de trabajos, CTA...) calculan su posición a partir del ancho de
   "#primary" -que sin este arreglo es un 26,1% más estrecho de lo que
   debería-, así que TODAS ellas quedaban desplazadas hacia la
   izquierda, no solo el hueco visible de la barra lateral fantasma.
   Mismo arreglo que ya existe para la ficha de producto (ver arriba,
   ".csb-producto-sin-sidebar"), aplicado aquí a estas 4 plantillas por
   su clase de plantilla en el body. */
body.page-template-template-inicio-csb-php #primary,
body.page-template-template-empresas-csb-php #primary,
body.page-template-template-contacto-csb-php #primary,
body.page-template-template-disenos-csb-php #primary {
	width: 100%;
	float: none;
	margin: 0;
}

/* ---------------------------------------------------------------------
   Home - Storefront ya gestiona el homepage vía Customizer > Homepage.
   Aquí solo damos estilo a los títulos de sección que ese sistema genera.
--------------------------------------------------------------------- */
.storefront-product-section .section-title,
.storefront-recent-products .section-title,
.storefront-featured-products .section-title {
	font-family: var(--csb-font-body);
	color: var(--csb-color-text);
	text-transform: uppercase;
	letter-spacing: 0.05em;
}

/* ---------------------------------------------------------------------
   Listado de categoría / tienda
--------------------------------------------------------------------- */
ul.products li.product .price {
	color: var(--csb-color-primary);
	font-weight: 600;
}

ul.products li.product h2.woocommerce-loop-product__title {
	font-family: var(--csb-font-body);
	color: var(--csb-color-text);
}

/* Ordenar por (desplegable nativo de WooCommerce, encima de la rejilla). */
.woocommerce-ordering select {
	font-family: var(--csb-font-body);
	padding: 0.5em 0.8em;
	border: 1px solid rgba(0, 0, 0, 0.15);
	border-radius: 4px;
	background-color: #ffffff;
}

/* ---------------------------------------------------------------------
   Barra lateral de la tienda (búsqueda, filtro por talla, precio,
   categorías): son widgets nativos de WooCommerce, aquí solo se pintan
   con la tipografía/colores de la marca.
--------------------------------------------------------------------- */
.widget-area .widget-title {
	font-family: var(--csb-font-body);
	text-transform: uppercase;
	font-size: 0.85rem;
	letter-spacing: 0.03em;
	margin-bottom: 0.8em;
}

/* Filtro por talla/color: pastillas redondeadas, con el mismo estilo
   que ya se usa en las pastillas de la página de personalización
   (.csb-variation-pill) para que se sientan parte del mismo sitio, en
   vez de un "botón de filtro" genérico aparte. */
.widget_layered_nav .woocommerce-widget-layered-nav-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 0.6em;
}

.widget_layered_nav .woocommerce-widget-layered-nav-list__item {
	margin: 0;
}

/* DevTools mostró un ::before de 14x19.83px en el <li> (un cuadrado
   gris pegado a cada pastilla) que no viene de ningún CSS nuestro -ni
   de Storefront, ni de WooCommerce, se ha buscado en los tres sitios-.
   En vez de perseguir de dónde sale exactamente, se anula aquí
   directamente: es más fiable que seguir adivinando el origen. */
.widget_layered_nav .woocommerce-widget-layered-nav-list__item::before,
.widget_layered_nav .woocommerce-widget-layered-nav-list__item::after {
	content: none !important;
}

.widget_layered_nav .woocommerce-widget-layered-nav-list__item a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 2.75em;
	padding: 0.5em 1em;
	border: 1.5px solid rgba(0, 0, 0, 0.25);
	border-radius: 999px;
	background-color: #ffffff;
	font-size: 0.75rem;
	font-weight: 500;
	color: var(--csb-color-text);
	text-decoration: none;
	transition: background-color 0.15s, border-color 0.15s, color 0.15s, transform 0.1s;
}

.widget_layered_nav .woocommerce-widget-layered-nav-list__item a:hover {
	border-color: var(--csb-color-primary);
	color: var(--csb-color-primary);
	transform: translateY(-1px);
}

/* Solo Talla: cuadrado uniforme (ancho y alto fijos, no solo un
   mínimo), igual para todas las tallas -"2XL" y "M" ocupan el mismo
   cuadrado, en vez de que cada una mida lo que ocupe su texto-, del
   mismo tamaño de "letra" que los cuadraditos de color pero más
   grande para que quepa el texto. Se distingue del resto de filtros
   por su propia clase ("csb-talla-chip", inc/shop-filters.php la pone
   directamente en el HTML) y no por la URL del enlace: la URL para
   QUITAR la última talla marcada deja de llevar "filter_talla=" -al
   quitarla no queda ningún filtro activo-, así que fiarse de la URL
   hacía que esa pastilla perdiera el formato justo al quedar sola
   marcada. */
.widget_layered_nav .woocommerce-widget-layered-nav-list__item .csb-talla-chip {
	width: 2.5em;
	height: 2.5em;
	min-width: 0;
	padding: 0;
	border-radius: 8px;
}

/* "Talla única" no es una talla de verdad (no tiene sentido en un
   cuadrado de 2.5em junto a "M" o "L"): en vez de forzarla al mismo
   molde, se le da su propia forma de píldora ancha, con el texto en una
   sola línea. */
.widget_layered_nav .woocommerce-widget-layered-nav-list__item .csb-talla-chip--unica {
	width: auto;
	height: auto;
	padding: 0.5em 0.9em;
	border-radius: 999px;
	font-size: 0.72rem;
	white-space: nowrap;
}

/* El número entre paréntesis ("(12)") se oculta a propósito: se pidió
   quitarlo de las pastillas de filtro. */
.widget_layered_nav .woocommerce-widget-layered-nav-list__item .count {
	display: none;
}

/* Mientras se pide el filtro por AJAX (assets/js/shop-filters.js): el
   listado de productos se atenúa un poco en vez de desaparecer, para
   que no dé sensación de "página rota" durante el medio segundo que
   tarda en llegar la respuesta. */
#main.csb-filtro-cargando {
	opacity: 0.5;
	pointer-events: none;
	transition: opacity 0.15s;
}

/* Talla seleccionada (tras hacer clic): pastilla rellena, para que se
   note cuál está activa. (El filtro de Color se quitó de toda la
   tienda -inc/shop-filters.php-, así que hoy esta regla solo aplica a
   Talla.) */
.widget_layered_nav .woocommerce-widget-layered-nav-list__item--chosen a {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

/* Buscador y categorías del sidebar: solo tipografía. */
.widget_product_search input[type="search"] {
	font-family: var(--csb-font-body);
	padding: 0.5em 0.8em;
	border: 1px solid rgba(0, 0, 0, 0.15);
	border-radius: 4px;
	width: 100%;
}

.widget_product_categories ul,
.widget_price_filter {
	font-family: var(--csb-font-body);
}

/* ---------------------------------------------------------------------
   Ficha de producto: aviso de vinilo / tinta
--------------------------------------------------------------------- */
.csb-technique-notice {
	margin: 1em 0;
	padding: 0.9em 1.1em;
	border-left: 4px solid var(--csb-color-primary);
	background-color: rgba(0, 0, 0, 0.03);
}

.csb-technique-label {
	margin: 0 0 0.4em;
	font-family: var(--csb-font-body);
	font-size: 1rem;
}

.csb-technique-instructions {
	font-size: 0.9rem;
	color: var(--csb-color-text);
	opacity: 0.85;
}

.csb-technique-instructions p {
	margin: 0 0 0.4em;
}

/* Distinguir visualmente DTG de DTF con un pequeño matiz de borde */
.csb-technique-dtg {
	border-left-color: var(--csb-color-primary);
}

.csb-technique-dtf {
	border-left-color: var(--csb-color-text);
}

/* ---------------------------------------------------------------------
   Carrito y checkout (solo estética, sin tocar la lógica de WooCommerce)
--------------------------------------------------------------------- */
.csb-page-cart .shop_table th,
.csb-page-checkout .shop_table th {
	font-family: var(--csb-font-body);
	color: var(--csb-color-text);
}

.csb-page-checkout #order_review_heading,
.csb-page-cart .cart-collaterals .cart_totals h2 {
	font-family: var(--csb-font-body);
	text-transform: uppercase;
	letter-spacing: 0.03em;
}

/* ---------------------------------------------------------------------
   "Mi cuenta" + carrito (inc/account-icon.php)
--------------------------------------------------------------------- */
/* Logo, lupa y carrito de móvil: ocultos por defecto (escritorio), para
   que NO se vean a la vez que sus versiones normales de escritorio.
   Solo se muestran dentro de la media query de abajo. */
.csb-logo-mobile-link,
.csb-search-toggle,
.csb-cart-mobile-link {
	display: none;
}

/*
 * Cabecera en móvil: UNA fila normal (no fija, se desplaza con la
 * página, como el resto de la cabecera): hamburguesa - logo - lupa -
 * carrito.
 *
 * Storefront reparte la cabecera en DOS bloques apilados (uno para el
 * logo/buscador, otro -aparte- para el menú+carrito): con "display:
 * contents" en esos bloques "desaparecen" como caja (sus hijos pasan a
 * ser hijos directos de .site-header, en el mismo flex), sin tocar el
 * HTML ni el JS del menú (que sigue funcionando igual, con sus mismas
 * clases). Así se puede ordenar cada pieza con "order" aunque en el
 * HTML estén en sitios distintos.
 */
@media screen and (max-width: 767px) {
	.site-header > .col-full,
	.storefront-primary-navigation,
	.storefront-primary-navigation > .col-full {
		display: contents;
	}

	/* Barra fija de Storefront (Mi cuenta/Buscar/Carrito, pegada abajo
	   del todo): ya no se usa, la sustituye nuestra fila de arriba. */
	.storefront-handheld-footer-bar {
		display: none;
	}

	/* La barra negra (inc/topbar.php) YA NO es pegajosa por sí sola: lo es
	   ".csb-sticky-wrap", el contenedor que la envuelve junto con toda la
	   cabecera (ver más abajo, junto a ".site-header"). */

	.csb-topbar-inner {
		padding: 0.3em 1em;
		font-size: 0.7rem;
	}

	.csb-topbar-contact .csb-icon {
		width: 12px;
		height: 12px;
	}

	/* En móvil, las 3 frases juntas ("Personalización desde 1 unidad ·
	   Diseños a medida · Envíos a Península y Baleares") no cabían en una línea y
	   se amontonaban envolviendo en varias líneas -la barra se hacía
	   alta y difícil de leer-. En vez de ocultarlas, se convierten en una
	   marquesina (desplazamiento horizontal continuo) que ocupa el 70%
	   izquierdo de la franja, mientras el teléfono se queda fijo a la
	   derecha, sin moverse ni recortarse nunca. */
	.csb-topbar-inner {
		max-height: 40px;
	}

	/* Selector con el padre delante (".csb-topbar-inner .csb-topbar-promo",
	   no solo ".csb-topbar-promo") a propósito: este span también lleva
	   la clase ".csb-topbar-item", que más abajo en este mismo archivo
	   (fuera de toda media query, así que se aplica siempre) tiene
	   "display: flex". Con la misma especificidad (una sola clase) y
	   viniendo después en el archivo, esa regla ganaba en móvil y
	   deshacía este "display: block" -aunque "flex: 1 1 70%" sí se
	   aplicaba, el contenedor volvía a ser flex por dentro, cambiando
	   cómo su hijo (.csb-topbar-marquee) calcula su ancho y dejaba de
	   recortar bien el texto que sobra, que se veía "escapándose" hacia
	   la zona del teléfono. Cualificar con el padre sube la especificidad
	   y evita depender del orden de aparición en el archivo. También se
	   repite aquí "overflow: hidden" (además del que ya tiene
	   .csb-topbar-marquee) como refuerzo: así el texto nunca se sale de
	   su 70% aunque algo más cambie el "display" del hijo. */
	.csb-topbar-inner .csb-topbar-promo {
		display: block;
		overflow: hidden;
		flex: 1 1 70%;
		min-width: 0;
	}

	.csb-topbar-marquee {
		display: block;
		overflow: hidden;
		width: 100%;
	}

	/* La distancia del "translateX" es "-50%" -la mitad del ancho de la
	   propia pista, que son las 2 copias juntas- en vez de un valor en
	   píxeles medido por JavaScript (como se probó antes): medir con
	   JS y guardarlo en una variable CSS traía dos problemas nuevos -el
	   valor podía tomarse antes de que la fuente Jost terminara de
	   cargar, y "offsetWidth" redondea a pixel entero, perdiendo la
	   precisión de subpíxel que sí usa el navegador para maquetar-,
	   además de que una animación ya en marcha no recalcula sus
	   "@keyframes" aunque cambie la variable, así que había que
	   reiniciarla a mano y esos reinicios no siempre coincidían con el
	   punto del bucle -se veía como si acabara una animación y
	   empezara otra-. Con "-50%" no hace falta nada de eso: como las 2
	   copias son EXACTAMENTE el mismo HTML/texto/fuente, ocupan
	   exactamente el mismo ancho, y el navegador calcula ese "50%"
	   sobre el ancho real ya maquetado (con toda su precisión de
	   subpíxel), no sobre una medida aproximada aparte. */
	.csb-topbar-marquee-track {
		display: flex;
		width: max-content;
		/* 18 s por vuelta completa (una copia entera del mensaje): la
		   misma velocidad aparente que tenía cuando la pista, por error,
		   solo tenía una copia y recorría la mitad en 9 s. */
		animation: csb-topbar-marquee 18s linear infinite;
		will-change: transform;
	}

	.csb-topbar-marquee-content {
		display: block;
		white-space: nowrap;
		/* Sin esto, al ser hijo de un flex container, por defecto puede
		   encogerse ("flex-shrink" vale 1 de serie) si hay el más mínimo
		   desajuste de subpíxel -diferente redondeo entre esta copia y
		   la otra-. Si las dos copias no miden EXACTAMENTE lo mismo en
		   píxeles, el desplazamiento del 50% no encaja perfecto y se ve
		   como un salto en el punto del bucle. "flex: 0 0 auto" fija su
		   ancho natural sin permitir que se toque. */
		flex: 0 0 auto;
	}

	/* Separador entre el final de una vuelta ("...Península y Baleares") y el
	   principio de la siguiente ("Personalización...") -antes era solo
	   un hueco en blanco (padding), ahora es un "·" visible, igual que
	   el resto de separadores de la franja, para que la unión se lea
	   bien en vez de las dos frases pegadas. */
	.csb-topbar-marquee-sep {
		margin: 0 0.6em;
	}

	/* La 2ª copia del mensaje (oculta en escritorio, ver más abajo) es
	   la que hace que el bucle no se note al reiniciar: en vez de "saltar"
	   de vuelta al principio, cuando la 1ª copia sale por la izquierda la
	   2ª ya viene justo detrás. */
	.csb-topbar-marquee-content--copia {
		display: block;
	}

	.csb-topbar-contact {
		flex: 0 0 auto;
	}

	/* En móvil se queda solo el teléfono: el email fijo a la derecha
	   quitaba sitio a la marquesina de la izquierda (pedido explícito
	   2026-09-25). El separador "·" entre teléfono y email (hijo directo
	   de ".csb-topbar-contact", no los "·" de la marquesina, que son
	   hijos de ".csb-topbar-promo") se oculta también, para no dejarlo
	   suelto sin nada detrás. En escritorio no cambia nada. */
	.csb-topbar-contact a[href^="mailto:"],
	.csb-topbar-contact > .csb-topbar-sep {
		display: none;
	}

	/* A quien prefiera menos movimiento en pantalla (ajuste de
	   accesibilidad del sistema operativo/navegador), se le muestra el
	   mensaje quieto en vez de animado. */
	@media (prefers-reduced-motion: reduce) {
		.csb-topbar-marquee-track {
			animation: none;
		}

		.csb-topbar-marquee-content--copia {
			display: none;
		}
	}

	.csb-topbar-mobile-hide {
		display: none;
	}

	@keyframes csb-topbar-marquee {
		from {
			transform: translateX(0);
		}
		to {
			transform: translateX(-50%);
		}
	}

	/* Grid de 3 columnas iguales para la fila 2 (menú/lupa/carrito): a
	   diferencia de flex + "order" (que dependía de que los 3 elementos
	   pesaran lo mismo y se descolocaba si #site-navigation cambiaba de
	   tamaño al abrir el menú), cada icono va a una columna fija por
	   "grid-column", así su posición no se mueve pase lo que pase con
	   sus vecinos. Padding/gap más ajustados que antes ("más estrecho"). */
	.site-header {
		display: grid;
		grid-template-columns: 1fr 1fr 1fr;
		align-items: center;
		/* Aún más apretado: se mantienen las 2 filas (logo grande arriba,
		   menú/lupa/carrito debajo) pero con menos aire para que el
		   conjunto ocupe menos alto en total. */
		gap: 0.2em 0.4em;
		padding: 0.25em 0.75em;
	}

	/* Contenedor pegajoso único para la barra negra + la cabecera (ver el
	   porqué en el comentario grande de inc/topbar.php: antes cada una era
	   "position: sticky" por su lado, y la cabecera necesitaba conocer por
	   JavaScript la altura exacta de la barra negra para pegarse justo
	   debajo -si esa medida no cuadraba al milímetro, quedaba un hueco o
	   una superposición entre las dos, que es lo que se seguía viendo
	   pese a quitar la transición-. Con las dos DENTRO de un mismo
	   "sticky", van siempre pegadas la una a la otra sin ningún cálculo
	   de por medio: aquí no puede desajustarse nada. */
	.csb-sticky-wrap {
		position: sticky;
		top: 0;
		z-index: 210;
	}

	/* Header inteligente: 3 estados, según la dirección del scroll (los
	   pone assets/js/mobile-header.js sobre ".csb-sticky-wrap"):
	   - Arriba del todo (scroll = 0): sin clase, se ve todo -barra negra,
	     logo y fila de iconos- en su sitio normal.
	   - Bajando: ".csb-header-abajo" -> el bloque entero se desliza fuera
	     de la pantalla (no se ve nada de la cabecera).
	   - Subiendo (sin haber llegado arriba del todo): ".csb-header-compacto"
	     -> el bloque se queda pegado arriba (sin trasladarse), pero dentro
	     se ocultan la barra negra y la fila del logo (ver más abajo),
	     dejando visible solo la fila de iconos (menú/lupa/carrito) como
	     barra compacta -conserva el fondo/textura propios de
	     ".site-header", no hace falta reproducirlos aparte-.
	   Sin "transition" en "transform" a propósito: con "position: sticky",
	   el elemento sigue ocupando su hueco en el documento aunque se mueva
	   visualmente, así que animar el desplazamiento dejaba un fotograma a
	   medio camino tapando solo una parte de sí mismo sobre el contenido
	   de debajo -el "cortada a medias" que se veía antes-. Sin transición,
	   el cambio es instantáneo: no hay fotograma intermedio que ver. */
	.csb-sticky-wrap.csb-header-abajo {
		transform: translateY(-100%);
	}

	.csb-sticky-wrap.csb-header-compacto .csb-topbar,
	.csb-sticky-wrap.csb-header-compacto .csb-logo-mobile-link {
		display: none;
	}

	/* Logo de escritorio oculto (se ve el de inc/mobile-header.php);
	   "Mi cuenta" no se usa en móvil; el carrito normal (texto, sin
	   icono) tampoco -lo sustituye .csb-cart-mobile-link, con icono-.
	   Con "body" delante para ganar en especificidad a las reglas base
	   de ".csb-account-item"/etc. (que no van en media query, pero
	   salen más abajo en el archivo y si no ganarían ellas). */
	body .site-branding,
	body .csb-account-item,
	body #site-header-cart {
		display: none;
	}

	/* Fila 1: logo solo, centrado y grande, ocupando las 3 columnas
	   (fuerza el salto de línea de la fila 2 de debajo). "grid-row"
	   explícito en las 3 filas: si se deja que el grid las coloque solas
	   (auto-placement), el orden real en el HTML (lupa antes que el
	   nav) hace que caigan en filas distintas y queden desniveladas. */
	/* El padding vertical deja la fila del logo con el mismo alto que
	   tenía con el PNG antiguo (58px, que ya traía ese aire dentro de la
	   imagen): la franja no crece, solo el logo. */
	.csb-logo-mobile-link {
		grid-row: 1;
		grid-column: 1 / -1;
		display: flex;
		justify-content: center;
		padding: 6px 0;
	}

	/* logo-movil.png ya viene recortado al dibujo: el ancho que se ve es
	   el del logo de verdad (antes ~164px de dibujo dentro de un PNG con
	   mucho margen). Tope en % del ancho de pantalla para móviles
	   estrechos. */
	.csb-logo-mobile {
		display: block;
		width: min(290px, 76vw);
		height: auto;
	}

	/* Fila 2: menú (columna 1, izquierda) - lupa (columna 2, centro) -
	   carrito (columna 3, derecha). */
	#site-navigation {
		grid-row: 2;
		grid-column: 1;
		justify-self: start;
		width: auto;
		margin: 0;
	}

	.csb-search-toggle {
		grid-row: 2;
		grid-column: 2;
		justify-self: center;
		/* 44px mínimo de zona táctil (recomendación de accesibilidad
		   táctil), aunque el icono en sí se quede en 20px. */
		width: 44px;
		height: 44px;
		padding: 0;
		border: none;
		background: none;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.csb-search-toggle .csb-icon {
		width: 20px;
		height: 20px;
		color: var(--csb-color-text);
	}

	.csb-cart-mobile-link {
		grid-row: 2;
		grid-column: 3;
		justify-self: end;
		position: relative;
		display: flex;
		align-items: center;
		justify-content: center;
		width: 44px;
		height: 44px;
	}

	.csb-cart-mobile-link .csb-icon {
		width: 20px;
		height: 20px;
		color: var(--csb-color-text);
	}

	.csb-cart-mobile-count {
		position: absolute;
		top: -0.2em;
		right: -0.2em;
		display: flex;
		align-items: center;
		justify-content: center;
		min-width: 1.3em;
		height: 1.3em;
		padding: 0 0.25em;
		border-radius: 999px;
		background-color: var(--csb-color-primary);
		color: #ffffff;
		font-size: 0.65rem;
		font-weight: 700;
		line-height: 1;
		text-align: center;
		box-shadow: 0 0 0 2px var(--csb-color-background);
	}

	/* Buscador (.site-search, con el buscador real de WooCommerce
	   dentro): oculto hasta pulsar la lupa (assets/js/mobile-header.js),
	   y cuando se muestra ocupa el ancho completo debajo de la fila
	   (flujo normal, empuja el contenido, no se superpone a nada). */
	.site-search {
		grid-row: 3;
		grid-column: 1 / -1;
		display: none;
		margin-top: 0.5em;
	}

	.site-search.csb-search-abierto {
		display: block;
	}

	/* Hamburguesa: en vez de pelear con el marco + rayitas que dibuja
	   Storefront por defecto con CSS (border + pseudo-elementos, daba
	   problemas visuales), se anula todo eso y se usa un icono SVG
	   propio (assets/js/mobile-header.js lo inyecta dentro del botón,
	   igual que ya se hace con la lupa y el carrito). El botón sigue
	   siendo el mismo de Storefront (mismo id/clase), así que su clic y
	   el toggle del menú (navigation.js) funcionan igual que siempre. */
	button.menu-toggle {
		float: none;
		max-width: none;
		/* 44px mínimo de zona táctil. */
		width: 44px;
		height: 44px;
		padding: 0;
		margin: 0;
		border: none;
		outline: none;
		background: none;
		box-shadow: none;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	/* Texto "Menú" original: se queda solo para lectores de pantalla. */
	button.menu-toggle span:not(.csb-menu-icon) {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip: rect(0, 0, 0, 0);
		white-space: nowrap;
	}

	button.menu-toggle::before,
	button.menu-toggle::after,
	button.menu-toggle span::before {
		content: none;
	}

	.csb-menu-icon {
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.csb-menu-icon .csb-icon {
		width: 20px;
		height: 20px;
		color: var(--csb-color-text);
	}

	/* El menú, al abrirse, se sale de la fila y cubre el ancho completo
	   debajo de la cabecera (si no, quedaría apretado en el hueco de la
	   hamburguesa, que ahora es estrecho). */
	.main-navigation.toggled .primary-navigation,
	.main-navigation.toggled .handheld-navigation {
		position: absolute;
		top: 100%;
		left: 0;
		width: 100%;
		max-height: none;
		background-color: #ffffff;
		border-top: 1px solid rgba(0, 0, 0, 0.08);
		box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08);
		z-index: 100;
		padding: 0.3em 0.75em;
	}

	/* Contenido del menú: por defecto Storefront deja muchísimo espacio
	   en blanco entre enlaces, el texto queda pegado al borde (el enlace
	   no lleva padding horizontal propio) y no diferencia visualmente el
	   nivel principal del submenú. Aquí se aprieta el espaciado y se
	   añaden separadores + un acento de color para dar estructura.
	   OJO: el toggle de Storefront (navigation.js) le pone la clase
	   "nav-menu" al PRIMER <ul> que encuentra dentro de #site-navigation,
	   que es el de ".primary-navigation" (pensado para escritorio, con
	   submenús al pasar el ratón) y no al de ".handheld-navigation" (el
	   que de verdad se ve y se usa en móvil, con acordeón táctil) -por
	   eso se apunta aquí directamente a ".handheld-navigation", no a
	   ".nav-menu". */
	.main-navigation.toggled .handheld-navigation ul.menu {
		margin: 0;
	}

	.main-navigation.toggled .handheld-navigation ul.menu > li {
		border-bottom: 1px solid rgba(0, 0, 0, 0.07);
	}

	.main-navigation.toggled .handheld-navigation ul.menu > li:last-child {
		border-bottom: none;
	}

	.main-navigation.toggled .handheld-navigation ul.menu > li > a {
		padding: 0.85em 1.25em;
		font-family: var(--csb-font-body);
		font-weight: 600;
		font-size: 0.95em;
		letter-spacing: 0.01em;
	}

	/* "Tienda" (y cualquier otro elemento con submenú) en el menú de
	   móvil: igual que en escritorio, queda como un enlace normal y
	   corriente, sin flecha ni acordeón desplegable -la navegación por
	   categoría sigue disponible en la propia página de Tienda (barra
	   "CATEGORÍAS"), no hace falta duplicarla aquí-. */
	.handheld-navigation .dropdown-toggle,
	.handheld-navigation .sub-menu {
		display: none !important;
	}
}

.csb-account-item {
	display: flex;
	align-items: center;
	/* Más compacto (era 1.618em): menos aire entre el menú y el borde
	   inferior de la cabecera. */
	padding: 0.9em 0;
}

.csb-account-item,
.site-header-cart .cart-contents {
	white-space: nowrap;
}

.csb-account-link {
	display: flex;
	align-items: center;
	gap: 0.4em;
	color: var(--csb-color-text);
}

.csb-account-link .csb-icon {
	width: 18px;
	height: 18px;
}

/* ---------------------------------------------------------------------
   Carrito de la cabecera (escritorio): icono + badge flotante con el
   número de artículos, en vez del texto plano "0,00 € 0 productos" con
   el icono de cesta de Storefront (Font Awesome, en icons.css del tema
   padre, pegado DESPUÉS del texto con "::after"). El HTML nuevo lo
   imprime "storefront_cart_link()" en inc/checkout-cart-tweaks.php.
--------------------------------------------------------------------- */

/* El icono de cesta original de Storefront ya no pinta nada (nuestro
   propio SVG, ".csb-icon", va dentro de ".csb-cart-icon-wrap"): se
   anula el "::after" para que no aparezca un segundo icono suelto. */
.site-header-cart .cart-contents::after {
	content: none !important;
	display: none !important;
}

.site-header-cart .cart-contents {
	display: flex;
	align-items: center;
	gap: 0.6em;
	text-decoration: none;
}

/* Sin fondo propio a propósito (pedido explícito): el icono se asienta
   directo sobre el beige de la cabecera, "width/height" se mantienen
   solo como caja de referencia para el badge de abajo (position:
   absolute, más el mismo espacio de click que "Mi cuenta" al lado). */
.csb-cart-icon-wrap {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	flex: 0 0 auto;
}

.csb-cart-icon-wrap .csb-icon {
	width: 20px;
	height: 20px;
	color: var(--csb-color-primary);
}

/* Pastilla/badge flotante con el número de artículos: "position:
   relative" en el contenedor de arriba + "position: absolute" aquí, así
   se superpone en la esquina del icono en vez de ir en línea con el
   texto (lo que pedía el texto plano de antes).
   "box-shadow" con el color de fondo de la cabecera hace de anillo: separa
   visualmente la pastilla del icono aunque el trazo del carrito llegue
   hasta la esquina, en vez de que el número se vea "pegado" o encima del
   dibujo. Centrado con flex (no line-height) para que un "9" o un "12"
   queden igual de centrados dentro del círculo.

   OJO especificidad: el span lleva también la clase "count" (la que
   pone WooCommerce/Storefront de serie), y el tema padre ya trae
   ".cart-contents .count { opacity:.5; font-weight:400; font-size:.875em }"
   -DOS clases, más específica que un ".csb-cart-badge" suelto de UNA-.
   Esa regla ganaba pese a cargarse antes, dejando el badge medio
   transparente y descuadrado encima del icono. Por eso el selector de
   aquí también encadena tres clases: así gana siempre, cargue quien
   cargue después. */
.site-header-cart .cart-contents .csb-cart-badge {
	position: absolute;
	top: -8px;
	right: -8px;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 16px;
	height: 16px;
	padding: 0 0.3em;
	border-radius: 999px;
	background-color: var(--csb-color-primary);
	color: #ffffff;
	font-size: 10px;
	font-weight: 700;
	line-height: 1;
	text-align: center;
	white-space: nowrap;
	opacity: 1;
	box-shadow: 0 0 0 2px var(--csb-color-background);
}

.csb-cart-total {
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--csb-color-text);
	white-space: nowrap;
}

/* ---------------------------------------------------------------------
   Formulario de diseño en la ficha de producto (inc/design-upload.php)
--------------------------------------------------------------------- */
.csb-design-upload {
	margin: 1.2em 0;
	padding: 1.2em;
	border: 1px dashed var(--csb-color-primary);
	border-radius: 4px;
	background-color: color-mix(in srgb, var(--csb-color-primary) 5%, #ffffff);
}

/* .csb-design-upload también lleva la clase "csb-lead-form" (mismo
   estilo de etiquetas/campos que el resto de formularios del sitio). Aquí
   solo lo que es propio de este formulario en concreto. */
.csb-design-upload-notice {
	margin: 0 0 1.2em;
	font-size: 0.9rem;
}

.csb-design-upload-hint {
	display: block;
	margin-top: 0.4em;
	font-size: 0.8rem;
	font-weight: 400;
	opacity: 0.7;
}

/* --- "Diseña aquí": abre el editor (assets/js/personalizacion-form.js) --- */
.csb-editor-lanzador {
	display: flex;
	flex-direction: column;
	gap: 0.6em;
}

.csb-editor-vacio {
	display: grid;
	grid-template-columns: auto 1fr;
	align-items: center;
	gap: 0.9em 1em;
	padding: 1.1em 1.2em;
	border: 1px solid color-mix(in srgb, var(--csb-color-primary) 35%, transparent);
	border-radius: 10px;
	background-color: #ffffff;
}

.csb-editor-vacio[hidden],
.csb-editor-resumen[hidden] {
	display: none;
}

.csb-editor-vacio-icono {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 3em;
	height: 3em;
	border-radius: 50%;
	background-color: color-mix(in srgb, var(--csb-color-primary) 12%, #ffffff);
	color: var(--csb-color-primary);
}

.csb-editor-vacio-icono svg {
	width: 1.6em;
	height: 1.6em;
}

.csb-editor-vacio-texto {
	display: flex;
	flex-direction: column;
	gap: 0.2em;
	font-size: 0.85rem;
	font-weight: 400;
	line-height: 1.4;
}

.csb-editor-vacio-texto strong {
	font-size: 1rem;
	font-weight: 600;
}

/* El botón ocupa la fila de abajo entera: es lo que hay que pulsar. */
.csb-editor-vacio .csb-editor-boton {
	grid-column: 1 / -1;
	width: 100%;
}

/* Storefront pone fondo gris, relleno y negrita a todos los botones:
   aquí se fija todo lo que importa. */
.csb-lead-form .csb-editor-boton {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 46px;
	margin: 0;
	padding: 0.7em 1.4em;
	border: 1.5px solid var(--csb-color-primary);
	border-radius: 999px;
	background-color: var(--csb-color-primary);
	box-shadow: none;
	color: #ffffff;
	font-family: var(--csb-font-body);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.2;
	text-shadow: none;
	cursor: pointer;
	transition: background-color 0.15s, border-color 0.15s, color 0.15s;
}

.csb-lead-form .csb-editor-boton:hover,
.csb-lead-form .csb-editor-boton:focus-visible {
	border-color: color-mix(in srgb, var(--csb-color-primary) 80%, #000000);
	background-color: color-mix(in srgb, var(--csb-color-primary) 80%, #000000);
	color: #ffffff;
}

.csb-lead-form .csb-editor-boton--secundario {
	border-color: rgba(0, 0, 0, 0.2);
	background-color: #ffffff;
	color: var(--csb-color-text);
}

.csb-lead-form .csb-editor-boton--secundario:hover,
.csb-lead-form .csb-editor-boton--secundario:focus-visible {
	border-color: #b23b3b;
	background-color: rgba(178, 59, 59, 0.06);
	color: #b23b3b;
}

.csb-lead-form .csb-editor-boton--secundario.is-confirmando {
	border-color: #b23b3b;
	background-color: #b23b3b;
	color: #ffffff;
}

/* --- Resumen del diseño al volver del editor --- */
.csb-editor-resumen {
	display: flex;
	flex-direction: column;
	gap: 0.8em;
	padding: 1em;
	border: 1px solid rgba(0, 0, 0, 0.1);
	border-radius: 10px;
	background-color: #ffffff;
}

.csb-editor-resumen-previas {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
	gap: 0.8em;
}

.csb-editor-resumen-previas figure {
	display: flex;
	flex-direction: column;
	gap: 0.3em;
	margin: 0;
}

.csb-editor-resumen-previas img {
	display: block;
	width: 100%;
	max-width: 100%;
	height: auto;
	border-radius: 8px;
	background-color: #f5f3ee;
}

.csb-editor-resumen-previas figcaption {
	font-size: 0.75rem;
	text-align: center;
	opacity: 0.7;
}

.csb-editor-resumen-lista {
	margin: 0;
	padding-left: 1.1em;
	font-size: 0.85rem;
	font-weight: 400;
	overflow-wrap: anywhere;
}

.csb-editor-resumen-acciones {
	display: flex;
	flex-wrap: wrap;
	gap: 0.6em;
}

.csb-editor-resumen-acciones .csb-editor-boton {
	flex: 1 1 auto;
}

/* --- El editor a pantalla completa (por encima de todo: cabecera,
   barra de admin, botón de WhatsApp, modal de presupuesto) --- */
.csb-editor-capa {
	position: fixed;
	inset: 0;
	z-index: 100002;
	display: flex;
	flex-direction: column;
	padding-top: env(safe-area-inset-top, 0px);
	background-color: #ECE9E1;
}

.csb-editor-capa[hidden] {
	display: none;
}

.csb-editor-contenedor {
	flex: 1;
	min-height: 0;
}

.csb-editor-capa .csb-ed {
	min-height: 0;
}

html.csb-editor-abierto,
html.csb-editor-abierto body {
	overflow: hidden;
}

/* ---------------------------------------------------------------------
   Franja superior de aviso (inc/topbar.php)
--------------------------------------------------------------------- */
.csb-topbar {
	background-color: var(--csb-color-text);
}

.csb-topbar-inner {
	max-width: 1200px;
	margin: 0 auto;
	padding: 0.5em 1.5em;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1em;
	font-size: 0.8rem;
	color: #ffffff;
}

.csb-topbar-inner--center {
	justify-content: center;
}

.csb-topbar-item {
	display: flex;
	align-items: center;
	gap: 0.6em;
}

.csb-topbar-contact a {
	color: #ffffff;
	display: inline-flex;
	align-items: center;
	gap: 0.3em;
}

.csb-topbar-contact .csb-icon {
	width: 14px;
	height: 14px;
}

.csb-topbar-sep {
	opacity: 0.5;
	margin: 0 0.3em;
}

/* La 2ª copia del mensaje (inc/topbar.php la repite para que la
   marquesina de móvil pueda hacer bucle sin salto) solo tiene sentido
   ahí: en escritorio se queda oculta para no duplicar el texto visible.
   Va dentro de "min-width: 768px" a propósito: sin media query, esta
   regla (misma especificidad y más abajo en el archivo) ganaba también
   en móvil al "display: block" de la media query de móvil, la pista se
   quedaba con una sola copia y la marquesina saltaba al principio a
   mitad de vuelta. */
@media screen and (min-width: 768px) {
	.csb-topbar-marquee-content--copia {
		display: none;
	}
}

/* ---------------------------------------------------------------------
   Página de inicio (template-inicio-csb.php)
--------------------------------------------------------------------- */
/*
 * OJO: antes esta regla era ".csb-home .csb-container" (solo dentro de
 * las plantillas de página). El footer y la franja de confianza se
 * pintan fuera de ".csb-home" (van enganchados al hook de pie de página
 * de Storefront), así que nunca recibían este margen: en escritorio no
 * se notaba (otras reglas disimulaban el hueco que faltaba), pero en
 * móvil el texto quedaba pegado al borde. ".csb-container" es un
 * contenedor de uso general, no solo de la portada.
 */
.csb-container {
	max-width: 1200px;
	margin: 0 auto;
	padding: 0 1.5em;
}

.csb-section {
	padding: 4em 0;
}

/* Técnica para que una sección ocupe todo el ancho de la ventana aunque
   esté dentro de un contenedor más estrecho (el de Storefront). */
/*
 * OJO: "margin-left:-50vw" (la técnica de toda la vida) deja un hueco a la
 * derecha en Windows/Chrome porque 100vw SÍ cuenta el ancho de la barra de
 * scroll, pero el % del margen del contenedor real NO la cuenta: al
 * mezclar vw con %, la cuenta no sale exacta. "transform: translateX()"
 * se calcula sobre el ancho del PROPIO elemento (100vw, sin mezclar con
 * ningún %), así que no tiene ese desajuste.
 */
.csb-section--bleed {
	width: 100vw;
	margin-left: 50%;
	transform: translateX(-50%);
}

.csb-section-title {
	font-family: var(--csb-font-body);
	text-transform: uppercase;
	letter-spacing: 0.05em;
	text-align: center;
	margin-bottom: 1.5em;
}

/* Subtítulo debajo del título de sección (ej. "Nuestras técnicas"): si
   hay subtítulo, el título necesita menos margen debajo y el subtítulo
   se lleva el espacio hasta el contenido de la sección. */
.csb-section-title:has(+ .csb-section-subtitle) {
	margin-bottom: 0.5em;
}

.csb-section-subtitle {
	max-width: 40em;
	margin: 0 auto 2.5em;
	text-align: center;
	opacity: 0.75;
}

.csb-icon {
	width: 32px;
	height: 32px;
	color: var(--csb-color-primary);
}

/* Botones propios de la portada (mismas reglas de color que .button, pero
   con variante "outline" que .button no tiene). */
.csb-btn {
	display: inline-block;
	padding: 0.85em 1.8em;
	border-radius: 2px;
	font-family: var(--csb-font-body);
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 0.85rem;
	text-decoration: none;
	border: 2px solid transparent;
	/* Para que también se vea bien en <button> (formularios, modal), no
	   solo en <a>: quitamos los estilos que ponen los navegadores. */
	cursor: pointer;
	line-height: normal;
}

.csb-btn--primary {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

.csb-btn--primary:hover {
	background-color: color-mix(in srgb, var(--csb-color-primary) 85%, black);
	border-color: color-mix(in srgb, var(--csb-color-primary) 85%, black);
	color: #ffffff;
}

.csb-btn--outline {
	background-color: transparent;
	border-color: currentColor;
	color: inherit;
}

.csb-btn--outline:hover {
	background-color: rgba(255, 255, 255, 0.1);
}

.csb-btn--small {
	padding: 0.55em 1.2em;
	font-size: 0.75rem;
}

.csb-link-arrow {
	color: var(--csb-color-primary);
	font-weight: 600;
	text-decoration: none;
}

/* --- Hero --- */
/* Storefront pone "padding-top: 4.235801032em" por defecto en #main,
   pensado para separar el contenido normal de la cabecera. En la
   portada el hero va pegado a la cabecera a propósito (fondo negro a
   sangre completa, .csb-section--bleed), así que ese padding solo deja
   un hueco vacío de color crema antes de que empiece el negro.
   Se anula en TODA la cadena de contenedores hasta el hero (no solo
   .site-main): en móvil seguía colándose un hueco fino, señal de que
   algún otro elemento de por medio (WooCommerce/Storefront) también
   aporta algo de espacio -más fácil anularlo en todos que perseguir
   cuál exactamente es-. */
/* OJO - bug encontrado y corregido: ".csb-home" es la clase de
   "#primary", y "#content"/".col-full"/el div ".woocommerce" vacío son
   ANTECESORES de "#primary", no descendientes suyos -así que
   ".csb-home #content" nunca podía coincidir con nada, esa parte del
   arreglo llevaba sin hacer nada desde el principio-. Para esos hay que
   engancharse a la clase de plantilla del <body> (igual que en
   ".site-header" más abajo); ".site-main" y ".csb-hero" sí están
   realmente dentro de "#primary.csb-home", esos dos están bien. */
body.page-template-template-inicio-csb-php #content,
body.page-template-template-inicio-csb-php #content > .col-full,
body.page-template-template-inicio-csb-php #primary,
body.page-template-template-inicio-csb-php .woocommerce:empty {
	margin-top: 0 !important;
	padding-top: 0 !important;
}

/* El div ".woocommerce" que WooCommerce imprime aquí siempre sale
   vacío en esta plantilla (los avisos/notices, si los hay, van en otro
   sitio) - se quita directamente del todo, para dejar de depender de
   que no tenga padding/margin por defecto. */
body.page-template-template-inicio-csb-php .woocommerce:empty {
	display: none !important;
}

.csb-home .site-main {
	margin-top: 0 !important;
	padding-top: 0 !important;
}

.csb-home .csb-hero {
	margin-top: 0 !important;
}

/* LA causa real de la franja blanca (las anulaciones de arriba estaban
   bien pero no bastaban): Storefront pone
   ".site-header{margin-bottom:4.235901032em}" (~68px) SIEMPRE, salvo
   cuando la página usa su PROPIA plantilla "template-homepage.php" (ahí
   sí lo pone a 0). Nuestra portada usa una plantilla distinta
   ("template-inicio-csb.php"), así que esa excepción nunca se aplicaba
   y ese margen se quedaba puesto pasara lo que pasara con .site-main.
   ".site-header" es HERMANO de "#primary" (no está dentro), así que
   ".csb-home .site-header" no serviría -no hay relación de
   descendiente-; hace falta engancharse a la clase de plantilla que
   WordPress pone en el <body>. */
body.page-template-template-inicio-csb-php .site-header {
	margin-bottom: 0 !important;
}

/* La otra mitad del mismo hueco (ver comentario en ".site-header" más
   arriba): Storefront también pone "padding-top: 4.235901032em" (~68px)
   en ".site-main" en todas las páginas. Se anula ya a 0 en la portada
   (".csb-home .site-main", más arriba); aquí se ajusta el resto de
   páginas a un aire mucho más contenido, para que el breadcrumb/banner
   quede pegado a la cabecera en vez de dejar una franja en blanco
   desaprovechada. */
.site-main {
	padding-top: 1em;
}

/* ---------------------------------------------------------------------
   Miga de pan (Inicio > Tienda > ... / Inicio > Personalizado > ...,
   ver inc/breadcrumb.php e inc/personalizado-catalogo.php). Storefront
   trae bastante aire de serie (padding ~1.4em, margin-bottom ~3.7em en
   escritorio): se ajusta a algo mucho más contenido, a juego con el
   resto de espaciados compactos de esta cabecera (ver ".site-header" y
   ".site-main" arriba). Sin "@media": una regla sola para todos los
   anchos, para no depender de en qué breakpoint caiga cada override de
   Storefront. */
.storefront-breadcrumb {
	padding: 0.5em 0;
	margin: 0 0 0.8em;
}

/* Escalón actual (el último, ver woocommerce/global/breadcrumb.php de
   este tema): texto plano de serie, sin ningún elemento propio que
   seleccionar -por eso la plantilla se sobrescribió, solo para meterlo
   en este <span>-. Un poco más oscuro y con más peso que los enlaces de
   los escalones anteriores, para distinguir "dónde estoy" de "por dónde
   puedo volver". */
.woocommerce-breadcrumb__current {
	color: var(--csb-color-text);
	font-weight: 700;
}

.woocommerce-breadcrumb a {
	color: var(--csb-color-text);
	opacity: 0.7;
}

.woocommerce-breadcrumb a:hover {
	opacity: 1;
	color: var(--csb-color-primary);
}

.csb-hero {
	background-color: var(--csb-color-text);
	color: #ffffff;
	/* Más bajo (".csb-section" trae 4em arriba y abajo de serie, pensado
	   para secciones normales; en el hero, con foto al lado, se queda
	   demasiado alto). */
	padding-top: 2.5em;
	padding-bottom: 2.5em;
}

.csb-hero-inner {
	display: grid;
	grid-template-columns: 1.1fr 0.9fr;
	align-items: center;
	gap: 3em;
}

/* Hero sin imagen (Contacto): una sola columna, no la mitad vacía. */
.csb-hero--simple .csb-hero-inner {
	grid-template-columns: 1fr;
	max-width: 700px;
}

.csb-contact-details {
	list-style: none;
	margin: 1.5em 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.6em;
}

.csb-contact-details li {
	display: flex;
	align-items: center;
	gap: 0.6em;
}

.csb-contact-details a {
	color: #ffffff;
}

.csb-contact-details .csb-icon {
	width: 18px;
	height: 18px;
}

/* ---------------------------------------------------------------------
   Menú "Llamar / WhatsApp" del teléfono (ver inc/contact-popover.php).
   Se usa en 2 sitios con fondos oscuros distintos (barra negra, hero de
   Contacto): el botón no fija color propio a propósito, así hereda el
   blanco que ya pone cada contenedor (".csb-topbar-inner"/".csb-hero").
--------------------------------------------------------------------- */
.csb-contact-popover-wrap {
	position: relative;
	display: inline-flex;
}

/* Sin tamaño propio para el icono del botón a propósito: en la barra
   negra ya lo fija ".csb-topbar-contact .csb-icon" (14px, a juego con el
   resto de la franja) y en la página de Contacto ".csb-contact-details
   .csb-icon" (18px, a juego con el icono del email de al lado) -fijar
   aquí un tamaño propio pisaría a uno de los dos según cuál cargue
   después en el archivo, sin avisar-. */
.csb-contact-popover-toggle {
	display: inline-flex;
	align-items: center;
	gap: 0.3em;
	background: none;
	border: none;
	padding: 0;
	margin: 0;
	font: inherit;
	color: inherit;
	cursor: pointer;
}

/* El desplegable en sí SIEMPRE con texto oscuro sobre fondo blanco -no
   hereda el blanco de arriba-, para que se lea bien pase lo que pase con
   el fondo del sitio donde se abra.
   OJO - bug real encontrado: cuando este menú se abre dentro de la barra
   negra, sus 2 enlaces ("Llamar"/"WhatsApp") son descendientes de
   ".csb-topbar-contact", que ya tenía una regla genérica de antes
   (".csb-topbar-contact a { color: #fff; ... }", pensada para el
   teléfono/email de toda la vida). Esa regla es MÁS específica que
   ".csb-contact-popover-option" a solas (clase+etiqueta gana a una sola
   clase), así que ganaba ella: el texto salía en blanco sobre el fondo
   blanco del desplegable -invisible, aunque el menú sí se abría-. Por
   eso aquí abajo el selector va con el padre delante
   (".csb-contact-popover .csb-contact-popover-option"), para tener más
   especificidad que esa regla vieja y no depender del orden en el
   archivo. */
.csb-contact-popover[hidden] {
	display: none;
}

.csb-contact-popover {
	position: absolute;
	top: 100%;
	right: 0;
	margin-top: 0.6em;
	background-color: #ffffff;
	border-radius: 10px;
	box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18);
	padding: 0.4em;
	display: flex;
	flex-direction: column;
	gap: 0.2em;
	width: max-content;
	max-width: min(280px, calc(100vw - 2em));
	z-index: 999;
}

/* Cuando el botón está más hacia la izquierda de la pantalla (página de
   Contacto): el desplegable cuelga hacia la DERECHA en vez de hacia la
   izquierda -con "right: 0" (por defecto, pensado para un botón pegado
   al borde derecho como el de la barra negra) se salía por el borde
   izquierdo de la pantalla en móvil, que es justo lo que se veía
   cortado-. */
.csb-contact-popover--izquierda {
	right: auto;
	left: 0;
}

.csb-contact-popover .csb-contact-popover-option {
	display: flex;
	align-items: center;
	gap: 0.6em;
	padding: 0.65em 0.9em;
	border-radius: 6px;
	color: var(--csb-color-text);
	text-decoration: none;
	font-size: 0.9rem;
	line-height: 1.2;
	white-space: nowrap;
}

.csb-contact-popover .csb-contact-popover-option:hover,
.csb-contact-popover .csb-contact-popover-option:focus-visible {
	background-color: var(--csb-color-background);
}

.csb-contact-popover-option .csb-icon {
	width: 20px;
	height: 20px;
	flex: 0 0 auto;
}

/* Verde oficial de WhatsApp -a propósito fuera del sistema de variables
   de marca: es un color de identidad de un tercero, no de este sitio-. */
.csb-contact-popover-option--whatsapp .csb-icon {
	color: #25d366;
}

/* ---------------------------------------------------------------------
   Botón flotante de WhatsApp (ver inc/whatsapp-float.php), en todas las
   páginas. "z-index: 99999" a propósito un punto por debajo del modal de
   presupuesto (".csb-modal", 100000): si el modal está abierto, debe
   taparlo él a este botón, no al revés.
--------------------------------------------------------------------- */
.csb-whatsapp-float {
	position: fixed;
	bottom: 20px;
	right: 20px;
	width: 56px;
	height: 56px;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: #25d366;
	border-radius: 50%;
	box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
	z-index: 99999;
	transition: transform 0.15s ease;
}

.csb-whatsapp-float:hover,
.csb-whatsapp-float:focus-visible {
	transform: scale(1.08);
}

.csb-whatsapp-float .csb-icon {
	width: 32px;
	height: 32px;
	color: #ffffff;
}

/* Un poco más pequeño en móvil, para que no tape tanto contenido en
   pantallas estrechas. */
@media screen and (max-width: 767px) {
	.csb-whatsapp-float {
		width: 50px;
		height: 50px;
		bottom: 16px;
		right: 16px;
	}

	.csb-whatsapp-float .csb-icon {
		width: 28px;
		height: 28px;
	}
}

.csb-hero-text h1 {
	color: #ffffff;
	font-size: clamp(1.8rem, 3.5vw, 2.6rem);
	line-height: 1.15;
	margin-bottom: 0.6em;
}

.csb-hero-lead {
	opacity: 0.85;
	margin-bottom: 1.5em;
	max-width: 42em;
}

.csb-hero-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 1em;
}


.csb-hero-actions .csb-btn--outline {
	border-color: #ffffff;
	color: #ffffff;
}

.csb-hero-media {
	background-color: var(--csb-color-background);
	border-radius: 8px;
	overflow: hidden;
	line-height: 0;
}

.csb-hero-media img {
	width: 100%;
	height: auto;
	display: block;
}

/* ---------------------------------------------------------------------
   Página Empresas (template-empresas-csb.php)
--------------------------------------------------------------------- */
/* Collage de 3 fotos en el hero (en vez de una sola imagen): la primera
   más grande arriba, las otras dos en fila debajo -mismo contenedor
   ".csb-hero-media" de siempre, solo cambia cómo se reparten las fotos
   dentro-. */
.csb-hero-media--collage {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 0.5em;
	background-color: transparent;
}

.csb-hero-media--collage img {
	height: 100%;
	object-fit: cover;
	border-radius: 8px;
}

.csb-hero-media--collage img:first-child {
	grid-column: 1 / -1;
	aspect-ratio: 16 / 9;
}

.csb-hero-media--collage img:not(:first-child) {
	aspect-ratio: 4 / 3;
}

/* Mismo motivo que ".csb-techniques": ".csb-section" trae 4em arriba y
   abajo de serie y aquí se quedaba un hueco en blanco muy grande antes
   del título "Ejemplos de trabajos" y después de la tira de fotos.
   Sin media query: mismo valor en PC y en móvil. */
.csb-mockups {
	padding-top: 1.8em;
	padding-bottom: 1.8em;
}

/* --- Ejemplos de trabajos (tira de fotos con scroll horizontal) --- */
.csb-mockup-scroll {
	display: flex;
	gap: 1em;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	padding-bottom: 0.5em; /* Aire antes de la barra de scroll. */
	-webkit-overflow-scrolling: touch;
}

.csb-mockup-scroll img {
	flex: 0 0 auto;
	scroll-snap-align: start;
	width: 320px;
	height: 220px;
	object-fit: cover;
	border-radius: 6px;
	display: block;
}

@media (max-width: 600px) {
	.csb-mockup-scroll img {
		width: 240px;
		height: 165px;
	}
}

/* ---------------------------------------------------------------------
   Página "Nuestros diseños" (template-disenos-csb.php)
--------------------------------------------------------------------- */
/* Mismo motivo que ".csb-mockups"/".csb-techniques": recorta el 4em de
   serie de ".csb-section", que aquí -sin nada más arriba, justo debajo
   de la cabecera- se veía como un hueco enorme antes del título. */
.csb-designs {
	padding-top: 2em;
	padding-bottom: 3em;
}

.csb-designs-grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 1.5em 1.2em;
	margin-top: 2em;
}

/* La tarjeta entera es el enlace (a Personalizar): sin subrayado ni color
   de "visitado" propios de <a>, que no pegan con el resto de tarjetas de
   la página (técnicas, productos...). */
.csb-design-card {
	display: block;
	color: inherit;
	text-decoration: none;
	background-color: #ffffff;
	border: 1px solid rgba(0, 0, 0, 0.08);
	border-radius: 8px;
	overflow: hidden;
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.csb-design-card:hover {
	transform: translateY(-3px);
	box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
}

.csb-design-image {
	display: block;
	aspect-ratio: 1 / 1;
	background-color: var(--csb-color-background);
}

.csb-design-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.csb-design-name {
	display: block;
	padding: 0.9em 1em;
	font-weight: 600;
	text-align: center;
}

.csb-designs-cta {
	text-align: center;
	margin-top: 2.5em;
}

@media (max-width: 782px) {
	.csb-designs-grid {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* --- Características --- */
.csb-features-grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 2em;
	text-align: center;
}

.csb-feature h3 {
	margin: 0.6em 0 0.3em;
	font-size: 1rem;
}

.csb-feature p {
	font-size: 0.9rem;
	opacity: 0.8;
	margin: 0;
}

/* Menos alto (".csb-section" trae 4em arriba y abajo de serie, pensado
   para secciones normales; aquí, con el título+subtítulo ya dando aire
   propio arriba y las tarjetas terminando en un botón, se quedaba un
   hueco en blanco muy grande antes del título y después de las
   tarjetas). Sin media query: mismo valor en PC y en móvil. */
.csb-techniques {
	padding-top: 1.8em;
	padding-bottom: 1.8em;
}

/* --- Técnicas ---
   Refactor: las dos tarjetas (DTG/DTF) pesan igual -misma insignia,
   mismo borde, mismo tamaño-, cada una en una sola columna (imagen,
   texto, lista "Ideal para", botón, y los pasos técnicos plegados al
   final en un <details> nativo).
   "align-items: flex-start" (no "stretch"): con "stretch", el grid
   igualaba la altura de las dos tarjetas a la de la más alta, y como
   cada tarjeta es un flex-column con ".csb-technique-body" creciendo
   para ocupar el hueco, al abrir el <details> de una tarjeta (que la
   hace más alta) la OTRA se estiraba igual y le quedaba un bloque en
   blanco enorme al final. Con "flex-start" cada tarjeta mide justo lo
   que necesita su propio contenido, así que abrir una no afecta a la
   otra. */
.csb-techniques-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 2em;
	align-items: flex-start;
}

.csb-technique-card {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: 2em;
	background-color: #ffffff;
	border: 1px solid rgba(0, 0, 0, 0.08);
	border-radius: 6px;
}

/* Alinear los botones CTA a la misma altura en escritorio, SIN volver
   a usar "align-items: stretch" en el grid (eso fue lo que causaba el
   hueco en blanco al abrir un acordeón, ver comentario en
   .csb-techniques-grid). En vez de que una tarjeta "estire" a la otra,
   cada una tiene su propio "min-height" independiente -con los textos
   ya equilibrados en volumen, coincide con lo que ambas necesitan de
   forma natural-, y dentro, el botón se empuja al final con
   "margin-top: auto". Si se abre un acordeón, esa tarjeta crece por
   encima del mínimo sin arrastrar a la otra. Solo en escritorio: en
   móvil las tarjetas van apiladas, una debajo de otra, así que ahí no
   hace falta igualar nada. */
@media (min-width: 769px) {
	/* ".csb-technique-body" ya tiene "flex-grow: 1" (ver su regla más
	   abajo): con la tarjeta en "min-height", eso basta para que ocupe
	   el hueco sobrante bajo la imagen -"height: 100%" aquí sería un
	   error (competiría con la imagen/insignia por el mismo espacio en
	   vez de repartirlo, y podría desbordar la tarjeta-. */
	.csb-technique-cta {
		margin-top: auto;
	}
}

/* Misma altura fija para las dos infografías: quedan a nivel entre sí.
   object-fit:cover porque las fotos ya vienen recortadas a un ratio
   pensado para esto (a diferencia de "contain", no deja franjas). */
.csb-technique-infographic {
	display: block;
	width: 100%;
	height: 300px;
	object-fit: cover;
	border-radius: 6px;
	margin-bottom: 1.2em;
}

.csb-technique-body {
	display: flex;
	flex-direction: column;
	/* Que el botón "Ver camisetas" quede a la misma altura en las dos
	   tarjetas aunque una tenga algo más de texto que la otra. */
	flex-grow: 1;
}

/* Insignia y, a su derecha, el icono de la técnica (gota DTG, capas DTF). */
.csb-technique-cabecera {
	display: flex;
	align-items: center;
	gap: 0.6em;
	margin: 0 0 0.8em;
}

.csb-technique-cabecera .csb-icon {
	width: 28px;
	height: 28px;
	flex-shrink: 0;
}

.csb-technique-card h3 {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.5em;
	margin: 0 0 0.5em;
}

.csb-technique-subtitle {
	font-family: var(--csb-font-body);
	font-style: italic;
	font-weight: 400;
	font-size: 0.9rem;
	opacity: 0.7;
}

/* Insignia: misma para las dos tarjetas -antes solo DTG la llevaba de
   verdad y DTF tenía un espaciador invisible, dando sensación de que
   DTF era la opción "secundaria"-. "min-height" fija (equivalente a 2
   líneas) para que, si un texto ocupa 1 línea y el otro 2 ("Nuestra
   técnica principal" es más largo que "Máxima versatilidad"), la
   imagen de debajo siga empezando a la misma altura en las dos
   tarjetas -si no, la insignia más corta dejaba la imagen "flotando"
   más arriba que la otra-. */
.csb-technique-badge {
	display: inline-flex;
	align-items: center;
	align-self: flex-start;
	min-height: 2.3em;
	box-sizing: border-box;
	margin: 0;
	padding: 0.3em 0.7em;
	background-color: var(--csb-color-primary);
	color: #ffffff;
	font-size: 0.7rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	line-height: 1.3;
	border-radius: 2px;
}

/* --- Frase corta bajo el título: qué aporta cada técnica --- */
.csb-technique-resumen {
	margin: 0 0 1.2em;
	font-size: 0.95rem;
	line-height: 1.55;
}

/* Botón "Ver camisetas DTG/DTF": con las dos tarjetas ya equilibradas
   en volumen de texto (misma nota integrada en la descripción, mismo
   número de líneas en "Ideal para"), el botón cae solo a la misma
   altura en las dos tarjetas sin necesitar trucos de "empujar abajo"
   -que además ya no funcionarían bien sin el "stretch" del grid-. */
.csb-technique-cta {
	align-self: flex-start;
	margin-top: 0.5em;
	margin-bottom: 2em;
}

.csb-technique-cta:focus-visible {
	outline: 2px solid var(--csb-color-primary);
	outline-offset: 2px;
}

/* --- Acordeón "Ver el proceso técnico" (HTML nativo <details>) --- */
.csb-technique-accordion {
	border-top: 1px solid rgba(0, 0, 0, 0.08);
	padding-top: 1.2em;
}

.csb-technique-accordion summary {
	display: flex;
	align-items: center;
	gap: 0.5em;
	cursor: pointer;
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--csb-color-text);
	list-style: none;
}

/* Quita el triángulo de "abrir/cerrar" por defecto del navegador -se
   sustituye por el icono de flecha, que sí controlamos y podemos
   animar-. */
.csb-technique-accordion summary::-webkit-details-marker {
	display: none;
}

.csb-technique-accordion summary:focus-visible {
	outline: 2px solid var(--csb-color-primary);
	outline-offset: 2px;
}

.csb-technique-accordion summary .csb-icon {
	width: 16px;
	height: 16px;
	transition: transform 0.2s;
}

.csb-technique-accordion[open] summary .csb-icon {
	transform: rotate(180deg);
}

.csb-technique-detail-list {
	list-style: none;
	margin: 1.2em 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 1em;
}

.csb-technique-detail-list li {
	display: flex;
	align-items: flex-start;
	gap: 0.7em;
}

.csb-technique-detail-list .csb-icon {
	width: 24px;
	height: 24px;
	flex-shrink: 0;
	margin-top: 0.1em;
	opacity: 0.7;
}

.csb-technique-detail-list h4 {
	margin: 0 0 0.2em;
	font-size: 0.9rem;
}

.csb-technique-detail-list p {
	margin: 0;
	font-size: 0.82rem;
	opacity: 0.75;
	line-height: 1.4;
}

/* --- Productos --- */
.csb-products-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: 2em;
}

.csb-product-card {
	text-align: center;
}

.csb-product-image {
	display: block;
	margin-bottom: 0.8em;
	background-color: #ffffff;
	border-radius: 6px;
	overflow: hidden;
}

.csb-product-image img {
	width: 100%;
	height: auto;
	display: block;
}

.csb-product-card h3 {
	font-size: 1rem;
	margin: 0 0 0.3em;
}

.csb-product-card h3 a {
	color: var(--csb-color-text);
}

.csb-product-price {
	color: var(--csb-color-primary);
	font-weight: 600;
	margin-bottom: 0.8em;
}

.csb-products-empty {
	text-align: center;
	opacity: 0.7;
}

/* Empresas > "Encuentra la prenda adecuada para tu equipo": en escritorio
   son siempre 4 columnas fijas en una sola hilera (son exactamente 4
   categorías, a propósito, no una parrilla que crece). En móvil/tablet se
   convierte en un carrusel de scroll horizontal con "snap" -mejor que
   apilarlas en vertical, porque son pocas tarjetas y así se hojean rápido
   con el dedo-, con la barra de scroll oculta mientras el touch/arrastre
   sigue funcionando con normalidad. */
.csb-products-grid--empresas {
	grid-template-columns: repeat(4, 1fr);
}

@media (max-width: 991px) {
	.csb-products-grid--empresas {
		display: flex;
		grid-template-columns: none;
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		gap: 1.2em;
		padding-bottom: 0.3em;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none; /* Firefox */
	}

	.csb-products-grid--empresas::-webkit-scrollbar {
		display: none; /* Chrome/Safari/Edge */
	}

	.csb-products-grid--empresas .csb-product-card {
		flex: 0 0 70%;
		max-width: 240px;
		scroll-snap-align: center;
	}
}

@media (max-width: 480px) {
	.csb-products-grid--empresas .csb-product-card {
		flex-basis: 78%;
	}
}

/* En Empresas, ".csb-product-card" es directamente el enlace (toda la
   tarjeta lleva a la categoría), en vez del "div" con un enlace suelto
   dentro del "h3" que usaba el diseño original de este bloque -sin
   tocar esa forma antigua, por si algún día se usa así en otro sitio-. */
a.csb-product-card {
	display: block;
	color: inherit;
	text-decoration: none;
}

a.csb-product-card h3 {
	color: var(--csb-color-text);
}

/* Franja de confianza bajo el botón del CTA final (Empresas): mismo
   icono de check que ".csb-checklist", en fila horizontal centrada en
   vez de columna -aquí no acompaña a un texto largo al lado, es un
   cierre de página-. */
.csb-cta-trust {
	list-style: none;
	margin: 1.5em 0 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 0.5em 1.5em;
	font-size: 0.9rem;
	opacity: 0.85;
}

.csb-cta-trust li {
	display: flex;
	align-items: center;
	gap: 0.4em;
}

.csb-cta-trust .csb-icon {
	width: 16px;
	height: 16px;
	color: var(--csb-color-primary);
	flex-shrink: 0;
}

/* --- Ofertas por lotes (template-inicio-csb.php, cifras de inc/lotes.php).
   Ocupa el sitio del antiguo "¿Cómo funciona?". Tres tarjetas cuyo
   montón de camisetas crece de lote en lote (1, 2 y 4 filas de 5) y,
   alineadas por abajo, forman una escalera. El descuento también crece
   de tamaño. El hueco de arriba se recorta como hacía la sección
   anterior: ya suma el padding inferior de ".csb-mockups". --- */
.csb-lotes {
	padding-top: 1.8em;
}

.csb-lotes-simbolos {
	position: absolute;
	width: 0;
	height: 0;
	overflow: hidden;
}

.csb-lotes-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 1.5em;
	align-items: end;
	max-width: 1000px;
	margin: 0 auto;
}

.csb-lote {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.5em;
	padding: 1.8em 1.4em 1.5em;
	background-color: #ffffff;
	border: 1px solid rgba(0, 0, 0, 0.08);
	border-radius: 8px;
	text-align: center;
}

.csb-lote--mejor {
	border: 2px solid var(--csb-verde-texto);
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}

.csb-lote-cinta {
	position: absolute;
	top: -0.9em;
	left: 50%;
	transform: translateX(-50%);
	padding: 0.3em 0.9em;
	border-radius: 999px;
	background-color: var(--csb-verde-texto);
	color: #ffffff;
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	white-space: nowrap;
}

.csb-lote-ilustracion {
	display: block;
	width: 100%;
	max-width: 220px;
	height: auto;
	margin-bottom: 0.6em;
}

.csb-lote-descuento {
	display: inline-block;
	padding: 0.3em 0.55em;
	border-radius: 6px;
	background-color: var(--csb-verde-texto);
	color: #ffffff;
	font-weight: 700;
	font-size: 1.3rem;
	line-height: 1;
}

.csb-lote:nth-child(2) .csb-lote-descuento {
	font-size: 1.6rem;
}

.csb-lote:nth-child(3) .csb-lote-descuento {
	font-size: 1.9rem;
}

.csb-lote h3 {
	margin: 0.3em 0 0;
	font-size: 1.15rem;
}

.csb-lote-precio {
	margin: 0;
	font-size: 0.95rem;
}

.csb-lote-precio strong {
	font-size: 1.4rem;
}

.csb-lote-antes {
	margin-left: 0.3em;
	color: #666666;
}

.csb-lote-ahorro {
	margin: 0;
	color: var(--csb-verde-texto);
	font-size: 0.9rem;
	font-weight: 600;
}

.csb-lotes-letra {
	max-width: 46em;
	margin: 2em auto 0;
	color: #555555;
	font-size: 0.8rem;
	text-align: center;
}

.csb-lotes-accion {
	margin-top: 1.5em;
	text-align: center;
}

/* Móvil: una tarjeta debajo de otra, de menos a más. */
@media (max-width: 782px) {
	.csb-lotes-grid {
		grid-template-columns: 1fr;
		gap: 2em;
		max-width: 420px;
	}
}

/* --- CTA --- */
.csb-cta {
	background-color: var(--csb-color-primary);
	color: #ffffff;
	text-align: center;
}

.csb-cta-inner h2 {
	color: #ffffff;
	margin-bottom: 0.4em;
}

.csb-cta-inner p {
	opacity: 0.9;
	margin-bottom: 1.3em;
}

.csb-cta .csb-btn--primary {
	background-color: #ffffff;
	border-color: #ffffff;
	color: var(--csb-color-primary);
}

/* Variante oscura (como la franja CTA de la referencia): mismo bloque,
   fondo negro en vez de verde. El botón se pinta del verde de marca en
   vez de blanco, para que siga destacando sobre el negro. */
.csb-cta--dark {
	background-color: var(--csb-color-text);
}

.csb-cta--dark .csb-btn--primary {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

.csb-cta .csb-btn--primary:hover {
	background-color: var(--csb-color-background);
}

/* --- Franja de confianza ---
   Sin fondo propio a propósito: antes llevaba un gris sutil
   (rgba(0,0,0,0.03)) que, entre el contenido de encima y el pie de
   página blanco de debajo, se veía como una franja/ruptura de color
   horizontal. Transparente dejar pasar el crema de fondo del body
   (var(--csb-color-background)), así el bloque de confianza flota
   directamente sobre ese mismo color, sin corte visual. */
.csb-trustbar {
	padding: 2.5em 0;
	background-color: transparent;
}

.csb-trustbar-grid {
	display: grid;
	/* auto-fit en vez de un repeat(4) fijo: si algún día no hay teléfono
	   configurado (el 4º item desaparece), los 3 restantes se reparten
	   bien igualmente, sin dejar un hueco vacío. */
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: 1.5em;
}

.csb-trust-item {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.7em;
	font-size: 0.9rem;
	font-weight: 600;
	color: var(--csb-color-text);
	text-decoration: none;
}

.csb-trust-item span {
	display: flex;
	flex-direction: column;
	line-height: 1.3;
}

.csb-trust-item strong {
	font-weight: 400;
	font-size: 0.8rem;
	opacity: 0.7;
}

.csb-trust-item--whatsapp .csb-icon {
	color: #25d366;
}

.csb-trust-item--whatsapp:hover {
	color: #25d366;
}

.csb-trust-item .csb-icon {
	width: 24px;
	height: 24px;
}

/* --- Responsive --- */
@media (max-width: 782px) {
	/* Botones del hero: en fila (flex-wrap) el texto largo de
	   "Personalizar mi camiseta" podía dejar al segundo botón sin sitio
	   y recortado. Apilados a ancho completo, además de arreglarlo, dan
	   una zona de toque más cómoda para el pulgar. */
	.csb-hero-actions {
		flex-direction: column;
		align-items: stretch;
		gap: 12px;
	}

	.csb-hero-actions .csb-btn {
		text-align: center;
	}

	/* Título del hero: un poco más pequeño en pantallas muy estrechas
	   (el "clamp()" de base ya escala, pero su suelo -1.8rem- se queda
	   algo grande en los móviles más pequeños). */
	.csb-hero-text h1 {
		font-size: 1.6rem;
	}

	.csb-hero-inner {
		grid-template-columns: 1fr;
	}

	.csb-features-grid,
	.csb-trustbar-grid {
		grid-template-columns: 1fr 1fr;
	}

	/* DTF/DTG: con poco ancho, las dos tarjetas se apilan (una columna). */
	.csb-techniques-grid {
		grid-template-columns: 1fr;
	}
}

@media (max-width: 480px) {
	.csb-features-grid,
	.csb-trustbar-grid {
		grid-template-columns: 1fr;
	}
}

/* ---------------------------------------------------------------------
   Formularios de leads (modal de presupuesto, Contacto, newsletter)
--------------------------------------------------------------------- */
/* Campo trampa antispam (csb_lead_campo_trampa(), inc/leads.php): fuera de
   la pantalla, no oculto con display:none (algunos robots lo detectan). */
.csb-trampa {
	position: absolute !important;
	left: -10000px;
	top: auto;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.csb-lead-form {
	display: flex;
	flex-direction: column;
	gap: 1em;
	max-width: 480px;
}

.csb-lead-form label {
	display: flex;
	flex-direction: column;
	gap: 0.4em;
	font-weight: 600;
	font-size: 0.9rem;
}

/* El texto de la etiqueta y su "*" van juntos, en una sola línea, encima
   del campo (antes "Nombre" y "*" quedaban en líneas distintas porque el
   label entero era flex en columna y los trataba como bloques separados). */
.csb-label-text {
	display: inline-flex;
	gap: 0.3em;
}

.csb-lead-form input,
.csb-lead-form textarea {
	font-family: var(--csb-font-body);
	font-size: 1rem;
	padding: 0.7em 0.9em;
	border: 1px solid rgba(0, 0, 0, 0.2);
	border-radius: 4px;
	font-weight: 400;
}

.csb-required {
	color: #b23b3b;
}

.csb-lead-form-message {
	margin: 0;
	font-size: 0.9rem;
	min-height: 1.2em;
}

.csb-lead-form-message--ok {
	color: var(--csb-color-primary);
	font-weight: 600;
}

.csb-lead-form-message--error {
	color: #b23b3b;
	font-weight: 600;
}

.csb-contact-form-narrow {
	max-width: 480px;
}

/* --- Newsletter (pie de página): input + botón en una fila --- */
.csb-newsletter-row {
	display: flex;
	gap: 0.5em;
}

.csb-newsletter-row input {
	flex: 1 1 auto;
	min-width: 0;
}

/* ---------------------------------------------------------------------
   Modal de "Solicitar presupuesto" (inc/budget-modal.php)
--------------------------------------------------------------------- */
.csb-modal[hidden] {
	display: none;
}

.csb-modal {
	position: fixed;
	inset: 0;
	z-index: 100000;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 1.5em;
}

body.csb-modal-open {
	overflow: hidden;
}

.csb-modal-overlay {
	position: absolute;
	inset: 0;
	background-color: rgba(0, 0, 0, 0.6);
}

.csb-modal-box {
	position: relative;
	background-color: var(--csb-color-background);
	border-radius: 6px;
	padding: 2.2em;
	max-width: 480px;
	width: 100%;
	max-height: 90vh;
	overflow-y: auto;
}

.csb-modal-box h2 {
	margin-top: 0;
}

.csb-modal-close {
	position: absolute;
	top: 0.8em;
	right: 0.8em;
	width: 32px;
	height: 32px;
	border: none;
	background: none;
	font-size: 1.5rem;
	line-height: 1;
	cursor: pointer;
	color: var(--csb-color-text);
}

/* ---------------------------------------------------------------------
   Pie de página (inc/site-footer.php) — sale en TODAS las páginas
--------------------------------------------------------------------- */
.csb-site-footer {
	background-color: #ffffff;
	color: var(--csb-color-text);
	border-top: 1px solid rgba(0, 0, 0, 0.08);
	padding: 3.5em 0 2.5em;
}

.csb-site-footer-grid {
	display: grid;
	grid-template-columns: 1.3fr 1fr 1fr 1.2fr;
	gap: 2.5em;
	/* Con solo 4 columnas y poco texto, estirarlas a los 1200px del
	   contenedor se ve muy suelto. Las agrupamos más al centro, en vez
	   de que cada columna se pegue a los bordes. */
	max-width: 900px;
	margin: 0 auto;
}

.csb-footer-logo {
	max-width: 160px;
	height: auto;
	margin-bottom: 0.8em;
}

.csb-footer-brand-name {
	display: block;
	color: var(--csb-color-text);
	font-size: 1.2rem;
	margin-bottom: 0.8em;
}

.csb-footer-brand p {
	font-size: 0.9rem;
	margin: 0 0 1em;
}

.csb-footer-social {
	display: flex;
	gap: 1em;
}

.csb-footer-social a {
	color: var(--csb-color-text);
}

.csb-footer-social .csb-icon {
	width: 20px;
	height: 20px;
}

.csb-footer-col h3 {
	color: var(--csb-color-text);
	font-size: 0.85rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	margin: 0 0 1em;
}

.csb-footer-col ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.6em;
}

.csb-footer-col a {
	color: var(--csb-color-text);
	opacity: 0.75;
	font-size: 0.9rem;
}

.csb-footer-col a:hover {
	opacity: 1;
}

.csb-footer-newsletter p {
	font-size: 0.9rem;
	margin: 0 0 1em;
}

.csb-footer-newsletter .csb-lead-form-message {
	color: var(--csb-color-text);
}

.csb-footer-newsletter .csb-lead-form-message--ok {
	color: var(--csb-color-primary);
}

/* Enlaces legales (Aviso Legal, Privacidad, Cookies, Condiciones de
   Venta): fila pequeña bajo la cuadrícula principal, igual de discreta
   que la línea de copyright que va justo debajo. */
.csb-footer-legal {
	list-style: none;
	margin: 2em auto 0;
	padding: 1.2em 0 0;
	max-width: 900px;
	border-top: 1px solid rgba(0, 0, 0, 0.08);
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 0.4em;
}

.csb-footer-legal li {
	display: flex;
	align-items: center;
	gap: 0.4em;
}

.csb-footer-legal a {
	color: var(--csb-color-text);
	opacity: 0.6;
	font-size: 0.8rem;
}

.csb-footer-legal a:hover {
	opacity: 1;
}

.csb-footer-legal-sep {
	opacity: 0.4;
	font-size: 0.8rem;
}

/* La línea de copyright de Storefront (storefront_credit), a juego con
   este pie de página blanco. */
.site-footer .site-info {
	background-color: #ffffff;
	color: var(--csb-color-text);
	opacity: 0.6;
	border-top: 1px solid rgba(0, 0, 0, 0.08);
	text-align: center;
	padding: 1.2em 0;
	font-size: 0.8rem;
}

.site-footer .site-info a {
	color: var(--csb-color-text);
}

@media (max-width: 782px) {
	.csb-site-footer-grid {
		grid-template-columns: 1fr 1fr;
	}
}

@media (max-width: 480px) {
	.csb-site-footer-grid {
		grid-template-columns: 1fr;
	}
}

/* --- Información adicional: lista de características --- */
.csb-caracteristicas-lista {
	margin: 0 0 1.5em;
	padding-left: 1.2em;
}

.csb-caracteristicas-lista li {
	margin-bottom: 0.3em;
}

/* El campo de color (justo debajo) NO va pegado a la tabla de Técnica/
   Talla: en medio, WooCommerce mete ".single_variation_wrap" (el hueco
   reservado para el precio/disponibilidad de la variación elegida, vacío
   hasta que se completa la selección), que trae su propio margen de
   serie aunque esté vacío. Se anula aquí -es donde de verdad vivía buena
   parte del hueco grande antes de "Color de la camiseta", no en el
   margen de la propia tabla ni en el de ".csb-color-field"-. */
.summary .single_variation_wrap,
.summary .woocommerce-variation {
	margin: 0;
}

.summary table.variations {
	margin-bottom: 0;
}

/* --- Color de la camiseta personalizada (cuadraditos de color, sin
   nombre visible debajo -el nombre se queda de tooltip/aria-label- para
   que quepan los 38 en poco espacio) --- */
.csb-color-field {
	margin: 0.2em 0;
}

.csb-color-options {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em;
	margin-top: 0.6em;
}

.csb-color-swatch {
	display: block;
	cursor: pointer;
}

.csb-color-swatch input[type="radio"] {
	position: absolute;
	opacity: 0;
	width: 1px;
	height: 1px;
}

.csb-color-swatch-box {
	display: block;
	width: 1.6em;
	height: 1.6em;
	border-radius: 4px;
	border: 1.5px solid rgba(0, 0, 0, 0.2);
	box-shadow: inset 0 0 0 2px #ffffff;
}

.csb-color-swatch input:checked + .csb-color-swatch-box {
	border-color: var(--csb-color-primary);
	box-shadow: 0 0 0 2px var(--csb-color-primary), inset 0 0 0 2px #ffffff;
}

.csb-color-swatch input:focus-visible + .csb-color-swatch-box {
	outline: 2px solid var(--csb-color-primary);
	outline-offset: 2px;
}

/* --- Talla en pastillas (ver assets/js/talla-pills.js): sustituye
   visualmente al <select id="pa_talla"> nativo de WooCommerce, que se
   queda en la página oculto pero funcionando (es lo que WooCommerce lee
   para calcular la variación, el precio, etc.). --- */
.csb-select-oculto {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	overflow: hidden;
	pointer-events: none;
}

.csb-variation-pills {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5em;
	margin-top: 0.3em;
}

/* Técnica en Personalizado (csb_render_tecnica_personalizado(), en
   inc/design-upload.php): en vez de fila, apiladas una debajo de otra con
   su explicación al lado -para que quepa "DTG - Impresión tinta directa en
   tejido" sin que la pastilla se estire ni el texto se corte-. En la
   Tienda no hay técnica (la prenda se vende lisa). */
.csb-variation-pills--vertical {
	flex-direction: column;
	align-items: flex-start;
	flex-wrap: nowrap;
	gap: 0.6em;
}

.csb-variation-pill-fila {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.8em;
}

.csb-variation-pill-descripcion {
	font-size: 0.95rem;
	color: #000;
}

/* Técnica en Personalizado: radio oculto + pastilla (misma pinta que las
   de Talla, que son <button>). */
.csb-tecnica-opcion {
	position: relative;
	cursor: pointer;
}

/* Mismo grosor de letra que las pastillas de Talla (que son <button>). */
.csb-tecnica-opcion .csb-variation-pill {
	font-weight: 600;
}

.csb-tecnica-opcion input[type="radio"] {
	position: absolute;
	top: 50%;
	left: 1em;
	width: 1px;
	height: 1px;
	opacity: 0;
}

.csb-tecnica-opcion input:checked + .csb-variation-pill {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

.csb-tecnica-opcion input:focus-visible + .csb-variation-pill {
	outline: 2px solid var(--csb-color-primary);
	outline-offset: 2px;
}

/* "IVA incluido" (csb_sufijo_precio(), inc/tienda-catalogo.php):
   en su propia línea, pequeño, debajo del precio. */
.price .woocommerce-price-suffix {
	display: block;
	margin-top: 2px;
	font-size: 0.72em;
	font-weight: 400;
	opacity: 0.75;
}

/* "Desde" delante del precio en Personalizado (la personalización va aparte). */
.csb-precio-desde {
	font-size: 0.8em;
	font-weight: 400;
}

/*
 * Enlace "Clear"/"Borrar" que WooCommerce imprime debajo de los
 * desplegables de variación (por ejemplo, debajo de Talla) para
 * deseleccionar la opción elegida. No hace falta con las pastillas
 * (ver variation-pills.js), así que se oculta en todas las prendas.
 */
a.reset_variations {
	display: none !important;
}

/*
 * Es un <button> real (a diferencia de las otras pastillas, que son
 * <span> junto a un input oculto): el tema pone estilos propios de hover
 * para botones (fondo oscuro + texto blanco) que no queremos aquí, así
 * que se fija el color en todos los estados salvo "seleccionada".
 */
.csb-variation-pill,
.csb-variation-pill:hover,
.csb-variation-pill:focus {
	padding: 0.5em 1em;
	border: 1.5px solid rgba(0, 0, 0, 0.25);
	border-radius: 999px;
	background: #ffffff;
	color: var(--csb-color-text);
	font-size: 0.85rem;
	font-family: inherit;
	cursor: pointer;
	transition: background-color 0.15s, border-color 0.15s, color 0.15s;
}

.csb-variation-pill:hover {
	border-color: var(--csb-color-primary);
}

.csb-variation-pill--selected,
.csb-variation-pill--selected:hover,
.csb-variation-pill--selected:focus {
	background-color: var(--csb-color-primary);
	border-color: var(--csb-color-primary);
	color: #ffffff;
}

.csb-variation-pill:disabled {
	opacity: 0.35;
	cursor: not-allowed;
	border-style: dashed;
}

/* --- Galería por color (ver inc/color-gallery.php): miniaturas + foto
   grande en fila, y debajo la descripción. Sustituye a la galería normal
   de WooCommerce solo en productos con fotos de color. --- */
.csb-color-gallery {
	display: flex;
	flex-direction: column;
	margin-bottom: 2em;
	/* Ancho lo pone Storefront vía la clase "woocommerce-product-gallery"
	   (columna ~40%, para dejar sitio al resumen a la derecha); aquí solo
	   nos aseguramos de no desbordar esa columna. */
	max-width: 100%;
}

.csb-color-gallery-row {
	display: flex;
	gap: 0.6em;
}

.csb-color-gallery-thumbs {
	display: flex;
	flex-direction: column;
	gap: 0.5em;
	flex-shrink: 0;
}

.csb-color-gallery-thumb {
	width: 3.2em;
	height: 3.2em;
	padding: 0;
	border: 1.5px solid rgba(0, 0, 0, 0.15);
	border-radius: 6px;
	background: #ffffff;
	cursor: pointer;
	overflow: hidden;
}

.csb-color-gallery-thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* La foto de "Lateral" (costado) suele estar encuadrada más de cerca
   que las de delante/detrás -al recortarla igual ("cover", que rellena
   el cuadrado recortando lo que sobra) quedaba demasiado pegada a la
   tela y no se distinguía que era una vista de costado-. Con "contain"
   se ve la prenda entera, sin recortar, aunque quede algo de margen en
   los lados. Solo afecta a esta miniatura -las de delante/detrás, que sí
   se ven bien con "cover", no cambian-. */
.csb-color-gallery-thumb[data-vista="side"] img {
	object-fit: contain;
}

.csb-color-gallery-thumb--activa {
	border-color: var(--csb-color-primary);
	box-shadow: 0 0 0 1px var(--csb-color-primary);
}

/*
 * Las 3 fotos (delante/detrás/lateral) NO tienen las mismas proporciones
 * -la de lateral es mucho más estrecha y alta, es una camiseta de
 * perfil-, así que la foto grande usa un recuadro de tamaño FIJO
 * (aspect-ratio) igual para las tres, con "object-fit: contain" para
 * que cada una se vea completa y del mismo tamaño de recuadro, en vez
 * de estirarse para rellenar el ancho (que es lo que hacía que la foto
 * de lateral saliera gigantesca).
 */
.csb-color-gallery-main {
	position: relative;
	flex: 1;
	aspect-ratio: 8 / 9;
	border: 1px solid rgba(0, 0, 0, 0.08);
	border-radius: 6px;
	overflow: hidden;
	/* Blanco puro, no gris (#f7f7f7 de antes): los mockups son fotos de
	   producto sobre fondo blanco real, y con "object-fit: contain" la
	   franja de relleno arriba/abajo (cuando la foto no llena el recuadro
	   fijo) se notaba como una banda gris pegada al blanco de la propia
	   foto. Blanco puro hace esa franja invisible. */
	background: #ffffff;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: zoom-in;
}

.csb-color-gallery-main img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	display: block;
	cursor: zoom-in;
}

/* Descripción (+ características) debajo de la foto, dentro de la misma
   columna de la galería (ver inc/color-gallery.php). */
.csb-color-gallery-descripcion {
	width: 100%;
	margin-top: 1em;
	font-size: 0.9rem;
	line-height: 1.5;
}

/* Tabla de medidas (opcional, ver csb_get_tabla_medidas() en
   inc/color-gallery.php): mismo sitio y aire que la descripción, justo
   debajo de ella en escritorio. La tabla en sí (el <table> que entra
   como HTML libre desde el admin) usa estilos mínimos aquí para que se
   lea bien sin tener que maquetarla a mano cada vez. */
.csb-color-gallery-tabla-medidas {
	width: 100%;
	margin-top: 1.5em;
	font-size: 0.9rem;
	line-height: 1.5;
}

.csb-color-gallery-tabla-medidas table {
	width: 100%;
	border-collapse: collapse;
	margin-top: 0.6em;
}

.csb-color-gallery-tabla-medidas th,
.csb-color-gallery-tabla-medidas td {
	padding: 0.5em 0.7em;
	border: 1px solid rgba(0, 0, 0, 0.12);
	text-align: center;
}

.csb-color-gallery-tabla-medidas th {
	background-color: color-mix(in srgb, var(--csb-color-primary) 10%, white);
	font-weight: 700;
}

/* Dibujo de la prenda con las flechas "A"/"B" (protocolo para todas las
   tablas de medidas de aquí en adelante: mismo dibujo genérico + leyenda,
   delante de la tabla en sí -ver inc/color-gallery.php-). El SVG se
   escribe a mano en el campo "Tabla de medidas (HTML)" del producto junto
   con la tabla, no hay lógica PHP que lo genere: así cada producto puede
   tener su propia tabla sin tocar código. */
.csb-tabla-medidas-diagrama {
	display: flex;
	align-items: center;
	gap: 1.2em;
	margin-top: 0.6em;
}

.csb-tabla-medidas-diagrama svg,
.csb-tabla-medidas-diagrama img {
	flex-shrink: 0;
}

.csb-tabla-medidas-leyenda {
	margin: 0;
	font-size: 0.85rem;
	line-height: 1.6;
}

/* Lupa al pasar el ratón: se activa por JS (mousemove calcula la
   posición) añadiendo esta clase; en móvil, sin "hover", nunca se
   activa, pero el clic (lightbox, más abajo) sigue funcionando igual. */
.csb-color-gallery-zoom-lens {
	position: absolute;
	inset: 0;
	background-repeat: no-repeat;
	background-size: 200% auto;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.1s;
}

.csb-color-gallery-main--zoom .csb-color-gallery-zoom-lens {
	opacity: 1;
}

/*
 * Más ancho para la galería de esta ficha en concreto (columna ~46% en
 * vez del ~40% de una galería normal de WooCommerce), reduciendo el
 * resumen justo lo mismo para que no se bajen de línea. El selector
 * ~ solo afecta al resumen que va DETRÁS de nuestra galería (esta
 * ficha), no al de otros productos.
 */
@media (min-width: 768px) {
	.woocommerce-product-gallery.csb-color-gallery {
		width: 46%;
		margin-right: 4%;
	}

	.woocommerce-product-gallery.csb-color-gallery ~ .summary.entry-summary {
		width: 50%;
	}
}

@media (max-width: 600px) {
	.csb-color-gallery-row {
		flex-direction: column-reverse;
	}

	.csb-color-gallery-thumbs {
		flex-direction: row;
	}
}

/* --- Lightbox (foto en grande al hacer clic) --- */
/* Sin esta regla, el "hidden" del HTML no servía de nada: el
   "display: flex" de abajo (regla de autor) le gana en prioridad al
   "display: none" que pone el navegador por defecto para [hidden] (que
   es solo la hoja de estilos POR DEFECTO del navegador, con menos
   prioridad que cualquier regla nuestra) - por eso el lightbox se veía
   siempre encima de todo, aunque nadie hubiera hecho clic en ninguna
   miniatura, y "cerrarlo" (que solo vuelve a poner "hidden") no hacía
   nada visualmente. Mismo patrón que ya se usa en ".csb-modal[hidden]"
   más arriba, para el modal de presupuesto. */
.csb-color-gallery-lightbox[hidden] {
	display: none;
}

.csb-color-gallery-lightbox {
	position: fixed;
	inset: 0;
	z-index: 10000;
	background: rgba(0, 0, 0, 0.85);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 2em;
}

.csb-color-gallery-lightbox img {
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
	cursor: default;
}

.csb-color-gallery-lightbox-close {
	position: absolute;
	top: 1em;
	right: 1.2em;
	background: none;
	border: none;
	color: #ffffff;
	font-size: 2.2rem;
	line-height: 1;
	cursor: pointer;
	padding: 0.2em 0.4em;
}

/* Evita que la página se desplace por detrás mientras el lightbox está abierto. */
body.csb-color-gallery-lightbox-abierto {
	overflow: hidden;
}

/* --- Botón "Escribir una reseña" (ver inc/reviews-toggle.php) --- */
.csb-review-toggle-boton {
	margin-top: 1em;
}

/* ---------------------------------------------------------------------
   Aviso de cookies (inc/cookies.php + assets/js/cookies.js). Ventana en
   el centro que bloquea la web hasta elegir; en las páginas legales, abajo
   y sin bloquear. "Aceptar" y "Rechazar" con el MISMO aspecto (AEPD).
--------------------------------------------------------------------- */
.csb-cookies {
	position: fixed;
	inset: 0;
	z-index: 100010;
	display: none;
	align-items: center;
	justify-content: center;
	padding: 16px;
	background-color: rgba(20, 22, 18, 0.62);
}

html.csb-cookies-pendiente .csb-cookies,
html.csb-cookies-abierto .csb-cookies {
	display: flex;
}

/* Mientras bloquea, la página de detrás no se mueve. */
html.csb-cookies-pendiente:not(.csb-cookies-sin-bloqueo),
html.csb-cookies-pendiente:not(.csb-cookies-sin-bloqueo) body,
html.csb-cookies-abierto,
html.csb-cookies-abierto body {
	overflow: hidden;
}

/* Páginas legales: abajo, sin oscurecer ni bloquear (hay que poder leerlas). */
html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies {
	inset: auto 0 0 0;
	padding: 12px;
	background: none;
	pointer-events: none;
}

html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies-caja {
	box-shadow: 0 -4px 30px rgba(0, 0, 0, 0.18);
	pointer-events: auto;
}

.csb-cookies-caja {
	width: min(520px, 100%);
	max-height: calc(100vh - 32px);
	overflow-y: auto;
	padding: 26px 26px 20px;
	border-radius: 14px;
	background-color: #ffffff;
	box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);
	color: var(--csb-color-text);
	font-family: var(--csb-font-body);
	outline: none;
}

.csb-cookies h2 {
	margin: 0 0 0.6em;
	font-size: 1.35rem;
	line-height: 1.25;
}

.csb-cookies p {
	margin: 0 0 1.3em;
	font-size: 0.95rem;
	line-height: 1.55;
}

.csb-cookies p a {
	color: var(--csb-color-text);
	text-decoration: underline;
}

.csb-cookies-botones {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 10px;
}

/* Los dos botones principales, idénticos (ni "Aceptar" más llamativo ni
   "Rechazar" escondido). Con .csb-cookies delante para ganar a Storefront. */
.csb-cookies .csb-cookies-btn {
	min-height: 50px;
	margin: 0;
	padding: 0.7em 1em;
	border: 0;
	border-radius: 999px;
	background-color: var(--csb-color-primary);
	box-shadow: none;
	color: #ffffff;
	font-family: var(--csb-font-body);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.2;
	text-shadow: none;
	cursor: pointer;
}

/* Oscurecer al pasar el ratón solo con ratón: en el móvil el "hover" se
   queda pegado al botón que cae bajo el dedo y ya no se verían iguales. */
@media (hover: hover) {
	.csb-cookies .csb-cookies-btn:hover {
		background-color: color-mix(in srgb, var(--csb-color-primary) 82%, #000000);
		color: #ffffff;
	}
}

.csb-cookies .csb-cookies-btn:focus-visible {
	background-color: color-mix(in srgb, var(--csb-color-primary) 82%, #000000);
	color: #ffffff;
}

.csb-cookies .csb-cookies-btn:focus-visible,
.csb-cookies .csb-cookies-enlace:focus-visible {
	outline: 3px solid color-mix(in srgb, var(--csb-color-primary) 45%, #ffffff);
	outline-offset: 2px;
}

.csb-cookies .csb-cookies-enlace {
	display: block;
	margin: 12px auto 0;
	padding: 6px 10px;
	border: 0;
	background: none;
	box-shadow: none;
	color: var(--csb-color-text);
	font-family: var(--csb-font-body);
	font-size: 0.9rem;
	font-weight: 500;
	text-decoration: underline;
	cursor: pointer;
}

.csb-cookies-tipos {
	display: flex;
	flex-direction: column;
	gap: 10px;
	margin: 0 0 1.3em;
	padding: 0;
	list-style: none;
}

.csb-cookies-tipo {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 14px;
	padding: 12px 14px;
	border: 1px solid rgba(0, 0, 0, 0.12);
	border-radius: 10px;
	cursor: pointer;
}

.csb-cookies-tipo-texto {
	display: flex;
	flex-direction: column;
	gap: 3px;
	font-size: 0.85rem;
	line-height: 1.45;
}

.csb-cookies-tipo-texto strong {
	font-size: 0.95rem;
}

.csb-cookies-tipo-texto small {
	margin-left: 0.4em;
	font-weight: 500;
	opacity: 0.65;
}

/* Interruptor en vez de casilla. */
.csb-cookies-tipo input {
	position: relative;
	flex: none;
	width: 44px;
	height: 26px;
	margin: 2px 0 0;
	border-radius: 999px;
	background-color: #cbc7bc;
	appearance: none;
	cursor: pointer;
	transition: background-color 0.15s;
}

.csb-cookies-tipo input::after {
	content: '';
	position: absolute;
	top: 3px;
	left: 3px;
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background-color: #ffffff;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
	transition: transform 0.15s;
}

.csb-cookies-tipo input:checked {
	background-color: var(--csb-color-primary);
}

.csb-cookies-tipo input:checked::after {
	transform: translateX(18px);
}

.csb-cookies-tipo input:disabled {
	opacity: 0.6;
	cursor: default;
}

@media (max-width: 480px) {
	.csb-cookies-caja {
		padding: 22px 18px 16px;
	}

	.csb-cookies-botones {
		grid-template-columns: 1fr;
	}

	/* Páginas legales: versión compacta, para que se pueda leer la página. */
	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies-caja {
		padding: 14px 16px 8px;
	}

	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies h2 {
		margin-bottom: 0.3em;
		font-size: 1.05rem;
	}

	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies p {
		margin-bottom: 0.8em;
		font-size: 0.8rem;
		line-height: 1.45;
	}

	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies-botones {
		grid-template-columns: 1fr 1fr;
	}

	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies .csb-cookies-btn {
		min-height: 42px;
	}

	html.csb-cookies-sin-bloqueo:not(.csb-cookies-abierto) .csb-cookies .csb-cookies-enlace {
		margin-top: 4px;
	}
}

/* "Configurar cookies" en la fila legal del pie: como los enlaces de al lado. */
.csb-footer-legal .csb-footer-cookies {
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	box-shadow: none;
	color: var(--csb-color-text);
	font-family: var(--csb-font-body);
	font-size: 0.8rem;
	font-weight: 400;
	text-decoration: underline;
	opacity: 0.6;
	cursor: pointer;
}

.csb-footer-legal .csb-footer-cookies:hover {
	opacity: 1;
}

/* ---------------------------------------------------------------------
   Consentimiento en los formularios (inc/legal.php): casilla + resumen
   legal. La casilla va en fila, no en columna como el resto de campos.
--------------------------------------------------------------------- */
.csb-lead-form label.csb-consentimiento {
	flex-direction: row;
	align-items: flex-start;
	gap: 0.6em;
	font-weight: 400;
	font-size: 0.85rem;
	line-height: 1.45;
	cursor: pointer;
}

.csb-lead-form .csb-consentimiento input {
	flex: none;
	width: 18px;
	height: 18px;
	margin: 0.1em 0 0;
	padding: 0;
	accent-color: var(--csb-color-primary);
	cursor: pointer;
}

.csb-consentimiento a {
	color: inherit;
	text-decoration: underline;
}

.csb-footer-newsletter .csb-lead-form label.csb-consentimiento {
	margin-top: 0.8em;
	font-size: 0.78rem;
}

/* ---------------------------------------------------------------------
   Páginas legales ([csb_legal pagina="..."], inc/legal.php)
--------------------------------------------------------------------- */
.csb-legal {
	max-width: 760px;
	line-height: 1.65;
}

.csb-legal h2 {
	margin: 1.8em 0 0.5em;
	font-size: 1.25rem;
}

.csb-legal h3 {
	margin: 1.4em 0 0.4em;
	font-size: 1.05rem;
}

.csb-legal ul,
.csb-legal ol {
	margin: 0 0 1.2em 1.3em;
}

.csb-legal li {
	margin-bottom: 0.4em;
}

.csb-legal-tabla {
	overflow-x: auto;
	margin: 0 0 1.4em;
}

.csb-legal-tabla table {
	min-width: 520px;
	margin: 0;
	font-size: 0.88rem;
}

.csb-legal-tabla th,
.csb-legal-tabla td {
	padding: 0.6em 0.8em;
	vertical-align: top;
}

.csb-legal-formulario {
	margin: 0 0 1.4em;
	padding: 1em 1.2em;
	border: 1px dashed rgba(0, 0, 0, 0.25);
	border-radius: 8px;
	font-size: 0.9rem;
}

.csb-legal-formulario p:last-child {
	margin-bottom: 0;
}

.csb-legal-fecha {
	margin-top: 2.5em;
	font-size: 0.85rem;
	opacity: 0.65;
}

/* Dato del negocio sin rellenar en Personalizar > Datos legales. */
.csb-legal-pendiente {
	padding: 0 0.3em;
	background-color: #ffe27a;
	color: #5a4300;
}

/* "Configurar cookies" dentro de la política de cookies: como un enlace. */
.csb-legal .csb-legal-cookies-boton {
	display: inline;
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	box-shadow: none;
	color: inherit;
	font: inherit;
	font-weight: 600;
	text-decoration: underline;
	cursor: pointer;
}

/* ---------------------------------------------------------------------
   Accesibilidad: contraste (auditoría 29/09/2026). El verde de marca con
   texto blanco encima (y el texto verde sobre blanco) se queda en 3,87:1 y
   el mínimo para texto normal es 4,5:1. Donde hay TEXTO sobre el verde, o
   texto verde, se usa el mismo verde un poco más oscuro (5,4:1); el verde
   de marca sigue igual en el resto (iconos, bordes, detalles).
--------------------------------------------------------------------- */
:root {
	--csb-verde-texto: color-mix(in srgb, var(--csb-color-primary) 80%, #000000);
	--csb-verde-texto-hover: color-mix(in srgb, var(--csb-color-primary) 66%, #000000);
}

a,
.site-header-cart .cart-contents,
.csb-cta .csb-btn--primary {
	color: var(--csb-verde-texto);
}

.button,
button.button.alt,
.button.alt,
.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.csb-btn--primary,
.csb-cta--dark .csb-btn--primary,
.csb-lead-form .csb-editor-boton,
.csb-technique-badge,
.csb-variation-pill--selected,
.csb-variation-pill--selected:hover,
.csb-variation-pill--selected:focus,
.csb-tecnica-opcion input:checked + .csb-variation-pill,
.csb-cookies .csb-cookies-btn {
	background-color: var(--csb-verde-texto);
	border-color: var(--csb-verde-texto);
}

.button:hover,
button.button.alt:hover,
.button.alt:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.csb-btn--primary:hover,
.csb-cta--dark .csb-btn--primary:hover {
	background-color: var(--csb-verde-texto-hover);
	border-color: var(--csb-verde-texto-hover);
}

@media (hover: hover) {
	.csb-cookies .csb-cookies-btn:hover {
		background-color: var(--csb-verde-texto-hover);
	}
}

.csb-cookies .csb-cookies-btn:focus-visible {
	background-color: var(--csb-verde-texto-hover);
}

/* La franja verde de "¿Necesitas ropa personalizada…?" (texto claro encima). */
.csb-cta:not(.csb-cta--dark) {
	background-color: var(--csb-verde-texto);
}

/* Pie: enlaces legales y línea de copyright, antes al 60 % (3,7:1). */
.csb-footer-legal a,
.csb-footer-legal .csb-footer-cookies {
	opacity: 0.8;
}

.site-footer .site-info {
	opacity: 0.85;
}

/* "IVA incluido · X sin IVA": en gris oscuro, no en el verde claro del
   precio (2,49:1). */
.price .woocommerce-price-suffix,
.price .woocommerce-price-suffix .woocommerce-Price-amount {
	color: var(--csb-color-text);
}

/* Avisos azules de WooCommerce ("No hay valoraciones aún", cupón...): el
   azul de serie con texto blanco se queda en 3,05:1. */
body .woocommerce-info,
body .woocommerce-noreviews,
body p.no-comments {
	background-color: #2a73a6; /* "body" delante: la hoja de WooCommerce de Storefront carga después. */
}

/* Foto de la portada: reserva su hueco (3:2) antes de cargar, para que el
   resto de la página no salte hacia abajo cuando aparece (CLS). */
.csb-hero-media:not(.csb-hero-media--collage) > img {
	aspect-ratio: auto 3 / 2;
}
