Skip to content

Latest commit

 

History

History
310 lines (248 loc) · 7.76 KB

File metadata and controls

310 lines (248 loc) · 7.76 KB

🎉 Résumé des Changements - Système Interactif ToC + Auteurs

🎯 Objectif Atteint

Votre blog post est maintenant entièrement interactif avec :

Table des Matières (ToC) Dynamique ✨

📄 Post Content                          Sidebar (lg+)
───────────────────────────────────────────────────────
                                         📑 On this page
                                         ├─ Introduction
                                         ├─ Main Section 1
                                         │  ├─ Subsection 1.1
                                         │  └─ Subsection 1.2
                                         ├─ Main Section 2
                                         └─ Conclusion

                                         👥 Written by
                                         ├─ 👤 Tegra Kmd
                                         └─ 👤 Méschac Irung

🔄 Flux de Données

MDX File (Frontmatter + Content)
       │
       ├─ Frontmatter → authors: [tegra_kmd, ...]
       │               ↓
       │          AUTHORS DB (authors.ts)
       │               ↓
       │          AuthorsSection Component
       │
       └─ Content → extractHeadings()
                      ↓
                   Heading[] array
                      ↓
                   TableOfContents Component
                      ↓
                   Active highlight on scroll

📁 Architecture des Fichiers

app/
├── BlP/posts/[slug]/
│   └── page.tsx                    ← Page server du post
│       ├── getPost(slug)           ← Récupère le post
│       ├── extractHeadings()       ← Extrait la ToC
│       ├── getAuthorsBySlug()      ← Récupère les auteurs
│       └── Rendu des composants
│
└── content/
    ├── 001-vlog.mdx               ← Post avec authors config
    └── 002-async-work.mdx         ← Post d'exemple complet

src/
├── lib/
│   ├── mdx-utils.ts               ← Logique extraction en-têtes
│   └── post.ts                    ← Schéma post + authors field
│
├── components/
│   ├── TableOfContents.tsx        ← ToC interactive (client)
│   └── AuthorsSection.tsx         ← Affichage auteurs (client)
│
├── data/
│   └── authors.ts                 ← DB centralisée auteurs
│
└── features/mdx/
    ├── mdx-components.tsx         ← Config MDX + h2/h3
    └── mdx-heading-wrapper.tsx    ← Wrapper heading → ID auto

🔌 Intégration Step-by-Step

1️⃣ Page du Post (page.tsx)

// ✓ Récupère le post avec son contenu MDX
const post = await getPost(slug);

// ✓ Extrait les en-têtes automatiquement
const headings = extractHeadings(post.content);

// ✓ Récupère les auteurs depuis le frontmatter
const authors = getAuthorsBySlug(post.authors || []);

// ✓ Passe les données aux composants
<TableOfContents headings={headings} />
<AuthorsSection authors={authors} />

2️⃣ Composant ToC (Client-Side)

export function TableOfContents({ headings }) {
  // ✓ Track heading actif avec Intersection Observer
  const [activeId, setActiveId] = useState("");

  // ✓ Affiche la liste avec styling actif
  // ✓ Smooth scroll au clic
  // ✓ Met à jour activeId lors du scroll
}

3️⃣ Composant Auteurs (Client-Side)

export function AuthorsSection({ authors }) {
  // ✓ Affiche chaque auteur avec son image et nom
  // ✓ Responsive et stylisé
}

4️⃣ Extraction En-têtes (mdx-utils.ts)

export function extractHeadings(content: string): Heading[] {
  // ✓ Parse le contenu MDX brut
  // ✓ Trouve tous les ## et ###
  // ✓ Génère les IDs automatiquement (slugify)
  // ✓ Retourne un array de Heading
}

📊 Données Extraites

Exemple : Post "L'Avenir du Travail Asynchrone"

// Headings extraits automatiquement
const headings = [
  { id: "introduction", text: "Introduction", level: 2 },
  {
    id: "les-avantages-de-lasynchrone",
    text: "Les Avantages de l'Asynchrone",
    level: 2,
  },
  { id: "flexibilite-maximale", text: "Flexibilité Maximale", level: 3 },
  { id: "meilleure-documentation", text: "Meilleure Documentation", level: 3 },
  { id: "inclusivite-mondiale", text: "Inclusivité Mondiale", level: 3 },
  // ... plus d'en-têtes
];

// Auteurs du frontmatter
const post = {
  title: "L'Avenir du Travail Asynchrone",
  authors: ["tegra_kmd"],
  content: "...",
};

// Auteurs résolus
const authors = [
  {
    name: "Tegra Kmd",
    image: "/avat.webp",
    bio: "Developer & Content Creator",
  },
];

🎨 Comportement Utilisateur

Avant (Statique)

❌ En-têtes sont hardcodés
❌ Navigation manuelle
❌ Auteurs en dur
❌ Pas de suivi actif

Après (Dynamique) ✨

✅ En-têtes générés du contenu
✅ Navigation fluide et interactive
✅ Auteurs configurables
✅ Suivi actif au scroll
✅ Design responsive
✅ Sticky sidebar

💾 Stockage des Auteurs

Centralisé dans authors.ts

// ❌ AVANT - Hardcodé dans chaque page
const authors = [
  { name: "Tegra Kmd", image: "/avat.webp" },
  { name: "Méschac Irung", image: "https://..." },
];

// ✅ APRÈS - Centralisé et réutilisable
export const AUTHORS = {
  tegra_kmd: {
    /* ... */
  },
  meschac_irung: {
    /* ... */
  },
};

// Utilisation simple
const authors = getAuthorsBySlug(["tegra_kmd"]);

🎯 Cas d'Usage

Cas 1 : Ajouter un Post

---
title: "Mon Article"
authors:
  - tegra_kmd
  - meschac_irung
---
## Section 1
...
## Section 2
...

→ ToC et Auteurs sont automatiquement générés ! 🎉

Cas 2 : Ajouter un Auteur

// Dans authors.ts
export const AUTHORS = {
  // ...
  nouveau_auteur: {
    name: "Nouveau Auteur",
    image: "/new-avatar.jpg",
  },
};

→ Disponible immédiatement dans tous les posts ! ✨

Cas 3 : Modifier l'Ordre des Auteurs

authors:
  - meschac_irung # Maintenant en premier
  - tegra_kmd

→ L'ordre s'affiche correctement ! 🔄

🚀 Performance

✓ Extraction en-têtes : O(n) avec regex
✓ Lookup auteurs : O(1) avec object keys
✓ Component rendering : Memoized
✓ Scroll tracking : Intersection Observer (efficace)
✓ Aucune requête supplémentaire

📱 Responsive Design

Mobile (< 768px)          Tablet (768px - 1024px)    Desktop (1024px+)
───────────────           ──────────────────────      ──────────────────
Article                   Article | Sidebar           Article | Sidebar
  (pas de sidebar)          (réduire)                   (full size)

✓ Toujours lisible
✓ Pas de reflow
✓ Navigation intact

🎯 Prochaines Étapes (Optionnel)

  1. Ajouter plus d'auteurs → Éditer authors.ts
  2. Publier les posts → Mettre published: true
  3. Personnaliser styles → Tailwind classes
  4. Ajouter CMS → Sanity/Contentful integration

✅ Checklist Complète

  • Extraction automatique des en-têtes
  • Table des matières interactive
  • Suivi actif au scroll
  • Navigation fluide
  • Auteurs configurables
  • Base de données centralisée
  • Components réutilisables
  • TypeScript strict
  • Responsive design
  • Pas d'erreurs de compilation
  • Documentation complète
  • Exemples fonctionnels

🎉 Vous êtes prêt à utiliser le système !

Pour plus de détails, consultez :

  • /GUIDE_TOC_AUTHORS.md - Guide détaillé
  • /README_TOC_INTERACTIVE.md - Documentation complète