Rédiger et publier
Composants MDX
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é | Type | Défaut | Rôle |
|---|---|---|---|
elements | TreeViewElement[] | [] | fichiers et dossiers imbriqués |
initialExpandedItems | string[] | [] | IDs des dossiers ouverts au premier rendu |
initialSelectedId | string | absent | élément initialement mis en avant |
indicator | boolean | true | connecteurs 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 |
className | string | vide | classes supplémentaires du conteneur |
client:load | directive Astro | requis | active 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
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é | Type | Obligatoire | Rôle |
|---|---|---|---|
tabs | string[] | oui | libellés et ordre des onglets |
label | string | recommandé | nom accessible du groupe |
defaultTab | string | non | onglet sélectionné au chargement |
className | string | non | classes supplémentaires sur le conteneur |
client:load | directive Astro | oui ici | active 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
bun installbun run devnpm installnpm run devpnpm installpnpm devLe 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.
| Composant | Propriété | Type | Obligatoire | Rôle |
|---|---|---|---|---|
Steps | attributs de ol | attributs HTML | non | personnalisation de la liste ordonnée |
Step | title | string | oui | titre visible de l’étape |
Step | attributs de li | attributs HTML | non | identifiant, 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
Créer le miroir bilingue
Lancez
bun run new-post guide --translatepour créer les deux fichiers.mdx.Importer les composants
Placez les imports après le frontmatter, avant le premier paragraphe.
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 l’architecture en îlots.
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.
| Attribut | Format | Obligatoire | Rôle |
|---|---|---|---|
repo | propriétaire/dépôt | oui | dé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.
| Attribut | Type | Obligatoire | Rôle |
|---|---|---|---|
src | chemin public vers un SVG | oui | fichier draw.io exporté à charger |
title | string | recommandé | 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"}:::Rendu
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.
| Directive | Moment d’activation | Usage |
|---|---|---|
client:load | dès le chargement | interaction immédiatement nécessaire, comme Tabs |
client:idle | lorsque le navigateur devient disponible | amélioration non critique |
client:visible | à l’approche de la zone visible | composant 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.