画布(Canvas)
VizChat 的核心工作区——widget + 连线 + Canvas/Document 双模式的无限二维画布。
Canvas 是什么
Canvas 是 VizChat 最核心的抽象:一个无限大的二维工作空间,承载 widget 和连线(Edge)。底层基于 XYFlow(ReactFlow v12),但 VizChat 在其之上封装了 AI 优先的交互模型——widget 内容由 Agent 生成、连线既表示视觉关系也表示数据流。
一个 Canvas 的状态保存为 YAML,包含节点数组、连线数组和 viewport。这个 YAML 是 AI 读写的单一事实来源——当你发 prompt 让 AI "把第二个柱状图改成堆叠柱"时,Agent 读的是同一份 YAML,调用 edit_yaml_path 工具精确修改。
Canvas ↔ Document 双模式
每个画布都支持两种视图模式,同一份内容,不同呈现方式:
| 模式 | 适合场景 | 交互 |
|---|---|---|
| Canvas | 数据仪表板、流程图、头脑风暴、地图 | 无限平移缩放,widget 可任意摆放 |
| Document | 线性汇报、学术笔记、演示稿 | widget 按顺序堆叠成滚动文档 |
切换模式不损失任何数据——widget 的位置信息在 Canvas 模式下生效,Document 模式下则按数组顺序渲染。
构成三要素
1. Widget
每个 widget 是画布上一个独立的矩形区块,可以是:
- 图表(柱状图 / 折线图 / 饼图)
- 数据表格、富文本块、标题
- PDF 查看器、网页嵌入
- 运行时生成的 Widget(HTML + JS)
widget 内部三层结构:schema(数据)→ config(配置)→ renderer(渲染)。AI 修改 widget 时通常只改 schema,渲染自动刷新。
2. 连线(Edge)
两个 widget 可以通过连线绑定。VizChat 的连线不止视觉意义——配合 Widget,可以把上游 widget 的数据作为下游 Widget 的 prop 注入,实现参数联动(如一个筛选器 Widget 影响多个图表)。
3. Viewport
画布的平移和缩放状态。保存和恢复 viewport 能让你回到画布的上次浏览位置——适合大画布里有多个不同章节的场景。
键盘操作
常用快捷键:
⌘/Ctrl + C / V:复制 / 粘贴选中 widgetDelete / Backspace:删除选中 widget⌘/Ctrl + Z:撤销(Agent 操作也可撤销)- 按住
Space+ 拖拽:平移画布 ⌘/Ctrl + 滚轮:缩放画布
与类似工具的区别
- vs. Notion:Notion 是块级线性文档;VizChat 是无限画布,块可以自由摆放 + 连线
- vs. Tableau:Tableau 以数据源为中心;VizChat 以对话为中心,数据是 widget 之一
- vs. Figma:Figma 面向设计稿;VizChat 面向信息汇报,widget 都是"活"的可交互对象