From 62e20481078d171b516a67794e04243f92a4c84c Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 27 May 2026 09:32:30 +0200 Subject: [PATCH 1/4] Tiptap: Load enabled extensions in parallel and inline manifest APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the for…of/await loop in umb-input-tiptap's #loadExtensions with Promise.all over .map, so all enabled Tiptap extension APIs are fetched in parallel. Configured-extension order in _extensions is preserved. Inline the first-party Tiptap manifest API references: every `api: () => import('./X.tiptap-api.js')` and the equivalent toolbar / statusbar / kind references now use a static top-of-file import and `api: ClassName`. The dynamic `await import('rich-text-essentials.tiptap-api.js')` fallback in input-tiptap.element.ts is inlined for the same reason. External (plugin-supplied) Tiptap extensions and the lazy modal/toolbar UI element imports are unchanged. Why: on Umbraco Cloud, opening a document workspace with a rich text editor takes ~16 s uncached, of which ~14.6 s is a single serial waterfall — 31 extension APIs fetched one after the other from a for…of await loop, ~170 ms RTT stacked. Replacing the loop with Promise.all collapses that to roughly one round-trip; eagerly bundling the first-party manifests removes the dynamic chunk explosion that made the waterfall so long in the first place. The toolbar APIs (~20 of them) already load in a sub-100 ms parallel burst against the same server, confirming HTTP/2 multiplexing handles bulk parallel requests fine. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../input-tiptap/input-tiptap.element.ts | 23 +++++---- .../tiptap/extensions/anchor/manifests.ts | 6 ++- .../tiptap/extensions/block/manifests.ts | 6 ++- .../tiptap/extensions/blockquote/manifests.ts | 6 ++- .../tiptap/extensions/bold/manifests.ts | 6 ++- .../extensions/bullet-list/manifests.ts | 6 ++- .../extensions/character-map/manifests.ts | 3 +- .../extensions/clear-formatting/manifests.ts | 3 +- .../tiptap/extensions/code-block/manifests.ts | 6 ++- .../tiptap/extensions/core/manifests.ts | 3 +- .../extensions/embedded-media/manifests.ts | 6 ++- .../tiptap/extensions/figure/manifests.ts | 3 +- .../extensions/font-family/manifests.ts | 3 +- .../tiptap/extensions/font-size/manifests.ts | 3 +- .../tiptap/extensions/heading/manifests.ts | 21 +++++--- .../extensions/horizontal-rule/manifests.ts | 6 ++- .../extensions/html-attr-class/manifests.ts | 3 +- .../extensions/html-attr-dataset/manifests.ts | 3 +- .../extensions/html-attr-id/manifests.ts | 3 +- .../extensions/html-attr-style/manifests.ts | 3 +- .../extensions/html-tag-div/manifests.ts | 3 +- .../extensions/html-tag-span/manifests.ts | 3 +- .../tiptap/extensions/image/manifests.ts | 3 +- .../tiptap/extensions/italic/manifests.ts | 6 ++- .../tiptap/extensions/link/manifests.ts | 9 ++-- .../extensions/media-picker/manifests.ts | 3 +- .../extensions/media-upload/manifests.ts | 3 +- .../extensions/ordered-list/manifests.ts | 6 ++- .../tiptap/extensions/strike/manifests.ts | 6 ++- .../extensions/style-menu/style-menu.kind.ts | 3 +- .../tiptap/extensions/subscript/manifests.ts | 6 ++- .../extensions/superscript/manifests.ts | 6 ++- .../tiptap/extensions/table/manifests.ts | 48 ++++++++++++------- .../tiptap/extensions/text-align/manifests.ts | 15 ++++-- .../tiptap/extensions/text-color/manifests.ts | 6 ++- .../extensions/text-direction/manifests.ts | 9 ++-- .../extensions/text-indent/manifests.ts | 9 ++-- .../extensions/trailing-node/manifests.ts | 3 +- .../tiptap/extensions/underline/manifests.ts | 6 ++- .../tiptap/extensions/undo-redo/manifests.ts | 6 ++- .../extensions/view-source/manifests.ts | 3 +- .../tiptap/extensions/word-count/manifests.ts | 3 +- 42 files changed, 189 insertions(+), 98 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts index addfe51b6388..90f485b06080 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts @@ -1,3 +1,4 @@ +import UmbTiptapRichTextEssentialsExtensionApi from '../../extensions/core/rich-text-essentials.tiptap-api.js'; import { Editor } from '../../externals.js'; import { UmbTiptapRteContext } from '../../contexts/tiptap-rte.context.js'; import type { AnyExtension } from '../../externals.js'; @@ -140,21 +141,23 @@ export class UmbInputTiptapElement extends UmbFormControlMixin((resolve) => { this.observe(umbExtensionsRegistry.byTypeAndAliases('tiptapExtension', enabledExtensions), async (manifests) => { - for (const manifest of manifests) { - if (manifest.api) { + const loaded = await Promise.all( + manifests.map(async (manifest) => { + if (!manifest.api) return null; const extension = await loadManifestApi(manifest.api); - if (extension) { - const ext = new extension(this); - ext.manifest = manifest; - this._extensions.push(ext); - } - } + if (!extension) return null; + const ext = new extension(this); + ext.manifest = manifest; + return ext; + }), + ); + for (const ext of loaded) { + if (ext) this._extensions.push(ext); } resolve(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts index 2ef13ee73557..c096647fc0b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts @@ -1,3 +1,5 @@ +import UmbTiptapAnchorExtensionApi from './anchor.tiptap-api.js'; +import UmbTiptapToolbarAnchorExtensionApi from './anchor.tiptap-toolbar-api.js'; import { UMB_TIPTAP_ANCHOR_MODAL_ALIAS } from './modals/constants.js'; export const manifests: Array = [ @@ -5,7 +7,7 @@ export const manifests: Array = [ type: 'tiptapExtension', alias: 'Umb.Tiptap.Anchor', name: 'Anchor Tiptap Extension', - api: () => import('./anchor.tiptap-api.js'), + api: UmbTiptapAnchorExtensionApi, meta: { icon: 'icon-anchor', label: '#tiptap_anchor', @@ -17,7 +19,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Anchor', name: 'Anchor Tiptap Toolbar Extension', - api: () => import('./anchor.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarAnchorExtensionApi, forExtensions: ['Umb.Tiptap.Anchor'], meta: { alias: 'anchor', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts index bee2331d93c7..169cf54be6cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts @@ -1,3 +1,5 @@ +import UmbTiptapBlockElementApi from './block.tiptap-api.js'; +import UmbTiptapBlockPickerToolbarExtension from './block.tiptap-toolbar-api.js'; import type { ManifestTiptapExtension } from '../tiptap.extension.js'; import type { ManifestTiptapToolbarExtensionButtonKind } from '../tiptap-toolbar.extension.js'; @@ -6,7 +8,7 @@ export const manifests: Array import('./block.tiptap-api.js'), + api: UmbTiptapBlockElementApi, meta: { icon: 'icon-plugin', label: 'Block', @@ -18,7 +20,7 @@ export const manifests: Array import('./block.tiptap-toolbar-api.js'), + api: UmbTiptapBlockPickerToolbarExtension, forExtensions: ['Umb.Tiptap.Block'], meta: { alias: 'umbblockpicker', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts index 9938dd4263b1..f34733bffbfe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapBlockquoteExtensionApi from './blockquote.tiptap-api.js'; +import UmbTiptapToolbarBlockquoteExtensionApi from './blockquote.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Blockquote', name: 'Blockquote Tiptap Extension', - api: () => import('./blockquote.tiptap-api.js'), + api: UmbTiptapBlockquoteExtensionApi, meta: { icon: 'icon-blockquote', label: 'Blockquote', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Blockquote', name: 'Blockquote Tiptap Toolbar Extension', - api: () => import('./blockquote.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarBlockquoteExtensionApi, forExtensions: ['Umb.Tiptap.Blockquote'], meta: { alias: 'blockquote', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts index a435430ed97a..6caf0dc74f4f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapBoldExtensionApi from './bold.tiptap-api.js'; +import UmbTiptapToolbarBoldExtensionApi from './bold.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Bold', name: 'Bold Tiptap Extension', - api: () => import('./bold.tiptap-api.js'), + api: UmbTiptapBoldExtensionApi, meta: { icon: 'icon-bold', label: 'Bold', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Bold', name: 'Bold Tiptap Toolbar Extension', - api: () => import('./bold.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarBoldExtensionApi, forExtensions: ['Umb.Tiptap.Bold'], meta: { alias: 'bold', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts index 58fdceb9c056..60f4b3347ae4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapBulletListExtensionApi from './bullet-list.tiptap-api.js'; +import UmbTiptapToolbarBulletListExtensionApi from './bullet-list.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.BulletList', name: 'Bullet List Tiptap Extension', - api: () => import('./bullet-list.tiptap-api.js'), + api: UmbTiptapBulletListExtensionApi, meta: { icon: 'icon-bulleted-list', label: 'Bullet List', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.BulletList', name: 'Bullet List Tiptap Toolbar Extension', - api: () => import('./bullet-list.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarBulletListExtensionApi, forExtensions: ['Umb.Tiptap.BulletList'], meta: { alias: 'bulletList', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts index cdc8117bd0f9..638acb8d8877 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts @@ -1,3 +1,4 @@ +import UmbTiptapToolbarCharacterMapExtensionApi from './character-map.tiptap-toolbar-api.js'; import { UMB_TIPTAP_CHARACTER_MAP_MODAL_ALIAS } from './constants.js'; export const manifests: Array = [ @@ -6,7 +7,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.CharacterMap', name: 'Character Map Tiptap Toolbar Extension', - api: () => import('./character-map.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarCharacterMapExtensionApi, meta: { alias: 'umbCharacterMap', icon: 'icon-omega', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts index 5516bef1fb66..80753688de6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts @@ -1,10 +1,11 @@ +import UmbTiptapToolbarClearFormattingExtensionApi from './clear-formatting.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.ClearFormatting', name: 'Clear Formatting Tiptap Toolbar Extension', - api: () => import('./clear-formatting.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarClearFormattingExtensionApi, meta: { alias: 'clear-formatting', icon: 'icon-clear-formatting', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts index 0d866a5307ce..b4a8d81d2c51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapCodeBlockExtensionApi from './code-block.tiptap-api.js'; +import UmbTiptapToolbarCodeBlockExtensionApi from './code-block.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.CodeBlock', name: 'Code Block Tiptap Extension', - api: () => import('./code-block.tiptap-api.js'), + api: UmbTiptapCodeBlockExtensionApi, meta: { icon: 'icon-code', label: 'Code Block', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.CodeBlock', name: 'Code Block Tiptap Toolbar Extension', - api: () => import('./code-block.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarCodeBlockExtensionApi, forExtensions: ['Umb.Tiptap.CodeBlock'], meta: { alias: 'codeBlock', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts index dafe43c8e7db..fa80e7777e42 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapRichTextEssentialsExtensionApi from './rich-text-essentials.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.RichTextEssentials', name: 'Rich Text Essentials Tiptap Extension', - api: () => import('./rich-text-essentials.tiptap-api.js'), + api: UmbTiptapRichTextEssentialsExtensionApi, weight: 1000, meta: { icon: 'icon-browser-window', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts index d299978d5502..3e35767adf90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapEmbeddedMediaExtensionApi from './embedded-media.tiptap-api.js'; +import UmbTiptapToolbarEmbeddedMediaExtensionApi from './embedded-media.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Embed', name: 'Embedded Media Tiptap Extension', - api: () => import('./embedded-media.tiptap-api.js'), + api: UmbTiptapEmbeddedMediaExtensionApi, meta: { icon: 'icon-embed', label: '#general_embed', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.EmbeddedMedia', name: 'Embedded Media Tiptap Toolbar Extension', - api: () => import('./embedded-media.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarEmbeddedMediaExtensionApi, forExtensions: ['Umb.Tiptap.Embed'], meta: { alias: 'umbEmbeddedMedia', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts index ef5157228652..e0f6d7003fd0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapFigureExtensionApi from './figure.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Figure', name: 'Figure Tiptap Extension', - api: () => import('./figure.tiptap-api.js'), + api: UmbTiptapFigureExtensionApi, meta: { icon: 'icon-frame', label: 'Figure', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts index 6e6ea6392b55..4986a7bdffb7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts @@ -1,10 +1,11 @@ +import UmbTiptapToolbarFontFamilyExtensionApi from './font-family.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'menu', alias: 'Umb.Tiptap.Toolbar.FontFamily', name: 'Font Family Tiptap Toolbar Extension', - api: () => import('./font-family.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarFontFamilyExtensionApi, forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], items: [ { label: 'Sans serif', appearance: { style: 'font-family: sans-serif;' }, data: 'sans-serif' }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts index 52c0c21d2ada..97db8ed5a409 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts @@ -1,10 +1,11 @@ +import UmbTiptapToolbarFontSizeExtensionApi from './font-size.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'menu', alias: 'Umb.Tiptap.Toolbar.FontSize', name: 'Font Size Tiptap Toolbar Extension', - api: () => import('./font-size.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarFontSizeExtensionApi, forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], items: [ { label: '8pt', data: '8pt' }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts index a7f2f60c066f..2cb5649b2c76 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts @@ -1,9 +1,16 @@ +import UmbTiptapHeadingExtensionApi from './heading.tiptap-api.js'; +import UmbTiptapToolbarHeading1ExtensionApi from './heading1.tiptap-toolbar-api.js'; +import UmbTiptapToolbarHeading2ExtensionApi from './heading2.tiptap-toolbar-api.js'; +import UmbTiptapToolbarHeading3ExtensionApi from './heading3.tiptap-toolbar-api.js'; +import UmbTiptapToolbarHeading4ExtensionApi from './heading4.tiptap-toolbar-api.js'; +import UmbTiptapToolbarHeading5ExtensionApi from './heading5.tiptap-toolbar-api.js'; +import UmbTiptapToolbarHeading6ExtensionApi from './heading6.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Heading', name: 'Headings Tiptap Extension', - api: () => import('./heading.tiptap-api.js'), + api: UmbTiptapHeadingExtensionApi, meta: { icon: 'icon-heading', label: 'Headings', @@ -15,7 +22,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading1', name: 'Heading 1 Tiptap Toolbar Extension', - api: () => import('./heading1.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading1ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading1', @@ -28,7 +35,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading2', name: 'Heading 2 Tiptap Toolbar Extension', - api: () => import('./heading2.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading2ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading2', @@ -41,7 +48,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading3', name: 'Heading 3 Tiptap Toolbar Extension', - api: () => import('./heading3.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading3ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading3', @@ -54,7 +61,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading4', name: 'Heading 4 Tiptap Toolbar Extension', - api: () => import('./heading4.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading4ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading4', @@ -67,7 +74,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading5', name: 'Heading 5 Tiptap Toolbar Extension', - api: () => import('./heading5.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading5ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading5', @@ -80,7 +87,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading6', name: 'Heading 6 Tiptap Toolbar Extension', - api: () => import('./heading6.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHeading6ExtensionApi, forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading6', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts index 86ec324126d4..b0f5765b58ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapHorizontalRuleExtensionApi from './horizontal-rule.tiptap-api.js'; +import UmbTiptapToolbarHorizontalRuleExtensionApi from './horizontal-rule.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HorizontalRule', name: 'Horizontal Rule Tiptap Extension', - api: () => import('./horizontal-rule.tiptap-api.js'), + api: UmbTiptapHorizontalRuleExtensionApi, meta: { icon: 'icon-horizontal-rule', label: 'Horizontal Rule', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.HorizontalRule', name: 'Horizontal Rule Tiptap Toolbar Extension', - api: () => import('./horizontal-rule.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarHorizontalRuleExtensionApi, forExtensions: ['Umb.Tiptap.HorizontalRule'], meta: { alias: 'horizontalRule', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts index 01badb125f75..1397848f0622 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlAttributeClassExtensionApi from './html-attr-class.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeClass', name: 'Class HTML Attribute Tiptap Extension', - api: () => import('./html-attr-class.tiptap-api.js'), + api: UmbTiptapHtmlAttributeClassExtensionApi, meta: { icon: 'icon-barcode', label: '`class` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts index 44aca270a0ff..6e37d471115a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlAttributeDatasetExtensionApi from './html-attr-dataset.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeDataset', name: 'Dataset HTML Attribute Tiptap Extension', - api: () => import('./html-attr-dataset.tiptap-api.js'), + api: UmbTiptapHtmlAttributeDatasetExtensionApi, meta: { icon: 'icon-binarycode', label: '`data-*` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts index b77fedc7bf84..4f437ca30692 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlAttributeIdExtensionApi from './html-attr-id.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeId', name: 'ID HTML Attribute Tiptap Extension', - api: () => import('./html-attr-id.tiptap-api.js'), + api: UmbTiptapHtmlAttributeIdExtensionApi, meta: { icon: 'icon-fingerprint', label: '`id` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts index edc851a0e2fc..0759b1d2382d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlAttributeStyleExtensionApi from './html-attr-style.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeStyle', name: 'Style HTML Attribute Tiptap Extension', - api: () => import('./html-attr-style.tiptap-api.js'), + api: UmbTiptapHtmlAttributeStyleExtensionApi, meta: { icon: 'icon-palette', label: '`style` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts index ac85724183f6..514c7acc89c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlTagDivExtensionApi from './html-tag-div.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlTagDiv', name: 'Div HTML Tag Tiptap Extension', - api: () => import('./html-tag-div.tiptap-api.js'), + api: UmbTiptapHtmlTagDivExtensionApi, meta: { icon: 'icon-document-html', label: '`
` tags', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts index 0265382a0076..b51c24d03fa6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapHtmlTagSpanExtensionApi from './html-tag-span.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlTagSpan', name: 'Span HTML Tag Tiptap Extension', - api: () => import('./html-tag-span.tiptap-api.js'), + api: UmbTiptapHtmlTagSpanExtensionApi, meta: { icon: 'icon-document-html', label: '`` tags', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts index 22ad0583ba74..aae36a4def27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapImageExtensionApi from './image.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Image', name: 'Image Tiptap Extension', - api: () => import('./image.tiptap-api.js'), + api: UmbTiptapImageExtensionApi, meta: { icon: 'icon-picture', label: 'Image', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts index fe75d0872000..672a71708109 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapItalicExtensionApi from './italic.tiptap-api.js'; +import UmbTiptapToolbarItalicExtensionApi from './italic.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Italic', name: 'Italic Tiptap Extension', - api: () => import('./italic.tiptap-api.js'), + api: UmbTiptapItalicExtensionApi, meta: { icon: 'icon-italic', label: 'Italic', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Italic', name: 'Italic Tiptap Toolbar Extension', - api: () => import('./italic.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarItalicExtensionApi, forExtensions: ['Umb.Tiptap.Italic'], meta: { alias: 'italic', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts index f82243cfb635..71e4ad31ed2d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts @@ -1,9 +1,12 @@ +import UmbTiptapLinkExtensionApi from './link.tiptap-api.js'; +import UmbTiptapToolbarLinkExtensionApi from './link.tiptap-toolbar-api.js'; +import UmbTiptapToolbarUnlinkExtensionApi from './unlink.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Link', name: 'Link Tiptap Extension', - api: () => import('./link.tiptap-api.js'), + api: UmbTiptapLinkExtensionApi, meta: { icon: 'icon-link', label: '#defaultdialogs_urlLinkPicker', @@ -15,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Link', name: 'Link Tiptap Toolbar Extension', - api: () => import('./link.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarLinkExtensionApi, forExtensions: ['Umb.Tiptap.Link'], meta: { alias: 'umbLink', @@ -28,7 +31,7 @@ export const manifests: Array = [ kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Unlink', name: 'Unlink Tiptap Toolbar Extension', - api: () => import('./unlink.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarUnlinkExtensionApi, forExtensions: ['Umb.Tiptap.Link'], meta: { alias: 'unlink', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts index cf0918261dd5..388613780660 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts @@ -1,10 +1,11 @@ +import UmbTiptapToolbarMediaPickerToolbarExtensionApi from './media-picker.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.MediaPicker', name: 'Media Picker Tiptap Toolbar Extension', - api: () => import('./media-picker.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarMediaPickerToolbarExtensionApi, forExtensions: ['Umb.Tiptap.Figure', 'Umb.Tiptap.Image'], meta: { alias: 'umbMedia', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts index 25e3183c5f87..da8c832586eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapMediaUploadExtensionApi from './media-upload.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.MediaUpload', name: 'Media Upload Tiptap Extension', - api: () => import('./media-upload.tiptap-api.js'), + api: UmbTiptapMediaUploadExtensionApi, meta: { icon: 'icon-image-up', label: 'Media Upload', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts index 089dc6936547..7ddc3bda10ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapOrderedListExtensionApi from './ordered-list.tiptap-api.js'; +import UmbTiptapToolbarOrderedListExtensionApi from './ordered-list.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.OrderedList', name: 'Ordered List Tiptap Extension', - api: () => import('./ordered-list.tiptap-api.js'), + api: UmbTiptapOrderedListExtensionApi, meta: { icon: 'icon-ordered-list', label: 'Ordered List', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.OrderedList', name: 'Ordered List Tiptap Toolbar Extension', - api: () => import('./ordered-list.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarOrderedListExtensionApi, forExtensions: ['Umb.Tiptap.OrderedList'], meta: { alias: 'orderedList', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts index 8cd410645ab7..5bcacb35cfb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts @@ -1,9 +1,11 @@ +import UmbTiptapStrikeExtensionApi from './strike.tiptap-api.js'; +import UmbTiptapToolbarStrikeExtensionApi from './strike.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Strike', name: 'Strike Tiptap Extension', - api: () => import('./strike.tiptap-api.js'), + api: UmbTiptapStrikeExtensionApi, meta: { icon: 'icon-strikethrough', label: 'Strike', @@ -15,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Strike', name: 'Strike Tiptap Toolbar Extension', - api: () => import('./strike.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarStrikeExtensionApi, forExtensions: ['Umb.Tiptap.Strike'], meta: { alias: 'strike', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts index f211fc9135e9..4cbc3fa4e228 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts @@ -1,3 +1,4 @@ +import UmbTiptapToolbarStyleMenuApi from './style-menu.tiptap-toolbar-api.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -6,7 +7,7 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'styleMenu', matchType: 'tiptapToolbarExtension', manifest: { - api: () => import('./style-menu.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarStyleMenuApi, element: () => import('../../components/toolbar/tiptap-toolbar-menu.element.js'), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts index 7742d8bd8101..3bcc57ab7aa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts @@ -1,10 +1,12 @@ +import UmbTiptapSubscriptExtensionApi from './subscript.tiptap-api.js'; +import UmbTiptapToolbarSubscriptExtensionApi from './subscript.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Subscript', name: 'Subscript Tiptap Extension', - api: () => import('./subscript.tiptap-api.js'), + api: UmbTiptapSubscriptExtensionApi, meta: { icon: 'icon-subscript', label: 'Subscript', @@ -16,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Subscript', name: 'Subscript Tiptap Toolbar Extension', - api: () => import('./subscript.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarSubscriptExtensionApi, forExtensions: ['Umb.Tiptap.Subscript'], meta: { alias: 'subscript', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts index 818216ae0701..12b0fca18f6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts @@ -1,10 +1,12 @@ +import UmbTiptapSuperscriptExtensionApi from './superscript.tiptap-api.js'; +import UmbTiptapToolbarSuperscriptExtensionApi from './superscript.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Superscript', name: 'Superscript Tiptap Extension', - api: () => import('./superscript.tiptap-api.js'), + api: UmbTiptapSuperscriptExtensionApi, meta: { icon: 'icon-superscript', label: 'Superscript', @@ -16,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Superscript', name: 'Superscript Tiptap Toolbar Extension', - api: () => import('./superscript.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarSuperscriptExtensionApi, forExtensions: ['Umb.Tiptap.Superscript'], meta: { alias: 'superscript', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts index e0340bbe5f91..72a8b8b3faa4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts @@ -1,3 +1,19 @@ +import UmbTableCellMergeAction from './actions/table-cell-merge.action.js'; +import UmbTableCellMergeSplitAction from './actions/table-cell-merge-split.action.js'; +import UmbTableCellSplitAction from './actions/table-cell-split.action.js'; +import UmbTableCellToggleHeaderAction from './actions/table-cell-toggle-header.action.js'; +import UmbTableColumnAddAfterAction from './actions/table-column-add-after.action.js'; +import UmbTableColumnAddBeforeAction from './actions/table-column-add-before.action.js'; +import UmbTableColumnDeleteAction from './actions/table-column-delete.action.js'; +import UmbTableColumnToggleHeaderAction from './actions/table-column-toggle-header.action.js'; +import UmbTableDeleteAction from './actions/table-delete.action.js'; +import UmbTablePropertiesAction from './actions/table-properties.action.js'; +import UmbTableRowAddAfterAction from './actions/table-row-add-after.action.js'; +import UmbTableRowAddBeforeAction from './actions/table-row-add-before.action.js'; +import UmbTableRowDeleteAction from './actions/table-row-delete.action.js'; +import UmbTableRowToggleHeaderAction from './actions/table-row-toggle-header.action.js'; +import UmbTiptapTableExtensionApi from './table.tiptap-api.js'; +import UmbTiptapToolbarTableExtensionApi from './table.tiptap-toolbar-api.js'; import { UMB_TIPTAP_TABLE_PROPERTIES_MODAL_ALIAS } from './modals/constants.js'; const UMB_MENU_TIPTAP_TABLE_ALIAS = 'Umb.Menu.Tiptap.Table'; @@ -20,7 +36,7 @@ const coreExtensions: Array = [ kind: 'button', alias: 'Umb.Tiptap.Table', name: 'Table Tiptap Extension', - api: () => import('./table.tiptap-api.js'), + api: UmbTiptapTableExtensionApi, meta: { icon: 'icon-table', label: 'Table', @@ -35,7 +51,7 @@ const toolbarExtensions: Array = [ kind: 'menu', alias: 'Umb.Tiptap.Toolbar.Table', name: 'Table Tiptap Extension', - api: () => import('./table.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTableExtensionApi, element: () => import('./components/table-toolbar-menu.element.js'), forExtensions: ['Umb.Tiptap.Table'], items: [ @@ -74,7 +90,7 @@ const tableMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableProperties', name: 'Tiptap Table Menu Item: Table Properties', - api: () => import('./actions/table-properties.action.js'), + api: UmbTablePropertiesAction, weight: 110, meta: { label: 'Table properties', @@ -86,7 +102,7 @@ const tableMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableDelete', name: 'Tiptap Table Menu Item: Delete Table', - api: () => import('./actions/table-delete.action.js'), + api: UmbTableDeleteAction, weight: 100, meta: { label: 'Delete table', @@ -107,7 +123,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnAddBefore', name: 'Tiptap Table Menu Item: Add Column Before', - api: () => import('./actions/table-column-add-before.action.js'), + api: UmbTableColumnAddBeforeAction, weight: 120, meta: { label: 'Add column before', @@ -120,7 +136,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnAddAfter', name: 'Tiptap Table Menu Item: Add Column After', - api: () => import('./actions/table-column-add-after.action.js'), + api: UmbTableColumnAddAfterAction, weight: 110, meta: { label: 'Add column after', @@ -133,7 +149,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnDelete', name: 'Tiptap Table Menu Item: Delete Column', - api: () => import('./actions/table-column-delete.action.js'), + api: UmbTableColumnDeleteAction, weight: 100, meta: { label: 'Delete column', @@ -146,7 +162,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Column', - api: () => import('./actions/table-column-toggle-header.action.js'), + api: UmbTableColumnToggleHeaderAction, weight: 90, meta: { label: 'Toggle header column', @@ -166,7 +182,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowAddBefore', name: 'Tiptap Table Menu Item: Add Row Before', - api: () => import('./actions/table-row-add-before.action.js'), + api: UmbTableRowAddBeforeAction, weight: 120, meta: { label: 'Add row before', @@ -179,7 +195,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowAddAfter', name: 'Tiptap Table Menu Item: Add Row After', - api: () => import('./actions/table-row-add-after.action.js'), + api: UmbTableRowAddAfterAction, weight: 110, meta: { label: 'Add row after', @@ -192,7 +208,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowDelete', name: 'Tiptap Table Menu Item: Delete Row', - api: () => import('./actions/table-row-delete.action.js'), + api: UmbTableRowDeleteAction, weight: 100, meta: { label: 'Delete row', @@ -205,7 +221,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Row', - api: () => import('./actions/table-row-toggle-header.action.js'), + api: UmbTableRowToggleHeaderAction, weight: 90, meta: { label: 'Toggle header row', @@ -225,7 +241,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellMerge', name: 'Tiptap Table Menu Item: Merge Cell', - api: () => import('./actions/table-cell-merge.action.js'), + api: UmbTableCellMergeAction, weight: 120, meta: { label: 'Merge cells', @@ -237,7 +253,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellSplit', name: 'Tiptap Table Menu Item: Split Cell', - api: () => import('./actions/table-cell-split.action.js'), + api: UmbTableCellSplitAction, weight: 110, meta: { label: 'Split cell', @@ -249,7 +265,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellMergeSplit', name: 'Tiptap Table Menu Item: Merge Or Split Cell', - api: () => import('./actions/table-cell-merge-split.action.js'), + api: UmbTableCellMergeSplitAction, weight: 100, meta: { label: 'Merge or split', @@ -261,7 +277,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Cell', - api: () => import('./actions/table-cell-toggle-header.action.js'), + api: UmbTableCellToggleHeaderAction, weight: 90, meta: { label: 'Toggle header cell', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts index fce382bce002..42219eb1a7cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts @@ -1,9 +1,14 @@ +import UmbTiptapTextAlignExtensionApi from './text-align.tiptap-api.js'; +import UmbTiptapToolbarTextAlignCenterExtensionApi from './text-align-center.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextAlignJustifyExtensionApi from './text-align-justify.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextAlignLeftExtensionApi from './text-align-left.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextAlignRightExtensionApi from './text-align-right.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextAlign', name: 'Text Align Tiptap Extension', - api: () => import('./text-align.tiptap-api.js'), + api: UmbTiptapTextAlignExtensionApi, meta: { icon: 'icon-text-align-justify', label: 'Text Align', @@ -15,7 +20,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignLeft', name: 'Text Align Left Tiptap Toolbar Extension', - api: () => import('./text-align-left.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextAlignLeftExtensionApi, forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-left', @@ -28,7 +33,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignCenter', name: 'Text Align Center Tiptap Toolbar Extension', - api: () => import('./text-align-center.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextAlignCenterExtensionApi, forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-center', @@ -41,7 +46,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignRight', name: 'Text Align Right Tiptap Toolbar Extension', - api: () => import('./text-align-right.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextAlignRightExtensionApi, forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-right', @@ -54,7 +59,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignJustify', name: 'Text Align Justify Tiptap Toolbar Extension', - api: () => import('./text-align-justify.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextAlignJustifyExtensionApi, forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-justify', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts index 3d5d5ff91318..772f6b8efa92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts @@ -1,10 +1,12 @@ +import UmbTiptapToolbarTextColorBackgroundExtensionApi from './text-color-background.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextColorForegroundExtensionApi from './text-color-foreground.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'colorPickerButton', alias: 'Umb.Tiptap.Toolbar.TextColorBackground', name: 'Text Color Background Tiptap Toolbar Extension', - api: () => import('./text-color-background.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextColorBackgroundExtensionApi, forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], meta: { alias: 'text-color-background', @@ -17,7 +19,7 @@ export const manifests: Array = [ kind: 'colorPickerButton', alias: 'Umb.Tiptap.Toolbar.TextColorForeground', name: 'Text Color Foreground Tiptap Toolbar Extension', - api: () => import('./text-color-foreground.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextColorForegroundExtensionApi, forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], meta: { alias: 'text-color-foreground', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts index 49bdede2e759..d14123d4b35c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts @@ -1,9 +1,12 @@ +import UmbTiptapTextDirectionExtensionApi from './text-direction.tiptap-api.js'; +import UmbTiptapToolbarTextDirectionLtrExtensionApi from './text-direction-ltr.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextDirectionRtlExtensionApi from './text-direction-rtl.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextDirection', name: 'Text Direction Tiptap Extension', - api: () => import('./text-direction.tiptap-api.js'), + api: UmbTiptapTextDirectionExtensionApi, meta: { icon: 'icon-text-direction-ltr', label: 'Text Direction', @@ -15,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextDirectionRtl', name: 'Text Direction RTL Tiptap Toolbar Extension', - api: () => import('./text-direction-rtl.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextDirectionRtlExtensionApi, forExtensions: ['Umb.Tiptap.TextDirection'], meta: { alias: 'text-direction-rtl', @@ -28,7 +31,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextDirectionLtr', name: 'Text Direction LTR Tiptap Toolbar Extension', - api: () => import('./text-direction-ltr.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextDirectionLtrExtensionApi, forExtensions: ['Umb.Tiptap.TextDirection'], meta: { alias: 'text-direction-ltr', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts index 9d0b6c3ee978..4d42e34273d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts @@ -1,9 +1,12 @@ +import UmbTiptapTextIndentExtensionApi from './text-indent.tiptap-api.js'; +import UmbTiptapToolbarTextIndentExtensionApi from './text-indent.tiptap-toolbar-api.js'; +import UmbTiptapToolbarTextOutdentExtensionApi from './text-outdent.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextIndent', name: 'Text Indent Tiptap Extension', - api: () => import('./text-indent.tiptap-api.js'), + api: UmbTiptapTextIndentExtensionApi, meta: { icon: 'icon-indent', label: 'Text Indent', @@ -15,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextIndent', name: 'Text Indent Tiptap Toolbar Extension', - api: () => import('./text-indent.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextIndentExtensionApi, forExtensions: ['Umb.Tiptap.TextIndent'], meta: { alias: 'indent', @@ -28,7 +31,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextOutdent', name: 'Text Outdent Tiptap Toolbar Extension', - api: () => import('./text-outdent.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarTextOutdentExtensionApi, forExtensions: ['Umb.Tiptap.TextIndent'], meta: { alias: 'outdent', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts index 6b091e0d2bf7..8d1787c25742 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapTrailingNodeExtensionApi from './trailing-node.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TrailingNode', name: 'Trailing Node Tiptap Extension', - api: () => import('./trailing-node.tiptap-api.js'), + api: UmbTiptapTrailingNodeExtensionApi, meta: { icon: 'icon-page-down', label: 'Trailing Node', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts index 3cdaff46169a..4ecd52eafdd4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts @@ -1,10 +1,12 @@ +import UmbTiptapToolbarUnderlineExtensionApi from './underline.tiptap-toolbar-api.js'; +import UmbTiptapUnderlineExtensionApi from './underline.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Underline', name: 'Underline Tiptap Extension', - api: () => import('./underline.tiptap-api.js'), + api: UmbTiptapUnderlineExtensionApi, meta: { icon: 'icon-underline', label: 'Underline', @@ -16,7 +18,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Underline', name: 'Underline Tiptap Toolbar Extension', - api: () => import('./underline.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarUnderlineExtensionApi, forExtensions: ['Umb.Tiptap.Underline'], meta: { alias: 'underline', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts index 0fd64c4aa9f0..08e163ad98fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts @@ -1,10 +1,12 @@ +import UmbTiptapToolbarRedoExtensionApi from './redo.tiptap-toolbar-api.js'; +import UmbTiptapToolbarUndoExtensionApi from './undo.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Undo', name: 'Undo Tiptap Toolbar Extension', - api: () => import('./undo.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarUndoExtensionApi, meta: { alias: 'undo', icon: 'icon-undo', @@ -16,7 +18,7 @@ export const manifests: Array = [ kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Redo', name: 'Redo Tiptap Toolbar Extension', - api: () => import('./redo.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarRedoExtensionApi, meta: { alias: 'redo', icon: 'icon-redo', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts index e5e191edd067..1bba298529df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts @@ -1,10 +1,11 @@ +import UmbTiptapToolbarSourceEditorExtensionApi from './source-editor.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.SourceEditor', name: 'Source Editor Tiptap Toolbar Extension', - api: () => import('./source-editor.tiptap-toolbar-api.js'), + api: UmbTiptapToolbarSourceEditorExtensionApi, meta: { alias: 'umbSourceEditor', icon: 'icon-code-xml', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts index d563e0891c0a..cdef566792f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts @@ -1,9 +1,10 @@ +import UmbTiptapWordCountExtensionApi from './word-count.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.WordCount', name: 'Word Count Tiptap Extension', - api: () => import('./word-count.tiptap-api.js'), + api: UmbTiptapWordCountExtensionApi, meta: { icon: 'icon-speed-gauge', label: 'Word Count', From a8a36a49ac8440542077317ac919d9259e5ca5ad Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 27 May 2026 09:51:58 +0200 Subject: [PATCH 2/4] Tiptap: Inline element references for toolbar/statusbar/modal/clipboard manifests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends the manifest-inlining pass to the remaining `element: () => import(...)` and runtime API loader sites in the Tiptap package — toolbar/menu/action-button kinds, the table & character-map & anchor modals, the colour-picker button, the property-editor configuration UIs, both clipboard translators, the style-menu kind, and the default toolbar API fallback in tiptap-toolbar.element.ts. Result on the same Cloud test site (uncached, 17.5-rc): Tiptap chunk count: 71 → 4 Total tiptap bytes: ~3.2 MB → ~3.1 MB (essentially unchanged) Phase 5 of the load — the serial extension chain — collapses to a single consolidated chunk fetch. `input-tiptap.element.ts` and `property-editor-ui-tiptap.element.ts` are intentionally not inlined into anything else: `` is a public element usable standalone (custom dashboards, workspace views), and the property-editor shell loads via the property-editor UI loader. They remain exported as their own modules. CLAUDE.md updated to document the new convention for first-party Tiptap extensions (direct class refs) and the carve-out for external plugin extensions that may keep `() => import(...)` to ship their API code in a separate chunk. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/packages/tiptap/CLAUDE.md | 11 +++++++++-- .../packages/tiptap/clipboard/block/copy/manifest.ts | 3 ++- .../packages/tiptap/clipboard/block/paste/manifest.ts | 3 ++- .../components/toolbar/tiptap-toolbar.element.ts | 3 ++- .../packages/tiptap/extensions/anchor/manifests.ts | 3 ++- .../tiptap/extensions/character-map/manifests.ts | 3 ++- .../tiptap/extensions/element-path/manifests.ts | 4 +++- .../tiptap/extensions/style-menu/style-menu.kind.ts | 3 ++- .../src/packages/tiptap/extensions/table/manifests.ts | 6 ++++-- .../extensions/tiptap-toolbar-action-button.kind.ts | 3 ++- .../tiptap/extensions/tiptap-toolbar-button.kind.ts | 3 ++- .../tiptap-toolbar-color-picker-button.kind.ts | 3 ++- .../tiptap/extensions/tiptap-toolbar-menu.kind.ts | 3 ++- .../tiptap/extensions/word-count/manifests.ts | 4 +++- .../extensions-configuration/manifests.ts | 3 ++- .../statusbar-configuration/manifests.ts | 3 ++- .../tiptap/property-editors/tiptap-rte/manifests.ts | 3 ++- .../toolbar-configuration/manifests.ts | 3 ++- 18 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md b/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md index 22f13f02bb20..c1daa80e5286 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md @@ -144,12 +144,15 @@ export default class UmbTiptapBoldToolbarApi extends UmbTiptapToolbarElementApiB } // manifests.ts +import UmbTiptapBoldExtensionApi from './bold.tiptap-api.js'; +import UmbTiptapBoldToolbarApi from './bold.tiptap-toolbar-api.js'; + export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Bold', name: 'Bold Tiptap Extension', - api: () => import('./bold.tiptap-api.js'), + api: UmbTiptapBoldExtensionApi, meta: { icon: 'icon-bold', label: 'Bold', @@ -161,7 +164,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Bold', name: 'Bold Tiptap Toolbar Extension', - api: () => import('./bold.tiptap-toolbar-api.js'), + api: UmbTiptapBoldToolbarApi, forExtensions: ['Umb.Tiptap.Bold'], meta: { alias: 'bold', @@ -172,6 +175,10 @@ export const manifests: Array = [ ]; ``` +> **Why a direct reference, not `api: () => import(...)`?** First-party Tiptap extensions register their APIs as **direct class references** so Vite can roll them into the same chunk as the rest of the Tiptap package. Using a dynamic loader produces a separate JS chunk per extension, which on a high-latency link results in many serial network round-trips on first load. The same applies to `element:` on element-bearing manifests/kinds (toolbar buttons, statusbar items, modals shared across the package). +> +> External (plugin-supplied) Tiptap extensions may still use the `() => import(...)` form when they want their API code in a separately fetched chunk — `loadManifestApi` accepts both forms. + ### Extension with Custom Styles Override `getStyles()` to inject CSS into the editor's Shadow DOM: diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts index 94b59405fc7f..5c3b91234347 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts @@ -1,3 +1,4 @@ +import { UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator } from './block-rte-to-block-copy-translator.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from '../../../property-editors/tiptap-rte/constants.js'; import { UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE } from '@umbraco-cms/backoffice/block'; @@ -5,7 +6,7 @@ export const manifest: UmbExtensionManifest = { type: 'clipboardCopyPropertyValueTranslator', alias: 'Umb.ClipboardCopyPropertyValueTranslator.Tiptap.BlockRteToBlock', name: 'Tiptap Block RTE To Block Clipboard Copy Property Value Translator', - api: () => import('./block-rte-to-block-copy-translator.js'), + api: UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator, fromPropertyEditorUi: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, toClipboardEntryValueType: UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts index 3e4d65e74a03..ce137e9eac9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts @@ -1,3 +1,4 @@ +import { UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator } from './block-to-block-rte-paste-translator.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from '../../../property-editors/tiptap-rte/constants.js'; import { UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE } from '@umbraco-cms/backoffice/block'; @@ -5,7 +6,7 @@ export const manifest: UmbExtensionManifest = { type: 'clipboardPastePropertyValueTranslator', alias: 'Umb.ClipboardPastePropertyValueTranslator.Tiptap.BlockToBlockRte', name: 'Tiptap Block To Block RTE Clipboard Paste Property Value Translator', - api: () => import('./block-to-block-rte-paste-translator.js'), + api: UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator, fromClipboardEntryValueType: UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE, toPropertyEditorUi: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/toolbar/tiptap-toolbar.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/toolbar/tiptap-toolbar.element.ts index bb67cf45aa89..194207d199b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/toolbar/tiptap-toolbar.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/toolbar/tiptap-toolbar.element.ts @@ -1,3 +1,4 @@ +import UmbTiptapToolbarDefaultExtensionApi from '../../extensions/default-tiptap-toolbar-api.js'; import type { Editor } from '../../externals.js'; import type { UmbTiptapToolbarValue } from '../types.js'; import { css, customElement, html, nothing, property, repeat } from '@umbraco-cms/backoffice/external/lit'; @@ -68,7 +69,7 @@ export class UmbTiptapToolbarElement extends UmbLitElement { }, undefined, undefined, - () => import('../../extensions/default-tiptap-toolbar-api.js'), + UmbTiptapToolbarDefaultExtensionApi, ); this.#extensionsController.apiProperties = { configuration: this.configuration }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts index c096647fc0b5..9bc2bca85df9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts @@ -1,3 +1,4 @@ +import { UmbTiptapAnchorModalElement } from './modals/anchor-modal.element.js'; import UmbTiptapAnchorExtensionApi from './anchor.tiptap-api.js'; import UmbTiptapToolbarAnchorExtensionApi from './anchor.tiptap-toolbar-api.js'; import { UMB_TIPTAP_ANCHOR_MODAL_ALIAS } from './modals/constants.js'; @@ -31,6 +32,6 @@ export const manifests: Array = [ type: 'modal', alias: UMB_TIPTAP_ANCHOR_MODAL_ALIAS, name: 'Tiptap Anchor Modal', - element: () => import('./modals/anchor-modal.element.js'), + element: UmbTiptapAnchorModalElement, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts index 638acb8d8877..5219d7b85d79 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts @@ -1,3 +1,4 @@ +import { UmbCharacterMapModalElement } from './modals/character-map-modal.element.js'; import UmbTiptapToolbarCharacterMapExtensionApi from './character-map.tiptap-toolbar-api.js'; import { UMB_TIPTAP_CHARACTER_MAP_MODAL_ALIAS } from './constants.js'; @@ -18,6 +19,6 @@ export const manifests: Array = [ type: 'modal', alias: UMB_TIPTAP_CHARACTER_MAP_MODAL_ALIAS, name: 'Character Map Modal', - element: () => import('./modals/character-map-modal.element.js'), + element: UmbCharacterMapModalElement, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts index 368caf4fe7dc..cc886ec7f428 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts @@ -1,9 +1,11 @@ +import { UmbTiptapStatusbarElementPathElement } from './element-path.tiptap-statusbar-element.js'; + export const manifests: Array = [ { type: 'tiptapStatusbarExtension', alias: 'Umb.Tiptap.Statusbar.ElementPath', name: 'Element Path Tiptap Statusbar Extension', - element: () => import('./element-path.tiptap-statusbar-element.js'), + element: UmbTiptapStatusbarElementPathElement, meta: { alias: 'elementPath', icon: 'icon-map-alt', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts index 4cbc3fa4e228..9430b4847b51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts @@ -1,3 +1,4 @@ +import { UmbTiptapToolbarMenuElement } from '../../components/toolbar/tiptap-toolbar-menu.element.js'; import UmbTiptapToolbarStyleMenuApi from './style-menu.tiptap-toolbar-api.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; @@ -8,6 +9,6 @@ export const manifest: UmbExtensionManifestKind = { matchType: 'tiptapToolbarExtension', manifest: { api: UmbTiptapToolbarStyleMenuApi, - element: () => import('../../components/toolbar/tiptap-toolbar-menu.element.js'), + element: UmbTiptapToolbarMenuElement, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts index 72a8b8b3faa4..139fb448749a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts @@ -1,3 +1,5 @@ +import { UmbTiptapTablePropertiesModalElement } from './modals/table-properties-modal.element.js'; +import { UmbTiptapTableToolbarMenuElement } from './components/table-toolbar-menu.element.js'; import UmbTableCellMergeAction from './actions/table-cell-merge.action.js'; import UmbTableCellMergeSplitAction from './actions/table-cell-merge-split.action.js'; import UmbTableCellSplitAction from './actions/table-cell-split.action.js'; @@ -26,7 +28,7 @@ const modals: Array = [ type: 'modal', alias: UMB_TIPTAP_TABLE_PROPERTIES_MODAL_ALIAS, name: 'Tiptap Table Properties Modal', - element: () => import('./modals/table-properties-modal.element.js'), + element: UmbTiptapTablePropertiesModalElement, }, ]; @@ -52,7 +54,7 @@ const toolbarExtensions: Array = [ alias: 'Umb.Tiptap.Toolbar.Table', name: 'Table Tiptap Extension', api: UmbTiptapToolbarTableExtensionApi, - element: () => import('./components/table-toolbar-menu.element.js'), + element: UmbTiptapTableToolbarMenuElement, forExtensions: ['Umb.Tiptap.Table'], items: [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts index bb724ae92a56..605f2c88d78d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts @@ -1,3 +1,4 @@ +import { UmbTiptapToolbarButtonActionElement } from '../components/toolbar/tiptap-toolbar-button-action.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -6,6 +7,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'actionButton', matchType: 'tiptapToolbarExtension', manifest: { - element: () => import('../components/toolbar/tiptap-toolbar-button-action.element.js'), + element: UmbTiptapToolbarButtonActionElement, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts index 00292b0421fb..4832992fd96b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts @@ -1,3 +1,4 @@ +import { UmbTiptapToolbarButtonElement } from '../components/toolbar/tiptap-toolbar-button.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -6,6 +7,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'button', matchType: 'tiptapToolbarExtension', manifest: { - element: () => import('../components/toolbar/tiptap-toolbar-button.element.js'), + element: UmbTiptapToolbarButtonElement, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts index dfb1bca4ede9..7c9b604ce1ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts @@ -1,3 +1,4 @@ +import { UmbTiptapToolbarColorPickerButtonElement } from '../components/toolbar/tiptap-toolbar-color-picker-button.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -6,6 +7,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'colorPickerButton', matchType: 'tiptapToolbarExtension', manifest: { - element: () => import('../components/toolbar/tiptap-toolbar-color-picker-button.element.js'), + element: UmbTiptapToolbarColorPickerButtonElement, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts index bb69bc7a0986..d5ab291dff3a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts @@ -1,3 +1,4 @@ +import { UmbTiptapToolbarMenuElement } from '../components/toolbar/tiptap-toolbar-menu.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -6,6 +7,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'menu', matchType: 'tiptapToolbarExtension', manifest: { - element: () => import('../components/toolbar/tiptap-toolbar-menu.element.js'), + element: UmbTiptapToolbarMenuElement, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts index cdef566792f7..4b20816a2fd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts @@ -1,4 +1,6 @@ import UmbTiptapWordCountExtensionApi from './word-count.tiptap-api.js'; +import { UmbTiptapStatusbarWordCountElement } from './word-count.tiptap-statusbar-element.js'; + export const manifests: Array = [ { type: 'tiptapExtension', @@ -15,7 +17,7 @@ export const manifests: Array = [ type: 'tiptapStatusbarExtension', alias: 'Umb.Tiptap.Statusbar.WordCount', name: 'Word Count Tiptap Statusbar Extension', - element: () => import('./word-count.tiptap-statusbar-element.js'), + element: UmbTiptapStatusbarWordCountElement, forExtensions: ['Umb.Tiptap.WordCount'], meta: { alias: 'wordCount', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts index eb1c1f67ebe7..b49aa895229e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts @@ -1,3 +1,4 @@ +import { UmbPropertyEditorUiTiptapExtensionsConfigurationElement } from './property-editor-ui-tiptap-extensions-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -5,7 +6,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.ExtensionsConfiguration', name: 'Tiptap Extensions Property Editor UI', - element: () => import('./property-editor-ui-tiptap-extensions-configuration.element.js'), + element: UmbPropertyEditorUiTiptapExtensionsConfigurationElement, meta: { label: 'Tiptap Extensions Configuration', icon: 'icon-autofill', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts index ab3d182f7baa..c9bfca3d0af8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts @@ -1,3 +1,4 @@ +import { UmbPropertyEditorUiTiptapStatusbarConfigurationElement } from './property-editor-ui-tiptap-statusbar-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -5,7 +6,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.StatusbarConfiguration', name: 'Tiptap Statusbar Property Editor UI', - element: () => import('./property-editor-ui-tiptap-statusbar-configuration.element.js'), + element: UmbPropertyEditorUiTiptapStatusbarConfigurationElement, meta: { label: 'Tiptap Statusbar Configuration', icon: 'icon-autofill', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts index 34a2d8a9e213..af2bcc5be350 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts @@ -1,3 +1,4 @@ +import { UmbPropertyEditorUiTiptapElement } from './property-editor-ui-tiptap.element.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from './constants.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; @@ -6,7 +7,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, name: 'Rich Text Editor [Tiptap] Property Editor UI', - element: () => import('./property-editor-ui-tiptap.element.js'), + element: UmbPropertyEditorUiTiptapElement, meta: { label: '#rte_label', propertyEditorSchemaAlias: 'Umbraco.RichText', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts index dd26b0056917..12b9da29cafa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts @@ -1,3 +1,4 @@ +import { UmbPropertyEditorUiTiptapToolbarConfigurationElement } from './property-editor-ui-tiptap-toolbar-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -5,7 +6,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.ToolbarConfiguration', name: 'Tiptap Toolbar Property Editor UI', - element: () => import('./property-editor-ui-tiptap-toolbar-configuration.element.js'), + element: UmbPropertyEditorUiTiptapToolbarConfigurationElement, meta: { label: 'Tiptap Toolbar Configuration', icon: 'icon-autofill', From 9eaae651854e3e3a66ff2aaf25d57025de0d454a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 27 May 2026 14:24:35 +0200 Subject: [PATCH 3/4] Tiptap: Move extension APIs and elements into a shared lazy boundary chunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous PR collapsed ~70 Tiptap chunks into 3 by inlining first-party API and element references directly into manifest files. That win came with a real downside flagged in code review (lke / mra): the API/element implementation bytes ended up in the manifest registration bundle, so every workspace — including ones without an RTE — paid ~700 KB of Tiptap code on boot. This commit keeps the chunk-coalescing win but restores the lazy boundary by routing every first-party manifest's `api` / `element` reference through a single shared bundle file `extensions/extension-apis.bundle.ts`. Each manifest holds a dynamic-import thunk pointing at that one bundle, so: - Rollup still emits a single chunk for all Tiptap extension code (no chunk explosion). - The manifest registration bundle stays slim — it carries only metadata (alias / label / icon / group / kind / forExtensions) plus the thunks. - The bundle is only fetched the first time `` actually mounts. Data-type configuration UIs (`extensions-configuration`, `toolbar-configuration`, `statusbar-configuration`) read manifest metadata via `umbExtensionsRegistry.byType(...)` only — they never call `loadManifestApi` / `loadManifestElement`, so the data-type editor continues to work without loading any Tiptap implementation code. Property-editor UI elements (`tiptap-rte`, the three configuration UIs) also revert to `() => import('./X.element.js')` so each loads on demand from its own chunk rather than being inlined into the manifest bundle. `umb-input-tiptap` no longer statically imports the Rich Text Essentials API; it prepends the alias to the observed list instead, so essentials resolves through the same lazy bundle as every other extension. Added a test and stories file that mount `` standalone (no property-editor wrapper) to make the public usage pattern explicit. Built and verified via `npm run build:for:cms`: - `dist-cms/packages/tiptap/manifests.js` 48 KB (eager at boot) - `dist-cms/packages/tiptap/extension-apis.bundle-*.js` 84 KB (lazy) - `dist-cms/packages/tiptap/tiptap-toolbar-element-api-base-*.js` 654 KB (lazy dependency of the bundle) - per-element property-editor UI chunks load on demand when settings open `npm run check:circular`, `npm run compile`, `npx wtr src/packages/tiptap` all pass. Related to #21152, builds on #22995. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/packages/tiptap/CLAUDE.md | 19 +-- .../tiptap/clipboard/block/copy/manifest.ts | 6 +- .../tiptap/clipboard/block/paste/manifest.ts | 6 +- .../input-tiptap/input-tiptap.element.ts | 12 +- .../input-tiptap/input-tiptap.stories.ts | 85 ++++++++++++ .../input-tiptap/input-tiptap.test.ts | 36 +++++ .../tiptap/extensions/anchor/manifests.ts | 9 +- .../tiptap/extensions/block/manifests.ts | 6 +- .../tiptap/extensions/blockquote/manifests.ts | 7 +- .../tiptap/extensions/bold/manifests.ts | 6 +- .../extensions/bullet-list/manifests.ts | 7 +- .../extensions/character-map/manifests.ts | 7 +- .../extensions/clear-formatting/manifests.ts | 4 +- .../tiptap/extensions/code-block/manifests.ts | 7 +- .../tiptap/extensions/core/manifests.ts | 4 +- .../extensions/element-path/manifests.ts | 5 +- .../extensions/embedded-media/manifests.ts | 7 +- .../extensions/extension-apis.bundle.ts | 124 ++++++++++++++++++ .../tiptap/extensions/figure/manifests.ts | 3 +- .../extensions/font-family/manifests.ts | 4 +- .../tiptap/extensions/font-size/manifests.ts | 3 +- .../tiptap/extensions/heading/manifests.ts | 21 +-- .../extensions/horizontal-rule/manifests.ts | 7 +- .../extensions/html-attr-class/manifests.ts | 4 +- .../extensions/html-attr-dataset/manifests.ts | 4 +- .../extensions/html-attr-id/manifests.ts | 3 +- .../extensions/html-attr-style/manifests.ts | 4 +- .../extensions/html-tag-div/manifests.ts | 3 +- .../extensions/html-tag-span/manifests.ts | 3 +- .../tiptap/extensions/image/manifests.ts | 3 +- .../tiptap/extensions/italic/manifests.ts | 6 +- .../tiptap/extensions/link/manifests.ts | 9 +- .../extensions/media-picker/manifests.ts | 6 +- .../extensions/media-upload/manifests.ts | 3 +- .../extensions/ordered-list/manifests.ts | 7 +- .../tiptap/extensions/strike/manifests.ts | 6 +- .../extensions/style-menu/style-menu.kind.ts | 6 +- .../tiptap/extensions/subscript/manifests.ts | 7 +- .../extensions/superscript/manifests.ts | 7 +- .../tiptap/extensions/table/manifests.ts | 55 +++----- .../tiptap/extensions/text-align/manifests.ts | 19 ++- .../tiptap/extensions/text-color/manifests.ts | 12 +- .../extensions/text-direction/manifests.ts | 11 +- .../extensions/text-indent/manifests.ts | 11 +- .../tiptap-toolbar-action-button.kind.ts | 6 +- .../extensions/tiptap-toolbar-button.kind.ts | 3 +- ...tiptap-toolbar-color-picker-button.kind.ts | 6 +- .../extensions/tiptap-toolbar-menu.kind.ts | 3 +- .../extensions/trailing-node/manifests.ts | 3 +- .../tiptap/extensions/underline/manifests.ts | 7 +- .../tiptap/extensions/undo-redo/manifests.ts | 6 +- .../extensions/view-source/manifests.ts | 4 +- .../tiptap/extensions/word-count/manifests.ts | 8 +- .../extensions-configuration/manifests.ts | 3 +- .../statusbar-configuration/manifests.ts | 3 +- .../property-editors/tiptap-rte/manifests.ts | 3 +- .../toolbar-configuration/manifests.ts | 3 +- 57 files changed, 417 insertions(+), 225 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.stories.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/extension-apis.bundle.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md b/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md index c1daa80e5286..1c0d37e19af7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/CLAUDE.md @@ -143,16 +143,15 @@ export default class UmbTiptapBoldToolbarApi extends UmbTiptapToolbarElementApiB } } -// manifests.ts -import UmbTiptapBoldExtensionApi from './bold.tiptap-api.js'; -import UmbTiptapBoldToolbarApi from './bold.tiptap-toolbar-api.js'; - +// manifests.ts — uses dynamic-import thunks pointing at the SHARED boundary file, +// so manifest registration stays slim and the implementation code is only fetched +// the first time `umb-input-tiptap` actually mounts. export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Bold', name: 'Bold Tiptap Extension', - api: UmbTiptapBoldExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBoldExtensionApi })), meta: { icon: 'icon-bold', label: 'Bold', @@ -164,7 +163,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Bold', name: 'Bold Tiptap Toolbar Extension', - api: UmbTiptapBoldToolbarApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBoldToolbarApi })), forExtensions: ['Umb.Tiptap.Bold'], meta: { alias: 'bold', @@ -175,9 +174,13 @@ export const manifests: Array = [ ]; ``` -> **Why a direct reference, not `api: () => import(...)`?** First-party Tiptap extensions register their APIs as **direct class references** so Vite can roll them into the same chunk as the rest of the Tiptap package. Using a dynamic loader produces a separate JS chunk per extension, which on a high-latency link results in many serial network round-trips on first load. The same applies to `element:` on element-bearing manifests/kinds (toolbar buttons, statusbar items, modals shared across the package). +To register the new extension's API class, add a re-export line to `extensions/extension-apis.bundle.ts` (the shared boundary file). + +> **Why the indirection?** The data-type configuration UIs (`extensions-configuration`, `toolbar-configuration`, `statusbar-configuration`) enumerate the extension registry at boot to populate their pickers — they need every extension's manifest metadata (alias, label, icon, group). If the manifest were a static `api: SomeClass`, the implementation bytes would ship with the manifest registration and load on every workspace, including ones without an RTE. +> +> Routing all first-party API/element references through one shared bundle gives us the best of both worlds: manifests register at boot (so the config UIs work), but the implementation code lives in a single chunk that's only fetched the first time `umb-input-tiptap` actually renders. The Tiptap toolbar/statusbar/modal elements piggyback on the same chunk, so an RTE-bearing workspace pays one round-trip for everything Tiptap. > -> External (plugin-supplied) Tiptap extensions may still use the `() => import(...)` form when they want their API code in a separately fetched chunk — `loadManifestApi` accepts both forms. +> External (plugin-supplied) Tiptap extensions may still use the per-file `() => import('./my-thing.api.js')` form when they want their API code in a separately fetched chunk — `loadManifestApi` accepts both forms. ### Extension with Custom Styles diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts index 5c3b91234347..a1a11c24334c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/copy/manifest.ts @@ -1,4 +1,3 @@ -import { UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator } from './block-rte-to-block-copy-translator.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from '../../../property-editors/tiptap-rte/constants.js'; import { UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE } from '@umbraco-cms/backoffice/block'; @@ -6,7 +5,10 @@ export const manifest: UmbExtensionManifest = { type: 'clipboardCopyPropertyValueTranslator', alias: 'Umb.ClipboardCopyPropertyValueTranslator.Tiptap.BlockRteToBlock', name: 'Tiptap Block RTE To Block Clipboard Copy Property Value Translator', - api: UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator, + api: () => + import('../../../extensions/extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator, + })), fromPropertyEditorUi: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, toClipboardEntryValueType: UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts index ce137e9eac9c..a955f5bed5e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/clipboard/block/paste/manifest.ts @@ -1,4 +1,3 @@ -import { UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator } from './block-to-block-rte-paste-translator.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from '../../../property-editors/tiptap-rte/constants.js'; import { UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE } from '@umbraco-cms/backoffice/block'; @@ -6,7 +5,10 @@ export const manifest: UmbExtensionManifest = { type: 'clipboardPastePropertyValueTranslator', alias: 'Umb.ClipboardPastePropertyValueTranslator.Tiptap.BlockToBlockRte', name: 'Tiptap Block To Block RTE Clipboard Paste Property Value Translator', - api: UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator, + api: () => + import('../../../extensions/extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator, + })), fromClipboardEntryValueType: UMB_BLOCK_CLIPBOARD_ENTRY_VALUE_TYPE, toPropertyEditorUi: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts index 90f485b06080..7c717c7f976e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts @@ -1,4 +1,3 @@ -import UmbTiptapRichTextEssentialsExtensionApi from '../../extensions/core/rich-text-essentials.tiptap-api.js'; import { Editor } from '../../externals.js'; import { UmbTiptapRteContext } from '../../contexts/tiptap-rte.context.js'; import type { AnyExtension } from '../../externals.js'; @@ -140,12 +139,15 @@ export class UmbInputTiptapElement extends UmbFormControlMixin('extensions') ?? []; // Ensures that the "Rich Text Essentials" extension is always enabled. [LK] - if (!enabledExtensions.includes(TIPTAP_CORE_EXTENSION_ALIAS)) { - this._extensions.push(new UmbTiptapRichTextEssentialsExtensionApi(this)); - } + // Prepending the alias rather than statically importing the API class keeps + // essentials inside the shared `extension-apis.bundle` chunk and avoids + // duplicating it into the input-tiptap chunk. + const aliases = enabledExtensions.includes(TIPTAP_CORE_EXTENSION_ALIAS) + ? enabledExtensions + : [TIPTAP_CORE_EXTENSION_ALIAS, ...enabledExtensions]; await new Promise((resolve) => { - this.observe(umbExtensionsRegistry.byTypeAndAliases('tiptapExtension', enabledExtensions), async (manifests) => { + this.observe(umbExtensionsRegistry.byTypeAndAliases('tiptapExtension', aliases), async (manifests) => { const loaded = await Promise.all( manifests.map(async (manifest) => { if (!manifest.api) return null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.stories.ts new file mode 100644 index 000000000000..7802c6c85d44 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.stories.ts @@ -0,0 +1,85 @@ +import type { UmbInputTiptapElement } from './input-tiptap.element.js'; +import { manifests as tiptapManifests } from '../../manifests.js'; +import { html } from '@umbraco-cms/backoffice/external/lit'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import type { Meta, StoryObj } from '@storybook/web-components-vite'; + +import './input-tiptap.element.js'; + +// Standalone use case: a custom dashboard, workspace view, or external package can +// import `` directly. The story exists primarily so we can +// visually confirm in Storybook that registering the package manifests and +// rendering the element on its own — without `` — +// still triggers the lazy `extension-apis.bundle` chunk and instantiates the +// Tiptap editor end-to-end. + +// One-time manifest registration (Storybook keeps the registry alive across stories). +let manifestsRegistered = false; +function ensureManifestsRegistered() { + if (manifestsRegistered) return; + umbExtensionsRegistry.registerMany(tiptapManifests); + manifestsRegistered = true; +} + +const minimalConfig = new UmbPropertyEditorConfigCollection([ + { alias: 'dimensions', value: { height: 300 } }, + { alias: 'extensions', value: ['Umb.Tiptap.RichTextEssentials'] }, +]); + +const richConfig = new UmbPropertyEditorConfigCollection([ + { alias: 'dimensions', value: { height: 400 } }, + { + alias: 'extensions', + value: [ + 'Umb.Tiptap.RichTextEssentials', + 'Umb.Tiptap.Bold', + 'Umb.Tiptap.Italic', + 'Umb.Tiptap.Underline', + 'Umb.Tiptap.BulletList', + 'Umb.Tiptap.OrderedList', + ], + }, + { + alias: 'toolbar', + value: [ + [ + ['Umb.Tiptap.Toolbar.Bold', 'Umb.Tiptap.Toolbar.Italic', 'Umb.Tiptap.Toolbar.Underline'], + ['Umb.Tiptap.Toolbar.BulletList', 'Umb.Tiptap.Toolbar.OrderedList'], + ], + ], + }, +]); + +const meta: Meta = { + title: 'Components/Inputs/Tiptap (standalone)', + component: 'umb-input-tiptap', + id: 'umb-input-tiptap', + decorators: [ + (story) => { + ensureManifestsRegistered(); + return story(); + }, + ], +}; + +export default meta; +type Story = StoryObj; + +export const EssentialsOnly: Story = { + render: () => html` + Standalone with only Rich Text Essentials.

'}> +
+ `, +}; + +export const WithFormattingToolbar: Story = { + render: () => html` + Standalone with a minimal toolbar.

'}> +
+ `, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts new file mode 100644 index 000000000000..22ed9f5c0de8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts @@ -0,0 +1,36 @@ +import { UmbInputTiptapElement } from './input-tiptap.element.js'; +import { manifests as tiptapManifests } from '../../manifests.js'; +import { expect, fixture, html } from '@open-wc/testing'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; + +describe('UmbInputTiptapElement (standalone)', () => { + // Proves that `` is usable on its own — i.e. not gated on being + // rendered inside ``. Stories cover the full visual + // load path; this just nails down that the custom element is importable and the + // package's manifests can be registered alongside it without any other plumbing. + + before(() => { + umbExtensionsRegistry.registerMany(tiptapManifests); + }); + + after(() => { + for (const m of tiptapManifests) { + umbExtensionsRegistry.unregister(m.alias); + } + }); + + it('is defined and instantiable on its own', async () => { + const element = await fixture(html``); + expect(element).to.be.instanceOf(UmbInputTiptapElement); + }); + + it('has every first-party Tiptap manifest available in the registry after registration', () => { + // The data-type configuration UIs read these manifests via `byType(...)`; the + // boundary split changes only the `api`/`element` shape, never the metadata + // the configuration UIs depend on. Spot-check that the registry has them. + const knownAliases = ['Umb.Tiptap.RichTextEssentials', 'Umb.Tiptap.Bold', 'Umb.Tiptap.Table']; + for (const alias of knownAliases) { + expect(umbExtensionsRegistry.getByAlias(alias), `manifest ${alias} should be registered`).to.exist; + } + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts index 9bc2bca85df9..ff5ef5cc07a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/anchor/manifests.ts @@ -1,6 +1,3 @@ -import { UmbTiptapAnchorModalElement } from './modals/anchor-modal.element.js'; -import UmbTiptapAnchorExtensionApi from './anchor.tiptap-api.js'; -import UmbTiptapToolbarAnchorExtensionApi from './anchor.tiptap-toolbar-api.js'; import { UMB_TIPTAP_ANCHOR_MODAL_ALIAS } from './modals/constants.js'; export const manifests: Array = [ @@ -8,7 +5,7 @@ export const manifests: Array = [ type: 'tiptapExtension', alias: 'Umb.Tiptap.Anchor', name: 'Anchor Tiptap Extension', - api: UmbTiptapAnchorExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapAnchorExtensionApi })), meta: { icon: 'icon-anchor', label: '#tiptap_anchor', @@ -20,7 +17,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Anchor', name: 'Anchor Tiptap Toolbar Extension', - api: UmbTiptapToolbarAnchorExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarAnchorExtensionApi })), forExtensions: ['Umb.Tiptap.Anchor'], meta: { alias: 'anchor', @@ -32,6 +29,6 @@ export const manifests: Array = [ type: 'modal', alias: UMB_TIPTAP_ANCHOR_MODAL_ALIAS, name: 'Tiptap Anchor Modal', - element: UmbTiptapAnchorModalElement, + element: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapAnchorModalElement })), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts index 169cf54be6cc..511d7a712de2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/block/manifests.ts @@ -1,5 +1,3 @@ -import UmbTiptapBlockElementApi from './block.tiptap-api.js'; -import UmbTiptapBlockPickerToolbarExtension from './block.tiptap-toolbar-api.js'; import type { ManifestTiptapExtension } from '../tiptap.extension.js'; import type { ManifestTiptapToolbarExtensionButtonKind } from '../tiptap-toolbar.extension.js'; @@ -8,7 +6,7 @@ export const manifests: Array import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBlockElementApi })), meta: { icon: 'icon-plugin', label: 'Block', @@ -20,7 +18,7 @@ export const manifests: Array import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBlockPickerToolbarExtension })), forExtensions: ['Umb.Tiptap.Block'], meta: { alias: 'umbblockpicker', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts index f34733bffbfe..8b2b734c9c53 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/blockquote/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapBlockquoteExtensionApi from './blockquote.tiptap-api.js'; -import UmbTiptapToolbarBlockquoteExtensionApi from './blockquote.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Blockquote', name: 'Blockquote Tiptap Extension', - api: UmbTiptapBlockquoteExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBlockquoteExtensionApi })), meta: { icon: 'icon-blockquote', label: 'Blockquote', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Blockquote', name: 'Blockquote Tiptap Toolbar Extension', - api: UmbTiptapToolbarBlockquoteExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarBlockquoteExtensionApi })), forExtensions: ['Umb.Tiptap.Blockquote'], meta: { alias: 'blockquote', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts index 6caf0dc74f4f..9d84b4d668b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bold/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapBoldExtensionApi from './bold.tiptap-api.js'; -import UmbTiptapToolbarBoldExtensionApi from './bold.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Bold', name: 'Bold Tiptap Extension', - api: UmbTiptapBoldExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBoldExtensionApi })), meta: { icon: 'icon-bold', label: 'Bold', @@ -17,7 +15,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Bold', name: 'Bold Tiptap Toolbar Extension', - api: UmbTiptapToolbarBoldExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarBoldExtensionApi })), forExtensions: ['Umb.Tiptap.Bold'], meta: { alias: 'bold', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts index 60f4b3347ae4..b96a159b9e11 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/bullet-list/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapBulletListExtensionApi from './bullet-list.tiptap-api.js'; -import UmbTiptapToolbarBulletListExtensionApi from './bullet-list.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.BulletList', name: 'Bullet List Tiptap Extension', - api: UmbTiptapBulletListExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapBulletListExtensionApi })), meta: { icon: 'icon-bulleted-list', label: 'Bullet List', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.BulletList', name: 'Bullet List Tiptap Toolbar Extension', - api: UmbTiptapToolbarBulletListExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarBulletListExtensionApi })), forExtensions: ['Umb.Tiptap.BulletList'], meta: { alias: 'bulletList', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts index 5219d7b85d79..cd811bfebab5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/character-map/manifests.ts @@ -1,5 +1,3 @@ -import { UmbCharacterMapModalElement } from './modals/character-map-modal.element.js'; -import UmbTiptapToolbarCharacterMapExtensionApi from './character-map.tiptap-toolbar-api.js'; import { UMB_TIPTAP_CHARACTER_MAP_MODAL_ALIAS } from './constants.js'; export const manifests: Array = [ @@ -8,7 +6,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.CharacterMap', name: 'Character Map Tiptap Toolbar Extension', - api: UmbTiptapToolbarCharacterMapExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarCharacterMapExtensionApi })), meta: { alias: 'umbCharacterMap', icon: 'icon-omega', @@ -19,6 +18,6 @@ export const manifests: Array = [ type: 'modal', alias: UMB_TIPTAP_CHARACTER_MAP_MODAL_ALIAS, name: 'Character Map Modal', - element: UmbCharacterMapModalElement, + element: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbCharacterMapModalElement })), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts index 80753688de6a..2a96d20c65de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/clear-formatting/manifests.ts @@ -1,11 +1,11 @@ -import UmbTiptapToolbarClearFormattingExtensionApi from './clear-formatting.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.ClearFormatting', name: 'Clear Formatting Tiptap Toolbar Extension', - api: UmbTiptapToolbarClearFormattingExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarClearFormattingExtensionApi })), meta: { alias: 'clear-formatting', icon: 'icon-clear-formatting', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts index b4a8d81d2c51..143e8eeb8635 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/code-block/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapCodeBlockExtensionApi from './code-block.tiptap-api.js'; -import UmbTiptapToolbarCodeBlockExtensionApi from './code-block.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.CodeBlock', name: 'Code Block Tiptap Extension', - api: UmbTiptapCodeBlockExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapCodeBlockExtensionApi })), meta: { icon: 'icon-code', label: 'Code Block', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.CodeBlock', name: 'Code Block Tiptap Toolbar Extension', - api: UmbTiptapToolbarCodeBlockExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarCodeBlockExtensionApi })), forExtensions: ['Umb.Tiptap.CodeBlock'], meta: { alias: 'codeBlock', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts index fa80e7777e42..e98fed1fd98f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/manifests.ts @@ -1,10 +1,10 @@ -import UmbTiptapRichTextEssentialsExtensionApi from './rich-text-essentials.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.RichTextEssentials', name: 'Rich Text Essentials Tiptap Extension', - api: UmbTiptapRichTextEssentialsExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapRichTextEssentialsExtensionApi })), weight: 1000, meta: { icon: 'icon-browser-window', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts index cc886ec7f428..25efd7a538eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/element-path/manifests.ts @@ -1,11 +1,10 @@ -import { UmbTiptapStatusbarElementPathElement } from './element-path.tiptap-statusbar-element.js'; - export const manifests: Array = [ { type: 'tiptapStatusbarExtension', alias: 'Umb.Tiptap.Statusbar.ElementPath', name: 'Element Path Tiptap Statusbar Extension', - element: UmbTiptapStatusbarElementPathElement, + element: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapStatusbarElementPathElement })), meta: { alias: 'elementPath', icon: 'icon-map-alt', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts index 3e35767adf90..2d6ae236ce56 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/embedded-media/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapEmbeddedMediaExtensionApi from './embedded-media.tiptap-api.js'; -import UmbTiptapToolbarEmbeddedMediaExtensionApi from './embedded-media.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Embed', name: 'Embedded Media Tiptap Extension', - api: UmbTiptapEmbeddedMediaExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapEmbeddedMediaExtensionApi })), meta: { icon: 'icon-embed', label: '#general_embed', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.EmbeddedMedia', name: 'Embedded Media Tiptap Toolbar Extension', - api: UmbTiptapToolbarEmbeddedMediaExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarEmbeddedMediaExtensionApi })), forExtensions: ['Umb.Tiptap.Embed'], meta: { alias: 'umbEmbeddedMedia', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/extension-apis.bundle.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/extension-apis.bundle.ts new file mode 100644 index 000000000000..13f17bdbc502 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/extension-apis.bundle.ts @@ -0,0 +1,124 @@ +/** + * Lazy-loaded bundle of every first-party Tiptap extension, toolbar, statusbar, modal + * and table-action API/element. Manifests reference everything here via + * `() => import('./extension-apis.bundle.js').then((m) => ({ default: m.X }))` thunks so + * Rollup emits a single shared chunk that is only fetched the first time an RTE is + * actually rendered. Workspaces that don't host an RTE never load this bundle. + * + * Do NOT add a static import of this file from anywhere — that would defeat the lazy + * boundary and pull all extension code back into the manifest registration bundle. + */ + +// Extension APIs +export { default as UmbTiptapAnchorExtensionApi } from './anchor/anchor.tiptap-api.js'; +export { default as UmbTiptapBlockElementApi } from './block/block.tiptap-api.js'; +export { default as UmbTiptapBlockquoteExtensionApi } from './blockquote/blockquote.tiptap-api.js'; +export { default as UmbTiptapBoldExtensionApi } from './bold/bold.tiptap-api.js'; +export { default as UmbTiptapBulletListExtensionApi } from './bullet-list/bullet-list.tiptap-api.js'; +export { default as UmbTiptapCodeBlockExtensionApi } from './code-block/code-block.tiptap-api.js'; +export { default as UmbTiptapEmbeddedMediaExtensionApi } from './embedded-media/embedded-media.tiptap-api.js'; +export { default as UmbTiptapFigureExtensionApi } from './figure/figure.tiptap-api.js'; +export { default as UmbTiptapHeadingExtensionApi } from './heading/heading.tiptap-api.js'; +export { default as UmbTiptapHorizontalRuleExtensionApi } from './horizontal-rule/horizontal-rule.tiptap-api.js'; +export { default as UmbTiptapHtmlAttributeClassExtensionApi } from './html-attr-class/html-attr-class.tiptap-api.js'; +export { default as UmbTiptapHtmlAttributeDatasetExtensionApi } from './html-attr-dataset/html-attr-dataset.tiptap-api.js'; +export { default as UmbTiptapHtmlAttributeIdExtensionApi } from './html-attr-id/html-attr-id.tiptap-api.js'; +export { default as UmbTiptapHtmlAttributeStyleExtensionApi } from './html-attr-style/html-attr-style.tiptap-api.js'; +export { default as UmbTiptapHtmlTagDivExtensionApi } from './html-tag-div/html-tag-div.tiptap-api.js'; +export { default as UmbTiptapHtmlTagSpanExtensionApi } from './html-tag-span/html-tag-span.tiptap-api.js'; +export { default as UmbTiptapImageExtensionApi } from './image/image.tiptap-api.js'; +export { default as UmbTiptapItalicExtensionApi } from './italic/italic.tiptap-api.js'; +export { default as UmbTiptapLinkExtensionApi } from './link/link.tiptap-api.js'; +export { default as UmbTiptapMediaUploadExtensionApi } from './media-upload/media-upload.tiptap-api.js'; +export { default as UmbTiptapOrderedListExtensionApi } from './ordered-list/ordered-list.tiptap-api.js'; +export { default as UmbTiptapRichTextEssentialsExtensionApi } from './core/rich-text-essentials.tiptap-api.js'; +export { default as UmbTiptapStrikeExtensionApi } from './strike/strike.tiptap-api.js'; +export { default as UmbTiptapSubscriptExtensionApi } from './subscript/subscript.tiptap-api.js'; +export { default as UmbTiptapSuperscriptExtensionApi } from './superscript/superscript.tiptap-api.js'; +export { default as UmbTiptapTableExtensionApi } from './table/table.tiptap-api.js'; +export { default as UmbTiptapTextAlignExtensionApi } from './text-align/text-align.tiptap-api.js'; +export { default as UmbTiptapTextDirectionExtensionApi } from './text-direction/text-direction.tiptap-api.js'; +export { default as UmbTiptapTextIndentExtensionApi } from './text-indent/text-indent.tiptap-api.js'; +export { default as UmbTiptapTrailingNodeExtensionApi } from './trailing-node/trailing-node.tiptap-api.js'; +export { default as UmbTiptapUnderlineExtensionApi } from './underline/underline.tiptap-api.js'; +export { default as UmbTiptapWordCountExtensionApi } from './word-count/word-count.tiptap-api.js'; + +// Toolbar APIs +export { default as UmbTiptapToolbarAnchorExtensionApi } from './anchor/anchor.tiptap-toolbar-api.js'; +export { default as UmbTiptapBlockPickerToolbarExtension } from './block/block.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarBlockquoteExtensionApi } from './blockquote/blockquote.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarBoldExtensionApi } from './bold/bold.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarBulletListExtensionApi } from './bullet-list/bullet-list.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarCharacterMapExtensionApi } from './character-map/character-map.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarClearFormattingExtensionApi } from './clear-formatting/clear-formatting.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarCodeBlockExtensionApi } from './code-block/code-block.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarEmbeddedMediaExtensionApi } from './embedded-media/embedded-media.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarFontFamilyExtensionApi } from './font-family/font-family.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarFontSizeExtensionApi } from './font-size/font-size.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading1ExtensionApi } from './heading/heading1.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading2ExtensionApi } from './heading/heading2.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading3ExtensionApi } from './heading/heading3.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading4ExtensionApi } from './heading/heading4.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading5ExtensionApi } from './heading/heading5.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHeading6ExtensionApi } from './heading/heading6.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarHorizontalRuleExtensionApi } from './horizontal-rule/horizontal-rule.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarItalicExtensionApi } from './italic/italic.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarLinkExtensionApi } from './link/link.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarUnlinkExtensionApi } from './link/unlink.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarMediaPickerToolbarExtensionApi } from './media-picker/media-picker.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarOrderedListExtensionApi } from './ordered-list/ordered-list.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarRedoExtensionApi } from './undo-redo/redo.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarSourceEditorExtensionApi } from './view-source/source-editor.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarStrikeExtensionApi } from './strike/strike.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarStyleMenuApi } from './style-menu/style-menu.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarSubscriptExtensionApi } from './subscript/subscript.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarSuperscriptExtensionApi } from './superscript/superscript.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTableExtensionApi } from './table/table.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextAlignCenterExtensionApi } from './text-align/text-align-center.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextAlignJustifyExtensionApi } from './text-align/text-align-justify.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextAlignLeftExtensionApi } from './text-align/text-align-left.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextAlignRightExtensionApi } from './text-align/text-align-right.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextColorBackgroundExtensionApi } from './text-color/text-color-background.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextColorForegroundExtensionApi } from './text-color/text-color-foreground.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextDirectionLtrExtensionApi } from './text-direction/text-direction-ltr.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextDirectionRtlExtensionApi } from './text-direction/text-direction-rtl.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextIndentExtensionApi } from './text-indent/text-indent.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarTextOutdentExtensionApi } from './text-indent/text-outdent.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarUndoExtensionApi } from './undo-redo/undo.tiptap-toolbar-api.js'; +export { default as UmbTiptapToolbarUnderlineExtensionApi } from './underline/underline.tiptap-toolbar-api.js'; + +// Statusbar elements +export { UmbTiptapStatusbarElementPathElement } from './element-path/element-path.tiptap-statusbar-element.js'; +export { UmbTiptapStatusbarWordCountElement } from './word-count/word-count.tiptap-statusbar-element.js'; + +// Modal elements +export { UmbTiptapAnchorModalElement } from './anchor/modals/anchor-modal.element.js'; +export { UmbCharacterMapModalElement } from './character-map/modals/character-map-modal.element.js'; +export { UmbTiptapTablePropertiesModalElement } from './table/modals/table-properties-modal.element.js'; + +// Toolbar UI elements (referenced from kind manifests) +export { UmbTiptapTableToolbarMenuElement } from './table/components/table-toolbar-menu.element.js'; +export { UmbTiptapToolbarButtonActionElement } from '../components/toolbar/tiptap-toolbar-button-action.element.js'; +export { UmbTiptapToolbarButtonElement } from '../components/toolbar/tiptap-toolbar-button.element.js'; +export { UmbTiptapToolbarColorPickerButtonElement } from '../components/toolbar/tiptap-toolbar-color-picker-button.element.js'; +export { UmbTiptapToolbarMenuElement } from '../components/toolbar/tiptap-toolbar-menu.element.js'; + +// Table menu-item action APIs +export { default as UmbTableCellMergeAction } from './table/actions/table-cell-merge.action.js'; +export { default as UmbTableCellMergeSplitAction } from './table/actions/table-cell-merge-split.action.js'; +export { default as UmbTableCellSplitAction } from './table/actions/table-cell-split.action.js'; +export { default as UmbTableCellToggleHeaderAction } from './table/actions/table-cell-toggle-header.action.js'; +export { default as UmbTableColumnAddAfterAction } from './table/actions/table-column-add-after.action.js'; +export { default as UmbTableColumnAddBeforeAction } from './table/actions/table-column-add-before.action.js'; +export { default as UmbTableColumnDeleteAction } from './table/actions/table-column-delete.action.js'; +export { default as UmbTableColumnToggleHeaderAction } from './table/actions/table-column-toggle-header.action.js'; +export { default as UmbTableDeleteAction } from './table/actions/table-delete.action.js'; +export { default as UmbTablePropertiesAction } from './table/actions/table-properties.action.js'; +export { default as UmbTableRowAddAfterAction } from './table/actions/table-row-add-after.action.js'; +export { default as UmbTableRowAddBeforeAction } from './table/actions/table-row-add-before.action.js'; +export { default as UmbTableRowDeleteAction } from './table/actions/table-row-delete.action.js'; +export { default as UmbTableRowToggleHeaderAction } from './table/actions/table-row-toggle-header.action.js'; + +// Clipboard property-value translators +export { UmbTiptapBlockRteToBlockClipboardCopyPropertyValueTranslator } from '../clipboard/block/copy/block-rte-to-block-copy-translator.js'; +export { UmbTiptapBlockToBlockRteClipboardPastePropertyValueTranslator } from '../clipboard/block/paste/block-to-block-rte-paste-translator.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts index e0f6d7003fd0..c36d8fe2b36e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/figure/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapFigureExtensionApi from './figure.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Figure', name: 'Figure Tiptap Extension', - api: UmbTiptapFigureExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapFigureExtensionApi })), meta: { icon: 'icon-frame', label: 'Figure', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts index 4986a7bdffb7..0657df85836d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-family/manifests.ts @@ -1,11 +1,11 @@ -import UmbTiptapToolbarFontFamilyExtensionApi from './font-family.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'menu', alias: 'Umb.Tiptap.Toolbar.FontFamily', name: 'Font Family Tiptap Toolbar Extension', - api: UmbTiptapToolbarFontFamilyExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarFontFamilyExtensionApi })), forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], items: [ { label: 'Sans serif', appearance: { style: 'font-family: sans-serif;' }, data: 'sans-serif' }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts index 97db8ed5a409..15118f056199 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/font-size/manifests.ts @@ -1,11 +1,10 @@ -import UmbTiptapToolbarFontSizeExtensionApi from './font-size.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'menu', alias: 'Umb.Tiptap.Toolbar.FontSize', name: 'Font Size Tiptap Toolbar Extension', - api: UmbTiptapToolbarFontSizeExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarFontSizeExtensionApi })), forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], items: [ { label: '8pt', data: '8pt' }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts index 2cb5649b2c76..d31a0de3f1ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/heading/manifests.ts @@ -1,16 +1,9 @@ -import UmbTiptapHeadingExtensionApi from './heading.tiptap-api.js'; -import UmbTiptapToolbarHeading1ExtensionApi from './heading1.tiptap-toolbar-api.js'; -import UmbTiptapToolbarHeading2ExtensionApi from './heading2.tiptap-toolbar-api.js'; -import UmbTiptapToolbarHeading3ExtensionApi from './heading3.tiptap-toolbar-api.js'; -import UmbTiptapToolbarHeading4ExtensionApi from './heading4.tiptap-toolbar-api.js'; -import UmbTiptapToolbarHeading5ExtensionApi from './heading5.tiptap-toolbar-api.js'; -import UmbTiptapToolbarHeading6ExtensionApi from './heading6.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Heading', name: 'Headings Tiptap Extension', - api: UmbTiptapHeadingExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHeadingExtensionApi })), meta: { icon: 'icon-heading', label: 'Headings', @@ -22,7 +15,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading1', name: 'Heading 1 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading1ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading1ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading1', @@ -35,7 +28,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading2', name: 'Heading 2 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading2ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading2ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading2', @@ -48,7 +41,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading3', name: 'Heading 3 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading3ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading3ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading3', @@ -61,7 +54,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading4', name: 'Heading 4 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading4ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading4ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading4', @@ -74,7 +67,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading5', name: 'Heading 5 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading5ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading5ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading5', @@ -87,7 +80,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Heading6', name: 'Heading 6 Tiptap Toolbar Extension', - api: UmbTiptapToolbarHeading6ExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHeading6ExtensionApi })), forExtensions: ['Umb.Tiptap.Heading'], meta: { alias: 'heading6', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts index b0f5765b58ca..7390150f5851 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/horizontal-rule/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapHorizontalRuleExtensionApi from './horizontal-rule.tiptap-api.js'; -import UmbTiptapToolbarHorizontalRuleExtensionApi from './horizontal-rule.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HorizontalRule', name: 'Horizontal Rule Tiptap Extension', - api: UmbTiptapHorizontalRuleExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHorizontalRuleExtensionApi })), meta: { icon: 'icon-horizontal-rule', label: 'Horizontal Rule', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.HorizontalRule', name: 'Horizontal Rule Tiptap Toolbar Extension', - api: UmbTiptapToolbarHorizontalRuleExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarHorizontalRuleExtensionApi })), forExtensions: ['Umb.Tiptap.HorizontalRule'], meta: { alias: 'horizontalRule', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts index 1397848f0622..a8f0353b0a34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-class/manifests.ts @@ -1,10 +1,10 @@ -import UmbTiptapHtmlAttributeClassExtensionApi from './html-attr-class.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeClass', name: 'Class HTML Attribute Tiptap Extension', - api: UmbTiptapHtmlAttributeClassExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlAttributeClassExtensionApi })), meta: { icon: 'icon-barcode', label: '`class` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts index 6e37d471115a..51f0df24767a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-dataset/manifests.ts @@ -1,10 +1,10 @@ -import UmbTiptapHtmlAttributeDatasetExtensionApi from './html-attr-dataset.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeDataset', name: 'Dataset HTML Attribute Tiptap Extension', - api: UmbTiptapHtmlAttributeDatasetExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlAttributeDatasetExtensionApi })), meta: { icon: 'icon-binarycode', label: '`data-*` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts index 4f437ca30692..fb1017a7f6c8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-id/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapHtmlAttributeIdExtensionApi from './html-attr-id.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeId', name: 'ID HTML Attribute Tiptap Extension', - api: UmbTiptapHtmlAttributeIdExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlAttributeIdExtensionApi })), meta: { icon: 'icon-fingerprint', label: '`id` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts index 0759b1d2382d..fe0b1b13880a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-attr-style/manifests.ts @@ -1,10 +1,10 @@ -import UmbTiptapHtmlAttributeStyleExtensionApi from './html-attr-style.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlAttributeStyle', name: 'Style HTML Attribute Tiptap Extension', - api: UmbTiptapHtmlAttributeStyleExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlAttributeStyleExtensionApi })), meta: { icon: 'icon-palette', label: '`style` attributes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts index 514c7acc89c4..c4c8370797ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-div/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapHtmlTagDivExtensionApi from './html-tag-div.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlTagDiv', name: 'Div HTML Tag Tiptap Extension', - api: UmbTiptapHtmlTagDivExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlTagDivExtensionApi })), meta: { icon: 'icon-document-html', label: '`
` tags', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts index b51c24d03fa6..d5abe12db98b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/html-tag-span/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapHtmlTagSpanExtensionApi from './html-tag-span.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.HtmlTagSpan', name: 'Span HTML Tag Tiptap Extension', - api: UmbTiptapHtmlTagSpanExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapHtmlTagSpanExtensionApi })), meta: { icon: 'icon-document-html', label: '`` tags', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts index aae36a4def27..1474d7977624 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/image/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapImageExtensionApi from './image.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Image', name: 'Image Tiptap Extension', - api: UmbTiptapImageExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapImageExtensionApi })), meta: { icon: 'icon-picture', label: 'Image', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts index 672a71708109..fd3e22c9ea2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapItalicExtensionApi from './italic.tiptap-api.js'; -import UmbTiptapToolbarItalicExtensionApi from './italic.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Italic', name: 'Italic Tiptap Extension', - api: UmbTiptapItalicExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapItalicExtensionApi })), meta: { icon: 'icon-italic', label: 'Italic', @@ -17,7 +15,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Italic', name: 'Italic Tiptap Toolbar Extension', - api: UmbTiptapToolbarItalicExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarItalicExtensionApi })), forExtensions: ['Umb.Tiptap.Italic'], meta: { alias: 'italic', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts index 71e4ad31ed2d..a3ce1e63e4a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/link/manifests.ts @@ -1,12 +1,9 @@ -import UmbTiptapLinkExtensionApi from './link.tiptap-api.js'; -import UmbTiptapToolbarLinkExtensionApi from './link.tiptap-toolbar-api.js'; -import UmbTiptapToolbarUnlinkExtensionApi from './unlink.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Link', name: 'Link Tiptap Extension', - api: UmbTiptapLinkExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapLinkExtensionApi })), meta: { icon: 'icon-link', label: '#defaultdialogs_urlLinkPicker', @@ -18,7 +15,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Link', name: 'Link Tiptap Toolbar Extension', - api: UmbTiptapToolbarLinkExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarLinkExtensionApi })), forExtensions: ['Umb.Tiptap.Link'], meta: { alias: 'umbLink', @@ -31,7 +28,7 @@ export const manifests: Array = [ kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Unlink', name: 'Unlink Tiptap Toolbar Extension', - api: UmbTiptapToolbarUnlinkExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarUnlinkExtensionApi })), forExtensions: ['Umb.Tiptap.Link'], meta: { alias: 'unlink', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts index 388613780660..0021bbe443d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-picker/manifests.ts @@ -1,11 +1,13 @@ -import UmbTiptapToolbarMediaPickerToolbarExtensionApi from './media-picker.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.MediaPicker', name: 'Media Picker Tiptap Toolbar Extension', - api: UmbTiptapToolbarMediaPickerToolbarExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapToolbarMediaPickerToolbarExtensionApi, + })), forExtensions: ['Umb.Tiptap.Figure', 'Umb.Tiptap.Image'], meta: { alias: 'umbMedia', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts index da8c832586eb..73b7ae2ab79c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/media-upload/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapMediaUploadExtensionApi from './media-upload.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.MediaUpload', name: 'Media Upload Tiptap Extension', - api: UmbTiptapMediaUploadExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapMediaUploadExtensionApi })), meta: { icon: 'icon-image-up', label: 'Media Upload', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts index 7ddc3bda10ad..cda2914273b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/ordered-list/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapOrderedListExtensionApi from './ordered-list.tiptap-api.js'; -import UmbTiptapToolbarOrderedListExtensionApi from './ordered-list.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.OrderedList', name: 'Ordered List Tiptap Extension', - api: UmbTiptapOrderedListExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapOrderedListExtensionApi })), meta: { icon: 'icon-ordered-list', label: 'Ordered List', @@ -17,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.OrderedList', name: 'Ordered List Tiptap Toolbar Extension', - api: UmbTiptapToolbarOrderedListExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarOrderedListExtensionApi })), forExtensions: ['Umb.Tiptap.OrderedList'], meta: { alias: 'orderedList', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts index 5bcacb35cfb0..afc94451346b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/strike/manifests.ts @@ -1,11 +1,9 @@ -import UmbTiptapStrikeExtensionApi from './strike.tiptap-api.js'; -import UmbTiptapToolbarStrikeExtensionApi from './strike.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.Strike', name: 'Strike Tiptap Extension', - api: UmbTiptapStrikeExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapStrikeExtensionApi })), meta: { icon: 'icon-strikethrough', label: 'Strike', @@ -17,7 +15,7 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Strike', name: 'Strike Tiptap Toolbar Extension', - api: UmbTiptapToolbarStrikeExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarStrikeExtensionApi })), forExtensions: ['Umb.Tiptap.Strike'], meta: { alias: 'strike', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts index 9430b4847b51..08a5be021229 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/style-menu/style-menu.kind.ts @@ -1,5 +1,3 @@ -import { UmbTiptapToolbarMenuElement } from '../../components/toolbar/tiptap-toolbar-menu.element.js'; -import UmbTiptapToolbarStyleMenuApi from './style-menu.tiptap-toolbar-api.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -8,7 +6,7 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'styleMenu', matchType: 'tiptapToolbarExtension', manifest: { - api: UmbTiptapToolbarStyleMenuApi, - element: UmbTiptapToolbarMenuElement, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarStyleMenuApi })), + element: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarMenuElement })), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts index 3bcc57ab7aa8..bd049bad16e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/subscript/manifests.ts @@ -1,12 +1,10 @@ -import UmbTiptapSubscriptExtensionApi from './subscript.tiptap-api.js'; -import UmbTiptapToolbarSubscriptExtensionApi from './subscript.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Subscript', name: 'Subscript Tiptap Extension', - api: UmbTiptapSubscriptExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapSubscriptExtensionApi })), meta: { icon: 'icon-subscript', label: 'Subscript', @@ -18,7 +16,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Subscript', name: 'Subscript Tiptap Toolbar Extension', - api: UmbTiptapToolbarSubscriptExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarSubscriptExtensionApi })), forExtensions: ['Umb.Tiptap.Subscript'], meta: { alias: 'subscript', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts index 12b0fca18f6a..5c053cd744db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/superscript/manifests.ts @@ -1,12 +1,10 @@ -import UmbTiptapSuperscriptExtensionApi from './superscript.tiptap-api.js'; -import UmbTiptapToolbarSuperscriptExtensionApi from './superscript.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Superscript', name: 'Superscript Tiptap Extension', - api: UmbTiptapSuperscriptExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapSuperscriptExtensionApi })), meta: { icon: 'icon-superscript', label: 'Superscript', @@ -18,7 +16,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Superscript', name: 'Superscript Tiptap Toolbar Extension', - api: UmbTiptapToolbarSuperscriptExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarSuperscriptExtensionApi })), forExtensions: ['Umb.Tiptap.Superscript'], meta: { alias: 'superscript', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts index 139fb448749a..0272cef713c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/table/manifests.ts @@ -1,21 +1,3 @@ -import { UmbTiptapTablePropertiesModalElement } from './modals/table-properties-modal.element.js'; -import { UmbTiptapTableToolbarMenuElement } from './components/table-toolbar-menu.element.js'; -import UmbTableCellMergeAction from './actions/table-cell-merge.action.js'; -import UmbTableCellMergeSplitAction from './actions/table-cell-merge-split.action.js'; -import UmbTableCellSplitAction from './actions/table-cell-split.action.js'; -import UmbTableCellToggleHeaderAction from './actions/table-cell-toggle-header.action.js'; -import UmbTableColumnAddAfterAction from './actions/table-column-add-after.action.js'; -import UmbTableColumnAddBeforeAction from './actions/table-column-add-before.action.js'; -import UmbTableColumnDeleteAction from './actions/table-column-delete.action.js'; -import UmbTableColumnToggleHeaderAction from './actions/table-column-toggle-header.action.js'; -import UmbTableDeleteAction from './actions/table-delete.action.js'; -import UmbTablePropertiesAction from './actions/table-properties.action.js'; -import UmbTableRowAddAfterAction from './actions/table-row-add-after.action.js'; -import UmbTableRowAddBeforeAction from './actions/table-row-add-before.action.js'; -import UmbTableRowDeleteAction from './actions/table-row-delete.action.js'; -import UmbTableRowToggleHeaderAction from './actions/table-row-toggle-header.action.js'; -import UmbTiptapTableExtensionApi from './table.tiptap-api.js'; -import UmbTiptapToolbarTableExtensionApi from './table.tiptap-toolbar-api.js'; import { UMB_TIPTAP_TABLE_PROPERTIES_MODAL_ALIAS } from './modals/constants.js'; const UMB_MENU_TIPTAP_TABLE_ALIAS = 'Umb.Menu.Tiptap.Table'; @@ -28,7 +10,8 @@ const modals: Array = [ type: 'modal', alias: UMB_TIPTAP_TABLE_PROPERTIES_MODAL_ALIAS, name: 'Tiptap Table Properties Modal', - element: UmbTiptapTablePropertiesModalElement, + element: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTablePropertiesModalElement })), }, ]; @@ -38,7 +21,7 @@ const coreExtensions: Array = [ kind: 'button', alias: 'Umb.Tiptap.Table', name: 'Table Tiptap Extension', - api: UmbTiptapTableExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTableExtensionApi })), meta: { icon: 'icon-table', label: 'Table', @@ -53,8 +36,8 @@ const toolbarExtensions: Array = [ kind: 'menu', alias: 'Umb.Tiptap.Toolbar.Table', name: 'Table Tiptap Extension', - api: UmbTiptapToolbarTableExtensionApi, - element: UmbTiptapTableToolbarMenuElement, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTableExtensionApi })), + element: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTableToolbarMenuElement })), forExtensions: ['Umb.Tiptap.Table'], items: [ { @@ -92,7 +75,7 @@ const tableMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableProperties', name: 'Tiptap Table Menu Item: Table Properties', - api: UmbTablePropertiesAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTablePropertiesAction })), weight: 110, meta: { label: 'Table properties', @@ -104,7 +87,7 @@ const tableMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableDelete', name: 'Tiptap Table Menu Item: Delete Table', - api: UmbTableDeleteAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableDeleteAction })), weight: 100, meta: { label: 'Delete table', @@ -125,7 +108,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnAddBefore', name: 'Tiptap Table Menu Item: Add Column Before', - api: UmbTableColumnAddBeforeAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableColumnAddBeforeAction })), weight: 120, meta: { label: 'Add column before', @@ -138,7 +121,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnAddAfter', name: 'Tiptap Table Menu Item: Add Column After', - api: UmbTableColumnAddAfterAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableColumnAddAfterAction })), weight: 110, meta: { label: 'Add column after', @@ -151,7 +134,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnDelete', name: 'Tiptap Table Menu Item: Delete Column', - api: UmbTableColumnDeleteAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableColumnDeleteAction })), weight: 100, meta: { label: 'Delete column', @@ -164,7 +147,7 @@ const tableColumnMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableColumnToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Column', - api: UmbTableColumnToggleHeaderAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableColumnToggleHeaderAction })), weight: 90, meta: { label: 'Toggle header column', @@ -184,7 +167,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowAddBefore', name: 'Tiptap Table Menu Item: Add Row Before', - api: UmbTableRowAddBeforeAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableRowAddBeforeAction })), weight: 120, meta: { label: 'Add row before', @@ -197,7 +180,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowAddAfter', name: 'Tiptap Table Menu Item: Add Row After', - api: UmbTableRowAddAfterAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableRowAddAfterAction })), weight: 110, meta: { label: 'Add row after', @@ -210,7 +193,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowDelete', name: 'Tiptap Table Menu Item: Delete Row', - api: UmbTableRowDeleteAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableRowDeleteAction })), weight: 100, meta: { label: 'Delete row', @@ -223,7 +206,7 @@ const tableRowMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableRowToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Row', - api: UmbTableRowToggleHeaderAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableRowToggleHeaderAction })), weight: 90, meta: { label: 'Toggle header row', @@ -243,7 +226,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellMerge', name: 'Tiptap Table Menu Item: Merge Cell', - api: UmbTableCellMergeAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableCellMergeAction })), weight: 120, meta: { label: 'Merge cells', @@ -255,7 +238,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellSplit', name: 'Tiptap Table Menu Item: Split Cell', - api: UmbTableCellSplitAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableCellSplitAction })), weight: 110, meta: { label: 'Split cell', @@ -267,7 +250,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellMergeSplit', name: 'Tiptap Table Menu Item: Merge Or Split Cell', - api: UmbTableCellMergeSplitAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableCellMergeSplitAction })), weight: 100, meta: { label: 'Merge or split', @@ -279,7 +262,7 @@ const tableCellMenu: Array = [ kind: 'action', alias: 'Umb.MenuItem.Tiptap.TableCellToggleHeader', name: 'Tiptap Table Menu Item: Toggle Header Cell', - api: UmbTableCellToggleHeaderAction, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTableCellToggleHeaderAction })), weight: 90, meta: { label: 'Toggle header cell', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts index 42219eb1a7cd..8d759c5b4585 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-align/manifests.ts @@ -1,14 +1,9 @@ -import UmbTiptapTextAlignExtensionApi from './text-align.tiptap-api.js'; -import UmbTiptapToolbarTextAlignCenterExtensionApi from './text-align-center.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextAlignJustifyExtensionApi from './text-align-justify.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextAlignLeftExtensionApi from './text-align-left.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextAlignRightExtensionApi from './text-align-right.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextAlign', name: 'Text Align Tiptap Extension', - api: UmbTiptapTextAlignExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTextAlignExtensionApi })), meta: { icon: 'icon-text-align-justify', label: 'Text Align', @@ -20,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignLeft', name: 'Text Align Left Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextAlignLeftExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextAlignLeftExtensionApi })), forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-left', @@ -33,7 +29,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignCenter', name: 'Text Align Center Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextAlignCenterExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextAlignCenterExtensionApi })), forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-center', @@ -46,7 +43,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignRight', name: 'Text Align Right Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextAlignRightExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextAlignRightExtensionApi })), forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-right', @@ -59,7 +57,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextAlignJustify', name: 'Text Align Justify Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextAlignJustifyExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextAlignJustifyExtensionApi })), forExtensions: ['Umb.Tiptap.TextAlign'], meta: { alias: 'text-align-justify', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts index 772f6b8efa92..885f0cf2f2cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-color/manifests.ts @@ -1,12 +1,13 @@ -import UmbTiptapToolbarTextColorBackgroundExtensionApi from './text-color-background.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextColorForegroundExtensionApi from './text-color-foreground.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'colorPickerButton', alias: 'Umb.Tiptap.Toolbar.TextColorBackground', name: 'Text Color Background Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextColorBackgroundExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapToolbarTextColorBackgroundExtensionApi, + })), forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], meta: { alias: 'text-color-background', @@ -19,7 +20,10 @@ export const manifests: Array = [ kind: 'colorPickerButton', alias: 'Umb.Tiptap.Toolbar.TextColorForeground', name: 'Text Color Foreground Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextColorForegroundExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapToolbarTextColorForegroundExtensionApi, + })), forExtensions: ['Umb.Tiptap.HtmlAttributeStyle', 'Umb.Tiptap.HtmlTagSpan'], meta: { alias: 'text-color-foreground', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts index d14123d4b35c..e18791d14763 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-direction/manifests.ts @@ -1,12 +1,9 @@ -import UmbTiptapTextDirectionExtensionApi from './text-direction.tiptap-api.js'; -import UmbTiptapToolbarTextDirectionLtrExtensionApi from './text-direction-ltr.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextDirectionRtlExtensionApi from './text-direction-rtl.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextDirection', name: 'Text Direction Tiptap Extension', - api: UmbTiptapTextDirectionExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTextDirectionExtensionApi })), meta: { icon: 'icon-text-direction-ltr', label: 'Text Direction', @@ -18,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextDirectionRtl', name: 'Text Direction RTL Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextDirectionRtlExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextDirectionRtlExtensionApi })), forExtensions: ['Umb.Tiptap.TextDirection'], meta: { alias: 'text-direction-rtl', @@ -31,7 +29,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextDirectionLtr', name: 'Text Direction LTR Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextDirectionLtrExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextDirectionLtrExtensionApi })), forExtensions: ['Umb.Tiptap.TextDirection'], meta: { alias: 'text-direction-ltr', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts index 4d42e34273d4..f948621b4dc5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/text-indent/manifests.ts @@ -1,12 +1,9 @@ -import UmbTiptapTextIndentExtensionApi from './text-indent.tiptap-api.js'; -import UmbTiptapToolbarTextIndentExtensionApi from './text-indent.tiptap-toolbar-api.js'; -import UmbTiptapToolbarTextOutdentExtensionApi from './text-outdent.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TextIndent', name: 'Text Indent Tiptap Extension', - api: UmbTiptapTextIndentExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTextIndentExtensionApi })), meta: { icon: 'icon-indent', label: 'Text Indent', @@ -18,7 +15,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextIndent', name: 'Text Indent Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextIndentExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextIndentExtensionApi })), forExtensions: ['Umb.Tiptap.TextIndent'], meta: { alias: 'indent', @@ -31,7 +29,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.TextOutdent', name: 'Text Outdent Tiptap Toolbar Extension', - api: UmbTiptapToolbarTextOutdentExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarTextOutdentExtensionApi })), forExtensions: ['Umb.Tiptap.TextIndent'], meta: { alias: 'outdent', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts index 605f2c88d78d..d147f4827967 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-action-button.kind.ts @@ -1,4 +1,3 @@ -import { UmbTiptapToolbarButtonActionElement } from '../components/toolbar/tiptap-toolbar-button-action.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -7,6 +6,9 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'actionButton', matchType: 'tiptapToolbarExtension', manifest: { - element: UmbTiptapToolbarButtonActionElement, + element: () => + import('./extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapToolbarButtonActionElement, + })), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts index 4832992fd96b..79d0ab3f4d53 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-button.kind.ts @@ -1,4 +1,3 @@ -import { UmbTiptapToolbarButtonElement } from '../components/toolbar/tiptap-toolbar-button.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -7,6 +6,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'button', matchType: 'tiptapToolbarExtension', manifest: { - element: UmbTiptapToolbarButtonElement, + element: () => import('./extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarButtonElement })), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts index 7c9b604ce1ea..7901776884e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-color-picker-button.kind.ts @@ -1,4 +1,3 @@ -import { UmbTiptapToolbarColorPickerButtonElement } from '../components/toolbar/tiptap-toolbar-color-picker-button.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -7,6 +6,9 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'colorPickerButton', matchType: 'tiptapToolbarExtension', manifest: { - element: UmbTiptapToolbarColorPickerButtonElement, + element: () => + import('./extension-apis.bundle.js').then((m) => ({ + default: m.UmbTiptapToolbarColorPickerButtonElement, + })), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts index d5ab291dff3a..f3fd82f5e9af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/tiptap-toolbar-menu.kind.ts @@ -1,4 +1,3 @@ -import { UmbTiptapToolbarMenuElement } from '../components/toolbar/tiptap-toolbar-menu.element.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbExtensionManifestKind = { @@ -7,6 +6,6 @@ export const manifest: UmbExtensionManifestKind = { matchKind: 'menu', matchType: 'tiptapToolbarExtension', manifest: { - element: UmbTiptapToolbarMenuElement, + element: () => import('./extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarMenuElement })), }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts index 8d1787c25742..3b8362d5cfdc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/trailing-node/manifests.ts @@ -1,10 +1,9 @@ -import UmbTiptapTrailingNodeExtensionApi from './trailing-node.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.TrailingNode', name: 'Trailing Node Tiptap Extension', - api: UmbTiptapTrailingNodeExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapTrailingNodeExtensionApi })), meta: { icon: 'icon-page-down', label: 'Trailing Node', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts index 4ecd52eafdd4..ce76083ffd25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/underline/manifests.ts @@ -1,12 +1,10 @@ -import UmbTiptapToolbarUnderlineExtensionApi from './underline.tiptap-toolbar-api.js'; -import UmbTiptapUnderlineExtensionApi from './underline.tiptap-api.js'; export const manifests: Array = [ { type: 'tiptapExtension', kind: 'button', alias: 'Umb.Tiptap.Underline', name: 'Underline Tiptap Extension', - api: UmbTiptapUnderlineExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapUnderlineExtensionApi })), meta: { icon: 'icon-underline', label: 'Underline', @@ -18,7 +16,8 @@ export const manifests: Array = [ kind: 'button', alias: 'Umb.Tiptap.Toolbar.Underline', name: 'Underline Tiptap Toolbar Extension', - api: UmbTiptapToolbarUnderlineExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarUnderlineExtensionApi })), forExtensions: ['Umb.Tiptap.Underline'], meta: { alias: 'underline', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts index 08e163ad98fc..305cff06fcc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/undo-redo/manifests.ts @@ -1,12 +1,10 @@ -import UmbTiptapToolbarRedoExtensionApi from './redo.tiptap-toolbar-api.js'; -import UmbTiptapToolbarUndoExtensionApi from './undo.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Undo', name: 'Undo Tiptap Toolbar Extension', - api: UmbTiptapToolbarUndoExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarUndoExtensionApi })), meta: { alias: 'undo', icon: 'icon-undo', @@ -18,7 +16,7 @@ export const manifests: Array = [ kind: 'actionButton', alias: 'Umb.Tiptap.Toolbar.Redo', name: 'Redo Tiptap Toolbar Extension', - api: UmbTiptapToolbarRedoExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarRedoExtensionApi })), meta: { alias: 'redo', icon: 'icon-redo', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts index 1bba298529df..f863e0454dad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/view-source/manifests.ts @@ -1,11 +1,11 @@ -import UmbTiptapToolbarSourceEditorExtensionApi from './source-editor.tiptap-toolbar-api.js'; export const manifests: Array = [ { type: 'tiptapToolbarExtension', kind: 'button', alias: 'Umb.Tiptap.Toolbar.SourceEditor', name: 'Source Editor Tiptap Toolbar Extension', - api: UmbTiptapToolbarSourceEditorExtensionApi, + api: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapToolbarSourceEditorExtensionApi })), meta: { alias: 'umbSourceEditor', icon: 'icon-code-xml', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts index 4b20816a2fd3..ae8315f762c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/word-count/manifests.ts @@ -1,12 +1,9 @@ -import UmbTiptapWordCountExtensionApi from './word-count.tiptap-api.js'; -import { UmbTiptapStatusbarWordCountElement } from './word-count.tiptap-statusbar-element.js'; - export const manifests: Array = [ { type: 'tiptapExtension', alias: 'Umb.Tiptap.WordCount', name: 'Word Count Tiptap Extension', - api: UmbTiptapWordCountExtensionApi, + api: () => import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapWordCountExtensionApi })), meta: { icon: 'icon-speed-gauge', label: 'Word Count', @@ -17,7 +14,8 @@ export const manifests: Array = [ type: 'tiptapStatusbarExtension', alias: 'Umb.Tiptap.Statusbar.WordCount', name: 'Word Count Tiptap Statusbar Extension', - element: UmbTiptapStatusbarWordCountElement, + element: () => + import('../extension-apis.bundle.js').then((m) => ({ default: m.UmbTiptapStatusbarWordCountElement })), forExtensions: ['Umb.Tiptap.WordCount'], meta: { alias: 'wordCount', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts index b49aa895229e..eb1c1f67ebe7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/extensions-configuration/manifests.ts @@ -1,4 +1,3 @@ -import { UmbPropertyEditorUiTiptapExtensionsConfigurationElement } from './property-editor-ui-tiptap-extensions-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -6,7 +5,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.ExtensionsConfiguration', name: 'Tiptap Extensions Property Editor UI', - element: UmbPropertyEditorUiTiptapExtensionsConfigurationElement, + element: () => import('./property-editor-ui-tiptap-extensions-configuration.element.js'), meta: { label: 'Tiptap Extensions Configuration', icon: 'icon-autofill', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts index c9bfca3d0af8..ab3d182f7baa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/statusbar-configuration/manifests.ts @@ -1,4 +1,3 @@ -import { UmbPropertyEditorUiTiptapStatusbarConfigurationElement } from './property-editor-ui-tiptap-statusbar-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -6,7 +5,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.StatusbarConfiguration', name: 'Tiptap Statusbar Property Editor UI', - element: UmbPropertyEditorUiTiptapStatusbarConfigurationElement, + element: () => import('./property-editor-ui-tiptap-statusbar-configuration.element.js'), meta: { label: 'Tiptap Statusbar Configuration', icon: 'icon-autofill', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts index af2bcc5be350..34a2d8a9e213 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/tiptap-rte/manifests.ts @@ -1,4 +1,3 @@ -import { UmbPropertyEditorUiTiptapElement } from './property-editor-ui-tiptap.element.js'; import { UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS } from './constants.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; @@ -7,7 +6,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: UMB_TIPTAP_PROPERTY_EDITOR_UI_ALIAS, name: 'Rich Text Editor [Tiptap] Property Editor UI', - element: UmbPropertyEditorUiTiptapElement, + element: () => import('./property-editor-ui-tiptap.element.js'), meta: { label: '#rte_label', propertyEditorSchemaAlias: 'Umbraco.RichText', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts index 12b9da29cafa..dd26b0056917 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/property-editors/toolbar-configuration/manifests.ts @@ -1,4 +1,3 @@ -import { UmbPropertyEditorUiTiptapToolbarConfigurationElement } from './property-editor-ui-tiptap-toolbar-configuration.element.js'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/property-editor'; export const manifests: Array = [ @@ -6,7 +5,7 @@ export const manifests: Array = [ type: 'propertyEditorUi', alias: 'Umb.PropertyEditorUi.Tiptap.ToolbarConfiguration', name: 'Tiptap Toolbar Property Editor UI', - element: UmbPropertyEditorUiTiptapToolbarConfigurationElement, + element: () => import('./property-editor-ui-tiptap-toolbar-configuration.element.js'), meta: { label: 'Tiptap Toolbar Configuration', icon: 'icon-autofill', From ed39dcc8c2e8bb240f5df25b85b12857f0006eb2 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 27 May 2026 15:51:40 +0200 Subject: [PATCH 4/4] Tiptap: Don't mount in the standalone test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mounting the element via fixture() spins up an UmbTiptapRteContext that consumes UMB_SERVER_CONTEXT. In the unit-test runtime no server context provider exists, so the context request stays pending. When @open-wc's fixture tears down at end-of-file the request rejects with "host disconnected" — surfaced as an unhandled promise rejection that web-test-runner counts as a fatal runner error, exiting 1 even though every individual test passed. The rejection happened to be in flight while a block-grid clipboard test was active in CI, which is why the failure surfaced there rather than in the tiptap test file itself. Drop the manifest-registration assertion too — pulling the package-level `manifests.ts` aggregator triggers a transitive 404 on the `@umbraco-cms/backoffice/tiptap` importmap entry in the wtr environment. The class-export + custom-element-registration checks are enough to prove standalone exportability. The Storybook stories still cover the visual end-to-end load path. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../input-tiptap/input-tiptap.test.ts | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts index 22ed9f5c0de8..a4e47cfb5b60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.test.ts @@ -1,36 +1,20 @@ import { UmbInputTiptapElement } from './input-tiptap.element.js'; -import { manifests as tiptapManifests } from '../../manifests.js'; -import { expect, fixture, html } from '@open-wc/testing'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { expect } from '@open-wc/testing'; describe('UmbInputTiptapElement (standalone)', () => { // Proves that `` is usable on its own — i.e. not gated on being - // rendered inside ``. Stories cover the full visual - // load path; this just nails down that the custom element is importable and the - // package's manifests can be registered alongside it without any other plumbing. + // rendered inside ``. We deliberately don't mount + // the element here: mounting it spins up an `UmbTiptapRteContext` that consumes + // `UMB_SERVER_CONTEXT` (not provided in unit tests), and the pending context + // request would surface as an unhandled rejection after the fixture tears down. + // The visual end-to-end load path is covered by the Storybook stories instead; + // this just nails down the contract that standalone consumers depend on. - before(() => { - umbExtensionsRegistry.registerMany(tiptapManifests); + it('exports the element class so a standalone consumer can import it', () => { + expect(UmbInputTiptapElement).to.be.a('function'); }); - after(() => { - for (const m of tiptapManifests) { - umbExtensionsRegistry.unregister(m.alias); - } - }); - - it('is defined and instantiable on its own', async () => { - const element = await fixture(html``); - expect(element).to.be.instanceOf(UmbInputTiptapElement); - }); - - it('has every first-party Tiptap manifest available in the registry after registration', () => { - // The data-type configuration UIs read these manifests via `byType(...)`; the - // boundary split changes only the `api`/`element` shape, never the metadata - // the configuration UIs depend on. Spot-check that the registry has them. - const knownAliases = ['Umb.Tiptap.RichTextEssentials', 'Umb.Tiptap.Bold', 'Umb.Tiptap.Table']; - for (const alias of knownAliases) { - expect(umbExtensionsRegistry.getByAlias(alias), `manifest ${alias} should be registered`).to.exist; - } + it('registers the `umb-input-tiptap` custom element at module load time', () => { + expect(customElements.get('umb-input-tiptap')).to.equal(UmbInputTiptapElement); }); });