Aller au contenu principal
LisibleDocumentation
Previewer en direct

Rédiger et publier

Composants MDX

Ajouter des arborescences, onglets, étapes et contenus masqués sans abandonner la simplicité du Markdown.

MDX est le format d’article par défaut de Lisible. Il conserve toute la syntaxe présentée dans Markdown enrichi et permet d’insérer des composants dans la prose. Chaque fiche ci-dessous montre le code complet à copier, puis son rendu réel immédiatement en dessous.

Imports

Les composants React et Astro doivent être importés après le frontmatter, avant le premier contenu. Un import n’ajoute aucun JavaScript au navigateur tant que le composant n’est pas utilisé. Les directives Markdown github et drawio sont fournies par le pipeline et ne nécessitent pas d’import.

Code

---
title: "Mon article interactif"
description: "Un exemple avec les composants MDX de Lisible."
pubDate: 2026-07-19
---
import { Tabs, Tab } from "@/components/ui/tabs";
import { Steps, Step } from "@/components/ui/steps";
import { Tree } from "@shared/components/ui/file-tree";
import Spoiler from "@/components/Spoiler.astro";
import Diagram from "@shared/components/Diagram.astro";

Rendu

Les imports ne produisent aucun élément visible. Ils rendent simplement Tree, Tabs, Tab, Steps, Step, Spoiler et Diagram disponibles pour les exemples placés après eux.

Arborescence de fichiers

Tree affiche une hiérarchie de fichiers interactive partagée par les six variantes. Chaque dossier peut être ouvert indépendamment, les fichiers peuvent être sélectionnés et le contrôle global déplie ou replie tous les dossiers. Utilisez-le pour une structure de projet où un arbre texte statique masquerait des détails utiles.

PropriétéTypeDéfautRôle
elementsTreeViewElement[][]fichiers et dossiers imbriqués
initialExpandedItemsstring[][]IDs des dossiers ouverts au premier rendu
initialSelectedIdstringabsentélément initialement mis en avant
indicatorbooleantrueconnecteurs entre les branches
sort"default", "none" ou comparateur"default"tri naturel dossiers d’abord, ordre source ou ordre personnalisé
dir"ltr" ou "rtl""ltr"direction du texte
classNamestringvideclasses supplémentaires du conteneur
client:loaddirective Astrorequisactive la sélection et les contrôles de dossiers

Chaque élément exige un id unique et un name. Définissez type à file ou folder ; un élément avec children est aussi reconnu comme dossier. isSelectable: false désactive la sélection tout en conservant l’élément dans la hiérarchie.

Dans un îlot MDX, utilisez "default" ou "none" pour sort, car Astro sérialise les propriétés entre serveur et client. Une fonction de comparaison doit rester dans un composant wrapper React.

Code

import { Tree } from "@shared/components/ui/file-tree";
<Tree
client:load
initialExpandedItems={["src", "pages"]}
initialSelectedId="home"
elements={[
{
id: "src",
name: "src",
type: "folder",
children: [
{
id: "pages",
name: "pages",
type: "folder",
children: [{ id: "home", name: "HomePage.astro", type: "file" }],
},
{ id: "styles", name: "styles.css", type: "file" },
],
},
{ id: "config", name: "lisible.config.json", type: "file" },
]}
/>

Rendu

Arborescence

Onglets

Tabs regroupe plusieurs contenus alternatifs sans allonger la page. Utilisez-le pour des commandes équivalentes, des variantes de configuration ou des exemples dans plusieurs langages. Chaque libellé de tabs correspond à un composant Tab, dans le même ordre.

PropriétéTypeObligatoireRôle
tabsstring[]ouilibellés et ordre des onglets
labelstringrecommandénom accessible du groupe
defaultTabstringnononglet sélectionné au chargement
classNamestringnonclasses supplémentaires sur le conteneur
client:loaddirective Astrooui iciactive le clic et la navigation clavier dès le chargement

Tab accepte le contenu MDX et une propriété className facultative. Conservez autant de Tab que de libellés : le composant associe les panneaux par leur position.

Code

import { Tabs, Tab } from "@/components/ui/tabs";
<Tabs
tabs={["bun", "npm", "pnpm"]}
label="Gestionnaire de paquets"
defaultTab="npm"
client:load
>
<Tab>
```bash
bun install
bun run dev
```
</Tab>
<Tab>
```bash
npm install
npm run dev
```
</Tab>
<Tab>
```bash
pnpm install
pnpm dev
```
</Tab>
</Tabs>

Rendu

Fenêtre de terminal
bun install
bun run dev
Fenêtre de terminal
npm install
npm run dev
Fenêtre de terminal
pnpm install
pnpm dev

Le composant expose les rôles tablist, tab et tabpanel. Les flèches gauche et droite changent d’onglet, tandis que Home et End atteignent le premier et le dernier. Le label doit donc décrire le choix proposé, pas répéter « onglets ».

Étapes

Steps présente une procédure ordonnée avec une numérotation et un connecteur visuels. Chaque Step représente une action cohérente ; son titre doit commencer par un verbe et son corps peut contenir des paragraphes, listes, liens ou blocs de code.

ComposantPropriétéTypeObligatoireRôle
Stepsattributs de olattributs HTMLnonpersonnalisation de la liste ordonnée
Steptitlestringouititre visible de l’étape
Stepattributs de liattributs HTMLnonidentifiant, classes ou données complémentaires

Ce composant n’a pas d’état interactif : ne lui ajoutez pas de directive client:*. Il est rendu en HTML statique.

Code

import { Steps, Step } from "@/components/ui/steps";
<Steps>
<Step title="Créer le miroir bilingue">
Lancez `bun run new-post guide --translate` pour créer les deux fichiers `.mdx`.
</Step>
<Step title="Importer les composants">
Placez les imports après le frontmatter, avant le premier paragraphe.
</Step>
<Step title="Valider le résultat">
- testez le clavier ;
- vérifiez les thèmes clair et sombre ;
- exécutez le build statique.
</Step>
</Steps>

Rendu

  1. Créer le miroir bilingue

    Lancez bun run new-post guide --translate pour créer les deux fichiers .mdx.

  2. Importer les composants

    Placez les imports après le frontmatter, avant le premier paragraphe.

  3. Valider le résultat

    • testez le clavier ;
    • vérifiez les thèmes clair et sombre ;
    • exécutez le build statique.

Spoiler

Spoiler floute une réponse courte jusqu’au clic ou à l’activation avec Entrée ou Espace. Il accepte uniquement son contenu enfant et fonctionne sans directive d’hydratation, car son comportement est porté par le composant Astro.

Code

import Spoiler from "@/components/Spoiler.astro";
La réponse est <Spoiler>l’architecture en îlots</Spoiler>.

Rendu

La réponse est .

Carte GitHub

La directive github transforme un identifiant propriétaire/dépôt en carte cliquable. Le lien fonctionne immédiatement, puis le script côté client enrichit la carte avec la description, le langage, les étoiles et les forks disponibles. Aucun import MDX n’est nécessaire.

AttributFormatObligatoireRôle
repopropriétaire/dépôtouidépôt GitHub à afficher et destination du lien

Code

::github{repo="didntchooseaname/lisible-docs"}

Rendu

Utilisez une seule carte lorsque le dépôt est la destination principale. Pour une liste de références, de simples liens restent plus rapides à parcourir.

Diagramme draw.io

La directive drawio charge un export SVG créé avec draw.io dans une visionneuse dotée du zoom, du déplacement, de la réinitialisation et du plein écran. Le plein écran utilise la même API navigateur et le même overlay de repli que Mermaid, puis se ferme avec Échap. L’image Markdown placée dans la directive sert de repli si le chargement ou l’exécution du script échoue.

AttributTypeObligatoireRôle
srcchemin public vers un SVGouifichier draw.io exporté à charger
titlestringrecommandénom accessible du diagramme

Le texte alternatif de l’image de repli doit décrire l’information du diagramme. Il ne doit pas se limiter à « diagramme » ou répéter le nom du fichier.

Code

:::drawio{src="/images/demo-ilots.svg" title="Pipeline en îlots"}
![Pipeline montrant le passage du contenu aux six variantes Astro](/images/demo-ilots.svg)
:::

Rendu

Diagramme
100%
Rendu du diagramme...
Molette pour zoomer, glisser pour deplacer

Pipeline montrant le passage du contenu aux six variantes Astro

Schémas SVG intégrés

Diagram insère un schéma directement dans le HTML au lieu de le charger via <img>. C’est ce qui le rend vivant : un SVG inline hérite des variables CSS de la page, donc ses traits suivent l’accent choisi par le lecteur dans l’en-tête et ses surfaces suivent le thème actif, sans JavaScript et sans requête supplémentaire. Un SVG servi via <img> reste isolé de la page et ne peut pas faire cela.

Trois schémas sont fournis : islands, pipeline et tokens. Passez la locale pour que les libellés et la légende suivent l’article.

Code

import Diagram from "@shared/components/Diagram.astro";
<Diagram id="islands" locale="fr" />
<Diagram id="pipeline" locale="fr" caption="Du fichier source à la page servie." />

Rendu

Une figure avec légende, dimensionnée par ratio d’aspect afin de réserver sa place avant le premier rendu. Pour en ajouter, étendez la table copy et les branches de dessin dans shared/components/Diagram.astro.

Choisir l’hydratation

Une directive client:* ne se place que sur un composant de framework qui a besoin de JavaScript dans le navigateur. Les composants Astro comme Spoiler gèrent leurs scripts eux-mêmes, et les composants purement statiques comme Steps n’ont pas besoin d’hydratation.

DirectiveMoment d’activationUsage
client:loaddès le chargementinteraction immédiatement nécessaire, comme Tabs
client:idlelorsque le navigateur devient disponibleamélioration non critique
client:visibleà l’approche de la zone visiblecomposant interactif éloigné sous la ligne de flottaison

Dans le doute, partez sans directive : ajoutez-en une uniquement lorsque le composant de framework contient un état, un événement ou une API navigateur qui doit fonctionner côté client.

Documentation maintenue avec LisibleModifier cette page ↗

Actions

Recherchez une API, une commande ou un concept.