Affected area
Desktop UI (agent-gui / React) / Gateway WebUI(共用 agent-ui 的 Markdown 渲染)
Version or commit
v1.3.5(桌面端)。正文引用的代码在 main@4eb6a4a8 上未变动。
Environment
OS:Windows 11 x64
部署方式:Tauri 桌面应用
Theme:设置 → 外观 设为 Dark
影响范围:Markdown 中的 Mermaid 图表,内嵌渲染与全屏查看都受影响
模型供应商:不相关
Steps to reproduce
设置 → 外观,切到 Dark。
打开一条包含 Mermaid 代码块的会话消息(或让模型直接输出下面这段):
flowchart LR
A[用户输入] --> B{参数校验}
B -->|通过| C[执行任务]
B -->|失败| D[返回错误]
C --> E[完成]
Loading
观察连线、箭头、节点文字和子图标题。
点图表右上角的全屏按钮,再看一次。
切回 Light 对比同一份 Markdown。
Expected behavior
图表跟随当前生效主题渲染:深色下用深色配色,连线、箭头、文字在聊天面板背景上保持可读的对比度;明暗切换后立即重绘;内嵌和全屏表现一致。
Actual behavior
图表始终按 mermaid 的 default(浅色)主题出图,跟当前是明是暗无关。
深色下,连线、箭头以及没有底色块托着的文字用的是 #333333 / #333,和聊天面板深色底几乎分不开(#333333 对 --background: 224 22% 9%,对比度约 1.4:1),图的结构看不出来;能看清的只有节点里那一块块浅色底。节点和子图底色仍是浅色(#ECECFF、#FBFBFF),甘特图这类图表还会直接给出白色区块,和周围深色界面割裂。Light 下同一份 Markdown 显示正常。
截图见文末。
根因
crates/agent-ui/src/components/Markdown.tsx:7 直接引 @streamdown/mermaid 的预置插件 mermaid,:212 只把它注册进 plugins,从不传 config;Streamdown 的 mermaid={{ config }} 入口(streamdown@2.5.0 的 MermaidOptions)也没用上。
@streamdown/mermaid@1.0.2 里默认配置写死 { startOnLoad: false, theme: "default", securityLevel: "strict", fontFamily: "monospace", suppressErrorRendering: true },没有跟随系统或应用主题的逻辑,插件注册后只有 initialize(config) 能改。
mermaid 11.16.1 的 default 主题(dist 里 src/themes/theme-default.js 段)整套是给白底设计的:lineColor / arrowheadColor #333333、textColor #333、primaryColor #ECECFF、clusterBkg #FBFBFF、noteBkgColor #fff5ad、altSectionBkgColor white。
应用侧只把容器压成透明,没有任何配色覆盖:crates/agent-ui/src/styles/common-components.css:191-207、Markdown.tsx 里 data-streamdown='mermaid' 那一串 bg-transparent、crates/agent-ui/src/styles/base.css:317-323;也没给图表垫一层浅色底衬。
全屏查看器另走一条渲染:crates/agent-ui/src/components/MarkdownMermaidFullscreen.tsx:78-80 直接 mermaid.getMermaid().render(...),同样不带主题配置,弹窗自己是 bg-background(:169),所以问题一致。
主题切换是 root.classList.toggle("dark", ...)(crates/agent-gui/src/App.tsx:268),没有任何代码据此重新初始化或重绘 mermaid。即使补上配置,切换主题后也要确认图表是否重渲染。
解决思路
按当前生效主题给两套配置:createMermaidPlugin({ config: { theme: isDark ? "dark" : "default" } }),或走 Streamdown 的 mermaid={{ config }} 入口。主题可以由现成的 resolveEffectiveTheme(crates/agent-ui/src/lib/settings/themeAndMemory.ts:18)拿到,Desktop 侧 ChatPage.tsx:293、WebUI 侧 GatewayApp.tsx:214 已经在算这个值。
主题变化时重新渲染图表:重新 initialize 并 remount(或给 Mermaid block 一个跟随主题的 key),不要指望颜色自己跟着变。
全屏那条路径要一起处理,它不走 Streamdown 的渲染,自己调 getMermaid()。
不要用 CSS filter: invert() 之类的补丁盖过去,颜色会失真,导出 SVG / PNG 也会带上。
建议顺带覆盖几类图表(flowchart、sequence、gantt、class),并把主题切换纳入验证项;crates/agent-gui/test/chat/ 下已有 mermaid 相关用例可以挂。
相关
同一段 Mermaid 渲染链路上的既有问题:#522 (全屏缩放模糊)、#284 (大图拖动抖动)。这两条是清晰度,本条是配色。
Logs / screenshots
Affected area
Desktop UI (agent-gui / React) / Gateway WebUI(共用
agent-ui的 Markdown 渲染)Version or commit
v1.3.5(桌面端)。正文引用的代码在main@4eb6a4a8上未变动。Environment
Steps to reproduce
flowchart LR A[用户输入] --> B{参数校验} B -->|通过| C[执行任务] B -->|失败| D[返回错误] C --> E[完成]Expected behavior
图表跟随当前生效主题渲染:深色下用深色配色,连线、箭头、文字在聊天面板背景上保持可读的对比度;明暗切换后立即重绘;内嵌和全屏表现一致。
Actual behavior
图表始终按 mermaid 的
default(浅色)主题出图,跟当前是明是暗无关。深色下,连线、箭头以及没有底色块托着的文字用的是
#333333/#333,和聊天面板深色底几乎分不开(#333333对--background: 224 22% 9%,对比度约 1.4:1),图的结构看不出来;能看清的只有节点里那一块块浅色底。节点和子图底色仍是浅色(#ECECFF、#FBFBFF),甘特图这类图表还会直接给出白色区块,和周围深色界面割裂。Light 下同一份 Markdown 显示正常。截图见文末。
根因
crates/agent-ui/src/components/Markdown.tsx:7直接引@streamdown/mermaid的预置插件mermaid,:212只把它注册进plugins,从不传 config;Streamdown的mermaid={{ config }}入口(streamdown@2.5.0的MermaidOptions)也没用上。@streamdown/mermaid@1.0.2里默认配置写死{ startOnLoad: false, theme: "default", securityLevel: "strict", fontFamily: "monospace", suppressErrorRendering: true },没有跟随系统或应用主题的逻辑,插件注册后只有initialize(config)能改。default主题(dist里src/themes/theme-default.js段)整套是给白底设计的:lineColor/arrowheadColor#333333、textColor#333、primaryColor#ECECFF、clusterBkg#FBFBFF、noteBkgColor#fff5ad、altSectionBkgColorwhite。crates/agent-ui/src/styles/common-components.css:191-207、Markdown.tsx里data-streamdown='mermaid'那一串bg-transparent、crates/agent-ui/src/styles/base.css:317-323;也没给图表垫一层浅色底衬。crates/agent-ui/src/components/MarkdownMermaidFullscreen.tsx:78-80直接mermaid.getMermaid().render(...),同样不带主题配置,弹窗自己是bg-background(:169),所以问题一致。root.classList.toggle("dark", ...)(crates/agent-gui/src/App.tsx:268),没有任何代码据此重新初始化或重绘 mermaid。即使补上配置,切换主题后也要确认图表是否重渲染。解决思路
createMermaidPlugin({ config: { theme: isDark ? "dark" : "default" } }),或走 Streamdown 的mermaid={{ config }}入口。主题可以由现成的resolveEffectiveTheme(crates/agent-ui/src/lib/settings/themeAndMemory.ts:18)拿到,Desktop 侧ChatPage.tsx:293、WebUI 侧GatewayApp.tsx:214已经在算这个值。getMermaid()。filter: invert()之类的补丁盖过去,颜色会失真,导出 SVG / PNG 也会带上。crates/agent-gui/test/chat/下已有 mermaid 相关用例可以挂。相关
同一段 Mermaid 渲染链路上的既有问题:#522(全屏缩放模糊)、#284(大图拖动抖动)。这两条是清晰度,本条是配色。
Logs / screenshots