CKEditor 5 toolbar overflow can become unusable in Off canvas

Created on 19 December 2022, over 1 year ago
Updated 19 May 2024, about 1 month ago

Problem/Motivation

When there are many items in the toolbar of CKEditor5, the buttons are relegated into a drop-down menu. However, depending on how many items there are, this can get clipped in Drupal's off-canvas:

Steps to reproduce

  1. Enable the Layout Builder, Node and Block Content modules.
  2. Create a block type that has a formatted text field.
  3. Create a CKEditor5 editor configuration with many buttons.
  4. Create a node type and enable the layout builder.
  5. Edit the layout.
  6. Hit the Add block button to an existing section to bring out the off-canvas dialog.
  7. Hit Create a custom block.
  8. (If there are multiple block types on the site) Choose the block type that has a formatted text field.
  9. Open the overflow menu drop-down, see that is is clipped and partially unusable.

Proposed resolution

Change the value of --ck-toolbar-dropdown-max-width variable to be relative to the width of the editor instance.

This can be achieved with CSS container queries as follows.

.ck.ck-editor {
  container-type: inline-size;
  container-name: ck-editor;
}


@container ck-editor (width > 0) {
  .ck-dropdown__panel {
    --ck-toolbar-dropdown-max-width: 90cqw;
  }
}

Remaining tasks

  • Review.
  • Commit.

User interface changes

The dropdown width will always be less than the editor width, ensuring that it never gets clipped if the editor is in a div with overflow: hidden; like off-canvas.

Before:


After:


API changes

None.

Data model changes

None.

Release notes snippet

None.

๐Ÿ› Bug report
Status

Needs work

Version

11.0 ๐Ÿ”ฅ

Component
CKEditor 5ย  โ†’

Last updated about 5 hours ago

Created by

๐Ÿ‡ฌ๐Ÿ‡งUnited Kingdom Wongjn

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Merge Requests

Comments & Activities

Not all content is available!

It's likely this issue predates Contrib.social: some issue and comment data are missing.

  • ๐Ÿ‡ฎ๐Ÿ‡ณIndia ravi kant Jaipur

    The solution of remove dropdown of extra tools in CKEditor is providing by CKEditor and it is "Button divider". It will break the CKEditor toolbar in next line.

    How to use?

    1. Edit preferred "Text Format". Mostly using Full-HTML.
    2. Navigate to "Toolbar configuration"
    3. Find the "button divider" at the right-top of the active-toolbar. There are two types of button dividers. 1. Divider 2. Wrapper
    4. Drage the wrapper divider and place it on the active toolbar where the next line will be starting.
  • ๐Ÿ‡ฎ๐Ÿ‡ณIndia ravi kant Jaipur
  • Status changed to Active 11 months ago
  • ๐Ÿ‡บ๐Ÿ‡ธUnited States smustgrave

    Moving to active as there is nothing to review

    #9 seems to describe building a text editor to be narrow and only have a few buttons each line vs responsive, which I believe was the discussion before.

    Correct me if I'm wrong.

  • ๐Ÿ‡บ๐Ÿ‡ธUnited States smustgrave

    tried #6 but didn't seem to work for me.

  • Open on Drupal.org โ†’
    Environment: PHP 8.2 & MySQL 8
    last update 10 months ago
    Not currently mergeable.
  • @smustgrave opened merge request.
  • last update 10 months ago
    30,146 pass
  • Status changed to Needs work 10 months ago
  • ๐Ÿ‡บ๐Ÿ‡ธUnited States smustgrave

    Found the css causing the issue. It's from ckeditor5. It's applying width: max-content.

    I'm overriding that and seems to work but sure it's not ideal. Thoughts?

  • ๐Ÿ‡ช๐Ÿ‡จEcuador jwilson3

    I was already experiencing this on a site with Layout Builder + CKEditor 4 and my workaround was to just widen the LB sidebar flyout. The edge of the flyout is drag-enabled in some contexts, (but I did notice unfortunately not all contexts, though I cannot now remember where it was set to a fixed width). IMHO, the flyout should almost always be wider especially on larger screens. If you're editing a block in an LB page, there is not much use to still need to be able to view the entire layout builder, so it could easily be a flyout that overlays the main page content.

  • ๐Ÿ‡บ๐Ÿ‡ธUnited States bkosborne New Jersey, USA

    I think this is a legit bug, but the workaround to get this behaving as it did in CKE4 is mentioned in #9. Just add the "wrapping" button divider anywhere in the toolbar (even as the last item). That will prevent CKE5 from trying to render everything on one completely.

  • ๐Ÿ‡ง๐Ÿ‡ชBelgium RandalV

    Thanks to #9 and #16, I can confirm that adding the "wrap"-item even as the last item on the bar is a solid workaround until a permanent fix can be provided.
    It wraps the excessive items neatly on a second row (as was the behaviour in CKEditor4 if I'm not mistaken).

  • Redwan Jamous โ†’ made their first commit to this issueโ€™s fork.

  • Pipeline finished with Failed
    about 1 month ago
    Total: 182s
    #174289
  • Status changed to Needs review about 1 month ago
  • Created a MR that fixes the issue using CSS container queries.
    The --ck-toolbar-dropdown-max-width variable will be set to 90% of the editor's width instead of 60% of the viewport's width.

    Adding a patch file to use with composer...

  • Redwan Jamous โ†’ changed the visibility of the branch 3328095-ckeditor-5-toolbar to hidden.

  • Redwan Jamous โ†’ changed the visibility of the branch 11.x to hidden.

  • Status changed to Needs work about 1 month ago
  • ๐Ÿ‡บ๐Ÿ‡ธUnited States smustgrave

    If a new solution is being proposed issue summary should match.

    Also before/after screenshots need to be added to the issue summary.

  • Pipeline finished with Failed
    about 1 month ago
    Total: 168s
    #175445
  • Status changed to Needs review about 1 month ago
  • Thank you, @smustgrave! I'm updating the issue summary...

    Unfortunately, the previous fix doesn't work well while source editing mode in CKEditor is active.

    To overcome the issue, the container can be the parent element (.ck.ck-editor) instead of .ck.ck-editor__top.

    However, changing the css from:

    .ck.ck-editor__top {
      container-type: inline-size;
      container-name: ck-editor;
    }
    
    @container ck-editor (width > 0) {
      .ck-dropdown__panel {
        --ck-toolbar-dropdown-max-width: 90cqw;
      }
    }
    

    To:

    .ck.ck-editor {
      container-type: inline-size;
      container-name: ck-editor;
    }
    
    @container ck-editor (width > 0) {
      .ck-dropdown__panel {
        --ck-toolbar-dropdown-max-width: 90cqw;
      }
    }
    

    isn't enough because off-canvas reset (core/misc/dialog/off-canvas/css/reset.pcss.css) is applying all: revert; with higher specificity which will overwrite our container-type and container-name.

    Adding .ck-editor to the list of elements excluded from the off-canvas reset rules would fix the issue, but I'm not sure about this change.

    We currently have the following selector in off-canvas reset:

    #drupal-off-canvas-wrapper *:where(:not(svg, svg *, .ck-reset *, [data-drupal-ck-style-fence] *, .ui-resizable-handle))

    We're excluding all children elements of .ck-reset but not .ck-reset itself (unlike svg).

    The new proposed selector:
    #drupal-off-canvas-wrapper *:where(:not(svg, svg *, .ck-reset, .ck-reset *, [data-drupal-ck-style-fence] *, .ui-resizable-handle))

    Also, CSS linting checks are failing because of the cqw unit, so I will be creating a separate issue to add container query units to the allowed units since they're now supported in all major browsers.

  • Status changed to Needs work about 1 month ago
  • ๐Ÿ‡บ๐Ÿ‡ธUnited States smustgrave

    Thanks for updating. Appears to have some failures in MR.

  • Pipeline finished with Failed
    25 days ago
    Total: 1176s
    #190668
Production build 0.69.0 2024