X6 v3 Graph Editor
Overview
X6 v3 is AntV's diagram editing engine for flowcharts, DAGs, ER diagrams, org charts, and other interactive node-edge editors. Unlike G2/G6, X6 uses an imperative API — you create a Graph instance, then call graph.addNode(), graph.addEdge(), and register plugins via graph.use().
import { Graph } from '@antv/x6';
const graph = new Graph({
container: 'container',
background: { color: '#F2F7FA' },
});
const source = graph.addNode({
shape: 'rect',
x: 40, y: 40, width: 100, height: 40,
label: 'Source',
attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
});
const target = graph.addNode({
shape: 'rect',
x: 300, y: 200, width: 100, height: 40,
label: 'Target',
attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
});
graph.addEdge({ source, target, attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } } });
graph.centerContent();
CDN Usage
<script src="https://unpkg.com/@antv/x6@3/dist/x6.js"></script>
<script>
const graph = new X6.Graph({
container: 'container',
background: { color: '#F2F7FA' },
});
const source = graph.addNode({
shape: 'rect',
x: 40, y: 40, width: 100, height: 40,
label: 'Source',
attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
});
const target = graph.addNode({
shape: 'rect',
x: 300, y: 200, width: 100, height: 40,
label: 'Target',
attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
});
graph.addEdge({ source, target, attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } } });
graph.centerContent();
</script>
Content Retrieval Service
When using AntV X6 for data visualization, if you need to understand the concepts, usage, API, examples, and other aspects of X6 v3, you can use the provided context retrieval service. When using the skill, content is retrieved via an antv HTTP API server using GET requests.
- Host:
https://sive.antv.antgroup.com
- Endpoint:
/api/v1/context/retrieve
- Method:
GET
- Parameters:
query, library, topK, content, maxTokens
Retrieve skills by query (hybrid search = FTS + vector + RRF fusion). Constraints docs are indexed as regular skill documents and will appear in search results naturally.
| Parameter |
Type |
Required |
Description |
query |
string |
✅ |
Search keywords, e.g. flowchart stencil port |
library |
string |
✅ |
Library name: g2, g6, x6 |
topK |
number |
|
Number of results to return (default: 5) |
content |
boolean |
|
Return full reference doc markdown (default: true) |
maxTokens |
number |
|
Max tokens per result (default: unlimited) |
curl "https://sive.antv.antgroup.com/api/v1/context/retrieve?query=flowchart+stencil+port&library=x6"
Critical Rules
MUST: graph.render() does NOT exist in X6 v3
// ❌ WRONG — graph.render() is G6 API, not X6
const graph = new Graph({ container: 'container' });
graph.render();
// ✅ CORRECT — X6 auto-renders on addNode/addEdge/fromJSON
const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
graph.addNode({ shape: 'rect', x: 40, y: 40, width: 100, height: 40 });
MUST: Use string literal container: 'container' — no variable declaration
// ❌ WRONG — declaring container variable is forbidden
const container = document.getElementById('container');
const graph = new Graph({ container });
// ✅ CORRECT — string literal, runtime auto-resolves
const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
MUST: Register plugins before using their methods
// ❌ WRONG — calling plugin method without registration
graph.toPNG(); // Error: method not found
graph.select(); // Error: method not found
// ✅ CORRECT — register first, then call
import { Graph, Export, Selection } from '@antv/x6';
const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
graph.use(new Export());
graph.use(new Selection({ enabled: true, rubberband: true }));
// Now graph.toPNG() and graph.select() are available
MUST: Only 11 plugin classes exist — NOT constructor options
✅ Plugin class (import + graph.use) |
❌ NOT a plugin (constructor option) |
Clipboard, Dnd, Export, History, Keyboard, MiniMap, Scroller, Selection, Snapline, Stencil, Transform |
mousewheel, embedding, panning, connecting, translating, interacting, background, grid |
// ❌ WRONG — importing constructor option as "plugin"
import { Graph, Embedding } from '@antv/x6'; // Embedding doesn't exist!
graph.use(new Embedding()); // Error: not a constructor
// ✅ CORRECT — embedding is a Graph constructor option
import { Graph, Selection } from '@antv/x6';
const graph = new Graph({
container: 'container',
embedding: { enabled: true, findParent: 'bbox' },
mousewheel: { enabled: true, zoomAtMousePosition: true, modifiers: ['ctrl'] },
});
graph.use(new Selection({ enabled: true, rubberband: true }));
MUST: All used classes MUST appear in import statement
// ❌ WRONG — Selection used but not imported
import { Graph } from '@antv/x6';
graph.use(new Selection({...})); // falls back to window.Selection → Illegal constructor
// ✅ CORRECT — every used class imported
import { Graph, Selection, Keyboard, History } from '@antv/x6';
graph.use(new Selection({ enabled: true, rubberband: true }));
graph.use(new Keyboard({ enabled: true }));
graph.use(new History({ enabled: true }));
MUST: Always call graph.centerContent() after adding nodes/edges
// ❌ WRONG — no centerContent, content drifts to top-left
graph.addNode({ ... });
graph.addEdge({ ... });
// ✅ CORRECT — content centered after all additions
graph.addNode({ ... });
graph.addEdge({ ... });
graph.centerContent();
// OR: graph.zoomToFit({ padding: 20, maxScale: 1 }) — but NOT both
MUST: Always set background color, default node/edge style
// ❌ WRONG — no background, no default styles
const graph = new Graph({ container: 'container' });
// ✅ CORRECT — mandatory background + default styles
const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
graph.addNode({
shape: 'rect', x: 40, y: 40, width: 100, height: 40,
label: 'Node',
attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
});
graph.addEdge({
source: 'node-1', target: 'node-2',
attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } },
});
MUST: mousewheel, panning, Selection.rubberband — use modifiers to avoid conflicts
// ❌ WRONG — panning and mousewheel both grab scroll events
const graph = new Graph({
panning: { enabled: true },
mousewheel: { enabled: true },
});
graph.use(new Selection({ enabled: true, rubberband: true }));
// ✅ CORRECT — modifiers separate the interactions
const graph = new Graph({
panning: { enabled: true, eventTypes: ['leftMouseDown'], modifiers: 'shift' },
mousewheel: { enabled: true, zoomAtMousePosition: true, modifiers: ['ctrl'] },
});
graph.use(new Selection({ enabled: true, rubberband: true }));
MUST: Output pure JavaScript — NO TypeScript syntax
// ❌ WRONG — TypeScript syntax
private width: number = 100;
const node: Node = graph.addNode({...}) as Node;
// ✅ CORRECT — pure JavaScript only
const node = graph.addNode({ shape: 'rect', x: 40, y: 40 });
MUST: Shape.HTML.register for HTML nodes — NOT class extends Node
// ❌ WRONG — class-based HTML node (2.x pattern)
class MyNode extends Node { ... }
// ✅ CORRECT — Shape.HTML.register (3.x pattern)
import { Graph, Shape } from '@antv/x6';
Shape.HTML.register({
shape: 'my-html',
effect: ['data'],
html(node) {
const div = document.createElement('div');
div.innerHTML = node.getData().content || '';
return div;
},
});
Quick Reference
| User Intent |
Retrieve Query |
| Graph init, container, background |
GET /api/v1/context/retrieve?query=graph+init+container+background&library=x6 |
| Flowchart / approval flow |
GET /api/v1/context/retrieve?query=flowchart+approval&library=x6 |
| DAG / data pipeline |
GET /api/v1/context/retrieve?query=DAG+pipeline+port&library=x6 |
| ER diagram / entity relationship |
GET /api/v1/context/retrieve?query=ER+diagram+entity+relationship&library=x6 |
| Lineage / data lineage graph |
GET /api/v1/context/retrieve?query=lineage+data+lineage&library=x6 |
| Org chart / hierarchy |
GET /api/v1/context/retrieve?query=org+chart+hierarchy&library=x6 |
| UML class diagram |
GET /api/v1/context/retrieve?query=UML+class+diagram&library=x6 |
| Node config / custom node |
GET /api/v1/context/retrieve?query=node+custom+shape+rect+circle&library=x6 |
| Edge config / router / connector |
GET /api/v1/context/retrieve?query=edge+router+connector+orth+smooth&library=x6 |
| Ports / connection桩 |
GET /api/v1/context/retrieve?query=ports+connection+layout&library=x6 |
| HTML shape node |
GET /api/v1/context/retrieve?query=html+shape+register&library=x6 |
| Stencil / drag-and-drop panel |
GET /api/v1/context/retrieve?query=stencil+drag+drop+panel&library=x6 |
| Plugin: Selection, History, Clipboard |
GET /api/v1/context/retrieve?query=Selection+History+Clipboard+plugin&library=x6 |
| Plugin: MiniMap, Scroller, Snapline |
GET /api/v1/context/retrieve?query=MiniMap+Scroller+Snapline+plugin&library=x6 |
| Plugin: Keyboard, Export, Transform |
GET /api/v1/context/retrieve?query=Keyboard+Export+Transform+plugin&library=x6 |
| Panning / mousewheel / embedding |
GET /api/v1/context/retrieve?query=panning+mousewheel+embedding&library=x6 |
| Tools (button-remove, etc.) |
GET /api/v1/context/retrieve?query=tools+button-remove+hover&library=x6 |
| Events (click,mouseenter,moved) |
GET /api/v1/context/retrieve?query=events+node+click+mouse&library=x6 |
| Serialization (toJSON, fromJSON) |
GET /api/v1/context/retrieve?query=serialization+toJSON+fromJSON&library=x6 |
| Animation / gradient |
GET /api/v1/context/retrieve?query=animation+gradient+defs+marker&library=x6 |
| Group / nesting / embedding |
GET /api/v1/context/retrieve?query=group+nesting+embedding+parent+child&library=x6 |
Dependencies
@antv/x6 — X6 v3 diagram editing engine (exports Graph + 11 plugin classes)
1---2name: antv-x6-editor3description: Use this skill whenever the user wants to create, customize, or troubleshoot X6 v3 graph editor diagrams. Triggers include: any mention of 'X6', 'antv x6', '@antv/x6', 'X6 editor', 'X6 图编辑', '流程图', 'DAG', 'ER图', '实体关系图', '血缘图', '组织架构图', 'UML类图', 'flowchart', 'DAG diagram', 'ER diagram', 'lineage graph', 'org chart', 'network topology', 'stencil', 'drag-and-drop editor', 'port connection', 'node port edge', 'graph editor', 'diagram editor', or requests about X6 node/edge styling, plugins (Selection, History, Clipboard, Keyboard, MiniMap, Scroller, Snapline, Stencil, Dnd, Transform, Export), interactions (panning, mousewheel, connecting, embedding), HTML shape nodes, custom shapes, serialization, or layout. Also use when debugging X6 rendering errors, v2→v3 migration, or editor interaction issues. Do NOT use for G2 statistical charts, G6 network graphs, or S2 pivot tables.4---5
6# X6 v3 Graph Editor
7
8## Overview
9
10X6 v3 is AntV's diagram editing engine for flowcharts, DAGs, ER diagrams, org charts, and other interactive node-edge editors. Unlike G2/G6, X6 uses an **imperative API** — you create a `Graph` instance, then call `graph.addNode()`, `graph.addEdge()`, and register plugins via `graph.use()`.
11
12```javascript
13import { Graph } from '@antv/x6';
14
15const graph = new Graph({
16 container: 'container',
17 background: { color: '#F2F7FA' },
18});
19
20const source = graph.addNode({
21 shape: 'rect',
22 x: 40, y: 40, width: 100, height: 40,
23 label: 'Source',
24 attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
25});
26
27const target = graph.addNode({
28 shape: 'rect',
29 x: 300, y: 200, width: 100, height: 40,
30 label: 'Target',
31 attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
32});
33
34graph.addEdge({ source, target, attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } } });
35graph.centerContent();
36```
37
38### CDN Usage
39
40```html
41<script src="https://unpkg.com/@antv/x6@3/dist/x6.js"></script>
42<script>
43 const graph = new X6.Graph({
44 container: 'container',
45 background: { color: '#F2F7FA' },
46 });
47 const source = graph.addNode({
48 shape: 'rect',
49 x: 40, y: 40, width: 100, height: 40,
50 label: 'Source',
51 attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
52 });
53 const target = graph.addNode({
54 shape: 'rect',
55 x: 300, y: 200, width: 100, height: 40,
56 label: 'Target',
57 attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
58 });
59 graph.addEdge({ source, target, attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } } });
60 graph.centerContent();
61</script>
62```
63
64## Content Retrieval Service
65
66When using AntV X6 for data visualization, if you need to understand the concepts, usage, API, examples, and other aspects of X6 v3, you can use the provided context retrieval service. When using the skill, content is retrieved via an antv HTTP API server using GET requests.
67
68- Host: `https://sive.antv.antgroup.com`
69- Endpoint: `/api/v1/context/retrieve`
70- Method: `GET`
71- Parameters: `query`, `library`, `topK`, `content`, `maxTokens`
72
73Retrieve skills by query (hybrid search = FTS + vector + RRF fusion). Constraints docs are indexed as regular skill documents and will appear in search results naturally.
74
75| Parameter | Type | Required | Description |
76|---|---|---|---|
77| `query` | string | ✅ | Search keywords, e.g. `flowchart stencil port` |
78| `library` | string | ✅ | Library name: `g2`, `g6`, `x6` |
79| `topK` | number | | Number of results to return (default: 5) |
80| `content` | boolean | | Return full reference doc markdown (default: true) |
81| `maxTokens` | number | | Max tokens per result (default: unlimited) |
82
83```bash
84curl "https://sive.antv.antgroup.com/api/v1/context/retrieve?query=flowchart+stencil+port&library=x6"
85```
86
87## Critical Rules
88
89### MUST: `graph.render()` does NOT exist in X6 v3
90
91```javascript
92// ❌ WRONG — graph.render() is G6 API, not X6
93const graph = new Graph({ container: 'container' });
94graph.render();
95
96// ✅ CORRECT — X6 auto-renders on addNode/addEdge/fromJSON
97const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
98graph.addNode({ shape: 'rect', x: 40, y: 40, width: 100, height: 40 });
99```
100
101### MUST: Use string literal `container: 'container'` — no variable declaration
102
103```javascript
104// ❌ WRONG — declaring container variable is forbidden
105const container = document.getElementById('container');
106const graph = new Graph({ container });
107
108// ✅ CORRECT — string literal, runtime auto-resolves
109const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
110```
111
112### MUST: Register plugins before using their methods
113
114```javascript
115// ❌ WRONG — calling plugin method without registration
116graph.toPNG(); // Error: method not found
117graph.select(); // Error: method not found
118
119// ✅ CORRECT — register first, then call
120import { Graph, Export, Selection } from '@antv/x6';
121const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
122graph.use(new Export());
123graph.use(new Selection({ enabled: true, rubberband: true }));
124// Now graph.toPNG() and graph.select() are available
125```
126
127### MUST: Only 11 plugin classes exist — NOT constructor options
128
129| ✅ Plugin class (import + `graph.use`) | ❌ NOT a plugin (constructor option) |
130|---|---|
131| `Clipboard`, `Dnd`, `Export`, `History`, `Keyboard`, `MiniMap`, `Scroller`, `Selection`, `Snapline`, `Stencil`, `Transform` | `mousewheel`, `embedding`, `panning`, `connecting`, `translating`, `interacting`, `background`, `grid` |
132
133```javascript
134// ❌ WRONG — importing constructor option as "plugin"
135import { Graph, Embedding } from '@antv/x6'; // Embedding doesn't exist!
136graph.use(new Embedding()); // Error: not a constructor
137
138// ✅ CORRECT — embedding is a Graph constructor option
139import { Graph, Selection } from '@antv/x6';
140const graph = new Graph({
141 container: 'container',
142 embedding: { enabled: true, findParent: 'bbox' },
143 mousewheel: { enabled: true, zoomAtMousePosition: true, modifiers: ['ctrl'] },
144});
145graph.use(new Selection({ enabled: true, rubberband: true }));
146```
147
148### MUST: All used classes MUST appear in import statement
149
150```javascript
151// ❌ WRONG — Selection used but not imported
152import { Graph } from '@antv/x6';
153graph.use(new Selection({...})); // falls back to window.Selection → Illegal constructor
154
155// ✅ CORRECT — every used class imported
156import { Graph, Selection, Keyboard, History } from '@antv/x6';
157graph.use(new Selection({ enabled: true, rubberband: true }));
158graph.use(new Keyboard({ enabled: true }));
159graph.use(new History({ enabled: true }));
160```
161
162### MUST: Always call `graph.centerContent()` after adding nodes/edges
163
164```javascript
165// ❌ WRONG — no centerContent, content drifts to top-left
166graph.addNode({ ... });
167graph.addEdge({ ... });
168
169// ✅ CORRECT — content centered after all additions
170graph.addNode({ ... });
171graph.addEdge({ ... });
172graph.centerContent();
173// OR: graph.zoomToFit({ padding: 20, maxScale: 1 }) — but NOT both
174```
175
176### MUST: Always set background color, default node/edge style
177
178```javascript
179// ❌ WRONG — no background, no default styles
180const graph = new Graph({ container: 'container' });
181
182// ✅ CORRECT — mandatory background + default styles
183const graph = new Graph({ container: 'container', background: { color: '#F2F7FA' } });
184graph.addNode({
185 shape: 'rect', x: 40, y: 40, width: 100, height: 40,
186 label: 'Node',
187 attrs: { body: { stroke: '#8f8f8f', strokeWidth: 1, fill: '#fff', rx: 6, ry: 6 } },
188});
189graph.addEdge({
190 source: 'node-1', target: 'node-2',
191 attrs: { line: { stroke: '#8f8f8f', strokeWidth: 1 } },
192});
193```
194
195### MUST: `mousewheel`, `panning`, `Selection.rubberband` — use modifiers to avoid conflicts
196
197```javascript
198// ❌ WRONG — panning and mousewheel both grab scroll events
199const graph = new Graph({
200 panning: { enabled: true },
201 mousewheel: { enabled: true },
202});
203graph.use(new Selection({ enabled: true, rubberband: true }));
204
205// ✅ CORRECT — modifiers separate the interactions
206const graph = new Graph({
207 panning: { enabled: true, eventTypes: ['leftMouseDown'], modifiers: 'shift' },
208 mousewheel: { enabled: true, zoomAtMousePosition: true, modifiers: ['ctrl'] },
209});
210graph.use(new Selection({ enabled: true, rubberband: true }));
211```
212
213### MUST: Output pure JavaScript — NO TypeScript syntax
214
215```javascript
216// ❌ WRONG — TypeScript syntax
217private width: number = 100;
218const node: Node = graph.addNode({...}) as Node;
219
220// ✅ CORRECT — pure JavaScript only
221const node = graph.addNode({ shape: 'rect', x: 40, y: 40 });
222```
223
224### MUST: `Shape.HTML.register` for HTML nodes — NOT `class extends Node`
225
226```javascript
227// ❌ WRONG — class-based HTML node (2.x pattern)
228class MyNode extends Node { ... }
229
230// ✅ CORRECT — Shape.HTML.register (3.x pattern)
231import { Graph, Shape } from '@antv/x6';
232Shape.HTML.register({
233 shape: 'my-html',
234 effect: ['data'],
235 html(node) {
236 const div = document.createElement('div');
237 div.innerHTML = node.getData().content || '';
238 return div;
239 },
240});
241```
242
243## Quick Reference
244
245| User Intent | Retrieve Query |
246|---|---|
247| Graph init, container, background | `GET /api/v1/context/retrieve?query=graph+init+container+background&library=x6` |
248| Flowchart / approval flow | `GET /api/v1/context/retrieve?query=flowchart+approval&library=x6` |
249| DAG / data pipeline | `GET /api/v1/context/retrieve?query=DAG+pipeline+port&library=x6` |
250| ER diagram / entity relationship | `GET /api/v1/context/retrieve?query=ER+diagram+entity+relationship&library=x6` |
251| Lineage / data lineage graph | `GET /api/v1/context/retrieve?query=lineage+data+lineage&library=x6` |
252| Org chart / hierarchy | `GET /api/v1/context/retrieve?query=org+chart+hierarchy&library=x6` |
253| UML class diagram | `GET /api/v1/context/retrieve?query=UML+class+diagram&library=x6` |
254| Node config / custom node | `GET /api/v1/context/retrieve?query=node+custom+shape+rect+circle&library=x6` |
255| Edge config / router / connector | `GET /api/v1/context/retrieve?query=edge+router+connector+orth+smooth&library=x6` |
256| Ports / connection桩 | `GET /api/v1/context/retrieve?query=ports+connection+layout&library=x6` |
257| HTML shape node | `GET /api/v1/context/retrieve?query=html+shape+register&library=x6` |
258| Stencil / drag-and-drop panel | `GET /api/v1/context/retrieve?query=stencil+drag+drop+panel&library=x6` |
259| Plugin: Selection, History, Clipboard | `GET /api/v1/context/retrieve?query=Selection+History+Clipboard+plugin&library=x6` |
260| Plugin: MiniMap, Scroller, Snapline | `GET /api/v1/context/retrieve?query=MiniMap+Scroller+Snapline+plugin&library=x6` |
261| Plugin: Keyboard, Export, Transform | `GET /api/v1/context/retrieve?query=Keyboard+Export+Transform+plugin&library=x6` |
262| Panning / mousewheel / embedding | `GET /api/v1/context/retrieve?query=panning+mousewheel+embedding&library=x6` |
263| Tools (button-remove, etc.) | `GET /api/v1/context/retrieve?query=tools+button-remove+hover&library=x6` |
264| Events (click,mouseenter,moved) | `GET /api/v1/context/retrieve?query=events+node+click+mouse&library=x6` |
265| Serialization (toJSON, fromJSON) | `GET /api/v1/context/retrieve?query=serialization+toJSON+fromJSON&library=x6` |
266| Animation / gradient | `GET /api/v1/context/retrieve?query=animation+gradient+defs+marker&library=x6` |
267| Group / nesting / embedding | `GET /api/v1/context/retrieve?query=group+nesting+embedding+parent+child&library=x6` |
268
269## Dependencies
270
271- `@antv/x6` — X6 v3 diagram editing engine (exports `Graph` + 11 plugin classes)