🐛 Bug Fix
- Search (Ctrl+F): pressing Enter in the search input submitted the parent
<form>instead of jumping to the next match — thepreventDefault()for Enter lived inside a debounced handler, so it ran only after the browser had already dispatched the form submission. Enter is now canceled synchronously, while the search logic itself stays debounced. Fixes #918. - i18n / language bundles: translations for keys that were missing from
ar.jsnever reached the build — the master i18n key list was generated only fromar.js, and every other language is serialized as an array indexed by that list, so existing translations for the ordered-list menu items (Lower Alpha, Lower Greek, Lower Roman, Upper Alpha, Upper Roman — translated in de/es/fi/it/ja/pt_br) and a dozen other keys were silently dropped from every bundle. The key list is now built as the union of all language files. Fixes #997. - Custom
ownerWindow(editor created inside an iframe): UI components (toolbar collection, popups, dialogs) always kept the globalwindowas their owner window instead of the configured one. Popup/dropdown outside-click close handlers were therefore bound to the wrong window — clicks inside the iframe never reached them, so toolbar dropdowns did not close on an outside click.ViewComponentnow inherits the owner window from its parent view. Fixes #965. - Toolbar content controls (
getContent): controls rendered throughgetContent(e.g. the FileBrowser Upload button) never ran the status calculation, so theirisDisabled/isActive/updatecallbacks were silently ignored — the Upload button stayed enabled even when the backend permissions (canI('FileUpload')) said otherwise.ToolbarContent.update()now evaluates the control's status like regular toolbar buttons and also propagates the disabled state to nested form controls (the file<input>of the Upload button). Thanks @WatchfulEyeOfZod for the diagnosis and the patch draft. Fixes #1094. - Inline toolbar / Iframe mode: with
iframe: truethe selection toolbar (toolbarInlineForSelection) opened far away from the selected text — the popup was positioned byrange.getBoundingClientRect(), whose coordinates are iframe-local, while the popup itself lives in the host document. The iframe offset is now added to the selection bound. Fixes #1058. - Paste toolbar button: the Paste from clipboard toolbar button inserted only the plain text flavor of the clipboard, while Ctrl+V pasted the full HTML — the button explicitly requested
text/plainfromnavigator.clipboard.read()even whentext/htmlwas available. The button now prefers the HTML flavor (falling back to plain text), so both paste paths behave the same. Fixes #1061. - Format block (H1–H6 / paragraph): applying a heading to a block pasted from an external source seemed to do nothing — the tag actually changed, but leftover inline styles like
font-weight: normal; font-size: 24pxvisually overrode the new format, so an<h2>looked exactly like the old text. When a block format is applied, the conflictingfont-size/font-weightinline styles are now removed from the block (other styles like color stay). Fixes #1063. - Backspace/Delete next to a table: pressing Backspace at the start of a paragraph that follows a table (or Delete at the end of a paragraph before one) merged the paragraph's text into the
<table>element itself — it landed after</tbody>, which is invalid HTML; on the next parse the browser foster-parents such content out of the table, corrupting the document and causing follow-up DOM errors (theFailed to execute 'appendChild'console spam from the report). The join logic now merges the text into the edge table cell (last cell for Backspace, first for Delete). Covers #1064. - Paste from Word (
askBeforePasteFromWord): office content was frequently mis-detected as plain HTML, so the generic Paste as HTML dialog appeared instead of the Word one. The detector only matched aMicrosoft Word Nmeta generator ormso-styles in double quotes combined with<font>tags — while the raw Word clipboard fragment uses single-quotedstyle='mso-…', unquotedclass=MsoNormal, an unquotedProgIdmeta and office XML namespaces (and modern Word emits no<font>at all); LibreOffice/OpenOffice content was never detected. The detector now also recognizes all of these markers. Fixes #1078. - Drag and drop (
enableDragAndDropFileToEditor: false): dropping a file (e.g. a JPG from another window) into the editor still embedded it — with the option off no handler was bound to thedropevent, nothing calledpreventDefault, and Firefox inserted the dropped image natively. With the option disabled the editor now cancels file drops, so they do nothing — as the option promises. Fixes #1077. - AI Assistant: the Insert After button placed the generated text after the first node of the selection — with several selected paragraphs the result landed inside/after the first paragraph instead of after the whole selection. The insertion point is now the collapsed end of the selection, so the result follows everything that was selected; single-word/sentence behavior is unchanged. Fixes #1263.
- Color / Select cells: applying a text or background color from the main toolbar to table cells selected with the
select-cellsplugin (click or drag-select a cell — typical for tables pasted from Word) silently did nothing: the cell selection drops or collapses the native range, so the color was committed as a pending caret format in an empty<span>outside the table. When cells are selected and the native selection is collapsed, theforecolor/backgroundcommands now recolor the content of every selected cell (including nested spans carrying their own Word colors). Fixes #1250. - Shadow DOM / Table: clicking a table cell inside a Shadow DOM editor (the
shadowRootoption, e.g. a Stencil/web component integration) never opened the cell properties popup (background, vertical align, split/merge, add/remove row & column).document.elementFromPointdoes not pierce shadow boundaries — it returns the shadow host — so theselect-cellsplugin could not find the clicked cell onmouseup. The hit-testing now starts from the configured shadow root inselect-cells(cell selection on click and drag-select),add-new-line(the Break line over tables/images) andPopup.getKeepBound. Fixes #1312.