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
withMermaiddevitepress-plugin-mermaid - Définissez
appearance: 'dark'pour un thème sombre uniquement - Configurez
themeConfig.navetthemeConfig.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
titleetdescription
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
onMounteds'exécute. Doit faire du polling. - L'option du compilateur
isCustomElementpour les balises nues<T>cause des plantages pires — NE L'utilisez PAS - Le texte dans les nœuds Mermaid utilise
styleinline avec la plus haute spécificité — CSS seul ne suffira pas enhanceApp()s'exécute pendant le rendu côté serveur oùdocumentn'existe pas — utilisezsetup()uniquement