Release notes · Updated April 2026

What’s new in RichTextEditor

A running log of releases for the RichTextEditor JavaScript library and the @@richscripts2/richtexteditor npm package. Major features, breaking changes, and migration notes are called out at the top of each release.

Latest
April 29, 2026
npm 2.2.0

RichTextBox.AspNetCore: bundled plugins/crdt-engine.min.js auto-injected via the <richtextbox> tag helper.

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.

Current
April 24, 2026
npm 2.0.6

RichTextBox.AspNetCore: 1.0.0-preview.12

Dictation plugin New

New plugins/dictation.js. Speech-to-text via the Web Speech API with a toolbar microphone button; interim transcripts render live under the cursor. Opt-in via config.dictationEnabled = true. JS API: editor.dictation.start() / stop() / toggle() / isListening() / isSupported().

Browser support: Chrome, Edge, Safari (macOS / iOS 14+), Opera. Firefox detects as unsupported and hides the button. · Live demo

Mobile toolbar stylesheet New

New rte_mobile.css. Add class rte-mobile to any editor container (or use the editor’s built-in config.toolbarMobile + maxWidthForMobile auto-swap) to reshape the toolbar for phones: horizontally-scrolling strip, 44×44 tap targets, sticky header, bottom-sheet dropdowns / dialogs / review drawer. Scoped behind @@media (max-width: 768px), (pointer: coarse) so desktop layouts stay unchanged.

Live demo

Paste from Word list conversion Fixed

Rewrote _ConvertWordLists in rte.js. Now correctly detects ordered vs unordered from the marker span, handles nested levels (via mso-list: l{N} level{M}), and strips actual bullet glyphs (·, , , §, ) instead of the previously ineffective character class. Numeric / alphabetic / Roman markers now round-trip as <ol> with proper nesting.

Preview
April 24, 2026
npm 2.0.5

Revision history: named versions + diff API New

Three new methods on editor.revisionHistory:

  • promptAndSnapshot(defaultLabel?) — native prompt + snapshot. Returns entry or null if cancelled.
  • rename(id, label) — rename an existing snapshot; flips its isNamed flag to true.
  • listNamed() — return only named snapshots (handy for a “milestones only” filter).
  • diff(idA, idB){ oldEntry, newEntry, oldText, newText, lines[] } for building side-by-side diff UI.

Each entry now carries an isNamed boolean. Snapshots with an auto: true metadata flag always stay unnamed.

DOCX export client helper New

New editor.aiToolkit.exportDocx({ url?, fileName?, title?, html?, onError? }) builds a POST to a server DOCX endpoint and triggers a browser download via Blob + anchor. Falls back to navigator.msSaveOrOpenBlob on legacy IE/Edge. Pairs with the new DocxExporter server in RichTextBox.AspNetCore 1.0.0-preview.11.

Live demo

Yjs text sync preview (opt-in concurrent typing) Preview

editor.collab.attach({ doc, provider, textSync: true }) binds the editor’s full HTML to a shared Y.Text on the given Y.Doc. CRDT merges concurrent inserts / deletes at character level; two users typing at the same time both see each other’s edits survive.

Known tradeoffs: remote updates re-set the body (caret snaps to start), HTML character offsets don’t align with rendered caret offsets. Per-node binding (y-xml-fragment) is on the roadmap.

New config keys: collabTextSync (bool, default false) and collabTextName (string, default richtextbox.body).

Preview
April 23, 2026
npm 2.0.4

Streaming AI client helper New

New editor.aiToolkit.streamRequest({ url, body, onDelta, onResponse, onDone, onError }) consumes Server-Sent Events from a streaming AI endpoint. Returns { promise, abort() }. Browsers without fetch / ReadableStream fall back to a non-streaming XHR against the same endpoint with /stream stripped — same callback shape either way.

Works against any SSE source that follows data: / event: response / event: done framing; not tied to RichTextBox.

Live demo

Preview
April 22, 2026
npm 2.0.3

AI Toolkit polish & server-side integration New

Shipped alongside the preview.9 NuGet server release. JavaScript side exposed editor.aiToolkit surface for React / Vue / Angular integrations. Resolver contract finalized; BYOK pattern fully documented in /demos/ai-provider-settings.aspx.

Preview
April 22, 2026
npm 2.0.0–2.0.2

v2.0 Collaboration & Review plugins Major

Six plugins shipped together — the full review stack that TinyMCE 7 and CKEditor 5 gate behind their premium tiers:

  • Slash commands (plugins/slashcommand.js) — type / to insert headings, lists, tables, code blocks, AI actions; 15 built-in blocks plus any registered AI action.
  • @Mentions (plugins/mentionplugin.js) — trigger-character framework for @, #, [[wiki]]; async data sources with debounce + loading state, atomic chips.
  • Track Changes (plugins/trackedchanges.js) — Word-style human suggesting mode, per-author color, accept / reject from the Review drawer.
  • Threaded comments (plugins/comments.js) — anchored to selection ranges, with replies, resolve, delete.
  • Revision history (plugins/revisionhistory.js) — snapshot browser with LCS line diff, manual or debounced auto-snapshots, localStorage or server-POST persistence.
  • Yjs presence (plugins/yjscollab.js) — live cursors + shared review ledger via a peer-dependency Yjs provider.

All six share a single editor.reviewLedger store so AI suggestions, human tracked-change suggestions, and comments appear interleaved in the same Review drawer.

AI Toolkit Major

Three AI surfaces in one release:

  • Ask AI — toolbar dropdown with nine preset actions (proofread, rewrite, shorten, expand, summarize, translate, justify, add paragraph, add AI comment) + free-text prompt.
  • AI Chat — docked multi-turn panel with scope switcher.
  • AI Review — batch suggestions in a reviewable drawer.

Provider-agnostic via editor.aiToolkit.setResolver(fn) (client-side BYOK) or IRichTextBoxAiResolver (ASP.NET Core). Ships a demo resolver so AI works without a key out of the box. · Demo

Structured content: JSON / Markdown round-trip New

Opt-in via config.enableStructuredContent = true. Round-trip HTML ↔ JSON ↔ Markdown for apps that need a typed document model or want to render server-side. · Demo

Install or upgrade

Grab the latest via npm:

npm install @@richscripts2/richtexteditor@@latest

Need the ASP.NET Core Tag Helper wrapper? See richtextbox.com release notes.

Feedback & issues: support@@richtexteditor.com