Mejoras de accesibilidad: tipografía Atkinson Hyperlegible + opción de fondo negro/alto contraste #196

Closed
opened 2026-08-08 18:30:06 +00:00 by rafa · 7 comments
Owner

Labels: area:aesthetic, improvement, accesibilidad

Objetivo

Fe Adulta tiene un público con mucha proporción de gente mayor, y hay comentarios de Beta Feedback (#91) sobre falta de legibilidad — negrita que no se lee bien y texto sobre fondo blanco poco legible, entre otros que Rafa recuerda pero aún no están citados aquí textualmente (pendiente de localizar el texto exacto en el CPT fea_feedback, sin acceso directo desde esta sesión). En la misma línea que el resto de mejoras de usabilidad de #195, pensadas para ese mismo público.

TODO: enlazar aquí las citas literales de feedback sobre negrita y fondo blanco en cuanto se recuperen.

Propuesta 1 — Tipografía: Atkinson Hyperlegible

Cambiar (o dar como opción) la fuente del cuerpo de texto a Atkinson Hyperlegible (Braille Institute, open source, OFL), diseñada específicamente para maximizar la legibilidad en baja visión: formas de letra muy diferenciadas (I/l/1, O/0), buen espaciado.

  • Aplicar como fuente por defecto del body/artículos, o como alternativa activable (ver propuesta 3).
  • Cargar vía @font-face self-hosted (no CDN externo, consistente con cómo se gestionan ya fuentes/assets del tema) o wp_enqueue_style.
  • Revisar que no rompe layouts que dependen de anchura de fuente (tarjetas, portada) — mismo tipo de cautela que con Astra e inline styles (ver notas de #35, tipografía de h2 de portada).

Propuesta 2 — Modo fondo negro / alto contraste

Añadir un toggle de modo oscuro / fondo negro persistente (similar a un dark mode), pensado sobre todo como ayuda de contraste para lectura prolongada, no solo estético:

  • Toggle visible y simple (icono en cabecera o junto al selector de idioma), estado guardado en localStorage (mismo patrón ya usado por el widget de Beta Feedback, #91).
  • Contraste AA/AAA en texto sobre fondo oscuro, cuidando también el reproductor de audio y las tarjetas de artículo.
  • Revisar el outline de foco (#104, ya rediseñado) para que siga siendo visible en modo oscuro.

Alcance (decidido, 2026-08-08)

Se descarta el control agrupado tipo "A+ / Aa / 🌙": queda en dos cosas simples, sin más superficie de UI que la necesaria:

  1. Toggle claro/oscuro (fondo claro por defecto ↔ fondo oscuro/negro), un único control.
  2. Cambio de tipografía global a Atkinson Hyperlegible — no opcional/activable, se sustituye directamente la fuente actual. Sin selector de tamaño de letra por ahora.

Relacionado

  • #91 — mecanismo de Beta Feedback (👍/👎ᐩcomentario, CPT fea_feedback), útil para recoger reacciones reales una vez desplegado esto.
  • #195 — issue hermano de usabilidad (buscador/navegación/ayudas integradas).

Criterios de aceptación

  • Atkinson Hyperlegible disponible y probada en al menos portada + single de artículo.
  • Toggle de fondo negro/alto contraste funcional y persistente entre páginas.
  • Contraste de texto verificado (no solo estético) en modo oscuro.
  • No rompe layouts existentes (portada, tarjetas, reproductor de audio).
**Labels:** area:aesthetic, improvement, accesibilidad ## Objetivo Fe Adulta tiene un público con mucha proporción de gente mayor, y hay comentarios de Beta Feedback (#91) sobre falta de legibilidad — negrita que no se lee bien y texto sobre fondo blanco poco legible, entre otros que Rafa recuerda pero aún no están citados aquí textualmente (pendiente de localizar el texto exacto en el CPT `fea_feedback`, sin acceso directo desde esta sesión). En la misma línea que el resto de mejoras de usabilidad de #195, pensadas para ese mismo público. **TODO: enlazar aquí las citas literales de feedback sobre negrita y fondo blanco en cuanto se recuperen.** ## Propuesta 1 — Tipografía: Atkinson Hyperlegible Cambiar (o dar como opción) la fuente del cuerpo de texto a **Atkinson Hyperlegible** (Braille Institute, open source, OFL), diseñada específicamente para maximizar la legibilidad en baja visión: formas de letra muy diferenciadas (I/l/1, O/0), buen espaciado. - Aplicar como fuente por defecto del `body`/artículos, o como alternativa activable (ver propuesta 3). - Cargar vía `@font-face` self-hosted (no CDN externo, consistente con cómo se gestionan ya fuentes/assets del tema) o `wp_enqueue_style`. - Revisar que no rompe layouts que dependen de anchura de fuente (tarjetas, portada) — mismo tipo de cautela que con Astra e inline styles (ver notas de #35, tipografía de h2 de portada). ## Propuesta 2 — Modo fondo negro / alto contraste Añadir un toggle de **modo oscuro / fondo negro** persistente (similar a un dark mode), pensado sobre todo como ayuda de contraste para lectura prolongada, no solo estético: - Toggle visible y simple (icono en cabecera o junto al selector de idioma), estado guardado en `localStorage` (mismo patrón ya usado por el widget de Beta Feedback, #91). - Contraste AA/AAA en texto sobre fondo oscuro, cuidando también el reproductor de audio y las tarjetas de artículo. - Revisar el outline de foco (#104, ya rediseñado) para que siga siendo visible en modo oscuro. ## Alcance (decidido, 2026-08-08) Se descarta el control agrupado tipo "A+ / Aa / 🌙": queda en dos cosas simples, sin más superficie de UI que la necesaria: 1. **Toggle claro/oscuro** (fondo claro por defecto ↔ fondo oscuro/negro), un único control. 2. **Cambio de tipografía global a Atkinson Hyperlegible** — no opcional/activable, se sustituye directamente la fuente actual. Sin selector de tamaño de letra por ahora. ## Relacionado - #91 — mecanismo de Beta Feedback (👍/👎ᐩcomentario, CPT `fea_feedback`), útil para recoger reacciones reales una vez desplegado esto. - #195 — issue hermano de usabilidad (buscador/navegación/ayudas integradas). ## Criterios de aceptación - [ ] Atkinson Hyperlegible disponible y probada en al menos portada + single de artículo. - [ ] Toggle de fondo negro/alto contraste funcional y persistente entre páginas. - [ ] Contraste de texto verificado (no solo estético) en modo oscuro. - [ ] No rompe layouts existentes (portada, tarjetas, reproductor de audio).
Author
Owner

Plan de implementación — pendiente de revisión

Evidencia de producción

Fuente correcta: producción feadulta.com, CPT fea_feedback (265 registros; 84 con comentario). No la BBDD local.

#54413: “Las letras son muy finas sobre fondo blanco y son dificiles de distinguir.”
#54816: “¿Podría ser la letra un poco más oscura?”
#54828: “Prefiero la letra en negrita. Antes lo leía mejor...”
#55467: “Los Artículos y Comentarios usan un Tipo de letra en la que no se distingue en tre negrita y normal ¿no podía usarse Arial en la que se distingue bien? (u otra)”
#55621/#55622: “¿Se puede poner el fondo negro para facilitar la lectura?”

También #47266: “Para mi es demasiado blanca. me deslumbra un poco.” El issue queda, por tanto, respaldado por feedback real.

Alcance

  1. Atkinson Hyperlegible global, self-hosted, con pesos normal y bold reales. Sin selector, sin cambio global de tamaño y sin zoom.
  2. Un único toggle persistente claro ↔ oscuro/alto contraste; claro por defecto.
  3. Sin panel de accesibilidad, A+/Aa ni cambios de contenido.

Ejecución propuesta

  1. Comparar los mu-plugins versionados con /var/www/html/wp-content/mu-plugins/ de producción: la wiki indica que éste es canónico si el local quedó incompleto. Inventariar Astra, FSE single, portada, Smart Slider, audio, selector de idioma, Beta Feedback y foco.
  2. Añadir los WOFF2 OFL con @font-face y font-display: swap; aplicar familia global sin tocar escala ni layout.
  3. Crear un mu-plugin aislado para tema: atributo/clase raíz, variables de color, localStorage, bootstrap temprano anti-flash y botón accesible (aria-pressed) en cabecera.
  4. Ajustar sólo componentes que no hereden la paleta: navegación, selector de idioma, portada/tarjetas, single FSE, formularios, Beta Feedback, reproductor, Smart Slider y foco. Respetar Astra: inline styles cuando sea necesario; no introducir grid/flex en bloques FSE.
  5. QA local: portada, single, audio, búsqueda e idiomas; desktop/móvil; persistencia, teclado/foco, contraste AA y regresión de Smart Slider. Ejecutar E2E Tier 1 y adjuntar capturas/resultados.

Orden

Inventario → implementación y QA local → diff y evidencia en este issue → solo con aprobación explícita, documentación y preparación de producción.

¿OK para pasar al inventario?

## Plan de implementación — pendiente de revisión ### Evidencia de producción Fuente correcta: producción `feadulta.com`, CPT `fea_feedback` (265 registros; 84 con comentario). No la BBDD local. > #54413: “Las letras son muy finas sobre fondo blanco y son dificiles de distinguir.” > #54816: “¿Podría ser la letra un poco más oscura?” > #54828: “Prefiero la letra en negrita. Antes lo leía mejor...” > #55467: “Los Artículos y Comentarios usan un Tipo de letra en la que no se distingue en tre negrita y normal ¿no podía usarse Arial en la que se distingue bien? (u otra)” > #55621/#55622: “¿Se puede poner el fondo negro para facilitar la lectura?” También #47266: “Para mi es demasiado blanca. me deslumbra un poco.” El issue queda, por tanto, respaldado por feedback real. ### Alcance 1. Atkinson Hyperlegible global, self-hosted, con pesos normal y bold reales. Sin selector, sin cambio global de tamaño y sin `zoom`. 2. Un único toggle persistente claro ↔ oscuro/alto contraste; claro por defecto. 3. Sin panel de accesibilidad, A+/Aa ni cambios de contenido. ### Ejecución propuesta 1. Comparar los mu-plugins versionados con `/var/www/html/wp-content/mu-plugins/` de producción: la wiki indica que éste es canónico si el local quedó incompleto. Inventariar Astra, FSE single, portada, Smart Slider, audio, selector de idioma, Beta Feedback y foco. 2. Añadir los WOFF2 OFL con `@font-face` y `font-display: swap`; aplicar familia global sin tocar escala ni layout. 3. Crear un mu-plugin aislado para tema: atributo/clase raíz, variables de color, `localStorage`, bootstrap temprano anti-flash y botón accesible (`aria-pressed`) en cabecera. 4. Ajustar sólo componentes que no hereden la paleta: navegación, selector de idioma, portada/tarjetas, single FSE, formularios, Beta Feedback, reproductor, Smart Slider y foco. Respetar Astra: inline styles cuando sea necesario; no introducir grid/flex en bloques FSE. 5. QA local: portada, single, audio, búsqueda e idiomas; desktop/móvil; persistencia, teclado/foco, contraste AA y regresión de Smart Slider. Ejecutar E2E Tier 1 y adjuntar capturas/resultados. ### Orden Inventario → implementación y QA local → diff y evidencia en este issue → solo con aprobación explícita, documentación y preparación de producción. ¿OK para pasar al inventario?
Author
Owner

Implementado en local — pendiente de revisión

Rama feat/accesibilidad-196 (push hecho, aún sin PR). Mu-plugin nuevo mu-plugins/fea-accesibilidad.php, sin tocar ningún otro fichero salvo la fila del README.

Qué hace

  1. Atkinson Hyperlegible (Braille Institute, OFL) self-hosted — descargada de gstatic (mismo binario que sirve Google Fonts, sin CDN externo en runtime), subset latin (cubre acentos/ñ/¿¡ del español), pesos regular+bold reales. Sustituye la fuente del body sin selector ni opción — el menú (fea-ui.php, #95) conserva su sans de UI a propósito por especificidad.
  2. Toggle claro/oscuro persistente (localStorage), botón 🌙/☀️ inyectado por JS junto al selector de idioma en el header (mismo patrón que fea-homepage.php usa para el selector, sin tocar el template FSE). Anti-flash: script inline en wp_head prioridad 1 que fija el atributo antes de pintar.
  3. color-scheme: dark para que inputs/audio/scrollbars nativos se oscurezcan solos, más overrides puntuales donde el sitio fija colores claros a mano: hero de portada, tarjetas de autor, selector de idioma, buscador móvil, barra de Beta Feedback y barra de consentimiento de cookies.
  4. Acento más claro (#e8899e) solo en modo oscuro para enlaces/foco — el carmesí de marca #8b1a2e da ~1.8:1 de contraste sobre el fondo casi negro, muy por debajo de AA. Fondo #0d0d0d/texto #ececec ≈ 15.8:1.

Hallazgo de inventario (paso 1 del plan)

El WP local (docker wordpress-web) tenía prácticamente todos los mu-plugins versionados ausentes (wp-content/mu-plugins/ solo conservaba fea-support-campaign/) — confirma justo lo que preveía este comentario ("si el local quedó incompleto, prod es canónico"). Los he restaurado copiando mu-plugins/*.php del repo (deploy, no cambio de código) para poder probar nada roto. Si te suena a algo que ya sabías, perdona la redundancia; si no, puede valer la pena investigar por qué se perdieron (¿rebuild del contenedor sin volumen persistente en esa carpeta?).

QA local (Playwright, docker wordpress-web puerto 8081)

Portada, tarjetas de autor y single de artículo, claro y oscuro — capturas adjuntas. Sin errores PHP en docker logs.

home-light
home-dark
home-cards-dark
single-light
single-dark

Sin cubrir / a revisar

  • Smart Slider (n2-ss) no se ha reskinado — sus slides son imágenes propias con su chrome propio; no se ha tocado por riesgo de regresión (igual que avisa el plan). No se ve mal en las capturas porque el hero-band ya se oscurece alrededor, pero no lo he revisado a fondo en todos los sliders del sitio.
  • No he probado en EN/FR/IT/PT ni en móvil todavía.
  • Falta AA formal con una herramienta (axe/Lighthouse) en vez de mi cálculo manual de contraste.

Siguiente paso

Si te parece bien lo que ves, reviso móvil+idiomas y dejo el PR abierto contra main. Nada sube a producción hasta que me digas que sí.

## Implementado en local — pendiente de revisión Rama `feat/accesibilidad-196` (push hecho, aún sin PR). Mu-plugin nuevo `mu-plugins/fea-accesibilidad.php`, sin tocar ningún otro fichero salvo la fila del README. ### Qué hace 1. **Atkinson Hyperlegible** (Braille Institute, OFL) self-hosted — descargada de gstatic (mismo binario que sirve Google Fonts, sin CDN externo en runtime), subset `latin` (cubre acentos/ñ/¿¡ del español), pesos regular+bold reales. Sustituye la fuente del `body` sin selector ni opción — el menú (fea-ui.php, #95) conserva su sans de UI a propósito por especificidad. 2. **Toggle claro/oscuro** persistente (`localStorage`), botón 🌙/☀️ inyectado por JS junto al selector de idioma en el header (mismo patrón que `fea-homepage.php` usa para el selector, sin tocar el template FSE). Anti-flash: script inline en `wp_head` prioridad 1 que fija el atributo antes de pintar. 3. `color-scheme: dark` para que inputs/audio/scrollbars nativos se oscurezcan solos, más overrides puntuales donde el sitio fija colores claros a mano: hero de portada, tarjetas de autor, selector de idioma, buscador móvil, barra de Beta Feedback y barra de consentimiento de cookies. 4. Acento más claro (`#e8899e`) solo en modo oscuro para enlaces/foco — el carmesí de marca `#8b1a2e` da ~1.8:1 de contraste sobre el fondo casi negro, muy por debajo de AA. Fondo `#0d0d0d`/texto `#ececec` ≈ 15.8:1. ### Hallazgo de inventario (paso 1 del plan) El WP local (`docker` `wordpress-web`) tenía **prácticamente todos los mu-plugins versionados ausentes** (`wp-content/mu-plugins/` solo conservaba `fea-support-campaign/`) — confirma justo lo que preveía este comentario ("si el local quedó incompleto, prod es canónico"). Los he restaurado copiando `mu-plugins/*.php` del repo (deploy, no cambio de código) para poder probar nada roto. Si te suena a algo que ya sabías, perdona la redundancia; si no, puede valer la pena investigar por qué se perdieron (¿rebuild del contenedor sin volumen persistente en esa carpeta?). ### QA local (Playwright, docker `wordpress-web` puerto 8081) Portada, tarjetas de autor y single de artículo, claro y oscuro — capturas adjuntas. Sin errores PHP en `docker logs`. ![home-light](https://gitea.feadulta.com/attachments/1a4691dc-4e5d-4040-b5c0-ed3965631cde) ![home-dark](https://gitea.feadulta.com/attachments/ce21d3b7-6e82-4a91-a8ee-41950c022c54) ![home-cards-dark](https://gitea.feadulta.com/attachments/3892c5d9-2d71-44b4-8388-d480905b42ab) ![single-light](https://gitea.feadulta.com/attachments/fa9b6fdd-b2c4-4c36-be0e-c19fdc91c514) ![single-dark](https://gitea.feadulta.com/attachments/043a3f8e-4949-441c-bf5b-b12c02c9a0c9) ### Sin cubrir / a revisar - **Smart Slider** (n2-ss) no se ha reskinado — sus slides son imágenes propias con su chrome propio; no se ha tocado por riesgo de regresión (igual que avisa el plan). No se ve mal en las capturas porque el hero-band ya se oscurece alrededor, pero no lo he revisado a fondo en todos los sliders del sitio. - No he probado en EN/FR/IT/PT ni en móvil todavía. - Falta AA formal con una herramienta (axe/Lighthouse) en vez de mi cálculo manual de contraste. ### Siguiente paso Si te parece bien lo que ves, reviso móvil+idiomas y dejo el PR abierto contra `main`. **Nada sube a producción hasta que me digas que sí.**
Author
Owner

Fix de seguimiento (dark mode) — Codix

Commit 51ae723 en la misma rama feat/accesibilidad-196 (push hecho por Claudix, Codix no tenía credenciales de Gitea en su sesión):

  • Buscador del header: fondo/borde oscuros ahora en el wrapper, input y botón (.wp-block-search__inside-wrapper/__input/__button), no solo input genérico.
  • Marco blanco del slider: recortado desde el propio contenedor de Smart Slider (overflow:hidden + escala leve de la imagen), sin tocar configuración/skin del plugin.

QA de Codix: inspección + capturas Playwright portada/artículo claro+oscuro, php -l OK, git diff --check OK. WordPress local actualizado, producción sin tocar.

buscador arreglado, oscuro
claro (referencia)

@Rafa cuando puedas echa un vistazo de nuevo — si no ves más blancos raros, seguimos con móvil+idiomas y abrimos el PR.

## Fix de seguimiento (dark mode) — Codix Commit `51ae723` en la misma rama `feat/accesibilidad-196` (push hecho por Claudix, Codix no tenía credenciales de Gitea en su sesión): - **Buscador del header**: fondo/borde oscuros ahora en el wrapper, input y botón (`.wp-block-search__inside-wrapper/__input/__button`), no solo `input` genérico. - **Marco blanco del slider**: recortado desde el propio contenedor de Smart Slider (`overflow:hidden` + escala leve de la imagen), sin tocar configuración/skin del plugin. QA de Codix: inspección + capturas Playwright portada/artículo claro+oscuro, `php -l` OK, `git diff --check` OK. WordPress local actualizado, producción sin tocar. ![buscador arreglado, oscuro](https://gitea.feadulta.com/attachments/1c8ee4f0-6b11-49bd-a177-365df0406c35) ![claro (referencia)](https://gitea.feadulta.com/attachments/35d70f9d-24d1-421b-a0a2-9038a3dc41e2) @Rafa cuando puedas echa un vistazo de nuevo — si no ves más blancos raros, seguimos con móvil+idiomas y abrimos el PR.
Author
Owner

Fix de seguimiento 2 (Codix) + corrección del método de QA (Claudix)

Codix — commit 82c352a

Botón del buscador con contraste propio en oscuro (#ececec/#0d0d0d, ya no se confunde con el input) y franja móvil "Búsqueda avanzada" (fea-search-advanced.php) oscurecida con el acento AA.

buscador
móvil

⚠️ Corrección sobre el QA anterior (comments 611/614): la fuente no se había verificado

Opix detectó que en localhost:8081 @font-face se bloquea por CORS (el siteurl real es https://farmer.taild3aaf6.ts.net/fea, distinto origen). Lo he verificado con la API document.fonts:

  • http://localhost:8081/Atkinson Hyperlegible 400/700 status=error (todas las capturas de QA hasta ahora mostraban la fuente de respaldo del sistema, no Atkinson).
  • https://farmer.taild3aaf6.ts.net/fea/ (mismo origen que siteurl) → status=loaded en ambos pesos.

Decisión de método de QA a partir de ahora: todo lo visual/tipográfico se prueba contra https://farmer.taild3aaf6.ts.net/fea/, no contra localhost:8081 directo. localhost:8081 sigue sirviendo para checks funcionales (php -l, errores en logs) donde el origen no importa. No se toca plugins_url() en el código — es correcto para producción.

Evidencia corregida, Atkinson realmente cargado:

home claro, fuente real
home oscuro, fuente real

Pista para la investigación del banner (Opix, sin diagnosticar del todo)

Probando en el origen real vi un <img class="wp-image-26979" alt="Fe Adulta"> (el logo pequeño de cabecera, no el slider) que en https://farmer.taild3aaf6.ts.net/fea/ da naturalWidth/Height=0 (no pinta, aunque curl a esa misma URL devuelve 200 — no es un 404 simple). En localhost:8081 esa misma imagen sí pinta bien. Puede ser la misma familia de problema que la fuente (origen/proxy local, no bug de producción) pero no lo he cerrado del todo — se lo paso a Opix en Buzz.

## Fix de seguimiento 2 (Codix) + corrección del método de QA (Claudix) ### Codix — commit `82c352a` Botón del buscador con contraste propio en oscuro (`#ececec`/`#0d0d0d`, ya no se confunde con el input) y franja móvil "Búsqueda avanzada" (`fea-search-advanced.php`) oscurecida con el acento AA. ![buscador](https://gitea.feadulta.com/attachments/70aa367c-e192-4ab5-9625-ea7f9efb2122) ![móvil](https://gitea.feadulta.com/attachments/5bd5e21d-42e6-405c-bf7d-264090bb2857) ### ⚠️ Corrección sobre el QA anterior (comments 611/614): la fuente no se había verificado Opix detectó que en `localhost:8081` `@font-face` se bloquea por CORS (el `siteurl` real es `https://farmer.taild3aaf6.ts.net/fea`, distinto origen). Lo he verificado con la API `document.fonts`: - `http://localhost:8081/` → `Atkinson Hyperlegible 400/700 status=error` (todas las capturas de QA hasta ahora mostraban la fuente de respaldo del sistema, no Atkinson). - `https://farmer.taild3aaf6.ts.net/fea/` (mismo origen que `siteurl`) → `status=loaded` en ambos pesos. **Decisión de método de QA a partir de ahora:** todo lo visual/tipográfico se prueba contra `https://farmer.taild3aaf6.ts.net/fea/`, no contra `localhost:8081` directo. `localhost:8081` sigue sirviendo para checks funcionales (`php -l`, errores en logs) donde el origen no importa. No se toca `plugins_url()` en el código — es correcto para producción. Evidencia corregida, Atkinson realmente cargado: ![home claro, fuente real](https://gitea.feadulta.com/attachments/5e1a30dc-cb0b-4aaf-b867-9c8d6690f0fe) ![home oscuro, fuente real](https://gitea.feadulta.com/attachments/cbe90f5c-614b-47d8-9907-206d11416b1c) ### Pista para la investigación del banner (Opix, sin diagnosticar del todo) Probando en el origen real vi un `<img class="wp-image-26979" alt="Fe Adulta">` (el logo pequeño de cabecera, no el slider) que en `https://farmer.taild3aaf6.ts.net/fea/` da `naturalWidth/Height=0` (no pinta, aunque `curl` a esa misma URL devuelve 200 — no es un 404 simple). En `localhost:8081` esa misma imagen sí pinta bien. Puede ser la misma familia de problema que la fuente (origen/proxy local, no bug de producción) pero no lo he cerrado del todo — se lo paso a Opix en Buzz.
Author
Owner

Fix de infra aplicado — banner y fotos antiguas ya cargan en el origen real

Con el visto bueno de Rafa, añadido location /wp-content/ en ~/.openclaw/workspace/hub-nginx.conf (repo rafa/hub, commit 699d959, sincronizado y pusheado). docker restart hub-proxy para aplicar (el reload no basta al estar el config montado como volumen read-only).

Verificado con Playwright contra https://farmer.taild3aaf6.ts.net/fea/:

  • Banner de portada: naturalWidth=950 (antes 0).
  • Fotos de un artículo antiguo (iglesia-titanic-y-nueva-evangelizacion): cargan con tamaño natural correcto.
  • Resto de rutas del Hub sin regresión (/, /fea/, /yt/, /git/, /portfolio/ en 200; los 500/404 preexistentes de /joomla/ y /triptyk/ se confirmaron pegando directo a sus puertos sin pasar por el proxy — no los causó este cambio).

portada con banner
artículo antiguo con fotos

Con esto el QA visual/tipográfico contra el origen real (norma fijada arriba) ya no tiene falsos positivos de imágenes rotas — quedaba solo el banner como pendiente de este issue, y ya está resuelto.

## Fix de infra aplicado — banner y fotos antiguas ya cargan en el origen real Con el visto bueno de Rafa, añadido `location /wp-content/` en `~/.openclaw/workspace/hub-nginx.conf` (repo `rafa/hub`, commit `699d959`, sincronizado y pusheado). `docker restart hub-proxy` para aplicar (el `reload` no basta al estar el config montado como volumen read-only). **Verificado con Playwright contra `https://farmer.taild3aaf6.ts.net/fea/`:** - Banner de portada: `naturalWidth=950` (antes 0). - Fotos de un artículo antiguo (`iglesia-titanic-y-nueva-evangelizacion`): cargan con tamaño natural correcto. - Resto de rutas del Hub sin regresión (`/`, `/fea/`, `/yt/`, `/git/`, `/portfolio/` en 200; los 500/404 preexistentes de `/joomla/` y `/triptyk/` se confirmaron pegando directo a sus puertos sin pasar por el proxy — no los causó este cambio). ![portada con banner](https://gitea.feadulta.com/attachments/bd7999c0-32df-4b4f-87fe-fa89c21291c6) ![artículo antiguo con fotos](https://gitea.feadulta.com/attachments/8206340c-84c2-4686-94d6-e51af5d3c40c) Con esto el QA visual/tipográfico contra el origen real (norma fijada arriba) ya no tiene falsos positivos de imágenes rotas — quedaba solo el banner como pendiente de este issue, y ya está resuelto.
Author
Owner

Atkinson también en titulares — commit 68b95aa (Codix)

Decisión de Rafa: Atkinson Hyperlegible en titulares también, no solo cuerpo. Aplicado a .fea-hero-title, .fea-section-title y el resto de headings; formularios/controles ahora heredan la fuente (font-family: inherit); los dos @font-face declaran rango de peso (100 500 / 501 900) para que 300/600 mapeen a los ficheros reales sin síntesis del navegador.

Verificado por Codix (computed style + document.fonts) y por mí de forma independiente contra https://farmer.taild3aaf6.ts.net/fea/:

titular con Atkinson

La "f" con rabito de Fraunces (queja original de Rafa) ya no aparece — era la misma causa que "la letra no cambia": los titulares tenían su propia regla de mayor especificidad que ganaba sobre el body.

Con esto el issue está funcionalmente completo en local: tipografía (cuerpo + titulares + formularios, sin pesos sintéticos), toggle claro/oscuro, banner y contenido migrado (fix de infra en el Hub, no de este repo), y los 3 bugs de contraste en oscuro. Pendiente: QA móvil + idiomas, y aprobación explícita de Rafa antes de tocar producción.

## Atkinson también en titulares — commit `68b95aa` (Codix) Decisión de Rafa: Atkinson Hyperlegible en titulares también, no solo cuerpo. Aplicado a `.fea-hero-title`, `.fea-section-title` y el resto de headings; formularios/controles ahora heredan la fuente (`font-family: inherit`); los dos `@font-face` declaran rango de peso (`100 500` / `501 900`) para que 300/600 mapeen a los ficheros reales sin síntesis del navegador. Verificado por Codix (computed style + `document.fonts`) y por mí de forma independiente contra `https://farmer.taild3aaf6.ts.net/fea/`: ![titular con Atkinson](https://gitea.feadulta.com/attachments/5eeb3ed7-e3f2-4045-9115-764e98b77494) La "f" con rabito de Fraunces (queja original de Rafa) ya no aparece — era la misma causa que "la letra no cambia": los titulares tenían su propia regla de mayor especificidad que ganaba sobre el `body`. Con esto el issue está funcionalmente completo en local: tipografía (cuerpo + titulares + formularios, sin pesos sintéticos), toggle claro/oscuro, banner y contenido migrado (fix de infra en el Hub, no de este repo), y los 3 bugs de contraste en oscuro. Pendiente: QA móvil + idiomas, y aprobación explícita de Rafa antes de tocar producción.
Author
Owner

Cierre — implementado y verificado en local, pendiente de producción

Rafa confirma conforme. Cierro el issue; queda pendiente de desplegar a producción junto con el #195 (usabilidad), cuando ese esté listo — no se sube nada todavía.

Resumen final

Rama feat/accesibilidad-196 (5 commits, 7a623e868b95aa), mu-plugin nuevo mu-plugins/fea-accesibilidad.php:

  • Atkinson Hyperlegible self-hosted (OFL), en cuerpo y titulares (decisión de Rafa), pesos 400/700 reales mapeados por rango a cualquier petición 300-900 sin síntesis del navegador.
  • Toggle claro/oscuro persistente, sin flash de carga, botón junto al selector de idioma.
  • Formularios (buscador incluido) heredan la tipografía.
  • Menú de navegación se queda en system-ui a propósito (decisión de Rafa, coherente con el #95).
  • 3 bugs de contraste en oscuro corregidos (buscador, marco de slider, franja "Búsqueda avanzada" móvil).
  • QA cruzado: capturas Playwright + verificación de glifos reales vía protocolo DevTools (no solo CSS pedido), en claro y oscuro, contra el origen real (no localhost:8081, que da falsos negativos por CORS — ver nota de proceso más abajo).

De paso, dos hallazgos de entorno (no de este issue) que quedaron documentados y resueltos

  • QA visual/tipográfico debe hacerse contra https://farmer.taild3aaf6.ts.net/fea/, nunca localhost:8081@font-face se bloquea por CORS en el origen equivocado.
  • Banner y ~4.900 filas de contenido migrado de Joomla con URL relativa a raíz se veían rotos en ese mismo origen por falta de una ruta en el proxy del Hub (hub-nginx.conf) — arreglado con una location /wp-content/ (commit 699d959 en rafa/hub), sin tocar ni un byte de la BD de feadulta ni nada de producción.
  • Issue #197 (falsa alarma sobre fea_audio_url) cerrado en el camino — el pipeline ya construye la URL correcta por entorno.

Gracias a @Opix y @Codix — el diagnóstico ha sido mejor y más rápido repartido que si lo hubiera hecho todo yo solo.

## Cierre — implementado y verificado en local, pendiente de producción Rafa confirma conforme. Cierro el issue; queda pendiente de desplegar a producción **junto con el #195 (usabilidad)**, cuando ese esté listo — no se sube nada todavía. ### Resumen final Rama `feat/accesibilidad-196` (5 commits, `7a623e8`→`68b95aa`), mu-plugin nuevo `mu-plugins/fea-accesibilidad.php`: - Atkinson Hyperlegible self-hosted (OFL), en cuerpo **y titulares** (decisión de Rafa), pesos 400/700 reales mapeados por rango a cualquier petición 300-900 sin síntesis del navegador. - Toggle claro/oscuro persistente, sin flash de carga, botón junto al selector de idioma. - Formularios (buscador incluido) heredan la tipografía. - Menú de navegación se queda en `system-ui` a propósito (decisión de Rafa, coherente con el #95). - 3 bugs de contraste en oscuro corregidos (buscador, marco de slider, franja "Búsqueda avanzada" móvil). - QA cruzado: capturas Playwright + verificación de glifos reales vía protocolo DevTools (no solo CSS pedido), en claro y oscuro, contra el origen real (no `localhost:8081`, que da falsos negativos por CORS — ver nota de proceso más abajo). ### De paso, dos hallazgos de entorno (no de este issue) que quedaron documentados y resueltos - **QA visual/tipográfico debe hacerse contra `https://farmer.taild3aaf6.ts.net/fea/`, nunca `localhost:8081`** — `@font-face` se bloquea por CORS en el origen equivocado. - **Banner y ~4.900 filas de contenido migrado de Joomla con URL relativa a raíz** se veían rotos en ese mismo origen por falta de una ruta en el proxy del Hub (`hub-nginx.conf`) — arreglado con una `location /wp-content/` (commit `699d959` en `rafa/hub`), sin tocar ni un byte de la BD de feadulta ni nada de producción. - Issue #197 (falsa alarma sobre `fea_audio_url`) cerrado en el camino — el pipeline ya construye la URL correcta por entorno. Gracias a @Opix y @Codix — el diagnóstico ha sido mejor y más rápido repartido que si lo hubiera hecho todo yo solo.
rafa closed this issue 2026-08-09 15:00:57 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#196