@antv/gpt-vis 1.0.0-beta.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +6 -4
  2. package/README.zh-CN.md +6 -4
  3. package/dist/cjs/gpt-vis/index.d.ts +8 -1
  4. package/dist/cjs/gpt-vis/index.js +43 -20
  5. package/dist/cjs/index.d.ts +15 -2
  6. package/dist/cjs/index.js +22 -2
  7. package/dist/cjs/syntax/parser.d.ts +17 -2
  8. package/dist/cjs/syntax/parser.js +151 -38
  9. package/dist/cjs/util/container.d.ts +5 -0
  10. package/dist/cjs/util/container.js +43 -0
  11. package/dist/cjs/util/theme.d.ts +5 -0
  12. package/dist/cjs/util/theme.js +9 -2
  13. package/dist/cjs/vis/area/index.js +2 -1
  14. package/dist/cjs/vis/bar/index.js +5 -4
  15. package/dist/cjs/vis/boxplot/index.js +7 -2
  16. package/dist/cjs/vis/column/index.js +5 -4
  17. package/dist/cjs/vis/dual-axes/index.js +2 -1
  18. package/dist/cjs/vis/fishbone-diagram/index.d.ts +35 -0
  19. package/dist/cjs/vis/fishbone-diagram/index.js +183 -0
  20. package/dist/cjs/vis/flow-diagram/index.d.ts +27 -0
  21. package/dist/cjs/vis/flow-diagram/index.js +271 -0
  22. package/dist/cjs/vis/funnel/index.js +2 -1
  23. package/dist/cjs/vis/histogram/index.js +3 -7
  24. package/dist/cjs/vis/indented-tree/index.d.ts +40 -0
  25. package/dist/cjs/vis/indented-tree/index.js +375 -0
  26. package/dist/cjs/vis/line/index.js +2 -1
  27. package/dist/cjs/vis/liquid/index.js +2 -1
  28. package/dist/cjs/vis/mindmap/index.d.ts +32 -0
  29. package/dist/cjs/vis/mindmap/index.js +214 -0
  30. package/dist/cjs/vis/network-graph/index.d.ts +59 -0
  31. package/dist/cjs/vis/network-graph/index.js +166 -0
  32. package/dist/cjs/vis/organization-chart/index.d.ts +64 -0
  33. package/dist/cjs/vis/organization-chart/index.js +191 -0
  34. package/dist/cjs/vis/pie/index.js +3 -3
  35. package/dist/cjs/vis/radar/index.d.ts +1 -0
  36. package/dist/cjs/vis/radar/index.js +10 -9
  37. package/dist/cjs/vis/sankey/index.js +2 -1
  38. package/dist/cjs/vis/scatter/index.js +2 -1
  39. package/dist/cjs/vis/summary/index.js +17 -3
  40. package/dist/cjs/vis/table/index.d.ts +1 -0
  41. package/dist/cjs/vis/table/index.js +37 -1
  42. package/dist/cjs/vis/treemap/index.js +2 -1
  43. package/dist/cjs/vis/venn/index.d.ts +2 -1
  44. package/dist/cjs/vis/venn/index.js +18 -3
  45. package/dist/cjs/vis/violin/index.js +2 -1
  46. package/dist/cjs/vis/waterfall/index.d.ts +6 -9
  47. package/dist/cjs/vis/waterfall/index.js +28 -5
  48. package/dist/cjs/vis/word-cloud/index.js +2 -1
  49. package/dist/cjs/vis-wrapper/icons.js +2 -2
  50. package/dist/cjs/vis-wrapper/index.d.ts +1 -0
  51. package/dist/cjs/vis-wrapper/index.js +27 -16
  52. package/dist/cjs/vis-wrapper/styles.d.ts +1 -1
  53. package/dist/cjs/vis-wrapper/styles.js +8 -1
  54. package/dist/esm/gpt-vis/index.d.ts +8 -1
  55. package/dist/esm/gpt-vis/index.js +47 -26
  56. package/dist/esm/index.d.ts +15 -2
  57. package/dist/esm/index.js +7 -1
  58. package/dist/esm/syntax/parser.d.ts +17 -2
  59. package/dist/esm/syntax/parser.js +248 -90
  60. package/dist/esm/util/container.d.ts +5 -0
  61. package/dist/esm/util/container.js +20 -0
  62. package/dist/esm/util/theme.d.ts +5 -0
  63. package/dist/esm/util/theme.js +9 -0
  64. package/dist/esm/vis/area/index.js +3 -2
  65. package/dist/esm/vis/bar/index.js +7 -6
  66. package/dist/esm/vis/boxplot/index.js +17 -4
  67. package/dist/esm/vis/column/index.js +7 -6
  68. package/dist/esm/vis/dual-axes/index.js +3 -2
  69. package/dist/esm/vis/fishbone-diagram/index.d.ts +35 -0
  70. package/dist/esm/vis/fishbone-diagram/index.js +218 -0
  71. package/dist/esm/vis/flow-diagram/index.d.ts +27 -0
  72. package/dist/esm/vis/flow-diagram/index.js +342 -0
  73. package/dist/esm/vis/funnel/index.js +3 -2
  74. package/dist/esm/vis/histogram/index.js +6 -7
  75. package/dist/esm/vis/indented-tree/index.d.ts +40 -0
  76. package/dist/esm/vis/indented-tree/index.js +564 -0
  77. package/dist/esm/vis/line/index.js +3 -2
  78. package/dist/esm/vis/liquid/index.js +3 -2
  79. package/dist/esm/vis/mindmap/index.d.ts +32 -0
  80. package/dist/esm/vis/mindmap/index.js +315 -0
  81. package/dist/esm/vis/network-graph/index.d.ts +59 -0
  82. package/dist/esm/vis/network-graph/index.js +240 -0
  83. package/dist/esm/vis/organization-chart/index.d.ts +64 -0
  84. package/dist/esm/vis/organization-chart/index.js +269 -0
  85. package/dist/esm/vis/pie/index.js +4 -8
  86. package/dist/esm/vis/radar/index.d.ts +1 -0
  87. package/dist/esm/vis/radar/index.js +20 -4
  88. package/dist/esm/vis/sankey/index.js +3 -2
  89. package/dist/esm/vis/scatter/index.js +3 -2
  90. package/dist/esm/vis/summary/index.js +25 -4
  91. package/dist/esm/vis/table/index.d.ts +1 -0
  92. package/dist/esm/vis/table/index.js +9 -2
  93. package/dist/esm/vis/treemap/index.js +3 -2
  94. package/dist/esm/vis/venn/index.d.ts +2 -1
  95. package/dist/esm/vis/venn/index.js +29 -4
  96. package/dist/esm/vis/violin/index.js +3 -2
  97. package/dist/esm/vis/waterfall/index.d.ts +6 -9
  98. package/dist/esm/vis/waterfall/index.js +27 -9
  99. package/dist/esm/vis/word-cloud/index.js +3 -2
  100. package/dist/esm/vis-wrapper/icons.js +2 -2
  101. package/dist/esm/vis-wrapper/index.d.ts +1 -0
  102. package/dist/esm/vis-wrapper/index.js +15 -10
  103. package/dist/esm/vis-wrapper/styles.d.ts +1 -1
  104. package/dist/esm/vis-wrapper/styles.js +1 -1
  105. package/dist/umd/index.min.js +1 -1
  106. package/package.json +19 -19
  107. package/src/gpt-vis/index.ts +0 -283
  108. package/src/index.ts +0 -44
  109. package/src/readme.md +0 -37
  110. package/src/syntax/index.ts +0 -2
  111. package/src/syntax/parser.ts +0 -411
  112. package/src/types/index.ts +0 -29
  113. package/src/util/theme.ts +0 -167
  114. package/src/vis/area/README.md +0 -143
  115. package/src/vis/area/index.ts +0 -212
  116. package/src/vis/bar/README.md +0 -158
  117. package/src/vis/bar/index.ts +0 -186
  118. package/src/vis/boxplot/README.md +0 -168
  119. package/src/vis/boxplot/index.ts +0 -162
  120. package/src/vis/column/README.md +0 -158
  121. package/src/vis/column/index.ts +0 -185
  122. package/src/vis/dual-axes/README.md +0 -191
  123. package/src/vis/dual-axes/index.ts +0 -218
  124. package/src/vis/funnel/README.md +0 -143
  125. package/src/vis/funnel/index.ts +0 -238
  126. package/src/vis/histogram/README.md +0 -130
  127. package/src/vis/histogram/index.ts +0 -153
  128. package/src/vis/line/README.md +0 -138
  129. package/src/vis/line/index.ts +0 -159
  130. package/src/vis/liquid/README.md +0 -150
  131. package/src/vis/liquid/index.ts +0 -130
  132. package/src/vis/pie/README.md +0 -127
  133. package/src/vis/pie/index.ts +0 -163
  134. package/src/vis/radar/README.md +0 -184
  135. package/src/vis/radar/index.ts +0 -214
  136. package/src/vis/sankey/README.md +0 -144
  137. package/src/vis/sankey/index.ts +0 -144
  138. package/src/vis/scatter/README.md +0 -145
  139. package/src/vis/scatter/index.ts +0 -147
  140. package/src/vis/summary/README.md +0 -272
  141. package/src/vis/summary/index.ts +0 -91
  142. package/src/vis/table/README.md +0 -174
  143. package/src/vis/table/index.ts +0 -241
  144. package/src/vis/treemap/README.md +0 -199
  145. package/src/vis/treemap/index.ts +0 -167
  146. package/src/vis/venn/README.md +0 -153
  147. package/src/vis/venn/index.ts +0 -149
  148. package/src/vis/violin/README.md +0 -168
  149. package/src/vis/violin/index.ts +0 -216
  150. package/src/vis/waterfall/README.md +0 -178
  151. package/src/vis/waterfall/index.ts +0 -258
  152. package/src/vis/word-cloud/README.md +0 -137
  153. package/src/vis/word-cloud/index.ts +0 -137
  154. package/src/vis-wrapper/README.md +0 -159
  155. package/src/vis-wrapper/icons.ts +0 -35
  156. package/src/vis-wrapper/index.ts +0 -276
  157. package/src/vis-wrapper/styles.ts +0 -195
@@ -0,0 +1,315 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ var _excluded = ["children"];
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
8
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
14
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
16
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
17
+ import { Graph, idOf, positionOf, treeToGraphData } from '@antv/g6';
18
+ import { getBackgroundColor, normalizePalette } from "../../util/theme";
19
+
20
+ /**
21
+ * MindmapConfig defines the configuration for rendering the mindmap.
22
+ */
23
+
24
+ /**
25
+ * MindmapInstance represents a mindmap instance with render and destroy methods.
26
+ */
27
+
28
+ /** Props type for SSR package to import */
29
+
30
+ /**
31
+ * Convert GPT-Vis tree data (name-based) to G6 tree data (id-based).
32
+ */
33
+ function toG6TreeData(node) {
34
+ return {
35
+ id: node.name,
36
+ children: (node.children || []).map(toG6TreeData)
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Convert GPT-Vis tree data to G6 graph data with depth info.
42
+ */
43
+ function convertTreeData(treeData) {
44
+ return treeToGraphData(toG6TreeData(treeData), {
45
+ getNodeData: function getNodeData(datum, depth) {
46
+ datum.depth = depth;
47
+ if (!datum.children) return datum;
48
+ var children = datum.children,
49
+ rest = _objectWithoutProperties(datum, _excluded);
50
+ return _objectSpread(_objectSpread({}, rest), {}, {
51
+ children: children.map(function (child) {
52
+ return child.id;
53
+ })
54
+ });
55
+ }
56
+ });
57
+ }
58
+
59
+ /**
60
+ * Assign branch colors to graph data before rendering.
61
+ * Each depth=1 node gets a unique color from the palette; descendants inherit.
62
+ * Runs before Graph creation so colors are available on first render.
63
+ */
64
+ function assignBranchColors(graphData, colors) {
65
+ var nodes = graphData.nodes || [];
66
+ var colorIndex = 0;
67
+ var nodeMap = new Map();
68
+ var _iterator = _createForOfIteratorHelper(nodes),
69
+ _step;
70
+ try {
71
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
72
+ var node = _step.value;
73
+ nodeMap.set(String(node.id), node);
74
+ }
75
+ } catch (err) {
76
+ _iterator.e(err);
77
+ } finally {
78
+ _iterator.f();
79
+ }
80
+ var dfs = function dfs(nodeId, color) {
81
+ var _node$children;
82
+ var node = nodeMap.get(String(nodeId));
83
+ if (!node) return;
84
+ node.style = node.style || {};
85
+ node.style.color = color || colors[colorIndex++ % colors.length];
86
+ (_node$children = node.children) === null || _node$children === void 0 || _node$children.forEach(function (childId) {
87
+ return dfs(childId, node.style.color);
88
+ });
89
+ };
90
+ nodes.filter(function (n) {
91
+ return n.depth === 1;
92
+ }).forEach(function (n) {
93
+ return dfs(String(n.id));
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Get the side of a node relative to its parent.
99
+ */
100
+ function getNodeSide(nodeData, parentData) {
101
+ if (!parentData) return 'center';
102
+ return positionOf(parentData)[0] > positionOf(nodeData)[0] ? 'left' : 'right';
103
+ }
104
+
105
+ /**
106
+ * Estimate node width based on text length (approximate).
107
+ */
108
+ function estimateNodeWidth(text, fontSize, padding) {
109
+ var avgCharWidth = fontSize * 0.58;
110
+ var cjkCount = (text.match(/[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]/g) || []).length;
111
+ var otherCount = text.length - cjkCount;
112
+ var textWidth = cjkCount * fontSize + otherCount * avgCharWidth;
113
+ return Math.min(Math.max(textWidth + padding, 120), 300);
114
+ }
115
+
116
+ /**
117
+ * Mindmap component using G6 5.0 with mindmap layout.
118
+ * Follows the "boxed" type style from 0.x @ant-design/graphs MindMap.
119
+ */
120
+ export var Mindmap = function Mindmap(options) {
121
+ var container = options.container,
122
+ width = options.width,
123
+ height = options.height,
124
+ _options$theme = options.theme,
125
+ chartTheme = _options$theme === void 0 ? 'default' : _options$theme;
126
+ var graph = null;
127
+ var render = function render(config) {
128
+ var data = config.data,
129
+ _config$direction = config.direction,
130
+ direction = _config$direction === void 0 ? 'H' : _config$direction,
131
+ _config$theme = config.theme,
132
+ theme = _config$theme === void 0 ? chartTheme : _config$theme,
133
+ title = config.title,
134
+ _config$style = config.style,
135
+ style = _config$style === void 0 ? {} : _config$style;
136
+ if (!data || !data.name) {
137
+ throw new Error('Mindmap: data with a name field is required');
138
+ }
139
+ if (graph) {
140
+ graph.destroy();
141
+ graph = null;
142
+ }
143
+ var containerEl = typeof container === 'string' ? document.querySelector(container) : container;
144
+ if (!containerEl) {
145
+ throw new Error('Mindmap: container element not found');
146
+ }
147
+ containerEl.innerHTML = '';
148
+ var colors = normalizePalette(style.palette, theme);
149
+ var backgroundColor = style.backgroundColor || getBackgroundColor(theme);
150
+ var isDark = theme === 'dark';
151
+ containerEl.style.background = backgroundColor;
152
+
153
+ // Convert tree data and assign branch colors before rendering
154
+ var graphData = convertTreeData(data);
155
+ assignBranchColors(graphData, colors);
156
+
157
+ // Pre-calculate node sizes so layout and renderer use consistent values
158
+ var _iterator2 = _createForOfIteratorHelper(graphData.nodes || []),
159
+ _step2;
160
+ try {
161
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
162
+ var _node$depth;
163
+ var node = _step2.value;
164
+ var label = String(node.id);
165
+ var depth = (_node$depth = node.depth) !== null && _node$depth !== void 0 ? _node$depth : 0;
166
+ var fontSize = depth === 0 ? 24 : 16;
167
+ var pad = depth === 0 ? 64 : 36;
168
+ node.layoutSize = [estimateNodeWidth(label, fontSize, pad), depth === 0 ? 60 : 48];
169
+ }
170
+ } catch (err) {
171
+ _iterator2.e(err);
172
+ } finally {
173
+ _iterator2.f();
174
+ }
175
+ graph = new Graph({
176
+ animation: false,
177
+ container: containerEl,
178
+ width: width,
179
+ height: height,
180
+ autoFit: 'view',
181
+ autoResize: true,
182
+ padding: 20,
183
+ zoomRange: [0.1, 5],
184
+ zoom: 1,
185
+ theme: chartTheme,
186
+ data: graphData,
187
+ plugins: title ? [{
188
+ key: 'title',
189
+ type: 'title',
190
+ title: title,
191
+ titleFill: isDark ? '#e0e6ed' : '#1a1a2e'
192
+ }] : [],
193
+ node: {
194
+ type: 'rect',
195
+ animation: {
196
+ translate: false,
197
+ update: false
198
+ },
199
+ style: function (d) {
200
+ var _depth, _d$style;
201
+ var depth = (_depth = d.depth) !== null && _depth !== void 0 ? _depth : 0;
202
+ var color = (_d$style = d.style) === null || _d$style === void 0 ? void 0 : _d$style.color;
203
+ var label = String(idOf(d));
204
+ var parentData = this.getParentData(idOf(d), 'tree');
205
+ var _ref = d.layoutSize || [120, 48],
206
+ _ref2 = _slicedToArray(_ref, 2),
207
+ nodeWidth = _ref2[0],
208
+ nodeHeight = _ref2[1];
209
+
210
+ // Node side for dx offset (matching 0.x getNodeSide + dx logic)
211
+ var side = direction === 'RL' ? 'left' : direction === 'LR' ? 'right' : getNodeSide(d, parentData);
212
+ var fontSize = depth === 0 ? 24 : 16;
213
+ var fontWeight = depth <= 1 ? 600 : 400;
214
+
215
+ // dx offset: left=-width, center=-width/2, right=0 (matching 0.x)
216
+ var dx = side === 'left' ? -nodeWidth : side === 'center' ? -nodeWidth / 2 : 0;
217
+
218
+ // Common style
219
+ var base = {
220
+ size: [nodeWidth, nodeHeight],
221
+ dx: dx,
222
+ radius: 8,
223
+ labelText: label,
224
+ labelPlacement: 'center',
225
+ labelFontSize: fontSize,
226
+ labelFontWeight: fontWeight,
227
+ ports: [{
228
+ placement: 'left'
229
+ }, {
230
+ placement: 'right'
231
+ }]
232
+ };
233
+
234
+ // Depth 0: gray filled (root)
235
+ if (depth === 0) {
236
+ return _objectSpread(_objectSpread({}, base), {}, {
237
+ fill: isDark ? '#333' : '#f1f4f5',
238
+ labelFill: isDark ? '#e0e0e0' : '#252525'
239
+ });
240
+ }
241
+
242
+ // Depth 1: filled with branch color
243
+ if (depth === 1) {
244
+ return _objectSpread(_objectSpread({}, base), {}, {
245
+ fill: color || '#99ADD1',
246
+ labelFill: '#fff'
247
+ });
248
+ }
249
+
250
+ // Depth 2+: outlined with branch color border
251
+ return _objectSpread(_objectSpread({}, base), {}, {
252
+ fill: backgroundColor,
253
+ stroke: color || (isDark ? '#555' : '#99ADD1'),
254
+ lineWidth: 3,
255
+ labelFill: isDark ? color || '#ccc' : color || '#333'
256
+ });
257
+ }
258
+ },
259
+ edge: {
260
+ type: 'cubic-horizontal',
261
+ animation: {
262
+ translate: false,
263
+ update: false
264
+ },
265
+ style: {
266
+ lineWidth: 3,
267
+ stroke: function stroke(edgeData) {
268
+ var _sourceNode$style;
269
+ var sourceNode = this.getNodeData(edgeData.source);
270
+ return (sourceNode === null || sourceNode === void 0 || (_sourceNode$style = sourceNode.style) === null || _sourceNode$style === void 0 ? void 0 : _sourceNode$style.color) || (isDark ? '#555' : '#99ADD1');
271
+ }
272
+ }
273
+ },
274
+ layout: {
275
+ type: 'mindmap',
276
+ direction: direction,
277
+ preLayout: false,
278
+ getWidth: function getWidth(nodeData) {
279
+ var _nodeData$layoutSize$, _nodeData$layoutSize;
280
+ return (_nodeData$layoutSize$ = (_nodeData$layoutSize = nodeData.layoutSize) === null || _nodeData$layoutSize === void 0 ? void 0 : _nodeData$layoutSize[0]) !== null && _nodeData$layoutSize$ !== void 0 ? _nodeData$layoutSize$ : 120;
281
+ },
282
+ getHeight: function getHeight(nodeData) {
283
+ var _nodeData$layoutSize$2, _nodeData$layoutSize2;
284
+ return (_nodeData$layoutSize$2 = (_nodeData$layoutSize2 = nodeData.layoutSize) === null || _nodeData$layoutSize2 === void 0 ? void 0 : _nodeData$layoutSize2[1]) !== null && _nodeData$layoutSize$2 !== void 0 ? _nodeData$layoutSize$2 : 48;
285
+ },
286
+ getHGap: function getHGap() {
287
+ return 64;
288
+ },
289
+ getVGap: function getVGap() {
290
+ return 14;
291
+ }
292
+ },
293
+ behaviors: ['drag-canvas']
294
+ });
295
+ graph.render();
296
+ };
297
+ var destroy = function destroy() {
298
+ if (graph) {
299
+ graph.destroy();
300
+ graph = null;
301
+ }
302
+ };
303
+ return {
304
+ render: render,
305
+ destroy: destroy,
306
+ zoomTo: function zoomTo(zoom) {
307
+ var _graph;
308
+ return (_graph = graph) === null || _graph === void 0 ? void 0 : _graph.zoomTo(zoom);
309
+ },
310
+ getZoom: function getZoom() {
311
+ var _graph2;
312
+ return (_graph2 = graph) === null || _graph2 === void 0 ? void 0 : _graph2.getZoom();
313
+ }
314
+ };
315
+ };
@@ -0,0 +1,59 @@
1
+ import type { GraphData, VisualizationOptions } from '../../types';
2
+ export type NetworkGraphNode = GraphData['nodes'][number];
3
+ export type NetworkGraphEdge = GraphData['edges'][number];
4
+ export type NetworkGraphData = GraphData;
5
+ /**
6
+ * NetworkGraphConfig defines the configuration for rendering the network graph.
7
+ */
8
+ export interface NetworkGraphConfig {
9
+ type?: 'network-graph';
10
+ data: NetworkGraphData;
11
+ layout?: 'force' | 'circular' | 'grid' | 'radial' | 'concentric' | 'dagre';
12
+ theme?: 'default' | 'academy' | 'dark';
13
+ title?: string;
14
+ style?: {
15
+ backgroundColor?: string;
16
+ palette?: string[];
17
+ };
18
+ }
19
+ /**
20
+ * NetworkGraphInstance represents a network graph instance with render and destroy methods.
21
+ */
22
+ export interface NetworkGraphInstance {
23
+ render: (config: NetworkGraphConfig) => void;
24
+ destroy: () => void;
25
+ zoomTo: (zoom: number) => void;
26
+ getZoom: () => number | undefined;
27
+ }
28
+ /**
29
+ * NetworkGraph component using G6 5.0.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const graph = NetworkGraph({
34
+ * container: '#container',
35
+ * width: 600,
36
+ * height: 400,
37
+ * });
38
+ *
39
+ * graph.render({
40
+ * type: 'network-graph',
41
+ * data: {
42
+ * nodes: [
43
+ * { name: '哈利·波特' },
44
+ * { name: '赫敏·格兰杰' },
45
+ * { name: '伏地魔' },
46
+ * ],
47
+ * edges: [
48
+ * { source: '哈利·波特', target: '赫敏·格兰杰', name: '朋友' },
49
+ * { source: '哈利·波特', target: '伏地魔', name: '敌人' },
50
+ * ],
51
+ * },
52
+ * layout: 'force',
53
+ * theme: 'academy',
54
+ * });
55
+ *
56
+ * graph.destroy();
57
+ * ```
58
+ */
59
+ export declare const NetworkGraph: (options: VisualizationOptions) => NetworkGraphInstance;
@@ -0,0 +1,240 @@
1
+ import { Graph } from '@antv/g6';
2
+ import { getBackgroundColor, normalizePalette } from "../../util/theme";
3
+
4
+ /**
5
+ * NetworkGraphConfig defines the configuration for rendering the network graph.
6
+ */
7
+
8
+ /**
9
+ * NetworkGraphInstance represents a network graph instance with render and destroy methods.
10
+ */
11
+
12
+ /**
13
+ * NetworkGraph component using G6 5.0.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const graph = NetworkGraph({
18
+ * container: '#container',
19
+ * width: 600,
20
+ * height: 400,
21
+ * });
22
+ *
23
+ * graph.render({
24
+ * type: 'network-graph',
25
+ * data: {
26
+ * nodes: [
27
+ * { name: '哈利·波特' },
28
+ * { name: '赫敏·格兰杰' },
29
+ * { name: '伏地魔' },
30
+ * ],
31
+ * edges: [
32
+ * { source: '哈利·波特', target: '赫敏·格兰杰', name: '朋友' },
33
+ * { source: '哈利·波特', target: '伏地魔', name: '敌人' },
34
+ * ],
35
+ * },
36
+ * layout: 'force',
37
+ * theme: 'academy',
38
+ * });
39
+ *
40
+ * graph.destroy();
41
+ * ```
42
+ */
43
+ export var NetworkGraph = function NetworkGraph(options) {
44
+ var container = options.container,
45
+ width = options.width,
46
+ height = options.height,
47
+ _options$theme = options.theme,
48
+ chartTheme = _options$theme === void 0 ? 'default' : _options$theme;
49
+ var graph = null;
50
+
51
+ /**
52
+ * Render the network graph with the given configuration.
53
+ */
54
+ var render = function render(config) {
55
+ var _config$data = config.data,
56
+ data = _config$data === void 0 ? {
57
+ nodes: [],
58
+ edges: []
59
+ } : _config$data,
60
+ _config$layout = config.layout,
61
+ layout = _config$layout === void 0 ? 'force' : _config$layout,
62
+ _config$theme = config.theme,
63
+ theme = _config$theme === void 0 ? chartTheme : _config$theme,
64
+ title = config.title,
65
+ _config$style = config.style,
66
+ style = _config$style === void 0 ? {} : _config$style;
67
+ var _data$nodes = data.nodes,
68
+ nodes = _data$nodes === void 0 ? [] : _data$nodes,
69
+ _data$edges = data.edges,
70
+ edges = _data$edges === void 0 ? [] : _data$edges;
71
+
72
+ // Clean up previous graph if exists
73
+ if (graph) {
74
+ graph.destroy();
75
+ graph = null;
76
+ }
77
+ var colors = normalizePalette(style.palette, theme);
78
+ var backgroundColor = style.backgroundColor || getBackgroundColor(theme);
79
+ var isDark = theme === 'dark';
80
+ var containerEl = typeof container === 'string' ? document.querySelector(container) : container;
81
+ if (!containerEl) {
82
+ throw new Error('NetworkGraph: container element not found');
83
+ }
84
+
85
+ // Clear previous content
86
+ containerEl.innerHTML = '';
87
+
88
+ // Set container styles
89
+ containerEl.style.background = backgroundColor;
90
+ containerEl.style.borderRadius = '4px';
91
+ containerEl.style.overflow = 'hidden';
92
+
93
+ // Build G6 node data
94
+ var nodeData = nodes.map(function (node, index) {
95
+ return {
96
+ id: node.name,
97
+ data: {
98
+ label: node.name
99
+ },
100
+ style: {
101
+ fill: colors[index % colors.length],
102
+ stroke: isDark ? '#444' : '#fff',
103
+ lineWidth: 2,
104
+ labelText: node.name,
105
+ labelFill: isDark ? '#e0e0e0' : '#333',
106
+ labelFontSize: 12,
107
+ size: 28
108
+ }
109
+ };
110
+ });
111
+
112
+ // Build G6 edge data
113
+ var edgeData = edges.map(function (edge) {
114
+ var _edge$name, _edge$name2;
115
+ return {
116
+ source: edge.source,
117
+ target: edge.target,
118
+ data: {
119
+ label: (_edge$name = edge.name) !== null && _edge$name !== void 0 ? _edge$name : ''
120
+ },
121
+ style: {
122
+ stroke: isDark ? '#555' : '#ccc',
123
+ lineWidth: 1.5,
124
+ endArrow: true,
125
+ labelText: (_edge$name2 = edge.name) !== null && _edge$name2 !== void 0 ? _edge$name2 : '',
126
+ labelFill: isDark ? '#aaa' : '#666',
127
+ labelFontSize: 11,
128
+ labelBackground: !!edge.name,
129
+ labelBackgroundFill: backgroundColor,
130
+ labelBackgroundOpacity: 0.8
131
+ }
132
+ };
133
+ });
134
+
135
+ // Layout configuration.
136
+ // IMPORTANT for 'force' layout:
137
+ // - edgeStrength default is 500 (edge attraction), NOT a small decimal
138
+ // - nodeStrength default is 1000 (node attraction); Coulomb repulsion is
139
+ // handled separately via factor/coulombDisScale, so no need for negative value
140
+ // - gravity keeps nodes near center so they don't drift off canvas
141
+ var layoutConfig = {
142
+ force: {
143
+ type: 'force',
144
+ preventOverlap: true,
145
+ nodeSize: 32,
146
+ linkDistance: 150,
147
+ gravity: 10
148
+ },
149
+ circular: {
150
+ type: 'circular'
151
+ },
152
+ grid: {
153
+ type: 'grid',
154
+ rows: Math.max(1, Math.ceil(Math.sqrt(nodes.length)))
155
+ },
156
+ radial: {
157
+ type: 'radial',
158
+ preventOverlap: true,
159
+ nodeSize: 32
160
+ },
161
+ concentric: {
162
+ type: 'concentric',
163
+ preventOverlap: true,
164
+ nodeSize: 32
165
+ },
166
+ dagre: {
167
+ type: 'dagre',
168
+ rankdir: 'TB',
169
+ nodesep: 50,
170
+ ranksep: 80
171
+ }
172
+ };
173
+
174
+ // G6 v5 source confirms: autoFit is called AFTER postLayout() completes
175
+ // (see runtime/graph.ts render() method), so autoFit: 'view' is safe here.
176
+ graph = new Graph({
177
+ animation: false,
178
+ container: containerEl,
179
+ width: width,
180
+ height: height,
181
+ autoFit: 'view',
182
+ autoResize: true,
183
+ padding: 24,
184
+ data: {
185
+ nodes: nodeData,
186
+ edges: edgeData
187
+ },
188
+ layout: layoutConfig[layout] || layoutConfig.force,
189
+ node: {
190
+ style: {
191
+ labelPlacement: 'bottom',
192
+ labelMaxWidth: 100
193
+ }
194
+ },
195
+ behaviors: ['drag-canvas', 'drag-element', 'click-select'],
196
+ plugins: title ? [{
197
+ key: 'title',
198
+ type: 'title',
199
+ title: title,
200
+ titleFill: isDark ? '#e0e6ed' : '#1a1a2e'
201
+ }] : []
202
+ });
203
+ graph.render();
204
+ };
205
+
206
+ /**
207
+ * Destroy the graph instance and clean up resources.
208
+ */
209
+ var destroy = function destroy() {
210
+ if (graph) {
211
+ graph.destroy();
212
+ graph = null;
213
+ }
214
+ };
215
+
216
+ /**
217
+ * Zoom the graph to a specific level (for wrapper zoom controls).
218
+ */
219
+ var zoomTo = function zoomTo(zoom) {
220
+ if (graph) {
221
+ graph.zoomTo(zoom);
222
+ }
223
+ };
224
+
225
+ /**
226
+ * Get the current zoom level.
227
+ */
228
+ var getZoom = function getZoom() {
229
+ if (graph) {
230
+ return graph.getZoom();
231
+ }
232
+ return 1;
233
+ };
234
+ return {
235
+ render: render,
236
+ destroy: destroy,
237
+ zoomTo: zoomTo,
238
+ getZoom: getZoom
239
+ };
240
+ };
@@ -0,0 +1,64 @@
1
+ import type { TreeGraphData, VisualizationOptions } from '../../types';
2
+ export type OrganizationChartData = TreeGraphData;
3
+ /**
4
+ * OrganizationChartConfig defines the configuration for rendering the organization chart.
5
+ */
6
+ export interface OrganizationChartConfig {
7
+ type?: 'organization-chart';
8
+ data: OrganizationChartData;
9
+ theme?: 'default' | 'academy' | 'dark';
10
+ title?: string;
11
+ style?: {
12
+ backgroundColor?: string;
13
+ palette?: string[];
14
+ };
15
+ }
16
+ /**
17
+ * OrganizationChartInstance represents a chart instance with render and destroy methods.
18
+ */
19
+ export interface OrganizationChartInstance {
20
+ render: (config: OrganizationChartConfig) => void;
21
+ destroy: () => void;
22
+ zoomTo: (zoom: number) => void;
23
+ getZoom: () => number | undefined;
24
+ }
25
+ /**
26
+ * OrganizationChart component using G6 5.0.
27
+ * - dagre (TB) layout for hierarchical structure
28
+ * - custom rect node with name + description labels
29
+ * - depth-based color cycling
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const chart = OrganizationChart({ container: '#container', width: 600, height: 400 });
34
+ *
35
+ * chart.render({
36
+ * type: 'organization-chart',
37
+ * data: {
38
+ * name: 'Alice Johnson',
39
+ * description: 'Chief Technology Officer',
40
+ * children: [
41
+ * {
42
+ * name: 'Bob Smith',
43
+ * description: 'Senior Software Engineer',
44
+ * children: [
45
+ * { name: 'Charlie Brown', description: 'Software Engineer' },
46
+ * { name: 'Diana White', description: 'Software Engineer' },
47
+ * ],
48
+ * },
49
+ * {
50
+ * name: 'Eve Black',
51
+ * description: 'IT Support Department Head',
52
+ * children: [
53
+ * { name: 'Frank Green', description: 'IT Support Specialist' },
54
+ * { name: 'Grace Blue', description: 'IT Support Specialist' },
55
+ * ],
56
+ * },
57
+ * ],
58
+ * },
59
+ * });
60
+ *
61
+ * chart.destroy();
62
+ * ```
63
+ */
64
+ export declare const OrganizationChart: (options: VisualizationOptions) => OrganizationChartInstance;