@xiangfa/mindmap 0.3.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.
- package/README.md +534 -0
- package/README.zh-CN.md +534 -0
- package/dist/MindMap.d.ts +3 -0
- package/dist/components/MindMapContextMenu.d.ts +20 -0
- package/dist/components/MindMapControls.d.ts +16 -0
- package/dist/components/MindMapNode.d.ts +32 -0
- package/dist/components/icons.d.ts +8 -0
- package/dist/esm/MindMap2.js +713 -0
- package/dist/esm/components/MindMapContextMenu.js +123 -0
- package/dist/esm/components/MindMapControls.js +114 -0
- package/dist/esm/components/MindMapNode.js +588 -0
- package/dist/esm/components/icons.js +45 -0
- package/dist/esm/hooks/useDrag.js +346 -0
- package/dist/esm/hooks/useNewNodeAnimation.js +20 -0
- package/dist/esm/hooks/useNodeEdit.js +57 -0
- package/dist/esm/hooks/usePanZoom.js +85 -0
- package/dist/esm/hooks/useTheme.js +16 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/logo.svg +9 -0
- package/dist/esm/plugins/cross-link.js +65 -0
- package/dist/esm/plugins/dotted-line.js +23 -0
- package/dist/esm/plugins/folding.js +20 -0
- package/dist/esm/plugins/front-matter.js +19 -0
- package/dist/esm/plugins/index.js +19 -0
- package/dist/esm/plugins/latex.js +132 -0
- package/dist/esm/plugins/multi-line.js +39 -0
- package/dist/esm/plugins/runner.js +128 -0
- package/dist/esm/plugins/tags.js +55 -0
- package/dist/esm/style.css +2 -0
- package/dist/esm/utils/export.js +50 -0
- package/dist/esm/utils/i18n.js +61 -0
- package/dist/esm/utils/inline-markdown.js +189 -0
- package/dist/esm/utils/layout.js +208 -0
- package/dist/esm/utils/markdown.js +288 -0
- package/dist/esm/utils/theme.js +119 -0
- package/dist/esm/utils/tree-ops.js +136 -0
- package/dist/hooks/useDrag.d.ts +40 -0
- package/dist/hooks/useNewNodeAnimation.d.ts +2 -0
- package/dist/hooks/useNodeEdit.d.ts +17 -0
- package/dist/hooks/usePanZoom.d.ts +26 -0
- package/dist/hooks/useTheme.d.ts +3 -0
- package/dist/index.d.ts +16 -0
- package/dist/logo.svg +9 -0
- package/dist/mindmap.umd.cjs +24 -0
- package/dist/plugins/cross-link.d.ts +2 -0
- package/dist/plugins/dotted-line.d.ts +2 -0
- package/dist/plugins/folding.d.ts +2 -0
- package/dist/plugins/front-matter.d.ts +2 -0
- package/dist/plugins/index.d.ts +11 -0
- package/dist/plugins/latex.d.ts +20 -0
- package/dist/plugins/multi-line.d.ts +2 -0
- package/dist/plugins/runner.d.ts +30 -0
- package/dist/plugins/tags.d.ts +2 -0
- package/dist/plugins/types.d.ts +78 -0
- package/dist/style.css +2 -0
- package/dist/types.d.ts +105 -0
- package/dist/utils/export.d.ts +18 -0
- package/dist/utils/i18n.d.ts +22 -0
- package/dist/utils/inline-markdown.d.ts +66 -0
- package/dist/utils/layout.d.ts +14 -0
- package/dist/utils/markdown.d.ts +20 -0
- package/dist/utils/theme.d.ts +62 -0
- package/dist/utils/tree-ops.d.ts +36 -0
- package/package.json +65 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# Open MindMap
|
|
4
|
+
|
|
5
|
+
一个精美的 React 交互式思维导图组件。
|
|
6
|
+
|
|
7
|
+
**原生支持 AI 流式输出**,使用 Markdown 列表语法,搭配 **iOS 风格 UI**。
|
|
8
|
+
|
|
9
|
+
零依赖。基于 SVG。键盘优先。支持暗色模式。
|
|
10
|
+
|
|
11
|
+
[](https://www.npmjs.com/package/@xiangfa/mindmap)
|
|
12
|
+
[](https://www.npmjs.com/package/@xiangfa/mindmap)
|
|
13
|
+
[](https://bundlephobia.com/package/@xiangfa/mindmap)
|
|
14
|
+
[](https://github.com/u14app/mindmap/blob/main/LICENSE)
|
|
15
|
+
|
|
16
|
+
[English](README.md) | 中文
|
|
17
|
+
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 特性
|
|
23
|
+
|
|
24
|
+
- **AI 流式输出** — 原生支持 AI 流式输出;输入 Markdown 列表,实时生成思维导图
|
|
25
|
+
- **纯 SVG 渲染** — 无 Canvas、无外部布局引擎,任意缩放级别下都清晰锐利
|
|
26
|
+
- **iOS 风格 UI** — 毛玻璃控件、圆角设计、流畅动画,简洁精致
|
|
27
|
+
- **插件系统** — 7 个内置插件扩展语法(虚线、折叠、多行、标签、跨链接、LaTeX、frontmatter);完全可扩展
|
|
28
|
+
- **行内格式化** — 节点内支持 **加粗**、_斜体_、`代码`、~~删除线~~、==高亮== 和 [链接](url)
|
|
29
|
+
- **任务状态** — `[x]` 已完成、`[ ]` 待办、`[-]` 进行中复选框
|
|
30
|
+
- **备注** — 通过 `>` 语法为节点附加多行备注
|
|
31
|
+
- **文本编辑模式** — 在可视化思维导图与纯文本 Markdown 编辑之间切换
|
|
32
|
+
- **全屏模式** — 将组件扩展为全屏显示
|
|
33
|
+
- **LaTeX 数学公式** — 渲染 `$...$` 行内公式和 `$$...$$` 块级公式(需安装 KaTeX)
|
|
34
|
+
- **跨链接** — 通过 `{#anchor}` / `-> {#target}` 在任意节点间绘制连线
|
|
35
|
+
- **只读模式** — 仅显示,支持平移/缩放/选择但不可编辑;适合演示和嵌入
|
|
36
|
+
- **多根节点** — 在同一画布上构建多棵独立的树
|
|
37
|
+
- **拖拽排序** — 拖拽重新排列兄弟节点;拖拽根节点的子节点跨越中线以重新平衡两侧
|
|
38
|
+
- **键盘快捷键** — Enter 创建、Delete 删除、Cmd+C/V 复制粘贴、Shift+ 快捷键控制缩放和布局
|
|
39
|
+
- **Markdown 输入输出** — 输入 Markdown 列表,输出思维导图(非常适合 AI 流式输出)
|
|
40
|
+
- **国际化** — 自动检测浏览器语言;内置中文和英文,支持通过 props 完全自定义
|
|
41
|
+
- **暗色模式** — 自动检测 `prefers-color-scheme`,也可显式设置 `light` / `dark`
|
|
42
|
+
- **导出** — 开箱即用的 SVG、高 DPI PNG 和 Markdown 导出
|
|
43
|
+
- **导入** — 通过右键菜单导入对话框粘贴 JSON 或 Markdown 数据
|
|
44
|
+
- **右键菜单** — 右键添加根节点、导入数据、导出或更改布局
|
|
45
|
+
- **布局模式** — 左侧、右侧或两侧均衡布局
|
|
46
|
+
- **移动端优化** — 完整的触控支持,单指平移/拖拽,双指捏合缩放,以内容为中心
|
|
47
|
+
- **工具栏控制** — 通过 `toolbar` prop 显示/隐藏缩放控件
|
|
48
|
+
- **极小体积** — 除 React 外零运行时依赖
|
|
49
|
+
|
|
50
|
+
## 安装
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# npm
|
|
54
|
+
npm install @xiangfa/mindmap
|
|
55
|
+
|
|
56
|
+
# pnpm
|
|
57
|
+
pnpm add @xiangfa/mindmap
|
|
58
|
+
|
|
59
|
+
# yarn
|
|
60
|
+
yarn add @xiangfa/mindmap
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
如需 LaTeX 数学公式渲染,还需安装 KaTeX(可选):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npm install katex
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 快速开始
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import { MindMap } from "@xiangfa/mindmap";
|
|
73
|
+
import "@xiangfa/mindmap/style.css";
|
|
74
|
+
|
|
75
|
+
const data = `
|
|
76
|
+
我的思维导图
|
|
77
|
+
- 第一个主题
|
|
78
|
+
- 子主题 A
|
|
79
|
+
- 子主题 B
|
|
80
|
+
- 第二个主题
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
function App() {
|
|
84
|
+
return <MindMap markdown={data} />;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
> **注意:** 组件会填充其父容器。请确保父容器有明确的尺寸。
|
|
89
|
+
|
|
90
|
+
## 使用方法
|
|
91
|
+
|
|
92
|
+
### 多根节点
|
|
93
|
+
|
|
94
|
+
传入数组以在同一画布上渲染多棵独立的树:
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<MindMap data={[tree1, tree2, tree3]} />
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Markdown 输入
|
|
101
|
+
|
|
102
|
+
直接输入 Markdown 列表 — 非常适合流式 AI 响应:
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
const markdown = `
|
|
106
|
+
机器学习
|
|
107
|
+
- 监督学习
|
|
108
|
+
- 分类
|
|
109
|
+
- 回归
|
|
110
|
+
- 无监督学习
|
|
111
|
+
|
|
112
|
+
应用领域
|
|
113
|
+
- 自然语言处理
|
|
114
|
+
- 计算机视觉
|
|
115
|
+
`;
|
|
116
|
+
|
|
117
|
+
<MindMap markdown={markdown} />;
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
在 Markdown 中用空行分隔不同的根节点树。
|
|
121
|
+
|
|
122
|
+
### 只读模式
|
|
123
|
+
|
|
124
|
+
仅显示思维导图而不允许编辑 — 适合演示、文档或嵌入场景:
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<MindMap data={data} readonly />
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
在只读模式下,用户仍可平移、缩放和选择节点,但不能创建、编辑或删除节点。右键菜单会隐藏编辑操作(新建根节点、导入),保留仅查看操作(导出、布局)。
|
|
131
|
+
|
|
132
|
+
### 暗色模式
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
<MindMap data={data} theme="auto" /> {/* 跟随系统(默认) */}
|
|
136
|
+
<MindMap data={data} theme="dark" /> {/* 始终暗色 */}
|
|
137
|
+
<MindMap data={data} theme="light" /> {/* 始终亮色 */}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 布局方向
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<MindMap data={data} defaultDirection="both" /> {/* 两侧均衡(默认) */}
|
|
144
|
+
<MindMap data={data} defaultDirection="right" /> {/* 所有子节点在右侧 */}
|
|
145
|
+
<MindMap data={data} defaultDirection="left" /> {/* 所有子节点在左侧 */}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 国际化 / 本地化
|
|
149
|
+
|
|
150
|
+
UI 语言会自动从浏览器的语言设置检测。内置支持中文(`zh-CN`)和英文(`en-US`),默认回退为英文。你也可以覆盖语言或任何文本字符串:
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
{
|
|
154
|
+
/* 自动检测(默认)- 使用浏览器语言 */
|
|
155
|
+
}
|
|
156
|
+
<MindMap data={data} />;
|
|
157
|
+
|
|
158
|
+
{
|
|
159
|
+
/* 强制指定语言 */
|
|
160
|
+
}
|
|
161
|
+
<MindMap data={data} locale="zh-CN" />;
|
|
162
|
+
|
|
163
|
+
{
|
|
164
|
+
/* 覆盖特定字符串 */
|
|
165
|
+
}
|
|
166
|
+
<MindMap data={data} locale="zh-CN" messages={{ newNode: "新节点" }} />;
|
|
167
|
+
|
|
168
|
+
{
|
|
169
|
+
/* 完全自定义语言 */
|
|
170
|
+
}
|
|
171
|
+
<MindMap
|
|
172
|
+
data={data}
|
|
173
|
+
messages={{
|
|
174
|
+
newNode: "Nuevo nodo",
|
|
175
|
+
zoomIn: "Acercar",
|
|
176
|
+
zoomOut: "Alejar",
|
|
177
|
+
// ... 覆盖 MindMapMessages 中的任意键
|
|
178
|
+
}}
|
|
179
|
+
/>;
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 插件
|
|
183
|
+
|
|
184
|
+
插件系统为思维导图扩展了额外的语法和渲染能力。所有 7 个内置插件默认启用,你也可以按需选择:
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
import {
|
|
188
|
+
MindMap,
|
|
189
|
+
allPlugins, // 全部 7 个插件
|
|
190
|
+
frontMatterPlugin, // YAML frontmatter
|
|
191
|
+
dottedLinePlugin, // 虚线边
|
|
192
|
+
foldingPlugin, // 可折叠节点
|
|
193
|
+
multiLinePlugin, // 多行内容
|
|
194
|
+
tagsPlugin, // 标签支持
|
|
195
|
+
crossLinkPlugin, // 跨节点引用
|
|
196
|
+
latexPlugin, // LaTeX 数学公式(需安装 KaTeX)
|
|
197
|
+
} from "@xiangfa/mindmap";
|
|
198
|
+
|
|
199
|
+
{
|
|
200
|
+
/* 使用全部插件(默认行为) */
|
|
201
|
+
}
|
|
202
|
+
<MindMap data={data} plugins={allPlugins} />;
|
|
203
|
+
|
|
204
|
+
{
|
|
205
|
+
/* 仅选择需要的插件 */
|
|
206
|
+
}
|
|
207
|
+
<MindMap data={data} plugins={[foldingPlugin, tagsPlugin]} />;
|
|
208
|
+
|
|
209
|
+
{
|
|
210
|
+
/* 禁用所有插件 */
|
|
211
|
+
}
|
|
212
|
+
<MindMap data={data} plugins={[]} />;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Ref API
|
|
216
|
+
|
|
217
|
+
通过 ref 访问命令式方法:
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
import { useRef } from "react";
|
|
221
|
+
import { MindMap, type MindMapRef } from "@xiangfa/mindmap";
|
|
222
|
+
|
|
223
|
+
function App() {
|
|
224
|
+
const ref = useRef<MindMapRef>(null);
|
|
225
|
+
|
|
226
|
+
const handleExportPNG = async () => {
|
|
227
|
+
const blob = await ref.current!.exportToPNG();
|
|
228
|
+
// ... 下载 blob
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const handleExportSVG = () => {
|
|
232
|
+
const svgString = ref.current!.exportToSVG();
|
|
233
|
+
// ... 下载 svg
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
return <MindMap ref={ref} data={data} />;
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 监听变更
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
<MindMap
|
|
244
|
+
data={data}
|
|
245
|
+
onDataChange={(newData) => {
|
|
246
|
+
console.log("思维导图已更新:", newData);
|
|
247
|
+
}}
|
|
248
|
+
/>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 工具栏可见性
|
|
252
|
+
|
|
253
|
+
通过 `toolbar` prop 控制工具栏:
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
{
|
|
257
|
+
/* 隐藏所有工具栏按钮 */
|
|
258
|
+
}
|
|
259
|
+
<MindMap data={data} toolbar={false} />;
|
|
260
|
+
|
|
261
|
+
{
|
|
262
|
+
/* 隐藏缩放控件(文本模式和全屏按钮保持可见) */
|
|
263
|
+
}
|
|
264
|
+
<MindMap data={data} toolbar={{ zoom: false }} />;
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
工具栏包括缩放控件(左下角)和文本模式/全屏切换按钮(右下角)。`toolbar` prop 控制缩放控件的可见性;文本模式和全屏按钮始终可用。
|
|
268
|
+
|
|
269
|
+
### 移动端 / 触控支持
|
|
270
|
+
|
|
271
|
+
思维导图开箱即用地支持完整的触控操作:
|
|
272
|
+
|
|
273
|
+
- **单指在画布上** — 平移视图
|
|
274
|
+
- **单指在节点上** — 拖拽以重新排列兄弟节点
|
|
275
|
+
- **双指捏合** — 缩放(始终以思维导图内容为中心)
|
|
276
|
+
|
|
277
|
+
无需配置 — 触控支持始终与鼠标事件同时激活。
|
|
278
|
+
|
|
279
|
+
## 扩展语法
|
|
280
|
+
|
|
281
|
+
思维导图支持丰富的类 Markdown 语法。标记为 _(插件)_ 的功能需要启用对应插件(默认全部启用)。
|
|
282
|
+
|
|
283
|
+
### 行内格式化
|
|
284
|
+
|
|
285
|
+
在任意节点中格式化文本:
|
|
286
|
+
|
|
287
|
+
```
|
|
288
|
+
**加粗文本**
|
|
289
|
+
*斜体文本*
|
|
290
|
+
`行内代码`
|
|
291
|
+
~~删除线~~
|
|
292
|
+
==高亮==
|
|
293
|
+
[链接文本](https://example.com)
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### 任务状态
|
|
297
|
+
|
|
298
|
+
添加复选框以跟踪任务状态:
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
- [x] 已完成的任务
|
|
302
|
+
- [ ] 待办任务
|
|
303
|
+
- [-] 进行中的任务
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 备注
|
|
307
|
+
|
|
308
|
+
使用 `>` 为节点附加多行备注:
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
- 带有备注的节点
|
|
312
|
+
> 这是一行备注
|
|
313
|
+
> 可以跨越多行
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Frontmatter _(插件)_
|
|
317
|
+
|
|
318
|
+
在 Markdown 顶部设置默认选项:
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
---
|
|
322
|
+
direction: left
|
|
323
|
+
theme: dark
|
|
324
|
+
---
|
|
325
|
+
- 根节点
|
|
326
|
+
- 子节点
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
支持的字段:`direction`(`left` | `right` | `both`)、`theme`(`light` | `dark` | `auto`)。
|
|
330
|
+
|
|
331
|
+
### 虚线 _(插件)_
|
|
332
|
+
|
|
333
|
+
使用 `-.` 代替 `-` 以渲染带虚线边的节点:
|
|
334
|
+
|
|
335
|
+
```
|
|
336
|
+
- 实线边节点
|
|
337
|
+
-. 虚线边子节点
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### 折叠 / 可折叠节点 _(插件)_
|
|
341
|
+
|
|
342
|
+
使用 `+` 代替 `-` 使节点初始为折叠状态:
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
- 可见节点
|
|
346
|
+
+ 此节点初始折叠
|
|
347
|
+
- 隐藏的子节点
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 多行内容 _(插件)_
|
|
351
|
+
|
|
352
|
+
使用 `|` 为节点添加续行内容:
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
- 节点的第一行
|
|
356
|
+
| 第二行
|
|
357
|
+
| 第三行
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### 标签 _(插件)_
|
|
361
|
+
|
|
362
|
+
为节点添加标签以进行可视化标注:
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
- React #框架 #前端
|
|
366
|
+
- PostgreSQL #数据库
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### 跨链接 _(插件)_
|
|
370
|
+
|
|
371
|
+
在任意节点间绘制连线:
|
|
372
|
+
|
|
373
|
+
```
|
|
374
|
+
- 节点 A {#a}
|
|
375
|
+
- 子节点
|
|
376
|
+
- 节点 B {#b}
|
|
377
|
+
-> {#a} "引用"
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
- `{#id}` — 在节点上定义锚点
|
|
381
|
+
- `-> {#id}` — 实线跨链接到锚点
|
|
382
|
+
- `-> {#id} "标签"` — 带标签的跨链接
|
|
383
|
+
- `-.> {#id}` — 虚线跨链接
|
|
384
|
+
|
|
385
|
+
### LaTeX 数学公式 _(插件)_
|
|
386
|
+
|
|
387
|
+
渲染数学公式(需安装 [KaTeX](https://katex.org/)):
|
|
388
|
+
|
|
389
|
+
```
|
|
390
|
+
- 行内公式:$E = mc^2$
|
|
391
|
+
- 块级公式:$$\sum_{i=1}^{n} x_i$$
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## API 参考
|
|
395
|
+
|
|
396
|
+
### Props
|
|
397
|
+
|
|
398
|
+
| Prop | 类型 | 默认值 | 说明 |
|
|
399
|
+
| ------------------ | ------------------------------- | ------------ | ---------------------------------------------------- |
|
|
400
|
+
| `data` | `MindMapData \| MindMapData[]` | _必填_ | 树数据(单根或根数组) |
|
|
401
|
+
| `markdown` | `string` | - | Markdown 列表源(设置时覆盖 `data`) |
|
|
402
|
+
| `defaultDirection` | `'left' \| 'right' \| 'both'` | `'both'` | 初始布局方向 |
|
|
403
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | 颜色主题 |
|
|
404
|
+
| `locale` | `string` | _自动_ | UI 语言(自动检测,或 `'zh-CN'`、`'en-US'`、自定义) |
|
|
405
|
+
| `messages` | `Partial<MindMapMessages>` | - | 覆盖任意 UI 文本字符串 |
|
|
406
|
+
| `readonly` | `boolean` | `false` | 仅显示模式(不可编辑、不可创建) |
|
|
407
|
+
| `toolbar` | `boolean \| ToolbarConfig` | `true` | 显示/隐藏缩放控件 |
|
|
408
|
+
| `plugins` | `MindMapPlugin[]` | `allPlugins` | 启用的扩展语法插件 |
|
|
409
|
+
| `onDataChange` | `(data: MindMapData[]) => void` | - | 用户交互修改树时调用 |
|
|
410
|
+
|
|
411
|
+
### ToolbarConfig
|
|
412
|
+
|
|
413
|
+
```ts
|
|
414
|
+
interface ToolbarConfig {
|
|
415
|
+
zoom?: boolean; // 显示缩放控件(默认:true)
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Ref 方法
|
|
420
|
+
|
|
421
|
+
| 方法 | 返回值 | 说明 |
|
|
422
|
+
| ------------------- | --------------- | ---------------------------- |
|
|
423
|
+
| `exportToSVG()` | `string` | 将思维导图导出为 SVG 字符串 |
|
|
424
|
+
| `exportToPNG()` | `Promise<Blob>` | 渲染高 DPI PNG Blob |
|
|
425
|
+
| `exportToOutline()` | `string` | 将树序列化为 Markdown 列表 |
|
|
426
|
+
| `getData()` | `MindMapData[]` | 返回当前树数据 |
|
|
427
|
+
| `setData(data)` | `void` | 替换树数据 |
|
|
428
|
+
| `setMarkdown(md)` | `void` | 解析 Markdown 并替换树 |
|
|
429
|
+
| `fitView()` | `void` | 重置缩放和平移以适应所有节点 |
|
|
430
|
+
| `setDirection(dir)` | `void` | 更改布局方向 |
|
|
431
|
+
|
|
432
|
+
### 数据结构
|
|
433
|
+
|
|
434
|
+
```ts
|
|
435
|
+
interface MindMapData {
|
|
436
|
+
id: string;
|
|
437
|
+
text: string;
|
|
438
|
+
children?: MindMapData[];
|
|
439
|
+
remark?: string; // 多行备注
|
|
440
|
+
taskStatus?: "todo" | "doing" | "done";
|
|
441
|
+
// 插件扩展字段(由对应插件填充)
|
|
442
|
+
dottedLine?: boolean; // 虚线插件
|
|
443
|
+
multiLineContent?: string[]; // 多行插件
|
|
444
|
+
tags?: string[]; // 标签插件
|
|
445
|
+
anchorId?: string; // 跨链接插件
|
|
446
|
+
crossLinks?: CrossLink[]; // 跨链接插件
|
|
447
|
+
collapsed?: boolean; // 折叠插件
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
interface CrossLink {
|
|
451
|
+
targetAnchorId: string;
|
|
452
|
+
label?: string;
|
|
453
|
+
dotted?: boolean;
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
## 键盘快捷键
|
|
458
|
+
|
|
459
|
+
| 快捷键 | 操作 |
|
|
460
|
+
| ---------------------- | ------------------------ |
|
|
461
|
+
| `Enter` | 在选中节点下创建子节点 |
|
|
462
|
+
| `Delete` / `Backspace` | 删除选中的节点 |
|
|
463
|
+
| `双击` | 编辑节点文本 |
|
|
464
|
+
| `Cmd/Ctrl + C` | 复制子树 |
|
|
465
|
+
| `Cmd/Ctrl + X` | 剪切子树 |
|
|
466
|
+
| `Cmd/Ctrl + V` | 粘贴子树作为子节点 |
|
|
467
|
+
| `Escape` | 关闭右键菜单 / 对话框 |
|
|
468
|
+
| `Shift + +` | 放大 |
|
|
469
|
+
| `Shift + -` | 缩小 |
|
|
470
|
+
| `Shift + 0` | 重置视图(适应所有节点) |
|
|
471
|
+
| `Shift + L` | 左侧布局 |
|
|
472
|
+
| `Shift + R` | 右侧布局 |
|
|
473
|
+
| `Shift + M` | 两侧均衡布局 |
|
|
474
|
+
| 滚轮 | 放大 / 缩小 |
|
|
475
|
+
| 在画布上点击拖拽 | 平移 |
|
|
476
|
+
| 在节点上点击拖拽 | 在兄弟节点间重新排列 |
|
|
477
|
+
| 右键 | 打开右键菜单 |
|
|
478
|
+
|
|
479
|
+
## 工具函数
|
|
480
|
+
|
|
481
|
+
以下函数也对外导出,适用于高级用例:
|
|
482
|
+
|
|
483
|
+
```ts
|
|
484
|
+
import {
|
|
485
|
+
// Markdown 解析
|
|
486
|
+
parseMarkdownList, // md 字符串 → 单个 MindMapData
|
|
487
|
+
toMarkdownList, // 单个 MindMapData → md 字符串
|
|
488
|
+
parseMarkdownMultiRoot, // md 字符串 → MindMapData[]
|
|
489
|
+
toMarkdownMultiRoot, // MindMapData[] → md 字符串
|
|
490
|
+
parseMarkdownWithFrontMatter, // md 字符串 → MindMapData[](支持插件)
|
|
491
|
+
|
|
492
|
+
// 行内 Markdown
|
|
493
|
+
parseInlineMarkdown, // 文本 → 行内标记
|
|
494
|
+
stripInlineMarkdown, // 移除文本中的 Markdown 格式
|
|
495
|
+
|
|
496
|
+
// 导出
|
|
497
|
+
buildExportSVG, // 程序化 SVG 生成
|
|
498
|
+
exportToPNG, // SVG 字符串 → PNG Blob
|
|
499
|
+
|
|
500
|
+
// 国际化
|
|
501
|
+
resolveMessages, // 构建完整的 MindMapMessages 对象
|
|
502
|
+
detectLocale, // 检测浏览器语言
|
|
503
|
+
|
|
504
|
+
// 插件
|
|
505
|
+
allPlugins, // 全部 7 个内置插件
|
|
506
|
+
frontMatterPlugin,
|
|
507
|
+
dottedLinePlugin,
|
|
508
|
+
foldingPlugin,
|
|
509
|
+
multiLinePlugin,
|
|
510
|
+
tagsPlugin,
|
|
511
|
+
crossLinkPlugin,
|
|
512
|
+
latexPlugin,
|
|
513
|
+
} from "@xiangfa/mindmap";
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
## 开发
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
git clone https://github.com/u14app/mindmap.git
|
|
520
|
+
cd mindmap
|
|
521
|
+
pnpm install
|
|
522
|
+
pnpm dev # 启动开发服务器
|
|
523
|
+
pnpm build # 类型检查并构建
|
|
524
|
+
pnpm build:lib # 构建为库
|
|
525
|
+
pnpm lint # 运行代码检查
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
## 贡献
|
|
529
|
+
|
|
530
|
+
欢迎贡献!请在提交 Pull Request 之前阅读我们的[贡献指南](CONTRIBUTING.md)。
|
|
531
|
+
|
|
532
|
+
## 许可证
|
|
533
|
+
|
|
534
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LayoutDirection } from '../types';
|
|
2
|
+
import type { ThemeColors } from '../utils/theme';
|
|
3
|
+
import type { MindMapMessages } from '../utils/i18n';
|
|
4
|
+
export interface MindMapContextMenuProps {
|
|
5
|
+
position: {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
9
|
+
theme: ThemeColors;
|
|
10
|
+
messages: MindMapMessages;
|
|
11
|
+
direction: LayoutDirection;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
onNewRootNode: () => void;
|
|
14
|
+
onExportSVG: () => void;
|
|
15
|
+
onExportPNG: () => void;
|
|
16
|
+
onExportMarkdown: () => void;
|
|
17
|
+
onDirectionChange: (dir: LayoutDirection) => void;
|
|
18
|
+
onClose: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function MindMapContextMenu({ position, theme, messages, readonly: readonlyProp, onNewRootNode, onExportSVG, onExportPNG, onExportMarkdown, onDirectionChange, onClose, }: MindMapContextMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ThemeColors } from '../utils/theme';
|
|
2
|
+
import type { MindMapMessages } from '../utils/i18n';
|
|
3
|
+
export interface MindMapControlsProps {
|
|
4
|
+
zoom: number;
|
|
5
|
+
theme: ThemeColors;
|
|
6
|
+
messages: MindMapMessages;
|
|
7
|
+
showZoom?: boolean;
|
|
8
|
+
mode: 'view' | 'text';
|
|
9
|
+
isFullscreen: boolean;
|
|
10
|
+
onZoomIn: () => void;
|
|
11
|
+
onZoomOut: () => void;
|
|
12
|
+
onAutoFit: () => void;
|
|
13
|
+
onModeToggle: () => void;
|
|
14
|
+
onFullscreenToggle: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function MindMapControls({ zoom, theme, messages, showZoom, mode, isFullscreen, onZoomIn, onZoomOut, onAutoFit, onModeToggle, onFullscreenToggle, }: MindMapControlsProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LayoutNode, LayoutDirection } from "../types";
|
|
2
|
+
import type { ThemeColors } from "../utils/theme";
|
|
3
|
+
import type { MindMapPlugin } from "../plugins/types";
|
|
4
|
+
export interface MindMapNodeProps {
|
|
5
|
+
node: LayoutNode;
|
|
6
|
+
offset?: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
};
|
|
10
|
+
isEditing: boolean;
|
|
11
|
+
isPendingEdit: boolean;
|
|
12
|
+
isSelected: boolean;
|
|
13
|
+
isNew: boolean;
|
|
14
|
+
isGhost?: boolean;
|
|
15
|
+
animClass: string;
|
|
16
|
+
editText: string;
|
|
17
|
+
theme: ThemeColors;
|
|
18
|
+
direction: LayoutDirection;
|
|
19
|
+
readonly?: boolean;
|
|
20
|
+
plugins?: MindMapPlugin[];
|
|
21
|
+
onMouseDown: (e: React.MouseEvent, nodeId: string) => void;
|
|
22
|
+
onClick: (e: React.MouseEvent, nodeId: string) => void;
|
|
23
|
+
onDoubleClick: (e: React.MouseEvent, nodeId: string, text: string) => void;
|
|
24
|
+
onEditChange: (text: string) => void;
|
|
25
|
+
onEditCommit: () => void;
|
|
26
|
+
onEditCancel: () => void;
|
|
27
|
+
onAddChild: (e: React.MouseEvent, parentId: string, side?: "left" | "right") => void;
|
|
28
|
+
onRemarkHover?: (nodeId: string | null) => void;
|
|
29
|
+
onFoldToggle?: (nodeId: string) => void;
|
|
30
|
+
expandDelay?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function MindMapNode({ node, offset, isEditing, isPendingEdit, isSelected, isNew, isGhost, animClass, editText, theme, direction, readonly: readonlyProp, plugins, onMouseDown, onClick, onDoubleClick, onEditChange, onEditCommit, onEditCancel, onAddChild, onRemarkHover, onFoldToggle, expandDelay, }: MindMapNodeProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface IconProps {
|
|
2
|
+
size?: number;
|
|
3
|
+
className?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function IconPlus({ size, className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare function IconMinus({ size, className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function IconClose({ size, className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|