mind-elixir 5.2.0-beta.6 → 5.2.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/dist/MindElixir.iife.js +4 -4
- package/dist/MindElixir.js +273 -284
- package/dist/MindElixirLite.iife.js +4 -4
- package/dist/MindElixirLite.js +175 -186
- package/dist/style.css +1 -1
- package/dist/types/summary.d.ts +1 -1
- package/dist/types/types/dom.d.ts +0 -1
- package/package.json +106 -107
- package/readme/es.md +430 -0
- package/readme/fr.md +430 -0
- package/readme/ja.md +429 -0
- package/readme/ko.md +430 -0
- package/readme/pt.md +430 -0
- package/readme/ru.md +430 -0
- package/readme/zh.md +430 -0
package/readme/zh.md
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://docs.mind-elixir.com" target="_blank" rel="noopener noreferrer">
|
|
3
|
+
<img width="150" src="https://raw.githubusercontent.com/ssshooter/mind-elixir-core/master/images/logo2.png" alt="mindelixir logo2">
|
|
4
|
+
</a>
|
|
5
|
+
<h1 align="center">Mind Elixir</h1>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://www.npmjs.com/package/mind-elixir">
|
|
10
|
+
<img src="https://img.shields.io/npm/v/mind-elixir" alt="version">
|
|
11
|
+
</a>
|
|
12
|
+
<a href="https://github.com/ssshooter/mind-elixir-core/blob/master/LICENSE">
|
|
13
|
+
<img src="https://img.shields.io/npm/l/mind-elixir" alt="license">
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://app.codacy.com/gh/ssshooter/mind-elixir-core?utm_source=github.com&utm_medium=referral&utm_content=ssshooter/mind-elixir-core&utm_campaign=Badge_Grade_Settings">
|
|
16
|
+
<img src="https://api.codacy.com/project/badge/Grade/09fadec5bf094886b30cea6aabf3a88b" alt="code quality">
|
|
17
|
+
</a>
|
|
18
|
+
<a href="https://bundlephobia.com/result?p=mind-elixir">
|
|
19
|
+
<img src="https://badgen.net/bundlephobia/dependency-count/mind-elixir" alt="dependency-count">
|
|
20
|
+
</a>
|
|
21
|
+
<a href="https://packagephobia.com/result?p=mind-elixir">
|
|
22
|
+
<img src="https://packagephobia.com/badge?p=mind-elixir" alt="package size">
|
|
23
|
+
</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
[English](/readme.md) |
|
|
27
|
+
[中文](/readme/zh.md) |
|
|
28
|
+
[Español](/readme/es.md) |
|
|
29
|
+
[Français](/readme/fr.md) |
|
|
30
|
+
[Português](/readme/pt.md) |
|
|
31
|
+
[Русский](/readme/ru.md) |
|
|
32
|
+
[日本語](/readme/ja.md) |
|
|
33
|
+
[한국어](/readme/ko.md)
|
|
34
|
+
|
|
35
|
+
Mind elixir 是一个开源的 JavaScript 思维导图核心。你可以在任何前端框架中使用它。
|
|
36
|
+
|
|
37
|
+
特点:
|
|
38
|
+
|
|
39
|
+
- 轻量级
|
|
40
|
+
- 高性能
|
|
41
|
+
- 框架无关
|
|
42
|
+
- 插件化
|
|
43
|
+
- 内置拖放 / 节点编辑插件
|
|
44
|
+
- 导出为 SVG / PNG / Html
|
|
45
|
+
- 总结节点
|
|
46
|
+
- 支持批量操作
|
|
47
|
+
- 撤销 / 重做
|
|
48
|
+
- 高效快捷键
|
|
49
|
+
- 轻松使用 CSS 变量样式化节点
|
|
50
|
+
|
|
51
|
+
<details>
|
|
52
|
+
<summary>目录</summary>
|
|
53
|
+
|
|
54
|
+
- [立即试用](#立即试用)
|
|
55
|
+
- [演示](#演示)
|
|
56
|
+
- [文档](#文档)
|
|
57
|
+
- [使用](#使用)
|
|
58
|
+
- [安装](#安装)
|
|
59
|
+
- [NPM](#npm)
|
|
60
|
+
- [Script 标签](#script-标签)
|
|
61
|
+
- [初始化](#初始化)
|
|
62
|
+
- [数据结构](#数据结构)
|
|
63
|
+
- [事件处理](#事件处理)
|
|
64
|
+
- [数据导出和导入](#数据导出和导入)
|
|
65
|
+
- [操作守卫](#操作守卫)
|
|
66
|
+
- [导出为图片](#导出为图片)
|
|
67
|
+
- [方案 1](#方案-1)
|
|
68
|
+
- [方案 2](#方案-2)
|
|
69
|
+
- [主题](#主题)
|
|
70
|
+
- [快捷键](#快捷键)
|
|
71
|
+
- [生态](#生态)
|
|
72
|
+
- [开发](#开发)
|
|
73
|
+
- [感谢](#感谢)
|
|
74
|
+
- [贡献者](#贡献者)
|
|
75
|
+
|
|
76
|
+
</details>
|
|
77
|
+
|
|
78
|
+
## 立即试用
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
https://mind-elixir.com/
|
|
83
|
+
|
|
84
|
+
### 演示
|
|
85
|
+
|
|
86
|
+
- 原生 JS - https://codepen.io/ssshooter/pen/OJrJowN
|
|
87
|
+
- React - https://codesandbox.io/s/mind-elixir-3-x-react-18-x-vy9fcq
|
|
88
|
+
- Vue3 - https://codesandbox.io/s/mind-elixir-3-x-vue3-lth484
|
|
89
|
+
- Vue2 - https://codesandbox.io/s/mind-elixir-3-x-vue-2-x-5kdfjp
|
|
90
|
+
|
|
91
|
+
## 文档
|
|
92
|
+
|
|
93
|
+
https://docs.mind-elixir.com/
|
|
94
|
+
|
|
95
|
+
## 使用
|
|
96
|
+
|
|
97
|
+
### 安装
|
|
98
|
+
|
|
99
|
+
#### NPM
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm i mind-elixir -S
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
import MindElixir from 'mind-elixir'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Script 标签
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/mind-elixir/dist/MindElixir.js"></script>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 初始化
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<div id="map"></div>
|
|
119
|
+
<style>
|
|
120
|
+
#map {
|
|
121
|
+
height: 500px;
|
|
122
|
+
width: 100%;
|
|
123
|
+
}
|
|
124
|
+
</style>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**重大变更** 自 1.0.0 起,`data` 应传递给 `init()`,而不是 `options`。
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
import MindElixir from 'mind-elixir'
|
|
131
|
+
import example from 'mind-elixir/dist/example1'
|
|
132
|
+
|
|
133
|
+
let options = {
|
|
134
|
+
el: '#map', // 或 HTMLDivElement
|
|
135
|
+
direction: MindElixir.LEFT,
|
|
136
|
+
draggable: true, // 默认 true
|
|
137
|
+
contextMenu: true, // 默认 true
|
|
138
|
+
toolBar: true, // 默认 true
|
|
139
|
+
nodeMenu: true, // 默认 true
|
|
140
|
+
keypress: true, // 默认 true
|
|
141
|
+
locale: 'en', // [zh_CN,zh_TW,en,ja,pt,ru] 等待 PRs
|
|
142
|
+
overflowHidden: false, // 默认 false
|
|
143
|
+
mainLinkStyle: 2, // [1,2] 默认 1
|
|
144
|
+
mouseSelectionButton: 0, // 0 为左键,2 为右键,默认 0
|
|
145
|
+
contextMenuOption: {
|
|
146
|
+
focus: true,
|
|
147
|
+
link: true,
|
|
148
|
+
extend: [
|
|
149
|
+
{
|
|
150
|
+
name: '节点编辑',
|
|
151
|
+
onclick: () => {
|
|
152
|
+
alert('扩展菜单')
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
before: {
|
|
158
|
+
insertSibling(el, obj) {
|
|
159
|
+
return true
|
|
160
|
+
},
|
|
161
|
+
async addChild(el, obj) {
|
|
162
|
+
await sleep()
|
|
163
|
+
return true
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
let mind = new MindElixir(options)
|
|
169
|
+
|
|
170
|
+
mind.install(plugin) // 安装你的插件
|
|
171
|
+
|
|
172
|
+
// 创建新的地图数据
|
|
173
|
+
const data = MindElixir.new('new topic')
|
|
174
|
+
// 或 `example`
|
|
175
|
+
// 或从 `.getData()` 返回的数据
|
|
176
|
+
mind.init(data)
|
|
177
|
+
|
|
178
|
+
// 获取一个节点
|
|
179
|
+
MindElixir.E('node-id')
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 数据结构
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
// 到目前为止的整个节点数据结构
|
|
186
|
+
const nodeData = {
|
|
187
|
+
topic: '节点主题',
|
|
188
|
+
id: 'bd1c24420cd2c2f5',
|
|
189
|
+
style: { fontSize: '32', color: '#3298db', background: '#ecf0f1' },
|
|
190
|
+
expanded: true,
|
|
191
|
+
parent: null,
|
|
192
|
+
tags: ['标签'],
|
|
193
|
+
icons: ['😀'],
|
|
194
|
+
hyperLink: 'https://github.com/ssshooter/mind-elixir-core',
|
|
195
|
+
image: {
|
|
196
|
+
url: 'https://raw.githubusercontent.com/ssshooter/mind-elixir-core/master/images/logo2.png', // 必填
|
|
197
|
+
// 你需要查询图片的高度和宽度,并计算显示图片的适当值
|
|
198
|
+
height: 90, // 必填
|
|
199
|
+
width: 90, // 必填
|
|
200
|
+
},
|
|
201
|
+
children: [
|
|
202
|
+
{
|
|
203
|
+
topic: '子节点',
|
|
204
|
+
id: 'xxxx',
|
|
205
|
+
// ...
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 事件处理
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
mind.bus.addListener('operation', operation => {
|
|
215
|
+
console.log(operation)
|
|
216
|
+
// 返回 {
|
|
217
|
+
// name: 操作名称,
|
|
218
|
+
// obj: 目标对象
|
|
219
|
+
// }
|
|
220
|
+
|
|
221
|
+
// name: [insertSibling|addChild|removeNode|beginEdit|finishEdit]
|
|
222
|
+
// obj: 目标
|
|
223
|
+
|
|
224
|
+
// name: moveNode
|
|
225
|
+
// obj: {from:目标1,to:目标2}
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
mind.bus.addListener('selectNodes', nodes => {
|
|
230
|
+
console.log(nodes)
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
mind.bus.addListener('expandNode', node => {
|
|
234
|
+
console.log('expandNode: ', node)
|
|
235
|
+
})
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 数据导出和导入
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// 数据导出
|
|
242
|
+
const data = mind.getData() // JavaScript 对象,见 src/example.js
|
|
243
|
+
mind.getDataString() // 字符串化对象
|
|
244
|
+
|
|
245
|
+
// 数据导入
|
|
246
|
+
// 初始化
|
|
247
|
+
let mind = new MindElixir(options)
|
|
248
|
+
mind.init(data)
|
|
249
|
+
// 数据更新
|
|
250
|
+
mind.refresh(data)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 操作守卫
|
|
254
|
+
|
|
255
|
+
```javascript
|
|
256
|
+
let mind = new MindElixir({
|
|
257
|
+
// ...
|
|
258
|
+
before: {
|
|
259
|
+
insertSibling(el, obj) {
|
|
260
|
+
console.log(el, obj)
|
|
261
|
+
if (this.currentNode.nodeObj.parent.root) {
|
|
262
|
+
return false
|
|
263
|
+
}
|
|
264
|
+
return true
|
|
265
|
+
},
|
|
266
|
+
async addChild(el, obj) {
|
|
267
|
+
await sleep()
|
|
268
|
+
if (this.currentNode.nodeObj.parent.root) {
|
|
269
|
+
return false
|
|
270
|
+
}
|
|
271
|
+
return true
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
})
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## 导出为图片
|
|
278
|
+
|
|
279
|
+
### 方案 1
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
const mind = {
|
|
283
|
+
/** mind elixir 实例 */
|
|
284
|
+
}
|
|
285
|
+
const downloadPng = async () => {
|
|
286
|
+
const blob = await mind.exportPng() // 获取 Blob!
|
|
287
|
+
if (!blob) return
|
|
288
|
+
const url = URL.createObjectURL(blob)
|
|
289
|
+
const a = document.createElement('a')
|
|
290
|
+
a.href = url
|
|
291
|
+
a.download = 'filename.png'
|
|
292
|
+
a.click()
|
|
293
|
+
URL.revokeObjectURL(url)
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### 方案 2
|
|
298
|
+
|
|
299
|
+
安装 `@ssshooter/modern-screenshot`,然后:
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
import { domToPng } from '@ssshooter/modern-screenshot'
|
|
303
|
+
|
|
304
|
+
const download = async () => {
|
|
305
|
+
const dataUrl = await domToPng(mind.nodes, {
|
|
306
|
+
onCloneNode: node => {
|
|
307
|
+
const n = node as HTMLDivElement
|
|
308
|
+
n.style.position = ''
|
|
309
|
+
n.style.top = ''
|
|
310
|
+
n.style.left = ''
|
|
311
|
+
n.style.bottom = ''
|
|
312
|
+
n.style.right = ''
|
|
313
|
+
},
|
|
314
|
+
padding: 300,
|
|
315
|
+
quality: 1,
|
|
316
|
+
})
|
|
317
|
+
const link = document.createElement('a')
|
|
318
|
+
link.download = 'screenshot.png'
|
|
319
|
+
link.href = dataUrl
|
|
320
|
+
link.click()
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## 主题
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
const options = {
|
|
328
|
+
// ...
|
|
329
|
+
theme: {
|
|
330
|
+
name: 'Dark',
|
|
331
|
+
// 主线颜色调色板
|
|
332
|
+
palette: ['#848FA0', '#748BE9', '#D2F9FE', '#4145A5', '#789AFA', '#706CF4', '#EF987F', '#775DD5', '#FCEECF', '#DA7FBC'],
|
|
333
|
+
// 覆盖 CSS 变量
|
|
334
|
+
cssVar: {
|
|
335
|
+
'--main-color': '#ffffff',
|
|
336
|
+
'--main-bgcolor': '#4c4f69',
|
|
337
|
+
'--color': '#cccccc',
|
|
338
|
+
'--bgcolor': '#252526',
|
|
339
|
+
'--panel-color': '255, 255, 255',
|
|
340
|
+
'--panel-bgcolor': '45, 55, 72',
|
|
341
|
+
},
|
|
342
|
+
// 所有变量见 /src/index.less
|
|
343
|
+
},
|
|
344
|
+
// ...
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// ...
|
|
348
|
+
|
|
349
|
+
mind.changeTheme({
|
|
350
|
+
name: 'Latte',
|
|
351
|
+
palette: ['#dd7878', '#ea76cb', '#8839ef', '#e64553', '#fe640b', '#df8e1d', '#40a02b', '#209fb5', '#1e66f5', '#7287fd'],
|
|
352
|
+
cssVar: {
|
|
353
|
+
'--main-color': '#444446',
|
|
354
|
+
'--main-bgcolor': '#ffffff',
|
|
355
|
+
'--color': '#777777',
|
|
356
|
+
'--bgcolor': '#f6f6f6',
|
|
357
|
+
},
|
|
358
|
+
})
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
请注意,Mind Elixir 不会观察 `prefers-color-scheme` 的变化。当方案变化时,请**手动**更改主题。
|
|
362
|
+
|
|
363
|
+
## 快捷键
|
|
364
|
+
|
|
365
|
+
| 快捷键 | 功能 |
|
|
366
|
+
| ------------------ | -------------------------------- |
|
|
367
|
+
| Enter | 插入兄弟节点 |
|
|
368
|
+
| Tab | 插入子节点 |
|
|
369
|
+
| F1 | 居中地图 |
|
|
370
|
+
| F2 | 开始编辑当前节点 |
|
|
371
|
+
| ↑ | 选择上一个兄弟节点 |
|
|
372
|
+
| ↓ | 选择下一个兄弟节点 |
|
|
373
|
+
| ← / → | 选择父节点或第一个子节点 |
|
|
374
|
+
| PageUp / Alt + ↑ | 上移节点 |
|
|
375
|
+
| PageDown / Alt + ↓ | 下移节点 |
|
|
376
|
+
| Ctrl + ↑ | 更改布局模式为侧面 |
|
|
377
|
+
| Ctrl + ← | 更改布局模式为左侧 |
|
|
378
|
+
| Ctrl + → | 更改布局模式为右侧 |
|
|
379
|
+
| Ctrl + C | 复制当前节点 |
|
|
380
|
+
| Ctrl + V | 粘贴复制的节点 |
|
|
381
|
+
| Ctrl + "+" | 放大思维导图 |
|
|
382
|
+
| Ctrl + "-" | 缩小思维导图 |
|
|
383
|
+
| Ctrl + 0 | 重置缩放级别 |
|
|
384
|
+
|
|
385
|
+
## 生态
|
|
386
|
+
|
|
387
|
+
- [@mind-elixir/node-menu](https://github.com/ssshooter/node-menu)
|
|
388
|
+
- [@mind-elixir/node-menu-neo](https://github.com/ssshooter/node-menu-neo)
|
|
389
|
+
- [@mind-elixir/export-xmind](https://github.com/ssshooter/export-xmind)
|
|
390
|
+
- [@mind-elixir/export-html](https://github.com/ssshooter/export-html)
|
|
391
|
+
- [mind-elixir-react](https://github.com/ssshooter/mind-elixir-react)
|
|
392
|
+
|
|
393
|
+
欢迎 PR!
|
|
394
|
+
|
|
395
|
+
## 开发
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
pnpm i
|
|
399
|
+
pnpm dev
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
使用 `dev.dist.ts` 测试生成的文件:
|
|
403
|
+
|
|
404
|
+
```
|
|
405
|
+
pnpm build
|
|
406
|
+
pnpm link ./
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
更新文档:
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
# 安装 api-extractor
|
|
413
|
+
pnpm install -g @microsoft/api-extractor
|
|
414
|
+
# 维护 /src/docs.ts
|
|
415
|
+
# 生成文档
|
|
416
|
+
pnpm doc
|
|
417
|
+
pnpm doc:md
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## 感谢
|
|
421
|
+
|
|
422
|
+
- [@viselect/vanilla](https://github.com/simonwep/selection/tree/master/packages/vanilla)
|
|
423
|
+
|
|
424
|
+
## 贡献者
|
|
425
|
+
|
|
426
|
+
感谢你们对 Mind Elixir 的贡献!你们的支持和奉献使这个项目变得更好。
|
|
427
|
+
|
|
428
|
+
<a href="https://github.com/SSShooter/mind-elixir-core/graphs/contributors">
|
|
429
|
+
<img src="https://contrib.rocks/image?repo=SSShooter/mind-elixir-core&columns=6" />
|
|
430
|
+
</a>
|