Skip to content

[Bug] 深色模式下 Mermaid 图表看不清(渲染未跟随主题) #816

Description

@AlphaCatMeow

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

  1. 设置 → 外观,切到 Dark。
  2. 打开一条包含 Mermaid 代码块的会话消息(或让模型直接输出下面这段):
flowchart LR
  A[用户输入] --> B{参数校验}
  B -->|通过| C[执行任务]
  B -->|失败| D[返回错误]
  C --> E[完成]
Loading
  1. 观察连线、箭头、节点文字和子图标题。
  2. 点图表右上角的全屏按钮,再看一次。
  3. 切回 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;Streamdownmermaid={{ config }} 入口(streamdown@2.5.0MermaidOptions)也没用上。
  • @streamdown/mermaid@1.0.2 里默认配置写死 { startOnLoad: false, theme: "default", securityLevel: "strict", fontFamily: "monospace", suppressErrorRendering: true },没有跟随系统或应用主题的逻辑,插件注册后只有 initialize(config) 能改。
  • mermaid 11.16.1 的 default 主题(distsrc/themes/theme-default.js 段)整套是给白底设计的:lineColor / arrowheadColor #333333textColor #333primaryColor #ECECFFclusterBkg #FBFBFFnoteBkgColor #fff5adaltSectionBkgColor white
  • 应用侧只把容器压成透明,没有任何配色覆盖:crates/agent-ui/src/styles/common-components.css:191-207Markdown.tsxdata-streamdown='mermaid' 那一串 bg-transparentcrates/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。即使补上配置,切换主题后也要确认图表是否重渲染。

解决思路

  1. 按当前生效主题给两套配置:createMermaidPlugin({ config: { theme: isDark ? "dark" : "default" } }),或走 Streamdown 的 mermaid={{ config }} 入口。主题可以由现成的 resolveEffectiveThemecrates/agent-ui/src/lib/settings/themeAndMemory.ts:18)拿到,Desktop 侧 ChatPage.tsx:293、WebUI 侧 GatewayApp.tsx:214 已经在算这个值。
  2. 主题变化时重新渲染图表:重新 initialize 并 remount(或给 Mermaid block 一个跟随主题的 key),不要指望颜色自己跟着变。
  3. 全屏那条路径要一起处理,它不走 Streamdown 的渲染,自己调 getMermaid()
  4. 不要用 CSS filter: invert() 之类的补丁盖过去,颜色会失真,导出 SVG / PNG 也会带上。
  5. 建议顺带覆盖几类图表(flowchart、sequence、gantt、class),并把主题切换纳入验证项;crates/agent-gui/test/chat/ 下已有 mermaid 相关用例可以挂。

相关

同一段 Mermaid 渲染链路上的既有问题:#522(全屏缩放模糊)、#284(大图拖动抖动)。这两条是清晰度,本条是配色。

Logs / screenshots

  • 运行时无报错日志。
  • 截图:
Image

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions