We are happy to announce the release of CKEditor 5 v48.1.0.
Release highlights
This release improves AI Chat formatting and rendering, introduces experimental AI support for multi-root and multiple editor setups, and strengthens compatibility with structured content pasted from Office and exported for email.
⭐ AI Chat: better formatting and rendering
AI Chat now handles raw, unformatted content more reliably. Asking AI Chat to format a pasted transcript, add headings, or convert content into a list produces cleaner and more predictable results.
The AI Chat feed also renders generated content differently. Proposed changes now appear in full when they are ready, while plain assistant text continues to stream at a faster pace.
⭐ Experimental: AI in multi-root and multiple editor setups
AI features now support multi-root editors and multiple editor instances that share a Context. This helps integrations that use several editor areas on one page, such as a title, body, sidebar, or document sections split into independent roots.
With this release:
- AI Review and AI Translate run across all roots in a multi-root editor and across all editors that share a
Context. Changes are applied to the related root or editor. - AI Chat uses content from the focused root or editor, applies suggestions to the related destination, and keeps separate conversation history for each editor in a
Context.
This feature is experimental and ready for testing in multi-root and multiple editor integrations.
Other improvements and fixes
This release also includes several improvements for content editing, Office content compatibility, and email output:
- Marker boundary elements registered with
markerToElement()now render in the same order as in the model when two markers meet at the same position. This affects features that rely on markers, including comments, suggestions, mentions, find and replace, and restricted editing. - Inline formatting such as bold, italic, font size, font family, font color, and background color is now retained after pressing Shift+Enter twice or after deleting all text inside a block and continuing to type.
- Source Editing now supports native undo and redo keystrokes in the source editing textarea.
- The editor now handles alignment attributes on
<td>elements that wrap nested tables or images. This improves compatibility with content from Outlook and other sources that usetd[align]for block layout. - Tables now preserve their alignment and inline styles after the email export transformation, improving rendering in Outlook, Gmail, and other major email clients.
MINOR BREAKING CHANGES ℹ️
-
ai: AI Chat feed items are now aligned to the bottom of the feed by default. To restore the previous top-aligned behavior, add the following CSS to your integration:
.ck.ck-ai-chat__feed__items { margin-top: 0; }
-
ai: AI Chat suggestions proposed by the agent are now displayed in full when ready. Previously, they streamed word by word.
Features
- core, editor-balloon, editor-classic, editor-decoupled, editor-inline, editor-multi-root, engine: Introduced
config.root.modelElementfor single-root editors andconfig.roots.<name>.modelElementfor multi-root editors, allowing integrators to configure the model root element type. Added the$inlineRootgeneric schema item for use with the new editor configuration. Closes #20029. - core, editor-balloon, editor-classic, editor-decoupled, editor-inline: Enabled the
modelAttributesroot configuration option for all single-root editors. - ai: Added the opt-in
config.ai.container.collapsibleconfiguration option. When enabled, clicking the active tab button toggles the.ck-ai-tabs_collapsedCSS class on the.ck-ai-tabselement. The option defaults tofalse. - ai: The
AIChatController#startConversation()method now accepts an optionalmodelIdparameter to select a specific model for the new conversation. Custom Quick Actions of typechatwith amodelproperty will now use it when starting a chat conversation. - ai: AI Review and AI Translate now support multi-root editors and multi-editor-instance contexts.
- ai: AI Chat and AI Chat History now support multi-root editors and multi-editor-instance contexts.
- document-outline: Added the
tableOfContents.headingsoption that lets integrators choose which heading levels appear in the Table of Contents widget independently from the Document Outline sidebar. - email: Added support for restoring the
alignattribute on table cells during email transformations when all child elements of a cell share the same alignment. This produces more compact HTML and improves compatibility with legacy email clients. See ckeditor/ckeditor5#19883. - export-inline-styles: Added the
runAfterDocumentTransformationandrunAfterChildrenTransformationcallbacks. They allow integrations to defer transforming selected elements until their children or the full document has been processed and their styles inlined. - format-painter: Added an ARIA live announcement when the user cancels format painting by pressing the Escape key.
Bug fixes
-
code-block, emoji, mention: Mention autocompletion (and features built on top of it, such as slash commands and emoji) no longer triggers inside code blocks. Closes #19146.
-
engine, enter: Fixed document selection attribute inheritance around
<softBreak>so returning the caret after a soft break restores formatting. Closes #19853.When selection attributes are recalculated across
<softBreak>, only attributes marked withcopyOnEnterare inherited. Other inline non-object elements still act as hard boundaries. -
engine, enter: Inline formatting attributes (such as bold or link) are no longer split by a soft break (
<br>). The<br>element now inherits applicable text attributes so that attribute elements in the view can wrap around it without being broken into separate segments. Closes #1068. -
show-blocks, table: Improved the performance of show blocks and table selection styles in large documents. Closes #20058.
-
ai: Fixed a bug where the AI Quick Actions balloon selection marker was incorrectly included in the AI Chat context.
-
ai: Custom Quick Actions of type
actionwithout amodelproperty now fall back to the default model from theai.models.defaultModelIdconfiguration or the first available model. Previously, they failed with a400backend error. -
ai: Fixed formatting of larger unformatted content in AI Chat.
-
ai: Fixed flickering and stuttering in the AI Chat sidebar.
-
ai: AI Review no longer throws an error when running review commands if the editor content contains a multiline code block.
-
ai: Fixed a bug where custom MCP tool context item chips displayed a UUID instead of the human-readable label after reloading a conversation from history. The label is now preserved during serialization so it survives the server round-trip.
-
ai: Undoing AI changes after starting a new chat no longer throws an error.
-
ai: Moved the "New Chat" button from the empty tab view to the AI Chat History tab header.
-
ai: Added a dedicated "Maximize" button to resize AI Translate and AI Review tabs.
-
ai: AI Chat commands (Explain, Summarize, Highlight key points) no longer prevent the AI from performing document edits in follow-up messages.
-
ai: Improved AI Quick Actions accessibility by disabling the dropdown and menu bar in AI Review. Closes ckeditor/ckeditor5#8932.
-
ai: Fixed AI Chat feed items not sticking to the bottom of the feed when the AI Chat shortcuts feature was not loaded.
-
ai: Fixed editing chat names in AI Chat History. The input state is now restored after canceling, and failed save attempts no longer update the local chat name.
-
ai: Fixed a crash when the AI proposes unwrapping content (e.g., removing blockquotes while keeping their inner content).
-
ai: Removed hover states from non-interactive tiles in AI Chat. Only actionable tiles now show hover feedback.
-
ai: Updated suggestion styling in AI Chat. The suggestion box now has a distinctive border, and its header no longer has a shadow.
-
ai: AI Review and AI Translate results are now shown from the beginning on subsequent runs. Previously, the scroll position was preserved.
-
ai: Fixed AI Chat responses that ignored parts of content proposed by the AI model, for example when removing a paragraph instead of wrapping it in a block quote.
-
ai: AI components now fall back to default styles when the
container.type: 'custom'configuration option is used. -
ai: Wide content, such as tables, inside AI suggestions no longer overflows its container. The container is now horizontally scrollable.
-
ai: Fixed a stray ellipsis (
…) artifact that remained painted next to the rename input when editing a long chat name in the AI Chat history. -
comments: Fixed annotation ordering when creating a comment while the target text is scrolled out of view. Previously, the sidebar could break, and other annotations could flicker due to stale position data used for ordering.
-
comments: Fixed a regression where the editor lost focus after resolving a comment thread from the narrow sidebar.
-
comments: Pressing Tab to confirm a mention suggestion in a comment editor no longer shifts focus to the Submit/Reply button.
-
editor-classic: The classic editor no longer throws an unclear error when initialized with a source element that is not attached to the DOM. A dedicated
editor-source-element-not-attachederror is thrown instead. Closes #20017. -
email: Preserved nested table alignment when exporting with inline styles.
-
email: Fixed table alignment handling for tables with and without text wrapping. This applies when the
table.tableLayout.stripFigureFromContentTableoption is set tofalseand thePlainTableOutputplugin is not included. Tables now keep their alignment, dimensions, and styling. -
email: Fixed
figcaptionwidth and overflow issues in exported table figures. When exporting a table wrapped in afigure, itsfigcaptionno longer receives an incorrect width and stays within the bounds of the exported element. Captions withcaption-side: topare now positioned immediately before the table. -
emoji: The emoji panel now renders on narrow screens. Closes #18552.
-
engine: Fixed the editing downcast order of adjacent marker UI boundaries so marker ends and starts are rendered consistently with the model and data output. Closes #19975.
The editing pipeline now produces a deterministic marker order and preserves the expected boundary order when adjacent markers are added together or when the second adjacent marker is added later.
-
engine: Preserved formatting, such as bold or italic, after deleting content that empties a block so that typing continues with the same formatting. Closes #10517, #19777.
-
fullscreen: Fixed errors that could appear when maximizing the AI panel after leaving fullscreen mode. Closes #20129.
-
horizontal-line: Horizontal lines (
<hr>) placed next to each other no longer collapse their margins in the rendered output. -
html-support: The definition list (
dl) no longer breaks the structure of the list when it is placed within a list item. Closes #20067. -
list-multi-level: Fixed a stale multi-level list marker appearing on a block widget (e.g., a table) after a paragraph was inserted before it as the first block of the same list item.
-
paste-from-office: Fixed incorrect structure of nested lists pasted from Word when plain paragraphs appear between nested list items. Closes ckeditor/ckeditor5#19127.
Previously, all paragraphs were placed after the nested list items instead of between them. The fix also ensures that interrupted nested ordered lists continue numbering across the paragraph breaks.
-
paste-from-office: Pasting content from Word no longer inserts unwanted visible bookmarks into the editor. Closes #18846.
-
paste-from-office-enhanced: When pasting from Excel, cells with patterned backgrounds now keep their colors.
-
paste-from-office-enhanced: When pasting bulleted lists from Word, the correct bullet style (disc, circle, square) is now preserved instead of defaulting to disc.
-
real-time-collaboration: Fixed an error thrown when
editor.destroy()was called right aftersaveRevision()in a real-time collaboration session. -
revision-history: Fixed revision history sidebar grouping for revisions from the same time period, such as the same year.
-
slash-command: Slash commands no longer trigger inside code blocks, because code blocks are designed to contain plain, unformatted code where autocompletion is not applicable. Closes ckeditor/ckeditor5#19146.
-
slash-command: Fixed translation of list item titles ("Bulleted List", "Numbered List", "To-do List") in the slash command panel by aligning translation keys with those defined in the list package.
-
source-editing: Native undo/redo keystrokes now work in the source editing textarea. Closes #13700.
-
table: Improved how table cell alignment is loaded into the editor. Previously, applying alignment to a cell could force text alignment on all nested elements inside it. Now, alignment is applied to the direct contents of the cell without breaking the layout of deeper nested content. Closes #19883.
-
ui: The menu bar no longer stays open after clicking the "Fullscreen mode" menu item when entering fullscreen mode. Closes #20056.
-
uploadcare: Fixed a build error affecting some TypeScript projects using Uploadcare integration. Closes ckeditor/ckeditor5#19692.
-
uploadcare: Uploadcare-uploaded images no longer render blurry when their natural width falls between the responsive
<source srcset>breakpoints. The generated srcset now always includes a variant at the original (or cropped) image width as its largest entry, so the browser can serve a 1:1 pixel match instead of upscaling a smaller variant.
Other changes
-
ai: Updated the message displayed in AI Chat when you click the "Stop generating" button after sending a prompt.
-
ai: Improved content streaming performance and rendering in AI Chat and AI Quick Actions.
- AI Chat now displays individual suggestions only when they are ready and shows a skeleton loader while waiting for the next suggestion.
- AI Chat and AI Quick Actions now use smooth scrolling.
- AI Chat and AI Quick Actions now stream word-by-word responses faster.
-
core: Added the
RootConfig#descriptionconfiguration property. It lets integrations identify editor roots when using multiple editor instances on one page or a multi-root editor. Closes #20119. -
engine: Added the
ViewDocument#getRoots()method, a convenience accessor returning all view roots as an array (analogous toModelDocument#getRoots()). Closes #20097. -
list: Prevent list attributes from being applied to text nodes and inline objects during content insertion, which could crash the editor when a permissive
Schema#addAttributeCheck()is used. Closes #19994. -
track-changes: Improved Track Changes performance for lists. Previously, the browser could freeze when many list suggestions were added to the document at once.
Released packages
Check out the Versioning policy guide for more information.
Minor releases (contain minor breaking changes):
Releases containing new features:
Other releases:
Released packages (summary)