Journal
Technique4 min de lecture

Des graphiques de tableau de bord sans aucune dépendance

Nous avons construit les courbes de tendance, les mini-graphiques et les barres par catégorie de notre tableau de bord en SVG en ligne. Aucune bibliothèque de graphiques, quelques centaines de lignes en tout, et le mode sombre gratuit. Voici l'argumentaire pour des graphiques faits main, et les cas où il ne faut surtout pas s'y risquer.

LTL'équipe technique de Bookatu

Quand nous avons ajouté un tableau de bord de stock, le geste évident était d'installer une bibliothèque de graphiques. Les plus populaires sont excellentes. Elles sont aussi volumineuses, dogmatiques sur la mise en thème, et conçues pour couvrir mille cas alors qu'il nous en fallait quatre : une courbe de tendance à deux séries, un mini-graphique par ligne, une barre de niveau de stock et une répartition par catégorie. Nous les avons écrits en SVG en ligne à la place, et l'ensemble pèse moins lourd que les définitions de types de la plupart des bibliothèques.

Un tableau de bord de stock avec un graphique de tendance, une répartition par catégorie et une liste classée, en thème clair
Quatre graphiques faits main : des courbes de tendance, une barre de catégories segmentée, des barres de valeur classées et des mini-graphiques par ligne.

Un graphique, c'est un chemin

Retirez l'outillage et une courbe n'est qu'une chaîne de caractères : un chemin SVG construit à partir de vos valeurs. Associez l'indice de chaque point à x, chaque valeur à y, et reliez-les. La seule subtilité qui mérite d'être notée, c'est la marge : placez la valeur maximale quelques pixels sous le bord supérieur, sinon le trait de votre sommet se fait couper en deux par le viewBox.

js
const W = 300, H = 80, PAD = 3; // top pad so the peak stroke is not clippedconst max = Math.max(1, ...values);const x = (i) => (i / (values.length - 1)) * W;const y = (v) => PAD + (H - PAD) * (1 - v / max); const d = values  .map((v, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)} ${y(v).toFixed(1)}`)  .join(' '); // <path d={d} fill="none" stroke="var(--color-primary)" strokeWidth="2" />

Le mode sombre ne coûte rien

Le gain discret, c'est la mise en thème. Nos jetons de design sont des variables CSS, et les traits et remplissages SVG les acceptent comme n'importe quelle autre propriété. Écrire stroke="var(--color-primary)" veut dire que le graphique se recolore à l'instant où le thème bascule, sans configuration de thème au niveau du graphique, sans palette en double et sans écart entre les graphiques et le reste de l'interface. Quand nous avons ajusté plus tard notre palette sombre, les graphiques ont suivi sans qu'on y touche.

Le même tableau de bord de stock rendu en thème sombre
Les mêmes composants en mode sombre. Aucun graphique n'a été modifié, ce sont les variables CSS qui ont fait le travail.

Les cas limites vous appartiennent

Les bibliothèques sont généreuses en fonctionnalités et avares sur les cas limites qui n'appartiennent qu'à vous. Que doit faire un mini-graphique avec un seul point de données ? Que dit la courbe de tendance quand une activité vient d'ouvrir et que toutes les valeurs sont à zéro ? Des composants faits main rendent ces décisions explicites et bon marché : un état vide honnête avec une phrase, une ligne plate au lieu d'un plantage, un résumé en texte à côté de chaque graphique pour les lecteurs d'écran, et une seule requête média prefers-reduced-motion qui coupe l'animation de tracé.

  • Donnez à chaque graphique un aria-label et un résumé en langage simple. Le SVG est de la décoration, la phrase est la donnée.
  • Animez les traits avec stroke-dashoffset pour un effet de tracé, et conditionnez-le à prefers-reduced-motion.
  • Gardez les calculs et le balisage ensemble. Un composant de graphique qui se lit de haut en bas sur un seul écran est un graphique que vous pouvez réparer à 23 h.
  • Concevez l'état vide en premier. Les nouveaux comptes le voient plus que n'importe quel autre état.

Quand il faut prendre une bibliothèque

Le fait main cesse d'être malin dès que les besoins montrent de vraies dents. Le zoom et la sélection à la souris, les échelles logarithmiques, les aires empilées avec une vraie interpolation, les axes au placement de graduations intelligent, le rendu en canvas pour des dizaines de milliers de points : ce sont des problèmes résolus, et les résoudre une seconde fois à la main, c'est ainsi qu'une fonctionnalité de deux jours devient un loisir de deux mois. Notre règle est simple. Si le graphique est une présentation, écrivez le SVG. Si le graphique est un instrument que l'utilisateur manipule, prenez la dépendance et soyez heureux que quelqu'un l'entretienne.

La meilleure bibliothèque de graphiques pour quatre petits graphiques s'est avérée être une boucle for.

graphiques svggraphiques sans bibliothèquegraphiques en mode sombreperformance front-endvisualisation de données
Envie de mettre tout ça en pratique ?

Bookatu vous donne une page de réservation à votre image, des acomptes, des abonnements, des cartes cadeaux et des rappels, avec 0 % de commission sur vos réservations.

Commencer gratuitement