Releases: ueberdosis/tiptap
v3.7.0
Releases
v3.7.0
@tiptap/core
Minor Changes
-
All commands and their corresponding TypeScript types are now exported from
@tiptap/coreso 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:
- Previously some command option types were only available as internal types or scattered across files, which made it awkward for downstream users to import and reuse them.
import { commands } from '@tiptap/core'
Notes:
- This is a non-breaking, additive change. It improves ergonomics for TypeScript consumers.
- If you rely on previously private/internal types, prefer the exported types from
@tiptap/coregoing forward.
-
Add comprehensive bidirectional markdown support to Tiptap through a new
@tiptap/markdownpackage 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
MarkdownExtension: Main extension that adds Markdown support to your editorMarkdownManager: Core engine for parsing and serializing Markdown- Parse Markdown strings to Tiptap JSON:
editor.markdown.parse(markdown) - Serialize Tiptap JSON to Markdown:
editor.markdown.serialize(json) - Access to underlying marked.js instance:
editor.markdown.instance
- Parse Markdown strings to Tiptap JSON:
Editor Methods
editor.getMarkdown(): Serialize current editor content to Markdown stringeditor.markdown: Access to MarkdownManager instance for advanced operations
Editor Options:
contentType: Control the type of content that is inserted into the editor. Can bejson,htmlormarkdown- defaults tojsonand 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
contentTypeoption: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 position
For more, check the documentation.
Patch Changes
- The extension manager now provides a new property
baseExtensionsthat contains an unflattened array of extensions
@tiptap/markdown
Minor Changes
-
Add comprehensive bidirectional markdown support to Tiptap through a new
@tiptap/markdownpackage 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
MarkdownExtension: Main extension that adds Markdown support to your editorMarkdownManager: Core engine for parsing and serializing Markdown- Parse Markdown strings to Tiptap JSON:
editor.markdown.parse(markdown) - Serialize Tiptap JSON to Markdown:
editor.markdown.serialize(json) - Access to underlying marked.js instance:
editor.markdown.instance
- Parse Markdown strings to Tiptap JSON:
Editor Methods
editor.getMarkdown(): Serialize current editor content to Markdown stringeditor.markdown: Access to MarkdownManager instance for advanced operations
Editor Options:
contentType: Control the type of content that is inserted into the editor. Can bejson,htmlormarkdown- defaults tojsonand 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
contentTypeoption: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 position
For more, check the documentation.
@tiptap/extension-link
Patch Changes
- Paste Handlers and onPaste plugin now respect shouldAutoLink/validate options
@tiptap/extensions
Patch Changes
-
Make the
TrailingNodeextension'snodeoption optional and derive the
default node type from the editor schema when available.Previously the extension used a hard-coded
'paragraph'default and the
nodeoption was required in the TypeScript definitions. This change:- makes
nodeoptional in the options type, - prefers the editor schema's top node default type when resolving the
trailing node, and - falls back to the configured option or
'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. - makes
v3.6.7
Releases
v3.6.7
@tiptap/html
Patch Changes
-
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:
- happy-dom released a security fix for CVE-2025-61927; updating prevents the vulnerability being pulled into consumers that depend on @tiptap/html.
v3.6.6
Releases
v3.6.6
@tiptap/extension-floating-menu
Patch Changes
- Fixed a problem where the position of a menu is not updated on creation when shouldShow is true
@tiptap/extension-bubble-menu
Patch Changes
- Fixed a problem where the position of a menu is not updated on creation when shouldShow is true
@tiptap/vue-3
Patch Changes
- Fixed a bug that caused conditionally rendered bubble menus not to be attached to the DOM correctly
v3.6.5
Releases
v3.6.5
@tiptap/extension-horizontal-rule
Patch Changes
- Added nextNodeType option to horizontal-rule extension, allowing users to specify which node type should be inserted after a horizontal rule
@tiptap/core
Patch Changes
- Editors can now emit
transactionandupdateevents before being mounted.
This means smoother state handling and instant feedback from editors, even when they're not in the DOM.
v3.6.4
v3.6.3
Releases
v3.6.3
@tiptap/react
Patch Changes
- Updated the React
FloatingMenuplugin hook dependencies to match theBubbleMenubehavior.
The FloatingMenu will now respond to changes inappendTo,pluginKey,shouldShow, andoptions. - Resolved an issue where the React BubbleMenu did not update when FloatingUI option props changed after initial mount. The BubbleMenu now correctly responds to updated option props.
- Improved the BubbleMenu's usability by ensuring the
appendToprop 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.
@tiptap/extensions
Patch Changes
- The Selection extension now uses the correct SelectionOptions type, providing accurate typings for its options.
@tiptap/extension-code-block
Patch Changes
- Configuration options for the CodeBlock extension now support
nullandundefinedvalues.
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.
@tiptap/core
Patch Changes
- Refined the
JSONContent.attrsdefinition to exactly mirror the structure returned byeditor.getJSON(). This ensures strict type safety and consistency between the editor output and the expected type, eliminating errors caused by mismatched attribute signatures.
@tiptap/extension-table-of-contents
Patch Changes
- Improve typings by inferring the storage type for the Table of Contents extension
@tiptap/extension-floating-menu
Patch Changes
- You can now pass a callback to the
appendTooption 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.
@tiptap/extension-bubble-menu
Patch Changes
- You can now pass a callback to the
appendTooption 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.
v3.6.2
v3.6.1
v3.6.0
Releases
v3.6.0
@tiptap/core
Patch Changes
-
Improve typing and docs for
EditorOptions.elementto reflect all supported mounting modes and align behavior across adapters.elementnow accepts:Element: the editor is appended inside the given element.{ mount: HTMLElement }: the editor is mounted directly tomount(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.
@tiptap/extension-table
Patch Changes
-
Parse cell
colwidthfrom nearest<colgroup>when missing on the cellWhen importing HTML, table column widths are often declared on a surrounding
<colgroup>rather than on each<td>. Previously,tableCellonly read thecolwidthattribute from the cell itself and would lose width information in that case. The implementation now falls back to reading the corresponding<col>'swidthfrom 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.
@tiptap/extension-bubble-menu
Patch Changes
-
Remove recently added
updateBubbleMenuPositionmethod 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
transactionHandlermethod as an arrow function because arrow functions have nothis, so thethisremains the instance of theBubbleMenuViewclass.
@tiptap/extension-unique-id
Minor Changes
-
Create a utility to add unique IDs to a document in the server
The utility is called
generateUniqueIdsand is exported from the@tiptap/extension-unique-idpackage.It has the same functionality as the
UniqueIDextension, but without the need to create anEditorinstance. 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 theUniqueIDextension.
It returns the updated Tiptap JSON document, with the unique IDs added to the nodes.
@tiptap/vue-3
Minor Changes
- Pass
attrsthrough Vue 3 menus
v3.5.3
Releases
v3.5.3
@tiptap/extension-text-style
Patch Changes
-
Merge nested span styles only for immediate child spans and guard style values.
- Replace non-standard/fragile selector approach and avoid re-processing nested
<span>elements. - Read parent style once, merge with child style only when present, and remove empty
styleattributes. - Improves parsing performance and robustness in browsers, Node/JSDOM and tests.
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. - Replace non-standard/fragile selector approach and avoid re-processing nested