Skip to content

fix(vue-3): solve BubbleMenu v-if remount crash and preserve attribut…#7717

Open
emrullahtastan wants to merge 2 commits intoueberdosis:mainfrom
emrullahtastan:fix/issue-7685-bubble-menu-conditional-mount
Open

fix(vue-3): solve BubbleMenu v-if remount crash and preserve attribut…#7717
emrullahtastan wants to merge 2 commits intoueberdosis:mainfrom
emrullahtastan:fix/issue-7685-bubble-menu-conditional-mount

Conversation

@emrullahtastan
Copy link
Copy Markdown
Contributor

…e forwarding

Changes Overview

This PR fixes a critical bug where the Vue 3 BubbleMenu component crashes and stops responding to editor events when toggled via v-if. The fix restores the Teleport and imperative element creation approach while maintaining reactive attribute forwarding.

Implementation Approach

The issue was caused by el.remove() being called on a Vue-managed node, which corrupted Vue's virtual DOM reconciliation on subsequent renders.

The new approach:

Imperative Element: Created via document.createElement('div') to keep it outside Vue's VDOM management.
Reactive Attribute Sync: Uses watchEffect to manually but reactively sync attributes (class, style, data-*) from the component to the imperative element, preserving the fix from PR #7101.
Teleport: Renders slot content into the plugin-managed element, matching the successful pattern used in the React implementation.

Testing Done

Manual verification using the Tiptap Vue BubbleMenu demo.
Verified that toggling the menu with v-if multiple times no longer causes crashes.
Verified that the menu remains functional (shows/hides/positions correctly) after multiple remounts.
Verified that no console errors (TypeError) occur during unmount or remount.
Verified that custom classes applied to the component are correctly forwarded to the DOM element.

Verification Steps

Open the Vue BubbleMenu demo.
Toggle the menu component visibility (using a v-if controller if available, or the provided Toggle button).
Select text in the editor after remounting.
Observe that the BubbleMenu appears correctly without errors.

Additional Notes

This aligns the Vue 3 implementation with the React implementation's architecture (which also uses an imperative element and a portal/teleport).

Checklist

  • I have created a changeset for this PR if necessary.
  • My changes do not break the library.
  • I have added tests where applicable. (Manual verification with the Vue BubbleMenu demo performed)
  • I have followed the project guidelines.
  • I have fixed any lint issues.

Related Issues

Fixes #7685

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 7, 2026

🦋 Changeset detected

Latest commit: f191bc2

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 72 packages
Name Type
@tiptap/vue-3 Patch
@tiptap/extension-drag-handle-vue-3 Patch
@tiptap/core Patch
@tiptap/extension-audio Patch
@tiptap/extension-blockquote Patch
@tiptap/extension-bold Patch
@tiptap/extension-bubble-menu Patch
@tiptap/extension-bullet-list Patch
@tiptap/extension-code-block-lowlight Patch
@tiptap/extension-code-block Patch
@tiptap/extension-code Patch
@tiptap/extension-collaboration-caret Patch
@tiptap/extension-collaboration Patch
@tiptap/extension-color Patch
@tiptap/extension-details Patch
@tiptap/extension-document Patch
@tiptap/extension-drag-handle-react Patch
@tiptap/extension-drag-handle-vue-2 Patch
@tiptap/extension-drag-handle Patch
@tiptap/extension-emoji Patch
@tiptap/extension-file-handler Patch
@tiptap/extension-floating-menu Patch
@tiptap/extension-font-family Patch
@tiptap/extension-hard-break Patch
@tiptap/extension-heading Patch
@tiptap/extension-highlight Patch
@tiptap/extension-horizontal-rule Patch
@tiptap/extension-image Patch
@tiptap/extension-invisible-characters Patch
@tiptap/extension-italic Patch
@tiptap/extension-link Patch
@tiptap/extension-list Patch
@tiptap/extension-mathematics Patch
@tiptap/extension-mention Patch
@tiptap/extension-node-range Patch
@tiptap/extension-ordered-list Patch
@tiptap/extension-paragraph Patch
@tiptap/extension-strike Patch
@tiptap/extension-subscript Patch
@tiptap/extension-superscript Patch
@tiptap/extension-table-of-contents Patch
@tiptap/extension-table Patch
@tiptap/extension-text-align Patch
@tiptap/extension-text-style Patch
@tiptap/extension-text Patch
@tiptap/extension-twitch Patch
@tiptap/extension-typography Patch
@tiptap/extension-underline Patch
@tiptap/extension-unique-id Patch
@tiptap/extension-youtube Patch
@tiptap/extensions Patch
@tiptap/html Patch
@tiptap/markdown Patch
@tiptap/pm Patch
@tiptap/react Patch
@tiptap/starter-kit Patch
@tiptap/static-renderer Patch
@tiptap/suggestion Patch
@tiptap/vue-2 Patch
@tiptap/extension-character-count Patch
@tiptap/extension-dropcursor Patch
@tiptap/extension-focus Patch
@tiptap/extension-gapcursor Patch
@tiptap/extension-history Patch
@tiptap/extension-list-item Patch
@tiptap/extension-list-keymap Patch
@tiptap/extension-placeholder Patch
@tiptap/extension-table-cell Patch
@tiptap/extension-table-header Patch
@tiptap/extension-table-row Patch
@tiptap/extension-task-item Patch
@tiptap/extension-task-list Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@netlify
Copy link
Copy Markdown

netlify bot commented Apr 7, 2026

Deploy Preview for tiptap-embed ready!

Name Link
🔨 Latest commit f191bc2
🔍 Latest deploy log https://app.netlify.com/projects/tiptap-embed/deploys/69d4c6cc917a6f00089447d5
😎 Deploy Preview https://deploy-preview-7717--tiptap-embed.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BubbleMenu throws error when toggled via conditional mount/unmount (v-if)

1 participant