Skip to content

Upgrading @tiptap/extension-placeholder 2 to 3

Breaking2.27.3 → 3.32.2Breaking18Security11Platform2New111Changed309Fixed322Other42

Fetching 151 releases from GitHub…149 / 151
BreakingUpgrade verdict

13 breaking changes and 2 platform requirement changes and 11 security fixes.

  • The package no longer ships a browser-global build; you must bundle it yourself if you relied on that.
  • Custom configuration keys now need to be declared in TypeScript before use.
  • Setting or clearing content now triggers update events, which may affect listeners.
  • Menus now use a different positioning library, so menu configuration and dependencies must be updated.
Top 5 of 26 that need code or config changes
Breaking13
Switches to tsup for bundling, so UMD builds are no longer supported.
tsup
Node, Mark, and Extension configs no longer allow arbitrary keys unless their TypeScript interfaces are extended.
NodeMarkExtension
clearContent and setContent now emit updates by default.
clearContentsetContent
Replaces Tippy.js with Floating UI across menu-related extensions, removing tippyOptions in favor of an options prop.
FloatingMenuBubbleMenuMentionSuggestiontippyOptionsoptions@floating-ui/dom
Renames the History extension to UndoRedo.
HistoryUndoRedo
Renames the CollaborationCursor extension to CollaborationCaret.
CollaborationCursorCollaborationCaret
Renames @tiptap/extension-utils to @tiptap/extensions.
@tiptap/extension-utils@tiptap/extensions
Removes tippy.js and replaces it with Floating UI.
tippy.jsFloating UI
Changes prop types of the Tiptap component so that either the editor or the instance field is required.
Tiptapeditorinstance
Moves BubbleMenu and FloatingMenu to a separate @tiptap/react/menus entrypoint to keep floating-ui optional.
BubbleMenuFloatingMenu@tiptap/react/menus
getPos now returns number | undefined to reflect runtime reality.
getPos
editor.storage becomes per-editor instance and strongly typed.
editor.storage
VueNodeViewRenderer returns null for contentDOM when the node is not a leaf and no NodeViewContent is rendered.
VueNodeViewRenderercontentDOMNodeViewContent
Security11
Prevents extra CSS declarations from being rendered from editor content.
Prevents extra CSS declarations from being rendered from editor content.
Ignores potentially unsafe color values received from other collaboration users.
Bumps prosemirror-view to ^1.42.3, fixing an XSS vulnerability where pasting crafted HTML could run arbitrary JavaScript.
prosemirror-view
Fixes a denial-of-service risk where crafted block or inline Markdown attributes could consume excessive CPU and block the event loop.
Prevents untrusted HTML attributes from changing an object's prototype when merged with mergeAttributes.
mergeAttributes
Escapes HTML string renderer text content and attribute values to prevent injected markup from untrusted content.
Fixes CVE-2025-62410 by updating happy-dom to ^20.0.2.
happy-dom
Bumps happy-dom from ^18.0.1 to ^20.0.0 in @tiptap/html to fix CVE-2025-61927.
happy-dom@tiptap/html
Bumps linkifyjs to the latest version to address a recently discovered prototype pollution vulnerability.
linkifyjs
Fixes the Link extension's commands not respecting XSS prevention via unallowed protocols.
Platform2
Adds @tiptap/pm as a peer dependency so bundlers resolve ProseMirror packages from the app instead of duplicating prosemirror-model.
@tiptap/pmprosemirror-model@tiptap/extension-blockquote
Updates the @tiptap/pm dependency to 3.22.4.
@tiptap/pm