Skip to content


Choose a tag to compare
@pomek pomek released this 07 Jul 07:10
· 11021 commits to master since this release

Release highlights

We are happy to announce the release of CKEditor 5 v29.0.0.

This release introduces several new features:

There were also a few bug fixes:


  • build-decoupled-document: The official preconfigured decoupled document build now ships with the ImageResize plugin enabled by default. Learn more about it in the Migration to v.28.x guide.
  • image: The Image plugin works as a glue for both the ImageBlock and ImageInline features now (previously it only supported block images). If you do not want inline images to be allowed, consider replacing the Image plugin with ImageBlock in your editor configuration. Otherwise, all images without the <figure> wrapper will be loaded into the editor content as inline images, which in some cases may affect content semantics and styling. Check the udpated image installation guide for more details about this change.
  • image: The ImageEditing plugin is no longer standalone, as the majority of its logic was extracted to the ImageBlockEditing and ImageInlineEditing plugins. The logic remaining in the ImageEditing is common for both ImageBlockEditing and ImageInlineEditing plugins.
  • image: The image caption is no longer displayed automatically when the user selects a block image. Instead, its presence is controlled using the 'toggleImageCaption' toolbar button and a ToggleImageCaptionCommand for better integration with the revamped image styles system.
  • image: The API of the image features has changed, please make sure to update your integrations.
  • image: The linked image indicator (icon) rendered as a <span> with the .ck-link-image_icon CSS class has been removed. To alter the look of the indicator (including the icon), please use the figure.image > a::after (for linked block images) and a span.image-inline::after (for linked inline images) CSS selectors instead.
  • image: The srcsetAttributeConverter() and modelToViewAttributeConverter() conversion helpers now require the imageType parameter.
  • table: The in-cell pseudo-paragraph used for data tables is no longer styled using the inline style attribute but a .ck-table-bogus-paragraph CSS class instead.
  • Several plugins are not loaded automatically as dependencies of other plugins anymore. From now on, they need to be provided by the editor creator manually (via the config.plugins configuration option). Learn more about it in the Migration to v.29.0.0 guide. This list includes:
    • The CKFinder plugin is no longer automatically importing the Image plugin as a dependency.
    • The EasyImage plugin is no longer automatically importing the Image plugin as a dependency.
  • Several functions are no longer a part of the public API. This list includes:
    • getSelectedImageWidget()
    • getViewImgFromWidget()
    • isImageAllowed()
    • isImage()
    • isImageWidget()
    • toImageWidget()
    • captionElementCreator()
    • isCaption()
    • checkSelectionOnObject()
  • Several functions or constants have been renamed. The list of changes includes:
    • The getCaptionFromImage() helper is now available as getCaptionFromImageModelElement()
    • The matchImageCaption() helper is now available as matchImageCaptionViewElement()
    • The defaultIcons are now available as DEFAULT_ICONS
    • The defaultStyles are now available as DEFAULT_OPTIONS
    • The findOptimalInsertionPosition() helper is now findOptimalInsertionRange() and returns a model range. Also, instead of searching for a position next to the currently selected block, it will now attempt to replace that block (see #9102)
    • The isImageAllowed() helper is now available as isLinkableElement()
    • Some helpers from the image utils module (@ckeditor/ckeditor5-image/src/image/utils.js) have been moved to the ImageUtils plugin. The helpers are still accessible via the editor.plugins.get( 'ImageUtils' ) namespace, for instance, editor.plugins.get( 'ImageUtils' ).insertImage( ... )
  • The API of several functions or modules has been changed. Refer to the documentation to learn more. This list of changes includes:
  • The default user permissions have been changed. Now, by default, it is possible to remove other users' comment threads. This applies to non-real-time editing integrations and to real-time editing integrations using the writer role. This behavior can be changed using the Permissions plugin API (for non-real-time editing integrations) or by setting permissions for a given user in the user token (for integrations using Cloud Services).


  • code-block: When inserting a new code block, instead of applying the default language (the first in the dropdown view), the feature now re-uses the language of the last inserted code block. Closes #8722. (commit)
  • collaboration-core: Introduced the Permissions plugin. Now it is possible to manage the editor's level of access using permissions. See the user roles and permissions guide.
  • comments: Introduced the CommentsRepository#isReadOnly() method.
  • comments: Introduced the CommentThread#isRemovable property which is related to current permissions. By default, comment threads can now be removed by any user.
  • engine: Improved engine view matcher with new pattern syntax allowing to match attribute keys using regular expressions. Unified the pattern syntax between attributes, styles, and classes. Closes #9872. (commit)
  • engine: Added the special expand option to the StylesMap.getStyleNames() and view Element.getStyleNames() methods allowing to expand shorthand style properties. (commit)
  • engine: Introduced the batchType option in which can be used to preserve the undo/redo steps and to add an additional item to the undo stack. Note that it will still replace the whole content and should not be used with real-time collaboration. (commit)
  • html-support: Introduced the General HTML Support feature. Closes #9970. (commit)
  • image: Introduced support for inline images in editor content. Available out–of–the–box in all ready–to–use editor builds, inline images can be uploaded, styled, resized, and linked and complement the already supported block images. See the image feature overview guide to see inline images in action. For more information about breaking changes, migration path, and tips, check out the migration to v29.0.0 guide. (commit)
  • image: It should now be possible to define the dropdown menu as an object in the config.image.toolbar configuration. Closes #9340. (commit)
  • link: The feature functonality now covers both block and inline images. Closes #8871, #9017, #9167. (commit)
  • revision-history: Enabled the Revision History feature in multi-root editors.
  • source-editing: Introduced the Source editing feature for the predefined classic editor build. Closes #9647. (commit)

Bug fixes

  • clipboard: All toolbars shall be hidden when the widget is dragged and show back when the drag ends. Closes #9566. (commit)
  • code-block: The code block feature should not allow for inserting inline widgets as its content. Closes #9567. (commit)
  • engine: Fixed the downcast conversion of collapsed markers at the conversion range boundary. Closes #8485. (commit)
  • engine: Added missing HTML block element names to the DomConverter.blockElements array. Closes #9801, #7863. (commit)
  • engine: Markers should not be split in view on the caret position. Closes #9513. (commit)
  • engine: FocusObserver should not force the view to render in random moments. See #9513. (commit)
  • engine: Disallowed inline images in the caption elements. Closes #9794. (commit)
  • image: The image should not resize to 100% if the resize command was overridden (canceled). (commit)
  • image: The side-aligned images should always have some max-width property to not take up the whole editor width. Closes #9342. (commit)
  • image: The floating block images, except for the side images, should be displayed side by side by default. Closes #9183. (commit)
  • image: An image should never overflow the widget boundaries while changing its size. Closes #9166. (commit)
  • image: The size label should be displayed above the image if it does not fit inside. See #9166. (commit)
  • image: An image caption placeholder text should not wrap or overflow. Closes #9162. (commit)
  • link: The link UI should be shown when clicking a linked inline widget. Closes #9607. (commit)
  • restricted-editing: The editor will not crash when a restricted area marker is removed. Closes #9650. (commit)
  • revision-history: The highlights for suggestions created in earlier revisions are now properly shown.
  • revision-history: A revision history will no longer crash if table plugin has not been added to the editor.
  • widget: Selected inline widgets wrapped in an attribute in the view should create a fake selection. Closes #9524, #9521. (commit)

Other changes

  • build-decoupled-document: The editor document build now includes the ImageResize plugin. Closes #9507. (commit)
  • comments: The Comment#isRemovable property is now bound to CommentThread#isRemovable. Comment#isRemovable is set to true if the local user is the author, or if the comment thread is removable and the comment is the first comment in the thread.
  • core: Added several new icons for new image styles (see #8909). (commit)
  • easy-image: Removed the Image plugin dependency from the EasyImage plugin. Closes #9399. (commit)
  • engine: Fixed parsing leading HTML comments by HtmlDataProcessor.toView(). Closes #9861. (commit)
  • horizontal-line: New widgets will replace the selected block instead of being added next to it on insertion (see #9102). (commit)
  • image: The default image style is now called block, instead of full. Its label reads now "Centered image" and it is represented by the appropriate icon in the image toolbar. See #9545. (commit)
  • image: Turned the image utils module into an editor plugin to allow sharing utils outside the package. See #8871. (commit)
  • image: The image toolbar should be visible if the selection is placed inside an image caption. Closes #9136. (commit)
  • image: The image caption should be controlled using the toolbar button and a command for a better integration with image styles. Closes #8907. (commit)
  • real-time-collaboration: Made collaboration features compatible with inline images.
  • table: Added the .ck-table-bogus-paragraph CSS class to the in-cell pseudo-paragraph used for data tables for easier and safer styling. (commit)
  • ui: Added the class property to the SplitButtonView UI component. Closes #8909. (commit)
  • widget: Safeguarded the way the Widget plugin sets the fake selection. Closes #9580. (commit)
  • widget: Replaced the findOptimalInsertionPosition() helper with findOptimalInsertionRange() that will now attempt to replace selected blocks when inserting new widgets. Closes #9102. (commit)
  • Optimized icons. (commit)
  • Updated translations. (commit, commit)

Released packages

Check out the Versioning policy guide for more information.

Released packages (summary)

New packages:

Major releases (contain major breaking changes):

Releases containing new features:

Other releases: