`, resulting in unintended structural changes.
+
+This issue has been resolved in {productname} {release-version} by improving how element deletions are handled within the editor's DOM logic. Cutting or deleting a selected element now preserves the integrity and tag type of adjacent elements. Users can expect consistent and predictable editing behavior when modifying HTML source content.
+
+=== Strikethrough format could be added outside font size format, which renders incorrectly in some browsers.
+// #TINY-12004
+
+Previously, there was an issue where combining strikethrough (`s` element) and font size formatting could lead to incorrect rendering in some browsers, particularly Chrome. This occurred when the `s` (strikethrough) element was placed outside a font size `span`, causing the strikethrough line to render incorrectly.
+
+The fix ensures that the `s` element is now properly nested inside the font size element, improving visual consistency across browsers.
+
+=== Long tooltips could overflow narrow browser windows
+// #TINY-11884
+
+Previously, long tooltips could overflow narrow browser windows, causing the tooltip text to be partially cut off and unreadable. This issue was most noticeable with the `...` ellipsis toolbar for the "reveal or hide additional toolbar options" button, where the tooltip text would not fit within the narrow viewport.
+
+In {productname} {release-version}, the tooltip behavior has been improved to ensure that long tooltips are properly positioned and wrapped within narrow browser windows. This prevents overflow and ensures that the full tooltip text is visible, even in smaller viewports.
+
+=== Tab to create a new row in tables with a non-editable final row would freeze the editor.
+// #TINY-12018
+
+Previously, when tabbing into a non-editable final row of a table, the editor failed to recognize that the row was read-only and instead duplicated it. This resulted in an attempt to place the cursor in the duplicated row, which again could not be edited. The process would repeat indefinitely, creating a loop that ultimately froze the editor.
+
+{productname} {release-version} resolves this issue by detecting when the final row of a table is read-only and preventing the insertion of a new row in such cases. This ensures stable behavior when navigating through tables using the Tab key.
+
+=== Nested font sizes no longer cause excessive line spacing
+// #TINY-12073
+
+Previously, applying different font sizes to nested elements could result in inconsistent and overly large line heights. This affected users by introducing visual clutter and making text blocks appear misaligned or difficult to read.
+
+{productname} {release-version} introduces a fix that ensures line heights are calculated based on the font size visible in the new line, rather than inheriting line-height from parent element. This means that when different font sizes are applied within the same content, the line heights will be consistent and proportional to the visible font size.
+
+=== Improved structure retention when inserting invalid HTML fragments
+// #TINY-8205
+
+Previously, when inserting HTML fragments through APIs or pasting, the parser would attempt to fix invalid structures, which could lead to the loss of valid structures like tables and lists. This behavior was inconsistent and could result in unexpected outcomes when handling complex HTML content.
+
+In {productname} {release-version}, the parser has been updated to improve the retention of structures when inserting HTML fragments. It now validates these fragments in the context of their parent structure, ensuring that valid structures are preserved even if the fragment contains invalid HTML resulting in more predictable and desirable outcomes when handling complex HTML content.
+
+=== New list item was not inserted correctly when existing list item had a block element inside
+// #TINY-12102
+
+{productname} {release-version} resolves an issue affecting list management when parent list items contain block-level formatting. Previously, when a list item containing a sub-list was formatted as a block element (such as `
` or `
`), pressing Enter at the end of that item would incorrectly position the new list item alongside the sub-list items instead of as a sibling of the parent item.
+
+{productname} {release-version} addresses this by ensuring that when a user presses Enter at the end of a list item that contains block-level formatting, the new list item is correctly inserted as a sibling of the parent list item, rather than being placed incorrectly alongside the sub-list items.
[[deprecated]]
== Deprecated
-{productname} {release-version} includes the following deprecation
:
+{productname} {release-version} includes the following deprecations:
+
+=== Java application server-based server components have been deprecated
+// #DOC-3231
+
+{productname} {release-version} deprecates the Java application server-based deployment method for self-hosted services. Docker containers are now the **only** supported deployment method for self-hosted services. The Java `.war` files (`ephox-spelling.war`, `ephox-image-proxy.war`, `ephox-hyperlinking.war`) will be removed in a future release.
+
+For information about setting up containerized server-side components using Docker containers, see: xref:bundle-intro-setup.adoc[Introduction and initial setup for containerized server-side services from the premium self-hosted bundles]
+
+=== Docker container services
+
+* Enhanced Media Embed and Link Checker service, see: xref:individual-hyperlinking-container.adoc[Deploy the {productname} hyperlinking server-side component using Docker].
+* Image Editing and Export image proxy service, see: xref:individual-image-proxy-container.adoc[Deploy the {productname} image proxy server-side component using Docker].
+* Spell Checker service, see: xref:individual-spelling-container.adoc[Deploy the {productname} spelling service server-side component using Docker].
+* Export to PDF service, see: xref:individual-export-to-pdf-on-premises.adoc[Deploy the {productname} Export to PDF service server-side component using Docker].
+* Import from Word and Export to Word services, see: xref:individual-import-from-word-and-export-to-word-on-premises.adoc[Deploy the {productname} Import from Word and Export to Word service server-side component using Docker].
+
+=== The `ToggleToolbarDrawer` command's `skipFocus` option has been deprecated
+// #TINY-12044
+
+The `ToggleToolbarDrawer` command previously accepted a non-standard `skipFocus` option to prevent the editor from receiving focus when the command was executed. This behavior differed from other editor commands, which use the generic `skip_focus` option for the same purpose. As a result, the inconsistency lead to confusion when implementing or maintaining command logic.
+
+To resolve this, support for the standard `skip_focus` option has been added to the `ToggleToolbarDrawer` command. The `skipFocus` option is now **deprecated** in {productname} {release-version} and will be removed in a future release.
+
+.Before deprecation using the `skipFocus` option
+[source]
+----
+editor.execCommand('ToggleToolbarDrawer', false, { skipFocus: true });
+----
+
+.After deprecation using the `skip_focus` option
+[source]
+----
+editor.execCommand('ToggleToolbarDrawer', false, null, { skip_focus: true });
+----
+
+This change improves consistency across commands and aligns with expected usage patterns in {productname} {release-version}.
+
+=== Deprecated `fire()` method for event handling
+// #TINY-12012
-=== The `` configuration property, ``, has been deprecated
+The `fire()` method was originally deprecated in {productname} 6 in favor of the `dispatch()` method for event handling, but was never removed from the codebase. {productname} {release-version} now displays a deprecation warning when the `fire()` method is used, serving as a final notice before its removal in {productname} 9.
-// placeholder here.
+This long-overdue cleanup aligns the API with modern event handling conventions and removes confusion around method naming. Integrators should migrate to the `dispatch()` method to ensure compatibility with future releases.
+.Deprecated approach for dispatching custom events
+[source,javascript]
+----
+// Deprecated in TinyMCE 8, will be removed in 9
+editor.fire('someEvent');
+----
-[[known-issues]]
-== Known issues
+.New approach for dispatching custom events
+[source,javascript]
+----
+// Use dispatch() instead
+editor.dispatch('someEvent');
+----
-This section describes issues that users of {productname} {release-version} may encounter and possible workarounds for these issues.
+For more information on the `dispatch()` method, see: xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher].
-There known issue in {productname} {release-version}.
+=== Deprecated `editor.selection.setContent` API
+// TINY-11692
-===
-// #TINY-vwxyz1
+The `editor.selection.setContent` method has been deprecated in {productname} {release-version}. This low-level API was never intended for external use and does not guarantee consistent behavior when inserting complex content structures, such as lists. Integrators are advised to use the supported `editor.insertContent` method for reliable content insertion.
-// CCFR here.
\ No newline at end of file
+This deprecation helps reduce confusion and aligns content insertion with {productname}'s supported APIs.
diff --git a/modules/ROOT/pages/a11ychecker.adoc b/modules/ROOT/pages/a11ychecker.adoc
index 240c08ac70..6abb3f1fda 100644
--- a/modules/ROOT/pages/a11ychecker.adoc
+++ b/modules/ROOT/pages/a11ychecker.adoc
@@ -46,300 +46,59 @@ Each rule has a severity level, which will be one of the following, listed in or
* Warning
* Error
-[[D1]]
-=== D1 - Usage of paragraphs as headings
+[[document-structure-rules]]
+=== Document structure rules
-*Rule description:* this rule checks that `+h1+`-`+h6+` tags are used for heading content, not `+p+` tags. Not using correct heading markup will make it difficult for assistive technologies to represent and navigate through your content.
+include::partial$a11y-rules/d1.adoc[]
-==== {pluginname} rule details - D1
+include::partial$a11y-rules/d2.adoc[]
-Notification level (severity):: Warning
+include::partial$a11y-rules/d3.adoc[]
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
+include::partial$a11y-rules/d4o.adoc[]
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
+include::partial$a11y-rules/d4u.adoc[]
-WCAG 2.1 specifications::
+include::partial$a11y-rules/d5.adoc[]
-* https://www.w3.org/WAI/WCAG21/Techniques/html/H42.html[H42 - Using h1-h6 to identify headings].
-* https://www.w3.org/WAI/WCAG21/Techniques/html/H69.html[H69 - Providing heading elements at the beginning of each section of content].
+'''
-[[D2]]
-=== D2 - Sequential headings
+[[html-rules]]
+=== HTML rules
-*Rule description:* this rule checks that headings tags are used sequentially.
+include::partial$a11y-rules/h93.adoc[]
-For example: A `+h1+` heading should be followed by a `+h2+` heading, not a `+h3+` heading. Using sequential headings will make it easier for assistive technology to parse your content.
+'''
-==== {pluginname} rule details - D2
+[[image-rules]]
+=== Image rules
-Notification level (severity):: Error
+include::partial$a11y-rules/i1.adoc[]
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
+include::partial$a11y-rules/i2.adoc[]
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
+include::partial$a11y-rules/i3.adoc[]
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G141.html[G141 - Organizing a page using headings].
+include::partial$a11y-rules/i4.adoc[]
-[[D3]]
-=== D3 - Adjacent links
+'''
-*Rule description:* this rule checks that links next to other links do not have the same `+href+` attribute.
+[[table-rules]]
+=== Table rules
-For example: If an image link and a text link have the same `+href+` attribute, both elements should be in the same `+a+` element. If an image link and a text link point to the same URL but are two separate elements, it can be confusing for users of screen readers and other assistive technologies.
+include::partial$a11y-rules/t1.adoc[]
-==== {pluginname} rule details - D3
+include::partial$a11y-rules/t2.adoc[]
-Notification level (severity):: Error
+include::partial$a11y-rules/t3.adoc[]
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
+include::partial$a11y-rules/t4a.adoc[]
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
+include::partial$a11y-rules/t4b.adoc[]
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H2.html[H2 - Combining adjacent image and text links for the same resource].
+include::partial$a11y-rules/t4c.adoc[]
-[[D4O]]
-=== D4O - Ordered list structure
-
-*Rule description:* this rule checks that an `+ol+` element is used for ordered lists. Do not use paragraphs beginning with numbers or roman numerals instead of an `+ol+` element containing `+li+` items. This is to simplify navigation and parsing of the content for users of assistive technologies.
-
-==== {pluginname} rule details - D4O
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H48.html[H48 - Using ol, ul and dl for lists or groups of links].
-
-[[D4U]]
-=== D4U - Unordered list structure
-
-*Rule description:* this rule checks that a `+ul+` element is used for unordered lists. Do not use paragraphs beginning with `+*+` or `+-+` or some similar character instead of an `+ol+` element containing `+li+` items. This is to simplify navigation and parsing of the content for users of assistive technologies.
-
-==== {pluginname} rule details - D4U
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H48.html[H48 - Using ol, ul and dl for lists or groups of links].
-
-[[D5]]
-=== D5 - Contrast ratio of the text (D5A, D5B, and D5C)
-
-*Rule description:* this rule checks that the contrast ratio of the text is above the following values:
-
-* When the compliance level is set to AA,
-** 4.5:1 for normal text
-** 3:1 for large text
-* When the compliance level is set to AAA,
-** 7:1 for any text
-
-Text with a low contrast ratio is hard to read for users with impaired vision.
-
-[[D5A]]
-==== {pluginname} rule details - D5A
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level AA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G145.html[G145 - Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text].
-
-[[D5B]]
-==== {pluginname} rule details - D5B
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level AA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G18.html[G18 - Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text].
-
-[[D5C]]
-==== {pluginname} rule details - D5C
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G17.html[G17 - Ensuring that a contrast ratio of at least 7:1 exists between text (and images of text) and background behind the text].
-
-[[H93]]
-=== H93 - IDs must be unique
-
-*Rule description:* this rule checks that all `+id+` attributes are unique in the editor. Duplicate `+id+` attributes are known to cause problems for assistive technologies when parsing the content.
-
-==== {pluginname} rule details - H93
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H93.html[H93 - Ensuring that id attributes are unique on a Web page].
-
-[[I1]]
-=== I1 - Image `+alt+` text
-
-*Rule description:* this rule checks that all images have alternative (`+alt+`) text for screen readers and other assistive technologies.
-
-==== {pluginname} rule details - I1
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G95.html[G95 - Providing short text alternatives that provide a brief description of the non-text content].
-
-include::partial$misc/admon-accessibility-rule-i3-can-also-be-applied.adoc[]
-
-[[I2]]
-=== I2 - Image `+alt+` text is not the image filename
-
-*Rule description:* this rule checks that the `+alt+` attribute text of the image is not the same as the filename of the image.
-
-==== {pluginname} rule details - I2
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/general/G95.html[G95 - Providing short text alternatives that provide a brief description of the non-text content].
-
-include::partial$misc/admon-accessibility-rule-i3-can-also-be-applied.adoc[]
-
-[[I3]]
-=== I3 - Image `+alt+` text is not greater than 100 characters
-
-*Rule description:* this rule checks that the `+alt+` attribute text of the image is not more than 100 characters.
-
-An _Image alternative text should be less than 100 characters_ warning dialog presents if the alternative (`+alt+`) text is longer than 100 characters. This dialog also presents the alternative text in an editable field, for immediate repair.
-
-==== {pluginname} rule details - I3
-
-Notification level (severity):: Warning
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: n/a.
-
-
-[[T1]]
-=== T1 - Table caption
-
-*Rule description:* this rule checks that all `+table+` elements have a `+caption+` element describing the data inside the table to simplify parsing and navigation of the content for users of assistive technologies.
-
-==== {pluginname} rule details - T1
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H39.html[H39 - Using caption elements to associate data table captions with data tables].
-
-[[T2]]
-=== T2 - Complex table summary
-
-*Rule description:* this rule checks that all complex tables must have a `+summary+` attribute explaining to users of assistive technologies how to navigate through the data inside of the table.
-
-[NOTE]
-====
-This rule only applies to HTML 4 content and is not checked when `+a11ychecker_html_version+` is set to `+html5+`.
-====
-
-==== {pluginname} rule details - T2
-
-Notification level (severity):: Warning
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H73.html[H73 - Using the summary attribute of the table element to give an overview of data tables].
-
-[[T3]]
-=== T3 - Table caption and summary
-
-*Rule description:* this rule checks that the table caption and summary does not have the same text content. The caption should explain *what* the table is about while the summary should explain *how* to navigate the data inside of the table.
-
-[NOTE]
-====
-The table `+summary+` attribute was deprecated in HTML 5, both the *what* and *how* information should be moved to the table caption.
-====
-
-==== {pluginname} rule details - T3
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H73.html[H73 - Using the summary attribute of the table element to give an overview of data tables].
-
-[[T4A]]
-=== T4A - Table markup
-
-*Rule description:* this rule checks that all `+tables+` contain both `+tr+` and `+td+` elements.
-
-==== {pluginname} rule details - T4A
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H51.html[H51 - Using table markup to present tabular information].
-
-[[T4B]]
-=== T4B - Table headers
-
-*Rule description:* this rule checks that all `+table+` elements contain at least one table header (`+th+`) element.
-
-==== {pluginname} rule details - T4B
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H51.html[H51 - Using table markup to present tabular information].
-
-[[T4C]]
-=== T4C - Table heading scope
-
-*Rule description:* this rule checks that all table header (`+th+`) elements have a `+scope+` attribute clarifying what scope the heading has inside of the `+table+`. The allowed values are `+row+`, `+col+`, `+rowgroup+`, and `+colgroup+`. This is important for users of assistive technologies to be able to parse table data.
-
-==== {pluginname} rule details - T4C
-
-Notification level (severity):: Error
-
-https://www.w3.org/TR/WCAG21/#conformance[WCAG level]:: Level A ; Level AA ; Level AAA
-
-xref:a11ychecker_html_version[HTML version]:: HTML4 and HTML5
-
-WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H63.html[H63 - Using the scope attribute to associate header cells and data cells in data tables].
+'''
== Options
@@ -347,6 +106,8 @@ The following configuration options affect the behavior of the {pluginname} plug
include::partial$configuration/a11y_advanced_options.adoc[leveloffset=+1]
+include::partial$configuration/a11ychecker_alt_text_max_length.adoc[leveloffset=+1]
+
include::partial$configuration/a11ychecker_allow_decorative_images.adoc[leveloffset=+1]
include::partial$configuration/a11ychecker_filter_issue.adoc[leveloffset=+1]
diff --git a/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc b/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc
index f524798708..4dff25f656 100644
--- a/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc
+++ b/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc
@@ -269,7 +269,7 @@ Creates HTML string for element. The element will be closed unless an empty inne
[source, javascript]
----
// Creates a html chunk and inserts it at the current selection/caret location
-tinymce.activeEditor.selection.setContent(tinymce.activeEditor.dom.createHTML('a', { href: 'test.html' }, 'some line'));
+tinymce.activeEditor.insertContent(tinymce.activeEditor.dom.createHTML('a', { href: 'test.html' }, 'some line'));
----
==== Parameters
diff --git a/modules/ROOT/pages/apis/tinymce.dom.selection.adoc b/modules/ROOT/pages/apis/tinymce.dom.selection.adoc
index 575cb1dfdb..2a2c7cd0a3 100644
--- a/modules/ROOT/pages/apis/tinymce.dom.selection.adoc
+++ b/modules/ROOT/pages/apis/tinymce.dom.selection.adoc
@@ -48,7 +48,9 @@ node the parent element will be returned.|`xref:apis/tinymce.dom.selection.adoc[
|xref:#select[select()]|Selects the specified element. This will place the start and end of the selection range around the element.|`xref:apis/tinymce.dom.selection.adoc[Selection]`
|xref:#selectorChanged[selectorChanged()]|Executes callback when the current selection starts/stops matching the specified selector. The current
state will be passed to the callback as it's first argument.|`xref:apis/tinymce.dom.selection.adoc[Selection]`
-|xref:#setContent[setContent()]|Sets the current selection to the specified content. If any contents is selected it will be replaced
+|xref:#setContent[setContent()]|This method has been deprecated. Use "editor.insertContent" instead.
+
+Sets the current selection to the specified content. If any contents is selected it will be replaced
with the contents passed in to this function. If there is no selection the contents will be inserted
where the caret is placed in the editor/page.|`xref:apis/tinymce.dom.selection.adoc[Selection]`
|xref:#setCursorLocation[setCursorLocation()]|Move the selection cursor range to the specified node and offset.
@@ -356,6 +358,8 @@ state will be passed to the callback as it's first argument.
----
setContent(content: String, args: Object)
----
+This method has been deprecated. Use "editor.insertContent" instead.
+
Sets the current selection to the specified content. If any contents is selected it will be replaced
with the contents passed in to this function. If there is no selection the contents will be inserted
where the caret is placed in the editor/page.
diff --git a/modules/ROOT/pages/apis/tinymce.editor.adoc b/modules/ROOT/pages/apis/tinymce.editor.adoc
index 0aa6ddec6f..3d8f8a5cc2 100644
--- a/modules/ROOT/pages/apis/tinymce.editor.adoc
+++ b/modules/ROOT/pages/apis/tinymce.editor.adoc
@@ -1,7 +1,7 @@
= tinymce.Editor
:navtitle: tinymce.Editor
:description: This class contains the core logic for a TinyMCE editor.
-:keywords: Editor, addCommand, addCommandCallback, addQueryStateHandler, addQueryStateHandlerCallback, addQueryValueHandler, addQueryValueHandlerCallback, addShortcut, addVisual, baseURI, contentCSS, contentStyles, convertURL, destroy, dispatch, documentBaseURI, dom, editorUpload, execCommand, fire, focus, formatter, getBody, getContainer, getContent, getContentAreaContainer, getDoc, getElement, getParam, getWin, hasEditableRoot, hasEventListeners, hasFocus, hasPlugin, hide, id, initialized, insertContent, isDirty, isHidden, load, mode, nodeChanged, notificationManager, off, on, once, options, parser, plugins, queryCommandState, queryCommandSupported, queryCommandValue, remove, render, resetContent, save, schema, selection, serializer, setContent, setDirty, setEditableRoot, setProgressState, show, theme, translate, ui, undoManager, uploadImages, windowManager
+:keywords: Editor, addCommand, addCommandCallback, addQueryStateHandler, addQueryStateHandlerCallback, addQueryValueHandler, addQueryValueHandlerCallback, addShortcut, addVisual, baseURI, contentCSS, contentStyles, convertURL, destroy, dispatch, documentBaseURI, dom, editorUid, editorUpload, execCommand, fire, focus, formatter, getBody, getContainer, getContent, getContentAreaContainer, getDoc, getElement, getParam, getWin, hasEditableRoot, hasEventListeners, hasFocus, hasPlugin, hide, id, initialized, insertContent, isDirty, isHidden, load, mode, nodeChanged, notificationManager, off, on, once, options, parser, plugins, queryCommandState, queryCommandSupported, queryCommandValue, remove, render, resetContent, save, schema, selection, serializer, setContent, setDirty, setEditableRoot, setProgressState, show, theme, translate, ui, undoManager, uploadImages, userLookup, windowManager
:moxie-type: api
This class contains the core logic for a TinyMCE editor.
@@ -37,6 +37,7 @@ ed.render();
|contentStyles|`Array`|Array of CSS styles to add to head of document when the editor loads.|`xref:apis/tinymce.editor.adoc[Editor]`
|documentBaseURI|`xref:apis/tinymce.util.uri.adoc[URI]`|URI object to document configured for the TinyMCE instance.|`xref:apis/tinymce.editor.adoc[Editor]`
|dom|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]`|DOM instance for the editor.|`xref:apis/tinymce.editor.adoc[Editor]`
+|editorUid|`String`|A uuid string to uniquely identify an editor across any page.|`xref:apis/tinymce.editor.adoc[Editor]`
|editorUpload|`xref:apis/tinymce.editorupload.adoc[EditorUpload]`|Editor upload API|`xref:apis/tinymce.editor.adoc[Editor]`
|formatter|`xref:apis/tinymce.formatter.adoc[Formatter]`|Formatter instance.|`xref:apis/tinymce.editor.adoc[Editor]`
|id|`String`|Editor instance id, normally the same as the div/textarea that was replaced.|`xref:apis/tinymce.editor.adoc[Editor]`
@@ -52,6 +53,7 @@ ed.render();
|theme|`xref:apis/tinymce.theme.adoc[Theme]`|Reference to the theme instance that was used to generate the UI.|`xref:apis/tinymce.editor.adoc[Editor]`
|ui|`xref:apis/tinymce.editor.ui.ui.adoc[Ui]`|Editor ui components|`xref:apis/tinymce.editor.adoc[Editor]`
|undoManager|`xref:apis/tinymce.undomanager.adoc[UndoManager]`|Undo manager instance, responsible for handling undo levels.|`xref:apis/tinymce.editor.adoc[Editor]`
+|userLookup|`xref:apis/tinymce.userlookup.adoc[UserLookup]`|Editor user lookup API|`xref:apis/tinymce.editor.adoc[Editor]`
|windowManager|`xref:apis/tinymce.windowmanager.adoc[WindowManager]`|Window manager reference, use this to open new windows and dialogs.|`xref:apis/tinymce.editor.adoc[Editor]`
|===
@@ -723,7 +725,7 @@ Returns true/false if the editor is hidden or not.
=== load()
[source, javascript]
----
-load(args: Object): String
+load(args: Object)
----
Loads contents from the textarea, input or other element that got converted into an editor instance.
This method will move the contents from that textarea, input or other element into the editor by using setContent
@@ -733,10 +735,6 @@ so all events etc that method has will get dispatched as well.
* `args (Object)` - Optional content object, this gets passed around through the whole load process.
-==== Return value
-
-* `String` - HTML string that got set into the editor.
-
'''
[[nodeChanged]]
@@ -949,7 +947,7 @@ so all events etc that method has will get dispatched as well.
=== setContent()
[source, javascript]
----
-setContent(content: String, args: Object): String
+setContent(content: String, args: Object)
----
Sets the specified content to the editor instance, this will cleanup the content before it gets set using
the different cleanup rules options.
@@ -975,10 +973,6 @@ tinymce.activeEditor.setContent('Some html
', { format: 'html' });
* `content (String)` - Content to set to editor, normally HTML contents but can be other formats as well.
* `args (Object)` - Optional content object, this gets passed around through the whole set process.
-==== Return value
-
-* `String` - HTML string that got set into the editor.
-
'''
[[setDirty]]
diff --git a/modules/ROOT/pages/apis/tinymce.root.adoc b/modules/ROOT/pages/apis/tinymce.root.adoc
index 65c46cc4c4..60db0f8dd3 100644
--- a/modules/ROOT/pages/apis/tinymce.root.adoc
+++ b/modules/ROOT/pages/apis/tinymce.root.adoc
@@ -1,7 +1,7 @@
= tinymce
:navtitle: tinymce
:description: TinyMCE core class.
-:keywords: DOM, PluginManager, ScriptLoader, ThemeManager, activeEditor, add, addI18n, baseURI, baseURL, createEditor, defaultOptions, documentBaseURL, each, execCommand, explode, get, grep, hasOwnProperty, i18n, inArray, init, is, isArray, majorVersion, makeMap, map, minorVersion, overrideDefaults, releaseDate, remove, resolve, setActive, suffix, toArray, translate, triggerSave, trim, walk
+:keywords: DOM, PluginManager, ScriptLoader, ThemeManager, activeEditor, add, addI18n, baseURI, baseURL, createEditor, defaultOptions, documentBaseURL, each, execCommand, explode, get, grep, hasOwnProperty, i18n, inArray, init, is, isArray, majorVersion, makeMap, map, minorVersion, overrideDefaults, pageUid, releaseDate, remove, resolve, setActive, suffix, toArray, translate, triggerSave, trim, walk
:moxie-type: api
TinyMCE core class.
@@ -26,6 +26,7 @@ TinyMCE core class.
|i18n|`Object`|Collection of language pack data.|`xref:apis/tinymce.root.adoc[tinymce]`
|majorVersion|`String`|Major version of TinyMCE build.|`xref:apis/tinymce.root.adoc[tinymce]`
|minorVersion|`String`|Minor version of TinyMCE build.|`xref:apis/tinymce.root.adoc[tinymce]`
+|pageUid|`String`|A uuid string to anonymously identify the page tinymce is loaded in|`xref:apis/tinymce.root.adoc[tinymce]`
|releaseDate|`String`|Release date of TinyMCE build.|`xref:apis/tinymce.root.adoc[tinymce]`
|suffix|`String`|Current suffix to add to each plugin/theme that gets loaded for example ".min".|`xref:apis/tinymce.root.adoc[tinymce]`
|===
diff --git a/modules/ROOT/pages/apis/tinymce.userlookup.adoc b/modules/ROOT/pages/apis/tinymce.userlookup.adoc
new file mode 100644
index 0000000000..02890d9ddb
--- /dev/null
+++ b/modules/ROOT/pages/apis/tinymce.userlookup.adoc
@@ -0,0 +1,69 @@
+= tinymce.UserLookup
+:navtitle: tinymce.UserLookup
+:description: TinyMCE User Lookup API Handles user information retrieval and caching.
+:keywords: fetchUsers, userId
+:moxie-type: api
+
+TinyMCE User Lookup API Handles user information retrieval and caching.
+
+[[examples]]
+== Examples
+[source, javascript]
+----
+// Get the current user's ID from the editor options, or defaults to 'Anonymous'.
+tinymce.activeEditor.userLookup.userId;
+
+// Fetch user information by IDs which returns a record of promises
+const userPromises = tinymce.activeEditor.userLookup.fetchUsers(['user-1', 'user-2']);
+
+// Access individual promises by user ID
+userPromises['user-1'].then(user => console.log('User 1:', user));
+userPromises['user-2'].then(user => console.log('User 2:', user));
+
+// Or wait for all promises
+Promise.all(Object.values(userPromises)).then((users) => {
+ users.forEach(user => console.log('User found:', user));
+}).catch((error) => {
+ console.error('Error fetching users:', error);
+});
+----
+
+[[summary]]
+== Summary
+
+[[properties]]
+=== Properties
+[cols="2,1,4,1",options="header"]
+|===
+|Name|Type|Summary|Defined by
+|userId|`String`|The current user's ID retrieved from the editor options, or defaults to 'Anonymous'.|`xref:apis/tinymce.userlookup.adoc[UserLookup]`
+|===
+
+[[methods-summary]]
+=== Methods
+[cols="2,5,1",options="header"]
+|===
+|Name|Summary|Defined by
+|xref:#fetchUsers[fetchUsers()]|Fetches user information using a provided array of userIds.|`xref:apis/tinymce.userlookup.adoc[UserLookup]`
+|===
+
+[[methods]]
+== Methods
+
+[[fetchUsers]]
+=== fetchUsers()
+[source, javascript]
+----
+fetchUsers(userIds: string[]): Record>
+----
+Fetches user information using a provided array of userIds.
+
+==== Parameters
+
+* `userIds (string[])` - - A list of user IDs to fetch information for.
+
+==== Return value
+
+* `Record>` - An object where each key is a user ID and its value is a Promise that resolves to the user's data or rejects if the user is not found.
+
+'''
diff --git a/modules/ROOT/pages/basic-setup.adoc b/modules/ROOT/pages/basic-setup.adoc
index 1bbc271311..5f11695e13 100644
--- a/modules/ROOT/pages/basic-setup.adoc
+++ b/modules/ROOT/pages/basic-setup.adoc
@@ -198,7 +198,8 @@ The following example is a basic {productname} configuration.
+
----
In this case, the editor will be in a **read-only** state, and a notification appears stating: **"A valid API key is required to continue using {productname}. Please alert the admin to check the current API key. Click here to learn more."**
@@ -47,7 +47,7 @@ For example: if your API is `+abcd1234+`:
+
[source,html,subs="attributes+"]
----
-
+
----
+
. Check the `+apiKey+` provided in the script tag:
@@ -82,7 +82,7 @@ For example: if your API is `+abcd1234+`:
[source,html,subs="attributes+"]
----
-
+
----
To retrieve your API key, or to sign up for an API key, visit: link:{accountsignup}/[{cloudname}].
diff --git a/modules/ROOT/pages/configure-logging-services.adoc b/modules/ROOT/pages/configure-logging-services.adoc
deleted file mode 100644
index 2722f9807e..0000000000
--- a/modules/ROOT/pages/configure-logging-services.adoc
+++ /dev/null
@@ -1,45 +0,0 @@
-= Activity logging
-:description: Setting up logging for the premium server-side components.
-
-It may be useful to make the {productname} server-side components write to their own log file. This can assist in troubleshooting and make it easier to provide logs as part of a support ticket.
-
-The {productname} server-side components use the http://logback.qos.ch/manual/configuration.html[Logback] logging format.
-
-To write the logs to a specific file:
-
-. Create a logging configuration XML file. Save the snippet below as `+logback.xml+` after replacing `+{$LOG_LOCATION}+` with the full path to the destination log file (e.g. /var/log/tinymce_server_components.log).
-+
-[source,xml,subs="attributes+"]
-----
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger\{36} - %msg%n
-
-
-
-
- {$LOG_LOCATION}
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger\{36} - %msg%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-----
-. Pass the configuration file to the Java application server. Assuming you've saved your `+logback.xml+` file in `+/etc/opt/tinymce+`, follow xref:introduction-to-premium-selfhosted-services.adoc#pass-the-configuration-file-to-the-java-application-server[step 4] and xref:introduction-to-premium-selfhosted-services.adoc#restart-the-java-application-server[step 5] on the _Install Server-side Components_ page to set the following JVM system property on your Java application server:
-+
-....
--Dlogback.configurationFile=/etc/opt/tinymce/logback.xml
-....
diff --git a/modules/ROOT/pages/content-filtering.adoc b/modules/ROOT/pages/content-filtering.adoc
index 2a5896970a..e65bc480a3 100644
--- a/modules/ROOT/pages/content-filtering.adoc
+++ b/modules/ROOT/pages/content-filtering.adoc
@@ -5,6 +5,8 @@
include::partial$configuration/allow_conditional_comments.adoc[]
+include::partial$configuration/allow_html_in_comments.adoc[]
+
include::partial$configuration/allow_html_in_named_anchor.adoc[]
include::partial$configuration/allow_mathml_annotation_encodings.adoc[]
diff --git a/modules/ROOT/pages/creating-a-skin.adoc b/modules/ROOT/pages/creating-a-skin.adoc
index 5ff800439f..19f20e2fbe 100644
--- a/modules/ROOT/pages/creating-a-skin.adoc
+++ b/modules/ROOT/pages/creating-a-skin.adoc
@@ -67,6 +67,8 @@ _Do not edit these files directly_. Instead, use them as references when creatin
* `+modules/oxide/src/less/theme/components/toolbar-button/toolbar-button.less+`
The typical workflow involves copying variables from the theme folder into the skins `skin.less` file and modifying them as needed.
+
+NOTE: Split buttons have undergone structural changes in {productname} {productmajorversion}. Previously they used a single component structure, but now use separate components for the main button and chevron areas. See xref:migration-from-7x.adoc#split-button-css-breaking-change[split button css breaking change]
====
[NOTE]
diff --git a/modules/ROOT/pages/custom-dictionaries-for-tiny-spellchecker.adoc b/modules/ROOT/pages/custom-dictionaries-for-tiny-spellchecker.adoc
index 1fe8d8cacc..65bb8f1e08 100644
--- a/modules/ROOT/pages/custom-dictionaries-for-tiny-spellchecker.adoc
+++ b/modules/ROOT/pages/custom-dictionaries-for-tiny-spellchecker.adoc
@@ -7,7 +7,7 @@
One custom dictionary can be created for each language already supported by the spell checker (see xref:introduction-to-tiny-spellchecker.adoc#supported-languages[supported languages]) or any arbitrary language added by additional Hunspell dictionary files included in Hunspell Dictionary Path (See xref:self-hosting-hunspell.adoc[Add Hunspell dictionaries to Spell Checker]). It's also possible to define an additional "global" dictionary that contains words that are valid across all languages, such as trademarks.
-A custom dictionary file for a particular language must be named with the language code of the language (see xref:introduction-to-tiny-spellchecker.adoc#supported-languages[supported languages] for language code examples), plus the suffix `+.txt+`: E.g. `+en.txt+`, `+en_gb.txt+`, `+fr.txt+`, `+de.txt+` etc.
+A custom dictionary file for a particular language must be named with the language code of the language (see xref:introduction-to-tiny-spellchecker.adoc#supported-languages[supported languages] for language code examples), plus the suffix `+.txt+`: E.g. `+en.txt+`, `+en-GB.txt+`, `+fr.txt+`, `+de.txt+` etc.
The "global" dictionary file for language-independent words must be called "global.txt".
diff --git a/modules/ROOT/pages/custom-split-toolbar-button.adoc b/modules/ROOT/pages/custom-split-toolbar-button.adoc
index 63fafd4f00..c379abd2ba 100644
--- a/modules/ROOT/pages/custom-split-toolbar-button.adoc
+++ b/modules/ROOT/pages/custom-split-toolbar-button.adoc
@@ -13,6 +13,8 @@ A split button contains a basic button and a menu button, wrapped up into one to
|text |string |Primary button |optional |Text displayed if no icon is found.
|icon |string |Primary button |optional |
include::partial$misc/admon-predefined-icons-only.adoc[]
+|tooltip |string |Primary button |optional |Text displayed when hovering over the main button.
+|chevronTooltip |string |Chevron button |optional |Text displayed when hovering over the chevron button. If not provided, it will be generated using the tooltip of the main button. ie: `+"{tooltip} menu"+`.
|onAction |`+(api) => void+` |Primary button |required |Function invoked when the basic button section is clicked.
|select |`+(value: string) => boolean+` |Choice menu items |optional |default: `false` - Function run on each option when the menu is opened to determine if it should be highlighted as active.
|columns |number or `+'auto'+` |Drop-down menu |optional |default: `1` - Number of columns for the list of options. When set to more than 1 column, only the icon for each item will be shown.
@@ -35,6 +37,7 @@ include::partial$misc/admon-predefined-icons-only.adoc[]
3+|
|setText |`+(text: string) => void+` |Sets the text label to display.
|setIcon |`+(icon: string) => void+` |Sets the icon of the button.
+|setTooltip |`+(tooltip: string) => void+` |Sets the main button tooltip.
|===
[[split-button-example-and-explanation]]
diff --git a/modules/ROOT/pages/editor-and-features.adoc b/modules/ROOT/pages/editor-and-features.adoc
index 96b67a2cac..8868ce3fe3 100644
--- a/modules/ROOT/pages/editor-and-features.adoc
+++ b/modules/ROOT/pages/editor-and-features.adoc
@@ -20,7 +20,7 @@ The following example adds a script tag into the application that inserts the co
[source,html,subs="attributes+"]
----
-
+
----
[cols="1,2,12",options="header"]
@@ -28,6 +28,7 @@ The following example adds a script tag into the application that inserts the co
| |Value |Description
|1 |no-api-key |Replace with your api key
|2 |origin |A `+referrerpolicy+` specifies how much of the current page's URL is sent in the `+Referer+` header when the browser fetches page resources (for example, the {productname} editor). The use of the `+Referer+` header ensures API keys are only used on domains registered to their owners. We only care about the domain portion however (similar to the operation of `+Origin+` header), so for improved performance and privacy always set the `+referrerpolicy+` to `+origin+` when requesting {cloudname} resources.
+|3 |anonymous |the `+crossorigin="anonymous"+` attribute is required on all script tags loading {productname} from {cloudname}. This attribute ensures consistent Origin header behavior for license key validation and improves security for cross-origin script loading.
|===
image::scripttag.png[Script Tag Description]
@@ -79,13 +80,15 @@ Migrating from a self-hosted environment to {cloudname} is easy. Remove the exis
NOTE: The script tag typically references `+tinymce.min.js+` hosted within the application or available at a legacy CDN.
-Replace the script tag with the following:
+Replace the script tag with the following, making sure to include both required attributes (`referrerpolicy` and `crossorigin`):
[source,html,subs="attributes+"]
----
-
+
----
+NOTE: When migrating to {cloudname}, both the `referrerpolicy="origin"` and `crossorigin="anonymous"` attributes are required for optimal performance and cross-browser functionality.
+
=== Step 2: Update custom plugin paths
Reference xref:editor-important-options.adoc#external_plugins[external_plugins] to ensure custom plugins or modified plugins continue to function in the {cloudname} deployment.
diff --git a/modules/ROOT/pages/editor-command-identifiers.adoc b/modules/ROOT/pages/editor-command-identifiers.adoc
index c304ab5bb1..134b326630 100644
--- a/modules/ROOT/pages/editor-command-identifiers.adoc
+++ b/modules/ROOT/pages/editor-command-identifiers.adoc
@@ -155,7 +155,7 @@ The commands in the following table are provided by the {productname} editor and
|mceTogglePlainTextPaste |Toggles paste as plain text.
|mceToggleVisualAid |Toggles the visual aids for: tables without borders and anchors.
|ToggleSidebar |Closes the current sidebar, or toggles the sidebar if the sidebar name is provided as a value (`__`).
-|ToggleToolbarDrawer |Toggles the Toolbar Drawer. For information on toolbars, see: xref:toolbar-configuration-options.adoc#toolbar[User interface options - Toolbar].
+|ToggleToolbarDrawer |Toggles the Toolbar Drawer. Can be used with the `skip_focus` option to prevent focusing the editor. For information on toolbars, see: xref:toolbar-configuration-options.adoc#toolbar[User interface options - Toolbar].
|===
.Examples
@@ -199,7 +199,7 @@ tinymce.activeEditor.execCommand('mceTogglePlainTextPaste');
tinymce.activeEditor.execCommand('mceToggleVisualAid');
tinymce.activeEditor.execCommand('ToggleSidebar'); /* OR */
tinymce.activeEditor.execCommand('ToggleSidebar', false, '');
-tinymce.activeEditor.execCommand('ToggleToolbarDrawer');
+tinymce.activeEditor.execCommand('ToggleToolbarDrawer', false, null, { skip_focus: true });
----
[[core-table-commands]]
@@ -614,7 +614,7 @@ The following command states can be queried using the xref:apis/tinymce.editor.a
|Strikethrough |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Strikethrough+` command.
|Subscript |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Subscript+` command.
|Superscript |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Superscript+` command.
-|ToggleToolbarDrawer |Returns `+true+` if the Toolbar Drawer is open. The state can be controlled by the {productname} `+ToggleToolbarDrawer+` command.
+|ToggleToolbarDrawer |Returns `+true+` if the Toolbar Drawer is open. The state can be controlled by the {productname} `+ToggleToolbarDrawer+` command. When controlling the state, use the `skip_focus` option (recommended) instead of the deprecated `skipFocus` option.
|Underline |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Underline+` command.
|===
diff --git a/modules/ROOT/pages/editor-plugin-version.adoc b/modules/ROOT/pages/editor-plugin-version.adoc
index 34356c31a5..25113309f6 100644
--- a/modules/ROOT/pages/editor-plugin-version.adoc
+++ b/modules/ROOT/pages/editor-plugin-version.adoc
@@ -10,21 +10,21 @@ The example below shows the default way to load {productname} {productmajorversi
[source,html,subs="attributes+"]
----
-
+
----
To load a specific version of {productname} {productmajorversion} other than the latest release, replace the `{productmajorversion}` in the URL with the desired version. For example, to load a minor version such as {productname} `{productmajorversion}.1`, use the following URL:
[source,html,subs="attributes+"]
----
-
+
----
To load a specific patch version, replace the `{productmajorversion}` in the URL with the desired patch version. For example, to load {productname} `{productmajorversion}.1.2`, use the following URL:
[source,html,subs="attributes+"]
----
-
+
----
[TIP]
@@ -55,7 +55,7 @@ This channel deploys the latest release of {productname} that has passed our qua
[source,html,subs="attributes+"]
----
-
+
----
[#{productmajorversion}-testing-release-channel]
@@ -68,7 +68,7 @@ This channel deploys the current *release candidate* for the `{productmajorversi
[source,html,subs="attributes+"]
----
-
+
----
[#{productmajorversion}-dev-release-channel]
@@ -86,7 +86,7 @@ The current version of {productname} available on the `{productmajorversion}-dev
[source,html,subs="attributes+"]
----
-
+
----
For more details, check out the xref:editor-and-features.adoc[{productname} editor via {cloudname}].
@@ -106,7 +106,7 @@ The `plugins.min.js` script loads every premium plugin the API key is entitled t
[source,html,subs="attributes+"]
----
-
+
----
=== `plugins.min.js` with Exclusions for Specific Plugins
@@ -115,7 +115,7 @@ To exclude specific premium plugins from `plugins.min.js` because you are self-h
[source,html,subs="attributes+"]
----
-
+
----
[NOTE]
@@ -131,7 +131,7 @@ The `cloud-plugins.min.js` script allows loading of specific premium plugins fro
[source,html,subs="attributes+"]
----
-
+
----
[NOTE]
diff --git a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc
index e597a4f8d9..f30e8a5dae 100644
--- a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc
+++ b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc
@@ -30,7 +30,8 @@ Inside the `public` folder where you created the `index.html` file add the HTML
TinyMCE with Export to PDF
+
----
== Step 2: Specify purchased TinyMCE plugins and toolbar buttons
@@ -37,7 +37,7 @@ The following is a complete example, where:
-
+
diff --git a/modules/ROOT/pages/import-from-word-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/import-from-word-with-jwt-authentication-nodejs.adoc
index 51078cfd4d..13cd80da77 100644
--- a/modules/ROOT/pages/import-from-word-with-jwt-authentication-nodejs.adoc
+++ b/modules/ROOT/pages/import-from-word-with-jwt-authentication-nodejs.adoc
@@ -30,7 +30,8 @@ Inside the `public` folder where you created the `index.html` file add the HTML
TinyMCE with Import from Word
diff --git a/modules/ROOT/pages/mediaembed-server-config.adoc b/modules/ROOT/pages/mediaembed-server-config.adoc
index 8098f3b665..34b0da8f54 100644
--- a/modules/ROOT/pages/mediaembed-server-config.adoc
+++ b/modules/ROOT/pages/mediaembed-server-config.adoc
@@ -2,7 +2,7 @@
:description: Instructions for getting the Enhanced Media Embed server configured.
:keywords: enterprise, pricing, video, youtube, vimeo, mp3, mp4, mov, movie, clip, film, link, linkchecking, linkchecker, mediaembed, media
-Once you have the xref:introduction-to-premium-selfhosted-services.adoc[server-side component] installed, additional configuration to your `+application.conf+` file is required. (Don't forget to restart the Java application server after updating the configuration.)
+Once you have the xref:individual-hyperlinking-container.adoc[Deploy the {productname} hyperlinking server-side component using Docker] installed, additional configuration to your `+application.conf+` file is required. (Don't forget to restart the Docker container after updating the configuration.)
The Enhanced Media Embed service allows you to choose between using your own https://iframely.com/[Iframely] account, configuring custom http://oembed.com/[oEmbed] endpoints or using a combination of both.
diff --git a/modules/ROOT/pages/migration-from-7x.adoc b/modules/ROOT/pages/migration-from-7x.adoc
index e7c6054b80..cce056d84a 100644
--- a/modules/ROOT/pages/migration-from-7x.adoc
+++ b/modules/ROOT/pages/migration-from-7x.adoc
@@ -3,5 +3,594 @@
:description: Guidance for migrating from TinyMCE 7 to TinyMCE 8
:keywords: migration, considerations, premigration, pre-migration
:release-version: 8.0
+:page-toclevels: 3
-// TODO
\ No newline at end of file
+== Introduction
+
+This guide provides a comprehensive overview of the breaking changes introduced in {productname} {release-version}, along with the necessary steps to migrate from {productname} 7.x. It covers key updates to APIs, plugins, and service configurations, including deprecated methods, renamed components, and removed features. These changes are designed to enhance performance, simplify configuration, and align with modern web standards, ensuring a smoother transition and continued compatibility for your integrations.
+
+[IMPORTANT]
+.Breaking Changes Quick Reference
+====
+The following table summarizes all breaking changes in {productname} {release-version}. Each item links to detailed information further in the guide.
+
+Any items marked **"High"** level require immediate attention during migration.
+
+[cols="2,3,1",options="header"]
+|===
+|Breaking Change |Impact |Level
+|xref:license-key-system-update[License Key System]
+|Self-hosted deployments now require a new license key format and license key manager. Old keys are **not compatible**.
+|High
+
+|xref:dompurify-update-breaking-change[DOMPurify Update]
+|Sanitization is now stricter; content previously allowed may be stripped or altered.
+|High
+
+|xref:editor-selection-setcontent-deprecated[editor.selection.setContent]
+|Method deprecated. Use `editor.insertContent` instead.
+|Medium
+
+|xref:fire-method-deprecation[fire()]
+|Method deprecated. Use `dispatch()` for event handling.
+|Medium
+
+|xref:editor-documentbaseurl-removal[editor.documentBaseUrl]
+|Undocumented property removed. Use `editor.editorManager.documentBaseURI` instead.
+|Low
+
+|xref:skipfocus-consolidation[skipFocus and skip_focus]
+|Options consolidated to `skipFocus` in `ToggleToolbarDrawer`.
+|Low
+
+|xref:split-button-css-breaking-change[Split buttons]
+|Split button CSS classes and structure have changed.
+|Low
+|===
+====
+
+[[license-key-system-update]]
+=== Transition from Version 7 License Keys to Version {release-version} License Keys
+// #EPIC-192
+
+[IMPORTANT]
+====
+This section applies to self-hosted installations only. For cloud deployments, license key management is handled automatically.
+====
+
+{productname} {release-version} introduces an enhanced license key system that requires specific attention during migration.
+
+The complete licensing documentation xref:license-key.adoc[License Key Management] covers:
+
+* Detailed explanations of all license types (GPL, Commercial, GPL with Premium Features)
+* Time-based vs Version-locked license key differences
+* License states (Active, Grace Period, Expired, Invalid)
+* Deployment options (Cloud-only, Self-hosted, Hybrid)
+* Step-by-step configuration examples for each setup
+* Commercial License Key Manager setup and requirements
+* Troubleshooting and FAQ
+
+**Impact**: The new license key system introduces breaking changes that require updates to your configuration and code.
+
+**Key Migration Considerations**:
+
+* *License Key Format Change:*
+** Version 7 keys are: Not compatible with {productname} {release-version}.
+** New keys use the prefix `T8LK:` for commercial licenses or `GPL+T8LK:` for GPL with Premium Features.
+* *Mandatory Key Requirement:* Self-hosted deployments **now require** a valid license key; without one, the editor will be set to `readonly`.
+* *Commercial License Manager:* Self-hosted commercial deployments **require** the new License Key Manager addon.
+
+**Migration Steps:**
+
+. *Obtain New License Key:*
++
+* link:https://www.tiny.cloud/contact/[Contact us] to obtain a new {productname} {release-version} license key, or use `gpl` for the open source version. See: xref:license-key.adoc#setting-the-license[setting the license] for details.
++
+. *Update Configuration:*
++
+[source, javascript]
+----
+// Old TinyMCE 7 configuration
+tinymce.init({
+ selector: '#editor',
+ // No license key required
+});
+
+// New TinyMCE 8 configuration
+tinymce.init({
+ selector: '#editor',
+ license_key: 'T8LK:...' // New format required
+});
+----
+
+==== License Key Manager Setup
+
+When migrating to {productname} {release-version} with a commercial license, the License Key Manager addon is required for the editor to operate. The setup varies based on your deployment method:
+
+*CDN/Static Hosting:*
+
+* Ensure the supplied `licensekeymanager` folder is in your {productname} plugins directory:
+
+[tree]
+----
+your-site/
+├── tinymce/
+│ └── plugins/
+│ ├── licensekeymanager/ # Add this folder
+│ │ ├── plugin.min.js
+│ │ └── index.js
+│ └── ... other plugins
+----
+
+*NPM/Module Bundler:*
+
+Install {productname} and ensure the license key manager is imported:
+
+[source, javascript]
+----
+// Import TinyMCE
+import tinymce from 'tinymce';
+
+// Import the license key manager
+import 'tinymce/plugins/licensekeymanager';
+
+tinymce.init({
+ selector: '#editor',
+ license_key: 'T8LK:...' // New format required
+});
+----
+
+*React/Next.js:*
+
+When using the `@tinymce/tinymce-react` package:
+
+[source, javascript]
+----
+import { Editor } from '@tinymce/tinymce-react';
+import 'tinymce/plugins/licensekeymanager';
+
+export default function MyEditor() {
+ return (
+
+ );
+}
+----
+
+*PHP/Laravel:*
+
+Ensure the license key manager is included when publishing {productname} assets:
+
+[source, php]
+----
+
+
+
+----
+
+[IMPORTANT]
+====
+* The license key manager is automatically included when using {companyname} Cloud.
+* The plugin does not need to be added to the `plugins` configuration option.
+* For bundled applications, the license key manager must be loaded before {productname} initialization.
+* For bundled applications, ensure the license key manager is not excluded during build optimization.
+====
+
+For complete details on license key manager setup and troubleshooting, see xref:license-key.adoc##setting-up-the-commercial-license-key-manager[Setting up the Commercial License Key Manager].
+
+**License Migration checklist:**
+
+* [ ] Contact support for new {productname} {release-version} license key or use GPL for the open source version
+* [ ] Install license key manager addon for commercial licenses
+* [ ] Update configuration with new license key format
+* [ ] Test editor functionality with new license
+* [ ] Verify all premium features are working
+
+[[dompurify-update-breaking-change]]
+=== DOMPurify Update and Stricter Sanitization (Breaking Change)
+// #TINY-12056
+
+{productname} {release-version} updates the DOMPurify dependency to version 3.2.6 and enables the `SAFE_FOR_XML` flag by default. This is a breaking change: content that previously passed sanitization in {productname} 7 may now be stripped or altered during the sanitization process.
+
+[IMPORTANT]
+====
+This change improves security and aligns with DOMPurify's recommended defaults. However, existing content and integrations that relied on the previous, less strict sanitization behavior may be impacted.
+====
+
+**Key Changes**:
+
+* **DOMPurify upgraded to 3.2.6**
+* **`SAFE_FOR_XML` enabled** — This setting enforces stricter handling of comments and attribute values, preventing certain XSS vectors.
+* **Content Impact** — HTML comments containing tags, Internet Explorer conditional comments, and attributes with HTML-like values may now be removed during sanitization. Content that was previously allowed may be stripped.
+
+**Impact**: This change improves security by preventing potential XSS attacks through comments and attributes that were previously allowed. However, it may also result in content being stripped or altered unexpectedly.
+
+**Migration Steps:**
+
+* Review workflows and test content that previously relied on relaxed sanitization.
+* {productname} now provides the xref:content-filtering.adoc#allow_html_in_comments[Content Filtering: allow_html_in_comments option] option. Enabling this option allows HTML tags in comments with sanitization still enabled.
+
+[WARNING]
+Using `allow_html_in_comments` increases the risk of XSS vulnerabilities. xref:security.adoc#allow_html_in_comments[allow_html_in_comments] is not recommended for production use unless you fully understand the implications and have appropriate security measures in place.
+
+.Example: Content Differences
+|===
+|Content |{productname} 7 Output |{productname} {release-version} Output
+
+|``
+|``
+|``
+
+|``
+|``
+|``
+
+|``
+|``
+|``
+|===
+
+[NOTE]
+====
+For information on disabling DOMPurify sanitization (not recommended), see xref:security.adoc#xss_sanitization-option[xss_sanitization option].
+====
+
+== Core Changes
+
+[[split-button-css-breaking-change]]
+=== Split Button Styling Update for Custom Skins
+// #TINY-8665
+
+{productname} {productmajorversion}, xref:custom-split-toolbar-button.adoc[split toolbar buttons] now render as two distinct components: one for the primary action and one for the dropdown chevron.
+
+This structural change modifies the DOM layout of split buttons and may break custom CSS rules that rely on the previous structure.
+
+**Impact**: This change only affects integrators using *custom skins*.
+
+**Migration Guide:**
+
+If your implementation includes a custom skin, follow these steps to ensure compatibility:
+
+* [ ] Confirm whether your project uses a custom skin.
+* [ ] **Rebuild your custom skin** using the {productname} {productmajorversion} codebase. See xref:creating-a-skin.adoc[Creating a Skin] for instructions.
+* [ ] **Update your split button usage** to align with the new structure, including support for the `chevronTooltip` option. Refer to xref:custom-split-toolbar-button.adoc[Split Toolbar Buttons] for updated configuration details.
+* [ ] **Test the rendering and interaction** of split buttons in your editor to verify expected behavior.
+
+**Summary of Changes:**
+
+* Split buttons now render as two separate DOM elements.
+* CSS selectors and styles that depended on the old structure may no longer apply correctly.
+* The `chevronTooltip` API option is now supported.
+
+
+== Core API Changes
+
+[discrete]
+=== Breaking Changes Overview
+
+IMPORTANT: The following sections detail important changes that require updates to your code. Please review each section carefully.
+
+=== Updated Methods
+
+[[skipfocus-consolidation]]
+==== skipFocus and skip_focus
+// #TINY-12044
+
+The `skipFocus` and `skip_focus` options for the `ToggleToolbarDrawer` command have been consolidated into a single, more consistent argument. This reduces API complexity and clarifies the intended behavior.
+
+**Impact**: This change simplifies focus management, reducing the risk of confusion and unexpected behavior.
+
+**Migration steps:**
+
+[source, javascript]
+----
+// Old approach (Deprecated) in TinyMCE 8
+editor.execCommand('ToggleToolbarDrawer', false, { skipFocus: true })
+
+// New approach (Recommended)
+editor.execCommand('ToggleToolbarDrawer', false, null, { skip_focus: true })
+----
+
+**Migration checklist:**
+
+* [ ] Locate all instances of `ToggleToolbarDrawer` command usage
+* [ ] Replace `skip_focus` with `skipFocus` in command options
+* [ ] Update any custom plugins using this command
+* [ ] Test toolbar drawer behavior after changes
+
+'''
+
+=== Removed Methods
+
+[[editor-documentbaseurl-removal]]
+==== editor.documentBaseUrl
+[.discrete]
+// #TINY-12182
+
+The undocumented `editor.documentBaseUrl` property has been removed.
+
+.Example Usage
+[source,javascript]
+----
+// Removed in TinyMCE 8
+console.log('documentBaseUrl', editor.documentBaseUrl);
+
+// Use this instead
+console.log('documentBaseURI', editor.documentBaseURI.getURI());
+----
+
+TIP: Use `editor.documentBaseURI.getURI()` for all base URL operations.
+
+**Impact**: This change improves URL handling consistency by removing an undocumented API that was not aligned with the documented `documentBaseURI` property.
+
+**Migration steps:**
+
+To update all references of `documentBaseUrl` to the new API, replace any usage of `editor.documentBaseUrl` (or similar) with `editor.documentBaseURI.getURI()`. The property `documentBaseUrl` has been removed, and the correct way to access the document base URL is now through the `documentBaseURI` property, which is a URI object. You can then call `.getURI()` on it to get the string value of the URL.
+
+.For example, update this:
+[source, js]
+----
+const baseUrl = editor.documentBaseUrl;
+----
+
+to:
+
+[source, js]
+----
+const baseUrl = tinymce.activeEditor.documentBaseURI.getURI();
+----
+
+This change is necessary because the undocumented `editor.documentBaseUrl` API has been removed to improve URL handling consistency. The new approach uses the documented `documentBaseURI` property, which provides a URI object with methods such as `getURI()` to retrieve the full URL string.
+
+For more information see: link:https://www.tiny.cloud/docs/tinymce/latest/apis/tinymce.editor/#properties[tinymce.editor/#properties].
+
+**Migration checklist:**
+
+* [ ] Search your codebase for all instances of `editor.documentBaseUrl`.
+* [ ] Replace them with `tinymce.activeEditor.documentBaseURI.getURI()` (or `editor.documentBaseURI.getURI()` if you have an `editor` reference).
+
+'''
+
+=== Deprecated Methods
+
+[[editor-selection-setcontent-deprecated]]
+==== editor.selection.setContent
+[.discrete]
+// #TINY-12109
+
+The `editor.selection.setContent` API has been deprecated and will be removed in {productname} 9.
+
+*Impact*: This change simplifies content manipulation by consolidating insertion methods.
+
+**Migration steps:**
+
+To replace `editor.selection.setContent`, use `editor.insertContent` instead. The new method is more consistent with other content manipulation methods in {productname}.
+
+.Example Usage
+[source,javascript]
+----
+// Deprecated in TinyMCE 8, will be removed in 9
+editor.selection.setContent('New content
');
+
+// Recommended replacement
+editor.insertContent('New content
');
+----
+
+**Migration checklist:**
+
+* [ ] Replace all instances of `editor.selection.setContent` with `editor.insertContent`
+* [ ] Update custom plugins that use the old method
+* [ ] Test content insertion in your editor instances
+
+[[fire-method-deprecation]]
+==== `fire()`
+// #TINY-12012, ref TINY-8102
+
+The `fire()` method has been replaced by `dispatch()` for event handling. The `fire()` method will be removed in {productname} 9 to avoid confusion with its name.
+
+[source, javascript]
+----
+// Deprecated in TinyMCE 8, will be removed in 9
+// Old approach for dispatching custom events
+editor.fire('someEvent');
+
+// New approach for dispatching custom events
+editor.dispatch('someEvent');
+----
+
+**Impact**: This change aligns {productname} with modern event handling conventions, making the API more intuitive for developers.
+
+**Migration checklist:**
+
+* [ ] Search codebase for all uses of the `fire()` method
+* [ ] Replace each instance with `dispatch()`
+* [ ] Review and update third-party plugins
+* [ ] Test all custom event handling
+
+'''
+
+=== Plugin Updates
+
+==== Language Pack Filename Changes
+// #TINY-12090
+
+Language pack filenames have been standardized to follow the RFC5646 format. This update ensures consistent language handling across platforms and improves internationalization support. While both the legacy underscore format (e.g., `en_GB.js`) and the new hyphenated format (e.g., `en-GB.js`) are supported in {productname} {release-version}, the underscore format is deprecated and will be removed in {productname} 9. Migrating to the RFC5646 format now will ensure future compatibility and reduce maintenance overhead during upcoming upgrades.
+
+**Impact**: Custom language packs and configurations using the underscore-based format should update before upgrading to {productname} 9 to avoid loading failures.
+
+**Migration checklist:**
+
+* [ ] Identify all language pack files in your deployment
+* [ ] Rename files to RFC5646 format (e.g., `en_GB.js` → `en-GB.js`)
+* [ ] Update configuration references to language files
+* [ ] Update build scripts that handle language files
+* [ ] Test language switching in your application
+* [ ] Update custom translation files to use the new format
+
+[source, javascript]
+----
+// Deprecated format (supported only in versions 8.x)
+language_url: '/langs/en_GB.js'
+
+// Recommended format
+language_url: '/langs/en-GB.js'
+----
+
+[IMPORTANT]
+Support for the underscore format will be removed in {productname} 9. Early migration is recommended.
+
+==== Update to Image and Accessibility Checker Plugins
+// #TINY-12226
+
+The Image and Accessibility Checker plugins now follow the latest W3C standards for decorative images, requiring an empty alt attribute rather than a `+role="presentation"+` attribute. This change helps improve accessibility support.
+
+**Impact**: Customers using these plugins will need to update their configurations to ensure continued compliance with accessibility standards.
+
+**Migration checklist:**
+
+* [ ] Identify images previously using `role="presentation"` for decorative purposes in your content
+* [ ] Replace those with empty alt attributes `alt=""`
+* [ ] Update image plugin configuration if customized
+* [ ] Test accessibility checker with updated content
+
+For more information on the changes, see: xref:a11ychecker.adoc##image-rules[Accessibility Checker: Image rules].
+
+=== Cross-Origin Resource Loading Configuration
+// #TINY-12228, TINY-12326
+
+When upgrading to {productname} 8, you will need to review and possibly update how your integration handles cross-origin resource loading. {productname} 8 provides a new configuration option for controlling the `crossorigin` attribute on loaded resources.
+
+**What to check:**
+
+. If you're using {cloudname}:
++
+* Ensure your script tag includes both required attributes:
++
+[source,html,subs="attributes+"]
+----
+
+----
++
+. If your application loads resources (scripts or stylesheets) from different domains:
++
+* Configure the new crossorigin function to control the `crossorigin` attribute for all resources.
++
+.Example: Configuring the crossorigin function
+[source, javascript]
+----
+const crossOriginFunction = (url, resourceType) => {
+ // Returning 'anonymous' or 'use-credentials' here would explicitly set the attribute
+ return 'anonymous';
+ // return 'use-credentials';
+ // return undefined; // Omits the 'crossorigin' attribute for all resources by returning undefined
+};
+
+tinymce.init({
+ selector: "textarea",
+ crossorigin: crossOriginFunction
+});
+----
++
+. If you're using content_css from a different domain:
+
+* The `content_css_cors` option takes precedence for stylesheets.
+* Review your `content_css` configuration if you use cross-origin stylesheets.
+
+**Migration checklist:**
+
+* [ ] Verify script tag attributes for Cloud deployments.
+* [ ] Configure `crossorigin` function if using cross-origin resources.
+* [ ] Test resource loading in your deployment environment.
+* [ ] Review `content_css` configuration if using cross-origin stylesheets.
+
+For complete details on the new crossorigin function API, see: xref:tinymce-and-cors.adoc#crossorigin[crossorigin configuration option].
+
+=== Technical Cleanup
+
+==== Removed Empty Files
+// #TINY-11287, #TINY-12084
+
+Several empty files have been removed from the codebase to reduce clutter and improve maintenance:
+
+* Empty CSS file from the **Comments** plugin
+* Empty LESS file from the **Mentions** plugin
+
+**Impact**: These changes have no functional impact but may affect custom build processes that explicitly reference these files.
+
+**Migration checklist:**
+
+* [ ] Check build processes for references to Comments plugin CSS
+* [ ] Check build processes for references to Mentions plugin LESS
+* [ ] Remove any imports of these empty files
+* [ ] Test Comments and Mentions plugins after removal
+
+=== Service and Configuration Changes
+
+==== Discontinuation of Medical English (UK)
+// #EPIC-255
+
+[WARNING]
+The "Medical English (UK)" dictionary has been removed due to licensing constraints. Customers using this feature must update their configurations accordingly.
+
+**Impact**: Users relying on this dictionary will need to make alternative arrangements for medical-specific spell checking.
+
+**Migration checklist:**
+
+* [ ] Remove "Medical English (UK)" from spellchecker configurations
+* [ ] Remove any custom dictionary integrations related to Medical English
+* [ ] Test spellchecker functionality with remaining dictionaries
+* [ ] Configure alternative medical dictionary if required
+
+==== Decoupling of Service Versions from {productname} Editor
+// #EPIC-247, #EPIC-265
+
+Services previously bundled with the editor, such as Java Servlet services, are no longer included in {productname} {release-version} packages. Customers should migrate to xref:bundle-intro-setup.adoc[Containerized service deployments] or consider alternative hosting options.
+
+**Impact**: This reduces the dependency between the editor and backend services, simplifying updates and maintenance.
+
+**Migration steps:**
+
+* Update the applications deployment architecture to use xref:bundle-intro-setup.adoc[Containerized services] where applicable
+
+==== Transition from Java WAR Files to Containerized Services
+// #EPIC-247
+
+{productname} {release-version} no longer includes Java WAR files for backend services like the spell checker. Customers are required to migrate to modern Docker/OCI containers for self-hosted deployments.
+
+**Impact**: This reduces infrastructure complexity and aligns with modern DevOps practices.
+
+**Migration checklist:**
+
+* [ ] Inventory current WAR file deployments
+* [ ] Review containerization requirements for your environment
+* [ ] Plan transition timeline to containerized services
+* [ ] Set up container infrastructure (Docker/Kubernetes)
+* [ ] Deploy and test containerized services
+* [ ] Update service connection configurations
+* [ ] Contact link:{supporturl}/[{supportname}] if legacy WAR files are still needed
+
+For more information on deploying the server-side components using Docker, see: xref:bundle-intro-setup.adoc[Containerized service deployments].
+
+== Conclusion
+
+Upgrading to {productname} {release-version} requires integrators to update their API calls, plugin configurations, and service integrations to accommodate the breaking changes introduced in this release. While some adjustments may involve significant code updates, these enhancements are intended to simplify development, and improve the overall editor experience.
+
+For more guidance, refer to the:
+
+* link:https://www.tiny.cloud/docs[{productname} Documentation].
+* link:https://www.tiny.cloud/contact/[Contact {supportname}] for assistance.
+* Try {productname}’s new **Ask AI** widget is ready to assist you, just click the icon in the bottom-right corner of any documentation page.
+
+image::ask-ai/ask-ai-widget.png[Ask AI Widget, width=600, align="left"]
+
+== Additional Resources
+
+For additional details on {productname} {release-version} changes, see xref:8.0-release-notes.adoc#overview[{productname} {release-version} release notes].
diff --git a/modules/ROOT/pages/migration-from-froala.adoc b/modules/ROOT/pages/migration-from-froala.adoc
index 2a9b4784a4..67c958f931 100644
--- a/modules/ROOT/pages/migration-from-froala.adoc
+++ b/modules/ROOT/pages/migration-from-froala.adoc
@@ -38,7 +38,7 @@ To migrate from a basic Froala 3 configuration to a basic {productname} {product
+
[source,html,subs="attributes+"]
----
-
+
----
+
Replace `+no-api-key+` with your link:{accountpageurl}/[{cloudname} API key].
@@ -119,7 +119,7 @@ The following examples show an initial Froala configuration and the migrated {pr
-
+