feat(editor): implement WYSIWYG Markdown editor using Milkdown Crepe

Replace the existing contenteditable-based markdown editor with a full-featured WYSIWYG editor using @milkdown/crepe. The new implementation provides:
- True WYSIWYG editing experience with instant Markdown syntax rendering
- Slash command menu support for quick formatting
- Code block highlighting and image paste support
- Built-in export to markdown file functionality

Changes include new MilkdownEditor component, updated App.vue integration, theme styling imports, and optimized Vite configuration for the new dependencies.
This commit is contained in:
2026-01-18 09:08:38 +08:00
parent d9ab341223
commit 55c1b180f7
8 changed files with 2581 additions and 142 deletions
+97
View File
@@ -0,0 +1,97 @@
<template>
<div class="editor-container">
<button class="export-btn" @click="exportMarkdown">导出文件</button>
<div ref="root" class="milkdown-editor"></div>
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { Crepe } from '@milkdown/crepe'
const root = ref(null)
let crepe = null
onMounted(async () => {
if (!root.value) return
crepe = new Crepe({
root: root.value,
defaultValue: '# Welcome to Milkdown\n\nStart writing your markdown content here...',
})
await crepe.create()
})
const exportMarkdown = async () => {
if (!crepe) return
const markdown = await crepe.getMarkdown()
const blob = new Blob([markdown], { type: 'text/markdown' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = `document-${Date.now()}.md`
a.click()
URL.revokeObjectURL(url)
}
</script>
<style scoped>
.editor-container {
position: relative;
}
.export-btn {
position: fixed;
top: 20px;
right: 20px;
padding: 8px 16px;
background-color: #4a90d9;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
z-index: 1000;
}
.export-btn:hover {
background-color: #3a7bc8;
}
.milkdown-editor {
width: 100vw;
height: 100vh;
background-color: #ffffff;
overflow-y: auto;
}
/* 当内容不超过视口时隐藏滚动条 */
.milkdown-editor::-webkit-scrollbar {
width: 8px;
}
.milkdown-editor::-webkit-scrollbar-track {
background: transparent;
}
.milkdown-editor::-webkit-scrollbar-thumb {
background-color: #ddd;
border-radius: 4px;
}
/* 编辑器内容容器样式 */
.milkdown-editor :deep(.milkdown) {
max-width: 900px;
margin: 0 auto !important;
padding: 20px 40px !important;
min-height: calc(100vh - 40px);
}
/* 全局覆盖所有元素的边距 */
.milkdown-editor :deep(*) {
margin-top: 0 !important;
margin-bottom: 0 !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
</style>