Skip to content

Latest commit

 

History

History
433 lines (359 loc) · 11.6 KB

ja.md

File metadata and controls

433 lines (359 loc) · 11.6 KB

mindelixir logo2

Mind Elixir

version license code quality dependency-count package size

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

Mind Elixirは、オープンソースのJavaScriptマインドマップコアです。お好みのフロントエンドフレームワークと組み合わせて使用できます。

特徴:

  • 軽量
  • 高パフォーマンス
  • フレームワーク非依存
  • プラグイン対応
  • ドラッグ&ドロップ/ノード編集プラグイン内蔵
  • SVG/PNG/HTMLとしてエクスポート可能
  • ノードの要約
  • 一括操作対応
  • 元に戻す/やり直し
  • 効率的なショートカット
  • CSSカスタマイズが容易
目次

デモを試す

mindelixir

https://mind-elixir.com/

プレイグラウンド

ドキュメント

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

使い方

インストール

NPM

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

スクリプトタグ

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

初期化

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

重要な変更 バージョン1.0.0以降、dataoptionsではなくinit()に渡す必要があります。

import MindElixir from 'mind-elixir'
import example from 'mind-elixir/dist/example1'

let options = {
  el: '#map', // またはHTMLDivElement
  direction: MindElixir.LEFT,
  draggable: true, // デフォルトはtrue
  contextMenu: true, // デフォルトはtrue
  toolBar: true, // デフォルトはtrue
  nodeMenu: true, // デフォルトはtrue
  keypress: true, // デフォルトはtrue
  locale: 'ja', // [zh_CN,zh_TW,en,ja,pt,ru] PRs募集中
  overflowHidden: false, // デフォルトはfalse
  mainLinkStyle: 2, // [1,2] デフォルトは1
  mouseSelectionButton: 0, // 0は左クリック、2は右クリック、デフォルトは0
  contextMenuOption: {
    focus: true,
    link: true,
    extend: [
      {
        name: 'ノード編集',
        onclick: () => {
          alert('拡張メニュー')
        },
      },
    ],
  },
  before: {
    insertSibling(el, obj) {
      return true
    },
    async addChild(el, obj) {
      await sleep()
      return true
    },
  },
}

let mind = new MindElixir(options)

mind.install(plugin) // プラグインのインストール

// 新しいマップデータの作成
const data = MindElixir.new('新しいトピック')
// または `example`
// または `.getData()`の戻り値
mind.init(data)

// ノードの取得
MindElixir.E('node-id')

データ構造

// 現在のノードデータ構造
const nodeData = {
  topic: 'ノードのトピック',
  id: 'bd1c24420cd2c2f5',
  style: { fontSize: '32', color: '#3298db', background: '#ecf0f1' },
  expanded: true,
  parent: null,
  tags: ['タグ'],
  icons: ['😀'],
  hyperLink: 'https://github.com/ssshooter/mind-elixir-core',
  image: {
    url: 'https://raw.githubusercontent.com/ssshooter/mind-elixir-core/master/images/logo2.png', // 必須
    height: 90, // 必須
    width: 90, // 必須
  },
  children: [
    {
      topic: '子ノード',
      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('selectNode', node => {
  console.log(node)
})

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

データのエクスポートとインポート

// データのエクスポート
const data = mind.getData() // JavaScriptオブジェクト、src/example.jsを参照
mind.getDataString() // オブジェクトを文字列化
mind.getDataMd() // Markdown

// データのインポート
// 初期化
let mind = new MindElixir(options)
mind.init(data)
// データの更新
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() // 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

@ssshooter/modern-screenshotをインストールし、次に実行します:

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()
}

API

https://github.com/ssshooter/mind-elixir-core/blob/master/api/mind-elixir.api.md

テーマ

const options = {
  // ...
  theme: {
    name: 'Dark',
    // メインラインのカラーパレット
    palette: ['#848FA0', '#748BE9', '#D2F9FE', '#4145A5', '#789AFA', '#706CF4', '#EF987F', '#775DD5', '#FCEECF', '#DA7FBC'],
    // CSS変数の上書き
    cssVar: {
      '--main-color': '#ffffff',
      '--main-bgcolor': '#4c4f69',
      '--color': '#cccccc',
      '--bgcolor': '#252526',
      '--panel-color': '255, 255, 255',
      '--panel-bgcolor': '45, 55, 72',
    },
    // すべての変数は/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',
  },
})

Mind Elixirはprefers-color-schemeの変更を監視しません。スキームが変更された場合は、テーマを手動で変更してください。

ショートカット

ショートカット 機能
Enter 兄弟ノードを挿入
Tab 子ノードを挿入
F1 マップを中央に配置
F2 現在のノードの編集を開始
前の兄弟ノードを選択
次の兄弟ノードを選択
← / → 親または最初の子ノードを選択
PageUp / Alt + ↑ ノードを上に移動
PageDown / Alt + ↓ ノードを下に移動
Ctrl + ↑ レイアウトパターンをサイドに変更
Ctrl + ← レイアウトパターンを左に変更
Ctrl + → レイアウトパターンを右に変更
Ctrl + C 現在のノードをコピー
Ctrl + V コピーしたノードを貼り付け
Ctrl + "+" マインドマップをズームイン
Ctrl + "-" マインドマップをズームアウト
Ctrl + 0 ズームレベルをリセット

エコシステム

PRsは大歓迎です!

開発

pnpm i
pnpm dev

dev.dist.tsで生成されたファイルをテストします:

pnpm build
pnpm link ./

ドキュメントを更新します:

# api-extractorをインストール
pnpm install -g @microsoft/api-extractor
# /src/docs.tsを維持
# ドキュメントを生成
pnpm doc
pnpm doc:md

謝辞

貢献者

Mind Elixirへの貢献に感謝します!あなたのサポートと献身がこのプロジェクトをより良くします。