v3.20.0
- Add
transformPastedHTMLextension API that allows extensions to transform pasted HTML content before it's parsed into the editor, enabling cleanup of styles, removal of dangerous content, and modification of pasted HTML through a chainable transform system.
- Fix checking if mark is active and toggling off marks when part of the selection does not allow the mark (e.g. a code block)
- Global attributes now support shorthand string values for
types: use'*'to apply to all nodes and marks,'nodes'for all nodes (excluding text), or'marks'for all marks. - Fixed a typo in the documentation of
editor.view
- Fix drag handle not appearing for atom/leaf nodes like images in both nested and non-nested modes
- Add table structure rules to prevent drag handle on table rows, cells, and headers, and fix ghost table rows when dragging tables
- Fix drag position resolving outside the document when dragging an empty text node at the end of the document
- Fixed getMarkdown() returning
instead of empty string when editor is empty
- Fix
BubbleMenu/FloatingMenuto usepluginKeyas the transaction meta key so that multiple instances can be updated independently without affecting each other
- Fix
BubbleMenu/FloatingMenuto usepluginKeyas the transaction meta key so that multiple instances can be updated independently without affecting each other
- Moved BubbleMenu and FloatingMenu to separate
@tiptap/react/menusentrypoint to keep floating-ui optional - Simplified Tiptap component API with guaranteed non-null editor instance from useTiptap hook
- Fix
BubbleMenu/FloatingMenuto usepluginKeyas the transaction meta key so that multiple instances can be updated independently without affecting each other
- Fixed a runtime error when initializing
CodeBlockLowlightby switching theCodeBlockimport to a named export. This preventsextend is not a functionerrors caused by ESM/CJS interop issues.
- Added missing storage typings
v3.19.0
- Add
titleattribute to Link extension. The title can now be set viasetLinkandtoggleLinkcommands and is rendered as an HTML title attribute. - Add title attribute support for markdown rendering. Links with titles are now serialized to markdown format
[text](url "title").
- Moved BubbleMenu and FloatingMenu to separate
@tiptap/react/menusentrypoint to keep floating-ui optional - Simplified Tiptap component API with guaranteed non-null editor instance from useTiptap hook
v3.18.0
- Fix BubbleMenu and FloatingMenu props not updating after initialization
- Fix BubbleMenu and FloatingMenu props not updating after initialization
-
Introduce a new, optional React integration that provides a declarative
<Tiptap />component for setting up editors in React apps.Summary
- Add a new, ergonomic way to initialize and use Tiptap editors in React via
<Tiptap />components. This is an additive change and does not remove or change existing APIs.
Why this change
- Improves ergonomics for React users by offering a component-first API that pairs well with React patterns (hooks, JSX composition and props-driven configuration).
Migration and usage
- The old programmatic setup remains supported for this major version — nothing breaks. We encourage consumers to try the new
<Tiptap />component and migrate when convenient.
Example
import { Tiptap, useEditor } from '@tiptap/react' function MyEditor() { const editor = useEditor({ extensions: [StarterKit], content: '<h1>Hello from Tiptap</h1>' }) return ( <Tiptap instance={editor}> <Tiptap.Content /> <Tiptap.BubbleMenu>My Bubble Menu</Tiptap.BubbleMenu> <Tiptap.FloatingMenu>My Floating Menu</Tiptap.FloatingMenu> <MenuBar /> {/* MenuBar can use the new `useTiptap` hook to read the editor instance from context */} </Tiptap> ) }
Deprecation plan
- The old imperative setup will remain fully backward-compatible for this major release. We plan to deprecate (and remove) the legacy setup in the next major version — a deprecation notice and migration guide will be published ahead of that change.
- Add a new, ergonomic way to initialize and use Tiptap editors in React via
- Fix BubbleMenu and FloatingMenu props not updating after initialization
- Fixed extension storage not updating in React and Vue node views
- Fixed extension storage not updating in React and Vue node views
- Upgrade marked.js from v15.0.12 to v17.0.1.
- Added a new
dataAttributeto the extension option to control which attribute name will be used for the placeholder label.
v3.17.1
- Fixed markdown serialization doubling newlines and parsing collapsing multiple blank lines
- Fixed markdown serialization doubling newlines and parsing collapsing multiple blank lines
- Fixed markdown HTML parsing when window object is unavailable in server-side environments
- Fixed ordered list numbering when list has a non-default start value
- Fixed IME input (Chinese, Japanese, Korean) in Vue 3 mark views by preventing DOM element destruction during composition events
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
- Fixed server-side HTML parsing crash when content contains link, script, or style tags with resource references.
- Fixed server exports failing in Node.js test environments with jsdom/happy-dom
- Fixed bubble and floating menus to properly handle hide middleware data, hiding menus when reference element is scrolled out of view
- Fixed bubble and floating menus to properly handle hide middleware data, hiding menus when reference element is scrolled out of view
- Fixed
$nodes()method to correctly return inline nodes (like text, mention, etc.) by fixing thechildrengetter inNodePosclass - Fixed ResizableNodeView contentDOM getter to return null instead of undefined for proper TypeScript compatibility
- Fixed ordered list numbering when list has a non-default start value
v3.17.0
- Added a safeguard to avoid
TypeError: Cannot read properties of null (reading 'domFromPos')being thrown when the editor was being destroyed
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
- Fixed Firefox bug where the text caret becomes invisible after drag and drop.
- Added
isFirefoxutility to core
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
v3.16.0
- Add a native audio extension with demos and tests.
- Fix incorrect Markdown output when underline is mixed with bold or italic and their ranges do not fully overlap.
- Fix overlapping underline/bold/italic serialization and add tests
- Fixed an issue where clicking on non-link elements (like images) required multiple clicks to select them. The link click handler now properly returns early when the clicked element is not a link, allowing other node handlers to process the click event.
- Add updateEvent support for FloatingMenu to allow programmatic position updates via
setMeta('floatingMenu', 'updatePosition')
- Add updateEvent support for FloatingMenu to allow programmatic position updates via
setMeta('floatingMenu', 'updatePosition')
- Add updateEvent support for FloatingMenu to allow programmatic position updates via
setMeta('floatingMenu', 'updatePosition')
- Add updateEvent support for FloatingMenu to allow programmatic position updates via
setMeta('floatingMenu', 'updatePosition')
- Improved
findDuplicateshelper performance from O(n²) to O(n) by using Set-based lookups instead of Array.indexOf
v3.15.2
- Prevent auto-linking of bare hostnames (e.g.,
localhost) and IP addresses without a protocol prefix
- Fix lost HTML attributes in TaskItem node view updates
- Fix Vue prop validation warning for
appendToprop in BubbleMenu and FloatingMenu
- Fix Vue prop validation warning for
appendToprop in BubbleMenu and FloatingMenu
- Fix YouTube Shorts embed URLs using incorrect query parameter separator
- Fix race conditions in ReactRenderer causing destroyed renderers to be re-added in Strict Mode
v3.15.0
- Add a new
dispatchTransactionhook to extensions, allowing developers to intercept, modify, or block transactions before they are applied to the editor state.
- Fix unique ID assignment when handling empty nodes by checking next node's attribute state in the transaction document before modifying it, preventing incorrect ID assignments.