mcpField
U
umbraco-tiptap-extension

umbraco-tiptap-extension

github.com/umbracoDevelopment27378 installsUpdated 6w ago
Repository

About umbraco-tiptap-extension

A skill that guides developers in creating Tiptap extensions for Umbraco’s Rich Text Editor. It covers extension manifests and API classes for custom nodes, marks, and editor capabilities, using current documentation as the implementation reference.

Key features

  1. 01Guidance for extension manifests and API classes
  2. 02Patterns for custom nodes and marks
  3. 03Configuration through property editor data
  4. 04Support for custom styles
  5. 05References current Umbraco and Tiptap docs

Use cases

  1. 01Adding a custom block to the editor
  2. 02Creating custom text formatting
  3. 03Building a configurable editor extension

Install

Copy the command and run it in a terminal.

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

After installing, type/umbraco-tiptap-extensionin Claude Code to confirm it loaded.

Details

From the project README

Umbraco Tiptap Extension

What is it?

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.

Documentation

Always fetch the latest docs before implementing:

Related Skills

  • Tiptap Toolbar Extension: For adding toolbar buttons

    • Reference skill: umbraco-tiptap-toolbar-extension
  • Tiptap Statusbar Extension: For adding statusbar elements

    • Reference skill: umbraco-tiptap-statusbar-extension

Workflow

  1. Fetch docs - Use WebFetch on the URLs above
  2. Ask questions - What functionality? Node, Mark, or Extension? Custom styles needed?
  3. Generate files - Create manifest + API class based on latest docs
  4. Explain - Show what was created and how to test

Minimal Examples

Manifest (manifests.ts)
import 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];
Extension API (highlight.tiptap-api.ts)
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,
      }),
    ];
  }
}
Custom Node Extension
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];
  }
}
Custom Mark Extension
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];
  }
}
Extension with Custom Styles
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;
      }
    `;
  }
}
Using Configuration from Property Editor
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,
      }),
    ];
  }
}

Meta Properties

PropertyDescription
iconIcon shown in configuration UI
labelDisplay name
groupGroup for organizing extensions
descriptionOptional description

Common Extension Groups

  • formatting - Text formatting (bold, italic, etc.)
  • structure - Structural elements (headings, lists, etc.)
  • media - Media elements (images, embeds, etc.)
  • misc - Other functionality

That's it! Always fetch fresh docs, keep examples minimal, generate complete working code.

Comments

Markdown supported