ru.md

March 15, 2026 · View on GitHub

mindelixir logo2

Mind Elixir

SSShooter%2Fmind-elixir-core | Trendshift

version license code quality dependency-count package size

English | 中文 | Español | Français | Português | Русский | 日本語 | 한국어

Mind Elixir - это библиотека с открытым исходным кодом для создания интеллект-карт на JavaScript. Вы можете использовать её с любым frontend-фреймворком.

Особенности:

  • Легковесность
  • Высокая производительность
  • Независимость от фреймворков
  • Расширяемость с помощью плагинов
  • Встроенные плагины для перетаскивания и редактирования узлов
  • Экспорт в SVG / PNG / HTML
  • Возможность сворачивать узлы
  • Поддержка массовых операций
  • Отмена / Повтор действий
  • Эффективные горячие клавиши
  • Простая стилизация узлов с помощью CSS переменных
Содержание

Попробовать сейчас

mindelixir

https://mind-elixir.com/

Playground

Документация

https://docs.mind-elixir.com/

Использование

Установка

NPM

npm i mind-elixir -S
import MindElixir from 'mind-elixir'

Script tag

<script type="module" src="https://cdn.jsdelivr.net/npm/mind-elixir/dist/MindElixir.js"></script>

И в вашем CSS файле:

@import 'https://cdn.jsdelivr.net/npm/mind-elixir/dist/style.css';

Инициализация

<div id="map"></div>
<style>
  #map {
    height: 500px;
    width: 100%;
  }
</style>

Breaking Change since 1.0.0, data should be passed to init(), not options.

import MindElixir from 'mind-elixir'
import { en } from 'mind-elixir/i18n'
import example from 'mind-elixir/dist/example1'

let options = {
  el: '#map', // or HTMLDivElement
  direction: MindElixir.LEFT,
  draggable: true, // default true
  keypress: true, // default true
  overflowHidden: false, // default false
  mouseSelectionButton: 0, // 0 for left button, 2 for right button, default 0
  contextMenu: {
    locale: en,
    focus: true,
    link: true,
    extend: [
      {
        name: 'Node edit',
        onclick: () => {
          alert('extend menu')
        },
      },
    ],
  },
  before: {
    insertSibling(el, obj) {
      return true
    },
    async addChild(el, obj) {
      await sleep()
      return true
    },
  },
}

let mind = new MindElixir(options)

mind.install(plugin) // install your plugin

// create new map data
const data = MindElixir.new('new topic')
// or `example`
// or the data return from `.getData()`
mind.init(data)

// get a node
MindElixir.E('node-id')

Структура данных

// whole node data structure up to now
const nodeData = {
  topic: 'node topic',
  id: 'bd1c24420cd2c2f5',
  style: { fontSize: '32', color: '#3298db', background: '#ecf0f1' },
  expanded: true,
  parent: null,
  tags: ['Tag'],
  icons: ['😀'],
  hyperLink: 'https://github.com/ssshooter/mind-elixir-core',
  image: {
    url: 'https://raw.githubusercontent.com/ssshooter/mind-elixir-core/master/images/logo2.png', // required
    // you need to query the height and width of the image and calculate the appropriate value to display the image
    height: 90, // required
    width: 90, // required
  },
  children: [
    {
      topic: 'child',
      id: 'xxxx',
      // ...
    },
  ],
}

Обработка событий

mind.bus.addListener('operation', operation => {
  console.log(operation)
  // return {
  //   name: action name,
  //   obj: target object
  // }

  // name: [insertSibling|addChild|removeNode|beginEdit|finishEdit]
  // obj: target

  // name: moveNode
  // obj: {from:target1,to:target2}
})

mind.bus.addListener('selectNodes', nodes => {
  console.log(nodes)
})

mind.bus.addListener('expandNode', node => {
  console.log('expandNode: ', node)
})

Экспорт и импорт данных

// data export
const data = mind.getData() // javascript object, see src/example.js
mind.getDataString() // stringify object

// data import
// initiate
let mind = new MindElixir(options)
mind.init(data)
// data update
mind.refresh(data)

Контроль операций

let mind = new MindElixir({
  // ...
  before: {
    insertSibling(el, obj) {
      console.log(el, obj)
      if (this.currentNode.nodeObj.parent.root) {
        return false
      }
      return true
    },
    async addChild(el, obj) {
      await sleep()
      if (this.currentNode.nodeObj.parent.root) {
        return false
      }
      return true
    },
  },
})

Экспорт в изображение

Способ 1

const mind = {
  /** mind elixir instance */
}
const downloadPng = async () => {
  const blob = await mind.exportPng() // Get a Blob!
  if (!blob) return
  const url = URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.href = url
  a.download = 'filename.png'
  a.click()
  URL.revokeObjectURL(url)
}

Способ 2

Install @ssshooter/modern-screenshot, then:

import { domToPng } from '@ssshooter/modern-screenshot'

const download = async () => {
  const dataUrl = await domToPng(mind.nodes, {
    onCloneNode: node => {
      const n = node as HTMLDivElement
      n.style.position = ''
      n.style.top = ''
      n.style.left = ''
      n.style.bottom = ''
      n.style.right = ''
    },
    padding: 300,
    quality: 1,
  })
  const link = document.createElement('a')
  link.download = 'screenshot.png'
  link.href = dataUrl
  link.click()
}

Тема

const options = {
  // ...
  theme: {
    name: 'Dark',
    // main lines color palette
    palette: ['#848FA0', '#748BE9', '#D2F9FE', '#4145A5', '#789AFA', '#706CF4', '#EF987F', '#775DD5', '#FCEECF', '#DA7FBC'],
    // overwrite css variables
    cssVar: {
      '--main-color': '#ffffff',
      '--main-bgcolor': '#4c4f69',
      '--color': '#cccccc',
      '--bgcolor': '#252526',
      '--panel-color': '255, 255, 255',
      '--panel-bgcolor': '45, 55, 72',
    },
    // all variables see /src/index.less
  },
  // ...
}

// ...

mind.changeTheme({
  name: 'Latte',
  palette: ['#dd7878', '#ea76cb', '#8839ef', '#e64553', '#fe640b', '#df8e1d', '#40a02b', '#209fb5', '#1e66f5', '#7287fd'],
  cssVar: {
    '--main-color': '#444446',
    '--main-bgcolor': '#ffffff',
    '--color': '#777777',
    '--bgcolor': '#f6f6f6',
  },
})

Be aware that Mind Elixir will not observe the change of prefers-color-scheme. Please change the theme manually when the scheme changes.

Горячие клавиши

Комбинация клавишФункция
EnterВставить соседний узел
TabВставить дочерний узел
F1Центрировать карту
F2Начать редактирование текущего узла
Выбрать предыдущий узел
Выбрать следующий узел
← / →Выбрать родительский или первый дочерний узел
PageUp / Alt + ↑Переместить узел вверх
PageDown / Alt + ↓Переместить узел вниз
Ctrl + ↑Изменить шаблон расположения на боковой
Ctrl + ←Изменить шаблон расположения на левый
Ctrl + →Изменить шаблон расположения на правый
Ctrl + CКопировать текущий узел
Ctrl + VВставить скопированный узел
Ctrl + "+"Увеличить масштаб карты
Ctrl + "-"Уменьшить масштаб карты
Ctrl + 0Сбросить масштаб

Экосистема

PRs are welcome!

Разработка

pnpm i
pnpm dev

Test generated files with dev.dist.ts:

pnpm build
pnpm link ./

Update docs:

# Install api-extractor
pnpm install -g @microsoft/api-extractor
# Maintain /src/docs.ts
# Generate docs
pnpm doc
pnpm doc:md

Благодарности

Контрибьюторы

Спасибо за ваш вклад в Mind Elixir! Ваша поддержка и преданность делают этот проект лучше.