Loading...
Loading...
Implement Tiptap extensions for Umbraco rich text editor using official docs
npx skill4agent add umbraco/umbraco-cms-backoffice-skills umbraco-tiptap-extensionumbraco-tiptap-toolbar-extensionumbraco-tiptap-statusbar-extensionimport type { ManifestTiptapExtension } from '@umbraco-cms/backoffice/extension-registry';
const manifest: ManifestTiptapExtension = {
type: 'tiptapExtension',
alias: 'My.TiptapExtension.Highlight',
name: 'Highlight Extension',
api: () => import('./highlight.tiptap-api.js'),
meta: {
icon: 'icon-marker',
label: 'Highlight',
group: 'formatting',
},
};
export const manifests = [manifest];import { UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';
import type { UmbTiptapExtensionArgs } from '@umbraco-cms/backoffice/tiptap';
import Highlight from '@tiptap/extension-highlight';
export default class HighlightTiptapExtensionApi extends UmbTiptapExtensionApiBase {
getTiptapExtensions(args?: UmbTiptapExtensionArgs) {
return [
Highlight.configure({
multicolor: true,
}),
];
}
}import { UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';
import { Node } from '@tiptap/core';
export default class CalloutTiptapExtensionApi extends UmbTiptapExtensionApiBase {
getTiptapExtensions() {
const CalloutNode = Node.create({
name: 'callout',
group: 'block',
content: 'block+',
addAttributes() {
return {
type: {
default: 'info',
},
};
},
parseHTML() {
return [{ tag: 'div[data-callout]' }];
},
renderHTML({ HTMLAttributes }) {
return ['div', { 'data-callout': '', ...HTMLAttributes }, 0];
},
});
return [CalloutNode];
}
}import { UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';
import { Mark } from '@tiptap/core';
export default class CustomMarkTiptapExtensionApi extends UmbTiptapExtensionApiBase {
getTiptapExtensions() {
const CustomMark = Mark.create({
name: 'customHighlight',
addAttributes() {
return {
color: {
default: 'yellow',
},
};
},
parseHTML() {
return [{ tag: 'mark' }];
},
renderHTML({ HTMLAttributes }) {
return ['mark', { style: `background-color: ${HTMLAttributes.color}` }, 0];
},
});
return [CustomMark];
}
}import { UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';
import { css } from '@umbraco-cms/backoffice/external/lit';
import Highlight from '@tiptap/extension-highlight';
export default class StyledHighlightApi extends UmbTiptapExtensionApiBase {
getTiptapExtensions() {
return [Highlight];
}
// Custom styles for the editor
getStyles() {
return css`
mark {
background-color: yellow;
padding: 0.1em 0.2em;
border-radius: 2px;
}
`;
}
}import { UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';
import type { UmbTiptapExtensionArgs } from '@umbraco-cms/backoffice/tiptap';
import Highlight from '@tiptap/extension-highlight';
export default class ConfigurableHighlightApi extends UmbTiptapExtensionApiBase {
getTiptapExtensions(args?: UmbTiptapExtensionArgs) {
// Access data type configuration
const multicolor = args?.configuration?.getValueByAlias('multicolor') ?? false;
return [
Highlight.configure({
multicolor,
}),
];
}
}| Property | Description |
|---|---|
| Icon shown in configuration UI |
| Display name |
| Group for organizing extensions |
| Optional description |
formattingstructuremediamisc