Per-node Yjs CRDT engine New
The big one. Pass textSync: "crdt" to editor.collab.attach() to activate a per-paragraph Yjs binding with character-level merge resolution. Two users editing the same paragraph at the same time produce non-conflicting Yjs operations — no last-write-wins, no caret jumps under normal load.
- Per-author undo manager: Ctrl-Z undoes only your edits, never your collaborator’s. Standard
Y.UndoManager with trackedOrigins: { LOCAL_ORIGIN }.
- Presence cursors via
Y.RelativePosition: stable identifiers that survive concurrent inserts / deletes, so peer cursors stay in the right place after the surrounding text changes.
- Subtree-aware mutation handling: mid-tree childList changes (lists, tables, mid-paragraph image insert) trigger surgical subtree rebuilds instead of coarse whole-doc resyncs.
- One-shot HTML migration helper:
htmlToYFragment() converts existing HTML into the per-node Y tree for customers upgrading from textSync: true.
Bundle: ships separately as richtexteditor/plugins/crdt-engine.min.js (~88 KB minified) so customers who don’t use collab don’t pay the download cost. Auto-injected by the ASP.NET Core <richtextbox> tag helper. Architecture & integration docs · Live demo
Back-compat: the legacy textSync: true snapshot mode keeps working unchanged. Customers opt into the new path explicitly. Default flips in a future release; legacy mode supported through 2027.
Auto-injected AI Toolkit stylesheet Bug fix
aitoolkit.js now auto-injects a <link rel="stylesheet" href="aitoolkit.css"> if the host page doesn’t already include it. Closes a class of bugs where the Ask AI menu, AI Chat dock, or AI Review drawer rendered with viewport-sized inline SVG icons because the matching CSS file was missing. Skips gracefully if a link to aitoolkit.css is already in the document. Opt-out via RTE_DefaultConfig.aitoolkit_skip_auto_css = true.
Remove Style now strips <td> backgrounds Bug fix
The Remove Style toolbar button used to leave inline backgrounds, borders, fonts, and colors set directly on table cells, paragraphs, divs, and other block-level elements (the browser’s native execCommand("removeformat") only touches inline runs). Now it actively strips presentational style properties (background*, color, font*, border*, outline*, box-shadow, text-decoration*, text-shadow, text-transform, text-indent, letter-spacing, word-spacing, line-height, opacity, filter) from non-SPAN elements while preserving layout properties (width, height, padding, margin, vertical-align, text-align). Word-pasted cell colours / borders / fonts now wipe cleanly; cell sizing survives.
Reported by Sushanth Sivadas (NASCO Dubai).
Comprehensive TypeScript declarations DX
index.d.ts expanded from 304 to 487 lines. Every editor instance method documented at /Docs/jsapi_AllMethods.aspx is now strongly typed: execCommand, isCommandEnabled, isCommandActive, getReadOnly, setReadOnly, setContentCssText, setPreviewCssText, insertRootParagraph, insertByTagName, surroundByTagName, insertElement, surroundElement, insertText, insertHTML, selectControl, selectDoc, collapse, delete, commitBookmark, clearHistory, notifySelectionChange, getDocument, getEditable, getSelection, getSelectedControl, getSelectionElement, getSelectedText, htmlEncode, htmlDecode, createToolbarButton, createToolbarDropDown, createDialog, closeCurrentPopup, setImageForCommand. Plus a RichTextEditorCommand string-literal union (50+ built-in commands), typed event names (change, selectionchange, exec_command, etc.), and a RichTextEditorConfig interface for the constructor’s second arg.
Pre-publish protected-bundle guard Tooling
npm prepublishOnly hook now verifies that richtexteditor/rte.js is the obfuscated production build (banner present, no source-only TODO/FIXME markers, filesize ≥ 380 KB) before any publish. Refuses with a clear error message if the unprotected source slipped in. Opt-out for emergency hotfix flow via RTE_ALLOW_UNPROTECTED=1 npm publish, with a loud warning.
Migration coverage expanded
The migration guide at /migrate.aspx now covers six source editors: TinyMCE, CKEditor 5, Froala, Quill, Lexical, and Tiptap. Each panel has a step-by-step checklist, a config cheat sheet, a plugin / extension equivalence table, behaviour-difference callouts, and a "what you gain" summary.
Breaking changes · npm 2.0.x retired
Every 2.0.x version was unpublished from the npm registry due to an unprotected-source packaging mistake in the April 2026 wave. Republishing skips straight to 2.2.0 so the leaked tags stay permanently retired. Consumers on any 2.0.x should pin to 2.2.0 or later. Public surface is unchanged; existing import statements work as-is.