v3.30.0
-
ceb0dac: New Decorations API
Finally the decorations API is here! Even though Decorations itself are nothing new in ProseMirror, the new API makes it much easier to use them in Tiptap without leaving your extensions.
Decorations change how the document looks without changing the document itself. Highlighting search results, marking spelling mistakes, showing collaborator cursors, putting a drag handle next to every block.
Until now you had to write a ProseMirror plugin by hand for this, keep the decoration set in plugin state, and map it forward on every transaction. Extensions can now declare decorations directly with a new
addDecorations()hook.addDecorations() { return { create: ({ state }) => // findMatches can be any function that returns an array of { from, to } ranges findMatches(state.doc).map(match => Decoration.Inline(match.from, match.to, { class: 'highlight' }), ), } }
There are three kinds.
Decoration.Inline()styles a range of text.Decoration.Node()puts attributes on a block's DOM element.Decoration.Widget()renders your own element at a single position.Every extension that declares decorations is collected into one plugin, so several extensions can decorate the same document without fighting over it.
Doing less work on every keystroke
By default decorations are rebuilt whenever the document changes. That is fine for small documents and wasteful for large ones, so there are two ways to narrow it down.
shouldUpdate()skips transactions you do not care about. If your decorations only depend on headings, ignore everything else.update: 'changedRanges'together withcreateInRange()only rescans the blocks that actually changed. On a long document this is the difference between scanning the whole thing on every keystroke and scanning one paragraph.For decorations driven by data outside the editor, like comments loaded from a server, use
update: 'manual'and refresh them yourself witheditor.commands.updateDecorations().React and Vue components as widgets
ReactWidgetRendererandVueWidgetRendererrender a real component into a widget decoration, inside your existing app context. Providers, context and stores work as usual.Widgets take a
key. Reuse the same key and the component instance stays mounted while the document changes around it, so local state such as an open menu, a counter or a half-typed input survives editing. Use a stable id from your own data, not a position or a list index, otherwise the component remounts and loses that state.Widgets also accept the ProseMirror options
side,relaxedSide,stopEventandignoreSelection.Documentation
- ceb0dac: Fix FloatingMenu not registering when the editor prop is provided synchronously, which prevented the menu from appearing
-
ceb0dac:
ListKeymapnow registers aTabshortcut that sinks a top-level textblock into the previous list's last item. Pressing Tab at the start of a paragraph right after a bullet/ordered/task list moves the paragraph inside the last list item. The handler does nothing when the cursor is already inside a list item (sinkListItemkeeps working), when there is no list before the paragraph, when the caret is mid-textblock, or when the selection is not a text selection (for example a gap cursor).@tiptap/corealso exposes a newgetPreviousBlockSibling($pos)helper that returns the block-level sibling before the cursor's textblock, or null at the first child of the block parent.
- ceb0dac: Parse block math that follows an ordered list item without a blank line, both after the list and indented inside the item, instead of pulling it into the item's text.
- ceb0dac: TaskItem: the checkbox label now also fills the wrapping label element, so accessibility audits no longer flag it as empty.
-
ceb0dac:
ListKeymapnow registers aTabshortcut that sinks a top-level textblock into the previous list's last item. Pressing Tab at the start of a paragraph right after a bullet/ordered/task list moves the paragraph inside the last list item. The handler does nothing when the cursor is already inside a list item (sinkListItemkeeps working), when there is no list before the paragraph, when the caret is mid-textblock, or when the selection is not a text selection (for example a gap cursor).@tiptap/corealso exposes a newgetPreviousBlockSibling($pos)helper that returns the block-level sibling before the cursor's textblock, or null at the first child of the block parent. -
ceb0dac: New Decorations API
Finally the decorations API is here! Even though Decorations itself are nothing new in ProseMirror, the new API makes it much easier to use them in Tiptap without leaving your extensions.
Decorations change how the document looks without changing the document itself. Highlighting search results, marking spelling mistakes, showing collaborator cursors, putting a drag handle next to every block.
Until now you had to write a ProseMirror plugin by hand for this, keep the decoration set in plugin state, and map it forward on every transaction. Extensions can now declare decorations directly with a new
addDecorations()hook.addDecorations() { return { create: ({ state }) => // findMatches can be any function that returns an array of { from, to } ranges findMatches(state.doc).map(match => Decoration.Inline(match.from, match.to, { class: 'highlight' }), ), } }
There are three kinds.
Decoration.Inline()styles a range of text.Decoration.Node()puts attributes on a block's DOM element.Decoration.Widget()renders your own element at a single position.Every extension that declares decorations is collected into one plugin, so several extensions can decorate the same document without fighting over it.
Doing less work on every keystroke
By default decorations are rebuilt whenever the document changes. That is fine for small documents and wasteful for large ones, so there are two ways to narrow it down.
shouldUpdate()skips transactions you do not care about. If your decorations only depend on headings, ignore everything else.update: 'changedRanges'together withcreateInRange()only rescans the blocks that actually changed. On a long document this is the difference between scanning the whole thing on every keystroke and scanning one paragraph.For decorations driven by data outside the editor, like comments loaded from a server, use
update: 'manual'and refresh them yourself witheditor.commands.updateDecorations().React and Vue components as widgets
ReactWidgetRendererandVueWidgetRendererrender a real component into a widget decoration, inside your existing app context. Providers, context and stores work as usual.Widgets take a
key. Reuse the same key and the component instance stays mounted while the document changes around it, so local state such as an open menu, a counter or a half-typed input survives editing. Use a stable id from your own data, not a position or a list index, otherwise the component remounts and loses that state.Widgets also accept the ProseMirror options
side,relaxedSide,stopEventandignoreSelection.Documentation
- ceb0dac: Fixed
insertContent,insertContentAtandsetContentfailing when prosemirror-model is loaded more than once.
- ceb0dac: StarterKit now pins its bundled
@tiptap/*dependencies to the exact version it was released with, so installing a specific StarterKit version gives you that version's extension set instead of the newest one.
-
ceb0dac: New Decorations API
Finally the decorations API is here! Even though Decorations itself are nothing new in ProseMirror, the new API makes it much easier to use them in Tiptap without leaving your extensions.
Decorations change how the document looks without changing the document itself. Highlighting search results, marking spelling mistakes, showing collaborator cursors, putting a drag handle next to every block.
Until now you had to write a ProseMirror plugin by hand for this, keep the decoration set in plugin state, and map it forward on every transaction. Extensions can now declare decorations directly with a new
addDecorations()hook.addDecorations() { return { create: ({ state }) => // findMatches can be any function that returns an array of { from, to } ranges findMatches(state.doc).map(match => Decoration.Inline(match.from, match.to, { class: 'highlight' }), ), } }
There are three kinds.
Decoration.Inline()styles a range of text.Decoration.Node()puts attributes on a block's DOM element.Decoration.Widget()renders your own element at a single position.Every extension that declares decorations is collected into one plugin, so several extensions can decorate the same document without fighting over it.
Doing less work on every keystroke
By default decorations are rebuilt whenever the document changes. That is fine for small documents and wasteful for large ones, so there are two ways to narrow it down.
shouldUpdate()skips transactions you do not care about. If your decorations only depend on headings, ignore everything else.update: 'changedRanges'together withcreateInRange()only rescans the blocks that actually changed. On a long document this is the difference between scanning the whole thing on every keystroke and scanning one paragraph.For decorations driven by data outside the editor, like comments loaded from a server, use
update: 'manual'and refresh them yourself witheditor.commands.updateDecorations().React and Vue components as widgets
ReactWidgetRendererandVueWidgetRendererrender a real component into a widget decoration, inside your existing app context. Providers, context and stores work as usual.Widgets take a
key. Reuse the same key and the component instance stays mounted while the document changes around it, so local state such as an open menu, a counter or a half-typed input survives editing. Use a stable id from your own data, not a position or a list index, otherwise the component remounts and loses that state.Widgets also accept the ProseMirror options
side,relaxedSide,stopEventandignoreSelection.Documentation
- ceb0dac: React node views no longer show the selected state when the selection covers a position the node view has moved away from.
- ceb0dac: Markdown with inline HTML such as an unclosed
<b>tag no longer parses into an invalid document. The tag is dropped and its text is kept.
- ceb0dac: Fixed table cell and header spans in the React static renderer.
- ceb0dac: Fix the
./schema-listexport map pointingtypesatdist/schema/, which is not emitted. Tools that read thetypescondition directly could not resolve@tiptap/pm/schema-list.
- ceb0dac: Deleting the last row or column of a table no longer moves the cursor outside the table when there is content below it.
- ceb0dac: Fixed the React
DragHandlebreaking drag-and-drop whenonNodeChangeis an inline callback, by no longer re-registering its plugin when a callback's identity changes.
- ceb0dac: Allow KaTeX 0.18 to be installed with the math extension
- ceb0dac: Fixed Backspace freezing after merging a paragraph into a blockquote.
-
ceb0dac: New Decorations API
Finally the decorations API is here! Even though Decorations itself are nothing new in ProseMirror, the new API makes it much easier to use them in Tiptap without leaving your extensions.
Decorations change how the document looks without changing the document itself. Highlighting search results, marking spelling mistakes, showing collaborator cursors, putting a drag handle next to every block.
Until now you had to write a ProseMirror plugin by hand for this, keep the decoration set in plugin state, and map it forward on every transaction. Extensions can now declare decorations directly with a new
addDecorations()hook.addDecorations() { return { create: ({ state }) => // findMatches can be any function that returns an array of { from, to } ranges findMatches(state.doc).map(match => Decoration.Inline(match.from, match.to, { class: 'highlight' }), ), } }
There are three kinds.
Decoration.Inline()styles a range of text.Decoration.Node()puts attributes on a block's DOM element.Decoration.Widget()renders your own element at a single position.Every extension that declares decorations is collected into one plugin, so several extensions can decorate the same document without fighting over it.
Doing less work on every keystroke
By default decorations are rebuilt whenever the document changes. That is fine for small documents and wasteful for large ones, so there are two ways to narrow it down.
shouldUpdate()skips transactions you do not care about. If your decorations only depend on headings, ignore everything else.update: 'changedRanges'together withcreateInRange()only rescans the blocks that actually changed. On a long document this is the difference between scanning the whole thing on every keystroke and scanning one paragraph.For decorations driven by data outside the editor, like comments loaded from a server, use
update: 'manual'and refresh them yourself witheditor.commands.updateDecorations().React and Vue components as widgets
ReactWidgetRendererandVueWidgetRendererrender a real component into a widget decoration, inside your existing app context. Providers, context and stores work as usual.Widgets take a
key. Reuse the same key and the component instance stays mounted while the document changes around it, so local state such as an open menu, a counter or a half-typed input survives editing. Use a stable id from your own data, not a position or a list index, otherwise the component remounts and loses that state.Widgets also accept the ProseMirror options
side,relaxedSide,stopEventandignoreSelection.Documentation
v3.11.3
- 改进 IR 模式下加粗和斜体的连续切换
改进功能 - 改进繁体中文用语
改进功能 - 列表内引用回车会创建新列表项
改进功能 - 修正日语表格行列标签
改进功能 - IR 模式复制需要带 mark
改进功能 - 显示图片的标题
引入特性 - 支持在自定义渲染器中获取标题的原始 ID
改进功能 - 列表第一次回车需和同级块对齐
改进功能 - 支持引述块
引入特性 - 支持 WaveDrom 数字波形图渲染
引入特性 - 升级 Mermaid 至 11.16.1
改进功能 - 输入内容与渲染内容不一致
修复缺陷 - Markdown 行内加粗语法混合 html 标签内容渲染出现问题
修复缺陷 - 文档 标题内容带有下划线()时,在preview模式下,生成目录时把标题内容中的下划线()删除了
修复缺陷 - linkBase 在切换编辑器时会丢失
修复缺陷 - 列表项中增加表格时,无法正常显示
修复缺陷 - 用尖括号输入链接时出现异常
修复缺陷 - 输入内容与渲染内容不一致
修复缺陷 - 设置 preview 的 linkbase 时,base64 的图片不能渲染
修复缺陷 - 对“有序列表”元素调用h1-h6标题,重复的设置与取消,会有大量空行
修复缺陷 - getHTML() 和 html2md 公式互转有损失
修复缺陷 - IR 模式表格内出现异常的 br 标签
修复缺陷 - 表格单元格内文本换行显示异常
修复缺陷 - 在即时渲染模式粘贴带引用式链接的文本,会在每个链接后添加 URL
修复缺陷 - 添加
options.preview.markdown.sup/sub对上下标的配置引入特性 - 升级 mermaid.js 11.6.0 至 11.11.0
改进功能
v3.6.0-rc.3
For stable releases, please refer to CHANGELOG.md for details. For pre-releases, please refer to CHANGELOG.md of the minor branch.
v3.6.0-rc.3
For stable releases, please refer to CHANGELOG.md for details. For pre-releases, please refer to CHANGELOG.md of the minor branch.
v16.3.1-canary.11
- fix(scripts): correct typo in rm.mjs error message: #87015
- docs: improve clarity and punctuation in README: #86096
- Encode the cache item name built by
unstable_cache: #96937 - [refactor] Rename
encodeCacheTagtoencodeHeaderSafe: #96936 - Fix formatting of Google Fonts section in documentation: #88447
- Fixing a bug - typo issue fixed: #97141
- examples: fix Webiny API env variable name: #97134
- docs: fix Link prefetch grammar and Client Components wording: #97132
- Use emitted app entries for post-build processing: #97139
- docs(mdx): fix package name in .md handling section: #97131
- [turbopack] Reduce native React Compiler work: #96820
- Keep the dev validation worker alive across HMR updates: #96988
- docs: rename repo to repository for consistency: #87849
- Fix Nav Inspector request loop on repeat captures: #97050
- Fix typo in Data Access Layer section: #87202
- docs: runtime prefetching -> optimizing prefetching: #96934
- [CC] Track APIs that cause incompatible static/app shells: #97040
- Fix client component loading span timing: #96455
- Trace development route compilation: #96454
- Prefix
'use cache'debug logs with the full directive: #97037 - Revert "[turbopack] Enable CJS tree shaking by default (#96779)": #97018
- Revert "[turbopack] Follow re-exports for side-effect free async modules": #97009
- [fragment-scroll] Rename
ScrollAndMaybeFocusHandlertoScrollHandler: #96828 - Trace development route preparation: #96453
- test: cleanup Turbopack snapshot config: #97013
- Remove unused htmlLimitedBots from renderOpts: #96701
- fix(turbopack): point at the glob that matched a file with no module type: #96561
Huge thanks to @unstubbable, @koenpunt, @marcoshernanz, @gnoff, @mayur9210, @Jashnavi25, @jarrensj, @acdlite, @akselipalmer, @icyJoseph, @lubieowoce, @DavidIlie, @eps1lon, @mischnic, and @sokra for helping!
v2.24.0
- fix: stripe height
df94e3e - feat(plugins): expose capture geometry, exact export options and canvas cropping
7abb29a - fix(styles): reproduce visibility and content-visibility the way browsers do
21251f7 - update
1c8e12f - fix(fonts): emit only the @font-face descriptors the source declared
8d0345a - fix(clone): keep the pre-toDataURL frame for WebGL canvases
1c44d1d - test: pin devicePixelRatio in DPR-dependent tests
fb7311a - fix(clone): clone slotted light DOM only once
f4b1859 - chore: bump version to 2.24.0
4a2ced5
Full Changelog: https://github.com/zumerlab/snapdom/compare/v2.23.2...v2.24.0
Release 2026-08-10 20:32
Release 2026-08-10 20:32
- integrate solid v2 query (#6938) (69da50126a) by @brenelz
- upgrade outer-devtools-core to Solid 2.0 (868d2bfbc3) by @brenelz
- solid-router: make the global loading boundary opt-in and server/client-symmetric (#8027) (41cffa00f3) by @ryansolid
- solid-start: resolve SSR'd lazy() client assets via vite-plugin-solid's manifest (99756c0710) by @brenelz
- solid-router: keep Transitioner hydration ids in sync between server and client (e021c7a352) by @brenelz
- benchmarks: Solid v2 type fixes for new benchmark scenarios (2bb318bdcf) by @brenelz
- benchmarks: adapt new solid benchmarks from main to Solid v2 (26d94d93fc) by @brenelz
- lockfile: restore @rspack/binding@2.0.8 platform binaries (01dbb52d06) by @brenelz
- solid-router: resolve defaultNotFoundComponent at render time to avoid hydration desync (#7734) (f9b0e57ce0) by @brenelz
- update solid ssr benchmark types (3fe770ad17) by @brenelz
- solid-router-v2: use TSR_DEFERRED_PROMISE (#7532) (ff136aaea6) by @birkskyum
- solid-router: prevent HeadContent hydration warnings (#7510) (129d043f2d) by @brenelz
- move HydrationScript to HeadContent (#7296) (67b46d7546) by @birkskyum
- pin solid v2 beta.6 (#7171) (85eb16c6ad) by @birkskyum
- adjust pre-release ranges to use caret (#7130) (72ebb55236) by @birkskyum
- better rollupOptions/rolldownOptions handling (#6990) (56e28e47ce) by @birkskyum
- use solid v2 query pre-release (#6977) (da2b8d9e96) by @birkskyum
- vite 8 compat (dfd64e4a08)
- Upgrade to solid v2 beta.3 (#6943) (c3e19322e3) by @brenelz
- more tweaks (82e6d42fec) by @brenelz
- test (0dc0cd0b9a) by @brenelz
- down to one failure (faa3280b98) by @brenelz
- solid-start basic e2e (187cc84d51) by @brenelz
- e2e tests (d026877263) by @brenelz
- work on solid v2 upgrade (59017534d8) by @brenelz
- build (1021e6c7d8) by @brenelz
- solid-router: proxy-free link props in the spread hot path (#7609) (51b4bd4f37) by @brenelz
- e2e: migrate selective-ssr pending-min route to Solid 2 onSettled (5c400bc32e) by @brenelz
- bump @tanstack/solid-query to 6.0.0-beta.5 (#7702) (e56bb22fc3) by @brenelz
- upgrade solid-js to 2.0.0-beta.15 (#7688) (259efbe530) by @brenelz
- remove unneeded changesets (144ddc748e) by @brenelz
- fix tests (545866dd47) by @brenelz
- sync main (440a0c9270)
- solid router v2 pre main sync (#7517) (0a7e958c80) by @brenelz
- bump to solid v2 beta 10 (#7284) (401272e306) by @brenelz
- solid v2 beta 8 (#7241) (b3fedfcd4e) by @brenelz
- upgrade Solid to v2 beta.7 (#7210) (2332fb26f9) by @brenelz
- sync main to pre-release branch (#7106) (bb6285d888) by @birkskyum
- merge main to solid v2 (#7105) (14d39cea3e) by @birkskyum
- bump solid-query and vite-plugin-solid (#7103) (15652a590d) by @birkskyum
- upgrade solid to 2.0.0-beta.5 (#7102) (bf15f69973) by @brenelz
- bump to solidjs/signals 0.13.8 (#7076) (5cdb8115df) by @brenelz
- bump solid-query to 6.0.0-alpha.2 (#7020) (e9e805b744) by @2wheeh
- bump solid-query to 6.0.0-alpha.1 (#7016) (0fb8dfa67b) by @birkskyum
- sync main branch with store refactor (#7001) (72323492af) by @brenelz
- use solid-query v6.0.0-alpha.0 (#6989) (f5023cac3d) by @birkskyum
- bump solid-refresh, fix deepEqual (#6910) (9ce7f97ef2) by @brenelz
- more fixes (32b9dfb25a) by @brenelz
- bundle packages with rolldown (#6931) (b95b1061d3) by @birkskyum
- @tanstack/solid-router@2.0.0-beta.30
- @tanstack/solid-router-devtools@2.0.0-beta.25
- @tanstack/solid-router-ssr-query@2.0.0-beta.31
- @tanstack/solid-start@2.0.0-beta.31
- @tanstack/solid-start-client@2.0.0-beta.30
- @tanstack/solid-start-server@2.0.0-beta.30