Skip to content

fix(charts): palette validee, couleur portee par l'entite, legendes et mode sombre - #306

Merged
horacioskrp merged 1 commit into
developfrom
fix/charts-audit
Sep 2, 2026
Merged

fix(charts): palette validee, couleur portee par l'entite, legendes et mode sombre#306
horacioskrp merged 1 commit into
developfrom
fix/charts-audit

Conversation

@horacioskrp

Copy link
Copy Markdown
Collaborator

Audit des ~20 graphiques de l'application, puis correction. Toutes les conclusions sur les couleurs sont calculées (validateur de palette), pas jugées à l'œil.

🔴 Bleu et violet étaient indistinguables

#2563eb#7c3aed : ΔE 12.4 en vision normale (plancher : 15) et ΔE 0.4 en deutéranopie. Deux camemberts reposaient dessus, où la couleur est le seul canal d'identité.

🔴 La couleur suivait la position, pas la catégorie (bug)

data={[Garçons, Filles, Autre].filter((d) => d.value > 0)}
{[BLUE, PINK, SLATE].map((c) => <Cell fill={c} />)}   // liste FIXE

Si « Garçons » vaut 0, les filles héritaient du bleu. Même schéma sur les mentions : « Très bien » perdait son vert dès qu'une mention était absente.

Correctif : chaque catégorie porte sa couleur dans la donnée ({ name, value, color }), le filtrage ne repeint plus rien.

🔴 Identité par la couleur seule

3 camemberts sur 4 n'avaient ni légende ni étiquette — seul le survol révélait quoi était quoi. Légendes ajoutées.

Changements de forme, justifiés par le calcul

Aucun jeu de 4 teintes ne passe le contrôle « toutes paires » dans les deux modes (le référentiel plafonne à 3). Plutôt que de forcer une palette, on change de forme là où c'est juste : comparer des montants par catégorie est une magnitude, pas une identité.

  • Modes de paiement (4 catégories) → barres horizontales étiquetées, une seule teinte
  • Origine par région (6 catégories) → idem
  • Mentions (donnée ordonnée) → rampe séquentielle d'une seule teinte, plus 4 teintes sans rapport

Mode sombre enfin conçu, plus seulement hérité

Les couleurs d'axes et de grille étaient codées en dur (#9ca3af ×21, grille #e5e7eb quasi invisible sur fond sombre). Nouveau module lib/chart-theme.ts : séries, rampe séquentielle, couleurs d'état et habillage, déclinés pour les deux modes et validés dans chacun.

Animation d'entrée des camemberts désactivée

Un camembert calcule ses angles image par image : si requestAnimationFrame est ralenti (onglet en arrière-plan, économie d'énergie, prefers-reduced-motion), il reste vide. Constaté en vérification : 0 frame/s, camembert figé à 13° au lieu de 360°. L'animation étant décorative, elle est retirée — le rendu devient déterministe.

Vérifications

  • Palette validée dans les deux modes (bande de luminosité, chroma, séparation CVD, plancher vision normale, contraste).
  • Rendu contrôlé dans le navigateur : camembert 180×166 aux bonnes proportions, « Modes de paiement » en barres avec identité textuelle.
  • tsc 0 erreur · ESLint propre · 502 tests.

Non traité (préexistant, hors périmètre)

  • react-hooks/immutability dans Accounting/Dashboard.tsx (mutation pendant le rendu) — vérifié présent avant ces changements.
  • Sur « Évolution mensuelle », le cumul finit par écraser les barres mensuelles. Pas de double axe (le bon réflexe), mais deux échelles cohabitent : à scinder en deux graphiques si la lisibilité gêne.

@horacioskrp
horacioskrp merged commit 0aaff3c into develop Sep 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant