@charset "UTF-8";
/* ==========================================================================
   CriticaBits — página de entrada
   --------------------------------------------------------------------------
   Reconstrucción completa de la columna de lectura.

   El problema de partida: 900 px de ancho con interlineado 2 daba ~94
   caracteres por línea y 38 px entre renglones. A esa medida el ojo
   pierde el salto de línea. Y las figuras quedaban descentradas porque
   `.has-sidebar .alignfull` ponía `margin-left: auto` sin resetear el
   `width: 100vw` de la regla base ni devolver `margin-right`, así que
   el bloque se iba contra el borde derecho.

   La solución a ambas cosas es la misma: una rejilla de sangrado con
   columnas con nombre. El centrado lo da la columna, no un margen
   calculado, y los tres anchos —texto, ancho, a sangre— quedan
   definidos en un único sitio.

   Los selectores llevan `.cb-article` delante para pasar por delante
   del CSS del Personalizador, que se imprime después. Ver
   inc/criticabits/single.php.

   ÍNDICE
     1. Tokens
     2. Rejilla de sangrado
     3. Tipografía
     4. Ritmo vertical
     5. Medios
     6. Cabecera del artículo
     7. Componentes retro
     8. Pie del artículo
     9. Movimiento
   ========================================================================== */

/* ==========================================================================
   1. Tokens
   ========================================================================== */

.cb-article {
	/* --- Anchos ---------------------------------------------------------
	   La columna de texto se topa por dos vías: 60ch la ajusta al tamaño
	   real de la fuente (y sigue funcionando si el lector amplía el
	   tipo), y 680px impide que crezca sin límite.

	   El 100% descuenta los dos márgenes laterales. Sin ese descuento, en
	   una pantalla de 420 px la columna pedía los 420 completos, las
	   cunetas sumaban 34 más y la rejilla se iba 17 px por fuera: el
	   texto salía cortado por la derecha —a media palabra— en cada
	   párrafo del artículo. */
	--cb-edge: clamp(1rem, 4vw, 2.5rem);
	--cb-col: min(100% - var(--cb-edge) * 2, 60ch, 680px);
	--cb-wide: min(100% - var(--cb-edge) * 2, 880px);

	/* --- Espaciado ------------------------------------------------------
	   Escala subida un escalón respecto a la anterior: con el
	   interlineado a 1,9 los huecos de antes se quedaban cortos y los
	   bloques parecían pegados. */
	--cb-s2: .5rem;
	--cb-s3: .85rem;
	--cb-s4: 1.25rem;
	--cb-s5: 2rem;
	--cb-s6: 2.75rem;
	--cb-s7: 4rem;
	--cb-s8: 5.5rem;
	--cb-s9: 7rem;

	/* --- Tinta ---------------------------------------------------------- */
	--cb-ink: rgba(255, 255, 255, .90);
	--cb-ink-2: rgba(255, 255, 255, .72);
	--cb-ink-3: rgba(255, 255, 255, .62);
	--cb-ink-4: rgba(255, 255, 255, .46);
}

/* ==========================================================================
   2. Rejilla de sangrado
   ========================================================================== */

/*
 * Se desactivan las reglas de alineación del tema. No se borran de
 * style.css —es un tema de terceros— pero dejan de aplicarse dentro del
 * artículo, que es donde estorbaban.
 */
.cb-article .entry-content > .alignfull,
.cb-article .entry-content > .alignwide,
.cb-article .entry-content > .is-style-wide {
	width: auto;
	max-width: none;
	margin-left: 0;
	margin-right: 0;
}

.cb-article .entry-content {
	display: grid;
	grid-template-columns:
		[full-start] minmax(var(--cb-edge), 1fr)
		[wide-start] minmax(0, calc((var(--cb-wide) - var(--cb-col)) / 2))
		[text-start] var(--cb-col) [text-end]
		minmax(0, calc((var(--cb-wide) - var(--cb-col)) / 2)) [wide-end]
		minmax(var(--cb-edge), 1fr) [full-end];
	width: auto;
	max-width: none;
	margin-left: 0;
	margin-right: 0;
	padding-top: 0;
	color: var(--cb-ink);
}

/* Todo cae en la columna de texto salvo que pida otra cosa. */
.cb-article .entry-content > * {
	grid-column: text;
	min-width: 0;
	max-width: none;
	width: auto;
	margin-left: 0;
	margin-right: 0;
}

/*
 * style.css:3451 impone a los bloques sin alineación
 * `width: calc(100% - 60px)` con una especificidad de (0,8,1). Dentro
 * de la rejilla eso los encogía 60 px y, al quedarse pegados al borde
 * izquierdo de su columna, desplazaba todo el texto 30 px respecto al
 * centro real. Se replica la forma del selector con una clase más para
 * pasar por delante sin recurrir a !important.
 */
body:not(.home):not(.blog) .cb-article .entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) {
	width: auto;
	max-width: none;
}

.cb-article .entry-content > .alignwide,
.cb-article .entry-content > .is-style-wide {
	grid-column: wide;
}

.cb-article .entry-content > .alignfull {
	grid-column: full;
}

/*
 * En pantallas estrechas «a sangre» se consigue con margen negativo del
 * canalón, nunca con 100vw: 100vw incluye la barra de desplazamiento y
 * provoca scroll horizontal.
 */
@media (max-width: 1023px) {

	/* Con `.entry-content` repetida. Tal como estaba, cincuenta líneas más
	   abajo `.cb-article .entry-content .wp-block-image { margin-inline: 0 }`
	   —misma especificidad, (0,3,0), y por detrás en el archivo— borraba
	   justo el margen negativo de estas dos reglas y dejaba en pie el
	   ancho. Resultado medido: a 390 px una figura «a sangre» arrancaba
	   en x=16 y terminaba en 406, con `scrollWidth` 406 contra
	   `clientWidth` 390; a 768 px, de 44 a 785 contra 768. Es decir, un
	   canalón entero de desplazamiento horizontal en móvil y tableta, en
	   todas las entradas con foto. */
	.cb-article .entry-content.entry-content > .alignfull,
	.cb-article .entry-content.entry-content > .alignwide {
		grid-column: text;
		margin-inline: calc(var(--cb-edge) * -1);
		width: calc(100% + var(--cb-edge) * 2);
	}
}

/* ==========================================================================
   3. Tipografía
   ========================================================================== */

.cb-article .entry-content {
	font-size: clamp(1.0625rem, .98rem + .35vw, 1.1875rem);
	/* 1,65 × 1,15: interlineado más suelto a petición, para leer mejor. */
	line-height: 1.9;
}

/* Gana a `p { line-height: 2 }` del Personalizador, que a 94 caracteres
   por línea era la mitad del problema de legibilidad. */
.cb-article .entry-content p,
.cb-article .entry-content li {
	line-height: 1.9;
}

.cb-article .entry-content h2 {
	font-size: clamp(1.5rem, 1.15rem + 1.5vw, 2rem);
	line-height: 1.2;
	font-weight: 800;
	letter-spacing: -.015em;
	color: #fff;
	text-wrap: balance;
}

.cb-article .entry-content h3 {
	font-size: clamp(1.25rem, 1.05rem + .85vw, 1.5rem);
	line-height: 1.3;
	font-weight: 700;
	letter-spacing: 0;
	color: #fff;
	text-wrap: balance;
}

/* H4 comparte tamaño con el cuerpo, así que se distingue por forma. */
.cb-article .entry-content h4 {
	font-size: 1.0625rem;
	line-height: 1.4;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .06em;
	color: var(--cb-neon-cyan);
}

.cb-article .entry-content ul,
.cb-article .entry-content ol {
	padding-left: 1.35rem;
}

.cb-article .entry-content li + li {
	margin-top: var(--cb-s2);
}

/* Enlaces: un solo rosa, el de la paleta. El #df7580 del Personalizador
   era un quinto tono que no está en el sistema. */
.cb-article .entry-content a:not(.wp-block-button__link):not(.cb-nav__link) {
	color: var(--cb-neon-rose);
	text-decoration: none;
}

.cb-article .entry-content p a::after,
.cb-article .entry-content li a::after {
	background: currentColor;
}

/* Capitular: tres líneas de alto, blanca y alineada con el texto. */
.cb-article .entry-content p.has-drop-cap::first-letter {
	float: left;
	font-size: 3.2em;
	line-height: .82;
	font-weight: 800;
	color: #fff;
	margin: 0;
	padding: .05em .12em 0 0;
}

/* ==========================================================================
   4. Ritmo vertical
   --------------------------------------------------------------------------
   Sólo margen superior. En una rejilla los márgenes no colapsan, y con
   un único sentido el ritmo se puede auditar leyendo esta tabla.

   La proporción 4:1 en los encabezados (64 px arriba, 16 abajo) es
   deliberada: el título pertenece a lo que viene debajo. Antes era casi
   1:1 y por eso los encabezados parecían flotar sueltos.
   ========================================================================== */

/* Defecto medido: esta tabla estaba muerta. gutenberg.css lleva
   `.entry-content > [class*="wp-block"] + [class*="wp-block"]`, que con
   dos selectores de atributo pesa (0,3,0) y gana a los (0,2,1) de aquí
   abajo. Resultado real en la RTX 5070: 41 px entre TODOS los bloques
   —el mismo hueco antes de un h2 que entre dos párrafos— más los
   25,65 px de `margin-bottom` que enhance.css pone a los párrafos, que
   en una rejilla no colapsan. O sea: párrafo→párrafo 67 px y
   lista→h2 41 px, la jerarquía justo del revés. Repitiendo la clase
   `.entry-content` estas reglas pasan a (0,3,1) y vuelven a mandar. */

.cb-article .entry-content.entry-content > * { margin-block: 0; }

/* 1. Base: el hueco de lectura entre dos bloques cualesquiera. */
.cb-article .entry-content.entry-content > * + * { margin-block-start: var(--cb-s5); }

/* 2. Medios y citas: son paradas visuales y piden el doble de aire, a
      los dos lados. El lado izquierdo del combinador va en `:where()`
      para que no puntúe: así estas reglas se quedan en (0,3,0) y las de
      encabezado, que traen un elemento, las ganan sin trucos. */
.cb-article .entry-content.entry-content > :where(figure, .wp-block-image, .wp-block-embed, .wp-block-table, blockquote) + *,
.cb-article .entry-content.entry-content > * + :where(figure, .wp-block-image, .wp-block-embed, .wp-block-table, blockquote) { margin-block-start: var(--cb-s7); }

/* 3. Los componentes retro son paradas mayores: piden más aire todavía
      para que el lector registre el cambio de registro. */
.cb-article .entry-content.entry-content > * + .rubrica-final,
.cb-article .entry-content.entry-content > * + .guru-meditation,
.cb-article .entry-content.entry-content > * + .is-style-cb-rubric,
.cb-article .entry-content.entry-content > * + .is-style-cb-guru,
.cb-article .entry-content.entry-content > * + .is-style-cb-panel,
.cb-article .entry-content.entry-content > * + .cb-verdict,
.cb-article .entry-content.entry-content > * + .cb-spec-sheet { margin-block-start: var(--cb-s8); }

/* 4. Encabezados: el aire de arriba lo pone el encabezado, venga de
      donde venga. Antes un h2 detrás de una figura cobraba los 64 px de
      la regla de medios y 88 px en cualquier otro sitio: el mismo
      encabezado con dos aires distintos según lo que tuviera encima. */
.cb-article .entry-content.entry-content > * + h2 { margin-block-start: var(--cb-s8); }
.cb-article .entry-content.entry-content > * + h3 { margin-block-start: var(--cb-s7); }
.cb-article .entry-content.entry-content > * + h4 { margin-block-start: var(--cb-s6); }

/* 5. Y lo que va detrás de un encabezado va tirante, porque le
      pertenece. Va la última para ganar también al h3 pegado a su h2,
      que se abría a 64 px como si empezara otra sección. */
.cb-article .entry-content.entry-content > h2 + *,
.cb-article .entry-content.entry-content > h3 + *,
.cb-article .entry-content.entry-content > h4 + * { margin-block-start: var(--cb-s4); }

/* 6. Separadores. Medido en el Shure Designer 6: el `<hr>` sin estilo
      salía con `width: 0` y `border-top-width: 0` —o sea, nada dibujado—
      pero se comía 98 px de columna, un hueco en blanco en mitad del
      artículo que parecía un fallo de maquetación. Y el aire estaba
      descompensado: 48 px por arriba y 136 por abajo (los suyos más los
      88 del h2 que venía detrás), con la raya pegada a lo que
      terminaba en lugar de en medio del corte. */
.cb-article .entry-content.entry-content > hr + * { margin-block-start: var(--cb-s7); }

.cb-article .entry-content.entry-content > hr.wp-block-separator {
	/* Los 3 rem de arriba y abajo que gutenberg.css impone con
	   `!important` se anulan aquí para que el aire lo ponga la tabla del
	   ritmo y no dos sistemas a la vez: con los dos sumando, un `<hr>`
	   seguido de un h2 dejaba 136 px de hueco por debajo y 48 por
	   encima, con la raya pegada al párrafo anterior en vez de en medio
	   del corte. */
	margin-block: var(--cb-s7) 0 !important;
}

/* Y el motivo de que no se viera nada: en una rejilla, un elemento con
   `width: auto` y márgenes laterales `auto` —los que le pone
   `hr { margin: 4rem auto }` de style.css— deja de estirarse y se
   encoge a su contenido, que en un `<hr>` es cero. Medido: 0 px de
   ancho. Con los márgenes a cero vuelve a ocupar la columna y se ve el
   degradado que ya le da enhance.css. Los de estilo «puntos» se quedan
   como están: esos sí tienen contenido que centrar. */
.cb-article .entry-content.entry-content > hr.wp-block-separator:not(.is-style-dots) {
	margin-inline: 0;
}

.cb-article .entry-content.entry-content > *:first-child { margin-block-start: 0; }

.cb-article .entry-content h2,
.cb-article .entry-content h3,
.cb-article .entry-content :target { scroll-margin-top: 5.5rem; }

/* ==========================================================================
   5. Medios
   ========================================================================== */

.cb-article .entry-content figure,
.cb-article .entry-content .wp-block-image {
	margin-inline: 0;
}

/*
 * Las imágenes ya no se estiran al ancho de la columna: se quedan en
 * su tamaño real hasta el tope, y las verticales se limitan por alto
 * para que una captura apaisada y una en vertical ocupen lo mismo en
 * pantalla. Antes una foto en vertical se comía dos pantallas.
 */
.cb-article .entry-content figure > img,
.cb-article .entry-content .wp-block-image img {
	display: block;
	width: auto;
	max-width: 100%;
	height: auto;
	max-height: min(70vh, 620px);
	margin-inline: auto;
	border-radius: 4px;
	background: #07060f;
}

/*
 * Capturas nativas de 320 px: se topan a 720 px y se amplían con vecino
 * más próximo. El suavizado bilineal destruye el pixel art, que es
 * justo de lo que hablan estos artículos.
 */
.cb-article .entry-content figure.is-lowres,
.cb-article .entry-content .wp-block-image.is-lowres {
	max-width: min(100%, 720px);
	margin-inline: auto;
}

.cb-article .entry-content figure.is-lowres img,
.cb-article .entry-content .wp-block-image.is-lowres img {
	image-rendering: pixelated;
}

/* Pies de foto: centrados bajo la imagen y con su propia medida, para
   que no se conviertan en un renglón de 960 px. Sin la cursiva falsa ni
   la sombra que traía el Personalizador: a 14 px sobre fondo oscuro
   engordaban y emborronaban el trazo. */
.cb-article .entry-content figcaption,
.cb-article .entry-content .wp-element-caption {
	margin-block-start: var(--cb-s3);
	margin-inline: auto;
	max-width: min(100%, 60ch);
	font-size: .875rem;
	line-height: 1.5;
	font-style: normal;
	text-align: center;
	text-shadow: none;
	color: var(--cb-ink-3);
}

/* Incrustaciones: proporción fija, sin los width/height que trae el
   proveedor cableados en el iframe. */
.cb-article .entry-content .wp-block-embed__wrapper {
	position: relative;
	aspect-ratio: 16 / 9;
}

.cb-article .entry-content .wp-block-embed__wrapper > iframe,
.cb-article .entry-content .wp-block-embed__wrapper > video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	border-radius: 4px;
}

/* Las incrustaciones sin alineación explícita van a «ancho»: un vídeo a
   680 px se queda corto, pero a sangre compite con el artículo. Si el
   autor eligió alineación, manda la suya. */
.cb-article .entry-content > .wp-block-embed:not(.alignfull):not(.alignwide) {
	grid-column: wide;
}

@media (max-width: 1023px) {
	.cb-article .entry-content > .wp-block-embed:not(.alignfull):not(.alignwide) {
		grid-column: text;
	}
}

/* Tablas: dentro de su caja, nunca arrastrando la página. */
.cb-article .entry-content .wp-block-table,
.cb-article .entry-content .cb-table-scroll {
	overflow-x: auto;
}

.cb-article .entry-content table {
	width: 100%;
	border-collapse: collapse;
}

/* ==========================================================================
   6. Cabecera del artículo
   ========================================================================== */

/*
 * El titular deja de ir superpuesto a la imagen. Era el mayor problema
 * de legibilidad de la página: texto grande sobre una captura de 320 px
 * ampliada y con degradado encima. Ahora va sobre fondo sólido y la
 * imagen debajo, donde se ve entera.
 */
.cb-article .entry-header,
.cb-article .cover-wrapper {
	max-height: none;
	box-shadow: none;
}

.cb-article .entry-title.single-entry-title {
	max-width: min(100%, 26ch);
	font-size: clamp(1.875rem, 1.1rem + 3.2vw, 3.25rem);
	line-height: 1.08;
	font-weight: 800;
	letter-spacing: -.025em;
	color: #fff;
	text-wrap: balance;
}

.cb-article .entry-content.excerpt {
	font-size: clamp(1.1875rem, 1.05rem + .6vw, 1.375rem);
	line-height: 1.55;
	color: var(--cb-ink-2);
}

.cb-article .entry-meta {
	font-size: .8125rem;
	line-height: 1.45;
	color: var(--cb-ink-3);
}

.cb-article .entry-meta .vcard,
.cb-article .entry-meta time,
.cb-article .entry-meta .read-time {
	font-family: var(--body-font);
}

/* ==========================================================================
   7. Componentes retro
   --------------------------------------------------------------------------
   Se conservan los cuatro. Lo que cambia es que toman su ancho de la
   rejilla y su espacio de la escala, y que dejan de parpadear.
   ========================================================================== */

/* --- Rúbrica ------------------------------------------------------------- */

.cb-article .entry-content > .rubrica-final,
.cb-article .entry-content > .is-style-cb-rubric {
	grid-column: wide;
	box-shadow: 0 0 20px rgba(0, 255, 255, .32);
}

@media (max-width: 1023px) {
	.cb-article .entry-content > .rubrica-final,
	.cb-article .entry-content > .is-style-cb-rubric { grid-column: text; }
}

/*
 * Sin bordes: ni el recuadro de la tabla ni las líneas entre filas.
 * El marco cian del bloque .rubrica-final ya delimita la rúbrica; la
 * caja de la tabla dentro de esa caja era un borde dentro de otro.
 * La regla genérica `table` de style.css:945 pinta 1px con
 * --default-border-color, así que hay que anularla explícitamente.
 * Se añade .entry-content para ganar al CSS del Personalizador, que
 * se imprime en línea después de esta hoja y empata en especificidad.
 */
.cb-article .entry-content .rubrica-final .tabla-rubrica,
.cb-article .entry-content .rubrica-final .tabla-rubrica td {
	border: none;
}

.cb-article .rubrica-final .tabla-rubrica td {
	padding: var(--cb-s3) var(--cb-s4);
}

.cb-article .rubrica-final .tabla-rubrica td.score,
.cb-article .rubrica-final .tabla-rubrica td:last-child {
	font-family: "Press Start 2P", ui-monospace, monospace;
	font-size: .875rem;
	text-align: right;
	white-space: nowrap;
	color: var(--cb-neon-aqua);
	font-variant-numeric: tabular-nums;
}

/* --- Guru Meditation ------------------------------------------------------ */

.cb-article .entry-content > .guru-meditation,
.cb-article .entry-content > .is-style-cb-guru {
	grid-column: text;
	/* Estaba a 2rem: diecisiete caracteres por línea. */
	font-size: clamp(.75rem, 2vw, 1rem);
	line-height: 1.9;
}

/* --- Panel y cita --------------------------------------------------------- */

.cb-article .entry-content > blockquote.fondito {
	padding: var(--cb-s5) var(--cb-s6);
	border-left: 3px solid var(--cb-neon-pink);
	border-radius: 0 4px 4px 0;
}

.cb-article .entry-content > blockquote.fondito p {
	font-family: var(--body-font);
	font-size: clamp(1.1875rem, 1.05rem + .55vw, 1.375rem);
	line-height: 1.5;
	font-style: normal;
	padding-top: 0;
	color: var(--cb-ink);
}

/*
 * La firma de la cita medía 17 px —casi el cuerpo de la propia cita, 22
 * px— y competía con ella en lugar de rematarla. Los 14 px de aquí
 * llevan `!important` porque gutenberg.css impone
 * `.wp-block-quote:not(.has-small-font-size) cite { font-size: 1.0625rem
 * !important }` y el Personalizador repite la misma declaración también
 * con `!important`: no hay especificidad que gane a eso.
 * El `letter-spacing: 2px` del Personalizador estiraba «Thalvas Von
 * Wierhem (Crítica B¡ts)» hasta 476 px; con .06em queda en su sitio.
 */
.cb-article .entry-content blockquote cite {
	display: block;
	position: relative;
	margin-block-start: var(--cb-s4);
	padding-top: var(--cb-s4);
	font-family: "Major Mono Display", ui-monospace, monospace;
	font-size: .875rem !important;
	font-style: normal;
	letter-spacing: .06em;
	line-height: 1.4;
	color: var(--cb-neon-cyan);
}

/*
 * El filete que separa la firma salía del tema con 153 px de ancho,
 * pegado al borde izquierdo y en rgba(26,12,43,.62): un gris más oscuro
 * que el propio fondo de la cita, o sea invisible, y encima al lado
 * contrario de la firma, que va alineada a la derecha. Queda un filete
 * corto que arranca donde arranca el texto de la firma.
 */
.cb-article .entry-content blockquote cite::before {
	left: auto;
	right: 0;
	bottom: auto;
	top: 0;
	width: 3.5rem;
	height: 1px;
	background: var(--cb-hairline-strong);
}

/* --- Chip de puntuación --------------------------------------------------- */

.cb-article .puntuacion-final {
	display: inline-flex;
	align-items: baseline;
	gap: var(--cb-s2);
	margin-block-start: var(--cb-s5);
	padding: var(--cb-s3) var(--cb-s4) var(--cb-s2);
	font-size: 1rem;
}

@media (max-width: 480px) {
	.cb-article .puntuacion-final { font-size: .8rem; }
}

/* ==========================================================================
   8. Pie del artículo
   ========================================================================== */

.cb-article .hentry-footer,
.cb-article .author-bio,
.cb-article .post-navigation {
	margin-block-start: var(--cb-s8);
}

/* Etiquetas: píldoras sobrias, sin el contador —el «1» de «3DO 1» no
   informa de nada. */
.cb-article .post-tags a {
	display: inline-flex;
	align-items: center;
	padding: .35rem .8rem;
	border: 1px solid var(--cb-hairline);
	border-radius: 100px;
	background: var(--cb-surface);
	font-size: .8125rem;
	color: var(--cb-ink-3);
	text-decoration: none;
	transition: border-color var(--cb-fast) var(--cb-ease), color var(--cb-fast) var(--cb-ease);
}

.cb-article .post-tags a:hover {
	border-color: var(--cb-neon-cyan);
	color: #fff;
}

.cb-article .post-tags .tfm-count { display: none; }

/*
 * La biografía del autor se compone ahora como ficha de personaje: ver
 * el apartado 15. Las reglas que la trataban como un bloque de texto
 * suelto —retrato a 680 px de ancho incluido— se han retirado de aquí.
 */

.cb-article .author-bio .author-description {
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
	color: var(--cb-ink-3);
}

.comments-area {
	margin-block-start: var(--cb-s9);
}

/* ==========================================================================
   9. Movimiento
   --------------------------------------------------------------------------
   Dentro de la columna de lectura, ninguno permanente.

   Había cinco bucles infinitos rodeando el texto; el peor era el
   parpadeo a ~1,9 Hz del rótulo de la rúbrica, justo al lado de la nota
   que el lector va a buscar. El brillo se consigue igual con
   box-shadow, que es estático y no cuesta un repintado por fotograma.
   ========================================================================== */

.cb-article .rubrica-final,
.cb-article .rubrica-final::before,
.cb-article .rubrica-final::after,
.cb-article .guru-meditation,
.cb-article .guru-meditation::before,
.cb-article .guru-meditation::after,
.cb-article .is-style-cb-rubric,
.cb-article .is-style-cb-rubric::before,
.cb-article .is-style-cb-guru::after,
.cb-article .fondito::before,
.cb-article .entry-content .wp-block-image.is-style-cb-crt::after {
	animation: none;
}

/* Las imágenes de un artículo no son botones: elevarlas al pasar el
   ratón promete un clic que no existe. */
.cb-article .entry-content .wp-block-image:hover img {
	transform: none;
	box-shadow: none;
}

/* Y el logotipo deja de latir mientras se lee: queda a pocos píxeles de
   la primera línea durante todo el artículo. */
.single .cb-header.is-stuck .logo-i,
.page .cb-header.is-stuck .logo-i {
	animation: none;
}

/* «4 Min Read» lo compone tfm-theme-boost a trozos y su «Min» va con
   esc_html() en lugar de esc_html__(), así que no hay forma de
   traducirlo. Se resuelve en presentación. */
.cb-article .entry-meta-read-time,
.entry-meta-read-time {
	text-transform: lowercase;
}

/* ==========================================================================
   10. Correcciones de la auditoría
   ========================================================================== */

/* --- Letra capital: caja roja de 123 px -----------------------------------
   Cuatro hojas peleaban por el mismo pseudo-elemento con !important
   cruzados. gutenberg.css le ponía fondo rojo y 1,5rem de relleno, y el
   Personalizador lo subía a 2,1rem: la letra invadía tres líneas.
   -------------------------------------------------------------------------- */

.cb-article .entry-content p.has-drop-cap::first-letter {
	background: none;
	padding: .05em .12em 0 0;
	margin: 0;
}

/* --- Enlaces: contraste y subrayado ---------------------------------------
   El Personalizador dejaba dos rosas distintos (#df7580 y #f45791), sin
   subrayado y a 3,4:1 sobre el fondo del cuerpo. Un enlace sin subrayado
   y con ese contraste es indistinguible del texto normal. El tema tenía
   incluso preparada --post-content-link-text-decoration y nadie la usó.
   -------------------------------------------------------------------------- */

.cb-article .entry-content a:not(.wp-block-button__link):not(.cb-toc__item a) {
	color: #ff9ab8;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-decoration-color: rgba(255, 154, 184, .45);
	text-underline-offset: .18em;
	transition: color var(--cb-fast) var(--cb-ease), text-decoration-color var(--cb-fast) var(--cb-ease);
}

.cb-article .entry-content a:hover,
.cb-article .entry-content a:focus-visible {
	color: #fff;
	text-decoration-color: currentColor;
}

/* --- Tercer ancho por un !important ---------------------------------------
   style.css:3471 fija a las figuras del editor clásico con style="width"
   un ancho de calc(100% - 120px) !important: 52,5 px más estrechas que
   todo lo demás, y sin forma de anularlo salvo con otro !important.
   -------------------------------------------------------------------------- */

.cb-article .entry-content figure[style*="width"]:not(.alignleft):not(.alignright) {
	width: auto !important;
	max-width: 100% !important;
}

/* --- Migas de pan: fuera de eje y <nav> anidado ---------------------------- */

.cb-article .cb-breadcrumbs {
	max-width: var(--cb-col);
	margin-inline: auto;
	margin-bottom: var(--cb-s5);
}

/* --- Separadores: uno casi blanco y tres invisibles ------------------------
   .author-bio usaba --very-light-grey (#f2f2f3, 9,6:1: una raya que
   deslumbra) mientras el resto usaba un color a 1,75:1, invisible.
   -------------------------------------------------------------------------- */

.cb-article .author-bio,
.cb-article .hentry-footer,
.single .after-content > div,
.single div.post-navigation {
	border-top-color: rgba(255, 255, 255, .12);
}

/* --- Etiquetas: fuera los contadores ---------------------------------------
   172 de las 204 etiquetas del sitio tienen una entrada o ninguna, así
   que el contador siempre dice «1». No informa de nada.
   -------------------------------------------------------------------------- */

.cb-article .tag-link-count { display: none; }

/* --- Relacionados: 1300 px pegados a una columna de 900 -------------------- */

/*
 * Los relacionados cuelgan de `.wrap`, fuera de la columna del
 * artículo, y con `margin-inline: auto` se centraban respecto a la
 * página entera: medido, la caja iba de 270 a 1170 px mientras el
 * artículo va de 70 a 1038, y el rótulo «Posts Relacionados», que va
 * centrado dentro de ella, caía en x=720 cuando todo lo que tiene
 * encima se centra en 554. Un salto de 166 px justo al final de la
 * lectura. El `max()` los pega al borde izquierdo de la columna de
 * contenido —los mismos 70 px que `.after-content`— sin depender del
 * ancho de la barra lateral, y se anula solo cuando no cabe.
 */
.single #tfm-related-posts-wrap,
.page #tfm-related-posts-wrap {
	max-width: var(--content-max-width, 900px);
	margin-left: max(0px, calc(50% - 650px));
	margin-right: auto;
}

/* --- Cita .fondito: definida seis veces, y a 35 px ------------------------- */

.cb-article .entry-content blockquote.fondito p,
.cb-article .entry-content .fondito.wp-block-quote.is-style-large p {
	font-family: var(--body-font);
	font-size: clamp(1.1875rem, 1.05rem + .55vw, 1.375rem);
	line-height: 1.5;
	padding-top: 0;
}

/* --- Rúbrica en móvil ------------------------------------------------------
   Se dejó de ocultar (era lo más importante del análisis). Aquí se
   resuelve el desbordamiento que motivó aquella regla: tipografía
   fluida y la tabla con scroll propio.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {

	.cb-article .entry-content > .rubrica-final,
	.cb-article .entry-content > .is-style-cb-rubric {
		font-size: .7rem;
		padding: 4rem .75rem 1.5rem;
		letter-spacing: .04em;
	}

	.cb-article .rubrica-final::before,
	.cb-article .is-style-cb-rubric::before {
		font-size: .68rem;
	}

	.cb-article .rubrica-final .tabla-rubrica {
		width: 100%;
		display: block;
		overflow-x: auto;
	}

	.cb-article .rubrica-final .tabla-rubrica td.score,
	.cb-article .rubrica-final .tabla-rubrica td:last-child {
		font-size: .7rem;
	}
}

/* --- Variables rotas del tema ---------------------------------------------
   style.css usa --global-elements-margin once veces sin definirla nunca:
   esas once declaraciones se descartan enteras. Y en style.css:319 hay
   una errata, --heading-line-heght, que deja el interlineado de todos
   los titulares clavado en su valor de reserva. Se declaran ambas para
   que las reglas del tema vuelvan a funcionar.
   -------------------------------------------------------------------------- */

:root {
	--global-elements-margin: 2rem;
	--heading-line-heght: 1.2;
}

/* ==========================================================================
   11. Portada del artículo (single-hero)
   --------------------------------------------------------------------------
   El titular, las migas y la firma van sobre la imagen destacada. Para
   que se lean sin depender de la foto, el velo inferior es opaco de
   verdad: sube desde el borde hasta pasada la mitad.
   ========================================================================== */

/* Sin hueco entre la cabecera y el hero: se solapan cinco píxeles, así
   que un redondeo o una línea de subpíxel nunca deja ver el fondo. */
.single.has-full-width-media .wrap,
.page.has-full-width-media .wrap {
	padding-top: 0;
}

.single .single-hero,
.page .single-hero {
	position: relative;
	margin-bottom: 0;
}

/* Los 5 px de solape con la cabecera, que llevaban muertos desde que se
   pidieron: el tema los pisa con
   `.single:not(.has-tfm-mobile-ad-after-header) .single-hero[data-thumbnails="true"]:not(.default-alt)`,
   que lleva `!important` y calcula el margen a partir de una variable que
   en escritorio vale 0. Hace falta empatarle en peso —cinco clases— y
   repetir el `!important`.

   Sólo de 481 px para arriba, que es donde el tema deja el margen en 0.
   Por debajo sube el hero 30 px por su cuenta y bajarlo a 5 reabriría la
   costura que ese margen tapa. */
@media (min-width: 481px) {

	.single:not(.home) .wrap > .single-hero[data-thumbnails="true"][data-fullwidth="true"],
	.page:not(.home) .wrap > .single-hero[data-thumbnails="true"][data-fullwidth="true"] {
		margin-top: -5px !important;
	}
}

.single-hero.cover .cover-wrapper {
	position: relative;
	max-height: none;
	box-shadow: none;
	overflow: hidden;
}

.single-hero.cover .thumbnail-wrapper,
.single-hero.cover .post-thumbnail {
	margin: 0;
}

.single-hero.cover .post-thumbnail img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* Alto contenido: antes la portada llegaba a comerse la pantalla entera
   y el primer párrafo quedaba fuera de la vista inicial. */
/* Alto contenido: con 58vh el titular se iba por debajo de la primera
   pantalla y sólo se veía la foto. */
.single-hero.cover .cover-wrapper {
	min-height: clamp(17rem, 40vh, 23rem);
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
}

.single-hero.cover .thumbnail-wrapper {
	position: absolute;
	inset: 0;
	z-index: 0;
}

/* El velo. Dos capas: una vertical fuerte desde abajo y otra lateral
   suave, para que el texto aguante también sobre fotos claras. */
.single-hero.cover .cover-wrapper::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background:
		linear-gradient(to top,
			rgba(6, 5, 14, .98) 0%,
			rgba(6, 5, 14, .92) 22%,
			rgba(6, 5, 14, .68) 48%,
			rgba(6, 5, 14, .28) 74%,
			rgba(6, 5, 14, .10) 100%),
		linear-gradient(to right,
			rgba(6, 5, 14, .55) 0%,
			rgba(6, 5, 14, .18) 55%,
			rgba(6, 5, 14, 0) 100%);
}

.single-hero.cover .entry-wrapper {
	position: relative;
	z-index: 2;
	width: 100%;
	max-width: var(--cbh-max, 1400px);
	margin-inline: auto;
	padding: 0 clamp(1rem, 4vw, 2.5rem) clamp(2rem, 5vw, 3.25rem);
}

.single-hero.cover .entry-header {
	max-width: 52rem;
	padding: 0;
	margin: 0;
	background: none;
	box-shadow: none;
}

/* Migas: primero, discretas, y sin la caja del artículo. */
/*
 * Las migas van sobre la fotografía, y una fotografía puede ser clara: en
 * las portadas de fondo blanco —cajas de producto, capturas de escritorio—
 * el gris al 62 % desaparecía. Se sube la tinta, se le pone sombra propia
 * y se les da una chapa apenas visible, que es lo que garantiza el
 * contraste cuando debajo hay lo que sea.
 */
.single-hero.cover .cb-breadcrumbs {
	display: inline-block;
	max-width: 100%;
	margin: 0 0 1rem;
	padding: .3rem .7rem;
	border-radius: 4px;
	/*
	 * Medido sobre la portada del Atari y la del FIFA: con .5 de alfa, un
	 * trozo de imagen casi blanco deja la chapa en gris medio y la última
	 * miga baja a 1,30:1 — el defecto que esta chapa venía a resolver. A
	 * .74 el fondo compuesto se queda en torno a #4b4b52 y el texto sube
	 * por encima del mínimo AA sobre cualquier imagen.
	 */
	background: rgba(6, 5, 16, .74);
	backdrop-filter: blur(6px);
	-webkit-backdrop-filter: blur(6px);
	font-size: .82rem;
	color: rgba(255, 255, 255, .88);
	text-shadow: 0 1px 3px rgba(0, 0, 0, .95);
}

.single-hero.cover .cb-breadcrumbs .separator {
	color: rgba(255, 255, 255, .5);
}
/*
 * La chapa se estiraba a todo lo ancho: `display: inline-block` no basta
 * porque el envoltorio del titular es flex y blockifica a sus hijos.
 * Medido a 768: 708 px de chapa para 198 px de texto, una banda gris
 * cruzando la portada. El defecto era el mismo en escritorio.
 */
.single-hero.cover .entry-wrapper .cb-breadcrumbs,
.single-hero.cover .entry-wrapper .cb-breadcrumbs > nav {
	width: fit-content;
	max-width: 100%;
}

.single-hero.cover .cb-breadcrumbs nav > p {
	margin: 0;
}


.single-hero.cover .cb-breadcrumbs a {
	color: #fff;
	text-decoration: none;
	border-bottom: 1px solid rgba(255, 255, 255, .35);
	transition: border-color var(--cb-fast) var(--cb-ease), color var(--cb-fast) var(--cb-ease);
}

.single-hero.cover .cb-breadcrumbs a:hover {
	color: var(--cb-neon-cyan);
	border-bottom-color: var(--cb-neon-cyan);
}

/* El último tramo es la página actual: no es enlace, y se distingue. */
.single-hero.cover .cb-breadcrumbs .last {
	color: rgba(255, 255, 255, .82);
}

.single-hero.cover .entry-title {
	margin: 0 0 1rem;
	font-size: clamp(1.9rem, 1.1rem + 3.2vw, 3.4rem);
	line-height: 1.06;
	font-weight: 800;
	letter-spacing: -.03em;
	color: #fff;
	text-shadow: 0 2px 24px rgba(0, 0, 0, .55);
	text-wrap: balance;
}

.single-hero.cover .entry-meta.category-meta {
	margin: 0 0 .9rem;
}

.single-hero.cover .entry-meta.after-title {
	margin: 0;
	font-size: .85rem;
	color: rgba(255, 255, 255, .74);
}

.single-hero.cover .entry-content.excerpt {
	margin: 0 0 1rem;
	max-width: 44rem;
	font-size: clamp(1.0625rem, 1rem + .4vw, 1.2rem);
	line-height: 1.55;
	color: rgba(255, 255, 255, .82);
}

@media (max-width: 767px) {

	.single-hero.cover .cover-wrapper {
		min-height: clamp(15rem, 38vh, 19rem);
	}

	.single-hero.cover .entry-title {
		font-size: clamp(1.6rem, 6vw, 2.1rem);
	}

	.single-hero.cover .entry-content.excerpt { display: none; }
}

/* ==========================================================================
   12. Botones: el texto siempre blanco
   --------------------------------------------------------------------------
   El botón de Amazon y compañía heredaban el rosa de los enlaces del
   artículo sobre su fondo ámbar. Ilegible y fuera de sistema.
   ========================================================================== */

.cb-article .entry-content .wp-block-button__link,
.cb-article .entry-content .wp-element-button,
.cb-article .entry-content a.button,
.cb-article .entry-content a.boton-amazon,
.cb-article .entry-content .boton-amazon a,
.cb-article .entry-content a.button-85,
.cb-article .entry-content a[class*="boton"],
.cb-article .entry-content a[class*="btn"] {
	color: #fff;
	text-decoration: none;
}

/* El de Amazon va sobre ámbar: ahí el blanco no llega y el negro sí. */
.cb-article .entry-content .boton-amazon,
.cb-article .entry-content a.boton-amazon,
.cb-article .entry-content .wp-block-button.boton-amazon .wp-block-button__link {
	color: #1a1206;
	font-weight: 700;
}

/*
 * El defecto de contraste más grave de la entrada, y estaba justo en la
 * llamada a la acción: el botón de Amazon lo compone el editor como
 * `<div class="wp-block-button button-77"><a>…</a></div>`, con el
 * degradado ámbar en el div y un `<a>` pelado dentro. Como ese enlace no
 * lleva la clase `wp-block-button__link`, ninguna de las reglas de
 * arriba lo alcanzaba y se quedaba con el rosa de los enlaces del
 * artículo, #ff9ab8, sobre el ámbar #f99813: 1,11:1 medido, o sea texto
 * del mismo valor que su fondo. Con la tinta oscura sube a 9,2:1.
 *
 * Se apunta a cualquier enlace directo de un `.wp-block-button`, no a la
 * clase numerada, que la cambia el editor cada vez que se duplica el
 * bloque. La clase repetida y el `[href]` están para pasar por delante
 * de la regla de enlaces del apartado 3, que con sus dos `:not()` llega
 * a (0,4,2) y gana a cualquier selector razonable.
 */
/*
 * Corregido: esta regla se escribió para el botón de Amazon —tinta oscura
 * sobre ámbar, que ahí es lo correcto— pero alcanzaba a CUALQUIER bloque
 * botón del sitio. Medido sobre un degradado rosa→violeta: 4,8:1 en el
 * extremo rosa y 4,2:1 en el violeta, por debajo del mínimo. Ahora sólo
 * pisa a los botones de fondo claro.
 */
/*
 * REGRESIÓN CORREGIDA (medida el 04-09). Al estrechar la regla anterior se
 * escribió `> a[href].button-77`, o sea la clase EN EL ENLACE. En el HTML
 * real la clase numerada va en el DIV y el enlace sólo lleva `cb-external`:
 *
 *   <div class="wp-block-button button-77"><a class="cb-external">…</a></div>
 *
 * Así que el selector no casaba con nada, el botón caía en la regla de
 * abajo y salía en blanco sobre su propio degradado ámbar
 * —`.button-77::after`, linear-gradient(#ffc626 → #f99813)—. Medido con la
 * fórmula WCAG sobre los colores calculados: 1,56:1 en el extremo #ffc626 y
 * 2,21:1 en el #f99813. Es el texto de la llamada a la acción del análisis,
 * o sea lo más importante que hay que poder leer de toda la entrada.
 * Con la tinta oscura: 11,87:1 y 8,38:1.
 *
 * La clase va ahora donde de verdad está, y la regla de tinta blanca se
 * excluye a sí misma de esos botones para que no haya que competir por
 * especificidad entre dos reglas que son excluyentes.
 */
.cb-article .entry-content .wp-block-button.wp-block-button > a.boton-amazon[href],
.cb-article .entry-content .wp-block-button.wp-block-button[class*="amazon"] > a[href],
.cb-article .entry-content .wp-block-button.wp-block-button.button-77 > a[href],
.cb-article .entry-content .wp-block-button.wp-block-button > a[href].button-77,
.cb-article .entry-content .wp-block-button.wp-block-button > a[href].boton-amazon:hover,
.cb-article .entry-content .wp-block-button.wp-block-button > a[href].boton-amazon:focus-visible {
	color: #1a1206;
	font-weight: 800;
	text-decoration: none;
}

/* El resto de botones: tinta blanca, que es lo que declara su estilo. */
.cb-article .entry-content .wp-block-button.wp-block-button:not(.button-77):not([class*="amazon"]) > a[href]:not(.boton-amazon):not(.button-77) {
	color: #fff;
	font-weight: 800;
	text-decoration: none;
}

/* --- Banners de portada (wp:cover) con cuerpo escrito a mano ---------------
   Al pasar las portadas de `alignfull` a `aligncenter` dejan de ocupar el
   ancho de la ventana y pasan al ancho de lectura. El banner del RX 7900
   XTX lleva dos párrafos con el cuerpo puesto a mano en el atributo style
   —72 px y 52 px—, y «7900XTX» a 72 px no cabe en los 235 px que quedan
   dentro de la portada en un móvil estrecho: medido, 39 px de
   desbordamiento a 360 y 10 px a 390, ninguno a partir de 414.

   El cuerpo va en el atributo style, así que sólo se le gana con
   !important. Se usa min() para que el valor escrito por el autor siga
   siendo el techo: en pantallas anchas manda el 72 y el 52 de siempre, y
   sólo en las estrechas baja lo justo. Cada párrafo lleva su propio tope
   para no invertir la jerarquía entre el titular del banner y su bajada.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {

	.cb-article .entry-content .wp-block-cover p[style*="font-size: 72px"] {
		font-size: min(72px, 8.6vw) !important;
	}

	.cb-article .entry-content .wp-block-cover p[style*="font-size: 52px"] {
		font-size: min(52px, 6.2vw) !important;
	}
}

/* --- Portadas de baja resolución -------------------------------------------
   Petición expresa: la portada recorta y llena (`cover`) aunque la imagen
   sea pequeña. Antes se mostraba `contain`, a tamaño real y con bandas
   negras a los lados, para no ampliarla; ahora se amplía y se recorta como
   cualquier otra, así que el hero se lee igual en todas las entradas.

   El fondo se queda como color de reserva mientras la imagen carga, y el
   velo pasa a ser el mismo que el del resto: con la imagen llenando el
   marco ya no hay arte lateral que proteger.
   -------------------------------------------------------------------------- */

.cb-lowres-hero .single-hero.cover .thumbnail-wrapper {
	background: #07060f;
}

.cb-lowres-hero .single-hero.cover .post-thumbnail img {
	object-fit: cover;
}

/* La altura la marcaba `.thumbnail-hero .post-thumbnail { padding-bottom:
   40% }` del tema: 576 px sólo de imagen, más la cabecera encima. Por eso
   el titular caía fuera de la primera pantalla. Aquí la imagen pasa a ser
   fondo absoluto y la altura la decide el min-height del envoltorio. */
body .single-hero.cover .thumbnail-wrapper {
	position: absolute;
	inset: 0;
	z-index: 0;
	margin: 0;
	padding: 0;
	height: 100%;
}

body .single-hero.cover .thumbnail-wrapper .post-thumbnail,
body .single-hero.cover .thumbnail-wrapper .post-thumbnail a {
	padding-bottom: 0;
	height: 100%;
	margin: 0;
	display: block;
	border-radius: 0;
}

/* El alto real no venía del min-height sino de un espaciador: el tema
   pone `.cover-wrapper::before { padding-bottom: 40% }` para forzar la
   proporción «hero». Con la imagen ya de fondo absoluto ese espaciador
   sólo servía para empujar el titular 576 px hacia abajo, fuera de la
   primera pantalla. */
/*
 * Ese espaciador se anula con padding-bottom: 0, no con display: none: el
 * pseudoelemento se reaprovecha para las líneas de barrido del tubo, las
 * mismas que el hero de la portada. Con display: none la capa CRT que se
 * definía más abajo nunca llegó a pintarse, porque esta regla lleva el
 * prefijo `body` y ganaba en especificidad.
 *
 * Se estira y se enmascara igual que la imagen: las rayas tienen que
 * llegar hasta el final del derrame y disolverse con él, o se vería dónde
 * acaba la pantalla.
 */
/* Cinco clases hacen falta para ganar a style.css:2530, que le mete
   `padding-bottom: var(--thumbnail-hero-padding)` con esa misma cuenta.
   El fondo pinta igual sobre el relleno, así que no se veía, pero deja
   la caja descuadrada y cualquier medida futura mentiría. */
body .single-hero.cover .article.thumbnail-hero .cover-wrapper::before {
	content: "";
	display: block;
	position: absolute;
	inset: 0 0 calc(var(--cb-hero-bleed) * -1) 0;
	padding-bottom: 0;
	z-index: 2;
	pointer-events: none;
	background: repeating-linear-gradient(
		to bottom,
		rgba(0, 0, 0, 0) 0 2px,
		rgba(0, 0, 0, .16) 2px 4px
	);
	mix-blend-mode: multiply;
	opacity: .55;
	-webkit-mask-image: var(--cb-hero-fade);
	mask-image: var(--cb-hero-fade);
}

body .single-hero.cover .cover-wrapper {
	min-height: clamp(19rem, 44vh, 26rem);
}

@media (max-width: 767px) {
	body .single-hero.cover .cover-wrapper {
		min-height: clamp(15rem, 36vh, 19rem);
	}
}

/* Las migas quedaban pegadas al borde inferior de la cabecera. */
.single-hero.cover .entry-wrapper {
	padding-top: clamp(1.25rem, 3vw, 2.25rem);
}

/* El título del índice en línea heredaba el tamaño de los h2 del
   artículo (2,25 rem en versalitas): parecía una sección más. */
.cb-article .entry-content .cb-toc__title,
.cb-article .entry-content h2.cb-toc__title {
	margin: 0;
	font-size: .74rem;
	font-weight: 700;
	line-height: 1.4;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--cb-neon-cyan);
}

/* La portada de las páginas también se comía la pantalla. */
.page .single-hero .post-thumbnail,
.page .single-hero .post-thumbnail a {
	padding-bottom: 26%;
}

@media (max-width: 767px) {
	.page .single-hero .post-thumbnail,
	.page .single-hero .post-thumbnail a {
		padding-bottom: 42%;
	}
}

/* --- Comilla de apertura de las citas --------------------------------------
   El tema pone un icono en `blockquote p:first-child::before` con
   position:absolute en la esquina superior izquierda, pero sin reservar
   sitio: caía justo encima de la primera letra. Se convierte en marca de
   agua tras el texto y el párrafo deja hueco arriba.
   -------------------------------------------------------------------------- */

.cb-article .entry-content blockquote {
	position: relative;
}

/*
 * Medido: el icono acaba siendo una caja de 48×53 px en la esquina
 * superior izquierda del párrafo, y como las citas `.fondito` no llevan
 * hueco arriba (se lo quita la regla del apartado 7 a propósito, para
 * que la cita empiece pegada al filete rosa), la marca caía justo detrás
 * de «y precio no se tiran de los pelos»: media comilla sobre el texto y
 * media en el aire de debajo. En una imagen no se lee como filigrana,
 * se lee como una mancha.
 *
 * Y sobra: el texto de las citas del sitio ya abre y cierra con « ».
 * Dos comillas para lo mismo, una de ellas encima de las letras.
 */
.cb-article .entry-content blockquote p:first-child::before {
	display: none;
}

.cb-article .entry-content blockquote p:first-child {
	position: relative;
	z-index: 1;
	padding-top: 0;
}

/* ==========================================================================
   13. Revisión: panel de lectura, listas con icono, pie del artículo
   ========================================================================== */

/* --- El artículo, sobre un panel ------------------------------------------
   Leer texto claro directamente sobre el fondo del sitio cansaba: el
   degradado y el ruido de la página compiten con la letra. Un panel
   translúcido detrás del cuerpo del artículo lo despega del fondo sin
   apagarlo.

   Se pinta con un pseudoelemento que se sale de la caja, no con `padding`
   sobre el contenedor: así el panel enmarca la columna sin estrechar ni
   un píxel la rejilla de sangrado que hay dentro, y las imágenes a sangre
   siguen midiendo lo que medían.
   -------------------------------------------------------------------------- */

.single .cb-article .single-content-wrapper,
.page .cb-article .single-content-wrapper {
	position: relative;
	z-index: 0;
	/*
	 * El panel arranca 64 px por encima del primer párrafo, y el cuerpo
	 * del artículo empezaba pegado al borde inferior de la portada: el
	 * panel se metía 64 px DENTRO del hero y su filo superior no se veía.
	 * Con este margen el panel queda 48 px por debajo de la portada, que
	 * es la separación de la referencia.
	 */
	margin-top: clamp(3rem, 5.5vw, 4rem);
}

.single .cb-article .single-content-wrapper::before,
.page .cb-article .single-content-wrapper::before {
	content: "";
	position: absolute;
	/*
	 * A lo ancho, exactamente la columna de contenido; la separación con
	 * la barra lateral la da el hueco de la maquetación, subido a 4rem.
	 *
	 * A lo alto sí se sale: el panel tiene que respirar por encima del
	 * primer párrafo y por debajo del último, no ceñirse al texto.
	 */
	inset: calc(var(--cb-s7) * -1) 0px;
	z-index: -1;
	border: 1px solid rgb(195 191 199 / 6%);
	border-radius: 12px;
	background: linear-gradient(106deg, #181d2ec2, #0c0f1ae3);
	box-shadow:
		0 30px 70px -40px rgba(0, 0, 0, .9),
		inset 0 1px 0 rgb(53 51 161 / 23%);
	pointer-events: none;
}

/*
 * En pantalla estrecha no hay panel.
 *
 * A ancho completo el marco enmarca una columna dentro de una página
 * ancha, que es lo que hace. En un móvil la columna ES la página: el
 * panel se convierte en un borde pegado a los dos cantos que no separa
 * nada de nada y sólo roba 24 px de medida al texto.
 */
@media (max-width: 1023px) {

	.single .cb-article .single-content-wrapper::before,
	.page .cb-article .single-content-wrapper::before {
		display: none;
	}

	.single .cb-article .single-content-wrapper,
	.page .cb-article .single-content-wrapper {
		margin-top: clamp(1.5rem, 5vw, 2.5rem);
	}
}

/* --- Listas cuyos puntos ya son un icono -----------------------------------
   Muchas listas del sitio empiezan cada punto con un emoji —✅ y ❌ en
   «Pros y contras»— y encima llevaban la viñeta redonda del navegador:
   dos marcas para lo mismo, y la de verdad desplazada. Se retira la
   viñeta y el emoji queda colgando en su sitio, con las líneas
   siguientes alineadas bajo el texto y no bajo el icono.
   -------------------------------------------------------------------------- */

.cb-article .entry-content ul.cb-list--iconic {
	list-style: none;
	padding-left: 0;
}

.cb-article .entry-content ul.cb-list--iconic > li {
	padding-left: 1.9em;
	text-indent: -1.9em;
}

.cb-article .entry-content ul.cb-list--iconic > li::marker {
	content: none;
}

/* --- La biografía del autor, centrada -------------------------------------- */

/* Los enlaces sociales de la ficha, centrados con ella. */
.single .after-content .author-bio .tfm-social-icons {
	justify-content: center;
}

/* --- Relacionados: sin tope de ancho ---------------------------------------
   Pedido: que ocupen lo que haya. Se mantiene el borde izquierdo pegado a
   la columna de contenido —si no, se descolgarían del eje por el que ha
   bajado la vista— pero ya no se topan a 900 px.
   -------------------------------------------------------------------------- */

.single #tfm-related-posts-wrap,
.page #tfm-related-posts-wrap {
	max-width: none;
	width: auto;
	margin-left: max(0px, calc(50% - 650px));
	margin-right: var(--cb-edge);
}

/* ==========================================================================
   14. El cierre del artículo
   --------------------------------------------------------------------------
   Etiquetas, visualizaciones y compartir iban sueltos, uno debajo de otro
   y sin relación entre sí. Aquí se agrupan en una ficha: filo de neón
   arriba, rótulo, etiquetas como fichas de cartucho y la fila de cierre
   con el recuento a un lado y los botones de compartir al otro.
   ========================================================================== */

.cb-article .single-hentry-footer {
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	align-items: center;
	/* El tema dejaba 50 px de hueco entre filas y abría un vacío en
	   mitad de la ficha. */
	gap: 0;
	max-width: none;
	margin-block-start: var(--cb-s8);
	padding: 1.6rem 1.5rem 1.4rem;
	border: 1px solid rgba(255, 255, 255, .09);
	border-radius: 8px;
	background: linear-gradient(165deg, rgba(26, 24, 52, .6), rgba(12, 11, 26, .68));
	overflow: hidden;
}

/* El filo superior, encendido de rosa a cian. */
.cb-article .single-hentry-footer::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 2px;
	background: linear-gradient(90deg, var(--cb-neon-pink), var(--cb-neon-violet) 45%, var(--cb-neon-cyan));
	opacity: .75;
}

/* El rótulo de la sección de etiquetas. */
.cb-article .single-hentry-footer .post-tags::before {
	content: "Etiquetas";
	display: block;
	margin-bottom: .85rem;
	font-family: var(--body-font);
	font-size: .68rem;
	font-weight: 800;
	letter-spacing: .16em;
	text-transform: uppercase;
	/* Contraste medido (fórmula WCAG sobre los colores calculados y el
	   fondo real de la ficha, rgb(18,17,36)): con .42 daba 4,01:1 a 10,6 px
	   —texto pequeño, mínimo 4,5:1—. Con .58 sube a 6,7:1. */
	color: rgba(255, 255, 255, .58);
}

.cb-article .single-hentry-footer .single-post-tags {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.cb-article .single-hentry-footer .single-post-tags li {
	margin: 0;
	padding: 0;
}

/* Las etiquetas, como fichas de cartucho: esquina superior derecha
   cortada y un filo que se enciende al pasar por encima. */
.cb-article .single-hentry-footer .post-tags a {
	display: inline-flex;
	align-items: center;
	padding: .4rem .8rem;
	border: 1px solid rgba(255, 255, 255, .14);
	border-radius: 3px;
	background: rgba(255, 255, 255, .035);
	font-family: var(--body-font);
	font-size: .78rem;
	font-weight: 600;
	letter-spacing: .01em;
	color: rgba(255, 255, 255, .72);
	text-decoration: none;
	clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 0 100%);
	transition:
		border-color var(--cb-fast) var(--cb-ease),
		background-color var(--cb-fast) var(--cb-ease),
		color var(--cb-fast) var(--cb-ease),
		transform var(--cb-fast) var(--cb-ease-out);
}

.cb-article .single-hentry-footer .post-tags a:hover,
.cb-article .single-hentry-footer .post-tags a:focus-visible {
	border-color: var(--cb-neon-cyan);
	background: rgba(0, 212, 255, .12);
	color: #fff;
	transform: translateY(-2px);
}

/* --- La fila de cierre ----------------------------------------------------- */

/* La fila de cierre: recuento a la izquierda, compartir a la derecha, los
   dos sobre el mismo filete de puntos. */
.cb-article .single-hentry-footer .post-tags {
	grid-column: 1 / -1;
	/* El tema le daba el margen de un bloque de metadatos y abría un
	   hueco de 90 px en mitad de la ficha. */
	margin: 0;
	padding: 0;
	border: 0;
}

/* La fila de compartir venía en columna y con el rótulo centrado encima
   de los iconos; aquí va todo en una línea. */
.cb-article .single-hentry-footer .tfm-share {
	display: flex;
	align-items: center;
	margin: 0;
	padding: 0;
	width: auto;
}

.cb-article .single-hentry-footer .tfm-social-icons {
	flex-wrap: wrap;
	justify-content: flex-end;
}

.cb-article .single-hentry-footer .share-text {
	display: inline-flex;
	align-items: center;
	/* El tema lo dejaba ocupar toda la fila —532 de 539 px— y los iconos
	   caían debajo. */
	flex: 0 0 auto;
	width: auto;
	margin: 0 .55rem 0 0;
	padding: 0;
	border: 0;
	white-space: nowrap;
}

.cb-article .single-hentry-footer .tfm-view-count {
	grid-column: 1;
	display: inline-flex;
	align-items: baseline;
	gap: .35rem;
	margin: 1.35rem 0 0;
	padding-top: 1.25rem;
	border-top: 1px dashed rgba(255, 255, 255, .1);
	font-size: .78rem;
	line-height: 1.4;
	letter-spacing: .04em;
	/* Medido: 4,46:1 a 12,5 px, justo por debajo del 4,5:1 exigido.
	   Con .60 queda en 7,1:1. */
	color: rgba(255, 255, 255, .60);
}

.cb-article .single-hentry-footer .tfm-view-count .count {
	font-size: .9rem;
	font-weight: 800;
	font-variant-numeric: tabular-nums;
	color: rgba(255, 255, 255, .72);
}

.cb-article .single-hentry-footer .tfm-share-wrapper {
	grid-column: 2;
	display: flex;
	align-items: center;
	justify-content: flex-end;
	margin: 1.35rem 0 0;
	padding: 1.25rem 0 0;
	border: 0;
	border-top: 1px dashed rgba(255, 255, 255, .1);
}

.cb-article .single-hentry-footer .tfm-share {
	margin: 0;
}

.cb-article .single-hentry-footer .tfm-social-icons {
	display: flex;
	align-items: center;
	gap: .45rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.cb-article .single-hentry-footer .share-text {
	margin-right: .4rem;
	font-family: var(--body-font);
	font-size: .66rem;
	font-weight: 800;
	letter-spacing: .16em;
	text-transform: uppercase;
	/* Mismo caso que el rótulo «Etiquetas»: 4,01:1 medido. */
	color: rgba(255, 255, 255, .58);
}

.cb-article .single-hentry-footer .share-this-text {
	display: none;
}

.cb-article .single-hentry-footer .tfm-social-icon a {
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	border: 1px solid rgba(255, 255, 255, .14);
	border-radius: 4px;
	background: rgba(255, 255, 255, .03);
	color: rgba(255, 255, 255, .62);
	transition:
		border-color var(--cb-fast) var(--cb-ease),
		background-color var(--cb-fast) var(--cb-ease),
		color var(--cb-fast) var(--cb-ease),
		transform var(--cb-fast) var(--cb-ease-out);
}

.cb-article .single-hentry-footer .tfm-social-icon a:hover {
	border-color: var(--cb-neon-pink);
	background: rgba(255, 0, 94, .14);
	color: #fff;
	transform: translateY(-2px);
}

@media (max-width: 599px) {

	.cb-article .single-hentry-footer {
		padding: 1.3rem 1.1rem 1.2rem;
	}

	/* En pantalla estrecha las dos piezas se apilan. */
	.cb-article .single-hentry-footer {
		grid-template-columns: minmax(0, 1fr);
	}

	.cb-article .single-hentry-footer .tfm-view-count,
	.cb-article .single-hentry-footer .tfm-share-wrapper {
		grid-column: 1;
		justify-content: flex-start;
	}

	.cb-article .single-hentry-footer .tfm-share-wrapper {
		margin-top: .9rem;
		padding-top: 0;
		border-top: 0;
	}
}

/* ==========================================================================
   15. La firma del análisis
   --------------------------------------------------------------------------
   Era un retrato a la izquierda, un «Written by» y un párrafo a 110
   caracteres por línea. Aquí se compone como una ficha de personaje:
   marco con esquinas, retrato con anillo encendido, nombre grande y una
   línea de datos con el número de análisis firmados.
   ========================================================================== */

.single .after-content .cb-signature {
	position: relative;
	display: grid;
	justify-items: center;
	max-width: min(100%, 680px);
	margin-inline: auto;
	padding: 2.75rem 2rem 2.25rem;
	border: 1px solid rgba(255, 255, 255, .09);
	border-radius: 12px;
	background:
		radial-gradient(90% 70% at 50% 0%, rgba(122, 92, 255, .16), transparent 62%),
		linear-gradient(180deg, rgba(255, 255, 255, .045), rgba(255, 255, 255, .012));
	text-align: center;
	overflow: hidden;
}

/* Las esquinas de la ficha: dos ángulos de neón en diagonal opuesta. */
.cb-signature__corner {
	position: absolute;
	width: 22px;
	height: 22px;
	pointer-events: none;
}

.cb-signature__corner--tl {
	top: 12px;
	left: 12px;
	border-top: 2px solid var(--cb-neon-cyan);
	border-left: 2px solid var(--cb-neon-cyan);
	border-radius: 4px 0 0 0;
}

.cb-signature__corner--br {
	right: 12px;
	bottom: 12px;
	border-right: 2px solid var(--cb-neon-pink);
	border-bottom: 2px solid var(--cb-neon-pink);
	border-radius: 0 0 4px 0;
}

/* --- El retrato ------------------------------------------------------------ */

.single .after-content .cb-signature__portrait {
	position: relative;
	width: 104px;
	max-width: 104px;
	margin: 0 0 1.25rem;
	padding: 4px;
	border-radius: 50%;
	/* Anillo de neón girando: es lo único que se mueve en toda la ficha. */
	background: conic-gradient(
		from 0deg,
		var(--cb-neon-cyan),
		var(--cb-neon-violet),
		var(--cb-neon-pink),
		var(--cb-neon-cyan)
	);
	animation: cb-signature-ring 9s linear infinite;
}

@keyframes cb-signature-ring {
	to { transform: rotate(360deg); }
}

.cb-signature__portrait a {
	display: block;
	border-radius: 50%;
	overflow: hidden;
	background: #0c0b18;
	/* El anillo gira; el retrato, no. */
	animation: cb-signature-ring 9s linear infinite reverse;
}

.single .after-content .cb-signature__portrait img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1;
	object-fit: cover;
	border-radius: 50%;
	margin: 0;
}

/* --- El cuerpo -------------------------------------------------------------- */

.single .after-content .cb-signature__body {
	width: 100%;
	max-width: none;
	margin: 0;
	text-align: center;
}

.single .after-content .cb-signature__eyebrow {
	margin: 0 0 .35rem;
	font-family: var(--body-font);
	font-size: .66rem;
	font-weight: 800;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--cb-neon-cyan);
}

.single .after-content .cb-signature__name {
	margin: 0 0 1rem;
	font-family: var(--body-font);
	font-size: clamp(1.45rem, 1.1rem + 1.1vw, 1.85rem);
	font-weight: 800;
	line-height: 1.15;
	letter-spacing: -.02em;
}

.single .after-content .cb-signature__name a {
	color: #fff;
	text-decoration: none;
	background: none;
	transition: text-shadow var(--cb-base) var(--cb-ease);
}

.single .after-content .cb-signature__name a:hover {
	text-shadow:
		-2px 0 rgba(255, 0, 94, .7),
		2px 0 rgba(0, 212, 255, .7);
}

.single .after-content .cb-signature__text {
	max-width: 52ch;
	margin: 0 auto;
	font-size: .95rem;
	line-height: 1.75;
	color: rgba(255, 255, 255, .68);
}

/* --- La línea de datos ------------------------------------------------------ */

.single .after-content .cb-signature__stats {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: .6rem 1rem;
	margin: 1.6rem 0 0;
	padding-top: 1.3rem;
	border-top: 1px dashed rgba(255, 255, 255, .12);
	width: 100%;
}

.cb-signature__stat {
	padding: .35rem .8rem;
	border: 1px solid var(--cb-hairline-strong);
	border-radius: 3px;
	font-family: var(--body-font);
	font-size: .68rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .55);
}

.cb-signature__stat b {
	font-weight: 800;
	font-variant-numeric: tabular-nums;
	color: var(--cb-neon-cyan);
}

.cb-signature__link {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	padding: .35rem .9rem;
	border: 1px solid rgba(255, 0, 94, .45);
	border-radius: 3px;
	background: none;
	text-decoration: none;
	font-family: var(--body-font);
	font-size: .68rem;
	font-weight: 800;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--cb-neon-rose);
	transition:
		background-color var(--cb-fast) var(--cb-ease),
		color var(--cb-fast) var(--cb-ease),
		gap var(--cb-fast) var(--cb-ease-out);
}

.cb-signature__link:hover,
.cb-signature__link:focus-visible {
	background: rgba(255, 0, 94, .14);
	color: #fff;
	gap: .7rem;
}

@media (max-width: 599px) {

	.single .after-content .cb-signature {
		padding: 2.25rem 1.25rem 1.9rem;
	}
}

@media (prefers-reduced-motion: reduce) {

	.single .after-content .cb-signature__portrait,
	.cb-signature__portrait a {
		animation: none;
	}
}

/* ==========================================================================
   16. La portada del artículo, como un tubo de rayos catódicos
   --------------------------------------------------------------------------
   Pedido: que el single-hero se lea como el hero de portada y como una
   pantalla CRT. La imagen se queda debajo; encima van las tres capas que
   hacen que una foto parezca un monitor de tubo —líneas de barrido,
   máscara de fósforos y abombamiento— más un parpadeo apenas perceptible
   y un barrido de encendido al cargar.

   Todo va en pseudoelementos sin eventos de ratón: el titular, las migas
   y la firma siguen siendo texto seleccionable y enfocable por encima.
   ========================================================================== */

.single-hero.cover .cover-wrapper {
	isolation: isolate;
}

/*
 * Líneas de barrido: exactamente las mismas que el hero de la portada
 * (criticabits-hero.css, .cb-hero__scanlines) — 2px transparentes, 2px al
 * 16% de negro, en `multiply` y al 55%. Antes aquí había una tríada de
 * fósforos RGB y un parpadeo que la portada no tiene; fuera, para que las
 * dos pantallas sean la misma pantalla.
 *
 * La declaración real vive en el bloque con prefijo `body` de más arriba,
 * que es el que gana en especificidad; aquí sólo se deja el rastro para
 * que no se vuelva a escribir dos veces lo mismo en dos sitios.
 */

/*
 * Capa 3: el abombamiento del tubo y el velo que hace legible el titular.
 * El tema ya usaba ::after para el velo; aquí se le suma la viñeta y un
 * resplandor frío en el borde, que es lo que delata a un CRT encendido.
 */
.single-hero.cover .cover-wrapper::after {
	/*
	 * Las paradas van referidas al borde inferior del hero, no al de la caja
	 * estirada. Con porcentajes planos, al añadir el derrame la parte oscura
	 * del velo se iba 288 px más abajo y el titular se quedaba sobre la foto
	 * a pelo: --cb-hero-h es el alto visible del hero, y las paradas se
	 * calculan sobre él para que el velo llegue a su máximo exactamente donde
	 * antes. De ahí hacia abajo se mantiene: es lo que hace legible el
	 * principio del artículo por encima de la mancha.
	 */
	--cb-hero-h: calc(100% - var(--cb-hero-bleed));
	background:
		radial-gradient(130% 120% at 50% calc(var(--cb-hero-h) * .42), transparent 46%, rgba(0, 0, 0, .55) 88%),
		linear-gradient(
			180deg,
			rgba(6, 5, 16, .1) 0%,
			rgba(6, 5, 16, .25) calc(var(--cb-hero-h) * .42),
			rgba(6, 5, 16, .62) calc(var(--cb-hero-h) * .68),
			rgba(6, 5, 16, .85) calc(var(--cb-hero-h) * .84),
			rgba(6, 5, 16, .96) var(--cb-hero-h),
			rgba(6, 5, 16, .96) 100%
		);
	box-shadow:
		inset 0 0 90px rgba(0, 212, 255, .12),
		inset 0 0 24px rgba(0, 0, 0, .7);
	z-index: 1;
}

/*
 * El refresco del tubo: la misma banda que baja por el hero de la portada
 * (.cb-hero__sweep), con sus mismos colores, su mismo 30% de alto y su
 * mismo ciclo de 7 segundos. Antes esto era un barrido de encendido que
 * pasaba una sola vez, y encima no se veía: el velo de las tarjetas del
 * listado, en enhance.css, le pisaba el fondo con más especificidad.
 */
/*
 * El selector va largo a propósito. style.css:2623 declara este mismo
 * pseudoelemento con `background: var(--cover-overlay-gradient)`, que es
 * un rgba(0,0,0,.3) plano, y suma cinco clases: ganaba, dejaba
 * background-image en `none` y el barrido corría sin nada que mover —sólo
 * paseaba una banda gris por la portada cada siete segundos—. Añadiendo
 * .thumbnail-wrapper esta llega a (0,5,2) y se lleva las dos cosas: la
 * imagen del degradado y el color de fondo, que hay que devolver a
 * transparente porque el del tema seguiría pintando.
 */
body .single-hero.cover .cover-wrapper .thumbnail-wrapper .post-thumbnail::after {
	content: "";
	position: absolute;
	inset: auto 0 auto 0;
	height: 30%;
	z-index: 3;
	pointer-events: none;
	background-color: transparent;
	background-image: linear-gradient(
		to bottom,
		rgba(0, 212, 255, 0) 0%,
		rgba(0, 212, 255, .05) 45%,
		rgba(255, 0, 94, .07) 50%,
		rgba(0, 212, 255, 0) 100%
	);
	animation: cb-crt-sweep 7s linear infinite;
}

@keyframes cb-crt-sweep {
	0%   { transform: translateY(-120%); opacity: 0; }
	12%  { opacity: 1; }
	88%  { opacity: 1; }
	100% { transform: translateY(430%); opacity: 0; }
}

.single-hero.cover .thumbnail-wrapper,
.single-hero.cover .post-thumbnail {
	position: relative;
}

/* La imagen, un punto más saturada y contrastada: es lo que hace que se
   lea como fósforo y no como fotografía. El brightness va aquí y no en
   --cover-brightness-filter porque este `filter` sustituye entero al del
   tema (style.css:2559) y dejaba el suyo sin efecto. */
.single-hero.cover .post-thumbnail img {
	filter: saturate(1.12) contrast(1.05) brightness(.78);
}

/* --- El borde inferior: de imagen a fondo de la web ------------------------
   El hero acababa en corte recto. La última franja del velo es
   rgba(6, 5, 14, .98), casi negra, y justo debajo empieza el degradado de
   la página: dos oscuros distintos pegados dan una costura de lado a lado
   de la pantalla.

   Ahora las capas del hero —la imagen con su velo y la viñeta del tubo— se
   desvanecen con una máscara hasta transparencia total, así que los últimos
   píxeles del bloque son literalmente el fondo del sitio y no hay línea que
   separe nada.

   El texto no lleva máscara: vive en .entry-wrapper, hermano de la imagen y
   no descendiente, así que titular, migas y firma siguen opacos. Encima
   ganan contraste, porque lo que tienen detrás deja de ser una fotografía
   y pasa a ser el violeta oscuro de la página.
   -------------------------------------------------------------------------- */

.single-hero.cover {
	/*
	 * Lo que la imagen se derrama por debajo del hero. En 1440 son 288 px:
	 * el titular y la firma siguen dentro del hero, y la mancha llega hasta
	 * la mitad de los primeros párrafos.
	 */
	--cb-hero-bleed: clamp(8rem, 20vw, 18rem);
}

.single-hero.cover .cover-wrapper {
	/*
	 * El desvanecido se mide desde abajo, no en porcentaje del alto: así el
	 * corte cae siempre en el mismo sitio respecto al derrame, y no se mueve
	 * cuando el titular ocupa dos líneas en vez de tres. Arranca 3rem por
	 * encima del borde del hero para que no se adivine dónde acaba la caja.
	 */
	/*
	 * --cb-hero-lift sube todas las paradas intermedias: el desvanecido
	 * arranca un 18% del alto de la caja antes y llega igual de limpio a
	 * transparente abajo, así que la disolución es más larga y no se
	 * adivina dónde empieza.
	 */
	--cb-hero-lift: 18%;
	--cb-hero-fade: linear-gradient(
		180deg,
		#000 0%,
		#000 calc(100% - var(--cb-hero-bleed) - 3rem - var(--cb-hero-lift)),
		rgba(0, 0, 0, .88) calc(100% - var(--cb-hero-bleed) * .80 - var(--cb-hero-lift)),
		rgba(0, 0, 0, .62) calc(100% - var(--cb-hero-bleed) * .58 - var(--cb-hero-lift)),
		rgba(0, 0, 0, .34) calc(100% - var(--cb-hero-bleed) * .36 - var(--cb-hero-lift)),
		rgba(0, 0, 0, .12) calc(100% - var(--cb-hero-bleed) * .16 - var(--cb-hero-lift)),
		transparent 100%
	);
}

/*
 * El derrame. La imagen deja de estar encajada en el hero y baja por
 * detrás del principio del artículo, como en back2oldgames: no es un fondo
 * fijo —hace scroll con la página y se acaba—, es la misma portada
 * estirada hacia abajo hasta disolverse.
 *
 * Hace falta soltar el `overflow: hidden` del envoltorio, que es lo que la
 * recortaba, y anular el `inset: 0` + `height: 100%` que le pone la regla
 * con prefijo `body` de más arriba: por eso este bloque también lo lleva.
 *
 * El velo del tubo se estira igual. Si se quedase en la caja original, la
 * parte derramada saldría sin velo, más clara que el hero justo debajo del
 * hero, que es exactamente el escalón que se quiere evitar.
 */
body .single-hero.cover .cover-wrapper {
	overflow: visible;
}

body .single-hero.cover .thumbnail-wrapper,
body .single-hero.cover .cover-wrapper::after {
	inset: 0 0 calc(var(--cb-hero-bleed) * -1) 0;
	height: auto;
}

/* El barrido de encendido se mueve con translateY(±100%): sin recorte, con
   el envoltorio ya en `overflow: visible`, asomaría por encima del hero. */
body .single-hero.cover .thumbnail-wrapper {
	overflow: hidden;
}

.single-hero.cover .thumbnail-wrapper,
.single-hero.cover .cover-wrapper::after {
	-webkit-mask-image: var(--cb-hero-fade);
	mask-image: var(--cb-hero-fade);
}

@media (prefers-reduced-motion: reduce) {

	.single-hero.cover .cover-wrapper::before,
	.single-hero.cover .cover-wrapper .post-thumbnail::after {
		animation: none;
	}

	.single-hero.cover .cover-wrapper .post-thumbnail::after {
		display: none;
	}
}

/* ==========================================================================
   17. Móvil: la entrada por debajo de 1024 px
   --------------------------------------------------------------------------
   Todo lo de este apartado va dentro de consultas `max-width`. En
   escritorio no cambia nada.

   El diagnóstico de partida, medido a 360 / 390 / 414 / 768 px:

   1. TRES EJES VERTICALES DISTINTOS. `.wrap` reserva 30 px de canalón en
      móvil, pero la rejilla del artículo usa su propio `--cb-edge`
      —clamp(1rem, 4vw, 2.5rem), o sea 16 px por debajo de 400— y el
      envoltorio del titular añade otros 16 encima de los 30. Medido a
      390 px: el titular arranca en x=46, el texto del cuerpo en x=16 y la
      ficha de cierre, la firma y los comentarios en x=30. Tres bordes
      izquierdos escalonados en la misma pantalla; a 768 px eran 61, 44
      y 30. Es el defecto que más se nota al bajar por la entrada.

   2. LAS MIGAS OCUPABAN TRES RENGLONES. El último tramo es el título
      completo de la entrada, que a 390 px medía 101 px de alto —una
      chapa de tres líneas— y su borde superior quedaba en y=52, por
      debajo de la cabecera, que termina en y=62: la primera línea
      salía cortada. Y repite palabra por palabra el titular que hay
      cuatro centímetros más abajo.

   3. RITMO PENSADO PARA 900 px DE COLUMNA. `--cb-s8` son 88 px: a 390 px
      cada h2 abría un hueco del 10 % de la pantalla. Con la interlínea
      a 1,9 —justificada en escritorio, donde la línea tiene 88
      caracteres— y 39 caracteres por línea en móvil, la entrada del MSI
      medía 12.685 px de alto a 390 px y 13.259 a 360.

   4. TOQUES POR DEBAJO DE 44 px: etiquetas de 27,3 px de alto, iconos de
      compartir de 34×34 y el enlace de la firma en 34,9.

   5. EL BOTÓN DE COMPRA A 28 px DE CUERPO: tres renglones y 138 px de
      alto en una caja de 328.
   ========================================================================== */

@media (max-width: 1023px) {

	/* --- Un solo eje vertical ---------------------------------------------
	   El canalón del artículo pasa a valer lo mismo que el relleno de
	   `.wrap` (30 px), que es el que ya usan la cabecera, la ficha de
	   cierre, la firma y los comentarios. A 360 px la columna de texto
	   queda en 300 px, o sea 36 caracteres por línea: dentro de la medida
	   cómoda de lectura en móvil (35-45).

	   Las imágenes «a sangre» siguen saliendo a sangre: su margen negativo
	   se calcula con esta misma variable, así que a 360 px van de 0 a 360.
	   ---------------------------------------------------------------------- */
	.cb-article {
		--cb-edge: 30px;
	}

	/* El envoltorio del titular ya está dentro de los 30 px de `.wrap`:
	   su relleno lateral sólo servía para sumar un tercer escalón.

	   Y el relleno de arriba sube: en móvil el hero se mete 30 px por
	   debajo de la cabecera (margen negativo del tema), y con 20 px de
	   relleno la chapa de las migas arrancaba en y=52 mientras la
	   cabecera termina en y=62 —los diez primeros píxeles de la chapa
	   salían tapados—. Con este valor la chapa arranca en y=76. */
	.single-hero.cover .entry-wrapper,
	.page .single-hero.cover .entry-wrapper {
		padding-inline: 0;
		padding-top: clamp(2.75rem, 9vw, 3.5rem);
	}

	/* --- Las migas, sólo la ruta ------------------------------------------
	   Se retiran los dos últimos elementos de la lista —el separador y el
	   tramo `.last`, que es el título de la entrada— y la chapa vuelve a
	   una sola línea: de 101 px de alto a 27. La ruta que informa
	   (Portada » Categoría) se queda entera, y el título sigue estando
	   donde debe, en el <h1> que hay justo debajo.

	   `nth-last-of-type` cuenta <span> entre hermanos, así que vale tanto
	   para el marcado de Rank Math (span.separator ×2 + span.last) como
	   para el de reserva de seo.php (span.cb-breadcrumbs__sep ×2 +
	   span[aria-current]).
	   ---------------------------------------------------------------------- */
	.single-hero.cover .cb-breadcrumbs p > span:nth-last-of-type(-n+2),
	.single-hero.cover .cb-breadcrumbs > span:nth-last-of-type(-n+2) {
		display: none;
	}

	/*
	 * Y la chapa vuelve a ceñirse al texto. El apartado 11 ya la declara
	 * `inline-block`, pero algo con más peso la deja en bloque y a 768 px
	 * el resultado es una banda gris de 708 px de ancho cruzando la
	 * fotografía con «Portada » Componentes de PC» pegado a la izquierda:
	 * la chapa está para que se lean las migas, no para tapar la portada.
	 *
	 * Y el `display: inline-block` del apartado 11 no servía de nada: el
	 * envoltorio del titular es un contenedor flex, y un contenedor flex
	 * convierte a bloque el `display` de todos sus hijos. Lo que encoge la
	 * caja hasta su contenido es `width: fit-content`, que sí funciona
	 * siendo elemento flexible.
	 */
	.single-hero.cover .entry-wrapper .cb-breadcrumbs,
	.single-hero.cover .entry-wrapper .cb-breadcrumbs > nav {
		width: fit-content;
		max-width: 100%;
	}

	/* Rank Math mete la ruta dentro de un <p>, que trae el margen inferior
	   de los párrafos: 13 px de chapa vacía por debajo del texto. */
	.single-hero.cover .cb-breadcrumbs nav > p {
		margin: 0;
	}

	/* --- La escala de espaciado, un escalón más corta ----------------------
	   Los mismos saltos, proporcionalmente iguales entre sí, pero medidos
	   para una pantalla de 844 px de alto en lugar de un monitor. El aire
	   antes de un h2 pasa de 88 a 56 px, el de una figura de 64 a 44.
	   ---------------------------------------------------------------------- */
	.cb-article {
		--cb-s5: 1.5rem;
		--cb-s6: 2rem;
		--cb-s7: 2.75rem;
		--cb-s8: 3.5rem;
		--cb-s9: 4.5rem;
	}
}

@media (max-width: 767px) {

	/* --- Interlineado -----------------------------------------------------
	   1,9 se pidió para la columna de escritorio, donde la línea tiene 88
	   caracteres y el ojo necesita ayuda para encontrar el renglón
	   siguiente. A 36 caracteres no la necesita: ese mismo 1,9 sólo
	   separa palabras que ya están juntas y estira la entrada. Con 1,72 el
	   párrafo se lee como un bloque y la entrada del MSI baja de 12.685 a
	   ~11.400 px a 390 px.
	   ---------------------------------------------------------------------- */
	.cb-article .entry-content {
		line-height: 1.72;
	}

	.cb-article .entry-content.entry-content p,
	.cb-article .entry-content.entry-content li {
		line-height: 1.72;
	}

	/* --- Tablas -----------------------------------------------------------
	   Las celdas heredaban los 17 px del cuerpo con 12 px de relleno: en
	   una columna de 300 px, «Compatibilidad» y «Intel LGA 1700 / 1200 /
	   115× / AMD AM5 / AM4» quedaban en dos columnas de 150 px y cuatro
	   renglones por fila. A 15 px y con el relleno ajustado, la misma
	   tabla cabe sin desplazamiento lateral.
	   ---------------------------------------------------------------------- */
	.cb-article .entry-content table th,
	.cb-article .entry-content table td {
		padding: .6rem .65rem;
		font-size: .9375rem;
		line-height: 1.45;
	}

	/* --- Citas ------------------------------------------------------------
	   `padding: var(--cb-s5) var(--cb-s6)` son 32 y 44 px: en una caja de
	   328 px se comían 88 px de ancho y dejaban 240 px de texto, o sea 22
	   caracteres por línea. Medido en la entrada de Majorana: la cita de
	   Krysta Svore salía en siete renglones de tres palabras. Aquí el
	   relleno lateral baja al vertical y el cuerpo de la cita deja de
	   competir con el titular.
	   ---------------------------------------------------------------------- */
	/* La clase repetida no es adorno: los estilos globales del bloque
	   —el <style> que WordPress imprime a partir de theme.json— traen
	   `blockquote.wp-block-quote.is-style-large.is-layout-flow.wp-block-quote-is-layout-flow
	   { padding: 2rem }`, cinco clases y un elemento. Para pasar por
	   delante sin !important hace falta empatarle. */
	.cb-article .entry-content.entry-content > blockquote,
	.cb-article .entry-content.entry-content > blockquote.wp-block-quote.wp-block-quote,
	.cb-article.cb-article .entry-content.entry-content > blockquote.fondito.fondito {
		padding: var(--cb-s5) var(--cb-s4);
	}

	/*
	 * Y no sólo las `.fondito`. Las citas de la entrada de Majorana son
	 * `.wp-block-quote.is-style-large` a secas: medidas a 390 px daban
	 * 25,57 px de cuerpo y 44 de interlineado dentro de una caja de 330
	 * con 32 px de relleno, o sea 266 px de texto y DIECISIETE caracteres
	 * por línea. «No estamos construyendo una demo» salía en siete
	 * renglones de tres palabras.
	 */
	.cb-article .entry-content > blockquote p,
	.cb-article .entry-content blockquote.wp-block-quote.is-style-large p,
	.cb-article .entry-content > blockquote.fondito p,
	.cb-article .entry-content .fondito.wp-block-quote.is-style-large p {
		font-size: 1.1875rem;
		line-height: 1.5;
	}

	/* --- Botones de compra ------------------------------------------------
	   El estilo numerado del editor los compone a 28 px de cuerpo. En una
	   caja de 328 px eso es «COMPRA UNA RTX 5070 EN AMAZON» en tres
	   renglones y 138 px de alto: parece un cartel, no un botón.
	   ---------------------------------------------------------------------- */
	.cb-article .entry-content .wp-block-button.wp-block-button > a[href] {
		font-size: 1.0625rem;
		line-height: 1.35;
	}

}

@media (max-width: 599px) {

	/* --- Capitular --------------------------------------------------------
	   3,2 em sobre 17 px son 54,5 px de letra: con el «¿» que ::first-letter
	   arrastra delante, la caja flotante medía ~95 px y dejaba los tres
	   primeros renglones en 24 caracteres. A 2,5 em sigue leyéndose como
	   capitular y el párrafo arranca con su medida.
	   ---------------------------------------------------------------------- */
	.cb-article .entry-content p.has-drop-cap::first-letter {
		font-size: 2.5em;
	}

	/* --- El recuento de la ficha ------------------------------------------
	   Iba centrado —lo hereda de `.entry-meta`— mientras el rótulo
	   «Etiquetas» y las propias etiquetas iban a la izquierda: dos ejes
	   dentro de la misma caja.
	   ---------------------------------------------------------------------- */
	.cb-article .single-hentry-footer .tfm-view-count {
		text-align: left;
	}

	/* --- La firma ---------------------------------------------------------
	   La ficha va centrada, y con ella el párrafo de la biografía: nueve
	   renglones de ~30 caracteres centrados, cada uno empezando en un sitio
	   distinto. Centrado funciona en un rótulo de tres palabras, no en un
	   párrafo. El nombre, el epígrafe y los datos siguen centrados.
	   ---------------------------------------------------------------------- */
	.single .after-content .cb-signature__text {
		text-align: left;
		max-width: none;
	}

	/* El nombre del autor es un enlace de 178×29 px. Se le da el área de
	   toque con relleno y se le quita el alto con un margen negativo del
	   mismo valor: la ficha se ve exactamente igual y el dedo tiene sus
	   45 px. Se puede hacer aquí porque ni encima ni debajo hay otro
	   enlace al que robarle la pulsación. */
	.single .after-content .cb-signature__name a {
		display: inline-block;
		padding-block: .5rem;
		margin-block: -.5rem;
	}
}

/* --------------------------------------------------------------------------
   La ficha de cierre, hasta la tableta
   --------------------------------------------------------------------------
   Va hasta 1023 px y no hasta 767 porque a 768 px justos el defecto es
   peor que en el móvil: la ficha sigue en dos columnas
   —`minmax(0,1fr) auto`— y la columna de la derecha se la comen los doce
   iconos de compartir más su rótulo. Medido a 768 px: la caja del
   recuento se quedaba en 78 px de ancho con 97 px de contenido, o sea
   «920 Visualizaciones» saliéndose de su propia celda.
   -------------------------------------------------------------------------- */

@media (max-width: 1023px) {

	.cb-article .single-hentry-footer {
		grid-template-columns: minmax(0, 1fr);
	}

	.cb-article .single-hentry-footer .tfm-view-count,
	.cb-article .single-hentry-footer .tfm-share-wrapper {
		grid-column: 1;
		justify-content: flex-start;
	}

	/* En móvil el tema centra el recuento —«1.2k» sobre «Visualizaciones»,
	   58 px de alto— mientras el rótulo «Etiquetas» y las etiquetas van a
	   la izquierda: dos ejes dentro de la misma ficha. En escritorio el
	   mismo bloque ya va alineado a la izquierda; aquí sólo se le quita el
	   centrado.

	   Con `!important`, y no por comodidad: style.css:4895 declara
	   `align-items: center !important` para este mismo selector dentro de
	   su consulta de móvil. Contra un `!important` no hay especificidad
	   que valga; la única alternativa sería editar style.css, que es un
	   tema de terceros. */
	.cb-article .single-hentry-footer .tfm-view-count {
		align-items: flex-start !important;
		text-align: left;
	}


	.cb-article .single-hentry-footer .tfm-share-wrapper {
		margin-top: .9rem;
		padding-top: 0;
		border-top: 0;
	}

	/* Toques: medidos a 390 px, las etiquetas daban 27,3 px de alto y los
	   iconos de compartir 34×34. El mínimo es 44, y una tableta se toca
	   igual que un teléfono. */
	.cb-article .single-hentry-footer .post-tags a {
		min-height: 44px;
		padding-block: .55rem;
	}

	/*
	 * Y salían escalonados: `.tfm-social-icons` lleva
	 * `justify-content: flex-end`, así que el último renglón —dos iconos de
	 * los doce— se pegaba al borde derecho mientras los otros dos
	 * empezaban a la izquierda. En rejilla con columnas iguales las filas
	 * quedan a plomo y cada icono llega a los 44 px.
	 */
	.cb-article .single-hentry-footer .tfm-social-icons {
		display: grid;
		grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
		gap: .5rem;
		justify-content: start;
	}

	.cb-article .single-hentry-footer .tfm-social-icon a {
		width: 100%;
		min-width: 44px;
		height: 44px;
	}

	/* El rótulo «Compartir» dejaba de caber en la misma línea que los
	   iconos, así que pasa a rotular la fila desde arriba. Ojo: el tema lo
	   emite como un <li> DENTRO de la propia lista de iconos, así que en
	   rejilla se comía la primera celda y dejaba la primera fila con
	   cuatro iconos, la segunda con cinco y la tercera con tres. Ocupando
	   la fila entera, las filas salen a plomo. */
	.cb-article .single-hentry-footer .tfm-share-wrapper,
	.cb-article .single-hentry-footer .tfm-share {
		display: block;
	}

	.cb-article .single-hentry-footer .tfm-social-icons .share-text,
	.cb-article .single-hentry-footer .share-text {
		grid-column: 1 / -1;
		display: block;
		margin: 0 0 .55rem;
		/* Heredaba el centrado del bloque de compartir y a 768 px salía en
		   mitad de la ficha mientras «Etiquetas» y el recuento van a la
		   izquierda. */
		text-align: left;
	}

	/* El botón de la firma medía 34,9 px de alto, también a 768. */
	.single .after-content .cb-signature__link {
		min-height: 44px;
		padding-block: .55rem;
	}
}
