Donnez vie à vos tutoriels CLI avec un terminal machine à écrire
Ajoutez une animation machine à écrire à votre composant Terminal Docusaurus — les lignes de commande tapées caractère par caractère, les lignes de sortie qui apparaissent l'une après l'autre, avec un curseur clignotant et un clic pour passer l'animation. Trois nouvelles props, aucune rupture de compatibilité.
Traduction automatique
Cet article fait partie de la série Créer des composants Docusaurus :
- Modifier la façon dont Docusaurus génère les balises img
- Surcharger la génération des balises img avec Docusaurus
- Organisez votre contenu Docusaurus avec un composant Series personnalisé
- Ajouter un bouton « retour en haut » dans les articles Docusaurus
- Créer un plugin de recherche/remplacement pour Docusaurus
- Un composant pour afficher des snippets de code dans un blog Docusaurus
- Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an
- Afficher le changelog de votre article
- Injecter de l'ASCII art dans toutes les pages HTML générées par Docusaurus
- Best Practice - Personnaliser le flux RSS de Docusaurus pour un contenu complet et des images
- Quelques vérifications sur les images de votre site Docusaurus
- Gestion des tags dans Docusaurus
- Automatiser les résumés TL;DR avec Gemini AI
- Le composant ProjectSetup - Une façon standardisée de partager des structures de projet
- Comment signaler un contenu assisté par IA dans un blog Docusaurus
- Donnez vie à vos tutoriels CLI avec un terminal machine à écrire
- Espiègleries de suricate : semer des easter eggs partout sur mon blog
- Tooltips de code assistés par l'IA dans Docusaurus — Explique-moi comme à un enfant de cinq ans
- Ajouter des réactions de lecteurs à votre blog Docusaurus
- Votre blog est illisible pour une IA. Voici la solution.
- Secouez votre téléphone, surprenez le suricate
- Ajouter un bouton « Copy as Markdown » à votre blog Docusaurus
- Ask My Blog : transformer 259 articles en 2 160 questions cherchables
- La troisième porte : une bulle de chat flottante, et la fonctionnalité que personne ne trouvait
- Dessiner une carte de mon propre blog
- Laissez vos lecteurs signaler les problèmes — un widget de feedback multi-types pour Docusaurus

Un bloc de code statique explique ce qu'il faut lancer. Un terminal animé montre ce qui se passe. Cet article étend le composant Terminal existant avec une prop typewriter : les lignes de commande (celles qui commencent par $ ou #) sont tapées caractère par caractère avec un curseur clignotant ; les lignes de sortie apparaissent d'un bloc après une courte pause. Trois nouvelles props contrôlent la vitesse et le rythme. Le changement est totalement rétrocompatible — chaque bloc <Terminal> existant reste identique tant que vous ne l'activez pas. L'implémentation, c'est du state React pur + setTimeout, sans aucune librairie.
Les tutoriels CLI sont denses. Le lecteur suit, copie-colle les commandes, et espère que la sortie affichée correspond à ce que vous avez écrit. Mais quand l'article ne montre qu'un bloc de texte figé, la séquence des événements — la commande, la pause, la réponse — s'effondre en un seul mur de monospace.
Une animation machine à écrire restitue cette séquence. La commande apparaît lettre par lettre, comme si quelqu'un la tapait vraiment. Puis la sortie suit. L'œil du lecteur est guidé naturellement à travers l'interaction, sans explication supplémentaire.
Si vous lisez régulièrement mon blog, vous savez que j'ai développé un composant appelé Terminal qui me permet de lister une série de commandes que j'ai lancées dans une console de style Linux — et le rendu est plutôt réaliste. C'est le pendant « console » du composant que j'utilise pour afficher des snippets de code. Voici un exemple :
$ docker compose up -d
[+] Running 3/3 ✔ Network myapp_default Created ✔ Container myapp-db-1 Started ✔ Container myapp-web-1 Started
Il manque juste un peu de « vie » ; voyons comment le rendre vraiment sympa avec une animation de type machine à écrire.
La sortie du Terminal ci-dessus a été obtenue avec ce bloc dans mon contenu Markdown :
<Terminal title="user@machine: ~/project">
$ docker compose up -d
[+] Running 3/3
✔ Network myapp_default Created
✔ Container myapp-db-1 Started
✔ Container myapp-web-1 Started
</Terminal>
Docusaurus fait ensuite le rendu lors de la prévisualisation de ce post ou lors de la génération du HTML.
La nouvelle prop typewriter
Ajoutez typewriter pour activer l'animation :
<Terminal typewriter>
$ docker compose up -d
[+] Running 3/3
✔ Network myapp_default Created
✔ Container myapp-db-1 Started
✔ Container myapp-web-1 Started
</Terminal>
Voici ce qui se passe, image par image :
$apparaît, puisd, puiso, puisc… la commande se tape toute seule, caractère par caractère- Un curseur vert clignotant
▋suit la position courante - Une fois la commande entièrement tapée, une courte pause la laisse se poser
[+] Running 3/3apparaît comme une ligne complète- Chaque ligne de sortie suit dans l'ordre
- Le curseur disparaît à la fin de l'animation
Passer l'animation
Cliquez n'importe où sur le terminal pour sauter à la fin. Pratique pour les lecteurs qui ont déjà vu l'animation et veulent juste copier les commandes.
Un autre exemple :
L'animation ne démarre que si le terminal est visible
Un terminal enterré au bas d'un long article aurait fini son animation bien avant que le lecteur n'y arrive. Le composant règle ça avec l'Intersection Observer API : l'effet machine à écrire démarre seulement quand au moins 10 % du terminal entre dans le viewport. Faites défiler la page et l'animation vous accueille pile au moment où vous arrivez.
Astuce
Envie de vérifier ? Rechargez simplement cette page (CTRL+F5) et appuyez sur End pour sauter à la conclusion de ce post. Puis remontez. Les animations démarrent. Tout simplement parce que le composant Terminal se trouve maintenant dans la partie visible de la page.
La vitesse s'adapte automatiquement au nombre de lignes
Deux props supplémentaires permettent d'ajuster finement le rythme, mais vous en aurez rarement besoin — le composant s'ajuste tout seul selon le nombre de lignes :
| Lignes | typewriterSpeed | typewriterLineDelay | Durée totale approx. |
|---|---|---|---|
| ≤ 5 | 40 ms/car. | 400 ms/ligne | ~2 s |
| 6–10 | 25 ms/car. | 200 ms/ligne | ~2,5 s |
| 11–20 | 20 ms/car. | 150 ms/ligne | ~3,5 s |
| > 20 | 12 ms/car. | 100 ms/ligne | ~3,5 s |
Une session de 30 lignes se termine à peu près dans le même temps qu'une de 3 lignes. L'animation reste accrocheuse sans devenir une salle d'attente.
Ne surchargez ces valeurs que si vous cherchez un effet précis — une introduction lente et posée à un nouvel outil :
<Terminal typewriter typewriterSpeed={60} typewriterLineDelay={600}>
$ fzf --version
0.54.3 (brew)
</Terminal>
Comment les lignes sont classées
L'animation distingue deux types de lignes en regardant les premiers caractères non blancs :
- Lignes de commande — commencent par
$ou#. Tapées caractère par caractère àtypewriterSpeedms/car. - Lignes de sortie — tout le reste. Affichées d'un bloc après
typewriterLineDelayms. - Lignes vides — apparaissent après une pause de 80 ms, ce qui préserve la respiration visuelle du contenu d'origine.
Autrement dit, vous n'avez pas besoin d'annoter votre contenu d'une manière particulière. Écrivez la session de terminal naturellement ; le composant en déduit la structure.
Aucune rupture de compatibilité
Chaque bloc <Terminal> existant dans le code continue de s'afficher exactement comme avant. La prop typewriter vaut false par défaut, donc le comportement statique reste celui par défaut.
Si vous voulez activer l'animation partout d'un coup, un rechercher-remplacer global de <Terminal → <Terminal typewriter sur le répertoire blog/ suffit :
grep -rl "<Terminal" blog/ | xargs sed -i 's/<Terminal\b/<Terminal typewriter/g'
Aperçu de l'implémentation
Le composant conserve trois morceaux de state pendant l'animation :
revealedLines — lines fully shown so far (string[])
lineIdx — which line is currently being animated (number)
charIdx — how many characters of that line are visible (number)
Un seul useEffect pilote le tick de l'animation. À chaque rendu, il décide quel timeout planifier ensuite :
- Si la ligne courante est une commande et que
charIdx < line.length→ planifiersetCharIdx(c => c + 1)aprèstypewriterSpeedms - Sinon (ligne de sortie, ou commande entièrement tapée) → planifier le passage à la ligne suivante après
typewriterLineDelayms
Quand lineIdx atteint la fin du tableau de lignes, animDone passe à true et le composant revient au rendu du nœud React {children} d'origine — la coloration syntaxique et le balisage riche des enfants sont donc préservés une fois l'animation terminée.
Le curseur clignotant, c'est une simple animation CSS :
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.cursor {
display: inline-block;
color: #00ff00;
animation: blink 1s step-end infinite;
}
Pas de librairie externe. Pas de canvas. Juste du state et des timers.
Créer le composant
Vous devrez créer trois nouveaux fichiers dans votre propre site Docusaurus. Le quatrième est optionnel : c'est la documentation du composant.
Besoin d'aide ? Cliquez sur le bouton « Aide » ci-dessus pour les instructions de mise en place.
Éditez ensuite (ou créez) le fichier src/theme/MDXComponents.js. Si le fichier existe déjà, ajoutez simplement les lignes surlignées ci-dessous. S'il n'existe pas encore, créez-le avec le contenu ci-dessous :
// At the top of your file, add this line:
import Terminal from "@site/src/components/Terminal";
// Then in your export section, add this line too:
export default {
// Reusing the default mapping
...MDXComponents,
// [...]
Terminal
};
À partir de maintenant, vous pouvez utiliser le composant <Terminal> dans vos posts. Amusez-vous bien !
Ce fichier src/theme/MDXComponents.js est le registre central de tous les composants personnalisés de votre blog ; Modifier la façon dont Docusaurus génère les balises img montre comment il permet aussi de surcharger les balises natives, et pas seulement d'en ajouter de nouvelles.
Cet article fait partie de la série Créer des composants Docusaurus :
- Modifier la façon dont Docusaurus génère les balises img
- Surcharger la génération des balises img avec Docusaurus
- Organisez votre contenu Docusaurus avec un composant Series personnalisé
- Ajouter un bouton « retour en haut » dans les articles Docusaurus
- Créer un plugin de recherche/remplacement pour Docusaurus
- Un composant pour afficher des snippets de code dans un blog Docusaurus
- Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an
- Afficher le changelog de votre article
- Injecter de l'ASCII art dans toutes les pages HTML générées par Docusaurus
- Best Practice - Personnaliser le flux RSS de Docusaurus pour un contenu complet et des images
- Quelques vérifications sur les images de votre site Docusaurus
- Gestion des tags dans Docusaurus
- Automatiser les résumés TL;DR avec Gemini AI
- Le composant ProjectSetup - Une façon standardisée de partager des structures de projet
- Comment signaler un contenu assisté par IA dans un blog Docusaurus
- Donnez vie à vos tutoriels CLI avec un terminal machine à écrire
- Espiègleries de suricate : semer des easter eggs partout sur mon blog
- Tooltips de code assistés par l'IA dans Docusaurus — Explique-moi comme à un enfant de cinq ans
- Ajouter des réactions de lecteurs à votre blog Docusaurus
- Votre blog est illisible pour une IA. Voici la solution.
- Secouez votre téléphone, surprenez le suricate
- Ajouter un bouton « Copy as Markdown » à votre blog Docusaurus
- Ask My Blog : transformer 259 articles en 2 160 questions cherchables
- La troisième porte : une bulle de chat flottante, et la fonctionnalité que personne ne trouvait
- Dessiner une carte de mon propre blog
- Laissez vos lecteurs signaler les problèmes — un widget de feedback multi-types pour Docusaurus
Chargement des commentaires…






