关于 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 类
- 说明 - 展示创建的内容以及测试方法
最小示例
按钮类型清单(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];
按钮 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;
}
}
菜单类型清单
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 } },
],
};
菜单 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;
}
}
样式菜单类型
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' },
},
],
};
颜色选择器按钮类型
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