From 357802be841abb6630b9b3716f6e3f2344a80bd5 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 6 Oct 2026 16:39:48 +1000 Subject: [PATCH 01/33] TINYDOC-3574 - Populate TinyMCE 8.10.0 release date --- modules/ROOT/pages/8.10.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.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index fa0f879095..8eb25cd5a2 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.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, October 14^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 f0ee453563..73cae19019 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -5,7 +5,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.10.0-release-notes.adoc[8.10.0 - ] +== xref:8.10.0-release-notes.adoc[8.10.0 - 2026-10-14] //TODO diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index b555fa4bd1..2bd0ee1343 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.10 | | +|8.10 |2026-10-14 |2028-04-14 |8.9 |2026-08-31 |2028-03-01 |8.8 |2026-07-15 |2028-01-15 |8.7 |2026-06-30 |2027-12-30 From b9692fc0a6c74e2c4afe078c2c1d6155b2ad3f6f Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 13 Oct 2026 13:36:41 +1000 Subject: [PATCH 02/33] TINYDOC-3574: Nested list items pasted from Google Docs with Keep formatting became bold when only the top-level list item was bold. (#4391) --- modules/ROOT/pages/8.10.0-release-notes.adoc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 8eb25cd5a2..91a7f6ef81 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.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[]. +=== PowerPaste + +The {productname} {release-version} release includes an accompanying release of the **PowerPaste** premium plugin. + +**PowerPaste** includes the following fix. + +==== Nested list items pasted from Google Docs with Keep formatting became bold when only the top-level list item was bold +// #TINYMCE-13282 + +Previously, when a user pasted a nested list from Google Docs and selected **Keep formatting**, the **PowerPaste** plugin made every nested list item bold, even when only the top-level list item was bold in the source document. The pasted list did not match the original document. Pasting with **Remove formatting** avoided the issue, but also removed the inline styles and classes from the pasted content. + +In {productname} {release-version}, the **PowerPaste** plugin keeps the font weight of each list item from the Google Docs content. When only the top-level list item is bold, the plugin pastes the nested list items with normal font weight, and the pasted list matches the original document. + +For information on the **PowerPaste** plugin, see: xref:introduction-to-powerpaste.adoc[PowerPaste]. + [[accompanying-premium-plugin-end-of-life-announcement]] == Accompanying Premium plugin end-of-life announcement From deb93a516e0ac5fa7b0135c6246ac0357c1fb2c7 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 13 Oct 2026 13:42:10 +1000 Subject: [PATCH 03/33] TINYDOC-3574: Moving the caret backwards with the keyboard lost its column position and jumped to the beginning of the line. (#4390) --- modules/ROOT/pages/8.10.0-release-notes.adoc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 91a7f6ef81..0a25a41b46 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.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[]. +=== Spell Checker + +The {productname} {release-version} release includes an accompanying release of the **Spell Checker** premium plugin. + +**Spell Checker** includes the following fix. + +==== Moving the caret backwards with the keyboard lost its column position and jumped to the beginning of the line +// #TINYMCE-14832 + +Previously, when the **Spell Checker** plugin was active, pressing the Up Arrow key to move up through several lines could place the caret at the beginning of a line instead of keeping its column position. The same problem occurred when extending a selection upward with Shift+Up Arrow. + +In {productname} {release-version}, the **Spell Checker** plugin restores the selection only when spell checking changes the editor content. The caret keeps its column position when it moves up through lines, including when Shift+Up Arrow extends a selection. + +For information on the **Spell Checker** plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checker]. + === PowerPaste The {productname} {release-version} release includes an accompanying release of the **PowerPaste** premium plugin. From 63552bcc6958bb9125625b4ea97fd943b4520595 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 13 Oct 2026 15:21:04 +1000 Subject: [PATCH 04/33] TINYDOC-3595: New `tags` metadata field for displaying tags in revision cards. (#4393) --- modules/ROOT/pages/8.10.0-release-notes.adoc | 15 +++++++++ modules/ROOT/pages/revisionhistory.adoc | 32 +++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 0a25a41b46..3bdf46c314 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.0-release-notes.adoc @@ -101,6 +101,21 @@ In {productname} {release-version}, the **PowerPaste** plugin keeps the font wei For information on the **PowerPaste** plugin, see: xref:introduction-to-powerpaste.adoc[PowerPaste]. +=== Revision History + +The {productname} {release-version} release includes an accompanying release of the **Revision History** premium plugin. + +**Revision History** includes the following addition. + +==== New `+tags+` metadata field for displaying tags in revision cards +// #TINYMCE-14331 + +The revision xref:revisionhistory.adoc#metadata[`+metadata+`] object now supports an optional `+tags+` field. The `+tags+` field takes an array of xref:revisionhistory.adoc#tag[tag] objects, each with a `+label+` string. The **Revision History** plugin displays each tag as a label on the revision card, in the same style as the revision type label, such as `+DRAFT+`. The plugin displays the label text exactly as provided, without changes to capitalization. + +Integrators can use tags to mark saved revisions with a custom status, such as `+REVIEWED+` or `+Legal+`. + +For information on the **Revision History** plugin, see: xref:revisionhistory.adoc[Revision History]. + [[accompanying-premium-plugin-end-of-life-announcement]] == Accompanying Premium plugin end-of-life announcement diff --git a/modules/ROOT/pages/revisionhistory.adoc b/modules/ROOT/pages/revisionhistory.adoc index 16d0a897d8..d0f999d7c3 100644 --- a/modules/ROOT/pages/revisionhistory.adoc +++ b/modules/ROOT/pages/revisionhistory.adoc @@ -87,7 +87,7 @@ The revision is an `+Object+` that contains the following fields: | `+createdAt+` | `+string+` | required | A UTC datetime string in ISO-8061 format. | `+content+` | `+string+` | optional | HTML string of the revision content. Empty string is considered as valid content. | `+author+` | xref:#author[Author] `+Object+` | optional | The author of the revision. -| `+metadata+` | xref:#metadata[Metadata] `+Object+` | optional | Additional information about the revision, such as whether it was AI-assisted. +| `+metadata+` | xref:#metadata[Metadata] `+Object+` | optional | Additional information about the revision, such as whether it was AI-assisted and which tags appear on its revision card. |=== === Author @@ -110,8 +110,38 @@ The metadata is an `+Object+` that holds additional information about a revision |=== | Field | Type | Required? | Description | `+source+` | `+string+` | optional | The origin of the revision's content. A value of `+'ai'+` marks the revision as AI-assisted and displays an AI badge on the revision card by default. Set xref:revisionhistory_ai_attribution[`+revisionhistory_ai_attribution+`] to `+false+` to hide the badge. +| `+tags+` | `+Array+` of xref:#tag[Tag] `+Object+` | optional | The tags that appear on the revision card. Each tag appears as a label in the same style as the revision type label, such as `+DRAFT+`. |=== +=== Tag + +The tag is an `+Object+` that represents a label displayed on a revision card. It contains the following fields: + +[cols="1,1,1,3",options="header"] +|=== +| Field | Type | Required? | Description +| `+label+` | `+string+` | required | The text of the tag. The plugin displays the text exactly as provided, without changes to capitalization. +|=== + +The following example defines a saved revision that has two tags: + +[source,js] +---- +const revision = { + revisionId: '3', + createdAt: '2026-10-14T10:11:21.578Z', + content: '

Approved content.

', + metadata: { + tags: [ + { label: 'REVIEWED' }, + { label: 'Legal' } + ] + } +}; +---- + +Tags appear only on `+saved+` revisions. The `+draft+` and `+initial+` revisions are generated from the editor's current content and do not carry `+metadata+`. See xref:#understanding-revision-types[Understanding revision types]. + == Attributing AI-assisted revisions A revision is identified as AI-assisted through the `+source+` field of its xref:#metadata[`+metadata+`] object. When `+metadata.source+` is `+'ai'+`, an AI badge appears on that revision card by default. Set xref:revisionhistory_ai_attribution[`+revisionhistory_ai_attribution+`] to `+false+` to hide the badge. From 4c36d23c785c418881584eec2c0c5db6df164a03 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 13 Oct 2026 15:25:35 +1000 Subject: [PATCH 05/33] TINYDOC-3574: Diff mode reserved an empty scrollbar gutter beside the content. (#4377) --- modules/ROOT/pages/8.10.0-release-notes.adoc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 3bdf46c314..8ab324c5e3 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.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 fix. + +==== Diff mode reserved an empty scrollbar gutter beside the content +// #TINYMCE-14933 + +Previously, the **TinyMCE AI** plugin reserved space for a scrollbar whenever the **Diff mode** tab displayed proposed changes, even when the content was too short to scroll. The empty gutter beside the content looked like a broken scrollbar. + +In {productname} {release-version}, the **TinyMCE AI** plugin no longer reserves space for a scrollbar in **Diff mode**. A scrollbar appears only when the content is long enough to scroll. + +For information on the **TinyMCE AI** plugin, see: xref:tinymceai.adoc[TinyMCE AI]. + === Spell Checker The {productname} {release-version} release includes an accompanying release of the **Spell Checker** premium plugin. From c3493b2a69e5bf2e41390d1b0113aef7616ff2d9 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 13 Oct 2026 15:42:34 +1000 Subject: [PATCH 06/33] TINYDOC-3654: Suggested Edits v2 documentation. (#4384) * TINYDOC-3654: Suggested Edits v2 documentation. * TINYDOC-3654: Point live demos at the 8-dev channel for review (revert before merging). * TINYDOC-3654: Nested parts of the same suggestion showed duplicate highlights. * TINYDOC-3654: Address review feedback on Suggested Edits v2 documentation. * TINYDOC-3654: Address review feedback on Suggested Edits review toolbar and footer wording. * Update antora.yml --- .../suggestededits-access-feedback/index.html | 4 +- .../suggestededits-access-read/index.html | 4 +- .../suggestededits-auto-approve/index.html | 4 +- .../live-demos/suggestededits/index.html | 4 +- modules/ROOT/images/icons/revert-all.svg | 1 + modules/ROOT/pages/8.10.0-release-notes.adoc | 130 ++++++++++++++++++ modules/ROOT/pages/suggestededits.adoc | 73 +++++++--- .../commands/suggestededits-cmds.adoc | 2 +- .../partials/configuration/icon_list.adoc | 1 + .../configuration/suggestededits_access.adoc | 14 +- .../events/suggestededits-events.adoc | 6 +- .../suggestededits-menu-items.adoc | 2 +- 12 files changed, 203 insertions(+), 42 deletions(-) create mode 100644 modules/ROOT/images/icons/revert-all.svg diff --git a/modules/ROOT/examples/live-demos/suggestededits-access-feedback/index.html b/modules/ROOT/examples/live-demos/suggestededits-access-feedback/index.html index 86d97711ad..e7a3865087 100644 --- a/modules/ROOT/examples/live-demos/suggestededits-access-feedback/index.html +++ b/modules/ROOT/examples/live-demos/suggestededits-access-feedback/index.html @@ -1,9 +1,9 @@ - + +

Native integration (shares the AI sidebar of group 1)

+ + +
+

Group 2: article-analysis

+

Workflow comparison (hosts the AI sidebar of group 2)

+ + +

Adoption challenges (shares the AI sidebar of group 2)

+ +
+ diff --git a/modules/ROOT/examples/live-demos/tinymceai-multi-editor-groups/index.js b/modules/ROOT/examples/live-demos/tinymceai-multi-editor-groups/index.js new file mode 100644 index 0000000000..5eec82ad4b --- /dev/null +++ b/modules/ROOT/examples/live-demos/tinymceai-multi-editor-groups/index.js @@ -0,0 +1,165 @@ +// Step 1: Set up session - this should be part of the application's user management process. We simulate that here by creating a session for a random user. +const apiKey = '{{tinymceai_demo_api_key}}'; +const isLoggedIn = fetch(`https://demo.api.tiny.cloud/1/${apiKey}/auth/random`, { method: "POST", credentials: "include" }); + +const mentions_fetch = async (query, success) => { + const searchPhrase = query.term.toLowerCase(); + await fetch(`https://demouserdirectory.tiny.cloud/v1/users?q=${encodeURIComponent(searchPhrase)}`) + .then((response) => response.json()) + .then((users) => success(users.data.map((userInfo) => ({ + id: userInfo.id, + name: userInfo.name, + image: userInfo.avatar, + description: userInfo.custom.role + })))) + .catch(() => {}); +}; + +const fetch_users = (userIds) => Promise.all(userIds.map((userId) => fetch(`https://demouserdirectory.tiny.cloud/v1/users/${userId}`).then((response) => response.json()).catch(() => ({ id: userId })))); + +// Each editor seeds its revision history from its own textarea. +const createRevisionHistoryFetch = (selector) => () => { + const textarea = document.querySelector(selector); + const initialContent = textarea ? textarea.value : ''; + const revisions = [ + { + revisionId: '1', + createdAt: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() - 1, 14, 32, 0).getTime(), + author: { + id: 'jade-scott', + name: 'Jade Scott', + avatar: 'https://sneak-preview.tiny.cloud/demouserdirectory/images/employee_jade-scott_128_515dc6a1.jpg', + }, + content: initialContent + }, + { + revisionId: '0', + createdAt: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() - 1, 14, 32, 0).getTime(), + author: { + id: 'jade-scott', + name: 'Jade Scott', + avatar: 'https://sneak-preview.tiny.cloud/demouserdirectory/images/employee_jade-scott_128_515dc6a1.jpg', + }, + content: '' + } + ]; + return Promise.resolve(revisions.sort((a, b) => (new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1))); +}; + +// Share one TinyMCE AI configuration between every editor. Each editor sets its own group, so the page holds two independent groups. +const sharedSettings = { + height: '400px', + plugins: [ + 'autolink', 'link', 'emoticons', 'lists', 'table', 'advlist', 'searchreplace', 'wordcount', 'autocorrect', 'tinymcespellchecker', 'charmap', 'fullscreen', 'advcode', 'accordion', 'anchor', 'footnotes', 'powerpaste', 'importword', 'exportpdf', 'exportword', 'markdown', 'a11ychecker', 'typography', 'casechange', 'checklist', 'advtable', 'formatpainter', 'permanentpen', 'tableofcontents', 'help', 'math', 'linkchecker', 'media', 'mediaembed', + 'quickbars', 'tinymceai', 'tinycomments', 'mentions', 'revisionhistory', 'suggestededits', 'uploadcare' + ], + toolbar: 'undo redo | tinymceai-chat tinymceai-review ai-quickactions-translate | styles | bold italic | bullist numlist | link', + tinymceai_sidebar_type: 'floating', + quickbars_selection_toolbar: 'tinymceai-quickactions addcomment', + tinymceai_chat_welcome_message: '

Welcome to TinyMCE AI. Pick an action below or type your own prompt.

', + tinymceai_chat_welcome_actions: [ + { text: 'Here are some actions to get started:' }, + { title: 'Summarize the document', command: 'TinyMCEAIQuickActionsSummarize' }, + { title: 'Continue writing', command: 'TinyMCEAIQuickActionContinueWriting' }, + { title: 'Translate to Spanish', command: 'TinyMCEAIQuickActionTranslate', value: 'spanish' }, + { title: 'Review my document', command: 'ToggleSidebar', value: 'tinymceai-review' } + ], + toolbar_mode: 'sliding', + visual: false, + images_file_types: 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp,svg', + user_id: 'james-wilson', + spellchecker_active: true, + spellchecker_dialog: true, + uploadcare_public_key: '630992ad50fe2291c406', + uploadcare_store_type: 'temporary', + advcode_inline: true, + tinycomments_mode: 'embedded', + suggestededits_content: 'html', + mentions_item_type: 'profile', + mentions_fetch, + fetch_users, + revisionhistory_display_author: true, + tinymceai_token_provider: async () => { + // Step 2: Check we have a session then fetch JWT + return isLoggedIn.then(() => + fetch(`https://demo.api.tiny.cloud/1/${apiKey}/jwt/tinymceai`, { credentials: "include" }) + .then(resp => resp.text()) + .then(token => ({ token })) + ); + }, + tinymceai_chat_fetch_sources: () => Promise.resolve([{ + label: 'TinyMCE resources', + sources: [ + { id: 'docs', label: 'TinyMCE Documentation', type: 'web-resource' }, + { id: 'blog', label: 'Tiny Blog', type: 'web-resource' }, + { id: 'survey-2023', label: 'State of rich text editing 2023', type: 'web-resource' }, + ] + }]), + tinymceai_chat_fetch_source: (id) => { + const urls = { + 'docs': 'https://www.tiny.cloud/docs/tinymce/latest/', + 'blog': 'https://www.tiny.cloud/blog/', + 'survey-2023': 'https://www.tiny.cloud/developer-survey-results-2023/', + }; + return Promise.resolve({ type: 'web-resource', url: urls[id] }); + }, + tinymceai_quickactions_custom: [ + { + type: 'chat', + title: 'Challenge', + prompt: 'Challenge statements, verify facts and identify assumptions' + } + ], + tinymceai_languages: [ + { title: 'English', language: 'english' }, + { title: 'Chinese (Simplified)', language: 'chinese' }, + { title: 'Spanish', language: 'spanish' }, + { title: 'German', language: 'german' }, + { title: 'Japanese', language: 'japanese' }, + { title: 'Portuguese', language: 'portuguese' }, + { title: 'Swedish', language: 'swedish' }, + { title: 'Korean', language: 'korean' }, + { title: 'Hindi (Devanagari)', language: 'hindi devanagari' }, + { title: 'Italian', language: 'italian' }, + { title: 'Klingon', language: 'klingon' }, + { title: 'Dothraki', language: 'dothraki' }, + ] +}; + +// Group 1: the Introduction and Native integration editors share one AI sidebar. +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-groups-introduction', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-groups-introduction'), + tinymceai_group: 'article-opening', + tinymceai_document_name: 'Introduction', + tinymceai_document_description: 'The introduction of the article. A title, a short paragraph that sets out the topic, and a figure.' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-groups-native-integration', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-groups-native-integration'), + tinymceai_group: 'article-opening', + tinymceai_document_name: 'Native integration', + tinymceai_document_description: 'The section on moving from external AI tools to AI built into the editor, with a bulleted list of benefits.' +}); + +// Group 2: the Workflow comparison and Adoption challenges editors share a separate AI sidebar and never see the content of group 1. +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-groups-workflow-comparison', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-groups-workflow-comparison'), + tinymceai_group: 'article-analysis', + tinymceai_document_name: 'Workflow comparison', + tinymceai_document_description: 'The section that compares traditional and AI-enhanced workflows. Keep the comparison table.' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-groups-adoption-challenges', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-groups-adoption-challenges'), + tinymceai_group: 'article-analysis', + tinymceai_document_name: 'Adoption challenges', + tinymceai_document_description: 'The closing section on adoption challenges. Two short paragraphs.' +}); diff --git a/modules/ROOT/examples/live-demos/tinymceai-multi-editor/example.js b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/example.js new file mode 100644 index 0000000000..59f9baea49 --- /dev/null +++ b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/example.js @@ -0,0 +1,74 @@ +// Open-source plugins below are only for editing the demo HTML (lists, links, tables). TinyMCE AI options are the focus. +// Share one TinyMCE AI configuration between every editor in the group. +const sharedSettings = { + height: '400px', + plugins: ['tinymceai', 'advlist', 'lists', 'link', 'autolink', 'table', 'wordcount'], + toolbar: 'undo redo | tinymceai-chat tinymceai-review ai-quickactions-translate | styles | bold italic | bullist numlist | link', + tinymceai_sidebar_type: 'floating', + tinymceai_chat_welcome_message: '

Welcome to TinyMCE AI. Pick an action below or type your own prompt.

', + tinymceai_chat_welcome_actions: [ + { text: 'Here are some actions to get started:' }, + { title: 'Summarize the document', command: 'TinyMCEAIQuickActionsSummarize' }, + { title: 'Continue writing', command: 'TinyMCEAIQuickActionContinueWriting' }, + { title: 'Translate to Spanish', command: 'TinyMCEAIQuickActionTranslate', value: 'spanish' }, + { title: 'Review my document', command: 'ToggleSidebar', value: 'tinymceai-review' } + ], + tinymceai_token_provider: async () => { + return fetch('/api/token', { credentials: 'include' }) + .then(resp => resp.text()) + .then(token => ({ token })); + }, + tinymceai_chat_fetch_sources: () => Promise.resolve([{ + label: 'TinyMCE resources', + sources: [ + { id: 'docs', label: 'TinyMCE Documentation', type: 'web-resource' }, + { id: 'blog', label: 'Tiny Blog', type: 'web-resource' }, + { id: 'survey-2023', label: 'State of rich text editing 2023', type: 'web-resource' }, + ] + }]), + tinymceai_chat_fetch_source: (id) => { + const urls = { + 'docs': 'https://www.tiny.cloud/docs/tinymce/latest/', + 'blog': 'https://www.tiny.cloud/blog/', + 'survey-2023': 'https://www.tiny.cloud/developer-survey-results-2023/', + }; + return Promise.resolve({ type: 'web-resource', url: urls[id] }); + }, + tinymceai_quickactions_custom: [ + { + type: 'chat', + title: 'Challenge', + prompt: 'Challenge statements, verify facts and identify assumptions' + } + ], + tinymceai_languages: [ + { title: 'English', language: 'english' }, + { title: 'Chinese (Simplified)', language: 'chinese' }, + { title: 'Spanish', language: 'spanish' }, + { title: 'German', language: 'german' }, + { title: 'Japanese', language: 'japanese' }, + { title: 'Portuguese', language: 'portuguese' }, + { title: 'Swedish', language: 'swedish' }, + { title: 'Korean', language: 'korean' }, + { title: 'Hindi (Devanagari)', language: 'hindi devanagari' }, + { title: 'Italian', language: 'italian' }, + { title: 'Klingon', language: 'klingon' }, + { title: 'Dothraki', language: 'dothraki' }, + ] +}; + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-introduction', + tinymceai_group: 'article', + tinymceai_document_name: 'Introduction', + tinymceai_document_description: 'The introduction of the article. A title, a short paragraph that sets out the topic, and a figure.' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-body', + tinymceai_group: 'article', + tinymceai_document_name: 'Body', + tinymceai_document_description: 'The main body of the article. Uses h2 and h3 subheadings, short paragraphs, a bulleted list, and a comparison table.' +}); diff --git a/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.html b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.html new file mode 100644 index 0000000000..6c2a5ef576 --- /dev/null +++ b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.html @@ -0,0 +1,62 @@ +

Introduction (first editor in the group)

+ + +

Body (shares the AI sidebar with the Introduction)

+ diff --git a/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.js b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.js new file mode 100644 index 0000000000..600056c785 --- /dev/null +++ b/modules/ROOT/examples/live-demos/tinymceai-multi-editor/index.js @@ -0,0 +1,145 @@ +// Step 1: Set up session - this should be part of the application's user management process. We simulate that here by creating a session for a random user. +const apiKey = '{{tinymceai_demo_api_key}}'; +const isLoggedIn = fetch(`https://demo.api.tiny.cloud/1/${apiKey}/auth/random`, { method: "POST", credentials: "include" }); + +const mentions_fetch = async (query, success) => { + const searchPhrase = query.term.toLowerCase(); + await fetch(`https://demouserdirectory.tiny.cloud/v1/users?q=${encodeURIComponent(searchPhrase)}`) + .then((response) => response.json()) + .then((users) => success(users.data.map((userInfo) => ({ + id: userInfo.id, + name: userInfo.name, + image: userInfo.avatar, + description: userInfo.custom.role + })))) + .catch(() => {}); +}; + +const fetch_users = (userIds) => Promise.all(userIds.map((userId) => fetch(`https://demouserdirectory.tiny.cloud/v1/users/${userId}`).then((response) => response.json()).catch(() => ({ id: userId })))); + +// Each editor seeds its revision history from its own textarea. +const createRevisionHistoryFetch = (selector) => () => { + const textarea = document.querySelector(selector); + const initialContent = textarea ? textarea.value : ''; + const revisions = [ + { + revisionId: '1', + createdAt: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() - 1, 14, 32, 0).getTime(), + author: { + id: 'jade-scott', + name: 'Jade Scott', + avatar: 'https://sneak-preview.tiny.cloud/demouserdirectory/images/employee_jade-scott_128_515dc6a1.jpg', + }, + content: initialContent + }, + { + revisionId: '0', + createdAt: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() - 1, 14, 32, 0).getTime(), + author: { + id: 'jade-scott', + name: 'Jade Scott', + avatar: 'https://sneak-preview.tiny.cloud/demouserdirectory/images/employee_jade-scott_128_515dc6a1.jpg', + }, + content: '' + } + ]; + return Promise.resolve(revisions.sort((a, b) => (new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1))); +}; + +// Share one TinyMCE AI configuration between every editor in the group. +const sharedSettings = { + height: '400px', + plugins: [ + 'autolink', 'link', 'emoticons', 'lists', 'table', 'advlist', 'searchreplace', 'wordcount', 'autocorrect', 'tinymcespellchecker', 'charmap', 'fullscreen', 'advcode', 'accordion', 'anchor', 'footnotes', 'powerpaste', 'importword', 'exportpdf', 'exportword', 'markdown', 'a11ychecker', 'typography', 'casechange', 'checklist', 'advtable', 'formatpainter', 'permanentpen', 'tableofcontents', 'help', 'math', 'linkchecker', 'media', 'mediaembed', + 'quickbars', 'tinymceai', 'tinycomments', 'mentions', 'revisionhistory', 'suggestededits', 'uploadcare' + ], + toolbar: 'undo redo | tinymceai-chat tinymceai-review ai-quickactions-translate | styles | bold italic | bullist numlist | link', + tinymceai_sidebar_type: 'floating', + quickbars_selection_toolbar: 'tinymceai-quickactions addcomment', + tinymceai_chat_welcome_message: '

Welcome to TinyMCE AI. Pick an action below or type your own prompt.

', + tinymceai_chat_welcome_actions: [ + { text: 'Here are some actions to get started:' }, + { title: 'Summarize the document', command: 'TinyMCEAIQuickActionsSummarize' }, + { title: 'Continue writing', command: 'TinyMCEAIQuickActionContinueWriting' }, + { title: 'Translate to Spanish', command: 'TinyMCEAIQuickActionTranslate', value: 'spanish' }, + { title: 'Review my document', command: 'ToggleSidebar', value: 'tinymceai-review' } + ], + toolbar_mode: 'sliding', + visual: false, + images_file_types: 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp,svg', + user_id: 'james-wilson', + spellchecker_active: true, + spellchecker_dialog: true, + uploadcare_public_key: '630992ad50fe2291c406', + uploadcare_store_type: 'temporary', + advcode_inline: true, + tinycomments_mode: 'embedded', + suggestededits_content: 'html', + mentions_item_type: 'profile', + mentions_fetch, + fetch_users, + revisionhistory_display_author: true, + tinymceai_token_provider: async () => { + // Step 2: Check we have a session then fetch JWT + return isLoggedIn.then(() => + fetch(`https://demo.api.tiny.cloud/1/${apiKey}/jwt/tinymceai`, { credentials: "include" }) + .then(resp => resp.text()) + .then(token => ({ token })) + ); + }, + tinymceai_chat_fetch_sources: () => Promise.resolve([{ + label: 'TinyMCE resources', + sources: [ + { id: 'docs', label: 'TinyMCE Documentation', type: 'web-resource' }, + { id: 'blog', label: 'Tiny Blog', type: 'web-resource' }, + { id: 'survey-2023', label: 'State of rich text editing 2023', type: 'web-resource' }, + ] + }]), + tinymceai_chat_fetch_source: (id) => { + const urls = { + 'docs': 'https://www.tiny.cloud/docs/tinymce/latest/', + 'blog': 'https://www.tiny.cloud/blog/', + 'survey-2023': 'https://www.tiny.cloud/developer-survey-results-2023/', + }; + return Promise.resolve({ type: 'web-resource', url: urls[id] }); + }, + tinymceai_quickactions_custom: [ + { + type: 'chat', + title: 'Challenge', + prompt: 'Challenge statements, verify facts and identify assumptions' + } + ], + tinymceai_languages: [ + { title: 'English', language: 'english' }, + { title: 'Chinese (Simplified)', language: 'chinese' }, + { title: 'Spanish', language: 'spanish' }, + { title: 'German', language: 'german' }, + { title: 'Japanese', language: 'japanese' }, + { title: 'Portuguese', language: 'portuguese' }, + { title: 'Swedish', language: 'swedish' }, + { title: 'Korean', language: 'korean' }, + { title: 'Hindi (Devanagari)', language: 'hindi devanagari' }, + { title: 'Italian', language: 'italian' }, + { title: 'Klingon', language: 'klingon' }, + { title: 'Dothraki', language: 'dothraki' }, + ] +}; + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-introduction', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-introduction'), + tinymceai_group: 'article', + tinymceai_document_name: 'Introduction', + tinymceai_document_description: 'The introduction of the article. A title, a short paragraph that sets out the topic, and a figure.' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#tinymceai-multi-editor-body', + revisionhistory_fetch: createRevisionHistoryFetch('textarea#tinymceai-multi-editor-body'), + tinymceai_group: 'article', + tinymceai_document_name: 'Body', + tinymceai_document_description: 'The main body of the article. Uses h2 and h3 subheadings, short paragraphs, a bulleted list, and a comparison table.' +}); diff --git a/modules/ROOT/images/tinymceai/tinymceai-context-tag.png b/modules/ROOT/images/tinymceai/tinymceai-context-tag.png new file mode 100644 index 0000000000000000000000000000000000000000..b04ead3a52184cf922743408ea41a963a83e9110 GIT binary patch literal 2651 zcmV-h3Z(UkP)smvONu!=>Dy@1n8ke9LQKC{cF-GZU@7?>mzxzf&o#mHFFF}x23Id)J01aBKNoJRj3dz2+ zjaIgUeHPfS+%jn;{dq?~i#3^%NjBK+?uqpweiCo0}V2>@m|g2bh6NBfL}s zzCL#qdHMNJxV!VpDA}n(65=rtZFGCUiQnGf#nBE133wRQ-?|4+Gg3a}uG z(0Ky!+moshn<5ea7bWQUNpOzXM+%U#wm+3xySq&3qDj z2v$*XG4wh$&8a}S(E%dQ5QRuD;Oey;v~I0~hr5T%XAlR&X}C!IB|)WBLaWiDZ`U>$ z(618)Jl75Vy0u0BetjHZw`q&BUw(zqNz+hNUIQ=B`V)f^0D|3$xK*pLecQ*lbMG$B zetQnFbLJu_cpUEJ8ld%-@ddH`OuH zf`!O`P(YE4Mp+~Bk#>PrXQc<3trE(sfwD>oEQ5@cD++~zfRn+$YZsh3bqc4?UVx{f z{+X!D0b8Gpc7Msz#W=M4pE!MNA1Cgw7p0(8hZ5_ZNT2=9%W))Gr%cSekw-P8n1FA9 zz9{7_e{oucQiXd}Ponfo+M$5x;RWBEl!4XOE6BRin88uHP!EfcEX$ zAvtjmPJW((bsxMBm6sZ>X-VRAWnPcrhLbAUg*w3%%cMItC*rMI-y}UFdyvd=tZ`OvT!D@jU7@o+5H` z9^jSNhT-DnE6}JKaElzTsI;L=dkr?lui=qDcm6Vz8fvgVEjr%)8j5%h=OqN288-&lbyEVskorxiBGuZ3Q( zM`Y|0?D}L6W=2I~+T;-^t)T*FZoE=yGQjKs3`>Ji0zD5E6-J((aG?U2Uvilox3jbH zZQ6NyrJ?Y_0~8b%;rg8ie9Zm>$>`X#C*E5=8!8V4LWaJ8DbbNQkbIcmPd;)46Q{h5 zal;3pRV#O_S~45m2Mj?;aVfta5gvxpG6T}muW_Fa96Ewgqe6KRt*LRbE_xZN>}X5j z|GU5eRE%#@v|126Jc!>nnXFGF1DgzRQ_V&z&Mz#Wh?tI)gpK&>&~DtkbQXG20HI^X zfn{C+Rr1aq12}z@Ryk6!SN9$;7|KvkVMj?x2`P`R{5k`Jlq0%y>Vz7znP2PQBLIDS z^}^B5PoSX0i0u3K5I#N(wQMST!>P?^K}Ho*N3^ml=>#@y*^0_J%P#bw%?NzHCn~EYI4ctD zj-J%UkuTG*`tR#8I%FhfP8o$|3umLY){I$m9EDFyJ~UPaK2?C(0$6%kN!nfbE(70F zWlueqNfr7Sq9db8s*NCNCdb%O!7vmQV*1<_$jvuk^CyRqux&f0Ob+MsObQFb;k^me z03F0#x<7Ym9CELmgHq|JV3freJMs;bSCnJT>b00KZY-2CR+yYQC%}gqphG9lW8u=} zc$3t^!da7HsFC2SQDW1EHJomyMa3eoppq+^#+dU?4t3p{$pjr0CKbsYT7TW0$E}^e zj*n&FHDoL~S$Ein()ZuTkK@!g-*8=OqgQZfDAv69R~RiIz3q>^q)w(s&!BN%pqie) zG;SqkygdeGwBX2yk+^kd1?H0`jr+hC!-Ik_baVvGW#i9bomK}wPrNvA5UysNLul|Y zm}p+st+|ppIk|ZlH+mEn%zTq~m!@hvWrzSjDtznKzK?yM9wdq~5FTD=j5+P(*ddQM z3F?sW7@Ya~BxcT<35&(@GqLVL=M(qyadmEH&YJ)_wT-`Jh)PJq(oMrfM5nsbo+S8(g`bPm8a{ zuYc7AMzfW4c`fO34{9nzP~(LcgC~(*R^p4Kk5EY3-R??RF%G5xQhJDVrUBw~JEt>d ztZ7lJWn9G&OVEASZ9VJcoF7-x1AU2aGOpgkjCu2sed`Vsk|JOyDikb6a3=BoZ_|J*s=-aa`O3GbJD@T!YfX1Hnv+=AeBv7Tg_pZz}z%vJ%_)lECJX%16UkxEOyfzL?FO`0$s&-ZDM0>h7y z_%!Vyz-0um^DjB;jsr#U$Ef?MG52kh;%3XUJuYMcq4pvQp;Tw>d@0GghsE{j`yzlf z>lf+$OHN0UbLQH{$&zP%7AvE6+hiiHuKO%LOMe8U(s2>u&|<%c(UHqeF+eY*lDujG zxtWb&+CeAmc$7cv>wDtZwn{KR literal 0 HcmV?d00001 diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 366559b36c..05bad34f08 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -258,6 +258,7 @@ **** xref:tinymceai-chat.adoc[Chat] **** xref:tinymceai-review.adoc[Review] **** xref:tinymceai-actions.adoc[Actions] +**** xref:tinymceai-multi-editor.adoc[Multi-editor mode] **** xref:tinymceai-models.adoc[AI models] **** xref:tinymceai-limits.adoc[Limits] **** xref:tinymceai-integration-options.adoc[Integration options] diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 11148912fb..c38e59de1d 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.0-release-notes.adoc @@ -221,7 +221,18 @@ For information on the **Suggested Edits** plugin, see: xref:suggestededits.adoc The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin. -**TinyMCE AI** includes the following improvements and fixes. +**TinyMCE AI** includes the following addition, improvements and fixes. + +==== New multi-editor support +// #TINYMCE-14817 + +Previously, the **TinyMCE AI** plugin worked with one editor at a time. When related content was split across several editors on a page, users had to run Chat, Review, and Quick Actions in each editor separately, and the AI had no context from the other editors. + +In {productname} {release-version}, the **TinyMCE AI** plugin can group editors on the same page. Editors that share a xref:tinymceai.adoc#tinymceai_group[`+tinymceai_group+`] value share one Chat sidebar and one Review sidebar. Chat, Review, and Quick Actions work across the content of every editor in the group, and the plugin previews and applies each change in the editor it belongs to. The Review sidebar groups suggestions under the name of the editor they belong to. + +The xref:tinymceai.adoc#tinymceai_document_name[`+tinymceai_document_name+`] option names the content of each editor, and the xref:tinymceai.adoc#tinymceai_document_description[`+tinymceai_document_description+`] option describes that content to the AI service. + +For information on multi-editor mode, see xref:tinymceai-multi-editor.adoc[Multi-editor mode]. ==== Applying or skipping all quick action suggestions did nothing when the Review sidebar was open // #TINYMCE-14293 diff --git a/modules/ROOT/pages/tinymceai-actions.adoc b/modules/ROOT/pages/tinymceai-actions.adoc index bad22cd5aa..5078a74be7 100644 --- a/modules/ROOT/pages/tinymceai-actions.adoc +++ b/modules/ROOT/pages/tinymceai-actions.adoc @@ -298,3 +298,4 @@ The https://tinymceai.api.tiny.cloud/docs#tag/Actions[Actions API] reference (in * xref:tinymceai-chat.adoc[AI Chat]: For interactive discussions with document analysis and context. * xref:tinymceai-review.adoc[AI Review]: For content quality analysis and improvement suggestions. +* xref:tinymceai-multi-editor.adoc[Multi-editor mode]: For sharing Chat, Review, and Quick Actions across several editors on one page. diff --git a/modules/ROOT/pages/tinymceai-chat.adoc b/modules/ROOT/pages/tinymceai-chat.adoc index e110299faa..ba69e993bb 100644 --- a/modules/ROOT/pages/tinymceai-chat.adoc +++ b/modules/ROOT/pages/tinymceai-chat.adoc @@ -287,3 +287,4 @@ The https://tinymceai.api.tiny.cloud/docs[interactive API documentation] lists e * xref:tinymceai-review.adoc[AI Review]: For content quality analysis and improvement suggestions. * xref:tinymceai-actions.adoc[Quick actions]: For fast, stateless content transformations. +* xref:tinymceai-multi-editor.adoc[Multi-editor mode]: For sharing Chat, Review, and Quick Actions across several editors on one page. diff --git a/modules/ROOT/pages/tinymceai-multi-editor.adoc b/modules/ROOT/pages/tinymceai-multi-editor.adoc new file mode 100644 index 0000000000..417a9fd0fd --- /dev/null +++ b/modules/ROOT/pages/tinymceai-multi-editor.adoc @@ -0,0 +1,134 @@ += TinyMCE AI multi-editor mode +:navtitle: Multi-editor mode +:pluginname: TinyMCE AI +:plugincode: tinymceai +:description: Group several editors on one page so that they share TinyMCE AI Chat, Review, and Quick Actions +:description_short: multi-editor mode +:keywords: AI, multi-editor, multiple editors, group, tinymceai + +include::partial$misc/admon-requires-8.10v.adoc[] + +Multi-editor mode groups several {productname} editors on the same page so that they share one Chat sidebar and one Review sidebar. Use multi-editor mode when a page splits related content across several editors, for example a form with separate editors for a summary and a body, or a page that edits several related articles side by side. + +In a group, Chat, Review, and Quick Actions work across the content of every editor. The {pluginname} plugin identifies the content of each editor by name, and previews and applies each change in the editor it belongs to. + +[[demo]] +== Demo + +The demo below splits an article across an Introduction editor and a Body editor in one group. Select the image:icons-premium/ai-assistant.svg[Chat icon,24px] Chat toolbar button in either editor to open the shared Chat sidebar, which the first editor hosts. Then ask the AI to change both parts of the article, or run a review over both editors. + +liveDemo::tinymceai-multi-editor[] + +include::partial$misc/admon-inline-not-supported.adoc[] + +[[how-grouped-editors-work]] +== How grouped editors work + +[[shared-sidebar]] +=== Shared sidebar + +The first editor of the group to be created hosts the shared Chat sidebar and Review sidebar. The Chat and Review toolbar buttons and menu items in every other editor of the group open, close, and focus that shared sidebar. + +[[chat]] +=== Chat + +By default, each chat prompt includes the content of every editor in the group. Each editor appears above the prompt as a context tag labeled with its xref:tinymceai.adoc#tinymceai_document_name[`+tinymceai_document_name+`] value, for example image:tinymceai/tinymceai-context-tag.png[Body context tag] for an editor named `+Body+`. + +Users can change which editors the AI works with: + +* Removing a context tag leaves the content of that editor out of the prompt, and the AI does not change that editor. +* The **Add context source** menu lists every editor in the group and adds a removed editor back. + +After a message is sent, the editors included in that message stay in the conversation and their context tags cannot be removed until the user starts a new conversation. Editors that were left out can still be added from the **Add context source** menu at any point in the conversation. + +The AI can change the content of any editor in the conversation, and the plugin previews and applies each change in the editor it belongs to. To direct a request at the content of one editor, name that content in the prompt, for example _"Shorten the Introduction"_. For more information about chat, see xref:tinymceai-chat.adoc[Chat]. + +[[review]] +=== Review + +A review analyzes the content of every editor in the group. The Review sidebar groups suggestions under the name of the editor they belong to and shows the number of pending suggestions in each group. A review always covers the whole group. For more information about reviews, see xref:tinymceai-review.adoc[Review]. + +[[quick-actions]] +=== Quick Actions + +Users can run a Quick Action from any editor in the group. What the Quick Action changes depends on whether text is selected in that editor: + +* With text selected, the Quick Action changes only the selected text in that editor. +* With no text selected, the Quick Action changes the whole content of every editor in the group and ignores any text selected in the other editors. For example, running **Translate** with no text selected translates every editor in the group. + +Chat actions, such as **Explain**, **Summarize**, and **Highlight key points**, open the shared Chat sidebar and start a conversation that includes every editor in the group, as described in xref:#chat[Chat]. For more information about Quick Actions, see xref:tinymceai-actions.adoc[Quick Actions]. + +[[previewing-and-applying-changes]] +=== Previewing and applying changes + +While the {pluginname} plugin previews changes from Chat or Quick Actions, each affected editor shows its own preview and is read-only. The whole group shares one change toolbar: + +* The change counter covers the changes in every editor of the group. +* The next and previous buttons move between changes across editors. +* Selecting a change in any editor moves the change toolbar to that change. +* Accepting or rejecting a change applies it to the editor that holds the change. + +[[discarding-suggestions]] +=== Discarding pending suggestions + +When any editor in the group has pending suggestions, the {pluginname} plugin asks for confirmation before it discards them and starts a different AI task. For example, the confirmation dialog appears when the user switches between the Chat sidebar and the Review sidebar, or runs a Quick Action while a review has pending suggestions. + +If the user confirms, the plugin discards the pending suggestions in every editor of the group and returns each editor to normal editing. If the user cancels, the plugin keeps every preview and pending suggestion. + +[[integration]] +== Integration + +To group editors, load the `+tinymceai+` plugin in each editor and set the same xref:tinymceai.adoc#tinymceai_group[`+tinymceai_group+`] value on each editor in the group. Give each editor a unique xref:tinymceai.adoc#tinymceai_document_name[`+tinymceai_document_name+`] value, and optionally a xref:tinymceai.adoc#tinymceai_document_description[`+tinymceai_document_description+`] value that describes the content to the AI. + +Multi-editor mode is supported with the floating sidebar. Set xref:tinymceai.adoc#tinymceai_sidebar_type[`+tinymceai_sidebar_type+`] to `+'floating'+` for every editor in the group. + +Use the same {pluginname} configuration for every editor in a group, for example by sharing a settings object between the `+tinymce.init+` calls: + +[source,js] +---- +const sharedSettings = { + plugins: 'tinymceai', + toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review', + tinymceai_sidebar_type: 'floating', + tinymceai_group: 'article', + // Required for authentication + tinymceai_token_provider: () => { + return fetch('/api/token').then(r => r.text()).then(token => ({ token })); + } +}; + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#introduction', // change this value according to the HTML + tinymceai_document_name: 'Introduction', + tinymceai_document_description: 'The introduction of the article. A short paragraph that sets out the topic and hooks the reader.' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#body', // change this value according to the HTML + tinymceai_document_name: 'Body', + tinymceai_document_description: 'The main body of the article. Uses h2 subheadings and short paragraphs.' +}); +---- + +Grouped editors must be on the same page and use the same `+tinymce+` instance. Set xref:tinymceai.adoc#tinymceai_group[`+tinymceai_group+`] in the initial configuration of each editor. + +For information about installing the plugin and enabling AI features, see xref:tinymceai.adoc[Plugin Reference]. + +[[multiple-groups]] +=== Multiple groups on one page + +A page can contain several independent groups, each with a different xref:tinymceai.adoc#tinymceai_group[`+tinymceai_group+`] value. Each group has its own shared sidebar, and an editor in one group never receives the content of an editor in another group. For a configuration with two groups, see the xref:tinymceai.adoc#tinymceai_group[two-group example]. + +[[configuration]] +== Configuration + +For the options that configure multi-editor mode, see xref:tinymceai.adoc#options-multi-editor[Options for multi-editor mode]. + +[[related-features]] +== Related features + +* xref:tinymceai-chat.adoc[AI Chat]: For interactive discussions with document analysis and context. +* xref:tinymceai-review.adoc[AI Review]: For content quality analysis and improvement suggestions. +* xref:tinymceai-actions.adoc[Quick Actions]: For fast, stateless content transformations. diff --git a/modules/ROOT/pages/tinymceai-review.adoc b/modules/ROOT/pages/tinymceai-review.adoc index 2ceef933e9..738f1db662 100644 --- a/modules/ROOT/pages/tinymceai-review.adoc +++ b/modules/ROOT/pages/tinymceai-review.adoc @@ -134,3 +134,4 @@ The https://tinymceai.api.tiny.cloud/docs#tag/Reviews[Reviews API] reference (in * xref:tinymceai-chat.adoc[AI chat]: For interactive discussions with document analysis and context. * xref:tinymceai-actions.adoc[Quick actions]: Shortcuts to individual AI operations on a selection or range (transformations, translation, chat, and custom actions). +* xref:tinymceai-multi-editor.adoc[Multi-editor mode]: For sharing Chat, Review, and Quick Actions across several editors on one page. diff --git a/modules/ROOT/partials/configuration/tinymceai_options.adoc b/modules/ROOT/partials/configuration/tinymceai_options.adoc index 73902da544..b1664d75ae 100644 --- a/modules/ROOT/partials/configuration/tinymceai_options.adoc +++ b/modules/ROOT/partials/configuration/tinymceai_options.adoc @@ -847,3 +847,136 @@ tinymceai_reviews: [ ] ---- +[[options-multi-editor]] +== Options for multi-editor mode + +These options group several editors on the same page so that they share one Chat sidebar and one Review sidebar, and Chat, Review, and Quick Actions work across the content of every editor in the group. The options also identify the content of each editor to users and to the AI service. For a description of how grouped editors work, see xref:tinymceai-multi-editor.adoc[Multi-editor mode]. + +include::partial$misc/admon-requires-8.10v.adoc[] + +[[tinymceai_group]] +=== `+tinymceai_group+` + +Adds the editor to a named group. Editors on the same page with the same `+tinymceai_group+` value share one Chat sidebar and one Review sidebar. In a group, Chat, Review, and Quick Actions work across the content of every editor. The editor created first in the group hosts the shared sidebars. + +The plugin uses the group name only to match editors, and never shows the name to users or sends it to the AI service. A page can contain several independent groups, each with a different name. Editors in one group never receive content from another group. + +An editor without this option does not belong to any group. It has its own Chat sidebar and Review sidebar, and works only with its own content, even when other editors on the same page belong to a group. + +For more details and a live demo, see xref:tinymceai-multi-editor.adoc[Multi-editor mode]. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +.Example: two independent groups on one page +[source,js] +---- +const sharedSettings = { + plugins: 'tinymceai', + toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review', + tinymceai_sidebar_type: 'floating', + // Required for authentication + tinymceai_token_provider: () => { + return fetch('/api/token').then(r => r.text()).then(token => ({ token })); + } +}; + +// Group "article": the introduction and body editors share one AI sidebar. +tinymce.init({ + ...sharedSettings, + selector: 'textarea#introduction', // change this value according to the HTML + tinymceai_group: 'article' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#body', // change this value according to the HTML + tinymceai_group: 'article' +}); + +// Group "notes": a separate AI sidebar that never receives the content of the "article" group. +tinymce.init({ + ...sharedSettings, + selector: 'textarea#research-notes', // change this value according to the HTML + tinymceai_group: 'notes' +}); + +tinymce.init({ + ...sharedSettings, + selector: 'textarea#review-notes', // change this value according to the HTML + tinymceai_group: 'notes' +}); +---- + +[NOTE] +==== +Set this option in the initial configuration of the editor. Changing this option after the editor initializes is not supported. +==== + +[[tinymceai_document_name]] +=== `+tinymceai_document_name+` + +The name of the content in the editor. The {pluginname} plugin uses this name to: + +* Label the content of the editor in the Chat sidebar, including the context tags of a prompt and the chat history. +* Label the group of suggestions for the editor in the Review sidebar. +* Name the content that the plugin sends to the AI service with a chat prompt, so that the AI can refer to it and tell it apart from the content of other editors. +* Match each editor to its content when a user resumes a conversation from the chat history. + +When this option is not set, the plugin uses the editor ID as the name, for example `+mce_0+` or the ID of the target element. Set a descriptive name for each editor in a group, because an editor ID does not identify the content to users or to the AI service. + +The plugin removes leading and trailing whitespace from the value. A value that is empty or longer than 255 characters is not valid. When the value is not valid, {productname} logs a warning to the browser console and the plugin uses the editor ID instead. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +.Example +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to the HTML + plugins: 'tinymceai', + toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review', + tinymceai_group: 'report', + tinymceai_document_name: 'Executive summary', + // Required for authentication + tinymceai_token_provider: () => { + return fetch('/api/token').then(r => r.text()).then(token => ({ token })); + } +}); +---- + +[IMPORTANT] +==== +Give each editor in a group a unique name, and keep each name the same across page loads. When a user resumes a conversation from the chat history, the plugin matches the stored content to editors by name. If two editors in a group share a name, the plugin can match content to the wrong editor. If a name changes, the plugin no longer matches conversations saved with the previous name to that editor. +==== + +[[tinymceai_document_description]] +=== `+tinymceai_document_description+` + +A short description of the content in the editor, such as its purpose, format, length limits, or audience. The {pluginname} plugin sends the description to the AI service with the content of the editor when a user submits a chat prompt. The AI uses the description as additional context, for example to keep a title short or to apply a change only to the relevant content. + +Users do not see the description. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +.Example +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to the HTML + plugins: 'tinymceai', + toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review', + tinymceai_group: 'blog-post', + tinymceai_document_name: 'Blog post body', + tinymceai_document_description: 'The main body of the blog post. Uses h2 subheadings and short paragraphs.', + // Required for authentication + tinymceai_token_provider: () => { + return fetch('/api/token').then(r => r.text()).then(token => ({ token })); + } +}); +---- diff --git a/modules/ROOT/partials/misc/admon-requires-8.10v.adoc b/modules/ROOT/partials/misc/admon-requires-8.10v.adoc new file mode 100644 index 0000000000..8cfaa251e1 --- /dev/null +++ b/modules/ROOT/partials/misc/admon-requires-8.10v.adoc @@ -0,0 +1 @@ +NOTE: This feature is only available for {productname} 8.10 and later. From 6cc9d87a46d029df2e6eaa15102dc1dc938e5938 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 14 Oct 2026 12:01:35 +1000 Subject: [PATCH 30/33] TINYDOC-3574: Nested parts of the same suggestion showed duplicate highlights. (#4386) --- modules/ROOT/pages/8.10.0-release-notes.adoc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index c38e59de1d..1671f217b1 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.0-release-notes.adoc @@ -71,6 +71,7 @@ The {productname} {release-version} release includes an accompanying release of For information on the **** plugin, see: xref:.adoc[]. + === Image Editing The {productname} {release-version} release includes an accompanying release of the **Image Editing** premium plugin. @@ -207,7 +208,7 @@ Previously, feedback on a suggestion that contained a long string with no spaces In {productname} {release-version}, long feedback text wraps onto new lines within the suggestion card, and the buttons and text box of the card remain aligned. -==== Nested parts of the same suggestion showed duplicate highlights +=== Nested parts of the same suggestion showed duplicate highlights // #TINYMCE-14358 Previously, when one suggestion changed both an element and the content inside it, such as the font size of a list, the Review edits view highlighted the element, then highlighted each part of the content inside it again. The Review edits view also stacked the selection styling when the suggestion was selected. The stacked styling made the change cluttered and harder to read. @@ -234,6 +235,13 @@ The xref:tinymceai.adoc#tinymceai_document_name[`+tinymceai_document_name+`] opt For information on multi-editor mode, see xref:tinymceai-multi-editor.adoc[Multi-editor mode]. +==== Nested parts of the same suggestion showed duplicate highlights +// #TINYMCE-14358 + +Previously, when one suggestion changed both an element and the content inside it, such as a modified list item and its modified text, the **TinyMCE AI** plugin applied the highlight, selection, and preview highlight styling to the element and again to the content inside it. The stacked styling appeared in **Diff mode** and **Preview** for Chat, Quick Actions, and Review suggestions. It made the suggestion cluttered and harder to read. + +In {productname} {release-version}, the **TinyMCE AI** plugin applies the highlight, selection, and preview highlight styling only once for each suggestion, on the outermost element that the suggestion changes, in both **Diff mode** and **Preview**. Content inside that element no longer repeats the styling. + ==== Applying or skipping all quick action suggestions did nothing when the Review sidebar was open // #TINYMCE-14293 From a7b3b9705a3b85e368ff68c10c85389e0a238561 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 14 Oct 2026 12:10:32 +1000 Subject: [PATCH 31/33] TINYDOC-3574: Fix a misplaced Suggested Edits heading, add the TinyMCE AI red X entry, and remove unused template sections. --- modules/ROOT/nav.adoc | 10 -- modules/ROOT/pages/8.10.0-release-notes.adoc | 162 ++----------------- 2 files changed, 12 insertions(+), 160 deletions(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 05bad34f08..9489a27130 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -425,20 +425,10 @@ ** xref:release-notes.adoc[Release notes for {productname}] *** {productname} 8.10.0 **** xref:8.10.0-release-notes.adoc#overview[Overview] -**** xref:8.10.0-release-notes.adoc#new-premium-plugin[New Premium Plugin] -**** xref:8.10.0-release-notes.adoc#new-open-source-plugin[New Open Source Plugin] **** xref:8.10.0-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] -**** xref:8.10.0-release-notes.adoc#accompanying-premium-plugin-end-of-life-announcement[Accompanying Premium Plugin end-of-life announcement] -**** xref:8.10.0-release-notes.adoc#accompanying-open-source-plugin-end-of-life-announcement[Accompanying Open Source Plugin end-of-life announcement] **** xref:8.10.0-release-notes.adoc#accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] -**** xref:8.10.0-release-notes.adoc#improvements[Improvements] **** xref:8.10.0-release-notes.adoc#additions[Additions] -**** xref:8.10.0-release-notes.adoc#changes[Changes] -**** xref:8.10.0-release-notes.adoc#removed[Removed] **** xref:8.10.0-release-notes.adoc#bug-fixes[Bug fixes] -**** xref:8.10.0-release-notes.adoc#security-fixes[Security fixes] -**** xref:8.10.0-release-notes.adoc#deprecated[Deprecated] -**** xref:8.10.0-release-notes.adoc#known-issues[Known issues] *** {productname} 8.9.3 **** xref:8.9.3-release-notes.adoc#overview[Overview] **** xref:8.9.3-release-notes.adoc#security-fixes[Security fixes] diff --git a/modules/ROOT/pages/8.10.0-release-notes.adoc b/modules/ROOT/pages/8.10.0-release-notes.adoc index 1671f217b1..7c86965e4e 100644 --- a/modules/ROOT/pages/8.10.0-release-notes.adoc +++ b/modules/ROOT/pages/8.10.0-release-notes.adoc @@ -13,45 +13,10 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] {productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, October 14^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,26 +24,13 @@ 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[]. - - === Image Editing The {productname} {release-version} release includes an accompanying release of the **Image Editing** premium plugin. **Image Editing** includes the following fix. -==== Clicking `Edit image` now shows an error notification instead of failing silently when the image cannot be loaded +==== Clicking **Edit image** now shows an error notification instead of failing silently when the image cannot be loaded // #TINYMCE-14679 Previously, when the image proxy returned an error for an image, such as a `+404+` or `+424+` response, clicking **Edit image** did not open the Edit Image dialog and did not display a message. The **Image Editing** plugin logged an uncaught error to the browser console instead. Users received no indication that the image could not be loaded for editing. @@ -208,7 +160,7 @@ Previously, feedback on a suggestion that contained a long string with no spaces In {productname} {release-version}, long feedback text wraps onto new lines within the suggestion card, and the buttons and text box of the card remain aligned. -=== Nested parts of the same suggestion showed duplicate highlights +==== Nested parts of the same suggestion showed duplicate highlights // #TINYMCE-14358 Previously, when one suggestion changed both an element and the content inside it, such as the font size of a list, the Review edits view highlighted the element, then highlighted each part of the content inside it again. The Review edits view also stacked the selection styling when the suggestion was selected. The stacked styling made the change cluttered and harder to read. @@ -222,7 +174,7 @@ For information on the **Suggested Edits** plugin, see: xref:suggestededits.adoc The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin. -**TinyMCE AI** includes the following addition, improvements and fixes. +**TinyMCE AI** includes the following addition, improvements, and fixes. ==== New multi-editor support // #TINYMCE-14817 @@ -235,6 +187,13 @@ The xref:tinymceai.adoc#tinymceai_document_name[`+tinymceai_document_name+`] opt For information on multi-editor mode, see xref:tinymceai-multi-editor.adoc[Multi-editor mode]. +==== Deleted media in AI preview Diff mode now shows a red X overlay +// #TINYMCE-14611 + +Previously, a deleted image in a **TinyMCE AI** preview was marked only with a highlight, which could be easy to miss. + +In {productname} {release-version}, **Diff mode** in a **TinyMCE AI** preview also marks deleted images, videos, and embedded frames with a large red X. + ==== Nested parts of the same suggestion showed duplicate highlights // #TINYMCE-14358 @@ -396,26 +355,6 @@ In {productname} {release-version}, the **Templates** plugin adds bundled conten For information on the **Templates** plugin, see: xref:advanced-templates.adoc[Templates]. -[[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 @@ -430,26 +369,10 @@ The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also inc 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. - - [[additions]] == Additions -{productname} {release-version} also includes the following addition: - -=== -// #TINY-vwxyz1 - -// CCFR here. +{productname} {release-version} also includes the following addition: === Added the `+BlobInfo+` type to the public API // #TINYMCE-14853 @@ -459,37 +382,10 @@ Previously, {productname} passed a `+BlobInfo+` object to the functions set for In {productname} {release-version}, the `+BlobInfo+` type is part of the public {productname} API. TypeScript integrations can use it to type the functions they set for these options. -[[changes]] -== Changes - -{productname} {release-version} also includes the following change: - -=== -// #TINY-vwxyz1 - -// CCFR here. - - -[[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: === The editor iframe was missing its `+title+` attribute on browsers other than Firefox // #TINYMCE-13100 @@ -532,37 +428,3 @@ In {productname} {release-version}, clicking to the right of the text in a list Previously, some list items had their own inline `+list-style-type+`, for example after content was pasted from Microsoft Word with **PowerPaste**. When the selection was in such an item, choosing a style from the `+numlist+` or `+bullist+` toolbar button menu did not change the item's marker, because the item's own style overrode the style that {productname} applied to the list. The menu also showed **Default** as the active style instead of the item's actual style. In {productname} {release-version}, the list style menu shows the style of the selected list item when the item has its own `+list-style-type+`. Applying a list style removes the inline `+list-style-type+` from the selected list items and applies the chosen style to the whole list. Other list items that have their own `+list-style-type+` keep it until they are selected and changed. - - -[[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. From 06ae13412ee62078310035facd453e0bac4dbb23 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 14 Oct 2026 12:16:29 +1000 Subject: [PATCH 32/33] TIYNDOC-3574: Fix rendering issue with nbsp block. --- modules/ROOT/pages/changelog.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 3c13042257..1c8e3f7d7d 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -22,7 +22,7 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINYMCE-14855 * Resizing an image would sometimes show a 0px ghost image // #TINYMCE-14887 -* Clicking to the right of an ` ` at the end of an element could make the selection jump if there is an empty element inside the editor. +* Clicking to the right of an `+ +` at the end of an element could make the selection jump if there is an empty element inside the editor. // #TINYMCE-14724 * Opening or closing a View no longer scrolls the editor to the caret position. // #TINYMCE-14905 From 086e969c69dcdbf3dad5ea091cfa66ad00f3cb18 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 14 Oct 2026 13:29:06 +1000 Subject: [PATCH 33/33] TINYDOC-3574: Bump api-version, and productminorversion. --- .api-version | 2 +- antora.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.api-version b/.api-version index 214d4b7db8..e1f080d710 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -8.9.2 \ No newline at end of file +8.10.0 \ No newline at end of file diff --git a/antora.yml b/antora.yml index d481503d6e..bafd9ca548 100644 --- a/antora.yml +++ b/antora.yml @@ -31,7 +31,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 8 - productminorversion: '8.9' + productminorversion: '8.10' ##### product name in codeblock prodnamecode: tinymce #### more names