Aller au contenu principal
Interne

Banc d'essai : tous les composants MDX

Page de contrôle, pas un article. Elle instancie une fois chaque composant disponible dans le corps d'un article, plus la syntaxe Markdown que le pipeline d'Astro rend nativement.

Nathan Hallouin5 min de lecture

Cette page n’a rien à dire. Elle sert à voir, d’un coup d’œil, ce qui rend et ce qui casse. Chaque section instancie un composant une fois, avec des données plausibles. Si l’une d’elles est vide, tronquée ou invisible, le composant a un problème — et c’est précisément ce qu’on cherche.

Elle est publiée (published: true) pour être construite. La retirer ou la repasser à false avant un déploiement : sans quoi elle apparaît dans la liste du blog, le flux RSS, le sitemap et llms.txt.

Markdown natif

Le pipeline Markdown d’Astro 7 (Sätteri) traite tout ceci sans composant, à la compilation. Du texte en gras, en italique, barré, du code en ligne, et un lien externe.

Une citation, pour vérifier la bordure et l’espacement. Elle court sur deux lignes.

Une liste à puces :

  • Premier point
  • Deuxième point, avec du code
  • Troisième point

Une liste ordonnée :

  1. Étape une
  2. Étape deux
  3. Étape trois

Une liste de tâches, qui vient de GFM :

  • Cochée
  • Non cochée

Un tableau, qui vient de GFM lui aussi :

Composant Hydraté Coût client
Callout non 0
CodeBlock bouton de copie seul ~1 Ko
ArchitectureBlocks client:visible Framer Motion

Une note de bas de page1, autre extension GFM.


Un titre de niveau 3

Les identifiants d’ancre sont posés par Astro. Au survol d’un titre un # apparaît ; au clic, l’URL est copiée et un la remplace une seconde et demie. C’est src/scripts/heading-anchors.ts, un seul écouteur pour toute la page.

Blocs de code clôturés

Ceux-ci sont colorés par Shiki à la compilation : ils n’envoient aucun JavaScript et s’affichent avant même que la page ne s’hydrate.

type Locale = 'fr' | 'en';

export function localePath(locale: Locale, path = ''): string {
	return `/${locale}${path === '/' ? '' : path}`;
}
bun run build
bun run check
{ "name": "portfolio-astro", "type": "module" }

CodeBlock

Le composant, à distinguer des blocs ci-dessus : il ajoute un onglet de nom de fichier et un bouton de copie. Comme eux, il est coloré à la compilation. Le code passe en prop code, et non en enfant — dans le MDX rendu par Astro, les enfants d’un composant traversent la frontière en emplacement HTML, pas en chaîne.

src/lib/i18n.ts
export const locales = ['en', 'fr'] as const;
export type Locale = (typeof locales)[number];

export function isLocale(value: unknown): value is Locale {
return typeof value === 'string' && (locales as readonly string[]).includes(value);
}

Sans nom de fichier, le bouton de copie n’apparaît qu’au survol :

curl -s localhost:4321/rss.xml | head -20

Callout

💡

Information

Le variant par défaut. Le corps accepte du Markdown : gras, code, et liens.

⚠️

Avertissement

Quatre variants existent : info, warning, error, success.

Erreur

Celui-ci sert aux pièges et aux régressions connues.

Succès

Et celui-ci aux confirmations.

FileTree

src/components/mdx/

📁 src/
📁 components/
📁 mdx/
📄 blog-components.ts
📄 project-components.ts
📄 CodeBlock.astro
📄 ArchitectureBlocks.astro
📄 DataStructureDiagram.astro

ImageWithCaption

Couverture de l'article sur Claude Code
Une image avec sa légende, telle qu'elle s'insère dans le fil du texte.

ArchitectureBlocks

Premier des deux composants qui s’animent à l’entrée dans le champ. S’il reste invisible, c’est que l’hydratation client:visible n’a pas eu lieu.

Découpage du portfolio

Rendu

Pages .astro

Prérendues au build

Îlots React

Hydratés à la demande

Contenu

Collections

MDX validé par Zod

src/content

Textes par locale

Sortie

HTML statique
Cartes OG

PNG écrits au build

DataStructureDiagram

Du MDX à la page

Fichier MDX
src/content/blog/posts
glob
Collection
Schéma Zod
getEntry
render()
Astro
Content
HTML
dist/

YouTubeEmbed

TweetEmbed

N
@nath_hallouin
Twitter

Un rendu de citation, sans appel au réseau : le contenu est passé en prop.

View on Twitter →

CodeDemo

Un exemple encadré

export default function Hello() {
return <p>Bonjour</p>;
}

Fin

Si tout ce qui précède s’affiche, la table de composants de src/components/mdx/blog-components.ts est complète et fonctionnelle.

Footnotes

  1. Si ce renvoi mène bien en bas de page, les notes fonctionnent.

Tags

Partager

Commentaires

Les commentaires seront disponibles une fois Giscus configuré.

Configurer Giscus →

Navigation

Articles

Projets

Actions