From ba8e1ae5ddaa2b459ab2e37449750185e8fc483a Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Fri, 8 Aug 2025 05:52:41 +0100 Subject: [PATCH] Tiptap RTE: Fixes embedded media spacing (#19878) * Tiptap RTE: Makes embedded-media truly inline by using a `` instead of a `
`. * Cosmetically aligns the selection styles * Adds `UmbEmbeddedMediaOptions` to strongly-type the `inline` option --- .../extensions/tiptap-span.extension.ts | 2 ++ .../tiptap-umb-embedded-media.extension.ts | 16 ++++----- .../core/embedded-media.tiptap-api.ts | 34 +++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-span.extension.ts b/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-span.extension.ts index 4f6d241f4b..e0adabf8af 100644 --- a/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-span.extension.ts +++ b/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-span.extension.ts @@ -37,6 +37,8 @@ function serializeStyles(items: Record): string { export const Span = Mark.create({ name: 'span', + priority: 50, + addOptions() { return { HTMLAttributes: {} }; }, diff --git a/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-umb-embedded-media.extension.ts b/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-umb-embedded-media.extension.ts index daa8071f26..daecec2468 100644 --- a/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-umb-embedded-media.extension.ts +++ b/src/Umbraco.Web.UI.Client/src/external/tiptap/extensions/tiptap-umb-embedded-media.extension.ts @@ -1,6 +1,10 @@ import { mergeAttributes, Node } from '@tiptap/core'; -export const umbEmbeddedMedia = Node.create({ +export interface UmbEmbeddedMediaOptions { + inline: boolean; +} + +export const umbEmbeddedMedia = Node.create({ name: 'umbEmbeddedMedia', group() { return this.options.inline ? 'inline' : 'block'; @@ -25,19 +29,13 @@ export const umbEmbeddedMedia = Node.create({ }, parseHTML() { - return [ - { - tag: 'div', - priority: 100, - getAttrs: (dom) => dom.classList.contains('umb-embed-holder') && null, - }, - ]; + return [{ tag: '.umb-embed-holder', priority: 100 }]; }, renderHTML({ HTMLAttributes }) { const { markup, ...attrs } = HTMLAttributes; const embed = document.createRange().createContextualFragment(markup); - return ['div', mergeAttributes({ class: 'umb-embed-holder' }, attrs), embed]; + return [this.options.inline ? 'span' : 'div', mergeAttributes({ class: 'umb-embed-holder' }, attrs), embed]; }, addCommands() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/embedded-media.tiptap-api.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/embedded-media.tiptap-api.ts index cffceb3d74..8ffdb2abf1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/embedded-media.tiptap-api.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/core/embedded-media.tiptap-api.ts @@ -9,27 +9,27 @@ export default class UmbTiptapEmbeddedMediaExtensionApi extends UmbTiptapExtensi .umb-embed-holder { display: inline-block; position: relative; - } - .umb-embed-holder > * { - user-select: none; - pointer-events: none; - } + &::before { + z-index: 1000; + width: 100%; + height: 100%; + position: absolute; + content: ' '; + } - .umb-embed-holder.ProseMirror-selectednode { - outline: 2px solid var(--uui-palette-spanish-pink-light); - } + &.ProseMirror-selectednode { + outline: 3px solid var(--uui-color-focus); - .umb-embed-holder::before { - z-index: 1000; - width: 100%; - height: 100%; - position: absolute; - content: ' '; - } + &::before { + background: rgba(0, 0, 0, 0.1); + } - .umb-embed-holder.ProseMirror-selectednode::before { - background: rgba(0, 0, 0, 0.025); + > * { + user-select: none; + pointer-events: none; + } + } } `; }