}`.trim().replace('\n', '');
}
+// Custom "Document Root" element, a custom element to identify/define
+// block that may act as another "editable body".
+// Using a custom node means we can identify and add/remove these as desired
+// without affecting user content.
+class DocRootElement extends HTMLDivElement {
+ constructor() {
+ super();
+ }
+}
+
/**
* @param {WysiwygConfigOptions} options
* @return {Object}
// Set language
window.tinymce.addI18n(options.language, options.translationMap);
-
+ // Build toolbar content
const {toolbar, groupButtons: toolBarGroupButtons} = buildToolbar(options);
+ // Define our custom root node
+ customElements.define('doc-root', DocRootElement, {extends: 'div'});
// Return config object
return {
statusbar: false,
menubar: false,
paste_data_images: false,
- extended_valid_elements: 'pre[*],svg[*],div[drawio-diagram],details[*],summary[*]',
+ extended_valid_elements: 'pre[*],svg[*],div[drawio-diagram],details[*],summary[*],doc-root',
automatic_uploads: false,
- valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre],+div[img]",
+ custom_elements: 'doc-root',
+ valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote|div],+div[pre],+div[img],+doc-root[p|h1|h2|h3|h4|h5|h6|blockquote|pre|img|ul|ol],-doc-root[doc-root|#text]",
plugins: gatherPlugins(options),
imagetools_toolbar: 'imageoptions',
contextmenu: false,
* @param {tinymce.html.Node} detailsEl
*/
function ensureDetailsWrappedInEditable(detailsEl) {
+ unwrapDetailsEditable(detailsEl);
+
detailsEl.attr('contenteditable', 'false');
- const wrap = tinymce.html.Node.create('div', {detailswrap: 'true', contenteditable: 'true'});
+ const wrap = tinymce.html.Node.create('doc-root', {contenteditable: 'true'});
for (const child of detailsEl.children()) {
if (child.name !== 'summary') {
wrap.append(child);
}
}
+
detailsEl.append(wrap);
}
*/
function unwrapDetailsEditable(detailsEl) {
detailsEl.attr('contenteditable', null);
+ let madeUnwrap = false;
for (const child of detailsEl.children()) {
- if (child.attr('detailswrap')) {
+ if (child.name === 'doc-root') {
child.unwrap();
+ madeUnwrap = true;
}
}
+
+ if (madeUnwrap) {
+ unwrapDetailsEditable(detailsEl);
+ }
}
}
details {
- border: 1px solid #DDD;
+ border: 1px solid;
+ @include lightDark(border-color, #DDD, #555);
margin-bottom: 1em;
padding: $-s;
}
margin-right: -$-s;
margin-bottom: -$-s;
font-weight: bold;
- background-color: #EEEEEE;
+ @include lightDark(background-color, #EEE, #333);
padding: $-xs $-s;
}
details[open] > summary {
- margin-bottom: 0;
+ margin-bottom: $-s;
+ border-bottom: 1px solid;
+ @include lightDark(border-color, #DDD, #555);
}
details > summary + * {
margin-top: .2em;
display: block;
}
+// Default styles for our custom root nodes
+.page-content.mce-content-body doc-root {
+ display: block;
+}
+
// In editor line height override
.page-content.mce-content-body p {
line-height: 1.6;
.page-content.mce-content-body details summary {
pointer-events: none;
}
-.page-content.mce-content-body details [detailswrap] {
+.page-content.mce-content-body details doc-root {
padding: $-s;
margin-left: (2px - $-s);
margin-right: (2px - $-s);