wiki-vitepress

Assemble le Markdown wiki généré en un site statique VitePress avec thème sombre, diagrammes Mermaid en mode sombre avec zoom au clic, et sortie de build de production. À utiliser quand l'utilisateur souhaite créer un site web navigable à partir de pages wiki générées.

npx skills add https://github.com/microsoft/skills --skill wiki-vitepress

Wiki VitePress Packager

Transformez les fichiers Markdown de wiki générés en un site statique VitePress élégant avec thème sombre et diagrammes Mermaid interactifs.

Quand activer

  • L'utilisateur demande de « construire un site » ou « packager en VitePress »
  • L'utilisateur exécute la commande /deep-wiki:build
  • L'utilisateur souhaite une sortie HTML navigable à partir des pages wiki générées

Scaffolding VitePress

Générez la structure suivante dans un répertoire wiki-site/ :

wiki-site/
├── .vitepress/
│   ├── config.mts
│   └── theme/
│       ├── index.ts
│       └── custom.css
├── public/
├── [generated .md pages]
├── package.json
└── index.md

Exigences de configuration (config.mts)

  • Utilisez le wrapper withMermaid de vitepress-plugin-mermaid
  • Définissez appearance: 'dark' pour un thème sombre uniquement
  • Configurez themeConfig.nav et themeConfig.sidebar à partir de la structure du catalogue
  • La configuration Mermaid doit définir les variables de thème sombre :
mermaid: {
  theme: 'dark',
  themeVariables: {
    primaryColor: '#1e3a5f',
    primaryTextColor: '#e0e0e0',
    primaryBorderColor: '#4a9eed',
    lineColor: '#4a9eed',
    secondaryColor: '#2d4a3e',
    tertiaryColor: '#2d2d3d',
    background: '#1a1a2e',
    mainBkg: '#1e3a5f',
    nodeBorder: '#4a9eed',
    clusterBkg: '#16213e',
    titleColor: '#e0e0e0',
    edgeLabelBackground: '#1a1a2e'
  }
}

Mermaid en mode sombre : correctif à trois niveaux

Niveau 1 : Variables de thème (dans config.mts)

Définissez via mermaid.themeVariables comme montré ci-dessus.

Niveau 2 : Surcharges CSS (custom.css)

Ciblez les éléments SVG Mermaid avec !important :

.mermaid .node rect,
.mermaid .node circle,
.mermaid .node polygon { fill: #1e3a5f !important; stroke: #4a9eed !important; }
.mermaid .edgeLabel { background-color: #1a1a2e !important; color: #e0e0e0 !important; }
.mermaid text { fill: #e0e0e0 !important; }
.mermaid .label { color: #e0e0e0 !important; }

Niveau 3 : Remplacement de style inline (theme/index.ts)

Les attributs style inline de Mermaid écrasent tout. Utilisez onMounted + polling pour les remplacer :

import { onMounted } from 'vue'

// Dans setup()
onMounted(() => {
  let attempts = 0
  const fix = setInterval(() => {
    document.querySelectorAll('.mermaid svg [style]').forEach(el => {
      const s = (el as HTMLElement).style
      if (s.fill && !s.fill.includes('#1e3a5f')) s.fill = '#1e3a5f'
      if (s.stroke && !s.stroke.includes('#4a9eed')) s.stroke = '#4a9eed'
      if (s.color) s.color = '#e0e0e0'
    })
    if (++attempts >= 20) clearInterval(fix)
  }, 500)
})

Utilisez setup() avec onMounted, PAS enhanceApp() — le DOM n'existe pas pendant le rendu côté serveur.

Click-to-Zoom pour diagrammes Mermaid

Enrobez chaque conteneur .mermaid dans un wrapper cliquable qui ouvre une modale fullscreen :

document.querySelectorAll('.mermaid').forEach(el => {
  el.style.cursor = 'zoom-in'
  el.addEventListener('click', () => {
    const modal = document.createElement('div')
    modal.className = 'mermaid-zoom-modal'
    modal.innerHTML = el.outerHTML
    modal.addEventListener('click', () => modal.remove())
    document.body.appendChild(modal)
  })
})

CSS de la modale :

.mermaid-zoom-modal {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.9);
  display: flex; align-items: center; justify-content: center;
  z-index: 9999; cursor: zoom-out;
}
.mermaid-zoom-modal .mermaid { transform: scale(1.5); }

Règles de post-traitement

Avant la génération VitePress, analysez tous les fichiers .md et corrigez :

  • Remplacez <br/> par <br> (compatibilité du compilateur de template Vue)
  • Enrobez les paramètres génériques nus <T> en backticks en dehors des blocs de code
  • Assurez-vous que chaque page possède un frontmatter YAML avec title et description

Générer

cd wiki-site && npm install && npm run docs:build

La sortie va dans wiki-site/.vitepress/dist/.

Pièges connus

  • Mermaid s'affiche en asynchrone — les SVG n'existent pas quand onMounted s'exécute. Doit faire du polling.
  • L'option du compilateur isCustomElement pour les balises nues <T> cause des plantages pires — NE L'utilisez PAS
  • Le texte dans les nœuds Mermaid utilise style inline avec la plus haute spécificité — CSS seul ne suffira pas
  • enhanceApp() s'exécute pendant le rendu côté serveur où document n'existe pas — utilisez setup() uniquement

Skills similaires