skills/rich-text/umbraco-tiptap-extension/SKILL.md
Implement Tiptap extensions for Umbraco rich text editor using official docs
npx skillsauth add albanist/umbraco_cli umbraco-tiptap-extensionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A Tiptap Extension adds functionality to Umbraco's Rich Text Editor (which is built on Tiptap). Extensions can add new node types (like custom blocks), marks (like custom formatting), or other editor capabilities. The extension API provides the underlying Tiptap extensions that get registered with the editor.
Always fetch the latest docs before implementing:
Tiptap Toolbar Extension: For adding toolbar buttons
umbraco-tiptap-toolbar-extensionTiptap Statusbar Extension: For adding statusbar elements
umbraco-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 | Icon shown in configuration UI |
| label | Display name |
| group | Group for organizing extensions |
| description | Optional description |
formatting - Text formatting (bold, italic, etc.)structure - Structural elements (headings, lists, etc.)media - Media elements (images, embeds, etc.)misc - Other functionalityThat's it! Always fetch fresh docs, keep examples minimal, generate complete working code.
tools
Front-office member operations (login, profile, groups)
tools
Member group lookups (for 'member set-groups' GUID discovery)
development
Trigger and inspect ModelsBuilder source generation
tools
Umbraco Forms operations (read-only)