@rxflow/mind-map 0.0.1-alpha.0

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 (58) hide show
  1. package/README.md +41 -0
  2. package/cjs/constants.d.ts +14 -0
  3. package/cjs/constants.d.ts.map +1 -0
  4. package/cjs/constants.js +20 -0
  5. package/cjs/index.d.ts +7 -0
  6. package/cjs/index.d.ts.map +1 -0
  7. package/cjs/index.js +90 -0
  8. package/cjs/nodes/Topic/index.d.ts +4 -0
  9. package/cjs/nodes/Topic/index.d.ts.map +1 -0
  10. package/cjs/nodes/Topic/index.js +24 -0
  11. package/cjs/nodes/TopicBranch/index.d.ts +4 -0
  12. package/cjs/nodes/TopicBranch/index.d.ts.map +1 -0
  13. package/cjs/nodes/TopicBranch/index.js +24 -0
  14. package/cjs/nodes/TopicChild/index.d.ts +5 -0
  15. package/cjs/nodes/TopicChild/index.d.ts.map +1 -0
  16. package/cjs/nodes/TopicChild/index.js +105 -0
  17. package/cjs/nodes/TopicChild/index.less +58 -0
  18. package/cjs/nodes/index.d.ts +6 -0
  19. package/cjs/nodes/index.d.ts.map +1 -0
  20. package/cjs/nodes/index.js +48 -0
  21. package/cjs/types.d.ts +77 -0
  22. package/cjs/types.d.ts.map +1 -0
  23. package/cjs/types.js +5 -0
  24. package/cjs/utils/getHandles.d.ts +4 -0
  25. package/cjs/utils/getHandles.d.ts.map +1 -0
  26. package/cjs/utils/getHandles.js +44 -0
  27. package/cjs/utils/getNodeBoundWidth.d.ts +4 -0
  28. package/cjs/utils/getNodeBoundWidth.d.ts.map +1 -0
  29. package/cjs/utils/getNodeBoundWidth.js +36 -0
  30. package/esm/constants.d.ts +14 -0
  31. package/esm/constants.d.ts.map +1 -0
  32. package/esm/constants.js +15 -0
  33. package/esm/index.d.ts +7 -0
  34. package/esm/index.d.ts.map +1 -0
  35. package/esm/index.js +68 -0
  36. package/esm/nodes/Topic/index.d.ts +4 -0
  37. package/esm/nodes/Topic/index.d.ts.map +1 -0
  38. package/esm/nodes/Topic/index.js +20 -0
  39. package/esm/nodes/TopicBranch/index.d.ts +4 -0
  40. package/esm/nodes/TopicBranch/index.d.ts.map +1 -0
  41. package/esm/nodes/TopicBranch/index.js +20 -0
  42. package/esm/nodes/TopicChild/index.d.ts +5 -0
  43. package/esm/nodes/TopicChild/index.d.ts.map +1 -0
  44. package/esm/nodes/TopicChild/index.js +118 -0
  45. package/esm/nodes/TopicChild/index.less +58 -0
  46. package/esm/nodes/index.d.ts +6 -0
  47. package/esm/nodes/index.d.ts.map +1 -0
  48. package/esm/nodes/index.js +42 -0
  49. package/esm/types.d.ts +77 -0
  50. package/esm/types.d.ts.map +1 -0
  51. package/esm/types.js +1 -0
  52. package/esm/utils/getHandles.d.ts +4 -0
  53. package/esm/utils/getHandles.d.ts.map +1 -0
  54. package/esm/utils/getHandles.js +37 -0
  55. package/esm/utils/getNodeBoundWidth.d.ts +4 -0
  56. package/esm/utils/getNodeBoundWidth.d.ts.map +1 -0
  57. package/esm/utils/getNodeBoundWidth.js +30 -0
  58. package/package.json +49 -0
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @rxflow/mind-map
2
+
3
+ 资产树/思维导图组件。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @rxflow/mind-map @rxflow/base
9
+ # or
10
+ pnpm add @rxflow/mind-map @rxflow/base
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ```tsx
16
+ import MindMapFlow from '@rxflow/mind-map';
17
+
18
+ function App() {
19
+ return (
20
+ <MindMapFlow
21
+ data={mindMapData}
22
+ // ... other props
23
+ />
24
+ );
25
+ }
26
+ ```
27
+
28
+ ## 特性
29
+
30
+ - 树形布局
31
+ - 节点展开/折叠
32
+ - 拖拽排序
33
+ - 主题定制
34
+
35
+ ## API 文档
36
+
37
+ 访问 [完整文档](https://tree-graph.publib.cn/mind-map/examples) 查看详细 API。
38
+
39
+ ## License
40
+
41
+ MIT
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @author: yanxianliang
3
+ * @date: 2025-09-10 17:25
4
+ * @modified:2025/9/10 17:25 by yanxianliang
5
+ * @desc: 内置常量配置
6
+ *
7
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
8
+ */
9
+ export declare enum MindMapNodeEnum {
10
+ Topic = "topic",
11
+ TopicBranch = "topic-branch",
12
+ TopicChild = "topic-child"
13
+ }
14
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,WAAW,iBAAgB;IAC3B,UAAU,gBAAgB;CAC3B"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MindMapNodeEnum = void 0;
7
+ /**
8
+ * @author: yanxianliang
9
+ * @date: 2025-09-10 17:25
10
+ * @modified:2025/9/10 17:25 by yanxianliang
11
+ * @desc: 内置常量配置
12
+ *
13
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
14
+ */
15
+ let MindMapNodeEnum = exports.MindMapNodeEnum = /*#__PURE__*/function (MindMapNodeEnum) {
16
+ MindMapNodeEnum["Topic"] = "topic";
17
+ MindMapNodeEnum["TopicBranch"] = "topic-branch";
18
+ MindMapNodeEnum["TopicChild"] = "topic-child";
19
+ return MindMapNodeEnum;
20
+ }({});
package/cjs/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { MindMapFlowProps } from "./";
3
+ declare const MindMapFlow: (props: import("react").PropsWithChildren<MindMapFlowProps>) => import("react/jsx-runtime").JSX.Element;
4
+ export default MindMapFlow;
5
+ export * from './types';
6
+ export * from './constants';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAqB,gBAAgB,EAAC,WAAyB;AAoCtE,QAAA,MAAM,WAAW,yGAmBM,CAAA;AAEvB,eAAe,WAAW,CAAC;AAE3B,cAAc,SAAS,CAAC;AAExB,cAAc,aAAa,CAAC"}
package/cjs/index.js ADDED
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {};
7
+ exports.default = void 0;
8
+ var _base = require("@rxflow/base");
9
+ var _react = require("react");
10
+ var _nodes = require("./nodes");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ var _types = require("./types");
13
+ Object.keys(_types).forEach(function (key) {
14
+ if (key === "default" || key === "__esModule") return;
15
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
16
+ if (key in exports && exports[key] === _types[key]) return;
17
+ Object.defineProperty(exports, key, {
18
+ enumerable: true,
19
+ get: function () {
20
+ return _types[key];
21
+ }
22
+ });
23
+ });
24
+ var _constants = require("./constants");
25
+ Object.keys(_constants).forEach(function (key) {
26
+ if (key === "default" || key === "__esModule") return;
27
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
28
+ if (key in exports && exports[key] === _constants[key]) return;
29
+ Object.defineProperty(exports, key, {
30
+ enumerable: true,
31
+ get: function () {
32
+ return _constants[key];
33
+ }
34
+ });
35
+ });
36
+ /*
37
+ * @author: yanxianliang
38
+ * @date: 2025-06-01 18:36
39
+ * @desc: 资产树 / 脑图
40
+ *
41
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
42
+ */
43
+
44
+ const fitViewOptions = {
45
+ minZoom: 1,
46
+ maxZoom: 1
47
+ };
48
+ const omitProps = ['root', 'layoutType', 'showTooltip'];
49
+ const fn = () => {};
50
+ const usePropsTransformer = props => {
51
+ const {
52
+ nodeTypes: customNodeTypes = [],
53
+ root
54
+ } = props;
55
+ const nodes = (0, _react.useMemo)(() => {
56
+ return root ? [root] : [];
57
+ }, [root]);
58
+ return {
59
+ minZoom: 1,
60
+ maxZoom: 1,
61
+ onNodeClick: fn,
62
+ ...props,
63
+ autoCenter: false,
64
+ fitViewOptions: fitViewOptions,
65
+ forceLayout: false,
66
+ nodes,
67
+ omitProps,
68
+ readOnly: true,
69
+ nodeTypes: [..._nodes.nodeTypes, ...customNodeTypes]
70
+ };
71
+ };
72
+ const MindMapFlow = (0, _base.createFlow)(props => {
73
+ const {
74
+ theme,
75
+ children
76
+ } = props;
77
+ const layout = (0, _react.useMemo)(() => {
78
+ return _base.mindMapLayout.bind(null, {
79
+ hGap: theme?.hGap,
80
+ vGap: theme?.vGap,
81
+ markerType: theme?.markerType
82
+ });
83
+ }, []);
84
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_base.Flow, {
85
+ ...props,
86
+ layout: layout,
87
+ children: children
88
+ });
89
+ }, usePropsTransformer);
90
+ var _default = exports.default = MindMapFlow;
@@ -0,0 +1,4 @@
1
+ import { TopicNodeType } from "../../types";
2
+ import { NodeTypeComponent } from '@rxflow/base';
3
+ export declare const TopicNode: NodeTypeComponent<TopicNodeType>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AASA,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAG/C,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,aAAa,CAItD,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TopicNode = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _TopicChild = require("../TopicChild");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ /*
12
+ * @author: yanxianliang
13
+ * @date: 2025-06-01 20:44
14
+ * @desc: Topic Node
15
+ *
16
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
17
+ */
18
+
19
+ const TopicNode = props => {
20
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TopicChild.TopicChildNode, {
21
+ ...props
22
+ });
23
+ };
24
+ exports.TopicNode = TopicNode;
@@ -0,0 +1,4 @@
1
+ import { TopicBranchNodeType } from "../../types";
2
+ import { NodeTypeComponent } from "@rxflow/base";
3
+ export declare const TopicBranchNode: NodeTypeComponent<TopicBranchNodeType>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,iBAAiB,CAAC,mBAAmB,CAIlE,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TopicBranchNode = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _TopicChild = require("../TopicChild");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ /*
12
+ * @author: yanxianliang
13
+ * @date: 2025-06-01 20:44
14
+ * @desc: Topic Node
15
+ *
16
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
17
+ */
18
+
19
+ const TopicBranchNode = props => {
20
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TopicChild.TopicChildNode, {
21
+ ...props
22
+ });
23
+ };
24
+ exports.TopicBranchNode = TopicBranchNode;
@@ -0,0 +1,5 @@
1
+ import { InnerNodeType } from "../../types";
2
+ import './index.less';
3
+ import { NodeTypeComponent } from "@rxflow/base";
4
+ export declare const TopicChildNode: NodeTypeComponent<InnerNodeType>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAC,aAAa,EAAwC,MAAM,aAAa,CAAC;AAEjF,OAAO,cAAc,CAAC;AAItB,OAAO,EAAoC,iBAAiB,EAAiD,MAAM,cAAc,CAAC;AAGlI,eAAO,MAAM,cAAc,kCAmEyF,CAAC"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TopicChildNode = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _react2 = require("@xyflow/react");
9
+ var _lodash = require("lodash");
10
+ require("./index.less");
11
+ var _classcat = _interopRequireDefault(require("classcat"));
12
+ var _internal = require("antd/es/theme/internal");
13
+ var _ahooks = require("ahooks");
14
+ var _base = require("@rxflow/base");
15
+ var _jsxRuntime = require("react/jsx-runtime");
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
+ /*
20
+ * @author: yanxianliang
21
+ * @date: 2025-06-01 20:44
22
+ * @desc: Topic Node
23
+ *
24
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
25
+ */
26
+
27
+ const TopicChildNode = exports.TopicChildNode = /*#__PURE__*/_react.default.memo(props => {
28
+ const {
29
+ data,
30
+ height,
31
+ type,
32
+ id
33
+ } = props;
34
+ const {
35
+ label,
36
+ level,
37
+ childCount,
38
+ collapsed,
39
+ children,
40
+ ellipsis
41
+ } = data; // 主题配置
42
+
43
+ const theme = (0, _base.useTheme)();
44
+ const showTooltip = (0, _base.usePropsSelector)(state => state.showTooltip) ?? 'ellipsis';
45
+ const [_, token] = (0, _internal.useToken)();
46
+ const triggerLayout = (0, _base.useForceUpdate)();
47
+ const internalNode = (0, _react2.useInternalNode)(id);
48
+ const ellipsisRow = (0, _react.useMemo)(() => {
49
+ if (typeof height === 'number' && token.lineHeight && ellipsis === 'multiLine' && theme.fontSize) {
50
+ return Math.floor(height / (theme.fontSize * token.lineHeight));
51
+ }
52
+ return 1;
53
+ }, [token.lineHeight, height, theme.fontSize]);
54
+ const childrenCounts = childCount ?? children?.length;
55
+ const onCollapsed = (0, _ahooks.useMemoizedFn)(collapsed => {
56
+ // 修改data 属性,触发relayout
57
+ data.collapsed = collapsed;
58
+ // 触发relayout
59
+ triggerLayout();
60
+ });
61
+ const canTooltipShow = (0, _ahooks.useMemoizedFn)(event => {
62
+ const target = event.currentTarget;
63
+ if (showTooltip) {
64
+ const textElement = target.firstElementChild;
65
+ return showTooltip === 'ellipsis' ? textElement && textElement.scrollHeight > textElement.clientHeight : true;
66
+ }
67
+ return false;
68
+ });
69
+ const handles = (0, _react.useMemo)(() => {
70
+ const {
71
+ source = [],
72
+ target
73
+ } = internalNode?.internals?.handleBounds || {};
74
+ return [...(source || []), ...(target || [])];
75
+ }, [internalNode?.internals?.handleBounds]);
76
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
77
+ children: [handles?.map(handle => /*#__PURE__*/(0, _jsxRuntime.jsx)(_base.HiddenHandle, {
78
+ type: handle.type,
79
+ position: handle.position,
80
+ style: {
81
+ left: handle.x,
82
+ top: handle.y
83
+ }
84
+ }, `${handle.id}_${handle.type}`)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_base.Tooltip, {
85
+ title: label,
86
+ canTooltipShow: canTooltipShow,
87
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
88
+ className: (0, _classcat.default)(['rxflow-topic-container', `rxflow-${type}`]),
89
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
90
+ className: (0, _classcat.default)(['rxflow-topic-text', {
91
+ ['rxflow-topic-text-link']: level === 'link'
92
+ }]),
93
+ style: {
94
+ WebkitLineClamp: ellipsisRow
95
+ },
96
+ children: label
97
+ })
98
+ })
99
+ }), childrenCounts ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_base.CollapseButton, {
100
+ count: childrenCounts,
101
+ collapsed: collapsed,
102
+ onCollapse: onCollapsed
103
+ }) : null]
104
+ });
105
+ }, (prevProps, nextProps) => (0, _lodash.isEqual)(prevProps.data, nextProps.data));
@@ -0,0 +1,58 @@
1
+ .rxflow-topic {
2
+ &,&-branch{
3
+ align-items: center;
4
+ background-color: rgb(239, 244, 255);
5
+ border: 1px solid var(--primary-color);
6
+ border-radius: 6px;
7
+
8
+ &:hover {
9
+ box-shadow: 0 0 3px 2px var(--primary-color-lighten);
10
+ }
11
+ }
12
+
13
+ &-child {
14
+ align-items: end;
15
+ transform: translate(0, -50%) translate(0, 1px);
16
+ &:after {
17
+ content: '';
18
+ display: block;
19
+ position: absolute;
20
+ bottom: 0;
21
+ height: 2px;
22
+ background-color: var(--primary-color);
23
+ left: 0;
24
+ right: 0;
25
+ }
26
+
27
+ &:hover {
28
+ &:after {
29
+ box-shadow: 0 2px 1px 0 var(--primary-color-lighten);
30
+ }
31
+ }
32
+ }
33
+
34
+ &-container {
35
+ width: 100%;
36
+ height: 100%;
37
+ cursor: pointer;
38
+ display: flex;
39
+ padding: 5px 5px 4px;
40
+ justify-content: center;
41
+ position: relative;
42
+ box-sizing: border-box;
43
+ }
44
+
45
+ &-text {
46
+ font-family: var(--font-family);
47
+ font-size: var(--font-size);
48
+ color: var(--text-color);
49
+ display: -webkit-box;
50
+ -webkit-line-clamp: 1; /* 默认1行 */
51
+ -webkit-box-orient: vertical;
52
+ overflow: hidden;
53
+
54
+ &&-link {
55
+ color: var(--link-text-color);
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,6 @@
1
+ import { INodeDefinition } from "@rxflow/base";
2
+ /**
3
+ * 内置的节点类型
4
+ */
5
+ export declare const nodeTypes: INodeDefinition<any>[];
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAI7C;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,EAwB1C,CAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.nodeTypes = void 0;
7
+ var _constants = require("../constants");
8
+ var _Topic = require("./Topic");
9
+ var _TopicBranch = require("./TopicBranch");
10
+ var _TopicChild = require("./TopicChild");
11
+ var _getNodeBoundWidth = require("../utils/getNodeBoundWidth");
12
+ var _getHandles = require("../utils/getHandles");
13
+ /**
14
+ * @author: yanxianliang
15
+ * @date: 2025-06-20 21:48
16
+ * @desc: nodeTypes register
17
+ *
18
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
19
+ */
20
+
21
+ /**
22
+ * 内置的节点类型
23
+ */
24
+ const nodeTypes = exports.nodeTypes = [{
25
+ type: _constants.MindMapNodeEnum.Topic,
26
+ component: _Topic.TopicNode,
27
+ defaultSize: {
28
+ width: _getNodeBoundWidth.getNodeBoundWidth.bind(void 0, 160),
29
+ height: 50
30
+ },
31
+ measureHandles: _getHandles.getHandles
32
+ }, {
33
+ type: _constants.MindMapNodeEnum.TopicBranch,
34
+ component: _TopicBranch.TopicBranchNode,
35
+ defaultSize: {
36
+ width: _getNodeBoundWidth.getNodeBoundWidth.bind(void 0, 100),
37
+ height: 40
38
+ },
39
+ measureHandles: _getHandles.getHandles
40
+ }, {
41
+ type: _constants.MindMapNodeEnum.TopicChild,
42
+ component: _TopicChild.TopicChildNode,
43
+ defaultSize: {
44
+ width: _getNodeBoundWidth.getNodeBoundWidth.bind(void 0, 60),
45
+ height: 30
46
+ },
47
+ measureHandles: _getHandles.getHandles
48
+ }];
package/cjs/types.d.ts ADDED
@@ -0,0 +1,77 @@
1
+ import { BaseThemeConfig, IBaseFlowProps, MindMapLayoutConfig } from "@rxflow/base";
2
+ import { MindMapNodeEnum } from "./constants";
3
+ export interface MiniMapThemeConfig extends BaseThemeConfig, MindMapLayoutConfig {
4
+ /**
5
+ * @description 折叠按钮形状
6
+ * @default 'rect'
7
+ */
8
+ collapseButtonShape?: 'rect' | 'circle';
9
+ }
10
+ export type LayoutType = 'compactBox' | 'mindmap';
11
+ export type NodeConfig = {
12
+ /**
13
+ * @description 节点默认宽度,当节点数据中未配置宽度时,使用全局默认宽度,不配置则使用对应节点类型内置的宽度
14
+ */
15
+ width?: number | 'auto';
16
+ /**
17
+ * @description 节点高度,当节点数据中未配置宽度时,使用全局默认宽度,不配置则使用对应节点类型内置的宽度
18
+ */
19
+ height?: number;
20
+ /**
21
+ * @description 最小宽度限制
22
+ */
23
+ minWidth?: number;
24
+ /**
25
+ * @description 最大宽度限制
26
+ */
27
+ maxWidth?: number;
28
+ };
29
+ export type MindMapExtendProps = {
30
+ /**
31
+ * @description 布局方式
32
+ * @default 'mindmap'
33
+ */
34
+ layoutType?: LayoutType;
35
+ /**
36
+ * @description 主题配置
37
+ */
38
+ theme?: MiniMapThemeConfig;
39
+ /**
40
+ * @description 树结构数据源
41
+ */
42
+ root?: TopicNodeType | CustomNodeType;
43
+ /**
44
+ * @description tooltip 显示策略
45
+ * @default 'ellipsis'
46
+ */
47
+ showTooltip?: 'always' | 'ellipsis' | false;
48
+ };
49
+ export type MindMapFlowProps = Omit<IBaseFlowProps, 'nodes' | 'edges' | 'defaultEdges' | 'defaultNodes' | 'markers' | 'readOnly' | 'forceLayout' | 'layout' | 'autoCenter' | 'showLegend'> & MindMapExtendProps & {};
50
+ export type DisplayLevel = 'link';
51
+ export type TopicChildNodeType = NodeConfig & {
52
+ id: string;
53
+ type: MindMapNodeEnum.TopicChild;
54
+ label: string;
55
+ level?: DisplayLevel;
56
+ ellipsis?: 'multiLine';
57
+ side?: 'left' | 'right';
58
+ };
59
+ export type TopicBranchNodeType = Omit<TopicChildNodeType, 'type'> & {
60
+ type: MindMapNodeEnum.TopicBranch;
61
+ collapsed?: boolean;
62
+ childCount?: number;
63
+ children?: Array<TopicBranchNodeType | TopicChildNodeType>;
64
+ };
65
+ export type TopicNodeType = Omit<TopicBranchNodeType, 'type'> & {
66
+ type: MindMapNodeEnum.Topic;
67
+ };
68
+ export type InnerNodeType = TopicNodeType | TopicBranchNodeType | TopicChildNodeType;
69
+ export type CustomNodeType = {
70
+ type: string;
71
+ id: string;
72
+ collapsed?: boolean;
73
+ childCount?: number;
74
+ children?: Array<CustomNodeType>;
75
+ side?: 'left' | 'right';
76
+ };
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAClF,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,kBAAmB,SAAQ,eAAe,EAAE,mBAAmB;IAC9E;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACzC;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAGlD,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAA;AAGD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;OAEG;IACH,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;IAEtC;;;OAGG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CAC7C,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAChD,OAAO,GACP,OAAO,GACP,cAAc,GACd,cAAc,GACd,SAAS,GACT,UAAU,GACV,aAAa,GACb,QAAQ,GACR,YAAY,GACZ,YAAY,CACb,GAAG,kBAAkB,GAAG,EAAE,CAAA;AAE3B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,CAAA;AAGD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG;IACnE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,CAAC;CAC5D,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG;IAC9D,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAGrF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,CAAA"}
package/cjs/types.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,4 @@
1
+ import { Node } from "@xyflow/react";
2
+ import { NodeHandleBounds } from "@xyflow/system";
3
+ export declare function getHandles(node: Node): NodeHandleBounds;
4
+ //# sourceMappingURL=getHandles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getHandles.d.ts","sourceRoot":"","sources":["getHandles.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AACnC,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAEhD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAwBvD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getHandles = getHandles;
7
+ var _react = require("@xyflow/react");
8
+ /**
9
+ * @author: yanxianliang
10
+ * @date: 2025-07-02 20:15
11
+ * @desc: 计算handles 信息
12
+ *
13
+ * Copyright (c) 2025 by yanxianliang, All Rights Reserved.
14
+ */
15
+
16
+ function getHandles(node) {
17
+ const {
18
+ id,
19
+ width = 1,
20
+ height = 1
21
+ } = node;
22
+ return {
23
+ source: [{
24
+ height: 0,
25
+ id: null,
26
+ nodeId: id,
27
+ position: _react.Position.Right,
28
+ type: "source",
29
+ width: 0,
30
+ x: width,
31
+ y: height / 2
32
+ }],
33
+ target: [{
34
+ height: 0,
35
+ id: null,
36
+ nodeId: id,
37
+ position: _react.Position.Left,
38
+ type: "target",
39
+ width: 0,
40
+ x: 0,
41
+ y: height / 2
42
+ }]
43
+ };
44
+ }
@@ -0,0 +1,4 @@
1
+ import { Node } from '@xyflow/react';
2
+ import { BaseThemeConfig } from "@rxflow/base";
3
+ export declare function getNodeBoundWidth(defaultWidth: number, node: Node, theme: BaseThemeConfig): number;
4
+ //# sourceMappingURL=getNodeBoundWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNodeBoundWidth.d.ts","sourceRoot":"","sources":["getNodeBoundWidth.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AACnC,OAAO,EAAmB,eAAe,EAAC,MAAM,cAAc,CAAC;AAQ/D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,UAWzF"}