npm ckeditor5 48.0.0

4 hours ago

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

Note

CKEditor 5 v47 remains the LTS release. If you are an LTS customer, stay on this version. The next releases in the v47.x line will be published for LTS customers only.

Release highlights

This major release improves CKEditor AI and tables, completes the sunset of old installation methods, changes the default Export to PDF converter API version, and introduces a unified structure for root-related configuration.

Old installation methods sunset

With this release, we have officially completed the transition to our modern installation methods — a milestone we are excited to reach! 🎉

First introduced in CKEditor 5 v42.0.0 in June 2024, these new methods were designed to simplify the developer workflow, reduce configuration overhead, and unlock faster, more consistent updates. With the old methods now fully retired, we can focus all our energy on delivering new features, improving performance, and moving the platform forward.

If your project still relies on old installation methods, migrate to the new installation methods to continue updating to this and later versions of CKEditor 5.

If migrating in the near term is not feasible, you can extend support for legacy installation methods with CKEditor 5 Long Term Support (LTS).

⭐ CKEditor AI improvements

The styling of suggestion previews in AI Chat, AI Review, AI Quick Actions, and AI Translate now more closely matches the content in the editing area, providing a more consistent visual experience. Initialization has also been optimized by caching model requests, reducing redundant network calls.

Colors used across the AI package are now available through a shared CSS variable palette, making AI components easier to customize. A new programmatic API guide also describes how to interact with AI features from code.

Table improvements

The editor now recognizes legacy HTML table attributes during upcasting, preserving styling from older HTML content and improving compatibility with CKEditor 4.

  • The <table border="N"> attribute is now converted to tableBorderWidth.
  • The <table cellpadding="N"> attribute is now converted to tableCellPadding.

Several default table behaviors have also been updated:

  • Conversion of border="0" to borderless tables is now enabled by default.
  • Table alignment is now output as CSS classes by default. Using inline styles is still possible with the useInlineStyles option.
  • Support for the scope attribute in table header cells is now enabled by default.
  • Added support for table footers, thanks to a community contribution from @star-szr.

Export to PDF default version change

The Export to PDF feature now defaults to version 2 of the converter API, so you will enjoy a range of powerful enhancements right out of the box — including advanced header and footer configurations, flexible page sizing, PDF metadata editing, owner password protection, and digital signature support.

Since the new version may produce slightly different output than version 1, we recommend reviewing the new default configuration.

If you need to keep the previous behavior, simply set the version property in the exportPdf configuration object. See the feature documentation for full details on both API versions.

Unified root configuration structure

Editor configuration options related to roots, such as initialData, placeholder, and label, are now grouped under config.root for single-root editors and config.roots for multi-root editors. This provides a more consistent structure for configuring editor roots.

The previous top-level configuration options remain functional but are now deprecated. See the update guide for migration details.

Please refer to the update guide to learn more about these changes.

MAJOR BREAKING CHANGES ℹ️

  • ai, uploadcare: Simplified AI and Uploadcare configuration structures by replacing enums with plain string values. Refer to the official updating guide for AI and Uploadcare.

  • ai: Renamed the check property to commandId in the ai.chat.shortcuts configuration. Refer to the official updating guide.

  • ai: Introduced the label property in place of displayedPrompt in the ai.quickActions.extraCommands configuration. The displayedPrompt property is now required only for extra commands with type 'chat'. Refer to the official updating guide.

  • ai: Changed the type property values in the ai.quickActions.extraCommands configuration from uppercase to lowercase. Refer to the official updating guide.

  • editor-multi-root: The config.rootsAttributes and config.lazyRoots multi-root editor config options have been removed. See #19885.

    The config.roots option should be used instead to define the editor roots and their attributes.

    The config.roots.<rootName>.modelAttributes property should be used to define the attributes of a root, while
    the config.roots.<rootName>.lazyLoad property should be used to define whether a root should be lazy loaded or not.

    Note that config.roots.<rootName>.lazyLoad property is now deprecated and will be removed in the future.

  • table: Table alignment is now output as CSS classes instead of inline styles by default. See #3225.

    It can be reverted to the previous behaviour by setting the useInlineStyles configuration option to true.

  • table: Changed the default value of table.tableLayout.stripFigureFromContentTable from true to false. See #19771.

    As a result, the <figure> wrapper is now preserved on content tables by default when the layout tables feature is enabled.

  • CKEditor 5 DLL builds are no longer available due to the deprecation of legacy installation methods. See the migration path. See #17779.

  • CKEditor 5 packages no longer ship the src/, theme/ and lang/ directories on npm due to the deprecation of legacy installation methods. See the migration path. See #17779.

  • All styles previously shipped in @ckeditor/ckeditor5-theme-lark have been redistributed to the appropriate packages, which now provide those CSS assets directly.

MINOR BREAKING CHANGES ℹ️

  • core, editor-balloon, editor-classic, editor-decoupled, editor-inline, editor-multi-root: The editor no longer updates config.initialData during startup. Use config.roots.main.initialData for single-root editors and config.roots.<rootName>.initialData for multi-root editors. See #19885.

  • core, editor-balloon, editor-classic, editor-decoupled, editor-inline, editor-multi-root, watchdog: Added support for creating editors and watchdogs using configuration only, without passing a source element or initial data as the first argument. Passing a source element or initial data as the first argument is now deprecated but still supported. Use config.attachTo for ClassicEditor, config.root.element for single-root editors, and config.roots.<rootName>.element for MultiRootEditor. See #19887.

  • ai: Moved the public API from AIChat to AIChatController. This affects integrations that use the AIChat API.

  • core: The default word breaking behavior in the content area has been updated to prevent unwanted breaks in tables. If you customized the --ck-content-word-break CSS variable in your integration, migrate to the new --ck-content-overflow-wrap variable to retain the same effect. See #19986.

  • engine: Deep schema verification during model.insertContent() is now enabled by default. It is no longer behind an experimental flag. See #19217.

    Previously, this behavior required opting in via config.experimentalFlags.modelInsertContentDeepSchemaVerification: true. Now it is always active, ensuring that all elements and attributes in inserted content follow the schema - including deeply nested structures.

    If needed, you can temporarily opt out by setting config.experimentalFlags.modelInsertContentDeepSchemaVerification: false. Note that this option is deprecated and will be removed in a future release.

  • export-pdf: Export to PDF now uses version 2 of the converter API by default. This may produce slightly different output, so update any converter options to match the new API. To keep version 1, set the version property in the exportPdf configuration object.

  • import-word: The ImportWordEditing#getToken() method is now asynchronous and returns a promise.

  • mention: Mention elements in the data output now include the data-mention-uid attribute. This affects only integrations that define custom mention downcast converters. If you defined one, update it to include data-mention-uid in the output and omit it during clipboard operations; see the update guide.

  • table: The improved handling of table heading rows is now enabled by default. Rows are no longer incorrectly marked or moved as header rows when earlier rows are not header rows. See #19431.

  • table: Added new block-level left and right alignment options. The editor also recognizes equivalent inline margin styles and converts them to these alignment types. See #3225.

  • table: The shallow option used with TableUtils#setHeadingRows and TableUtils#setHeadingColumns has been renamed to updateCellType. See #19431.

  • table: Added support for importing HTML tables with the legacy border="0" attribute as borderless tables. Closes #19038.

  • table: The experimental handling of the legacy border="0" HTML attribute is now enabled by default. If you had config.experimentalFlags.upcastTableBorderZeroAttributes in your configuration, remove it because the flag is no longer recognized. See #19038.

  • track-changes: Moved TrackChangesEditing#registerBlockAttribute() and TrackChangesEditing#registerInlineAttribute() to the SuggestionConversion plugin in the ckeditor5-collaboration-core package.

    The purpose and behavior of these methods remains the same.

  • track-changes: Suggestion marker DOM elements now use the data-suggestion attribute consistently.

    This may affect custom code or CSS that relies on data-suggestion-id.

  • ui: The scope of the .ck-reset_all-excluded class has been expanded to also include the container wearing that class (e.g. to limit inheritance of font properties).

    Because of this, elements of the CKEditor user interface excluded from the CSS reset by the usage of the .ck-reset_all-excluded class may be prone to unexpected styling. Please make sure to verify the visual styling of such UI elements after updating to this version.

  • Updated to TypeScript 5.5.4.

Features

  • ai: AIChatController plugin now fires replyCreated and interactionCreated events when a new AIReply or AIChatInteraction is created.

  • ai: Added the ai.chat.context.alwaysAddSelection configuration option. When enabled, the document selection is added to the AI Chat context automatically. This option is disabled by default.

  • export-pdf: Export to PDF now uses version 2 of the converter API by default. To keep version 1, set the version property in the exportPdf configuration object.

  • footnotes: Added support for configuring the items available in the footnotes list styles dropdown. Pass the listStyles array in the configuration to choose which list styles are shown.

  • footnotes: Added support for the arabic-indic list style in footnotes. It is not shown in the dropdown by default, but it can be added to the list of available styles using the listStyles configuration option.

  • remove-format: The remove format feature now clears inherited formatting from empty paragraphs and other block elements. Closes #19851.

  • table: Introduced support for changing table cell types between data and header. Closes #16730.

  • table: Introduced support for the scope attribute in table header cells to improve semantic markup and screen reader accessibility. This feature is enabled by default and can be disabled by setting config.table.tableCellProperties.scopedHeaders to false. Closes #3175.

  • table: Added support for table footers. You can now specify the number of footer rows in a table. The table row context menu has been updated with a new Footer row toggle to control this setting. Closes #12952.

    This feature is disabled by default and can be enabled by setting config.table.enableFooters to true.

    Thanks to @star-szr.

  • table: Preserved table borders from legacy HTML content. Closes #19633.

    When loading HTML content that uses the deprecated border attribute on tables, the editor now keeps the original border width instead of ignoring it.

  • table: Preserved table cell padding from legacy HTML content. Closes #19634.

    When loading HTML content that uses the deprecated cellpadding attribute on tables, the editor now keeps the original cell padding instead of ignoring it.

Bug fixes

  • ai: Fixed an issue where new lines were ignored in the user message displayed in the AI Chat feed.

  • ai: Reset the "Show changes" button state after the balloon for an AI Quick Action is displayed.

  • ai: Fixed the incorrect order of user messages and AI agent responses in the AI Chat feed when loading a conversation from history.

  • ai: Fixed an error thrown when the user stopped an ongoing AI Chat interaction and the remaining replies were not flushed to the UI.

  • ai: Fixed a console error that could occur when AI Quick Actions were closed during response streaming.

  • ai: Fixed an error thrown by CKEditor AI features when processing content that contains mentions. See #20010.

  • comments: Fixed inline annotations so they stay attached to the target element when it scrolls inside its parent container.

  • code-block: Fixed inconsistent vertical spacing around code blocks in the content area. Code blocks now use explicit vertical margins that match other block widgets. Closes #19982.

  • core: Fixed excessive word breaking in tables rendered in the content area. Words will now only break when they genuinely overflow their container, preventing awkward splits in narrow table columns. Closes #19986.

  • engine: Removed the unintended public exports autoParagraphEmptyRoots, isParagraphable, and wrapInParagraph.

    These utilities were not part of the supported public API.

  • engine: Gradients in background styles are no longer ignored and are properly normalized. Closes #19787.

  • engine: Fixed background normalization so it no longer drops layers from the background CSS shorthand. Multi-layer backgrounds are now parsed and serialized correctly. See #19787.

  • footnotes: Fixed the footnotes configuration typings to use defaultListStyle instead of defaultStyle.

  • import-word: Improved the initialization time of the ImportWordEditing plugin. Token retrieval now runs in the background, so it does not block editor startup.

  • link: Removed the unintended public export ensureSafeUrl.

    This utility was not part of the supported public API.

  • real-time-collaboration: Fixed the inconsistent font family in collaboration user markers.

  • show-blocks: Fixed the Show blocks feature so block labels render in all editor types when the dir attribute is present either on the editable element itself or on its ancestor wrapper. Closes #19866.

  • track-changes: Fixed suggestion marker DOM elements that used data-suggestion-id instead of data-suggestion.

  • ui: Updated the CSS reset rules so .ck-reset_all-excluded also applies to the container that uses this class. Closes #19967.

    This change reduces the impact of the CKEditor's .ck-reset_all class in DOM elements that are explicitly excluded from the reset by the .ck-reset_all-excluded class.

  • ui: Disabling a menu bar menu now also closes it if it was open, preventing an open panel from remaining in a non-interactive state. Closes #18214.

Other changes

  • core, editor-balloon, editor-classic, editor-decoupled, editor-inline, editor-multi-root, watchdog: Reorganized root-related editor configuration under config.root for single-root editors and config.roots for multi-root editors. Closes #19885.

    The config.initialData, config.placeholder, and config.label options are deprecated in favor of config.root.initialData, config.root.placeholder, and config.root.label.
    In multi-root editors, define these options per root using config.roots.<rootName>.initialData, config.roots.<rootName>.placeholder, and config.roots.<rootName>.label.

  • paste-from-office, table: Introduced new table block alignments, blockLeft and blockRight, allowing tables to be aligned to the left or right without text wrapping. The table properties balloon now includes two new buttons to easily apply these alignments. Closes #3225, #6174, #8412, #8752, #9982, #10867, #14921, #17932, #19337.

    Added additional spacing between a table and the surrounding text when wrapping is enabled. This prevents issues such as list markers overlapping with the table when placed next to each other.

    Added support for pasting to and from MS Word for all table alignment types: left, right, center, blockLeft, and blockRight.

  • collaboration-core, track-changes: Moved TrackChangesEditing#registerBlockAttribute() and TrackChangesEditing#registerInlineAttribute() to the SuggestionConversion plugin in the ckeditor5-collaboration-core package.

  • ai: AIChatController is now a public class. Moved public API from AIChat to AIChatController to avoid duplication.

  • ai: Decreased the line height in the AI Chat prompt input field to match feed messages.

  • ai: AIChat#addSelectionToChatContext() now returns void instead of Promise.

  • ai: Suggestion previews in AI features now follow the styling of the content in the editing area more closely.

  • ai: Optimized AI features initialization by caching model requests, reducing redundant network calls and improving load performance.

  • ai: Improved handling of agent responses in the Markdown format.

  • ai: Marked selected AI programmatic APIs as experimental. These APIs are production-ready but may change in minor releases without the standard deprecation policy.

  • ai: Added a shared CSS variable palette for colors used across the ckeditor5-ai package.

    This makes AI components easier to customize.

  • ai: Removed the built-in Amazon Bedrock integration in the legacy AI Assistant. The AWSTextAdapter class remains available but now throws an error when used, and this change does not affect CKEditor AI. If you rely on this integration, contact support.

  • ckbox: Fixed an issue where the CKBox dialog was not visible in fullscreen mode. Closes #19290.

  • engine: Model#hasContent() can now check ModelSelection and ModelDocumentSelection instances. See #19847.

  • markdown-gfm: Enhanced MarkdownGfmMdToHtml to support custom plugins and to export the default plugin chain used by the Markdown parser.

  • utils: Introduced Rect.getDomElementRects() method that conveniently retrieves all Rects of a DOM element while preserving their source for further processing (e.g. Rect#getVisible()).

  • Replaced string-based soft requirements with plugin constructors across selected packages to improve developer experience and align plugin dependency handling across repositories. This update also adjusts package metadata and dependencies to match the new constructor-based requirements. See #17779. Closes #19747.

    The following dependencies no longer rely on soft requirements:

    • ckeditor5-ai: CloudServices.
    • ckeditor5-ckbox: LinkEditing, PictureEditing, ImageUtils, ImageEditing, ImageUploadEditing, ImageUploadProgress, CloudServices.
    • ckeditor5-ckfinder: Link, LinkEditing, CKFinderUploadAdapter.
    • ckeditor5-easy-image: CloudServices, ImageUpload.
    • ckeditor5-emoji: Mention.
    • ckeditor5-export-pdf: CloudServices.
    • ckeditor5-export-word: CloudServices.
    • ckeditor5-heading: Paragraph.
    • ckeditor5-import-word: CloudServices.
    • ckeditor5-link: ImageEditing, ImageUtils, ImageBlockEditing.
    • ckeditor5-list-multi-level: ListEditing.
    • ckeditor5-merge-fields: ImageUtils, ImageEditing, Mention.
    • ckeditor5-paste-from-office-enhanced: PasteFromOffice.
    • ckeditor5-real-time-collaboration: Comments, CommentsRepository, CloudServices, RevisionHistory, TrackChanges, TrackChangesEditing.
    • ckeditor5-revision-history: Users.
    • ckeditor5-slash-command: Mention.
    • ckeditor5-style: GeneralHtmlSupport.
    • ckeditor5-track-changes: Comments, CommentsRepository, Annotations, EditorAnnotations.
    • ckeditor5-typing: Delete, Input.
    • ckeditor5-uploadcare: PictureEditing, ImageUploadEditing, ImageUploadProgress, ImageEditing, ImageUtils.
  • Updated es-toolkit to v1.45.1.

  • Updated translations.

Released packages

Check out the Versioning policy guide for more information.

Released packages (summary)

Major releases (contain major breaking changes):

Minor releases (contain minor breaking changes):

Releases containing new features:

Other releases:

Don't miss a new ckeditor5 release

NewReleases is sending notifications on new releases.