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.
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).
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
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.
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