Companion d'accessibilité unifie pour les visualisations. Offre trois alternatives activables independamment : tableau de données, téléchargement CSV et description textuelle. Le contenu est replie dans un accordeon DSFR par défaut.

Accessibilité

Les graphiques (canvas, SVG) sont difficilement accessibles aux lecteurs d'écran. dsfr-data-a11y offre trois alternatives complementaires : un tableau HTML, un téléchargement CSV et une description textuelle. Via l'attribut for, il injecte un skip link dans le graphique, pose aria-describedby et aria-details pour creer un lien semantique complet.

Attributs

AttributTypeDescription
sourceStringId de la source (ou du transformateur) dont ce complément accessible consomme les données.
forStringId de l'élément cible (graphique, carte) pour la liaison ARIA et le lien d'évitement.
tableBooleanAffiche le tableau de données équivalent au graphique.
downloadBooleanAffiche le bouton de téléchargement CSV.
filenameStringNom du fichier CSV téléchargé.
descriptionStringDescription textuelle du graphique, lue par les lecteurs d'écran.
label-fieldStringColonne utilisée pour les labels du tableau.
value-fieldStringColonne(s) utilisée(s) pour les valeurs du tableau (séparées par des virgules).
empty-labelStringLibellé substitué aux cellules VIDES (null, undefined ou "") de la colonne de libellé du tableau, et aux noms de série vides en mode series-field (#933). Même rôle que l'empty-label de dsfr-data-chart (#647) : sans lui, la barre du groupe non renseigné porte un nom sur l'axe alors que sa ligne dans le tableau équivalent a une cellule vide — le tableau dit autre chose que le graphique. Colonne de libellé = label-field s'il est posé, sinon la PREMIÈRE colonne rendue. Les colonnes de valeur ne sont jamais touchées : une mesure absente reste une cellule vide, on n'invente pas un libellé. Absent (défaut), le rendu est inchangé : la cellule reste vide. La valeur n'est PAS reprise du graphique visé par for — l'écrire sur les deux balises est volontaire, pour qu'aucune page existante ne voie son tableau changer. Le CSV téléchargé porte le même libellé que le tableau affiché.
series-fieldStringChamp « clé de série » d'un jeu au format long/tidy — typiquement l'origin-field d'un dsfr-data-concat (#807), ou le champ que dsfr-data-chart series-field consomme déjà côté graphique (#930). Posé, le tableau équivalent PIVOTE : une ligne par valeur de label-field, une colonne par valeur distincte de ce champ (dans leur ordre d'apparition), au lieu d'une ligne par couple (libellé, série) sans colonne disant de quelle série la valeur provient. Le CSV téléchargé suit la même structure. Exige label-field ET value-field : sans eux on ne sait pas quelle colonne porte la mesure. Le manque est signalé (data-dsfr-config-error) et le tableau retombe sur le rendu à plat, jamais un pivot silencieusement faux. Seul le PREMIER champ de value-field est pivoté. Un couple (libellé, série) absent des données rend une cellule vide : dsfr-data-chart y trace 0, le tableau ne l'affirme pas. Absent (défaut), le rendu est inchangé. La valeur n'est PAS reprise du graphique visé par for.
labelStringLibellé personnalisé de la section accessible.
decimalsNumberNombre de décimales des cellules numériques du tableau (#666). Absent : au plus 2 décimales, format fr-FR. Le CSV n'est pas concerné.
no-auto-ariaBooleanDesactive la pose automatique des attributs ARIA et du lien d'évitement.
idle-messageStringMessage annoncé quand l'amont attend un filtre (require-where, #690). Remplace « aucune donnée disponible » dans la description lue par les lecteurs d'écran : rien n'a été chargé, rien n'a échoué.

Si ni table, ni download, ni description ne sont définis, les trois sont actives par défaut.

En attente d'un filtre

Sur une page d'exploration, l'amont peut refuser de charger tant qu'aucun filtre n'est posé (require-where sur <dsfr-data-source> ou <dsfr-data-query>). Le complément accessible annonce alors idle-message à la place de « aucune donnée disponible » : rien n'a été chargé, rien n'a échoué, et c'est cette nuance qu'un lecteur d'écran doit entendre. Le tableau et le bouton de téléchargement restent masqués tant que la source attend. Le mécanisme est décrit sur dsfr-data-source.

Le groupe non renseigné

Quand <dsfr-data-chart> porte empty-label, la barre du groupe vide (null, undefined ou chaîne vide) est nommée sur l'axe et dans la légende. Poser le même empty-label ici nomme la ligne correspondante du tableau équivalent, qui sinon a une cellule de libellé vide : le tableau dirait autre chose que le graphique qu'il double. Seule la colonne de libellé est concernée — label-field s'il est posé, sinon la première colonne rendue ; une mesure absente reste une cellule vide. Le CSV téléchargé porte le même libellé. Sans cet attribut, le rendu est celui d'avant : la valeur n'est pas reprise du graphique visé par for.

Un graphique multi-séries

Un jeu au format long — celui que produit dsfr-data-concat avec origin-field, et que <dsfr-data-chart series-field> consomme déjà — a une ligne par couple (libellé, série). Rendu tel quel, le tableau équivalent répète chaque libellé sans jamais dire de quelle série vient la valeur. Poser ici le même series-field pivote le tableau : une ligne par libellé, une colonne par série, la cellule de libellé en <th scope="row"> pour que chaque valeur garde ses deux coordonnées. Le CSV suit la même structure. L'attribut exige label-field et value-field : sans eux, le manque est signalé en console et le tableau reste à plat plutôt que pivoté de travers. Un couple absent des données laisse une cellule vide — le graphique y trace 0, le tableau ne l'affirme pas.

Fonctionnement ARIA

  1. Le composant génère automatiquement un id s'il n'en a pas
  2. Un skip link est injecte dans le graphique cible (visible au focus clavier)
  3. aria-describedby pointe vers un resume concis dans le composant
  4. aria-details pointe vers le tableau de données (si table est active)
  5. A la deconnexion, tout est nettoye automatiquement

Exemples

1. Tableau + téléchargement CSV

<dsfr-data-chart id="mon-graph" source="data" type="bar"
  label-field="statut" value-field="total">
</dsfr-data-chart>
<dsfr-data-a11y for="mon-graph" source="data" table download></dsfr-data-a11y>

2. Avec description textuelle

<dsfr-data-a11y for="mon-graph" source="data"
  table download
  description="Ce graphique montre la repartition des sites par statut.">
</dsfr-data-a11y>

3. Cohabitation avec DataBox

Quand le graphique cible utilise l'attribut databox, ne PAS ajouter table ni download sur dsfr-data-a11y (DataBox les fournit deja avec un meilleur rendu : switch chart/tableau integre, CSV natif). Conserver uniquement description :

<dsfr-data-chart id="mon-graph" source="data" type="bar"
  label-field="region" value-field="total"
  databox databox-title="Population par region"
  databox-download databox-screenshot>
</dsfr-data-chart>
<!-- Avec DataBox : pas de table ni download -->
<dsfr-data-a11y for="mon-graph" source="data"
  description="L'Ile-de-France concentre la majorite de la population.">
</dsfr-data-a11y>

4. Mode manuel (no-auto-aria)

Si vous gerez manuellement les attributs ARIA :

<dsfr-data-a11y source="data"
  no-auto-aria table download>
</dsfr-data-a11y>