图表 默认启用 v1.1.0
SVG 图表、Mermaid 图表和交互式可视化 — 在聊天界面中内联渲染。从架构概览到交互式数据仪表盘,此技能可将任何可视化请求转化为直接在对话中渲染的输出。
| 技能名称 | diagram |
| 版本 | 1.1.0 |
| 默认启用 | 是 — 始终注入,无需 /skill load |
| 输出格式 | 内联 SVG、Mermaid 代码块、diagram-html 组件 |
| 触发条件 | 任何需要可视化说明的请求:流程图、对比图、时间线、图表、地图、模拟、原型 |
| 参考模块 | svg-components、color-palette、module-chart、module-widget、module-interactive、module-map、module-mockup、module-art |
设计原则
此技能生成的每个图表都遵循四个核心原则:
- 扁平化 — 无渐变、阴影、模糊、光晕或装饰效果。仅使用干净的扁平表面。
- 紧凑 — 内联展示关键信息。其余内容在回复文本中说明。
- 适配主题 — 每种颜色在浅色和深色模式下都能正常显示。SVG 使用 CSS 类,canvas/JS 使用
window.__jawTokens。 - 文本在回复中,视觉在工具中 — 所有解释性文字放在图表外部。切勿在 SVG 或组件 HTML 中放置大段说明文字。
复杂度预算
对每个图表强制执行的硬性限制,以防止视觉噪音:
| 约束 | 限制 | 溢出策略 |
|---|---|---|
| 方框副标题 | 最多 5 个单词 | 将详细信息移至 sendPrompt() 或文字说明 |
| 每个图表的颜色渐变 | 最多 2 组 | 合并类别 |
| 水平行(680px) | 最多 4 个方框 | 缩小或换行为 2 行 |
| 每个图表的节点数 | 最多 6 个 | 拆分为概览图 + 详细图 |
| 连续可视化块 | 禁止 | SVG/组件块之间始终添加文字说明 |
图表类型选择
此技能根据动词而非名词进行路由。同一主题可以根据用户的请求生成不同类型的图表。当某种类型可以直接映射到原生 Mermaid 语法时,优先使用 Mermaid 而非手动编写 SVG。
SVG 类型
| 用户意图 | 类型 | 输出 |
|---|---|---|
| "X 是如何工作的" | 图解式 SVG | 空间隐喻、剖面图、物理布局 |
| "X 的架构"(系统上下文) | 结构式 SVG | 容器、区域、嵌套 |
| "X 的步骤"(通用流程) | 流程图 SVG 或 Mermaid flowchart | 自上而下的方框 + 箭头 |
| "比较 A 和 B" | 对比式 SVG | 并排列 |
Mermaid 类型
| 用户意图 | Mermaid 语法 | 状态 |
|---|---|---|
| 数据库模式 / 实体关系 | erDiagram | 稳定 |
| 类图 / 面向对象结构 | classDiagram | 稳定 |
| 状态机 / 生命周期 | stateDiagram-v2 | 稳定 |
| 时序 / 调用顺序 / API 流程 | sequenceDiagram | 稳定 |
| 时间线 / 路线图 / 历史 | timeline | 稳定 |
| 思维导图 / 头脑风暴 | mindmap | 稳定 |
| Git 分支 / 发布历史 | gitGraph | 稳定 |
| 优先级象限 / 2x2 矩阵 | quadrantChart | 稳定 |
| 甘特图 / 项目进度 | gantt | 稳定 |
| 用户旅程图 | journey | 稳定 |
| 饼图分解 | pie | 稳定 |
| 雷达图 / 蛛网图 / 技能概况 | radar-beta | 测试版 (v11.6+) |
| 看板 | kanban | 测试版 (v11.12+) |
| 云 / 基础设施架构 | architecture-beta | 测试版 |
| 层级结构 / 比例大小 | treemap-beta | 测试版 |
| 自由块布局 | block-beta | 测试版 |
交互式 HTML 组件类型
| 用户意图 | 输出 | 库 |
|---|---|---|
| "展示数据 / 图表" | diagram-html 组件 | Chart.js、D3、ECharts |
| "模拟 / 交互" | diagram-html 组件 | Matter.js、Canvas、滑块 |
| "交互式地图" | diagram-html 组件 | Leaflet + OpenStreetMap |
| "静态分级统计图" | diagram-html 组件 | D3 + TopoJSON |
classDiagram/sequenceDiagram/stateDiagram 已存在时,此技能不会手动编写 SVG。Mermaid 注意事项
使用 Mermaid 图表类型时的重要注意事项:
C4Context、C4Container 等)— 深色模式下主题令牌未被应用,导致文字不可读。请使用下面的替代表。| C4 类型 | 替代方案 |
|---|---|
| C4 System Context | 结构式 SVG(自定义)或 Mermaid flowchart 配合 subgraphs |
| C4 Container | Mermaid architecture-beta |
| C4 Component | Mermaid flowchart 配合 subgraph 分组 |
| C4 Dynamic | Mermaid sequenceDiagram |
| C4 Deployment | Mermaid architecture-beta |
其他注意事项:
sankey-beta/xychart-beta在窄聊天宽度下会出问题。建议使用diagram-html+ ECharts sankey 或 Chart.js 来绘制 XY 图表。radar-beta需要-beta后缀(Mermaid v11.6+)。其他测试版类型:treemap-beta、block-beta、architecture-beta、packet-beta、kanban。- 所有稳定版 Mermaid 类型会自动继承宿主的深色/浅色主题。请勿在
%%{init: ...}%%中设置显式颜色,除非出于语义原因需要覆盖。
输出格式
1. 内联 SVG(静态图表)
直接在回复中输出原始 <svg> 标记。聊天界面会内联渲染。
<svg viewBox="0 0 680 {height}" xmlns="http://www.w3.org/2000/svg"
role="img" aria-labelledby="title-id desc-id">
<title id="title-id">Diagram Title</title>
<desc id="desc-id">Brief description for screen readers</desc>
<!-- shapes, text, paths -->
</svg>
内联 SVG 规则
- viewBox 宽度必须为 680(匹配容器宽度 — 切勿更改)
- 高度根据内容变化:最后一个元素底部 + 40px 内边距
- 每个 SVG 必须包含
role="img"+<title>+<desc> - 使用设计系统中的 CSS 类(
.node、.connector、.label、.label-start) .label强制text-anchor: middle(仅居中);左对齐文本请使用.label-start- 颜色:使用 CSS 类,而非内联
fill/stroke - 字体族继承自宿主 — 请勿设置显式字体
2. Mermaid(结构化图表)
标准 ```mermaid 代码块。现有渲染器会自动处理。
```mermaid
sequenceDiagram
participant A as Client
participant B as Server
A->>B: GET /api/data
B-->>A: 200 OK (JSON)
```
3. 交互式 HTML 组件(图表、控件、模拟)
封装在 ```diagram-html 代码块中。在宿主创建的沙盒 iframe 内渲染。
```diagram-html
<div id="chart-wrapper" style="position: relative; width: 100%; height: 300px;">
<canvas id="myChart" role="img" aria-label="Chart description">
Fallback text
</canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"
onerror="document.body.innerHTML='<p>Chart library failed to load.</p>'">
</script>
<script>
const isDark = window.__jawTheme?.isDark ?? true;
// ... Chart.js code
</script>
```
diagram-html 组件,始终将 <style> 和 <link> 标签放在前面,然后是 HTML 结构,最后是 <script> 标签。这确保在流式传输期间视觉内容先于脚本执行呈现。交付机制
所有三种格式 — 内联 SVG、```mermaid、```diagram-html — 都在聊天回复中内联渲染。jaw 前端解析回复文本并自动挂载它们。diagram-html 会被放入宿主创建的沙盒 <iframe> 中;此技能不会创建 iframe。
保存为 .svg / .html / .png 文件(Write 工具、cat >、fs.writeFile)
将原始代码块直接粘贴到回复文本中
将 diagram-html 包裹在 <iframe> / <html> / <body> / <head> 中
从 <div> / <canvas> / <style> 开始 — 宿主注入外壳
通过 /api/channel/send 或 Telegram/Discord 发送(不是附件)
让渲染器处理;图表就是回复文本
引用外部图片 URL 并称之为图表
输出 SVG/组件代码本身
SVG 设计系统
设计禁止列表
对所有 SVG 输出强制执行的质量规则(与下面的安全限制分开):
- 无渐变、投影、模糊、光晕或霓虹效果
- 无表情符号 — 使用 CSS 形状或 SVG 路径
- 无装饰性步骤编号或超大标题
- 流程图方框内无图标或插图 — 仅限文字
- 无旋转文字
- 外部容器无深色/彩色背景(仅限透明 — 宿主提供背景)
- 描边宽度:边框和边缘为 0.5px(不是 1px 或 2px)
- 字重:仅 400(常规)和 500(粗体)— 绝不使用 600 或 700
- 字号:仅 14px(节点标签)和 12px(副标题/箭头标签)
- 句首大写 始终如此 — 绝不使用首字母大写或全大写
安全限制(内联 SVG)
以下元素和属性会被 DOMPurify 剥离。切勿在内联 <svg> 中使用:
| 禁止的元素/属性 | 原因 | 替代方案 |
|---|---|---|
<foreignObject> | 在 SVG 中嵌入 HTML(XSS 攻击向量) | 使用原生 SVG 元素 |
<animate>、<set>、<animateTransform>、<animateMotion> | 动画 XSS 攻击向量 | 仅限静态 SVG |
嵌套 <svg> | 解析问题 | 使用 <g> 分组 |
xlink:href | 外部 URL 注入 | 仅在 <use> 上使用 href="#fragment" |
所有 on* 事件处理器 | 被 DOMPurify 剥离 | 内联 SVG 中不可用 |
diagram-html 内容在沙盒 iframe 内运行,其中允许使用 <script>、on* 处理器和 CDN 导入。上述限制仅适用于在主文档中渲染的内联 SVG。颜色渐变组(9 种语义颜色)
每组渐变有 3 种色调:填充(背景)、描边(边框)和文字(标签)。始终使用 CSS 类名,而非内联颜色。
| 渐变组 | CSS 前缀 | 推荐用途 |
|---|---|---|
| 青色 | .c-cyan | 通用类别(中性信息的首选) |
| 粉色 | .c-pink | 通用类别、高亮 |
| 紫色 | .c-purple | 通用类别、分组 |
| 橙色 | .c-orange | 通用类别、强调 |
| 石板灰 | .c-slate | 中性、禁用、结构性(开始/结束节点) |
| 蓝色 | .c-blue | 信息性(语义性 — 仅用于"信息") |
| 绿色 | .c-green | 成功、正面(语义性) |
| 琥珀色 | .c-amber | 警告、注意(语义性) |
| 红色 | .c-red | 错误、负面(语义性) |
布局模式
| 模式 | 布局 | 尺寸 |
|---|---|---|
| 流程图 | 自上而下 | 680 x auto |
| 对比图 | 并排列 | 680 x auto |
| 时间线 | 带标记的水平排列 | 680 x auto |
| 组织架构图 | 层级树 | 680 x auto |
主题集成
CSS 变量映射
cli-jaw 宿主为图表主题化公开以下 CSS 变量:
| 变量 | 用途 |
|---|---|
--bg | 页面背景 |
--surface | 卡片/表面背景 |
--text | 主要文本 |
--text-dim | 弱化/次要文本 |
--border | 默认边框 |
--accent | 强调色 |
--font-ui | UI 字体族 |
--font-mono | 代码字体族 |
--radius-md | 8px 圆角半径 |
--radius-lg | 12px 圆角半径 |
按格式检测主题
| 格式 | 主题方法 |
|---|---|
| 内联 SVG | CSS 类自动适配宿主主题 |
diagram-html iframe (JS) | window.__jawTheme.isDark(布尔值) |
diagram-html iframe (CSS 值) | window.__jawTokens['--bg']、['--text'] 等 |
| Mermaid | 通过 cli-jaw themeVariables 自动适配 |
matchMedia('prefers-color-scheme')。主题由宿主控制,而非操作系统设置。参考模块
图表技能会为特定图表类型加载额外的参考文件。这些文件提供详细的模式、库集成指南和模板:
| 模块 | 文件 | 覆盖范围 |
|---|---|---|
| SVG 组件 | reference/svg-components.md | SVG 基础元素、viewBox 检查清单、布局模板 |
| 颜色调色板 | reference/color-palette.md | 完整颜色值(浅色 + 深色)、分配规则 |
| 图表 | reference/module-chart.md | Chart.js + D3 + ECharts 6 — 条形图、折线图、饼图、分级统计图、热力图、桑基图、雷达图、树状图、仪表盘、漏斗图、K线图、弦图 |
| 组件 | reference/module-widget.md | 物理引擎 (Matter.js)、数学图形 (Math.js)、3D (Three.js)、创意编程 (p5.js)、音频 (Tone.js)、小游戏 |
| 交互 | reference/module-interactive.md | 滑块、选择器、分段按钮、开关、播放/暂停/重置、防抖、sendPrompt、键盘无障碍 |
| 地图 | reference/module-map.md | Leaflet 交互式地图 — OpenStreetMap 瓦片、标记、弹窗、深色模式 |
| UI 原型 | reference/module-mockup.md | UI 原型模式 |
| 艺术 | reference/module-art.md | 装饰性 SVG 图案 |
使用示例
"마이크로서비스 아키텍처 그려줘" # 触发:结构式 SVG — 容器、区域、嵌套
# 此技能生成包含服务方框、箭头和分组区域的内联 SVG。
# 不使用 Mermaid C4(深色模式问题)— 改用自定义结构式 SVG。
"이 DB 스키마 ER 다이어그램으로 보여줘" # 触发:Mermaid erDiagram
# 输出包含 erDiagram 语法的 ```mermaid 代码块。
# 主题自动适配 — 无需手动颜色配置。
"월별 매출 데이터 차트로 그려줘" # 触发:diagram-html + Chart.js
# 生成包含 Chart.js 条形/折线图的 ```diagram-html 代码块。
# 使用 window.__jawTheme.isDark 适配深色模式颜色。
"로그인 API 흐름 시퀀스 다이어그램으로 그려줘" # 触发:Mermaid sequenceDiagram
# 客户端 → 认证服务器 → API → 数据库 — 完整的请求/响应流程。
# 选择 Mermaid 而非 SVG,因为 sequenceDiagram 原生支持此类图表。
"React vs Vue vs Svelte 비교해줘" # 触发:对比式 SVG(并排列)
# 生成包含 3 列的内联 SVG,以可视化方式对比关键属性。
# 最多 2 组颜色渐变 — 一组用于类别标题,一组用于高亮。
快速参考
选择正确输出格式的决策树:
| 问题 | 答案 | 格式 |
|---|---|---|
| Mermaid 是否有此图表的原生语法? | 是 | 使用 ```mermaid |
| 是否为静态布局/架构/对比? | 是 | 使用内联 <svg> |
| 是否需要交互性、数据可视化或 JS 库? | 是 | 使用 ```diagram-html |
| 是否为 C4 图表? | 是 | 按上面的 C4 映射表替代 |
| 是否为"X 是如何工作的"问题? | 是 | 图解式 SVG(非流程图) |