CKEditor 5 changelog
This is the CKEditor 5 changelog guide. Here you will find information about the most important changes introduced in the release, new features, and bug fixes.
Information about both major and minor breaking changes is available, too, if the release introduces them. You can read more about breaking changes in CKEditor 5 in the Versioning policy guide.
You can find more information about each release in the blog posts linked at the start of each entry.
This guide provides the changelog information for the 3 latest releases of CKEditor 5. For older releases, refer to the release notes on GitHub.
# CKEditor 5 44.2.0 release
We are happy to announce the release of CKEditor 5 v44.2.0.
# Release Highlights
# 🖥️ Enhanced Source Code Editing (⭐)
Introducing new premium feature: Enhanced Source Code Editing. It displays the source code in a dialog and is compatible with all editor types. It offers syntax highlighting, code completion, code folding, and other advanced functionalities. Additionally, it supports both HTML and Markdown formats.
# 📤 Uploadcare and image optimizer (⭐)
We have integrated the Uploadcare image manager service, enabling you to upload and edit images to their cloud environment. You can upload files from various sources, including local devices, social media, or online drives ensuring rapid uploads. The integration takes care of efficient media delivery with responsive images mechanism, making sure your users will save bandwidth and have faster website loading. You can also optimize images with the built-in image editor which offers a range of features, such as cropping, rotating, flipping, photo filters and more. All this directly from the editor, try it out!
# 🖼️ Image Merge Fields (⭐)
Image merge fields are a new type of merge fields, dedicated for image placeholders. They maintain all standard image interactions, like styling, resizing or captions (in which you can use merge fields too!) At the same time, they keep all merge fields functionalities, like data previews or document export integration. In the document data, image merge fields are represented like other images, however their src
attribute is set to a respective merge field, for example, src="{{CompanyLogo}}"
, making them easy to post-process!
# 📝 Track Changes Preview (⭐)
We have added the preview mode that displays a document with all suggestions accepted. Accessible from the track changes dropdown, this modal preview helps check the final content without extensive markers.
# 😀 Emoji support
They are here! 🎉 🥳 🎊 Insert emojis effortlessly in the editor by typing :
or through a user-friendly emoji picker. This feature enhances the richness of your content by allowing quick access to a wide range of emojis.
# ⚡ Performance improvements: Part 4
Here comes the final batch of the planned performance improvements in the editor loading speed area, that we worked on through a couple of past releases.
- A new caching mechanism in
Mapper
now handles model-to-view mappings, substantially improving performance for loading and saving data. - Images with specified height and width automatically use
[loading="lazy"]
in the editing area, optimizing the loading time (read more on MDN). This attribute is only applied during editing to enhance the loading efficiency of images, and it does not reflect in the final data output.
We are greatly satisfied with the improved editor loading times. At the same time, we acknowledge some other problematic areas, and we will keep delivering more performance-related improvements in the future.
# MINOR BREAKING CHANGES
- engine:
Mapper#registerViewToModelLength()
is now deprecated and will be removed in one of the upcoming releases. This method is useful only in obscure and complex converters, where model element, or a group of model elements, are represented very differently in the view. We believe that every feature using a custom view-to-model length callback can be rewritten in a way that this mechanism is no longer necessary. Note: if this method is used, the caching mechanism forMapper
will be turned off which may degrade performance when handling big documents. Note: this method is used by the deprecated legacy lists feature. As a result, you will not experience the performance improvements if you are still using the deprecated legacy lists feature. - image: Starting this release, images that have
[height]
and[width]
attributes set will automatically receive the[loading="lazy"]
attribute in the editing area. This happens only for the content loaded into the editor, the data output produced by the editor remains the same. The reason for this change is to improve user experience in documents that may contain hundreds of images. - list: The
lower-alpha
andupper-alpha
list styles are now upcasted tolower-latin
andupper-latin
styles. - merge-fields: The
MergeFieldsEditing#getLabel()
method will now returnnull
instead of the merge field id if the merge field definition was not found or it did not contain thelabel
property. - basic-styles: Elements which contains the
[style]
attribute withword-wrap: break-word
will not be converted to<code>
. See #17789.
# Features
- ai: Comment threads will now be preserved when AI Assistant processes selected content with comments. This can be disabled through the
ai.aiAssistant.preserveComments
flag. Note, that the actual result depends on the response provided by the AI model (AI model has to keep the comments markup in the response). Additionally, the copy-paste comments functionality must be enabled (configured bycomments.copyMarkers
). - ai: The
ai.aiAssistant.removeCommands
configuration now allows removing entire command groups. - ckbox: It is now allowed to specify which files chosen from CKBox are downloadable. Closes #15928. (commit)
- clipboard: Added the ability to detect paste events originating from the editor. Closes #15935. (commit)
- clipboard: Passed information to the downcast converter when clipboard pipeline is used to allow for customization. Closes #17745. (commit)
- clipboard: The
viewToPlainText()
helper will now parse the viewRawElement
instances. Closes #17746. (commit) - emoji: Created the Emoji feature. Closes #17361. (commit)
- image: Added a possibility to break the current block by
InsertImageCommand
with thebreakBlock
flag. Closes #17742. (commit) - list: Allowed to specify which list style types are shown in list type selector dropdown. Closes #17176. (commit)
- list: Added support for the
lower-alpha
andupper-alpha
list type highlighting in the list style properties buttons. Closes #17424. (commit) - mention: Allowed the mention marker to be longer than 1 character. Closes #17744. (commit)
- merge-fields: Introduced the image merge fields.
- merge-fields: Added the
[data-merge-field-name]
attribute in the editing pipeline. - merge-fields: Use the actual merge field value when they are copied from the editor in preview mode other than
$labels
. - source-editing-enhanced: Introduced the Enhanced Source Code Editing feature.
- table: Improve aria attributes in the table and cell align toolbars. Closes #17722. (commit)
- track-changes: Introduced the final document preview for track changes. It allows to display the document with all suggestions accepted in the modal.
- ui: The
.ck-with-instant-tooltip
class may now be used to display the tooltip without the delay. Closes #17743. (commit) - upload: Added support for passing a callback to the
SimpleUploadConfig#headers
property. Closes #15693. (commit) - uploadcare: Introduced the Uploadcare integration.
- utils: Added a
collectStylesheets()
helper function to retrieve style sheets from the provided URLs. (commit)
# Bug fixes
- ai: The content generated by the AI Assistant will now be correctly inserted into tables when both “Replace” and “Insert below” actions are used.
- basic-styles: The
Code
feature should not convert element with theword-wrap: break-word
style into the<code>
tag. Closes #17789. (commit) - cloud-services: No longer keep refreshing token if the
cloudServices.tokenUrl
method failed in the initialization of the plugin. Closes #17531. (commit) - comments: Unlinked comment threads created before the editor initialization are now correctly handled and displayed in the comments archive. This error was experienced in asynchronous integrations which are using the
Context
mechanism. - comments: Do not allow editing content source via the source mode in the comments-only mode.
- comments: Introduced the name field tooltip in comments UI.
- editor-classic: Export
ClassicEditorUIView
from package. (commit) - editor-inline: No longer crash while destroying the editor when the editable was manually detached before destroying. Closes #16561. (commit)
- editor-multi-root: No longer crash while destroying the editor when the editable was manually detached before destroying. Closes #16561. (commit)
- image: The insert image via URL dialog can now be submitted by pressing the Enter key. Closes #16902. (commit)
- link: Trailing punctuation is no longer included in an autolinked URL. Closes #14497. (commit)
- list: The list style buttons should show proper list type after clicking list for the first time. (commit)
- list-multi-level: Multi-level lists should work when typing in Japanese.
- merge-fields: Do not automatically convert the merge-fields-like text containing disallowed characters.
- merge-fields: Properly handle block merge fields mixed with text during data upcast and pasting.
- revision-history: The Revision history feature sidebar header height now matches the height of the editor toolbar.
- revision-history: The Revision history feature loading overlay now overlaps images correctly.
- table: Prevent a table corruption when setting editor data with
<th>
cells followingcolspan
rows. Closes #17556, #17404. (commit) - track-changes: Introduced the name field tooltip in suggestions UI.
- typing: Fixed not working two-step caret movement on iOS devices. Closes #17171. (commit)
- ui: Tooltip will no longer show after quickly hovering and moving the mouse away before the tooltip shows. Closes #16949. (commit)
- ui: Destroying another editor instance while a modal is open will no longer unlock page scroll. Closes #17585. (commit)
- utils: Extended
getEnvKeystrokeText()
with option to use it in the context of specified environment which allows to generate keystrokes text for different OS than the host one. (commit) - Treat types as production dependencies. Fixes #17213. (commit)
- Unify TypeScript declaration files. Fixes #17575 and #17533. (commit)
# Other changes
- ai: Exported the
AIAssistantUI
class and theAIAssistantConfig
,CommandDefinition
andGroupDefinition
types. - clipboard: Exported the
ViewDocumentPasteEvent
type from the@ckeditor/ckeditor5-clipboard
package. (commit) - comments: Exported the
AddCommentThreadEventData
type. - comments: Activating an annotation now scrolls to the target if it is out of view.
- comments: Fixed the wrong
filter()
callback signature inAnnotationsUIs#activate()
. - engine: Introduced dynamic caching in
Mapper
to improve view-to-model mapping performance, and as a result improve editor data load and data save performance. Closes #17623. (commit) - engine: A new parameter
data
was added for thechange:children
event fired byViewElement
andViewDocumentFragment
when their children change. Thedata
parameter is an object with theindex
property, which says at which index the change happened. Related to #17623. (commit) - engine:
Mapper#registerViewToModelLength()
is now deprecated and will be removed in one of upcoming releases. Note: if this method is used, the caching mechanism forMapper
will be turned off which may degrade performance when handling big documents. Note: this method is used by the deprecated legacy lists feature. See #17623. (commit) - engine: Export
SchemaCompiledItemDefinition
type. Closes #17783. (commit) - engine: Improve performance of the placeholders. (commit)
- engine: Do not store non-document operation with batches. This improves memory efficiency for huge documents. Closes #17678. (commit)
- engine: Improve performance of
Selection#getSelectedBlocks
when selection contains block elements with many blocks inside (such as table). Closes #17629. (commit) - font: Export
ColorSelectorDropdownView
type. Closes #17783. (commit) - image: The
[loading="lazy"]
attribute will be automatically added in editing view to images with theheight
andwidth
attributes set to improve loading performance. (commit) - list: Skip already visited list elements during reconversion and post fixing for better performance. Fixes #17625. (commit)
- merge-fields: The
MergeFieldsEditing#refreshMergeFields()
method is now public and available for external use. - merge-fields: Remove the default values preview mode if there is none or the merge fields has a default value configured.
- merge-fields: Display ellipsis if the merge field name does not fit the dropdown.
- pagination: Do not wait for images with
[width]
and[height]
attributes. - pagination: Do not wait for loading images that have
[width]
and[height]
attributes set when calculating pages. - real-time-collaboration: Export the
Sessions
class. - real-time-collaboration: Changed how errors related to real-time collaboration are handled. Previously, the original error was always logged on the console, and a
realtimecollaborationclient-
error was thrown without information related to the original error. Now, the original error is not logged anymore. Instead, therealtimecollaborationclient-
error includes thedata.originalError
property with the original error message. This way it is possible to save error details through a custom error logging mechanism. Note, that without any custom mechanism, therealtimecollaborationclient-
error will still be unhandled and logged to the console. - real-time-collaboration: The editor now switches to read-only mode if the real-time collaboration client crashes, ensuring that the user cannot further edit the document and no data is accidentally lost.
- ui: Added Enhanced Source Code Editing as a default menu bar item, making it visible in the menu bar when the plugin is present in the editor. (commit)
- ui: Extended the dialog API to support custom keystroke handler options, allowing to override priorities of the keystroke callback and filter keystrokes based on arbitrary criteria. (commit)
- ui: The
ImageInsertUI#registerIntegration
method now supports handling an array of views for a specific integration type. This allows, for example, registering anassetManager
integration with multiple sources likeFacebook
andInstagram
, where each source has its own dedicated button. (commit) - ui: Exported the
DocumentColorCollection
class. Closes #17783. (commit) - utils: Extended key codes with the
End
andHome
keys, enabling the use and display of shortcuts containing these keys in the UI. (commit) - utils: Exported the
add()
function. Closes #17783. (commit)
# CKEditor 5 44.1.0 release
We are pleased to announce the latest CKEditor 5 release, focusing on performance enhancements and key bug fixes to improve your editing and collaboration experience.
# Release Highlights
# ⚡ Performance enhancements: Part 3
This release introduces another set of performance related improvements, focused on faster editor initialization for huge documents. The initialization time was lowered by further 15% to 45%, depending on the tested sample.
The combined improvements introduced in recent releases amount to around 65%-80% lower loading time in total, which means the editor will load 3-5x faster. As the gain is not linear, bigger documents see even better improvement (more than 10x faster).
Moreover, all these improvements positively impact document save time (editor.getData()
), which should help with autosave issues, among others.
We still actively work in this area, so you may expect even more editor load and save efficiency improvements in the upcoming releases.
# 🔨 Bug Fixes and improvements
- Comments enhancements:
- Data export options: We introduced the
showCommentHighlights
option ineditor.getData()
, that changes the comment marker conversion, allowing for styling comments in the output. Perfect for showing what was commented in Export to PDF, for example. - Inline mode improvements: We addressed a problem where comment annotations in inline mode did not close properly when clicking elsewhere in the content.
- Thread management: We resolved an issue where creating a new thread was not interrupted when the corresponding marker was removed from the content, ensuring better stability during collaborative editing.
- Data export options: We introduced the
- Revision History update:
- Restore functionality: We disabled the ability to restore the current (edited, not saved) revision, as it represents current content, so there is nothing to restore. At the same time, using it led to some non-obvious behaviors.
- Image handling: We resolved an issue where images in the uploading state could be deleted when dragged and dropped within the editor. Keep dragging, even when it is not there 🙈.
# 🎄 Happy holidays!
As the holiday season approaches, we extend our warmest wishes to our community and users. Thank you for your continued support, and we look forward to bringing you further enhancements and exciting features in the coming year.
# MINOR BREAKING CHANGES
- utils:
spliceArray
now modifies the target array and does not accept a fourth (count
) argument.
# Features
- comments: Introduced the
showCommentHighlights
option ineditor.getData()
method that changes the comment marker conversion and allows styling the comments in the output.
# Bug fixes
- comments: Resolved an issue where creating a new thread was not interrupted when the corresponding marker was removed from the content, for example, by another user in real-time collaboration.
- comments: When adding a comment in inline mode, the comment annotation will now close properly if you click elsewhere in the content.
- find-and-replace: It should be possible to search within content of inline widgets. Closes #11162. (commit)
- image: Copying and pasting images in the uploading state is now possible. Closes #16967. (commit)
- ui: Surrounding spaces are no longer added to colors produced by hex inputs. Closes #17386. (commit)
# Other changes
- Introduced multiple general performance improvements in the
@ckeditor/ckeditor5-engine
,@ckeditor/ckeditor5-list
, and@ckeditor/ckeditor5-utils
packages, leading to 15%-45% lower editor loading time. Closes #17641. - link: Exported the
ensureSafeUrl()
function from the@ckeditor/ckeditor5-link
package. (commit) - revision-history: Disabled the ability to restore a currently edited (not saved) revision.
- ui: Icons (
IconView
) are no longer individually accessible by assistive technologies, improving overall accessibility. Closes #17554. (commit) - utils: Change the implementation of
spliceArray()
to modify the target array for better performance. (commit)
# CKEditor 5 44.0.0 release
# Release Highlights
We are excited to introduce CKEditor 5 v44.0.0, a release packed with high impact updates designed to enhance your editing experience and simplify access to our premium offers. Here’s what’s new:
# 🚀 Self-service plans: Simplified access to premium features
We are introducing flexible self-service plans that put you in control with full transparency. Now, you can:
- Choose the plan that fits your needs, pay only for what you use, and get started instantly with a commitment-free trial.
- Seamlessly manage your license keys, track usage, and more in the new Customer Portal.
💡 Important for current users:
If you are upgrading to v44.0.0+, ensure a smooth transition by updating your license keys in the editor, as we implemented a new format of the key. To get the new key, visit the Customer Portal. You can also refer to our license key and activation guide for help with logging in to the portal.
📣 The open-source licensing remains unchanged. However, config.licenseKey
is now a required property in the editor configuration. Use 'GPL'
for installations under the GPL terms. Read more in the update guide.
# 🔖 Bookmarks: Organize your content with ease
Say hello to Bookmarks, a long-awaited feature that simplifies content navigation within the editor. With this release, you can:
- Add anchors as reference points within text.
- Link to the newly created bookmarks in the editor to navigate to specific locations within complex documents, such as contracts or technical manuals.
📍 Future updates to Bookmarks and the linking experience are planned for the upcoming releases. Follow progress and share your feedback on GitHub.
# ⚡ Performance improvements: Faster table rendering
The current release includes another stride towards improving the performance aspect of the editor, this time focusing on how tables are handled in the content. Implemented optimizations have made table rendering 3x faster, with the average load time of a document with a very long, complex tables dropping from around 4.5 seconds to just 1.5 seconds.
# MAJOR BREAKING CHANGES
config.licenseKey
is now a required property in the editor configuration. Use'GPL'
for installations under the GPL terms. See #17317.
# Features
# Bug fixes
- clipboard: An in-text drop of an inline object with elements inside should be possible. Closes #16101. (commit)
- cloud-services: Handle refresh token when editor destroyed during token fetching. Closes #17462. (commit)
- editor-classic: Excluded modal windows from the Classic Editor’s integration between dialogs and the sticky toolbar. Closes #17339. (commit)
- engine: List markers should be visible after changing the list type from multi-level to numbered. Closes #17488. (commit)
- find-and-replace: Find and replace no longer randomly jumps to the first found item after the replace operation. Closes #16648. (commit)
- list: Inserting or dropping a paragraph after the end of a list should not convert the paragraph to a list item. Closes #17224. (commit)
- pagination: The pagination line should be rendered properly on tables. Closes ckeditor/ckeditor5#17158.
- restricted-editing: Remove existing restricted editing markers when setting new data to prevent marker resurrection. Closes #9646, #16721. (commit)
- theme-lark: Letter descenders should not be clipped in the top-level menu bar categories. Closes #17422. (commit)
- track-changes: Export the
AttributeData
,FormatData
andDescription
typings from package. - ui: The menu or dropdown panels will no longer be placed in an incorrect position when a optimal position cannot be found. Closes #17220. (commit)
- ui: The dialog plugin should not handle Esc key press when default-prevented by the guest view. Closes #17343. (commit)
- upload: Editor should no longer crash when executing undo while an image is still being uploaded. (commit)
- utils: Use binary search in
insertToPriorityArray()
for better performance when handling big tables. (commit) - utils: No longer scroll to the top of the document if pasted element is larger than scrollable editable. Closes #17079. (commit)
# Other changes
-
collaboration-core: The types of publicly exported plugins will now be correctly resolved when accessed using
editor.plugins.get
. -
comments: The types of publicly exported plugins will now be correctly resolved when accessed using
editor.plugins.get
. -
real-time-collaboration: Editor will be switched to read-only mode when an unrecoverable error will be returned by Cloud Services server during real-time editing.
-
real-time-collaboration: The types of publicly exported plugins will now be correctly resolved when accessed using
editor.plugins.get
. -
revision-history: The types of publicly exported plugins will now be correctly resolved when accessed using
editor.plugins.get
. -
track-changes: The types of publicly exported plugins will now be correctly resolved when accessed using
editor.plugins.get
. -
track-changes: The
descriptionFactory
property will now be accessible publicly. -
track-changes: Suggestions of the same type that are not directly next to each other will no longer be represented as one suggestion in the UI.
-
ui: Improved the performance of the
BodyCollection
DOM wrapper lookup by replacingdocument.querySelector()
with a static element reference. (commit)Huge thanks to Ben Demboski for this contribution!
-
Changes related to the introduction of self-service channel for CKEditor 5 Premium Features. See #17317. (commit)
-
Updated translations. (commit)
Every day, we work hard to keep our documentation complete. Have you spotted outdated information? Is something missing? Please report it via our issue tracker.
With the release of version 42.0.0, we have rewritten much of our documentation to reflect the new import paths and features. We appreciate your feedback to help us ensure its accuracy and completeness.