Packages

@tiptap/extension-find-and-replace

3.32.0 · 13 Oct 2026MIT42.8k / weekRepositoryHomepagenpmAtom feed

16 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.

  1. 3.32.0

    13 Oct 2026
    • A literal ! directly before a link is now escaped when serializing to Markdown, so the link is no longer parsed back as an image.

    • Update ProseMirror dependencies to their latest versions.

    • Fix useEditorState overflowing the stack when a selector returns a value with circular references, such as editor.state after one stored mark replaces another.

  2. 3.31.4

    30 Sep 2026
    • The mathematics extension no longer crashes the editor in older WebKit browsers and WKWebView.

    • Fix a TypeError thrown when the source editor is destroyed right after dragging content into another editor.

    • splitBlock no longer throws TransformError: Inserted content deeper than insertion position when the selection spans block boundaries (for example from the start of one paragraph into another block, or across an isolating node). The command now returns false when the split is not possible.

  3. 3.31.3

    4 Sep 2026
    • Fixed a bug which allowed potentially unsafe color values being sent by other clients. Those unsafe colors received from collaboration users are now ignored.

    • Fix a TypeScript error (TS2694) in the shipped type declarations when skipLibCheck is turned off.

  4. 3.31.2

    3 Sep 2026
  5. 3.31.1

    3 Sep 2026
    • Fix freezes in framework-based node views on iOS and Android

  6. 3.31.0

    1 Sep 2026
    • e7bf804: Align selected with ProseMirror node selections by default, expose text selections through selectionInside, and keep selectedOnTextSelection compatible.

  7. 3.30.6

    31 Aug 2026
    • Nested lists exported to Markdown now keep their hierarchy when the file is read back by other Markdown tools.

    • Nested lists exported to Markdown now keep their hierarchy when the file is read back by other Markdown tools.

    • Pasting a YouTube iframe without a src attribute no longer crashes the editor. The embed is kept without a source.

  8. 3.30.5

    26 Aug 2026
    • Fix a denial-of-service risk where crafted block or inline Markdown attributes could consume excessive CPU and block the browser or server event loop.

  9. 3.30.4

    26 Aug 2026
    • Prevent untrusted HTML attributes from changing an object's prototype when merged with mergeAttributes.

  10. 3.30.3

    24 Aug 2026
    • Unsetting one text style inside a blockquote no longer removes the other text styles in it.

    • YouTube live URLs (/live/<id>) now embed the video.

    • Fix JSX runtime to properly render nested sibling elements by spreading children arrays into DOMOutputSpec

  11. 3.30.2

    18 Aug 2026
    • Keep mixed JSX children as separate siblings in DOM output.

    • Fixed a bug where editor.chain and editor.can can not be accessed on editor initialization

    • Fix resizable images staying hidden when the image is cached or fails to load.

  12. 3.30.1

    13 Aug 2026
    • Fixed table markdown pipe escaping so the extension loads on older Safari and iOS versions (WebKit before Safari 16.4).

    • Added new ProseMirror helpers that check whether a value is a specific ProseMirror type.

  13. 3.30.0

    11 Aug 2026
    • 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 with createInRange() 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 with editor.commands.updateDecorations().

      React and Vue components as widgets

      ReactWidgetRenderer and VueWidgetRenderer render 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, stopEvent and ignoreSelection.

      Documentation

    • ceb0dac: Fix FloatingMenu not registering when the editor prop is provided synchronously, which prevented the menu from appearing

    • ceb0dac: ListKeymap now registers a Tab shortcut 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 (sinkListItem keeps 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/core also exposes a new getPreviousBlockSibling($pos) helper that returns the block-level sibling before the cursor's textblock, or null at the first child of the block parent.

  14. 3.29.2

    28 Jul 2026
    • Ensure only the active find-and-replace result keeps the current-result highlight while navigating matches.

  15. 3.29.1

    27 Jul 2026
    • 6d901e7: Fix caret placement after splitting a block rendered with a React NodeView.

  16. 3.29.0

    27 Jul 2026
    • Added a new @tiptap/extension-find-and-replace extension. It searches the document for a term, highlights all matches with decorations, and replaces the current or all matches. Supports case-sensitive, whole-word, and RE2-compatible regex search, plus commands to jump between results. Regex search avoids catastrophic backtracking but does not support lookarounds or backreferences.