npm / @tiptap/react
@tiptap/react
What changed in @tiptap/react 2 to 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-22.
5 breaking10 new APIs and options1 performance3 behavior and defaults23 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli init@tiptap/react 336 changes
Breaking changes 2
The prop types now require either the editor or instance field, so callers must provide one of them.
Import BubbleMenu and FloatingMenu from the /menus subpath instead of @tiptap/react.
New APIs and options 7
Extensions can declare decorations directly through this hook, avoiding a hand-written ProseMirror plugin for decoration state and transaction mapping.
Renders a React component into a widget decoration inside the existing app context, so providers, context and stores work as usual.
Manually refreshes decorations when they use
update: 'manual', such as decorations driven by data outside the editor.This option makes the component re-render on every position shift so calls to
getPos()stay current in render output.Adds an optional declarative component-first way to initialize and use Tiptap editors in React apps; existing APIs remain supported.
Provides a hook for reading the editor instance from context when using the new component-first API.
FloatingMenu now supports programmatic position updates via setMeta('floatingMenu', 'updatePosition').
Performance 1
NodeViews no longer re-render when decorations or position change without content changes.
Behavior and default changes 3
Core symbols re-exported through
@tiptap/reactcross the client boundary, so import them directly from@tiptap/corein server code.When SSR is detected, immediatelyRender is set to false by default; in development, a warning is logged instead of throwing.
The hook provides a guaranteed non-null editor instance as part of the simplified Tiptap component API.
Fixes and other changes 23
Fixes a crash when contentComponent is not available.
React node views no longer show the selected state when the selection covers a position the node view has moved away from.
Fixed the caret jumping back to the previous block when pressing Enter inside a React node view.
Fixes caret placement after splitting a block rendered with a React NodeView.
Fixed components not re-rendering when editor.setEditable() changes the editor's editable state.
Notifications in the same microtask are batched to avoid nested update depth warnings when many node views mount together.
The hook binds onMount and onUnmount event handlers when initializing an Editor.
A
use clientdirective lets@tiptap/reactbe imported from React Server Components without crashing.An explicit true value is now respected in client-side Next.js; false is forced only during actual SSR or when Next.js is detected and no value was explicitly provided.
Fixed an error where flushSync would run in the EditorContent lifecycle.
NodeView now re-renders when a node's position changes without content or decoration changes, such as when a sibling node moves within the same parent.
React node views no longer crash during deferred selection updates when ProseMirror has already detached the node view position lookup.
HTML props, including className, style, data-* attributes, and event handlers, are forwarded to the positioned menu container.
HTML props, including className, style, data-* attributes, and event handlers, are forwarded to the positioned menu container.
A stable per-instance menu plugin key is generated automatically when pluginKey is omitted, allowing multiple BubbleMenu or FloatingMenu components to be mounted without collisions.
BubbleMenu and FloatingMenu use pluginKey as the transaction meta key, allowing multiple instances to update independently.
Fixes props not updating after initialization.
Fixes extension storage not updating in React and Vue node views.
Fixes props not updating after initialization.
Fixes race conditions that caused destroyed renderers to be re-added in Strict Mode.
All children of the editor's parent node are appended to the element, preventing appended elements such as drag handles from staying detached.
React node views no longer receive invalid positions from this.getPos when ProseMirror and React render cycles get out of sync, preventing errors during updates.
The Bubble Menu plugin no longer reloads every time the BubbleMenu component re-renders.
@tiptap/react 26 changes
Breaking changes 3
Floating menus use Floating UI and require this dependency for menu positioning.
NodeViewRendererProps.getPos can return undefined, so handle that case before using the position.
Menu positioning no longer uses tippyOptions; migrate to Floating UI options.
New APIs and options 3
Use ReactMarkViewRenderer to render custom React views for marks.
The Editor configuration option controls rerendering on transactions and is disabled by default; enable it when UI depends on automatic editor state rerenders.
Extract editor state or selected values for UI logic that depends on editor state.