What's new in Tiptap V3
Tiptap V3 introduces significant updates to the core editor. This guide highlights important changes clearly, making your upgrade straightforward. Use it to quickly find everything essential to update your integration.
Upgrade guide
If you’re upgrading from Tiptap 2.x to 3.x, refer to our upgrade guide. It covers breaking changes, important updates, and new features clearly—ensuring your migration process is efficient.
Breaking Changes
Change | Description |
---|---|
Removed UMD builds | UMD builds have been removed. We recommend using ESM builds instead. UMD builds are not compatible with the new @tiptap/extension-* packages. |
New shouldRerenderOnTransaction option with false default | The new shouldRerenderOnTransaction option is disabled by default to minimize rerendering with React components. This can cause your editor component to not rerender as expected. Read more. |
Migration from tippy.js to floating-ui | We replaced the outdated tippy.js library with the new floating-ui library. This change improves the performance and reliability of our menus and tooltips. |
Changes to our Text Style API | The @tiptap/extension-text-style package has seen API updates providing a new TextStyleKit extension that encapsulates all possible text styling functionalities in one extension. Default options were also updated. |
Commands were changed | The behavior or names of commands were changed. clearContent and setContent now emit updates correctly while setContent also received a change to its parameters. insertContent was changed to prevent unwanted text splitting. |
NodeView getPos now can return undefined | nodeView.getPos() can now return undefined making a check for undefined necessary to handle this case properly. |
editor.getCharacterCount() was removed | The editor.getCharacterCount() method was removed. It was marked as deprecated in the previous version and is now removed. You can use editor.storage.characterCount.characters() instead while using the CharacterCount extension. |
considerAnyAsEmpty option removed from placeholder extension | The considerAnyAsEmpty option was removed from the placeholder extension as it was deprecated already and wasn't respected in the previous version. |
Stricter Typing | 3.0.0 brings stricter typing to the editor. This change improves the overall type safety of the editor and makes it easier to work with but might require some adjustments in your code. We recommend using TypeScript to benefit from the improved type safety. |
Moved Utility Extensions | We moved all our utility extensions like History , Placeholder , CharacterCount , DropCursor , GapCursor , TrailingNode , Focus , and Selection to the new @tiptap/extensions package. |
Renamed Collaboration Cursor | The CollaborationCursor extension was renamed to CollaborationCaret as we felt cursors was to general and could clash with potential other cursor types in the future. |
Renamed History Extension | The History extension was renamed to UndoRedo to better reflect its purpose and avoid confusion with the collaborative History feature. This also includes the history option on the StarterKit . |
New features
-
New
@tiptap/extensions
extension - The new@tiptap/extensions
package includes and combines multiple utility extensions. Read more. -
New MarkView support - MarkViews are now supported by Tiptap. This can be useful to render custom HTML for marks. Read more.
-
Improved Server-Side Rendering - The editor can now run on SSR environments without rendering the editor content. Read more.
-
Deletes can now be tracked as an event - Editor deletions can now be tracked as an event. Read more.
-
Nodes and marks have new attribute validation support - Validating attributes on nodes or marks is now supported.
-
StarterKit updates - The StarterKit was made more powerful now including more extensions by default. Read more.
-
TableKit - The new
TableKit
extension allows you to register all important table extensions in one package. Read more. -
ListKit - The new
ListKit
extension allows you to register all important list extensions in one package. Read more. -
TextStyleKit - The new
TextStyleKit
extension registers all important text-style extensions in one package. Read more. -
New
rewriteUnknownContent
helper - This helper function can be imported from the@tiptap/core
. -
New
unmount
as an alternative to destroying the editor - The editor instance now supports anunmount
method which allows for mounting and unmounting the editor to the DOM. This encourages re-use of editor instances by preserving all the same options between instances. This is different from thedestroy
method, which will unmount, emit thedestroy
event, and remove all event listeners. -
New
toggleTextStyle
command for text styles - ThetoggleTextStyle
command allows you to toggle text styles on and off. This is useful for toggling text styles like bold or italic. -
Static Renderer - The Static Renderer helps render JSON content as HTML, Markdown, or React components without an editor instance. Read more.
-
JSX Renderer - With 3.0.0 you will have the ability to use framework agnostic JSX for the
renderHTML
function of your extensions. Read more.
Improvements
- Improved transaction handling - Transactions are now handled more efficiently and reliably. This change improves the overall performance of the editor.
focusEvent
plugin key is exported - You can now import thefocusEvent
plugin key if needed from the core package.- Improvements on mobile devices - The 3.0.0 release brings improvements for mobile devices primarily focusing on touch events.
- Minor IME bugfixes - The 3.0.0 release includes a few minor bugfixes for IME input handling.
- TextStyle can now consume style attributes - The
TextStyle
extension can now consume styles from the style attribute and will skip parsing of other styles if there was an override defined in the style attribute. See this Github Comment. - TableView on
Table
extension is now importable - TheTableView
class on theTable
extension is now importable to allow for custom table views that still are resizable.
Additional changes
- HTML parsing with
happy-dom-without-node
- We now usehappy-dom-without-node
to parse HTML as a lightweight alternative tozeed-dom
. - Various smaller bugfixes - The 3.0.0 release includes various smaller bugfixes and improvements to the overall performance of the editor.
What's next in Tiptap 3.X?
We're already exploring future features for releases beyond Tiptap 3.0.
Provide Feedback
If you have any feedback on an additional use case you’d like us to consider, please let us know.
- Content migrations: Migrations allow you to rewrite your document JSON to align with your current schema, facilitating document updates during schema changes with fully customizable solutions tailored to your needs.
- Markdown support: Enhance your editing capabilities by enabling the editor to both accept and output content in markdown, meeting the demands of modern applications and leveraging the strengths of LLMs in markdown generation.
- Decorations API: The new Decorations API allows you to influence document presentation without altering its content, providing an intuitive way to add visual enhancements beyond complex ProseMirror internals.