NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4047 most downloaded on npm
headless rich text editor
Last release 14 days ago
04 Sep 2026
Ships fairly regularly
a new release about every 1 weeks
Nearly every release is documented
notes for 58 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
6 years old
511 releases · first in 2020
One column per quarter.
Fix BubbleMenu and FloatingMenu component runtime errors in Vue 2.
Fixed collaborative editing errors with certain emoji combinations (like 🔴🟢, 😎🐈, 🟣🔵) by updating @tiptap/y-tiptap to stable v3.0.0.
@tiptap/y-tiptap to stable v3.0.0.@tiptap/y-tiptap to stable v3.0.0.@tiptap/y-tiptap to stable v3.0.0.isRequired attribute configuration. Previously, attributes marked with isRequired: true were incorrectly treated as optional because a default property was always included in the schema specification. ProseMirror determines attribute requirements by the absence of the default property, so now the default is only included when the attribute is not required and a default value is explicitly defined.Fix autofocus behavior to prevent unwanted scrolling when disabled
Fix markdown serialization to prevent marks from continuing after hard breaks. Previously, marks like bold would incorrectly persist across hard break
Fix parsing of mixed inline HTML within Markdown content so that inline HTML fragments are parsed correctly.
style attributes instead of always overriding them with calculated widths.Use correct ResizableNodeView class name
ResizableNodeView class nameAdd a new ResizableNodeview NodeView to core that wraps elements (images, videos, iframes) with configurable resize handles. It provides live onResize
Add a new ResizableNodeview NodeView to core that wraps elements (images, videos, iframes) with configurable resize handles. It provides live onResize/onCommit callbacks, min/max constraints, aspect-ratio support, and styling hooks (class names + data attributes) to improve UX when resizing media inside the editor.
the addNodeView function can now return null to dynamically disable rendering of a node view
While this should not directly cause any issues, it's noteworthy as it still could affect some behavior in some edge cases.
resize option that allows images to be resized. The option adds resize handlers to images allowing users to manually resize images via drag and drop or touchAdd a renderWrapper option to the Table extension so consumers can customize whether the table wrapper for the resizable node view should be rendered
renderWrapper option to the Table extension so consumers can customize whether the table wrapper for the resizable node view should be rendered in non-editable mode as well.Fix attribute forwarding for BubbleMenu and FloatingMenu Vue 3 components to allow setting z-index and other HTML attributes
Ensure that markdown hard breaks (two spaces followed by a newline) are parsed so they render as line breaks (<br>) in the editor when using contentType: 'markdown'.
Fixes #7107
updateDocument option to disable document updates caused by the Unique ID extension.Replace DOM traversal with browser's native elementsFromPoint for better performance.
23e516e: Add updateDocument option to disable document updates caused by the Unique ID extension.
updateDocument option to disable document updates caused by the Unique ID extension.Fix CVE-2025-62410 by updating happy-dom to ^20.0.2
Editors will not throw an error anymore when content is an empty string and contentType is markdown
content is an empty string and contentType is markdownAll commands and their corresponding TypeScript types are now exported from @tiptap/core so they can be imported and referenced directly by consumers.
All commands and their corresponding TypeScript types are now exported from @tiptap/core so they can be imported and referenced directly by consumers. This makes it easier to build typed helpers, extensions, and tests that depend on the command signatures.
Why:
import { commands } from '@tiptap/core'
Notes:
@tiptap/core going forward.Add comprehensive bidirectional markdown support to Tiptap through a new @tiptap/markdown package and Markdown utilities in @tiptap/core.
New Package: @tiptap/markdown - A new official extension that provides full Markdown parsing and serialization capabilities using MarkedJS as the underlying Markdown parser.
Core Features:
Extension API
Markdown Extension: Main extension that adds Markdown support to your editorMarkdownManager: Core engine for parsing and serializing Markdown
editor.markdown.parse(markdown)editor.markdown.serialize(json)editor.markdown.instanceeditor.getMarkdown(): Serialize current editor content to Markdown stringeditor.markdown: Access to MarkdownManager instance for advanced operationsEditor Options:
contentType: Control the type of content that is inserted into the editor. Can be json, html or markdown - defaults to json and will automatically detect invalid content types (like JSON when it is actually Markdown).new Editor({
content: '# Hello World',
contentType: 'markdown'
})
Command Options: All content commands now support an contentType option:
setContent(markdown, { contentType: 'markdown' }): Replace editor content with markdowninsertContent(markdown, { contentType: 'markdown' }): Insert markdown at cursor positioninsertContentAt(position, markdown, { contentType: 'markdown' }): Insert Markdown at specific positionFor more, check the documentation.
baseExtensions that contains an unflattened array of extensionsAdd comprehensive bidirectional markdown support to Tiptap through a new @tiptap/markdown package and Markdown utilities in @tiptap/core.
New Package: @tiptap/markdown - A new official extension that provides full Markdown parsing and serialization capabilities using MarkedJS as the underlying Markdown parser.
Core Features:
Extension API
Markdown Extension: Main extension that adds Markdown support to your editorMarkdownManager: Core engine for parsing and serializing Markdown
editor.markdown.parse(markdown)editor.markdown.serialize(json)editor.markdown.instanceeditor.getMarkdown(): Serialize current editor content to Markdown stringeditor.markdown: Access to MarkdownManager instance for advanced operationsEditor Options:
contentType: Control the type of content that is inserted into the editor. Can be json, html or markdown - defaults to json and will automatically detect invalid content types (like JSON when it is actually Markdown).new Editor({
content: '# Hello World',
contentType: 'markdown'
})
Command Options: All content commands now support an contentType option:
setContent(markdown, { contentType: 'markdown' }): Replace editor content with markdowninsertContent(markdown, { contentType: 'markdown' }): Insert markdown at cursor positioninsertContentAt(position, markdown, { contentType: 'markdown' }): Insert Markdown at specific positionFor more, check the documentation.
Make the TrailingNode extension's node option optional and derive the
default node type from the editor schema when available.
Previously the extension used a hard-coded 'paragraph' default and the
node option was required in the TypeScript definitions. This change:
node optional in the options type,'paragraph' as a last resort.This fixes cases where projects use a different top-level default node and prevents the extension from inserting an incorrect trailing node type.
Fix CVE-2025-61927 by bumping happy-dom to 20.0.0
Fix CVE-2025-61927 by bumping happy-dom to 20.0.0
Bumps the transitive/dev dependency happy-dom from ^18.0.1 → ^20.0.0 in @tiptap/html to address CVE-2025-61927. This is a dependency/security-only change and does not modify any public APIs.
Why:
Fixed a problem where the position of a menu is not updated on creation when shouldShow is true
Added nextNodeType option to horizontal-rule extension, allowing users to specify which node type should be inserted after a horizontal rule
transaction and update events before being mounted.
This means smoother state handling and instant feedback from editors, even when they're not in the DOM.transaction and update events before being mounted.
This means smoother state handling and instant feedback from editors, even when they're not in the DOM.Fix: Clean up happy-dom window instance fixing a memory leak caused by unclosed happy-dom windows
All existing default values and fallback logic remain in place - no breaking changes for existing code.
FloatingMenu plugin hook dependencies to match the BubbleMenu behavior.
The FloatingMenu will now respond to changes in appendTo, pluginKey, shouldShow, and options.appendTo prop passed to the React BubbleMenu component is now correctly forwarded to the underlying bubble menu plugin. This fix allows developers to customize where the BubbleMenu is attached in the DOM, helping resolve issues with positioning and portal setups in React apps.null and undefined values.
This makes custom setups more flexible and avoids unnecessary type errors when omitting optional overrides.
All existing default values and fallback logic remain in place - no breaking changes for existing code.JSONContent.attrs definition to exactly mirror the structure returned by editor.getJSON(). This ensures strict type safety and consistency between the editor output and the expected type, eliminating errors caused by mismatched attribute signatures.appendTo option in the floating and bubble menu
extensions. The callback must return an element synchronously,
so menus can be appended to elements that are created dynamically.appendTo option in the floating and bubble menu
extensions. The callback must return an element synchronously,
so menus can be appended to elements that are created dynamically.Fix a bug where the bubble menu could throw an error if the editor was destroyed while the plugin was cleaning up.
Hotfix: Fix a crash in the React package that could occur during mounting/unmounting when the editor wasn't fully initialized. This prevents a runtime
Improve typing and docs for EditorOptions.element to reflect all supported mounting modes and align behavior across adapters.
Improve typing and docs for EditorOptions.element to reflect all supported mounting modes and align behavior across adapters.
element now accepts:
Element: the editor is appended inside the given element.{ mount: HTMLElement }: the editor is mounted directly to mount (no extra wrapper).(editorEl: HTMLElement) => void: a function that receives the editor element so you can place it anywhere in the DOM.null: no automatic mounting.Parse cell colwidth from nearest <colgroup> when missing on the cell
When importing HTML, table column widths are often declared on a surrounding <colgroup> rather than on each <td>. Previously, tableCell only read the colwidth attribute from the cell itself and would lose width information in that case. The implementation now falls back to reading the corresponding <col>'s width from the table's <colgroup> using the cell's index.
This is a non-breaking bugfix that preserves layout information when HTML uses <colgroup>. Consider adding a small demo or unit test to assert colwidth is preserved for cells when only the <colgroup> contains width attributes.
Fixes table wrapper replacement and lost selections when resizable: true.
TableView.ignoreMutation now ignores attribute/childList/characterData mutations that occur inside the table wrapper but outside the editable contentDOM, preventing wrapper re-creation during resize interactions so selections (e.g. mergeCells()) are preserved.
No API or breaking changes.
Remove recently added updateBubbleMenuPosition method because it would not work in the React and Vue versions of the BubbleMenu, only in the vanilla extension. And that would confuse developers.
Write the transactionHandler method as an arrow function because arrow functions have no this, so the this remains the instance of the BubbleMenuView class.
Create a utility to add unique IDs to a document in the server
The utility is called generateUniqueIds and is exported from the @tiptap/extension-unique-id package.
It has the same functionality as the UniqueID extension, but without the need to create an Editor instance. This lets you add unique IDs to the document in the server.
It takes the following parameters:
doc: The Tiptap JSON document to add unique IDs to.extensions: The extensions to use. Must include the UniqueID extension.It returns the updated Tiptap JSON document, with the unique IDs added to the nodes.
attrs through Vue 3 menusMerge nested span styles only for immediate child spans and guard style values.
Merge nested span styles only for immediate child spans and guard style values.
<span> elements.style attributes.This change fixes a bug that could cause exponential work when parsing deeply
nested <span> elements - in extreme cases that could make the tab unresponsive
or crash the renderer. It is a bugfix / performance improvement with no public API
changes.
Tiptap will now correctly insert a React MarkViews' content into the correct element within MarkViewContent component
MarkViewContent componentAdd appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index is
appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.appendTo support to FloatingMenu and pass it through in React/Vue 2/Vue 3 for both BubbleMenu and FloatingMenu to allow fixing clipping/z-index issues.8fa5955: Add updateBubbleMenuPosition command to update position of bubble menu. This command lets developers programmatically update the position of
updateBubbleMenuPosition command to update position of bubble menu. This command lets developers programmatically update the position of the bubble menu in response to certain events (for example, when the bubble menu is resized).getReferencedVirtualElement option to the drag handle extension to customize the position of the drag handle.findElementNextToCoords returning incorrect nodes when the position is at a node boundary. The function now correctly identifies leaf nodes (like images, horizontal rules) by checking $pos.nodeAfter before falling back to the parent node lookup.968016f: Added support for the undoable option in InputRules (matching ProseMirror’s implementation).
968016f: Added support for the undoable option in InputRules (matching ProseMirror’s implementation).
false, the change will not be tracked as undoable.true for backward compatibility.This brings Tiptap’s InputRules behavior in line with ProseMirror and gives developers finer control over undo functionality.
0226d42: Fix an issue where injected CSS was not mounted correctly when the editor instance was mounted. The fix ensures CSS injected by the editor is
map(...).flat() with flatMap for simpler, more efficient array flatteninginsertContentAt command where extra content would get deleted when the selection was at the beginning of the document and a node was insertedmap(...).flat() with flatMap for simpler, more efficient array flatteningmap(...).flat() with flatMap for simpler, more efficient array flatteningf472c5b: Use a named import for Suggestion from @tiptap/suggestion to avoid bundler ESM/CJS interop
wrapping (__toESM) that caused Jest/CJS consumers to receive a module object instead of the
callable plugin factory.
This is a non-breaking internal fix. It keeps runtime module shape stable for CommonJS (Jest) and prevents the TypeError thrown when the extension attempted to call a non-function.
map(...).flat() with flatMap for simpler, more efficient array flattening00cf1d7: Fix bug in insertContentAt command where extra content would get deleted when the selection was at the beginning of the document and a node w
insertContentAt command where extra content would get deleted when the selection was at the beginning of the document and a node was inserted1ea8906: When the editor view is created, it now will also include nodeViews and markViews properties instead of setting them afterward. This avoids s
nodeViews and markViews properties instead of setting them afterward. This avoids serialization of the editor state to HTML which will be replaced by node views anyway.915ed65: Add custom positioning support to the BubbleMenu.
This change adds an opt-in API that allows consumers to fully control how the BubbleMenu is positioned. Instead of relying solely on the internal placement logic, you can now provide a function (for example getPosition) that receives the relevant context (editor instance and menu DOM element) and returns the desired coordinates or positioning style.
915ed65: Add custom positioning support to the BubbleMenu.
This change adds an opt-in API that allows consumers to fully control how the BubbleMenu is positioned. Instead of relying solely on the internal placement logic, you can now provide a function (for example getPosition) that receives the relevant context (editor instance and menu DOM element) and returns the desired coordinates or positioning style.
915ed65: Add custom positioning support to the BubbleMenu.
This change adds an opt-in API that allows consumers to fully control how the BubbleMenu is positioned. Instead of relying solely on the internal placement logic, you can now provide a function (for example getPosition) that receives the relevant context (editor instance and menu DOM element) and returns the desired coordinates or positioning style.
915ed65: Add custom positioning support to the BubbleMenu.
This change adds an opt-in API that allows consumers to fully control how the BubbleMenu is positioned. Instead of relying solely on the internal placement logic, you can now provide a function (for example getPosition) that receives the relevant context (editor instance and menu DOM element) and returns the desired coordinates or positioning style.
24445c4: Listen to a custom scroll target when positioning the BubbleMenu and ensure the scroll listener is cleaned up on destroy.
24445c4: Listen to a custom scroll target when positioning the BubbleMenu and ensure the scroll listener is cleaned up on destroy.
The BubbleMenu now accepts an optional scrollTarget option which will be
used instead of window when listening for scroll events that affect the
menu positioning. The plugin also removes the scroll listener during
cleanup.
No user-facing API changes other than the new optional scrollTarget setting.
46fa8b8: Prefer the raw inline style attribute when parsing color and background-color so the original format (hex, rgba/hsla, etc.) is preserved inst
46fa8b8: Prefer the raw inline style attribute when parsing color and
background-color so the original format (hex, rgba/hsla, etc.) is
preserved instead of falling back to the computed element.style.*
value (which often resolves to rgb(...)).
This fixes mismatches where consumers (for example, demo toolbars and color pickers) expected the original hex values when initializing the editor from HTML.
color and background-color parsers now look for a style
attribute first and extract the declared value. If no raw style is
present, they still fall back to element.style.color /
element.style.backgroundColor.MIGRATION NOTES
rgb(...)
strings, you may see different string values (for example #958DF1
instead of rgb(149, 141, 241)) when HTML contained hex values.tinycolor2) before
comparing or use the editor APIs in a way that doesn't depend on the
exact string representation.59fb86f: Previously, clientRect was only obtained through decorationNode. If decorationNode could not be obtained, clientRect was set to null, which caused the suggestion not to render in some IME scenarios (notably Chinese IME).
This change adds a fallback method to compute clientRect from the editor's cursor position when decorationNode is not available. It generates a DOMRect based on the cursor coordinates so the suggestion can render even when the decoration node is missing.
ad51daa: Add mount and unmount events to the Editor instance for tracking mounts and unmounts
mount and unmount events to the Editor instance for tracking mounts and unmounts895c73f: Fix can().toggleMark() returning incorrect result when cursor is inside nodes that disallow marks
Fixed an issue where can().toggleMark('bold') incorrectly returned true when the cursor was positioned inside a code block (with no selection), even though marks are not allowed in code blocks. The method now correctly returns false in this scenario by checking if the parent node allows the mark type when the selection is a cursor.
DropcursorOptions.color types to use types defined in prosemirror-dropcursor11c8085: Added indentation support for code blocks via Tab. Is deactivated by default.
New Extension Options:
enableTabIndentation: boolean - controls if tab completion should be enabledtabSize: number - controls how many spaces are inserted for a tab11c8085: Added indentation support for code blocks via Tab. Is deactivated by default.
New Extension Options:
enableTabIndentation: boolean - controls if tab completion should be enabledtabSize: number - controls how many spaces are inserted for a tab3733bb9: Allow consumers to handle the Escape key via render().onKeyDown before the suggestion plugin auto-exits.
Previously the suggestion plugin intercepted Escape internally and immediately called onExit, preventing render().onKeyDown from receiving the event and stopping propagation. Now render().onKeyDown is invoked first for Escape; if it returns true the plugin assumes the consumer handled the event (so they can call event.preventDefault() / event.stopPropagation() and optionally call exitSuggestion(view) themselves). If it returns false (or is absent), the plugin will continue to call onExit and close the suggestion as before.
This change enables scenarios where the editor is inside a modal/drawer and the consumer needs to prevent the outer UI from reacting to Escape while still controlling the suggestion's lifecycle.
90cbed5: Remove the global document mousedown handler that closed suggestion popups when clicking outside.
Previously the suggestion plugin listened for document mousedown events and closed suggestion UIs when the user clicked outside the editor or suggestion portal. That behavior has been removed to avoid framework-specific coupling (for example reliance on .react-renderer) and related compatibility issues.
Now suggestions are closed via other signals:
exitSuggestion(view)9e02c12: Prevent incorrect insertion of code marks when a space immediately follows backticks.
@tiptap/extension-undo-redo instead of @tiptap/extension-history.8eff69a: Improve drag handle node lookup by scanning element bounding rects inside the editor instead of performing per-pixel elementsFromPoint loops, and throttle mouse handling to a single update per animation frame to reduce CPU usage and improve stability.
This should make drag handle positioning and node detection significantly faster and more robust.
03bf0ea: Preserve prefixes when replacing emoji shortcodes to avoid unintended conversions.
Previously, shortcodes such as :x: could be converted into emoji nodes even when part of a larger string (e.g., in URLs or other text). The paste handler now preserves prefixes, which helps prevent unwanted conversions in such cases, but does not specifically target URLs.
5423726: Make input rules and paste rules respect extension priority by registering them per-extension instead of aggregating them into a single globa
5423726: Make input rules and paste rules respect extension priority by registering
them per-extension instead of aggregating them into a single global plugin.
Previously all addInputRules() and addPasteRules() were gathered into one
global plugin which ran before the other plugins. That caused conflicts where
some extensions (for example mention/suggestion with #) could not preempt the
built-in heading input rule.
priority mechanism.priority can now take
precedence over lower priority extensions' input/paste rules.# mention vs. heading shortcut), but be aware of the change.addProseMirrorPlugins() on
the extension and place it where you want it to run.priority value so the extension sits earlier or
later in the ordering.If you have any questions or see regressions after upgrading, please open an issue with a small repro and we'll help triage.
5423726: Fix paste rule handling for node views and defensively guard empty ranges.
This patch ensures paste rules can correctly inspect node content when
node-specific size metadata (nodeSize) is present, falling back to
node.content.size when needed. It also skips empty or invalid node ranges
before calling textBetween, preventing runtime errors originating from
internal Fragment/Node traversals (for example: "Cannot read properties of
undefined (reading 'nodeSize')").
5423726: Change the generateID option to accept a context object: { node, pos }.
This lets ID generators access both the ProseMirror node and its pos within the document when creating IDs, enabling logic that depends on node content, type, or position.
The change is backwards-compatible: existing generateID functions that ignore the new context will continue to work. Example usage:
editor.use(UniqueID, {
generateID: ({ node, pos }) => `${node.type.name}-${pos}-${uuidv4()}`,
})
5423726: Ensure ReactRenderer.destroy() removes the renderer DOM element when present.
ReactRenderer's .element to the DOM (for example many demos append it to document.body), previously calling destroy() removed the portal renderer but left the DOM node in place which could lead to accumulating .react-renderer elements.destroy() now also removes the element from its parent node if present, preventing leaked DOM nodes / React roots.5423726: Add a safe API to exit suggestions and remove decorations.
{ exit: true } will now reliably deactivate the suggestion plugin and remove inline decorations.exitSuggestion(view, pluginKey?) helper to programmatically close suggestions safely.1cab7ff: Change the generateID option to accept a context object: { node, pos }.
1cab7ff: Change the generateID option to accept a context object: { node, pos }.
This lets ID generators access both the ProseMirror node and its pos within the document when creating IDs, enabling logic that depends on node content, type, or position.
6a2873f: Ensure drag previews for node views work correctly in Safari by attaching an offscreen clone of the node to the DOM while calling setDragImag
setDragImage, and by preserving the original element's pixel
width/height so the preview matches the original. This prevents
Safari from immediately cancelling the drag when a detached element is
used as the drag image.Nothing published for this version
978c548: Expose onDragStart and onDragEnd callbacks to improve custom drag behavior. This allows better UI control compared to relying on editor.view.
onDragStart and onDragEnd callbacks to improve custom drag behavior. This allows better UI control compared to relying on editor.view.dragging, especially when using absolute-positioned drag handles.onDragStart and onDragEnd callbacks to improve custom drag behavior. This allows better UI control compared to relying on editor.view.dragging, especially when using absolute-positioned drag handles.renderToMarkdown function.072b110: Fixed the Vue 3 Drag Handle so it only appears when the user starts interacting with the text editor.
990084c: Bump linkifyjs version to latest to address the recently discovered prototype pollution vulnerability
6b42853: Fix: Fix a problem with the inline option and virtual elements missing getClientRects
2e71d05: Fix: broken types for function chaining when calling extend
f8a4e3e: Refactor: Make shouldShow optional on bubbleMenu and floatingMenu options
7ed03fa: Fix: Add correct overload for extension extend types
75cabde: Fix: Avoid the JSX Runtime to globally overwrite React's Element types when / @jsxImportSource @tiptap/core */ is not used
/** @jsxImportSource @tiptap/core */ is not used601b1f6: Fix: Correctly pass through the bubble menu floating options
Nothing published for this version
This is a breaking change and requires a manual migration.
This is the stable release for 3.0.0. Since we accidentially released our 3.0.0 last year and had to deprecate it, we're moving forward with 3.0.1 as our initial release for this major cycle.
Since our auto-generated changelog was to big for Github to handle we have to write this manually. Yikes!
number | undefined to reflect runtime reality.editor.unmount() — New lifecycle method to detach the editor without destroying it (great for preserving state).canInsertNode utility — Check programmatically if a node is allowed at a certain position.FloatingMenu, BubbleMenu, Mention, Suggestion, etc.).
tippyOptions has been removed and replaced with a new options prop.@floating-ui/dom@^1.6.0 as a peer dependency.immediatelyRender is missing in SSR mode — Helps catch SSR issues early.ref behavior — Improves compatibility with upcoming React features.flushSync — Ensures updates between React and ProseMirror stay in sync.ref props and event listeners.MarkViewContent via as prop.NodeView and MarkView.updateAttributes now supported).FloatingMenu, BubbleMenu, Mention, Suggestion, etc.).
tippyOptions has been removed and replaced with a new options prop.@floating-ui/dom@^1.6.0 as a peer dependency.updateAttributes in MarkView components — Enables live updates to mark attributes.onShow, onUpdate, onHide, and onDestroy props in menu components.ref and event options in menus.FloatingMenu, BubbleMenu, Mention, Suggestion, etc.).
tippyOptions has been removed and replaced with a new options prop.@floating-ui/dom@^1.6.0 as a peer dependency.VueNodeViewRenderer now returns null for contentDOM if the node is not a leaf and no NodeViewContent is rendered — Prevents unintended content projection issues.ref and event options in menus.onShow, onUpdate, onHide, and onDestroy props in menu components.Added the new @tiptap/extensions meta package — This package bundles multiple commonly used utility extensions into a single entry point:
CharacterCountDropCursorGapCursorUndoRedoPlaceholderTrailingNodeFocusSelectionYou can now import them like this:
import { Placeholder, UndoRedo, Focus } from '@tiptap/extensions'
Migration examples:
- import Placeholder from '@tiptap/extension-placeholder'
+ import { Placeholder } from '@tiptap/extensions'
- import History from '@tiptap/extension-history'
+ import { UndoRedo } from '@tiptap/extensions'
This change simplifies extension management and encourages lighter bundle sizes by centralizing core utility extensions in one place.
Removed selection decorations during drag mode — Prevents visual artifacts when dragging content.
Since listing all changes here manually would be again to big for Github's editor we would like you to take a look into the package's CHANGELOG.md where you can find ALL changes made on each version including all pre-releases prior to the official stable release.
Also take a look at our upgrade guide where you can find out what changed on all meta packages, how to upgrade to V3, etc.
We'll continue working on this release, quickly hotfix the bugs encountered by the community and make 3.0.0 even better. We'll also look into new features like Markdown Support, Migrations and the Decoration API for our upcoming minor releases.
4.0.0 will not be far away - if we do breaking changes in the following weeks you'll see it in the coming weeks/months.
Feel free to contribute to Tiptap in form of reporting issues, answering questions, helping with the CI, with tests or taking on Issues on your own. We're super happy for every contribution you make 💕.
Nothing published for this version
@tiptap/extensions@3.0.0-next.8
Full Changelog: https://github.com/ueberdosis/tiptap/compare/v3.0.0-next.7...v3.0.0-next.8
upgrade prosemirror-tables to 1.6.3 by @bdbch in https://github.com/ueberdosis/tiptap/pull/6073
Full Changelog: https://github.com/ueberdosis/tiptap/compare/v3.0.0-next.6...v3.0.0-next.7
extension-history extension as a fallback extension to the new @tiptap/extensions package where the old history extension is now exported from as UndoRedo to clarify what kind of history this extension is implementing.@tiptap/extension-collaboration-cursor to @tiptap/extension-collaboration-caret to clarify what kind of cursor this extension is implementing.unmount 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 the destroy method, which will unmount, emit the destroy event, and remove all event listeners.Modify the TextAlign extension documentation so that the default value of the defaultAlignment option matches the code by @arnaugomez in https://githu
Full Changelog: https://github.com/ueberdosis/tiptap/compare/v3.0.0-next.5...v3.0.0-next.6
Merge develop by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5873
rewriteUnknownContent utility for cleaning JSON by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5915@tiptap/static-renderer to enable static rendering of content by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5528zeed-dom to happy-dom-without-node by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5984@tiptap/extension-utils -> @tiptap/extensions by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/6003validate options in node and mark attribute definitions. by @bobthecow in https://github.com/ueberdosis/tiptap/pull/5991@tiptap/jsx for more convenient rendering of Tiptap content by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5558OnDelete which can detect node deletions by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/6022@tiptap/extensions by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/6056extension-list package which packages all the list packages into a single package by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/6048@tiptap/extensions by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/6059Full Changelog: https://github.com/ueberdosis/tiptap/compare/@tiptap/core@3.0.0-next.3...v3.0.0-next.5
Nothing published for this version
Nothing published for this version
Nothing published for this version
build: use tsup for compilation by @nperez0111 in https://github.com/ueberdosis/tiptap/pull/5455
Full Changelog: https://github.com/ueberdosis/tiptap/compare/@tiptap/vue-3@3.0.0-next.0...v3.0.0-next.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →