Propagación, test de resolvers (UDP/TCP/DoH), seguridad con historial,
infraestructura, grafo DNS, listas de bloqueo Pi-hole/AdGuard y listas
negras DNSBL, en es/ca/gl/eu/en, sobre la API /tools-api/ del repo
CloudHost/zonemaster-tools. La portada acepta ?domain= para rellenar
el test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Las zonas 1/2/3 (970x90, 320x100, 300x250 de imagen) se sustituyen por zonas
de texto por idioma: 10/11/12 ancho y 13/14/15 bloque para es/en/ro. El locale
de la pagina decide la zona; es/ca/gl/eu van a ES y el resto a EN.
El creativo toma los colores y la tipografia del sitio via variables --ta-*
que apuntan a los tokens del tema, asi que sigue al modo claro/oscuro sin
tocar el adserver.
Fuera async.js: asyncspc.php devuelve {"html":""} para TODAS las zonas en
esta instalacion, tambien las de imagen anteriores. Se pasa a spc.php, que si
entrega y ademas pide todas las zonas de la pagina en UNA llamada, que es la
condicion para que funcione el limite de un anuncio por anunciante y pagina.
Ya no hace falta zona movil aparte: el creativo de texto es fluido.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Las dos trampas que ya costaron tiempo quedan escritas: el import.meta dentro
de un define:vars, y que el modo oscuro tiene que tocar las rampas de la
paleta y no solo la capa semantica. Tambien el --exclude recent-scans.json
del rsync, que sin el se carga el fichero que escribe el cron.
Modo oscuro
-----------
Selector de tres estados (automatico -> claro -> oscuro), no un interruptor
de dos: "automatico" es el estado de partida y sigue al sistema operativo
mientras no se toque. La eleccion explicita se guarda en localStorage y gana
sobre el sistema en ambos sentidos. Un script `is:inline` en el <head> aplica
`data-theme` antes del primer pintado, asi que no hay destello blanco.
Hubo que redefinir las RAMPAS de la paleta, no solo la capa semantica: casi
todos los componentes (cabecera, tarjeta del formulario, menu, pie, botones,
chips) leen `--color-palette-*` directamente, y tocando solo
`--color-background`/`--color-text` la cabecera y la tarjeta se quedaban en
lavanda claro sobre fondo oscuro. Las rampas de severidad son la excepcion
deliberada: de esas solo se invierten el tinte de fondo (-10) y el texto que
va encima (-90), porque los rellenos -30/-50/-70 son la senal de gravedad y
moverlos rompe el contraste del distintivo y el orden error < critico.
Cuatro excepciones se escriben como reglas de componente porque un mismo
token hace dos trabajos opuestos: texto sobre relleno amarillo, el chip de
filtro (que fijaba `background: white` a pelo), el selector de idioma (idem,
mas su flecha SVG incrustada con trazo oscuro) y el logotipo, que es un mapa
de bits en base64 dentro de un .svg y por tanto no tiene ningun `fill` que
redefinir -- se le da la vuelta con invert + hue-rotate, que conserva el tono
del corazon rosa y de la marca de afnic.
Verificado con un barrido automatico de contraste sobre 7 paginas x 2 temas:
0 elementos por debajo de 3:1. El tema claro queda byte a byte como estaba.
"Ultimos analisis"
------------------
Llevaba vacio desde siempre por una causa distinta de la que se creia. El
bloque lleva `define:vars`, lo que obliga a Astro a emitirlo como script
CLASICO en vez de como modulo; el `import.meta.env.BASE_URL` que tenia dentro
es entonces un error de sintaxis que aborta el fichero entero antes de la
primera linea, asi que el fetch nunca llegaba a ejecutarse.
El parche del 2026-09-15 (repartir copias del JSON a cada carpeta de idioma
desde el cron) atacaba un sintoma que no existia: el 404 de
/es/recent-scans.json era real, pero lo provocaba la comprobacion manual, no
la pagina. Quitadas las dos apariciones de `import.meta` del bloque, la lista
se pinta en los 11 idiomas leyendo la ruta absoluta /recent-scans.json, y el
reparto por idioma ya no hace falta.