Skip to content

Commit eded55b

Browse files
Merge pull request #411 from JLG-WOCFR-DEV/codex/creer-document-sur-typographies-et-animations
Ajout de la charte UX et audit accessibilité du dashboard
2 parents 28ef556 + bfd6cd2 commit eded55b

File tree

6 files changed

+143
-4
lines changed

6 files changed

+143
-4
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ Liens Morts Detector est une extension WordPress qui détecte les liens et image
7171

7272
> 💡 Lorsqu’elles sont définies, les variables `WP_E2E_*` permettent également à la configuration Playwright de générer automatiquement un état de session réutilisable via `tests/e2e/utils/global-setup.ts`. À défaut de configuration, la suite E2E est ignorée (et renvoie un succès) ce qui permet son exécution dans la CI même sans instance WordPress accessible.
7373
74+
### Audit accessibilité (Playwright + axe-core)
75+
76+
1. Vérifier que l’instance de test WordPress expose des données de synthèse sur `/wp-admin/admin.php?page=blc-dashboard`.
77+
2. Exporter au minimum `WP_E2E_BASE_URL`, `WP_E2E_USERNAME`, `WP_E2E_PASSWORD` (et, si nécessaire, `WP_E2E_STORAGE_STATE`).
78+
3. Lancer `npm run test:e2e -- --grep @a11y` pour exécuter les scénarios axe-core (`settings` + synthèse du dashboard).
79+
4. Consulter le rapport dans `playwright-report/` et corriger toute violation sérieuse ou critique avant de valider.
80+
81+
La charte d’interface détaille les styles, couleurs et attentes d’interaction à respecter : voir [`docs/charte-ux.md`](docs/charte-ux.md).
82+
7483
### Combinaison des suites
7584
- `npm run test:all` exécute successivement Jest puis Playwright.
7685

docs/charte-ux.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Charte UX & Accessibilité — Liens Morts Detector (interface admin)
2+
3+
Cette charte décrit les conventions graphiques et d’interaction appliquées aux composants d’administration du plugin. Elle sert de référence pour la conception, l’implémentation et la revue des interfaces, y compris pour les audits d’accessibilité automatisés.
4+
5+
## Typographies
6+
7+
- **Famille principale** : `Inter`, avec repli sur `"Segoe UI"`, `Roboto`, puis `sans-serif` (déclaré via `--blc-admin-font-family`).
8+
- **Hiérarchie** :
9+
- Titres de sections (`h1``h2`) : 1.35 rem par défaut, 1.25 rem en affichage réduit (`max-width: 782px`).
10+
- Libellés secondaires et sous-titres : 0.95 rem avec couleur atténuée (`--blc-admin-text-subtle`).
11+
- Labels utilitaires (ex. métriques) : 0.85 rem, uppercase, espacement de 0.08 em.
12+
- Valeurs clés : 1.85 rem, graisse 700, ligne à 1.1.
13+
- **Accessibilité** :
14+
- Les textes doivent rester lisibles à 200 % de zoom. Les lignes sont compactes (1.3 – 1.5 selon le contexte) et l’espacement vertical est assuré par les gaps des conteneurs.
15+
- La classe `blc-accessibility--large-font` (préférences utilisateur) doit conserver une base 16 px et respecter ces proportions.
16+
17+
## Palette de couleurs
18+
19+
Les couleurs sont définies via des variables CSS (cf. `:root` dans `liens-morts-detector-jlg/assets/css/blc-admin-styles.css`). Les combinaisons suivantes assurent un contraste ≥ 4.5:1 pour le texte principal.
20+
21+
| Usage | Variable(s) | Couleur | Couleur de texte associée | Ratio de contraste |
22+
| --- | --- | --- | --- | --- |
23+
| Surface principale | `--blc-admin-surface` | `#fcfcfd` | `--blc-admin-text` (`#11181c`) | 15.3:1 |
24+
| Surface secondaire | `--blc-admin-surface-subtle` | `#f5f6f8` | `--blc-admin-text` | 13.0:1 |
25+
| Texte atténué | `--blc-admin-text-subtle` | `#687076` |||
26+
| Accent | `--blc-admin-accent` | dépend du thème WP | texte inversé ou bordures, jamais seul |
27+
| Statut succès | `--blc-admin-success-bg` (`#e5fbeb`) | `--blc-admin-success-text` (`#31694a`) | 5.95:1 |
28+
| Statut info | `--blc-admin-info-bg` (`#e4ecff`) | `--blc-admin-info-text` (`#3c4ae0`) | 5.46:1 |
29+
| Statut avertissement | `--blc-admin-warning-bg` (`#fff1d0`) | `--blc-admin-warning-text` (`#8a4600`) | 6.34:1 |
30+
| Statut critique | `--blc-admin-danger-bg` (`#ffe5e0`) | `--blc-admin-danger-text` (`#b02a1c`) | 5.49:1 |
31+
| Mode neutre | `--blc-admin-surface-subtle` | `--blc-admin-text` / `--blc-admin-text-subtle` | ≥ 4.6:1 |
32+
33+
> 📝 **Note** : Les thèmes WP peuvent écraser l’accent (`--wp-admin-theme-color`). Veiller à vérifier les contrastes lorsque la charte est intégrée à un thème personnalisé.
34+
35+
## États d’interaction
36+
37+
- **Repos** : cartes et résumés ont une bordure 1 px (ou 6 px à gauche pour `--accent`), une ombre légère et un fond conforme aux surfaces définies.
38+
- **Survol (`:hover`)** : translation verticale maximum de 2 px, ombre amplifiée. Ne pas modifier la couleur de fond pour éviter de dégrader le contraste.
39+
- **Focus clavier (`:focus-visible`)** :
40+
- Utiliser un contour de 2 px `outline` ou `box-shadow` basé sur `--blc-admin-accent` (ou `--blc-admin-border` en mode contraste élevé), avec rayon cohérent (`--blc-admin-radius-md`).
41+
- Le focus doit être implémenté sur les éléments interactifs (`a`, `button`, `[role="tab"]`, contrôles de formulaire). Les éléments purement informatifs ne deviennent pas focusables.
42+
- **État actif** : conserver la variation de couleur ou d’ombre existante, en veillant à ne jamais supprimer l’indicateur de focus.
43+
44+
## Mouvements et animations
45+
46+
- Transition standard : `var(--blc-admin-transition)` (180 ms, courbe `cubic-bezier(0.22, 1, 0.36, 1)`).
47+
- Réduction de mouvement : la classe `blc-accessibility--reduce-motion` doit désactiver transitions et animations (`transition-duration: 0.001ms`, etc.). Tout nouvel effet doit respecter cette mécanique.
48+
- Les animations doivent être discrètes (translation < 4 px, opacité) et ne pas introduire de flashs.
49+
50+
## Composants admin clés
51+
52+
### Résumé du tableau de bord (`.blc-dashboard-summary`)
53+
54+
- Bloc `section` avec `aria-labelledby` pointant sur le titre `h2`.
55+
- Ajouter `aria-describedby` vers le sous-titre pour inclure le contexte dans le focus SR.
56+
- Liste non ordonnée (`ul`) avec items (`li`) affichant label, valeur et description.
57+
- Variantes (`--success`, `--info`, `--warning`, `--danger`, `--neutral`) utilisent les couleurs du tableau ci-dessus et conservent les contrastes à 4.5:1 minimum.
58+
59+
### Cartes statistiques (`.blc-stat`)
60+
61+
- Bouton simulé `<a>` avec `aria-label` dynamique et badge visuel `Actif` + équivalent SR.
62+
- Focus visible via halo accentué, hover avec légère translation uniquement.
63+
64+
## Audit accessibilité axe-core
65+
66+
1. Exporter les variables `WP_E2E_BASE_URL`, `WP_E2E_USERNAME`, `WP_E2E_PASSWORD` et (le cas échéant) `WP_E2E_STORAGE_STATE`.
67+
2. Lancer `npm run test:e2e -- --grep @a11y` pour exécuter les audits axe-core (réglages + synthèse dashboard).
68+
3. Examiner le rapport HTML généré dans `playwright-report/` en cas d’échec.
69+
4. Corriger les violations sérieuses ou critiques avant de valider la PR.
70+
71+
## Revue de code
72+
73+
- Vérifier la cohérence avec la présente charte (typographies, palette, focus/hover, réduction des animations).
74+
- Refuser toute régression de contraste ou suppression d’indicateur de focus.
75+
- S’assurer qu’un audit axe-core (Playwright) a été exécuté et archivé dans la PR.
76+

liens-morts-detector-jlg/assets/css/blc-admin-styles.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
--blc-admin-danger-text: #b02a1c;
2020
--blc-admin-danger-border: #f4c2b9;
2121
--blc-admin-warning-bg: #fff1d0;
22-
--blc-admin-warning-text: #ad5f00;
22+
--blc-admin-warning-text: #8a4600;
2323
--blc-admin-info-bg: #e4ecff;
2424
--blc-admin-info-text: #3c4ae0;
2525
--blc-admin-radius-xs: 6px;

liens-morts-detector-jlg/includes/blc-admin-pages.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3233,10 +3233,14 @@ function blc_dashboard_links_page() {
32333233
<?php blc_render_dashboard_tabs('links'); ?>
32343234
<h1><?php esc_html_e('Rapport des Liens Cassés', 'liens-morts-detector-jlg'); ?></h1>
32353235
<?php if (!empty($summary_items)) : ?>
3236-
<section class="blc-dashboard-summary blc-admin-card blc-admin-card--subtle" aria-labelledby="blc-dashboard-summary-heading">
3236+
<section
3237+
class="blc-dashboard-summary blc-admin-card blc-admin-card--subtle"
3238+
aria-labelledby="blc-dashboard-summary-heading"
3239+
aria-describedby="blc-dashboard-summary-subtitle"
3240+
>
32373241
<div class="blc-dashboard-summary__header">
32383242
<h2 id="blc-dashboard-summary-heading" class="blc-dashboard-summary__title"><?php esc_html_e('Synthèse opérationnelle', 'liens-morts-detector-jlg'); ?></h2>
3239-
<p class="blc-dashboard-summary__subtitle"><?php esc_html_e('Mesures clés actualisées selon le dernier scan manuel.', 'liens-morts-detector-jlg'); ?></p>
3243+
<p id="blc-dashboard-summary-subtitle" class="blc-dashboard-summary__subtitle"><?php esc_html_e('Mesures clés actualisées selon le dernier scan manuel.', 'liens-morts-detector-jlg'); ?></p>
32403244
</div>
32413245
<ul class="blc-dashboard-summary__grid" role="list">
32423246
<?php foreach ($summary_items as $item) :
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { expect, test } from '@playwright/test';
2+
import AxeBuilder from '@axe-core/playwright';
3+
4+
const baseURL = process.env.WP_E2E_BASE_URL;
5+
const username = process.env.WP_E2E_USERNAME;
6+
const password = process.env.WP_E2E_PASSWORD;
7+
8+
const shouldSkip = !baseURL || !username || !password;
9+
10+
const SERIOUS_IMPACTS = new Set(['serious', 'critical']);
11+
12+
test.describe('Accessibilité de la synthèse du tableau de bord @a11y', () => {
13+
test.skip(
14+
shouldSkip,
15+
"Les variables WP_E2E_* doivent être définies pour exécuter les tests d'accessibilité."
16+
);
17+
18+
test('ne présente pas de violations d\'impact sérieux ou critique sur la synthèse', async ({ page }) => {
19+
await page.goto('/wp-admin/admin.php?page=blc-dashboard', { waitUntil: 'domcontentloaded' });
20+
21+
if (page.url().includes('wp-login.php')) {
22+
await page.fill('input#user_login', username!);
23+
await page.fill('input#user_pass', password!);
24+
await Promise.all([
25+
page.waitForURL(/\/wp-admin\//, { timeout: 60_000 }),
26+
page.click('input#wp-submit'),
27+
]);
28+
29+
await page.goto('/wp-admin/admin.php?page=blc-dashboard', { waitUntil: 'domcontentloaded' });
30+
}
31+
32+
const summarySection = page.locator('.blc-dashboard-summary');
33+
await expect(summarySection, 'La section synthèse doit être visible avant l\'audit axe.').toBeVisible();
34+
35+
const axe = new AxeBuilder({ page })
36+
.include('.blc-dashboard-summary')
37+
.withTags(['wcag2a', 'wcag2aa', 'section508']);
38+
39+
const results = await axe.analyze();
40+
41+
const seriousViolations = results.violations.filter((violation) =>
42+
violation.impact ? SERIOUS_IMPACTS.has(violation.impact) : false
43+
);
44+
45+
expect(
46+
seriousViolations,
47+
"La synthèse du tableau de bord ne doit pas comporter de violations critiques détectées par axe-core."
48+
).toEqual([]);
49+
});
50+
});

tests/e2e/settings-accessibility.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const shouldSkip = !baseURL || !username || !password;
99

1010
const SERIOUS_IMPACTS = new Set(['serious', 'critical']);
1111

12-
test.describe('Accessibilité des réglages Liens Morts Detector', () => {
12+
test.describe('Accessibilité des réglages Liens Morts Detector @a11y', () => {
1313
test.skip(shouldSkip, 'Les variables WP_E2E_* doivent être définies pour exécuter les tests d\'accessibilité.');
1414

1515
test('ne présente pas de violations d\'impact sérieux ou critique sur la page des réglages', async ({ page }) => {

0 commit comments

Comments
 (0)