From 03dcf5e46ac275dcd230285f2b224afa3350c771 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 11 Aug 2026 11:57:33 +1000 Subject: [PATCH 01/19] TINYDOC-3570 - Populate TinyMCE 8.9.0 release date --- modules/ROOT/pages/8.9.0-release-notes.adoc | 2 +- modules/ROOT/pages/changelog.adoc | 2 +- modules/ROOT/partials/misc/supported-versions.adoc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index bfefea556f..30243b6272 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -11,7 +11,7 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] [[overview]] == Overview -{productname} {release-version} was released for {enterpriseversion} and {cloudname} on ,
^^, . These release notes provide an overview of the changes for {productname} {release-version}, including: +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, August 26^th^, 2026. These release notes provide an overview of the changes for {productname} {release-version}, including: // Remove sections and section boilerplates as necessary. // Pluralise as necessary or remove the placeholder plural marker. diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index c83dbb5fce..87c302e0eb 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,7 +4,7 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. -== xref:8.9.0-release-notes.adoc[8.9.0 - ] +== xref:8.9.0-release-notes.adoc[8.9.0 - 2026-08-26] //TODO diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index 31f91c7250..c9d9ef6d69 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -6,7 +6,7 @@ Supported versions of {productname}: [cols="^,^,^",options="header"] |=== |Version |Release Date |End of Premium Support -|8.9 | | +|8.9 |2026-08-26 |2028-02-26 |8.8 |2026-07-15 |2028-01-15 |8.7 |2026-06-30 |2027-12-30 |8.6 |2026-06-03 |2027-12-03 From bbb021dc85f5c643b06c729f9f183b89add61c50 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 10:43:38 +1000 Subject: [PATCH 02/19] TINYDOC-3570: Opening or closing a sidebar from the toolbar scrolled the editor to the selection. (#4324) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 30243b6272..7ad08f93a6 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -160,6 +160,15 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a // CCFR here. +=== Opening or closing a sidebar from the toolbar scrolled the editor to the selection +// #TINYMCE-14765 + +Previously, opening or closing a sidebar from a toolbar button scrolled the editor content to the current selection when the editor was not focused. Toggling a sidebar is not a content operation, so the viewport moved away from the part of the document the user was reading. + +In {productname} {release-version}, toggling a sidebar from the toolbar no longer scrolls the selection into view. This applies to every sidebar registered through `+editor.ui.registry.addSidebar+`. Commands that change content, such as _Bold_, continue to focus the editor and scroll to the selection as before. + +The xref:apis/tinymce.editor.adoc#focus[`+editor.focus()+`] method also accepts an object argument, so callers can focus the editor without scrolling the selection into view, as in `+editor.focus({ scrollToSelection: false })+`. The `+scrollToSelection+` property defaults to `+true+`, and passing a boolean continues to behave as before. + [[security-fixes]] == Security fixes From 3615679c84ad559985917592e3f88deea1b08a22 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 10:43:56 +1000 Subject: [PATCH 03/19] TINYDOC-3570: The Help dialog lists plugins with invalid metadata as plain text. (#4323) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 7ad08f93a6..fbf6149839 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -116,6 +116,13 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a // CCFR here. +=== The Help dialog lists plugins with invalid metadata as plain text +// #TINYMCE-14730 + +Previously, the _Plugins_ tab of the xref:help.adoc[Help] dialog used the metadata returned by a plugin without checking that the expected fields were present and of the expected type. A plugin that supplied a name but no URL was still rendered as a link, and selecting that link navigated to `+/undefined+`. + +In {productname} {release-version}, the Help dialog checks the metadata a plugin supplies before rendering it. A plugin whose metadata is missing or of an unexpected type is listed as plain text rather than as a link, using the plugin name where one is supplied, and the plugin identifier where one is not. + [[additions]] == Additions From 45ad4b01aeca76d4dab8fddca2fe27acec203895 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 10:46:14 +1000 Subject: [PATCH 04/19] TINYDOC-3570: Scroll position is preserved between the editor content and the AI preview. (#4322) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index fbf6149839..de6e2653a9 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -71,6 +71,21 @@ The {productname} {release-version} release includes an accompanying release of For information on the **** plugin, see: xref:.adoc[]. +=== TinyMCE AI + +The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin. + +**TinyMCE AI** includes the following improvement. + +==== Scroll position is preserved between the editor content and the AI preview +// #TINYMCE-14769 + +Previously, the scroll position was not carried between the editor content and the AI preview. Opening the preview, running a review, or applying a quick action could move the viewport away from the part of the document being worked on, so users lost their place. + +In {productname} {release-version}, the **TinyMCE AI** plugin records the content block nearest to the current scroll position and restores the view to that block. The position is preserved when opening the preview, running a review, and applying a quick action, and it is restored to the same block even when the content is a different height in the editor and in the preview. + +For information on the **TinyMCE AI** plugin, see: xref:tinymceai.adoc[TinyMCE AI]. + [[accompanying-premium-plugin-end-of-life-announcement]] == Accompanying Premium plugin end-of-life announcement From 1fe0d3628b330a73039455711ee94bc400555288 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 10:59:48 +1000 Subject: [PATCH 05/19] TINYDOC-3570: The tinymceai_chat_fetch_sources option can now nominate default sources for chat conversations. (#4318) * TINYDOC-3570 - Add the tinymceai_chat_default_sources option and its 8.9.0 release note Documents the new TinyMCE AI chat option and adds the accompanying release note entry for the 8.9.0 release. Covers TINYDOC-3561 (option reference section) and TINYMCE-14703. * TINYDOC-3570: The tinymceai_chat_fetch_sources option can now nominate default sources for chat conversations. * Update modules/ROOT/partials/configuration/tinymceai_options.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/8.9.0-release-notes.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/8.9.0-release-notes.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/8.9.0-release-notes.adoc Co-authored-by: tiny-ben-tran * TINYDOC-3570: Align the option reference with the menu array structure. * TINYDOC-3570: Fix template literal interpolation in the TinyMCE AI examples. * TINYDOC-3570: Fix broken literal syntax issue causing rendering issues. --------- Co-authored-by: tiny-ben-tran --- modules/ROOT/pages/8.9.0-release-notes.adoc | 15 ++++- modules/ROOT/pages/tinymceai-chat.adoc | 6 +- modules/ROOT/pages/tinymceai.adoc | 4 +- .../configuration/tinymceai_options.adoc | 62 ++++++++++++++++--- 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index de6e2653a9..ce3d82bd3c 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -75,7 +75,20 @@ For information on the **** plugin, see: xref: { - const res = await fetch(`/api/documents/\$\{id\}`); + const res = await fetch(`/api/documents/${id}`); const blob = await res.blob(); - const filename = `\$\{id\}.pdf`; + const filename = `${id}.pdf`; return { type: 'file', file: new File([blob], filename, { type: blob.type }) }; }, // Required for authentication diff --git a/modules/ROOT/pages/tinymceai.adoc b/modules/ROOT/pages/tinymceai.adoc index b32c601b9b..8aca2f5dd8 100644 --- a/modules/ROOT/pages/tinymceai.adoc +++ b/modules/ROOT/pages/tinymceai.adoc @@ -93,9 +93,9 @@ tinymce.init({ } ], tinymceai_chat_fetch_source: async (id) => { - const res = await fetch(`/api/documents/\$\{id\}`); + const res = await fetch(`/api/documents/${id}`); const blob = await res.blob(); - const filename = `\$\{id\}.pdf`; + const filename = `${id}.pdf`; return { type: 'file', file: new File([blob], filename, { type: blob.type }) }; }, tinymceai_quickactions_custom: [ diff --git a/modules/ROOT/partials/configuration/tinymceai_options.adoc b/modules/ROOT/partials/configuration/tinymceai_options.adoc index 49d736a774..703b64d623 100644 --- a/modules/ROOT/partials/configuration/tinymceai_options.adoc +++ b/modules/ROOT/partials/configuration/tinymceai_options.adoc @@ -178,17 +178,28 @@ These options configure the AI Chat sidebar, where users have interactive conver [[tinymceai_chat_fetch_sources]] === `+tinymceai_chat_fetch_sources+` -Populates the sources menu with submenus of files and web resources. Users can select these sources as additional context for chat conversations. +Populates the sources menu with submenus of files and web resources. Users can select these sources as additional context for chat conversations. The option can also nominate default sources, which the {pluginname} plugin adds to the context of every new conversation. -Takes a function that returns a Promise resolving to an array of additional context source groups. Each group has `+label+`, optional `+icon+`, and `+sources+` array. Each source has `+id+`, `+label+`, and `+type+` (`+'web-resource'+` or `+'file'+`). A source's `+id+` is used to fetch its content through xref:tinymceai.adoc#tinymceai_chat_fetch_source[`tinymceai_chat_fetch_source`]. +Takes a function that returns a Promise resolving to either of the following: -*Type:* `+Function+` (`+() => Promise+`) +* An array of source groups. +* An object with a `+menu+` property, holding the array of source groups, and a `+defaults+` property, holding an array of source identifiers. + +Each source group has `+label+`, optional `+icon+`, and `+sources+` array. Each source has `+id+`, `+label+`, and `+type+` (`+'web-resource'+` or `+'file'+`). A source's `+id+` is used to fetch its content through xref:tinymceai.adoc#tinymceai_chat_fetch_source[`tinymceai_chat_fetch_source`]. + +Both shapes are supported. Returning an array populates the sources menu without nominating any default sources. + +Each identifier listed in `+defaults+` must match the `+id+` of a source listed in `+sources+`. The plugin adds each matching source to the context of every new conversation, and shows it as selected in the sources menu. Identifiers without a matching source are not added to the context, and the plugin logs an error in the browser console. Users can remove a default source from a conversation and add it again from the sources menu. + +If `+menu+` is missing or empty, the plugin logs an error in the browser console and populates no sources. + +*Type:* `+Function+` (`+() => Promise+`) *Possible Values:* For source `+type+` property: `+'web-resource'+`, `+'file'+` *Default value:* `+() => Promise.resolve([])+` -.Example +.Example: populating the sources menu [source,js] ---- tinymce.init({ @@ -206,9 +217,42 @@ tinymce.init({ } ], tinymceai_chat_fetch_source: async (id) => { - const res = await fetch(`/api/documents/\$\{id\}`); + const res = await fetch(`/api/documents/${id}`); + const blob = await res.blob(); + const filename = `${id}.pdf`; + return { type: 'file', file: new File([blob], filename, { type: blob.type }) }; + }, + // Required for authentication + tinymceai_token_provider: () => { + return fetch('/api/token').then(r => r.json()); + } +}); +---- + +.Example: nominating default sources +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'tinymceai', + toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review', + tinymceai_chat_fetch_sources: async () => ({ + defaults: [ 'doc-1' ], + menu: [ + { + label: 'My Documents', + icon: 'folder', + sources: [ + { id: 'doc-1', label: 'Style guide', type: 'file' }, + { id: 'url-1', label: 'Web Page', type: 'web-resource' } + ] + } + ] + }), + tinymceai_chat_fetch_source: async (id) => { + const res = await fetch(`/api/documents/${id}`); const blob = await res.blob(); - const filename = `\$\{id\}.pdf`; + const filename = `${id}.pdf`; return { type: 'file', file: new File([blob], filename, { type: blob.type }) }; }, // Required for authentication @@ -227,7 +271,7 @@ A function that fetches the content for an additional source by ID. Receives the *Possible Values:* For return object `+type+` property: `+'file'+`, `+'web-resource'+` -*Default value:* `+(id) => Promise.resolve(\`Should fetch additional source with given \$\{id\}\`)+` +*Default value:* `+++(id) => Promise.resolve(`Should fetch additional source with given ${id}`)+++` .Example [source,js] @@ -240,9 +284,9 @@ tinymce.init({ { label: 'Docs', sources: [{ id: 'doc-1', label: 'Document 1', type: 'file' }] } ], tinymceai_chat_fetch_source: async (id) => { - const res = await fetch(`/api/documents/\$\{id\}`); + const res = await fetch(`/api/documents/${id}`); const blob = await res.blob(); - const filename = `\$\{id\}.pdf`; + const filename = `${id}.pdf`; return { type: 'file', file: new File([blob], filename, { type: blob.type }) }; }, // Required for authentication From 253d84ae1d4ef57defd9cbfe391fac627d4a2279 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 11:06:54 +1000 Subject: [PATCH 06/19] Docs: TINYMCE-13659 - Improved error message shown when the chat prompt exceeds the maximum length (#4315) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index ce3d82bd3c..d9d17ae3ec 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -75,7 +75,14 @@ For information on the **** plugin, see: xref: Date: Wed, 26 Aug 2026 11:15:40 +1000 Subject: [PATCH 07/19] Docs: TINYMCE-13738 - Image with empty alt text would add role="presentation" instead of adding alt text when updated (#4313) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index d9d17ae3ec..c195970c34 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -202,6 +202,13 @@ In {productname} {release-version}, the Help dialog checks the metadata a plugin // CCFR here. +=== Image with empty alt text would add `+role="presentation"+` instead of adding alt text when updated +// #TINYMCE-13738 + +Previously, the xref:image.adoc[Image] plugin treated any image with an empty `+alt+` attribute as decorative. When xref:image.adoc#a11y_advanced_options[`+a11y_advanced_options+`] was disabled, the _Insert/Edit Image_ dialog did not show the *Image is decorative* option, so the dialog offered no way to change that state. Entering alternative text for such an image and saving the dialog applied `+role="presentation"+` and left the `+alt+` attribute empty, discarding the text that had been entered. + +In {productname} {release-version}, the Image plugin marks an image as decorative only when the _Insert/Edit Image_ dialog presents the accessibility options. Entering alternative text for an image with an empty `+alt+` attribute now applies that text to the image. + === Opening or closing a sidebar from the toolbar scrolled the editor to the selection // #TINYMCE-14765 From d1244265bf7572664ba392ebd742ecb26dda7a19 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 11:37:54 +1000 Subject: [PATCH 08/19] TINYDOC-3570: Improved error messages shown when adding a file context source fails. (#4319) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index c195970c34..057030fc1e 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -77,6 +77,19 @@ The {productname} {release-version} release includes an accompanying release of **TinyMCE AI** includes the following addition and improvements. +==== Improved error messages shown when adding a file context source fails +// #TINYMCE-13660 + +Previously, when the AI service rejected a file added as a context source in the Chat sidebar, the sidebar reported the failure using the message returned by the service, such as `+Content too large+`. Those messages described the service response rather than the file, so users could not tell which property of the file caused the failure, or what to try instead. + +In {productname} {release-version}, the **TinyMCE AI** plugin shows a message for each file failure it can identify: + +* A file that is too large reports `+This file is too large to add. Try a smaller one.+` +* A file with too many pages reports `+This file has too many pages to process. Try one with fewer pages.+` +* A file of an unsupported type reports `+This file type isn't supported. Try a different file.+` + +When the cause cannot be identified, the plugin shows `+This file can't be added. Try a smaller file, or a different file type.+` + ==== Improved error message shown when the chat prompt exceeds the maximum length // #TINYMCE-13659 From abab62f734f3e7db241deba676cfcc0676602bc1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 11:49:39 +1000 Subject: [PATCH 09/19] Docs: TINYMCE-14747 - New commands for running reviews (#4312) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 ++ .../partials/commands/tinymceai-cmds.adoc | 65 ++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 057030fc1e..36a7d76a50 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -77,6 +77,13 @@ The {productname} {release-version} release includes an accompanying release of **TinyMCE AI** includes the following addition and improvements. +==== New commands for running reviews +// #TINYMCE-14747 + +In {productname} {release-version}, the **TinyMCE AI** plugin registers an editor command for each built-in review, such as `+TinyMCEAIReviewProofread+` and `+TinyMCEAIReviewToneProfessional+`. The plugin also registers the `+TinyMCEAIReviewCustom+` command, which runs a review from a custom prompt or runs an integrator-defined review by identifier. Each command opens the Review sidebar and runs the review, with the same result as selecting that review in the sidebar. Previously, a review could only be started from the Review sidebar, so integrations could not start one from their own interface. + +For the command identifiers and the values accepted by `+TinyMCEAIReviewCustom+`, see xref:editor-command-identifiers.adoc#tinymceai-plugin-commands[TinyMCE AI plugin commands]. + ==== Improved error messages shown when adding a file context source fails // #TINYMCE-13660 diff --git a/modules/ROOT/partials/commands/tinymceai-cmds.adoc b/modules/ROOT/partials/commands/tinymceai-cmds.adoc index fe4779afcd..333d7401e2 100644 --- a/modules/ROOT/partials/commands/tinymceai-cmds.adoc +++ b/modules/ROOT/partials/commands/tinymceai-cmds.adoc @@ -24,7 +24,7 @@ NOTE: These commands work regardless of xref:tinymceai.adoc#tinymceai_sidebar_ty [[tinymceai-plugin-commands]] == TinyMCE AI plugin commands -The xref:tinymceai.adoc[`tinymceai`] plugin registers the following editor commands. They mirror the Quick Actions and related UI: each invocation returns immediately while the plugin performs any network and UI work asynchronously. +The xref:tinymceai.adoc[`tinymceai`] plugin registers the following editor commands. They mirror the Quick Actions, Chat, and Review user interface: each invocation returns immediately while the plugin performs any network and UI work asynchronously. [cols="2,2,3",options="header"] |=== @@ -46,8 +46,21 @@ The xref:tinymceai.adoc[`tinymceai`] plugin registers the following editor comma |`+TinyMCEAIQuickActionsSummarize+` | |Opens Chat with the built-in **Summarize** prompt. |`+TinyMCEAIQuickActionsHighlightKeyPoints+` | |Opens Chat with the built-in **Highlight key points** prompt. |`+TinyMCEAIChatPrompt+` |`+{ prompt, displayedPrompt? }+` |Opens the Chat sidebar if needed, then sends `+prompt+` to the back end. Optional `+displayedPrompt+` controls the label shown in the chat UI when it differs from the text sent to the model. +|`+TinyMCEAIReviewProofread+` | |Runs the **Proofread** review. +|`+TinyMCEAIReviewClarity+` | |Runs the **Improve clarity** review. +|`+TinyMCEAIReviewReadability+` | |Runs the **Improve readability** review. +|`+TinyMCEAIReviewMakeLonger+` | |Runs the **Change length** review with the **Longer** option. +|`+TinyMCEAIReviewMakeShorter+` | |Runs the **Change length** review with the **Shorter** option. +|`+TinyMCEAIReviewToneCasual+` | |Runs the **Adjust tone and style** review with the **Casual** tone. +|`+TinyMCEAIReviewToneDirect+` | |Runs the **Adjust tone and style** review with the **Direct** tone. +|`+TinyMCEAIReviewToneFriendly+` | |Runs the **Adjust tone and style** review with the **Friendly** tone. +|`+TinyMCEAIReviewToneConfident+` | |Runs the **Adjust tone and style** review with the **Confident** tone. +|`+TinyMCEAIReviewToneProfessional+` | |Runs the **Adjust tone and style** review with the **Professional** tone. +|`+TinyMCEAIReviewCustom+` |`+String+`, `+{ prompt, model, name }+`, or `+{ id, value }+` |Runs a review from a custom prompt, or runs an xref:tinymceai.adoc#integrator-defined-reviews[integrator-defined review] by identifier. See <>. |=== +Each `+TinyMCEAIReview…+` command opens the Review sidebar and runs the review, with the same result as selecting that review in the sidebar. Running a review command while another review is in progress stops the earlier review and starts the requested one. + [NOTE] ==== Command names use the `+TinyMCEAIQuickActions…+` prefix (with an `+s+`) for **Explain**, **Summarize**, and **Highlight key points** — these map to the xref:tinymceai.adoc#tinymceai_quickactions_chat_prompts[chat prompts] submenu, not to standalone `+TinyMCEAIQuickAction…+` spellings. @@ -72,3 +85,53 @@ tinymce.activeEditor.execCommand('TinyMCEAIChatPrompt', false, { displayedPrompt: 'Explain' }); ---- + +.Example: running built-in reviews +[source,js] +---- +tinymce.activeEditor.execCommand('TinyMCEAIReviewProofread'); + +tinymce.activeEditor.execCommand('TinyMCEAIReviewToneProfessional'); +---- + +[[tinymceai-review-custom-values]] +=== Values for `+TinyMCEAIReviewCustom+` + +The `+TinyMCEAIReviewCustom+` command accepts three forms of third argument. + +A `+String+` runs a review from that prompt on the default model, titled **Custom review**: + +[source,js] +---- +tinymce.activeEditor.execCommand('TinyMCEAIReviewCustom', false, 'Check for passive voice'); +---- + +An object with a `+prompt+` property runs a review from a custom prompt: + +* `+prompt+` (`+String+`): The prompt sent to the model. This property is required. +* `+model+` (optional `+String+`): The model that runs the review. When omitted, the review runs on the model set by xref:tinymceai.adoc#tinymceai_default_model[`+tinymceai_default_model+`]. For the available model identifiers, see xref:tinymceai-models.adoc[AI Models]. +* `+name+` (optional `+String+`): The title shown above the review. When omitted, the title is **Custom review**. + +[source,js] +---- +tinymce.activeEditor.execCommand('TinyMCEAIReviewCustom', false, { + prompt: 'Check the document for passive voice', + model: 'agent-1', + name: 'Passive voice' +}); +---- + +An object with an `+id+` property runs an xref:tinymceai.adoc#integrator-defined-reviews[integrator-defined review] configured in xref:tinymceai.adoc#tinymceai_reviews[`+tinymceai_reviews+`]: + +* `+id+` (`+String+`): The `+id+` of the integrator-defined review. This property is required. +* `+value+` (optional `+String+`): The value passed to the review. A `+simple+` review takes no value. For a `+list+` review, the value must match one of the review's `+options+` values; when omitted, the first option is used. For an `+input+` review, the value is the text substituted into the prompt, and it is required. + +[source,js] +---- +tinymce.activeEditor.execCommand('TinyMCEAIReviewCustom', false, { + id: 'integrator-list-review', + value: 'swedish' +}); +---- + +When the value does not match any of these forms, {productname} logs an error to the browser console and runs no review. This also applies when the prompt or identifier is blank, when no integrator-defined review matches the identifier, when a `+list+` review value is not one of its options, and when an `+input+` review is run without a value. From ce55f810368376b172d99874c98a8b17170f6dd2 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 12:00:22 +1000 Subject: [PATCH 10/19] Docs: TINYMCE-14519 - Changes to text alongside a nested list or table did not render as diffs in Review mode (#4311) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 36a7d76a50..9d6cf1d9d8 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -75,7 +75,14 @@ For information on the **** plugin, see: xref: Date: Wed, 26 Aug 2026 12:04:53 +1000 Subject: [PATCH 11/19] TINYDOC-3570: Tooltips could not be closed using `Esc` (#4310) * Docs: TINYMCE-14506 - Tooltips could not be closed using `Esc` * TINYDOC-3570: Remove the tooltip focus behavior sentence pending TINYMCE-14659. --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 9d6cf1d9d8..f6fd746d9a 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -77,6 +77,13 @@ The {productname} {release-version} release includes an accompanying release of **TinyMCE AI** includes the following fix, addition and improvements. +==== Tooltips could not be closed using `+Esc+` +// #TINYMCE-14506 + +Previously, the tooltips shown in the **TinyMCE AI** sidebars did not respond to `+Esc+`. These sidebars use their own tooltips, which were not connected to the editor keyboard shortcut that closes tooltips, so an open tooltip remained on screen until the pointer or focus moved elsewhere. Keyboard users could not dismiss a tooltip that obscured the interface. + +In {productname} {release-version}, pressing `+Esc+` closes an open tooltip in the **TinyMCE AI** sidebars. + ==== Changes to text alongside a nested list or table did not render as diffs in Review mode // #TINYMCE-14519 From d1db65a588090a70b5455557696bc4c2c0d58256 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 13:20:32 +1000 Subject: [PATCH 12/19] Docs: TINYMCE-14749 - Chat welcome actions moved focus into the editor and reset the content scroll position (#4309) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ modules/ROOT/partials/configuration/tinymceai_options.adoc | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index f6fd746d9a..5b689711ae 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -77,6 +77,13 @@ The {productname} {release-version} release includes an accompanying release of **TinyMCE AI** includes the following fix, addition and improvements. +==== Chat welcome actions moved focus into the editor and reset the content scroll position +// #TINYMCE-14749 + +Previously, selecting a welcome action in the AI Chat sidebar moved focus into the editor before running the action's command. Focusing the editor scrolls the content to the current selection, and when no selection had been made, that position was the start of the content. Users who had scrolled through a document lost that scroll position as soon as a welcome action was selected. + +In {productname} {release-version}, the **TinyMCE AI** plugin runs welcome action commands without moving focus into the editor. Selecting a welcome action leaves the editor scroll position and focus unchanged. Welcome actions are configured with the xref:tinymceai.adoc#tinymceai_chat_welcome_actions[`+tinymceai_chat_welcome_actions+`] option. + ==== Tooltips could not be closed using `+Esc+` // #TINYMCE-14506 diff --git a/modules/ROOT/partials/configuration/tinymceai_options.adoc b/modules/ROOT/partials/configuration/tinymceai_options.adoc index 703b64d623..73902da544 100644 --- a/modules/ROOT/partials/configuration/tinymceai_options.adoc +++ b/modules/ROOT/partials/configuration/tinymceai_options.adoc @@ -334,7 +334,7 @@ Each item in the array is one of the following: * A `+String+`, or an object with a `+text+` property (`+{ text: 'string' }+`), shown as descriptive text. * An action object, shown as a clickable button, with the following properties: ** `+title+` (`+String+`): The label shown on the button. -** `+command+` (`+String+`): The editor command run when the button is selected, using `+editor.execCommand(command, false, value)+`. This can be a Quick Action or Chat command, the core `+ToggleSidebar+` command, or any other registered editor command, such as `+Bold+`. For the AI command names, see xref:editor-command-identifiers.adoc#tinymceai[TinyMCE AI]. +** `+command+` (`+String+`): The editor command run when the button is selected. The command runs without moving focus into the editor, so the editor scroll position is preserved. This can be a Quick Action or Chat command, the core `+ToggleSidebar+` command, or any other registered editor command, such as `+Bold+`. For the AI command names, see xref:editor-command-identifiers.adoc#tinymceai[TinyMCE AI]. ** `+value+` (optional): The argument passed to the command. The accepted value matches the command, for example a language label for `+TinyMCEAIQuickActionTranslate+`, a `+{ prompt, displayedPrompt }+` object for `+TinyMCEAIChatPrompt+`, or a sidebar name such as `+'tinymceai-review'+` for `+ToggleSidebar+`. ** `+icon+` (optional `+String+`): The name of the icon shown on the button, using any editor icon identifier. When omitted, an icon is selected automatically based on the command. From 6b535abe175d044372c4150267eb890431e76350 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 13:42:17 +1000 Subject: [PATCH 13/19] TINYDOC-3570: New option `tinycomments_always_show_highlights` to keep comment highlights visible while the sidebar is closed. (#4308) * Docs: TINYMCE-14726 - New option `tinycomments_always_show_highlights` to keep comment highlights visible while the sidebar is closed * Docs: TINYMCE-14726 - Align user_id example value with the embedded mode setup example * Docs: TINYMCE-14726 - Match the Comments option examples in the tinycomments_always_show_highlights example --- modules/ROOT/pages/8.9.0-release-notes.adoc | 22 +++++++++++++++ .../ROOT/pages/comments-callback-mode.adoc | 2 ++ .../ROOT/pages/comments-embedded-mode.adoc | 2 ++ .../tinycomments_always_show_highlights.adoc | 28 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 modules/ROOT/partials/configuration/tinycomments_always_show_highlights.adoc diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 5b689711ae..901bb9a657 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -71,6 +71,28 @@ The {productname} {release-version} release includes an accompanying release of For information on the **** plugin, see: xref:.adoc[]. +=== Comments + +The {productname} {release-version} release includes an accompanying release of the **Comments** premium plugin. + +**Comments** includes the following additions. + +==== New option `+tinycomments_always_show_highlights+` to keep comment highlights visible while the sidebar is closed +// #TINYMCE-14726 + +Previously, the Comments plugin highlighted commented content only while the Comments sidebar was open. Closing the sidebar removed the highlighting from the editor content, so commented content was easy to overlook and users could overwrite it without warning. + +In {productname} {release-version}, the Comments plugin offers the xref:comments-embedded-mode.adoc#tinycomments_always_show_highlights[`+tinycomments_always_show_highlights+`] option. When this option is set to `+true+`, commented content remains highlighted whether the Comments sidebar is open or closed. This option defaults to `+false+`, which preserves the existing behavior. + +==== Selecting a comment highlight opens the Comments sidebar +// #TINYMCE-14726 + +Previously, the Comments plugin removed the highlighting while the Comments sidebar was closed, so users could not reopen a conversation from the editor content. + +In {productname} {release-version}, when the xref:comments-embedded-mode.adoc#tinycomments_always_show_highlights[`+tinycomments_always_show_highlights+`] option is set to `+true+`, selecting highlighted content reopens the closed Comments sidebar. + +For information on the **Comments** plugin, see: xref:introduction-to-tiny-comments.adoc[Comments]. + === TinyMCE AI The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin. diff --git a/modules/ROOT/pages/comments-callback-mode.adoc b/modules/ROOT/pages/comments-callback-mode.adoc index 7f76a26891..9bb1da44bc 100644 --- a/modules/ROOT/pages/comments-callback-mode.adoc +++ b/modules/ROOT/pages/comments-callback-mode.adoc @@ -83,6 +83,8 @@ include::partial$configuration/fetch_users.adoc[leveloffset=+1] include::partial$configuration/tinycomments_fetch_author_info.adoc[leveloffset=+1] +include::partial$configuration/tinycomments_always_show_highlights.adoc[leveloffset=+1] + include::partial$plugins/comments-open-sidebar.adoc[] include::partial$plugins/comments-highlighting-css.adoc[] diff --git a/modules/ROOT/pages/comments-embedded-mode.adoc b/modules/ROOT/pages/comments-embedded-mode.adoc index 280630f5bf..f2845cc30c 100644 --- a/modules/ROOT/pages/comments-embedded-mode.adoc +++ b/modules/ROOT/pages/comments-embedded-mode.adoc @@ -64,6 +64,8 @@ include::partial$configuration/tinycomments_can_delete_comment.adoc[leveloffset= include::partial$configuration/tinycomments_can_edit_comment.adoc[leveloffset=+1] +include::partial$configuration/tinycomments_always_show_highlights.adoc[leveloffset=+1] + include::partial$plugins/comments-open-sidebar.adoc[] include::partial$plugins/comments-highlighting-css.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/tinycomments_always_show_highlights.adoc b/modules/ROOT/partials/configuration/tinycomments_always_show_highlights.adoc new file mode 100644 index 0000000000..7d3372409d --- /dev/null +++ b/modules/ROOT/partials/configuration/tinycomments_always_show_highlights.adoc @@ -0,0 +1,28 @@ +[[tinycomments_always_show_highlights]] +== `+tinycomments_always_show_highlights+` + +_Optional_: The {pluginname} plugin offers the `+tinycomments_always_show_highlights+` option to keep the highlighting on commented content visible while the {pluginname} sidebar is closed. By default, {productname} highlights commented content only while the sidebar is open, and removes the highlighting from the editor content once the sidebar is closed. + +When this option is set to `+true+`, {productname} highlights commented content whether the sidebar is open or closed, and selecting highlighted content reopens the closed {pluginname} sidebar. + +*Type:* `+Boolean+` + +*Default value:* `+false+` + +*Possible values:* `+true+`, `+false+` + +=== Example: using `+tinycomments_always_show_highlights+` + +[source,js] +---- +const currentAuthor = 'embedded_journalist'; + +tinymce.init({ + selector: 'textarea', // change this value according to your html + plugins: 'tinycomments', + toolbar: 'addcomment showcomments', + tinycomments_mode: 'embedded', + user_id: currentAuthor, + tinycomments_always_show_highlights: true +}); +---- From be68b36f3b2daa63f5bac8d4d0d147014769fef9 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 14:06:15 +1000 Subject: [PATCH 14/19] TINYDOC-3570: Improved error message shown when an invalid URL is added as a context source. (#4321) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 901bb9a657..ee64d76a2f 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -93,12 +93,20 @@ In {productname} {release-version}, when the xref:comments-embedded-mode.adoc#ti For information on the **Comments** plugin, see: xref:introduction-to-tiny-comments.adoc[Comments]. + === TinyMCE AI The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin. **TinyMCE AI** includes the following fix, addition and improvements. +==== Improved error message shown when an invalid URL is added as a context source +// #TINYMCE-13715 + +Previously, adding a malformed URL as a context source in the Chat sidebar reported `+Provided URL is not valid.+` That message did not indicate what part of the address to correct. + +In {productname} {release-version}, the **TinyMCE AI** plugin shows `+This URL isn't valid. Check the full, correct web address and try again.+` in the same situation. The message applies to the format of the address. A well-formed address that points to a page that cannot be reached is still accepted and sent for processing. + ==== Chat welcome actions moved focus into the editor and reset the content scroll position // #TINYMCE-14749 From 3c169f13efe447555a265250a69b589efdca5d68 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 14:19:34 +1000 Subject: [PATCH 15/19] TINYDOC-3570: Improved error message shown when the document is too long for a quick action or review. (#4320) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index ee64d76a2f..4c4f919e38 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -100,6 +100,13 @@ The {productname} {release-version} release includes an accompanying release of **TinyMCE AI** includes the following fix, addition and improvements. +==== Improved error message shown when the document is too long for a quick action or review +// #TINYMCE-13662 + +Previously, when the document content exceeded the context limit of the AI service, a quick action or review failed and reported the general message `+An error occurred while processing the AI response.+` That message did not identify the length of the document as the cause. + +In {productname} {release-version}, the **TinyMCE AI** plugin shows `+This document is too long for the AI to process at once.+` when a quick action or review fails for this reason. The message states the limit without suggesting a corrective action, because the full document is always sent to the AI service. + ==== Improved error message shown when an invalid URL is added as a context source // #TINYMCE-13715 From 7931e1db2c124d47eab52cf39357c648bd55f547 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 14:20:22 +1000 Subject: [PATCH 16/19] TINYDOC-3570: Improved error message shown when a chat message exceeds the AI context limit (#4314) * Docs: TINYMCE-13661 - Improved error message shown when a chat message exceeds the AI context limit * Update modules/ROOT/pages/8.9.0-release-notes.adoc Co-authored-by: Hamza Benkhaldoun --------- Co-authored-by: Hamza Benkhaldoun --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 4c4f919e38..fc7433eed3 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -155,6 +155,13 @@ In {productname} {release-version}, the **TinyMCE AI** plugin shows a message fo When the cause cannot be identified, the plugin shows `+This file can't be added. Try a smaller file, or a different file type.+` +==== Improved error message shown when a chat message exceeds the AI context limit +// #TINYMCE-13661 + +Previously, when a chat message combined with the conversation history together exceeded the context limit of the AI service, the Chat sidebar reported the failure with the general message `+An error occurred while processing the AI response.+` That message did not identify the size of the request as the cause, so users could not tell whether to shorten the message, start a new conversation, or try again unchanged. + +In {productname} {release-version}, the **TinyMCE AI** plugin shows `+This message is too long for the AI to process. Try a shorter message, or start a new chat.+` when the AI service reports that a chat request exceeds the context limit. The message names the cause and describes the two ways to continue. + ==== Improved error message shown when the chat prompt exceeds the maximum length // #TINYMCE-13659 From 9bdb588c8ef09f3276bd410a2fb338fd56f36b4d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 19:52:30 +1000 Subject: [PATCH 17/19] TINYDOC-3570: Resizable sidebars documentation (TINYMCE-14486) (#4307) * Docs: TINYDOC-3570 - New options for configuring the width of resizable sidebars * Docs: TINYMCE-14678 - Custom sidebars opt in to resizing with the new resizable property Also covers TINYMCE-14527 (resize behaviour), TINYMCE-14683 (premium sidebars resizable by default) and TINYMCE-14554 (persisting the sidebar width). * Docs: TINYMCE-14529 - Add SidebarResizeStart and SidebarResized events * Docs: TINYMCE-14527 - Sidebars can now be resized by dragging their edge Adds release note entries for TINYMCE-14527, TINYMCE-14529, TINYMCE-14530, TINYMCE-14678 and TINYMCE-14683 to the 8.9.0 release notes. * Docs: TINYMCE-14678 - Use a version admonition for resizable sidebar availability Adds the 8.9 requires-version admonition partial and links api.element() to the sidebar API object reference. * Docs: TINYMCE-14678 - Show the resizable property in the custom sidebar examples * Docs: TINYMCE-14683 - Note the Comments sidebar width change and the floating AI sidebar exception --- modules/ROOT/pages/8.9.0-release-notes.adoc | 41 +++++- modules/ROOT/pages/customsidebar.adoc | 117 ++++++++++++++++++ modules/ROOT/pages/events.adoc | 2 + .../configuration/sidebar_max_width.adoc | 41 ++++++ .../configuration/sidebar_min_width.adoc | 41 ++++++ .../partials/configuration/sidebar_width.adoc | 42 +++++++ .../partials/misc/admon-requires-8.9v.adoc | 1 + 7 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 modules/ROOT/partials/configuration/sidebar_max_width.adoc create mode 100644 modules/ROOT/partials/configuration/sidebar_min_width.adoc create mode 100644 modules/ROOT/partials/configuration/sidebar_width.adoc create mode 100644 modules/ROOT/partials/misc/admon-requires-8.9v.adoc diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index fc7433eed3..f9c79fd6b6 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -75,7 +75,7 @@ For information on the **** plugin, see: xref: { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + onShow: (api) => { + const container = document.createElement('div'); + container.style.width = '600px'; + api.element().appendChild(container); + }, + }); + } +}); +---- + +{productname} sets the width of a resizable sidebar, so the content styles need to follow the width of the parent element rather than set a width. Set the width of the content to `+100%+` so that the content inherits the width from xref:customsidebar.adoc#element[`+api.element()+`]. + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + sidebar_show: 'mysidebar', + sidebar_width: 500, + setup: (editor) => { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + resizable: true, + onShow: (api) => { + const container = document.createElement('div'); + container.style.width = '100%'; + api.element().appendChild(container); + }, + }); + } +}); +---- + +IMPORTANT: A sidebar whose content styles set a fixed width does not render correctly when `+resizable+` is set to `+true+`. Update the content styles to `+100%+` before enabling the property. + +[[persisting-the-sidebar-width]] +=== Persisting the sidebar width + +{productname} does not store the width a user drags a sidebar to. To keep a width between editor loads, store the width reported by the xref:events.adoc#editor-core-events[`+SidebarResized+`] event and pass the stored value to xref:customsidebar.adoc#sidebar_width[`+sidebar_width+`] when the editor is next created. + +[source,js] +---- +const storedWidth = window.localStorage.getItem('sidebar-width'); + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + sidebar_show: 'mysidebar', + sidebar_width: storedWidth ? parseInt(storedWidth, 10) : 440, + setup: (editor) => { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + resizable: true, + onShow: (api) => { + const container = document.createElement('div'); + container.style.width = '100%'; + api.element().appendChild(container); + }, + }); + + editor.on('SidebarResized', (e) => { + window.localStorage.setItem('sidebar-width', e.width); + }); + } +}); +---- + == Options +include::partial$configuration/sidebar_max_width.adoc[leveloffset=+1] + +include::partial$configuration/sidebar_min_width.adoc[leveloffset=+1] + include::partial$configuration/sidebar_show.adoc[leveloffset=+1] +include::partial$configuration/sidebar_width.adoc[leveloffset=+1] + [[example-inside-the-tinymceinit]] == Example inside the tinymce.init +For information on creating a sidebar that a user can resize, see: xref:customsidebar.adoc#resizable-sidebars[Resizable sidebars]. + [source,js] ---- tinymce.init({ @@ -78,6 +191,7 @@ tinymce.init({ editor.ui.registry.addSidebar('mysidebar', { tooltip: 'My sidebar', icon: 'comment', + resizable: true, onSetup: (api) => { console.log('Render panel', api.element()); return () => { @@ -98,12 +212,15 @@ tinymce.init({ == Example inside a TinyMCE plugin +For information on creating a sidebar that a user can resize, see: xref:customsidebar.adoc#resizable-sidebars[Resizable sidebars]. + [source,js] ---- tinymce.PluginManager.add('myplugin', (editor) => { editor.ui.registry.addSidebar('mysidebar', { tooltip: 'My sidebar', icon: 'comment', + resizable: true, onSetup: (api) => { console.log('Render panel', api.element()); return () => { diff --git a/modules/ROOT/pages/events.adoc b/modules/ROOT/pages/events.adoc index 43b16a3500..17d7ea945b 100644 --- a/modules/ROOT/pages/events.adoc +++ b/modules/ROOT/pages/events.adoc @@ -229,6 +229,8 @@ The following events are provided by the {productname} editor. |LanguageLoadError |`+{ message: string }+` |Fired when the editor language pack fails to load. |BeforeRenderUI |N/A |Fired before the theme UI is rendered. |ToggleSidebar |N/A |Fired when a sidebar is toggled opened/closed. +|SidebarResizeStart |N/A |Fired when a user starts dragging the resize handle of a sidebar. This event requires the sidebar to be registered with the xref:customsidebar.adoc#resizable[`+resizable+`] property set to `+true+`. +|SidebarResized |`+{ width: number }+` |Fired when a user stops dragging the resize handle of a sidebar. The `+width+` is the width of the sidebar, in pixels, after the resize. This event requires the sidebar to be registered with the xref:customsidebar.adoc#resizable[`+resizable+`] property set to `+true+`. |longpress |(Same data as the native https://developer.mozilla.org/en-US/docs/Web/API/Element/touchstart_event[touchstart event]) |Fired when a long press occurs on a touch device inside the editor. |tap |(Same data as the native https://developer.mozilla.org/en-US/docs/Web/API/Document/touchend_event[touchend event]) |Fired when a tap occurs on a touch device inside the editor (simulated event similar to click). |ScrollContent |(Same data as the native https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll_event[scroll event]) |(iframe mode only) Fired when the content inside an iframe window has been scrolled. diff --git a/modules/ROOT/partials/configuration/sidebar_max_width.adoc b/modules/ROOT/partials/configuration/sidebar_max_width.adoc new file mode 100644 index 0000000000..ba1d5c5224 --- /dev/null +++ b/modules/ROOT/partials/configuration/sidebar_max_width.adoc @@ -0,0 +1,41 @@ +[[sidebar_max_width]] +== `+sidebar_max_width+` + +This option sets the largest width, in pixels, that a user can drag the sidebar to. + +The option applies only to sidebars registered with the `+resizable+` property set to `+true+`. A user cannot resize a sidebar registered without that property, and {productname} ignores this option. + +This option restricts dragging only. This option does not restrict the width set by xref:customsidebar.adoc#sidebar_width[`+sidebar_width+`], so a sidebar can open wider than the value set here. + +include::partial$misc/admon-iframe-only.adoc[] + +*Type:* `+Number+` + +*Default value:* `+800+` + +=== Example: using `+sidebar_max_width+` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + sidebar_show: 'mysidebar', + sidebar_max_width: 600, + setup: (editor) => { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + resizable: true, + onShow: (api) => { + api.element().innerHTML = 'Hello world!'; + }, + }); + } +}); +---- + +=== Limitations of the `+sidebar_max_width+` option + +The editable area cannot shrink below 280 pixels, and this limit takes precedence over `+sidebar_max_width+`. For information on this restriction, see: xref:customsidebar.adoc#limitations-of-the-sidebar-width-option[Limitations of the `+sidebar_width+` option]. + +In a narrow editor, the width that remains beside a 280-pixel editable area can be smaller than the value set by `+sidebar_max_width+`. In that case, the remaining width becomes the effective maximum, and a user cannot drag the sidebar beyond that width. diff --git a/modules/ROOT/partials/configuration/sidebar_min_width.adoc b/modules/ROOT/partials/configuration/sidebar_min_width.adoc new file mode 100644 index 0000000000..ac615dc9a0 --- /dev/null +++ b/modules/ROOT/partials/configuration/sidebar_min_width.adoc @@ -0,0 +1,41 @@ +[[sidebar_min_width]] +== `+sidebar_min_width+` + +This option sets the smallest width, in pixels, that a user can drag the sidebar to. + +The option applies only to sidebars registered with the `+resizable+` property set to `+true+`. A user cannot resize a sidebar registered without that property, and {productname} ignores this option. + +This option restricts dragging only. This option does not restrict the width set by xref:customsidebar.adoc#sidebar_width[`+sidebar_width+`], so a sidebar can open narrower than the value set here. + +include::partial$misc/admon-iframe-only.adoc[] + +*Type:* `+Number+` + +*Default value:* `+300+` + +=== Example: using `+sidebar_min_width+` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + sidebar_show: 'mysidebar', + sidebar_min_width: 400, + setup: (editor) => { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + resizable: true, + onShow: (api) => { + api.element().innerHTML = 'Hello world!'; + }, + }); + } +}); +---- + +=== Limitations of the `+sidebar_min_width+` option + +The editable area cannot shrink below 280 pixels, and this limit takes precedence over `+sidebar_min_width+`. For information on this restriction, see: xref:customsidebar.adoc#limitations-of-the-sidebar-width-option[Limitations of the `+sidebar_width+` option]. + +When the editor is too narrow to provide the width set by `+sidebar_min_width+` alongside a 280-pixel editable area, {productname} does not resize the sidebar on drag, and the sidebar keeps the current width. diff --git a/modules/ROOT/partials/configuration/sidebar_width.adoc b/modules/ROOT/partials/configuration/sidebar_width.adoc new file mode 100644 index 0000000000..6264cf1620 --- /dev/null +++ b/modules/ROOT/partials/configuration/sidebar_width.adoc @@ -0,0 +1,42 @@ +[[sidebar_width]] +== `+sidebar_width+` + +This option sets the width, in pixels, that the sidebar opens at on editor initialization. + +The option applies only to sidebars registered with the `+resizable+` property set to `+true+`. A sidebar registered without that property keeps the width defined by the content styles of that sidebar, and {productname} ignores this option. + +The xref:customsidebar.adoc#sidebar_min_width[`+sidebar_min_width+`] and xref:customsidebar.adoc#sidebar_max_width[`+sidebar_max_width+`] options do not restrict the width set by this option. Those options restrict only the widths a user can drag the sidebar to. The minimum width of the editable area does restrict this width. For information on this restriction, see: xref:customsidebar.adoc#limitations-of-the-sidebar-width-option[Limitations of the `+sidebar_width+` option]. + +include::partial$misc/admon-iframe-only.adoc[] + +*Type:* `+Number+` + +*Default value:* `+440+` + +=== Example: using `+sidebar_width+` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + sidebar_show: 'mysidebar', + sidebar_width: 500, + setup: (editor) => { + editor.ui.registry.addSidebar('mysidebar', { + tooltip: 'My sidebar', + icon: 'comment', + resizable: true, + onShow: (api) => { + api.element().innerHTML = 'Hello world!'; + }, + }); + } +}); +---- + +[[limitations-of-the-sidebar-width-option]] +=== Limitations of the `+sidebar_width+` option + +The editable area and the sidebar share the same container. To keep the editable area usable, {productname} does not allow the editable area to shrink below 280 pixels. This limit is fixed and takes precedence over `+sidebar_width+`, xref:customsidebar.adoc#sidebar_min_width[`+sidebar_min_width+`], and xref:customsidebar.adoc#sidebar_max_width[`+sidebar_max_width+`]. + +When the editor is too narrow to provide the requested width alongside a 280-pixel editable area, {productname} reduces the sidebar to the width that remains. For example, in an editor 1000 pixels wide, a `+sidebar_width+` of 2000 results in a sidebar approximately 716 pixels wide, because the editable area reserves 280 pixels and the editor border occupies the remaining pixels. diff --git a/modules/ROOT/partials/misc/admon-requires-8.9v.adoc b/modules/ROOT/partials/misc/admon-requires-8.9v.adoc new file mode 100644 index 0000000000..68e484a2d4 --- /dev/null +++ b/modules/ROOT/partials/misc/admon-requires-8.9v.adoc @@ -0,0 +1 @@ +NOTE: This feature is only available for {productname} 8.9 and later. From e297a453f196adbbfb2108f0a5adb49157bfd475 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 26 Aug 2026 19:58:42 +1000 Subject: [PATCH 18/19] TINYDOC-3570: Restored the icon-only buttons in the AI suggestion preview (TINYMCE-14814) --- modules/ROOT/pages/8.9.0-release-notes.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index f9c79fd6b6..076906fee5 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -196,6 +196,13 @@ Previously, the scroll position was not carried between the editor content and t In {productname} {release-version}, the **TinyMCE AI** plugin records the content block nearest to the current scroll position and restores the view to that block. The position is preserved when opening the preview, running a review, and applying a quick action, and it is restored to the same block even when the content is a different height in the editor and in the preview. +==== Restored the icon-only buttons in the AI suggestion preview +// #TINYMCE-14814 + +In {productname} xref:8.7.0-release-notes.adoc#replaced-the-icon-only-buttons-in-the-ai-suggestion-preview-with-labeled-apply-and-skip-buttons[8.7.0], the icon-only buttons in the AI suggestion preview were replaced with labeled **Apply** and **Skip** buttons. + +In {productname} {release-version}, the **TinyMCE AI** plugin restores the icon-only buttons used before {productname} 8.7.0. A checkmark button applies the suggestion and a close button skips it, and each button shows a tooltip that names its action, _Apply suggestion_ and _Skip suggestion_. The apply button remains the primary action, and the spacing of the preview toolbar is unchanged from {productname} 8.7.0. + For information on the **TinyMCE AI** plugin, see: xref:tinymceai.adoc[TinyMCE AI]. From 0578efb488f63d1570eef11343c5f92ac6d24193 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 27 Aug 2026 08:23:15 +1000 Subject: [PATCH 19/19] TINYDOC-3570: General template cleanup before release. --- modules/ROOT/nav.adoc | 8 - modules/ROOT/pages/8.9.0-release-notes.adoc | 155 +------------------- 2 files changed, 5 insertions(+), 158 deletions(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 0f9c7c24ae..e7946da4b6 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -424,20 +424,12 @@ ** xref:release-notes.adoc[Release notes for {productname}] *** {productname} 8.9.0 **** xref:8.9.0-release-notes.adoc#overview[Overview] -**** xref:8.9.0-release-notes.adoc#new-premium-plugin[New Premium Plugin] -**** xref:8.9.0-release-notes.adoc#new-open-source-plugin[New Open Source Plugin] **** xref:8.9.0-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] -**** xref:8.9.0-release-notes.adoc#accompanying-premium-plugin-end-of-life-announcement[Accompanying Premium Plugin end-of-life announcement] -**** xref:8.9.0-release-notes.adoc#accompanying-open-source-plugin-end-of-life-announcement[Accompanying Open Source Plugin end-of-life announcement] -**** xref:8.9.0-release-notes.adoc#accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] **** xref:8.9.0-release-notes.adoc#improvements[Improvements] **** xref:8.9.0-release-notes.adoc#additions[Additions] **** xref:8.9.0-release-notes.adoc#changes[Changes] **** xref:8.9.0-release-notes.adoc#removed[Removed] **** xref:8.9.0-release-notes.adoc#bug-fixes[Bug fixes] -**** xref:8.9.0-release-notes.adoc#security-fixes[Security fixes] -**** xref:8.9.0-release-notes.adoc#deprecated[Deprecated] -**** xref:8.9.0-release-notes.adoc#known-issues[Known issues] *** {productname} 8.8.2 **** xref:8.8.2-release-notes.adoc#overview[Overview] **** xref:8.8.2-release-notes.adoc#bug-fixes[Bug fixes] diff --git a/modules/ROOT/pages/8.9.0-release-notes.adoc b/modules/ROOT/pages/8.9.0-release-notes.adoc index 076906fee5..165ec265ba 100644 --- a/modules/ROOT/pages/8.9.0-release-notes.adoc +++ b/modules/ROOT/pages/8.9.0-release-notes.adoc @@ -11,47 +11,13 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] [[overview]] == Overview -{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, August 26^th^, 2026. These release notes provide an overview of the changes for {productname} {release-version}, including: +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, August 27^th^, 2026. These release notes provide an overview of the changes for {productname} {release-version}, including: -// Remove sections and section boilerplates as necessary. -// Pluralise as necessary or remove the placeholder plural marker. -* xref:new-premium-plugin[New Premium plugin] -* xref:new-open-source-plugin[New Open Source plugin] * xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] -* xref:accompanying-premium-plugin-end-of-life-announcement[Accompanying Premium plugin end-of-life announcement] -* xref:accompanying-open-source-plugin-end-of-life-announcement[Accompanying open source plugin end-of-life-announcement] -* xref:accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] * xref:improvements[Improvements] * xref:additions[Additions] * xref:changes[Changes] * xref:bug-fixes[Bug fixes] -* xref:security-fixes[Security fixes] -* xref:deprecated[Deprecated] -* xref:known-issues[Known issues] - - -[[new-premium-plugin]] -== New Premium plugin - -The following new Premium plugin was released alongside {productname} {release-version}. - -=== - -The new Premium plugin, **** // description here. - -For information on the **** plugin, see xref:.adoc[]. - - -[[new-open-source-plugin]] -== New Open Source plugin - -The following new Open Source plugin was released alongside {productname} {release-version}. - -=== - -The new open source plugin, **** // description here. - -For information on the **** plugin, see xref:.adoc[]. [[accompanying-premium-plugin-changes]] @@ -59,18 +25,6 @@ For information on the **** plugin, see xref: - -The {productname} {release-version} release includes an accompanying release of the **** premium plugin. - -**** includes the following . - -==== - -// CCFR here. - -For information on the **** plugin, see: xref:.adoc[]. - === Comments The {productname} {release-version} release includes an accompanying release of the **Comments** premium plugin. @@ -206,49 +160,10 @@ In {productname} {release-version}, the **TinyMCE AI** plugin restores the icon- For information on the **TinyMCE AI** plugin, see: xref:tinymceai.adoc[TinyMCE AI]. -[[accompanying-premium-plugin-end-of-life-announcement]] -== Accompanying Premium plugin end-of-life announcement - -The following Premium plugin has been announced as reaching its end-of-life: - -=== - -{productname}’s xref:.adoc[] plugin will be deactivated on
, , and is no longer available for purchase. - - -[[accompanying-open-source-plugin-end-of-life-announcement]] -== Accompanying open source plugin end-of-life announcement - -The following open source plugin has been announced as reaching its end-of-life: - -=== - -{productname}’s xref:.adoc[] plugin will be deactivated on
, , and is no longer available for purchase. - - -[[accompanying-enhanced-skins-and-icon-packs-changes]] -== Accompanying Enhanced Skins & Icon Packs changes - -The {productname} {release-version} release includes an accompanying release of the **Enhanced Skins & Icon Packs**. - -=== Enhanced Skins & Icon Packs - -The **Enhanced Skins & Icon Packs** release includes the following updates: - -The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also incorporated into the default {productname} {release-version} skin, Oxide. - -For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-and-icon-packs.adoc[Enhanced Skins & Icon Packs]. - - [[improvements]] == Improvements -{productname} {release-version} also includes the following improvement: - -=== -// #TINY-vwxyz1 - -// CCFR here. +{productname} {release-version} also includes the following improvements: === Sidebars can now be resized by dragging their edge, and their width can be configured with the new `sidebar_width` option. // #TINYMCE-14527 @@ -269,12 +184,7 @@ In {productname} {release-version}, the Help dialog checks the metadata a plugin [[additions]] == Additions -{productname} {release-version} also includes the following addition: - -=== -// #TINY-vwxyz1 - -// CCFR here. +{productname} {release-version} also includes the following addition: === New options for configuring the width of resizable sidebars // #TINYMCE-14528 @@ -294,12 +204,7 @@ Together with the xref:customsidebar.adoc#sidebar_width[`+sidebar_width+`] optio [[changes]] == Changes -{productname} {release-version} also includes the following change: - -=== -// #TINY-vwxyz1 - -// CCFR here. +{productname} {release-version} also includes the following change: === The new `resizable` property controls whether a custom sidebar can be resized // #TINYMCE-14678 @@ -312,26 +217,10 @@ In {productname} {release-version}, the `+addSidebar+` specification object acce The sidebars registered by the xref:introduction-to-tiny-comments.adoc[Comments] and xref:tinymceai.adoc[{productname} AI] plugins set `+resizable+` to `+true+` and are resizable by default. -[[removed]] -== Removed - -{productname} {release-version} also includes the following removal: - -=== -// #TINY-vwxyz1 - -// CCFR here. - - [[bug-fixes]] == Bug fixes -{productname} {release-version} also includes the following bug fix: - -=== -// #TINY-vwxyz1 - -// CCFR here. +{productname} {release-version} also includes the following bug fixes: === Image with empty alt text would add `+role="presentation"+` instead of adding alt text when updated // #TINYMCE-13738 @@ -348,37 +237,3 @@ Previously, opening or closing a sidebar from a toolbar button scrolled the edit In {productname} {release-version}, toggling a sidebar from the toolbar no longer scrolls the selection into view. This applies to every sidebar registered through `+editor.ui.registry.addSidebar+`. Commands that change content, such as _Bold_, continue to focus the editor and scroll to the selection as before. The xref:apis/tinymce.editor.adoc#focus[`+editor.focus()+`] method also accepts an object argument, so callers can focus the editor without scrolling the selection into view, as in `+editor.focus({ scrollToSelection: false })+`. The `+scrollToSelection+` property defaults to `+true+`, and passing a boolean continues to behave as before. - - -[[security-fixes]] -== Security fixes - -{productname} {release-version} includes : - -=== -// #TINY-vwxyz1 - -// CCFR here. - - -[[deprecated]] -== Deprecated - -{productname} {release-version} includes the following deprecation: - -=== The `` configuration property, ``, has been deprecated - -// placeholder here. - - -[[known-issues]] -== Known issues - -This section describes issues that users of {productname} {release-version} may encounter and possible workarounds for these issues. - -There known issue in {productname} {release-version}. - -=== -// #TINY-vwxyz1 - -// CCFR here. \ No newline at end of file