UNPKG

7.24 kBMarkdownView Raw
1<p align="center">
2 <a href="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[中文 README](https://github.com/ssshooter/mind-elixir-core/blob/master/readme.cn.md)
27
28Mind elixir is a free open source mind map core.
29
30- Zero dependency
31- High performance
32- Lightweight
33- Framework agnostic
34- Pluginable
35- Build-in drag and drop / node edit plugin
36- Styling your node with CSS
37
38<details>
39<summary>Table of Contents</summary>
40
41- [Doc](#doc)
42- [Try now](#try-now)
43 - [Playground](#playground)
44 - [Vanilla JS](#vanilla-js)
45 - [Use with React](#use-with-react)
46 - [Use with Vue](#use-with-vue)
47 - [Use with Vue3](#use-with-vue3)
48- [Usage](#usage)
49 - [Install](#install)
50 - [NPM](#npm)
51 - [Script tag](#script-tag)
52 - [HTML structure](#html-structure)
53 - [Init](#init)
54 - [Data Structure](#data-structure)
55 - [Event Handling](#event-handling)
56 - [Data Export And Import](#data-export-and-import)
57 - [Operation Guards](#operation-guards)
58- [Theme](#theme)
59- [Not only core](#not-only-core)
60- [Development](#development)
61
62</details>
63
64## Doc
65
66https://doc.mind-elixir.com/
67
68## Try now
69
70![mindelixir](https://raw.githubusercontent.com/ssshooter/mind-elixir-core/master/images/screenshot2.png)
71
72https://mind-elixir.com/
73
74### Playground
75
76#### Vanilla JS
77
78https://codepen.io/ssshooter/pen/rNqGpwW
79
80#### Use with React
81
82https://codesandbox.io/s/mind-elixir-2-x-react-q9glxt
83
84#### Use with Vue
85
86https://codesandbox.io/s/mind-elixir-vue-nqjjl
87
88#### Use with Vue3
89
90https://codesandbox.io/s/mind-elixir-vue3-dtcq6u
91
92## Usage
93
94### Install
95
96#### NPM
97
98```bash
99npm i mind-elixir -S
100```
101
102```javascript
103import MindElixir, { E } from 'mind-elixir'
104```
105
106#### Script tag
107
108```html
109<script src="https://cdn.jsdelivr.net/npm/mind-elixir/dist/MindElixir.js"></script>
110```
111
112### HTML structure
113
114```html
115<div id="map"></div>
116<style>
117 #map {
118 height: 500px;
119 width: 100%;
120 }
121</style>
122```
123
124### Init
125
126**Breaking Change** since 1.0.0, `data` should be passed to `init()`, not `options`.
127
128```javascript
129import MindElixir, { E } from 'mind-elixir'
130import example from 'mind-elixir/dist/example1'
131
132let options = {
133 el: '#map', // or HTMLDivElement
134 direction: MindElixir.LEFT,
135 draggable: true, // default true
136 contextMenu: true, // default true
137 toolBar: true, // default true
138 nodeMenu: true, // default true
139 keypress: true, // default true
140 locale: 'en', // [zh_CN,zh_TW,en,ja,pt,ru] waiting for PRs
141 overflowHidden: false, // default false
142 mainLinkStyle: 2, // [1,2] default 1
143 mainNodeVerticalGap: 15, // default 25
144 mainNodeHorizontalGap: 15, // default 65
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
168let mind = new MindElixir(options)
169
170mind.install(plugin) // install your plugin
171
172// create new map data
173const data = MindElixir.new('new topic')
174// or `example`
175// or the data return from `.getData()`
176mind.init(data)
177
178// get a node
179E('node-id')
180```
181
182### Data Structure
183
184```javascript
185// whole node data structure up to now
186const 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### Event Handling
212
213```javascript
214mind.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
228mind.bus.addListener('selectNode', node => {
229 console.log(node)
230})
231
232mind.bus.addListener('expandNode', node => {
233 console.log('expandNode: ', node)
234})
235```
236
237### Data Export And Import
238
239```javascript
240// data export
241const data = mind.getData() // javascript object, see src/example.js
242mind.getDataString() // stringify object
243mind.getDataMd() // markdown
244
245// data import
246// initiate
247let mind = new MindElixir(options)
248mind.init(data)
249// data update
250mind.refresh(data)
251```
252
253### Operation Guards
254
255```javascript
256let 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## Theme
278
279```javascript
280const options = {
281 // ...
282 theme: {
283 name: 'Dark',
284 // main lines color palette
285 palette: ['#848FA0', '#748BE9', '#D2F9FE', '#4145A5', '#789AFA', '#706CF4', '#EF987F', '#775DD5', '#FCEECF', '#DA7FBC'],
286 // overwrite css variables
287 cssVar: {
288 '--main-color': '#ffffff',
289 '--main-bgcolor': '#4c4f69',
290 '--color': '#cccccc',
291 '--bgcolor': '#252526',
292 },
293 // all variables see /src/index.less
294 },
295 // ...
296}
297```
298
299## Not only core
300
301- [@mind-elixir/node-menu](https://github.com/ssshooter/node-menu)
302- [@mind-elixir/export-xmind](https://github.com/ssshooter/export-xmind)
303- [@mind-elixir/export-html](https://github.com/ssshooter/export-html)
304- [@mind-elixir/export-image](https://github.com/ssshooter/export-image) (WIP🚧)
305- [mind-elixir-react](https://github.com/ssshooter/mind-elixir-react)
306
307## Development
308
309```
310yarn
311npm start
312```
313
314Test generated files with `dev.dist.ts`:
315
316```
317npm run build
318npm link
319npm link mind-elixir
320npm run startd
321```