umbraco-tiptap-toolbar-extension について
Umbraco Tiptap のリッチテキストエディター向けツールバー拡張を作成するスキルです。複数のコントロール種別を扱い、ドキュメント確認、マニフェストと API の作成、テストを案内します。
主な機能
- 01ボタン、メニュー、スタイルコントロール
- 02カラーピッカーボタンの案内
- 03マニフェストと API の例
- 04アクティブ状態と無効状態の設定
- 05ドキュメント確認を優先するワークフロー
活用シーン
- 01書式切り替えボタンの追加
- 02メニューで見出しやスタイルを選択
- 03編集者によるテキスト色の選択
- 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(スタイル選択ドロップダウン)。
ドキュメント
実装する前に、常に最新のドキュメントを取得してください:
- 拡張機能の種類: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types
- リッチテキストエディター: https://docs.umbraco.com/umbraco-cms/model-your-content/property-editors/built-in-umbraco-property-editors/rich-text-editor
- Tiptap ドキュメント: https://tiptap.dev/docs/editor/extensions/overview
- Foundation: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation
関連スキル
-
Tiptap 拡張機能: エディター機能を追加する場合
- 参照スキル:
umbraco-tiptap-extension
- 参照スキル:
-
モーダル: ツールバーのボタンがモーダルダイアログを開く場合
- 参照スキル:
umbraco-modals
- 参照スキル:
ワークフロー
- ドキュメントを取得 - 上記の URL に対して WebFetch を使用します
- 質問する - ボタン、メニュー、カラーピッカーのどれですか? どのようなアクションを実行しますか?
- ファイルを生成 - 最新のドキュメントに基づいてマニフェスト + API クラスを作成します
- 説明 - 作成されたものとテスト方法を示します
最小限の例
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 | スタイル/クラス選択 |
メタプロパティ
| プロパティ | 説明 |
|---|---|
alias | isActive 検出に使用されます |
icon | ツールバーボタンのアイコン |
label | ツールチップのテキスト |
look | (menu のみ) 'icon' または 'text' |
以上です! 常に最新のドキュメントを取得し、例は最小限に保ち、完全に動作するコードを生成してください。
コメント
Markdown 対応