b13a1e7a31
- Landing : intro « Pourquoi ce site ? » (Chat Control expliqué au grand public) + sommaire-chimen en 3 arcs (Fondations 🟢 / Reprendre le contrôle 🟡 / Autodéfense avancée 🔴) avec compte d'outils par catégorie - PWA : service worker offline-first (précache coquille, network-first avec repli cache pour les fiches consultées), badge hors-ligne discret - Page /contribuer (3 voies + forge labola) + template d'issue Forgejo .gitea/ISSUE_TEMPLATE/nouvo-zouti.yaml ; liens GitHub → labola.o-k-i.net - Fiches jumelles créoles : chargeur content/outils/gcf/, affichage selon la langue avec bandeaux « an chantyé » / « póko tradui », 6 pilotes (signal, protonmail, brave, bitwarden, ublock, quad9) — À FAIRE RELIRE par un locuteur natif - Ton OKI : les 6 mêmes fiches réécrites (tutoiement, registre militant-chaleureux) ; le script de migration n'écrase plus les fiches retravaillées (--force pour tout régénérer) - UI : View Transitions (respect reduced-motion), aide clavier « ? » (dialog natif, raccourcis / h a), progression locale « jès fèt » (localStorage uniquement, compteur visible après le premier geste) - docs/DEPLOYMENT.md : guide VPS (Caddy, nginx, YunoHost, Docker, rsync) - Audits : axe-core 0 violation (5 pages), Lighthouse 99-98/100/100/100 ; corrections contraste monogrammes + ordre des titres - Budgets : JS 46 Ko gzip, CSS 3,5 Ko, 59 pages prérendues Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
25 lines
988 B
JavaScript
25 lines
988 B
JavaScript
// Audit axe-core des pages clés servies sur localhost:4173
|
|
import { chromium } from '@playwright/test'
|
|
import { AxeBuilder } from '@axe-core/playwright'
|
|
|
|
const PAGES = ['/', '/outils', '/outils/signal', '/outils/tor', '/contribuer']
|
|
const browser = await chromium.launch()
|
|
const context = await browser.newContext()
|
|
const page = await context.newPage()
|
|
let total = 0
|
|
|
|
for (const path of PAGES) {
|
|
await page.goto(`http://localhost:4173${path}`, { waitUntil: 'networkidle' })
|
|
const results = await new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag22aa']).analyze()
|
|
total += results.violations.length
|
|
console.log(`\n═══ ${path} — ${results.violations.length} violation(s)`)
|
|
for (const v of results.violations) {
|
|
console.log(` [${v.impact}] ${v.id}: ${v.help}`)
|
|
for (const n of v.nodes.slice(0, 3)) console.log(` → ${n.target.join(' ')}`)
|
|
}
|
|
}
|
|
|
|
await browser.close()
|
|
console.log(`\nTOTAL: ${total} violation(s)`)
|
|
process.exit(total > 0 ? 1 : 0)
|