diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..ed3a0d3e
Binary files /dev/null and b/.DS_Store differ
diff --git a/README.md b/README.md
index 786f289f..62830660 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ If you've ever used jsfiddle, jsbin, dabblet, liveweave, codepen, cssdeck, cssde
Version
-------------
-1.1.42
+1.1.50
License
-------------
@@ -25,7 +25,7 @@ kodeWeave uses a number of open source projects to work properly:
* [Codemirror v6](http://codemirror.net/) - Awesome web-based text editor
* [Emmet](http://emmet.io/) - Codemirror Plugin for Zen Coding
* [Font Awesome v5](https://fontawesome.com/) - Beautiful icon library and toolkit
-* [Pico.css](https://picocss.com/) - Pico.css is a minimal css framework for semantic html
+* [daisyUI](https://daisyui.com/) - A Tailwind CSS Component Library (used for the toggle switch)
* [Tailwind CSS](https://tailwindcss.com/) - A low-level CSS framework that's entirely utility-first and provides users with low-level CSS classes in PostCSS that can be used to define components and designs independently.
* [JSZip](https://stuk.github.io/jszip/) - Package zip files locally in javascript
* [FileSaver.js](https://github.com/eligrey/FileSaver.js/) - JSZip comes prebuilt with this. Allows us to save files locally in Javascript
diff --git a/demo.json b/demo.json
index 2de9beec..7be6e128 100644
--- a/demo.json
+++ b/demo.json
@@ -1 +1,18 @@
-{"version":"1.1.43","settings":{"theme":false,"fontSize":"16","autoupdate":true,"console":true,"scratchpad":""},"pages":[{"name":"index","title":"An attractive title","description":"The most attractive description ever!","libraries":["https://cdnjs.cloudflare.com/ajax/libs/picocss/1.5.7/pico.classless.min.css","https://michaelsboost.com/TailwindCSSMod/tailwind-mod.min.css","https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"],"html":"\n \n \n\n \n \n \n \n\n \n \n Remove all lines containing string\n \n\n \n Convert\n \n\n \n Made with ❤️ and ☕️ by
Michael Schwartz \n
\n \n \n\n🌙 \n\ncopied to clipboard ","css":"","javascript":"// project json\nlet appJSON = {\n theme: true\n};\n\n// check if user can copy images in js\nif (!window.navigator || !window.navigator.clipboard) {\n assets.innerHTML = 'Clipboard API not supported!';\n}\n\n// toggle switch\ndocument.getElementById('switch').onchange = () => {\n // if switch is checked\n if (document.getElementById('switch').checked) {\n document.querySelector('nav span').style.display = 'none';\n replace.style.display = 'none';\n return false;\n }\n\n // if switch is not checked\n document.querySelector('nav span').style.display = 'block';\n replace.style.display = 'block';\n};\n\n// convert button click\nconvert.onclick = () => {\n // remove lines that contain string if switch is checked\n if (document.getElementById('switch').checked) {\n let str = input.value;\n let lines = str.split('\\n');\n let result = '';\n for (let i in lines) {\n let line = lines[i];\n if (line.indexOf(look.value) > -1) {\n // ignore lines containing the string you're looking for\n } else {\n result += line + \"\\n\";\n }\n }\n input.value = result.trim();\n\n return false;\n }\n\n // remove only words containing the string with whatever word user chooses\n input.value = input.value.toString().split(look.value).join(replace.value);\n\n // copy convertion to clipboard\n navigator.clipboard.writeText(input.value);\n\n // notify user change is copied to clipboard\n notification.style.display = 'block';\n setTimeout(() => {\n notification.style.display = 'none';\n }, 1000);\n};\n\n// toggle theme\npickTheme = val => {\n val = val.toString().toLowerCase();\n const elm = document.querySelector('[data-theme]');\n\n if (val === 'light') {\n elm.setAttribute('data-theme', val);\n icon.textContent = '🌙';\n appJSON.theme = true;\n }\n if (val === 'dark') {\n elm.setAttribute('data-theme', val);\n icon.textContent = '🌞';\n appJSON.theme = false;\n }\n\n // remember theme in localStorage\n localStorage.setItem('JSStringReplacer', JSON.stringify(appJSON));\n};\n\nicon.onclick = () => { (appJSON.theme) ? pickTheme('dark') : pickTheme('light'); };\n\n// check localStorage\nif (localStorage.getItem('JSStringReplacer')) {\n appJSON = JSON.parse(localStorage.getItem('JSStringReplacer'));\n (appJSON.theme) ? pickTheme('light') : pickTheme('dark');\n}"},{"name":"hello","title":"An attractive title","description":"The most attractive description ever!","libraries":["https://cdnjs.cloudflare.com/ajax/libs/picocss/1.5.7/pico.classless.min.css","https://michaelsboost.com/TailwindCSSMod/tailwind-mod.min.css","https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"],"html":"\n \n \n my awesome title \n my awesome sub title \n \n \n \n Lorem ipsum dolor, sit amet consectetur adipisicing elit. Unde qui voluptas fugit assumenda exercitationem rerum excepturi earum facere dignissimos praesentium ullam quidem ipsam dolores, eveniet alias minus? Laboriosam, amet enim?\n
\n \n ","css":"","javascript":""},{"name":"notepad","title":"An attractive title","description":"The most attractive description ever!","libraries":["https://cdnjs.cloudflare.com/ajax/libs/picocss/1.5.7/pico.classless.min.css","https://michaelsboost.com/TailwindCSSMod/tailwind-mod.min.css","https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"],"html":"\n \n \n\n
","css":"","javascript":"document.querySelector('html').setAttribute('data-theme', 'light')\n\n// variables\nconst code = `\n \n \n \n \n \n An Attractive Title \n \n \n\n \n Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ut et fugit odio vitae quisquam accusamus, dolor ipsa voluptatem perspiciatis! Dicta possimus culpa tempora repellendus accusamus, doloribus corporis harum accusantium. \n
\n `\n\naddtodo = () => {\n output.insertAdjacentHTML(\"afterbegin\", code)\n}"}]}
\ No newline at end of file
+{
+ "version": "1.1.50",
+ "settings": {
+ "autoupdate": true,
+ "console": true,
+ "fontSize": "16"
+ },
+ "title": "TradingView Widget",
+ "description": "A sample TradingView Widget",
+ "meta": "",
+ "libraries": [
+ "https://cdnjs.cloudflare.com/ajax/libs/picocss/2.0.6/pico.min.css"
+ ],
+ "markdown": "",
+ "html": "\n\n \n
\n",
+ "css": "",
+ "javascript": "new TradingView.widget({\n \"width\": \"100%\",\n \"height\": window.innerHeight,\n \"symbol\": \"COINBASE:BTCUSD\",\n \"interval\": \"1\",\n \"timezone\": \"Etc/UTC\",\n \"theme\": \"dark\",\n \"style\": \"1\",\n \"locale\": \"en\",\n \"toolbar_bg\": \"#f1f3f6\",\n \"enable_publishing\": false,\n \"hide_side_toolbar\": false,\n \"allow_symbol_change\": true,\n \"details\": true,\n \"studies\": [\n \"BB@tv-basicstudies\",\n \"Volume@tv-basicstudies\",\n \"VWAP@tv-basicstudies\"\n ],\n \"container_id\": \"tradingview_0b60e\"\n});"
+}
\ No newline at end of file
diff --git a/go/.DS_Store b/go/.DS_Store
new file mode 100644
index 00000000..1ade3a32
Binary files /dev/null and b/go/.DS_Store differ
diff --git a/go/app.js b/go/app.js
index 96cbffe4..322aed03 100644
--- a/go/app.js
+++ b/go/app.js
@@ -1,8 +1,10 @@
importJS = url => {
- let script = document.createElement('script')
- script.src = url
- script.setAttribute('defer', '')
- document.head.appendChild(script)
-}
-importJS('js/libraries.js')
-importJS('bundle.js')
\ No newline at end of file
+ let script = document.createElement("script");
+ script.src = url;
+ script.setAttribute("defer", "");
+ document.head.appendChild(script);
+};
+importJS("js/libraries.js");
+importJS("libraries/tailwind/tailwind.min.js");
+// setTimeout(() => importJS("script.js"), 100);
+setTimeout(() => importJS("bundle.js"), 100);
\ No newline at end of file
diff --git a/go/bundle.js b/go/bundle.js
index 407ff856..158a955b 100644
--- a/go/bundle.js
+++ b/go/bundle.js
@@ -5,10 +5,6 @@
The data structure for documents. @nonabstract
*/
class Text {
- /**
- @internal
- */
- constructor() { }
/**
Get the line description around the given position.
*/
@@ -29,6 +25,7 @@
Replace a range of the text with the given content.
*/
replace(from, to, text) {
+ [from, to] = clip(this, from, to);
let parts = [];
this.decompose(0, from, parts, 2 /* Open.To */);
if (text.length)
@@ -46,6 +43,7 @@
Retrieve the text between the given points.
*/
slice(from, to = this.length) {
+ [from, to] = clip(this, from, to);
let parts = [];
this.decompose(from, to, parts, 0);
return TextNode.from(parts, to - from);
@@ -103,7 +101,8 @@
return new LineCursor(inner);
}
/**
- @internal
+ Return the document as a string, using newline characters to
+ separate lines.
*/
toString() { return this.sliceString(0); }
/**
@@ -116,6 +115,10 @@
return lines;
}
/**
+ @internal
+ */
+ constructor() { }
+ /**
Create a `Text` instance for the given array of lines.
*/
static of(text) {
@@ -141,7 +144,7 @@
for (let i = 0;; i++) {
let string = this.text[i], end = offset + string.length;
if ((isLine ? line : end) >= target)
- return new Line(offset, end, line, string);
+ return new Line$1(offset, end, line, string);
offset = end + 1;
line++;
}
@@ -167,6 +170,7 @@
replace(from, to, text) {
if (!(text instanceof TextLeaf))
return super.replace(from, to, text);
+ [from, to] = clip(this, from, to);
let lines = appendText(this.text, appendText(text.text, sliceText(this.text, 0, from)), to);
let newLen = this.length + text.length - (to - from);
if (lines.length <= 32 /* Tree.Branch */)
@@ -174,6 +178,7 @@
return TextNode.from(TextLeaf.split(lines, []), newLen);
}
sliceString(from, to = this.length, lineSep = "\n") {
+ [from, to] = clip(this, from, to);
let result = "";
for (let pos = 0, i = 0; pos <= to && i < this.text.length; i++) {
let line = this.text[i], end = pos + line.length;
@@ -242,6 +247,7 @@
}
}
replace(from, to, text) {
+ [from, to] = clip(this, from, to);
if (text.lines < this.lines)
for (let i = 0, pos = 0; i < this.children.length; i++) {
let child = this.children[i], end = pos + child.length;
@@ -264,6 +270,7 @@
return super.replace(from, to, text);
}
sliceString(from, to = this.length, lineSep = "\n") {
+ [from, to] = clip(this, from, to);
let result = "";
for (let i = 0, pos = 0; i < this.children.length && pos <= to; i++) {
let child = this.children[i], end = pos + child.length;
@@ -485,7 +492,11 @@
}
next(skip = 0) {
let { done, lineBreak, value } = this.inner.next(skip);
- if (done) {
+ if (done && this.afterBreak) {
+ this.value = "";
+ this.afterBreak = false;
+ }
+ else if (done) {
this.done = true;
this.value = "";
}
@@ -515,7 +526,7 @@
This type describes a line in the document. It is created
on-demand when lines are [queried](https://codemirror.net/6/docs/ref/#state.Text.lineAt).
*/
- class Line {
+ class Line$1 {
/**
@internal
*/
@@ -547,6 +558,10 @@
*/
get length() { return this.to - this.from; }
}
+ function clip(text, from, to) {
+ from = Math.max(0, Math.min(text.length, from));
+ return [from, Math.max(from, Math.min(text.length, to))];
+ }
// Compressed representation of the Grapheme_Cluster_Break=Extend
// information from
@@ -1314,12 +1329,12 @@
The anchor of the range—the side that doesn't move when you
extend it.
*/
- get anchor() { return this.flags & 16 /* RangeFlag.Inverted */ ? this.to : this.from; }
+ get anchor() { return this.flags & 32 /* RangeFlag.Inverted */ ? this.to : this.from; }
/**
The head of the range, which is moved when the range is
[extended](https://codemirror.net/6/docs/ref/#state.SelectionRange.extend).
*/
- get head() { return this.flags & 16 /* RangeFlag.Inverted */ ? this.from : this.to; }
+ get head() { return this.flags & 32 /* RangeFlag.Inverted */ ? this.from : this.to; }
/**
True when `anchor` and `head` are at the same position.
*/
@@ -1330,14 +1345,14 @@
the character before its position, 1 the character after, and 0
means no association.
*/
- get assoc() { return this.flags & 4 /* RangeFlag.AssocBefore */ ? -1 : this.flags & 8 /* RangeFlag.AssocAfter */ ? 1 : 0; }
+ get assoc() { return this.flags & 8 /* RangeFlag.AssocBefore */ ? -1 : this.flags & 16 /* RangeFlag.AssocAfter */ ? 1 : 0; }
/**
The bidirectional text level associated with this cursor, if
any.
*/
get bidiLevel() {
- let level = this.flags & 3 /* RangeFlag.BidiLevelMask */;
- return level == 3 ? null : level;
+ let level = this.flags & 7 /* RangeFlag.BidiLevelMask */;
+ return level == 7 ? null : level;
}
/**
The goal column (stored vertical offset) associated with a
@@ -1346,8 +1361,8 @@
lines of different length.
*/
get goalColumn() {
- let value = this.flags >> 5 /* RangeFlag.GoalColumnOffset */;
- return value == 33554431 /* RangeFlag.NoGoalColumn */ ? undefined : value;
+ let value = this.flags >> 6 /* RangeFlag.GoalColumnOffset */;
+ return value == 16777215 /* RangeFlag.NoGoalColumn */ ? undefined : value;
}
/**
Map this range through a change, producing a valid range in the
@@ -1376,8 +1391,9 @@
/**
Compare this range to another range.
*/
- eq(other) {
- return this.anchor == other.anchor && this.head == other.head;
+ eq(other, includeAssoc = false) {
+ return this.anchor == other.anchor && this.head == other.head &&
+ (!includeAssoc || !this.empty || this.assoc == other.assoc);
}
/**
Return a JSON-serializable object representing the range.
@@ -1427,14 +1443,17 @@
return EditorSelection.create(this.ranges.map(r => r.map(change, assoc)), this.mainIndex);
}
/**
- Compare this selection to another selection.
+ Compare this selection to another selection. By default, ranges
+ are compared only by position. When `includeAssoc` is true,
+ cursor ranges must also have the same
+ [`assoc`](https://codemirror.net/6/docs/ref/#state.SelectionRange.assoc) value.
*/
- eq(other) {
+ eq(other, includeAssoc = false) {
if (this.ranges.length != other.ranges.length ||
this.mainIndex != other.mainIndex)
return false;
for (let i = 0; i < this.ranges.length; i++)
- if (!this.ranges[i].eq(other.ranges[i]))
+ if (!this.ranges[i].eq(other.ranges[i], includeAssoc))
return false;
return true;
}
@@ -1507,18 +1526,18 @@
safely ignore the optional arguments in most situations.
*/
static cursor(pos, assoc = 0, bidiLevel, goalColumn) {
- return SelectionRange.create(pos, pos, (assoc == 0 ? 0 : assoc < 0 ? 4 /* RangeFlag.AssocBefore */ : 8 /* RangeFlag.AssocAfter */) |
- (bidiLevel == null ? 3 : Math.min(2, bidiLevel)) |
- ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* RangeFlag.NoGoalColumn */) << 5 /* RangeFlag.GoalColumnOffset */));
+ return SelectionRange.create(pos, pos, (assoc == 0 ? 0 : assoc < 0 ? 8 /* RangeFlag.AssocBefore */ : 16 /* RangeFlag.AssocAfter */) |
+ (bidiLevel == null ? 7 : Math.min(6, bidiLevel)) |
+ ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 16777215 /* RangeFlag.NoGoalColumn */) << 6 /* RangeFlag.GoalColumnOffset */));
}
/**
Create a selection range.
*/
static range(anchor, head, goalColumn, bidiLevel) {
- let flags = ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* RangeFlag.NoGoalColumn */) << 5 /* RangeFlag.GoalColumnOffset */) |
- (bidiLevel == null ? 3 : Math.min(2, bidiLevel));
- return head < anchor ? SelectionRange.create(head, anchor, 16 /* RangeFlag.Inverted */ | 8 /* RangeFlag.AssocAfter */ | flags)
- : SelectionRange.create(anchor, head, (head > anchor ? 4 /* RangeFlag.AssocBefore */ : 0) | flags);
+ let flags = ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 16777215 /* RangeFlag.NoGoalColumn */) << 6 /* RangeFlag.GoalColumnOffset */) |
+ (bidiLevel == null ? 7 : Math.min(6, bidiLevel));
+ return head < anchor ? SelectionRange.create(head, anchor, 32 /* RangeFlag.Inverted */ | 16 /* RangeFlag.AssocAfter */ | flags)
+ : SelectionRange.create(anchor, head, (head > anchor ? 8 /* RangeFlag.AssocBefore */ : 0) | flags);
}
/**
@internal
@@ -1555,6 +1574,9 @@
size](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize), [editor
attributes](https://codemirror.net/6/docs/ref/#view.EditorView^editorAttributes), and [update
listeners](https://codemirror.net/6/docs/ref/#view.EditorView^updateListener).
+
+ Note that `Facet` instances can be used anywhere where
+ [`FacetReader`](https://codemirror.net/6/docs/ref/#state.FacetReader) is expected.
*/
class Facet {
constructor(
@@ -1582,6 +1604,11 @@
this.extensions = typeof enables == "function" ? enables(this) : enables;
}
/**
+ Returns a facet reader for this facet, which can be used to
+ [read](https://codemirror.net/6/docs/ref/#state.EditorState.facet) it but not to define values for it.
+ */
+ get reader() { return this; }
+ /**
Define a new facet.
*/
static define(config = {}) {
@@ -2159,7 +2186,10 @@
is(type) { return this.type == type; }
/**
Define a new effect type. The type parameter indicates the type
- of values that his effect holds.
+ of values that his effect holds. It should be a type that
+ doesn't include `undefined`, since that is used in
+ [mapping](https://codemirror.net/6/docs/ref/#state.StateEffect.map) to indicate that an effect is
+ removed.
*/
static define(spec = {}) {
return new StateEffectType(spec.map || (v => v));
@@ -2476,9 +2506,9 @@
}
return spec == tr ? tr : Transaction.create(state, tr.changes, tr.selection, spec.effects, spec.annotations, spec.scrollIntoView);
}
- const none$2 = [];
+ const none$3 = [];
function asArray$1(value) {
- return value == null ? none$2 : Array.isArray(value) ? value : [value];
+ return value == null ? none$3 : Array.isArray(value) ? value : [value];
}
/**
@@ -2630,7 +2660,8 @@
else {
startValues = tr.startState.values.slice();
}
- new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr);
+ let selection = tr.startState.facet(allowMultipleSelections) ? tr.newSelection : tr.newSelection.asSingle();
+ new EditorState(conf, tr.newDoc, selection, startValues, (state, slot) => slot.update(state, tr), tr);
}
/**
Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that
@@ -3034,7 +3065,7 @@
/**
A range associates a value with a range of positions.
*/
- let Range$1 = class Range {
+ class Range$1 {
constructor(
/**
The range's start position.
@@ -3056,9 +3087,9 @@
@internal
*/
static create(from, to, value) {
- return new Range(from, to, value);
+ return new Range$1(from, to, value);
}
- };
+ }
function cmpRange(a, b) {
return a.from - b.from || a.value.startSide - b.value.startSide;
}
@@ -3302,8 +3333,7 @@
static compare(oldSets, newSets,
/**
This indicates how the underlying data changed between these
- ranges, and is needed to synchronize the iteration. `from` and
- `to` are coordinates in the _new_ space, after these changes.
+ ranges, and is needed to synchronize the iteration.
*/
textDiff, comparator,
/**
@@ -3365,7 +3395,9 @@
let curTo = Math.min(cursor.to, to);
if (cursor.point) {
let active = cursor.activeForPoint(cursor.to);
- let openCount = cursor.pointFrom < from ? active.length + 1 : Math.min(active.length, openRanges);
+ let openCount = cursor.pointFrom < from ? active.length + 1
+ : cursor.point.startSide < 0 ? active.length
+ : Math.min(active.length, openRanges);
iterator.point(pos, curTo, cursor.point, active, openCount, cursor.pointRank);
openRanges = Math.min(cursor.openEnd(curTo), active.length);
}
@@ -3392,6 +3424,19 @@
build.add(range.from, range.to, range.value);
return build.finish();
}
+ /**
+ Join an array of range sets into a single set.
+ */
+ static join(sets) {
+ if (!sets.length)
+ return RangeSet.empty;
+ let result = sets[sets.length - 1];
+ for (let i = sets.length - 2; i >= 0; i--) {
+ for (let layer = sets[i]; layer != RangeSet.empty; layer = layer.nextLayer)
+ result = new RangeSet(layer.chunkPos, layer.chunk, result, Math.max(layer.maxPoint, result.maxPoint));
+ }
+ return result;
+ }
}
/**
The empty set of ranges.
@@ -3414,6 +3459,18 @@
an array of [`Range`](https://codemirror.net/6/docs/ref/#state.Range) objects.
*/
class RangeSetBuilder {
+ finishChunk(newArrays) {
+ this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint));
+ this.chunkPos.push(this.chunkStart);
+ this.chunkStart = -1;
+ this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint);
+ this.maxPoint = -1;
+ if (newArrays) {
+ this.from = [];
+ this.to = [];
+ this.value = [];
+ }
+ }
/**
Create an empty builder.
*/
@@ -3431,18 +3488,6 @@
this.setMaxPoint = -1;
this.nextLayer = null;
}
- finishChunk(newArrays) {
- this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint));
- this.chunkPos.push(this.chunkStart);
- this.chunkStart = -1;
- this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint);
- this.maxPoint = -1;
- if (newArrays) {
- this.from = [];
- this.to = [];
- this.value = [];
- }
- }
/**
Add a range. Ranges should be added in sorted (by `from` and
`value.startSide`) order.
@@ -3709,7 +3754,8 @@
}
addActive(trackOpen) {
let i = 0, { value, to, rank } = this.cursor;
- while (i < this.activeRank.length && this.activeRank[i] <= rank)
+ // Organize active marks by rank first, then by size
+ while (i < this.activeRank.length && (rank - this.activeRank[i] || to - this.activeTo[i]) > 0)
i++;
insert(this.active, i, value);
insert(this.activeTo, i, to);
@@ -3802,7 +3848,7 @@
let end = diff < 0 ? a.to + dPos : b.to, clipEnd = Math.min(end, endB);
if (a.point || b.point) {
if (!(a.point && b.point && (a.point == b.point || a.point.eq(b.point)) &&
- sameValues(a.activeForPoint(a.to + dPos), b.activeForPoint(b.to))))
+ sameValues(a.activeForPoint(a.to), b.activeForPoint(b.to))))
comparator.comparePoint(pos, clipEnd, a.point, b.point);
}
else {
@@ -3947,7 +3993,7 @@
return C + id.toString(36)
}
- // :: (union, union<[StyleModule], StyleModule>)
+ // :: (union, union<[StyleModule], StyleModule>, ?{nonce: ?string})
//
// Mount the given set of modules in the given DOM root, which ensures
// that the CSS rules defined by the module are available in that
@@ -3960,33 +4006,36 @@
// modules. If you call this function multiple times for the same root
// in a way that changes the order of already mounted modules, the old
// order will be changed.
- static mount(root, modules) {
- (root[SET] || new StyleSet(root)).mount(Array.isArray(modules) ? modules : [modules]);
+ //
+ // If a Content Security Policy nonce is provided, it is added to
+ // the `
-
-
- ${project.pages[app.activePage].html}
-
- ${showConsole}
-
-