Installation
Choisissez votre framework ci-dessous. Les quatre chemins montent le même
moteur, le même rendu DOM et la même feuille de style — tout vient de
@dataflow-animator/core,
et chaque liaison n'est qu'une fine couche au-dessus de son appel à
mountPlayer.
Aucune liaison n'embarque de CSS : vous importez toujours
@dataflow-animator/core/styles.css, exactement une fois, n'importe où dans
votre application. Sans elle, le balisage se monte et se mesure, mais rien n'a
de taille, de couleur ni de transition — vous obtenez une boîte vide
silencieuse.
Installer et utiliser
- React
- Élément personnalisé
- Angular
- Sans framework
npm install @dataflow-animator/react @dataflow-animator/core
react et react-dom (≥ 18) sont attendus en peerDependencies. Le cœur
arrive tout seul, en dépendance ; installez-le explicitement quand même,
puisque vous importez sa feuille de style par son nom.
import { DataFlowPlayer } from '@dataflow-animator/react';
import '@dataflow-animator/core/styles.css';
const spec = {
direction: 'left-to-right',
nodes: [
{ id: 'browser', type: 'laptop', text: 'Navigateur', lane: 1 },
{ id: 'api', type: 'server', text: 'API', lane: 2 },
],
packets: [
{
id: 'req',
kind: 'http_packet',
packet_content: { header: 'GET /users' },
},
],
timeline: [{ type: 'move', object: 'req', from: 'browser', to: 'api' }],
};
export default function Example() {
return <DataFlowPlayer spec={spec} />;
}
npm install @dataflow-animator/element @dataflow-animator/core
Le cœur arrive tout seul, en dépendance ; installez-le explicitement quand même, puisque vous importez sa feuille de style par son nom. Importer le paquet enregistre la balise — cet import est toute l'installation.
import '@dataflow-animator/element';
import '@dataflow-animator/core/styles.css';
<dataflow-player
height="420"
spec='{
"direction": "left-to-right",
"nodes": [
{ "id": "browser", "type": "laptop", "text": "Navigateur", "lane": 1 },
{ "id": "api", "type": "server", "text": "API", "lane": 2 }
],
"packets": [
{ "id": "req", "kind": "http_packet", "packet_content": { "header": "GET /users" } }
],
"timeline": [{ "type": "move", "object": "req", "from": "browser", "to": "api" }]
}'
></dataflow-player>
Au-delà d'une petite spec, affectez plutôt la propriété spec avec un vrai
objet : vous évitez d'échapper du JSON dans un attribut — et c'est aussi ce que
font pour vous :spec="spec" en Vue et spec={spec} en Svelte :
document.querySelector('dataflow-player').spec = spec;
npm install @dataflow-animator/angular @dataflow-animator/core
Nécessite Angular 22 ; @angular/core et @angular/common sont des
dépendances de pair. Déclarez la feuille de style globalement dans
angular.json :
"styles": ["@dataflow-animator/core/styles.css", "src/styles.css"]
Puis importez le composant standalone :
import { Component } from '@angular/core';
import {
DataFlowPlayerComponent,
type DataFlowSpec,
} from '@dataflow-animator/angular';
@Component({
selector: 'app-demo',
imports: [DataFlowPlayerComponent],
template: `<dfa-player [spec]="spec" [height]="420" />`,
})
export class DemoComponent {
readonly spec: DataFlowSpec = {
direction: 'left-to-right',
nodes: [
{ id: 'browser', type: 'laptop', text: 'Navigateur', lane: 1 },
{ id: 'api', type: 'server', text: 'API', lane: 2 },
],
packets: [
{
id: 'req',
kind: 'http_packet',
packet_content: { header: 'GET /users' },
},
],
timeline: [{ type: 'move', object: 'req', from: 'browser', to: 'api' }],
};
}
npm install @dataflow-animator/core
mountPlayer construit le lecteur complet — scène, barre de contrôle et
horloge — dans le conteneur que vous lui donnez :
import { mountPlayer } from '@dataflow-animator/core';
import '@dataflow-animator/core/styles.css';
const player = mountPlayer(document.getElementById('diagram'), spec, {
height: 420,
autoPlay: true,
});
// Plus tard, quand le conteneur disparaît :
player.destroy();
mountPlayer renvoie une poignée : el (la racine .rdfa-player), clock
(play / pause / seek / playTo / subscribe), warnings (ce que le
compilateur avait à dire de votre spec) et destroy(), qui relâche chaque
écouteur, observateur et frame d'animation qu'il avait pris.
Le diagramme sans la barre de contrôle ? mountStage() vous rend une poignée
dont vous pilotez update(t) vous-même, et createPlayerClock est exporté pour
que vous n'ayez pas à réimplémenter sa sémantique de lecture.
Tout ce qui rend une balise HTML peut utiliser l'élément personnalisé — c'est tout son intérêt. Voir Paquets et liaisons pour la comparaison complète des quatre surfaces.
Dans Docusaurus
Importez le CSS une seule fois dans src/css/custom.css puis utilisez le
composant dans n'importe quel fichier MDX :
@import '@dataflow-animator/core/styles.css';
import { DataFlowPlayer } from '@dataflow-animator/react';
<DataFlowPlayer spec={spec} mode="auto" />
Le thème auto (défaut) suit prefers-color-scheme ET un ancêtre
[data-theme] (convention Docusaurus), donc le composant se synchronise
automatiquement avec le bouton de thème de l'hôte.
Dans Next.js (App Router)
Le composant utilise useState/useEffect : marquez le fichier appelant
comme client component.
'use client';
import { DataFlowPlayer } from '@dataflow-animator/react';
import '@dataflow-animator/core/styles.css';
export default function Page() {
return <DataFlowPlayer spec={spec} />;
}
Depuis un CDN, sans étape de build
Il n'existe volontairement aucun bundle autonome : en livrer un reviendrait à livrer une seconde copie du moteur, ce que ce découpage cherche précisément à éviter. Un CDN qui réécrit les spécificateurs de modules nus (esm.sh, jspm) se suffit à lui-même :
<link
rel="stylesheet"
href="https://esm.sh/@dataflow-animator/core/styles.css"
/>
<script type="module">
import 'https://esm.sh/@dataflow-animator/element';
</script>
<dataflow-player id="player" height="420"></dataflow-player>
<script type="module">
document.getElementById('player').spec = {
/* … */
};
</script>
Une import map fonctionne aussi, et garde une seule copie du cœur pour tous les modules qui la demandent — la recette est dans le README de l'élément.
Auto-complétion JSON dans VS Code
Ajoutez cette configuration dans .vscode/settings.json pour activer
l'auto-complétion et la validation inline sur tous vos fichiers
*.dataflow.json :
{
"json.schemas": [
{
"fileMatch": ["*.dataflow.json"],
"url": "./node_modules/@dataflow-animator/core/schema.json"
}
]
}
Le même chemin fonctionne avec n'importe quel validateur compatible JSON Schema draft-07 (Ajv, ajv-cli, etc.). Si vous hébergez le schéma publiquement, il peut également être référencé depuis le JSON Schema Store.
SSR et hydratation
Le lecteur ne rend aucun balisage côté serveur, quelle que soit la liaison. Il monte un moteur de rendu DOM framework-agnostique dans un effet client : le HTML statique ne contient qu'un emplacement aux bonnes dimensions, et le diagramme apparaît à l'hydratation. Aucune divergence d'hydratation possible — il n'y a rien à faire correspondre — et importer l'un de ces paquets côté serveur reste sûr : rien ne touche au DOM au niveau module.
Ce que cela coûte : une page prérendue affiche un emplacement à la place du
diagramme. En React, cet emplacement n'est pas vide — il porte un indicateur
de chargement, révélé seulement si l'attente dure assez longtemps pour mériter
d'être signalée (la révélation est temporisée en CSS : une hydratation rapide ne
fait rien clignoter). Son texte est la clé loading de
labels.
Passez fallback pour y mettre le vôtre à la place — une image d'aperçu, une
légende, un squelette. Il remplace entièrement l'indicateur :
<DataFlowPlayer spec={spec} fallback={<img src="/diagram.png" alt="…" />} />
NodeView se comporte de la même façon. <dataflow-player> et <dfa-player>
sont client-only au même sens : ils ne rendent rien tant qu'ils n'ont pas
atteint un navigateur, donc placez une image d'aperçu ou une légende autour de
la balise s'il vous faut du contenu statique.