mcpField
U
umbraco-tiptap-toolbar-extension

umbraco-tiptap-toolbar-extension

github.com/umbraco開発27374 回インストール6 週間前に更新
リポジトリ

umbraco-tiptap-toolbar-extension について

Umbraco Tiptap のリッチテキストエディター向けツールバー拡張を作成するスキルです。複数のコントロール種別を扱い、ドキュメント確認、マニフェストと API の作成、テストを案内します。

主な機能

  1. 01ボタン、メニュー、スタイルコントロール
  2. 02カラーピッカーボタンの案内
  3. 03マニフェストと API の例
  4. 04アクティブ状態と無効状態の設定
  5. 05ドキュメント確認を優先するワークフロー

活用シーン

  1. 01書式切り替えボタンの追加
  2. 02メニューで見出しやスタイルを選択
  3. 03編集者によるテキスト色の選択
  4. 04ツールバーボタンからモーダルを開く

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-tiptap-toolbar-extension

インストール後、Claude Code で/umbraco-tiptap-toolbar-extensionを入力して読み込まれたか確認します。

詳細

Umbraco Tiptap ツールバー拡張機能

これは何ですか?

Tiptap ツールバー拡張機能は、リッチテキストエディターのツールバーにボタンやコントロールを追加します。クリック時に実行される execute メソッドを提供し、アクティブ/無効状態を表示できます。いくつかの「種類」が利用可能です: button(シンプルなトグル)、colorPickerButton(色選択)、menu(ドロップダウンメニュー)、styleMenu(スタイル選択ドロップダウン)。

ドキュメント

実装する前に、常に最新のドキュメントを取得してください:

関連スキル

  • Tiptap 拡張機能: エディター機能を追加する場合

    • 参照スキル: umbraco-tiptap-extension
  • モーダル: ツールバーのボタンがモーダルダイアログを開く場合

    • 参照スキル: umbraco-modals

ワークフロー

  1. ドキュメントを取得 - 上記の URL に対して WebFetch を使用します
  2. 質問する - ボタン、メニュー、カラーピッカーのどれですか? どのようなアクションを実行しますか?
  3. ファイルを生成 - 最新のドキュメントに基づいてマニフェスト + API クラスを作成します
  4. 説明 - 作成されたものとテスト方法を示します

最小限の例

Button 種類のマニフェスト (manifests.ts)
import type { ManifestTiptapToolbarExtensionButtonKind } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestTiptapToolbarExtensionButtonKind = {
  type: 'tiptapToolbarExtension',
  kind: 'button',
  alias: 'My.TiptapToolbar.Bold',
  name: 'Bold Toolbar Button',
  api: () => import('./bold.tiptap-toolbar-api.js'),
  forExtensions: ['Umb.Tiptap.Bold'], // Links to the tiptap extension
  meta: {
    alias: 'bold',
    icon: 'icon-bold',
    label: 'Bold',
  },
};

export const manifests = [manifest];
Button API (bold.tiptap-toolbar-api.ts)
import { UmbTiptapToolbarElementApiBase } from '@umbraco-cms/backoffice/tiptap';
import type { Editor } from '@tiptap/core';

export default class BoldToolbarApi extends UmbTiptapToolbarElementApiBase {
  execute(editor?: Editor) {
    editor?.chain().focus().toggleBold().run();
  }
}
カスタムのアクティブ/無効状態を持つボタン
import { UmbTiptapToolbarElementApiBase } from '@umbraco-cms/backoffice/tiptap';
import type { Editor } from '@tiptap/core';

export default class CustomToolbarApi extends UmbTiptapToolbarElementApiBase {
  execute(editor?: Editor) {
    editor?.chain().focus().toggleHighlight().run();
  }

  // Override to customize active state detection
  isActive(editor?: Editor): boolean {
    return editor?.isActive('highlight') ?? false;
  }

  // Override to customize disabled state
  isDisabled(editor?: Editor): boolean {
    return !editor?.can().toggleHighlight() ?? true;
  }
}
Menu 種類のマニフェスト
import type { ManifestTiptapToolbarExtensionMenuKind } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestTiptapToolbarExtensionMenuKind = {
  type: 'tiptapToolbarExtension',
  kind: 'menu',
  alias: 'My.TiptapToolbar.Headings',
  name: 'Headings Menu',
  api: () => import('./headings.tiptap-toolbar-api.js'),
  forExtensions: ['Umb.Tiptap.Heading'],
  meta: {
    alias: 'headings',
    icon: 'icon-heading',
    label: 'Headings',
    look: 'text', // 'icon' or 'text'
  },
  items: [
    { label: 'Heading 1', data: { level: 1 } },
    { label: 'Heading 2', data: { level: 2 } },
    { label: 'Heading 3', data: { level: 3 } },
    { label: 'Paragraph', data: { level: 0 } },
  ],
};
Menu API
import { UmbTiptapToolbarElementApiBase } from '@umbraco-cms/backoffice/tiptap';
import type { Editor } from '@tiptap/core';

export default class HeadingsToolbarApi extends UmbTiptapToolbarElementApiBase {
  execute(editor?: Editor, level?: number) {
    if (level === 0) {
      editor?.chain().focus().setParagraph().run();
    } else {
      editor?.chain().focus().toggleHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run();
    }
  }

  isActive(editor?: Editor, level?: number): boolean {
    if (level === 0) {
      return editor?.isActive('paragraph') ?? false;
    }
    return editor?.isActive('heading', { level }) ?? false;
  }
}
Style Menu 種類
import type { ManifestTiptapToolbarExtensionStyleMenuKind } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestTiptapToolbarExtensionStyleMenuKind = {
  type: 'tiptapToolbarExtension',
  kind: 'styleMenu',
  alias: 'My.TiptapToolbar.Styles',
  name: 'Style Menu',
  api: () => import('./styles.tiptap-toolbar-api.js'),
  meta: {
    alias: 'styles',
    icon: 'icon-palette',
    label: 'Styles',
  },
  items: [
    {
      label: 'Lead Paragraph',
      data: { class: 'lead' },
      appearance: { style: 'font-size: 1.2em' },
    },
    {
      label: 'Small Text',
      data: { class: 'small' },
      appearance: { style: 'font-size: 0.85em' },
    },
    {
      label: 'Highlight Box',
      data: { class: 'highlight-box' },
    },
  ],
};
Color Picker Button 種類
import type { ManifestTiptapToolbarExtensionColorPickerButtonKind } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestTiptapToolbarExtensionColorPickerButtonKind = {
  type: 'tiptapToolbarExtension',
  kind: 'colorPickerButton',
  alias: 'My.TiptapToolbar.TextColor',
  name: 'Text Color',
  api: () => import('./text-color.tiptap-toolbar-api.js'),
  meta: {
    alias: 'textColor',
    icon: 'icon-palette',
    label: 'Text Color',
  },
};
モーダルを開くツールバーボタン
import { UmbTiptapToolbarElementApiBase } from '@umbraco-cms/backoffice/tiptap';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import type { Editor } from '@tiptap/core';

export default class LinkToolbarApi extends UmbTiptapToolbarElementApiBase {
  async execute(editor?: Editor) {
    const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);

    const modal = modalManager.open(this, MY_LINK_MODAL, {
      data: {
        currentHref: editor?.getAttributes('link').href,
      },
    });

    const result = await modal.onSubmit();
    if (result?.href) {
      editor?.chain().focus().setLink({ href: result.href }).run();
    }
  }
}

ツールバー拡張機能の種類

種類用途
buttonシンプルなトグルボタン
colorPickerButton色選択
menuオプション付きドロップダウン
styleMenuスタイル/クラス選択

メタプロパティ

プロパティ説明
aliasisActive 検出に使用されます
iconツールバーボタンのアイコン
labelツールチップのテキスト
look(menu のみ) 'icon' または 'text'

以上です! 常に最新のドキュメントを取得し、例は最小限に保ち、完全に動作するコードを生成してください。

コメント