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/ru.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. Вы можете использовать её с любым frontend-фреймворком.
|
|
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
|
+
- [Playground](#playground)
|
|
56
|
+
- [Документация](#документация)
|
|
57
|
+
- [Использование](#использование)
|
|
58
|
+
- [Установка](#установка)
|
|
59
|
+
- [NPM](#npm)
|
|
60
|
+
- [Script tag](#script-tag)
|
|
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
|
+
### Playground
|
|
85
|
+
|
|
86
|
+
- Vanilla 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 tag
|
|
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
|
+
**Breaking Change** since 1.0.0, `data` should be passed to `init()`, not `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', // or HTMLDivElement
|
|
135
|
+
direction: MindElixir.LEFT,
|
|
136
|
+
draggable: true, // default true
|
|
137
|
+
contextMenu: true, // default true
|
|
138
|
+
toolBar: true, // default true
|
|
139
|
+
nodeMenu: true, // default true
|
|
140
|
+
keypress: true, // default true
|
|
141
|
+
locale: 'en', // [zh_CN,zh_TW,en,ja,pt,ru] waiting for PRs
|
|
142
|
+
overflowHidden: false, // default false
|
|
143
|
+
mainLinkStyle: 2, // [1,2] default 1
|
|
144
|
+
mouseSelectionButton: 0, // 0 for left button, 2 for right button, default 0
|
|
145
|
+
contextMenuOption: {
|
|
146
|
+
focus: true,
|
|
147
|
+
link: true,
|
|
148
|
+
extend: [
|
|
149
|
+
{
|
|
150
|
+
name: 'Node edit',
|
|
151
|
+
onclick: () => {
|
|
152
|
+
alert('extend menu')
|
|
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) // install your plugin
|
|
171
|
+
|
|
172
|
+
// create new map data
|
|
173
|
+
const data = MindElixir.new('new topic')
|
|
174
|
+
// or `example`
|
|
175
|
+
// or the data return from `.getData()`
|
|
176
|
+
mind.init(data)
|
|
177
|
+
|
|
178
|
+
// get a node
|
|
179
|
+
MindElixir.E('node-id')
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Структура данных
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
// whole node data structure up to now
|
|
186
|
+
const nodeData = {
|
|
187
|
+
topic: 'node topic',
|
|
188
|
+
id: 'bd1c24420cd2c2f5',
|
|
189
|
+
style: { fontSize: '32', color: '#3298db', background: '#ecf0f1' },
|
|
190
|
+
expanded: true,
|
|
191
|
+
parent: null,
|
|
192
|
+
tags: ['Tag'],
|
|
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', // required
|
|
197
|
+
// you need to query the height and width of the image and calculate the appropriate value to display the image
|
|
198
|
+
height: 90, // required
|
|
199
|
+
width: 90, // required
|
|
200
|
+
},
|
|
201
|
+
children: [
|
|
202
|
+
{
|
|
203
|
+
topic: 'child',
|
|
204
|
+
id: 'xxxx',
|
|
205
|
+
// ...
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Обработка событий
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
mind.bus.addListener('operation', operation => {
|
|
215
|
+
console.log(operation)
|
|
216
|
+
// return {
|
|
217
|
+
// name: action name,
|
|
218
|
+
// obj: target object
|
|
219
|
+
// }
|
|
220
|
+
|
|
221
|
+
// name: [insertSibling|addChild|removeNode|beginEdit|finishEdit]
|
|
222
|
+
// obj: target
|
|
223
|
+
|
|
224
|
+
// name: moveNode
|
|
225
|
+
// obj: {from:target1,to:target2}
|
|
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
|
+
// data export
|
|
242
|
+
const data = mind.getData() // javascript object, see src/example.js
|
|
243
|
+
mind.getDataString() // stringify object
|
|
244
|
+
|
|
245
|
+
// data import
|
|
246
|
+
// initiate
|
|
247
|
+
let mind = new MindElixir(options)
|
|
248
|
+
mind.init(data)
|
|
249
|
+
// data update
|
|
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 instance */
|
|
284
|
+
}
|
|
285
|
+
const downloadPng = async () => {
|
|
286
|
+
const blob = await mind.exportPng() // Get a 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
|
+
Install `@ssshooter/modern-screenshot`, then:
|
|
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
|
+
// main lines color palette
|
|
332
|
+
palette: ['#848FA0', '#748BE9', '#D2F9FE', '#4145A5', '#789AFA', '#706CF4', '#EF987F', '#775DD5', '#FCEECF', '#DA7FBC'],
|
|
333
|
+
// overwrite css variables
|
|
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
|
+
// all variables see /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
|
+
Be aware that Mind Elixir will not observe the change of `prefers-color-scheme`. Please change the theme **manually** when the scheme changes.
|
|
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
|
+
PRs are welcome!
|
|
394
|
+
|
|
395
|
+
## Разработка
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
pnpm i
|
|
399
|
+
pnpm dev
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Test generated files with `dev.dist.ts`:
|
|
403
|
+
|
|
404
|
+
```
|
|
405
|
+
pnpm build
|
|
406
|
+
pnpm link ./
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Update docs:
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
# Install api-extractor
|
|
413
|
+
pnpm install -g @microsoft/api-extractor
|
|
414
|
+
# Maintain /src/docs.ts
|
|
415
|
+
# Generate docs
|
|
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>
|