Oh MyUtils

Mermaidダイアグラムエディター - フローチャート・図表をオンライン作成

Mermaid.jsのライブプレビューでフローチャート、シーケンス図、ER図など20種類以上のダイアグラムを作成。SVG/PNGエクスポート — 100%クライアントサイド、データ送信なし。

よくある質問

Mermaidダイアグラムエディタとは何ですか?

Mermaidダイアグラムエディタは、テキストベースのダイアグラム言語であるMermaid.jsを使用してダイアグラムを作成できるオンラインツールです。図形をドラッグ&ドロップする代わりに、シンプルなMarkdown風の構文(例:graph TD; A-->B)を書くと、エディタがリアルタイムでビジュアルダイアグラムとしてレンダリングします。Mermaidはフローチャート、シーケンス図、クラス図、ER図、ガントチャート、マインドマップなど20種類以上のダイアグラムタイプをサポートしています。

このMermaidダイアグラムエディタはどのように使いますか?

テンプレートドロップダウンからダイアグラムテンプレート(例:フローチャートやシーケンス図)を選択するか、Mermaidコードを一から書き始めてください。入力するとプレビューパネルがリアルタイムで更新されます。構文エラーがある場合、赤い「Invalid」バッジが表示されます。Mermaidテーマ(Default、Dark、Forest、Neutral)を選択してビジュアルスタイルを変更できます。満足したら、SVGダウンロードまたはPNGダウンロードをクリックしてダイアグラムをエクスポートしてください。

ダイアグラムデータは安全ですか?サーバーに送信されるものはありますか?

すべてのダイアグラムレンダリングは、mermaid.js JavaScriptライブラリを使用してブラウザ内で100%クライアントサイドで実行されます。ダイアグラムコード、レンダリングされた画像、ユーザーデータのいずれもサーバーに送信されることはありません。ダイアグラムはブラウザのメモリとlocalStorageにのみ存在します。これにより、独自のアーキテクチャ図、内部データベーススキーマ、機密ドキュメントにも安全に使用できます。

Mermaidはどのようなダイアグラムタイプをサポートしていますか?

Mermaid.jsは20種類以上のダイアグラムタイプをサポートしています:フローチャート(プロセスフロー)、シーケンス図(アクター間のインタラクション)、クラス図(OOP構造)、ステート図(ステートマシン)、ER図(データベーススキーマ)、ガントチャート(プロジェクトタイムライン)、円グラフ(比例データ)、マインドマップ(アイデアの階層)、Gitグラフ(ブランチの可視化)、タイムライン(時系列イベント)、そしてC4、Sankey、XYチャート、カンバン、アーキテクチャ図などが含まれます。

ダイアグラムを画像としてエクスポートするにはどうすればよいですか?

SVGダウンロードをクリックすると、どのサイズでも鮮明なスケーラブルベクターグラフィックが得られます — ドキュメントに最適です。PNGダウンロードをクリックするとラスター画像が得られ、スケール(1x、Retina用2x、印刷用3x)と透明または白の背景を選択できます。Copy SVGをクリックすると、FigmaなどのデザインツールにペーストするためにSVGマークアップをクリップボードにコピーすることもできます。

ダイアグラムを他の人と共有できますか?

はい。ダイアグラムコードとテーマはページURLにエンコードされます。ブラウザのアドレスバーからURLをコピーして共有するだけです。他の人がリンクを開くと、あなたのダイアグラムがそのまま表示され、さらに編集することもできます。サーバーストレージは一切関与しません — ダイアグラムデータはURLに直接埋め込まれています。非常に大きなダイアグラムはURL長の制限を超える場合があり、その場合はコードコピーでMermaidコードを共有できます。

Mermaidテーマとは何ですか?

Mermaid.jsには4つのビルトインテーマがあります:Default(ブルー/パープルトーン)、Dark(プレゼンテーション用のダークな背景)、Forest(グリーントーン、オーガニックな雰囲気)、Neutral(グレースケール、プロフェッショナル)。テーマはダイアグラム内のノードの色、線のスタイル、背景に影響します。アプリのUIテーマ(ダーク/ライトモード)はMermaidダイアグラムテーマとは独立しています。

エディタは作業を自動保存しますか?

はい。ダイアグラムコードは入力中に自動的にブラウザのlocalStorageに保存されます。ページを再訪問すると、最後のダイアグラムが自動的に復元されます。localStorageはブラウザ固有であることに注意してください — ブラウザを変更したりブラウザデータをクリアしたりすると、保存されたダイアグラムは削除されます。長期保存には、ダイアグラムをエクスポートするか、共有可能なURLをコピーしてください。

コード例

// Mermaid Diagram Rendering and Export in JavaScript (Browser)

/**
 * Initialize mermaid.js with configuration
 */
async function initMermaid(theme = 'default') {
  const mermaid = await import('https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs');
  mermaid.default.initialize({
    startOnLoad: false,
    theme: theme,  // 'default', 'dark', 'forest', 'neutral'
    securityLevel: 'strict',
  });
  return mermaid.default;
}

/**
 * Render Mermaid code to SVG string
 */
async function renderMermaid(mermaidInstance, code, elementId = 'mermaid-output') {
  try {
    const { svg } = await mermaidInstance.render(elementId, code);
    return { svg, error: null };
  } catch (error) {
    return { svg: null, error: error.message };
  }
}

/**
 * Export SVG string as downloadable .svg file
 */
function downloadSvg(svgContent, filename = 'diagram.svg') {
  const blob = new Blob([svgContent], { type: 'image/svg+xml;charset=utf-8' });
  const url = URL.createObjectURL(blob);
  const anchor = document.createElement('a');
  anchor.href = url;
  anchor.download = filename;
  anchor.click();
  URL.revokeObjectURL(url);
}

/**
 * Convert SVG to PNG and download
 */
async function downloadPng(svgContent, scale = 2, filename = 'diagram.png') {
  return new Promise((resolve, reject) => {
    const svgBlob = new Blob([svgContent], { type: 'image/svg+xml;charset=utf-8' });
    const url = URL.createObjectURL(svgBlob);
    const img = new Image();

    img.onload = () => {
      const canvas = document.createElement('canvas');
      canvas.width = img.naturalWidth * scale;
      canvas.height = img.naturalHeight * scale;
      const ctx = canvas.getContext('2d');

      ctx.fillStyle = '#ffffff';
      ctx.fillRect(0, 0, canvas.width, canvas.height);
      ctx.scale(scale, scale);
      ctx.drawImage(img, 0, 0);

      canvas.toBlob((blob) => {
        const pngUrl = URL.createObjectURL(blob);
        const anchor = document.createElement('a');
        anchor.href = pngUrl;
        anchor.download = filename;
        anchor.click();
        URL.revokeObjectURL(pngUrl);
        URL.revokeObjectURL(url);
        resolve();
      }, 'image/png');
    };

    img.onerror = reject;
    img.src = url;
  });
}

/**
 * Encode diagram state for URL sharing
 */
function encodeDiagramState(code, theme) {
  const state = JSON.stringify({ code, theme });
  return btoa(unescape(encodeURIComponent(state)));
}

function decodeDiagramState(encoded) {
  try {
    const json = decodeURIComponent(escape(atob(encoded)));
    return JSON.parse(json);
  } catch {
    return null;
  }
}

// Example usage
(async () => {
  const mermaid = await initMermaid('default');

  const code = `
graph TD
    A[Start] --> B{Is it working?}
    B -->|Yes| C[Great!]
    B -->|No| D[Debug]
    D --> B
  `;

  const { svg, error } = await renderMermaid(mermaid, code);

  if (error) {
    console.error('Render error:', error);
    return;
  }

  console.log('SVG rendered successfully');

  // Download as SVG
  downloadSvg(svg, 'flowchart.svg');

  // Download as PNG at 2x resolution
  await downloadPng(svg, 2, 'flowchart.png');

  // Create shareable URL
  const encoded = encodeDiagramState(code, 'default');
  console.log(`Share URL: https://ohmyutils.com/en/mermaid-diagram-editor?state=${encoded}`);
})();

関連ツール