diff --git a/README.md b/README.md index 7ef6ba9..7ac7b6c 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ pnpm run build:antdv-next - QQBot / 账号连接页拆分 OneBot 连接、QQ 登录、NapCat 运行和运行说明列;更新登录通过 SSE 展示 quick / password / captcha / new-device / qrcode 每步中文进度,密码登录触发 QQ 安全验证时在弹窗内完成腾讯验证码并回交 API,新设备验证二维码和腾讯验证码分开展示;行操作“运行态”打开只读抽屉,展示 NapCat runtime/protocol/session behavior profile、风险模式和登录事件证据。 - QQBot / 插件平台页保留在线命令能力表,并提供 manifest 校验、本地插件安装、安装记录、运行事件和账号绑定抽屉,接口走 `/qqbot/plugin-platform/*`。 - 博客管理 / 文章管理提供“预览”行操作,打开隐藏二级路由 `/blog/article/:articleId/preview`;预览页按 NapCat WebUI 的微服务嵌入形态实现,iframe 独占容器,文章标题、状态、预览 Host 和返回/刷新/新窗口操作放在右下角悬浮卡片,不占用 iframe 布局空间。新增隐藏路由和按钮权限需要同步 API `blog-menu.sql` / `vben-admin-init.sql` 中的 `BlogArticlePreview` 与 `BlogArticlePreviewButton`。 -- 博客管理 / 文章表单支持 Markdown、富文本 HTML、源码 HTML 三种编辑模式:Markdown 继续使用 Milkdown 并保存 `contentFormat=markdown`;富文本 HTML 使用 Tiptap 并保存 `contentFormat=html`;源码 HTML 用于保留 WordPress/Argon 运行时 DOM,同样保存 `contentFormat=html`。 +- 博客管理 / 文章表单支持 Markdown、富文本 HTML、源码 HTML 三种编辑模式:Markdown 继续使用 Milkdown/Crepe 并保存 `contentFormat=markdown`;富文本 HTML 使用 Tiptap 并保存 `contentFormat=html`;源码 HTML 用于保留 WordPress/Argon 运行时 DOM,同样保存 `contentFormat=html`。Milkdown/Crepe 必须先引入 `@milkdown/crepe/theme/common/style.css`,再引入具体主题 CSS,否则生产包只有主题变量没有工具栏/菜单布局样式。 ## 部署说明 diff --git a/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.spec.ts b/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.spec.ts new file mode 100644 index 0000000..de5cce2 --- /dev/null +++ b/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.spec.ts @@ -0,0 +1,22 @@ +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { describe, expect, it } from 'vitest'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const source = readFileSync(path.join(dirname, 'KtMilkdownEditor.tsx'), 'utf8'); + +describe('ktMilkdownEditor styles', () => { + it('loads Crepe base layout styles before the selected theme variables', () => { + const commonStyleIndex = source.indexOf( + "import '@milkdown/crepe/theme/common/style.css';", + ); + const frameThemeIndex = source.indexOf( + "import '@milkdown/crepe/theme/frame.css';", + ); + + expect(commonStyleIndex).toBeGreaterThanOrEqual(0); + expect(frameThemeIndex).toBeGreaterThan(commonStyleIndex); + }); +}); diff --git a/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.tsx b/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.tsx index ec14a20..dd6933d 100644 --- a/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.tsx +++ b/apps/web-antdv-next/src/components/markdown/KtMilkdownEditor.tsx @@ -14,6 +14,7 @@ import { import { Crepe, CrepeFeature } from '@milkdown/crepe'; +import '@milkdown/crepe/theme/common/style.css'; import '@milkdown/crepe/theme/frame.css'; import './KtMilkdownEditor.scss';