baoyu-diagram

baoyu-diagram

热门

创建专业的深色主题SVG图表,涵盖架构图、流程图、时序图、结构图、思维导图、时间线、说明/概念图等多种类型。当用户请求任何技术或概念图表、系统可视化、流程、数据流、组件关系、网络拓扑、决策树、组织架构图、状态机或任何结构/逻辑/过程的可视化表示时,使用此技能。当用户说“画个图”“画一个架构图”“diagram”“flowchart”“sequence diagram”“draw me a ...”或上传内容并要求可视化时,也会触发。输出始终是一个独立的.svg文件。

2.3万Star
0Fork
更新于 2026/6/18
SKILL.md
readonly只读
name
baoyu-diagram
description

创建专业的深色主题SVG图表,涵盖架构图、流程图、时序图、结构图、思维导图、时间线、说明/概念图等多种类型。当用户请求任何技术或概念图表、系统可视化、流程、数据流、组件关系、网络拓扑、决策树、组织架构图、状态机或任何结构/逻辑/过程的可视化表示时,使用此技能。当用户说“画个图”“画一个架构图”“diagram”“flowchart”“sequence diagram”“draw me a ...”或上传内容并要求可视化时,也会触发。输出始终是一个独立的.svg文件。

version
1.117.3

图表生成器

创建多种类型的专业SVG图表。所有输出均为单个自包含的.svg文件,内嵌样式和字体。

支持的图表类型

类型 使用场景 关键特征
架构图 系统组件及关系 分组框、连接箭头、区域边界
流程图 决策逻辑、流程步骤 菱形决策、圆角步骤框、方向流
时序图 参与者之间的时间顺序交互 垂直生命线、水平消息、激活条
结构图 类图、ER图、组织架构图 分区框、类型化关系(继承、组合)
思维导图 头脑风暴、主题探索 中心节点、辐射分支、有机布局
时间线 按时间顺序的事件 水平/垂直轴线、事件标记、时间段
说明图 概念解释、比较 自由布局、图标、注释、视觉隐喻
状态机 状态转换、生命周期 圆角状态节点、带标签的转换、开始/结束标记
数据流图 数据转换管道 处理气泡、数据存储、外部实体

设计系统

颜色调色板

组件类别的语义颜色:

类别 填充 (rgba) 描边 用途
主要 rgba(8, 51, 68, 0.4) #22d3ee (青色) 前端、面向用户、输入
次要 rgba(6, 78, 59, 0.4) #34d399 (翡翠绿) 后端、服务、处理
第三 rgba(76, 29, 149, 0.4) #a78bfa (紫罗兰) 数据库、存储、持久化
强调 rgba(120, 53, 15, 0.3) #fbbf24 (琥珀色) 云、基础设施、区域
警告 rgba(136, 19, 55, 0.4) #fb7185 (玫瑰红) 安全、错误、警告
连接 rgba(251, 146, 60, 0.3) #fb923c (橙色) 总线、队列、中间件
中性 rgba(30, 41, 59, 0.5) #94a3b8 (石板灰) 外部、通用、未知
高亮 rgba(59, 130, 246, 0.3) #60a5fa (蓝色) 活动状态、焦点、当前步骤

对于流程图和时序图,按角色(参与者、决策、过程)分配颜色,而非按技术。

排版

使用内嵌SVG @font-face 或系统等宽字体回退:

<style>
  @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&amp;display=swap');
  text { font-family: 'JetBrains Mono', 'SF Mono', 'Cascadia Code', monospace; }
</style>

按角色的字号:

  • 标题: 16px,字重700
  • 组件名称: 11-12px,字重600
  • 子标签/描述: 9px,字重400,颜色 #94a3b8
  • 注释/备注: 8px,字重400
  • 小标签(箭头上): 7-8px

核心视觉元素

背景: #0f172a (石板灰-900) 带细微网格:

<defs>
  <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
    <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1e293b" stroke-width="0.5"/>
  </pattern>
</defs>
<rect width="100%" height="100%" fill="#0f172a"/>
<rect width="100%" height="100%" fill="url(#grid)"/>

箭头标记(标准):

<marker id="arrow" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
  <polygon points="0 0, 10 3.5, 0 7" fill="#64748b"/>
</marker>

箭头标记(彩色)——根据需要为每种颜色创建:

<marker id="arrow-cyan" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
  <polygon points="0 0, 10 3.5, 0 7" fill="#22d3ee"/>
</marker>

开放箭头(用于异步/返回消息):

<marker id="arrow-open" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
  <polyline points="0 0, 10 3.5, 0 7" fill="none" stroke="#64748b" stroke-width="1.5"/>
</marker>

SVG结构与分层

按以下顺序绘制元素以获得正确的z轴顺序(SVG从后往前绘制):

  1. 背景填充 + 网格图案
  2. 区域/组边界(虚线轮廓)
  3. 连接箭头和线条
  4. 不透明遮罩矩形(与组件框相同位置,fill="#0f172a"
  5. 组件框(半透明填充 + 描边)
  6. 文本标签
  7. 图例(右下角或底部区域,在所有边界之外)
  8. 标题块(左上角)

不透明遮罩矩形技巧至关重要——没有它,半透明的组件填充会显示下方的箭头:

<!-- 遮罩层:不透明背景以隐藏箭头 -->
<rect x="100" y="100" width="160" height="60" rx="6" fill="#0f172a"/>
<!-- 视觉层:样式化组件 -->
<rect x="100" y="100" width="160" height="60" rx="6" fill="rgba(8,51,68,0.4)" stroke="#22d3ee" stroke-width="1.5"/>
<text x="180" y="125" fill="white" font-size="11" font-weight="600" text-anchor="middle">API Gateway</text>
<text x="180" y="141" fill="#94a3b8" font-size="9" text-anchor="middle">Kong / Nginx</text>

间距规则

这些规则防止重叠——请严格遵守:

  • 组件框高度: 50-70px(标准),80-120px(大型/复杂)
  • 组件间最小间距: 垂直40px,水平30px
  • 箭头标签间距: 距离任何框边缘10px
  • 区域边界内边距: 内部边缘与包含的组件之间20px
  • 图例放置: 至少低于图表最低元素20px
  • 标题块: 距离左上角20px,在图表内容区域之外
  • viewBox: 始终扩展以容纳所有内容 + 四周30px内边距

组件模式

标准框(服务/过程):

<rect x="X" y="Y" width="160" height="60" rx="6" fill="#0f172a"/>
<rect x="X" y="Y" width="160" height="60" rx="6" fill="FILL" stroke="STROKE" stroke-width="1.5"/>
<text x="CX" y="Y+24" fill="white" font-size="11" font-weight="600" text-anchor="middle">名称</text>
<text x="CX" y="Y+40" fill="#94a3b8" font-size="9" text-anchor="middle">描述</text>

决策菱形(流程图):

<g transform="translate(CX, CY)">
  <polygon points="0,-35 50,0 0,35 -50,0" fill="#0f172a"/>
  <polygon points="0,-35 50,0 0,35 -50,0" fill="rgba(120,53,15,0.3)" stroke="#fbbf24" stroke-width="1.5"/>
  <text y="4" fill="white" font-size="10" font-weight="600" text-anchor="middle">条件?</text>
</g>

数据库圆柱体:

<g transform="translate(X, Y)">
  <rect x="0" y="10" width="120" height="50" rx="2" fill="#0f172a"/>
  <ellipse cx="60" cy="10" rx="60" ry="12" fill="#0f172a"/>
  <ellipse cx="60" cy="60" rx="60" ry="12" fill="#0f172a"/>
  <rect x="0" y="10" width="120" height="50" fill="rgba(76,29,149,0.4)"/>
  <ellipse cx="60" cy="10" rx="60" ry="12" fill="rgba(76,29,149,0.4)" stroke="#a78bfa" stroke-width="1.5"/>
  <ellipse cx="60" cy="60" rx="60" ry="12" fill="rgba(76,29,149,0.4)" stroke="#a78bfa" stroke-width="1.5"/>
  <line x1="0" y1="10" x2="0" y2="60" stroke="#a78bfa" stroke-width="1.5"/>
  <line x1="120" y1="10" x2="120" y2="60" stroke="#a78bfa" stroke-width="1.5"/>
  <text x="60" y="40" fill="white" font-size="11" font-weight="600" text-anchor="middle">PostgreSQL</text>
</g>

区域边界:

<rect x="X" y="Y" width="W" height="H" rx="12" fill="none" stroke="#fbbf24" stroke-width="1" stroke-dasharray="8,4"/>
<text x="X+12" y="Y+16" fill="#fbbf24" font-size="9" font-weight="600">AWS us-east-1</text>

安全组:

<rect x="X" y="Y" width="W" height="H" rx="8" fill="none" stroke="#fb7185" stroke-width="1" stroke-dasharray="4,4"/>
<text x="X+10" y="Y+14" fill="#fb7185" font-size="8" font-weight="500">VPC / 安全组</text>

类型特定布局指南

确定此SKILL.md文件的目录路径为{baseDir}。在开始布局之前,读取特定图表类型的参考文件。参考文件位于{baseDir}/references/,包含详细的布局算法和示例。

架构图

→ 读取 {baseDir}/references/architecture.md

要点:从左到右或从上到下的数据流。在区域边界内对相关服务进行分组。在层之间使用总线/连接器。将数据库放在底部或右侧。

流程图

→ 读取 {baseDir}/references/flowchart.md

要点:从上到下的主要流程。菱形用于决策,出口箭头上带有是/否标签。圆角矩形用于开始/结束。使用高亮颜色表示快乐路径。

时序图

→ 读取 {baseDir}/references/sequence.md

要点:参与者作为顶部的框,垂直虚线生命线,水平箭头表示消息(实线=同步,虚线=返回)。时间向下流动。激活条表示处理。如果复杂,对消息进行编号。

结构图

→ 读取 {baseDir}/references/structural.md

要点:分区框(类图的名称/属性/方法)。关系线:实线带实心菱形=组合,实线带空心菱形=聚合,虚线箭头=依赖,实线三角形=继承。

思维导图

从中心概念自由辐射布局。使用有机曲线(带三次贝塞尔曲线的<path>)作为分支。使用调色板变化分支颜色。中心节点字体较大,向外逐渐减小。

时间线

水平或垂直轴线。事件标记为轴上的圆形或菱形。描述文本交替偏移到两侧以避免重叠。使用颜色对事件类型进行分类。

状态机

圆角矩形状态,复合状态使用双边框。实心圆表示初始状态,靶心表示最终状态。弯曲箭头表示自转换。使用event [guard] / action格式标记所有转换。

输出规则

  1. 输出单个.svg文件——无外部依赖,除了Google Fonts导入
  2. 设置viewBox以容纳所有内容并带30px内边距;不要设置固定的width/height属性(让SVG响应式缩放)
  3. 在根<svg>元素上包含xmlns="http://www.w3.org/2000/svg"
  4. 将所有<style><defs>、标记和图案放在SVG顶部
  5. 使用text-anchor="middle"实现居中标签;确保文本不溢出框
  6. 中文文本支持: 当标签包含中文字符时,使用font-family: 'JetBrains Mono', 'Noto Sans SC', 'PingFang SC', sans-serif'并增加框宽度——CJK字符更宽
  7. 保存位置: 如果输入是文件,保存到{inputFileDir}/diagram/。否则保存到{projectDir}/diagram/{topic-slug}/。如果目录不存在则创建

脚本

确定此SKILL.md文件的目录路径为{baseDir}。脚本路径:{baseDir}/scripts/main.ts

解析${BUN_X}运行时:如果安装了bunbun;如果npx可用 → npx -y bun;否则建议安装bun。

SVG → @2x PNG

保存SVG后,将其转换为@2x PNG:

${BUN_X} {baseDir}/scripts/main.ts <svg-path> [options]

选项:

  • -s, --scale <n> — 缩放因子(默认:2)
  • -o, --output <path> — 自定义输出路径(默认:<input>@2x.png
  • --json — JSON输出

流程

  1. 从用户请求中识别图表类型
  2. 如果该类型存在相关参考文件,则读取该文件
  3. 规划布局:列出所有组件,确定分组和流向,计算位置
  4. 按照上述分层顺序编写SVG
  5. 验证间距规则——无重叠,图例在边界外,viewBox足够大
  6. 保存SVG文件
  7. 运行${BUN_X} {baseDir}/scripts/main.ts <svg-path>生成@2x PNG
  8. 向用户展示两个文件