Full Code of antvis/G6 for AI

v5 91eb1950a56c cached
1692 files
5.4 MB
1.5M tokens
2406 symbols
1 requests
Download .txt
Showing preview only (6,035K chars total). Download the full file or copy to clipboard to get everything.
Repository: antvis/G6
Branch: v5
Commit: 91eb1950a56c
Files: 1692
Total size: 5.4 MB

Directory structure:
gitextract_9ptgz9cu/

├── .changeset/
│   └── config.json
├── .codecov.yml
├── .commitlintrc.js
├── .cursor/
│   └── rules/
│       └── translation.mdc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1.bug_report.yml
│   │   ├── 2.feature_request.yml
│   │   ├── 3.docs_feedback.yml
│   │   ├── 4.oscp.yml
│   │   ├── config.yml
│   │   └── oscp.yml
│   └── workflows/
│       ├── build.yml
│       ├── deploy.yml
│       ├── ensure-triage-label.yml
│       ├── issue-automated.yml
│       ├── issue_translate.yml
│       ├── manage-labeled.yml
│       ├── mark-duplicate.yml
│       ├── no-response.yml
│       ├── publish.yml
│       ├── resolved-pending-release.yml
│       ├── scripts/
│       │   ├── closeOnRelease.js
│       │   ├── issue-automated.js
│       │   └── updateYuque.js
│       └── update-yuque.yml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .prettierignore
├── .prettierrc.js
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── LICENSE
├── PUBLISH.md
├── README.md
├── README.zh-CN.md
├── SECURITY.md
├── package.json
├── packages/
│   ├── bundle/
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── tsconfig.json
│   │   ├── vite.config.js
│   │   └── webpack.config.js
│   ├── cli/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.config.ts
│   │   ├── index.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── template-extension/
│   │   │   ├── .commitlintrc.js
│   │   │   ├── .editorconfig
│   │   │   ├── .eslintignore
│   │   │   ├── .eslintrc.js
│   │   │   ├── .gitignore
│   │   │   ├── .prettierignore
│   │   │   ├── .prettierrc.js
│   │   │   ├── __tests__/
│   │   │   │   ├── demos/
│   │   │   │   │   ├── element-node-extend.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── setup.ts
│   │   │   │   ├── types.d.ts
│   │   │   │   ├── unit/
│   │   │   │   │   ├── default.spec.ts
│   │   │   │   │   └── elements/
│   │   │   │   │       └── nodes/
│   │   │   │   │           └── extend.spec.ts
│   │   │   │   └── utils/
│   │   │   │       ├── create.ts
│   │   │   │       ├── dir.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── offscreen-canvas-context.ts
│   │   │   │       ├── sleep.ts
│   │   │   │       ├── svg-transformer.js
│   │   │   │       ├── to-match-svg-snapshot.ts
│   │   │   │       └── use-snapshot-matchers.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── rollup.config.mjs
│   │   │   ├── src/
│   │   │   │   ├── elements/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── nodes/
│   │   │   │   │       ├── extend-node.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── exports.ts
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.js
│   │   └── tsconfig.json
│   ├── g6/
│   │   ├── .gitignore
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── bugs/
│   │   │   │   ├── api-expand-element-z-index.spec.ts
│   │   │   │   ├── api-focus-element-edge.spec.ts
│   │   │   │   ├── behaviors-click-select-drag-node.spec.ts
│   │   │   │   ├── behaviors-click-select.spec.ts
│   │   │   │   ├── behaviors-collapse-expand.spec.ts
│   │   │   │   ├── behaviors-drag-element-combo.spec.ts
│   │   │   │   ├── behaviors-drag-rotated-canvas.spec.ts
│   │   │   │   ├── behaviors-multiple-conflict.spec.ts
│   │   │   │   ├── brush-select.spec.ts
│   │   │   │   ├── continuous-invoke.spec.ts
│   │   │   │   ├── element-combo-drag.spec.ts
│   │   │   │   ├── element-custom-state-switch.spec.ts
│   │   │   │   ├── element-edge-update-arrow.spec.ts
│   │   │   │   ├── element-node-collapse.spec.ts
│   │   │   │   ├── element-node-icon-switch.spec.ts
│   │   │   │   ├── element-node-update-badge.spec.ts
│   │   │   │   ├── element-orth-router.spec.ts
│   │   │   │   ├── element-port-rotate.spec.ts
│   │   │   │   ├── element-remove-combo.spec.ts
│   │   │   │   ├── element-set-position-to-origin.spec.ts
│   │   │   │   ├── fit-view.spec.ts
│   │   │   │   ├── focus-element.spec.ts
│   │   │   │   ├── graph-draw-after-clear.spec.ts
│   │   │   │   ├── model-add-edge-in-combo.spec.ts
│   │   │   │   ├── model-remove-parent.spec.ts
│   │   │   │   ├── plugin-history-align-fields.spec.ts
│   │   │   │   ├── plugin-hull-three-collinear-dots.spec.ts
│   │   │   │   ├── plugin-minimap-combo-collapsed.spec.ts
│   │   │   │   ├── render-change-combo.spec.ts
│   │   │   │   ├── render-deleted-data.spec.ts
│   │   │   │   ├── tree-update-collapsed-node.spec.ts
│   │   │   │   └── utils-set-visibility.spec.ts
│   │   │   ├── dataset/
│   │   │   │   ├── algorithm-category.json
│   │   │   │   ├── circular.json
│   │   │   │   ├── cluster.json
│   │   │   │   ├── combo.json
│   │   │   │   ├── dagre-combo.json
│   │   │   │   ├── dagre.json
│   │   │   │   ├── decision-tree.json
│   │   │   │   ├── element-edges.json
│   │   │   │   ├── element-nodes.json
│   │   │   │   ├── file-system.json
│   │   │   │   ├── flare.json
│   │   │   │   ├── force.json
│   │   │   │   ├── gene.json
│   │   │   │   ├── language-tree.json
│   │   │   │   ├── organization-chart.json
│   │   │   │   ├── parallel-edges.json
│   │   │   │   ├── radial.json
│   │   │   │   ├── relations.json
│   │   │   │   └── soccer.json
│   │   │   ├── demos/
│   │   │   │   ├── animation-element-edge-cubic.ts
│   │   │   │   ├── animation-element-edge-line.ts
│   │   │   │   ├── animation-element-edge-quadratic.ts
│   │   │   │   ├── animation-element-position.ts
│   │   │   │   ├── animation-element-state-switch.ts
│   │   │   │   ├── animation-element-state.ts
│   │   │   │   ├── animation-element-style-position.ts
│   │   │   │   ├── behavior-auto-adapt-label.ts
│   │   │   │   ├── behavior-brush-select.ts
│   │   │   │   ├── behavior-click-select.ts
│   │   │   │   ├── behavior-create-edge.ts
│   │   │   │   ├── behavior-drag-canvas.ts
│   │   │   │   ├── behavior-drag-element.ts
│   │   │   │   ├── behavior-expand-collapse-combo.ts
│   │   │   │   ├── behavior-expand-collapse-node.ts
│   │   │   │   ├── behavior-fix-element-size.ts
│   │   │   │   ├── behavior-focus-element.ts
│   │   │   │   ├── behavior-hover-activate.ts
│   │   │   │   ├── behavior-lasso-select.ts
│   │   │   │   ├── behavior-optimize-viewport-transform.ts
│   │   │   │   ├── behavior-scroll-canvas.ts
│   │   │   │   ├── behavior-zoom-canvas.ts
│   │   │   │   ├── bug-drag-rotated-canvas.ts
│   │   │   │   ├── bug-drag-rotated-element-force.ts
│   │   │   │   ├── bug-process-parallel-edges-combo-fixed.ts
│   │   │   │   ├── bug-tooltip-resize.ts
│   │   │   │   ├── canvas-cursor.ts
│   │   │   │   ├── case-fishbone.ts
│   │   │   │   ├── case-fund-flow.ts
│   │   │   │   ├── case-indented-tree.ts
│   │   │   │   ├── case-language-tree.ts
│   │   │   │   ├── case-mindmap.ts
│   │   │   │   ├── case-org-chart.ts
│   │   │   │   ├── case-radial-dendrogram.ts
│   │   │   │   ├── case-unicorns-investors.ts
│   │   │   │   ├── case-why-do-cats.ts
│   │   │   │   ├── common-graph.ts
│   │   │   │   ├── controller-viewport.ts
│   │   │   │   ├── demo-autosize-element-label.ts
│   │   │   │   ├── demo-found-flow.ts
│   │   │   │   ├── demo-supply-chains.ts
│   │   │   │   ├── element-change-type.ts
│   │   │   │   ├── element-combo.ts
│   │   │   │   ├── element-edge-arrow.ts
│   │   │   │   ├── element-edge-cubic-horizontal.ts
│   │   │   │   ├── element-edge-cubic-radial.ts
│   │   │   │   ├── element-edge-cubic-vertical.ts
│   │   │   │   ├── element-edge-cubic.ts
│   │   │   │   ├── element-edge-custom-arrow.ts
│   │   │   │   ├── element-edge-line.ts
│   │   │   │   ├── element-edge-loop-curve.ts
│   │   │   │   ├── element-edge-loop-polyline.ts
│   │   │   │   ├── element-edge-polyline-animation.ts
│   │   │   │   ├── element-edge-polyline-astar.ts
│   │   │   │   ├── element-edge-polyline-orth.ts
│   │   │   │   ├── element-edge-polyline.ts
│   │   │   │   ├── element-edge-port.ts
│   │   │   │   ├── element-edge-quadratic.ts
│   │   │   │   ├── element-edge-size.ts
│   │   │   │   ├── element-html-sub-graph.ts
│   │   │   │   ├── element-label-background.ts
│   │   │   │   ├── element-label-oversized.ts
│   │   │   │   ├── element-node-avatar.ts
│   │   │   │   ├── element-node-badges.ts
│   │   │   │   ├── element-node-circle.ts
│   │   │   │   ├── element-node-diamond.ts
│   │   │   │   ├── element-node-donut.ts
│   │   │   │   ├── element-node-ellipse.ts
│   │   │   │   ├── element-node-hexagon.ts
│   │   │   │   ├── element-node-html-2.ts
│   │   │   │   ├── element-node-html.ts
│   │   │   │   ├── element-node-image.ts
│   │   │   │   ├── element-node-rect.ts
│   │   │   │   ├── element-node-star.ts
│   │   │   │   ├── element-node-svg-icon.ts
│   │   │   │   ├── element-node-triangle.ts
│   │   │   │   ├── element-port.ts
│   │   │   │   ├── element-position-combo.ts
│   │   │   │   ├── element-position.ts
│   │   │   │   ├── element-state.ts
│   │   │   │   ├── element-visibility-part.ts
│   │   │   │   ├── element-visibility.ts
│   │   │   │   ├── element-z-index.ts
│   │   │   │   ├── graph-to-data-url.ts
│   │   │   │   ├── image-node-halo-test.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout-antv-dagre-flow-combo.ts
│   │   │   │   ├── layout-antv-dagre-flow.ts
│   │   │   │   ├── layout-circular-basic.ts
│   │   │   │   ├── layout-circular-configuration-translate.ts
│   │   │   │   ├── layout-circular-degree.ts
│   │   │   │   ├── layout-circular-division.ts
│   │   │   │   ├── layout-circular-spiral.ts
│   │   │   │   ├── layout-combo-combined.ts
│   │   │   │   ├── layout-compact-box-basic.ts
│   │   │   │   ├── layout-compact-box-left-align.ts
│   │   │   │   ├── layout-compact-box-top-to-bottom.ts
│   │   │   │   ├── layout-concentric.ts
│   │   │   │   ├── layout-custom-dagre.ts
│   │   │   │   ├── layout-custom-horizontal.ts
│   │   │   │   ├── layout-custom-iterative.ts
│   │   │   │   ├── layout-d3-force.ts
│   │   │   │   ├── layout-dagre.ts
│   │   │   │   ├── layout-dendrogram-basic.ts
│   │   │   │   ├── layout-dendrogram-radial.ts
│   │   │   │   ├── layout-dendrogram-tb.ts
│   │   │   │   ├── layout-fishbone.ts
│   │   │   │   ├── layout-force-collision.ts
│   │   │   │   ├── layout-force-lattice.ts
│   │   │   │   ├── layout-force.ts
│   │   │   │   ├── layout-forceatlas2-wasm.ts
│   │   │   │   ├── layout-fruchterman-basic.ts
│   │   │   │   ├── layout-fruchterman-cluster.ts
│   │   │   │   ├── layout-fruchterman-fix.ts
│   │   │   │   ├── layout-fruchterman-gpu.ts
│   │   │   │   ├── layout-fruchterman-wasm.ts
│   │   │   │   ├── layout-grid.ts
│   │   │   │   ├── layout-indented.ts
│   │   │   │   ├── layout-mds.ts
│   │   │   │   ├── layout-mindmap-h-custom-side.ts
│   │   │   │   ├── layout-mindmap-h-left.ts
│   │   │   │   ├── layout-mindmap-h-right.ts
│   │   │   │   ├── layout-mindmap-h.ts
│   │   │   │   ├── layout-pipeline-mds-force.ts
│   │   │   │   ├── layout-radial-basic.ts
│   │   │   │   ├── layout-radial-configuration-translate.ts
│   │   │   │   ├── layout-radial-prevent-overlap-unstrict.ts
│   │   │   │   ├── layout-radial-prevent-overlap.ts
│   │   │   │   ├── layout-radial-sort.ts
│   │   │   │   ├── layout-snake.ts
│   │   │   │   ├── perf-20000-elements.ts
│   │   │   │   ├── perf-fcp.ts
│   │   │   │   ├── plugin-background.ts
│   │   │   │   ├── plugin-bubble-sets.ts
│   │   │   │   ├── plugin-camera-setting.ts
│   │   │   │   ├── plugin-contextmenu.ts
│   │   │   │   ├── plugin-edge-bundling.ts
│   │   │   │   ├── plugin-edge-filter-lens.ts
│   │   │   │   ├── plugin-fisheye.ts
│   │   │   │   ├── plugin-fullscreen.ts
│   │   │   │   ├── plugin-grid-line.ts
│   │   │   │   ├── plugin-history.ts
│   │   │   │   ├── plugin-hull.ts
│   │   │   │   ├── plugin-legend.ts
│   │   │   │   ├── plugin-minimap-edge-arrow.ts
│   │   │   │   ├── plugin-minimap.ts
│   │   │   │   ├── plugin-snapline.ts
│   │   │   │   ├── plugin-timebar.ts
│   │   │   │   ├── plugin-title.ts
│   │   │   │   ├── plugin-toolbar-build-in.ts
│   │   │   │   ├── plugin-toolbar-iconfont.ts
│   │   │   │   ├── plugin-tooltip-async.ts
│   │   │   │   ├── plugin-tooltip-dual.ts
│   │   │   │   ├── plugin-tooltip-enable.ts
│   │   │   │   ├── plugin-tooltip-with-custom-node.ts
│   │   │   │   ├── plugin-tooltip.ts
│   │   │   │   ├── plugin-watermark-image.ts
│   │   │   │   ├── plugin-watermark.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform-map-node-size.ts
│   │   │   │   ├── transform-place-radial-labels.ts
│   │   │   │   ├── transform-process-parallel-edges.ts
│   │   │   │   └── viewport-fit.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── perf/
│   │   │   │   ├── data.perf.ts
│   │   │   │   ├── draw.perf.ts
│   │   │   │   ├── massive-element.perf.ts
│   │   │   │   └── update-state.perf.ts
│   │   │   ├── perf-report/
│   │   │   │   ├── 9821ed36_2024-08-22_20-39-12.json
│   │   │   │   ├── 9821ed36_2024-08-29_11-11-17.json
│   │   │   │   ├── 9821ed36_2024-08-29_13-24-51.json
│   │   │   │   ├── 9821ed36_2024-09-03_10-33-27.json
│   │   │   │   └── 9821ed36_2024-09-03_11-28-42.json
│   │   │   ├── setup.ts
│   │   │   ├── types.d.ts
│   │   │   ├── unit/
│   │   │   │   ├── animations/
│   │   │   │   │   ├── element-position.spec.ts
│   │   │   │   │   ├── element-state-switch.spec.ts
│   │   │   │   │   └── element-style-position.spec.ts
│   │   │   │   ├── behaviors/
│   │   │   │   │   ├── auto-adapt-label.spec.ts
│   │   │   │   │   ├── behavior-create-edge-click.spec.ts
│   │   │   │   │   ├── behavior-create-edge-drag.spec.ts
│   │   │   │   │   ├── brush-select.spec.ts
│   │   │   │   │   ├── click-select-catch.spec.ts
│   │   │   │   │   ├── click-select.spec.ts
│   │   │   │   │   ├── collapse-expand-combo.spec.ts
│   │   │   │   │   ├── collapse-expand-node.spec.ts
│   │   │   │   │   ├── collapse-expand.spec.ts
│   │   │   │   │   ├── drag-canvas.spec.ts
│   │   │   │   │   ├── drag-element-bug.spec.ts
│   │   │   │   │   ├── drag-element-combo.spec.ts
│   │   │   │   │   ├── drag-element.spec.ts
│   │   │   │   │   ├── fix-element-size.spec.ts
│   │   │   │   │   ├── focus-element.spec.ts
│   │   │   │   │   ├── hover-activate.spec.ts
│   │   │   │   │   ├── lasso-select.spec.ts
│   │   │   │   │   ├── optimize-viewport-transform.spec.ts
│   │   │   │   │   ├── scroll-canvas.spec.ts
│   │   │   │   │   └── zoom-canvas.spec.ts
│   │   │   │   ├── default.spec.ts
│   │   │   │   ├── elements/
│   │   │   │   │   ├── change-type.spec.ts
│   │   │   │   │   ├── combo.spec.ts
│   │   │   │   │   ├── edges/
│   │   │   │   │   │   ├── arrow.spec.ts
│   │   │   │   │   │   ├── cubic-horizontal.spec.ts
│   │   │   │   │   │   ├── cubic-radial.spec.ts
│   │   │   │   │   │   ├── cubic-vertical.spec.ts
│   │   │   │   │   │   ├── cubic.spec.ts
│   │   │   │   │   │   ├── custom-arrow.spec.ts
│   │   │   │   │   │   ├── line.spec.ts
│   │   │   │   │   │   ├── loop-curve.spec.ts
│   │   │   │   │   │   ├── loop-polyline.spec.ts
│   │   │   │   │   │   ├── polyline-animation.spec.ts
│   │   │   │   │   │   ├── polyline-astar.spec.ts
│   │   │   │   │   │   ├── polyline-orth.spec.ts
│   │   │   │   │   │   ├── polyline.spec.ts
│   │   │   │   │   │   ├── port.spec.ts
│   │   │   │   │   │   ├── quadratic.spec.ts
│   │   │   │   │   │   └── size.spec.ts
│   │   │   │   │   ├── label-background.spec.ts
│   │   │   │   │   ├── label-oversized.spec.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── avatar.spec.ts
│   │   │   │   │   │   ├── circle.spec.ts
│   │   │   │   │   │   ├── diamond.spec.ts
│   │   │   │   │   │   ├── donut.spec.ts
│   │   │   │   │   │   ├── ellipse.spec.ts
│   │   │   │   │   │   ├── hexagon.spec.ts
│   │   │   │   │   │   ├── image.spec.ts
│   │   │   │   │   │   ├── rect.spec.ts
│   │   │   │   │   │   ├── star.spec.ts
│   │   │   │   │   │   └── triangle.spec.ts
│   │   │   │   │   ├── override-methods.spec.ts
│   │   │   │   │   ├── port.spec.ts
│   │   │   │   │   ├── position-combo.spec.ts
│   │   │   │   │   ├── position.spec.ts
│   │   │   │   │   ├── shape.spec.ts
│   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   └── z-index.spec.ts
│   │   │   │   ├── import.spec.ts
│   │   │   │   ├── layouts/
│   │   │   │   │   ├── circular.spec.ts
│   │   │   │   │   ├── combo-layout.spec.ts
│   │   │   │   │   ├── compact-box.spec.ts
│   │   │   │   │   ├── concentric.spec.ts
│   │   │   │   │   ├── custom-dagre.spec.ts
│   │   │   │   │   ├── custom-layout-horizontal.spec.ts
│   │   │   │   │   ├── d3-force-collision.spec.ts
│   │   │   │   │   ├── d3-force-lattice.spec.ts
│   │   │   │   │   ├── d3-force.spec.ts
│   │   │   │   │   ├── dagre.spec.ts
│   │   │   │   │   ├── dendrogram.spec.ts
│   │   │   │   │   ├── fishbone.spec.ts
│   │   │   │   │   ├── fruchterman.spec.ts
│   │   │   │   │   ├── grid.spec.ts
│   │   │   │   │   ├── indented.spec.ts
│   │   │   │   │   ├── mds.spec.ts
│   │   │   │   │   ├── mindmap.spec.ts
│   │   │   │   │   ├── pipeline.spec.ts
│   │   │   │   │   ├── radial-layout.spec.ts
│   │   │   │   │   └── snake.spec.ts
│   │   │   │   ├── plugins/
│   │   │   │   │   ├── background.spec.ts
│   │   │   │   │   ├── bubble-sets.spec.ts
│   │   │   │   │   ├── camera-setting.spec.ts
│   │   │   │   │   ├── contextmenu.spec.ts
│   │   │   │   │   ├── edge-bundling.spec.ts
│   │   │   │   │   ├── edge-filter-lens.spec.ts
│   │   │   │   │   ├── fisheye.spec.ts
│   │   │   │   │   ├── grid-line.spec.ts
│   │   │   │   │   ├── history/
│   │   │   │   │   │   ├── plugin-history.spec.ts
│   │   │   │   │   │   └── utils.spec.ts
│   │   │   │   │   ├── hull/
│   │   │   │   │   │   ├── plugin-hull.spec.ts
│   │   │   │   │   │   └── util.spec.ts
│   │   │   │   │   ├── legend.spec.ts
│   │   │   │   │   ├── snapline.spec.ts
│   │   │   │   │   ├── timebar.spec.ts
│   │   │   │   │   ├── title.spec.ts
│   │   │   │   │   ├── toolbar/
│   │   │   │   │   │   ├── plugin-toolbar.spec.ts
│   │   │   │   │   │   └── util.spec.ts
│   │   │   │   │   ├── tooltip.spec.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   └── dom.spec.ts
│   │   │   │   │   └── watermark.spec.ts
│   │   │   │   ├── registry.spec.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── canvas.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── element/
│   │   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   │   └── z-index.spec.ts
│   │   │   │   │   ├── element.spec.ts
│   │   │   │   │   ├── graph/
│   │   │   │   │   │   ├── add-children-data.spec.ts
│   │   │   │   │   │   ├── auto-resize.spec.ts
│   │   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   │   ├── get-plugin-instantce.spec.ts
│   │   │   │   │   │   ├── graph.spec.ts
│   │   │   │   │   │   └── this.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   └── viewport.spec.ts
│   │   │   │   ├── spec/
│   │   │   │   │   ├── behavior.spec.ts
│   │   │   │   │   ├── canvas.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── element/
│   │   │   │   │   │   ├── combo.spec.ts
│   │   │   │   │   │   ├── edge.spec.ts
│   │   │   │   │   │   └── node.spec.ts
│   │   │   │   │   ├── index.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   ├── optimize.spec.ts
│   │   │   │   │   ├── plugin.spec.ts
│   │   │   │   │   ├── theme.spec.ts
│   │   │   │   │   └── viewport.spec.ts
│   │   │   │   ├── themes/
│   │   │   │   │   └── base.spec.ts
│   │   │   │   ├── transforms/
│   │   │   │   │   ├── base-transform.spec.ts
│   │   │   │   │   ├── transform-map-node-size.spec.ts
│   │   │   │   │   ├── transform-position-radial-labels.spec.ts
│   │   │   │   │   └── transform-process-parallel-edges.spec.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── anchor.spec.ts
│   │   │   │   │   ├── animation.spec.ts
│   │   │   │   │   ├── array.spec.ts
│   │   │   │   │   ├── bbox.spec.ts
│   │   │   │   │   ├── cache.spec.ts
│   │   │   │   │   ├── change.spec.ts
│   │   │   │   │   ├── collapsibility.spec.ts
│   │   │   │   │   ├── contextmenu.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── diff.spec.ts
│   │   │   │   │   ├── dom.spec.ts
│   │   │   │   │   ├── edge.spec.ts
│   │   │   │   │   ├── element.spec.ts
│   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   ├── extension.spec.ts
│   │   │   │   │   ├── graphlib.spec.ts
│   │   │   │   │   ├── id.spec.ts
│   │   │   │   │   ├── is.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   ├── line.spec.ts
│   │   │   │   │   ├── math.spec.ts
│   │   │   │   │   ├── padding.spec.ts
│   │   │   │   │   ├── palette.spec.ts
│   │   │   │   │   ├── path.spec.ts
│   │   │   │   │   ├── placement.spec.ts
│   │   │   │   │   ├── point.spec.ts
│   │   │   │   │   ├── polygon.spec.ts
│   │   │   │   │   ├── position.spec.ts
│   │   │   │   │   ├── prefix.spec.ts
│   │   │   │   │   ├── print.spec.ts
│   │   │   │   │   ├── random.spec.ts
│   │   │   │   │   ├── relation.spec.ts
│   │   │   │   │   ├── router.spec.ts
│   │   │   │   │   ├── scale.spec.ts
│   │   │   │   │   ├── shape.spec.ts
│   │   │   │   │   ├── shortcut.spec.ts
│   │   │   │   │   ├── size.spec.ts
│   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   ├── style.spec.ts
│   │   │   │   │   ├── symbol.spec.ts
│   │   │   │   │   ├── text.spec.ts
│   │   │   │   │   ├── theme.spec.ts
│   │   │   │   │   ├── traverse.spec.ts
│   │   │   │   │   ├── tree.spec.ts
│   │   │   │   │   ├── vector.spec.ts
│   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   └── z-index.spec.ts
│   │   │   │   └── version.spec.ts
│   │   │   └── utils/
│   │   │       ├── canvas.ts
│   │   │       ├── create.ts
│   │   │       ├── dir.ts
│   │   │       ├── dom.ts
│   │   │       ├── index.ts
│   │   │       ├── offscreen-canvas-context.ts
│   │   │       ├── random.ts
│   │   │       ├── sleep.ts
│   │   │       ├── svg-transformer.js
│   │   │       ├── to-be-close-to.ts
│   │   │       ├── to-match-svg-snapshot.ts
│   │   │       └── use-snapshot-matchers.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── perf.config.js
│   │   ├── rollup.config.mjs
│   │   ├── scripts/
│   │   │   ├── tag.mjs
│   │   │   └── version.mjs
│   │   ├── src/
│   │   │   ├── animations/
│   │   │   │   ├── executor.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── behaviors/
│   │   │   │   ├── auto-adapt-label.ts
│   │   │   │   ├── base-behavior.ts
│   │   │   │   ├── brush-select.ts
│   │   │   │   ├── click-select.ts
│   │   │   │   ├── collapse-expand.ts
│   │   │   │   ├── create-edge.ts
│   │   │   │   ├── drag-canvas.ts
│   │   │   │   ├── drag-element-force.ts
│   │   │   │   ├── drag-element.ts
│   │   │   │   ├── fix-element-size.ts
│   │   │   │   ├── focus-element.ts
│   │   │   │   ├── hover-activate.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lasso-select.ts
│   │   │   │   ├── optimize-viewport-transform.ts
│   │   │   │   ├── scroll-canvas.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── zoom-canvas.ts
│   │   │   ├── constants/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── events/
│   │   │   │   │   ├── animation.ts
│   │   │   │   │   ├── canvas.ts
│   │   │   │   │   ├── combo.ts
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── container.ts
│   │   │   │   │   ├── edge.ts
│   │   │   │   │   ├── graph.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── node.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── registry.ts
│   │   │   ├── elements/
│   │   │   │   ├── base-element.ts
│   │   │   │   ├── combos/
│   │   │   │   │   ├── base-combo.ts
│   │   │   │   │   ├── circle.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── rect.ts
│   │   │   │   ├── edges/
│   │   │   │   │   ├── base-edge.ts
│   │   │   │   │   ├── cubic-horizontal.ts
│   │   │   │   │   ├── cubic-radial.ts
│   │   │   │   │   ├── cubic-vertical.ts
│   │   │   │   │   ├── cubic.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── line.ts
│   │   │   │   │   ├── polyline.ts
│   │   │   │   │   └── quadratic.ts
│   │   │   │   ├── effect.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── nodes/
│   │   │   │   │   ├── base-node.ts
│   │   │   │   │   ├── circle.ts
│   │   │   │   │   ├── diamond.ts
│   │   │   │   │   ├── donut.ts
│   │   │   │   │   ├── ellipse.ts
│   │   │   │   │   ├── hexagon.ts
│   │   │   │   │   ├── html.ts
│   │   │   │   │   ├── image.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── rect.ts
│   │   │   │   │   ├── star.ts
│   │   │   │   │   └── triangle.ts
│   │   │   │   └── shapes/
│   │   │   │       ├── badge.ts
│   │   │   │       ├── base-shape.ts
│   │   │   │       ├── contour.ts
│   │   │   │       ├── icon.ts
│   │   │   │       ├── image.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── label.ts
│   │   │   │       └── polygon.ts
│   │   │   ├── exports.ts
│   │   │   ├── global.d.ts
│   │   │   ├── index.ts
│   │   │   ├── layouts/
│   │   │   │   ├── base-layout.ts
│   │   │   │   ├── fishbone.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── snake.ts
│   │   │   │   └── types.ts
│   │   │   ├── palettes/
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── plugins/
│   │   │   │   ├── background/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── base-plugin.ts
│   │   │   │   ├── bubble-sets.ts
│   │   │   │   ├── camera-setting.ts
│   │   │   │   ├── contextmenu/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── edge-bundling/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── edge-filter-lens/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── fisheye/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── fullscreen/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── grid-line.ts
│   │   │   │   ├── history/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── hull/
│   │   │   │   │   ├── hull/
│   │   │   │   │   │   ├── format.ts
│   │   │   │   │   │   ├── grid_handle.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── monotone-convex-hull-2d.ts
│   │   │   │   │   │   ├── robust-orientation.ts
│   │   │   │   │   │   ├── robust-scale.ts
│   │   │   │   │   │   ├── robust-segment-intersect.ts
│   │   │   │   │   │   ├── robust-subtract.ts
│   │   │   │   │   │   ├── robust-sum.ts
│   │   │   │   │   │   ├── two-product.ts
│   │   │   │   │   │   └── two-sum.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── legend.ts
│   │   │   │   ├── minimap/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── snapline/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── timebar.ts
│   │   │   │   ├── title/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── toolbar/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── tooltip.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── canvas.ts
│   │   │   │   │   └── dom.ts
│   │   │   │   └── watermark/
│   │   │   │       ├── index.ts
│   │   │   │       └── util.ts
│   │   │   ├── preset.ts
│   │   │   ├── registry/
│   │   │   │   ├── build-in.ts
│   │   │   │   ├── extension/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── get.ts
│   │   │   │   ├── register.ts
│   │   │   │   ├── store.ts
│   │   │   │   └── types.ts
│   │   │   ├── runtime/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── batch.ts
│   │   │   │   ├── behavior.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── graph.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── options.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── transform.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── spec/
│   │   │   │   ├── behavior.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── element/
│   │   │   │   │   ├── animation.ts
│   │   │   │   │   ├── combo.ts
│   │   │   │   │   ├── edge.ts
│   │   │   │   │   ├── node.ts
│   │   │   │   │   └── palette.ts
│   │   │   │   ├── graph.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── themes/
│   │   │   │   ├── base.ts
│   │   │   │   ├── dark.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── light.ts
│   │   │   │   └── types.ts
│   │   │   ├── transforms/
│   │   │   │   ├── arrange-draw-order.ts
│   │   │   │   ├── base-transform.ts
│   │   │   │   ├── collapse-expand-combo.ts
│   │   │   │   ├── collapse-expand-node.ts
│   │   │   │   ├── get-edge-actual-ends.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── map-node-size.ts
│   │   │   │   ├── place-radial-labels.ts
│   │   │   │   ├── process-parallel-edges.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── update-related-edge.ts
│   │   │   │   └── utils.ts
│   │   │   ├── types/
│   │   │   │   ├── anchor.ts
│   │   │   │   ├── animation.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── centrality.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── combo.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── edge.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── enum.ts
│   │   │   │   ├── event.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── history.ts
│   │   │   │   ├── id.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── node.ts
│   │   │   │   ├── padding.ts
│   │   │   │   ├── placement.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── point.ts
│   │   │   │   ├── prefix.ts
│   │   │   │   ├── router.ts
│   │   │   │   ├── size.ts
│   │   │   │   ├── state.ts
│   │   │   │   ├── style.ts
│   │   │   │   ├── tree.ts
│   │   │   │   ├── utility.ts
│   │   │   │   ├── vector.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── utils/
│   │   │   │   ├── anchor.ts
│   │   │   │   ├── animation.ts
│   │   │   │   ├── array.ts
│   │   │   │   ├── bbox.ts
│   │   │   │   ├── cache.ts
│   │   │   │   ├── centrality.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── collapsibility.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── diff.ts
│   │   │   │   ├── dom.ts
│   │   │   │   ├── edge.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── event/
│   │   │   │   │   ├── events.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── extension.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── id.ts
│   │   │   │   ├── is.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── line.ts
│   │   │   │   ├── math.ts
│   │   │   │   ├── node.ts
│   │   │   │   ├── padding.ts
│   │   │   │   ├── palette.ts
│   │   │   │   ├── path.ts
│   │   │   │   ├── pinch.ts
│   │   │   │   ├── placement.ts
│   │   │   │   ├── point.ts
│   │   │   │   ├── polygon.ts
│   │   │   │   ├── position.ts
│   │   │   │   ├── prefix.ts
│   │   │   │   ├── print.ts
│   │   │   │   ├── relation.ts
│   │   │   │   ├── router/
│   │   │   │   │   ├── orth.ts
│   │   │   │   │   └── shortest-path.ts
│   │   │   │   ├── scale.ts
│   │   │   │   ├── shape.ts
│   │   │   │   ├── shortcut.ts
│   │   │   │   ├── size.ts
│   │   │   │   ├── state.ts
│   │   │   │   ├── style.ts
│   │   │   │   ├── symbol.ts
│   │   │   │   ├── text.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform.ts
│   │   │   │   ├── traverse.ts
│   │   │   │   ├── tree.ts
│   │   │   │   ├── vector.ts
│   │   │   │   ├── visibility.ts
│   │   │   │   └── z-index.ts
│   │   │   └── version.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsdoc.json
│   │   └── vite.config.js
│   ├── g6-extension-3d/
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── dataset/
│   │   │   │   ├── cubic.json
│   │   │   │   └── force-3d.json
│   │   │   ├── demos/
│   │   │   │   ├── behavior-drag-canvas.ts
│   │   │   │   ├── behavior-observe-canvas.ts
│   │   │   │   ├── behavior-roll-canvas.ts
│   │   │   │   ├── behavior-zoom-canvas.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layer-top.ts
│   │   │   │   ├── layout-d3-force-3d.ts
│   │   │   │   ├── massive-elements.ts
│   │   │   │   ├── position.ts
│   │   │   │   ├── shapes.ts
│   │   │   │   ├── solar-system.ts
│   │   │   │   └── switch-renderer.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── types.d.ts
│   │   │   └── unit/
│   │   │       ├── default.spec.ts
│   │   │       └── utils/
│   │   │           ├── cache.spec.ts
│   │   │           ├── geometry.spec.ts
│   │   │           ├── map.spec.ts
│   │   │           ├── material.spec.ts
│   │   │           └── texture.spec.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── behaviors/
│   │   │   │   ├── drag-canvas-3d.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── observe-canvas-3d.ts
│   │   │   │   ├── roll-canvas-3d.ts
│   │   │   │   └── zoom-canvas-3d.ts
│   │   │   ├── elements/
│   │   │   │   ├── base-node-3d.ts
│   │   │   │   ├── capsule.ts
│   │   │   │   ├── cone.ts
│   │   │   │   ├── cube.ts
│   │   │   │   ├── cylinder.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── line-3d.ts
│   │   │   │   ├── plane.ts
│   │   │   │   ├── sphere.ts
│   │   │   │   └── torus.ts
│   │   │   ├── exports.ts
│   │   │   ├── index.ts
│   │   │   ├── plugins/
│   │   │   │   ├── index.ts
│   │   │   │   └── light.ts
│   │   │   ├── renderer.ts
│   │   │   ├── types/
│   │   │   │   ├── index.ts
│   │   │   │   └── material.ts
│   │   │   └── utils/
│   │   │       ├── cache.ts
│   │   │       ├── geometry.ts
│   │   │       ├── map.ts
│   │   │       ├── material.ts
│   │   │       └── texture.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── vite.config.js
│   ├── g6-extension-react/
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── dataset/
│   │   │   │   └── euro-cup.json
│   │   │   ├── demos/
│   │   │   │   ├── euro-cup.tsx
│   │   │   │   ├── graph.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── performance-diagnosis.tsx
│   │   │   │   └── react-node.tsx
│   │   │   ├── graph.tsx
│   │   │   ├── index.html
│   │   │   ├── main.tsx
│   │   │   └── unit/
│   │   │       ├── attribute-changed-callback.spec.tsx
│   │   │       └── default.spec.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   └── react-node/
│   │   │       ├── index.ts
│   │   │       ├── node.tsx
│   │   │       ├── render.ts
│   │   │       ├── render16.ts
│   │   │       └── render18.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── vite.config.js
│   ├── g6-ssr/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── graph-options.json
│   │   │   └── graph.spec.ts
│   │   ├── bin/
│   │   │   └── g6-ssr.js
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── canvas.ts
│   │   │   ├── graph.ts
│   │   │   ├── index.ts
│   │   │   └── types.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   └── tsconfig.test.json
│   └── site/
│       ├── .dumi/
│       │   ├── app.tsx
│       │   ├── global.less
│       │   ├── global.ts
│       │   └── tsconfig.json
│       ├── .dumirc.ts
│       ├── .github/
│       │   └── workflows/
│       │       └── mirror.yml
│       ├── .gitignore
│       ├── CNAME
│       ├── api-extractor.json
│       ├── common/
│       │   ├── angular-snippet.md
│       │   ├── api/
│       │   │   ├── behaviors/
│       │   │   │   ├── auto-adapt-label.md
│       │   │   │   ├── brush-select.md
│       │   │   │   ├── click-element.md
│       │   │   │   ├── collapse-expand.md
│       │   │   │   ├── create-edge.md
│       │   │   │   ├── drag-canvas.md
│       │   │   │   ├── drag-element.md
│       │   │   │   ├── fix-element-size.md
│       │   │   │   ├── focus-element.md
│       │   │   │   ├── hover-activate.md
│       │   │   │   ├── hover-element.md
│       │   │   │   ├── lasso-select.md
│       │   │   │   ├── scroll-canvas.md
│       │   │   │   └── zoom-canvas.md
│       │   │   ├── elements/
│       │   │   │   ├── combos/
│       │   │   │   │   ├── base-combo.md
│       │   │   │   │   ├── circle-combo-interest.md
│       │   │   │   │   ├── circle-combo.md
│       │   │   │   │   ├── rect-combo-architecture.md
│       │   │   │   │   └── rect-combo.md
│       │   │   │   ├── edges/
│       │   │   │   │   ├── base-edge.md
│       │   │   │   │   ├── cubic-horizontal.md
│       │   │   │   │   ├── cubic-vertical.md
│       │   │   │   │   ├── cubic.md
│       │   │   │   │   ├── line.md
│       │   │   │   │   ├── polyline.md
│       │   │   │   │   └── quadratic.md
│       │   │   │   └── nodes/
│       │   │   │       ├── base-node.md
│       │   │   │       ├── circle.md
│       │   │   │       ├── diamond.md
│       │   │   │       ├── donut.md
│       │   │   │       ├── ellipse.md
│       │   │   │       ├── hexagon.md
│       │   │   │       ├── html.md
│       │   │   │       ├── image.md
│       │   │   │       ├── rect.md
│       │   │   │       ├── star.md
│       │   │   │       └── triangle.md
│       │   │   ├── layout/
│       │   │   │   ├── fishbone.md
│       │   │   │   └── force-atlas2.md
│       │   │   ├── layouts/
│       │   │   │   ├── radial.md
│       │   │   │   └── snake.md
│       │   │   ├── plugins/
│       │   │   │   ├── background.md
│       │   │   │   ├── bubble-sets.md
│       │   │   │   ├── contextmenu.md
│       │   │   │   ├── edge-bundling.md
│       │   │   │   ├── edge-filter-lens.md
│       │   │   │   ├── fisheye.md
│       │   │   │   ├── fullscreen.md
│       │   │   │   ├── grid-line.md
│       │   │   │   ├── history.md
│       │   │   │   ├── hull.md
│       │   │   │   ├── legend.md
│       │   │   │   ├── minimap.md
│       │   │   │   ├── snapline.md
│       │   │   │   ├── timebar.md
│       │   │   │   ├── toolbar.md
│       │   │   │   ├── tooltip.md
│       │   │   │   └── watermark.md
│       │   │   └── transforms/
│       │   │       ├── map-node-size-centrality.md
│       │   │       └── map-node-size-scale.md
│       │   ├── manual/
│       │   │   ├── core-concept/
│       │   │   │   ├── animation/
│       │   │   │   │   ├── ant-line.md
│       │   │   │   │   └── breathing-circle.md
│       │   │   │   └── palette/
│       │   │   │       ├── continuous-palette.md
│       │   │   │       ├── default-config.md
│       │   │   │       └── standard-config.md
│       │   │   ├── custom-extension/
│       │   │   │   ├── animation/
│       │   │   │   │   ├── composite-animation-1.md
│       │   │   │   │   ├── composite-animation-2.md
│       │   │   │   │   └── implement-animation.md
│       │   │   │   ├── behavior/
│       │   │   │   │   └── implement-behaviors.md
│       │   │   │   ├── layout/
│       │   │   │   │   ├── iterative-layout.md
│       │   │   │   │   └── non-iterative-layout.md
│       │   │   │   ├── plugin/
│       │   │   │   │   └── implement-plugin.md
│       │   │   │   └── transform/
│       │   │   │       ├── circular-radial-labels.md
│       │   │   │       └── hide-free-node.md
│       │   │   ├── feature/
│       │   │   │   ├── treeToGraphData.md
│       │   │   │   └── webpack4.md
│       │   │   └── getting-started/
│       │   │       ├── extensions/
│       │   │       │   └── palettes.md
│       │   │       ├── quick-start/
│       │   │       │   └── simple-graph.md
│       │   │       └── step-by-step/
│       │   │           ├── behaviors.md
│       │   │           ├── create-chart.md
│       │   │           ├── elements-1.md
│       │   │           ├── elements-2.md
│       │   │           ├── layout.md
│       │   │           ├── palette.md
│       │   │           ├── plugins-1.md
│       │   │           └── plugins-2.md
│       │   ├── react-snippet-strict.md
│       │   ├── react-snippet.md
│       │   └── vue-snippet.md
│       ├── docs/
│       │   ├── api/
│       │   │   ├── behavior.en.md
│       │   │   ├── behavior.zh.md
│       │   │   ├── canvas.en.md
│       │   │   ├── canvas.zh.md
│       │   │   ├── coordinate.en.md
│       │   │   ├── coordinate.zh.md
│       │   │   ├── data.en.md
│       │   │   ├── data.zh.md
│       │   │   ├── element.en.md
│       │   │   ├── element.zh.md
│       │   │   ├── event.en.md
│       │   │   ├── event.zh.md
│       │   │   ├── export-image.en.md
│       │   │   ├── export-image.zh.md
│       │   │   ├── graph.en.md
│       │   │   ├── graph.zh.md
│       │   │   ├── layout.en.md
│       │   │   ├── layout.zh.md
│       │   │   ├── option.en.md
│       │   │   ├── option.zh.md
│       │   │   ├── plugin.en.md
│       │   │   ├── plugin.zh.md
│       │   │   ├── render.en.md
│       │   │   ├── render.zh.md
│       │   │   ├── theme.en.md
│       │   │   ├── theme.zh.md
│       │   │   ├── transform.en.md
│       │   │   ├── transform.zh.md
│       │   │   ├── viewport.en.md
│       │   │   └── viewport.zh.md
│       │   ├── backup/
│       │   │   ├── CameraSetting.en.md
│       │   │   └── CameraSetting.zh.md
│       │   └── manual/
│       │       ├── animation/
│       │       │   ├── animation.en.md
│       │       │   ├── animation.zh.md
│       │       │   ├── custom-animation.en.md
│       │       │   └── custom-animation.zh.md
│       │       ├── behavior/
│       │       │   ├── AutoAdaptLabel.en.md
│       │       │   ├── AutoAdaptLabel.zh.md
│       │       │   ├── BrushSelect.en.md
│       │       │   ├── BrushSelect.zh.md
│       │       │   ├── ClickSelect.en.md
│       │       │   ├── ClickSelect.zh.md
│       │       │   ├── CollapseExpand.en.md
│       │       │   ├── CollapseExpand.zh.md
│       │       │   ├── CreateEdge.en.md
│       │       │   ├── CreateEdge.zh.md
│       │       │   ├── DragCanvas.en.md
│       │       │   ├── DragCanvas.zh.md
│       │       │   ├── DragElement.en.md
│       │       │   ├── DragElement.zh.md
│       │       │   ├── DragElementForce.en.md
│       │       │   ├── DragElementForce.zh.md
│       │       │   ├── FixElementSize.en.md
│       │       │   ├── FixElementSize.zh.md
│       │       │   ├── FocusElement.en.md
│       │       │   ├── FocusElement.zh.md
│       │       │   ├── HoverActivate.en.md
│       │       │   ├── HoverActivate.zh.md
│       │       │   ├── LassoSelect.en.md
│       │       │   ├── LassoSelect.zh.md
│       │       │   ├── OptimizeViewportTransform.en.md
│       │       │   ├── OptimizeViewportTransform.zh.md
│       │       │   ├── ScrollCanvas.en.md
│       │       │   ├── ScrollCanvas.zh.md
│       │       │   ├── ZoomCanvas.en.md
│       │       │   ├── ZoomCanvas.zh.md
│       │       │   ├── custom-behavior.en.md
│       │       │   ├── custom-behavior.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── contribute.en.md
│       │       ├── contribute.zh.md
│       │       ├── data.en.md
│       │       ├── data.zh.md
│       │       ├── element/
│       │       │   ├── combo/
│       │       │   │   ├── BaseCombo.en.md
│       │       │   │   ├── BaseCombo.zh.md
│       │       │   │   ├── CircleCombo.en.md
│       │       │   │   ├── CircleCombo.zh.md
│       │       │   │   ├── RectCombo.en.md
│       │       │   │   ├── RectCombo.zh.md
│       │       │   │   ├── custom-combo.en.md
│       │       │   │   ├── custom-combo.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   └── overview.zh.md
│       │       │   ├── edge/
│       │       │   │   ├── BaseEdge.en.md
│       │       │   │   ├── BaseEdge.zh.md
│       │       │   │   ├── Cubic.en.md
│       │       │   │   ├── Cubic.zh.md
│       │       │   │   ├── CubicHorizontal.en.md
│       │       │   │   ├── CubicHorizontal.zh.md
│       │       │   │   ├── CubicVertical.en.md
│       │       │   │   ├── CubicVertical.zh.md
│       │       │   │   ├── Line.en.md
│       │       │   │   ├── Line.zh.md
│       │       │   │   ├── Polyline.en.md
│       │       │   │   ├── Polyline.zh.md
│       │       │   │   ├── Quadratic.en.md
│       │       │   │   ├── Quadratic.zh.md
│       │       │   │   ├── custom-edge.en.md
│       │       │   │   ├── custom-edge.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   └── overview.zh.md
│       │       │   ├── node/
│       │       │   │   ├── BaseNode.en.md
│       │       │   │   ├── BaseNode.zh.md
│       │       │   │   ├── Circle.en.md
│       │       │   │   ├── Circle.zh.md
│       │       │   │   ├── Diamond.en.md
│       │       │   │   ├── Diamond.zh.md
│       │       │   │   ├── Donut.en.md
│       │       │   │   ├── Donut.zh.md
│       │       │   │   ├── Ellipse.en.md
│       │       │   │   ├── Ellipse.zh.md
│       │       │   │   ├── Hexagon.en.md
│       │       │   │   ├── Hexagon.zh.md
│       │       │   │   ├── Html.en.md
│       │       │   │   ├── Html.zh.md
│       │       │   │   ├── Image.en.md
│       │       │   │   ├── Image.zh.md
│       │       │   │   ├── Rect.en.md
│       │       │   │   ├── Rect.zh.md
│       │       │   │   ├── Star.en.md
│       │       │   │   ├── Star.zh.md
│       │       │   │   ├── Triangle.en.md
│       │       │   │   ├── Triangle.zh.md
│       │       │   │   ├── custom-node.en.md
│       │       │   │   ├── custom-node.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   ├── overview.zh.md
│       │       │   │   ├── react-node.en.md
│       │       │   │   ├── react-node.zh.md
│       │       │   │   ├── vue-node.en.md
│       │       │   │   └── vue-node.zh.md
│       │       │   ├── overview.en.md
│       │       │   ├── overview.zh.md
│       │       │   ├── shape/
│       │       │   │   ├── label-shape.en.md
│       │       │   │   ├── label-shape.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   ├── overview.zh.md
│       │       │   │   ├── properties.en.md
│       │       │   │   └── properties.zh.md
│       │       │   ├── state.en.md
│       │       │   └── state.zh.md
│       │       ├── extension/
│       │       │   ├── 3d.en.md
│       │       │   └── 3d.zh.md
│       │       ├── faq.en.md
│       │       ├── faq.zh.md
│       │       ├── further-reading/
│       │       │   ├── 3d.en.md
│       │       │   ├── 3d.zh.md
│       │       │   ├── bundle.en.md
│       │       │   ├── bundle.zh.md
│       │       │   ├── coordinate.en.md
│       │       │   ├── coordinate.zh.md
│       │       │   ├── download-image.en.md
│       │       │   ├── download-image.zh.md
│       │       │   ├── event.en.md
│       │       │   ├── event.zh.md
│       │       │   ├── iconfont.en.md
│       │       │   ├── iconfont.zh.md
│       │       │   ├── renderer.en.md
│       │       │   └── renderer.zh.md
│       │       ├── getting-started/
│       │       │   ├── installation.en.md
│       │       │   ├── installation.zh.md
│       │       │   ├── integration/
│       │       │   │   ├── angular.en.md
│       │       │   │   ├── angular.zh.md
│       │       │   │   ├── react.en.md
│       │       │   │   ├── react.zh.md
│       │       │   │   ├── vue.en.md
│       │       │   │   └── vue.zh.md
│       │       │   ├── quick-start.en.md
│       │       │   ├── quick-start.zh.md
│       │       │   ├── step-by-step.en.md
│       │       │   └── step-by-step.zh.md
│       │       ├── graph/
│       │       │   ├── extension.en.md
│       │       │   ├── extension.zh.md
│       │       │   ├── extensions.en.md
│       │       │   ├── extensions.zh.md
│       │       │   ├── graph.en.md
│       │       │   ├── graph.zh.md
│       │       │   ├── option.en.md
│       │       │   └── option.zh.md
│       │       ├── introduction.en.md
│       │       ├── introduction.zh.md
│       │       ├── layout/
│       │       │   ├── AntvDagreLayout.en.md
│       │       │   ├── AntvDagreLayout.zh.md
│       │       │   ├── BaseLayout.en.md
│       │       │   ├── BaseLayout.zh.md
│       │       │   ├── CircularLayout.en.md
│       │       │   ├── CircularLayout.zh.md
│       │       │   ├── ComboCombinedLayout.en.md
│       │       │   ├── ComboCombinedLayout.zh.md
│       │       │   ├── CompactBoxLayout.en.md
│       │       │   ├── CompactBoxLayout.zh.md
│       │       │   ├── ConcentricLayout.en.md
│       │       │   ├── ConcentricLayout.zh.md
│       │       │   ├── D3Force3DLayout.en.md
│       │       │   ├── D3Force3DLayout.zh.md
│       │       │   ├── D3ForceLayout.en.md
│       │       │   ├── D3ForceLayout.zh.md
│       │       │   ├── DagreLayout.en.md
│       │       │   ├── DagreLayout.zh.md
│       │       │   ├── DendrogramLayout.en.md
│       │       │   ├── DendrogramLayout.zh.md
│       │       │   ├── Fishbone.en.md
│       │       │   ├── Fishbone.zh.md
│       │       │   ├── ForceAtlas2Layout.en.md
│       │       │   ├── ForceAtlas2Layout.zh.md
│       │       │   ├── ForceLayout.en.md
│       │       │   ├── ForceLayout.zh.md
│       │       │   ├── FruchtermanLayout.en.md
│       │       │   ├── FruchtermanLayout.zh.md
│       │       │   ├── GridLayout.en.md
│       │       │   ├── GridLayout.zh.md
│       │       │   ├── IndentedLayout.en.md
│       │       │   ├── IndentedLayout.zh.md
│       │       │   ├── MdsLayout.en.md
│       │       │   ├── MdsLayout.zh.md
│       │       │   ├── MindmapLayout.en.md
│       │       │   ├── MindmapLayout.zh.md
│       │       │   ├── RadialLayout.en.md
│       │       │   ├── RadialLayout.zh.md
│       │       │   ├── RandomLayout.en.md
│       │       │   ├── RandomLayout.zh.md
│       │       │   ├── Snake.en.md
│       │       │   ├── Snake.zh.md
│       │       │   ├── custom-layout.en.md
│       │       │   ├── custom-layout.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── plugin/
│       │       │   ├── Background.en.md
│       │       │   ├── Background.zh.md
│       │       │   ├── BubbleSets.en.md
│       │       │   ├── BubbleSets.zh.md
│       │       │   ├── Contextmenu.en.md
│       │       │   ├── Contextmenu.zh.md
│       │       │   ├── EdgeBundling.en.md
│       │       │   ├── EdgeBundling.zh.md
│       │       │   ├── EdgeFilterLens.en.md
│       │       │   ├── EdgeFilterLens.zh.md
│       │       │   ├── Fisheye.en.md
│       │       │   ├── Fisheye.zh.md
│       │       │   ├── Fullscreen.en.md
│       │       │   ├── Fullscreen.zh.md
│       │       │   ├── GridLine.en.md
│       │       │   ├── GridLine.zh.md
│       │       │   ├── History.en.md
│       │       │   ├── History.zh.md
│       │       │   ├── Hull.en.md
│       │       │   ├── Hull.zh.md
│       │       │   ├── Legend.en.md
│       │       │   ├── Legend.zh.md
│       │       │   ├── Minimap.en.md
│       │       │   ├── Minimap.zh.md
│       │       │   ├── Snapline.en.md
│       │       │   ├── Snapline.zh.md
│       │       │   ├── Timebar.en.md
│       │       │   ├── Timebar.zh.md
│       │       │   ├── Title.en.md
│       │       │   ├── Title.zh.md
│       │       │   ├── Toolbar.en.md
│       │       │   ├── Toolbar.zh.md
│       │       │   ├── Tooltip.en.md
│       │       │   ├── Tooltip.zh.md
│       │       │   ├── Watermark.en.md
│       │       │   ├── Watermark.zh.md
│       │       │   ├── custom-plugin.en.md
│       │       │   ├── custom-plugin.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── theme/
│       │       │   ├── custom-palette.en.md
│       │       │   ├── custom-palette.zh.md
│       │       │   ├── custom-theme.en.md
│       │       │   ├── custom-theme.zh.md
│       │       │   ├── overview.en.md
│       │       │   ├── overview.zh.md
│       │       │   ├── palette.en.md
│       │       │   └── palette.zh.md
│       │       ├── transform/
│       │       │   ├── MapNodeSize.en.md
│       │       │   ├── MapNodeSize.zh.md
│       │       │   ├── PlaceRadialLabels.en.md
│       │       │   ├── PlaceRadialLabels.zh.md
│       │       │   ├── ProcessParallelEdges.en.md
│       │       │   ├── ProcessParallelEdges.zh.md
│       │       │   ├── custom-transform.en.md
│       │       │   ├── custom-transform.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       └── whats-new/
│       │           ├── feature.en.md
│       │           ├── feature.zh.md
│       │           ├── upgrade.en.md
│       │           └── upgrade.zh.md
│       ├── examples/
│       │   ├── algorithm/
│       │   │   └── case/
│       │   │       ├── demo/
│       │   │       │   ├── label-propagation.js
│       │   │       │   ├── louvain.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── pattern-matching.js
│       │   │       │   └── shortest-path.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── animation/
│       │   │   ├── basic/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── combo-collapse-expand.js
│       │   │   │   │   ├── enter-edge-path-in.js
│       │   │   │   │   ├── enter.js
│       │   │   │   │   ├── exit.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── update.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── persistence/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── ant-line.js
│       │   │   │   │   ├── breathing-circle.js
│       │   │   │   │   ├── fly-marker.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── path-in.js
│       │   │   │   │   └── ripple-circle.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── viewport/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   ├── rotate.js
│       │   │       │   ├── translate.js
│       │   │       │   └── zoom.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── behavior/
│       │   │   ├── auto-adapt-label/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── canvas/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── drag.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── optimize.js
│       │   │   │   │   ├── scroll-and-zoom.js
│       │   │   │   │   ├── scroll-xy.js
│       │   │   │   │   ├── scroll-y.js
│       │   │   │   │   └── zoom.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── collapse-expand.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── create-edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── between-combos.js
│       │   │   │   │   ├── by-click.js
│       │   │   │   │   ├── by-drag.js
│       │   │   │   │   ├── custom-edge-style.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fix-element-size/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── autosize-label.js
│       │   │   │   │   ├── fix-font-size.js
│       │   │   │   │   ├── fix-size.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── focus/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── highlight-element/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── activate-relations.js
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── config-params.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── inner-event/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── select/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── brush-combo.js
│       │   │   │   │   ├── brush.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── lasso.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── update-label/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   └── update.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── element/
│       │   │   ├── combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── circle.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── rect.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── extra-button.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── custom-arrow.js
│       │   │   │   │   ├── custom-path.js
│       │   │   │   │   ├── extra-label.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-node/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── g2-activity-chart.js
│       │   │   │   │   ├── g2-bar-chart.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── react-node.jsx
│       │   │   │   │   └── reactnode-idcard.jsx
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── arrows.js
│       │   │   │   │   ├── cubic.js
│       │   │   │   │   ├── horizontal-cubic.js
│       │   │   │   │   ├── line.js
│       │   │   │   │   ├── loop-curve.js
│       │   │   │   │   ├── loop-polyline.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── polyline-orth-with-cps.js
│       │   │   │   │   ├── polyline-orth.js
│       │   │   │   │   ├── polyline.js
│       │   │   │   │   ├── quadratic.js
│       │   │   │   │   └── vertical-cubic.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── label/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── background.js
│       │   │   │   │   ├── copy.js
│       │   │   │   │   ├── ellipsis.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── word-wrap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── node/
│       │   │       ├── demo/
│       │   │       │   ├── 3d-node.js
│       │   │       │   ├── circle.js
│       │   │       │   ├── diamond.js
│       │   │       │   ├── donut.js
│       │   │       │   ├── ellipse.js
│       │   │       │   ├── hexagon.js
│       │   │       │   ├── html.js
│       │   │       │   ├── image.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── port.js
│       │   │       │   ├── rect.js
│       │   │       │   ├── rounded-rect.js
│       │   │       │   ├── star.js
│       │   │       │   └── triangle.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── examples.md
│       │   ├── feature/
│       │   │   └── default/
│       │   │       ├── demo/
│       │   │       │   ├── 3d-massive.js
│       │   │       │   ├── lite-solar-system.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── theme.js
│       │   │       │   └── unicorns-investors.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── layout/
│       │   │   ├── circular/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── degree.js
│       │   │   │   │   ├── division.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── spiral.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── combo-layout/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── combo-combined.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── compact-box/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── radial.js
│       │   │   │   │   └── vertical.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── concentric/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── arc.js
│       │   │   │   │   ├── bi-graph.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── dagre/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── antv-dagre-combo.js
│       │   │   │   │   ├── antv-dagre.js
│       │   │   │   │   ├── dagre.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── dendrogram/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── radial.js
│       │   │   │   │   └── vertical.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fishbone/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── force-directed/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── 3d-force.js
│       │   │   │   │   ├── atlas2.js
│       │   │   │   │   ├── bubbles.js
│       │   │   │   │   ├── collision.js
│       │   │   │   │   ├── d3-force.js
│       │   │   │   │   ├── drag-fixed.js
│       │   │   │   │   ├── force.js
│       │   │   │   │   ├── functional-params.js
│       │   │   │   │   ├── mesh.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── prevent-overlap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fruchterman/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── cluster.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── run-in-gpu.js
│       │   │   │   │   └── run-in-web-worker.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── grid/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── indented/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── auto-side.js
│       │   │   │   │   ├── custom-side.js
│       │   │   │   │   ├── left-side.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── no-drop-cap.js
│       │   │   │   │   └── right-side.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mds/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mechanism/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── change-data.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── switch.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mindmap/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── auto-side.js
│       │   │   │   │   ├── custom-side.js
│       │   │   │   │   ├── left-side.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── right-side.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── radial/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── cluster-sort.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── non-strict-prevent-overlap.js
│       │   │   │   │   └── strict-prevent-overlap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── snake/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── gutter.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── sub-graph/
│       │   │       ├── demo/
│       │   │       │   ├── basic.js
│       │   │       │   └── meta.json
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── performance/
│       │   │   └── massive-data/
│       │   │       ├── demo/
│       │   │       │   ├── 20000.js
│       │   │       │   ├── 5000.js
│       │   │       │   ├── 60000.js
│       │   │       │   └── meta.json
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── plugin/
│       │   │   ├── background/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── background.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── bubble-sets/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── contextMenu/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge-bundling/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge-filter-lens/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fisheye/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── custom.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fullscreen/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── grid-line/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── history/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── hull/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── legend/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── style.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── minimap/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── snapline/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── autoSnap.js
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── timebar/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── chart.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── time.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── toolbar/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── custom.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── tooltip/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── dual.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── watermark/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   ├── repeat.js
│       │   │       │   └── text.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── scene-case/
│       │   │   ├── default/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── battle-array.jsx
│       │   │   │   │   ├── fund-flow.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── music-festival.js
│       │   │   │   │   ├── organization-chart.js
│       │   │   │   │   ├── performance-diagnosis-flowchart.js
│       │   │   │   │   ├── snake-flow-diagram.js
│       │   │   │   │   ├── sub-graph.js
│       │   │   │   │   └── why-do-cats.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── tree-graph/
│       │   │       ├── demo/
│       │   │       │   ├── anti-procrastination-fishbone.js
│       │   │       │   ├── indented-tree.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── mindmap.js
│       │   │       │   ├── product-fishbone.js
│       │   │       │   ├── radial-compact-tree.js
│       │   │       │   └── radial-dendrogram.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   └── transform/
│       │       └── process-parallel-edges/
│       │           ├── demo/
│       │           │   ├── bundle.js
│       │           │   ├── merge.js
│       │           │   └── meta.json
│       │           ├── index.en.md
│       │           └── index.zh.md
│       ├── mako.config.json
│       ├── package.json
│       ├── scripts/
│       │   ├── clear-doc.ts
│       │   ├── doc-template.mjs
│       │   ├── extract-playground.js
│       │   ├── generate-api.ts
│       │   ├── generate-doc.ts
│       │   ├── rewrite-ob.ts
│       │   └── sort-doc.ts
│       ├── src/
│       │   ├── MarkdownDocumenter.ts
│       │   ├── constants/
│       │   │   ├── index.ts
│       │   │   ├── link.ts
│       │   │   └── locales/
│       │   │       ├── api-category.json
│       │   │       ├── element.json
│       │   │       ├── enum.ts
│       │   │       ├── helper.json
│       │   │       ├── index.ts
│       │   │       ├── keyword.json
│       │   │       └── page-name.json
│       │   ├── markdown/
│       │   │   ├── CustomMarkdownEmitter.ts
│       │   │   └── MarkdownEmitter.ts
│       │   ├── nodes/
│       │   │   ├── CustomDocNodeKind.ts
│       │   │   ├── DocContainer.ts
│       │   │   ├── DocDetails.ts
│       │   │   ├── DocEmphasisSpan.ts
│       │   │   ├── DocHeading.ts
│       │   │   ├── DocNoteBox.ts
│       │   │   ├── DocPageTitle.ts
│       │   │   ├── DocTable.ts
│       │   │   ├── DocTableCell.ts
│       │   │   ├── DocTableRow.ts
│       │   │   ├── DocText.ts
│       │   │   └── DocUnorderedList.ts
│       │   └── utils/
│       │       ├── IndentedWriter.ts
│       │       ├── Utilities.ts
│       │       ├── excerpt-token.ts
│       │       ├── gitignore.ts
│       │       └── parser.ts
│       └── tsconfig.json
├── playwright.config.ts
├── pnpm-workspace.yaml
├── scripts/
│   ├── demo-to-test/
│   │   ├── core/
│   │   │   ├── global.js
│   │   │   ├── index.js
│   │   │   ├── parser.js
│   │   │   └── utils.js
│   │   ├── index.js
│   │   └── template/
│   │       ├── it.js
│   │       ├── spec.js
│   │       └── test.js
│   └── version.sh
├── tests/
│   └── g6/
│       ├── elements/
│       │   └── node-element.spec.ts
│       └── plugins/
│           ├── plugins-minimap.spec.ts
│           └── plugins-tooltip.spec.ts
├── tsconfig.json
└── turbo.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .changeset/config.json
================================================
{
  "$schema": "https://unpkg.com/@changesets/config@3.0.1/schema.json",
  "changelog": false,
  "commit": false,
  "fixed": [],
  "linked": [],
  "access": "restricted",
  "baseBranch": "v5",
  "updateInternalDependencies": "patch",
  "ignore": ["@antv/g6-site", "bundle"]
}


================================================
FILE: .codecov.yml
================================================
# Setting coverage targets per flag
coverage:
  round: down
  range: 60..90
  precision: 2
  status:
    patch: off
    project:
      default: off
      g6:
        threshold: 1%
        flags:
          - g6

flags:
  g6:
    paths:
      # filter the folder(s) you wish to measure by that flag
      - packages/g6

comment:
  layout: "reach, diff, flags, files"
  behavior: default
  require_changes: true # only post the comment if coverage changes

github_checks:
  annotations: false

flag_management:
  default_rules:
    carryforward: false

================================================
FILE: .commitlintrc.js
================================================
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'wip'],
    ],
  },
};


================================================
FILE: .cursor/rules/translation.mdc
================================================
---
description: 翻译
globs:
alwaysApply: false
---
# Translation Guidelines for site/docs

When translating files under the `site/docs` directory, please adhere to the following guidelines:

1. **Consistency in Terminology**: Ensure that terminology is consistent throughout the document. Use a glossary if available to maintain uniformity in terms.

   **Glossary**:

   - 画布 (Canvas)
   - 元素 (Element)
   - 节点 (Node)
   - 边 (Edge)
   - 组合 (Combo)
   - 交互 (Behavior)
   - 布局 (Layout)
   - 插件 (Plugin)
   - 动画 (Animation)
   - 数据处理 (Transform)
   - 色板 (Palette)
   - 配置项 (Option)
   - 图数据 (Graph Data)
   - 树图 (Tree Graph)
   - 属性 (Property)
   - 描述 (Description)
   - 类型 (Type)
   - 默认值 (Default Value)
   - 必选 (Required)

2. **Adjust Hyperlinks**: Review and adjust hyperlinks to ensure they point to the correct translated sections or documents. Verify that all links are functional and correctly formatted.

   - **Internal Links**: In the English version, all internal links should have a `/en` prefix, while the Chinese version should not have any prefix. Ensure this prefix is added to all internal links in English documents to avoid any oversight.
   - **Anchor Points**: For anchor points following a `#`, if they contain Chinese characters, they should be adjusted to match the corresponding title in the English version rather than being directly translated.
   - **External Links**: Convert external links appropriately to ensure they align with the language and context of the document.

3. **Direct Writing to Translated Documents**: Translations should be stored in corresponding `.en.md` or `.zh.md` files within the same directory. Ensure that the translated content is placed in the correct location within the document.

   - When translating from Chinese to English, create or update the `.en.md` file in the same directory.
   - When translating from English to Chinese, create or update the `.zh.md` file in the same directory.

4. **Support for Partial Content Translation**: Allow for the selection and translation of specific sections of content. Translated sections should be inserted into the appropriate location within the document, maintaining the logical flow and structure.

   - **Full Document Translation**: If the entire document is selected for translation, replace the entire content with the translated version.
   - **Partial Content Translation**: If only specific sections are selected, find the appropriate place to replace or insert the translated content, ensuring the document's logical flow and structure are maintained.

5. **Contextual Translation**: Avoid literal translations. Ensure that the translation fits the English context and conveys the intended meaning accurately.

6. **Direct Modification**: Translations should be directly modified in the corresponding `.en.md` or `.zh.md` files without returning the translated content separately. Ensure that the changes are saved in the correct file and location.

7. **Preserve Metadata Order**: Do not modify the `order` attribute in the page metadata during translation. This ensures that the document order remains consistent across different language versions.

8. **Add '/en' Prefix to Internal Links**: Ensure that all internal links in English documentation have the '/en' prefix to maintain consistency and correct navigation.

By following these guidelines, translations will be more accurate and consistent, facilitating easier review and integration into the documentation.


================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

================================================
FILE: .eslintignore
================================================
dist
es
lib
node_modules

================================================
FILE: .eslintrc.js
================================================
module.exports = {
  root: true,
  env: {
    browser: true,
    es2021: true,
    node: true,
    commonjs: true,
    jest: true,
  },
  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:jsdoc/recommended-error'],
  overrides: [
    {
      env: {
        node: true,
      },
      files: ['.eslintrc.{js,cjs}'],
      parserOptions: {
        sourceType: 'script',
      },
    },
    {
      files: ['**/__tests__/**', '*.js', '*.mjs'],
      rules: {
        'jsdoc/require-jsdoc': 0,
      },
    },
    {
      files: ['./packages/g6/src/plugins/hull/!(index).ts', '*.js', '*.mjs', '*.ts'],
      rules: {
        'jsdoc/require-jsdoc': 0,
      },
    },
    {
      files: ['**/demo-to-test/**'],
      rules: {
        '@typescript-eslint/no-var-requires': 'off',
      },
    },
    {
      files: ['./packages/site/**', './scripts/**'],
      rules: {
        'no-console': 'off',
      },
    },
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint', 'jsdoc'],
  rules: {
    // indent: ['error', 2, { SwitchCase: 1 }],
    'linebreak-style': ['error', 'unix'],
    quotes: ['error', 'single', { allowTemplateLiterals: true, avoidEscape: true }],
    semi: ['error', 'always'],
    '@typescript-eslint/no-unused-vars': ['warn', { ignoreRestSiblings: true }],
    'jsdoc/require-param-type': 0,
    '@typescript-eslint/no-this-alias': 'off',
    'no-console': 'error',

    // TODO: rules below will be set to 2 in the future
    'jsdoc/require-jsdoc': 1,
    'jsdoc/check-access': 1,
    'jsdoc/valid-types': 0,
    /**
     * js plugin rules
     */
    'jsdoc/check-tag-names': [
      'error',
      {
        // Allow TSDoc tags @remarks, @defaultValue
        // Custom tags: @apiCategory for Graph API
        definedTags: ['remarks', 'defaultValue', 'apiCategory'],
      },
    ],
    'jsdoc/require-description': 1,
    'jsdoc/require-param': 1,
    'jsdoc/check-param-names': 1,
    'jsdoc/require-param-description': 1,
    'jsdoc/require-returns': 1,
    'jsdoc/require-returns-type': 0,
    'jsdoc/require-returns-description': 1,

    // TODO: rules below are not recommended, and will be removed in the future
    '@typescript-eslint/no-explicit-any': 1,
    '@typescript-eslint/ban-types': 1,
    '@typescript-eslint/ban-ts-comment': 1,
  },
};


================================================
FILE: .github/ISSUE_TEMPLATE/1.bug_report.yml
================================================
name: '🐞 Bug Report'
description: Create a report to help us improve, Ask questions in Discussions / 创建一个问题报告以帮助我们改进,提问请到 Discussions
title: '[Bug]: '
labels: ['waiting for maintainer']
body:
  - type: markdown
    attributes:
      value: |
        Report errors and exceptions found in the project.

        Before submitting a new bug/issue, please check the links below to see if there is a solution or question posted there already:

        ---

        反馈在项目中发现的错误、异常。

        在提交新 issue 之前,先通过以下链接检查是否存在相同问题:

        > [Issues](../issues) | [Closed Issues](../issues?q=is:issue+is:closed) | [Discussions](../discussions)

  - type: textarea
    id: description
    attributes:
      label: Describe the bug / 问题描述
      placeholder: |
        If there is a code block, please use Markdown syntax, such as:
        如包含代码块,请使用 Markdown 语法,如:

        ```javascript
        // Your code here
        ```
    validations:
      required: true
  - type: input
    id: link
    attributes:
      label: Reproduction link / 复现链接
      placeholder: |
        CodeSandbox / StackBlitz / ...
    validations:
      required: false
  - type: textarea
    id: steps
    attributes:
      label: Steps to Reproduce the Bug or Issue / 重现步骤
    validations:
      required: false
  - type: dropdown
    id: version
    attributes:
      label: Version / 版本
      options:
        - Please select / 请选择
        - 🆕 5.x
        - 4.x
        - 3.x
    validations:
      required: true
  - type: checkboxes
    id: OS
    attributes:
      label: OS / 操作系统
      options:
        - label: macOS
        - label: Windows
        - label: Linux
        - label: Others / 其他
    validations:
      required: true
  - type: checkboxes
    id: Browser
    attributes:
      label: Browser / 浏览器
      options:
        - label: Chrome
        - label: Edge
        - label: Firefox
        - label: Safari (Limited support / 有限支持)
        - label: IE (Nonsupport / 不支持)
        - label: Others / 其他
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/2.feature_request.yml
================================================
name: '💡 Feature Request'
description: I have a suggestion (and may want to implement it) / 我有一个建议(或者想参与贡献)
title: '[Feat]: '
labels: ['waiting for maintainer']
body:
  - type: textarea
    id: description
    attributes:
      label: Describe the feature / 功能描述
      description: 'What problem does this feature solve? / 这个功能解决什么问题?'
      placeholder: |
        I would like to see... because...
        我希望能有... 因为...
    validations:
      required: true

  - type: dropdown
    attributes:
      label: Are you willing to contribute? / 是否愿意参与贡献?
      options:
        - Please select / 请选择
        - ✅ Yes / 是
        - ❌ No / 否
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/3.docs_feedback.yml
================================================
name: '📖 Docs Feedback'
description: 'Help us make our docs better! Share your thoughts and suggestions / 帮助我们改进文档!分享您的想法和建议'
labels: ['waiting for maintainer']
title: '[Docs]: '
body:
  - type: markdown
    attributes:
      value: |
        ### 👋 Hello there! / 您好!

        Thank you for helping us improve our documentation! Your feedback is invaluable to us and will help make our docs better for everyone.

        感谢您帮助我们改进文档!您的反馈对我们来说非常宝贵,这将帮助我们为所有人提供更好的文档体验。

  - type: input
    id: page-url
    attributes:
      label: '📍 Which page are you reading?'
      description: "Please share the URL of the page you'd like to give feedback on / 请分享您想要反馈的页面链接"
      placeholder: 'https://docs.example.com/'
    validations:
      required: true

  - type: dropdown
    id: feedback-type
    attributes:
      label: "💭 What's on your mind?"
      description: 'What kind of feedback would you like to share? / 您想分享什么类型的反馈?'
      options:
        - 'Could be clearer / 需要更清晰的解释'
        - 'Missing information / 信息不完整'
        - 'Example needs fixing / 示例需要修复'
        - 'Content needs updating / 内容需要更新'
        - 'Other suggestions / 其他建议'
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: '🤔 Tell us more'
      description: |
        Let us know what went wrong when you were using this documentation and what we could do to improve it | 请告知您在使用此文档时遇到的问题以及我们可以改进的地方
      placeholder: |
        Share your experience:
        - What confused you?
        - What were you looking for?
        - What would have helped you understand better?

        分享您的体验:
        - 哪里让您感到困惑?
        - 您在寻找什么信息?
        - 什么样的改进能帮助您更好地理解?
    validations:
      required: true

  - type: textarea
    id: suggestion
    attributes:
      label: '💡 Got any suggestions?'
      description: |
        What are you trying to accomplish? Providing context helps us come up with a solution that is more useful in the real world | 您希望实现什么目标?提供上下文有助于我们提出更实用的解决方案
      placeholder: |
        Some ideas you might share:
        - Adding more examples
        - Including screenshots
        - Providing step-by-step guides

        您可以建议:
        - 添加更多示例
        - 包含截图说明
        - 提供步骤指南
    validations:
      required: false

  - type: markdown
    attributes:
      value: |
        ---
        💝 Thanks for taking the time to fill out this form! Your feedback helps make our documentation better for everyone.

        感谢您抽出宝贵时间填写这份反馈!您的建议将帮助我们为所有人提供更好的文档。


================================================
FILE: .github/ISSUE_TEMPLATE/4.oscp.yml
================================================
name: '✏️ OSCP Season of Docs'
description: '通过开源社区的力量,共同打造更友好、更易上手的 AntV 文档 | Contribute to AntV G6 documentation with the power of open source community'
labels: ['OSCP']
projects: ['2025 AntV OSCP Season of Docs']
title: '[Docs]: '
body:
  - type: textarea
    id: 'summary'
    attributes:
      label: 任务介绍
      value: |
        > 此 ISSUE 为 [AntV 开源共建计划(AntV Open Source Contribution Plan,简称 AntV OSCP)Phase3 - 文档季](https://github.com/antvis/G6/issues/6882)的任务 ISSUE,欢迎社区开发者参与共建~
        >  - 更多任务,可查看 [GitHub Project - 2025 AntV OSCP Season of Docs](https://github.com/orgs/antvis/projects/31)。

        > This ISSUE is one of the tasks of the [AntV Open Source Contribution Plan (referred to as AntV OSCP) Pharse3 - Season of Docs](https://github.com/antvis/G6/issues/6882) . Welcome to join us in building it together!
        > - For more tasks, you can check the [GitHub Project - 2025 AntV OSCP Season of Docs](https://github.com/orgs/antvis/projects/31).

        ## 改造文档「xxx」

        ### 任务介绍

        - 任务名称:改造 [xxx](https://g6.antv.antgroup.com/manual/xxx) 文档
        - 技术方向:g6 / docs
        - 任务难度:新手友好 🌟 / 进阶 🌟🌟 / 专家 🌟🌟🌟
        - 可获得积分:20分 / 30分 / 50分

        ### 详细要求

        - 文档规范:
          - 参考示例:
            - [插件 - 内置插件 - 背景](https://g6.antv.antgroup.com/manual/plugin/build-in/background)
            - [插件 - 内置插件 - 工具栏](https://g6.antv.antgroup.com/manual/plugin/build-in/toolbar)
          - 文档结构:「GridLine」部分的文档至少应该包括 **概述**、**使用场景**、**配置项**,**示例代码** 几个部分。
          - 内容规范:
            - 属性表格需要包含【属性】【描述】【类型】【默认值】【必选】列,所有的配置项包括绘图属性需要罗列完整。
            - 复杂类型单独解释说明
            - 必要时可配上示意图

        ### 能力要求

        ```
        - 对 G6 有一定了解,能阅读 G6 源码,编写示例。
        ```

        ### 执行路径

        #### 1. 认领任务

        选择感兴趣的且没有 Assignee 的任务,按格式回复,该任务 assign 给你后即为成功认领~
        - 认领回复格式:【@GitHub ID + Give it to me】
        - eg:【@yvonnyx Give it to me】

        #### 2. 做任务

        1. clone  g6 代码

        ```bash
        git clone https://github.com/antvis/G6.git
        ```

        2. 拉取所有线上分支

        ```bash
        git fetch
        ```

        3. 切换到 v5 分支

        ```bash
        git checkout v5
        ```

        4. 安装依赖

        ```bash
        pnpm install
        ```

        5. 进入 site 包

        ```bash
        cd packages/site
        ```

        6. 本地启动 site 站点

        ```bash
        pnpm run dev
        ```

        7. 优化文档并预览效果

        对应文件位于 `packages/site/docs/manual/xxx.zh.md`

        #### 3. 提交 PR

        > 请保证文档语意通顺、格式正确、代码示例完整且能够正确编译,否则该 PR 将不会被 review 和 merge,此 issue 将被重新释放。

        1. 提交 Pull Request,等待 Code Review

        - PR 标题参考 `docs: 任务名称` ,如 `docs: 改造点击选中交互文档` ,并关联 `OSCP` 标签,以便快速进入 PR review 阶段。
        - PR 与对应任务 ISSUE 进行关联,方式:在 PR 正文中,通过 `- Fixed: #任务 ISSUE 号` 即可实现关联,eg:

        ![Image](https://github.com/user-attachments/assets/a05cc8f5-d42b-47fd-b3e2-be796a8b8017)

        2. 根据(多次) Code Review 建议修改

        3 等待合并入 v5 分支后,积分生效


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# Ref: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
blank_issues_enabled: false
contact_links:
  - name: 📝 Question / 问题咨询
    url: https://github.com/antvis/g6/discussions/new?category=q-a
    about: Discuss G6 usage / 讨论 G6 使用问题
  - name: 💬 Join Discussion Group / 加入讨论群
    url: https://qr.dingtalk.com/action/joingroup?code=v1,k1,rQHsK/OOTPX8ixM/DaXcL3goIYpnpKr/AFIonmA1SOM=&_dt_no_comment=1&origin=11?
    about: Join DingTalk discussion group / 加入钉钉讨论群


================================================
FILE: .github/ISSUE_TEMPLATE/oscp.yml
================================================
# name: 'AntV OSCP 计划 / AntV OSCP Plan'
# description: AntV 开源共建计划(仅供管理员使用) / AntV Open Source Contribution Plan(For administrators only)
# body:
#   - type: checkboxes
#     id: AntV_OSCP_program
#     attributes:
#       label: AntV Open Source Contribution Plan(可选/Optional)
#       description: |
#         AntV 开源共建计划期望可以基于 AntV 的开源 Roadmap 开放具体开发任务到社区,以社区共建任务的形式推动“AntV” 的开源发展,也期望有更多社区伙伴各各种形式参与到 AntV 的开源共建中,共同参与数据可视化开源生态的持续建设。
#         AntV Open Source Contribution Plan expects to open specific development tasks to the community based on AntV's open source roadmap, promote the open source development of "AntV" in the form of community co-construction tasks, and also hope that more community partners will participate in AntV's open source co-construction in various forms, and jointly participate in the continuous construction of the data visualization open source ecosystem.

#         若有感兴趣想要认领的任务,可直接回复认领,如果你是首次认领可先完成初级入门任务。
#         If you are interested in claiming a task, you can directly reply to claim it. If you are claiming for the first time, you can complete the primary entry task first.

#       options:
#         - label: 我同意将这个 Issue 参与 OSCP 计划 / I agree to participate in the OSCP plan
#     validations:
#       required: false
#   - type: dropdown
#     id: issue_oscp_difficulty
#     attributes:
#       label: Issue 类型 / Issue Type
#       options:
#         - 初级任务 / Primary Task
#         - 中级任务 / Intermediate Task
#         - 高级任务 / Advanced Task
#         - 专家任务 / Expert Task
#     validations:
#       required: false
#   - type: textarea
#     id: oscp_task_description
#     attributes:
#       label: 任务介绍 / Task Description
#       description: |
#         简单描述任务背景信息,为了解决哪些问题
#         Briefly describe the background information of the task and what problems to solve
#     validations:
#       required: false
#   - type: textarea
#     id: oscp_task_info_ref
#     attributes:
#       label: 参考说明 / Reference Description
#       description: |
#         提供一些可参考的 demo,相关教程辅助用户解决问题
#         Provide some demos and related tutorials for users to solve problems
#     validations:
#       required: false


================================================
FILE: .github/workflows/build.yml
================================================
name: build

on:
  push:
    paths-ignore:
      - '**/*.md'
  pull_request:
    paths-ignore:
      - '**/*.md'

concurrency:
  group: ${{github.workflow}}-${{github.event_name}}-${{github.ref}}
  cancel-in-progress: true

jobs:
  lint-and-build-g6:
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Install Dependencies
        run: |
          brew install python-setuptools pkg-config cairo pango libpng jpeg giflib librsvg

      - uses: pnpm/action-setup@v4
        name: Install pnpm
        with:
          version: 9
          run_install: false

      - name: Install Dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Run CI
        run: |
          npm run ci

      - name: Run Playwright tests
        run: |
          pnpm exec playwright install chromium
          pnpm exec playwright test

      - name: Upload blob report to GitHub Actions Artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: report
          path: |
            packages/g6/__tests__/snapshots/**/*-actual.svg
            playwright-report/
          retention-days: 1

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          files: ./packages/g6/coverage/coverage-final.json
          flags: g6
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}


================================================
FILE: .github/workflows/deploy.yml
================================================
name: Deploy

on:
  workflow_dispatch:
  push:
    branches:
      - v5

jobs:
  deploy-site:
    runs-on: ubuntu-latest
    steps:
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - uses: pnpm/action-setup@v4
        with:
          version: 9
      - uses: actions/checkout@v2
      - run: pnpm install
      - run: pnpm build
      - run: |
          cd ./packages/site
          pnpm run build
      - run: cp ./packages/site/CNAME ./packages/site/dist/CNAME
      - run: |
          cd ./packages/site/dist
          git init
          git config --local user.name antv
          git config --local user.email antv@antfin.com
          git add .
          git commit -m "update by release action"
      - uses: ad-m/github-push-action@master
        with:
          github_token: ${{secrets.PERSONAL_ACCESS_TOKEN}}
          directory: ./packages/site/dist
          branch: gh-pages
          force: true


================================================
FILE: .github/workflows/ensure-triage-label.yml
================================================
name: Ensure Triage Label is Present

on:
  label:
    types:
      - deleted
  issues:
    types:
      - opened

permissions: {}

jobs:
  label_issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - uses: actions/github-script@v7.0.1
        with:
          script: |
            const labelToTriage = 'waiting for maintainer';

            const { data: labels } = await github.rest.issues.listLabelsOnIssue({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
            });

            if (labels.length <= 0) {
              await github.rest.issues.addLabels({
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                labels: [labelToTriage]
              })
            }


================================================
FILE: .github/workflows/issue-automated.yml
================================================
name: Issue Automated Processing

on:
  issues:
    types: [opened, reopened, edited]
  workflow_dispatch:
    inputs:
      issue_number:
        description: 'Issue number to process'
        required: true
        type: number

permissions:
  issues: write
  pull-requests: read
  contents: read

jobs:
  issue-response:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Install dependencies
        run: |
          yarn install
          yarn add openai @antv/mcp-server-antv -W

      - name: Process Issue
        uses: actions/github-script@v7
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} #
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            let issue = context.payload.issue;

            if (context.eventName === 'workflow_dispatch') {
              const issueNumber = context.payload.inputs.issue_number;
              const { data: issueData } = await github.rest.issues.get({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: issueNumber
              });
              issue = issueData;
            }

            const script = require('./.github/workflows/scripts/issue-automated.js');
            await script({
              github,
              core,
              context,
              issue
            });


================================================
FILE: .github/workflows/issue_translate.yml
================================================
name: Translate Issue Title

on:
  issues:
    types: [opened, edited]

jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Translate
        uses: Aarebecca/issue-translator@1.0.0
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AZURE_TRANSLATE_KEY: ${{ secrets.AZURE_TRANSLATE_KEY }}
          AZURE_TRANSLATE_ENDPOINT: 'https://api.cognitive.microsofttranslator.com'
          AZURE_TRANSLATE_LOCATION: 'eastus'
          AZURE_TRANSLATE_TARGET: 'en'


================================================
FILE: .github/workflows/manage-labeled.yml
================================================
name: Manage Labeled Issue

on:
  issues:
    types: [labeled]

permissions: {}

jobs:
  manage-labels:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      # 当添加分类标签时,移除 'waiting for maintainer' 标签
      - name: Remove `waiting for maintainer` label when other triage labels are added
        uses: actions/github-script@v7.0.1
        with:
          script: |
            const labelsToCheck = ['waiting for author', 'need improvement', 'bug 🐛', 'documentation 📖', 'feature 💡', 'question 💬', 'notabug', 'stale', 'wontfix', 'duplicate'];

            const labelToRemove = 'waiting for maintainer';
            const newLabel = context.payload.label.name;

            if (labelsToCheck.includes(newLabel)) {
                const { data: labels } = await github.rest.issues.listLabelsOnIssue({
                  issue_number: context.issue.number,
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                });
                if (labels.some(label => label.name === labelToRemove)) {
                  await github.rest.issues.removeLabel({
                    issue_number: context.issue.number,
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    name: labelToRemove,
                  });
                }
            }

      # 当添加 'need improvement' 标签时,同时添加 'waiting for author' 标签
      - name: Append label if `need improvement` is added
        if: github.event.label.name == 'need improvement'
        uses: actions-cool/issues-helper@v3.6.0
        with:
          actions: "add-labels"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          labels: "waiting for author"

      # 当添加 'need improvement' 标签时,发送提醒评论
      - name: Warn bad issue when `need improvement` label is added
        if: github.event.label.name == 'need improvement'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "create-comment"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          body: |
            📝 To help us better understand and address your issue, **please provide more information, or use the standard format**, otherwise we will not process this issue.

            Reference document: 

              - [Creating an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/creating-an-issue)
              - [Basic writing and formatting syntax](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)

            ---

            📝 为了帮助我们更好地理解和解决你的问题,**请提供更多信息,或者使用规范的格式**,否则我们不会处理这个 issue。

            参考文档:

              - [创建议题](https://docs.github.com/zh/issues/tracking-your-work-with-issues/using-issues/creating-an-issue)
              - [基本撰写和格式语法](https://docs.github.com/zh/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)
          emoji: "heart"

      # 处理 stale 标签
      - name: Add stale issue comment before closing
        if: github.event.label.name == 'stale'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "create-comment"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          body: |
            ⚠️ This issue has been automatically closed due to inactivity. 

            - If the issue is still relevant and important to you, feel free to:
              1. Reopen with additional information
              2. Create a new issue with updated context
              3. Reference any related issues or discussions

            We close inactive issues to keep our backlog manageable and focused on active issues.

            Your contribution makes our project better! 🌟

            ---

            ⚠️ 由于长期无活动,此 issue 已被自动关闭。

            - 如果这个问题对您来说仍然重要,您可以:
              1. 重新打开并提供补充信息
              2. 创建一个新的 issue 并更新相关背景
              3. 关联相关的 issue 或讨论

            为了更好地维护项目,我们需要定期清理不活跃的问题。

            感谢您为开源添砖加瓦!🌟
          emoji: "heart"

      - name: Close stale issue
        if: github.event.label.name == 'stale'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "close-issue"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}

      # 处理 wontfix 标签
      - name: Add wontfix issue comment before closing
        if: github.event.label.name == 'wontfix'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "create-comment"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          body: |
            🚫 This issue has been marked as "Won't Fix". Here's why:

            - The described behavior is working as intended
            - The request falls outside our project scope/goals
            - The cost/benefit ratio doesn't justify the change

            If you have new information that might change this decision, feel free to:
            1. Share your additional context
            2. Propose alternative solutions
            3. Start a discussion to explore different approaches

            Thank you for your understanding and engagement! 🙏

            ---

            🚫 此 issue 被标记为"不予修复",原因如下:

            - 当前行为符合设计预期
            - 该请求超出项目范围/目标
            - 投入产出比不足以支持此变更

            如果您有任何新的想法或建议,欢迎:
            1. 分享更多上下文
            2. 提出替代方案
            3. 发起讨论以探索不同思路

            感谢理解与支持!🙏
          emoji: "heart"

      - name: Close wontfix issue
        if: github.event.label.name == 'wontfix'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "close-issue"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}

      # 处理 notabug 标签
      - name: Add notabug issue comment before closing
        if: github.event.label.name == 'notabug'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "create-comment"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          body: |
            ✅ After careful review, we've determined this is not a bug. Here's why:

            - The current behavior is working as designed
            - This might be a misunderstanding of the feature
            - The issue cannot be reproduced with the provided information

            If you still believe this is a bug, please:
            1. Provide a minimal reproduction
            2. Share your expected behavior
            3. Include more detailed environment information

            Thank you for helping us improve our project! 💫

            ---

            ✅ 经过仔细核查,这并非一个 bug,原因如下:

            - 当前表现符合设计预期
            - 可能是对功能理解有所偏差
            - 基于已提供信息无法复现问题

            如果您仍认为这是一个 bug,建议:
            1. 提供最小复现示例
            2. 说明您期望的表现
            3. 补充更详细的环境信息

            期待您的反馈!💫
          emoji: "heart"

      - name: Close notabug issue
        if: github.event.label.name == 'notabug'
        uses: actions-cool/issues-helper@v3
        with:
          actions: "close-issue"
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}


================================================
FILE: .github/workflows/mark-duplicate.yml
================================================
name: Mark Duplicate Issue

on:
  issue_comment:
    types: [created, edited]

permissions: {}

jobs:
  mark-duplicate:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write
    steps:
      - name: Mark duplicate issue
        uses: actions-cool/issues-helper@v3.6.0
        with:
          actions: "mark-duplicate"
          token: ${{ secrets.GITHUB_TOKEN }}
          duplicate-labels: "duplicate"
          remove-labels: "waiting for maintainer"
          close-issue: true


================================================
FILE: .github/workflows/no-response.yml
================================================
name: No Response

# `issues`.`closed`, `issue_comment`.`created`, and `scheduled` event types are required for this Action
# to work properly.
on:
  issues:
    types:
      - closed
  issue_comment:
    types:
      - created
  schedule:
    # These runs in our repos are spread evenly throughout the day to avoid hitting rate limits.
    # If you change this schedule, consider changing the remaining repositories as well.
    # Runs at 12 am, 12 pm
    - cron: "0 0,12 * * *"

permissions: {}

jobs:
  noResponse:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write
    steps:
      - uses: MBilalShafi/no-response-add-label@v0.0.6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          # Number of days of inactivity before an Issue is closed for lack of response
          daysUntilClose: 7
          # Label requiring a response
          responseRequiredLabel: "waiting for author"
          # Label to add back when required label is removed
          optionalFollowupLabel: "waiting for maintainer"
          # Comment to post when closing an Issue for lack of response. Set to `false` to disable
          closeComment: |
            ⚠️ This issue has been automatically closed due to inactivity. 

            - If the issue is still relevant and important to you, feel free to:
              1. Reopen with additional information
              2. Create a new issue with updated context
              3. Reference any related issues or discussions

            We close inactive issues to keep our backlog manageable and focused on active issues. 

            Your contribution makes our project better! 🌟

            ---

            ⚠️ 由于长期无活动,此 issue 已被自动关闭。

            - 如果这个问题对您来说仍然重要,您可以:
              1. 重新打开并提供补充信息
              2. 创建一个新的 issue 并更新相关背景
              3. 关联相关的 issue 或讨论

            为了更好地维护项目,我们需要定期清理不活跃的问题。

            感谢您为开源添砖加瓦!🌟


================================================
FILE: .github/workflows/publish.yml
================================================
# 当具有 publish 标签的 PR 被合并时,自动发布新版本
# Automatically publish a new version when a PR with the publish label is merged
name: Auto Publish
on:
  pull_request:
    types: [closed]
    branches:
      - v5

jobs:
  publish:
    runs-on: ubuntu-latest
    if: contains(github.event.pull_request.labels.*.name, 'publish') && github.event.pull_request.merged == true

    steps:
      - uses: actions/checkout@v3

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Install pnpm and dependencies
        uses: pnpm/action-setup@v4
        with:
          version: 9
          run_install: true

      - name: Build
        run: npm run build

      - name: Publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} & pnpm run publish


================================================
FILE: .github/workflows/resolved-pending-release.yml
================================================
name: Resolved Pending Release

on:
  release:
    types: [published]

permissions: {}

jobs:
  comment-on-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          # Check this repository out, otherwise the script won't be available,
          # as it otherwise checks out the repository where the workflow caller is located
          repository: antvis/github-config

      - name: Comment on issues
        uses: actions/github-script@v7.0.1
        with:
          script: |
            const script = require('./.github/workflows/scripts/closeOnRelease.js');
            await script({core, github, context});


================================================
FILE: .github/workflows/scripts/closeOnRelease.js
================================================
/**
 * @param {Object} param
 * @param {import('@actions/core')} param.core
 * @param {ReturnType<import('@actions/github').getOctokit>} param.github
 * @param {import('@actions/github').context} param.context
 */
module.exports = async ({ core, github, context }) => {
  try {
    const owner = context.repo.owner;
    const repo = context.repo.repo;

    const label = 'resolved pending release';
    const resolvedLabel = 'resolved';

    const issuesPendingRelease = (
      await github.paginate(github.rest.issues.listForRepo, {
        owner,
        repo,
        state: 'open',
        per_page: 100,
      })
    ).filter((i) => i.pull_request === undefined && i.labels.map((l) => l.name).includes(label));

    let failedIssues = 0;

    for (const issue of issuesPendingRelease) {
      const number = issue.number;

      // slow down how often we send requests if there are lots of issues.
      await new Promise((resolve) => setTimeout(resolve, 250));

      const { data: releases } = await github.rest.repos.listReleases({
        owner,
        repo,
      });
      const release = releases.length > 0 ? releases[0] : undefined;

      if (release === undefined) {
        throw new Error('There is no release available');
      }

      const message = `:tada: This issue has been resolved and is now available in the [${release.tag_name}](${release.html_url}) release! :tada:`;

      try {
        // Remove the `resolved pending release` label.
        await github.rest.issues.removeLabel({
          owner,
          repo,
          issue_number: number,
          name: label,
        });

        // Add the `resolved` label.
        await github.rest.issues.addLabels({
          owner,
          repo,
          issue_number: number,
          labels: [resolvedLabel],
        });

        // Comment on the issue that we will close.
        await github.rest.issues.createComment({
          owner,
          repo,
          issue_number: number,
          body: message,
        });

        // Close the issue.
        await github.rest.issues.update({
          owner,
          repo,
          issue_number: number,
          state: 'closed',
        });
      } catch (error) {
        console.error(`Failed to comment on and/or close issue #${number}`, error);
        failedIssues++;
      }

      console.log(`Closed #${number}`);
    }

    if (failedIssues > 0) {
      core.setFailed(`Failed to comment on ${failedIssues} PRs`);
    }
  } catch (error) {
    console.error(error);
    core.setFailed(error.message);
  }
};


================================================
FILE: .github/workflows/scripts/issue-automated.js
================================================
const { OpenAI } = require("openai");
const { QueryAntVDocumentTool, ExtractAntVTopicTool }=  require('@antv/mcp-server-antv/build/tools');


/**
 * @param {Object} param
 * @param {import('@actions/github').GitHub} param.github
 * @param {import('@actions/core')} param.core
 * @param {Object} param.context GitHub Action context
 */
module.exports = async ({ github, core, context, issue }) => {
  try {
    core.info('开始处理 issue...', context.repo.repo);
    const library = `g6`;
    if (!issue) {
      core.setFailed('找不到 issue 信息');
      return;
    }

    const issueNumber = issue.number;
    const issueTitle = issue.title;

    core.info(`处理 issue #${issueNumber}: ${issueTitle}`);

    const combinedQuery = prepareAIPrompt(context, issue);


    const topicExtractionResult = await ExtractAntVTopicTool.run({ query: combinedQuery });

    const aiResponse = await getAIResponse(core,  topicExtractionResult.content[0].text);
    const jsonMatch = aiResponse.match(/```json\s*(\{[\s\S]*?\})\s*```/);
    const processedTopicContent = JSON.parse(jsonMatch[1]);

    const queryDocumentParams = {
        library,
        query: combinedQuery,
        topic: processedTopicContent.topic,
        intent: processedTopicContent.intent,
        tokens: 5000,
        ...(processedTopicContent.subTasks && { subTasks: processedTopicContent.subTasks }),
      };

      const documentationResult = await QueryAntVDocumentTool.run(queryDocumentParams);

      const response = await getAIResponse(core,  documentationResult.content[0].text);

        await github.rest.issues.createComment({
            issue_number: issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: `@${issue.user.login} 您好!以下是关于您问题的自动回复:\n\n${response}\n\n---\n*此回复由 AI 助手自动生成。如有任何问题,我们的团队会尽快跟进。*`
        });

    core.info('Issue 处理完成');

  } catch (error) {
    core.setFailed(`处理 issue 失败: ${error.message}`);
    core.error(error.stack);
  }
};

function prepareAIPrompt(context, issue) {
    return `
    你是 ${context.repo.repo} 项目的智能助手。这是一个处理 GitHub issue 的自动回复系统。
    请分析以下 issue 并提供专业、有帮助的回复。

    ## 当前 Issue
    - 标题: ${issue.title}
    - 内容: ${issue.body}

    请提供完整、有帮助的回复,但不要过于冗长。回复应该条理清晰,使用适当的 Markdown 格式。
`;
}

/**
 * 调用 GitHub AI API 获取回复
 */
async function getAIResponse(core, userQuestion) {
  try {
    core.info('正在调用 GitHub AI API...');

    const token = process.env.GH_TOKEN;

    if (!token) {
      throw new Error('未找到 GH_TOKEN 环境变量');
    }

    const endpoint = "https://models.github.ai/inference";
    const model = "openai/gpt-4.1";

    const client = new OpenAI({
      baseURL: endpoint,
      apiKey: token
    });

    const response = await client.chat.completions.create({
      messages: [
        { role: "user", content: userQuestion }
      ],
      temperature: 0.7,
      top_p: 1.0,
      model: model
    });

    core.info('成功获取 AI 响应');
    core.info(JSON.stringify(response));
    return response.choices[0].message.content;

  } catch (error) {
    core.warning(`调用 GitHub AI API 失败: ${error.message}`);
    // 默认回复
    return `
    感谢您提交这个 issue!

    我们的团队会尽快查看您的问题。为了帮助我们更快地解决,请确保您提供了:

    - 问题的详细描述
    - 复现步骤 (如果是 bug)
    - 预期行为和实际行为
    - 使用的版本信息

    谢谢您的理解与支持!
`;
  }
}


================================================
FILE: .github/workflows/scripts/updateYuque.js
================================================
const fs = require('fs');
const path = require('path');

/**
 * @param {Object} param
 * @param {import('@actions/core')} param.core
 * @param {import('@actions/core').InputOptions} param.inputs
 */
module.exports = async ({ core, inputs }) => {
  try {
    const API_BASE = 'https://www.yuque.com/api/v2';
    const group_login = 'antv'; // 知识库所属组织
    const { token, book_slug, site_slug } = inputs;

    // 存储创建的文档ID,用于后续更新目录
    const createdDocIds = {
      tutorials: [],
      examples: [],
    };

    core.info('开始更新语雀文档...');

    // 删除知识库中的所有文档
    async function clearAllDocs() {
      core.info('获取知识库文档列表...');

      try {
        let allDocs = [];
        let offset = 0;
        const limit = 100; // 语雀API每页最大条数
        let hasMore = true;

        // 循环获取所有文档
        while (hasMore) {
          core.info(`获取文档列表,偏移量: ${offset}, 数量: ${limit}...`);

          const response = await fetch(
            `${API_BASE}/repos/${group_login}/${book_slug}/docs?offset=${offset}&limit=${limit}`,
            {
              method: 'GET',
              headers: {
                'Content-Type': 'application/json',
                'X-Auth-Token': token,
              },
            },
          );

          if (!response.ok) {
            throw new Error(`获取文档列表失败: ${response.statusText}`);
          }

          const data = await response.json();
          const docs = data.data;

          if (docs && docs.length > 0) {
            allDocs = allDocs.concat(docs);
            offset += docs.length;

            // 如果返回的文档数量小于请求的限制,说明已经没有更多文档了
            if (docs.length < limit) {
              hasMore = false;
            }
          } else {
            hasMore = false;
          }
        }

        core.info(`共找到 ${allDocs.length} 个文档,准备删除...`);

        // 删除所有文档
        for (const doc of allDocs) {
          core.info(`删除文档: ${doc.title} (${doc.id})...`);

          const deleteResponse = await fetch(`${API_BASE}/repos/${group_login}/${book_slug}/docs/${doc.id}`, {
            method: 'DELETE',
            headers: {
              'Content-Type': 'application/json',
              'X-Auth-Token': token,
            },
          });

          if (!deleteResponse.ok) {
            core.warning(`删除文档 ${doc.title} 失败: ${deleteResponse.statusText}`);
          } else {
            core.info(`已删除文档: ${doc.title}`);
          }
        }

        core.info('所有文档已删除');
      } catch (error) {
        core.error('删除文档过程中出错:' + error.message);
        throw error;
      }
    }

    // 创建单个文档
    async function createDoc(title, body, type) {
      try {
        core.info(`创建文档: ${title}...`);

        const response = await fetch(`${API_BASE}/repos/${group_login}/${book_slug}/docs`, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'X-Auth-Token': token,
          },
          body: JSON.stringify({
            title: title,
            public: 1,
            format: 'lake',
            body: body,
          }),
        });

        if (!response.ok) {
          throw new Error(`创建文档失败: ${response.statusText}`);
        }

        const data = await response.json();
        core.info(`文档已创建: ${title} (ID: ${data.data.id})`);

        // 存储文档ID用于后续更新目录
        if (type === 'tutorial') {
          createdDocIds.tutorials.push(data.data.id);
        } else {
          createdDocIds.examples.push(data.data.id);
        }

        return data.data.id;
      } catch (error) {
        core.error(`创建文档 ${title} 时出错: ${error.message}`);
        return null;
      }
    }

    // 更新知识库目录
    async function updateToc() {
      try {
        core.info('更新知识库目录...');

        const response = await fetch(`${API_BASE}/repos/${group_login}/${book_slug}/toc`, {
          method: 'PUT',
          headers: {
            'Content-Type': 'application/json',
            'X-Auth-Token': token,
          },
          body: JSON.stringify({
            action: 'appendNode',
            action_mode: 'child',
            doc_ids: [...createdDocIds.tutorials, ...createdDocIds.examples],
            type: 'DOC',
          }),
        });

        if (!response.ok) {
          throw new Error(`更新目录失败: ${response.statusText}`);
        }

        core.info('知识库目录已更新');
      } catch (error) {
        core.error('更新目录时出错: ' + error.message);
        throw error;
      }
    }

    // 递归获取所有 .zh.md 文件并创建文档
    async function processMarkdownFiles() {
      core.info('处理Markdown文档...');

      function getAllMarkdownFiles(dir) {
        let results = [];

        if (!fs.existsSync(dir)) {
          core.warning(`目录不存在: ${dir}`);
          return results;
        }

        const list = fs.readdirSync(dir);
        list.forEach((file) => {
          const filePath = path.join(dir, file);
          const stat = fs.statSync(filePath);
          if (stat && stat.isDirectory()) {
            results = results.concat(getAllMarkdownFiles(filePath));
          } else if (file.endsWith('.zh.md')) {
            results.push(filePath);
          }
        });
        return results;
      }

      try {
        // 获取文档目录
        const docsDir = path.join(process.cwd(), site_slug, 'docs');
        core.info(`搜索文档目录: ${docsDir}`);

        const files = getAllMarkdownFiles(docsDir);
        core.info(`找到 ${files.length} 个中文 Markdown 文件`);

        // 为每个文件创建文档
        for (const file of files) {
          let content = fs.readFileSync(file, 'utf-8');
          const fileName = path.basename(file, '.zh.md');
          const title = `教程-${fileName}`;

          await createDoc(title, content, 'tutorial');
        }
      } catch (error) {
        core.error('处理 Markdown 文件时出错: ' + error.message);
        throw error;
      }
    }

    // 处理示例代码文件
    async function processExampleFiles() {
      core.info('处理示例代码...');

      function traverseDirectory(dir) {
        const metaFiles = [];

        if (!fs.existsSync(dir)) {
          core.warning(`目录不存在: ${dir}`);
          return metaFiles;
        }

        function findMetaFiles(directory) {
          try {
            fs.readdirSync(directory, { withFileTypes: true }).forEach((dirent) => {
              const fullPath = path.join(directory, dirent.name);
              if (dirent.isDirectory()) {
                findMetaFiles(fullPath);
              } else if (dirent.name === 'meta.json') {
                metaFiles.push(fullPath);
              }
            });
          } catch (err) {
            core.warning(`读取目录 ${directory} 时出错: ${err.message}`);
          }
        }

        findMetaFiles(dir);
        return metaFiles;
      }

      async function processMetaJson(metaFilePath) {
        try {
          const dir = path.dirname(metaFilePath);
          const folderName = path.basename(dir);
          const metaContent = fs.readFileSync(metaFilePath, 'utf-8');
          const metaJson = JSON.parse(metaContent);

          if (Array.isArray(metaJson.demos)) {
            for (const demo of metaJson.demos) {
              const demoFilePath = path.join(dir, demo.filename);
              if (fs.existsSync(demoFilePath) && fs.statSync(demoFilePath).isFile()) {
                await processDemoFile(demoFilePath, demo.title.zh, folderName);
              }
            }
          }
        } catch (error) {
          core.error(`处理 ${metaFilePath} 时出错: ${error.message}`);
        }
      }

      async function processDemoFile(filePath, title, category) {
        try {
          let content = fs.readFileSync(filePath, 'utf-8');
          // 移除HTML标签
          content = removeHtmlTags(content);

          const docTitle = `${category}-${title}`;
          await createDoc(docTitle, `// ${title}\n${content}`, 'example');
        } catch (error) {
          core.error(`处理 ${filePath} 时出错: ${error.message}`);
        }
      }

      // 移除HTML标签的函数
      function removeHtmlTags(code) {
        // 找到模板字符串中的HTML标签
        const templateStringRegex = /`([\s\S]*?)`/g;

        return code.replace(templateStringRegex, (match, templateContent) => {
          // 移除模板字符串中的HTML标签
          const cleanTemplate = templateContent
            .replace(/<[^>]*>[\s\S]*?<\/[^>]*>/g, '')
            .replace(/<[^>]*\/>/g, '') // 移除自闭合标签
            .replace(/<[^>]*>/g, ''); // 移除单个开放标签

          return '`' + cleanTemplate + '`';
        });
      }

      try {
        const rootDir = process.cwd();
        core.info(`搜索示例文件,根目录: ${rootDir}`);

        const metaFiles = traverseDirectory(rootDir);
        core.info(`找到 ${metaFiles.length} 个 meta.json 文件`);

        for (const metaFile of metaFiles) {
          await processMetaJson(metaFile);
        }
      } catch (error) {
        core.error('处理示例文件时出错: ' + error.message);
        throw error;
      }
    }

    // 主执行函数
    try {
      core.startGroup('清除现有文档');
      await clearAllDocs();
      core.endGroup();

      core.startGroup('处理示例文件');
      await processExampleFiles();
      core.endGroup();

      core.startGroup('处理文档文件');
      await processMarkdownFiles();
      core.endGroup();

      core.startGroup('更新目录');
      await updateToc();
      core.endGroup();

      core.info('文档更新处理完成');
    } catch (error) {
      core.setFailed(`更新语雀文档失败: ${error.message}`);
    }
  } catch (error) {
    core.setFailed(`脚本执行失败: ${error.message}`);
  }
};


================================================
FILE: .github/workflows/update-yuque.yml
================================================
name: Update Documentation on Yuque

on:
  pull_request:
    types: [closed]
    branches:
      - v5
    paths:
      - '**/*.md'

jobs:
  check-and-update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Run Yuque update script
        uses: actions/github-script@v7.0.1
        with:
          script: |
            const script = require('./.github/workflows/scripts/updateYuque.js');
            await script({
              core,
              inputs: {
                token: '${{ secrets.YUQUE_TOKEN }}', // 语雀 Token
                book_slug: 'osbmvn', // 外网语雀知识库
                site_slug: 'packages/site', // 文档所在位置
              }
            });


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
yarn.lock
package-lock.json
pnpm-lock.yaml

# Sys
.DS_Store
.idea

# Node
node_modules/
.npmrc

# Build
dist
lib
esm

# Test
coverage

# Bundle visualizer
stats.html

# Tools
.turbo
**/tmp/
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/

# IDE
.history/
.lh/


================================================
FILE: .husky/commit-msg
================================================
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no-install commitlint --edit "$1"


================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

protected_branches="master v5"
current_branch=$(git rev-parse --abbrev-ref HEAD)
for branch in $protected_branches; do
  if [ "$current_branch" == "$branch" ]; then
    echo "\033[31mDirect commit to '$branch' branch are not allowed!\033[0m"
    exit 1
  fi
done

npx lint-staged


================================================
FILE: .prettierignore
================================================
dist
es
lib
node_modules

================================================
FILE: .prettierrc.js
================================================
module.exports = {
  plugins: [
    require.resolve('prettier-plugin-organize-imports'),
    require.resolve('prettier-plugin-packagejson'),
  ],
  printWidth: 120,
  proseWrap: 'never',
  singleQuote: true,
  trailingComma: 'all',
  overrides: [
    {
      files: '*.md',
      options: {
        proseWrap: 'preserve',
      },
    },
  ],
};


================================================
FILE: .vscode/settings.json
================================================
{
  "cSpell.words": [
    "AABB",
    "afteranimate",
    "aftercanvasinit",
    "afterdestroy",
    "afterdraw",
    "afterelementcreate",
    "afterelementdestroy",
    "afterelementstatechange",
    "afterelementtranslate",
    "afterelementupdate",
    "afterlayout",
    "afterrender",
    "afterrendererchange",
    "aftersizechange",
    "afterstagelayout",
    "aftertransform",
    "afterviewportanimate",
    "antv",
    "autosize",
    "batchend",
    "batchstart",
    "bbox",
    "beforeanimate",
    "beforecanvasinit",
    "beforedestroy",
    "beforedraw",
    "beforeelementcreate",
    "beforeelementdestroy",
    "beforeelementstatechange",
    "beforeelementtranslate",
    "beforeelementupdate",
    "beforelayout",
    "beforerender",
    "beforerendererchange",
    "beforesizechange",
    "beforestagelayout",
    "beforetransform",
    "beforeviewportanimate",
    "betweenness",
    "Bezier",
    "bubblesets",
    "cancelviewportanimate",
    "convexhull",
    "Dagre",
    "dendrogram",
    "elementstatechange",
    "elementtranslate",
    "elementvisibilitychange",
    "Forceatlas",
    "Fruchterman",
    "Fullscreen",
    "gforce",
    "graphlib",
    "GSHAPE",
    "mindmap",
    "onframe",
    "pagerank",
    "Phong",
    "pinchend",
    "pinchmove",
    "pinchstart",
    "pointset",
    "Polyline",
    "ranksep",
    "Snapline",
    "Timebar"
  ],
  "javascript.preferences.importModuleSpecifier": "relative",
  "typescript.preferences.importModuleSpecifier": "relative",
  "svg.preview.background": "transparent"
}


================================================
FILE: CHANGELOG.md
================================================
# ChangeLog

### 4.8.0

- fix: destroy graph and call layout problem, closes: #4126;
- fix: remove duplicated event emit, closes: #4043;
- fix: mousedown on other DOMs and mouseup on canvas, click is triggered unexpectly, closes: #2922;
- fix: mousemove and mouseup are not triggered with drag and dragend, closes: #3086;
- fix: replace DOMMouseScroll and mousewheel with wheel event, closes: #3256;
- perf: refresh item when updateChild, updateChildren, addChild, removeChild for TreeGraph;

### 4.7.17

- fix: expandCombo and the edges of the children are not refreshed, closes: #3250;
- fix: the item param of the afterremoveitem for combo should be data;
- fix: add type to the parameter list of beforeremoveitem event;
- fix: edge update with destroyed end items, closes: #3925;
- perf: take the max value of padding array for circle combo, closes: #4113;
- feat: support top-center for rect combo label position, closes: #3750;
- feat: createCombo and uncombo support stack, closes: #3695, #3323;

### 4.7.16

- feat: allowDragOnItem config for scroll-canvas, closes: #3062;
- feat: allow to setTextWaterMarker and setImageWaterMarker with an undefined parameter to remove the watermarker, closes: #3478;
- feat: hideEdge config for minimap to enhance the performance, closes: #3158;
- fix: minimap has incorrect shape zIndex with keyShape type and delegate type, closes: #3132;
- fix: minimap viewport dragging problem in firefox and safari, closes: #2939;
- docs: add sequence demo to site, closes: #3027;
- perf: unify the formats of shouldBegin, shouldUpdate, and shouldEnd in behaviors, closes: #3028;
- perf: fitView and fitCenter according to the corner ndoes insead of getCanvasBBox to avoid maximum call stack size exceeded, closes: #2447;
- fix: treeGraph changeData with node properties lost, closes: #3215;
- fix: error occurs while calling updateLayout from gpu layout to a cpu layout, closes: #3272;
- fix: error occurs while calling changeData to remove a node in a combo, closes: #3293;

### 4.7.15

- fix: dagre layout for collapsed combos;
- perf: give layout algorithm vedges;

### 4.7.14

- fix: error occurs while dragging combo with drag-node behavior;

### 4.7.13

- fix: unexpected move with fitCenter with animation;
- fix: update modelRect with rendering error, closes: #4041;

### 4.7.12

- fix: drag-canvas incorrectly stopped by right click;
- fix: createCombo with nodes which already has parent combos;
- fix: setItemState on node, related edges's linking positions are not refreshed;
- perf: combo animate inherit from graph's animate config;
- perf: improve the performance of setItemState and active-relations again;
- feat: graph supports optimizeThreshold to control the number threshold of nodes to enable the optimization on rendering and interaction, currently only affects the edges' refresh while the related node state style changed;

### 4.7.11

- perf: improve the performance of setItemState and active-relations;
- perf: keyShape is hiden when a combo is collapsed with collapsedSubstituIcon;
- fix: drag-node incorrectly stopped by right click;
- fix: timebar plugin destroy problem, closes: #3998;
- fix: controllerCfg does not take effect in timebar with tick type, closes: #3843;
- feat: timebar plugin supports config the default time type;
- feat: timebar with play and pause API;
- chore: use addItem and removeItem instead of changeData in timebar;

### 4.7.10

- perf: force layout with animation calls graph refreshPositions instead positionsAnimate while refreshing;

### 4.7.9

- perf: init node positions when the node has no x and y in the origin data;

### 4.7.8

- feat: pointPadding config for loop edges with non-circle nodes, closes: #3974;
- fix: image lost while updating the size for an image node, closes: #3938;

### 4.7.7

- feat: getContentPlaceholder and getTitlePlaceholder for Annotation plugin;

### 4.7.6

- fix: Annotation readData with inexistent item;
- perf: improve the performance for updating;

### 4.7.5

- perf: Annotation support updating positions for outside cards by calling updateOutsideCards;

### 4.7.4

- perf: Annotation min-width and input width;

### 4.7.3

- feat: beforechangedata and afterchagnedata for graph changeData;
- feat: Annotation supports icon events callbacks;
- feat: Annotation supports defaultBegin position configuration for new annotation cards;
- perf: Annotation updated automatically when graph data changed and graph item visibility changed;
- fix: Destroy legend canvas when the plugin is destroyed, closes: #3931;

### 4.7.2

- feat: Annotation plugin supports configuring behaviors for collapse and close icon;
- feat: Annotation plugin supports canvas annotation;
- fix: gForce layout has animation by default;
- fix: createCombo creates vedges asynchronously, closes: #3912;
- fix: strange polyline path edge related to combo, closes: #3913;

#### 4.7.1

- feat: Annotation plugin;
- fix: combo and drag-node with heap maximum problem, closes: #3886;
- fix: combo and graph re-read problem, closes: 3902;
- fix: d3 force layout with default animate;
- perf: bundling plugin ts problem, closes: #3904;

#### 4.7.0

- fix: combo collapsed edge problems, closes: #3839;

#### 4.7.0-beta

- feat: force2 from graphin-force;
- feat: preset for layout;
- feat: tweak incremental layout init for force like layouts;

#### 4.6.18

- feat: updateLayout from no pipes to pipes, closes: #3726;
- fix: relayout with pipes;

#### 4.6.17

- fix: legend changeData problem, closes: #3561;
- fix: redo and undo with an image node, closes: #3782;
- fix: call refreshPositions instead of positionsAnimate while there is no layout configuration;

#### 4.6.16

- feat: ID check;
- feat: fitView with animation;
- feat: findAllByState with additional filter;
- fix: wrong dropped position for drag-combo with enableDelegate, closes: #3810;
- fix: stack for drag-combo with onlyChangeComboSize, closes: #3801;
- fix: stack updateLayout, closes: #3765;
- fix: drag-canvas and zoom-canvas with enableOptimize show a hidden shape which is controlled by state, closes: #3635;
- fix: typing problem for react node;

#### 4.6.15

- fix: fitView does not zoom the graph with animate true;

#### 4.6.14

- perf: optimize the performance of combo graph;

#### 4.6.12

- perf: optimize the performance of combo graph first rendering;

#### 4.6.11

- fix: star node with leftBottom linkPoint show and hide problem;
- fix: relayout does not execute onAllLayoutEnd problem;
- fix: combo edge state update problem, closes: #3639;

#### 4.6.10

- feat: maxLength for labelCfg;
- fix: custom layout warning and layout failed problem;
- fix: upgrade layout to fix DagreLayoutOptions type error;
- fix: upgrade layout to fix comboCombined with original node infomations problem;

#### 4.6.8

- fix: spelling error for 'nodeselectChange', closes: #3736;
- fix: update node icon from show false to show true;
- fix: afterrender should be emitted when the layout is not configured;
- perf: update related edges while drag-combo;
- feat: combo supports collapsedSubstituteIcon showing after collapsed;
- feat: remove animations while first rendering with (collapsed)combos;
- refactor: toolbar plugin functions;

#### 4.6.6

- fix: destroyLayout error, closes: #3727;
- fix: drag combo with stack problem, closes: #3699;
- fix: updateLayout does not take effect if update layout with same type as graph instance configuration, closes: #3706;
- fix: legendStateStyles typo, closes: #3705;
- perf: zoom-canvas take the maximum and minimum values instead of return directly;
- perf: minimap cursor move;
- feat: fitView and fitCenter with animation;
- feat: addItems to add multiple items into graph in the same time;
- feat: enable edge selection in click-select;

#### 4.6.4

- chore: improve the types of graph events;
- fix: position animate considers origin attributes;

#### 4.6.3

- feat: shouldDeselect param for lasso-select;
- fix: initial collapsed combos with unexpected size;

#### 4.6.1

- fix: layoutController is null problem;

#### 4.6.0-beta

- feat: comboCombined Layout from @antv/layout;
- feat: combo supports position configurations for any situations;
- fix: run layout promise only when the layout is configured;

#### 4.5.5

- fix: tooltip with wrong duplicated child DOM nodes;

#### 4.5.4

- feat: tooltip plugin supports dynamic dom configurations;
- feat: context menu plugin supports mobile touch event;
- feat: allow enabling stack operations at runtime;
- fix: use origin data when changeData without data param, closes: #3459;
- feat: shouldBegin for canvas click in click-select behavior;

#### 4.5.3

- fix: import G6 in head and call getComputedStyle, the document body is not exist;

#### 4.5.2

- fix: node update from no icon to iconfont icon failed;
- fix: getUpdateType with type error;
- fix: edge label background with clearItemStates problem;
- fix: edge label with autoRotate false and padding problem;
- fix: changeData in the process of create-edge behavior, an error occurs, closes: #3384;
- fix: node update from no icon to iconfont icon failed;

#### 4.5.1

- feat: translate graph with animation;
- feat: zoom graph with animation;
- feat: timebar supports filterItemTypes to configure the types of the graph items to be filtered; only nodes can be filtered before;
- feat: timebar supports to configure the rotate of the tick labels by tickLabelStyle[dot]rotate;
- feat: timebar supports container CSS configuration by containerCSS;
- feat: timebar supports a function getDate to returns the date value according to each node or edge by user;
- feat: timebar supports afunction getValue to returns the value (for trend line of trend timebar) according to each node or edge by user;
- feat: timebar supports to configure a boolean changeData to control the filter way, true means filters by graph[dot]changeData, false means filters by graph[dot]showItem and graph[dot]hideItem;
- feat: timebar supports to configure a function shouldIgnore to return true or false by user to decide whether the node or the edge should be ignored while filtering;
- fix: simple timebar silder text position strategy and expand the lineAppendWidth for the slider;
- fix: edge label padding bug, closes: #3346;
- fix: update node with iconfont icon, the icon is updated to a wrong position, closes: #3348;

#### 4.5.0

- fix: add item type to the parameter of afterremoveitem event;

#### 4.4.1

- feat: zoom with animation, contributed by @Blakko;

#### 4.4.0-beta.1

- fix: drag-combo and drag-node with wrongly calling shouldUpdate;

#### 4.4.0-beta.0

- feat: better performance for item drawing;
- fix: disable the capture of hull shape to enhance the performance of dragging canvas with hulls;
- fix: uncombo an empty combo, fix: #3248;
- fix: upgrade layout to beta 5 to solve proxy problem for IE;

#### 4.3.11

#### 4.3.9

- fix: update edge to be horizontal and the label is on wrong position for min file;

#### 4.3.9

- fix: addBehavior with behavior string name, closes: #3020;
- fix: drag-node shouldEnd does not stop the dragging node behavior, closes: #3173;
- fix: drag-combo fails to merge combo with enableDelegate, closes: #3137;
- fix: uncombo does not trigger afterremoveitem event, closes: #3179;
- fix: error label background position when the edge label has position start, closes: #3129;
- fix: destroyed graph judgement, closes: #3203;
- fix: edge click event will not be triggered when the contextmenu is configure with trigger click, closes: #3201;
- feat: drag-combo with shouldEnd, closes: #3202;
- chore: information for failing to download image, closes: #2980;

#### 4.3.7

- fix: update edge to be horizontal and the label is on wrong position;

#### 4.3.6

- fix: drag-node on mobile, closes: #3127;
- fix: removeBehaviors drag-canvas cause canvas:drag event cannot be listened;
- fix: drag-node with unexpected offseted edge end points, closes: #3118;
- fix: delete node with combo, closes: #3141;
- fix: update node position with wrong position;
- feat: enableStack for drag-node behavior, closes: #3128;

#### 4.3.5

- fix: drag a node without comboId by drag-node with onlyChangeComboSize;
- fix: gpu layout with async;
- fix: minimap with delegate type cannot reach the top of the canvas, closes: #2885;
- feat: improve the performance for updating nodes;
- feat: updateLayout with align and alignPoint;

#### 4.3.4

- fix: when select a node with click-select, selected combos should be deselected;
- fix: contextmenu with click trigger does not show the menu up, closes: #2982;
- fix: layout with collapsed combo, closes: #2988;
- fix: zoom-canvas with optimizeZoom, drag-canvas shows the node shapes hiden by zoom-canvas optimizeZoom, closes: #2996;

#### 4.3.3

- fix: uncombo with id, closes: #2924;
- fix: image node with state changing, closes: #2923;
- fix: mouseentering tooltip DOM hides the DOM;
- feat: moveTo with animate, closes: #2252;

#### 4.3.2

- fix: upgrade the layout package to 0.1.14 to solve the different results from gpu and cpu problem in gForce layout, closes: #2902;
- fix: auto fitting container without width and height for graph problem, closes: #2901;
- fix: minimap with zoomingproblem, closes: #2863
- feat: fx and fy for fruchterman and gForce layout in both gpu and cpu version;
- feat: barWidth for interval bar chart for TimeBar plugin, closes: #2989;
- feat: click trigger for context munu, closes: #2686;

#### 4.3.0

- fix: empty object for TreeGraph data;
- fix: combo edge arrow error with state styles;
- fix: depth problem for addItem with comboId, closes: #2888;
- feat: focus edge item;
- feat: legend plugin;
- feat: allow to new a tree layout independently;

#### 4.2.7

- fix: edges disappear when collapsing combo, closes: #2816;
- fix: drag-node with edge key, closes: #2819;
- fix: failed to update startArrow to be false, closes #2814;
- fix: createCombo and add combId or parentId to the related nodes or combos, closes #2815;
- feat: no animation when first rendering with collapsed combos, closes: #2826;

#### 4.2.6

- feat: scroll-canvas behavior;
- feat: iconfont for node icon;
- feat: percentage of scalable range for drag-canvas;
- fix: missing brushStyle in type ModeOption;
- fix: the comboId remains in the node after uncombo(), closes #2801;
- fix: disappearing edges when combos are expanded/collapsed, closes #2798;
- fix: invisible nodes and edges should not be selected by brush-select and lasso-select, closes #2810;

#### 4.2.5

- feat: donut node;
- feat: downloadImage with watermarker;
- fix: multiple layout calling error;
- fix: combo collapse and related edges diappearing;
- fix: forceAtlas2 with descrete node error;

#### 4.2.4

- fix: change data with dulplicated name between nodes and combos;
- fix: pixelRatio for graph types;

#### 4.2.3

- fix: layout with fitView;

#### 4.2.2

- feat: pipe layouts for subgraphs;

#### 4.2.1

- fix: circle combo edge linking position problem;
- fix: drag minimap viewport with forbidden icon in chrome on windows;
- fix: show node without node position problem;
- fix: addItem and getNodeDgree with wrong result problem;
- fix: timebar data filtering problem;
- fix: update endArrow to be false and set state problem;
- feat: pass comb and comboEdge data for layout;
- feat: tooltip with fixToItem to avoid following the mouse when moving;
- feat: getViewPortCenterPoint and getGraphCenterPoint API;
- feat: tooltip with trigger configuration, supports mouseenter and click;

#### 4.2.0

#### 4.1.14

- fix: combo edge link position problem;
- fix: activate-relations with combo and combo edges problem;
- feat: support config TimeBar handler, background, foreground, tick label, tick line style;

#### 4.1.16

- fix: webworker in dist;

#### 4.1.15

- fix: cubic-x problem, closes: #2698;

#### 4.1.14

- fix: gridSize for polyline;
- fix: create-edge undo problem;
- fix: tslib spreadArray problem;
- fix: rect combo position with state problem;
- feat: simple polyline for better performance;
- fix: gridSize for polyline;
- fix: cubic-x problem, closes: #2698;
- fix: create-edge undo problem;
- fix: tslib spreadArray problem;
- fix: rect combo position with state problem;
- feat: simple polyline for better performance;

#### 4.1.13

- fix: getHulls with error type;
- fix: createHull with destroyed hullMap problem;
- fix: refining TimeBar minor problems;
- fix: tooltip with display none to avoid enlarging graph container;
- feat: TimeBar supports controller style configuration;
- feat: TimeBar supports filtering edges;
- feat: dagre with nested combo;

#### 4.1.13-beta

- chore: update layout and register in G6;
- fix: performance problem in create-edge with polyline;
- fix: performance for polyline;
- fix: debounce updating the polyline edges in drag-node behavior;
- fix: toolbar redo undo max clone in drag-node behavior;
- feat: dagre layout with combo;
- feat: cubic-vertical and cubic-horizontal with curveOffset and minCurveOffset

#### 4.1.12

- chore: update layout with alpha gwebgpu;
- chore: update algorithm with fixed publicPath problem;

#### 4.1.11

- chore: link correct core;

#### 4.1.10

- chore: update algorithm;

#### 4.1.9

- feat: allowDragOnItem for drag-canvas behavior;
- fix: drag-canvas with two fingers on mobile affects zoom-canvas;

#### 4.1.8

- fix: shouldBegin false for zoom-canvas behavior;
- fix: shouldBegin originScale from graph zoom;
- fix: error in collapse-expand with touch on canvas;

#### 4.1.7

- fix: polyline with negative endpoints;
- fix: polyline direction when linkCenter;
- fix: remove g6-core browser since it has no umd output;
- feat: custom texts for the time range and time point text in timeBar plugin;
- chore: types for strict mode;

#### 4.1.6

- fix: webworker problem after removing broswer in pc and g6;

#### 4.1.5

- fix: wrong style for modelRect after updating and state changing, closes: #2613;
- fix: drag-canvas with shouldBegin false, closes: #2571;
- fix: pack plugin with es module, closes: #2577;
- feat: dijkstra with multiple shortest paths, closes: #2297;
- fix: setMode while the delegates of brush-select and drag-node is on the canvas, closes: #2607;
- docs: update the english TimeBar docs, closes: #2597;
- fix: TimeBar time point switch text configurable, closes: #2597;

#### 4.1.4

- fix: drag-canvas with touch on mobile;

#### 4.1.2

- fix: registerBehavior export problem;
- fix: shouldEnd of create-edge with groupByTypes as false;
- fix: collapse and expand a combo with an empty sub combo error;
- fix: update padding of rect combo;
- fix: the graph in the minimap with circular layout is not centered, closes: #2555;
- fix: edge background displays on a wrong place when autoRotate is true;

#### 4.1.1

- fix: soomth-convex hull with one line nodes leads to unshift problem;
- fix: zoom-canvas to optimizeZoom and hide the label, the label will not show up any more problem;
- fix: the ts type for parameter of timing event listener, closes: #2499;

#### 4.1.0

- chore: ts lint;
- feat: getEdgeConfig for create-edge behavior;
- fix: uniqueId with timestamp and random;
- fix: fix zoom-canvas and drag-canvas with enableOptimize conflict problem shrink the settimeout;

#### 4.1.0-beta.1

- chore: unpack the g6 into core, pc, element, plugin, mobile, and exported by g6;
- feat: layout with onLayoutEnd and custom layout with tag;
- feat: emit beforecollapseexpandcombo and aftercollapseexpandcombo;
- fix: toolbar for firefox and other browsers;
- fix: edge label position with state problem;
- fix: set item state to false at the first time;
- fix: hull with one node;
- fix: combo state size problem;
- fix: state with fontSize changed problem;
- fix: edge label with background when the two end nodes are overlapped;
- fix: text rasidual of timebar;
- fix: maximum stack size problem for image node type, fix: #2383;

#### 4.0.3

- fix: state style restore for non-circle shapes;

#### 4.0.2

- fix: node and edge state style with update problem;
- fix: import lib problem;
- fix: import node module problem;
- fix: hidden shapes show up after zoom-canvas or drag-canvas with enableOptimize;
- fix: tooltip for combo;
- fix: update edge with false endArrow and startArrow;

#### 4.0.1

- fix: glslang problem;

#### 4.0.0-beta.0

- feat: fruchterman and gforce layout with gpu;
- feat: gforce;
- feat: updateChildren API for TreeGraph;
- feat: louvain clustering algorithm;
- feat: container of plugins with dom id;
- feat: label propagation clustering algorithm;
- feat: get color sets by subject color array;
- feat: canvas context menu;
- feat: stop gforce;
- feat: dark rules for colors;
- fix: text redidual problem, closes: #2045 #2193;
- fix: graph on callback parameter type problem, closes: #2250;
- fix: combo zIndex problem;
- fix: webworker updateLayoutCfg problem;
- fix: drag-canvas and click node on mobile;

#### 3.8.5

- fix: get fontFamily of the window in global leads to DOM depending when using bigfish;

#### 3.8.4

- feat: new version of basic styles for light version;
- feat: shortcuts-call behavior for calling a Graph function by shortcuts;
- feat: color generate util function getColorsWithSubjectColor;
- fix: drag-canvas on mobile problem;
- fix: style update problem with stateStyles in the options of registerNode;

#### 3.8.3

- feat: drag the viewport of the minimap out of the the view;
- fix: extend modelRect with description problem, closes: #2235;

#### 3.8.2

- feat: graph.setImageWaterMarker, graph.setTextWaterMarker API;
- feat: zoom-canvas support mobile;
- fix: drag-canvas behavior support scalable range, closes: #2136;
- fix: TreeGraph changeData clear all states, closes: #2173;
- chore: auto zoom tooltip & contextMenu component when zoom-canvas;
- chore: upgrade @antv/g-canvas;
- feat: destroyLayout API for graph, closes: #2140;
- feat: clustering for force layout, closes: #2196;
- fix: svg renderer minimap hidden elements probem, closes: #2174;
- feat: add extra parameter graph for menu plugin, closes: #2204;
- fix: tooltip plugin, crossing different shape cant execute the getContent function, closes: #2153;
- feat: add edgeConfig for create-edge behavior, closes: #2195;
- fix: remove the source node while creat-edge;
- feat: create-edge for combo, closes: #2211;
- fix: update the typings for G6Event;

#### 3.8.1

- fix: update edge states with updateItem problem, closes: #2142;
- fix: create-edge behavior with polyline problem, closes: #2165;
- fix: console.warn show duplicate ID, closes: #2163;
- feat: support the drag-canvas behavior on the mobile device, closes: #816;
- chore: timeBar component docs;

#### 3.8.0

- fix: treeGraph render with addItem and stack problem, closes: #2084;
- feat: G6 Interactive Document GraphMarker;
- feat: registerNode with jsx support afterDraw and setState;
- feat: edge filter lens plugin;
- feat: timebar plugin;

#### 3.7.3

- fix: update G to fix the shape disappear when it has been dragged out of the view port problem, closes: #2078, #2030, #2007;
- fix: redo undo with treeGraph problem;
- fix: remove item with itemType problem, closes: #2096.

#### 3.7.2

- fix: toolbar redo undo addItem with type problem, closes #2043;
- fix: optimized drag-canvas with hidden items;
- fix: state style with 0 value problem, closes: #2039;
- fix: layout with webworker leads to twice beforelayout, closes: #2052;
- fix: context menu with sibling doms of graph container leads to position problem, closes: #2053;
- fix: changeData with combos problem, closes: #2064;
- fix: improve the position of the context menu before showing up;
- feat: fisheye allows user to config the trigger of scaling range(r) and magnify factor(d) by scaleRBy and scaleDBy respectively;
- feat: add the percent text of magnify factor(d) for fisheye and users are allowed to configure it by show showDPercent.

#### 3.7.1

- fix: hide the tooltip plugin when drag node and contextmenu, closes #1975;
- fix: processParellelEdges without edge id problem;
- fix: label background with left, right position problem, closes #1861;
- fix: create-edge and redo undo problem, #1976;
- fix: tooltip plugin with shouldBegin problem, closes #2006;
- fix: tooltip behavior with shouldBegin problem, closes #2016;
- fix: the position of grid plugins when there is something on the top of the canvas, closes: #2012;
- fix: fisheye destroy and new problem, closes: #2018;
- fix: node event with wrong canvasX and canvasY problem, closes: #2027;
- fix: drag combo and drag node to drop on canvas/combo/node problem;
- feat: improve the performance on the combos;
- fix: redo and undo problem when update item after additem, closes #2019;
- feat: hide shapes beside keyShape while zooming;
- feat: improve the performance on the combos.

#### 3.7.0

- feat: chart node;
- feat: bubble set;
- feat: custom node with JSX;
- feat: minimum spanning tree algorithm;
- feat: path finding algorithm;
- feat: cycle finding algorithm;
- chore: update antv/hierarchy to fix indented tree with dropCap problem.

#### 3.6.2

- feat: find all paths and the shortest path between two nodes;
- feat: fisheye with dragging;
- feat: fisheye with scaling range and d;
- feat: click and drag to create an edge by create-edge behavior;
- feat: process multiple parallel edges to quadratic with proper curveOffset;
- fix: polyline with rect and radius=0 problem;
- fix: arrow state & linkpoint;
- fix: the position of the tooltip plugin;
- fix: drop a node onto a sub node of a combo;
- chore: update hierarchy to solve the children ordering problem for indented tree layout;
- chore: extract the public calculation to enhance the performance of fisheye.

#### 3.6.1-beta

- chore: update g-canvas to support quickHit and pruning the rendering of the graph outside the viewport;
- feat: add statistical chart nodes;
- feat: add hull for create smooth contour to include specific items;
- fix: clear combos before render;
- fix: menu plugin with clickHandler problem.

#### 3.6.1

- feat: image minimap;
- feat: visible can be controlled in the data;
- feat: item type for tooltip plugin;
- feat: menu plugin with shouldUpdate;
- fix: tooltip plugin position and hidden by removeItem;
- fix: tooltip behavior hidden by removeItem;
- fix: menu plugin with clicking on canvas problem;
- fix: menu plugin with clickHandler problem;
- fix: createCombo with double nodes problem.

#### 3.6.0

- feat: fisheye lens plugin;
- feat: lasso-select behavior;
- feat: TimeBar plugin;
- feat: ToolBar plugin.

#### 3.5.12

- fix: node:click is triggered twice while clicking a node;
- fix: update combo edge when drag node out of it problem;
- feat: animate configuration for combo, true by default;
- fix: calling canvas.on('\*', ...) instead of origin way in event controller leads to malposition while dragging nodes with zoomed graph.

#### 3.5.11

- feat: graph.priorityState api;
- feat: graph.on support name:event mode.
- fix: combo edge with uncorrect end points;
- fix: combo polyline edge with wrong path;
- fix: getViewCenter with padding problem;
- fix: cannot read property 'getModel' of null problem on contextmenu when the target is not an item;
- feat: allow user to configure the initial positions for empty combos;
- feat: optimize by hiding edges and shapes which are not keyShape while dragging canvas;
- feat: fix the initial positions by equably distributing for layout to produce similar result.

#### 3.5.10

- fix: fitView and fitCenter with animate in the initial state;
- fix: dulplicated edges in nodeselectchange event of brush-select;
- fix: triple click and drag canvas problem;
- fix: sync the minZoom and maxZoom in drag-canvas and graph;
- fix: integrate getSourceNeighbors and getTargetNeighbors to getNeighbors(node, type);
- feat: initial x and y for combo data;
- feat: dagre layout supports sortByCombo;
- feat: allow user to disable relayout in collapse-expand-combo behavior;
- feat: dijkstra shortest path lenght algorithm.

#### 3.5.9

- fix: multiple animate update shape for combo;
- fix: removeItem from a combo.

#### 3.5.8

- fix: combo edge problem, issues #1722;
- feat: adjacency matrix algorithm;
- feat: Floyd Warshall shortest path algorithm;
- feat: built-in arrows;
- feat: built-in markers;
- fix: force layout with addItem and relayout;
- fix: create combo with parentId problem;
- feat: allow user to configure the pixelRatio for Canvas;
- chore: update G to resolve the blur canvas problem.

#### 3.5.7

- feat: shouldBegin for click-select behavior;
- feat: graph.getGroup, graph.getContainer, graph.getMinZoom, graph.setMinZoom, graph.getMaxZoom, graph.setMaxZoom, graph.getWidth, graph.getHeight API;
- fix: combo edge dashLine attribute;
- fix: combo collapse and expand with edges problem;
- fix: destroy the tooltip DOMs when destroy the graph;
- fix: unify the shape names for custom node and extended node;
- fix: update the edges after first render with collapsed combos.

#### 3.5.6

- feat: dropCap for indented TreeGraph layout.

#### 3.5.5

- fix: custom node with setState problem;
- fix: validationCombo in drag-combo and drag-node.

#### 3.5.3

- feat: focusItem with animation;
- feat: generate the image url of the full graph by graph.toFullDataUrl;
- fix: graph dispears after being dragged out of the canvas and back;
- fix: the graph cannot be dragged back if it is already out of the view;
- fix: size and radius of the linkPoints problem;
- fix: combo graph with unused state name in comboStateStyles;
- fix: preventDefault in drag-canvas behavior.

#### 3.5.2

- feat: degree algorithm;
- feat: graph.getNodeDegree;
- fix: downloadFullImage changes the matrix of the graph problem;
- fix: circular layout modifies the origin data with infinite hierarchy problem.

#### 3.5.1

- feat: graph.fitCenter to align the graph center to canvas center;
- fix: getType is not a function error occurs when addItem with point;
- fix: checking comboTrees avaiability;
- fix: error occurs when createCombo into the graph without any combos;
- fix: endPoint and startPoint are missing in modelConfig type;
- fix: edge background leads to empty canvas when the autoRotate is false;
- fix: combo state style bug.

#### 3.5.0

- feat: combo and combo layout;
- feat: graph algorithms: DFS, BFS and circle detection;
- feat: add `getNeighbors`, `getSourceNeighbors`, `getTargetNeighbors` methods on Graph and Node;
- feat: add `getID` method on Item;
- fix: All Configuration type declarations are migrated to types folder, refer [here](https://github.com/antvis/G6/commit/3691cb51264df8529f75222147ac3f248b71f2f6?diff=unified#diff-76cf0eb5e3d8032945f1ac79ffc5e815R6);
- fix: Some configuration type declarations have removed the `I` prefix, refer [here](https://github.com/antvis/G6/commit/3691cb51264df8529f75222147ac3f248b71f2f6?diff=unified#diff-aa582974831cee2972b8c96cfcce503aR16);
- feat: Util.getLetterWidth and Util.getTextSize.

#### 3.4.10

- fix: TreeGraphData type with style and stateStyles;
- fix: wrong controlpoint position for bezier curves with getControlPoint.

#### 3.4.9

- fix: transplie d3-force to support IE11.

#### 3.4.8

- feat: update the keyShape type minimap when the node or edge's style is updated;
- fix: problem about switching to another applications or browser menu and then switch back, the drag-canvas does not take effect;
- fix: fix the problem about fail to render the graph when the animate and fitView are true by turn off the animate for rendering temporary;
- fix: curveOffset for arc, quadratic, cubic edge.

#### 3.4.7

- feat: downloadFullImage when the (part of) graph is out of the screen;
- feat: With pre-graph has no layout configurations and no positions in data, calling changeData to change into a new data with positions, results in show the node with positions in data;
- feat: allow user to assign curveOffset and curvePostion for Bezier curves;
- fix: moveTo wrong logic problem;
- fix: removeItem to update the minimap.

#### 3.4.6

- same as 3.4.5, published wrongly.

#### 3.4.5

- feat: background of the label on node or edge;
- feat: better performance of minimap;
- fix: minimap viewport displace problem;
- feat: offset of tooltip;
- fix: the length of the node's name affects the tree layout;
- fix: toFront does not work for svg renderer;
- fix: error occurs when the fontSize is smaller than 12 with svg renderer;
- fix: changeData clears states;
- fix: state does not work when default labelCfg is not assigned.

#### 3.4.4

- feat: background color for downloadImage and toDataURL;
- feat: support configure image for grid plugin;
- fix: initial position for fruchterman layout;
- refactor: clip for image node.
- fix: cubic with only one controlPoint error;
- fix: polyline without L attributes.

#### 3.4.3

- fix: support extends BehaviorOption;
- fix: click-select Behavior support multiple selection using ctrl key.

#### 3.4.2

- feat: zoom-canvas behavior supports hiding non-keyshape elements when scaling canvas;
- refactor: when the second parameter is null, clearItemStates will clear all states of the item;
- fix: [changeData bug](https://github.com/antvis/G6/issues/1323);
- fix: update antv/hierarchy to fix fixedRoot for TreeGraph;
- fix: problem of a graph has multiple polyline edges;
- fix: problem of dagre with controlPoints and loop edges.

#### 3.4.1

- feat: force layout clone original data model to allow the customized properties;
- fix: BehaviorOptions type error;
- fix: fitView the graph with data whose nodes and edges are empty arrays;
- fix: rect node positions are changed after calling graph.changeData;
- fix: drag behavior is disabled when the keys are released invalidly;
- refactor: update G and the fill of custom arrow should be assigned by user.

#### 3.4.0

- feat: SVG renderer;
- refactor: new state mechanism with multiple values, sub graphics shape style settings.

#### 3.3.7

- feat: beforeaddchild and afteraddchild emit for TreeGraph;
- feat: built-in nodes' labels can be captured;
- fix: drag shadow caused by localRefresh, update the g-canvas version;
- fix: abnormal polyline bendding;
- fix: collapse-expand trigger problem;
- fix: update nodes with empty string label;
- fix: abnormal rendering when a graph has image nodes and other type nodes.

#### 3.3.6

- feat: support edge weight for dagre layout;
- feat: automatically add draggable to keyShape, users do not need to assign it when custom a node or an edge;
- fix: cannot read 0 or null problem in getPointByCanvas;
- fix: brush-select bug;
- fix: set autoDraw to canvas when graph's setAutoPaint is called;
- fix: modify the usage of bbox in view controller since the interface is chagned by G;
- fix: the shape.attr error in updateShapeStyle;
- fix: local refresh influence on changeData;
- refactor: upgrade g-canvas to 0.3.23 to solve lacking of removeChild function;
- doc: update the demo fo custom behavior doc;
- doc: add plugin demos and cases for site;
- doc: fix shouldUpdate problem in treeWithLargeData demo on the site.

#### 3.3.5

- fix: 3.3.4 is not published successfully;

#### 3.3.4

- fix: 3.3.3 is not published successfully;
- fix: delegate or keyShape type minimap does not display bug;
- fix: dragging bug on minimap with a graph whose bbox is nagtive;
- fix: null matrix bug, create a unit matrix for null.

#### 3.3.3

- fix: delegate or keyShape type minimap does not display bug;
- fix: null matrix in focus() and getLoopCfgs() bug.

#### 3.3.2

- fix: ts type export problem;
- fix: edge with endArrow and autoRotate label bug;
- fix: code prettier;
- fix: line with control points bug;
- fix: matrix null bug.

#### 3.3.1

- fix: resolve 3.3.0 compatibility problem.

#### 3.3.0

- Graph API
  - refactor: delete removeEvent function, use off;
- refactor: parameters of Shape animate changed, shape.animate(toAttrs, animateCfg) or shape.animate(onFrame, animateCfg);
- feat: descriptionCfg for modelRect to define the style of description by user;
- feat: update a node from without some shapes to with them, such as linkPoints, label, logo icon and state icon for modelRect;
- feat: the callback paramter of event nodeselectchange is changed to { target, selectedItems, ... };
- feat: support stateStyles in node and edge data;
- feat: calculate pixelRatio by G automatically, user do not need to assign it to graph instance;
- chore: G 4.0
- refactor: refreshLayout of TreeGraph is renamed as layout
- fix: no fan shape in G any more
- feat: recommand to assign name for each shape when addShape
- fix: do not support SVG renderer anymore. no renderer for graph configuration anymore
- refactor: plugins usage is changed into new G6.PluginName()

#### 3.2.7

- feat: supports create the group without nodes in node-group;
- fix: supports destoryed properties and fix issue 1094;

#### 3.2.6

- feat: supports sort the nodes on one circle according to the data ordering or some attribute in radial layout
- fix: grid layout with cols and rows
- feat: fix the nodes with position information in their original data and random the positions of others when the layout is not defined for graph

#### 3.2.5

- fix: click-select trigger error
- fix: solved position problem for minimap

#### 3.2.4

- fix: typescript compile error
- fix: delete sankey lib

#### 3.2.3

- fix: group position error
- fix: supports not set layout type

#### 3.1.5

- feat: supports g6 types file
- fix: set brush-select trigger param to ctrl not work
- fix: when set fitView to true, drag-group Behavior not get desired positon

#### 3.1.3

- feat: radial layout nonoverlap iterations can be controlled by user
- feat: add lock, unlock and hasLocked function, supports lock and unlock node
- fix: mds with discrete points problem
- fix: fruchterman-group layout title position for rect groups

#### 3.1.2

- feat: default behavior supports configuration trigger mode
- feat: node combining supports configuration title
- fix: update demo state styles

#### 3.1.1

- fix: update node use custom config
- fix: update demo
- feat: default node implement getShapeStyle function

#### 3.1.0

- feat: support for rich layouts:random, radial, mds, circular, fruchterman, force, dagre
- feat: more flexible configuration for shape
- feat: build-in rich default nodes
- feat: cases that provide layout and default nodes

#### 3.0.7-beta.1

`2019-09-11`

- fix: zoom-canvas support IE and Firefox

#### 3.0.6

`2019-09-11`

- fix: group data util function use module.exports
- feat: update @antv/hierarchy version

#### 3.0.5

`2019-09-10`

- feat: support add and remove group
- feat: support collapse and expand group
- feat: add graph api: collapseGroup and expandGroup

#### 3.0.5-beta.12

- feat: add rect group
- feat: add rect group demo
- feat: add chart node

---

#### 3.0.5-beta.10

- feat: add 5 chart node
- feat: collapse-expand tree support click and dblclick by trigger option
- fix: drag group bug fix

#### 3.0.5-beta.10

- feat: support render group
- feat: support drag group, collapse and expand group, drag node in/out group
- feat: add drag-group、collapse-expand-group and drag-node-with-group behavior
- feat: add drag-group and collapse-expand-group demo
- feat: add register list node demo

#### 3.0.5-beta.8

`2019-07-19`

- feat: add five demos
- refactor: update three behaviors

#### 2.2.5

`2018-12-20`

- feat: add saveimage limitRatio

#### 2.2.4

`2018-12-20`

- fix: bug fix

#### 2.2.3

`2018-12-10`

- fix: bug fix

#### 2.2.2

`2018-11-30`

- fix: tree remove guide will not getEdges.closes #521

#### 2.2.1

`2018-11-25`

- fix: Compatible with MOUSEWHEEL
- fix: fadeIn aniamtion
- fix: fix wheelZoom behaviour by removing the deprecated mousewheel event

#### 2.2.0

`2018-11-22`

- fix: Graph read zIndex
- refactor: Animation

#### 2.1.5

`2018-10-26`

- fix: svg pixelRatio bug
- feat: add wheel event

#### 2.1.4

`2018-10-06`

- fix: custom math.sign to compatible with ie browser.Closes #516.
- fix: legend component from @antv/component
- feat: update svg minimap && fix svg dom event

#### 2.1.3

`2018-09-27`

- feat: add label rotate
- feat: if there is no items the graph box equal canvas size

#### 2.1.2

`2018-09-19`

- fix: dom getShape bug.Closes #472
- fix: template.maxSpanningForest bug

#### 2.1.1

`2018-09-17`

- fix: tool.highlightSubgraph calculate box bug
- fix: plugin.grid.Closes #479
- chore(dev): upgrade babel & torchjs

#### 2.1.0

`2018-09-03`

- feat: svg render
- feat: plugin.layout.forceAtlas2
- feat: plugin.tool.fisheye
- feat: plugin.tool.textDisplay
- feat: plugin.tool.grid
- feat: plugin.template.tableSankey
- feat: plugin.edge.polyline

#### 2.0.5

`2018-07-12`

- improve: add g6 arrow

#### 2.0.4

`2018-07-12`

- feat: layout export group.Closes #355
- feat(plugin): add tool.tooltip. Closes #360.
- style: change the calling way of forceAtlas2 on template.maxSpanningForest
- fix: origin tree data collapsed is true tree edge visible bug.Closes #357
- fix: remove the forceAtlas.js in template.maxSpanningForest, use forceAtlas from layout.forceAtlas2
- fix: add demos: plugin-fisheye, plugin-forceAtlas2, gallery-graphanalyzer
- fix: add demos: plugin-forceAtlas2, plugin-fisheye

#### 2.0.3

`2018-06-29`

- feat: update g to 3.0.x. Closes #346
- fix: group should use rect intersect box. Close #297
- fix(plugin): dagre edge controlpoints remove start point and end point
- style: remove some annotations
- chore: update torchjs && improve demo name

#### 2.0.2

`2018-06-13`

- chore(plugin): require g6 by src/index
- chore(dev test): remove useless test script
- fix(plugin) minimap destroy Closes #308
- fix(saveImage) saveImage bug
- fix(event): fix dom coord. Closes #305

#### 2.0.1

`2018-06-11`

- fix: reDraw edge after layout
- feat: add quadraticCurve config cpd
- feat: add beforelayout && afterlayout event
- chore: .travis.yml add add Node.js
- chore: .travis.yml cache node_modules

#### 2.0.0

`2018-06-06`

- refactor: refactor architecture && code

#### 1.2.1

`2018-03-15`

- feat: layout interface

#### 1.2.0

`2018-01-15`

- fix: nodeActivedBoxStyle spelling error
- fix: error when deleting a circle
- fix: trigger dragstart while right clicking and moveing
- feat: Unify Layout mechanism
- feat: Plugin mechanism
- feat: Data filter mechanism
- feat: Activated interface
- feat: Action wheelZoomAutoLabel
- feat: configuration of graph -- preciseAnchor
- remove: Global.preciseAnchor
- remove: Layout.Flow、Layout.Force
- improve: html container strategy

#### 1.1.6

`2017-10-15`

- fix: pack problem in layout algorithm

#### 1.1.5

`2017-09-15`

- fix: dragCanvas is effective while mousemove, prevent it from affecting click events
- fix: unactivate pick-up in activeRectBox of node

#### 1.1.4

`2017-08-15`

- feat: graph.invertPoint()
- feat: third configuration of anchor to support style setting, float style, connection
- feat: item.getGroup()
- feat: events -- afteritemrender、itemremove、itemadd
- feat: behaviourSignal
- improve: mouseWheel is affective after focusing the canvas

#### 1.1.3

`2017-08-8`

- feat: Graph configuration -- useNodeSortGroup
- feat: Global.nodeDelegationStyle, Global.edgeDelegationStyle, isolate the delegation of edge and node on graph
- fix: itemremove is triggered before destroying a graph

#### 1.1.2

`2017-08-01`

- feat: dragBlankX dragBlankY

#### 1.1.1

`2017-07-18`

- improve: dragNode protect mechanism

#### 1.1.0

`2017-07-05`

- feat: HTML node
- feat: mapper support callback function
- feat: Graph interfaces -- updateMatrix、changeSize、showAnchor、hideAnchor、updataNodesPosition
- feat: tool functions -- Util.isNode()、Util.isEdge()
- feat: Shape polyLineFlow
- feat: dragEdgeEndHideAnchor、dragNodeEndHideAnchor、hoverAnchorSetActived、hoverNodeShowAnchor

#### 1.0.7

`2017-06-21`

- fix: draw one more time in 16ms after first draw
- improve: add zoom by scroll in edit mode

#### 1.0.6

`2017-06-15`

- fix: compatible in chrome in windows. triggering mousemove after first click leads to wrong click event.
- feat: support fix size graphics
- feat: analysis mode
- feat: updateNodesPositon update a set of nodes' position
- improve: change useAnchor to be a configuration of edge

#### 1.0.5

`2017-06-01`

- feat: downloadImage support saving with name
- feat: automatically detect tooltip padding
- improve: stop the action while mouse dragging out of the canvas

#### 1.0.4

`2017-05-20`

- fix: tree changeData Bug
- fix: when getAnchorPoints returns auto, anchor is the intersection of edge and the bounding box
- fix: generate node label according to isNull
- feat: viewport parameters -- tl、tc、tr、rc、br、bc、bl、lc、cc
- improve: reduce tolerance to improve the accuracy of interception
- improve: improve tooltip event mechanisom to enhance performance

#### 1.0.3

`2017-05-10`

- feat: graph.guide().link()

#### 1.0.2

`2017-05-10`

- fix: Object.values => Util.getObjectValues
- fix: when anchorPoints is auto, there is only anchorpoint on edge, it will also return the intersection
- fix: tree update interface Bug
- improve: represent positions information by group.transfrom()

#### 1.0.1

`2017-04-22`

- fix: copy and paste bug
- feat: draw once in 16ms
- feat: itemactived itemunactived itemhover itemupdate itemmouseenter itemmouseleave
- improve: be clear the status of graphics before activating graphics by frame selection
- improve: dragAddEdge, linkable to anchor
- improve: performance of animation

#### 1.0.0

`2017-03-31`

- feat: fitView configurations
- feat: graph.zoom()
- feat: wheelZoomHideEdges hide the edges while zooming by wheel
- feat: dragHideEdges hide the edge while dragging edge
- feat: graph.filterBehaviour()
- feat: graph.addBehaviour()
- feat: graph.changeLayout()
- feat: read interface, re-define save interface
- feat: graph.snapshot, graph.downloadImage
- feat: graph.autoSize()
- feat: graph.focusPoint()
- feat: tree graph、net graph
- feat: interaction mechanism -- event => action => mode
- feat: animation mechanism
- feat: itemmouseleave、itemmouseenter
- remove: graph.refresh()
- remove: graph.changeNodes()
- remove: graph attributes -- zoomable、draggable、resizeable、selectable
- improve: anchor mechanism
- improve: hide G6.GraphUtil functions, unified in G6.Util
- improve: replace g-canvas-core to g-canvas to improve performance
- improve: Global.nodeAcitveBoxStyle instead of Global.nodeBoxStyle
- improve: afterAdd => afteradd
- improve: G6.Graph to be an abstract class

#### 0.2.3

`2017-03-2`

- fix: draggable for controlling draggable under default mode
- feat: graph.converPoint()
- feat: graph.autoSize()
- feat: rightmousedown leftmousedown wheeldown
- improve: use try catch to prevent the length of getPoint of path equals zero

#### 0.2.2

`2017-02-24`

- fix: add px totooltip css padding
- fix: tooltip mapping error
- fix: accurate intersection
- fix: zoom error on double accuracy screen
- fix: buonding box extended from keyShape
- feat: afterAdd
- feat: dblclick
- improve: width、height default null
- improve: remove hovershape on node
- improve: tooltip defense mechanism

#### 0.2.1

`2017-02-14`

- fix: rollback when add node
- fix: apply tranformation of parent container while calculating bounding box
- feat: waterPath
- feat: tooltip tip information
- feat: mouseover
- feat: multiSelectable, default false
- feat: set forceFit to true while width is undefined
- improve: zoomable、draggable、resizeable、selectable default true

#### 0.2.0

`2017-02-07`

- feat: accurate anchor mechanism
- feat: GraphUtil.getEllipsePath
- feat: GraphUtil.pointsToPolygon
- feat: GraphUtil.pointsToBezier
- feat: GraphUtil.snapPreciseAnchor
- feat: GraphUtil.arrowTo
- feat: GraphUtil.drawEdge
- feat: bezierQuadratic
- feat: node.show
- feat: node.hide
- feat: node.getLinkNodes
- feat: node.getUnLinkNodes
- feat: node.getRelativeItems
- feat: node.getUnRelativeItems
- feat: edge.show
- feat: edge.hide
- feat: Shape afterDraw
- improve: the controlling point positions of Bezier Curve 改进贝塞尔曲线控制点位置
- improve: grpah.delete => graph.del
- improve: error when adding id

#### 0.1.4

`2017-01-17`

- fix: delegator of dragging a node is the center of bbox
- fix: use cardinality sort for all the sorting algorithm
- fix: random id on edges
- feat: level sort on edges, edge labels on the top level
- feat: while extending shape is undefined when register an edge, find the extending shaoe automatically

#### 0.1.3

`2017-01-15`

- fix: judge the existance of the object while operating assistGrid
- feat: rollback judgement, default unactivate
- feat: style mapping channel
- feat: return the intersections while getAnchorPoints is null or returns false
- feat: bezierHorizontal、bezierVertical
- improve: 'eventEnd'

#### 0.1.2

`2017-01-12`

- fix: judge the configuration before updating grid
- fix: the size of graphContainer in unsetable, setted by inner canvas
- fix: will not add an edge if the target or source is undefined
- fix: changeSize() maximum tolerance for error
- feat: graph.get('el') to get canvas DOM
- feat: event exposures shape

#### 0.1.1

`2017-01-09`

- feat: entrance of graph is G6.Graph

#### 0.1.0

`2017-01-07`

- feat: color calculation library
- feat: hot key
- feat: updo, redo
- feat: copy, paste
- feat: reset zoom, auto zoom
- feat: tree graph, linear graph, sankey graph, flow laout
- feat: flow chart package
- feat: timing diagram package
- feat: single selection, frame selection
- feat: node deformation
- feat: edge deformation
- feat: drag node and edge
- feat: link edge and node
- feat: drag canvas
- feat: zoom
- feat: select mode
- feat: integrate g-graph


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 Alipay.inc

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: PUBLISH.md
================================================
This project uses changeset to manage version release, and the specific release process is as follows:

1. Complete related development work
2. Create a branch from v5 (any name you want)
3. Run `npm run version` command, fill in the information according to the prompt, and the version number will be updated automatically
4. Commit the changes to the remote repository
5. Create a PR on GitHub, add the `publish` label, and merge the branch to v5
6. After the branch is merged, GitHub Actions will be triggered automatically, and the package will be published to npm
7. After the release, the Release note needs to be updated. Execute "pnpm tag" in the packages/g6
8. Fill in the tag information on the newly opened Github link. First, select the previous tag, and then select the current tag to obtain the changes. After confirming that there are no issues, release it.

---

本项目通过 changeset 来管理版本发布,具体的发布流程如下:

1. 完成相关的开发工作
2. 从 v5 分支创建一个分支(任意分支名均可)
3. 根目录执行 `npm run version` 命令,根据提示填写相关信息,会自动更新版本号
4. 将变更提交到远程仓库
5. 在 GitHub 上创建一个 PR,并添加 `publish` 标签,将该分支合并到 v5 分支
6. 分支合并后,会自动触发 GitHub Actions,发布到 npm
7. 发布后,需更新 Release note,在 packages/g6 目录下执行 pnpm tag
8. 在新打开的 Github 链接填写 tag 信息,先选择前一个 tag, 然后选择当前 tag 后得到变更,确认没有问题后发布


================================================
FILE: README.md
================================================
<img src="https://gw.alipayobjects.com/zos/antfincdn/R8sN%24GNdh6/language.svg" width="18"> English | [简体中文](./README.zh-CN.md)

<h1 align="center">
<b>G6: A Graph Visualization Framework in TypeScript</b>
</h1>

![](https://user-images.githubusercontent.com/6113694/45008751-ea465300-b036-11e8-8e2a-166cbb338ce2.png)

<p align="center">
<a href="https://trendshift.io/repositories/9709" target="_blank"><img src="https://trendshift.io/api/badge/repositories/9709" alt="antvis%2FG6 | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</p>

[![npm Version](https://img.shields.io/npm/v/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
[![Build Status](https://github.com/antvis/G6/actions/workflows/build.yml/badge.svg)](https://github.com/antvis/G6/actions/workflows/build.yml)
[![codecov](https://codecov.io/gh/antvis/G6/graph/badge.svg?token=OvIk06tCPa)](https://codecov.io/gh/antvis/G6)
[![npm Download](https://img.shields.io/npm/dm/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
![typescript](https://img.shields.io/badge/language-typescript-blue.svg)
[![npm License](https://img.shields.io/npm/l/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/antvis/G6)

<p align="center">
  <a href="https://g6.antv.antgroup.com/en">Introduction</a> •
  <a href="https://g6.antv.antgroup.com/en/examples">Examples</a> •
  <a href="https://g6.antv.antgroup.com/en/manual/getting-started/quick-start">Quick Start</a> •
  <a href="https://g6.antv.antgroup.com/en/api/graph/method">API</a>
</p>

[G6](https://github.com/antvis/g6) is a graph visualization engine. It provides basic capabilities for graph visualization and analysis such as drawing, layout, analysis, interaction, animation, themes, and plugins. With G6, users can quickly build their own graph visualization and analysis applications, making relational data simple, transparent, and meaningful.

<img src='https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*_PJ5SZELwq0AAAAAAAAAAAAADmJ7AQ/original' width=550 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zTjwQaXokeQAAAAAAAAAAABkARQnAQ' width=550 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zau8QJcVpDQAAAAAAAAAAABkARQnAQ' height=200 alt='' /><img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*RIlETY_S6IoAAAAAAAAAAABkARQnAQ' height=200 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*cDzXR4jIWr8AAAAAAAAAAABkARQnAQ' height=150 alt='' /><img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*HTasSJGC4koAAAAAAAAAAABkARQnAQ' height=150 alt='' />

<img src="https://user-images.githubusercontent.com/6113694/44995293-02858600-afd5-11e8-840c-349e4730d63d.gif" height=150 alt='' /><img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*I9OdTbXJIi0AAAAAAAAAAABkARQnAQ" height=150 alt='' /><img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*xoufSYcjK2AAAAAAAAAAAABkARQnAQ" height=150 alt='' />

## ✨ Features

G6, as a professional graph visualization engine, boasts the following features:

- **Rich Elements**: It comes with a variety of built-in node, edge, and Combo UI elements with extensive style configurations, supports data callbacks, and has a flexible mechanism for extending custom elements.
- **Controllable Interactions**: It includes more than 10 built-in interaction behaviors and offers a rich array of events, facilitating the expansion of custom interactive behaviors.
- **High-Performance Layout**: The engine features more than 10 common graph layouts, some of which leverage GPU and Rust parallel computing for enhanced performance, and it supports custom layout development.
- **Convenient Plugins**: Optimized built-in plugin functionality and performance, with flexible extensibility, making it easier to implement customized business capabilities.
- **Multiple Theme and Palettes**: Provides two sets of built-in themes, light and dark, that integrate over 20 popular community color palettes based on the AntV new color scheme.
- **Multi-Environment Rendering**: Harnessing the power of [G](https://github.com/antvis/g), it supports rendering in Canvas, SVG, and WebGL, as well as server-side rendering with Node.js; it also offers plugin packages that provide powerful 3D rendering and spatial interactions based on WebGL.
- **React Ecosystem**: By utilizing the React front-end ecosystem, it supports React nodes, significantly enriching the presentational styles of G6 nodes.

## 🔨 Getting Started

G6 is usually installed via a package manager such as npm or Yarn.

```bash
$ npm install @antv/g6
```

The `Graph` object then can be imported from G6.

```html
<div id="container"></div>
```

```js
import { Graph } from '@antv/g6';

// Get the Data.
const data = {
  nodes: [
    /* your nodes data */
  ],
  edges: [
    /* your edges data */
  ],
};

// Create the Graph instance.
const graph = new Graph({
  container: 'container',
  data,
  node: {
    palette: {
      type: 'group',
      field: 'cluster',
    },
  },
  layout: {
    type: 'force',
  },
  behaviors: ['drag-canvas', 'drag-node'],
});

// Render the Graph.
graph.render();
```

All goes well, you can get the following lovely graph!

<img src="https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*ue4iTYurc6sAAAAAAAAAAAAADmJ7AQ/fmt.webp" height="300" />

## 🌍 Ecosystem

- **Ant Design Charts**: A React chart library based on G2, G6, X6, L7.
- **Graphin**: A simple React wrapper based on G6, as well as an SDK for developing graph visualization applications.

For more ecosystem open-source projects, contributions are welcome. Please feel free to submit a PR for inclusion.

## 📮 Contributing

This project exists thanks to all the people who contribute.

And thank you to all our backers! 🙏

<a href="https://openomy.app/github/antvis/G6" target="_blank" style="display: block; width: 100%;" align="center">
  <img src="https://openomy.app/svg?repo=antvis/G6&chart=bubble&latestMonth=3" target="_blank" alt="Contribution Leaderboard" style="display: block; width: 100%;" />
 </a>

- **Issue Reporting**: If you encounter any issues with G6 during use, please feel free to submit an issue, along with the minimal sample code that can reproduce the problem.
- **Contribution Guide**: Information on how to get involved in the [development and contribution](https://g6.antv.antgroup.com/en/manual/contribute) to G6.
- **Ideas Discussion**: Discuss your ideas on GitHub Discussions or in the DingTalk group.

<div align="center">
  <img src="https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*CQoGSoFBzaUAAAAAAAAAAAAADmJ7AQ/fmt.webp" height="256" />
</div>

## 📄 License

[MIT](./LICENSE).


================================================
FILE: README.zh-CN.md
================================================
<img src="https://gw.alipayobjects.com/zos/antfincdn/R8sN%24GNdh6/language.svg" width="18"> [English](./README.md) | 简体中文

<h1 align="center">
<b>G6:图可视分析引擎</b>
</h1>

![](https://user-images.githubusercontent.com/6113694/45008751-ea465300-b036-11e8-8e2a-166cbb338ce2.png)

<p align="center">
<a href="https://trendshift.io/repositories/9709" target="_blank"><img src="https://trendshift.io/api/badge/repositories/9709" alt="antvis%2FG6 | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</p>

[![npm Version](https://img.shields.io/npm/v/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
[![Build Status](https://github.com/antvis/G6/actions/workflows/build.yml/badge.svg)](https://github.com/antvis/G6/actions/workflows/build.yml)
[![codecov](https://codecov.io/gh/antvis/G6/graph/badge.svg?token=OvIk06tCPa)](https://codecov.io/gh/antvis/G6)
[![npm Download](https://img.shields.io/npm/dm/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
![typescript](https://img.shields.io/badge/language-typescript-blue.svg)
[![npm License](https://img.shields.io/npm/l/@antv/g6.svg)](https://www.npmjs.com/package/@antv/g6)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/antvis/G6)

<p align="center">
  <a href="https://g6.antv.antgroup.com/manual/introduction">简介</a> •
  <a href="https://g6.antv.antgroup.com/examples">图表示例</a> •
  <a href="https://g6.antv.antgroup.com/manual/getting-started/quick-start">快速开始</a> •
  <a href="https://g6.antv.antgroup.com/api/graph/method">API</a>
</p>

[G6](https://github.com/antvis/g6) 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画、主题、插件等图可视化和分析的基础能力。基于 G6,用户可以快速搭建自己的图可视化分析应用,让关系数据变得简单,透明,有意义。

<img src='https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*_PJ5SZELwq0AAAAAAAAAAAAADmJ7AQ/original' width=550 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zTjwQaXokeQAAAAAAAAAAABkARQnAQ' width=550 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*zau8QJcVpDQAAAAAAAAAAABkARQnAQ' height=200 alt='' /><img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*RIlETY_S6IoAAAAAAAAAAABkARQnAQ' height=200 alt='' />

<img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*cDzXR4jIWr8AAAAAAAAAAABkARQnAQ' height=150 alt='' /><img src='https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*HTasSJGC4koAAAAAAAAAAABkARQnAQ' height=150 alt='' />

<img src="https://user-images.githubusercontent.com/6113694/44995293-02858600-afd5-11e8-840c-349e4730d63d.gif" height=150 alt='' /><img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*I9OdTbXJIi0AAAAAAAAAAABkARQnAQ" height=150 alt='' /><img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*xoufSYcjK2AAAAAAAAAAAABkARQnAQ" height=150 alt='' />

## ✨ 特性

G6 作为一款专业的图可视化引擎,具有以下特性:

- **丰富的元素**:内置丰富的节点、边、Combo UI 元素,样式配置丰富,支持数据回调,且具备有灵活扩展自定义元素的机制。
- **可控的交互**:内置 10+ 交互行为,且提供丰富的各类事件,便于扩展自定义的交互行为。
- **高性能布局**:内置 10+ 常用的图布局,部分基于 GPU、Rust 并行计算提升性能,支持自定义布局。
- **便捷的组件**:优化内置组件功能及性能,且有灵活的扩展性,便于业务实现定制能力。
- **多主题色板**:提供了亮色、暗色两套内置主题,在 AntV 新色板前提下,融入 20+ 常用社区色板。
- **多环境渲染**:发挥 [G](https://github.com/antvis/g) 能力, 支持 Canvas、SVG 以及 WebGL,和 Node.js 服务端渲染;基于 WebGL 提供强大 3D 渲染和空间交互的插件包。
- **React 体系**:利用 React 前端生态,支持 React 节点,大大丰富 G6 的节点呈现样式。

## 🔨 开始使用

可以通过 NPM 或 Yarn 等包管理器来安装。

```bash
$ npm install @antv/g6
```

成功安装之后,可以通过 import 导入 `Graph` 对象。

```html
<div id="container"></div>
```

```js
import { Graph } from '@antv/g6';

// 准备数据
const data = {
  nodes: [
    /* your nodes data */
  ],
  edges: [
    /* your edges data */
  ],
};

// 初始化图表实例
const graph = new Graph({
  container: 'container',
  data,
  node: {
    palette: {
      type: 'group',
      field: 'cluster',
    },
  },
  layout: {
    type: 'force',
  },
  behaviors: ['drag-canvas', 'drag-node'],
});

// 渲染图
graph.render();
```

一切顺利,你可以得到下面的力导图!

<img src="https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*ue4iTYurc6sAAAAAAAAAAAAADmJ7AQ/fmt.webp" height="300" />

## 🌍 生态

- **Ant Design Charts**: React 图表库,基于 G2、G6、X6、L7。
- **Graphin**:基于 G6 的 React 简单封装,以及图可视化应用研发的 SDK。

更多生态开源项目,欢迎 PR 收录进来。

## 📮 贡献

感谢所有为这个项目做出贡献的人,感谢所有支持者!🙏

<a href="https://openomy.app/github/antvis/G6" target="_blank" style="display: block; width: 100%;" align="center">
  <img src="https://openomy.app/svg?repo=antvis/G6&chart=bubble&latestMonth=3" target="_blank" alt="Contribution Leaderboard" style="display: block; width: 100%;" />
 </a>

- **问题反馈**:使用过程遇到的 G6 的问题,欢迎提交 Issue,并附上可以复现问题的最小案例代码。
- **贡献指南**:如何参与到 G6 的[开发和贡献](https://g6.antv.antgroup.com/manual/contribute)。
- **想法讨论**:在 GitHub Discussion 上或者钉钉群里面讨论。

<div>
  <img src="https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*CQoGSoFBzaUAAAAAAAAAAAAADmJ7AQ/fmt.webp" height="256" />
</div>

## 📄 License

[MIT](./LICENSE).


================================================
FILE: SECURITY.md
================================================
# Security Policy
Could the maintainers please create and publish a security.md with security policy that indicates the process for submitting vulnerabilities, tracking, and expectations for users of remediation of vulnerabilities?


## Supported Versions

Use this section to tell people about which versions of your project are
currently being supported with security updates.

| Version | Supported          |
| ------- | ------------------ |
| 5.1.x   | :white_check_mark: |
| 5.0.x   | :x:                |
| 4.0.x   | :white_check_mark: |
| < 4.0   | :x:                |

## Reporting a Vulnerability

Use this section to tell people how to report a vulnerability.

Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.


================================================
FILE: package.json
================================================
{
  "name": "g6",
  "private": true,
  "repository": "https://github.com/antvis/G6.git",
  "scripts": {
    "build": "turbo build --filter=!@antv/g6-site",
    "ci": "turbo run ci --filter=!@antv/g6-site",
    "dev:g6": "cd ./packages/g6 && npm run dev",
    "postinstall": "husky install",
    "perf": "npm run perf",
    "prepare": "husky install",
    "publish": "pnpm publish -r --publish-branch v5",
    "site": "pnpm -r --stream --filter=./packages/site run dev",
    "version": "./scripts/version.sh",
    "watch": "pnpm -r --stream --filter=!./site run start"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "lint-staged": {
    "*.{ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{json,md}": [
      "prettier --write"
    ]
  },
  "devDependencies": {
    "@antv/g-canvas": "^2.2.0",
    "@antv/g-plugin-rough-canvas-renderer": "^2.1.1",
    "@babel/core": "^7.28.6",
    "@babel/plugin-transform-typescript": "^7.28.6",
    "@changesets/cli": "^2.29.8",
    "@commitlint/cli": "^18.6.1",
    "@commitlint/config-conventional": "^18.6.3",
    "@playwright/test": "^1.58.0",
    "@rollup/plugin-commonjs": "^25.0.8",
    "@rollup/plugin-json": "^6.1.0",
    "@rollup/plugin-node-resolve": "^15.3.1",
    "@rollup/plugin-terser": "^0.4.4",
    "@rollup/plugin-typescript": "^11.1.6",
    "@swc/core": "^1.15.11",
    "@swc/jest": "^0.2.39",
    "@types/d3-hierarchy": "^3.1.7",
    "@types/jest": "^29.5.14",
    "@types/jsdom": "^21.1.7",
    "@types/node": "^20.19.30",
    "@types/stats.js": "^0.17.4",
    "@typescript-eslint/eslint-plugin": "^6.21.0",
    "@typescript-eslint/parser": "^6.21.0",
    "chalk": "^4.1.2",
    "d3-hierarchy": "^3.1.2",
    "eslint": "^8.57.1",
    "eslint-plugin-jsdoc": "^46.10.1",
    "husky": "^8.0.3",
    "iperf": "0.1.0-beta.14",
    "jest": "^29.7.0",
    "jest-environment-jsdom": "^29.7.0",
    "jsdom": "^23.2.0",
    "lil-gui": "^0.19.2",
    "limit-size": "^0.1.4",
    "lint-staged": "^15.5.2",
    "npm-run-all": "^4.1.5",
    "open": "^10.2.0",
    "prettier": "^3.8.1",
    "prettier-plugin-organize-imports": "^3.2.4",
    "prettier-plugin-packagejson": "^2.5.22",
    "rimraf": "^5.0.10",
    "rollup": "^4.57.0",
    "rollup-plugin-polyfill-node": "^0.13.0",
    "rollup-plugin-visualizer": "^5.14.0",
    "stats.js": "^0.17.0",
    "svgo": "^3.3.2",
    "ts-node": "^10.9.2",
    "tslib": "^2.8.1",
    "turbo": "^1.13.4",
    "typescript": "^5.9.3",
    "vite": "^5.4.21"
  },
  "pnpm": {
    "onlyBuiltDependencies": [
      "canvas"
    ],
    "overrides": {
      "@umijs/mako": "0.9.2"
    },
    "ignoredBuiltDependencies": [
      "@parcel/watcher",
      "@swc/core",
      "core-js",
      "core-js-pure",
      "esbuild",
      "iperf"
    ]
  }
}


================================================
FILE: packages/bundle/index.html
================================================
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>G6 Bundler Test</title>
  </head>
  <body>
    <select id="switch-bundler">
      <option value="">None</option>
      <option value="webpack">Webpack</option>
      <option value="vite">Vite</option>
      <option value="rollup">Rollup</option>
    </select>
    <div id="container"></div>

    <script>
      const select = document.getElementById('switch-bundler');

      function setBundler(value) {
        if (!value) return;
        const container = document.getElementById('container');
        container.innerHTML = '';

        const currentScript = document.getElementById('g6-script');
        if (currentScript) document.body.removeChild(currentScript);

        const script = document.createElement('script');
        script.id = 'g6-script';
        script.src = `./dist/${value}/g6.umd.js`;
        document.body.appendChild(script);
      }

      select.addEventListener('change', (e) => {
        setBundler(e.target.value);
        console.log('switch bundler:', e.target.value);
      });
    </script>
  </body>
</html>


================================================
FILE: packages/bundle/package.json
================================================
{
  "name": "bundle",
  "private": true,
  "scripts": {
    "build": "run-s build:*",
    "build:rollup": "rollup -c",
    "build:vite": "vite build",
    "build:webpack": "webpack",
    "ci": "npm run build"
  },
  "dependencies": {
    "@antv/g6": "workspace:*"
  },
  "devDependencies": {
    "@rollup/plugin-commonjs": "^25.0.8",
    "@rollup/plugin-node-resolve": "^15.3.1",
    "@rollup/plugin-terser": "^0.4.4",
    "@rollup/plugin-typescript": "^11.1.6",
    "rollup": "^4.40.2",
    "rollup-plugin-polyfill-node": "^0.13.0",
    "swc": "^1.0.11",
    "vite": "^5.4.19",
    "webpack": "^5.99.8",
    "webpack-cli": "^5.1.4"
  }
}


================================================
FILE: packages/bundle/rollup.config.mjs
================================================
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import typescript from '@rollup/plugin-typescript';
import nodePolyfills from 'rollup-plugin-polyfill-node';

export default {
  input: 'src/index.ts',
  output: {
    file: 'dist/rollup/g6.umd.js',
    name: 'g6',
    format: 'umd',
    sourcemap: false,
  },
  plugins: [nodePolyfills(), resolve(), commonjs(), typescript(), terser()],
};


================================================
FILE: packages/bundle/src/index.ts
================================================
import { Graph } from '@antv/g6';

const data = {
  nodes: [
    { id: '0' },
    { id: '1' },
    { id: '2' },
    { id: '3' },
    { id: '4' },
    { id: '5' },
    { id: '6' },
    { id: '7' },
    { id: '8' },
    { id: '9' },
  ],
  edges: [
    { source: '0', target: '1' },
    { source: '0', target: '2' },
    { source: '1', target: '4' },
    { source: '0', target: '3' },
    { source: '3', target: '4' },
    { source: '4', target: '5' },
    { source: '4', target: '6' },
    { source: '5', target: '7' },
    { source: '5', target: '8' },
    { source: '8', target: '9' },
    { source: '2', target: '9' },
    { source: '3', target: '9' },
  ],
};

const graph = new Graph({
  container: 'container',
  autoFit: 'view',
  animation: false,
  data,
  layout: {
    type: 'antv-dagre',
    nodeSize: [60, 30],
    nodesep: 60,
    ranksep: 40,
    controlPoints: true,
  },
  node: {
    type: 'rect',
    style: {
      size: [60, 30],
      radius: 8,
      labelText: (d) => d.id,
      labelBackground: true,
    },
  },
  edge: {
    type: 'polyline',
  },
  behaviors: ['drag-element', 'drag-canvas', 'zoom-canvas'],
});

graph.render();


================================================
FILE: packages/bundle/tsconfig.json
================================================
{
  "compilerOptions": {
    "strict": true,
    "outDir": "lib",
    "paths": {
      "@antv/g6": ["../g6/src/index.ts"]
    }
  },
  "extends": "../../tsconfig.json",
  "include": ["src/**/*"]
}


================================================
FILE: packages/bundle/vite.config.js
================================================
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    lib: {
      entry: 'src/index.ts',
      name: 'g6',
      fileName: 'g6',
      formats: ['umd'],
    },
    outDir: 'dist/vite',
  },
});


================================================
FILE: packages/bundle/webpack.config.js
================================================
const path = require('path');

module.exports = {
  entry: './src/index.ts',
  output: {
    filename: 'g6.umd.js',
    path: path.resolve(__dirname, 'dist/webpack'),
  },
};


================================================
FILE: packages/cli/CHANGELOG.md
================================================
# @antv/g6-cli

## 0.0.2

### Patch Changes

- chore, feat, bugfix


================================================
FILE: packages/cli/README.md
================================================
# @antv/g6-cli

`@antv/g6-cli` is a G6 template generation tool that comes with several templates.

Currently, it owns a built-in template called `extension`. This template handles the boilerplate setup, which encompasses a seamless local development environment, linting, code formatting, Jest for snapshot testing and bundling with Rollup etc.

`@antv/g6-cli` i

## Getting Started

To start using `@antv/g6-cli`, you'll first need to install it globally.

```bash
npm i @antv/g6-cli -g
```

Once installed, you can easily scaffold a new project:

```bash
create-g6
```

Then follow the prompts!

![prompts](https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*09BKQrIcZUMAAAAAAAAAAAAADmJ7AQ/original)

You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a **G6 Extension** project, run:

```bash
create-g6 g6-extension-test --template extension
```


================================================
FILE: packages/cli/build.config.ts
================================================
import { defineBuildConfig } from 'unbuild';

export default defineBuildConfig({
  entries: ['src/index'],
  clean: true,
  rollup: {
    inlineDependencies: true,
    esbuild: {
      target: 'node18',
      minify: true,
    },
  },
});


================================================
FILE: packages/cli/index.js
================================================
#!/usr/bin/env node

import './dist/index.mjs';


================================================
FILE: packages/cli/package.json
================================================
{
  "name": "@antv/g6-cli",
  "version": "0.0.3",
  "description": "Scaffolding Your Extension for G6",
  "keywords": [
    "antv",
    "g6",
    "extension",
    "template"
  ],
  "repository": "https://github.com/antvis/G6.git",
  "license": "MIT",
  "author": "yvonneyx",
  "type": "module",
  "main": "index.js",
  "bin": {
    "create-g6": "index.js"
  },
  "files": [
    "index.js",
    "template-*",
    "dist"
  ],
  "scripts": {
    "build": "unbuild",
    "dev": "unbuild --stub",
    "prepublishOnly": "npm run build",
    "typecheck": "tsc --noEmit"
  },
  "devDependencies": {
    "@types/lodash": "^4.17.16",
    "@types/minimist": "^1.2.5",
    "@types/prompts": "^2.4.9",
    "kolorist": "^1.8.0",
    "minimist": "^1.2.8",
    "prompts": "^2.4.2",
    "unbuild": "^2.0.0"
  },
  "engines": {
    "node": "^18.0.0 || >=20.0.0"
  },
  "publishConfig": {
    "access": "public",
    "registry": "https://registry.npmjs.org/"
  }
}


================================================
FILE: packages/cli/src/index.ts
================================================
/* eslint-disable jsdoc/require-jsdoc */
import { red, reset, yellow } from 'kolorist';
import minimist from 'minimist';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import prompts from 'prompts';

const argv = minimist<{
  t?: string;
  template?: string;
}>(process.argv.slice(2), { string: ['_'] });
const cwd = process.cwd();

const renameFiles: Record<string, string | undefined> = {};

const defaultTargetDir = 'g6-extension-test';

const TEMPLATES = [
  {
    name: 'extension',
    display: 'Extension',
    color: yellow,
  },
];

const TEMPLATE_NAMES = TEMPLATES.map((template) => template.name);

async function init() {
  const argTargetDir = formatTargetDir(argv._[0]);
  const argTemplate = argv.template || argv.t;

  let targetDir = argTargetDir || defaultTargetDir;
  const getProjectName = () => (targetDir === '.' ? path.basename(path.resolve()) : targetDir);

  let result: prompts.Answers<'template' | 'projectName' | 'overwrite' | 'author'>;

  prompts.override({
    overwrite: argv.overwrite,
  });

  try {
    result = await prompts(
      [
        {
          type: argTemplate && TEMPLATE_NAMES.includes(argTemplate) ? null : 'select',
          name: 'template',
          message:
            typeof argTemplate === 'string' && !TEMPLATE_NAMES.includes(argTemplate)
              ? reset(`"${argTemplate}" isn't a valid template. Please choose from below: `)
              : reset('Select a template:'),
          initial: 0,
          choices: TEMPLATES.map((template) => {
            const templateColor = template.color;
            return {
              title: templateColor(template.display || template.name),
              value: template,
            };
          }),
        },
        {
          type: () => (!fs.existsSync(targetDir) || isEmpty(targetDir) ? null : 'select'),
          name: 'overwrite',
          message: () =>
            (targetDir === '.' ? 'Current directory' : `Target directory "${targetDir}"`) +
            ` is not empty. Please choose how to proceed:`,
          initial: 0,
          choices: [
            {
              title: 'Remove existing files and continue',
              value: 'yes',
            },
            {
              title: 'Cancel operation',
              value: 'no',
            },
            {
              title: 'Ignore files and continue',
              value: 'ignore',
            },
          ],
        },
        {
          type: (_, { overwrite }: { overwrite?: string }) => {
            if (overwrite === 'no') {
              throw new Error(red('✖') + ' Operation cancelled');
            }
            return null;
          },
          name: 'overwriteChecker',
        },
        {
          type: argTargetDir ? null : 'text',
          name: 'projectName',
          message: reset('Project name:'),
          initial: defaultTargetDir,
          onState: (state) => {
            targetDir = formatTargetDir(state.value) || defaultTargetDir;
          },
        },
        {
          type: 'text',
          name: 'author',
          message: reset('Author'),
        },
      ],
      {
        onCancel: () => {
          throw new Error(red('✖') + ' Operation cancelled');
        },
      },
    );
  } catch (cancelled: any) {
    console.log(cancelled.message);
    return;
  }

  // user choice associated with prompts
  const { template, overwrite, projectName = getProjectName(), author } = result;

  const variables = {
    '{{projectName}}': projectName,
  };

  const root = path.join(cwd, targetDir);

  if (overwrite === 'yes') {
    emptyDir(root);
  } else if (!fs.existsSync(root)) {
    fs.mkdirSync(root, { recursive: true });
  }

  const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);

  const pkgManager = pkgInfo ? pkgInfo.name : 'npm';

  console.log(`\nScaffolding project in ${root}...`);

  const templateDir = path.resolve(fileURLToPath(import.meta.url), '../..', `template-${template.name}`);

  const write = (file: string, variables: Record<string, string>, content?: string) => {
    const targetPath = path.join(root, renameFiles[file] ?? file);
    if (content) {
      fs.writeFileSync(targetPath, content);
    } else {
      copy(path.join(templateDir, file), targetPath, variables);
    }
  };

  const files = fs.readdirSync(templateDir);

  for (const file of files.filter((f) => f !== 'package.json')) {
    write(file, variables);
  }

  const pkg = JSON.parse(fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8'));

  pkg.name = projectName;
  pkg.author = author;

  write('package.json', variables, JSON.stringify(pkg, null, 2) + '\n');

  const cdProjectName = path.relative(cwd, root);
  console.log(`\nDone. Now run:\n`);
  if (root !== cwd) {
    console.log(`  cd ${cdProjectName.includes(' ') ? `"${cdProjectName}"` : cdProjectName}`);
  }
  switch (pkgManager) {
    case 'yarn':
      console.log('  yarn');
      console.log('  yarn dev');
      break;
    default:
      console.log(`  ${pkgManager} install`);
      console.log(`  ${pkgManager} run dev`);
      break;
  }
  console.log();
}

function formatTargetDir(targetDir: string | undefined) {
  return targetDir?.trim().replace(/\/+$/g, '');
}

function copy(src: string, dest: string, variables: Record<string, string>) {
  const stat = fs.statSync(src);
  if (stat.isDirectory()) {
    copyDir(src, dest, variables);
  } else {
    const templateContent = fs.readFileSync(src, 'utf-8');
    const content = replaceTemplateVariables(templateContent, variables);
    fs.writeFileSync(dest, content);
  }
}

function copyDir(srcDir: string, destDir: string, variables: Record<string, string>) {
  fs.mkdirSync(destDir, { recursive: true });
  for (const file of fs.readdirSync(srcDir)) {
    const srcFile = path.resolve(srcDir, file);
    const destFile = path.resolve(destDir, file);
    copy(srcFile, destFile, variables);
  }
}

function isEmpty(path: string) {
  const files = fs.readdirSync(path);
  return files.length === 0 || (files.length === 1 && files[0] === '.git');
}

function emptyDir(dir: string) {
  if (!fs.existsSync(dir)) {
    return;
  }
  for (const file of fs.readdirSync(dir)) {
    if (file === '.git') {
      continue;
    }
    fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });
  }
}

function pkgFromUserAgent(userAgent: string | undefined) {
  if (!userAgent) return undefined;
  const pkgSpec = userAgent.split(' ')[0];
  const pkgSpecArr = pkgSpec.split('/');
  return {
    name: pkgSpecArr[0],
    version: pkgSpecArr[1],
  };
}

function replaceTemplateVariables(content: string, variables: Record<string, string>) {
  Object.keys(variables).forEach((key) => {
    const regex = new RegExp(key, 'g');
    content = content.replace(regex, variables[key]);
  });
  return content;
}

init().catch((e) => {
  console.error(e);
});


================================================
FILE: packages/cli/template-extension/.commitlintrc.js
================================================
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'wip'],
    ],
  },
};


================================================
FILE: packages/cli/template-extension/.editorconfig
================================================
# http://editorconfig.org
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab


================================================
FILE: packages/cli/template-extension/.eslintignore
================================================
dist
es
lib
node_modules

================================================
FILE: packages/cli/template-extension/.eslintrc.js
================================================
module.exports = {
  root: true,
  env: {
    browser: true,
    es2021: true,
    node: true,
    commonjs: true,
    jest: true,
  },
  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
  overrides: [
    {
      env: {
        node: true,
      },
      files: ['.eslintrc.{js,cjs}'],
      parserOptions: {
        sourceType: 'script',
      },
    },
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint', 'jsdoc'],
  rules: {
    quotes: ['error', 'single', { allowTemplateLiterals: true, avoidEscape: true }],
    semi: ['error', 'always'],
  },
};


================================================
FILE: packages/cli/template-extension/.gitignore
================================================
# Node
node_modules/

# Build
dist
lib
esm




================================================
FILE: packages/cli/template-extension/.prettierignore
================================================
dist
es
lib
node_modules


================================================
FILE: packages/cli/template-extension/.prettierrc.js
================================================
module.exports = {
  plugins: [require.resolve('prettier-plugin-organize-imports'), require.resolve('prettier-plugin-packagejson')],
  printWidth: 120,
  proseWrap: 'never',
  singleQuote: true,
  trailingComma: 'all',
};


================================================
FILE: packages/cli/template-extension/__tests__/demos/element-node-extend.ts
================================================
import { ExtendNode } from '@/src';
import { ExtensionCategory, Graph, register } from '@antv/g6';

export const elementNodeExtend: TestCase = async (context) => {
  register(ExtensionCategory.NODE, 'extend-node', ExtendNode);

  const graph = new Graph({
    ...context,
    data: {
      nodes: [{ id: 'node1', style: { x: 100, y: 100 } }],
    },
    node: { type: 'extend-node' },
  });

  await graph.render();

  return graph;
};


================================================
FILE: packages/cli/template-extension/__tests__/demos/index.ts
================================================
export * from './element-node-extend';


================================================
FILE: packages/cli/template-extension/__tests__/index.html
================================================
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{{projectName}}</title>
    <style>
      body {
        margin: 0;
      }

      #container {
        width: 500px;
        height: 500px;
      }
    </style>
  </head>
  <body>
    <div id="container"></div>
    <script type="module" src="./main.ts"></script>
  </body>
</html>


================================================
FILE: packages/cli/template-extension/__tests__/main.ts
================================================
import type { Controller } from 'lil-gui';
import GUI from 'lil-gui';
import _ from 'lodash';
import * as demos from './demos';

const { toUpper, snakeCase } = _;
const demoNames = Object.keys(demos);

const options = {
  demo: '',
};

const customForm: Controller[] = [];

const panel = new GUI({ autoPlace: true });
const __STORAGE__ = `__` + toUpper(snakeCase('{{projectName}}')) + `_DEMO__`;
const load = () => {
  const data = localStorage.getItem(__STORAGE__);
  if (data) panel.load(JSON.parse(data));
};
const save = () => {
  localStorage.setItem(__STORAGE__, JSON.stringify(panel.save()));
};
panel
  .add(options, 'demo', demoNames)
  .name('Demo')
  .onChange((name: string) => {
    render(name);
    save();
  });
load();

function initContainer() {
  const container = document.getElementById('container')!;
  container.innerHTML = '';
  return container;
}

function initContext() {
  const container = initContainer();
  return { container, width: 500, height: 500 };
}

async function render(name: string) {
  destroyForm();
  const context = initContext();
  const demo = demos[name as keyof typeof demos];
  const graph = await demo(context);
  customForm.push(...(demo?.form?.(panel) || []));
  Object.assign(window, { graph });
}

function destroyForm() {
  customForm.forEach((controller) => controller.destroy());
  customForm.length = 0;
}


================================================
FILE: packages/cli/template-extension/__tests__/setup.ts
================================================
import './utils/use-snapshot-matchers';


================================================
FILE: packages/cli/template-extension/__tests__/types.d.ts
================================================
import type { Graph, GraphOptions } from '@antv/g6';
import type { Controller, GUI } from 'lil-gui';

declare global {
  export interface TestCase {
    (context: GraphOptions): Promise<Graph>;
    form?: (gui: GUI) => Controller[];
  }

  export type TestContext = GraphOptions;
}


================================================
FILE: packages/cli/template-extension/__tests__/unit/default.spec.ts
================================================
describe('suite', () => {
  it('case', () => {
    expect(1).toBe(1);
  });
});


================================================
FILE: packages/cli/template-extension/__tests__/unit/elements/nodes/extend.spec.ts
================================================
import { elementNodeExtend } from '@@/demos';
import { createDemoGraph } from '@@/utils/index';
import type { Graph } from '@antv/g6';

describe('element node circle', () => {
  let graph: Graph;

  beforeAll(async () => {
    graph = await createDemoGraph(elementNodeExtend);
  });

  afterAll(() => {
    graph.destroy();
  });

  it('should render an extended node', async () => {
    await expect(graph).toMatchSnapshot(__filename);
  });
});


================================================
FILE: packages/cli/template-extension/__tests__/utils/create.ts
================================================
import { resetEntityCounter } from '@antv/g';
import { Renderer as CanvasRenderer } from '@antv/g-canvas';
import { Renderer as SVGRenderer } from '@antv/g-svg';
import { Graph } from '@antv/g6';
import { OffscreenCanvasContext } from './offscreen-canvas-context';

function getRenderer(renderer: string) {
  switch (renderer) {
    case 'svg':
      return new SVGRenderer();
    case 'webgl':
    case 'canvas':
      return new CanvasRenderer();
    default:
      return new SVGRenderer();
  }
}

/**
 * Create graph canvas with config.
 * @param dom - dom
 * @param width - width
 * @param height - height
 * @param renderer - render
 * @returns instance
 */
export function createGraphCanvas(
  dom?: null | HTMLElement,
  width: number = 500,
  height: number = 500,
  renderer: string = 'svg',
) {
  const container = dom || document.createElement('div');
  container.style.width = `${width}px`;
  container.style.height = `${height}px`;

  resetEntityCounter();
  const offscreenNodeCanvas = {
    getContext: () => context,
  } as unknown as HTMLCanvasElement;
  const context = new OffscreenCanvasContext(offscreenNodeCanvas);

  return {
    container,
    width,
    height,
    renderer: () => getRenderer(renderer),
    document: container.ownerDocument,
    offscreenCanvas: offscreenNodeCanvas,
  };
}

export async function createDemoGraph(demo: TestCase, context?: Partial<TestContext>): Promise<Graph> {
  const canvasOptions = createGraphCanvas(document.getElementById('container'));
  return demo({ animation: false, ...canvasOptions, theme: 'light', ...context });
}


================================================
FILE: packages/cli/template-extension/__tests__/utils/dir.ts
================================================
import path from 'path';

/**
 * <zh/> 获取快照目录
 *
 * <en/> Get snapshot directory
 * @param dir - __filename
 * @param detail - <zh/> 快照详情 | <en/> snapshot detail
 * @returns <zh/> 快照目录 | <en/> snapshot directory
 */
export function getSnapshotDir(dir: string, detail: string = 'default'): [string, string] {
  const root = process.cwd();
  const subDir = dir.replace(root, '').replace('__tests__/unit/', '').replace('.spec.ts', '');
  const outputDir = path.join(root, '__tests__', 'snapshots', subDir);
  return [outputDir, detail];
}


================================================
FILE: packages/cli/template-extension/__tests__/utils/index.ts
================================================
export { createDemoGraph } from './create';


================================================
FILE: packages/cli/template-extension/__tests__/utils/offscreen-canvas-context.ts
================================================
// Computed as round(measureText(text).width * 10) at 10px system-ui. For
// characters that are not represented in this map, we’d ideally want to use a
// weighted average of what we expect to see. But since we don’t really know
// what that is, using “e” seems reasonable.
const defaultWidthMap: Record<string, number> = {
  a: 56,
  b: 63,
  c: 57,
  d: 63,
  e: 58,
  f: 37,
  g: 62,
  h: 60,
  i: 26,
  j: 26,
  k: 55,
  l: 26,
  m: 88,
  n: 60,
  o: 60,
  p: 62,
  q: 62,
  r: 39,
  s: 54,
  t: 38,
  u: 60,
  v: 55,
  w: 79,
  x: 54,
  y: 55,
  z: 55,
  A: 69,
  B: 67,
  C: 73,
  D: 74,
  E: 61,
  F: 58,
  G: 76,
  H: 75,
  I: 28,
  J: 55,
  K: 67,
  L: 58,
  M: 89,
  N: 75,
  O: 78,
  P: 65,
  Q: 78,
  R: 67,
  S: 65,
  T: 65,
  U: 75,
  V: 69,
  W: 98,
  X: 69,
  Y: 67,
  Z: 67,
  0: 64,
  1: 48,
  2: 62,
  3: 64,
  4: 66,
  5: 63,
  6: 65,
  7: 58,
  8: 65,
  9: 65,
  ' ': 29,
  '!': 32,
  '"': 49,
  "'": 31,
  '(': 39,
  ')': 39,
  ',': 31,
  '-': 48,
  '.': 31,
  '/': 32,
  ':': 31,
  ';': 31,
  '?': 52,
  '‘': 31,
  '’': 31,
  '“': 47,
  '”': 47,
  '…': 82,
};

export function measureText(text: string, fontSize: number) {
  let sum = 0;
  for (let i = 0; i < text.length; i++) {
    sum += ((defaultWidthMap[text[i]] ?? 100) * fontSize) / 100;
  }
  return sum;
}

export class OffscreenCanvasContext {
  private fontSize!: number;

  constructor(public canvas: HTMLCanvasElement) {}

  set font(font: string) {
    // `${fontStyle} ${fontVariant} ${fontWeight} ${fontSizeString}
    const [, , , fontSizeString] = font.split(' ');
    const fontSize = parseFloat(fontSizeString.replace('px', ''));
    this.fontSize = fontSize;
  }

  fillRect() {}
  fillText() {}
  getImageData(sx: number, sy: number, sw: number, sh: number) {
    return {
      // ignore ascent and descent
      data: new Uint8ClampedArray(sw * sh * 4).fill(0),
    };
  }

  measureText(text: string) {
    return {
      width: measureText(text, this.fontSize),
      actualBoundingBoxAscent: 0,
      actualBoundingBoxDescent: 0,
      actualBoundingBoxLeft: 0,
      actualBoundingBoxRight: 0,
      fontBoundingBoxAscent: 0,
      fontBoundingBoxDescent: 0,
    };
  }
}


================================================
FILE: packages/cli/template-extension/__tests__/utils/sleep.ts
================================================
export function sleep(n: number) {
  return new Promise((resolve) => {
    setTimeout(resolve, n);
  });
}


================================================
FILE: packages/cli/template-extension/__tests__/utils/svg-transformer.js
================================================
module.exports = {
  process() {
    return {
      code: `module.exports = {};`,
    };
  },
};


================================================
FILE: packages/cli/template-extension/__tests__/utils/to-match-svg-snapshot.ts
================================================
import type { Canvas, IAnimation } from '@antv/g';
import type { Graph, IAnimateEvent } from '@antv/g6';
import chalk from 'chalk';
import * as fs from 'fs';
import * as path from 'path';
import format from 'xml-formatter';
import xmlserializer from 'xmlserializer';
import { getSnapshotDir } from './dir';
import { sleep } from './sleep';

export type ToMatchSVGSnapshotOptions = {
  fileFormat?: string;
  keepSVGElementId?: boolean;
};
const formatSVG = (svg: string, keepSVGElementId: boolean) => {
  return (keepSVGElementId ? svg : svg.replace(/ *id="[^"]*" */g, ' ').replace(/clip-path="[^"]*"/g, '')).replace(
    '\r\n',
    '\n',
  );
};

// @see https://jestjs.io/docs/26.x/expect#expectextendmatchers
export async function toMatchSVGSnapshot(
  gCanvas: Canvas | Canvas[],
  dir: string,
  name: string,
  options: ToMatchSVGSnapshotOptions = {},
): Promise<{ message: () => string; pass: boolean }> {
  await sleep(300);

  const { fileFormat = 'svg', keepSVGElementId = false } = options;
  const namePath = path.join(dir, name);
  const actualPath = path.join(dir, `${name}-actual.${fileFormat}`);
  const expectedPath = path.join(dir, `${name}.${fileFormat}`);
  const gCanvases = Array.isArray(gCanvas) ? gCanvas : [gCanvas];

  let actual: string = '';

  // Clone <svg>
  const svg = (gCanvases[0].getContextService().getDomElement() as unknown as SVGElement).cloneNode(true) as SVGElement;
  const gRoot = svg.querySelector('#g-root');

  gCanvases.slice(1).forEach((gCanvas) => {
    const dom = (gCanvas.getContextService().getDomElement() as unknown as SVGElement).cloneNode(true) as SVGElement;
    // @ts-expect-error dom is SVGElement
    gRoot?.append(...(dom.querySelector('#g-root')?.childNodes || []));
  });

  actual += svg
    ? formatSVG(format(xmlserializer.serializeToString(svg as any), { indentation: '  ' }), keepSVGElementId)
    : '';

  try {
    if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
    if (!fs.existsSync(expectedPath)) {
      if (process.env.CI === 'true') {
        throw new Error(`Please generate golden image for ${namePath}`);
      }
      console.warn(`! generate ${namePath}`);
      fs.writeFileSync(expectedPath, actual);
      return {
        message: () => `generate ${namePath}`,
        pass: true,
      };
    } else {
      const expected = fs.readFileSync(expectedPath, {
        encoding: 'utf8',
        flag: 'r',
      });
      if (actual === expected) {
        if (fs.existsSync(actualPath)) fs.unlinkSync(actualPath);
        return {
          message: () => `match ${namePath}`,
          pass: true,
        };
      }

      // Perverse actual file.
      if (actual) fs.writeFileSync(actualPath, actual);

      const formatPath = (p: string) => p.split('/g6/')[1];
      return {
        message: () =>
          `mismatch: \n expected: ${chalk.green(formatPath(expectedPath))}\n received: ${chalk.red(formatPath(actualPath))}`,
        pass: false,
      };
    }
  } catch (e) {
    return {
      message: () => `${e}`,
      pass: false,
    };
  }
}

export async function toMatchSnapshot(
  graph: Graph,
  dir: string,
  detail?: string,
  options: ToMatchSVGSnapshotOptions = {},
) {
  return await toMatchSVGSnapshot(
    Object.values(graph.getCanvas().getLayers()),
    ...getSnapshotDir(dir, detail),
    options,
  );
}

export async function toMatchAnimation(
  graph: Graph,
  dir: string,
  frames: number[],
  operation: () => void | Promise<void>,
  detail = 'default',
  options: ToMatchSVGSnapshotOptions = {},
) {
  const animationPromise = new Promise<IAnimation>((resolve) => {
    graph.once<IAnimateEvent>('beforeanimate', (e) => {
      resolve(e.animation!);
    });
  });

  await operation();

  const animation = await animationPromise;

  animation.pause();

  for (const frame of frames) {
    animation.currentTime = frame;
    await sleep(32);
    const result = await toMatchSVGSnapshot(
      Object.values(graph.getCanvas().getCanvases().canvas),
      ...getSnapshotDir(dir, `${detail}-${frame}`),
      options,
    );

    if (!result.pass) {
      return result;
    }
  }

  return {
    message: () => `match ${detail}`,
    pass: true,
  };
}


================================================
FILE: packages/cli/template-extension/__tests__/utils/use-snapshot-matchers.ts
================================================
import {
  ToMatchSVGSnapshotOptions,
  toMatchAnimation,
  toMatchSVGSnapshot,
  toMatchSnapshot,
} from './to-match-svg-snapshot';

declare global {
  // eslint-disable-next-line @typescript-eslint/no-namespace
  namespace jest {
    interface Matchers<R> {
      toMatchSVGSnapshot(dir: string, name: string, options?: ToMatchSVGSnapshotOptions): Promise<R>;
      toMatchSnapshot(dir: string, detail?: string, options?: ToMatchSVGSnapshotOptions): Promise<R>;
      toMatchAnimation(
        dir: string,
        frames: number[],
        operation: () => void | Promise<void>,
        detail?: string,
        options?: ToMatchSVGSnapshotOptions,
      ): Promise<R>;
    }
  }
}

expect.extend({
  toMatchSVGSnapshot,
  toMatchSnapshot,
  toMatchAnimation,
});


================================================
FILE: packages/cli/template-extension/jest.config.js
================================================
// Installing third-party modules by tnpm or cnpm will name modules with underscore as prefix.
// In this case _{module} is also necessary.
const esm = ['internmap', 'd3-*', 'lodash-es', 'chalk'].map((d) => `_${d}|${d}`).join('|');

module.exports = {
  testTimeout: 100000,
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['./__tests__/setup.ts'],
  transform: {
    '^.+\\.[tj]s$': ['@swc/jest'],
    '^.+\\.svg$': ['<rootDir>/__tests__/utils/svg-transformer.js'],
  },
  collectCoverageFrom: ['src/**/*.ts'],
  moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
  collectCoverage: false,
  testRegex: '(/__tests__/.*\\.(test|spec))\\.(ts|tsx|js)$',
  // Transform esm to cjs.
  transformIgnorePatterns: [`<rootDir>/node_modules/(?!(${esm}))`],
  testPathIgnorePatterns: ['/(lib|esm)/__tests__/'],
  moduleNameMapper: {
    '^@@/(.*)$': '<rootDir>/__tests__/$1',
    '^@/(.*)$': '<rootDir>/$1',
  },
};


================================================
FILE: packages/cli/template-extension/package.json
================================================
{
  "name": "g6-extension-test",
  "version": "0.0.1",
  "description": "Extension for G6",
  "repository": {
    "type": "git",
    "url": ""
  },
  "license": "MIT",
  "main": "lib/index.js",
  "module": "esm/index.js",
  "types": "lib/index.d.ts",
  "scripts": {
    "build:cjs": "rimraf ./lib && tsc --module commonjs --outDir lib -p tsconfig.build.json",
    "build:esm": "rimraf ./esm && tsc --module ESNext --outDir esm -p tsconfig.build.json",
    "build:umd": "rimraf ./dist && rollup -c",
    "build": "run-p build:*",
    "dev": "vite",
    "fix": "eslint ./src ./__tests__ --fix && prettier ./src __tests__ --write ",
    "lint": "eslint ./src __tests__ --quiet && prettier ./src __tests__ --check",
    "test": "jest"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "lint-staged": {
    "*.{ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  },
  "dependencies": {
    "@antv/g6": "^5.0.0"
  },
  "devDependencies": {
    "@antv/g": "^6.1.2",
    "@antv/g-canvas": "^2.0.18",
    "@antv/g-svg": "^2.0.15",
    "@commitlint/config-conventional": "^19.2.2",
    "@rollup/plugin-commonjs": "^25.0.7",
    "@rollup/plugin-node-resolve": "^15.2.3",
    "@rollup/plugin-terser": "^0.4.4",
    "@rollup/plugin-typescript": "^11.1.6",
    "@swc/jest": "^0.2.36",
    "@types/jest": "^29.5.12",
    "@types/node": "^20.12.12",
    "@types/xmlserializer": "^0.6.6",
    "@typescript-eslint/eslint-plugin": "^7.9.0",
    "@typescript-eslint/parser": "^7.9.0",
    "chalk": "^5.3.0",
    "eslint": "^8.57.0",
    "jest": "^29.7.0",
    "jest-environment-jsdom": "^29.7.0",
    "jsdom": "^23.2.0",
    "lil-gui": "^0.19.2",
    "lodash": "^4.17.21",
    "npm-run-all": "^4.1.5",
    "prettier": "^3.2.5",
    "prettier-plugin-organize-imports": "^3.2.4",
    "prettier-plugin-packagejson": "^2.5.0",
    "rimraf": "^5.0.7",
    "rollup": "^4.17.2",
    "rollup-plugin-polyfill-node": "^0.13.0",
    "rollup-plugin-visualizer": "^5.12.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.4.5",
    "vite": "^5.2.11",
    "xmlserializer": "^0.6.1"
  },
  "peerDependencies": {
    "@antv/g": "^6.1.2",
    "@antv/g-canvas": "^2.0.18"
  }
}


================================================
FILE: packages/cli/template-extension/rollup.config.mjs
================================================
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import typescript from '@rollup/plugin-typescript';
import _ from 'lodash';
import nodePolyfills from 'rollup-plugin-polyfill-node';
import { visualizer } from 'rollup-plugin-visualizer';

const { camelCase, upperFirst } = _;
const isBundleVis = !!process.env.BUNDLE_VIS;

export default [
  {
    input: 'src/index.ts',
    output: {
      file: 'dist/{{projectName}}.min.js',
      name: upperFirst(camelCase('{{projectName}}')),
      format: 'umd',
      sourcemap: false,
    },
    plugins: [
      nodePolyfills(),
      resolve(),
      commonjs(),
      typescript({
        tsconfig: 'tsconfig.build.json',
      }),
      terser(),
      ...(isBundleVis ? [visualizer()] : []),
    ],
  },
];


================================================
FILE: packages/cli/template-extension/src/elements/index.ts
================================================
export * from './nodes';


================================================
FILE: packages/cli/template-extension/src/elements/nodes/extend-node.ts
================================================
import type { CircleStyleProps } from '@antv/g6';
import { Circle } from '@antv/g6';

export interface ExtendNodeStyleProps extends CircleStyleProps {}

export class ExtendNode extends Circle {}


================================================
FILE: packages/cli/template-extension/src/elements/nodes/index.ts
================================================
export { ExtendNode } from './extend-node';

export type { ExtendNodeStyleProps } from './extend-node';


================================================
FILE: packages/cli/template-extension/src/exports.ts
================================================
export { ExtendNode } from './elements';


================================================
FILE: packages/cli/template-extension/src/index.ts
================================================
export * from './exports';


================================================
FILE: packages/cli/template-extension/tsconfig.build.json
================================================
{
  "compilerOptions": {
    "paths": {}
  },
  "include": ["src/**/*"],
  "extends": "./tsconfig.json"
}


================================================
FILE: packages/cli/template-extension/tsconfig.json
================================================
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "baseUrl": ".",
    "declaration": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "isolatedModules": true,
    "lib": ["DOM", "ESNext"],
    "module": "esnext",
    "moduleResolution": "Node",
    "outDir": "lib",
    "pretty": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "sourceRoot": "src",
    "strict": true,
    "target": "ES6",
    "types": ["@types/jest", "node"],
    "paths": {
      "@/*": ["./*"],
      "@@/*": ["__tests__/*"]
    }
  },
  "exclude": ["node_modules", "dist", "lib", "esm"],
  "include": ["src/**/*", "__tests__/**/*"]
}


================================================
FILE: packages/cli/template-extension/vite.config.js
================================================
import path from 'path';
import { defineConfig } from 'vite';

export default defineConfig({
  root: './__tests__',
  server: {
    port: 8080,
    open: '/',
  },
  plugins: [
    {
      name: 'isolation',
      configureServer(server) {
        server.middlewares.use((_req, res, next) => {
          res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
          res.setHeader('Cross-Origin-Embedder-Policy', 'same-origin');
          next();
        });
      },
    },
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, '.'),
      '@@': path.resolve(__dirname, './__tests__'),
    },
  },
});


================================================
FILE: packages/cli/tsconfig.json
================================================
{
  "extends": "../../tsconfig.json",
  "include": ["build.config.ts", "src"],
  "compilerOptions": {}
}


================================================
FILE: packages/g6/.gitignore
================================================
__tests__/**/*-actual.*

README.*

================================================
FILE: packages/g6/__tests__/.eslintrc
================================================
{
  "rules": {
    "no-console": "off"
  }
}

================================================
FILE: packages/g6/__tests__/bugs/api-expand-element-z-index.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('api expand element z-index', () => {
  it('when expand element, the z-index of descendant elements should be updated', async () => {
    const graph = createGraph({
      animation: false,
      data: {
        nodes: [{ id: 'node-1' }, { id: 'node-2', combo: 'combo-2' }],
        combos: [
          { id: 'combo-1', style: { collapsed: true } },
          { id: 'combo-2', combo: 'combo-1', style: { collapsed: true } },
        ],
      },
    });

    await graph.draw();

    const getZIndexOf = (id: string): number => {
      // @ts-expect-error context is private
      const context = graph.context;
      return context.element!.getElement(id)!.style.zIndex;
    };

    expect(getZIndexOf('combo-1')).toBe(0);
    expect(getZIndexOf('node-1')).toBe(0);
    expect(graph.getComboData('combo-2').style?.zIndex).toBe(1);
    expect(graph.getNodeData('node-2').style?.zIndex).toBe(2);

    graph.frontElement('node-1');

    expect(getZIndexOf('node-1')).toBe(3);

    graph.frontElement('combo-1');

    expect(getZIndexOf('combo-1')).toBe(4);

    await graph.expandElement('combo-1', false);
    await graph.expandElement('combo-2', false);

    expect(getZIndexOf('combo-1')).toBe(4);
    expect(getZIndexOf('combo-2')).toBe(5);
    expect(getZIndexOf('node-2')).toBe(6);
  });
});


================================================
FILE: packages/g6/__tests__/bugs/api-focus-element-edge.spec.ts
================================================
import { behaviorDragNode } from '@@/demos';
import { createDemoGraph } from '@@/utils';

it('api focusElement edge', async () => {
  const graph = await createDemoGraph(behaviorDragNode, { animation: false });

  graph.translateBy([100, 100]);
  graph.zoomBy(2);

  graph.focusElement('node-3');

  await expect(graph).toMatchSnapshot(__filename);

  graph.focusElement('node-3-node-4');

  await expect(graph).toMatchSnapshot(__filename, 'focusElement edge');
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-click-select-drag-node.spec.ts
================================================
import { CommonEvent, NodeEvent } from '@/src';
import { createGraph } from '@@/utils';

describe('behavior drag-node with click select', () => {
  const createDemoGraph = async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', style: { x: 100, y: 100 } },
          { id: 'node-2', combo: 'combo-1', style: { x: 200, y: 100 } },
          { id: 'node-3', style: { x: 100, y: 200 } },
          { id: 'node-4', combo: 'combo-1', style: { x: 200, y: 200 } },
        ],
        edges: [
          { source: 'node-1', target: 'node-2' },
          { source: 'node-2', target: 'node-4' },
          { source: 'node-1', target: 'node-3' },
          { source: 'node-3', target: 'node-4' },
        ],
        combos: [{ id: 'combo-1' }],
      },
      node: { style: { size: 20 } },
      edge: {
        style: { endArrow: true },
      },
      behaviors: [{ type: 'drag-element' }, { type: 'click-select', multiple: true }],
    });
    await graph.render();
    return graph;
  };

  it('drag unselected node', async () => {
    const graph = await createDemoGraph();

    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });

    await expect(graph).toMatchSnapshot(__filename, 'click-node-1');

    // drag node-2
    graph.emit(NodeEvent.DRAG_START, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(NodeEvent.DRAG, { dx: 20, dy: 20 });
    graph.emit(NodeEvent.DRAG_END);

    await expect(graph).toMatchSnapshot(__filename, 'drag-node-2');
  });

  it('drag selected node', async () => {
    const graph = await createDemoGraph();

    graph.emit(CommonEvent.KEY_DOWN, { key: 'shift' });
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(CommonEvent.KEY_UP, { key: 'shift' });

    await expect(graph).toMatchSnapshot(__filename, 'click-node-1-node-2');

    // drag node-2
    graph.emit(NodeEvent.DRAG_START, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(NodeEvent.DRAG, { dx: 20, dy: 20 });
    graph.emit(NodeEvent.DRAG_END);

    await expect(graph).toMatchSnapshot(__filename, 'drag-node-1-node-2');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-click-select.spec.ts
================================================
import { CommonEvent, NodeEvent } from '@/src';
import { behaviorClickSelect } from '@@/demos';
import { createDemoGraph, createGraph } from '@@/utils';

describe('behavior click-select', () => {
  it('multiple select with degree 1', async () => {
    const graph = await createDemoGraph(behaviorClickSelect, { animation: false });
    graph.updateBehavior({ key: 'click-select', degree: 1, multiple: true });

    graph.emit(NodeEvent.CLICK, { target: { id: '29' }, targetType: 'node' });
    graph.emit(CommonEvent.KEY_DOWN, { key: 'shift' });
    graph.emit(NodeEvent.CLICK, { target: { id: '6' }, targetType: 'node' });
    graph.emit(CommonEvent.KEY_UP, { key: 'shift' });

    await expect(graph).toMatchSnapshot(__filename, 'multiple-shift-degree-1');

    graph.destroy();
  });

  it('update state by api', async () => {
    // 通过 api 更新状态导致 click-select 状态不同步
    // State updated by api causes click-select state to be out of sync

    const graph = createGraph({
      data: {
        nodes: [{ id: 'node-1', type: 'rect', style: { x: 50, y: 100 } }],
      },
      behaviors: [{ key: 'click-select', type: 'click-select' }],
    });

    await graph.draw();

    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });

    await expect(graph).toMatchSnapshot(__filename, 'state-selected');

    graph.setElementState({ 'node-1': [] });
    graph.addNodeData([{ id: 'node-2', type: 'rect', style: { x: 200, y: 200 }, states: ['selected'] }]);
    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'add-node-2');

    graph.emit(NodeEvent.CLICK, { target: { id: 'node-2' }, targetType: 'node' });

    await expect(graph).toMatchSnapshot(__filename, 'click-node-2');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-collapse-expand.spec.ts
================================================
import { ComboEvent, GraphEvent } from '@/src';
import { layoutAntVDagreFlowCombo } from '@@/demos';
import { createDemoGraph } from '@@/utils';

describe('behavior collapse expand', () => {
  it('collapse expand with no change element', async () => {
    // https://github.com/antvis/G6/issues/5951
    const graph = await createDemoGraph(layoutAntVDagreFlowCombo, { animation: true });

    // @ts-expect-error private method
    const comboA = graph.context.element.getElement('A');

    const click = jest.fn(async () => {
      await new Promise<void>((resolve) => {
        graph.on(GraphEvent.AFTER_ANIMATE, () => {
          resolve();
        });

        graph.emit(ComboEvent.DBLCLICK, { target: comboA, targetType: 'combo' });
      });
    });

    expect(click).not.toThrow();
  });
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-drag-element-combo.spec.ts
================================================
import { ComboEvent, Graph } from '@/src';
import { layoutAntVDagreFlowCombo } from '@@/demos';
import { createDemoGraph } from '@@/utils';

describe('behavior drag element combo', () => {
  let graph: Graph;

  beforeAll(async () => {
    graph = await createDemoGraph(layoutAntVDagreFlowCombo, { animation: false });
  });

  it('drag combo A over C', async () => {
    graph.emit(ComboEvent.DRAG_START, { target: { id: 'A' }, targetType: 'combo' });
    graph.emit(ComboEvent.DRAG, { dx: 100, dy: 0 });
    graph.emit(ComboEvent.DRAG_END, { target: { id: 'C' } });

    await expect(graph).toMatchSnapshot(__filename, 'drag-combo-A-over-C');
  });

  it('drag combo C over A', async () => {
    graph.emit(ComboEvent.DRAG_START, { target: { id: 'C' }, targetType: 'combo' });
    graph.emit(ComboEvent.DRAG, { dx: -10, dy: 0 });
    graph.emit(ComboEvent.DRAG_END, { target: { id: 'A' } });

    await expect(graph).toMatchSnapshot(__filename, 'drag-combo-C-over-A');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-drag-rotated-canvas.spec.ts
================================================
import type { Graph } from '@/src';
import { CommonEvent, NodeEvent } from '@/src';
import { bugDragRotatedCanvas } from '@@/demos';
import { createDemoGraph, dispatchCanvasEvent } from '@@/utils';

const fixed2 = (num: number): number => {
  return parseFloat(num.toFixed(2));
};

describe('behavior drag rotated canvas', () => {
  let graph: Graph;

  beforeAll(async () => {
    graph = await createDemoGraph(bugDragRotatedCanvas, { animation: false });
  });

  afterAll(() => {
    graph.destroy();
  });

  it('drag 30 rotated canvas', async () => {
    await graph.rotateTo(30);
    const [x, y] = graph.getPosition();

    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 10, y: 10 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);

    expect(graph.getRotation()).toBe(30);
    expect(graph.getPosition()).toBeCloseTo([x + 3.66, y + 13.66]);
  });

  it('drag 90 rotated canvas', async () => {
    await graph.rotateTo(90);
    const [x, y] = graph.getPosition();

    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 10, y: 20 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);

    expect(graph.getRotation()).toBe(90);
    expect(graph.getPosition()).toBeCloseTo([x - 20, y + 10]);
  });

  it('drag 180 rotated canvas', async () => {
    await graph.rotateTo(180);
    const [x, y] = graph.getPosition();

    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 10, y: 20 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);

    expect(graph.getRotation()).toBe(180);
    expect(graph.getPosition()).toBeCloseTo([x - 10, y - 20]);
  });

  it('drag 270 rotated canvas', async () => {
    await graph.rotateTo(270);
    const [x, y] = graph.getPosition();

    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 10, y: 20 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);

    expect(graph.getRotation()).toBe(270);
    expect(graph.getPosition()).toBeCloseTo([x + 20, y - 10]);
  });

  it.each([
    { name: 'element', id: 'node1', targetType: 'node' },
    { name: 'combo', id: 'comboA', targetType: 'combo' },
  ])('drag $name when 30 rotated canvas', async ({ id, targetType }) => {
    await graph.rotateTo(30);

    const [x, y] = graph.getElementPosition(id);

    graph.emit(NodeEvent.DRAG_START, { target: { id: id }, targetType });
    graph.emit(NodeEvent.DRAG, { dx: 10, dy: 10 });
    graph.emit(NodeEvent.DRAG_END, { target: { id: id }, targetType });

    expect(graph.getRotation()).toBe(30);
    const [nextX, nextY] = graph.getElementPosition(id);
    expect(fixed2(nextX)).toBeCloseTo(fixed2(x + 3.66));
    expect(fixed2(nextY)).toBeCloseTo(fixed2(y + 13.66));
  });
});


================================================
FILE: packages/g6/__tests__/bugs/behaviors-multiple-conflict.spec.ts
================================================
import { createGraph, dispatchCanvasEvent } from '@@/utils';
import { CommonEvent, NodeEvent } from '@antv/g6';

describe('bugs:multiple-conflict', () => {
  it('drag element, drag canvas', async () => {
    const graph = createGraph({
      data: {
        nodes: [{ id: 'node-1', style: { x: 50, y: 50, size: 20 } }],
      },
      behaviors: ['drag-element', 'drag-canvas'],
    });

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename);

    // drag canvas
    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 10, y: 10 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);
    await expect(graph).toMatchSnapshot(__filename, 'drag-canvas');

    // drag element
    graph.emit(NodeEvent.DRAG_START, { target: { id: 'node-1' }, targetType: 'node' });
    graph.emit(NodeEvent.DRAG, { dx: 10, dy: 10 });
    graph.emit(NodeEvent.DRAG_END);
    await expect(graph).toMatchSnapshot(__filename, 'drag-element');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/brush-select.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('BrushSelect clear states issue', () => {
  it('Should not clear states except selection state', async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', style: { x: 250, y: 150 } },
          { id: 'node-3', style: { x: 250, y: 300 } },
        ],
        edges: [{ id: 'edge-1', source: 'node-1', target: 'node-3' }],
      },
      behaviors: ['brush-select'],
    });

    await graph.draw();
    graph.setElementState({ 'edge-1': ['selected', 'active', 'custom-state'] });

    const currentStates = graph.getElementState('edge-1');
    expect(currentStates).toEqual(['selected', 'active', 'custom-state']);

    await graph.emit('canvas:click');

    const newStates = graph.getElementState('edge-1');
    console.log(newStates);
    expect(newStates).toEqual(['active', 'custom-state']);
  });
});


================================================
FILE: packages/g6/__tests__/bugs/continuous-invoke.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('bugs:continuous-invoke', () => {
  it('continuous invoke', () => {
    const graph = createGraph({});
    const fn = jest.fn(async () => {
      graph.destroy();
      await graph.render();
    });

    expect(fn).rejects.toThrow();
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-combo-drag.spec.ts
================================================
import { NodeEvent } from '@/src';
import { createGraph } from '@@/utils';

describe('bugs:element-combo-drag', () => {
  it('drag combo', async () => {
    const graph = createGraph({
      animation: false,
      data: {
        nodes: [
          { id: 'node-0', combo: 'combo-0', style: { x: 100, y: 100 } },
          { id: 'node-1', combo: 'combo-0', style: { x: 150, y: 100 } },
          { id: 'node-2', style: { x: 250, y: 100 } },
        ],
        edges: [{ source: 'node-1', target: 'node-2' }],
        combos: [{ id: 'combo-0' }],
      },
      behaviors: ['drag-element'],
    });

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename);

    await graph.collapseElement('combo-0');

    await expect(graph).toMatchSnapshot(__filename, 'collapse-combo-0');

    graph.emit(NodeEvent.DRAG_START, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(NodeEvent.DRAG, { dx: 50, dy: 50 });
    graph.emit(NodeEvent.DRAG_END, { target: { id: 'node-2' }, targetType: 'node' });
    await expect(graph).toMatchSnapshot(__filename, 'drag-node-2');

    graph.emit(NodeEvent.DRAG_START, { target: { id: 'combo-0' }, targetType: 'combo' });
    graph.emit(NodeEvent.DRAG, { dx: 50, dy: 50 });
    graph.emit(NodeEvent.DRAG_END, { target: { id: 'combo-0' }, targetType: 'combo' });
    await expect(graph).toMatchSnapshot(__filename, 'drag-combo-0');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-custom-state-switch.spec.ts
================================================
import { createGraph } from '@@/utils';
import { CanvasEvent, CommonEvent, NodeEvent } from '@antv/g6';

describe('bug: element-custom-state-switch', () => {
  it('single select', async () => {
    const graph = createGraph({
      data: {
        nodes: [{ id: 'node-1', states: ['important'], style: { x: 100, y: 100 } }],
      },
      node: {
        style: {
          fill: 'red',
        },
        state: {
          important: {
            fill: 'green',
          },
        },
      },
      behaviors: [
        {
          type: 'click-select',
        },
      ],
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'single');

    expect(graph.getElementState('node-1')).toEqual(['important']);

    // click
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });

    expect(graph.getElementState('node-1')).toEqual(['important', 'selected']);

    await expect(graph).toMatchSnapshot(__filename, 'single-select');

    // click again
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });

    expect(graph.getElementState('node-1')).toEqual(['important']);

    await expect(graph).toMatchSnapshot(__filename, 'single');
  });

  it('multiple select', async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', states: ['important'], style: { x: 100, y: 100 } },
          { id: 'node-2', style: { x: 150, y: 100 } },
        ],
      },
      node: {
        style: {
          fill: 'red',
        },
        state: {
          important: {
            fill: 'green',
          },
        },
      },
      behaviors: [
        {
          type: 'click-select',
          multiple: true,
        },
      ],
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'multiple');

    graph.emit(NodeEvent.CLICK, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(CommonEvent.KEY_DOWN, { key: 'shift' });
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });
    // graph.emit(CommonEvent.KEY_UP, { key: 'shift' });

    expect(graph.getElementState('node-1')).toEqual(['important', 'selected']);
    expect(graph.getElementState('node-2')).toEqual(['selected']);

    await expect(graph).toMatchSnapshot(__filename, 'multiple-select');

    // unselect
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });
    expect(graph.getElementState('node-1')).toEqual(['important']);
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-2' }, targetType: 'node' });
    expect(graph.getElementState('node-2')).toEqual([]);

    await expect(graph).toMatchSnapshot(__filename, 'multiple');

    // reselect
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-1' }, targetType: 'node' });
    graph.emit(NodeEvent.CLICK, { target: { id: 'node-2' }, targetType: 'node' });
    graph.emit(CommonEvent.KEY_UP, { key: 'shift' });

    // click canvas
    graph.emit(CanvasEvent.CLICK);
    expect(graph.getElementState('node-1')).toEqual(['important']);
    expect(graph.getElementState('node-2')).toEqual([]);

    await expect(graph).toMatchSnapshot(__filename, 'multiple-unselect');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-edge-update-arrow.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('bug: element-edge-update-arrow', () => {
  it('should update edge arrow', async () => {
    const graph = createGraph({
      animation: false,
      data: {
        nodes: [
          { id: 'node-0', style: { x: 100, y: 100 } },
          { id: 'node-1', style: { x: 200, y: 100 } },
        ],
        edges: [
          {
            source: 'node-0',
            target: 'node-1',
            style: { startArrow: true, startArrowFill: 'red', endArrow: true, endArrowFill: 'green' },
          },
        ],
      },
    });

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename);

    graph.updateEdgeData([
      {
        source: 'node-0',
        target: 'node-1',
        style: { startArrowFill: 'purple', startArrowStroke: 'blue', endArrowFill: 'pink', endArrowStroke: 'yellow' },
      },
    ]);

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename, 'update-arrow');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-node-collapse.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('bugs:element-node-collapse', () => {
  it('collapse or expand a node should not throw error', async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node1', combo: 'combo1', style: { x: 250, y: 150 } },
          { id: 'node2', combo: 'combo1', style: { x: 350, y: 150 } },
          { id: 'node3', combo: 'combo2', style: { x: 250, y: 300 } },
        ],
        combos: [
          { id: 'combo1', combo: 'combo2' },
          { id: 'combo2', style: {} },
        ],
      },
      combo: {
        style: {
          labelText: (d) => d.id,
          labelPadding: [1, 5],
          labelFill: '#fff',
          labelBackground: true,
          labelBackgroundRadius: 10,
          labelBackgroundFill: '#7863FF',
        },
      },
    });

    await graph.render();

    const fn = async () => {
      await graph.collapseElement('node1', false);
      await graph.expandElement('node2', false);
    };

    expect(fn).not.toThrow();
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-node-icon-switch.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('bug: element-node-icon-switch', () => {
  it('change node icon', async () => {
    const graph = createGraph({
      animation: false,
      data: {
        nodes: [{ id: 'node-1', style: { x: 50, y: 50, iconText: 'Text' } }],
      },
      node: {
        style: {},
      },
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'text-icon');

    graph.updateNodeData([
      {
        id: 'node-1',
        style: {
          iconText: '',
          iconSrc: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*AzSISZeq81IAAAAAAAAAAAAADmJ7AQ/original',
        },
      },
    ]);

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'image-icon');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-node-update-badge.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('bug: element-node-update-badge', () => {
  it('should update node badge', async () => {
    const graph = createGraph({
      animation: false,
      node: {
        style: {
          badge: true,
          badges: [{ text: '1' }],
          badgeFill: 'white',
          badgeBackgroundFill: 'red',
        },
      },
      data: {
        nodes: [{ id: 'node-0', style: { x: 100, y: 100 }, states: ['inactive'] }],
      },
    });

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename);

    graph.setElementState('node-0', []);

    await graph.render();

    await expect(graph).toMatchSnapshot(__filename, 'update-node-badge');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-orth-router.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('element orth router', () => {
  it('test polyline orth', async () => {
    const graph = createGraph({
      animation: true,
      data: {
        nodes: [
          {
            id: 'node-1',
            style: { x: 310, y: 280, size: 80 },
          },
          {
            id: 'node-2',
            style: { x: 300, y: 175 },
          },
        ],
        edges: [{ id: 'edge-1', source: 'node-1', target: 'node-2' }],
      },
      edge: {
        type: 'polyline',
        style: {
          router: { type: 'orth' },
        },
      },
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename);
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-port-rotate.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('element port rotate', () => {
  it('default', async () => {
    const graph = createGraph({
      data: {
        nodes: [{ id: 'node-1', style: { x: 100, y: 100 } }],
      },
      node: {
        type: 'rect',
        style: {
          size: [50, 150],
          port: true,
          portR: 3,
          ports: [
            { key: 'port-1', placement: [0, 0.15] },
            { key: 'port-2', placement: 'left' },
            { key: 'port-3', placement: [0, 0.85] },
          ],
          transform: [['rotate', 45]],
        },
      },
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename);
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-remove-combo.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('element remove combo', () => {
  it('remove combo', async () => {
    const graph = createGraph({
      animation: true,
      data: {
        nodes: [
          { id: 'node-1', data: {}, combo: 'combo-1' },
          { id: 'node-2', data: {}, combo: 'combo-1' },
          { id: 'node-3', data: {}, combo: 'combo-1' },
        ],
        combos: [
          { id: 'combo-1', data: {}, combo: 'combo-2' },
          { id: 'combo-2', data: {}, style: {} },
        ],
      },
      layout: {
        type: 'force',
      },
    });

    await graph.draw();

    graph.removeComboData(['combo-1']);

    const draw = jest.fn(async () => {
      await graph.draw();
    });

    expect(draw).not.toThrow();
  });
});


================================================
FILE: packages/g6/__tests__/bugs/element-set-position-to-origin.spec.ts
================================================
import type { ID } from '@/src';
import { createGraph } from '@@/utils';

describe('element set position to origin', () => {
  it('suite 1', async () => {
    const graph = createGraph({
      data: {
        nodes: [{ id: 'node-1' }],
      },
    });

    await graph.draw();

    // @ts-expect-error Property 'context' is protected
    const getElementOf = (id: ID) => graph.context.element!.getElement(id)!;

    expect(graph.getNodeData('node-1').style).toEqual({ zIndex: 0 });
    expect(getElementOf('node-1').style.transform).toEqual([['translate', 0, 0]]);

    graph.translateElementTo('node-1', [100, 100]);

    expect(graph.getNodeData('node-1').style).toEqual({ x: 100, y: 100, z: 0, zIndex: 0 });
    expect(getElementOf('node-1').style.transform).toEqual([['translate', 100, 100]]);

    graph.translateElementTo('node-1', [0, 0]);

    expect(graph.getNodeData('node-1').style).toEqual({ x: 0, y: 0, z: 0, zIndex: 0 });
    expect(getElementOf('node-1').style.transform).toEqual([['translate', 0, 0]]);
  });
});


================================================
FILE: packages/g6/__tests__/bugs/fit-view.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('fit view', () => {
  it('suite 1', async () => {
    // https://github.com/antvis/G6/issues/5943
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', style: { x: 250, y: 150 } },
          { id: 'node-2', style: { x: 350, y: 150 } },
          { id: 'node-3', style: { x: 250, y: 300 } },
        ],
      },
      behaviors: ['zoom-canvas'],
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename);

    // wheel
    graph.emit('wheel', { deltaY: 5 });
    graph.emit('wheel', { deltaY: 5 });

    await expect(graph).toMatchSnapshot(__filename, 'after-wheel');

    // fit center
    await graph.fitCenter();
    await graph.fitCenter();
    await expect(graph).toMatchSnapshot(__filename, 'after-fit-center');

    // fit view
    await graph.fitView();
    await expect(graph).toMatchSnapshot(__filename, 'after-fit-view');

    // fit center again
    await graph.fitCenter();
    await expect(graph).toMatchSnapshot(__filename, 'after-fit-center-again');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/focus-element.spec.ts
================================================
import { CommonEvent, NodeEvent } from '@/src';
import { createGraph, dispatchCanvasEvent } from '@@/utils';

describe('focus element', () => {
  it('focus after drag', async () => {
    // https://github.com/antvis/G6/issues/5955
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', style: { x: 250, y: 150 } },
          { id: 'node-2', style: { x: 350, y: 150 } },
          { id: 'node-3', style: { x: 250, y: 300 } },
        ],
      },
      behaviors: ['zoom-canvas', 'drag-canvas'],
    });

    await graph.draw();

    dispatchCanvasEvent(graph, CommonEvent.DRAG_START, { targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG, { movement: { x: 100, y: 100 }, targetType: 'canvas' });
    dispatchCanvasEvent(graph, CommonEvent.DRAG_END);

    await expect(graph).toMatchSnapshot(__filename, 'focus-before-drag');

    await graph.focusElement('node-1');

    await expect(graph).toMatchSnapshot(__filename, 'focus-after-drag');
  });

  it('hover after focus', async () => {
    // https://github.com/antvis/G6/issues/5925
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', style: { x: 250, y: 150 } },
          { id: 'node-2', style: { x: 350, y: 150 } },
          { id: 'node-3', style: { x: 250, y: 300 } },
        ],
      },
      behaviors: ['zoom-canvas', 'hover-activate'],
    });

    await graph.draw();

    await expect(graph).toMatchSnapshot(__filename, 'hover-before-focus');

    await graph.focusElement('node-1');

    graph.emit(NodeEvent.POINTER_ENTER, {
      target: { id: 'node-2' },
      targetType: 'node',
      type: CommonEvent.POINTER_ENTER,
    });

    await expect(graph).toMatchSnapshot(__filename, 'hover-after-focus');
  });
});


================================================
FILE: packages/g6/__tests__/bugs/graph-draw-after-clear.spec.ts
================================================
import { elementEdgeLine } from '@@/demos';
import { createDemoGraph, sleep } from '@@/utils';

it('graph draw after clear', async () => {
  const graph = await createDemoGraph(elementEdgeLine);

  const data = graph.getData();

  await graph.clear();

  await expect(graph).toMatchSnapshot(__filename, 'blank');

  await sleep(200);

  graph.addData(data);
  await graph.draw();

  await expect(graph).toMatchSnapshot(__filename);
});


================================================
FILE: packages/g6/__tests__/bugs/model-add-edge-in-combo.spec.ts
================================================
import { createGraph } from '@@/utils';

describe('add edge in combo', () => {
  it('add edge in combo without zIndex', async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', combo: 'combo-1', style: { x: 100, y: 100 } },
          { id: 'node-2', combo: 'combo-1', style: { x: 200, y: 200 } },
        ],
        combos: [{ id: 'combo-1' }],
      },
    });

    await graph.draw();

    expect(graph.getComboData('combo-1').style?.zIndex).toBe(0);
    expect(graph.getNodeData('node-1').style?.zIndex).toBe(1);

    graph.addEdgeData([{ id: 'edge', source: 'node-1', target: 'node-2' }]);
    await graph.draw();

    expect(graph.getEdgeData('edge').style?.zIndex).toBe(0);
    // @ts-expect-error skip the type check
    expect(graph.context.element?.getElement('edge')?.style.zIndex).toBe(0);
  });

  it('add edge in combo with zIndex', async () => {
    const graph = createGraph({
      data: {
        nodes: [
          { id: 'node-1', combo: 'combo-1', style: { x: 100, y: 100 } },
          { id: 'node-2', combo: 'combo-1', style: { x: 200, y: 200 } },
          { id: 'node-3', style: { x: 300, y: 300, zIndex: 5 } },
        ],
        combos: [{ id: 'combo-1' }],
      },
    });

    await graph.draw();

    expect(graph.getComboData('combo-1').style?.zIndex).toBe(0);

    await graph
Download .txt
gitextract_9ptgz9cu/

├── .changeset/
│   └── config.json
├── .codecov.yml
├── .commitlintrc.js
├── .cursor/
│   └── rules/
│       └── translation.mdc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1.bug_report.yml
│   │   ├── 2.feature_request.yml
│   │   ├── 3.docs_feedback.yml
│   │   ├── 4.oscp.yml
│   │   ├── config.yml
│   │   └── oscp.yml
│   └── workflows/
│       ├── build.yml
│       ├── deploy.yml
│       ├── ensure-triage-label.yml
│       ├── issue-automated.yml
│       ├── issue_translate.yml
│       ├── manage-labeled.yml
│       ├── mark-duplicate.yml
│       ├── no-response.yml
│       ├── publish.yml
│       ├── resolved-pending-release.yml
│       ├── scripts/
│       │   ├── closeOnRelease.js
│       │   ├── issue-automated.js
│       │   └── updateYuque.js
│       └── update-yuque.yml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .prettierignore
├── .prettierrc.js
├── .vscode/
│   └── settings.json
├── CHANGELOG.md
├── LICENSE
├── PUBLISH.md
├── README.md
├── README.zh-CN.md
├── SECURITY.md
├── package.json
├── packages/
│   ├── bundle/
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── tsconfig.json
│   │   ├── vite.config.js
│   │   └── webpack.config.js
│   ├── cli/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.config.ts
│   │   ├── index.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── template-extension/
│   │   │   ├── .commitlintrc.js
│   │   │   ├── .editorconfig
│   │   │   ├── .eslintignore
│   │   │   ├── .eslintrc.js
│   │   │   ├── .gitignore
│   │   │   ├── .prettierignore
│   │   │   ├── .prettierrc.js
│   │   │   ├── __tests__/
│   │   │   │   ├── demos/
│   │   │   │   │   ├── element-node-extend.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── setup.ts
│   │   │   │   ├── types.d.ts
│   │   │   │   ├── unit/
│   │   │   │   │   ├── default.spec.ts
│   │   │   │   │   └── elements/
│   │   │   │   │       └── nodes/
│   │   │   │   │           └── extend.spec.ts
│   │   │   │   └── utils/
│   │   │   │       ├── create.ts
│   │   │   │       ├── dir.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── offscreen-canvas-context.ts
│   │   │   │       ├── sleep.ts
│   │   │   │       ├── svg-transformer.js
│   │   │   │       ├── to-match-svg-snapshot.ts
│   │   │   │       └── use-snapshot-matchers.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── rollup.config.mjs
│   │   │   ├── src/
│   │   │   │   ├── elements/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── nodes/
│   │   │   │   │       ├── extend-node.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── exports.ts
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.js
│   │   └── tsconfig.json
│   ├── g6/
│   │   ├── .gitignore
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── bugs/
│   │   │   │   ├── api-expand-element-z-index.spec.ts
│   │   │   │   ├── api-focus-element-edge.spec.ts
│   │   │   │   ├── behaviors-click-select-drag-node.spec.ts
│   │   │   │   ├── behaviors-click-select.spec.ts
│   │   │   │   ├── behaviors-collapse-expand.spec.ts
│   │   │   │   ├── behaviors-drag-element-combo.spec.ts
│   │   │   │   ├── behaviors-drag-rotated-canvas.spec.ts
│   │   │   │   ├── behaviors-multiple-conflict.spec.ts
│   │   │   │   ├── brush-select.spec.ts
│   │   │   │   ├── continuous-invoke.spec.ts
│   │   │   │   ├── element-combo-drag.spec.ts
│   │   │   │   ├── element-custom-state-switch.spec.ts
│   │   │   │   ├── element-edge-update-arrow.spec.ts
│   │   │   │   ├── element-node-collapse.spec.ts
│   │   │   │   ├── element-node-icon-switch.spec.ts
│   │   │   │   ├── element-node-update-badge.spec.ts
│   │   │   │   ├── element-orth-router.spec.ts
│   │   │   │   ├── element-port-rotate.spec.ts
│   │   │   │   ├── element-remove-combo.spec.ts
│   │   │   │   ├── element-set-position-to-origin.spec.ts
│   │   │   │   ├── fit-view.spec.ts
│   │   │   │   ├── focus-element.spec.ts
│   │   │   │   ├── graph-draw-after-clear.spec.ts
│   │   │   │   ├── model-add-edge-in-combo.spec.ts
│   │   │   │   ├── model-remove-parent.spec.ts
│   │   │   │   ├── plugin-history-align-fields.spec.ts
│   │   │   │   ├── plugin-hull-three-collinear-dots.spec.ts
│   │   │   │   ├── plugin-minimap-combo-collapsed.spec.ts
│   │   │   │   ├── render-change-combo.spec.ts
│   │   │   │   ├── render-deleted-data.spec.ts
│   │   │   │   ├── tree-update-collapsed-node.spec.ts
│   │   │   │   └── utils-set-visibility.spec.ts
│   │   │   ├── dataset/
│   │   │   │   ├── algorithm-category.json
│   │   │   │   ├── circular.json
│   │   │   │   ├── cluster.json
│   │   │   │   ├── combo.json
│   │   │   │   ├── dagre-combo.json
│   │   │   │   ├── dagre.json
│   │   │   │   ├── decision-tree.json
│   │   │   │   ├── element-edges.json
│   │   │   │   ├── element-nodes.json
│   │   │   │   ├── file-system.json
│   │   │   │   ├── flare.json
│   │   │   │   ├── force.json
│   │   │   │   ├── gene.json
│   │   │   │   ├── language-tree.json
│   │   │   │   ├── organization-chart.json
│   │   │   │   ├── parallel-edges.json
│   │   │   │   ├── radial.json
│   │   │   │   ├── relations.json
│   │   │   │   └── soccer.json
│   │   │   ├── demos/
│   │   │   │   ├── animation-element-edge-cubic.ts
│   │   │   │   ├── animation-element-edge-line.ts
│   │   │   │   ├── animation-element-edge-quadratic.ts
│   │   │   │   ├── animation-element-position.ts
│   │   │   │   ├── animation-element-state-switch.ts
│   │   │   │   ├── animation-element-state.ts
│   │   │   │   ├── animation-element-style-position.ts
│   │   │   │   ├── behavior-auto-adapt-label.ts
│   │   │   │   ├── behavior-brush-select.ts
│   │   │   │   ├── behavior-click-select.ts
│   │   │   │   ├── behavior-create-edge.ts
│   │   │   │   ├── behavior-drag-canvas.ts
│   │   │   │   ├── behavior-drag-element.ts
│   │   │   │   ├── behavior-expand-collapse-combo.ts
│   │   │   │   ├── behavior-expand-collapse-node.ts
│   │   │   │   ├── behavior-fix-element-size.ts
│   │   │   │   ├── behavior-focus-element.ts
│   │   │   │   ├── behavior-hover-activate.ts
│   │   │   │   ├── behavior-lasso-select.ts
│   │   │   │   ├── behavior-optimize-viewport-transform.ts
│   │   │   │   ├── behavior-scroll-canvas.ts
│   │   │   │   ├── behavior-zoom-canvas.ts
│   │   │   │   ├── bug-drag-rotated-canvas.ts
│   │   │   │   ├── bug-drag-rotated-element-force.ts
│   │   │   │   ├── bug-process-parallel-edges-combo-fixed.ts
│   │   │   │   ├── bug-tooltip-resize.ts
│   │   │   │   ├── canvas-cursor.ts
│   │   │   │   ├── case-fishbone.ts
│   │   │   │   ├── case-fund-flow.ts
│   │   │   │   ├── case-indented-tree.ts
│   │   │   │   ├── case-language-tree.ts
│   │   │   │   ├── case-mindmap.ts
│   │   │   │   ├── case-org-chart.ts
│   │   │   │   ├── case-radial-dendrogram.ts
│   │   │   │   ├── case-unicorns-investors.ts
│   │   │   │   ├── case-why-do-cats.ts
│   │   │   │   ├── common-graph.ts
│   │   │   │   ├── controller-viewport.ts
│   │   │   │   ├── demo-autosize-element-label.ts
│   │   │   │   ├── demo-found-flow.ts
│   │   │   │   ├── demo-supply-chains.ts
│   │   │   │   ├── element-change-type.ts
│   │   │   │   ├── element-combo.ts
│   │   │   │   ├── element-edge-arrow.ts
│   │   │   │   ├── element-edge-cubic-horizontal.ts
│   │   │   │   ├── element-edge-cubic-radial.ts
│   │   │   │   ├── element-edge-cubic-vertical.ts
│   │   │   │   ├── element-edge-cubic.ts
│   │   │   │   ├── element-edge-custom-arrow.ts
│   │   │   │   ├── element-edge-line.ts
│   │   │   │   ├── element-edge-loop-curve.ts
│   │   │   │   ├── element-edge-loop-polyline.ts
│   │   │   │   ├── element-edge-polyline-animation.ts
│   │   │   │   ├── element-edge-polyline-astar.ts
│   │   │   │   ├── element-edge-polyline-orth.ts
│   │   │   │   ├── element-edge-polyline.ts
│   │   │   │   ├── element-edge-port.ts
│   │   │   │   ├── element-edge-quadratic.ts
│   │   │   │   ├── element-edge-size.ts
│   │   │   │   ├── element-html-sub-graph.ts
│   │   │   │   ├── element-label-background.ts
│   │   │   │   ├── element-label-oversized.ts
│   │   │   │   ├── element-node-avatar.ts
│   │   │   │   ├── element-node-badges.ts
│   │   │   │   ├── element-node-circle.ts
│   │   │   │   ├── element-node-diamond.ts
│   │   │   │   ├── element-node-donut.ts
│   │   │   │   ├── element-node-ellipse.ts
│   │   │   │   ├── element-node-hexagon.ts
│   │   │   │   ├── element-node-html-2.ts
│   │   │   │   ├── element-node-html.ts
│   │   │   │   ├── element-node-image.ts
│   │   │   │   ├── element-node-rect.ts
│   │   │   │   ├── element-node-star.ts
│   │   │   │   ├── element-node-svg-icon.ts
│   │   │   │   ├── element-node-triangle.ts
│   │   │   │   ├── element-port.ts
│   │   │   │   ├── element-position-combo.ts
│   │   │   │   ├── element-position.ts
│   │   │   │   ├── element-state.ts
│   │   │   │   ├── element-visibility-part.ts
│   │   │   │   ├── element-visibility.ts
│   │   │   │   ├── element-z-index.ts
│   │   │   │   ├── graph-to-data-url.ts
│   │   │   │   ├── image-node-halo-test.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout-antv-dagre-flow-combo.ts
│   │   │   │   ├── layout-antv-dagre-flow.ts
│   │   │   │   ├── layout-circular-basic.ts
│   │   │   │   ├── layout-circular-configuration-translate.ts
│   │   │   │   ├── layout-circular-degree.ts
│   │   │   │   ├── layout-circular-division.ts
│   │   │   │   ├── layout-circular-spiral.ts
│   │   │   │   ├── layout-combo-combined.ts
│   │   │   │   ├── layout-compact-box-basic.ts
│   │   │   │   ├── layout-compact-box-left-align.ts
│   │   │   │   ├── layout-compact-box-top-to-bottom.ts
│   │   │   │   ├── layout-concentric.ts
│   │   │   │   ├── layout-custom-dagre.ts
│   │   │   │   ├── layout-custom-horizontal.ts
│   │   │   │   ├── layout-custom-iterative.ts
│   │   │   │   ├── layout-d3-force.ts
│   │   │   │   ├── layout-dagre.ts
│   │   │   │   ├── layout-dendrogram-basic.ts
│   │   │   │   ├── layout-dendrogram-radial.ts
│   │   │   │   ├── layout-dendrogram-tb.ts
│   │   │   │   ├── layout-fishbone.ts
│   │   │   │   ├── layout-force-collision.ts
│   │   │   │   ├── layout-force-lattice.ts
│   │   │   │   ├── layout-force.ts
│   │   │   │   ├── layout-forceatlas2-wasm.ts
│   │   │   │   ├── layout-fruchterman-basic.ts
│   │   │   │   ├── layout-fruchterman-cluster.ts
│   │   │   │   ├── layout-fruchterman-fix.ts
│   │   │   │   ├── layout-fruchterman-gpu.ts
│   │   │   │   ├── layout-fruchterman-wasm.ts
│   │   │   │   ├── layout-grid.ts
│   │   │   │   ├── layout-indented.ts
│   │   │   │   ├── layout-mds.ts
│   │   │   │   ├── layout-mindmap-h-custom-side.ts
│   │   │   │   ├── layout-mindmap-h-left.ts
│   │   │   │   ├── layout-mindmap-h-right.ts
│   │   │   │   ├── layout-mindmap-h.ts
│   │   │   │   ├── layout-pipeline-mds-force.ts
│   │   │   │   ├── layout-radial-basic.ts
│   │   │   │   ├── layout-radial-configuration-translate.ts
│   │   │   │   ├── layout-radial-prevent-overlap-unstrict.ts
│   │   │   │   ├── layout-radial-prevent-overlap.ts
│   │   │   │   ├── layout-radial-sort.ts
│   │   │   │   ├── layout-snake.ts
│   │   │   │   ├── perf-20000-elements.ts
│   │   │   │   ├── perf-fcp.ts
│   │   │   │   ├── plugin-background.ts
│   │   │   │   ├── plugin-bubble-sets.ts
│   │   │   │   ├── plugin-camera-setting.ts
│   │   │   │   ├── plugin-contextmenu.ts
│   │   │   │   ├── plugin-edge-bundling.ts
│   │   │   │   ├── plugin-edge-filter-lens.ts
│   │   │   │   ├── plugin-fisheye.ts
│   │   │   │   ├── plugin-fullscreen.ts
│   │   │   │   ├── plugin-grid-line.ts
│   │   │   │   ├── plugin-history.ts
│   │   │   │   ├── plugin-hull.ts
│   │   │   │   ├── plugin-legend.ts
│   │   │   │   ├── plugin-minimap-edge-arrow.ts
│   │   │   │   ├── plugin-minimap.ts
│   │   │   │   ├── plugin-snapline.ts
│   │   │   │   ├── plugin-timebar.ts
│   │   │   │   ├── plugin-title.ts
│   │   │   │   ├── plugin-toolbar-build-in.ts
│   │   │   │   ├── plugin-toolbar-iconfont.ts
│   │   │   │   ├── plugin-tooltip-async.ts
│   │   │   │   ├── plugin-tooltip-dual.ts
│   │   │   │   ├── plugin-tooltip-enable.ts
│   │   │   │   ├── plugin-tooltip-with-custom-node.ts
│   │   │   │   ├── plugin-tooltip.ts
│   │   │   │   ├── plugin-watermark-image.ts
│   │   │   │   ├── plugin-watermark.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform-map-node-size.ts
│   │   │   │   ├── transform-place-radial-labels.ts
│   │   │   │   ├── transform-process-parallel-edges.ts
│   │   │   │   └── viewport-fit.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── perf/
│   │   │   │   ├── data.perf.ts
│   │   │   │   ├── draw.perf.ts
│   │   │   │   ├── massive-element.perf.ts
│   │   │   │   └── update-state.perf.ts
│   │   │   ├── perf-report/
│   │   │   │   ├── 9821ed36_2024-08-22_20-39-12.json
│   │   │   │   ├── 9821ed36_2024-08-29_11-11-17.json
│   │   │   │   ├── 9821ed36_2024-08-29_13-24-51.json
│   │   │   │   ├── 9821ed36_2024-09-03_10-33-27.json
│   │   │   │   └── 9821ed36_2024-09-03_11-28-42.json
│   │   │   ├── setup.ts
│   │   │   ├── types.d.ts
│   │   │   ├── unit/
│   │   │   │   ├── animations/
│   │   │   │   │   ├── element-position.spec.ts
│   │   │   │   │   ├── element-state-switch.spec.ts
│   │   │   │   │   └── element-style-position.spec.ts
│   │   │   │   ├── behaviors/
│   │   │   │   │   ├── auto-adapt-label.spec.ts
│   │   │   │   │   ├── behavior-create-edge-click.spec.ts
│   │   │   │   │   ├── behavior-create-edge-drag.spec.ts
│   │   │   │   │   ├── brush-select.spec.ts
│   │   │   │   │   ├── click-select-catch.spec.ts
│   │   │   │   │   ├── click-select.spec.ts
│   │   │   │   │   ├── collapse-expand-combo.spec.ts
│   │   │   │   │   ├── collapse-expand-node.spec.ts
│   │   │   │   │   ├── collapse-expand.spec.ts
│   │   │   │   │   ├── drag-canvas.spec.ts
│   │   │   │   │   ├── drag-element-bug.spec.ts
│   │   │   │   │   ├── drag-element-combo.spec.ts
│   │   │   │   │   ├── drag-element.spec.ts
│   │   │   │   │   ├── fix-element-size.spec.ts
│   │   │   │   │   ├── focus-element.spec.ts
│   │   │   │   │   ├── hover-activate.spec.ts
│   │   │   │   │   ├── lasso-select.spec.ts
│   │   │   │   │   ├── optimize-viewport-transform.spec.ts
│   │   │   │   │   ├── scroll-canvas.spec.ts
│   │   │   │   │   └── zoom-canvas.spec.ts
│   │   │   │   ├── default.spec.ts
│   │   │   │   ├── elements/
│   │   │   │   │   ├── change-type.spec.ts
│   │   │   │   │   ├── combo.spec.ts
│   │   │   │   │   ├── edges/
│   │   │   │   │   │   ├── arrow.spec.ts
│   │   │   │   │   │   ├── cubic-horizontal.spec.ts
│   │   │   │   │   │   ├── cubic-radial.spec.ts
│   │   │   │   │   │   ├── cubic-vertical.spec.ts
│   │   │   │   │   │   ├── cubic.spec.ts
│   │   │   │   │   │   ├── custom-arrow.spec.ts
│   │   │   │   │   │   ├── line.spec.ts
│   │   │   │   │   │   ├── loop-curve.spec.ts
│   │   │   │   │   │   ├── loop-polyline.spec.ts
│   │   │   │   │   │   ├── polyline-animation.spec.ts
│   │   │   │   │   │   ├── polyline-astar.spec.ts
│   │   │   │   │   │   ├── polyline-orth.spec.ts
│   │   │   │   │   │   ├── polyline.spec.ts
│   │   │   │   │   │   ├── port.spec.ts
│   │   │   │   │   │   ├── quadratic.spec.ts
│   │   │   │   │   │   └── size.spec.ts
│   │   │   │   │   ├── label-background.spec.ts
│   │   │   │   │   ├── label-oversized.spec.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── avatar.spec.ts
│   │   │   │   │   │   ├── circle.spec.ts
│   │   │   │   │   │   ├── diamond.spec.ts
│   │   │   │   │   │   ├── donut.spec.ts
│   │   │   │   │   │   ├── ellipse.spec.ts
│   │   │   │   │   │   ├── hexagon.spec.ts
│   │   │   │   │   │   ├── image.spec.ts
│   │   │   │   │   │   ├── rect.spec.ts
│   │   │   │   │   │   ├── star.spec.ts
│   │   │   │   │   │   └── triangle.spec.ts
│   │   │   │   │   ├── override-methods.spec.ts
│   │   │   │   │   ├── port.spec.ts
│   │   │   │   │   ├── position-combo.spec.ts
│   │   │   │   │   ├── position.spec.ts
│   │   │   │   │   ├── shape.spec.ts
│   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   └── z-index.spec.ts
│   │   │   │   ├── import.spec.ts
│   │   │   │   ├── layouts/
│   │   │   │   │   ├── circular.spec.ts
│   │   │   │   │   ├── combo-layout.spec.ts
│   │   │   │   │   ├── compact-box.spec.ts
│   │   │   │   │   ├── concentric.spec.ts
│   │   │   │   │   ├── custom-dagre.spec.ts
│   │   │   │   │   ├── custom-layout-horizontal.spec.ts
│   │   │   │   │   ├── d3-force-collision.spec.ts
│   │   │   │   │   ├── d3-force-lattice.spec.ts
│   │   │   │   │   ├── d3-force.spec.ts
│   │   │   │   │   ├── dagre.spec.ts
│   │   │   │   │   ├── dendrogram.spec.ts
│   │   │   │   │   ├── fishbone.spec.ts
│   │   │   │   │   ├── fruchterman.spec.ts
│   │   │   │   │   ├── grid.spec.ts
│   │   │   │   │   ├── indented.spec.ts
│   │   │   │   │   ├── mds.spec.ts
│   │   │   │   │   ├── mindmap.spec.ts
│   │   │   │   │   ├── pipeline.spec.ts
│   │   │   │   │   ├── radial-layout.spec.ts
│   │   │   │   │   └── snake.spec.ts
│   │   │   │   ├── plugins/
│   │   │   │   │   ├── background.spec.ts
│   │   │   │   │   ├── bubble-sets.spec.ts
│   │   │   │   │   ├── camera-setting.spec.ts
│   │   │   │   │   ├── contextmenu.spec.ts
│   │   │   │   │   ├── edge-bundling.spec.ts
│   │   │   │   │   ├── edge-filter-lens.spec.ts
│   │   │   │   │   ├── fisheye.spec.ts
│   │   │   │   │   ├── grid-line.spec.ts
│   │   │   │   │   ├── history/
│   │   │   │   │   │   ├── plugin-history.spec.ts
│   │   │   │   │   │   └── utils.spec.ts
│   │   │   │   │   ├── hull/
│   │   │   │   │   │   ├── plugin-hull.spec.ts
│   │   │   │   │   │   └── util.spec.ts
│   │   │   │   │   ├── legend.spec.ts
│   │   │   │   │   ├── snapline.spec.ts
│   │   │   │   │   ├── timebar.spec.ts
│   │   │   │   │   ├── title.spec.ts
│   │   │   │   │   ├── toolbar/
│   │   │   │   │   │   ├── plugin-toolbar.spec.ts
│   │   │   │   │   │   └── util.spec.ts
│   │   │   │   │   ├── tooltip.spec.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   └── dom.spec.ts
│   │   │   │   │   └── watermark.spec.ts
│   │   │   │   ├── registry.spec.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── canvas.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── element/
│   │   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   │   └── z-index.spec.ts
│   │   │   │   │   ├── element.spec.ts
│   │   │   │   │   ├── graph/
│   │   │   │   │   │   ├── add-children-data.spec.ts
│   │   │   │   │   │   ├── auto-resize.spec.ts
│   │   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   │   ├── get-plugin-instantce.spec.ts
│   │   │   │   │   │   ├── graph.spec.ts
│   │   │   │   │   │   └── this.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   └── viewport.spec.ts
│   │   │   │   ├── spec/
│   │   │   │   │   ├── behavior.spec.ts
│   │   │   │   │   ├── canvas.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── element/
│   │   │   │   │   │   ├── combo.spec.ts
│   │   │   │   │   │   ├── edge.spec.ts
│   │   │   │   │   │   └── node.spec.ts
│   │   │   │   │   ├── index.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   ├── optimize.spec.ts
│   │   │   │   │   ├── plugin.spec.ts
│   │   │   │   │   ├── theme.spec.ts
│   │   │   │   │   └── viewport.spec.ts
│   │   │   │   ├── themes/
│   │   │   │   │   └── base.spec.ts
│   │   │   │   ├── transforms/
│   │   │   │   │   ├── base-transform.spec.ts
│   │   │   │   │   ├── transform-map-node-size.spec.ts
│   │   │   │   │   ├── transform-position-radial-labels.spec.ts
│   │   │   │   │   └── transform-process-parallel-edges.spec.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── anchor.spec.ts
│   │   │   │   │   ├── animation.spec.ts
│   │   │   │   │   ├── array.spec.ts
│   │   │   │   │   ├── bbox.spec.ts
│   │   │   │   │   ├── cache.spec.ts
│   │   │   │   │   ├── change.spec.ts
│   │   │   │   │   ├── collapsibility.spec.ts
│   │   │   │   │   ├── contextmenu.spec.ts
│   │   │   │   │   ├── data.spec.ts
│   │   │   │   │   ├── diff.spec.ts
│   │   │   │   │   ├── dom.spec.ts
│   │   │   │   │   ├── edge.spec.ts
│   │   │   │   │   ├── element.spec.ts
│   │   │   │   │   ├── event.spec.ts
│   │   │   │   │   ├── extension.spec.ts
│   │   │   │   │   ├── graphlib.spec.ts
│   │   │   │   │   ├── id.spec.ts
│   │   │   │   │   ├── is.spec.ts
│   │   │   │   │   ├── layout.spec.ts
│   │   │   │   │   ├── line.spec.ts
│   │   │   │   │   ├── math.spec.ts
│   │   │   │   │   ├── padding.spec.ts
│   │   │   │   │   ├── palette.spec.ts
│   │   │   │   │   ├── path.spec.ts
│   │   │   │   │   ├── placement.spec.ts
│   │   │   │   │   ├── point.spec.ts
│   │   │   │   │   ├── polygon.spec.ts
│   │   │   │   │   ├── position.spec.ts
│   │   │   │   │   ├── prefix.spec.ts
│   │   │   │   │   ├── print.spec.ts
│   │   │   │   │   ├── random.spec.ts
│   │   │   │   │   ├── relation.spec.ts
│   │   │   │   │   ├── router.spec.ts
│   │   │   │   │   ├── scale.spec.ts
│   │   │   │   │   ├── shape.spec.ts
│   │   │   │   │   ├── shortcut.spec.ts
│   │   │   │   │   ├── size.spec.ts
│   │   │   │   │   ├── state.spec.ts
│   │   │   │   │   ├── style.spec.ts
│   │   │   │   │   ├── symbol.spec.ts
│   │   │   │   │   ├── text.spec.ts
│   │   │   │   │   ├── theme.spec.ts
│   │   │   │   │   ├── traverse.spec.ts
│   │   │   │   │   ├── tree.spec.ts
│   │   │   │   │   ├── vector.spec.ts
│   │   │   │   │   ├── visibility.spec.ts
│   │   │   │   │   └── z-index.spec.ts
│   │   │   │   └── version.spec.ts
│   │   │   └── utils/
│   │   │       ├── canvas.ts
│   │   │       ├── create.ts
│   │   │       ├── dir.ts
│   │   │       ├── dom.ts
│   │   │       ├── index.ts
│   │   │       ├── offscreen-canvas-context.ts
│   │   │       ├── random.ts
│   │   │       ├── sleep.ts
│   │   │       ├── svg-transformer.js
│   │   │       ├── to-be-close-to.ts
│   │   │       ├── to-match-svg-snapshot.ts
│   │   │       └── use-snapshot-matchers.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── perf.config.js
│   │   ├── rollup.config.mjs
│   │   ├── scripts/
│   │   │   ├── tag.mjs
│   │   │   └── version.mjs
│   │   ├── src/
│   │   │   ├── animations/
│   │   │   │   ├── executor.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── behaviors/
│   │   │   │   ├── auto-adapt-label.ts
│   │   │   │   ├── base-behavior.ts
│   │   │   │   ├── brush-select.ts
│   │   │   │   ├── click-select.ts
│   │   │   │   ├── collapse-expand.ts
│   │   │   │   ├── create-edge.ts
│   │   │   │   ├── drag-canvas.ts
│   │   │   │   ├── drag-element-force.ts
│   │   │   │   ├── drag-element.ts
│   │   │   │   ├── fix-element-size.ts
│   │   │   │   ├── focus-element.ts
│   │   │   │   ├── hover-activate.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lasso-select.ts
│   │   │   │   ├── optimize-viewport-transform.ts
│   │   │   │   ├── scroll-canvas.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── zoom-canvas.ts
│   │   │   ├── constants/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── events/
│   │   │   │   │   ├── animation.ts
│   │   │   │   │   ├── canvas.ts
│   │   │   │   │   ├── combo.ts
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── container.ts
│   │   │   │   │   ├── edge.ts
│   │   │   │   │   ├── graph.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── node.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── registry.ts
│   │   │   ├── elements/
│   │   │   │   ├── base-element.ts
│   │   │   │   ├── combos/
│   │   │   │   │   ├── base-combo.ts
│   │   │   │   │   ├── circle.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── rect.ts
│   │   │   │   ├── edges/
│   │   │   │   │   ├── base-edge.ts
│   │   │   │   │   ├── cubic-horizontal.ts
│   │   │   │   │   ├── cubic-radial.ts
│   │   │   │   │   ├── cubic-vertical.ts
│   │   │   │   │   ├── cubic.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── line.ts
│   │   │   │   │   ├── polyline.ts
│   │   │   │   │   └── quadratic.ts
│   │   │   │   ├── effect.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── nodes/
│   │   │   │   │   ├── base-node.ts
│   │   │   │   │   ├── circle.ts
│   │   │   │   │   ├── diamond.ts
│   │   │   │   │   ├── donut.ts
│   │   │   │   │   ├── ellipse.ts
│   │   │   │   │   ├── hexagon.ts
│   │   │   │   │   ├── html.ts
│   │   │   │   │   ├── image.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── rect.ts
│   │   │   │   │   ├── star.ts
│   │   │   │   │   └── triangle.ts
│   │   │   │   └── shapes/
│   │   │   │       ├── badge.ts
│   │   │   │       ├── base-shape.ts
│   │   │   │       ├── contour.ts
│   │   │   │       ├── icon.ts
│   │   │   │       ├── image.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── label.ts
│   │   │   │       └── polygon.ts
│   │   │   ├── exports.ts
│   │   │   ├── global.d.ts
│   │   │   ├── index.ts
│   │   │   ├── layouts/
│   │   │   │   ├── base-layout.ts
│   │   │   │   ├── fishbone.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── snake.ts
│   │   │   │   └── types.ts
│   │   │   ├── palettes/
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── plugins/
│   │   │   │   ├── background/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── base-plugin.ts
│   │   │   │   ├── bubble-sets.ts
│   │   │   │   ├── camera-setting.ts
│   │   │   │   ├── contextmenu/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── edge-bundling/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── edge-filter-lens/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── fisheye/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── fullscreen/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── grid-line.ts
│   │   │   │   ├── history/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── hull/
│   │   │   │   │   ├── hull/
│   │   │   │   │   │   ├── format.ts
│   │   │   │   │   │   ├── grid_handle.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── monotone-convex-hull-2d.ts
│   │   │   │   │   │   ├── robust-orientation.ts
│   │   │   │   │   │   ├── robust-scale.ts
│   │   │   │   │   │   ├── robust-segment-intersect.ts
│   │   │   │   │   │   ├── robust-subtract.ts
│   │   │   │   │   │   ├── robust-sum.ts
│   │   │   │   │   │   ├── two-product.ts
│   │   │   │   │   │   └── two-sum.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── legend.ts
│   │   │   │   ├── minimap/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── snapline/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── timebar.ts
│   │   │   │   ├── title/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── toolbar/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── util.ts
│   │   │   │   ├── tooltip.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── canvas.ts
│   │   │   │   │   └── dom.ts
│   │   │   │   └── watermark/
│   │   │   │       ├── index.ts
│   │   │   │       └── util.ts
│   │   │   ├── preset.ts
│   │   │   ├── registry/
│   │   │   │   ├── build-in.ts
│   │   │   │   ├── extension/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── get.ts
│   │   │   │   ├── register.ts
│   │   │   │   ├── store.ts
│   │   │   │   └── types.ts
│   │   │   ├── runtime/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── batch.ts
│   │   │   │   ├── behavior.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── graph.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── options.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── transform.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── spec/
│   │   │   │   ├── behavior.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── element/
│   │   │   │   │   ├── animation.ts
│   │   │   │   │   ├── combo.ts
│   │   │   │   │   ├── edge.ts
│   │   │   │   │   ├── node.ts
│   │   │   │   │   └── palette.ts
│   │   │   │   ├── graph.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── themes/
│   │   │   │   ├── base.ts
│   │   │   │   ├── dark.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── light.ts
│   │   │   │   └── types.ts
│   │   │   ├── transforms/
│   │   │   │   ├── arrange-draw-order.ts
│   │   │   │   ├── base-transform.ts
│   │   │   │   ├── collapse-expand-combo.ts
│   │   │   │   ├── collapse-expand-node.ts
│   │   │   │   ├── get-edge-actual-ends.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── map-node-size.ts
│   │   │   │   ├── place-radial-labels.ts
│   │   │   │   ├── process-parallel-edges.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── update-related-edge.ts
│   │   │   │   └── utils.ts
│   │   │   ├── types/
│   │   │   │   ├── anchor.ts
│   │   │   │   ├── animation.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── centrality.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── combo.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── edge.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── enum.ts
│   │   │   │   ├── event.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── history.ts
│   │   │   │   ├── id.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── node.ts
│   │   │   │   ├── padding.ts
│   │   │   │   ├── placement.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── point.ts
│   │   │   │   ├── prefix.ts
│   │   │   │   ├── router.ts
│   │   │   │   ├── size.ts
│   │   │   │   ├── state.ts
│   │   │   │   ├── style.ts
│   │   │   │   ├── tree.ts
│   │   │   │   ├── utility.ts
│   │   │   │   ├── vector.ts
│   │   │   │   └── viewport.ts
│   │   │   ├── utils/
│   │   │   │   ├── anchor.ts
│   │   │   │   ├── animation.ts
│   │   │   │   ├── array.ts
│   │   │   │   ├── bbox.ts
│   │   │   │   ├── cache.ts
│   │   │   │   ├── centrality.ts
│   │   │   │   ├── change.ts
│   │   │   │   ├── collapsibility.ts
│   │   │   │   ├── data.ts
│   │   │   │   ├── diff.ts
│   │   │   │   ├── dom.ts
│   │   │   │   ├── edge.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── event/
│   │   │   │   │   ├── events.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── extension.ts
│   │   │   │   ├── graphlib.ts
│   │   │   │   ├── id.ts
│   │   │   │   ├── is.ts
│   │   │   │   ├── layout.ts
│   │   │   │   ├── line.ts
│   │   │   │   ├── math.ts
│   │   │   │   ├── node.ts
│   │   │   │   ├── padding.ts
│   │   │   │   ├── palette.ts
│   │   │   │   ├── path.ts
│   │   │   │   ├── pinch.ts
│   │   │   │   ├── placement.ts
│   │   │   │   ├── point.ts
│   │   │   │   ├── polygon.ts
│   │   │   │   ├── position.ts
│   │   │   │   ├── prefix.ts
│   │   │   │   ├── print.ts
│   │   │   │   ├── relation.ts
│   │   │   │   ├── router/
│   │   │   │   │   ├── orth.ts
│   │   │   │   │   └── shortest-path.ts
│   │   │   │   ├── scale.ts
│   │   │   │   ├── shape.ts
│   │   │   │   ├── shortcut.ts
│   │   │   │   ├── size.ts
│   │   │   │   ├── state.ts
│   │   │   │   ├── style.ts
│   │   │   │   ├── symbol.ts
│   │   │   │   ├── text.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── transform.ts
│   │   │   │   ├── traverse.ts
│   │   │   │   ├── tree.ts
│   │   │   │   ├── vector.ts
│   │   │   │   ├── visibility.ts
│   │   │   │   └── z-index.ts
│   │   │   └── version.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsdoc.json
│   │   └── vite.config.js
│   ├── g6-extension-3d/
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── dataset/
│   │   │   │   ├── cubic.json
│   │   │   │   └── force-3d.json
│   │   │   ├── demos/
│   │   │   │   ├── behavior-drag-canvas.ts
│   │   │   │   ├── behavior-observe-canvas.ts
│   │   │   │   ├── behavior-roll-canvas.ts
│   │   │   │   ├── behavior-zoom-canvas.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── layer-top.ts
│   │   │   │   ├── layout-d3-force-3d.ts
│   │   │   │   ├── massive-elements.ts
│   │   │   │   ├── position.ts
│   │   │   │   ├── shapes.ts
│   │   │   │   ├── solar-system.ts
│   │   │   │   └── switch-renderer.ts
│   │   │   ├── index.html
│   │   │   ├── main.ts
│   │   │   ├── types.d.ts
│   │   │   └── unit/
│   │   │       ├── default.spec.ts
│   │   │       └── utils/
│   │   │           ├── cache.spec.ts
│   │   │           ├── geometry.spec.ts
│   │   │           ├── map.spec.ts
│   │   │           ├── material.spec.ts
│   │   │           └── texture.spec.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── behaviors/
│   │   │   │   ├── drag-canvas-3d.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── observe-canvas-3d.ts
│   │   │   │   ├── roll-canvas-3d.ts
│   │   │   │   └── zoom-canvas-3d.ts
│   │   │   ├── elements/
│   │   │   │   ├── base-node-3d.ts
│   │   │   │   ├── capsule.ts
│   │   │   │   ├── cone.ts
│   │   │   │   ├── cube.ts
│   │   │   │   ├── cylinder.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── line-3d.ts
│   │   │   │   ├── plane.ts
│   │   │   │   ├── sphere.ts
│   │   │   │   └── torus.ts
│   │   │   ├── exports.ts
│   │   │   ├── index.ts
│   │   │   ├── plugins/
│   │   │   │   ├── index.ts
│   │   │   │   └── light.ts
│   │   │   ├── renderer.ts
│   │   │   ├── types/
│   │   │   │   ├── index.ts
│   │   │   │   └── material.ts
│   │   │   └── utils/
│   │   │       ├── cache.ts
│   │   │       ├── geometry.ts
│   │   │       ├── map.ts
│   │   │       ├── material.ts
│   │   │       └── texture.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── vite.config.js
│   ├── g6-extension-react/
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── .eslintrc
│   │   │   ├── dataset/
│   │   │   │   └── euro-cup.json
│   │   │   ├── demos/
│   │   │   │   ├── euro-cup.tsx
│   │   │   │   ├── graph.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── performance-diagnosis.tsx
│   │   │   │   └── react-node.tsx
│   │   │   ├── graph.tsx
│   │   │   ├── index.html
│   │   │   ├── main.tsx
│   │   │   └── unit/
│   │   │       ├── attribute-changed-callback.spec.tsx
│   │   │       └── default.spec.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── index.ts
│   │   │   └── react-node/
│   │   │       ├── index.ts
│   │   │       ├── node.tsx
│   │   │       ├── render.ts
│   │   │       ├── render16.ts
│   │   │       └── render18.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── vite.config.js
│   ├── g6-ssr/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── __tests__/
│   │   │   ├── graph-options.json
│   │   │   └── graph.spec.ts
│   │   ├── bin/
│   │   │   └── g6-ssr.js
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── rollup.config.mjs
│   │   ├── src/
│   │   │   ├── canvas.ts
│   │   │   ├── graph.ts
│   │   │   ├── index.ts
│   │   │   └── types.ts
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   └── tsconfig.test.json
│   └── site/
│       ├── .dumi/
│       │   ├── app.tsx
│       │   ├── global.less
│       │   ├── global.ts
│       │   └── tsconfig.json
│       ├── .dumirc.ts
│       ├── .github/
│       │   └── workflows/
│       │       └── mirror.yml
│       ├── .gitignore
│       ├── CNAME
│       ├── api-extractor.json
│       ├── common/
│       │   ├── angular-snippet.md
│       │   ├── api/
│       │   │   ├── behaviors/
│       │   │   │   ├── auto-adapt-label.md
│       │   │   │   ├── brush-select.md
│       │   │   │   ├── click-element.md
│       │   │   │   ├── collapse-expand.md
│       │   │   │   ├── create-edge.md
│       │   │   │   ├── drag-canvas.md
│       │   │   │   ├── drag-element.md
│       │   │   │   ├── fix-element-size.md
│       │   │   │   ├── focus-element.md
│       │   │   │   ├── hover-activate.md
│       │   │   │   ├── hover-element.md
│       │   │   │   ├── lasso-select.md
│       │   │   │   ├── scroll-canvas.md
│       │   │   │   └── zoom-canvas.md
│       │   │   ├── elements/
│       │   │   │   ├── combos/
│       │   │   │   │   ├── base-combo.md
│       │   │   │   │   ├── circle-combo-interest.md
│       │   │   │   │   ├── circle-combo.md
│       │   │   │   │   ├── rect-combo-architecture.md
│       │   │   │   │   └── rect-combo.md
│       │   │   │   ├── edges/
│       │   │   │   │   ├── base-edge.md
│       │   │   │   │   ├── cubic-horizontal.md
│       │   │   │   │   ├── cubic-vertical.md
│       │   │   │   │   ├── cubic.md
│       │   │   │   │   ├── line.md
│       │   │   │   │   ├── polyline.md
│       │   │   │   │   └── quadratic.md
│       │   │   │   └── nodes/
│       │   │   │       ├── base-node.md
│       │   │   │       ├── circle.md
│       │   │   │       ├── diamond.md
│       │   │   │       ├── donut.md
│       │   │   │       ├── ellipse.md
│       │   │   │       ├── hexagon.md
│       │   │   │       ├── html.md
│       │   │   │       ├── image.md
│       │   │   │       ├── rect.md
│       │   │   │       ├── star.md
│       │   │   │       └── triangle.md
│       │   │   ├── layout/
│       │   │   │   ├── fishbone.md
│       │   │   │   └── force-atlas2.md
│       │   │   ├── layouts/
│       │   │   │   ├── radial.md
│       │   │   │   └── snake.md
│       │   │   ├── plugins/
│       │   │   │   ├── background.md
│       │   │   │   ├── bubble-sets.md
│       │   │   │   ├── contextmenu.md
│       │   │   │   ├── edge-bundling.md
│       │   │   │   ├── edge-filter-lens.md
│       │   │   │   ├── fisheye.md
│       │   │   │   ├── fullscreen.md
│       │   │   │   ├── grid-line.md
│       │   │   │   ├── history.md
│       │   │   │   ├── hull.md
│       │   │   │   ├── legend.md
│       │   │   │   ├── minimap.md
│       │   │   │   ├── snapline.md
│       │   │   │   ├── timebar.md
│       │   │   │   ├── toolbar.md
│       │   │   │   ├── tooltip.md
│       │   │   │   └── watermark.md
│       │   │   └── transforms/
│       │   │       ├── map-node-size-centrality.md
│       │   │       └── map-node-size-scale.md
│       │   ├── manual/
│       │   │   ├── core-concept/
│       │   │   │   ├── animation/
│       │   │   │   │   ├── ant-line.md
│       │   │   │   │   └── breathing-circle.md
│       │   │   │   └── palette/
│       │   │   │       ├── continuous-palette.md
│       │   │   │       ├── default-config.md
│       │   │   │       └── standard-config.md
│       │   │   ├── custom-extension/
│       │   │   │   ├── animation/
│       │   │   │   │   ├── composite-animation-1.md
│       │   │   │   │   ├── composite-animation-2.md
│       │   │   │   │   └── implement-animation.md
│       │   │   │   ├── behavior/
│       │   │   │   │   └── implement-behaviors.md
│       │   │   │   ├── layout/
│       │   │   │   │   ├── iterative-layout.md
│       │   │   │   │   └── non-iterative-layout.md
│       │   │   │   ├── plugin/
│       │   │   │   │   └── implement-plugin.md
│       │   │   │   └── transform/
│       │   │   │       ├── circular-radial-labels.md
│       │   │   │       └── hide-free-node.md
│       │   │   ├── feature/
│       │   │   │   ├── treeToGraphData.md
│       │   │   │   └── webpack4.md
│       │   │   └── getting-started/
│       │   │       ├── extensions/
│       │   │       │   └── palettes.md
│       │   │       ├── quick-start/
│       │   │       │   └── simple-graph.md
│       │   │       └── step-by-step/
│       │   │           ├── behaviors.md
│       │   │           ├── create-chart.md
│       │   │           ├── elements-1.md
│       │   │           ├── elements-2.md
│       │   │           ├── layout.md
│       │   │           ├── palette.md
│       │   │           ├── plugins-1.md
│       │   │           └── plugins-2.md
│       │   ├── react-snippet-strict.md
│       │   ├── react-snippet.md
│       │   └── vue-snippet.md
│       ├── docs/
│       │   ├── api/
│       │   │   ├── behavior.en.md
│       │   │   ├── behavior.zh.md
│       │   │   ├── canvas.en.md
│       │   │   ├── canvas.zh.md
│       │   │   ├── coordinate.en.md
│       │   │   ├── coordinate.zh.md
│       │   │   ├── data.en.md
│       │   │   ├── data.zh.md
│       │   │   ├── element.en.md
│       │   │   ├── element.zh.md
│       │   │   ├── event.en.md
│       │   │   ├── event.zh.md
│       │   │   ├── export-image.en.md
│       │   │   ├── export-image.zh.md
│       │   │   ├── graph.en.md
│       │   │   ├── graph.zh.md
│       │   │   ├── layout.en.md
│       │   │   ├── layout.zh.md
│       │   │   ├── option.en.md
│       │   │   ├── option.zh.md
│       │   │   ├── plugin.en.md
│       │   │   ├── plugin.zh.md
│       │   │   ├── render.en.md
│       │   │   ├── render.zh.md
│       │   │   ├── theme.en.md
│       │   │   ├── theme.zh.md
│       │   │   ├── transform.en.md
│       │   │   ├── transform.zh.md
│       │   │   ├── viewport.en.md
│       │   │   └── viewport.zh.md
│       │   ├── backup/
│       │   │   ├── CameraSetting.en.md
│       │   │   └── CameraSetting.zh.md
│       │   └── manual/
│       │       ├── animation/
│       │       │   ├── animation.en.md
│       │       │   ├── animation.zh.md
│       │       │   ├── custom-animation.en.md
│       │       │   └── custom-animation.zh.md
│       │       ├── behavior/
│       │       │   ├── AutoAdaptLabel.en.md
│       │       │   ├── AutoAdaptLabel.zh.md
│       │       │   ├── BrushSelect.en.md
│       │       │   ├── BrushSelect.zh.md
│       │       │   ├── ClickSelect.en.md
│       │       │   ├── ClickSelect.zh.md
│       │       │   ├── CollapseExpand.en.md
│       │       │   ├── CollapseExpand.zh.md
│       │       │   ├── CreateEdge.en.md
│       │       │   ├── CreateEdge.zh.md
│       │       │   ├── DragCanvas.en.md
│       │       │   ├── DragCanvas.zh.md
│       │       │   ├── DragElement.en.md
│       │       │   ├── DragElement.zh.md
│       │       │   ├── DragElementForce.en.md
│       │       │   ├── DragElementForce.zh.md
│       │       │   ├── FixElementSize.en.md
│       │       │   ├── FixElementSize.zh.md
│       │       │   ├── FocusElement.en.md
│       │       │   ├── FocusElement.zh.md
│       │       │   ├── HoverActivate.en.md
│       │       │   ├── HoverActivate.zh.md
│       │       │   ├── LassoSelect.en.md
│       │       │   ├── LassoSelect.zh.md
│       │       │   ├── OptimizeViewportTransform.en.md
│       │       │   ├── OptimizeViewportTransform.zh.md
│       │       │   ├── ScrollCanvas.en.md
│       │       │   ├── ScrollCanvas.zh.md
│       │       │   ├── ZoomCanvas.en.md
│       │       │   ├── ZoomCanvas.zh.md
│       │       │   ├── custom-behavior.en.md
│       │       │   ├── custom-behavior.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── contribute.en.md
│       │       ├── contribute.zh.md
│       │       ├── data.en.md
│       │       ├── data.zh.md
│       │       ├── element/
│       │       │   ├── combo/
│       │       │   │   ├── BaseCombo.en.md
│       │       │   │   ├── BaseCombo.zh.md
│       │       │   │   ├── CircleCombo.en.md
│       │       │   │   ├── CircleCombo.zh.md
│       │       │   │   ├── RectCombo.en.md
│       │       │   │   ├── RectCombo.zh.md
│       │       │   │   ├── custom-combo.en.md
│       │       │   │   ├── custom-combo.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   └── overview.zh.md
│       │       │   ├── edge/
│       │       │   │   ├── BaseEdge.en.md
│       │       │   │   ├── BaseEdge.zh.md
│       │       │   │   ├── Cubic.en.md
│       │       │   │   ├── Cubic.zh.md
│       │       │   │   ├── CubicHorizontal.en.md
│       │       │   │   ├── CubicHorizontal.zh.md
│       │       │   │   ├── CubicVertical.en.md
│       │       │   │   ├── CubicVertical.zh.md
│       │       │   │   ├── Line.en.md
│       │       │   │   ├── Line.zh.md
│       │       │   │   ├── Polyline.en.md
│       │       │   │   ├── Polyline.zh.md
│       │       │   │   ├── Quadratic.en.md
│       │       │   │   ├── Quadratic.zh.md
│       │       │   │   ├── custom-edge.en.md
│       │       │   │   ├── custom-edge.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   └── overview.zh.md
│       │       │   ├── node/
│       │       │   │   ├── BaseNode.en.md
│       │       │   │   ├── BaseNode.zh.md
│       │       │   │   ├── Circle.en.md
│       │       │   │   ├── Circle.zh.md
│       │       │   │   ├── Diamond.en.md
│       │       │   │   ├── Diamond.zh.md
│       │       │   │   ├── Donut.en.md
│       │       │   │   ├── Donut.zh.md
│       │       │   │   ├── Ellipse.en.md
│       │       │   │   ├── Ellipse.zh.md
│       │       │   │   ├── Hexagon.en.md
│       │       │   │   ├── Hexagon.zh.md
│       │       │   │   ├── Html.en.md
│       │       │   │   ├── Html.zh.md
│       │       │   │   ├── Image.en.md
│       │       │   │   ├── Image.zh.md
│       │       │   │   ├── Rect.en.md
│       │       │   │   ├── Rect.zh.md
│       │       │   │   ├── Star.en.md
│       │       │   │   ├── Star.zh.md
│       │       │   │   ├── Triangle.en.md
│       │       │   │   ├── Triangle.zh.md
│       │       │   │   ├── custom-node.en.md
│       │       │   │   ├── custom-node.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   ├── overview.zh.md
│       │       │   │   ├── react-node.en.md
│       │       │   │   ├── react-node.zh.md
│       │       │   │   ├── vue-node.en.md
│       │       │   │   └── vue-node.zh.md
│       │       │   ├── overview.en.md
│       │       │   ├── overview.zh.md
│       │       │   ├── shape/
│       │       │   │   ├── label-shape.en.md
│       │       │   │   ├── label-shape.zh.md
│       │       │   │   ├── overview.en.md
│       │       │   │   ├── overview.zh.md
│       │       │   │   ├── properties.en.md
│       │       │   │   └── properties.zh.md
│       │       │   ├── state.en.md
│       │       │   └── state.zh.md
│       │       ├── extension/
│       │       │   ├── 3d.en.md
│       │       │   └── 3d.zh.md
│       │       ├── faq.en.md
│       │       ├── faq.zh.md
│       │       ├── further-reading/
│       │       │   ├── 3d.en.md
│       │       │   ├── 3d.zh.md
│       │       │   ├── bundle.en.md
│       │       │   ├── bundle.zh.md
│       │       │   ├── coordinate.en.md
│       │       │   ├── coordinate.zh.md
│       │       │   ├── download-image.en.md
│       │       │   ├── download-image.zh.md
│       │       │   ├── event.en.md
│       │       │   ├── event.zh.md
│       │       │   ├── iconfont.en.md
│       │       │   ├── iconfont.zh.md
│       │       │   ├── renderer.en.md
│       │       │   └── renderer.zh.md
│       │       ├── getting-started/
│       │       │   ├── installation.en.md
│       │       │   ├── installation.zh.md
│       │       │   ├── integration/
│       │       │   │   ├── angular.en.md
│       │       │   │   ├── angular.zh.md
│       │       │   │   ├── react.en.md
│       │       │   │   ├── react.zh.md
│       │       │   │   ├── vue.en.md
│       │       │   │   └── vue.zh.md
│       │       │   ├── quick-start.en.md
│       │       │   ├── quick-start.zh.md
│       │       │   ├── step-by-step.en.md
│       │       │   └── step-by-step.zh.md
│       │       ├── graph/
│       │       │   ├── extension.en.md
│       │       │   ├── extension.zh.md
│       │       │   ├── extensions.en.md
│       │       │   ├── extensions.zh.md
│       │       │   ├── graph.en.md
│       │       │   ├── graph.zh.md
│       │       │   ├── option.en.md
│       │       │   └── option.zh.md
│       │       ├── introduction.en.md
│       │       ├── introduction.zh.md
│       │       ├── layout/
│       │       │   ├── AntvDagreLayout.en.md
│       │       │   ├── AntvDagreLayout.zh.md
│       │       │   ├── BaseLayout.en.md
│       │       │   ├── BaseLayout.zh.md
│       │       │   ├── CircularLayout.en.md
│       │       │   ├── CircularLayout.zh.md
│       │       │   ├── ComboCombinedLayout.en.md
│       │       │   ├── ComboCombinedLayout.zh.md
│       │       │   ├── CompactBoxLayout.en.md
│       │       │   ├── CompactBoxLayout.zh.md
│       │       │   ├── ConcentricLayout.en.md
│       │       │   ├── ConcentricLayout.zh.md
│       │       │   ├── D3Force3DLayout.en.md
│       │       │   ├── D3Force3DLayout.zh.md
│       │       │   ├── D3ForceLayout.en.md
│       │       │   ├── D3ForceLayout.zh.md
│       │       │   ├── DagreLayout.en.md
│       │       │   ├── DagreLayout.zh.md
│       │       │   ├── DendrogramLayout.en.md
│       │       │   ├── DendrogramLayout.zh.md
│       │       │   ├── Fishbone.en.md
│       │       │   ├── Fishbone.zh.md
│       │       │   ├── ForceAtlas2Layout.en.md
│       │       │   ├── ForceAtlas2Layout.zh.md
│       │       │   ├── ForceLayout.en.md
│       │       │   ├── ForceLayout.zh.md
│       │       │   ├── FruchtermanLayout.en.md
│       │       │   ├── FruchtermanLayout.zh.md
│       │       │   ├── GridLayout.en.md
│       │       │   ├── GridLayout.zh.md
│       │       │   ├── IndentedLayout.en.md
│       │       │   ├── IndentedLayout.zh.md
│       │       │   ├── MdsLayout.en.md
│       │       │   ├── MdsLayout.zh.md
│       │       │   ├── MindmapLayout.en.md
│       │       │   ├── MindmapLayout.zh.md
│       │       │   ├── RadialLayout.en.md
│       │       │   ├── RadialLayout.zh.md
│       │       │   ├── RandomLayout.en.md
│       │       │   ├── RandomLayout.zh.md
│       │       │   ├── Snake.en.md
│       │       │   ├── Snake.zh.md
│       │       │   ├── custom-layout.en.md
│       │       │   ├── custom-layout.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── plugin/
│       │       │   ├── Background.en.md
│       │       │   ├── Background.zh.md
│       │       │   ├── BubbleSets.en.md
│       │       │   ├── BubbleSets.zh.md
│       │       │   ├── Contextmenu.en.md
│       │       │   ├── Contextmenu.zh.md
│       │       │   ├── EdgeBundling.en.md
│       │       │   ├── EdgeBundling.zh.md
│       │       │   ├── EdgeFilterLens.en.md
│       │       │   ├── EdgeFilterLens.zh.md
│       │       │   ├── Fisheye.en.md
│       │       │   ├── Fisheye.zh.md
│       │       │   ├── Fullscreen.en.md
│       │       │   ├── Fullscreen.zh.md
│       │       │   ├── GridLine.en.md
│       │       │   ├── GridLine.zh.md
│       │       │   ├── History.en.md
│       │       │   ├── History.zh.md
│       │       │   ├── Hull.en.md
│       │       │   ├── Hull.zh.md
│       │       │   ├── Legend.en.md
│       │       │   ├── Legend.zh.md
│       │       │   ├── Minimap.en.md
│       │       │   ├── Minimap.zh.md
│       │       │   ├── Snapline.en.md
│       │       │   ├── Snapline.zh.md
│       │       │   ├── Timebar.en.md
│       │       │   ├── Timebar.zh.md
│       │       │   ├── Title.en.md
│       │       │   ├── Title.zh.md
│       │       │   ├── Toolbar.en.md
│       │       │   ├── Toolbar.zh.md
│       │       │   ├── Tooltip.en.md
│       │       │   ├── Tooltip.zh.md
│       │       │   ├── Watermark.en.md
│       │       │   ├── Watermark.zh.md
│       │       │   ├── custom-plugin.en.md
│       │       │   ├── custom-plugin.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       ├── theme/
│       │       │   ├── custom-palette.en.md
│       │       │   ├── custom-palette.zh.md
│       │       │   ├── custom-theme.en.md
│       │       │   ├── custom-theme.zh.md
│       │       │   ├── overview.en.md
│       │       │   ├── overview.zh.md
│       │       │   ├── palette.en.md
│       │       │   └── palette.zh.md
│       │       ├── transform/
│       │       │   ├── MapNodeSize.en.md
│       │       │   ├── MapNodeSize.zh.md
│       │       │   ├── PlaceRadialLabels.en.md
│       │       │   ├── PlaceRadialLabels.zh.md
│       │       │   ├── ProcessParallelEdges.en.md
│       │       │   ├── ProcessParallelEdges.zh.md
│       │       │   ├── custom-transform.en.md
│       │       │   ├── custom-transform.zh.md
│       │       │   ├── overview.en.md
│       │       │   └── overview.zh.md
│       │       └── whats-new/
│       │           ├── feature.en.md
│       │           ├── feature.zh.md
│       │           ├── upgrade.en.md
│       │           └── upgrade.zh.md
│       ├── examples/
│       │   ├── algorithm/
│       │   │   └── case/
│       │   │       ├── demo/
│       │   │       │   ├── label-propagation.js
│       │   │       │   ├── louvain.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── pattern-matching.js
│       │   │       │   └── shortest-path.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── animation/
│       │   │   ├── basic/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── combo-collapse-expand.js
│       │   │   │   │   ├── enter-edge-path-in.js
│       │   │   │   │   ├── enter.js
│       │   │   │   │   ├── exit.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── update.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── persistence/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── ant-line.js
│       │   │   │   │   ├── breathing-circle.js
│       │   │   │   │   ├── fly-marker.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── path-in.js
│       │   │   │   │   └── ripple-circle.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── viewport/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   ├── rotate.js
│       │   │       │   ├── translate.js
│       │   │       │   └── zoom.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── behavior/
│       │   │   ├── auto-adapt-label/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── canvas/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── drag.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── optimize.js
│       │   │   │   │   ├── scroll-and-zoom.js
│       │   │   │   │   ├── scroll-xy.js
│       │   │   │   │   ├── scroll-y.js
│       │   │   │   │   └── zoom.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── collapse-expand.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── create-edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── between-combos.js
│       │   │   │   │   ├── by-click.js
│       │   │   │   │   ├── by-drag.js
│       │   │   │   │   ├── custom-edge-style.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fix-element-size/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── autosize-label.js
│       │   │   │   │   ├── fix-font-size.js
│       │   │   │   │   ├── fix-size.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── focus/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── highlight-element/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── activate-relations.js
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── config-params.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── inner-event/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── select/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── brush-combo.js
│       │   │   │   │   ├── brush.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── lasso.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── update-label/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   └── update.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── element/
│       │   │   ├── combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── circle.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── rect.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-combo/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── extra-button.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── custom-arrow.js
│       │   │   │   │   ├── custom-path.js
│       │   │   │   │   ├── extra-label.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom-node/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── g2-activity-chart.js
│       │   │   │   │   ├── g2-bar-chart.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── react-node.jsx
│       │   │   │   │   └── reactnode-idcard.jsx
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── arrows.js
│       │   │   │   │   ├── cubic.js
│       │   │   │   │   ├── horizontal-cubic.js
│       │   │   │   │   ├── line.js
│       │   │   │   │   ├── loop-curve.js
│       │   │   │   │   ├── loop-polyline.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── polyline-orth-with-cps.js
│       │   │   │   │   ├── polyline-orth.js
│       │   │   │   │   ├── polyline.js
│       │   │   │   │   ├── quadratic.js
│       │   │   │   │   └── vertical-cubic.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── label/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── background.js
│       │   │   │   │   ├── copy.js
│       │   │   │   │   ├── ellipsis.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── word-wrap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── node/
│       │   │       ├── demo/
│       │   │       │   ├── 3d-node.js
│       │   │       │   ├── circle.js
│       │   │       │   ├── diamond.js
│       │   │       │   ├── donut.js
│       │   │       │   ├── ellipse.js
│       │   │       │   ├── hexagon.js
│       │   │       │   ├── html.js
│       │   │       │   ├── image.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── port.js
│       │   │       │   ├── rect.js
│       │   │       │   ├── rounded-rect.js
│       │   │       │   ├── star.js
│       │   │       │   └── triangle.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── examples.md
│       │   ├── feature/
│       │   │   └── default/
│       │   │       ├── demo/
│       │   │       │   ├── 3d-massive.js
│       │   │       │   ├── lite-solar-system.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── theme.js
│       │   │       │   └── unicorns-investors.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── layout/
│       │   │   ├── circular/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── degree.js
│       │   │   │   │   ├── division.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── spiral.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── combo-layout/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── combo-combined.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── compact-box/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── radial.js
│       │   │   │   │   └── vertical.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── concentric/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── custom/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── arc.js
│       │   │   │   │   ├── bi-graph.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── dagre/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── antv-dagre-combo.js
│       │   │   │   │   ├── antv-dagre.js
│       │   │   │   │   ├── dagre.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── dendrogram/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── radial.js
│       │   │   │   │   └── vertical.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fishbone/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── force-directed/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── 3d-force.js
│       │   │   │   │   ├── atlas2.js
│       │   │   │   │   ├── bubbles.js
│       │   │   │   │   ├── collision.js
│       │   │   │   │   ├── d3-force.js
│       │   │   │   │   ├── drag-fixed.js
│       │   │   │   │   ├── force.js
│       │   │   │   │   ├── functional-params.js
│       │   │   │   │   ├── mesh.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── prevent-overlap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fruchterman/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── cluster.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── run-in-gpu.js
│       │   │   │   │   └── run-in-web-worker.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── grid/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── indented/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── auto-side.js
│       │   │   │   │   ├── custom-side.js
│       │   │   │   │   ├── left-side.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── no-drop-cap.js
│       │   │   │   │   └── right-side.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mds/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mechanism/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── change-data.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── switch.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── mindmap/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── auto-side.js
│       │   │   │   │   ├── custom-side.js
│       │   │   │   │   ├── left-side.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── right-side.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── radial/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── cluster-sort.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── non-strict-prevent-overlap.js
│       │   │   │   │   └── strict-prevent-overlap.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── snake/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── gutter.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── sub-graph/
│       │   │       ├── demo/
│       │   │       │   ├── basic.js
│       │   │       │   └── meta.json
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── performance/
│       │   │   └── massive-data/
│       │   │       ├── demo/
│       │   │       │   ├── 20000.js
│       │   │       │   ├── 5000.js
│       │   │       │   ├── 60000.js
│       │   │       │   └── meta.json
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── plugin/
│       │   │   ├── background/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── background.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── bubble-sets/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── contextMenu/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge-bundling/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── edge-filter-lens/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fisheye/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── custom.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── fullscreen/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── grid-line/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── history/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── hull/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── legend/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── style.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── minimap/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── snapline/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── autoSnap.js
│       │   │   │   │   ├── basic.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── timebar/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── chart.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   └── time.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── toolbar/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── custom.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   ├── tooltip/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── basic.js
│       │   │   │   │   ├── click.js
│       │   │   │   │   ├── dual.js
│       │   │   │   │   └── meta.json
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── watermark/
│       │   │       ├── demo/
│       │   │       │   ├── meta.json
│       │   │       │   ├── repeat.js
│       │   │       │   └── text.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   ├── scene-case/
│       │   │   ├── default/
│       │   │   │   ├── demo/
│       │   │   │   │   ├── battle-array.jsx
│       │   │   │   │   ├── fund-flow.js
│       │   │   │   │   ├── meta.json
│       │   │   │   │   ├── music-festival.js
│       │   │   │   │   ├── organization-chart.js
│       │   │   │   │   ├── performance-diagnosis-flowchart.js
│       │   │   │   │   ├── snake-flow-diagram.js
│       │   │   │   │   ├── sub-graph.js
│       │   │   │   │   └── why-do-cats.js
│       │   │   │   ├── index.en.md
│       │   │   │   └── index.zh.md
│       │   │   └── tree-graph/
│       │   │       ├── demo/
│       │   │       │   ├── anti-procrastination-fishbone.js
│       │   │       │   ├── indented-tree.js
│       │   │       │   ├── meta.json
│       │   │       │   ├── mindmap.js
│       │   │       │   ├── product-fishbone.js
│       │   │       │   ├── radial-compact-tree.js
│       │   │       │   └── radial-dendrogram.js
│       │   │       ├── index.en.md
│       │   │       └── index.zh.md
│       │   └── transform/
│       │       └── process-parallel-edges/
│       │           ├── demo/
│       │           │   ├── bundle.js
│       │           │   ├── merge.js
│       │           │   └── meta.json
│       │           ├── index.en.md
│       │           └── index.zh.md
│       ├── mako.config.json
│       ├── package.json
│       ├── scripts/
│       │   ├── clear-doc.ts
│       │   ├── doc-template.mjs
│       │   ├── extract-playground.js
│       │   ├── generate-api.ts
│       │   ├── generate-doc.ts
│       │   ├── rewrite-ob.ts
│       │   └── sort-doc.ts
│       ├── src/
│       │   ├── MarkdownDocumenter.ts
│       │   ├── constants/
│       │   │   ├── index.ts
│       │   │   ├── link.ts
│       │   │   └── locales/
│       │   │       ├── api-category.json
│       │   │       ├── element.json
│       │   │       ├── enum.ts
│       │   │       ├── helper.json
│       │   │       ├── index.ts
│       │   │       ├── keyword.json
│       │   │       └── page-name.json
│       │   ├── markdown/
│       │   │   ├── CustomMarkdownEmitter.ts
│       │   │   └── MarkdownEmitter.ts
│       │   ├── nodes/
│       │   │   ├── CustomDocNodeKind.ts
│       │   │   ├── DocContainer.ts
│       │   │   ├── DocDetails.ts
│       │   │   ├── DocEmphasisSpan.ts
│       │   │   ├── DocHeading.ts
│       │   │   ├── DocNoteBox.ts
│       │   │   ├── DocPageTitle.ts
│       │   │   ├── DocTable.ts
│       │   │   ├── DocTableCell.ts
│       │   │   ├── DocTableRow.ts
│       │   │   ├── DocText.ts
│       │   │   └── DocUnorderedList.ts
│       │   └── utils/
│       │       ├── IndentedWriter.ts
│       │       ├── Utilities.ts
│       │       ├── excerpt-token.ts
│       │       ├── gitignore.ts
│       │       └── parser.ts
│       └── tsconfig.json
├── playwright.config.ts
├── pnpm-workspace.yaml
├── scripts/
│   ├── demo-to-test/
│   │   ├── core/
│   │   │   ├── global.js
│   │   │   ├── index.js
│   │   │   ├── parser.js
│   │   │   └── utils.js
│   │   ├── index.js
│   │   └── template/
│   │       ├── it.js
│   │       ├── spec.js
│   │       └── test.js
│   └── version.sh
├── tests/
│   └── g6/
│       ├── elements/
│       │   └── node-element.spec.ts
│       └── plugins/
│           ├── plugins-minimap.spec.ts
│           └── plugins-tooltip.spec.ts
├── tsconfig.json
└── turbo.json
Download .txt
Showing preview only (221K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2406 symbols across 387 files)

FILE: .github/workflows/scripts/issue-automated.js
  function prepareAIPrompt (line 62) | function prepareAIPrompt(context, issue) {
  function getAIResponse (line 78) | async function getAIResponse(core, userQuestion) {

FILE: .github/workflows/scripts/updateYuque.js
  function clearAllDocs (line 24) | async function clearAllDocs() {
  function createDoc (line 97) | async function createDoc(title, body, type) {
  function updateToc (line 137) | async function updateToc() {
  function processMarkdownFiles (line 167) | async function processMarkdownFiles() {
  function processExampleFiles (line 214) | async function processExampleFiles() {

FILE: packages/cli/src/index.ts
  constant TEMPLATES (line 19) | const TEMPLATES = [
  constant TEMPLATE_NAMES (line 27) | const TEMPLATE_NAMES = TEMPLATES.map((template) => template.name);
  function init (line 29) | async function init() {
  function formatTargetDir (line 181) | function formatTargetDir(targetDir: string | undefined) {
  function copy (line 185) | function copy(src: string, dest: string, variables: Record<string, strin...
  function copyDir (line 196) | function copyDir(srcDir: string, destDir: string, variables: Record<stri...
  function isEmpty (line 205) | function isEmpty(path: string) {
  function emptyDir (line 210) | function emptyDir(dir: string) {
  function pkgFromUserAgent (line 222) | function pkgFromUserAgent(userAgent: string | undefined) {
  function replaceTemplateVariables (line 232) | function replaceTemplateVariables(content: string, variables: Record<str...

FILE: packages/cli/template-extension/__tests__/main.ts
  function initContainer (line 33) | function initContainer() {
  function initContext (line 39) | function initContext() {
  function render (line 44) | async function render(name: string) {
  function destroyForm (line 53) | function destroyForm() {

FILE: packages/cli/template-extension/__tests__/types.d.ts
  type TestCase (line 5) | interface TestCase {
  type TestContext (line 10) | type TestContext = GraphOptions;

FILE: packages/cli/template-extension/__tests__/utils/create.ts
  function getRenderer (line 7) | function getRenderer(renderer: string) {
  function createGraphCanvas (line 27) | function createGraphCanvas(
  function createDemoGraph (line 53) | async function createDemoGraph(demo: TestCase, context?: Partial<TestCon...

FILE: packages/cli/template-extension/__tests__/utils/dir.ts
  function getSnapshotDir (line 11) | function getSnapshotDir(dir: string, detail: string = 'default'): [strin...

FILE: packages/cli/template-extension/__tests__/utils/offscreen-canvas-context.ts
  function measureText (line 88) | function measureText(text: string, fontSize: number) {
  class OffscreenCanvasContext (line 96) | class OffscreenCanvasContext {
    method constructor (line 99) | constructor(public canvas: HTMLCanvasElement) {}
    method font (line 101) | set font(font: string) {
    method fillRect (line 108) | fillRect() {}
    method fillText (line 109) | fillText() {}
    method getImageData (line 110) | getImageData(sx: number, sy: number, sw: number, sh: number) {
    method measureText (line 117) | measureText(text: string) {

FILE: packages/cli/template-extension/__tests__/utils/sleep.ts
  function sleep (line 1) | function sleep(n: number) {

FILE: packages/cli/template-extension/__tests__/utils/svg-transformer.js
  method process (line 2) | process() {

FILE: packages/cli/template-extension/__tests__/utils/to-match-svg-snapshot.ts
  type ToMatchSVGSnapshotOptions (line 11) | type ToMatchSVGSnapshotOptions = {
  function toMatchSVGSnapshot (line 23) | async function toMatchSVGSnapshot(
  function toMatchSnapshot (line 96) | async function toMatchSnapshot(
  function toMatchAnimation (line 109) | async function toMatchAnimation(

FILE: packages/cli/template-extension/__tests__/utils/use-snapshot-matchers.ts
  type Matchers (line 11) | interface Matchers<R> {

FILE: packages/cli/template-extension/src/elements/nodes/extend-node.ts
  type ExtendNodeStyleProps (line 4) | interface ExtendNodeStyleProps extends CircleStyleProps {}
  class ExtendNode (line 6) | class ExtendNode extends Circle {}

FILE: packages/cli/template-extension/vite.config.js
  method configureServer (line 13) | configureServer(server) {

FILE: packages/g6-extension-3d/__tests__/main.ts
  function initContainer (line 31) | function initContainer() {
  function initContext (line 37) | function initContext() {
  function render (line 42) | async function render(name: string) {
  function destroyForm (line 51) | function destroyForm() {

FILE: packages/g6-extension-3d/__tests__/types.d.ts
  type TestCase (line 5) | interface TestCase {
  type TestContext (line 10) | type TestContext = G6Spec;

FILE: packages/g6-extension-3d/src/behaviors/drag-canvas-3d.ts
  type DragCanvas3DOptions (line 9) | interface DragCanvas3DOptions extends DragCanvasOptions {}
  class DragCanvas3D (line 16) | class DragCanvas3D extends DragCanvas {
    method translate (line 17) | protected async translate(offset: Vector2, animation?: ViewportAnimati...

FILE: packages/g6-extension-3d/src/behaviors/observe-canvas-3d.ts
  type ObserveCanvas3DOptions (line 10) | interface ObserveCanvas3DOptions extends BaseBehaviorOptions {
  class ObserveCanvas3D (line 43) | class ObserveCanvas3D extends BaseBehavior<ObserveCanvas3DOptions> {
    method camera (line 52) | private get camera() {
    method constructor (line 56) | constructor(context: RuntimeContext, options: ObserveCanvas3DOptions) {
    method update (line 62) | public update(options: Partial<ObserveCanvas3DOptions>): void {
    method getRatio (line 79) | private getRatio() {
    method bindEvents (line 93) | private bindEvents() {
    method destroy (line 100) | public destroy() {

FILE: packages/g6-extension-3d/src/behaviors/roll-canvas-3d.ts
  type RollCanvas3DOptions (line 9) | interface RollCanvas3DOptions extends BaseBehaviorOptions {
  class RollCanvas3D (line 30) | class RollCanvas3D extends BasePlugin<RollCanvas3DOptions> {
    method camera (line 39) | private get camera() {
    method constructor (line 43) | constructor(context: RuntimeContext, options: RollCanvas3DOptions) {
    method getAngle (line 49) | private getAngle(delta: number): number {
    method bindEvents (line 60) | private bindEvents() {

FILE: packages/g6-extension-3d/src/behaviors/zoom-canvas-3d.ts
  type ZoomCanvas3DOptions (line 16) | interface ZoomCanvas3DOptions extends ZoomCanvasOptions {}
  class ZoomCanvas3D (line 23) | class ZoomCanvas3D extends ZoomCanvas {

FILE: packages/g6-extension-3d/src/elements/base-node-3d.ts
  type BaseNode3DStyleProps (line 16) | interface BaseNode3DStyleProps extends BaseNodeStyleProps, Prefix<'mater...
  method plugin (line 35) | protected get plugin() {
  method device (line 41) | protected get device() {
  method constructor (line 45) | constructor(options: DisplayObjectConfig<S>) {
  method render (line 49) | public render(attributes: Required<S>, container: Group) {
  method getKeyStyle (line 53) | protected getKeyStyle(attributes: Required<S>): MeshStyleProps {
  method drawKeyShape (line 60) | protected drawKeyShape(attributes: Required<S>, container: Group = this) {
  method getMaterial (line 66) | protected getMaterial(attributes: Required<S>): GMaterial<any> {
  type MeshStyleProps (line 72) | interface MeshStyleProps extends BaseStyleProps {

FILE: packages/g6-extension-3d/src/elements/capsule.ts
  type CapsuleStyleProps (line 15) | type CapsuleStyleProps = BaseNode3DStyleProps & CapsuleGeometryProps;
  class Capsule (line 22) | class Capsule extends BaseNode3D<CapsuleStyleProps> {
    method constructor (line 30) | constructor(options: DisplayObjectConfig<CapsuleStyleProps>) {
    method getSize (line 34) | protected getSize(attributes: CapsuleStyleProps = this.attributes): Ve...
    method getGeometry (line 40) | protected getGeometry(attributes: Required<CapsuleStyleProps>): GGeome...

FILE: packages/g6-extension-3d/src/elements/cone.ts
  type ConeStyleProps (line 15) | type ConeStyleProps = BaseNode3DStyleProps & ConeGeometryProps;
  class Cone (line 22) | class Cone extends BaseNode3D<ConeStyleProps> {
    method constructor (line 30) | constructor(options: DisplayObjectConfig<ConeStyleProps>) {
    method getSize (line 34) | protected getSize(attributes: ConeStyleProps = this.attributes): Vecto...
    method getGeometry (line 40) | protected getGeometry(attributes: Required<ConeStyleProps>): GGeometry...

FILE: packages/g6-extension-3d/src/elements/cube.ts
  type CubeStyleProps (line 14) | type CubeStyleProps = BaseNode3DStyleProps & CubeGeometryProps;
  class Cube (line 21) | class Cube extends BaseNode3D<CubeStyleProps> {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<CubeStyleProps>) {
    method getGeometry (line 32) | protected getGeometry(attributes: Required<CubeStyleProps>): GGeometry...

FILE: packages/g6-extension-3d/src/elements/cylinder.ts
  type CylinderStyleProps (line 15) | type CylinderStyleProps = BaseNode3DStyleProps & CylinderGeometryProps;
  class Cylinder (line 22) | class Cylinder extends BaseNode3D<CylinderStyleProps> {
    method constructor (line 30) | constructor(options: DisplayObjectConfig<CylinderStyleProps>) {
    method getSize (line 34) | protected getSize(attributes: CylinderStyleProps = this.attributes): V...
    method getGeometry (line 40) | protected getGeometry(attributes: Required<CylinderStyleProps>): GGeom...

FILE: packages/g6-extension-3d/src/elements/line-3d.ts
  type Line3DStyleProps (line 11) | interface Line3DStyleProps extends BaseEdgeStyleProps {}
  class Line3D (line 18) | class Line3D extends BaseEdge {
    method getKeyPath (line 19) | protected getKeyPath(): any {
    method getKeyStyle (line 23) | protected getKeyStyle(attributes: Required<Line3DStyleProps>): any {
    method drawKeyShape (line 33) | protected drawKeyShape(attributes = this.parsedAttributes, container: ...

FILE: packages/g6-extension-3d/src/elements/plane.ts
  type PlaneStyleProps (line 14) | type PlaneStyleProps = BaseNode3DStyleProps & PlaneGeometryProps;
  class Plane (line 21) | class Plane extends BaseNode3D<PlaneStyleProps> {
    method constructor (line 26) | constructor(options: DisplayObjectConfig<PlaneStyleProps>) {
    method getGeometry (line 30) | protected getGeometry(attributes: Required<PlaneStyleProps>): GGeometr...

FILE: packages/g6-extension-3d/src/elements/sphere.ts
  type SphereStyleProps (line 14) | type SphereStyleProps = BaseNode3DStyleProps & SphereGeometryProps;
  class Sphere (line 21) | class Sphere extends BaseNode3D<SphereStyleProps> {
    method constructor (line 29) | constructor(options: DisplayObjectConfig<SphereStyleProps>) {
    method getGeometry (line 33) | protected getGeometry(attributes: Required<SphereStyleProps>): GGeomet...

FILE: packages/g6-extension-3d/src/elements/torus.ts
  type TorusStyleProps (line 15) | type TorusStyleProps = BaseNode3DStyleProps & TorusGeometryProps;
  class Torus (line 22) | class Torus extends BaseNode3D<TorusStyleProps> {
    method constructor (line 30) | constructor(options: DisplayObjectConfig<TorusStyleProps>) {
    method getSize (line 34) | protected getSize(attributes: TorusStyleProps = this.attributes): Vect...
    method getGeometry (line 40) | protected getGeometry(attributes: Required<TorusStyleProps>): GGeometr...

FILE: packages/g6-extension-3d/src/plugins/light.ts
  type LightOptions (line 12) | interface LightOptions extends BasePluginOptions {
  class Light (line 32) | class Light extends BasePlugin<LightOptions> {
    method constructor (line 49) | constructor(context: RuntimeContext, options: LightOptions) {
    method bindEvents (line 54) | private bindEvents() {
    method unbindEvents (line 58) | private unbindEvents() {
    method upsertLight (line 71) | private upsertLight(type: 'ambient' | 'directional', options?: Ambient...
    method destroy (line 90) | public destroy() {

FILE: packages/g6-extension-3d/src/types/material.ts
  type Material (line 4) | type Material = PointMaterial | BasicMaterial | LambertMaterial | PhongM...
  type PointMaterial (line 6) | interface PointMaterial extends Partial<Omit<IPointMaterial, 'map'>> {
  type BasicMaterial (line 11) | interface BasicMaterial extends Partial<Omit<IMeshBasicMaterial, 'map' |...
  type LambertMaterial (line 16) | interface LambertMaterial extends Partial<Omit<IMeshLambertMaterial, 'ma...
  type PhongMaterial (line 22) | interface PhongMaterial extends Partial<Omit<IMeshPhongMaterial, 'map' |...

FILE: packages/g6-extension-3d/src/utils/cache.ts
  function getCacheKey (line 8) | function getCacheKey(props: Record<string, any>): symbol {

FILE: packages/g6-extension-3d/src/utils/geometry.ts
  constant DEVICE (line 4) | let DEVICE: Device;
  constant GEOMETRY_CACHE (line 6) | const GEOMETRY_CACHE = new Map<string, unknown>();
  function createGeometry (line 18) | function createGeometry<T extends ProceduralGeometry<any>>(

FILE: packages/g6-extension-3d/src/utils/map.ts
  class TupleMap (line 1) | class TupleMap<K1, K2, V> {
    method has (line 4) | has(key1: K1, key2: K2) {
    method get (line 8) | get(key1: K1, key2: K2) {
    method set (line 12) | set(key1: K1, key2: K2, value: V) {
    method clear (line 19) | clear() {

FILE: packages/g6-extension-3d/src/utils/material.ts
  type MaterialCache (line 10) | type MaterialCache = TupleMap<symbol, string | TexImageSource | undefine...
  constant MATERIAL_CACHE_KEY (line 12) | const MATERIAL_CACHE_KEY = '__MATERIAL_CACHE__';
  constant MATERIAL_MAP (line 14) | const MATERIAL_MAP = {
  function createMaterial (line 30) | function createMaterial(plugin: Plugin, options: Material, texture?: str...

FILE: packages/g6-extension-3d/src/utils/texture.ts
  type TextureCache (line 5) | type TextureCache = Map<string | TexImageSource, Texture>;
  constant TEXTURE_CACHE_KEY (line 7) | const TEXTURE_CACHE_KEY = '__TEXTURE_CACHE__';
  function createTexture (line 19) | function createTexture(plugin: Plugin, src?: string | TexImageSource): T...

FILE: packages/g6-extension-react/__tests__/demos/performance-diagnosis.tsx
  constant ACTIVE_COLOR (line 10) | const ACTIVE_COLOR = '#f6c523';
  constant COLOR_MAP (line 11) | const COLOR_MAP: Record<string, string> = {
  class HoverElement (line 18) | class HoverElement extends HoverActivate {
    method getActiveIds (line 19) | protected getActiveIds(event: IPointerEvent<Element>) {

FILE: packages/g6-extension-react/__tests__/demos/react-node.tsx
  type Datum (line 14) | type Datum = {

FILE: packages/g6-extension-react/__tests__/graph.tsx
  type GraphProps (line 5) | interface GraphProps {

FILE: packages/g6-extension-react/src/react-node/node.tsx
  type ReactNodeStyleProps (line 7) | interface ReactNodeStyleProps extends BaseNodeStyleProps {
  class ReactNode (line 16) | class ReactNode extends HTML {
    method getKeyStyle (line 17) | protected getKeyStyle(attributes: Required<HTMLStyleProps>): GHTMLStyl...
    method constructor (line 21) | constructor(options: DisplayObjectConfig<ReactNodeStyleProps>) {
    method update (line 25) | public update(attr?: Partial<ReactNodeStyleProps> | undefined): void {
    method connectedCallback (line 29) | public connectedCallback() {
    method attributeChangedCallback (line 38) | public attributeChangedCallback(name: any, oldValue: any, newValue: an...
    method destroy (line 48) | public destroy(): void {

FILE: packages/g6-extension-react/src/react-node/render.ts
  type ContainerType (line 4) | type ContainerType = Element | DocumentFragment;
  function getReactMajorVersion (line 14) | function getReactMajorVersion(): number {
  function render (line 45) | async function render(node: React.ReactElement, container: ContainerType) {
  function unmount (line 57) | async function unmount(container: ContainerType) {

FILE: packages/g6-extension-react/src/react-node/render16.ts
  type ContainerType (line 4) | type ContainerType = Element | DocumentFragment;
  function render (line 15) | function render(node: React.ReactElement, container: ContainerType) {
  function unmount (line 25) | function unmount(container: ContainerType) {

FILE: packages/g6-extension-react/src/react-node/render18.ts
  type ContainerType (line 5) | type ContainerType = (Element | DocumentFragment) & {
  constant MARK (line 9) | const MARK = '__rc_react_root__';
  function initReactDOMClient (line 19) | function initReactDOMClient() {
  function toggleWarning (line 32) | function toggleWarning(skip: boolean) {
  function render (line 58) | async function render(node: React.ReactNode, container: ContainerType) {
  function unmount (line 79) | async function unmount(container: ContainerType) {

FILE: packages/g6-ssr/__tests__/graph.spec.ts
  type Matchers (line 10) | interface Matchers<R> {

FILE: packages/g6-ssr/src/canvas.ts
  function createCanvas (line 14) | function createCanvas(options: Options): [G6Canvas, NodeCanvas] {

FILE: packages/g6-ssr/src/graph.ts
  function getInfoOf (line 13) | function getInfoOf(options: Options) {
  function createGraph (line 31) | async function createGraph(options: Options) {

FILE: packages/g6-ssr/src/types.ts
  type Options (line 6) | interface Options extends Omit<GraphOptions, 'renderer' | 'container'> {
  type MetaData (line 37) | type MetaData = PdfConfig | PngConfig | JpegConfig;
  type Graph (line 39) | interface Graph {

FILE: packages/g6/__tests__/demos/animation-element-state.ts
  class BreathingCircle (line 4) | class BreathingCircle extends Circle {
    method onCreate (line 5) | onCreate() {
  class FlyLine (line 14) | class FlyLine extends Line {
    method onCreate (line 15) | onCreate() {

FILE: packages/g6/__tests__/demos/bug-drag-rotated-element-force.ts
  function getData (line 40) | function getData(size = 10) {

FILE: packages/g6/__tests__/demos/case-fishbone.ts
  type AssignColorByBranchOptions (line 42) | interface AssignColorByBranchOptions extends BaseTransformOptions {
  class AssignColorByBranch (line 54) | class AssignColorByBranch extends BaseTransform {
    method constructor (line 70) | constructor(context: RuntimeContext, options: AssignColorByBranchOptio...
    method beforeDraw (line 74) | beforeDraw(input: DrawData): DrawData {
  class ArrangeEdgeZIndex (line 95) | class ArrangeEdgeZIndex extends BaseTransform {
    method beforeDraw (line 96) | public beforeDraw(input: DrawData): DrawData {

FILE: packages/g6/__tests__/demos/case-fund-flow.ts
  class TreeNode (line 17) | class TreeNode extends Rect {
    method data (line 18) | get data() {
    method childrenData (line 22) | get childrenData() {
    method getLabelStyle (line 26) | protected getLabelStyle(attributes: Required<RectStyleProps>): LabelSt...
    method getPriceStyle (line 39) | protected getPriceStyle(attributes: Required<RectStyleProps>): GTextSt...
    method drawPriceShape (line 51) | protected drawPriceShape(attributes: Required<RectStyleProps>, contain...
    method getCurrencyStyle (line 56) | protected getCurrencyStyle(attributes: Required<RectStyleProps>): GTex...
    method drawCurrencyShape (line 68) | protected drawCurrencyShape(attributes: Required<RectStyleProps>, cont...
    method getPercentStyle (line 73) | protected getPercentStyle(attributes: Required<RectStyleProps>): GText...
    method drawPercentShape (line 85) | protected drawPercentShape(attributes: Required<RectStyleProps>, conta...
    method getTriangleStyle (line 90) | protected getTriangleStyle(attributes: Required<RectStyleProps>): Labe...
    method drawTriangleShape (line 104) | protected drawTriangleShape(attributes: Required<RectStyleProps>, cont...
    method getVariableStyle (line 109) | protected getVariableStyle(attributes: Required<RectStyleProps>): GTex...
    method drawVariableShape (line 122) | protected drawVariableShape(attributes: Required<RectStyleProps>, cont...
    method getCollapseStyle (line 127) | protected getCollapseStyle(attributes: Required<RectStyleProps>): Badg...
    method drawCollapseShape (line 149) | protected drawCollapseShape(attributes: Required<RectStyleProps>, cont...
    method getProcessBarStyle (line 164) | protected getProcessBarStyle(attributes: Required<RectStyleProps>): GR...
    method drawProcessBarShape (line 181) | protected drawProcessBarShape(attributes: Required<RectStyleProps>, co...
    method getKeyStyle (line 186) | protected getKeyStyle(attributes: Required<RectStyleProps>): GRectStyl...
    method render (line 196) | public render(attributes: Required<RectStyleProps> = this.parsedAttrib...

FILE: packages/g6/__tests__/demos/case-indented-tree.ts
  type IndentedNodeStyleProps (line 65) | interface IndentedNodeStyleProps extends BaseNodeStyleProps {
  class IndentedNode (line 75) | class IndentedNode extends BaseNode<IndentedNodeStyleProps> {
    method constructor (line 89) | constructor(options: DisplayObjectConfig<IndentedNodeStyleProps>) {
    method childrenData (line 94) | protected get childrenData() {
    method getKeyStyle (line 98) | protected getKeyStyle(attributes: Required<IndentedNodeStyleProps>): R...
    method drawKeyShape (line 109) | protected drawKeyShape(attributes: Required<IndentedNodeStyleProps>, c...
    method getLabelStyle (line 114) | protected getLabelStyle(attributes: Required<IndentedNodeStyleProps>):...
    method drawIconArea (line 119) | private drawIconArea(attributes: Required<IndentedNodeStyleProps>, con...
    method forwardEvent (line 132) | private forwardEvent(target: DisplayObject | undefined, type: string, ...
    method getCountStyle (line 139) | private getCountStyle(attributes: Required<IndentedNodeStyleProps>): f...
    method drawCountShape (line 158) | private drawCountShape(attributes: Required<IndentedNodeStyleProps>, c...
    method isShowCollapse (line 171) | private isShowCollapse(attributes: Required<IndentedNodeStyleProps>) {
    method getCollapseStyle (line 175) | private getCollapseStyle(attributes: Required<IndentedNodeStyleProps>)...
    method drawCollapseShape (line 195) | private drawCollapseShape(attributes: Required<IndentedNodeStyleProps>...
    method getAddStyle (line 208) | private getAddStyle(attributes: Required<IndentedNodeStyleProps>): fal...
    method drawAddShape (line 232) | private drawAddShape(attributes: Required<IndentedNodeStyleProps>, con...
    method render (line 242) | public render(attributes: Required<IndentedNodeStyleProps> = this.pars...
  class IndentedEdge (line 253) | class IndentedEdge extends Polyline {
    method getControlPoints (line 254) | protected getControlPoints(attributes: Required<PolylineStyleProps>) {
  type CollapseExpandTreeOptions (line 262) | interface CollapseExpandTreeOptions extends BaseBehaviorOptions {
  class CollapseExpandTree (line 266) | class CollapseExpandTree extends BaseBehavior<CollapseExpandTreeOptions> {
    method constructor (line 267) | constructor(context: RuntimeContext, options: CollapseExpandTreeOption...
    method update (line 272) | public update(options: Partial<CollapseExpandTreeOptions>) {
    method bindEvents (line 278) | private bindEvents() {
    method unbindEvents (line 287) | private unbindEvents() {
  type DragBranchOptions (line 348) | interface DragBranchOptions extends BaseBehaviorOptions, Prefix<'shadow'...
  class DragBranch (line 357) | class DragBranch extends BaseBehavior<DragBranchOptions> {
    method constructor (line 358) | constructor(context: RuntimeContext, options: DragBranchOptions) {
    method update (line 363) | public update(options: Partial<DragBranchOptions>) {
    method bindEvents (line 369) | private bindEvents() {
    method unbindEvents (line 379) | private unbindEvents() {
    method validate (line 391) | private validate(event: IElementDragEvent) {
    method createShadow (line 400) | private createShadow(target: Element) {
    method moveShadow (line 419) | private moveShadow(offset: Vector2) {
    method destroyShadow (line 425) | private destroyShadow() {
    method getDelta (line 443) | private getDelta(event: IElementDragEvent): Vector2 {

FILE: packages/g6/__tests__/demos/case-mindmap.ts
  type MindmapNodeStyleProps (line 82) | interface MindmapNodeStyleProps extends BaseNodeStyleProps {
  class MindmapNode (line 88) | class MindmapNode extends BaseNode<MindmapNodeStyleProps> {
    method constructor (line 93) | constructor(options: DisplayObjectConfig<MindmapNodeStyleProps>) {
    method childrenData (line 98) | get childrenData() {
    method rootId (line 102) | get rootId() {
    method isShowCollapse (line 106) | private isShowCollapse(attributes: Required<MindmapNodeStyleProps>) {
    method getCollapseStyle (line 111) | protected getCollapseStyle(attributes: Required<MindmapNodeStyleProps>...
    method drawCollapseShape (line 133) | protected drawCollapseShape(attributes: Required<MindmapNodeStyleProps...
    method getCountStyle (line 146) | protected getCountStyle(attributes: Required<MindmapNodeStyleProps>): ...
    method drawCountShape (line 165) | protected drawCountShape(attributes: Required<MindmapNodeStyleProps>, ...
    method getAddStyle (line 178) | protected getAddStyle(attributes: Required<MindmapNodeStyleProps>): Ba...
    method getAddBarStyle (line 204) | protected getAddBarStyle(attributes: Required<MindmapNodeStyleProps>):...
    method drawAddShape (line 229) | protected drawAddShape(attributes: Required<MindmapNodeStyleProps>, co...
    method forwardEvent (line 241) | private forwardEvent(target: DisplayObject | undefined, type: string, ...
    method getKeyStyle (line 248) | protected getKeyStyle(attributes: Required<MindmapNodeStyleProps>): Re...
    method drawKeyShape (line 254) | protected drawKeyShape(attributes: Required<MindmapNodeStyleProps>, co...
    method render (line 259) | public render(attributes: Required<MindmapNodeStyleProps> = this.parse...
  class MindmapEdge (line 269) | class MindmapEdge extends CubicHorizontal {
    method rootId (line 270) | get rootId() {
    method getKeyPath (line 274) | protected getKeyPath(attributes: Required<CubicStyleProps>): PathArray {
  type CollapseExpandTreeOptions (line 285) | interface CollapseExpandTreeOptions extends BaseBehaviorOptions {
  class CollapseExpandTree (line 289) | class CollapseExpandTree extends BaseBehavior<CollapseExpandTreeOptions> {
    method constructor (line 290) | constructor(context: RuntimeContext, options: Partial<CollapseExpandTr...
    method update (line 295) | update(options: Partial<CollapseExpandTreeOptions>) {
    method bindEvents (line 301) | bindEvents() {
    method unbindEvents (line 310) | unbindEvents() {
  class AssignElementColor (line 375) | class AssignElementColor extends BaseTransform {
    method beforeDraw (line 376) | beforeDraw(data: DrawData): DrawData {

FILE: packages/g6/__tests__/demos/case-org-chart.ts
  type ZoomLevel (line 5) | enum ZoomLevel {
  constant DEFAULT_LEVEL (line 16) | const DEFAULT_LEVEL = ZoomLevel.DETAILED;
  class ChartNode (line 22) | class ChartNode extends Rect {
    method data (line 23) | protected get data() {
    method level (line 27) | protected get level() {
    method getLabelStyle (line 31) | protected getLabelStyle(): false | LabelStyleProps {
    method getKeyStyle (line 52) | protected getKeyStyle(attributes: Required<RectStyleProps>): GRectStyl...
    method getPositionStyle (line 59) | protected getPositionStyle(attributes: Required<RectStyleProps>): fals...
    method drawPositionShape (line 72) | protected drawPositionShape(attributes: Required<RectStyleProps>, cont...
    method getStatusStyle (line 77) | protected getStatusStyle(attributes: Required<RectStyleProps>): false ...
    method drawStatusShape (line 90) | protected drawStatusShape(attributes: Required<RectStyleProps>, contai...
    method getPhoneStyle (line 95) | protected getPhoneStyle(attributes: Required<RectStyleProps>): false |...
    method drawPhoneShape (line 106) | protected drawPhoneShape(attributes: Required<RectStyleProps>, contain...
    method render (line 111) | public render(attributes: Required<RectStyleProps> = this.parsedAttrib...
  class LevelOfDetail (line 125) | class LevelOfDetail extends BaseBehavior {
    method constructor (line 132) | constructor(context: RuntimeContext, options: BaseBehaviorOptions) {
    method bindEvents (line 152) | private bindEvents() {
    method unbindEvents (line 157) | private unbindEvents() {
    method destroy (line 162) | public destroy() {

FILE: packages/g6/__tests__/demos/case-why-do-cats.ts
  function getColor (line 17) | function getColor(id: string) {
  type RowDatum (line 35) | type RowDatum = {
  class BubbleLayout (line 81) | class BubbleLayout extends BaseLayout {
    method execute (line 84) | public async execute(model: GraphData, options?: any): Promise<GraphDa...

FILE: packages/g6/__tests__/demos/demo-found-flow.ts
  constant COLORS (line 5) | const COLORS = {
  constant GREY_COLOR (line 12) | const GREY_COLOR = '#CED4D9';
  class TreeNode (line 14) | class TreeNode extends Rect {
    method data (line 15) | get data() {
    method childrenData (line 19) | get childrenData() {
    method getLabelStyle (line 23) | getLabelStyle(attributes: any) {
    method getPriceStyle (line 36) | getPriceStyle(attributes: any) {
    method drawPriceShape (line 48) | drawPriceShape(attributes: any, container: any) {
    method getCurrencyStyle (line 53) | getCurrencyStyle(attributes: any) {
    method drawCurrencyShape (line 65) | drawCurrencyShape(attributes: any, container: any) {
    method getPercentStyle (line 70) | getPercentStyle(attributes: any) {
    method drawPercentShape (line 82) | drawPercentShape(attributes: any, container: any) {
    method getTriangleStyle (line 87) | getTriangleStyle(attributes: any) {
    method drawTriangleShape (line 101) | drawTriangleShape(attributes: any, container: any) {
    method getVariableStyle (line 106) | getVariableStyle(attributes: any) {
    method drawVariableShape (line 119) | drawVariableShape(attributes: any, container: any) {
    method getCollapseStyle (line 124) | getCollapseStyle(attributes: any) {
    method drawCollapseShape (line 146) | drawCollapseShape(attributes: any, container: any) {
    method getProcessBarStyle (line 161) | getProcessBarStyle(attributes: any) {
    method drawProcessBarShape (line 177) | drawProcessBarShape(attributes: any, container: any) {
    method getKeyStyle (line 182) | getKeyStyle(attributes: any) {
    method render (line 192) | render(attributes = this.parsedAttributes, container?: any) {

FILE: packages/g6/__tests__/demos/element-html-sub-graph.ts
  type CardNodeData (line 7) | interface CardNodeData {
  type GraphNodeData (line 13) | interface GraphNodeData {
  type Data (line 17) | type Data = CardNodeData | GraphNodeData;
  class SubGraph (line 25) | class SubGraph extends HTML {
    method connectedCallback (line 26) | public connectedCallback(): void {
    method render (line 31) | public render(attributes?: Required<HTMLStyleProps>, container?: Group...
    method data (line 36) | private get data() {
    method drawSubGraph (line 44) | private drawSubGraph() {
    method drawGraphNode (line 53) | private drawGraphNode(data: GraphData) {
    method destroy (line 84) | public destroy(): void {
  class CardCombo (line 90) | class CardCombo extends BaseCombo {
    method getKeyStyle (line 91) | protected getKeyStyle(attributes: Required<BaseComboStyleProps>) {
    method drawKeyShape (line 103) | protected drawKeyShape(attributes: Required<BaseComboStyleProps>, cont...
    method drawCardShape (line 116) | protected drawCardShape(attributes: Required<BaseComboStyleProps>, con...
    method removeCardShape (line 172) | protected removeCardShape() {

FILE: packages/g6/__tests__/demos/element-visibility-part.ts
  type CustomCircleStyleProps (line 4) | interface CustomCircleStyleProps extends BaseNodeStyleProps {
  class CustomCircle (line 8) | class CustomCircle extends Circle {
    method renderPart (line 9) | public renderPart(attributes: Required<CustomCircleStyleProps>, contai...
    method render (line 16) | public render(attributes: Required<CustomCircleStyleProps>, container:...

FILE: packages/g6/__tests__/demos/layout-custom-dagre.ts
  type CustomLayoutOptions (line 5) | interface CustomLayoutOptions extends BaseLayoutOptions {
  class CustomLayout (line 11) | class CustomLayout extends BaseLayout<CustomLayoutOptions> {
    method execute (line 14) | async execute(data: GraphData): Promise<GraphData> {

FILE: packages/g6/__tests__/demos/layout-custom-horizontal.ts
  type CustomLayoutOptions (line 5) | interface CustomLayoutOptions extends BaseLayoutOptions {
  class CustomLayout (line 11) | class CustomLayout extends BaseLayout<CustomLayoutOptions> {
    method execute (line 14) | async execute(data: GraphData): Promise<GraphData> {

FILE: packages/g6/__tests__/demos/layout-custom-iterative.ts
  type CustomLayoutOptions (line 5) | interface CustomLayoutOptions extends BaseLayoutOptions {
  class CustomIterativeLayout (line 9) | class CustomIterativeLayout extends BaseLayout<CustomLayoutOptions> {
    method execute (line 22) | async execute(data: GraphData, options: CustomLayoutOptions): Promise<...

FILE: packages/g6/__tests__/demos/layout-force-collision.ts
  class CollisionElement (line 9) | class CollisionElement extends BaseBehavior {
    method constructor (line 10) | constructor(context: RuntimeContext) {
    method bindEvents (line 16) | bindEvents() {
    method onPointerMove (line 20) | onPointerMove(event: IPointerEvent) {
  function getData (line 75) | function getData(width: number, size = 200) {
  function randomUniform (line 86) | function randomUniform(min: number, max: number) {

FILE: packages/g6/__tests__/demos/layout-force-lattice.ts
  function getData (line 38) | function getData(size = 10) {

FILE: packages/g6/__tests__/demos/plugin-tooltip-with-custom-node.ts
  class CustomNode (line 5) | class CustomNode extends Circle {
    method drawOperatorBtns (line 6) | drawOperatorBtns(attributes: Required<CircleStyleProps>, container: Gr...
    method render (line 21) | render(attributes = this.parsedAttributes, container: Group) {

FILE: packages/g6/__tests__/demos/plugin-watermark.ts
  function updatePlugin (line 21) | function updatePlugin(type: string, config: object) {

FILE: packages/g6/__tests__/main.ts
  type Options (line 13) | type Options = {
  function initPanel (line 45) | function initPanel() {
  function initStats (line 84) | function initStats() {
  function render (line 97) | async function render() {
  function renderForm (line 142) | function renderForm(panel: GUI, form: TestCase['form']) {
  function destroyForm (line 146) | function destroyForm() {
  function syncParamsFromSearch (line 152) | function syncParamsFromSearch() {
  function syncParamsToSearch (line 162) | function syncParamsToSearch() {
  function initContainer (line 170) | function initContainer() {
  function applyTheme (line 178) | function applyTheme() {
  function applyGridLine (line 182) | function applyGridLine() {

FILE: packages/g6/__tests__/types.d.ts
  type TestCase (line 5) | interface TestCase {
  type TestContext (line 10) | type TestContext = G6Spec;

FILE: packages/g6/__tests__/unit/behaviors/scroll-canvas.spec.ts
  function setBehavior (line 14) | function setBehavior(options?: Partial<ScrollCanvasOptions>) {
  function emitWheelEvent (line 34) | function emitWheelEvent(options?: { deltaX: number; deltaY: number }) {

FILE: packages/g6/__tests__/unit/elements/override-methods.spec.ts
  method onCreate (line 14) | onCreate() {
  method onUpdate (line 17) | onUpdate() {
  method onDestroy (line 20) | onDestroy() {

FILE: packages/g6/__tests__/unit/elements/shape.spec.ts
  type ShapeStyleProps (line 7) | interface ShapeStyleProps extends BaseShapeStyleProps {
  class Shape (line 18) | class Shape extends BaseShape<ShapeStyleProps> {
    method render (line 19) | render() {

FILE: packages/g6/__tests__/unit/plugins/edge-filter-lens.spec.ts
  function emitWheelEvent (line 46) | function emitWheelEvent(options?: { deltaX: number; deltaY: number; clie...

FILE: packages/g6/__tests__/unit/registry.spec.ts
  class CircleNode (line 64) | class CircleNode {}
  class RectNode (line 65) | class RectNode {}
  class Edge (line 66) | class Edge {}
  class CircleNode (line 89) | class CircleNode {}
  class RectNode (line 90) | class RectNode {}

FILE: packages/g6/__tests__/unit/runtime/graph/get-plugin-instantce.spec.ts
  class CustomPlugin (line 8) | class CustomPlugin extends BasePlugin<any> {
    method api (line 10) | api() {
    method api (line 40) | api() {
  class CustomPlugin (line 39) | class CustomPlugin extends BasePlugin<any> {
    method api (line 10) | api() {
    method api (line 40) | api() {

FILE: packages/g6/__tests__/unit/spec/layout.spec.ts
  type RegisterLayout (line 46) | type RegisterLayout = LayoutOptions;

FILE: packages/g6/__tests__/unit/transforms/base-transform.spec.ts
  class Transform (line 5) | class Transform extends BaseTransform {}

FILE: packages/g6/__tests__/unit/utils/element.spec.ts
  method getElement (line 41) | getElement(id: ID) {

FILE: packages/g6/__tests__/unit/utils/event.spec.ts
  method getElement (line 16) | getElement(id: ID) {

FILE: packages/g6/__tests__/unit/utils/layout.spec.ts
  class MockLayout (line 14) | class MockLayout {
    method execute (line 21) | public async execute(model: any, options: any): Promise<void> {
    method forEachNode (line 43) | public forEachNode(callback: (node: any) => void) {
    method forEachEdge (line 47) | public forEachEdge(callback: (edge: any) => void) {

FILE: packages/g6/__tests__/unit/utils/visibility.spec.ts
  class Shape (line 5) | class Shape extends BaseShape<{ visibility: 'visible' | 'hidden' }> {
    method render (line 6) | render() {

FILE: packages/g6/__tests__/utils/canvas.ts
  function dispatchCanvasEvent (line 4) | function dispatchCanvasEvent(graph: Graph, type: string, data?: any) {

FILE: packages/g6/__tests__/utils/create.ts
  function getRenderer (line 9) | function getRenderer(renderer: string) {
  function createGraphCanvas (line 31) | function createGraphCanvas(
  class CenterConnectCircle (line 77) | class CenterConnectCircle extends Circle {
    method getIntersectPoint (line 78) | public getIntersectPoint(): Point {
  function createEdgeNode (line 84) | function createEdgeNode(point: Point): Node {
  function createDemoGraph (line 93) | async function createDemoGraph(demo: TestCase, context?: Partial<TestCon...
  function createGraph (line 98) | function createGraph(options: GraphOptions) {

FILE: packages/g6/__tests__/utils/dir.ts
  function getSnapshotDir (line 11) | function getSnapshotDir(dir: string, detail: string = 'default'): [strin...

FILE: packages/g6/__tests__/utils/dom.ts
  function emitWheelEvent (line 4) | function emitWheelEvent(

FILE: packages/g6/__tests__/utils/offscreen-canvas-context.ts
  function measureText (line 88) | function measureText(text: string, fontSize: number) {
  class OffscreenCanvasContext (line 96) | class OffscreenCanvasContext {
    method constructor (line 99) | constructor(public canvas: HTMLCanvasElement) {}
    method font (line 101) | set font(font: string) {
    method fillRect (line 108) | fillRect() {}
    method fillText (line 109) | fillText() {}
    method getImageData (line 110) | getImageData(sx: number, sy: number, sw: number, sh: number) {
    method measureText (line 117) | measureText(text: string) {

FILE: packages/g6/__tests__/utils/random.ts
  function createDeterministicRandom (line 5) | function createDeterministicRandom() {

FILE: packages/g6/__tests__/utils/sleep.ts
  function sleep (line 1) | function sleep(n: number) {

FILE: packages/g6/__tests__/utils/svg-transformer.js
  method process (line 2) | process() {

FILE: packages/g6/__tests__/utils/to-be-close-to.ts
  type Digital (line 1) | type Digital = number | number[];
  function closeTo (line 3) | function closeTo(received: number, expected: number, numDigits: number =...
  function toBeCloseTo (line 7) | function toBeCloseTo(received: Digital, expected: Digital, numDigits?: n...
  type Matchers (line 27) | interface Matchers<R> {

FILE: packages/g6/__tests__/utils/to-match-svg-snapshot.ts
  type ToMatchSVGSnapshotOptions (line 68) | type ToMatchSVGSnapshotOptions = {
  function toMatchSVGSnapshot (line 73) | async function toMatchSVGSnapshot(
  function toMatchSnapshot (line 147) | async function toMatchSnapshot(
  function toMatchAnimation (line 156) | async function toMatchAnimation(

FILE: packages/g6/__tests__/utils/use-snapshot-matchers.ts
  type Matchers (line 11) | interface Matchers<R> {

FILE: packages/g6/src/animations/types.ts
  type STDAnimation (line 5) | type STDAnimation = AnimationOptions[];
  type AnimationOptions (line 12) | interface AnimationOptions extends AnimationEffectTiming {
  type AnimationContext (line 33) | interface AnimationContext {
  type AnimationEffectTiming (line 85) | interface AnimationEffectTiming {
  type AnimationExecutor (line 124) | type AnimationExecutor = (

FILE: packages/g6/src/behaviors/auto-adapt-label.ts
  type AutoAdaptLabelOptions (line 19) | interface AutoAdaptLabelOptions extends BaseBehaviorOptions {
  class AutoAdaptLabel (line 77) | class AutoAdaptLabel extends BaseBehavior<AutoAdaptLabelOptions> {
    method constructor (line 85) | constructor(context: RuntimeContext, options: AutoAdaptLabelOptions) {
    method update (line 90) | public update(options: Partial<AutoAdaptLabelOptions>): void {
    method getLabelElements (line 128) | private getLabelElements(): Element[] {
    method getLabelElementsInView (line 143) | private getLabelElementsInView(): Element[] {
    method bindEvents (line 257) | private bindEvents() {
    method unbindEvents (line 266) | private unbindEvents() {
    method validate (line 275) | private validate(event: IEvent): boolean {
    method destroy (line 282) | public destroy(): void {

FILE: packages/g6/src/behaviors/base-behavior.ts
  type BaseBehaviorOptions (line 9) | interface BaseBehaviorOptions extends CustomBehaviorOption {}

FILE: packages/g6/src/behaviors/brush-select.ts
  type BrushSelectOptions (line 20) | interface BrushSelectOptions extends BaseBehaviorOptions {
  class BrushSelect (line 101) | class BrushSelect extends BaseBehavior<BrushSelectOptions> {
    method constructor (line 127) | constructor(context: RuntimeContext, options: BrushSelectOptions) {
    method onPointerDown (line 144) | protected onPointerDown(event: IPointerEvent) {
    method onPointerMove (line 166) | protected onPointerMove(event: IPointerEvent) {
    method onPointerUp (line 187) | protected onPointerUp(event: IPointerEvent) {
    method clearStates (line 206) | protected clearStates() {
    method clearElementsStates (line 218) | protected clearElementsStates() {
    method updateElementsStates (line 242) | protected updateElementsStates(points: Point[]) {
    method selector (line 291) | protected selector(graph: Graph, points: Point[], itemTypes: ElementTy...
    method clearBrush (line 320) | private clearBrush() {
    method isKeydown (line 334) | protected isKeydown(): boolean {
    method validate (line 348) | protected validate(event: IPointerEvent) {
    method bindEvents (line 355) | private bindEvents() {
    method unbindEvents (line 364) | private unbindEvents() {
    method update (line 380) | public update(options: Partial<BrushSelectOptions>) {
    method destroy (line 392) | public destroy() {

FILE: packages/g6/src/behaviors/click-select.ts
  type ClickSelectOptions (line 19) | interface ClickSelectOptions extends BaseBehaviorOptions {
  class ClickSelect (line 109) | class ClickSelect extends BaseBehavior<ClickSelectOptions> {
    method constructor (line 123) | constructor(context: RuntimeContext, options: ClickSelectOptions) {
    method bindEvents (line 129) | private bindEvents() {
    method isMultipleSelect (line 150) | private get isMultipleSelect() {
    method getNeighborIds (line 155) | protected getNeighborIds(event: IPointerEvent<Element>) {
    method updateState (line 167) | private async updateState(event: IPointerEvent<Element>) {
    method getDataStates (line 243) | private getDataStates() {
    method getClearStates (line 262) | private getClearStates(complete = false) {
    method clearState (line 279) | private async clearState() {
    method validate (line 284) | private validate(event: IPointerEvent) {
    method unbindEvents (line 291) | private unbindEvents() {
    method destroy (line 300) | public destroy() {

FILE: packages/g6/src/behaviors/collapse-expand.ts
  type CollapseExpandOptions (line 15) | interface CollapseExpandOptions extends BaseBehaviorOptions {
  class CollapseExpand (line 66) | class CollapseExpand extends BaseBehavior<CollapseExpandOptions> {
    method constructor (line 74) | constructor(context: RuntimeContext, options: CollapseExpandOptions) {
    method update (line 80) | public update(options: Partial<CollapseExpandOptions>) {
    method bindEvents (line 86) | private bindEvents() {
    method unbindEvents (line 93) | private unbindEvents() {
    method validate (line 120) | private validate(event: IPointerEvent): boolean {
    method destroy (line 127) | public destroy(): void {

FILE: packages/g6/src/behaviors/create-edge.ts
  constant ASSIST_EDGE_ID (line 11) | const ASSIST_EDGE_ID = 'g6-create-edge-assist-edge-id';
  constant ASSIST_NODE_ID (line 12) | const ASSIST_NODE_ID = 'g6-create-edge-assist-node-id';
  type CreateEdgeOptions (line 19) | interface CreateEdgeOptions extends BaseBehaviorOptions {
  class CreateEdge (line 63) | class CreateEdge extends BaseBehavior<CreateEdgeOptions> {
    method constructor (line 75) | constructor(context: RuntimeContext, options: CreateEdgeOptions) {
    method update (line 85) | public update(options: Partial<CreateEdgeOptions>): void {
    method bindEvents (line 90) | private bindEvents() {
    method getSelectedNodeIDs (line 198) | private getSelectedNodeIDs(currTarget: ID[]) {
    method validate (line 209) | private validate(event: IPointerEvent) {
    method unbindEvents (line 216) | private unbindEvents() {
    method destroy (line 229) | public destroy() {

FILE: packages/g6/src/behaviors/drag-canvas.ts
  type DragCanvasOptions (line 20) | interface DragCanvasOptions extends BaseBehaviorOptions {
  class DragCanvas (line 85) | class DragCanvas extends BaseBehavior<DragCanvasOptions> {
    method constructor (line 100) | constructor(context: RuntimeContext, options: DragCanvasOptions) {
    method update (line 116) | public update(options: Partial<DragCanvasOptions>): void {
    method bindEvents (line 122) | private bindEvents() {
    method onTranslate (line 166) | private async onTranslate(value: Vector2, event: IPointerEvent | IKeyb...
    method translate (line 183) | protected async translate(offset: Vector2, animation?: ViewportAnimati...
    method clampByRotation (line 191) | private clampByRotation([dx, dy]: Vector2): Vector2 {
    method clampByDirection (line 196) | private clampByDirection([dx, dy]: Vector2): Vector2 {
    method clampByRange (line 206) | private clampByRange([dx, dy]: Vector2): Vector2 {
    method validate (line 231) | private validate(event: IPointerEvent | IKeyboardEvent) {
    method unbindEvents (line 238) | private unbindEvents() {
    method destroy (line 246) | public destroy(): void {

FILE: packages/g6/src/behaviors/drag-element-force.ts
  type DragElementForceOptions (line 14) | interface DragElementForceOptions extends Omit<DragElementOptions, 'anim...
  class DragElementForce (line 36) | class DragElementForce extends DragElement {
    method forceLayoutInstance (line 37) | private get forceLayoutInstance() {
    method validate (line 47) | protected validate(event: IElementDragEvent): boolean {
    method moveElement (line 65) | protected async moveElement(ids: ID[], offset: Point) {
    method onDragStart (line 79) | protected onDragStart(event: IElementDragEvent) {
    method onDrag (line 101) | protected onDrag(event: IElementDragEvent) {
    method onDragEnd (line 112) | protected onDragEnd() {

FILE: packages/g6/src/behaviors/drag-element.ts
  type DragElementOptions (line 21) | interface DragElementOptions extends BaseBehaviorOptions, Prefix<'shadow...
  class DragElement (line 133) | class DragElement extends BaseBehavior<DragElementOptions> {
    method constructor (line 171) | constructor(context: RuntimeContext, options: DragElementOptions) {
    method update (line 189) | public update(options: Partial<DragElementOptions>): void {
    method bindEvents (line 195) | private bindEvents() {
    method getSelectedNodeIDs (line 227) | protected getSelectedNodeIDs(currTarget: ID[]) {
    method getDelta (line 244) | protected getDelta(event: IElementDragEvent) {
    method onDragStart (line 256) | protected onDragStart(event: IElementDragEvent) {
    method onDrag (line 284) | protected onDrag(event: IElementDragEvent) {
    method onDragEnd (line 298) | protected onDragEnd() {
    method isKeydown (line 356) | protected isKeydown(): boolean {
    method validate (line 370) | protected validate(event: IElementDragEvent) {
    method clampByRotation (line 385) | protected clampByRotation([dx, dy]: Point): Vector2 {
    method moveElement (line 398) | protected async moveElement(ids: ID[], offset: Point) {
    method moveShadow (line 406) | private moveShadow(offset: Point) {
    method createShadow (line 413) | private createShadow(target: ID[]) {
    method showEdges (line 442) | private showEdges() {
    method hideEdge (line 452) | protected hideEdge() {
    method unbindEvents (line 465) | private unbindEvents() {
    method destroy (line 487) | public destroy() {

FILE: packages/g6/src/behaviors/fix-element-size.ts
  type FixShapeConfig (line 22) | type FixShapeConfig = {
  type FixElementSizeOptions (line 42) | interface FixElementSizeOptions extends BaseBehaviorOptions {
  class FixElementSize (line 128) | class FixElementSize extends BaseBehavior<FixElementSizeOptions> {
    method constructor (line 138) | constructor(context: RuntimeContext, options: FixElementSizeOptions) {
    method restoreCachedStyles (line 269) | private restoreCachedStyles() {
    method bindEvents (line 310) | private bindEvents() {
    method unbindEvents (line 316) | private unbindEvents() {
    method validate (line 322) | private validate(event: IViewportEvent) {
    method destroy (line 329) | public destroy(): void {

FILE: packages/g6/src/behaviors/focus-element.ts
  type FocusElementOptions (line 15) | interface FocusElementOptions extends BaseBehaviorOptions {
  class FocusElement (line 48) | class FocusElement extends BaseBehavior<FocusElementOptions> {
    method constructor (line 60) | constructor(context: RuntimeContext, options: FocusElementOptions) {
    method bindEvents (line 66) | private bindEvents() {
    method validate (line 82) | private validate(event: IElementEvent) {
    method isKeydown (line 96) | private isKeydown(): boolean {
    method unbindEvents (line 102) | private unbindEvents() {
    method destroy (line 110) | public destroy() {

FILE: packages/g6/src/behaviors/hover-activate.ts
  type HoverActivateOptions (line 17) | interface HoverActivateOptions extends BaseBehaviorOptions {
  class HoverActivate (line 92) | class HoverActivate extends BaseBehavior<HoverActivateOptions> {
    method constructor (line 104) | constructor(context: RuntimeContext, options: HoverActivateOptions) {
    method bindEvents (line 113) | private bindEvents() {
    method getActiveIds (line 137) | protected getActiveIds(event: IPointerEvent<Element>) {
    method validate (line 187) | private validate(event: IPointerEvent<Element>) {
    method unbindEvents (line 202) | private unbindEvents() {
    method destroy (line 215) | public destroy() {

FILE: packages/g6/src/behaviors/lasso-select.ts
  type LassoSelectOptions (line 12) | interface LassoSelectOptions extends BrushSelectOptions {}
  class LassoSelect (line 23) | class LassoSelect extends BrushSelect {
    method onPointerDown (line 32) | protected onPointerDown(event: IPointerEvent) {
    method onPointerMove (line 51) | protected onPointerMove(event: IPointerEvent) {
    method onPointerUp (line 66) | protected onPointerUp() {
    method clearLasso (line 77) | private clearLasso() {

FILE: packages/g6/src/behaviors/optimize-viewport-transform.ts
  type OptimizeViewportTransformOptions (line 16) | interface OptimizeViewportTransformOptions extends BaseBehaviorOptions {
  class OptimizeViewportTransform (line 46) | class OptimizeViewportTransform extends BaseBehavior<OptimizeViewportTra...
    method constructor (line 57) | constructor(context: RuntimeContext, options: OptimizeViewportTransfor...
    method bindEvents (line 108) | private bindEvents() {
    method unbindEvents (line 115) | private unbindEvents() {
    method validate (line 122) | private validate(event: IViewportEvent) {
    method update (line 130) | public update(options: Partial<OptimizeViewportTransformOptions>) {
    method destroy (line 136) | public destroy() {

FILE: packages/g6/src/behaviors/scroll-canvas.ts
  type ScrollCanvasOptions (line 17) | interface ScrollCanvasOptions extends BaseBehaviorOptions {
  class ScrollCanvas (line 82) | class ScrollCanvas extends BaseBehavior<ScrollCanvasOptions> {
    method constructor (line 92) | constructor(context: RuntimeContext, options: ScrollCanvasOptions) {
    method update (line 107) | public update(options: Partial<ScrollCanvasOptions>): void {
    method bindEvents (line 112) | private bindEvents() {
    method graphDom (line 132) | get graphDom() {
    method formatDisplacement (line 144) | private formatDisplacement(d: Point) {
    method clampByDirection (line 154) | private clampByDirection([dx, dy]: Point) {
    method clampByRange (line 164) | private clampByRange([dx, dy]: Point) {
    method scroll (line 189) | private async scroll(value: Point, event: WheelEvent | IKeyboardEvent) {
    method validate (line 198) | private validate(event: WheelEvent | IKeyboardEvent) {
    method destroy (line 210) | public destroy(): void {

FILE: packages/g6/src/behaviors/types.ts
  type Behavior (line 3) | type Behavior = BaseBehavior<any>;

FILE: packages/g6/src/behaviors/zoom-canvas.ts
  type ZoomCanvasOptions (line 23) | interface ZoomCanvasOptions extends BaseBehaviorOptions {
  class ZoomCanvas (line 89) | class ZoomCanvas extends BaseBehavior<ZoomCanvasOptions> {
    method constructor (line 100) | constructor(context: RuntimeContext, options: ZoomCanvasOptions) {
    method update (line 115) | public update(options: Partial<ZoomCanvasOptions>): void {
    method bindEvents (line 120) | private bindEvents() {
    method validate (line 196) | protected validate(event: IWheelEvent | IKeyboardEvent | IPointerEvent) {
    method destroy (line 212) | public destroy() {

FILE: packages/g6/src/constants/animation.ts
  constant DEFAULT_ANIMATION_OPTIONS (line 3) | const DEFAULT_ANIMATION_OPTIONS: AnimationEffectTiming = {
  constant DEFAULT_ELEMENTS_ANIMATION_OPTIONS (line 7) | const DEFAULT_ELEMENTS_ANIMATION_OPTIONS: AnimationEffectTiming = {

FILE: packages/g6/src/constants/change.ts
  type ChangeType (line 10) | const enum ChangeType {

FILE: packages/g6/src/constants/element.ts
  constant ICON_SIZE_RATIO (line 6) | const ICON_SIZE_RATIO = 0.8;
  constant ELEMENT_TYPES (line 8) | const ELEMENT_TYPES = ['node', 'edge', 'combo'] as const;

FILE: packages/g6/src/constants/events/animation.ts
  type AnimationType (line 1) | enum AnimationType {

FILE: packages/g6/src/constants/events/canvas.ts
  type CanvasEvent (line 6) | enum CanvasEvent {

FILE: packages/g6/src/constants/events/combo.ts
  type ComboEvent (line 6) | enum ComboEvent {

FILE: packages/g6/src/constants/events/common.ts
  type CommonEvent (line 1) | enum CommonEvent {

FILE: packages/g6/src/constants/events/container.ts
  type ContainerEvent (line 1) | enum ContainerEvent {

FILE: packages/g6/src/constants/events/edge.ts
  type EdgeEvent (line 6) | enum EdgeEvent {

FILE: packages/g6/src/constants/events/graph.ts
  type GraphEvent (line 1) | enum GraphEvent {

FILE: packages/g6/src/constants/events/history.ts
  type HistoryEvent (line 1) | enum HistoryEvent {

FILE: packages/g6/src/constants/events/node.ts
  type NodeEvent (line 6) | enum NodeEvent {

FILE: packages/g6/src/constants/graphlib.ts
  constant COMBO_KEY (line 1) | const COMBO_KEY = 'combo';
  constant TREE_KEY (line 3) | const TREE_KEY = 'tree';

FILE: packages/g6/src/constants/registry.ts
  type ExtensionCategory (line 1) | enum ExtensionCategory {

FILE: packages/g6/src/elements/base-element.ts
  method context (line 8) | protected get context(): RuntimeContext {
  method parsedAttributes (line 13) | protected get parsedAttributes() {
  method onframe (line 22) | protected onframe() {}
  method animate (line 24) | public animate(keyframes: Keyframe[], options?: number | KeyframeAnimati...

FILE: packages/g6/src/elements/combos/base-combo.ts
  type BaseComboStyleProps (line 32) | interface BaseComboStyleProps
  method constructor (line 107) | constructor(options: DisplayObjectConfig<BaseComboStyleProps>) {
  method getKeySize (line 117) | protected getKeySize(attributes: Required<S>): STDSize {
  method getEmptyKeySize (line 123) | protected getEmptyKeySize(attributes: Required<S>): STDSize {
  method getCollapsedKeySize (line 129) | protected getCollapsedKeySize(attributes: Required<S>): STDSize {
  method getExpandedKeySize (line 133) | protected getExpandedKeySize(attributes: Required<S>): STDSize {
  method getContentBBox (line 138) | protected getContentBBox(attributes: Required<S>): AABB {
  method drawCollapsedMarkerShape (line 156) | protected drawCollapsedMarkerShape(attributes: Required<S>, container: G...
  method getCollapsedMarkerStyle (line 162) | protected getCollapsedMarkerStyle(attributes: Required<S>): IconStylePro...
  method getCollapsedMarkerText (line 182) | protected getCollapsedMarkerText(type: CollapsedMarkerStyleProps['type']...
  method getComboPosition (line 197) | public getComboPosition(attributes: Required<S>): Point {
  method getComboStyle (line 218) | protected getComboStyle(attributes: Required<S>) {
  method updateComboPosition (line 224) | protected updateComboPosition(attributes: Required<S>) {
  method render (line 233) | public render(attributes: Required<S>, container: Group = this) {
  method update (line 240) | public update(attr: Partial<S> = {}): void {
  method onframe (line 245) | protected onframe() {
  method animate (line 253) | public animate(keyframes: Keyframe[], options?: number | KeyframeAnimati...

FILE: packages/g6/src/elements/combos/circle.ts
  type CircleComboStyleProps (line 16) | interface CircleComboStyleProps extends BaseComboStyleProps {}
  class CircleCombo (line 23) | class CircleCombo extends BaseCombo<CircleComboStyleProps> {
    method constructor (line 24) | constructor(options: DisplayObjectConfig<CircleComboStyleProps>) {
    method drawKeyShape (line 28) | protected drawKeyShape(attributes: Required<CircleComboStyleProps>, co...
    method getKeyStyle (line 32) | protected getKeyStyle(attributes: Required<CircleComboStyleProps>): GC...
    method getCollapsedKeySize (line 44) | protected getCollapsedKeySize(attributes: Required<CircleComboStylePro...
    method getExpandedKeySize (line 50) | protected getExpandedKeySize(attributes: Required<CircleComboStyleProp...
    method getIntersectPoint (line 57) | public getIntersectPoint(point: Point, useExtendedLine = false): Point {

FILE: packages/g6/src/elements/combos/rect.ts
  type RectComboStyleProps (line 12) | interface RectComboStyleProps extends BaseComboStyleProps {}
  class RectCombo (line 19) | class RectCombo extends BaseCombo<RectComboStyleProps> {
    method constructor (line 20) | constructor(options: DisplayObjectConfig<RectComboStyleProps>) {
    method drawKeyShape (line 24) | protected drawKeyShape(attributes: Required<RectComboStyleProps>, cont...
    method getKeyStyle (line 28) | protected getKeyStyle(attributes: Required<RectComboStyleProps>): GRec...

FILE: packages/g6/src/elements/edges/base-edge.ts
  type BaseEdgeStyleProps (line 35) | interface BaseEdgeStyleProps
  type ParsedBaseEdgeStyleProps (line 167) | type ParsedBaseEdgeStyleProps = Required<BaseEdgeStyleProps>;
  method constructor (line 216) | constructor(options: DisplayObjectConfig<BaseEdgeStyleProps>) {
  method sourceNode (line 220) | protected get sourceNode() {
  method targetNode (line 225) | protected get targetNode() {
  method getKeyStyle (line 230) | protected getKeyStyle(attributes: ParsedBaseEdgeStyleProps): PathStylePr...
  method getLoopPath (line 248) | protected getLoopPath(attributes: ParsedBaseEdgeStyleProps): PathArray {
  method getEndpoints (line 264) | protected getEndpoints(
  method getHaloStyle (line 290) | protected getHaloStyle(attributes: ParsedBaseEdgeStyleProps): false | Pa...
  method getLabelStyle (line 299) | protected getLabelStyle(attributes: ParsedBaseEdgeStyleProps): false | L...
  method getBadgeStyle (line 318) | protected getBadgeStyle(attributes: ParsedBaseEdgeStyleProps): false | B...
  method drawArrow (line 332) | protected drawArrow(attributes: ParsedBaseEdgeStyleProps, type: 'start' ...
  method getArrowStyle (line 364) | private getArrowStyle(attributes: ParsedBaseEdgeStyleProps, isStart: boo...
  method drawLabelShape (line 383) | protected drawLabelShape(attributes: ParsedBaseEdgeStyleProps, container...
  method drawHaloShape (line 388) | protected drawHaloShape(attributes: ParsedBaseEdgeStyleProps, container:...
  method drawBadgeShape (line 393) | protected drawBadgeShape(attributes: ParsedBaseEdgeStyleProps, container...
  method drawSourceArrow (line 398) | protected drawSourceArrow(attributes: ParsedBaseEdgeStyleProps) {
  method drawTargetArrow (line 402) | protected drawTargetArrow(attributes: ParsedBaseEdgeStyleProps) {
  method drawKeyShape (line 406) | protected drawKeyShape(attributes: ParsedBaseEdgeStyleProps, container: ...
  method render (line 411) | public render(attributes = this.parsedAttributes, container: Group = thi...
  method onframe (line 430) | protected onframe() {
  method animate (line 439) | public animate(keyframes: Keyframe[], options?: number | KeyframeAnimati...

FILE: packages/g6/src/elements/edges/cubic-horizontal.ts
  type CubicHorizontalStyleProps (line 12) | interface CubicHorizontalStyleProps extends BaseEdgeStyleProps {
  class CubicHorizontal (line 38) | class CubicHorizontal extends Cubic {
    method constructor (line 44) | constructor(options: DisplayObjectConfig<CubicHorizontalStyleProps>) {
    method getControlPoints (line 48) | protected getControlPoints(

FILE: packages/g6/src/elements/edges/cubic-radial.ts
  type CubicRadialStyleProps (line 15) | interface CubicRadialStyleProps extends CubicStyleProps {}
  class CubicRadial (line 22) | class CubicRadial extends Cubic {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<CubicStyleProps>) {
    method ref (line 32) | private get ref(): NodeData {
    method getEndpoints (line 36) | protected getEndpoints(attributes: Required<CubicStyleProps>): [Point,...
    method toRadialCoordinate (line 48) | private toRadialCoordinate(p: Point) {
    method getControlPoints (line 55) | protected getControlPoints(

FILE: packages/g6/src/elements/edges/cubic-vertical.ts
  type CubicVerticalStyleProps (line 12) | interface CubicVerticalStyleProps extends BaseEdgeStyleProps {
  class CubicVertical (line 38) | class CubicVertical extends Cubic {
    method constructor (line 44) | constructor(options: DisplayObjectConfig<CubicVerticalStyleProps>) {
    method getControlPoints (line 48) | protected getControlPoints(

FILE: packages/g6/src/elements/edges/cubic.ts
  type CubicStyleProps (line 14) | interface CubicStyleProps extends BaseEdgeStyleProps {
  type ParsedCubicStyleProps (line 37) | type ParsedCubicStyleProps = Required<CubicStyleProps>;
  class Cubic (line 44) | class Cubic extends BaseEdge {
    method constructor (line 50) | constructor(options: DisplayObjectConfig<CubicStyleProps>) {
    method getKeyPath (line 57) | protected getKeyPath(attributes: ParsedCubicStyleProps): PathArray {
    method getControlPoints (line 72) | protected getControlPoints(

FILE: packages/g6/src/elements/edges/line.ts
  type LineStyleProps (line 12) | interface LineStyleProps extends BaseEdgeStyleProps {}
  type ParsedLineStyleProps (line 14) | type ParsedLineStyleProps = Required<LineStyleProps>;
  class Line (line 21) | class Line extends BaseEdge {
    method constructor (line 24) | constructor(options: DisplayObjectConfig<LineStyleProps>) {
    method getKeyPath (line 28) | protected getKeyPath(attributes: ParsedLineStyleProps): PathArray {

FILE: packages/g6/src/elements/edges/polyline.ts
  type PolylineStyleProps (line 18) | interface PolylineStyleProps extends BaseEdgeStyleProps {
  type ParsedPolylineStyleProps (line 41) | type ParsedPolylineStyleProps = Required<PolylineStyleProps>;
  class Polyline (line 48) | class Polyline extends BaseEdge {
    method constructor (line 55) | constructor(options: DisplayObjectConfig<PolylineStyleProps>) {
    method getControlPoints (line 59) | protected getControlPoints(attributes: ParsedPolylineStyleProps): Poin...
    method getPoints (line 86) | protected getPoints(attributes: ParsedPolylineStyleProps): Point[] {
    method getKeyPath (line 93) | protected getKeyPath(attributes: ParsedPolylineStyleProps): PathArray {
    method getLoopPath (line 99) | protected getLoopPath(attributes: ParsedPolylineStyleProps): PathArray {

FILE: packages/g6/src/elements/edges/quadratic.ts
  type QuadraticStyleProps (line 14) | interface QuadraticStyleProps extends BaseEdgeStyleProps {
  type ParsedQuadraticStyleProps (line 37) | type ParsedQuadraticStyleProps = Required<QuadraticStyleProps>;
  class Quadratic (line 44) | class Quadratic extends BaseEdge {
    method constructor (line 50) | constructor(options: DisplayObjectConfig<QuadraticStyleProps>) {
    method getKeyPath (line 54) | protected getKeyPath(attributes: ParsedQuadraticStyleProps): PathArray {

FILE: packages/g6/src/elements/effect.ts
  constant EFFECT_WEAKMAP (line 3) | const EFFECT_WEAKMAP = new WeakMap<Element, Record<string, any>>();
  function effect (line 15) | function effect<T extends false | Record<string, any>>(target: Element, ...

FILE: packages/g6/src/elements/nodes/base-node.ts
  type BaseNodeStyleProps (line 38) | interface BaseNodeStyleProps
  method constructor (line 228) | constructor(options: DisplayObjectConfig<S>) {
  method getSize (line 232) | protected getSize(attributes = this.attributes) {
  method getKeyStyle (line 237) | protected getKeyStyle(attributes: Required<S>) {
  method getLabelStyle (line 243) | protected getLabelStyle(attributes: Required<S>): false | LabelStyleProps {
  method getHaloStyle (line 259) | protected getHaloStyle(attributes: Required<S>) {
  method getIconStyle (line 268) | protected getIconStyle(attributes: Required<S>): false | IconStyleProps {
  method getBadgesStyle (line 276) | protected getBadgesStyle(attributes: Required<S>): Record<string, NodeBa...
  method getBadgeStyle (line 301) | protected getBadgeStyle(style: NodeBadgeStyleProps): NodeBadgeStyleProps {
  method getPortsStyle (line 308) | protected getPortsStyle(attributes: Required<S>): Record<string, PortSty...
  method getPortXY (line 333) | protected getPortXY(attributes: Required<S>, style: NodePortStyleProps):...
  method getPorts (line 343) | public getPorts(): Record<string, Port> {
  method getCenter (line 351) | public getCenter(): Point {
  method getIntersectPoint (line 361) | public getIntersectPoint(point: Point, useExtendedLine = false): Point {
  method drawHaloShape (line 366) | protected drawHaloShape(attributes: Required<S>, container: Group): void {
  method drawIconShape (line 372) | protected drawIconShape(attributes: Required<S>, container: Group): void {
  method drawBadgeShapes (line 378) | protected drawBadgeShapes(attributes: Required<S>, container: Group): vo...
  method drawPortShapes (line 386) | protected drawPortShapes(attributes: Required<S>, container: Group): void {
  method drawLabelShape (line 396) | protected drawLabelShape(attributes: Required<S>, container: Group): void {
  method _drawKeyShape (line 404) | private _drawKeyShape(attributes: Required<S>, container: Group) {
  method render (line 408) | public render(attributes = this.parsedAttributes, container: Group = thi...
  method update (line 429) | public update(attr?: Partial<S>): void {
  method onframe (line 436) | protected onframe() {
  function getBoundsInOffscreen (line 450) | function getBoundsInOffscreen(context: RuntimeContext, shape: DisplayObj...

FILE: packages/g6/src/elements/nodes/circle.ts
  type CircleStyleProps (line 16) | interface CircleStyleProps extends BaseNodeStyleProps {}
  class Circle (line 23) | class Circle extends BaseNode {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<CircleStyleProps>) {
    method drawKeyShape (line 32) | protected drawKeyShape(attributes: Required<CircleStyleProps>, contain...
    method getKeyStyle (line 36) | protected getKeyStyle(attributes: Required<CircleStyleProps>): GCircle...
    method getIconStyle (line 41) | protected getIconStyle(attributes: Required<CircleStyleProps>): false ...
    method getIntersectPoint (line 48) | public getIntersectPoint(point: Point, useExtendedLine = false): Point {

FILE: packages/g6/src/elements/nodes/diamond.ts
  type DiamondStyleProps (line 12) | interface DiamondStyleProps extends PolygonStyleProps {}
  class Diamond (line 19) | class Diamond extends Polygon {
    method constructor (line 20) | constructor(options: DisplayObjectConfig<DiamondStyleProps>) {
    method getPoints (line 24) | protected getPoints(attributes: Required<DiamondStyleProps>): Point[] {

FILE: packages/g6/src/elements/nodes/donut.ts
  type DonutStyleProps (line 20) | interface DonutStyleProps extends CircleStyleProps, Prefix<'donut', Base...
  class Donut (line 48) | class Donut extends Circle {
    method constructor (line 55) | constructor(options: DisplayObjectConfig<DonutStyleProps>) {
    method parseOuterR (line 59) | private parseOuterR() {
    method parseInnerR (line 64) | private parseInnerR() {
    method drawDonutShape (line 69) | protected drawDonutShape(attributes: Required<DonutStyleProps>, contai...
    method render (line 105) | public render(attributes: Required<DonutStyleProps>, container: Group ...

FILE: packages/g6/src/elements/nodes/ellipse.ts
  type EllipseStyleProps (line 16) | interface EllipseStyleProps extends BaseNodeStyleProps {}
  class Ellipse (line 23) | class Ellipse extends BaseNode {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<EllipseStyleProps>) {
    method drawKeyShape (line 32) | protected drawKeyShape(attributes: Required<EllipseStyleProps>, contai...
    method getKeyStyle (line 36) | protected getKeyStyle(attributes: Required<EllipseStyleProps>): GEllip...
    method getIconStyle (line 46) | protected getIconStyle(attributes: Required<EllipseStyleProps>): false...
    method getIntersectPoint (line 54) | public getIntersectPoint(point: Point, useExtendedLine = false): Point {

FILE: packages/g6/src/elements/nodes/hexagon.ts
  type HexagonStyleProps (line 13) | interface HexagonStyleProps extends PolygonStyleProps {
  class Hexagon (line 27) | class Hexagon extends Polygon<HexagonStyleProps> {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<HexagonStyleProps>) {
    method getOuterR (line 32) | private getOuterR(attributes: Required<HexagonStyleProps>): number {
    method getPoints (line 36) | protected getPoints(attributes: Required<HexagonStyleProps>): Point[] {
    method getIconStyle (line 40) | protected getIconStyle(attributes: Required<HexagonStyleProps>): false...

FILE: packages/g6/src/elements/nodes/html.ts
  type HTMLStyleProps (line 23) | interface HTMLStyleProps extends BaseNodeStyleProps {
  class HTML (line 52) | class HTML extends BaseNode<HTMLStyleProps> {
    method constructor (line 61) | constructor(options: DisplayObjectConfig<HTMLStyleProps>) {
    method eventService (line 67) | private get eventService() {
    method events (line 71) | private get events() {
    method getDomElement (line 82) | protected getDomElement() {
    method render (line 89) | public render(attributes: Required<HTMLStyleProps> = this.parsedAttrib...
    method getKeyStyle (line 95) | protected getKeyStyle(attributes: Required<HTMLStyleProps>): GHTMLStyl...
    method drawKeyShape (line 105) | protected drawKeyShape(attributes: Required<HTMLStyleProps>, container...
    method connectedCallback (line 112) | public connectedCallback() {
    method attributeChangedCallback (line 125) | public attributeChangedCallback(name: any, oldValue: any, newValue: an...
    method destroy (line 131) | public destroy() {
    method normalizeToPointerEvent (line 155) | private normalizeToPointerEvent(event: PointerEvent, canvas: ICanvas):...
    method transferMouseData (line 205) | private transferMouseData(event: FederatedMouseEvent, nativeEvent: Mou...
    method bootstrapEvent (line 228) | private bootstrapEvent(
    method getViewportXY (line 267) | private getViewportXY(nativeEvent: PointerEvent | WheelEvent) {
    method onframe (line 282) | protected onframe(): void {

FILE: packages/g6/src/elements/nodes/image.ts
  type ImageStyleProps (line 18) | interface ImageStyleProps extends BaseNodeStyleProps {
  class Image (line 38) | class Image extends BaseNode<ImageStyleProps> {
    method constructor (line 43) | constructor(options: DisplayObjectConfig<ImageStyleProps>) {
    method getKeyStyle (line 47) | protected getKeyStyle(attributes: Required<ImageStyleProps>): GImageSt...
    method getBounds (line 61) | public getBounds() {
    method getHaloStyle (line 65) | protected getHaloStyle(attributes: Required<ImageStyleProps>): false |...
    method getIconStyle (line 83) | protected getIconStyle(attributes: Required<ImageStyleProps>): false |...
    method drawKeyShape (line 96) | protected drawKeyShape(attributes: Required<ImageStyleProps>, containe...
    method drawHaloShape (line 102) | protected drawHaloShape(attributes: Required<ImageStyleProps>, contain...
    method update (line 106) | public update(attr?: Partial<ImageStyleProps>): void {

FILE: packages/g6/src/elements/nodes/rect.ts
  type RectStyleProps (line 13) | interface RectStyleProps extends BaseNodeStyleProps {}
  type ParsedRectStyleProps (line 14) | type ParsedRectStyleProps = Required<RectStyleProps>;
  class Rect (line 21) | class Rect extends BaseNode<RectStyleProps> {
    method constructor (line 22) | constructor(options: DisplayObjectConfig<RectStyleProps>) {
    method getKeyStyle (line 26) | protected getKeyStyle(attributes: ParsedRectStyleProps): GRectStylePro...
    method getIconStyle (line 37) | protected getIconStyle(attributes: ParsedRectStyleProps): false | Icon...
    method drawKeyShape (line 50) | protected drawKeyShape(attributes: ParsedRectStyleProps, container: Gr...

FILE: packages/g6/src/elements/nodes/star.ts
  type StarStyleProps (line 13) | interface StarStyleProps extends PolygonStyleProps {
  class Star (line 27) | class Star extends Polygon<StarStyleProps> {
    method constructor (line 28) | constructor(options: DisplayObjectConfig<StarStyleProps>) {
    method getInnerR (line 32) | private getInnerR(attributes: Required<StarStyleProps>): number {
    method getOuterR (line 36) | private getOuterR(attributes: Required<StarStyleProps>): number {
    method getPoints (line 40) | protected getPoints(attributes: Required<StarStyleProps>): Point[] {
    method getIconStyle (line 44) | protected getIconStyle(attributes: Required<StarStyleProps>): false | ...
    method getPortXY (line 50) | protected getPortXY(attributes: Required<StarStyleProps>, style: NodeP...

FILE: packages/g6/src/elements/nodes/triangle.ts
  type TriangleStyleProps (line 18) | interface TriangleStyleProps extends PolygonStyleProps {
  class Triangle (line 33) | class Triangle extends Polygon<TriangleStyleProps> {
    method constructor (line 39) | constructor(options: DisplayObjectConfig<TriangleStyleProps>) {
    method getPoints (line 43) | protected getPoints(attributes: Required<TriangleStyleProps>): Point[] {
    method getPortXY (line 49) | protected getPortXY(attributes: Required<TriangleStyleProps>, style: N...
    method getIconStyle (line 60) | protected getIconStyle(attributes: Required<TriangleStyleProps>): fals...

FILE: packages/g6/src/elements/shapes/badge.ts
  type BadgeStyleProps (line 12) | interface BadgeStyleProps extends LabelStyleProps {}
  class Badge (line 23) | class Badge extends BaseShape<BadgeStyleProps> {
    method constructor (line 32) | constructor(options: DisplayObjectConfig<BadgeStyleProps>) {
    method getBadgeStyle (line 36) | protected getBadgeStyle(attributes: Required<BadgeStyleProps>) {
    method render (line 40) | public render(attributes: Required<BadgeStyleProps> = this.parsedAttri...
    method getGeometryBounds (line 44) | public getGeometryBounds() {

FILE: packages/g6/src/elements/shapes/base-shape.ts
  type BaseShapeStyleProps (line 15) | interface BaseShapeStyleProps extends BaseStyleProps {}
  method constructor (line 23) | constructor(options: DisplayObjectConfig<StyleProps>) {
  method parsedAttributes (line 38) | protected get parsedAttributes() {
  method upsert (line 69) | protected upsert<T extends DisplayObject>(
  method update (line 119) | public update(attr: Partial<StyleProps> = {}): void {
  method bindEvents (line 136) | public bindEvents() {}
  method getGraphicStyle (line 146) | public getGraphicStyle<T extends Record<string, any>>(
  method compositeShapes (line 157) | protected get compositeShapes(): [string, string][] {
  method animate (line 164) | public animate(keyframes: Keyframe[], options?: number | KeyframeAnimati...
  method getShape (line 238) | public getShape<T extends DisplayObject>(name: string): T {
  method setVisibility (line 242) | private setVisibility() {
  method destroy (line 247) | public destroy(): void {
  function releaseAnimation (line 262) | function releaseAnimation(target: DisplayObject, animation: IAnimation) {
  type UpsertHooks (line 276) | interface UpsertHooks {
  function applyTransform (line 327) | function applyTransform(style?: BaseShapeStyleProps) {

FILE: packages/g6/src/elements/shapes/contour.ts
  type ContourLabelStyleProps (line 12) | interface ContourLabelStyleProps extends LabelStyleProps {
  type ContourStyleProps (line 56) | interface ContourStyleProps extends PathStyleProps, Prefix<'label', Cont...
  type ParsedContourStyleProps (line 65) | type ParsedContourStyleProps = Required<ContourStyleProps>;
  type ContourOptions (line 66) | type ContourOptions = DisplayObjectConfig<ContourStyleProps>;
  class Contour (line 68) | class Contour extends BaseShape<ContourStyleProps> {
    method constructor (line 78) | constructor(options: ContourOptions) {
    method getLabelStyle (line 82) | protected getLabelStyle(attributes: ParsedContourStyleProps): LabelSty...
    method getKeyStyle (line 98) | protected getKeyStyle(attributes: ParsedContourStyleProps): PathStyleP...
    method render (line 102) | public render(attributes: ParsedContourStyleProps, container: Group): ...

FILE: packages/g6/src/elements/shapes/icon.ts
  type IconStyleProps (line 12) | interface IconStyleProps extends BaseShapeStyleProps, Partial<TextStyleP...
  class Icon (line 23) | class Icon extends BaseShape<IconStyleProps> {
    method constructor (line 24) | constructor(options: DisplayObjectConfig<IconStyleProps>) {
    method isImage (line 28) | private isImage() {
    method getIconStyle (line 33) | protected getIconStyle(attributes: IconStyleProps = this.attributes): ...
    method render (line 50) | public render(attributes = this.attributes, container: Group = this): ...

FILE: packages/g6/src/elements/shapes/image.ts
  type ImageStyleProps (line 5) | interface ImageStyleProps extends GImageStyleProps {
  class Image (line 14) | class Image extends GImage {
    method constructor (line 15) | constructor(options: DisplayObjectConfig<ImageStyleProps>) {
    method handleRadius (line 31) | public handleRadius() {

FILE: packages/g6/src/elements/shapes/label.ts
  type LabelStyleProps (line 14) | interface LabelStyleProps extends TextStyleProps, Prefix<'background', R...
  class Label (line 39) | class Label extends BaseShape<LabelStyleProps> {
    method constructor (line 54) | constructor(options: DisplayObjectConfig<LabelStyleProps>) {
    method isTextStyle (line 58) | protected isTextStyle(key: string) {
    method isBackgroundStyle (line 62) | protected isBackgroundStyle(key: string) {
    method getTextStyle (line 66) | protected getTextStyle(attributes: Required<LabelStyleProps>) {
    method getBackgroundStyle (line 71) | protected getBackgroundStyle(attributes: Required<LabelStyleProps>) {
    method render (line 110) | public render(attributes: Required<LabelStyleProps> = this.parsedAttri...
    method getGeometryBounds (line 115) | public getGeometryBounds() {

FILE: packages/g6/src/elements/shapes/polygon.ts
  type PolygonStyleProps (line 13) | interface PolygonStyleProps extends BaseNodeStyleProps {
  method constructor (line 27) | constructor(options: DisplayObjectConfig<T>) {
  method parsedAttributes (line 31) | public get parsedAttributes() {
  method drawKeyShape (line 35) | protected drawKeyShape(attributes: Required<T>, container: Group) {
  method getKeyStyle (line 39) | protected getKeyStyle(attributes: Required<T>): GPolygonStyleProps {
  method getIntersectPoint (line 46) | public getIntersectPoint(point: Point, useExtendedLine = false): Point {

FILE: packages/g6/src/global.d.ts
  type BaseStyleProps (line 5) | interface BaseStyleProps {
  type DisplayObjectConfig (line 14) | interface DisplayObjectConfig {

FILE: packages/g6/src/layouts/base-layout.ts
  method constructor (line 17) | constructor(context: RuntimeContext, options?: O) {

FILE: packages/g6/src/layouts/fishbone.ts
  type FishboneLayoutOptions (line 9) | interface FishboneLayoutOptions extends BaseLayoutOptions {
  type NodeResult (line 60) | type NodeResult = { id: ID; x: number; y: number };
  type EdgeResult (line 61) | type EdgeResult = { id: ID; controlPoints: Point[]; relatedNodeId: ID };
  type LayoutResult (line 62) | type LayoutResult = { nodes: NodeResult[]; edges: EdgeResult[] };
  class FishboneLayout (line 73) | class FishboneLayout extends BaseLayout {
    method getRoot (line 81) | private getRoot() {
    method formatSize (line 88) | private formatSize(nodeSize: Size | ((node: NodeData) => Size)): (node...
    method doLayout (line 93) | private doLayout(root: NodeData, options: Required<FishboneLayoutOptio...
    method placeAlterative (line 219) | private placeAlterative(result: LayoutResult, root: NodeData) {
    method rightToLeft (line 243) | private rightToLeft(result: LayoutResult, options: Required<FishboneLa...
    method execute (line 251) | async execute(data: GraphData, propOptions: FishboneLayoutOptions): Pr...

FILE: packages/g6/src/layouts/snake.ts
  type SnakeLayoutOptions (line 8) | interface SnakeLayoutOptions extends BaseLayoutOptions {
  class SnakeLayout (line 73) | class SnakeLayout extends BaseLayout {
    method formatSize (line 82) | private formatSize(nodes: NodeData[], size?: Size | ((node: NodeData) ...
    method validate (line 98) | private validate(data: GraphData): boolean {
    method execute (line 141) | async execute(model: GraphData, options?: SnakeLayoutOptions): Promise...
  function topologicalSort (line 197) | function topologicalSort(data: GraphData): NodeData[] {

FILE: packages/g6/src/layouts/types.ts
  type BuiltInLayoutOptions (line 25) | type BuiltInLayoutOptions =
  type BaseLayoutOptions (line 42) | interface BaseLayoutOptions extends AnimationOptions, WebWorkerLayoutOpt...
  type CircularLayout (line 100) | interface CircularLayout extends BaseLayoutOptions, CircularLayoutOptions {
  type RandomLayout (line 104) | interface RandomLayout extends BaseLayoutOptions, RandomLayoutOptions {
  type GridLayout (line 108) | interface GridLayout extends BaseLayoutOptions, GridLayoutOptions {
  type MDSLayout (line 112) | interface MDSLayout extends BaseLayoutOptions, MDSLayoutOptions {
  type ConcentricLayout (line 116) | interface ConcentricLayout extends BaseLayoutOptions, ConcentricLayoutOp...
  type RadialLayout (line 120) | interface RadialLayout extends BaseLayoutOptions, RadialLayoutOptions {
  type FruchtermanLayout (line 124) | interface FruchtermanLayout extends BaseLayoutOptions, FruchtermanLayout...
  type D3ForceLayout (line 128) | interface D3ForceLayout extends BaseLayoutOptions, D3ForceLayoutOptions {
  type D3Force3DLayout (line 132) | interface D3Force3DLayout extends BaseLayoutOptions, D3Force3DLayoutOpti...
  type ForceLayout (line 136) | interface ForceLayout extends BaseLayoutOptions, ForceLayoutOptions {
  type ForceAtlas2 (line 140) | interface ForceAtlas2 extends BaseLayoutOptions, ForceAtlas2LayoutOptions {
  type AntVDagreLayout (line 144) | interface AntVDagreLayout extends BaseLayoutOptions, AntVDagreLayoutOpti...
  type DagreLayout (line 148) | interface DagreLayout extends BaseLayoutOptions, DagreLayoutOptions {
  type SnakeLayout (line 152) | interface SnakeLayout extends BaseLayoutOptions, SnakeLayoutOptions {
  type FishboneLayout (line 156) | interface FishboneLayout extends BaseLayoutOptions, FishboneLayoutOptions {
  type AnimationOptions (line 160) | interface AnimationOptions {
  type WebWorkerLayoutOptions (line 169) | interface WebWorkerLayoutOptions {
  type AntVLayout (line 184) | type AntVLayout = AntVNonIterativeLayout<any> | AntVIterativeLayout<any>;
  type Layout (line 186) | type Layout = BaseLayout | AntVLayout;
  type AntVGraphData (line 188) | type AntVGraphData = GraphData;
  type LegacyGraph (line 191) | type LegacyGraph = IGraph<NodeData, EdgeData>;
  type LegacyAntVLayout (line 192) | type LegacyAntVLayout<T = any> = {

FILE: packages/g6/src/palettes/types.ts
  type Palette (line 1) | type Palette = string | BuiltInPalette | CategoricalPalette | Continuous...
  type STDPalette (line 3) | type STDPalette = CategoricalPalette | ContinuousPalette;
  type BuiltInPalette (line 5) | type BuiltInPalette = 'spectral' | 'oranges' | 'greens' | 'blues';
  type CategoricalPalette (line 7) | type CategoricalPalette = string[];
  type ContinuousPalette (line 9) | type ContinuousPalette = (ratio: number) => string;

FILE: packages/g6/src/plugins/background/index.ts
  type BackgroundOptions (line 12) | interface BackgroundOptions extends BasePluginOptions, CSSStyleDeclarati...
  class Background (line 23) | class Background extends BasePlugin<BackgroundOptions> {
    method constructor (line 32) | constructor(context: RuntimeContext, options: BackgroundOptions) {
    method update (line 48) | public async update(options: Partial<BackgroundOptions>) {
    method destroy (line 61) | public destroy(): void {

FILE: packages/g6/src/plugins/base-plugin.ts
  type BasePluginOptions (line 4) | interface BasePluginOptions extends CustomPluginOption {}

FILE: packages/g6/src/plugins/bubble-sets.ts
  type BubbleSetsOptions (line 25) | interface BubbleSetsOptions extends BasePluginOptions, IBubbleSetOptions...
  class BubbleSets (line 53) | class BubbleSets extends BasePlugin<BubbleSetsOptions> {
    method constructor (line 78) | constructor(context: RuntimeContext, options: BubbleSetsOptions) {
    method bindEvents (line 86) | private bindEvents() {
    method init (line 91) | private init() {
    method parseOptions (line 98) | private parseOptions() {
    method addMember (line 226) | public addMember(members: ID | ID[]) {
    method removeMember (line 240) | public removeMember(members: ID | ID[]) {
    method updateMember (line 251) | public updateMember(members: ID[] | ((prev: ID[]) => ID[])) {
    method getMember (line 261) | public getMember() {
    method addAvoidMember (line 271) | public addAvoidMember(avoidMembers: ID | ID[]) {
    method removeAvoidMember (line 285) | public removeAvoidMember(avoidMembers: ID | ID[]) {
    method updateAvoidMember (line 298) | public updateAvoidMember(avoidMembers: ID | ID[]) {
    method getAvoidMember (line 308) | public getAvoidMember() {
    method destroy (line 317) | public destroy(): void {

FILE: packages/g6/src/plugins/camera-setting.ts
  type CameraSettingOptions (line 6) | interface CameraSettingOptions extends BasePluginOptions {
  class CameraSetting (line 101) | class CameraSetting extends BasePlugin<CameraSettingOptions> {
    method constructor (line 102) | constructor(context: RuntimeContext, options: CameraSettingOptions) {
    method update (line 113) | public update(options: Partial<CameraSettingOptions>): void {
    method bindEvents (line 118) | private bindEvents() {
    method getCanvasAspect (line 164) | private getCanvasAspect() {

FILE: packages/g6/src/plugins/contextmenu/index.ts
  type ContextmenuOptions (line 14) | interface ContextmenuOptions extends BasePluginOptions {
  class Contextmenu (line 82) | class Contextmenu extends BasePlugin<ContextmenuOptions> {
    method constructor (line 95) | constructor(context: RuntimeContext, options: ContextmenuOptions) {
    method initElement (line 102) | private initElement() {
    method show (line 120) | public async show(event: IElementEvent) {
    method hide (line 152) | public hide() {
    method update (line 164) | public update(options: Partial<ContextmenuOptions>) {
    method destroy (line 176) | public destroy(): void {
    method getDOMContent (line 182) | private async getDOMContent(event: IElementEvent) {
    method bindEvents (line 191) | private bindEvents() {
    method unbindEvents (line 203) | private unbindEvents() {

FILE: packages/g6/src/plugins/contextmenu/util.ts
  type Item (line 5) | type Item = {
  function getContentFromItems (line 23) | function getContentFromItems(items: Item[]) {
  constant CONTEXTMENU_CSS (line 34) | const CONTEXTMENU_CSS = `

FILE: packages/g6/src/plugins/edge-bundling/index.ts
  type EdgeBundlingOptions (line 18) | interface EdgeBundlingOptions extends BasePluginOptions {
  class EdgeBundling (line 90) | class EdgeBundling extends BasePlugin<EdgeBundlingOptions> {
    method constructor (line 102) | constructor(context: RuntimeContext, options?: EdgeBundlingOptions) {
    method nodeMap (line 111) | private get nodeMap(): Record<ID, Point> {
    method divideEdges (line 116) | private divideEdges(divisions: number) {
    method getVectorPosition (line 166) | private getVectorPosition(edge: EdgeData): VectorPosition {
    method measureEdgeCompatibility (line 174) | private measureEdgeCompatibility(edge1: EdgeData, edge2: EdgeData) {
    method getEdgeBundles (line 186) | private getEdgeBundles() {
    method getSpringForce (line 207) | private getSpringForce(divisions: { pre: Point; cur: Point; next: Poin...
    method getElectrostaticForce (line 212) | private getElectrostaticForce(pidx: number, edge: EdgeData): Point {
    method getEdgeForces (line 231) | private getEdgeForces(edge: EdgeData, divisions: number, lambda: numbe...
    method bindEvents (line 292) | private bindEvents() {
    method unbindEvents (line 298) | private unbindEvents() {
    method destroy (line 304) | public destroy(): void {
  type VectorPosition (line 310) | interface VectorPosition {

FILE: packages/g6/src/plugins/edge-filter-lens/index.ts
  type EdgeFilterLensOptions (line 29) | interface EdgeFilterLensOptions extends BasePluginOptions {
  constant DELTA (line 133) | const DELTA = 0.05;
  class EdgeFilterLens (line 144) | class EdgeFilterLens extends BasePlugin<EdgeFilterLensOptions> {
    method constructor (line 157) | constructor(context: RuntimeContext, options: EdgeFilterLensOptions) {
    method canvas (line 168) | private get canvas() {
    method isLensOn (line 172) | private get isLensOn() {
    method getElementStyle (line 289) | private getElementStyle(elementType: ElementType, datum: ElementDatum) {
    method graphDom (line 315) | get graphDom() {
    method bindEvents (line 342) | private bindEvents() {
    method unbindEvents (line 365) | private unbindEvents() {
    method update (line 387) | public update(options: Partial<EdgeFilterLensOptions>) {
    method destroy (line 394) | public destroy() {

FILE: packages/g6/src/plugins/fisheye/index.ts
  type FisheyeOptions (line 22) | interface FisheyeOptions extends BasePluginOptions {
  constant R_DELTA (line 143) | const R_DELTA = 0.05;
  constant D_DELTA (line 144) | const D_DELTA = 0.1;
  class Fisheye (line 155) | class Fisheye extends BasePlugin<FisheyeOptions> {
    method constructor (line 168) | constructor(context: RuntimeContext, options: FisheyeOptions) {
    method canvas (line 178) | private get canvas() {
    method isLensOn (line 182) | private get isLensOn() {
    method graphDom (line 406) | get graphDom() {
    method bindEvents (line 410) | private bindEvents() {
    method unbindEvents (line 438) | private unbindEvents() {
    method update (line 466) | public update(options: Partial<FisheyeOptions>) {
    method destroy (line 474) | public destroy() {

FILE: packages/g6/src/plugins/fullscreen/index.ts
  type FullscreenOptions (line 13) | interface FullscreenOptions extends BasePluginOptions {
  class Fullscreen (line 53) | class Fullscreen extends BasePlugin<FullscreenOptions> {
    method constructor (line 67) | constructor(context: RuntimeContext, options: FullscreenOptions) {
    method bindEvents (line 83) | private bindEvents() {
    method unbindEvents (line 97) | private unbindEvents() {
    method setGraphSize (line 105) | private setGraphSize(fullScreen = true) {
    method request (line 133) | public request() {
    method exit (line 145) | public exit() {
    method update (line 157) | public update(options: Partial<FullscreenOptions>): void {
    method destroy (line 163) | public destroy(): void {
  function isFullscreenEnabled (line 176) | function isFullscreenEnabled() {

FILE: packages/g6/src/plugins/grid-line.ts
  type GridLineOptions (line 15) | interface GridLineOptions extends BasePluginOptions {
  class GridLine (line 106) | class GridLine extends BasePlugin<GridLineOptions> {
    method constructor (line 122) | constructor(context: RuntimeContext, options: GridLineOptions) {
    method update (line 141) | public update(options: Partial<GridLineOptions>) {
    method bindEvents (line 151) | private bindEvents() {
    method updateStyle (line 156) | private updateStyle() {
    method updateOffset (line 169) | private updateOffset(delta: Point) {
    method parseFollow (line 207) | private parseFollow(follow: GridLineOptions['follow']): { translate: b...
    method destroy (line 226) | public destroy(): void {

FILE: packages/g6/src/plugins/history/index.ts
  type HistoryOptions (line 18) | interface HistoryOptions extends BasePluginOptions {
  class History (line 55) | class History extends BasePlugin<HistoryOptions> {
    method constructor (line 66) | constructor(context: RuntimeContext, options: HistoryOptions) {
    method canUndo (line 83) | public canUndo() {
    method canRedo (line 93) | public canRedo() {
    method undo (line 103) | public undo() {
    method redo (line 124) | public redo() {
    method undoAndCancel (line 140) | public undoAndCancel() {
    method undoStackPush (line 195) | private undoStackPush(cmd: Command): void {
    method clear (line 214) | public clear(): void {
    method notify (line 222) | private notify(event: Loosen<HistoryEvent>, cmd: Command | null) {
    method on (line 234) | public on(event: Loosen<HistoryEvent>, handler: (e: { cmd?: Command | ...
    method destroy (line 244) | public destroy(): void {

FILE: packages/g6/src/plugins/history/util.ts
  function alignFields (line 16) | function alignFields(refObject: Record<string, any>, targetObject: Recor...
  function parseCommand (line 36) | function parseCommand(changes: DataChange[], animation = false, context?...

FILE: packages/g6/src/plugins/hull/hull/format.ts
  type PointObject (line 3) | type PointObject = Record<string, number>;
  type BBox (line 4) | type BBox = [number, number, number, number];
  type FormatTuple (line 5) | type FormatTuple = [string, string];
  method toXy (line 8) | toXy<T extends PointObject>(pointset: T[] | Point[], format?: FormatTupl...
  method fromXy (line 17) | fromXy(coordinates: Point[], format?: FormatTuple): Point[] | PointObjec...
  type PointConverter (line 29) | type PointConverter = typeof formatUtil;

FILE: packages/g6/src/plugins/hull/hull/grid_handle.ts
  class Grid (line 4) | class Grid {
    method constructor (line 8) | constructor(points: Point[], cellSize: number) {
    method cellPoints (line 26) | cellPoints(x: number, y: number): Point[] {
    method rangePoints (line 29) | rangePoints(bbox: BBox): Point[] {
    method removePoint (line 45) | removePoint(point: Point): Point[] {
    method trunc (line 55) | private trunc(val: number): number {
    method coordToCellNum (line 58) | coordToCellNum(x: number): number {
    method extendBbox (line 61) | extendBbox(bbox: BBox, scaleFactor: number): BBox {
  function grid (line 71) | function grid(points: Point[], cellSize: number): Grid {

FILE: packages/g6/src/plugins/hull/hull/index.ts
  function _filterDuplicates (line 9) | function _filterDuplicates(pointset: Point[]) {
  function _sortByX (line 22) | function _sortByX(pointset: Point[]) {
  function _sqLength (line 28) | function _sqLength(a: Point, b: Point) {
  function _cos (line 32) | function _cos(o: Point, a: Point, b: Point) {
  function _intersect (line 42) | function _intersect(segment: [Point, Point], pointset: Point[]) {
  function _occupiedArea (line 58) | function _occupiedArea(pointset: Point[]) {
  function _bBoxAround (line 85) | function _bBoxAround(edge: [Point, Point]): BBox {
  function _midPoint (line 94) | function _midPoint(edge: [Point, Point], innerPoints: Point[], convex: P...
  function _concave (line 120) | function _concave(
  function hull (line 170) | function hull(pointset: Point[], concavity: number, format?: FormatTuple...
  constant MAX_CONCAVE_ANGLE_COS (line 202) | const MAX_CONCAVE_ANGLE_COS = Math.cos(90 / (180 / Math.PI));
  constant MAX_SEARCH_BBOX_SIZE_PERCENT (line 203) | const MAX_SEARCH_BBOX_SIZE_PERCENT = 0.6;

FILE: packages/g6/src/plugins/hull/hull/monotone-convex-hull-2d.ts
  function monotoneConvexHull2D (line 8) | function monotoneConvexHull2D(points: Point[]): number[] {

FILE: packages/g6/src/plugins/hull/hull/robust-orientation.ts
  type PointND (line 8) | type PointND = number[];
  constant NUM_EXPAND (line 10) | const NUM_EXPAND = 5;
  constant EPSILON (line 11) | const EPSILON = 1.1102230246251565e-16;
  constant ERR_BOUND_3 (line 12) | const ERR_BOUND_3 = (3.0 + 16.0 * EPSILON) * EPSILON;
  constant ERR_BOUND_4 (line 13) | const ERR_BOUND_4 = (7.0 + 56.0 * EPSILON) * EPSILON;
  function orientation_3 (line 15) | function orientation_3(
  function orientation_4 (line 29) | function orientation_4(
  function orientation_5 (line 73) | function orientation_5(
  function orientation (line 321) | function orientation(n: number) {
  constant CACHED (line 329) | const CACHED: Array<Function> = [
  function slowOrient (line 394) | function slowOrient(args: Array<PointND | PointND>): number {
  function proc (line 402) | function proc(
  function generateOrientationProc (line 430) | function generateOrientationProc(): any {

FILE: packages/g6/src/plugins/hull/hull/robust-scale.ts
  function scaleLinearExpansion (line 6) | function scaleLinearExpansion(e: number[], scale: number): number[] {

FILE: packages/g6/src/plugins/hull/hull/robust-segment-intersect.ts
  function checkCollinear (line 4) | function checkCollinear(a0: Point, a1: Point, b0: Point, b1: Point): boo...
  function segmentsIntersect (line 18) | function segmentsIntersect(a0: Point, a1: Point, b0: Point, b1: Point): ...

FILE: packages/g6/src/plugins/hull/hull/robust-subtract.ts
  function scalarScalar (line 3) | function scalarScalar(a: number, b: number): number[] {
  function robustSubtract (line 17) | function robustSubtract(e: number[], f: number[]): number[] {

FILE: packages/g6/src/plugins/hull/hull/robust-sum.ts
  function scalarScalar (line 3) | function scalarScalar(a: number, b: number): number[] {
  function linearExpansionSum (line 17) | function linearExpansionSum(e: number[], f: number[]): number[] {

FILE: packages/g6/src/plugins/hull/hull/two-product.ts
  constant SPLITTER (line 3) | const SPLITTER: number = +(Math.pow(2, 27) + 1.0);
  function twoProduct (line 5) | function twoProduct(a: number, b: number, result?: [number, number]): [n...

FILE: packages/g6/src/plugins/hull/hull/two-sum.ts
  function fastTwoSum (line 3) | function fastTwoSum(a: number, b: number, result?: [number, number]): [n...

FILE: packages/g6/src/plugins/hull/index.ts
  type HullOptions (line 20) | interface HullOptions extends BasePluginOptions, ContourStyleProps {
  class Hull (line 67) | class Hull extends BasePlugin<HullOptions> {
    method constructor (line 97) | constructor(context: RuntimeContext, options: HullOptions) {
    method bindEvents (line 103) | private bindEvents() {
    method unbindEvents (line 108) | private unbindEvents() {
    method getHullStyle (line 113) | private getHullStyle(forceUpdate?: boolean): ContourStyleProps {
    method getPadding (line 149) | private getPadding() {
    method addMember (line 167) | public addMember(members: ID | ID[]) {
    method removeMember (line 179) | public removeMember(members: ID | ID[]) {
    method updateMember (line 193) | public updateMember(members: ID[] | ((prev: ID[]) => ID[])) {
    method getMember (line 204) | public getMember() {
    method destroy (line 214) | public destroy(): void {

FILE: packages/g6/src/plugins/hull/util.ts
  function computeHullPath (line 18) | function computeHullPath(points: Point[], padding: number, corner: 'roun...

FILE: packages/g6/src/plugins/legend.ts
  type Datum (line 13) | interface Datum extends Record<string, any> {
  type LegendOptions (line 26) | interface LegendOptions extends BasePluginOptions, Omit<CategoryStylePro...
  class Legend (line 92) | class Legend extends BasePlugin<LegendOptions> {
    method constructor (line 118) | constructor(context: RuntimeContext, options: LegendOptions) {
    method update (line 130) | public update(options: Partial<LegendOptions>) {
    method clear (line 136) | private clear() {
    method updateElement (line 213) | public updateElement() {
    method upsertCanvas (line 333) | private upsertCanvas() {
    method destroy (line 413) | public destroy(): void {

FILE: packages/g6/src/plugins/minimap/index.ts
  type MinimapOptions (line 20) | interface MinimapOptions extends BasePluginOptions {
  class Minimap (line 114) | class Minimap extends BasePlugin<MinimapOptions> {
    method constructor (line 133) | constructor(context: RuntimeContext, options: MinimapOptions) {
    method update (line 139) | public update(options: Partial<MinimapOptions>): void {
    method setOnRender (line 146) | private setOnRender() {
    method bindEvents (line 153) | private bindEvents() {
    method unbindEvents (line 161) | private unbindEvents() {
    method renderMinimap (line 181) | private renderMinimap() {
    method getElements (line 187) | private getElements(): Required<GraphData> {
    method setShapes (line 213) | private setShapes(canvas: Canvas, data: Required<GraphData>) {
    method initCanvas (line 263) | private initCanvas() {
    method createLandmark (line 300) | private createLandmark(position: Vector3, focalPoint: Vector3, zoom: n...
    method setCamera (line 315) | private setCamera() {
    method maskBBox (line 343) | private get maskBBox(): [number, number, number, number] {
    method calculateMaskBBox (line 364) | private calculateMaskBBox(): [number, number, number, number] {
    method renderMask (line 391) | private renderMask() {
    method updateMask (line 500) | private updateMask() {
    method destroy (line 512) | public destroy(): void {

FILE: packages/g6/src/plugins/snapline/index.ts
  type SnaplineOptions (line 16) | interface SnaplineOptions extends BasePluginOptions {
  type Metadata (line 78) | type Metadata = {
  class Snapline (line 92) | class Snapline extends BasePlugin<SnaplineOptions> {
    method constructor (line 106) | constructor(context: RuntimeContext, options: SnaplineOptions) {
    method getNodes (line 127) | private getNodes(): Node[] {
    method hideSnapline (line 142) | private hideSnapline() {
    method getLineWidth (line 147) | private getLineWidth(direction: 'horizontal' | 'vertical') {
    method updateSnapline (line 152) | private updateSnapline(metadata: Metadata) {
    method getDelta (line 225) | protected getDelta(event: IDragEvent<Node>) {
    method bindEvents (line 363) | private async bindEvents() {
    method unbindEvents (line 370) | private unbindEvents() {
    method destroyElements (line 377) | private destroyElements() {
    method destroy (line 382) | public destroy() {

FILE: packages/g6/src/plugins/timebar.ts
  type TimebarOptions (line 21) | interface TimebarOptions extends BasePluginOptions {
  class Timebar (line 188) | class Timebar extends BasePlugin<TimebarOptions> {
    method padding (line 212) | private get padding() {
    method constructor (line 216) | constructor(context: RuntimeContext, options: TimebarOptions) {
    method play (line 227) | public play() {
    method pause (line 236) | public pause() {
    method forward (line 245) | public forward() {
    method backward (line 254) | public backward() {
    method reset (line 263) | public reset() {
    method update (line 274) | public update(options: Partial<TimebarOptions>) {
    method backup (line 286) | private backup() {
    method upsertTimebar (line 290) | private upsertTimebar() {
    method upsertCanvas (line 326) | private upsertCanvas() {
    method filterElements (line 349) | private async filterElements(range: number | [number, number]) {
    method hiddenElements (line 376) | private hiddenElements(range: number | [number, number]) {
    method destroy (line 404) | public destroy(): void {

FILE: packages/g6/src/plugins/title/index.ts
  type TitleStyle (line 60) | type TitleStyle = Prefix<typeof titleKey, Omit<LabelStyleProps, 'x' | 'y...
  type SubTitleStyle (line 66) | type SubTitleStyle = Prefix<typeof subtitleKey, Omit<LabelStyleProps, 'x...
  type TitleOptions (line 73) | interface TitleOptions extends BasePluginOptions, TitleStyle, SubTitleSt...
  class Title (line 122) | class Title extends BasePlugin<TitleOptions> {
    method padding (line 126) | private get padding() {
    method constructor (line 130) | constructor(context: RuntimeContext, options: TitleOptions) {
    method bindEvents (line 142) | private bindEvents() {
    method unbindEvents (line 148) | private unbindEvents() {
    method destroy (line 154) | public destroy(): void {
    method updateCanvas (line 161) | private updateCanvas() {
    method renderTitle (line 194) | private renderTitle(canvas: Canvas) {
  class TitleComponent (line 207) | class TitleComponent {
    method padding (line 211) | private get padding() {
    method constructor (line 215) | constructor(props: { ctx: RuntimeContext; options: TitleOptions }) {
    method getTitle (line 223) | public getTitle() {

FILE: packages/g6/src/plugins/toolbar/index.ts
  type ToolbarOptions (line 14) | interface ToolbarOptions extends BasePluginOptions {
  class Toolbar (line 53) | class Toolbar extends BasePlugin<ToolbarOptions> {
    method constructor (line 60) | constructor(context: RuntimeContext, options: ToolbarOptions) {
    method update (line 83) | public async update(options: Partial<ToolbarOptions>) {
    method destroy (line 102) | public destroy(): void {
    method getDOMContent (line 109) | private async getDOMContent() {

FILE: packages/g6/src/plugins/toolbar/util.ts
  type ToolbarItem (line 8) | interface ToolbarItem {
  function parsePositionToStyle (line 34) | function parsePositionToStyle(position: CornerPlacement): Partial<CSSSty...
  constant TOOLBAR_CSS (line 55) | const TOOLBAR_CSS = `
  constant BUILD_IN_SVG_ICON (line 88) | const BUILD_IN_SVG_ICON = `

FILE: packages/g6/src/plugins/tooltip.ts
  type TooltipOptions (line 15) | interface TooltipOptions
  class Tooltip (line 56) | class Tooltip extends BasePlugin<TooltipOptions> {
    method constructor (line 73) | constructor(context: RuntimeContext, options: TooltipOptions) {
    method getEvents (line 85) | private getEvents(): { [key: string]: (event: IElementEvent) => void } {
    method update (line 116) | public update(options: Partial<TooltipOptions>) {
    method render (line 126) | private render() {
    method unbindEvents (line 134) | private unbindEvents() {
    method bindEvents (line 143) | private bindEvents() {
    method tooltipStyleProps (line 335) | private get tooltipStyleProps() {
    method destroy (line 372) | public destroy(): void {

FILE: packages/g6/src/plugins/types.ts
  type Plugin (line 3) | type Plugin = BasePlugin<any>;

FILE: packages/g6/src/plugins/utils/canvas.ts
  type Options (line 9) | interface Options {
  function createPluginCanvas (line 35) | function createPluginCanvas(options: Options): [HTMLElement, GCanvas] {
  function getContainer (line 56) | function getContainer(options: Options) {
  function computePosition (line 87) | function computePosition(options: Options) {

FILE: packages/g6/src/plugins/utils/dom.ts
  function createPluginContainer (line 10) | function createPluginContainer(type: string, cover = true, style?: Parti...
  function insertDOM (line 48) | function insertDOM(

FILE: packages/g6/src/plugins/watermark/index.ts
  type WatermarkOptions (line 12) | interface WatermarkOptions extends BasePluginOptions {
  class Watermark (line 177) | class Watermark extends BasePlugin<WatermarkOptions> {
    method constructor (line 193) | constructor(context: RuntimeContext, options: WatermarkOptions) {
    method update (line 209) | public async update(options: Partial<WatermarkOptions>) {
    method destroy (line 235) | public destroy(): void {

FILE: packages/g6/src/plugins/watermark/util.ts
  function createCanvas (line 10) | function createCanvas(width: number, height: number): HTMLCanvasElement {
  function getTextWatermark (line 29) | async function getTextWatermark(width: number, height: number, text: str...
  function getImageWatermark (line 73) | async function getImageWatermark(width: number, height: number, imageURL...

FILE: packages/g6/src/registry/build-in.ts
  constant BUILT_IN_EXTENSIONS (line 112) | const BUILT_IN_EXTENSIONS: ExtensionRegistry = {
  function registerBuiltInExtensions (line 252) | function registerBuiltInExtensions() {

FILE: packages/g6/src/registry/extension/index.ts
  method constructor (line 20) | constructor(context: RuntimeContext) {
  method setExtensions (line 24) | public setExtensions(
  method createExtension (line 41) | protected createExtension(extension: STDExtensionOption) {
  method createExtensions (line 53) | protected createExtensions(extensions: STDExtensionOption[]) {
  method updateExtension (line 57) | protected updateExtension(extension: STDExtensionOption) {
  method updateExtensions (line 65) | protected updateExtensions(extensions: STDExtensionOption[]) {
  method destroyExtension (line 69) | protected destroyExtension(key: string) {
  method destroyExtensions (line 80) | protected destroyExtensions(extensions: STDExtensionOption[]) {
  method destroy (line 84) | public destroy() {
  class BaseExtension (line 98) | class BaseExtension<T extends { type: string; key?: string; [key: string...
    method constructor (line 109) | constructor(context: RuntimeContext, options: Partial<T>) {
    method update (line 114) | public update(options: Partial<T>) {
    method destroy (line 118) | public destroy() {

FILE: packages/g6/src/registry/extension/types.ts
  type STDExtensionOption (line 6) | interface STDExtensionOption {

FILE: packages/g6/src/registry/get.ts
  function getExtension (line 15) | function getExtension<T extends ExtensionCategory>(
  function getExtensions (line 35) | function getExtensions<T extends Loosen<ExtensionCategory>>(category: T)...

FILE: packages/g6/src/registry/register.ts
  function register (line 37) | function register<T extends ExtensionCategory>(

FILE: packages/g6/src/registry/store.ts
  constant EXTENSION_REGISTRY (line 8) | const EXTENSION_REGISTRY: ExtensionRegistry = {

FILE: packages/g6/src/registry/types.ts
  type ExtensionRegistry (line 16) | interface ExtensionRegistry {

FILE: packages/g6/src/runtime/animation.ts
  class Animation (line 9) | class Animation {
    method constructor (line 12) | constructor(context: RuntimeContext) {
    method getTasks (line 20) | private getTasks() {
    method add (line 26) | public add(context: AnimationContext, callbacks?: AnimationCallbacks) {
    method animate (line 30) | public animate(
    method inferStyle (line 82) | public inferStyle(
    method stop (line 152) | public stop() {
    method clear (line 156) | public clear() {
    method release (line 166) | private release() {
    method destroy (line 179) | public destroy() {
  type AnimationCallbacks (line 186) | interface AnimationCallbacks {
  type ExtendOptions (line 193) | interface ExtendOptions {

FILE: packages/g6/src/runtime/batch.ts
  class BatchController (line 6) | class BatchController {
    method constructor (line 11) | constructor(context: RuntimeContext) {
    method emit (line 15) | private emit(event: BaseEvent) {
    method startBatch (line 20) | public startBatch(initiate = true) {
    method endBatch (line 25) | public endBatch() {
    method isBatching (line 30) | public get isBatching() {
    method destroy (line 34) | public destroy() {

FILE: packages/g6/src/runtime/behavior.ts
  class BehaviorController (line 11) | class BehaviorController extends ExtensionController<BaseBehavior<Custom...
    method constructor (line 23) | constructor(context: RuntimeContext) {
    method setBehaviors (line 29) | public setBehaviors(behaviors: BehaviorOptions) {
    method forwardEvents (line 33) | private forwardEvents() {
    method destroy (line 132) | public destroy(): void {

FILE: packages/g6/src/runtime/canvas.ts
  type CanvasConfig (line 11) | interface CanvasConfig extends Pick<
  type DataURLOptions (line 34) | interface DataURLOptions {
  constant SINGLE_LAYER_NAME (line 60) | const SINGLE_LAYER_NAME: CanvasLayer[] = ['main'];
  constant MULTI_LAYER_NAME (line 61) | const MULTI_LAYER_NAME: CanvasLayer[] = ['background', 'main', 'label', ...
  function getMainLayerOf (line 70) | function getMainLayerOf(layers: Record<CanvasLayer, GCanvas>) {
  class Canvas (line 74) | class Canvas {
    method getConfig (line 86) | public getConfig() {
    method getLayer (line 90) | public getLayer(layer: CanvasLayer = 'main') {
    method getLayers (line 100) | public getLayers() {
    method getRenderer (line 111) | public getRenderer(layer: CanvasLayer) {
    method getCamera (line 122) | public getCamera(layer: CanvasLayer = 'main') {
    method getRoot (line 126) | public getRoot(layer: CanvasLayer = 'main') {
    method getContextService (line 130) | public getContextService(layer: CanvasLayer = 'main') {
    method setCursor (line 134) | public setCursor(cursor: Cursor): void {
    method document (line 139) | public get document() {
    method context (line 143) | public get context() {
    method constructor (line 147) | constructor(config: CanvasConfig) {
    method ready (line 176) | public get ready() {
    method resize (line 180) | public resize(width: number, height: number) {
    method getBounds (line 210) | public getBounds(group?: 'elements' | 'plugins') {
    method getContainer (line 226) | public getContainer() {
    method getSize (line 231) | public getSize(): [number, number] {
    method appendChild (line 235) | public appendChild<T extends IChildNode>(child: T, index?: number): T {
    method setRenderer (line 240) | public setRenderer(renderer: CanvasOptions['renderer']) {
    method getCanvasByViewport (line 248) | public getCanvasByViewport(point: Point): Point {
    method getViewportByCanvas (line 252) | public getViewportByCanvas(point: Point): Point {
    method getViewportByClient (line 256) | public getViewportByClient(point: Point): Point {
    method getClientByViewport (line 260) | public getClientByViewport(point: Point): Point {
    method getClientByCanvas (line 264) | public getClientByCanvas(point: Point): Point {
    method getCanvasByClient (line 268) | public getCanvasByClient(point: Point): Point {
    method toDataURL (line 274) | public async toDataURL(options: Partial<DataURLOptions> = {}) {
    method destroy (line 343) | public destroy() {
  function createRenderers (line 360) | function createRenderers(renderer: CanvasConfig['renderer'], layersName:...
  function configCanvasDom (line 393) | function configCanvasDom(layers: Record<CanvasLayer, GCanvas>) {

FILE: packages/g6/src/runtime/data.ts
  class DataController (line 33) | class DataController {
    method constructor (line 72) | constructor() {
    method pushChange (line 76) | private pushChange(change: DataChange) {
    method getChanges (line 88) | public getChanges(): DataChange[] {
    method clearChanges (line 92) | public clearChanges() {
    method batch (line 96) | public batch(callback: () => void) {
    method isBatching (line 102) | protected isBatching() {
    method silence (line 116) | public silence(callback: () => void) {
    method isCombo (line 122) | public isCombo(id: ID) {
    method getData (line 126) | public getData() {
    method getNodeData (line 134) | public getNodeData(ids?: ID[]) {
    method getEdgeDatum (line 144) | public getEdgeDatum(id: ID) {
    method getEdgeData (line 148) | public getEdgeData(ids?: ID[]) {
    method getComboData (line 157) | public getComboData(ids?: ID[]) {
    method getRootsData (line 168) | public getRootsData(hierarchyKey: HierarchyKey = TREE_KEY) {
    method getAncestorsData (line 172) | public getAncestorsData(id: ID, hierarchyKey: HierarchyKey): NodeLikeD...
    method getDescendantsData (line 178) | public getDescendantsData(id: ID): NodeLikeData[] {
    method getParentData (line 192) | public getParentData(id: ID, hierarchyKey: HierarchyKey): NodeLikeData...
    method getChildrenData (line 203) | public getChildrenData(id: ID): NodeLikeData[] {
    method getElementsDataByType (line 217) | public getElementsDataByType(elementType: ElementType) {
    method getElementDataById (line 231) | public getElementDataById(id: ID): ElementDatum {
    method getNodeLikeDatum (line 244) | public getNodeLikeDatum(id: ID) {
    method getNodeLikeData (line 256) | public getNodeLikeData(ids?: ID[]) {
    method getElementDataByState (line 265) | public getElementDataByState(elementType: ElementType, state: string) {
    method getElementState (line 270) | public getElementState(id: ID): State[] {
    method hasNode (line 274) | public hasNode(id: ID) {
    method hasEdge (line 278) | public hasEdge(id: ID) {
    method hasCombo (line 282) | public hasCombo(id: ID) {
    method getRelatedEdgesData (line 286) | public getRelatedEdgesData(id: ID, direction: EdgeDirection = 'both') {
    method getNeighborNodesData (line 290) | public getNeighborNodesData(id: ID) {
    method setData (line 294) | public setData(data: GraphData) {
    method addData (line 328) | public addData(data: GraphData) {
    method addNodeData (line 339) | public addNodeData(nodes: NodeData[] = []) {
    method addEdgeData (line 352) | public addEdgeData(edges: EdgeData[] = []) {
    method addComboData (line 364) | public addComboData(combos: ComboData[] = []) {
    method addChildrenData (line 385) | public addChildrenData(parentId: ID, childrenData: NodeData[]) {
    method computeZIndex (line 411) | protected computeZIndex(data: PartialGraphData, type: 'add' | 'update'...
    method getFrontZIndex (line 477) | public getFrontZIndex(id: ID) {
    method updateNodeLikeHierarchy (line 507) | protected updateNodeLikeHierarchy(data: NodeLikeData[]) {
    method preventUpdateNodeLikeHierarchy (line 549) | public preventUpdateNodeLikeHierarchy(callback: () => void) {
    method updateData (line 555) | public updateData(data: PartialGraphData) {
    method updateNodeData (line 565) | public updateNodeData(nodes: PartialNodeLikeData<NodeData>[] = []) {
    method refreshData (line 592) | public refreshData() {
    method syncNodeLikeDatum (line 605) | public syncNodeLikeDatum(datum: PartialNodeLikeData<NodeData>) {
    method syncEdgeDatum (line 615) | public syncEdgeDatum(datum: PartialEdgeData<EdgeData>) {
    method updateEdgeData (line 625) | public updateEdgeData(edges: PartialEdgeData<EdgeData>[] = []) {
    method updateComboData (line 649) | public updateComboData(combos: PartialNodeLikeData<ComboData>[] = []) {
    method setParent (line 680) | public setParent(id: ID, parent: ID | undefined | null, hierarchyKey: ...
    method refreshComboData (line 710) | public refreshComboData(id: ID) {
    method getElementPosition (line 721) | public getElementPosition(id: ID): Point {
    method translateNodeLikeBy (line 726) | public translateNodeLikeBy(id: ID, offset: Point) {
    method translateNodeLikeTo (line 731) | public translateNodeLikeTo(id: ID, position: Point) {
    method translateNodeBy (line 736) | public translateNodeBy(id: ID, offset: Point) {
    method translateNodeTo (line 742) | public translateNodeTo(id: ID, position: Point) {
    method translateComboBy (line 749) | public translateComboBy(id: ID, offset: Point) {
    method translateComboTo (line 779) | public translateComboTo(id: ID, position: Point) {
    method removeData (line 811) | public removeData(data: DataID) {
    method removeNodeData (line 823) | public removeNodeData(ids: ID[] = []) {
    method removeEdgeData (line 839) | public removeEdgeData(ids: ID[] = []) {
    method removeComboData (line 845) | public removeComboData(ids: ID[] = []) {
    method removeNodeLikeHierarchy (line 863) | protected removeNodeLikeHierarchy(id: ID) {
    method getElementType (line 901) | public getElementType(id: ID): ElementType {
    method destroy (line 912) | public destroy() {

FILE: packages/g6/src/runtime/element.ts
  class ElementController (line 43) | class ElementController {
    method constructor (line 52) | constructor(context: RuntimeContext) {
    method init (line 56) | public init() {
    method initContainer (line 60) | private initContainer() {
    method emit (line 67) | private emit(event: BaseEvent, context: DrawContext) {
    method forEachElementData (line 72) | private forEachElementData(callback: (elementType: ElementType, elemen...
    method getElementType (line 79) | public getElementType(elementType: ElementType, datum: ElementDatum) {
    method getTheme (line 93) | private getTheme(elementType: ElementType) {
    method getThemeStyle (line 97) | public getThemeStyle(elementType: ElementType) {
    method getThemeStateStyle (line 101) | public getThemeStateStyle(elementType: ElementType, states: State[]) {
    method computePaletteStyle (line 108) | private computePaletteStyle() {
    method getPaletteStyle (line 125) | public getPaletteStyle(elementType: ElementType, id: ID): BaseStylePro...
    method computeElementDefaultStyle (line 140) | private computeElementDefaultStyle(elementType: ElementType, context: ...
    method computeElementsDefaultStyle (line 149) | private computeElementsDefaultStyle(ids?: ID[]) {
    method getDefaultStyle (line 162) | public getDefaultStyle(id: ID) {
    method getElementState (line 166) | private getElementState(id: ID) {
    method getElementStateStyle (line 182) | private getElementStateStyle(elementType: ElementType, state: State, c...
    method computeElementStatesStyle (line 193) | private computeElementStatesStyle(elementType: ElementType, states: St...
    method computeElementsStatesStyle (line 206) | private computeElementsStatesStyle(ids?: ID[]) {
    method getStateStyle (line 220) | public getStateStyle(id: ID) {
    method computeStyle (line 224) | private computeStyle(stage?: string, ids?: ID[]) {
    method getElement (line 233) | public getElement<T extends Element>(id: ID): T | undefined {
    method getNodes (line 237) | public getNodes() {
    method getEdges (line 241) | public getEdges() {
    method getCombos (line 245) | public getCombos() {
    method getElementComputedStyle (line 249) | public getElementComputedStyle(elementType: ElementType, datum: Elemen...
    method getDrawData (line 272) | private getDrawData(context: DrawContext): DrawPayload | null {
    method draw (line 291) | public draw(context: DrawContext = { animation: true }) {
    method preLayoutDraw (line 308) | public async preLayoutDraw(context: DrawContext = { animation: true }) {
    method setAnimationTask (line 326) | private setAnimationTask(context: DrawContext, data: DrawPayload) {
    method computeChangesAndDrawData (line 368) | private computeChangesAndDrawData(context: DrawContext) {
    method transformData (line 436) | private transformData(input: DrawData, context: DrawContext): DrawData {
    method createElement (line 442) | private createElement(elementType: ElementType, datum: ElementDatum, c...
    method createElements (line 485) | private createElements(data: ProcedureData, context: DrawContext) {
    method getUpdateStageStyle (line 498) | private getUpdateStageStyle(elementType: ElementType, datum: ElementDa...
    method updateElement (line 513) | private updateElement(elementType: ElementType, datum: ElementDatum, c...
    method updateElements (line 575) | private updateElements(data: ProcedureData, context: DrawContext) {
    method markDestroyElement (line 596) | private markDestroyElement(data: DrawData) {
    method destroyElement (line 606) | private destroyElement(elementType: ElementType, datum: ElementDatum, ...
    method destroyElements (line 633) | private destroyElements(data: ProcedureData, context: DrawContext) {
    method clearElement (line 648) | private clearElement(id: ID) {
    method alignLayoutResultToElement (line 663) | private alignLayoutResultToElement(layoutResult: GraphData, id: ID) {
    method syncLayoutResult (line 685) | private async syncLayoutResult(id: ID, align?: boolean) {
    method collapseNode (line 708) | public async collapseNode(id: ID, options: CollapseExpandNodeOptions):...
    method expandNode (line 749) | public async expandNode(id: ID, options: CollapseExpandNodeOptions): P...
    method collapseCombo (line 792) | public async collapseCombo(id: ID, animation: boolean): Promise<void> {
    method expandCombo (line 836) | public async expandCombo(id: ID, animation: boolean): Promise<void> {
    method clear (line 879) | public clear() {
    method destroy (line 889) | public destroy() {
  type DrawContext (line 897) | interface DrawContext {
  type DrawPayload (line 912) | interface DrawPayload {
  type CollapseExpandNodeOptions (line 926) | interface CollapseExpandNodeOptions {

FILE: packages/g6/src/runtime/graph.ts
  class Graph (line 66) | class Graph extends EventEmitter {
    method constructor (line 99) | constructor(options: GraphOptions) {
    method getOptions (line 115) | public getOptions(): GraphOptions {
    method setOptions (line 130) | public setOptions(options: GraphOptions): void {
    method _setOptions (line 134) | private _setOptions(options: GraphOptions, isInit: boolean) {
    method getSize (line 162) | public getSize(): [number, number] {
    method setSize (line 175) | public setSize(width: number, height: number): void {
    method setZoomRange (line 189) | public setZoomRange(zoomRange: GraphOptions['zoomRange']): void {
    method getZoomRange (line 200) | public getZoomRange(): GraphOptions['zoomRange'] {
    method setNode (line 215) | public setNode(node: NodeOptions): void {
    method setEdge (line 231) | public setEdge(edge: EdgeOptions): void {
    method setCombo (line 247) | public setCombo(combo: ComboOptions): void {
    method getTheme (line 259) | public getTheme(): ThemeOptions {
    method setTheme (line 274) | public setTheme(theme: ThemeOptions | ((prev: ThemeOptions) => ThemeOp...
    method setLayout (line 291) | public setLayout(layout: LayoutOptions | ((prev: LayoutOptions) => Lay...
    method getLayout (line 302) | public getLayout(): LayoutOptions {
    method setBehaviors (line 321) | public setBehaviors(behaviors: BehaviorOptions | ((prev: BehaviorOptio...
    method updateBehavior (line 344) | public updateBehavior(behavior: UpdateBehaviorOption): void {
    method getBehaviors (line 362) | public getBehaviors(): BehaviorOptions {
    method setPlugins (line 380) | public setPlugins(plugins: PluginOptions | ((prev: PluginOptions) => P...
    method updatePlugin (line 403) | public updatePlugin(plugin: UpdatePluginOption): void {
    method getPlugins (line 421) | public getPlugins(): PluginOptions {
    method getPluginInstance (line 444) | public getPluginInstance<T extends Plugin>(key: string) {
    method setTransforms (line 459) | public setTransforms(transforms: TransformOptions | ((prev: TransformO...
    method updateTransform (line 471) | public updateTransform(transform: UpdateTransformOption): void {
    method getTransforms (line 490) | public getTransforms(): TransformOptions {
    method getData (line 504) | public getData(): Required<GraphData> {
    method hasNode (line 515) | public hasNode(id: ID): boolean {
    method hasEdge (line 526) | public hasEdge(id: ID): boolean {
    method hasCombo (line 538) | public hasCombo(id: ID): boolean {
    method getElementData (line 567) | public getElementData(ids: ID | ID[]): ElementDatum | ElementDatum[] {
    method getNodeData (line 614) | public getNodeData(id?: ID | ID[]): NodeData | NodeData[] {
    method getEdgeData (line 662) | public getEdgeData(id?: ID | ID[]): EdgeData | EdgeData[] {
    method getComboData (line 710) | public getComboData(id?: ID | ID[]): ComboData | ComboData[] {
    method setData (line 727) | public setData(data: GraphData | ((prev: GraphData) => GraphData)): vo...
    method addData (line 745) | public addData(data: GraphData | ((prev: GraphData) => GraphData)): vo...
    method addNodeData (line 760) | public addNodeData(data: NodeData[] | ((prev: NodeData[]) => NodeData[...
    method addEdgeData (line 775) | public addEdgeData(data: EdgeData[] | ((prev: EdgeData[]) => EdgeData[...
    method addComboData (line 790) | public addComboData(data: ComboData[] | ((prev: ComboData[]) => ComboD...
    method addChildrenData (line 806) | public addChildrenData(parentId: ID, childrenData: NodeData[]) {
    method updateData (line 828) | public updateData(data: PartialGraphData | ((prev: GraphData) => Parti...
    method updateNodeData (line 847) | public updateNodeData(
    method updateEdgeData (line 868) | public updateEdgeData(data: PartialEdgeData<EdgeData>[] | ((prev: Edge...
    method updateComboData (line 887) | public updateComboData(
    method removeData (line 907) | public removeData(ids: DataID | ((data: GraphData) => DataID)): void {
    method removeNodeData (line 922) | public removeNodeData(ids: ID[] | ((data: NodeData[]) => ID[])): void {
    method removeEdgeData (line 941) | public removeEdgeData(ids: ID[] | ((data: EdgeData[]) => ID[])): void {
    method removeComboData (line 956) | public removeComboData(ids: ID[] | ((data: ComboData[]) => ID[])): void {
    method getElementType (line 968) | public getElementType(id: ID): ElementType {
    method getRelatedEdgesData (line 981) | public getRelatedEdgesData(id: ID, direction: EdgeDirection = 'both'):...
    method getNeighborNodesData (line 993) | public getNeighborNodesData(id: ID): NodeData[] {
    method getAncestorsData (line 1010) | public getAncestorsData(id: ID, hierarchy: HierarchyKey): NodeLikeData...
    method getParentData (line 1023) | public getParentData(id: ID, hierarchy: HierarchyKey): NodeLikeData | ...
    method getChildrenData (line 1035) | public getChildrenData(id: ID): NodeLikeData[] {
    method getDescendantsData (line 1047) | public getDescendantsData(id: ID): NodeLikeData[] {
    method getElementDataByState (line 1090) | public getElementDataByState(elementType: ElementType, state: State): ...
    method initCanvas (line 1094) | private async initCanvas() {
    method updateCanvas (line 1136) | private updateCanvas(options: GraphOptions) {
    method initRuntime (line 1153) | private initRuntime() {
    method prepare (line 1165) | private async prepare(): Promise<void> {
    method render (line 1196) | public async render(): Promise<void> {
    method draw (line 1231) | public async draw(): Promise<void> {
    method layout (line 1243) | public async layout(layoutOptions?: LayoutOptions) {
    method stopLayout (line 1257) | public stopLayout() {
    method clear (line 1267) | public async clear(): Promise<void> {
    method destroy (line 1284) | public destroy(): void {
    method getCanvas (line 1314) | public getCanvas(): Canvas {
    method resize (line 1334) | public resize(width?: number, height?: number): void {
    method fitView (line 1356) | public async fitView(options?: FitViewOptions, animation?: ViewportAni...
    method fitCenter (line 1367) | public async fitCenter(animation?: ViewportAnimationEffectTiming): Pro...
    method autoFit (line 1371) | private async autoFit(): Promise<void> {
    method focusElement (line 1397) | public async focusElement(id: ID | ID[], animation?: ViewportAnimation...
    method zoomBy (line 1418) | public async zoomBy(ratio: number, animation?: ViewportAnimationEffect...
    method zoomTo (line 1441) | public async zoomTo(zoom: number, animation?: ViewportAnimationEffectT...
    method getZoom (line 1452) | public getZoom(): number {
    method rotateBy (line 1465) | public async rotateBy(angle: number, animation?: ViewportAnimationEffe...
    method rotateTo (line 1478) | public async rotateTo(angle: number, animation?: ViewportAnimationEffe...
    method getRotation (line 1489) | public getRotation(): number {
    method translateBy (line 1501) | public async translateBy(offset: Point, animation?: ViewportAnimationE...
    method translateTo (line 1513) | public async translateTo(position: Point, animation?: ViewportAnimatio...
    method getPosition (line 1528) | public getPosition(): Point {
    method translateElementBy (line 1551) | public async translateElementBy(
    method translateElementTo (line 1583) | public async translateElementTo(
    method getElementPosition (line 1604) | public getElementPosition(id: ID): Point {
    method getElementRenderStyle (line 1616) | public getElementRenderStyle(id: ID): Record<string, any> {
    method setElementVisibility (line 1650) | public async setElementVisibility(
    method showElement (line 1680) | public async showElement(id: ID | ID[], animation?: boolean): Promise<...
    method hideElement (line 1696) | public async hideElement(id: ID | ID[], animation?: boolean): Promise<...
    method getElementVisibility (line 1712) | public getElementVisibility(id: ID): BaseStyleProps['visibility'] {
    method setElementZIndex (line 1734) | public async setElementZIndex(args1: ID | Record<ID, number>, args2?: ...
    method frontElement (line 1755) | public async frontElement(id: ID | ID[]): Promise<void> {
    method getElementZIndex (line 1790) | public getElementZIndex(id: ID): number {
    method setElementState (line 1813) | public async setElementState(
    method getElementState (line 1845) | public getElementState(id: ID): State[] {
    method getElementRenderBounds (line 1857) | public getElementRenderBounds(id: ID): AABB {
    method collapseElement (line 1871) | public async collapseElement(id: ID, options: boolean | CollapseExpand...
    method expandElement (line 1909) | public async expandElement(id: ID, options: boolean | CollapseExpandNo...
    method setElementCollapsibility (line 1937) | private setElementCollapsibility(id: ID, collapsed: boolean) {
    method toDataURL (line 1951) | public async toDataURL(options: Partial<DataURLOptions> = {}): Promise...
    method getCanvasByViewport (line 1963) | public getCanvasByViewport(point: Point): Point {
    method getViewportByCanvas (line 1975) | public getViewportByCanvas(point: Point): Point {
    method getClientByCanvas (line 1987) | public getClientByCanvas(point: Point): Point {
    method getCanvasByClient (line 1999) | public getCanvasByClient(point: Point): Point {
    method getViewportCenter (line 2010) | public getViewportCenter(): Point {
    method getCanvasCenter (line 2021) | public getCanvasCenter(): Point {
    method on (line 2039) | public on<T extends IEvent = IEvent>(eventName: string, callback: (eve...
    method once (line 2052) | public once<T extends IEvent = IEvent>(eventName: string, callback: (e...
    method off (line 2083) | public off(eventName?: string, callback?: (...args: any[]) => void) {

FILE: packages/g6/src/runtime/layout.ts
  class LayoutController (line 24) | class LayoutController {
    method presetOptions (line 33) | private get presetOptions() {
    method options (line 39) | private get options() {
    method constructor (line 44) | constructor(context: RuntimeContext) {
    method getLayoutInstance (line 48) | public getLayoutInstance(): BaseLayout[] {
    method preLayout (line 62) | public async preLayout(data: DrawData) {
    method postLayout (line 96) | public async postLayout(layoutOptions: LayoutOptions | undefined = thi...
    method transformDataAfterLayout (line 119) | private transformDataAfterLayout(type: 'pre' | 'post', data?: DrawData) {
    method simulate (line 132) | public async simulate(options: LayoutOptions | undefined = this.option...
    method stepLayout (line 150) | public async stepLayout(data: GraphData, options: STDLayoutOptions, in...
    method graphLayout (line 155) | private async graphLayout(data: GraphData, options: STDLayoutOptions, ...
    method treeLayout (line 190) | private async treeLayout(data: GraphData, options: STDLayoutOptions, i...
    method inferTreeLayoutOffset (line 250) | private inferTreeLayoutOffset(data: GraphData) {
    method stopLayout (line 275) | public stopLayout() {
    method getLayoutData (line 287) | public getLayoutData(options: STDLayoutOptions): GraphData {
    method initGraphLayout (line 340) | private initGraphLayout(options: STDLayoutOptions) {
    method updateElementPosition (line 384) | private updateElementPosition(layoutResult: GraphData, animation: bool...
    method destroy (line 392) | public destroy() {

FILE: packages/g6/src/runtime/options.ts
  function inferOptions (line 10) | function inferOptions(options: GraphOptions): GraphOptions {
  function inferLayoutOptions (line 22) | function inferLayoutOptions(options: GraphOptions): GraphOptions {

FILE: packages/g6/src/runtime/plugin.ts
  class PluginController (line 7) | class PluginController extends ExtensionController<BasePlugin<CustomPlug...
    method constructor (line 10) | constructor(context: RuntimeContext) {
    method setPlugins (line 15) | public setPlugins(plugins: PluginOptions) {
    method getPluginInstance (line 19) | public getPluginInstance(key: string) {

FILE: packages/g6/src/runtime/transform.ts
  constant REQUIRED_TRANSFORMS (line 6) | const REQUIRED_TRANSFORMS: TransformOptions = [
  class TransformController (line 14) | class TransformController extends ExtensionController<BaseTransform<Cust...
    method constructor (line 17) | constructor(context: RuntimeContext) {
    method getTransforms (line 22) | protected getTransforms() {}
    method setTransforms (line 24) | public setTransforms(transforms: TransformOptions) {
    method getTransformInstance (line 34) | public getTransformInstance(key?: string) {

FILE: packages/g6/src/runtime/types.ts
  type RuntimeContext (line 14) | interface RuntimeContext {

FILE: packages/g6/src/runtime/viewport.ts
  class ViewportController (line 22) | class ViewportController {
    method padding (line 25) | private get padding() {
    method paddingOffset (line 29) | private get paddingOffset(): Point {
    method constructor (line 35) | constructor(context: RuntimeContext) {
    method camera (line 42) | private get camera() {
    method createLandmark (line 66) | private createLandmark(options: Parameters<typeof this.camera.createLa...
    method getAnimation (line 70) | private getAnimation(animation?: ViewportAnimationEffectTiming) {
    method getCanvasSize (line 76) | public getCanvasSize(): [number, number] {
    method getCanvasCenter (line 92) | public getCanvasCenter(): Point {
    method getViewportCenter (line 108) | public getViewportCenter(): Point {
    method getGraphCenter (line 115) | public getGraphCenter(): Point {
    method getZoom (line 119) | public getZoom() {
    method getRotation (line 123) | public getRotation() {
    method getTranslateOptions (line 127) | private getTranslateOptions(options: TransformOptions) {
    method getRotateOptions (line 151) | private getRotateOptions(options: TransformOptions) {
    method getZoomOptions (line 157) | private getZoomOptions(options: TransformOptions) {
    method transform (line 166) | public async transform(options: TransformOptions, animation?: Viewport...
    method fitView (line 212) | public async fitView(options?: FitViewOptions, animation?: ViewportAni...
    method fitCenter (line 252) | public async fitCenter(options: FocusOptions): Promise<void> {
    method focusElements (line 257) | public async focusElements(ids: ID[], options: FocusOptions = {}): Pro...
    method focus (line 268) | private async focus(bbox: AABB, options: FocusOptions) {
    method getBBoxInViewport (line 282) | public getBBoxInViewport(bbox: AABB) {
    method isInViewport (line 302) | public isInViewport(target: Point | AABB, complete = false, tolerance ...
    method cancelAnimation (line 323) | public cancelAnimation() {
  type FocusOptions (line 332) | interface FocusOptions {

FILE: packages/g6/src/spec/behavior.ts
  type BehaviorOptions (line 3) | type BehaviorOptions = (string | CustomBehaviorOption | ((this: Graph) =...
  type UpdateBehaviorOption (line 5) | interface UpdateBehaviorOption {
  type CustomBehaviorOption (line 10) | interface CustomBehaviorOption extends Record<string, any> {

FILE: packages/g6/src/spec/canvas.ts
  type CanvasOptions (line 10) | interface CanvasOptions {

FILE: packages/g6/src/spec/data.ts
  type GraphData (line 29) | interface GraphData {
  type NodeData (line 55) | interface NodeData {
  type ComboData (line 124) | interface ComboData {
  type EdgeData (line 173) | interface EdgeData {

FILE: packages/g6/src/spec/element/animation.ts
  type AnimationStage (line 6) | type AnimationStage = 'enter' | 'update' | 'exit' | 'show' | 'hide' | 'c...

FILE: packages/g6/src/spec/element/combo.ts
  type ComboOptions (line 13) | interface ComboOptions {
  type StaticComboOptions (line 58) | interface StaticComboOptions {
  type ComboStyle (line 65) | interface ComboStyle extends Partial<BaseComboStyleProps> {

FILE: packages/g6/src/spec/element/edge.ts
  type EdgeOptions (line 13) | interface EdgeOptions {
  type StaticEdgeOptions (line 58) | interface StaticEdgeOptions {
  type EdgeStyle (line 65) | interface EdgeStyle extends Partial<BaseEdgeStyleProps> {

FILE: packages/g6/src/spec/element/node.ts
  type NodeOptions (line 13) | interface NodeOptions {
  type StaticNodeOptions (line 58) | interface StaticNodeOptions {
  type NodeStyle (line 65) | interface NodeStyle extends Partial<BaseNodeStyleProps> {

FILE: packages/g6/src/spec/element/palette.ts
  type PaletteOptions (line 10) | type PaletteOptions = Palette | CategoricalPaletteOptions | ContinuousPa...
  type STDPaletteOptions (line 12) | type STDPaletteOptions = CategoricalPaletteOptions | ContinuousPaletteOp...
  type CategoricalPaletteOptions (line 14) | interface CategoricalPaletteOptions extends BasePaletteOptions {
  type ContinuousPaletteOptions (line 29) | interface ContinuousPaletteOptions extends BasePaletteOptions {
  type BasePaletteOptions (line 44) | interface BasePaletteOptions {

FILE: packages/g6/src/spec/graph.ts
  type GraphOptions (line 28) | interface GraphOptions extends CanvasOptions, ViewportOptions {

FILE: packages/g6/src/spec/layout.ts
  type LayoutOptions (line 3) | type LayoutOptions = SingleLayoutOptions | SingleLayoutOptions[];
  type STDLayoutOptions (line 5) | type STDLayoutOptions = BaseLayoutOptions;
  type SingleLayoutOptions (line 7) | type SingleLayoutOptions = BuiltInLayoutOptions | BaseLayoutOptions;

FILE: packages/g6/src/spec/plugin.ts
  type PluginOptions (line 3) | type PluginOptions = (string | CustomPluginOption | ((this: Graph) => Cu...
  type UpdatePluginOption (line 5) | interface UpdatePluginOption {
  type CustomPluginOption (line 10) | interface CustomPluginOption extends Record<string, any> {

FILE: packages/g6/src/spec/theme.ts
  type ThemeOptions (line 7) | type ThemeOptions = false | 'light' | 'dark' | string;

FILE: packages/g6/src/spec/transform.ts
  type TransformOptions (line 3) | type TransformOptions = (string | CustomTransformOption | ((this: Graph)...
  type UpdateTransformOption (line 5) | interface UpdateTransformOption {
  type CustomTransformOption (line 10) | interface CustomTransformOption {

FILE: packages/g6/src/spec/viewport.ts
  type ViewportOptions (line 10) | interface ViewportOptions {
  type STDViewportOptions (line 73) | interface STDViewportOptions {

FILE: packages/g6/src/themes/base.ts
  constant BADGE_PALETTE (line 5) | const BADGE_PALETTE: CategoricalPalette = ['#7E92B5', '#F4664A', '#FFBE3...
  constant NODE_PALETTE_OPTIONS (line 7) | const NODE_PALETTE_OPTIONS: PaletteOptions = {
  constant EDGE_PALETTE_OPTIONS (line 12) | const EDGE_PALETTE_OPTIONS: PaletteOptions = {
  type ThemeTokens (line 29) | type ThemeTokens = {
  function create (line 60) | function create(tokens: ThemeTokens): Theme {

FILE: packages/g6/src/themes/dark.ts
  constant EDGE_PALETTE_OPTIONS (line 5) | const EDGE_PALETTE_OPTIONS: PaletteOptions = {

FILE: packages/g6/src/themes/types.ts
  type Theme (line 5) | type Theme = {

FILE: packages/g6/src/transforms/arrange-draw-order.ts
  class ArrangeDrawOrder (line 12) | class ArrangeDrawOrder extends BaseTransform {
    method beforeDraw (line 13) | public beforeDraw(input: DrawData): DrawData {

FILE: packages/g6/src/transforms/base-transform.ts
  type BaseTransformOptions (line 6) | type BaseTransformOptions = CustomBehaviorOption;
  method beforeDraw (line 14) | public beforeDraw(data: DrawData, context: DrawContext): DrawData {
  method afterLayout (line 20) | public afterLayout(type: 'pre' | 'post', data?: DrawData) {}

FILE: packages/g6/src/transforms/collapse-expand-combo.ts
  class CollapseExpandCombo (line 16) | class CollapseExpandCombo extends BaseTransform {
    method beforeDraw (line 17) | public beforeDraw(input: DrawData, context: DrawContext): DrawData {

FILE: packages/g6/src/transforms/collapse-expand-node.ts
  class CollapseExpandNode (line 25) | class CollapseExpandNode extends BaseTransform {
    method getElement (line 26) | private getElement(id: ID) {
    method handleExpand (line 30) | private handleExpand(node: NodeData, input: DrawData) {
    method beforeDraw (line 48) | public beforeDraw(input: DrawData): DrawData {

FILE: packages/g6/src/transforms/get-edge-actual-ends.ts
  class GetEdgeActualEnds (line 14) | class GetEdgeActualEnds extends BaseTransform {
    method beforeDraw (line 15) | public beforeDraw(input: DrawData): DrawData {

FILE: packages/g6/src/transforms/map-node-size.ts
  type MapNodeSizeOptions (line 17) | interface MapNodeSizeOptions extends BaseTransformOptions {
  class MapNodeSize (line 91) | class MapNodeSize extends BaseTransform<MapNodeSizeOptions> {
    method constructor (line 100) | constructor(context: RuntimeContext, options: MapNodeSizeOptions) {
    method beforeDraw (line 104) | public beforeDraw(input: DrawData): DrawData {
    method assignLabelStyle (line 137) | private assignLabelStyle(style: NodeStyle, size: STDSize, datum: NodeD...
    method getLabelSizeByNodeSize (line 152) | private getLabelSizeByNodeSize(size: STDSize, defaultMaxFontSize: numb...
    method getCentralities (line 160) | private getCentralities(centrality: Required<MapNodeSizeOptions>['cent...

FILE: packages/g6/src/transforms/place-radial-labels.ts
  type PlaceRadialLabelsOptions (line 17) | interface PlaceRadialLabelsOptions extends BaseTransformOptions {
  class PlaceRadialLabels (line 31) | class PlaceRadialLabels extends BaseTransform<PlaceRadialLabelsOptions> {
    method constructor (line 36) | constructor(context: RuntimeContext, options: PlaceRadialLabelsOptions) {
    method ref (line 40) | private get ref(): NodeData {
    method afterLayout (line 44) | public afterLayout() {

FILE: packages/g6/src/transforms/process-parallel-edges.ts
  constant CUBIC_EDGE_TYPE (line 15) | const CUBIC_EDGE_TYPE = 'quadratic';
  constant CUBIC_LOOP_PLACEMENTS (line 17) | const CUBIC_LOOP_PLACEMENTS: LoopPlacement[] = [
  type ProcessParallelEdgesOptions (line 28) | interface ProcessParallelEdgesOptions extends BaseTransformOptions {
  class ProcessParallelEdges (line 69) | class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpt...
    method constructor (line 77) | constructor(context: RuntimeContext, options: ProcessParallelEdgesOpti...
    method beforeDraw (line 87) | public beforeDraw(input: DrawData): DrawData {

FILE: packages/g6/src/transforms/types.ts
  type Transform (line 5) | type Transform = BaseTransform<any>;
  type ProcedureData (line 12) | type ProcedureData = {
  type DrawData (line 18) | type DrawData = {

FILE: packages/g6/src/transforms/update-related-edge.ts
  class UpdateRelatedEdge (line 11) | class UpdateRelatedEdge extends BaseTransform {
    method beforeDraw (line 12) | public beforeDraw(input: DrawData, context: DrawContext): DrawData {

FILE: packages/g6/src/transforms/utils.ts
  function reassignTo (line 15) | function reassignTo(
  function isStyleEqual (line 41) | function isStyleEqual(style: Record<string, unknown>, originalStyle: Rec...

FILE: packages/g6/src/types/anchor.ts
  type Anchor (line 3) | type Anchor = string | Vector2 | Vector3;
  type STDAnchor (line 5) | type STDAnchor = Vector2;

FILE: packages/g6/src/types/animation.ts
  type Keyframe (line 3) | type Keyframe = {
  type AnimationTask (line 7) | type AnimationTask = () => () => IAnimation | null;

FILE: packages/g6/src/types/canvas.ts
  type CanvasLayer (line 1) | type CanvasLayer = 'background' | 'main' | 'label' | 'transient';

FILE: packages/g6/src/types/centrality.ts
  type NodeCentralityOptions (line 3) | type NodeCentralityOptions =

FILE: packages/g6/src/types/change.ts
  type DataChange (line 10) | type DataChange = DataAdded | DataUpdated | DataRemoved;
  type DataAdded (line 12) | type DataAdded = NodeAdded | EdgeAdded | ComboAdded;
  type DataUpdated (line 14) | type DataUpdated = NodeUpdated | EdgeUpdated | ComboUpdated;
  type DataRemoved (line 16) | type DataRemoved = NodeRemoved | EdgeRemoved | ComboRemoved;
  type NodeAdded (line 18) | type NodeAdded = {
  type NodeUpdated (line 23) | type NodeUpdated = {
  type NodeRemoved (line 29) | type NodeRemoved = {
  type EdgeAdded (line 34) | type EdgeAdded = {
  type EdgeUpdated (line 39) | type EdgeUpdated = {
  type EdgeRemoved (line 45) | type EdgeRemoved = {
  type ComboAdded (line 50) | type ComboAdded = {
  type ComboUpdated (line 55) | type ComboUpdated = {
  type ComboRemoved (line 61) | type ComboRemoved = {
  type DataChanges (line 66) | type DataChanges = {

FILE: packages/g6/src/types/combo.ts
  type CollapsedMarkerStyleProps (line 9) | interface CollapsedMarkerStyleProps extends IconStyleProps {

FILE: packages/g6/src/types/data.ts
  type DataID (line 4) | type DataID = {
  type NodeLikeData (line 10) | type NodeLikeData = NodeData | ComboData;
  type ElementDatum (line 12) | type ElementDatum = NodeData | EdgeData | ComboData;
  type ElementData (line 14) | type ElementData = NodeData[] | EdgeData[] | ComboData[];
  type PartialNodeLikeData (line 25) | type PartialNodeLikeData<T extends NodeLikeData> = Partial<T> & Pick<T, ...
  type PartialEdgeData (line 40) | type PartialEdgeData<T extends EdgeData> =
  type PartialGraphData (line 49) | type PartialGraphData = {
  type HierarchyKey (line 66) | type HierarchyKey = 'tree' | 'combo';

FILE: packages/g6/src/types/edge.ts
  type EdgeDirection (line 18) | type EdgeDirection = 'in' | 'out' | 'both';
  type EdgeKey (line 20) | type EdgeKey = Line | Path | Polyline;
  type EdgeLabelStyleProps (line 27) | interface EdgeLabelStyleProps extends LabelStyleProps {
  type EdgeBadgeStyleProps (line 74) | interface EdgeBadgeStyleProps extends BadgeStyleProps {
  type EdgeArrowStyleProps (line 104) | interface EdgeArrowStyleProps
  type LoopPlacement (line 130) | type LoopPlacement = CardinalPlacement | CornerPlacement;
  type LoopStyleProps (line 137) | interface LoopStyleProps {

FILE: packages/g6/src/types/element.ts
  type Node (line 10) | interface Node extends DisplayObject, ElementHooks, ElementMethods {
  type Edge (line 45) | interface Edge extends DisplayObject, ElementHooks, ElementMethods {}
  type Combo (line 52) | interface Combo extends Node {
  type Element (line 62) | type Element = Node | Edge | Combo;
  type ElementType (line 64) | type ElementType = 'node' | 'edge' | 'combo';
  type ElementOptions (line 66) | type ElementOptions = NodeOptions | EdgeOptions | ComboOptions;
  type ElementMethods (line 73) | interface ElementMethods {
  type ElementHooks (line 96) | interface ElementHooks {

FILE: packages/g6/src/types/enum.ts
  type Loosen (line 1) | type Loosen<T extends string> = `${T}`;

FILE: packages/g6/src/types/event.ts
  type IEvent (line 14) | type IEvent =
  type IPointerEvent (line 24) | interface IPointerEvent<T extends Target = Target> extends TargetedEvent...
  type IWheelEvent (line 26) | interface IWheelEvent<T extends Target = Target> extends TargetedEvent<F...
  type IKeyboardEvent (line 28) | interface IKeyboardEvent extends KeyboardEvent {}
  type IElementEvent (line 30) | interface IElementEvent extends IPointerEvent<Element> {}
  type IElementDragEvent (line 32) | interface IElementDragEvent extends IDragEvent<Element> {}
  type IDragEvent (line 34) | interface IDragEvent<T extends Target = Target> extends TargetedEvent<Fe...
  type IGraphLifeCycleEvent (line 39) | interface IGraphLifeCycleEvent extends NativeEvent {
  type IElementLifeCycleEvent (line 43) | interface IElementLifeCycleEvent extends NativeEvent {
  type IViewportEvent (line 48) | interface IViewportEvent extends NativeEvent {
  type IAnimateEvent (line 52) | interface IAnimateEvent extends NativeEvent {
  type NativeEvent (line 63) | interface NativeEvent {
  type TargetedEvent (line 72) | type TargetedEvent<E extends FederatedEvent, T extends Target = Target> ...
  type Target (line 78) | type Target = Document | Element;

FILE: packages/g6/src/types/graphlib.ts
  type GraphLibGroupedChanges (line 16) | type GraphLibGroupedChanges = {

FILE: packages/g6/src/types/history.ts
  type Command (line 8) | interface Command {
  type CommandData (line 34) | interface CommandData {

FILE: packages/g6/src/types/id.ts
  type ID (line 1) | type ID = string;

FILE: packages/g6/src/types/layout.ts
  type AdaptiveLayout (line 5) | interface AdaptiveLayout {

FILE: packages/g6/src/types/node.ts
  type PortPlacement (line 12) | type PortPlacement = RelativePlacement | CardinalPlacement;
  type StarPortPlacement (line 13) | type StarPortPlacement = RelativePlacement | 'top' | 'left' | 'right' | ...
  type TrianglePortPlacement (line 14) | type TrianglePortPlacement = RelativePlacement | CardinalPlacement;
  type TriangleDirection (line 21) | type TriangleDirection = 'up' | 'left' | 'right' | 'down';
  type NodeLabelStyleProps (line 28) | interface NodeLabelStyleProps extends LabelStyleProps {
  type NodeBadgeStyleProps (line 66) | interface NodeBadgeStyleProps extends BadgeStyleProps {
  type PortStyleProps (line 92) | interface PortStyleProps extends Omit<CircleStyleProps, 'r'> {
  type Port (line 116) | type Port = DisplayObject<PortStyleProps> | Point;
  type NodePortStyleProps (line 123) | interface NodePortStyleProps extends PortStyleProps {
  type DonutRound (line 145) | interface DonutRound extends BaseStyleProps {

FILE: packages/g6/src/types/padding.ts
  type Padding (line 1) | type Padding = number | number[];
  type STDPadding (line 3) | type STDPadding = [number, number, number, number];

FILE: packages/g6/src/types/placement.ts
  type CardinalPlacement (line 1) | type CardinalPlacement = 'left' | 'right' | 'top' | 'bottom';
  type CornerPlacement (line 3) | type CornerPlacement =
  type RelativePlacement (line 13) | type RelativePlacement = [number, number];
  type DirectionalPlacement (line 15) | type DirectionalPlacement = CardinalPlacement | CornerPlacement | 'center';
  type Placement (line 17) | type Placement = RelativePlacement | DirectionalPlacement;

FILE: packages/g6/src/types/plugin.ts
  type PluginEvent (line 3) | type PluginEvent<T extends Event | FederatedEvent = Event> = Omit<T, 'ta...

FILE: packages/g6/src/types/point.ts
  type Point (line 1) | type Point = [number, number] | [number, number, number] | Float32Array;
  type PointObject (line 3) | type PointObject = {

FILE: packages/g6/src/types/prefix.ts
  type PrefixKey (line 1) | type PrefixKey<P extends string = string, K extends string = string> = `...
  type Prefix (line 13) | type Prefix<P extends string, T extends object> = {
  type ReplacePrefix (line 17) | type ReplacePrefix<T, OldPrefix extends string, NewPrefix extends string...

FILE: packages/g6/src/types/router.ts
  type Direction (line 5) | type Direction = CardinalPlacement;
  type PolylineRouter (line 7) | type PolylineRouter = false | OrthRouter | ShortestPathRouter;
  type OrthRouter (line 9) | interface OrthRouter extends OrthRouterOptions {
  type ShortestPathRouter (line 22) | interface ShortestPathRouter extends ShortestPathRouterOptions {
  type RouterOptions (line 31) | type RouterOptions = OrthRouterOptions | ShortestPathRouterOptions;
  type OrthRouterOptions (line 33) | interface OrthRouterOptions {
  type ShortestPathRouterOptions (line 42) | interface ShortestPathRouterOptions {

FILE: packages/g6/src/types/size.ts
  type Size (line 3) | type Size = number | Vector2 | Vector3;
  type STDSize (line 5) | type STDSize = Vector3;

FILE: packages/g6/src/types/state.ts
  type State (line 1) | type State = string;

FILE: packages/g6/src/types/style.ts
  type StyleIterationContext (line 9) | type StyleIterationContext = {

FILE: packages/g6/src/types/tree.ts
  type TreeData (line 1) | type TreeData = {

FILE: packages/g6/src/types/utility.ts
  type UnknownStruct (line 1) | type UnknownStruct = Record<string, unknown>;

FILE: packages/g6/src/types/vector.ts
  type Vector2 (line 1) | type Vector2 = [number, number] | Float32Array;
  type Vector3 (line 3) | type Vector3 = [number, number, number] | Float32Array;

FILE: packages/g6/src/types/viewport.ts
  type ViewportAnimationEffectTiming (line 3) | type ViewportAnimationEffectTiming =
  type TransformOptions (line 10) | interface TransformOptions {
  type FitViewOptions (line 18) | interface FitViewOptions {

FILE: packages/g6/src/utils/anchor.ts
  function parseAnchor (line 11) | function parseAnchor(anchor: Anchor): STDAnchor {

FILE: packages/g6/src/utils/animation.ts
  function createAnimationsProxy (line 22) | function createAnimationsProxy(args1: IAnimation | IAnimation[], args2?:...
  function preprocessKeyframes (line 61) | function preprocessKeyframes(keyframes: Keyframe[]): Keyframe[] {
  function inferDefaultValue (line 116) | function inferDefaultValue(name: string) {
  function getAnimationOptions (line 144) | function getAnimationOptions(
  function animationOf (line 164) | function animationOf(options: string | AnimationOptions[]): STDAnimation {
  function getElementAnimationOptions (line 185) | function getElementAnimationOptions(

FILE: packages/g6/src/utils/array.ts
  function deduplicate (line 9) | function deduplicate<T>(arr: T[], by: (item: T) => unknown = (item) => i...

FILE: packages/g6/src/utils/bbox.ts
  function getBBoxWidth (line 15) | function getBBoxWidth(bbox: AABB): number {
  function getBBoxHeight (line 26) | function getBBoxHeight(bbox: AABB): number {
  function getBBoxSize (line 35) | function getBBoxSize(bbox: AABB): [number, number] {
  function getNodeBBox (line 47) | function getNodeBBox(node: Point | Node, padding?: Padding): AABB {
  function getPointBBox (line 59) | function getPointBBox(point: Point): AABB {
  function getExpandedBBox (line 74) | function getExpandedBBox(bbox: AABB, padding: Padding): AABB {
  function getCombinedBBox (line 90) | function getCombinedBBox(bboxes: AABB[]): AABB {
  function isBBoxInside (line 116) | function isBBoxInside(bbox1: AABB, bbox2: AABB): boolean {
  function isPointInBBox (line 133) | function isPointInBBox(point: Point, bbox: AABB) {
  function isPointOnBBoxBoundary (line 146) | function isPointOnBBoxBoundary(point: Point, bbox: AABB, extended = fals...
  function isPointOutsideBBox (line 166) | function isPointOutsideBBox(point: Point, bbox: AABB) {
  function isPointBBoxCenter (line 178) | function isPointBBoxCenter(point: Point, bbox: AABB) {
  function getNearestBoundarySide (line 191) | function getNearestBoundarySide(p: Point, bbox: AABB): 'left' | 'right' ...
  function getNearestBoundaryPoint (line 211) | function getNearestBoundaryPoint(p: Point, bbox: AABB): Point {
  function getTriangleCenter (line 245) | function getTriangleCenter(bbox: AABB, direction: TriangleDirection): Po...
  function getIncircleRadius (line 272) | function getIncircleRadius(bbox: AABB, direction: TriangleDirection): nu...
  function getBBoxSegments (line 288) | function getBBoxSegments(bbox: AABB): [Point, Point][] {

FILE: packages/g6/src/utils/cache.ts
  function cacheStyle (line 15) | function cacheStyle(element: DisplayObject, name: string | string[]) {
  function getCachedStyle (line 31) | function getCachedStyle(element: DisplayObject, name: string) {
  function hasCachedStyle (line 43) | function hasCachedStyle(element: DisplayObject, name: string) {
  function setCacheStyle (line 55) | function setCacheStyle(element: DisplayObject, name: string, value: any) {

FILE: packages/g6/src/utils/centrality.ts
  type CentralityResult (line 6) | type CentralityResult = Map<ID, number>;

FILE: packages/g6/src/utils/change.ts
  function reduceDataChanges (line 13) | function reduceDataChanges(changes: DataChange[]): DataChange[] {
  function groupByChangeType (line 71) | function groupByChangeType(changes: DataChange[]): DataChanges {

FILE: packages/g6/src/utils/collapsibility.ts
  function isCollapsed (line 10) | function isCollapsed(nodeLike: NodeLikeData) {

FILE: packages/g6/src/utils/data.ts
  function mergeElementsData (line 17) | function mergeElementsData<T extends NodeData | EdgeData | ComboData>(or...
  function cloneElementData (line 48) | function cloneElementData<T extends NodeData | EdgeData | ComboData>(dat...
  function isEmptyData (line 63) | function isEmptyData(data: GraphData) {
  function isElementDataEqual (line 79) | function isElementDataEqual(original: Partial<ElementDatum> = {}, modifi...
  constant OVERRIDE_KEY (line 115) | const OVERRIDE_KEY = '__internal_override__';
  function isOverridable (line 123) | function isOverridable(datum: ElementDatum): boolean {

FILE: packages/g6/src/utils/diff.ts
  function arrayDiff (line 13) | function arrayDiff<T>(

FILE: packages/g6/src/utils/dom.ts
  function getContainerSize (line 10) | function getContainerSize(container: HTMLElement): [number, number] {
  function sizeOf (line 27) | function sizeOf(container: HTMLElement | null): [number, number] {

FILE: packages/g6/src/utils/edge.ts
  function getLabelPositionStyle (line 37) | function getLabelPositionStyle(
  function getBadgePositionStyle (line 95) | function getBadgePositionStyle(
  function getXYByPlacement (line 125) | function getXYByPlacement(key: EdgeKey, ratio: number, offsetX: number, ...
  function getCurveControlPoint (line 150) | function getCurveControlPoint(
  function parseCurveOffset (line 175) | function parseCurveOffset(curveOffset: number | [number, number]): [numb...
  function parseCurvePosition (line 187) | function parseCurvePosition(curvePosition: number | [number, number]): [...
  function getQuadraticPath (line 201) | function getQuadraticPath(sourcePoint: Point, targetPoint: Point, contro...
  function getCubicPath (line 217) | function getCubicPath(sourcePoint: Point, targetPoint: Point, controlPoi...
  function getPolylinePath (line 243) | function getPolylinePath(points: Point[], radius = 0, z = false): PathAr...
  function getBorderRadiusPoints (line 274) | function getBorderRadiusPoints(
  function getLoopEndpoints (line 330) | function getLoopEndpoints(
  function getCubicLoopPath (line 375) | function getCubicLoopPath(
  function getCubicLoopControlPoints (line 409) | function getCubicLoopControlPoints(
  function getPolylineLoopPath (line 446) | function getPolylineLoopPath(
  function getPolylineLoopControlPoints (line 482) | function getPolylineLoopControlPoints(node: Node, sourcePoint: Point, ta...
  function getSubgraphRelatedEdges (line 568) | function getSubgraphRelatedEdges(ids: ID[], getRelatedEdges: (id: ID) =>...
  function findActualConnectNodeData (line 593) | function findActualConnectNodeData(node: NodeLikeData, getParentData: (i...
  function getArrowSize (line 619) | function getArrowSize(lineWidth: number, size?: Size): Size {

FILE: packages/g6/src/utils/element.ts
  function isNode (line 19) | function isNode(shape: DisplayObject | Port): shape is Node {
  function isEdge (line 30) | function isEdge(shape: DisplayObject): shape is Edge {
  function isCombo (line 41) | function isCombo(shape: any): shape is Combo {
  function isElement (line 52) | function isElement(shape: any): shape is Element {
  function isSameNode (line 64) | function isSameNode(node1: Node, node2: Node): boolean {
  constant PORT_MAP (line 69) | const PORT_MAP: Record<string, Point> = {
  function getPortXYByPlacement (line 93) | function getPortXYByPlacement(
  function getAllPorts (line 115) | function getAllPorts(node: Node): Record<string, Port> {
  function isSimplePort (line 138) | function isSimplePort(portStyle: NodePortStyleProps): boolean {
  function getPortPosition (line 150) | function getPortPosition(port: Port): Point {
  function findPorts (line 164) | function findPorts(
  function findPort (line 189) | function findPort(node: Node, oppositeNode: Node, portKey?: string, oppo...
  function findConnectionPoints (line 214) | function findConnectionPoints(node: Node, portKey?: string): Point[] {
  function getConnectionPoint (line 229) | function getConnectionPoint(node: Port | Node | Combo, opposite: Node | ...
  function getPortConnectionPoint (line 244) | function getPortConnectionPoint(port: Port, opposite: Node | Port): Point {
  function getNodeConnectionPoint (line 272) | function getNodeConnectionPoint(nodeLike: Node | Combo, opposite: Node |...
  function getTextStyleByPlacement (line 291) | function getTextStyleByPlacement(
  function getStarPoints (line 330) | function getStarPoints(outerR: number, innerR: number): Point[] {
  function getStarPorts (line 351) | function getStarPorts(outerR: number, innerR: number): Record<string, Po...
  function getTrianglePoints (line 378) | function getTrianglePoints(width: number, height: number, direction: Tri...
  function getTrianglePorts (line 415) | function getTrianglePorts(width: number, height: number, direction: Tria...
  function getBoundingPoints (line 448) | function getBoundingPoints(width: number, height: number): Point[] {
  function getDiamondPoints (line 463) | function getDiamondPoints(width: number, height: number): Point[] {
  function isVisible (line 478) | function isVisible(element: DisplayObject) {
  function setAttributes (line 489) | function setAttributes(element: BaseShape<any>, style: Partial<BaseShape...
  function updateStyle (line 509) | function updateStyle<T extends DisplayObject>(shape: T, style: Record<st...
  function getHexagonPoints (line 519) | function getHexagonPoints(outerR: number): Point[] {
  function markToBeDestroyed (line 536) | function markToBeDestroyed(element: DisplayObject) {
  function isToBeDestroyed (line 547) | function isToBeDestroyed(element: DisplayObject | unknown) {

FILE: packages/g6/src/utils/event/events.ts
  class BaseEvent (line 13) | class BaseEvent {
    method constructor (line 14) | constructor(public type: string) {}
  class GraphLifeCycleEvent (line 17) | class GraphLifeCycleEvent extends BaseEvent implements IGraphLifeCycleEv...
    method constructor (line 18) | constructor(
  class AnimateEvent (line 40) | class AnimateEvent extends BaseEvent implements IAnimateEvent {
    method constructor (line 41) | constructor(
  class ElementLifeCycleEvent (line 51) | class ElementLifeCycleEvent extends BaseEvent implements IElementLifeCyc...
    method constructor (line 52) | constructor(
  class ViewportEvent (line 67) | class ViewportEvent extends BaseEvent implements IViewportEvent {
    method constructor (line 68) | constructor(

FILE: packages/g6/src/utils/event/index.ts
  function emit (line 17) | function emit(emitter: EventEmitter, event: BaseEvent) {
  function eventTargetOf (line 32) | function eventTargetOf(shape?: DisplayObject | Document): { type: string...

FILE: packages/g6/src/utils/extension.ts
  function parseExtensions (line 14) | function parseExtensions(graph: Graph, category: string, extensions: Tra...

FILE: packages/g6/src/utils/graphlib.ts
  function toGraphlibData (line 17) | function toGraphlibData(data: NodeData | EdgeData | ComboData): Node<Nod...
  function toG6Data (line 34) | function toG6Data<T extends NodeData | EdgeData | ComboData>(data: Node<...
  function createTreeStructure (line 44) | function createTreeStructure(model: Graphlib<any, any>) {

FILE: packages/g6/src/utils/id.ts
  function idOf (line 12) | function idOf(data: Partial<NodeData | EdgeData | ComboData>): ID {
  function parentIdOf (line 26) | function parentIdOf(data: Partial<NodeData | ComboData>) {
  function idsOf (line 40) | function idsOf(data: GraphData, flat: boolean): ID[] | DataID {

FILE: packages/g6/src/utils/is.ts
  function isEdgeData (line 11) | function isEdgeData(data: Partial<ElementDatum>): data is EdgeData {
  function isVector2 (line 23) | function isVector2(vector: Point): vector is Vector2 {
  function isVector3 (line 34) | function isVector3(vector: Point): vector is Vector3 {
  function isPoint (line 45) | function isPoint(p: any): p is Point {

FILE: packages/g6/src/utils/layout.ts
  function isComboLayout (line 22) | function isComboLayout(options: STDLayoutOptions) {
  function isTreeLayout (line 36) | function isTreeLayout(options: STDLayoutOptions) {
  function isPositionSpecified (line 48) | function isPositionSpecified(data: Record<string, unknown>) {
  function isPreLayout (line 63) | function isPreLayout(options?: LayoutOptions) {
  function layoutAdapter (line 75) | function layoutAdapter(
  function layoutMapping2GraphData (line 179) | function layoutMapping2GraphData(layoutMapping: AntVGraphData): GraphData {
  function isLegacyAntVLayout (line 224) | function isLegacyAntVLayout(
  function legacyLayoutAdapter (line 238) | function legacyLayoutAdapter(
  function invokeLayoutMethod (line 367) | function invokeLayoutMethod(layout: BaseLayout, method: string, ...args:...
  function getLayoutProperty (line 387) | function getLayoutProperty(layout: BaseLayout, name: string) {

FILE: packages/g6/src/utils/line.ts
  type LineSegment (line 5) | type LineSegment = [Point, Point];
  function isLinesParallel (line 15) | function isLinesParallel(l1: LineSegment, l2: LineSegment): boolean {
  function getLinesIntersection (line 32) | function getLinesIntersection(l1: LineSegment, l2: LineSegment, extended...

FILE: packages/g6/src/utils/math.ts
  function isBetween (line 10) | function isBetween(value: number, min: number, max: number): boolean {

FILE: packages/g6/src/utils/node.ts
  function inferIconStyle (line 13) | function inferIconStyle(size: Size, iconStyle: IconStyleProps): IconStyl...

FILE: packages/g6/src/utils/padding.ts
  function parsePadding (line 10) | function parsePadding(padding: Padding = 0): STDPadding {
  function getVerticalPadding (line 25) | function getVerticalPadding(padding: Padding = 0): number {
  function getHorizontalPadding (line 37) | function getHorizontalPadding(padding: Padding = 0): number {

FILE: packages/g6/src/utils/palette.ts
  function parsePalette (line 17) | function parsePalette(palette?: PaletteOptions): STDPaletteOptions | und...
  function assignColorByPalette (line 52) | function assignColorByPalette(data: ElementData, palette?: STDPaletteOpt...
  function getPaletteColors (line 123) | function getPaletteColors(colorPalette?: string | CategoricalPalette): C...

FILE: packages/g6/src/utils/path.ts
  function pointsToPath (line 12) | function pointsToPath(points: Point[], isClose = true): PathArray {
  constant PATH_COMMANDS (line 25) | const PATH_COMMANDS: Record<PathCommand, string[]> = {
  function parsePath (line 55) | function parsePath(path: string): PathArray {
  function pathToPoints (line 95) | function pathToPoints(path: string | PathArray): Point[] {

FILE: packages/g6/src/utils/pinch.ts
  type PointerPoint (line 10) | interface PointerPoint {
  type PinchEventOptions (line 26) | interface PinchEventOptions {
  type PinchEvent (line 49) | type PinchEvent = 'pinchstart' | 'pinchmove' | 'pinchend';
  type PinchCallback (line 58) | type PinchCallback = (event: IPointerEvent, options: PinchEventOptions) ...
  class PinchHandler (line 69) | class PinchHandler {
    method constructor (line 99) | constructor(
    method bindEvents (line 117) | private bindEvents() {
    method updatePointerPosition (line 132) | private updatePointerPosition(pointerId: number, x: number, y: number) {
    method onPointerDown (line 149) | onPointerDown(event: IPointerEvent) {
    method onPointerMove (line 173) | onPointerMove(event: IPointerEvent) {
    method onPointerUp (line 196) | onPointerUp(event: IPointerEvent) {
    method destroy (line 213) | public destroy() {
    method off (line 229) | public off(phase: PinchEvent, callback: PinchCallback) {
    method tryDestroy (line 244) | private tryDestroy() {

FILE: packages/g6/src/utils/placement.ts
  function parsePlacement (line 11) | function parsePlacement(placement: Placement): RelativePlacement {

FILE: packages/g6/src/utils/point.ts
  function parsePoint (line 16) | function parsePoint(point: PointObject): Point {
  function toPointObject (line 27) | function toPointObject(point: Point): PointObject {
  function sortByX (line 37) | function sortByX(points: Point[]): Point[] {
  function deduplicate (line 48) | function deduplicate(points: Point[]): Point[] {
  function round (line 66) | function round(point: Point, digits = 0): Point {
  function moveTo (line 80) | function moveTo(p: Point, ref: Point, distance: number, reverse = false)...
  function isHorizontal (line 96) | function isHorizontal(p1: Point, p2: Point): boolean {
  function isVertical (line 108) | function isVertical(p1: Point, p2: Point): boolean {
  function isOrthogonal (line 120) | function isOrthogonal(p1: Point, p2: Point): boolean {
  function isCollinear (line 133) | function isCollinear(p1: Point, p2: Point, p3: Point): boolean {
  function getSymmetricPoint (line 145) | function getSymmetricPoint(p: Point, center: Point): Point {
  function getPolygonIntersectPoint (line 160) | function getPolygonIntersectPoint(
  function isPointInPolygon (line 201) | function isPointInPolygon(point: Point, points: Point[], start?: number,...
  function getRectIntersectPoint (line 228) | function getRectIntersectPoint(p: Point, bbox: AABB, useExtendedLine = f...
  function getEllipseIntersectPoint (line 249) | function getEllipseIntersectPoint(p: Point, bbox: AABB, useExtendedLine ...
  function findNearestPoints (line 270) | function findNearestPoints(group1: Point[], group2: Point[]): [Point, Po...
  function findNearestLine (line 293) | function findNearestLine(point: Point, lines: LineSegment[]) {
  function getDistanceToLine (line 317) | function getDistanceToLine(point: Point, line: LineSegment) {
  function findNearestPointOnLine (line 330) | function findNearestPointOnLine(point: Point, line: LineSegment): Point {
  function centerOf (line 364) | function centerOf(points: Point[]): Point {
  function sortByClockwise (line 377) | function sortByClockwise(points: Point[], clockwise = true): Point[] {
  function getBoundingPoints (line 392) | function getBoundingPoints(start: Point, end: Point): Point[] {

FILE: packages/g6/src/utils/polygon.ts
  function getPolygonTextStyleByPlacement (line 22) | function getPolygonTextStyleByPlacement(

FILE: packages/g6/src/utils/position.ts
  function positionOf (line 13) | function positionOf(datum: NodeLikeData): Point {
  function hasPosition (line 25) | function hasPosition(datum: NodeLikeData): boolean {
  function getXYByRelativePlacement (line 38) | function getXYByRelativePlacement(bbox: AABB, placement: RelativePlaceme...
  function getXYByPlacement (line 52) | function getXYByPlacement(bbox: AABB, placement: Placement = 'center'): ...
  function getXYByAnchor (line 65) | function getXYByAnchor(bbox: AABB, anchor: Anchor): Point {

FILE: packages/g6/src/utils/prefix.ts
  function startsWith (line 12) | function startsWith(str: string, prefix: string) {
  function addPrefix (line 26) | function addPrefix(str: string, prefix: string): string {
  function removePrefix (line 39) | function removePrefix(string: string, prefix?: string, lowercaseFirstLet...
  function subStyleProps (line 54) | function subStyleProps<T extends Record<string, any>>(style: object, pre...
  function subObject (line 86) | function subObject(obj: Record<string, any>, prefix: string): Record<str...
  function omitStyleProps (line 109) | function omitStyleProps<T extends Record<string, any>>(style: Record<str...
  function replacePrefix (line 129) | function replacePrefix<T extends object>(style: T, oldPrefix: string, ne...

FILE: packages/g6/src/utils/print.ts
  constant BRAND (line 5) | const BRAND = 'G6';
  function format (line 14) | function format(message: string) {

FILE: packages/g6/src/utils/relation.ts
  function getElementNthDegreeIds (line 23) | function getElementNthDegreeIds(
  function getNodeNthDegreeIds (line 57) | function getNodeNthDegreeIds(

FILE: packages/g6/src/utils/router/orth.ts
  type Direction (line 19) | type Direction = 'N' | 'S' | 'W' | 'E' | null;
  type Route (line 21) | type Route = {
  function orth (line 42) | function orth(
  function getDirection (line 146) | function getDirection(from: Point, to: Point): Direction | null {
  function getBBoxSize (line 166) | function getBBoxSize(bbox: AABB, direction: Direction): number {
  function pointToPoint (line 179) | function pointToPoint(from: Point, to: Point, direction: Direction): Rou...
  function nodeToPoint (line 199) | function nodeToPoint(from: Point, to: Point, fromBBox: AABB): Route {
  function pointToNode (line 223) | function pointToNode(from: Point, to: Point, toBBox: AABB, direction: Di...
  function nodeToNode (line 265) | function nodeToNode(from: Point, to: Point, fromBBox: AABB, toBBox: AABB...
  function insideNode (line 300) | function insideNode(from: Point, to: Point, fromBBox: AABB, toBBox: AABB...
  function freeJoin (line 346) | function freeJoin(p1: Point, p2: Point, bbox: AABB): Point {

FILE: packages/g6/src/utils/router/shortest-path.ts
  function alignToGrid (line 37) | function alignToGrid(p: number | Point, gridSize: number): number | Point {
  function getAngleDiff (line 51) | function getAngleDiff(angle1: number, angle2: number) {
  function getDirectionAngle (line 64) | function getDirectionAngle(p1: Point, p2: Point) {
  function getDirectionChange (line 83) | function getDirectionChange(
  function estimateCost (line 131) | function estimateCost(from: Point, anchors: Point[], distFunc: (p1: Poin...
  function getNearestPoint (line 144) | function getNearestPoint(points: Point[], refPoint: Point, distFunc: (p1...
  function aStarSearch (line 255) | function aStarSearch(
  type Item (line 378) | type Item = {
  class SortedArray (line 388) | class SortedArray {
    method constructor (line 393) | constructor() {
    method _innerAdd (line 398) | private _innerAdd(item: Item, length: number) {
    method add (line 423) | public add(item: Item) {
    method remove (line 442) | public remove(id: string) {
    method _clearAndGetMinId (line 447) | private _clearAndGetMinId() {
    method _findFirstId (line 456) | private _findFirstId() {
    method minId (line 463) | public minId(clear: boolean) {

FILE: packages/g6/src/utils/shape.ts
  function getDescendantShapes (line 10) | function getDescendantShapes<T extends DisplayObject>(shape: T) {
  function getAncestorShapes (line 35) | function getAncestorShapes<T extends DisplayObject>(shape: T) {

FILE: packages/g6/src/utils/shortcut.ts
  type ShortcutOptions (line 8) | interface ShortcutOptions {}
  type ShortcutKey (line 10) | type ShortcutKey = string[];
  type Handler (line 12) | type Handler = (event: any) => void;
  constant MODIFIER_KEYS (line 14) | const MODIFIER_KEYS = new Set(['Control', 'Alt', 'Meta', 'Shift']);
  function isModifierKey (line 15) | function isModifierKey(key: string) {
  class Shortcut (line 21) | class Shortcut {
    method constructor (line 30) | constructor(emitter: EventEmitter) {
    method bind (line 35) | public bind(key: ShortcutKey, handler: Handler) {
    method unbind (line 44) | public unbind(key: ShortcutKey, handler?: Handler) {
    method unbindAll (line 52) | public unbindAll() {
    method match (line 61) | public match(key: ShortcutKey) {
    method bindEvents (line 68) | private bindEvents() {
    method trigger (line 110) | private trigger(event: KeyboardEvent) {
    method triggerExtendKey (line 123) | private triggerExtendKey(eventType: CommonEvent, event: unknown) {
    method destroy (line 154) | public destroy() {

FILE: packages/g6/src/utils/size.ts
  function parseSize (line 10) | function parseSize(size: Size = 0): STDSize {

FILE: packages/g6/src/utils/state.ts
  function statesOf (line 10) | function statesOf(datum: ElementDatum) {

FILE: packages/g6/src/utils/style.ts
  function computeElementCallbackStyle (line 13) | function computeElementCallbackStyle(
  function mergeOptions (line 42) | function mergeOptions(
  function getSubShapeStyle (line 69) | function getSubShapeStyle<T extends Record<string, any>>(

FILE: packages/g6/src/utils/symbol.ts
  type SymbolFactor (line 5) | type SymbolFactor = (width: number, height: number) => PathArray;

FILE: packages/g6/src/utils/text.ts
  function getWordWrapWidthWithBase (line 11) | function getWordWrapWidthWithBase(length: number, maxWidth: string | num...
  function getWordWrapWidthByBox (line 30) | function getWordWrapWidthByBox(
  function getWordWrapWidthByEnds (line 48) | function getWordWrapWidthByEnds(points: [Point, Point], maxWidth: string...

FILE: packages/g6/src/utils/theme.ts
  function themeOf (line 13) | function themeOf(options: GraphOptions) {

FILE: packages/g6/src/utils/transform.ts
  function replaceTranslateInTransform (line 14) | function replaceTranslateInTransform(

FILE: packages/g6/src/utils/traverse.ts
  type HierarchyStructure (line 1) | type HierarchyStructure<T> = T & {
  function dfs (line 15) | function dfs<N>(
  function bfs (line 43) | function bfs<N>(node: N, visitor: (node: N, depth: number) => void, navi...

FILE: packages/g6/src/utils/tree.ts
  type TreeDataGetter (line 5) | type TreeDataGetter = {
  function treeToGraphData (line 19) | function treeToGraphData(treeData: TreeData, getter?: TreeDataGetter): G...

FILE: packages/g6/src/utils/vector.ts
  constant VECTOR_ZERO (line 5) | const VECTOR_ZERO: Vector3 = [0, 0, 0];
  function padVectors (line 15) | function padVectors(a: Vector2 | Vector3, b: Vector2 | Vector3): [Vector...
  function add (line 34) | function add(a: Vector2 | Vector3, b: Vector2 | Vector3): Vector2 | Vect...
  function subtract (line 47) | function subtract(a: Vector2 | Vector3, b: Vector2 | Vector3): Vector2 |...
  function multiply (line 60) | function multiply(a: Vector2 | Vector3, b: number | Vector2 | Vector3): ...
  function divide (line 74) | function divide(a: Vector2 | Vector3, b: number | Vector2 | Vector3): Ve...
  function dot (line 93) | function dot(a: Vector2 | Vector3, b: Vector2 | Vector3): number {
  function cross (line 106) | function cross(a: Vector2 | Vector3, b: Vector2 | Vector3): Vector3 {
  function scale (line 120) | function scale(a: Vector2 | Vector3, s: number): Vector2 | Vector3 {
  function distance (line 132) | function distance(a: Vector2 | Vector3, b: Vector2 | Vector3): number {
  function manhattanDistance (line 145) | function manhattanDistance(a: Vector2 | Vector3, b: Vector2 | Vector3): ...
  function normalize (line 157) | function normalize(a: Vector2 | Vector3): Vector2 | Vector3 {
  function angle (line 171) | function angle(a: Vector2 | Vector3, b: Vector2 | Vector3, clockwise = f...
  function exactEquals (line 193) | function exactEquals(a: Vector2 | Vector3, b: Vector2 | Vector3): boolean {
  function perpendicular (line 205) | function perpendicular(a: Vector2, clockwise = true): Vector2 {
  function mod (line 217) | function mod(a: Vector2 | Vector3, b: number): Vector2 | Vector3 {
  function toVector2 (line 228) | function toVector2(a: Vector2 | Vector3): Vector2 {
  function toVector3 (line 239) | function toVector3(a: Vector2 | Vector3): Vector3 {
  function rad (line 250) | function rad(a: Vector2 | Vector3): number {
  function rotate (line 264) | function rotate(a: Vector2, angle: number): Vector2 {

FILE: packages/g6/src/utils/visibility.ts
  function setVisibility (line 15) | function setVisibility(

FILE: packages/g6/src/utils/z-index.ts
  function getZIndexOf (line 9) | function getZIndexOf(datum: ElementDatum): number {

FILE: packages/g6/vite.config.js
  method configureServer (line 19) | configureServer(server) {

FILE: packages/site/examples/animation/basic/demo/enter-edge-path-in.js
  class PathInLine (line 3) | class PathInLine extends Line {
    method onCreate (line 4) | onCreate() {

FILE: packages/site/examples/animation/persistence/demo/ant-line.js
  class AntLine (line 3) | class AntLine extends Line {
    method onCreate (line 4) | onCreate() {

FILE: packages/site/examples/animation/persistence/demo/breathing-circle.js
  class BreathingCircle (line 3) | class BreathingCircle extends Circle {
    method onCreate (line 4) | onCreate() {

FILE: packages/site/examples/animation/persistence/demo/fly-marker.js
  class FlyMarkerCubic (line 5) | class FlyMarkerCubic extends CubicHorizontal {
    method getMarkerStyle (line 6) | getMarkerStyle(attributes) {
    method onCreate (line 10) | onCreate() {

FILE: packages/site/examples/animation/persistence/demo/path-in.js
  class PathInLine (line 3) | class PathInLine extends Line {
    method onCreate (line 4) | onCreate() {

FILE: packages/site/examples/animation/persistence/demo/ripple-circle.js
  class RippleCircle (line 5) | class RippleCircle extends Circle {
    method onCreate (line 6) | onCreate() {

FILE: packages/site/examples/behavior/inner-event/demo/basic.js
  class LightNode (line 4) | class LightNode extends Circle {
    method render (line 5) | render(attributes, container) {

FILE: packages/site/examples/element/custom-combo/demo/extra-button.js
  class CircleComboWithExtraButton (line 27) | class CircleComboWithExtraButton extends CircleCombo {
    method render (line 28) | render(attributes, container) {
    method drawButton (line 33) | drawButton(attributes) {
    method onCreate (line 44) | onCreate() {

FILE: packages/site/examples/element/custom-edge/demo/custom-path.js
  class PolylineEdge (line 3) | class PolylineEdge extends BaseEdge {
    method getKeyPath (line 4) | getKeyPath(attributes) {

FILE: packages/site/examples/element/custom-edge/demo/extra-label.js
  class LabelEdge (line 5) | class LabelEdge extends Line {
    method render (line 6) | render(attributes, container) {
    method drawEndLabel (line 12) | drawEndLabel(attributes, container, type) {

FILE: packages/site/examples/element/custom-node/demo/g2-activity-chart.js
  class ActivityChart (line 5) | class ActivityChart extends Circle {
    method onCreate (line 6) | onCreate() {

FILE: packages/site/examples/element/custom-node/demo/g2-bar-chart.js
  class BarChart (line 5) | class BarChart extends Rect {
    method onCreate (line 6) | onCreate() {

FILE: packages/site/examples/element/node/demo/html.js
  constant ICON_MAP (line 3) | const ICON_MAP = {
  constant COLOR_MAP (line 9) | const COLOR_MAP = {

FILE: packages/site/examples/layout/compact-box/demo/basic.js
  function isLeafNode (line 8) | function isLeafNode(d) {

FILE: packages/site/examples/layout/compact-box/demo/vertical.js
  function isLeafNode (line 8) | function isLeafNode(d) {

FILE: packages/site/examples/layout/custom/demo/arc.js
  class ArcLayout (line 3) | class ArcLayout extends BaseLayout {
    method execute (line 4) | async execute(data, options) {
  class ArcEdge (line 19) | class ArcEdge extends BaseEdge {
    method getKeyPath (line 20) | getKeyPath(attributes) {

FILE: packages/site/examples/layout/custom/demo/bi-graph.js
  class BiLayout (line 33) | class BiLayout extends BaseLayout {
    method execute (line 36) | async execute(data, options) {

FILE: packages/site/examples/layout/dendrogram/demo/basic.js
  function isLeafNode (line 8) | function isLeafNode(d) {

FILE: packages/site/examples/layout/dendrogram/demo/vertical.js
  function isLeafNode (line 8) | function isLeafNode(d) {

FILE: packages/site/examples/layout/force-directed/demo/collision.js
  function getData (line 3) | function getData(width, size = 200) {
  function randomUniform (line 13) | function randomUniform(min, max) {
  class CollisionElement (line 23) | class CollisionElement extends BaseBehavior {
    method constructor (line 24) | constructor(context) {
    method bindEvents (line 30) | bindEvents() {
    method onPointerMove (line 34) | onPointerMove(event) {

FILE: packages/site/examples/layout/force-directed/demo/mesh.js
  function getData (line 3) | function getData(size = 10) {

FILE: packages/site/examples/layout/sub-graph/demo/basic.js
  function generateArray (line 3) | function generateArray(groups = 10, itemsPerGroup = 6) {

FILE: packages/site/examples/scene-case/default/demo/fund-flow.js
  constant COLORS (line 19) | const COLORS = {
  constant GREY_COLOR (line 26) | const GREY_COLOR = '#CED4D9';
  class TreeNode (line 28) | class TreeNode extends Rect {
    method data (line 29) | get data() {
    method childrenData (line 33) | get childrenData() {
    method getLabelStyle (line 37) | getLabelStyle(attributes) {
    method getPriceStyle (line 50) | getPriceStyle(attributes) {
    method drawPriceShape (line 62) | drawPriceShape(attributes, container) {
    method getCurrencyStyle (line 67) | getCurrencyStyle(attributes) {
    method drawCurrencyShape (line 79) | drawCurrencyShape(attributes, container) {
    method getPercentStyle (line 84) | getPercentStyle(attributes) {
    method drawPercentShape (line 96) | drawPercentShape(attributes, container) {
    method getTriangleStyle (line 101) | getTriangleStyle(attributes) {
    method drawTriangleShape (line 115) | drawTriangleShape(attributes, container) {
    method getVariableStyle (line 120) | getVariableStyle(attributes) {
    method drawVariableShape (line 133) | drawVariableShape(attributes, container) {
    method getCollapseStyle (line 138) | getCollapseStyle(attributes) {
    method drawCollapseShape (line 160) | drawCollapseShape(attributes, container) {
    method getProcessBarStyle (line 175) | getProcessBarStyle(attributes) {
    method drawProcessBarShape (line 191) | drawProcessBarShape(attributes, container) {
    method getKeyStyle (line 196) | getKeyStyle(attributes) {
    method render (line 206) | render(attributes = this.parsedAttributes, container) {

FILE: packages/site/examples/scene-case/default/demo/organization-chart.js
  constant DEFAULT_LEVEL (line 9) | const DEFAULT_LEVEL = 'detailed';
  class ChartNode (line 14) | class ChartNode extends Rect {
    method data (line 15) | get data() {
    method level (line 19) | get level() {
    method getLabelStyle (line 23) | getLabelStyle() {
    method getKeyStyle (line 44) | getKeyStyle(attributes) {
    method getPositionStyle (line 51) | getPositionStyle(attributes) {
    method drawPositionShape (line 64) | drawPositionShape(attributes, container) {
    method getStatusStyle (line 69) | getStatusStyle(attributes) {
    method drawStatusShape (line 82) | drawStatusShape(attributes, container) {
    method getPhoneStyle (line 87) | getPhoneStyle(attributes) {
    method drawPhoneShape (line 98) | drawPhoneShape(attributes, container) {
    method render (line 103) | render(attributes = this.parsedAttributes, container = this) {
  class LevelOfDetail (line 117) | class LevelOfDetail extends BaseBehavior {
    method constructor (line 124) | constructor(context, options) {
    method update (line 129) | update(options) {
    method bindEvents (line 148) | bindEvents() {
    method unbindEvents (line 153) | unbindEvents() {
    method destroy (line 158) | destroy() {

FILE: packages/site/examples/scene-case/default/demo/performance-diagnosis-flowchart.js
  constant ACTIVE_COLOR (line 10) | const ACTIVE_COLOR = '#f6c523';
  constant COLOR_MAP (line 11) | const COLOR_MAP = {
  class HoverElement (line 18) | class HoverElement extends HoverActivate {
    method getActiveIds (line 19) | getActiveIds(event) {

FILE: packages/site/examples/scene-case/default/demo/snake-flow-diagram.js
  class SnakePolyline (line 41) | class SnakePolyline extends Polyline {
    method getPoints (line 42) | getPoints(attributes) {

FILE: packages/site/examples/scene-case/default/demo/sub-graph.js
  class SubGraphNode (line 4) | class SubGraphNode extends HTML {
    method connectedCallback (line 5) | connectedCallback() {
    method render (line 10) | render(attributes, container) {
    method data (line 15) | get data() {
    method drawSubGraph (line 19) | drawSubGraph() {
    method drawGraphNode (line 28) | drawGraphNode(data) {
    method destroy (line 59) | destroy() {
  class CardCombo (line 65) | class CardCombo extends BaseCombo {
    method getKeyStyle (line 66) | getKeyStyle(attributes) {
    method drawKeyShape (line 78) | drawKeyShape(attributes, container) {
    method drawCardShape (line 91) | drawCardShape(attributes, container) {
    method removeCardShape (line 147) | removeCardShape() {

FILE: packages/site/examples/scene-case/default/demo/why-do-cats.js
  function getColor (line 16) | function getColor(id) {
  class BubbleLayout (line 45) | class BubbleLayout extends BaseLayout {
    method execute (line 48) | async execute(model, options) {

FILE: packages/site/examples/scene-case/tree-graph/demo/anti-procrastination-fishbone.js
  class AssignColorByBranch (line 53) | class AssignColorByBranch extends BaseTransform {
    method constructor (line 69) | constructor(context, options) {
    method beforeDraw (line 73) | beforeDraw(input) {
  class ArrangeEdgeZIndex (line 94) | class ArrangeEdgeZIndex extends BaseTransform {
    method beforeDraw (line 95) | beforeDraw(input) {

FILE: packages/site/examples/scene-case/tree-graph/demo/indented-tree.js
  constant COLORS (line 24) | const COLORS = [
  class IndentedNode (line 49) | class IndentedNode extends BaseNode {
    method constructor (line 63) | constructor(options) {
    method childrenData (line 68) | get childrenData() {
    method getKeyStyle (line 72) | getKeyStyle(attributes) {
    method drawKeyShape (line 83) | drawKeyShape(attributes, container) {
    method getLabelStyle (line 88) | getLabelStyle(attributes) {
    method drawIconArea (line 93) | drawIconArea(attributes, container) {
    method forwardEvent (line 106) | forwardEvent(target, type, listener) {
    method getCountStyle (line 113) | getCountStyle(attributes) {
    method drawCountShape (line 132) | drawCountShape(attributes, container) {
    method isShowCollapse (line 145) | isShowCollapse(attributes) {
    method getCollapseStyle (line 149) | getCollapseStyle(attributes) {
    method drawCollapseShape (line 169) | drawCollapseShape(attributes, container) {
    method getAddStyle (line 182) | getAddStyle(attributes) {
    method drawAddShape (line 206) | drawAddShape(attributes, container) {
    method render (line 216) | render(attributes = this.parsedAttributes, container = this) {
  class IndentedEdge (line 227) | class IndentedEdge extends Polyline {
    method getControlPoints (line 228) | getControlPoints(attributes) {
  class CollapseExpandTree (line 236) | class CollapseExpandTree extends BaseBehavior {
    method constructor (line 237) | constructor(context, options) {
    method update (line 242) | update(options) {
    method bindEvents (line 248) | bindEvents() {
    method unbindEvents (line 257) | unbindEvents() {
    method addChild (line 294) | addChild(event) {
  class DragBranch (line 313) | class DragBranch extends BaseBehavior {
    method constructor (line 314) | constructor(context, options) {
    method update (line 319) | update(options) {
    method bindEvents (line 325) | bindEvents() {
    method unbindEvents (line 335) | unbindEvents() {
    method validate (line 347) | validate(event) {
    method createShadow (line 354) | createShadow(target) {
    method moveShadow (line 373) | moveShadow(offset) {
    method destroyShadow (line 379) | destroyShadow() {
    method getDelta (line 393) | getDelta(event) {

FILE: packages/site/examples/scene-case/tree-graph/demo/mindmap.js
  class MindmapNode (line 66) | class MindmapNode extends BaseNode {
    method constructor (line 71) | constructor(options) {
    method childrenData (line 76) | get childrenData() {
    method rootId (line 80) | get rootId() {
    method isShowCollapse (line 84) | isShowCollapse(attributes) {
    method getCollapseStyle (line 89) | getCollapseStyle(attributes) {
    method drawCollapseShape (line 111) | drawCollapseShape(attributes, container) {
    method getCountStyle (line 124) | getCountStyle(attributes) {
    method drawCountShape (line 143) | drawCountShape(attributes, container) {
    method getAddStyle (line 156) | getAddStyle(attributes) {
    method getAddBarStyle (line 182) | getAddBarStyle(attributes) {
    method drawAddShape (line 207) | drawAddShape(attributes, container) {
    method forwardEvent (line 219) | forwardEvent(target, type, listener) {
    method getKeyStyle (line 226) | getKeyStyle(attributes) {
    method drawKeyShape (line 232) | drawKeyShape(attributes, container) {
    method render (line 237) | render(attributes = this.parsedAttributes, container = this) {
  class M
Condensed preview — 1692 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,057K chars).
[
  {
    "path": ".changeset/config.json",
    "chars": 276,
    "preview": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@3.0.1/schema.json\",\n  \"changelog\": false,\n  \"commit\": false,\n  \"fix"
  },
  {
    "path": ".codecov.yml",
    "chars": 548,
    "preview": "# Setting coverage targets per flag\ncoverage:\n  round: down\n  range: 60..90\n  precision: 2\n  status:\n    patch: off\n    "
  },
  {
    "path": ".commitlintrc.js",
    "chars": 246,
    "preview": "module.exports = {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    'type-enum': [\n      2,\n      'always'"
  },
  {
    "path": ".cursor/rules/translation.mdc",
    "chars": 3487,
    "preview": "---\ndescription: 翻译\nglobs:\nalwaysApply: false\n---\n# Translation Guidelines for site/docs\n\nWhen translating files under t"
  },
  {
    "path": ".editorconfig",
    "chars": 244,
    "preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_tr"
  },
  {
    "path": ".eslintignore",
    "chars": 24,
    "preview": "dist\nes\nlib\nnode_modules"
  },
  {
    "path": ".eslintrc.js",
    "chars": 2405,
    "preview": "module.exports = {\n  root: true,\n  env: {\n    browser: true,\n    es2021: true,\n    node: true,\n    commonjs: true,\n    j"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1.bug_report.yml",
    "chars": 2024,
    "preview": "name: '🐞 Bug Report'\ndescription: Create a report to help us improve, Ask questions in Discussions / 创建一个问题报告以帮助我们改进,提问请"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2.feature_request.yml",
    "chars": 674,
    "preview": "name: '💡 Feature Request'\ndescription: I have a suggestion (and may want to implement it) / 我有一个建议(或者想参与贡献)\ntitle: '[Fea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/3.docs_feedback.yml",
    "chars": 2506,
    "preview": "name: '📖 Docs Feedback'\ndescription: 'Help us make our docs better! Share your thoughts and suggestions / 帮助我们改进文档!分享您的想"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/4.oscp.yml",
    "chars": 2933,
    "preview": "name: '✏️ OSCP Season of Docs'\ndescription: '通过开源社区的力量,共同打造更友好、更易上手的 AntV 文档 | Contribute to AntV G6 documentation with "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 595,
    "preview": "# Ref: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-i"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/oscp.yml",
    "chars": 2157,
    "preview": "# name: 'AntV OSCP 计划 / AntV OSCP Plan'\n# description: AntV 开源共建计划(仅供管理员使用) / AntV Open Source Contribution Plan(For adm"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1539,
    "preview": "name: build\n\non:\n  push:\n    paths-ignore:\n      - '**/*.md'\n  pull_request:\n    paths-ignore:\n      - '**/*.md'\n\nconcur"
  },
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 970,
    "preview": "name: Deploy\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - v5\n\njobs:\n  deploy-site:\n    runs-on: ubuntu-latest"
  },
  {
    "path": ".github/workflows/ensure-triage-label.yml",
    "chars": 892,
    "preview": "name: Ensure Triage Label is Present\n\non:\n  label:\n    types:\n      - deleted\n  issues:\n    types:\n      - opened\n\npermi"
  },
  {
    "path": ".github/workflows/issue-automated.yml",
    "chars": 1532,
    "preview": "name: Issue Automated Processing\n\non:\n  issues:\n    types: [opened, reopened, edited]\n  workflow_dispatch:\n    inputs:\n "
  },
  {
    "path": ".github/workflows/issue_translate.yml",
    "chars": 658,
    "preview": "name: Translate Issue Title\n\non:\n  issues:\n    types: [opened, edited]\n\njobs:\n  run:\n    runs-on: ubuntu-latest\n    step"
  },
  {
    "path": ".github/workflows/manage-labeled.yml",
    "chars": 7441,
    "preview": "name: Manage Labeled Issue\n\non:\n  issues:\n    types: [labeled]\n\npermissions: {}\n\njobs:\n  manage-labels:\n    runs-on: ubu"
  },
  {
    "path": ".github/workflows/mark-duplicate.yml",
    "chars": 512,
    "preview": "name: Mark Duplicate Issue\n\non:\n  issue_comment:\n    types: [created, edited]\n\npermissions: {}\n\njobs:\n  mark-duplicate:\n"
  },
  {
    "path": ".github/workflows/no-response.yml",
    "chars": 1924,
    "preview": "name: No Response\n\n# `issues`.`closed`, `issue_comment`.`created`, and `scheduled` event types are required for this Act"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 930,
    "preview": "# 当具有 publish 标签的 PR 被合并时,自动发布新版本\n# Automatically publish a new version when a PR with the publish label is merged\nname:"
  },
  {
    "path": ".github/workflows/resolved-pending-release.yml",
    "chars": 721,
    "preview": "name: Resolved Pending Release\n\non:\n  release:\n    types: [published]\n\npermissions: {}\n\njobs:\n  comment-on-issues:\n    r"
  },
  {
    "path": ".github/workflows/scripts/closeOnRelease.js",
    "chars": 2566,
    "preview": "/**\n * @param {Object} param\n * @param {import('@actions/core')} param.core\n * @param {ReturnType<import('@actions/githu"
  },
  {
    "path": ".github/workflows/scripts/issue-automated.js",
    "chars": 3264,
    "preview": "const { OpenAI } = require(\"openai\");\nconst { QueryAntVDocumentTool, ExtractAntVTopicTool }=  require('@antv/mcp-server-"
  },
  {
    "path": ".github/workflows/scripts/updateYuque.js",
    "chars": 9328,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\n/**\n * @param {Object} param\n * @param {import('@actions/core')"
  },
  {
    "path": ".github/workflows/update-yuque.yml",
    "chars": 833,
    "preview": "name: Update Documentation on Yuque\n\non:\n  pull_request:\n    types: [closed]\n    branches:\n      - v5\n    paths:\n      -"
  },
  {
    "path": ".gitignore",
    "chars": 363,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nyarn.lock\npackage-lock.json\npnpm-lock."
  },
  {
    "path": ".husky/commit-msg",
    "chars": 82,
    "preview": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx --no-install commitlint --edit \"$1\"\n"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 333,
    "preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nprotected_branches=\"master v5\"\ncurrent_branch=$(git rev-parse --abb"
  },
  {
    "path": ".prettierignore",
    "chars": 24,
    "preview": "dist\nes\nlib\nnode_modules"
  },
  {
    "path": ".prettierrc.js",
    "chars": 346,
    "preview": "module.exports = {\n  plugins: [\n    require.resolve('prettier-plugin-organize-imports'),\n    require.resolve('prettier-p"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1555,
    "preview": "{\n  \"cSpell.words\": [\n    \"AABB\",\n    \"afteranimate\",\n    \"aftercanvasinit\",\n    \"afterdestroy\",\n    \"afterdraw\",\n    \"a"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 49438,
    "preview": "# ChangeLog\n\n### 4.8.0\n\n- fix: destroy graph and call layout problem, closes: #4126;\n- fix: remove duplicated event emit"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2018 Alipay.inc\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "PUBLISH.md",
    "chars": 1228,
    "preview": "This project uses changeset to manage version release, and the specific release process is as follows:\n\n1. Complete rela"
  },
  {
    "path": "README.md",
    "chars": 6761,
    "preview": "<img src=\"https://gw.alipayobjects.com/zos/antfincdn/R8sN%24GNdh6/language.svg\" width=\"18\"> English | [简体中文](./README.zh"
  },
  {
    "path": "README.zh-CN.md",
    "chars": 4762,
    "preview": "<img src=\"https://gw.alipayobjects.com/zos/antfincdn/R8sN%24GNdh6/language.svg\" width=\"18\"> [English](./README.md) | 简体中"
  },
  {
    "path": "SECURITY.md",
    "chars": 834,
    "preview": "# Security Policy\nCould the maintainers please create and publish a security.md with security policy that indicates the "
  },
  {
    "path": "package.json",
    "chars": 2791,
    "preview": "{\n  \"name\": \"g6\",\n  \"private\": true,\n  \"repository\": \"https://github.com/antvis/G6.git\",\n  \"scripts\": {\n    \"build\": \"tu"
  },
  {
    "path": "packages/bundle/index.html",
    "chars": 1204,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "packages/bundle/package.json",
    "chars": 639,
    "preview": "{\n  \"name\": \"bundle\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"run-s build:*\",\n    \"build:rollup\": \"rollup -c\",\n "
  },
  {
    "path": "packages/bundle/rollup.config.mjs",
    "chars": 484,
    "preview": "import commonjs from '@rollup/plugin-commonjs';\nimport resolve from '@rollup/plugin-node-resolve';\nimport terser from '@"
  },
  {
    "path": "packages/bundle/src/index.ts",
    "chars": 1157,
    "preview": "import { Graph } from '@antv/g6';\n\nconst data = {\n  nodes: [\n    { id: '0' },\n    { id: '1' },\n    { id: '2' },\n    { id"
  },
  {
    "path": "packages/bundle/tsconfig.json",
    "chars": 197,
    "preview": "{\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"outDir\": \"lib\",\n    \"paths\": {\n      \"@antv/g6\": [\"../g6/src/index.ts\""
  },
  {
    "path": "packages/bundle/vite.config.js",
    "chars": 224,
    "preview": "import { defineConfig } from 'vite';\n\nexport default defineConfig({\n  build: {\n    lib: {\n      entry: 'src/index.ts',\n "
  },
  {
    "path": "packages/bundle/webpack.config.js",
    "chars": 175,
    "preview": "const path = require('path');\n\nmodule.exports = {\n  entry: './src/index.ts',\n  output: {\n    filename: 'g6.umd.js',\n    "
  },
  {
    "path": "packages/cli/CHANGELOG.md",
    "chars": 67,
    "preview": "# @antv/g6-cli\n\n## 0.0.2\n\n### Patch Changes\n\n- chore, feat, bugfix\n"
  },
  {
    "path": "packages/cli/README.md",
    "chars": 944,
    "preview": "# @antv/g6-cli\n\n`@antv/g6-cli` is a G6 template generation tool that comes with several templates.\n\nCurrently, it owns a"
  },
  {
    "path": "packages/cli/build.config.ts",
    "chars": 239,
    "preview": "import { defineBuildConfig } from 'unbuild';\n\nexport default defineBuildConfig({\n  entries: ['src/index'],\n  clean: true"
  },
  {
    "path": "packages/cli/index.js",
    "chars": 48,
    "preview": "#!/usr/bin/env node\n\nimport './dist/index.mjs';\n"
  },
  {
    "path": "packages/cli/package.json",
    "chars": 946,
    "preview": "{\n  \"name\": \"@antv/g6-cli\",\n  \"version\": \"0.0.3\",\n  \"description\": \"Scaffolding Your Extension for G6\",\n  \"keywords\": [\n"
  },
  {
    "path": "packages/cli/src/index.ts",
    "chars": 6906,
    "preview": "/* eslint-disable jsdoc/require-jsdoc */\nimport { red, reset, yellow } from 'kolorist';\nimport minimist from 'minimist';"
  },
  {
    "path": "packages/cli/template-extension/.commitlintrc.js",
    "chars": 246,
    "preview": "module.exports = {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    'type-enum': [\n      2,\n      'always'"
  },
  {
    "path": "packages/cli/template-extension/.editorconfig",
    "chars": 245,
    "preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_tr"
  },
  {
    "path": "packages/cli/template-extension/.eslintignore",
    "chars": 24,
    "preview": "dist\nes\nlib\nnode_modules"
  },
  {
    "path": "packages/cli/template-extension/.eslintrc.js",
    "chars": 681,
    "preview": "module.exports = {\n  root: true,\n  env: {\n    browser: true,\n    es2021: true,\n    node: true,\n    commonjs: true,\n    j"
  },
  {
    "path": "packages/cli/template-extension/.gitignore",
    "chars": 45,
    "preview": "# Node\nnode_modules/\n\n# Build\ndist\nlib\nesm\n\n\n"
  },
  {
    "path": "packages/cli/template-extension/.prettierignore",
    "chars": 25,
    "preview": "dist\nes\nlib\nnode_modules\n"
  },
  {
    "path": "packages/cli/template-extension/.prettierrc.js",
    "chars": 222,
    "preview": "module.exports = {\n  plugins: [require.resolve('prettier-plugin-organize-imports'), require.resolve('prettier-plugin-pac"
  },
  {
    "path": "packages/cli/template-extension/__tests__/demos/element-node-extend.ts",
    "chars": 436,
    "preview": "import { ExtendNode } from '@/src';\nimport { ExtensionCategory, Graph, register } from '@antv/g6';\n\nexport const element"
  },
  {
    "path": "packages/cli/template-extension/__tests__/demos/index.ts",
    "chars": 39,
    "preview": "export * from './element-node-extend';\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/index.html",
    "chars": 441,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "packages/cli/template-extension/__tests__/main.ts",
    "chars": 1365,
    "preview": "import type { Controller } from 'lil-gui';\nimport GUI from 'lil-gui';\nimport _ from 'lodash';\nimport * as demos from './"
  },
  {
    "path": "packages/cli/template-extension/__tests__/setup.ts",
    "chars": 40,
    "preview": "import './utils/use-snapshot-matchers';\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/types.d.ts",
    "chars": 282,
    "preview": "import type { Graph, GraphOptions } from '@antv/g6';\nimport type { Controller, GUI } from 'lil-gui';\n\ndeclare global {\n "
  },
  {
    "path": "packages/cli/template-extension/__tests__/unit/default.spec.ts",
    "chars": 80,
    "preview": "describe('suite', () => {\n  it('case', () => {\n    expect(1).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/unit/elements/nodes/extend.spec.ts",
    "chars": 447,
    "preview": "import { elementNodeExtend } from '@@/demos';\nimport { createDemoGraph } from '@@/utils/index';\nimport type { Graph } fr"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/create.ts",
    "chars": 1590,
    "preview": "import { resetEntityCounter } from '@antv/g';\nimport { Renderer as CanvasRenderer } from '@antv/g-canvas';\nimport { Rend"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/dir.ts",
    "chars": 536,
    "preview": "import path from 'path';\n\n/**\n * <zh/> 获取快照目录\n *\n * <en/> Get snapshot directory\n * @param dir - __filename\n * @param de"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/index.ts",
    "chars": 44,
    "preview": "export { createDemoGraph } from './create';\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/offscreen-canvas-context.ts",
    "chars": 2174,
    "preview": "// Computed as round(measureText(text).width * 10) at 10px system-ui. For\n// characters that are not represented in this"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/sleep.ts",
    "chars": 107,
    "preview": "export function sleep(n: number) {\n  return new Promise((resolve) => {\n    setTimeout(resolve, n);\n  });\n}\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/svg-transformer.js",
    "chars": 97,
    "preview": "module.exports = {\n  process() {\n    return {\n      code: `module.exports = {};`,\n    };\n  },\n};\n"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/to-match-svg-snapshot.ts",
    "chars": 4194,
    "preview": "import type { Canvas, IAnimation } from '@antv/g';\nimport type { Graph, IAnimateEvent } from '@antv/g6';\nimport chalk fr"
  },
  {
    "path": "packages/cli/template-extension/__tests__/utils/use-snapshot-matchers.ts",
    "chars": 767,
    "preview": "import {\n  ToMatchSVGSnapshotOptions,\n  toMatchAnimation,\n  toMatchSVGSnapshot,\n  toMatchSnapshot,\n} from './to-match-sv"
  },
  {
    "path": "packages/cli/template-extension/jest.config.js",
    "chars": 907,
    "preview": "// Installing third-party modules by tnpm or cnpm will name modules with underscore as prefix.\n// In this case _{module}"
  },
  {
    "path": "packages/cli/template-extension/package.json",
    "chars": 2198,
    "preview": "{\n  \"name\": \"g6-extension-test\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Extension for G6\",\n  \"repository\": {\n    \"type\""
  },
  {
    "path": "packages/cli/template-extension/rollup.config.mjs",
    "chars": 847,
    "preview": "import commonjs from '@rollup/plugin-commonjs';\nimport resolve from '@rollup/plugin-node-resolve';\nimport terser from '@"
  },
  {
    "path": "packages/cli/template-extension/src/elements/index.ts",
    "chars": 25,
    "preview": "export * from './nodes';\n"
  },
  {
    "path": "packages/cli/template-extension/src/elements/nodes/extend-node.ts",
    "chars": 195,
    "preview": "import type { CircleStyleProps } from '@antv/g6';\nimport { Circle } from '@antv/g6';\n\nexport interface ExtendNodeStylePr"
  },
  {
    "path": "packages/cli/template-extension/src/elements/nodes/index.ts",
    "chars": 104,
    "preview": "export { ExtendNode } from './extend-node';\n\nexport type { ExtendNodeStyleProps } from './extend-node';\n"
  },
  {
    "path": "packages/cli/template-extension/src/exports.ts",
    "chars": 41,
    "preview": "export { ExtendNode } from './elements';\n"
  },
  {
    "path": "packages/cli/template-extension/src/index.ts",
    "chars": 27,
    "preview": "export * from './exports';\n"
  },
  {
    "path": "packages/cli/template-extension/tsconfig.build.json",
    "chars": 106,
    "preview": "{\n  \"compilerOptions\": {\n    \"paths\": {}\n  },\n  \"include\": [\"src/**/*\"],\n  \"extends\": \"./tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/cli/template-extension/tsconfig.json",
    "chars": 740,
    "preview": "{\n  \"compilerOptions\": {\n    \"allowSyntheticDefaultImports\": true,\n    \"baseUrl\": \".\",\n    \"declaration\": true,\n    \"esM"
  },
  {
    "path": "packages/cli/template-extension/vite.config.js",
    "chars": 622,
    "preview": "import path from 'path';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n  root: './__tests__',\n  se"
  },
  {
    "path": "packages/cli/tsconfig.json",
    "chars": 105,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"include\": [\"build.config.ts\", \"src\"],\n  \"compilerOptions\": {}\n}\n"
  },
  {
    "path": "packages/g6/.gitignore",
    "chars": 33,
    "preview": "__tests__/**/*-actual.*\n\nREADME.*"
  },
  {
    "path": "packages/g6/__tests__/.eslintrc",
    "chars": 44,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\"\n  }\n}"
  },
  {
    "path": "packages/g6/__tests__/bugs/api-expand-element-z-index.spec.ts",
    "chars": 1345,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('api expand element z-index', () => {\n  it('when expand element, the z"
  },
  {
    "path": "packages/g6/__tests__/bugs/api-focus-element-edge.spec.ts",
    "chars": 466,
    "preview": "import { behaviorDragNode } from '@@/demos';\nimport { createDemoGraph } from '@@/utils';\n\nit('api focusElement edge', as"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-click-select-drag-node.spec.ts",
    "chars": 2262,
    "preview": "import { CommonEvent, NodeEvent } from '@/src';\nimport { createGraph } from '@@/utils';\n\ndescribe('behavior drag-node wi"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-click-select.spec.ts",
    "chars": 1736,
    "preview": "import { CommonEvent, NodeEvent } from '@/src';\nimport { behaviorClickSelect } from '@@/demos';\nimport { createDemoGraph"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-collapse-expand.spec.ts",
    "chars": 801,
    "preview": "import { ComboEvent, GraphEvent } from '@/src';\nimport { layoutAntVDagreFlowCombo } from '@@/demos';\nimport { createDemo"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-drag-element-combo.spec.ts",
    "chars": 981,
    "preview": "import { ComboEvent, Graph } from '@/src';\nimport { layoutAntVDagreFlowCombo } from '@@/demos';\nimport { createDemoGraph"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-drag-rotated-canvas.spec.ts",
    "chars": 3104,
    "preview": "import type { Graph } from '@/src';\nimport { CommonEvent, NodeEvent } from '@/src';\nimport { bugDragRotatedCanvas } from"
  },
  {
    "path": "packages/g6/__tests__/bugs/behaviors-multiple-conflict.spec.ts",
    "chars": 1072,
    "preview": "import { createGraph, dispatchCanvasEvent } from '@@/utils';\nimport { CommonEvent, NodeEvent } from '@antv/g6';\n\ndescrib"
  },
  {
    "path": "packages/g6/__tests__/bugs/brush-select.spec.ts",
    "chars": 901,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('BrushSelect clear states issue', () => {\n  it('Should not clear state"
  },
  {
    "path": "packages/g6/__tests__/bugs/continuous-invoke.spec.ts",
    "chars": 294,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bugs:continuous-invoke', () => {\n  it('continuous invoke', () => {\n  "
  },
  {
    "path": "packages/g6/__tests__/bugs/element-combo-drag.spec.ts",
    "chars": 1403,
    "preview": "import { NodeEvent } from '@/src';\nimport { createGraph } from '@@/utils';\n\ndescribe('bugs:element-combo-drag', () => {\n"
  },
  {
    "path": "packages/g6/__tests__/bugs/element-custom-state-switch.spec.ts",
    "chars": 3241,
    "preview": "import { createGraph } from '@@/utils';\nimport { CanvasEvent, CommonEvent, NodeEvent } from '@antv/g6';\n\ndescribe('bug: "
  },
  {
    "path": "packages/g6/__tests__/bugs/element-edge-update-arrow.spec.ts",
    "chars": 992,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: element-edge-update-arrow', () => {\n  it('should update edge arr"
  },
  {
    "path": "packages/g6/__tests__/bugs/element-node-collapse.spec.ts",
    "chars": 1040,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bugs:element-node-collapse', () => {\n  it('collapse or expand a node "
  },
  {
    "path": "packages/g6/__tests__/bugs/element-node-icon-switch.spec.ts",
    "chars": 776,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: element-node-icon-switch', () => {\n  it('change node icon', asyn"
  },
  {
    "path": "packages/g6/__tests__/bugs/element-node-update-badge.spec.ts",
    "chars": 722,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: element-node-update-badge', () => {\n  it('should update node bad"
  },
  {
    "path": "packages/g6/__tests__/bugs/element-orth-router.spec.ts",
    "chars": 699,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('element orth router', () => {\n  it('test polyline orth', async () => "
  },
  {
    "path": "packages/g6/__tests__/bugs/element-port-rotate.spec.ts",
    "chars": 694,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('element port rotate', () => {\n  it('default', async () => {\n    const"
  },
  {
    "path": "packages/g6/__tests__/bugs/element-remove-combo.spec.ts",
    "chars": 766,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('element remove combo', () => {\n  it('remove combo', async () => {\n   "
  },
  {
    "path": "packages/g6/__tests__/bugs/element-set-position-to-origin.spec.ts",
    "chars": 1030,
    "preview": "import type { ID } from '@/src';\nimport { createGraph } from '@@/utils';\n\ndescribe('element set position to origin', () "
  },
  {
    "path": "packages/g6/__tests__/bugs/fit-view.spec.ts",
    "chars": 1088,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('fit view', () => {\n  it('suite 1', async () => {\n    // https://githu"
  },
  {
    "path": "packages/g6/__tests__/bugs/focus-element.spec.ts",
    "chars": 1772,
    "preview": "import { CommonEvent, NodeEvent } from '@/src';\nimport { createGraph, dispatchCanvasEvent } from '@@/utils';\n\ndescribe('"
  },
  {
    "path": "packages/g6/__tests__/bugs/graph-draw-after-clear.spec.ts",
    "chars": 436,
    "preview": "import { elementEdgeLine } from '@@/demos';\nimport { createDemoGraph, sleep } from '@@/utils';\n\nit('graph draw after cle"
  },
  {
    "path": "packages/g6/__tests__/bugs/model-add-edge-in-combo.spec.ts",
    "chars": 1823,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('add edge in combo', () => {\n  it('add edge in combo without zIndex', "
  },
  {
    "path": "packages/g6/__tests__/bugs/model-remove-parent.spec.ts",
    "chars": 761,
    "preview": "import { createGraph } from '@@/utils';\n\nit('model remove parent', async () => {\n  const data = {\n    nodes: [\n      { i"
  },
  {
    "path": "packages/g6/__tests__/bugs/plugin-history-align-fields.spec.ts",
    "chars": 1072,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: plugin-history-align-fields', () => {\n  it('fix alignFields util"
  },
  {
    "path": "packages/g6/__tests__/bugs/plugin-hull-three-collinear-dots.spec.ts",
    "chars": 605,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: plugin-hull-three-collinear-dots', () => {\n  it('fully enclosed'"
  },
  {
    "path": "packages/g6/__tests__/bugs/plugin-minimap-combo-collapsed.spec.ts",
    "chars": 878,
    "preview": "import { createGraph, sleep } from '@@/utils';\n\ndescribe('bug: plugin-minimap-combo-collapsed', () => {\n  it('should be "
  },
  {
    "path": "packages/g6/__tests__/bugs/render-change-combo.spec.ts",
    "chars": 774,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('render change combo', () => {\n  it('bug', async () => {\n    const gra"
  },
  {
    "path": "packages/g6/__tests__/bugs/render-deleted-data.spec.ts",
    "chars": 396,
    "preview": "import { layoutCompactBoxBasic } from '@@/demos';\nimport { createDemoGraph } from '@@/utils';\n\ndescribe('render deleted "
  },
  {
    "path": "packages/g6/__tests__/bugs/tree-update-collapsed-node.spec.ts",
    "chars": 1106,
    "preview": "import { idOf, treeToGraphData } from '@/src';\nimport { createGraph } from '@@/utils';\n\ndescribe('bug: tree-update-colla"
  },
  {
    "path": "packages/g6/__tests__/bugs/utils-set-visibility.spec.ts",
    "chars": 803,
    "preview": "import { createGraph } from '@@/utils';\n\ndescribe('bug: utils-set-visibility', () => {\n  it('should set correct', async "
  },
  {
    "path": "packages/g6/__tests__/dataset/algorithm-category.json",
    "chars": 1492,
    "preview": "{\n  \"id\": \"Modeling Methods\",\n  \"children\": [\n    {\n      \"id\": \"Classification\",\n      \"children\": [\n        { \"id\": \"L"
  },
  {
    "path": "packages/g6/__tests__/dataset/circular.json",
    "chars": 5078,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"0\",\n      \"label\": \"0\"\n    },\n    {\n      \"id\": \"1\",\n      \"label\": \"1\"\n    },\n    {\n "
  },
  {
    "path": "packages/g6/__tests__/dataset/cluster.json",
    "chars": 4026,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"0\", \"data\": { \"cluster\": \"a\" } },\n    { \"id\": \"1\", \"data\": { \"cluster\": \"a\" } },\n    { \"id\":"
  },
  {
    "path": "packages/g6/__tests__/dataset/combo.json",
    "chars": 3716,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"0\", \"combo\": \"a\" },\n    { \"id\": \"1\", \"combo\": \"a\" },\n    { \"id\": \"2\", \"combo\": \"a\" },\n    { "
  },
  {
    "path": "packages/g6/__tests__/dataset/dagre-combo.json",
    "chars": 1215,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"0\" },\n    { \"id\": \"1\" },\n    { \"id\": \"2\" },\n    { \"id\": \"3\" },\n    { \"id\": \"4\", \"combo\": \"A\""
  },
  {
    "path": "packages/g6/__tests__/dataset/dagre.json",
    "chars": 1087,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"0\", \"data\": { \"label\": \"0\" } },\n    { \"id\": \"1\", \"data\": { \"label\": \"1\" } },\n    { \"id\": \"2\""
  },
  {
    "path": "packages/g6/__tests__/dataset/decision-tree.json",
    "chars": 4847,
    "preview": "{\n  \"id\": \"g1\",\n  \"name\": \"Name1\",\n  \"count\": 123456,\n  \"label\": \"538.90\",\n  \"currency\": \"Yuan\",\n  \"rate\": 1.0,\n  \"statu"
  },
  {
    "path": "packages/g6/__tests__/dataset/element-edges.json",
    "chars": 613,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"node1\" },\n    { \"id\": \"node2\" },\n    { \"id\": \"node3\" },\n    { \"id\": \"node4\" },\n    { \"id\": \""
  },
  {
    "path": "packages/g6/__tests__/dataset/element-nodes.json",
    "chars": 1219,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"default\" },\n    { \"id\": \"halo\", \"style\": { \"halo\": true } },\n    {\n      \"id\": \"badges\",\n   "
  },
  {
    "path": "packages/g6/__tests__/dataset/file-system.json",
    "chars": 544,
    "preview": "{\n  \"id\": \"src\",\n  \"children\": [\n    { \"id\": \"animations\" },\n    { \"id\": \"behaviors\" },\n    { \"id\": \"elements\", \"childre"
  },
  {
    "path": "packages/g6/__tests__/dataset/flare.json",
    "chars": 12724,
    "preview": "{\n  \"id\": \"flare\",\n  \"children\": [\n    {\n      \"id\": \"analytics\",\n      \"children\": [\n        {\n          \"id\": \"cluster"
  },
  {
    "path": "packages/g6/__tests__/dataset/force.json",
    "chars": 3548,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"node0\",\n      \"style\": {\n        \"size\": 50\n      },\n      \"data\": {\n        \"cluster\""
  },
  {
    "path": "packages/g6/__tests__/dataset/gene.json",
    "chars": 25022,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"HIRA\",\n      \"data\": {\n        \"rank\": 148\n      }\n    },\n    {\n      \"id\": \"SERPINE1\""
  },
  {
    "path": "packages/g6/__tests__/dataset/language-tree.json",
    "chars": 16346,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"Proto Indo-European\",\n      \"children\": [\n        \"Balto-Slavic\",\n        \"Germanic\",\n"
  },
  {
    "path": "packages/g6/__tests__/dataset/organization-chart.json",
    "chars": 5512,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"0\",\n      \"data\": {\n        \"email\": \"ejoplin@yoyodyne.com\",\n        \"fax\": \"555-0101\""
  },
  {
    "path": "packages/g6/__tests__/dataset/parallel-edges.json",
    "chars": 2525,
    "preview": "{\n  \"nodes\": [\n    {\n      \"id\": \"node1\",\n      \"style\": {\n        \"x\": 260,\n        \"y\": 220\n      }\n    },\n    {\n     "
  },
  {
    "path": "packages/g6/__tests__/dataset/radial.json",
    "chars": 3903,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"0\", \"data\": { \"label\": \"0\" } },\n    { \"id\": \"1\", \"data\": { \"label\": \"1\" } },\n    { \"id\": \"2\""
  },
  {
    "path": "packages/g6/__tests__/dataset/relations.json",
    "chars": 29587,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"Myriel\", \"style\": { \"x\": 197.13154409979438, \"y\": 58.49567372045294 } },\n    { \"id\": \"Napole"
  },
  {
    "path": "packages/g6/__tests__/dataset/soccer.json",
    "chars": 11926,
    "preview": "{\n  \"nodes\": [\n    { \"id\": \"Argentina\", \"data\": { \"name\": \"Argentina\" } },\n    { \"id\": \"Australia\", \"data\": { \"name\": \"A"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-edge-cubic.ts",
    "chars": 1047,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const animationElementEdgeCubic: TestCase = async (context) => {\n  const graph"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-edge-line.ts",
    "chars": 1106,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const animationEdgeLine: TestCase = async (context) => {\n  const graph = new G"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-edge-quadratic.ts",
    "chars": 930,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const animationElementEdgeQuadratic: TestCase = async (context) => {\n  const g"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-position.ts",
    "chars": 1530,
    "preview": "import type { GraphOptions } from '@antv/g6';\nimport { Graph } from '@antv/g6';\n\nexport const animationElementPosition: "
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-state-switch.ts",
    "chars": 1820,
    "preview": "import type { GraphOptions } from '@antv/g6';\nimport { Graph } from '@antv/g6';\n\nexport const animationElementStateSwitc"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-state.ts",
    "chars": 1661,
    "preview": "import { Circle, ExtensionCategory, Graph, Line, register } from '@antv/g6';\n\nexport const animationElementState: TestCa"
  },
  {
    "path": "packages/g6/__tests__/demos/animation-element-style-position.ts",
    "chars": 1249,
    "preview": "import { Graph, type GraphOptions } from '@antv/g6';\n\nexport const animationElementStylePosition: TestCase = async (cont"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-auto-adapt-label.ts",
    "chars": 1500,
    "preview": "import data from '@@/dataset/language-tree.json';\nimport { Graph, IPointerEvent, type Element } from '@antv/g6';\n\nexport"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-brush-select.ts",
    "chars": 1553,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorBrushSelect: TestCase = async (context) => {\n  const graph = new"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-click-select.ts",
    "chars": 1238,
    "preview": "import type { ClickSelectOptions } from '@/src/behaviors';\nimport data from '@@/dataset/cluster.json';\nimport { Graph } "
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-create-edge.ts",
    "chars": 821,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorCreateEdge: TestCase = async (context) => {\n  const graph = new "
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-drag-canvas.ts",
    "chars": 626,
    "preview": "import data from '@@/dataset/cluster.json';\nimport { Graph } from '@antv/g6';\n\nexport const behaviorDragCanvas: TestCase"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-drag-element.ts",
    "chars": 1335,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorDragNode: TestCase = async (context) => {\n  const graph = new Gr"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-expand-collapse-combo.ts",
    "chars": 2146,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorExpandCollapseCombo: TestCase = async (context) => {\n  const gra"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-expand-collapse-node.ts",
    "chars": 1322,
    "preview": "import { Graph, treeToGraphData } from '@antv/g6';\n\nexport const behaviorExpandCollapseNode: TestCase = async (context) "
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-fix-element-size.ts",
    "chars": 2962,
    "preview": "import { Graph, GraphData } from '@antv/g6';\n\nconst data: GraphData = {\n  nodes: [\n    { id: 'node0', size: 50, label: '"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-focus-element.ts",
    "chars": 860,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorFocusElement: TestCase = async (context) => {\n  const graph = ne"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-hover-activate.ts",
    "chars": 678,
    "preview": "import data from '@@/dataset/cluster.json';\nimport { Graph } from '@antv/g6';\n\nexport const behaviorHoverActivate: TestC"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-lasso-select.ts",
    "chars": 1199,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const behaviorLassoSelect: TestCase = async (context) => {\n  const graph = new"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-optimize-viewport-transform.ts",
    "chars": 1094,
    "preview": "import data from '@@/dataset/cluster.json';\nimport type { DisplayObject } from '@antv/g';\nimport type { ElementType } fr"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-scroll-canvas.ts",
    "chars": 811,
    "preview": "import data from '@@/dataset/cluster.json';\nimport { Graph } from '@antv/g6';\n\nexport const behaviorScrollCanvas: TestCa"
  },
  {
    "path": "packages/g6/__tests__/demos/behavior-zoom-canvas.ts",
    "chars": 1621,
    "preview": "import data from '@@/dataset/cluster.json';\nimport { Graph } from '@antv/g6';\n\nexport const behaviorZoomCanvas: TestCase"
  },
  {
    "path": "packages/g6/__tests__/demos/bug-drag-rotated-canvas.ts",
    "chars": 852,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const bugDragRotatedCanvas: TestCase = async (context) => {\n  const graph = ne"
  },
  {
    "path": "packages/g6/__tests__/demos/bug-drag-rotated-element-force.ts",
    "chars": 1142,
    "preview": "// ref: https://observablehq.com/@d3/force-directed-lattice\nimport { Graph } from '@antv/g6';\n\nexport const bugDragRotat"
  },
  {
    "path": "packages/g6/__tests__/demos/bug-process-parallel-edges-combo-fixed.ts",
    "chars": 2618,
    "preview": "import type { IElementDragEvent } from '@antv/g6';\nimport { Graph } from '@antv/g6';\n\n/**\n * 测试 process-parallel-edges 与"
  },
  {
    "path": "packages/g6/__tests__/demos/bug-tooltip-resize.ts",
    "chars": 1246,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const bugTooltipResize: TestCase = async (context) => {\n  const graph = new Gr"
  },
  {
    "path": "packages/g6/__tests__/demos/canvas-cursor.ts",
    "chars": 1294,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const canvasCursor: TestCase = async (context) => {\n  const graph = new Graph("
  },
  {
    "path": "packages/g6/__tests__/demos/case-fishbone.ts",
    "chars": 5185,
    "preview": "import type { TextStyleProps } from '@antv/g';\nimport { Text } from '@antv/g';\nimport {\n  BaseTransform,\n  BaseTransform"
  },
  {
    "path": "packages/g6/__tests__/demos/case-fund-flow.ts",
    "chars": 8255,
    "preview": "import data from '@@/dataset/decision-tree.json';\nimport type { RectStyleProps as GRectStyleProps, TextStyleProps as GTe"
  },
  {
    "path": "packages/g6/__tests__/demos/case-indented-tree.ts",
    "chars": 17592,
    "preview": "import data from '@@/dataset/algorithm-category.json';\nimport type {\n  BaseStyleProps,\n  DisplayObject,\n  DisplayObjectC"
  },
  {
    "path": "packages/g6/__tests__/demos/case-language-tree.ts",
    "chars": 2490,
    "preview": "import { labelPropagation } from '@antv/algorithm';\nimport type { Element, IPointerEvent, NodeData } from '@antv/g6';\nim"
  },
  {
    "path": "packages/g6/__tests__/demos/case-mindmap.ts",
    "chars": 14697,
    "preview": "import data from '@@/dataset/algorithm-category.json';\nimport type { DisplayObject, DisplayObjectConfig, Group, RectStyl"
  },
  {
    "path": "packages/g6/__tests__/demos/case-org-chart.ts",
    "chars": 6238,
    "preview": "import data from '@@/dataset/organization-chart.json';\nimport type { RectStyleProps as GRectStyleProps, Group } from '@a"
  },
  {
    "path": "packages/g6/__tests__/demos/case-radial-dendrogram.ts",
    "chars": 1107,
    "preview": "import data from '@@/dataset/flare.json';\nimport { Graph, treeToGraphData } from '@antv/g6';\n\nexport const caseRadialDen"
  },
  {
    "path": "packages/g6/__tests__/demos/case-unicorns-investors.ts",
    "chars": 3678,
    "preview": "import type { Element, ElementDatum, IElementEvent, IPointerEvent, NodeData } from '@/src';\nimport { Graph } from '@/src"
  },
  {
    "path": "packages/g6/__tests__/demos/case-why-do-cats.ts",
    "chars": 5099,
    "preview": "import { Renderer as CanvasRenderer } from '@antv/g-canvas';\nimport { Plugin as PluginRoughCanvasRenderer } from '@antv/"
  },
  {
    "path": "packages/g6/__tests__/demos/common-graph.ts",
    "chars": 445,
    "preview": "import data from '@@/dataset/cluster.json';\nimport { Graph } from '@antv/g6';\n\nexport const commonGraph: TestCase = asyn"
  },
  {
    "path": "packages/g6/__tests__/demos/controller-viewport.ts",
    "chars": 1090,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const controllerViewport: TestCase = async (context) => {\n  const graph = new "
  },
  {
    "path": "packages/g6/__tests__/demos/demo-autosize-element-label.ts",
    "chars": 1624,
    "preview": "import type { FixShapeConfig } from '@antv/g6';\nimport { Graph } from '@antv/g6';\n\nconst mockText = 'Lorem ipsum dolor s"
  },
  {
    "path": "packages/g6/__tests__/demos/demo-found-flow.ts",
    "chars": 7117,
    "preview": "import { Rect as GRect, Text as GText } from '@antv/g';\nimport { Badge, CommonEvent, ExtensionCategory, Graph, Label, Re"
  },
  {
    "path": "packages/g6/__tests__/demos/demo-supply-chains.ts",
    "chars": 8071,
    "preview": "import type { EdgeData } from '@antv/g6';\nimport { Graph } from '@antv/g6';\n\nconst urls: Record<string, string> = {\n  co"
  },
  {
    "path": "packages/g6/__tests__/demos/element-change-type.ts",
    "chars": 1116,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementChangeType: TestCase = async (context) => {\n  const graph = new G"
  },
  {
    "path": "packages/g6/__tests__/demos/element-combo.ts",
    "chars": 2778,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementCombo: TestCase = async (context) => {\n  const data = {\n    nodes"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-arrow.ts",
    "chars": 992,
    "preview": "import { idOf } from '@/src/utils/id';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeArrow: TestCase = asyn"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-cubic-horizontal.ts",
    "chars": 706,
    "preview": "import data from '@@/dataset/element-edges.json';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeCubicHorizo"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-cubic-radial.ts",
    "chars": 501,
    "preview": "import data from '@@/dataset/algorithm-category.json';\nimport { Graph, treeToGraphData } from '@antv/g6';\n\nexport const "
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-cubic-vertical.ts",
    "chars": 702,
    "preview": "import data from '@@/dataset/element-edges.json';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeCubicVertic"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-cubic.ts",
    "chars": 519,
    "preview": "import data from '@@/dataset/element-edges.json';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeCubic: Test"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-custom-arrow.ts",
    "chars": 1418,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgeCustomArrow: TestCase = async (context) => {\n  const data = {"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-line.ts",
    "chars": 697,
    "preview": "import data from '@@/dataset/element-edges.json';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeLine: TestC"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-loop-curve.ts",
    "chars": 2401,
    "preview": "import { idOf } from '@/src/utils/id';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeLoopCurve: TestCase = "
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-loop-polyline.ts",
    "chars": 2377,
    "preview": "import { idOf } from '@/src/utils/id';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeLoopPolyline: TestCase"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-polyline-animation.ts",
    "chars": 1561,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgePolylineAnimation: TestCase = async (context) => {\n  const da"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-polyline-astar.ts",
    "chars": 981,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgePolylineAstar: TestCase = async (context) => {\n  const graph "
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-polyline-orth.ts",
    "chars": 1516,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgePolylineOrth: TestCase = async (context) => {\n  const graph ="
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-polyline.ts",
    "chars": 4130,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgePolyline: TestCase = async (context) => {\n  const graph = new"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-port.ts",
    "chars": 5208,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgePort: TestCase = async (context) => {\n  const nodes: Record<s"
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-quadratic.ts",
    "chars": 527,
    "preview": "import data from '@@/dataset/element-edges.json';\nimport { Graph } from '@antv/g6';\n\nexport const elementEdgeQuadratic: "
  },
  {
    "path": "packages/g6/__tests__/demos/element-edge-size.ts",
    "chars": 671,
    "preview": "import { Graph } from '@antv/g6';\n\nexport const elementEdgeSize: TestCase = async (context) => {\n  const data = {\n    no"
  }
]

// ... and 1492 more files (download for full content)

About this extraction

This page contains the full source code of the antvis/G6 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1692 files (5.4 MB), approximately 1.5M tokens, and a symbol index with 2406 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!