8824 lines
292 KiB
JavaScript
8824 lines
292 KiB
JavaScript
import {
|
||
_ as Oe,
|
||
a0 as Zt,
|
||
c as Ne,
|
||
i as De,
|
||
r as Re,
|
||
o as Pe,
|
||
h as Fe,
|
||
} from "./app-admin-62da08c5.js";
|
||
import "./index-8746c87e.js";
|
||
var He =
|
||
typeof globalThis < "u"
|
||
? globalThis
|
||
: typeof window < "u"
|
||
? window
|
||
: typeof global < "u"
|
||
? global
|
||
: typeof self < "u"
|
||
? self
|
||
: {};
|
||
function xt(s) {
|
||
return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, "default")
|
||
? s.default
|
||
: s;
|
||
}
|
||
function Ct() {}
|
||
Object.assign(Ct, {
|
||
default: Ct,
|
||
register: Ct,
|
||
revert: function () {},
|
||
__esModule: !0,
|
||
});
|
||
Element.prototype.matches ||
|
||
(Element.prototype.matches =
|
||
Element.prototype.matchesSelector ||
|
||
Element.prototype.mozMatchesSelector ||
|
||
Element.prototype.msMatchesSelector ||
|
||
Element.prototype.oMatchesSelector ||
|
||
Element.prototype.webkitMatchesSelector ||
|
||
function (s) {
|
||
const t = (this.document || this.ownerDocument).querySelectorAll(s);
|
||
let e = t.length;
|
||
for (; --e >= 0 && t.item(e) !== this; );
|
||
return e > -1;
|
||
});
|
||
Element.prototype.closest ||
|
||
(Element.prototype.closest = function (s) {
|
||
let t = this;
|
||
if (!document.documentElement.contains(t)) return null;
|
||
do {
|
||
if (t.matches(s)) return t;
|
||
t = t.parentElement || t.parentNode;
|
||
} while (t !== null);
|
||
return null;
|
||
});
|
||
Element.prototype.prepend ||
|
||
(Element.prototype.prepend = function (s) {
|
||
const t = document.createDocumentFragment();
|
||
Array.isArray(s) || (s = [s]),
|
||
s.forEach((e) => {
|
||
const o = e instanceof Node;
|
||
t.appendChild(o ? e : document.createTextNode(e));
|
||
}),
|
||
this.insertBefore(t, this.firstChild);
|
||
});
|
||
Element.prototype.scrollIntoViewIfNeeded ||
|
||
(Element.prototype.scrollIntoViewIfNeeded = function (s) {
|
||
s = arguments.length === 0 ? !0 : !!s;
|
||
const t = this.parentNode,
|
||
e = window.getComputedStyle(t, null),
|
||
o = parseInt(e.getPropertyValue("border-top-width")),
|
||
i = parseInt(e.getPropertyValue("border-left-width")),
|
||
n = this.offsetTop - t.offsetTop < t.scrollTop,
|
||
r =
|
||
this.offsetTop - t.offsetTop + this.clientHeight - o >
|
||
t.scrollTop + t.clientHeight,
|
||
a = this.offsetLeft - t.offsetLeft < t.scrollLeft,
|
||
l =
|
||
this.offsetLeft - t.offsetLeft + this.clientWidth - i >
|
||
t.scrollLeft + t.clientWidth,
|
||
c = n && !r;
|
||
(n || r) &&
|
||
s &&
|
||
(t.scrollTop =
|
||
this.offsetTop -
|
||
t.offsetTop -
|
||
t.clientHeight / 2 -
|
||
o +
|
||
this.clientHeight / 2),
|
||
(a || l) &&
|
||
s &&
|
||
(t.scrollLeft =
|
||
this.offsetLeft -
|
||
t.offsetLeft -
|
||
t.clientWidth / 2 -
|
||
i +
|
||
this.clientWidth / 2),
|
||
(n || r || a || l) && !s && this.scrollIntoView(c);
|
||
});
|
||
window.requestIdleCallback =
|
||
window.requestIdleCallback ||
|
||
function (s) {
|
||
const t = Date.now();
|
||
return setTimeout(function () {
|
||
s({
|
||
didTimeout: !1,
|
||
timeRemaining: function () {
|
||
return Math.max(0, 50 - (Date.now() - t));
|
||
},
|
||
});
|
||
}, 1);
|
||
};
|
||
window.cancelIdleCallback =
|
||
window.cancelIdleCallback ||
|
||
function (s) {
|
||
clearTimeout(s);
|
||
};
|
||
let je = (s = 21) =>
|
||
crypto
|
||
.getRandomValues(new Uint8Array(s))
|
||
.reduce(
|
||
(t, e) => (
|
||
(e &= 63),
|
||
e < 36
|
||
? (t += e.toString(36))
|
||
: e < 62
|
||
? (t += (e - 26).toString(36).toUpperCase())
|
||
: e > 62
|
||
? (t += "-")
|
||
: (t += "_"),
|
||
t
|
||
),
|
||
"",
|
||
);
|
||
var se = ((s) => (
|
||
(s.VERBOSE = "VERBOSE"),
|
||
(s.INFO = "INFO"),
|
||
(s.WARN = "WARN"),
|
||
(s.ERROR = "ERROR"),
|
||
s
|
||
))(se || {});
|
||
const E = {
|
||
BACKSPACE: 8,
|
||
TAB: 9,
|
||
ENTER: 13,
|
||
SHIFT: 16,
|
||
CTRL: 17,
|
||
ALT: 18,
|
||
ESC: 27,
|
||
SPACE: 32,
|
||
LEFT: 37,
|
||
UP: 38,
|
||
DOWN: 40,
|
||
RIGHT: 39,
|
||
DELETE: 46,
|
||
META: 91,
|
||
},
|
||
ze = { LEFT: 0, WHEEL: 1, RIGHT: 2, BACKWARD: 3, FORWARD: 4 };
|
||
function mt(s, t, e = "log", o, i = "color: inherit") {
|
||
if (!("console" in window) || !window.console[e]) return;
|
||
const n = ["info", "log", "warn", "error"].includes(e),
|
||
r = [];
|
||
switch (mt.logLevel) {
|
||
case "ERROR":
|
||
if (e !== "error") return;
|
||
break;
|
||
case "WARN":
|
||
if (!["error", "warn"].includes(e)) return;
|
||
break;
|
||
case "INFO":
|
||
if (!n || s) return;
|
||
break;
|
||
}
|
||
o && r.push(o);
|
||
const a = "Editor.js 2.28.0",
|
||
l = `line-height: 1em;
|
||
color: #006FEA;
|
||
display: inline-block;
|
||
font-size: 11px;
|
||
line-height: 1em;
|
||
background-color: #fff;
|
||
padding: 4px 9px;
|
||
border-radius: 30px;
|
||
border: 1px solid rgba(56, 138, 229, 0.16);
|
||
margin: 4px 5px 4px 0;`;
|
||
s && (n ? (r.unshift(l, i), (t = `%c${a}%c ${t}`)) : (t = `( ${a} )${t}`));
|
||
try {
|
||
n ? (o ? console[e](`${t} %o`, ...r) : console[e](t, ...r)) : console[e](t);
|
||
} catch {}
|
||
}
|
||
mt.logLevel = "VERBOSE";
|
||
function Ue(s) {
|
||
mt.logLevel = s;
|
||
}
|
||
const _ = mt.bind(window, !1),
|
||
K = mt.bind(window, !0);
|
||
function ot(s) {
|
||
return Object.prototype.toString
|
||
.call(s)
|
||
.match(/\s([a-zA-Z]+)/)[1]
|
||
.toLowerCase();
|
||
}
|
||
function R(s) {
|
||
return ot(s) === "function" || ot(s) === "asyncfunction";
|
||
}
|
||
function z(s) {
|
||
return ot(s) === "object";
|
||
}
|
||
function J(s) {
|
||
return ot(s) === "string";
|
||
}
|
||
function $e(s) {
|
||
return ot(s) === "boolean";
|
||
}
|
||
function Gt(s) {
|
||
return ot(s) === "number";
|
||
}
|
||
function Jt(s) {
|
||
return ot(s) === "undefined";
|
||
}
|
||
function V(s) {
|
||
return s ? Object.keys(s).length === 0 && s.constructor === Object : !0;
|
||
}
|
||
function re(s) {
|
||
return (
|
||
(s > 47 && s < 58) ||
|
||
s === 32 ||
|
||
s === 13 ||
|
||
s === 229 ||
|
||
(s > 64 && s < 91) ||
|
||
(s > 95 && s < 112) ||
|
||
(s > 185 && s < 193) ||
|
||
(s > 218 && s < 223)
|
||
);
|
||
}
|
||
async function We(s, t = () => {}, e = () => {}) {
|
||
async function o(i, n, r) {
|
||
try {
|
||
await i.function(i.data), await n(Jt(i.data) ? {} : i.data);
|
||
} catch {
|
||
r(Jt(i.data) ? {} : i.data);
|
||
}
|
||
}
|
||
return s.reduce(async (i, n) => (await i, o(n, t, e)), Promise.resolve());
|
||
}
|
||
function ae(s) {
|
||
return Array.prototype.slice.call(s);
|
||
}
|
||
function rt(s, t) {
|
||
return function () {
|
||
const e = this,
|
||
o = arguments;
|
||
window.setTimeout(() => s.apply(e, o), t);
|
||
};
|
||
}
|
||
function Ye(s) {
|
||
return s.name.split(".").pop();
|
||
}
|
||
function Ke(s) {
|
||
return /^[-\w]+\/([-+\w]+|\*)$/.test(s);
|
||
}
|
||
function Xe(s, t, e) {
|
||
let o;
|
||
return (...i) => {
|
||
const n = this,
|
||
r = () => {
|
||
(o = null), e || s.apply(n, i);
|
||
},
|
||
a = e && !o;
|
||
window.clearTimeout(o), (o = window.setTimeout(r, t)), a && s.apply(n, i);
|
||
};
|
||
}
|
||
function St(s, t, e = void 0) {
|
||
let o,
|
||
i,
|
||
n,
|
||
r = null,
|
||
a = 0;
|
||
e || (e = {});
|
||
const l = function () {
|
||
(a = e.leading === !1 ? 0 : Date.now()),
|
||
(r = null),
|
||
(n = s.apply(o, i)),
|
||
r || (o = i = null);
|
||
};
|
||
return function () {
|
||
const c = Date.now();
|
||
!a && e.leading === !1 && (a = c);
|
||
const p = t - (c - a);
|
||
return (
|
||
(o = this),
|
||
(i = arguments),
|
||
p <= 0 || p > t
|
||
? (r && (clearTimeout(r), (r = null)),
|
||
(a = c),
|
||
(n = s.apply(o, i)),
|
||
r || (o = i = null))
|
||
: !r && e.trailing !== !1 && (r = setTimeout(l, p)),
|
||
n
|
||
);
|
||
};
|
||
}
|
||
function Ve() {
|
||
const s = { win: !1, mac: !1, x11: !1, linux: !1 },
|
||
t = Object.keys(s).find(
|
||
(e) => window.navigator.appVersion.toLowerCase().indexOf(e) !== -1,
|
||
);
|
||
return t && (s[t] = !0), s;
|
||
}
|
||
function at(s) {
|
||
return s[0].toUpperCase() + s.slice(1);
|
||
}
|
||
function It(s, ...t) {
|
||
if (!t.length) return s;
|
||
const e = t.shift();
|
||
if (z(s) && z(e))
|
||
for (const o in e)
|
||
z(e[o])
|
||
? (s[o] || Object.assign(s, { [o]: {} }), It(s[o], e[o]))
|
||
: Object.assign(s, { [o]: e[o] });
|
||
return It(s, ...t);
|
||
}
|
||
function Rt(s) {
|
||
const t = Ve();
|
||
return (
|
||
(s = s
|
||
.replace(/shift/gi, "⇧")
|
||
.replace(/backspace/gi, "⌫")
|
||
.replace(/enter/gi, "⏎")
|
||
.replace(/up/gi, "↑")
|
||
.replace(/left/gi, "→")
|
||
.replace(/down/gi, "↓")
|
||
.replace(/right/gi, "←")
|
||
.replace(/escape/gi, "⎋")
|
||
.replace(/insert/gi, "Ins")
|
||
.replace(/delete/gi, "␡")
|
||
.replace(/\+/gi, " + ")),
|
||
t.mac
|
||
? (s = s.replace(/ctrl|cmd/gi, "⌘").replace(/alt/gi, "⌥"))
|
||
: (s = s.replace(/cmd/gi, "Ctrl").replace(/windows/gi, "WIN")),
|
||
s
|
||
);
|
||
}
|
||
function qe(s) {
|
||
try {
|
||
return new URL(s).href;
|
||
} catch {}
|
||
return s.substring(0, 2) === "//"
|
||
? window.location.protocol + s
|
||
: window.location.origin + s;
|
||
}
|
||
function Ze() {
|
||
return je(10);
|
||
}
|
||
function Ge(s) {
|
||
window.open(s, "_blank");
|
||
}
|
||
function Je(s = "") {
|
||
return `${s}${Math.floor(Math.random() * 1e8).toString(16)}`;
|
||
}
|
||
function Mt(s, t, e) {
|
||
const o = `«${t}» is deprecated and will be removed in the next major release. Please use the «${e}» instead.`;
|
||
s && K(o, "warn");
|
||
}
|
||
function ct(s, t, e) {
|
||
const o = e.value ? "value" : "get",
|
||
i = e[o],
|
||
n = `#${t}Cache`;
|
||
if (
|
||
((e[o] = function (...r) {
|
||
return this[n] === void 0 && (this[n] = i.apply(this, ...r)), this[n];
|
||
}),
|
||
o === "get" && e.set)
|
||
) {
|
||
const r = e.set;
|
||
e.set = function (a) {
|
||
delete s[n], r.apply(this, a);
|
||
};
|
||
}
|
||
return e;
|
||
}
|
||
const le = 650;
|
||
function et() {
|
||
return window.matchMedia(`(max-width: ${le}px)`).matches;
|
||
}
|
||
const Qt =
|
||
typeof window < "u" &&
|
||
window.navigator &&
|
||
window.navigator.platform &&
|
||
(/iP(ad|hone|od)/.test(window.navigator.platform) ||
|
||
(window.navigator.platform === "MacIntel" &&
|
||
window.navigator.maxTouchPoints > 1));
|
||
function Qe(s, t) {
|
||
const e = Array.isArray(s) || z(s),
|
||
o = Array.isArray(t) || z(t);
|
||
return e || o ? JSON.stringify(s) === JSON.stringify(t) : s === t;
|
||
}
|
||
class d {
|
||
static isSingleTag(t) {
|
||
return (
|
||
t.tagName &&
|
||
[
|
||
"AREA",
|
||
"BASE",
|
||
"BR",
|
||
"COL",
|
||
"COMMAND",
|
||
"EMBED",
|
||
"HR",
|
||
"IMG",
|
||
"INPUT",
|
||
"KEYGEN",
|
||
"LINK",
|
||
"META",
|
||
"PARAM",
|
||
"SOURCE",
|
||
"TRACK",
|
||
"WBR",
|
||
].includes(t.tagName)
|
||
);
|
||
}
|
||
static isLineBreakTag(t) {
|
||
return t && t.tagName && ["BR", "WBR"].includes(t.tagName);
|
||
}
|
||
static make(t, e = null, o = {}) {
|
||
const i = document.createElement(t);
|
||
Array.isArray(e) ? i.classList.add(...e) : e && i.classList.add(e);
|
||
for (const n in o)
|
||
Object.prototype.hasOwnProperty.call(o, n) && (i[n] = o[n]);
|
||
return i;
|
||
}
|
||
static text(t) {
|
||
return document.createTextNode(t);
|
||
}
|
||
static append(t, e) {
|
||
Array.isArray(e) ? e.forEach((o) => t.appendChild(o)) : t.appendChild(e);
|
||
}
|
||
static prepend(t, e) {
|
||
Array.isArray(e)
|
||
? ((e = e.reverse()), e.forEach((o) => t.prepend(o)))
|
||
: t.prepend(e);
|
||
}
|
||
static swap(t, e) {
|
||
const o = document.createElement("div"),
|
||
i = t.parentNode;
|
||
i.insertBefore(o, t),
|
||
i.insertBefore(t, e),
|
||
i.insertBefore(e, o),
|
||
i.removeChild(o);
|
||
}
|
||
static find(t = document, e) {
|
||
return t.querySelector(e);
|
||
}
|
||
static get(t) {
|
||
return document.getElementById(t);
|
||
}
|
||
static findAll(t = document, e) {
|
||
return t.querySelectorAll(e);
|
||
}
|
||
static get allInputsSelector() {
|
||
return (
|
||
"[contenteditable=true], textarea, input:not([type]), " +
|
||
["text", "password", "email", "number", "search", "tel", "url"]
|
||
.map((t) => `input[type="${t}"]`)
|
||
.join(", ")
|
||
);
|
||
}
|
||
static findAllInputs(t) {
|
||
return ae(t.querySelectorAll(d.allInputsSelector)).reduce(
|
||
(e, o) =>
|
||
d.isNativeInput(o) || d.containsOnlyInlineElements(o)
|
||
? [...e, o]
|
||
: [...e, ...d.getDeepestBlockElements(o)],
|
||
[],
|
||
);
|
||
}
|
||
static getDeepestNode(t, e = !1) {
|
||
const o = e ? "lastChild" : "firstChild",
|
||
i = e ? "previousSibling" : "nextSibling";
|
||
if (t && t.nodeType === Node.ELEMENT_NODE && t[o]) {
|
||
let n = t[o];
|
||
if (d.isSingleTag(n) && !d.isNativeInput(n) && !d.isLineBreakTag(n))
|
||
if (n[i]) n = n[i];
|
||
else if (n.parentNode[i]) n = n.parentNode[i];
|
||
else return n.parentNode;
|
||
return this.getDeepestNode(n, e);
|
||
}
|
||
return t;
|
||
}
|
||
static isElement(t) {
|
||
return Gt(t) ? !1 : t && t.nodeType && t.nodeType === Node.ELEMENT_NODE;
|
||
}
|
||
static isFragment(t) {
|
||
return Gt(t)
|
||
? !1
|
||
: t && t.nodeType && t.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
||
}
|
||
static isContentEditable(t) {
|
||
return t.contentEditable === "true";
|
||
}
|
||
static isNativeInput(t) {
|
||
const e = ["INPUT", "TEXTAREA"];
|
||
return t && t.tagName ? e.includes(t.tagName) : !1;
|
||
}
|
||
static canSetCaret(t) {
|
||
let e = !0;
|
||
if (d.isNativeInput(t))
|
||
switch (t.type) {
|
||
case "file":
|
||
case "checkbox":
|
||
case "radio":
|
||
case "hidden":
|
||
case "submit":
|
||
case "button":
|
||
case "image":
|
||
case "reset":
|
||
e = !1;
|
||
break;
|
||
}
|
||
else e = d.isContentEditable(t);
|
||
return e;
|
||
}
|
||
static isNodeEmpty(t) {
|
||
let e;
|
||
return this.isSingleTag(t) && !this.isLineBreakTag(t)
|
||
? !1
|
||
: (this.isElement(t) && this.isNativeInput(t)
|
||
? (e = t.value)
|
||
: (e = t.textContent.replace("", "")),
|
||
e.trim().length === 0);
|
||
}
|
||
static isLeaf(t) {
|
||
return t ? t.childNodes.length === 0 : !1;
|
||
}
|
||
static isEmpty(t) {
|
||
t.normalize();
|
||
const e = [t];
|
||
for (; e.length > 0; )
|
||
if (((t = e.shift()), !!t)) {
|
||
if (this.isLeaf(t) && !this.isNodeEmpty(t)) return !1;
|
||
t.childNodes && e.push(...Array.from(t.childNodes));
|
||
}
|
||
return !0;
|
||
}
|
||
static isHTMLString(t) {
|
||
const e = d.make("div");
|
||
return (e.innerHTML = t), e.childElementCount > 0;
|
||
}
|
||
static getContentLength(t) {
|
||
return d.isNativeInput(t)
|
||
? t.value.length
|
||
: t.nodeType === Node.TEXT_NODE
|
||
? t.length
|
||
: t.textContent.length;
|
||
}
|
||
static get blockElements() {
|
||
return [
|
||
"address",
|
||
"article",
|
||
"aside",
|
||
"blockquote",
|
||
"canvas",
|
||
"div",
|
||
"dl",
|
||
"dt",
|
||
"fieldset",
|
||
"figcaption",
|
||
"figure",
|
||
"footer",
|
||
"form",
|
||
"h1",
|
||
"h2",
|
||
"h3",
|
||
"h4",
|
||
"h5",
|
||
"h6",
|
||
"header",
|
||
"hgroup",
|
||
"hr",
|
||
"li",
|
||
"main",
|
||
"nav",
|
||
"noscript",
|
||
"ol",
|
||
"output",
|
||
"p",
|
||
"pre",
|
||
"ruby",
|
||
"section",
|
||
"table",
|
||
"tbody",
|
||
"thead",
|
||
"tr",
|
||
"tfoot",
|
||
"ul",
|
||
"video",
|
||
];
|
||
}
|
||
static containsOnlyInlineElements(t) {
|
||
let e;
|
||
J(t) ? ((e = document.createElement("div")), (e.innerHTML = t)) : (e = t);
|
||
const o = (i) =>
|
||
!d.blockElements.includes(i.tagName.toLowerCase()) &&
|
||
Array.from(i.children).every(o);
|
||
return Array.from(e.children).every(o);
|
||
}
|
||
static getDeepestBlockElements(t) {
|
||
return d.containsOnlyInlineElements(t)
|
||
? [t]
|
||
: Array.from(t.children).reduce(
|
||
(e, o) => [...e, ...d.getDeepestBlockElements(o)],
|
||
[],
|
||
);
|
||
}
|
||
static getHolder(t) {
|
||
return J(t) ? document.getElementById(t) : t;
|
||
}
|
||
static isAnchor(t) {
|
||
return t.tagName.toLowerCase() === "a";
|
||
}
|
||
static offset(t) {
|
||
const e = t.getBoundingClientRect(),
|
||
o = window.pageXOffset || document.documentElement.scrollLeft,
|
||
i = window.pageYOffset || document.documentElement.scrollTop,
|
||
n = e.top + i,
|
||
r = e.left + o;
|
||
return { top: n, left: r, bottom: n + e.height, right: r + e.width };
|
||
}
|
||
}
|
||
const to = {
|
||
blockTunes: { toggler: { "Click to tune": "", "or drag to move": "" } },
|
||
inlineToolbar: { converter: { "Convert to": "" } },
|
||
toolbar: { toolbox: { Add: "" } },
|
||
popover: { Filter: "", "Nothing found": "" },
|
||
},
|
||
eo = { Text: "", Link: "", Bold: "", Italic: "" },
|
||
oo = {
|
||
link: { "Add a link": "" },
|
||
stub: { "The block can not be displayed correctly.": "" },
|
||
},
|
||
io = {
|
||
delete: { Delete: "", "Click to delete": "" },
|
||
moveUp: { "Move up": "" },
|
||
moveDown: { "Move down": "" },
|
||
},
|
||
ce = { ui: to, toolNames: eo, tools: oo, blockTunes: io },
|
||
it = class {
|
||
static ui(s, t) {
|
||
return it._t(s, t);
|
||
}
|
||
static t(s, t) {
|
||
return it._t(s, t);
|
||
}
|
||
static setDictionary(s) {
|
||
it.currentDictionary = s;
|
||
}
|
||
static _t(s, t) {
|
||
const e = it.getNamespace(s);
|
||
return !e || !e[t] ? t : e[t];
|
||
}
|
||
static getNamespace(s) {
|
||
return s
|
||
.split(".")
|
||
.reduce(
|
||
(t, e) => (!t || !Object.keys(t).length ? {} : t[e]),
|
||
it.currentDictionary,
|
||
);
|
||
}
|
||
};
|
||
let $ = it;
|
||
$.currentDictionary = ce;
|
||
class de extends Error {}
|
||
class wt {
|
||
constructor() {
|
||
this.subscribers = {};
|
||
}
|
||
on(t, e) {
|
||
t in this.subscribers || (this.subscribers[t] = []),
|
||
this.subscribers[t].push(e);
|
||
}
|
||
once(t, e) {
|
||
t in this.subscribers || (this.subscribers[t] = []);
|
||
const o = (i) => {
|
||
const n = e(i),
|
||
r = this.subscribers[t].indexOf(o);
|
||
return r !== -1 && this.subscribers[t].splice(r, 1), n;
|
||
};
|
||
this.subscribers[t].push(o);
|
||
}
|
||
emit(t, e) {
|
||
V(this.subscribers) ||
|
||
!this.subscribers[t] ||
|
||
this.subscribers[t].reduce((o, i) => {
|
||
const n = i(o);
|
||
return n !== void 0 ? n : o;
|
||
}, e);
|
||
}
|
||
off(t, e) {
|
||
if (this.subscribers[t] === void 0) {
|
||
console.warn(
|
||
`EventDispatcher .off(): there is no subscribers for event "${t.toString()}". Probably, .off() called before .on()`,
|
||
);
|
||
return;
|
||
}
|
||
for (let o = 0; o < this.subscribers[t].length; o++)
|
||
if (this.subscribers[t][o] === e) {
|
||
delete this.subscribers[t][o];
|
||
break;
|
||
}
|
||
}
|
||
destroy() {
|
||
this.subscribers = {};
|
||
}
|
||
}
|
||
function tt(s) {
|
||
Object.setPrototypeOf(this, {
|
||
get id() {
|
||
return s.id;
|
||
},
|
||
get name() {
|
||
return s.name;
|
||
},
|
||
get config() {
|
||
return s.config;
|
||
},
|
||
get holder() {
|
||
return s.holder;
|
||
},
|
||
get isEmpty() {
|
||
return s.isEmpty;
|
||
},
|
||
get selected() {
|
||
return s.selected;
|
||
},
|
||
set stretched(t) {
|
||
s.stretched = t;
|
||
},
|
||
get stretched() {
|
||
return s.stretched;
|
||
},
|
||
call(t, e) {
|
||
return s.call(t, e);
|
||
},
|
||
save() {
|
||
return s.save();
|
||
},
|
||
validate(t) {
|
||
return s.validate(t);
|
||
},
|
||
dispatchChange() {
|
||
s.dispatchChange();
|
||
},
|
||
});
|
||
}
|
||
class Pt {
|
||
constructor() {
|
||
this.allListeners = [];
|
||
}
|
||
on(t, e, o, i = !1) {
|
||
const n = Je("l"),
|
||
r = { id: n, element: t, eventType: e, handler: o, options: i };
|
||
if (!this.findOne(t, e, o))
|
||
return this.allListeners.push(r), t.addEventListener(e, o, i), n;
|
||
}
|
||
off(t, e, o, i) {
|
||
const n = this.findAll(t, e, o);
|
||
n.forEach((r, a) => {
|
||
const l = this.allListeners.indexOf(n[a]);
|
||
l > -1 &&
|
||
(this.allListeners.splice(l, 1),
|
||
r.element.removeEventListener(r.eventType, r.handler, r.options));
|
||
});
|
||
}
|
||
offById(t) {
|
||
const e = this.findById(t);
|
||
e && e.element.removeEventListener(e.eventType, e.handler, e.options);
|
||
}
|
||
findOne(t, e, o) {
|
||
const i = this.findAll(t, e, o);
|
||
return i.length > 0 ? i[0] : null;
|
||
}
|
||
findAll(t, e, o) {
|
||
let i;
|
||
const n = t ? this.findByEventTarget(t) : [];
|
||
return (
|
||
t && e && o
|
||
? (i = n.filter((r) => r.eventType === e && r.handler === o))
|
||
: t && e
|
||
? (i = n.filter((r) => r.eventType === e))
|
||
: (i = n),
|
||
i
|
||
);
|
||
}
|
||
removeAll() {
|
||
this.allListeners.map((t) => {
|
||
t.element.removeEventListener(t.eventType, t.handler, t.options);
|
||
}),
|
||
(this.allListeners = []);
|
||
}
|
||
destroy() {
|
||
this.removeAll();
|
||
}
|
||
findByEventTarget(t) {
|
||
return this.allListeners.filter((e) => {
|
||
if (e.element === t) return e;
|
||
});
|
||
}
|
||
findByType(t) {
|
||
return this.allListeners.filter((e) => {
|
||
if (e.eventType === t) return e;
|
||
});
|
||
}
|
||
findByHandler(t) {
|
||
return this.allListeners.filter((e) => {
|
||
if (e.handler === t) return e;
|
||
});
|
||
}
|
||
findById(t) {
|
||
return this.allListeners.find((e) => e.id === t);
|
||
}
|
||
}
|
||
class T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
if (
|
||
((this.nodes = {}),
|
||
(this.listeners = new Pt()),
|
||
(this.readOnlyMutableListeners = {
|
||
on: (o, i, n, r = !1) => {
|
||
this.mutableListenerIds.push(this.listeners.on(o, i, n, r));
|
||
},
|
||
clearAll: () => {
|
||
for (const o of this.mutableListenerIds) this.listeners.offById(o);
|
||
this.mutableListenerIds = [];
|
||
},
|
||
}),
|
||
(this.mutableListenerIds = []),
|
||
new.target === T)
|
||
)
|
||
throw new TypeError(
|
||
"Constructors for abstract class Module are not allowed.",
|
||
);
|
||
(this.config = t), (this.eventsDispatcher = e);
|
||
}
|
||
set state(t) {
|
||
this.Editor = t;
|
||
}
|
||
removeAllNodes() {
|
||
for (const t in this.nodes) {
|
||
const e = this.nodes[t];
|
||
e instanceof HTMLElement && e.remove();
|
||
}
|
||
}
|
||
get isRtl() {
|
||
return this.config.i18n.direction === "rtl";
|
||
}
|
||
}
|
||
class b {
|
||
constructor() {
|
||
(this.instance = null),
|
||
(this.selection = null),
|
||
(this.savedSelectionRange = null),
|
||
(this.isFakeBackgroundEnabled = !1),
|
||
(this.commandBackground = "backColor"),
|
||
(this.commandRemoveFormat = "removeFormat");
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
editorWrapper: "codex-editor",
|
||
editorZone: "codex-editor__redactor",
|
||
};
|
||
}
|
||
static get anchorNode() {
|
||
const t = window.getSelection();
|
||
return t ? t.anchorNode : null;
|
||
}
|
||
static get anchorElement() {
|
||
const t = window.getSelection();
|
||
if (!t) return null;
|
||
const e = t.anchorNode;
|
||
return e ? (d.isElement(e) ? e : e.parentElement) : null;
|
||
}
|
||
static get anchorOffset() {
|
||
const t = window.getSelection();
|
||
return t ? t.anchorOffset : null;
|
||
}
|
||
static get isCollapsed() {
|
||
const t = window.getSelection();
|
||
return t ? t.isCollapsed : null;
|
||
}
|
||
static get isAtEditor() {
|
||
return this.isSelectionAtEditor(b.get());
|
||
}
|
||
static isSelectionAtEditor(t) {
|
||
if (!t) return !1;
|
||
let e = t.anchorNode || t.focusNode;
|
||
e && e.nodeType === Node.TEXT_NODE && (e = e.parentNode);
|
||
let o = null;
|
||
return (
|
||
e && e instanceof Element && (o = e.closest(`.${b.CSS.editorZone}`)),
|
||
o ? o.nodeType === Node.ELEMENT_NODE : !1
|
||
);
|
||
}
|
||
static isRangeAtEditor(t) {
|
||
if (!t) return;
|
||
let e = t.startContainer;
|
||
e && e.nodeType === Node.TEXT_NODE && (e = e.parentNode);
|
||
let o = null;
|
||
return (
|
||
e && e instanceof Element && (o = e.closest(`.${b.CSS.editorZone}`)),
|
||
o ? o.nodeType === Node.ELEMENT_NODE : !1
|
||
);
|
||
}
|
||
static get isSelectionExists() {
|
||
return !!b.get().anchorNode;
|
||
}
|
||
static get range() {
|
||
return this.getRangeFromSelection(this.get());
|
||
}
|
||
static getRangeFromSelection(t) {
|
||
return t && t.rangeCount ? t.getRangeAt(0) : null;
|
||
}
|
||
static get rect() {
|
||
let t = document.selection,
|
||
e,
|
||
o = { x: 0, y: 0, width: 0, height: 0 };
|
||
if (t && t.type !== "Control")
|
||
return (
|
||
(t = t),
|
||
(e = t.createRange()),
|
||
(o.x = e.boundingLeft),
|
||
(o.y = e.boundingTop),
|
||
(o.width = e.boundingWidth),
|
||
(o.height = e.boundingHeight),
|
||
o
|
||
);
|
||
if (!window.getSelection)
|
||
return _("Method window.getSelection is not supported", "warn"), o;
|
||
if (
|
||
((t = window.getSelection()),
|
||
t.rangeCount === null || isNaN(t.rangeCount))
|
||
)
|
||
return _("Method SelectionUtils.rangeCount is not supported", "warn"), o;
|
||
if (t.rangeCount === 0) return o;
|
||
if (
|
||
((e = t.getRangeAt(0).cloneRange()),
|
||
e.getBoundingClientRect && (o = e.getBoundingClientRect()),
|
||
o.x === 0 && o.y === 0)
|
||
) {
|
||
const i = document.createElement("span");
|
||
if (i.getBoundingClientRect) {
|
||
i.appendChild(document.createTextNode("")),
|
||
e.insertNode(i),
|
||
(o = i.getBoundingClientRect());
|
||
const n = i.parentNode;
|
||
n.removeChild(i), n.normalize();
|
||
}
|
||
}
|
||
return o;
|
||
}
|
||
static get text() {
|
||
return window.getSelection ? window.getSelection().toString() : "";
|
||
}
|
||
static get() {
|
||
return window.getSelection();
|
||
}
|
||
static setCursor(t, e = 0) {
|
||
const o = document.createRange(),
|
||
i = window.getSelection();
|
||
return d.isNativeInput(t)
|
||
? d.canSetCaret(t)
|
||
? (t.focus(),
|
||
(t.selectionStart = t.selectionEnd = e),
|
||
t.getBoundingClientRect())
|
||
: void 0
|
||
: (o.setStart(t, e),
|
||
o.setEnd(t, e),
|
||
i.removeAllRanges(),
|
||
i.addRange(o),
|
||
o.getBoundingClientRect());
|
||
}
|
||
static isRangeInsideContainer(t) {
|
||
const e = b.range;
|
||
return e === null ? !1 : t.contains(e.startContainer);
|
||
}
|
||
static addFakeCursor() {
|
||
const t = b.range;
|
||
if (t === null) return;
|
||
const e = d.make("span", "codex-editor__fake-cursor");
|
||
(e.dataset.mutationFree = "true"), t.collapse(), t.insertNode(e);
|
||
}
|
||
static isFakeCursorInsideContainer(t) {
|
||
return d.find(t, ".codex-editor__fake-cursor") !== null;
|
||
}
|
||
static removeFakeCursor(t = document.body) {
|
||
const e = d.find(t, ".codex-editor__fake-cursor");
|
||
e && e.remove();
|
||
}
|
||
removeFakeBackground() {
|
||
this.isFakeBackgroundEnabled &&
|
||
((this.isFakeBackgroundEnabled = !1),
|
||
document.execCommand(this.commandRemoveFormat));
|
||
}
|
||
setFakeBackground() {
|
||
document.execCommand(this.commandBackground, !1, "#a8d6ff"),
|
||
(this.isFakeBackgroundEnabled = !0);
|
||
}
|
||
save() {
|
||
this.savedSelectionRange = b.range;
|
||
}
|
||
restore() {
|
||
if (!this.savedSelectionRange) return;
|
||
const t = window.getSelection();
|
||
t.removeAllRanges(), t.addRange(this.savedSelectionRange);
|
||
}
|
||
clearSaved() {
|
||
this.savedSelectionRange = null;
|
||
}
|
||
collapseToEnd() {
|
||
const t = window.getSelection(),
|
||
e = document.createRange();
|
||
e.selectNodeContents(t.focusNode),
|
||
e.collapse(!1),
|
||
t.removeAllRanges(),
|
||
t.addRange(e);
|
||
}
|
||
findParentTag(t, e, o = 10) {
|
||
const i = window.getSelection();
|
||
let n = null;
|
||
return !i || !i.anchorNode || !i.focusNode
|
||
? null
|
||
: ([i.anchorNode, i.focusNode].forEach((r) => {
|
||
let a = o;
|
||
for (
|
||
;
|
||
a > 0 &&
|
||
r.parentNode &&
|
||
!(
|
||
r.tagName === t &&
|
||
((n = r),
|
||
e && r.classList && !r.classList.contains(e) && (n = null),
|
||
n)
|
||
);
|
||
|
||
)
|
||
(r = r.parentNode), a--;
|
||
}),
|
||
n);
|
||
}
|
||
expandToTag(t) {
|
||
const e = window.getSelection();
|
||
e.removeAllRanges();
|
||
const o = document.createRange();
|
||
o.selectNodeContents(t), e.addRange(o);
|
||
}
|
||
}
|
||
function no(s, t) {
|
||
const { type: e, target: o, addedNodes: i, removedNodes: n } = s;
|
||
if (o === t) return !0;
|
||
if (["characterData", "attributes"].includes(e)) {
|
||
const l = o.nodeType === Node.TEXT_NODE ? o.parentNode : o;
|
||
return t.contains(l);
|
||
}
|
||
const r = Array.from(i).some((l) => t.contains(l)),
|
||
a = Array.from(n).some((l) => t.contains(l));
|
||
return r || a;
|
||
}
|
||
const _t = "redactor dom changed",
|
||
he = "block changed",
|
||
pe = "fake cursor is about to be toggled",
|
||
ue = "fake cursor have been set";
|
||
function te(s, t) {
|
||
return s.mergeable && s.name === t.name;
|
||
}
|
||
function so(s, t) {
|
||
const e = t == null ? void 0 : t.export;
|
||
return R(e)
|
||
? e(s)
|
||
: J(e)
|
||
? s[e]
|
||
: (e !== void 0 &&
|
||
_(
|
||
"Conversion «export» property must be a string or function. String means key of saved data object to export. Function should export processed string to export.",
|
||
),
|
||
"");
|
||
}
|
||
function ro(s, t) {
|
||
const e = t == null ? void 0 : t.import;
|
||
return R(e)
|
||
? e(s)
|
||
: J(e)
|
||
? { [e]: s }
|
||
: (e !== void 0 &&
|
||
_(
|
||
"Conversion «import» property must be a string or function. String means key of tool data to import. Function accepts a imported string and return composed tool data.",
|
||
),
|
||
{});
|
||
}
|
||
var q = ((s) => (
|
||
(s.APPEND_CALLBACK = "appendCallback"),
|
||
(s.RENDERED = "rendered"),
|
||
(s.MOVED = "moved"),
|
||
(s.UPDATED = "updated"),
|
||
(s.REMOVED = "removed"),
|
||
(s.ON_PASTE = "onPaste"),
|
||
s
|
||
))(q || {});
|
||
class F extends wt {
|
||
constructor(
|
||
{ id: t = Ze(), data: e, tool: o, api: i, readOnly: n, tunesData: r },
|
||
a,
|
||
) {
|
||
super(),
|
||
(this.cachedInputs = []),
|
||
(this.toolRenderedElement = null),
|
||
(this.tunesInstances = new Map()),
|
||
(this.defaultTunesInstances = new Map()),
|
||
(this.unavailableTunesData = {}),
|
||
(this.inputIndex = 0),
|
||
(this.editorEventBus = null),
|
||
(this.handleFocus = () => {
|
||
this.dropInputsCache(), this.updateCurrentInput();
|
||
}),
|
||
(this.didMutated = (l = void 0) => {
|
||
const c = l === void 0,
|
||
p = l instanceof InputEvent;
|
||
!c && !p && this.detectToolRootChange(l);
|
||
let h;
|
||
c || p
|
||
? (h = !0)
|
||
: (h = !(
|
||
l.length > 0 &&
|
||
l.every((f) => {
|
||
const { addedNodes: k, removedNodes: u, target: C } = f;
|
||
return [...Array.from(k), ...Array.from(u), C].some((L) =>
|
||
d.isElement(L) ? L.dataset.mutationFree === "true" : !1,
|
||
);
|
||
})
|
||
)),
|
||
h &&
|
||
(this.dropInputsCache(),
|
||
this.updateCurrentInput(),
|
||
this.call("updated"),
|
||
this.emit("didMutated", this));
|
||
}),
|
||
(this.name = o.name),
|
||
(this.id = t),
|
||
(this.settings = o.settings),
|
||
(this.config = o.settings.config || {}),
|
||
(this.api = i),
|
||
(this.editorEventBus = a || null),
|
||
(this.blockAPI = new tt(this)),
|
||
(this.tool = o),
|
||
(this.toolInstance = o.create(e, this.blockAPI, n)),
|
||
(this.tunes = o.tunes),
|
||
this.composeTunes(r),
|
||
(this.holder = this.compose()),
|
||
window.requestIdleCallback(() => {
|
||
this.watchBlockMutations(), this.addInputEvents();
|
||
});
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
wrapper: "ce-block",
|
||
wrapperStretched: "ce-block--stretched",
|
||
content: "ce-block__content",
|
||
focused: "ce-block--focused",
|
||
selected: "ce-block--selected",
|
||
dropTarget: "ce-block--drop-target",
|
||
};
|
||
}
|
||
get inputs() {
|
||
if (this.cachedInputs.length !== 0) return this.cachedInputs;
|
||
const t = d.findAllInputs(this.holder);
|
||
return (
|
||
this.inputIndex > t.length - 1 && (this.inputIndex = t.length - 1),
|
||
(this.cachedInputs = t),
|
||
t
|
||
);
|
||
}
|
||
get currentInput() {
|
||
return this.inputs[this.inputIndex];
|
||
}
|
||
set currentInput(t) {
|
||
const e = this.inputs.findIndex((o) => o === t || o.contains(t));
|
||
e !== -1 && (this.inputIndex = e);
|
||
}
|
||
get firstInput() {
|
||
return this.inputs[0];
|
||
}
|
||
get lastInput() {
|
||
const t = this.inputs;
|
||
return t[t.length - 1];
|
||
}
|
||
get nextInput() {
|
||
return this.inputs[this.inputIndex + 1];
|
||
}
|
||
get previousInput() {
|
||
return this.inputs[this.inputIndex - 1];
|
||
}
|
||
get data() {
|
||
return this.save().then((t) => (t && !V(t.data) ? t.data : {}));
|
||
}
|
||
get sanitize() {
|
||
return this.tool.sanitizeConfig;
|
||
}
|
||
get mergeable() {
|
||
return R(this.toolInstance.merge);
|
||
}
|
||
get isEmpty() {
|
||
const t = d.isEmpty(this.pluginsContent),
|
||
e = !this.hasMedia;
|
||
return t && e;
|
||
}
|
||
get hasMedia() {
|
||
const t = [
|
||
"img",
|
||
"iframe",
|
||
"video",
|
||
"audio",
|
||
"source",
|
||
"input",
|
||
"textarea",
|
||
"twitterwidget",
|
||
];
|
||
return !!this.holder.querySelector(t.join(","));
|
||
}
|
||
set focused(t) {
|
||
this.holder.classList.toggle(F.CSS.focused, t);
|
||
}
|
||
get focused() {
|
||
return this.holder.classList.contains(F.CSS.focused);
|
||
}
|
||
set selected(t) {
|
||
var e, o;
|
||
this.holder.classList.toggle(F.CSS.selected, t);
|
||
const i = t === !0 && b.isRangeInsideContainer(this.holder),
|
||
n = t === !1 && b.isFakeCursorInsideContainer(this.holder);
|
||
(i || n) &&
|
||
((e = this.editorEventBus) == null || e.emit(pe, { state: t }),
|
||
i ? b.addFakeCursor() : b.removeFakeCursor(this.holder),
|
||
(o = this.editorEventBus) == null || o.emit(ue, { state: t }));
|
||
}
|
||
get selected() {
|
||
return this.holder.classList.contains(F.CSS.selected);
|
||
}
|
||
set stretched(t) {
|
||
this.holder.classList.toggle(F.CSS.wrapperStretched, t);
|
||
}
|
||
get stretched() {
|
||
return this.holder.classList.contains(F.CSS.wrapperStretched);
|
||
}
|
||
set dropTarget(t) {
|
||
this.holder.classList.toggle(F.CSS.dropTarget, t);
|
||
}
|
||
get pluginsContent() {
|
||
return this.toolRenderedElement;
|
||
}
|
||
call(t, e) {
|
||
if (R(this.toolInstance[t])) {
|
||
t === "appendCallback" &&
|
||
_(
|
||
"`appendCallback` hook is deprecated and will be removed in the next major release. Use `rendered` hook instead",
|
||
"warn",
|
||
);
|
||
try {
|
||
this.toolInstance[t].call(this.toolInstance, e);
|
||
} catch (o) {
|
||
_(`Error during '${t}' call: ${o.message}`, "error");
|
||
}
|
||
}
|
||
}
|
||
async mergeWith(t) {
|
||
await this.toolInstance.merge(t);
|
||
}
|
||
async save() {
|
||
const t = await this.toolInstance.save(this.pluginsContent),
|
||
e = this.unavailableTunesData;
|
||
[
|
||
...this.tunesInstances.entries(),
|
||
...this.defaultTunesInstances.entries(),
|
||
].forEach(([n, r]) => {
|
||
if (R(r.save))
|
||
try {
|
||
e[n] = r.save();
|
||
} catch (a) {
|
||
_(
|
||
`Tune ${r.constructor.name} save method throws an Error %o`,
|
||
"warn",
|
||
a,
|
||
);
|
||
}
|
||
});
|
||
const o = window.performance.now();
|
||
let i;
|
||
return Promise.resolve(t)
|
||
.then(
|
||
(n) => (
|
||
(i = window.performance.now()),
|
||
{ id: this.id, tool: this.name, data: n, tunes: e, time: i - o }
|
||
),
|
||
)
|
||
.catch((n) => {
|
||
_(
|
||
`Saving process for ${this.name} tool failed due to the ${n}`,
|
||
"log",
|
||
"red",
|
||
);
|
||
});
|
||
}
|
||
async validate(t) {
|
||
let e = !0;
|
||
return (
|
||
this.toolInstance.validate instanceof Function &&
|
||
(e = await this.toolInstance.validate(t)),
|
||
e
|
||
);
|
||
}
|
||
getTunes() {
|
||
const t = document.createElement("div"),
|
||
e = [],
|
||
o =
|
||
typeof this.toolInstance.renderSettings == "function"
|
||
? this.toolInstance.renderSettings()
|
||
: [],
|
||
i = [
|
||
...this.tunesInstances.values(),
|
||
...this.defaultTunesInstances.values(),
|
||
].map((n) => n.render());
|
||
return (
|
||
[o, i].flat().forEach((n) => {
|
||
d.isElement(n)
|
||
? t.appendChild(n)
|
||
: Array.isArray(n)
|
||
? e.push(...n)
|
||
: e.push(n);
|
||
}),
|
||
[e, t]
|
||
);
|
||
}
|
||
updateCurrentInput() {
|
||
this.currentInput =
|
||
d.isNativeInput(document.activeElement) || !b.anchorNode
|
||
? document.activeElement
|
||
: b.anchorNode;
|
||
}
|
||
dispatchChange() {
|
||
this.didMutated();
|
||
}
|
||
destroy() {
|
||
this.unwatchBlockMutations(),
|
||
this.removeInputEvents(),
|
||
super.destroy(),
|
||
R(this.toolInstance.destroy) && this.toolInstance.destroy();
|
||
}
|
||
async getActiveToolboxEntry() {
|
||
const t = this.tool.toolbox;
|
||
if (t.length === 1) return Promise.resolve(this.tool.toolbox[0]);
|
||
const e = await this.data;
|
||
return t.find((o) =>
|
||
Object.entries(o.data).some(([i, n]) => e[i] && Qe(e[i], n)),
|
||
);
|
||
}
|
||
async exportDataAsString() {
|
||
const t = await this.data;
|
||
return so(t, this.tool.conversionConfig);
|
||
}
|
||
compose() {
|
||
const t = d.make("div", F.CSS.wrapper),
|
||
e = d.make("div", F.CSS.content),
|
||
o = this.toolInstance.render();
|
||
(t.dataset.id = this.id),
|
||
(this.toolRenderedElement = o),
|
||
e.appendChild(this.toolRenderedElement);
|
||
let i = e;
|
||
return (
|
||
[
|
||
...this.tunesInstances.values(),
|
||
...this.defaultTunesInstances.values(),
|
||
].forEach((n) => {
|
||
if (R(n.wrap))
|
||
try {
|
||
i = n.wrap(i);
|
||
} catch (r) {
|
||
_(
|
||
`Tune ${n.constructor.name} wrap method throws an Error %o`,
|
||
"warn",
|
||
r,
|
||
);
|
||
}
|
||
}),
|
||
t.appendChild(i),
|
||
t
|
||
);
|
||
}
|
||
composeTunes(t) {
|
||
Array.from(this.tunes.values()).forEach((e) => {
|
||
(e.isInternal ? this.defaultTunesInstances : this.tunesInstances).set(
|
||
e.name,
|
||
e.create(t[e.name], this.blockAPI),
|
||
);
|
||
}),
|
||
Object.entries(t).forEach(([e, o]) => {
|
||
this.tunesInstances.has(e) || (this.unavailableTunesData[e] = o);
|
||
});
|
||
}
|
||
addInputEvents() {
|
||
this.inputs.forEach((t) => {
|
||
t.addEventListener("focus", this.handleFocus),
|
||
d.isNativeInput(t) && t.addEventListener("input", this.didMutated);
|
||
});
|
||
}
|
||
removeInputEvents() {
|
||
this.inputs.forEach((t) => {
|
||
t.removeEventListener("focus", this.handleFocus),
|
||
d.isNativeInput(t) && t.removeEventListener("input", this.didMutated);
|
||
});
|
||
}
|
||
watchBlockMutations() {
|
||
var t;
|
||
(this.redactorDomChangedCallback = (e) => {
|
||
const { mutations: o } = e;
|
||
o.some((i) => no(i, this.toolRenderedElement)) && this.didMutated(o);
|
||
}),
|
||
(t = this.editorEventBus) == null ||
|
||
t.on(_t, this.redactorDomChangedCallback);
|
||
}
|
||
unwatchBlockMutations() {
|
||
var t;
|
||
(t = this.editorEventBus) == null ||
|
||
t.off(_t, this.redactorDomChangedCallback);
|
||
}
|
||
detectToolRootChange(t) {
|
||
t.forEach((e) => {
|
||
if (Array.from(e.removedNodes).includes(this.toolRenderedElement)) {
|
||
const o = e.addedNodes[e.addedNodes.length - 1];
|
||
this.toolRenderedElement = o;
|
||
}
|
||
});
|
||
}
|
||
dropInputsCache() {
|
||
this.cachedInputs = [];
|
||
}
|
||
}
|
||
class ao extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.insert = (
|
||
t = this.config.defaultBlock,
|
||
e = {},
|
||
o = {},
|
||
i,
|
||
n,
|
||
r,
|
||
a,
|
||
) => {
|
||
const l = this.Editor.BlockManager.insert({
|
||
id: a,
|
||
tool: t,
|
||
data: e,
|
||
index: i,
|
||
needToFocus: n,
|
||
replace: r,
|
||
});
|
||
return new tt(l);
|
||
}),
|
||
(this.composeBlockData = async (t) => {
|
||
const e = this.Editor.Tools.blockTools.get(t);
|
||
return new F({
|
||
tool: e,
|
||
api: this.Editor.API,
|
||
readOnly: !0,
|
||
data: {},
|
||
tunesData: {},
|
||
}).data;
|
||
}),
|
||
(this.update = async (t, e) => {
|
||
const { BlockManager: o } = this.Editor,
|
||
i = o.getBlockById(t);
|
||
if (i === void 0) throw new Error(`Block with id "${t}" not found`);
|
||
const n = await o.update(i, e);
|
||
return new tt(n);
|
||
}),
|
||
(this.convert = (t, e, o) => {
|
||
var i, n;
|
||
const { BlockManager: r, Tools: a } = this.Editor,
|
||
l = r.getBlockById(t);
|
||
if (!l) throw new Error(`Block with id "${t}" not found`);
|
||
const c = a.blockTools.get(l.name),
|
||
p = a.blockTools.get(e);
|
||
if (!p) throw new Error(`Block Tool with type "${e}" not found`);
|
||
const h =
|
||
((i = c == null ? void 0 : c.conversionConfig) == null
|
||
? void 0
|
||
: i.export) !== void 0,
|
||
f = ((n = p.conversionConfig) == null ? void 0 : n.import) !== void 0;
|
||
if (h && f) r.convert(l, e, o);
|
||
else {
|
||
const k = [h ? !1 : at(l.name), f ? !1 : at(e)]
|
||
.filter(Boolean)
|
||
.join(" and ");
|
||
throw new Error(
|
||
`Conversion from "${l.name}" to "${e}" is not possible. ${k} tool(s) should provide a "conversionConfig"`,
|
||
);
|
||
}
|
||
}),
|
||
(this.insertMany = (
|
||
t,
|
||
e = this.Editor.BlockManager.blocks.length - 1,
|
||
) => {
|
||
this.validateIndex(e);
|
||
const o = t.map(({ id: i, type: n, data: r }) =>
|
||
this.Editor.BlockManager.composeBlock({
|
||
id: i,
|
||
tool: n || this.config.defaultBlock,
|
||
data: r,
|
||
}),
|
||
);
|
||
return (
|
||
this.Editor.BlockManager.insertMany(o, e), o.map((i) => new tt(i))
|
||
);
|
||
});
|
||
}
|
||
get methods() {
|
||
return {
|
||
clear: () => this.clear(),
|
||
render: (t) => this.render(t),
|
||
renderFromHTML: (t) => this.renderFromHTML(t),
|
||
delete: (t) => this.delete(t),
|
||
swap: (t, e) => this.swap(t, e),
|
||
move: (t, e) => this.move(t, e),
|
||
getBlockByIndex: (t) => this.getBlockByIndex(t),
|
||
getById: (t) => this.getById(t),
|
||
getCurrentBlockIndex: () => this.getCurrentBlockIndex(),
|
||
getBlockIndex: (t) => this.getBlockIndex(t),
|
||
getBlocksCount: () => this.getBlocksCount(),
|
||
stretchBlock: (t, e = !0) => this.stretchBlock(t, e),
|
||
insertNewBlock: () => this.insertNewBlock(),
|
||
insert: this.insert,
|
||
insertMany: this.insertMany,
|
||
update: this.update,
|
||
composeBlockData: this.composeBlockData,
|
||
convert: this.convert,
|
||
};
|
||
}
|
||
getBlocksCount() {
|
||
return this.Editor.BlockManager.blocks.length;
|
||
}
|
||
getCurrentBlockIndex() {
|
||
return this.Editor.BlockManager.currentBlockIndex;
|
||
}
|
||
getBlockIndex(t) {
|
||
const e = this.Editor.BlockManager.getBlockById(t);
|
||
if (!e) {
|
||
K("There is no block with id `" + t + "`", "warn");
|
||
return;
|
||
}
|
||
return this.Editor.BlockManager.getBlockIndex(e);
|
||
}
|
||
getBlockByIndex(t) {
|
||
const e = this.Editor.BlockManager.getBlockByIndex(t);
|
||
if (e === void 0) {
|
||
K("There is no block at index `" + t + "`", "warn");
|
||
return;
|
||
}
|
||
return new tt(e);
|
||
}
|
||
getById(t) {
|
||
const e = this.Editor.BlockManager.getBlockById(t);
|
||
return e === void 0
|
||
? (K("There is no block with id `" + t + "`", "warn"), null)
|
||
: new tt(e);
|
||
}
|
||
swap(t, e) {
|
||
_(
|
||
"`blocks.swap()` method is deprecated and will be removed in the next major release. Use `block.move()` method instead",
|
||
"info",
|
||
),
|
||
this.Editor.BlockManager.swap(t, e);
|
||
}
|
||
move(t, e) {
|
||
this.Editor.BlockManager.move(t, e);
|
||
}
|
||
delete(t = this.Editor.BlockManager.currentBlockIndex) {
|
||
try {
|
||
const e = this.Editor.BlockManager.getBlockByIndex(t);
|
||
this.Editor.BlockManager.removeBlock(e);
|
||
} catch (e) {
|
||
K(e, "warn");
|
||
return;
|
||
}
|
||
this.Editor.BlockManager.blocks.length === 0 &&
|
||
this.Editor.BlockManager.insert(),
|
||
this.Editor.BlockManager.currentBlock &&
|
||
this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.currentBlock,
|
||
this.Editor.Caret.positions.END,
|
||
),
|
||
this.Editor.Toolbar.close();
|
||
}
|
||
async clear() {
|
||
await this.Editor.BlockManager.clear(!0), this.Editor.InlineToolbar.close();
|
||
}
|
||
async render(t) {
|
||
if (t === void 0 || t.blocks === void 0)
|
||
throw new Error("Incorrect data passed to the render() method");
|
||
this.Editor.ModificationsObserver.disable(),
|
||
await this.Editor.BlockManager.clear(),
|
||
await this.Editor.Renderer.render(t.blocks),
|
||
this.Editor.ModificationsObserver.enable();
|
||
}
|
||
renderFromHTML(t) {
|
||
return (
|
||
this.Editor.BlockManager.clear(), this.Editor.Paste.processText(t, !0)
|
||
);
|
||
}
|
||
stretchBlock(t, e = !0) {
|
||
Mt(!0, "blocks.stretchBlock()", "BlockAPI");
|
||
const o = this.Editor.BlockManager.getBlockByIndex(t);
|
||
o && (o.stretched = e);
|
||
}
|
||
insertNewBlock() {
|
||
_(
|
||
"Method blocks.insertNewBlock() is deprecated and it will be removed in the next major release. Use blocks.insert() instead.",
|
||
"warn",
|
||
),
|
||
this.insert();
|
||
}
|
||
validateIndex(t) {
|
||
if (typeof t != "number") throw new Error("Index should be a number");
|
||
if (t < 0) throw new Error("Index should be greater than or equal to 0");
|
||
if (t === null)
|
||
throw new Error("Index should be greater than or equal to 0");
|
||
}
|
||
}
|
||
class lo extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.setToFirstBlock = (
|
||
t = this.Editor.Caret.positions.DEFAULT,
|
||
e = 0,
|
||
) =>
|
||
this.Editor.BlockManager.firstBlock
|
||
? (this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.firstBlock,
|
||
t,
|
||
e,
|
||
),
|
||
!0)
|
||
: !1),
|
||
(this.setToLastBlock = (t = this.Editor.Caret.positions.DEFAULT, e = 0) =>
|
||
this.Editor.BlockManager.lastBlock
|
||
? (this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.lastBlock,
|
||
t,
|
||
e,
|
||
),
|
||
!0)
|
||
: !1),
|
||
(this.setToPreviousBlock = (
|
||
t = this.Editor.Caret.positions.DEFAULT,
|
||
e = 0,
|
||
) =>
|
||
this.Editor.BlockManager.previousBlock
|
||
? (this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.previousBlock,
|
||
t,
|
||
e,
|
||
),
|
||
!0)
|
||
: !1),
|
||
(this.setToNextBlock = (t = this.Editor.Caret.positions.DEFAULT, e = 0) =>
|
||
this.Editor.BlockManager.nextBlock
|
||
? (this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.nextBlock,
|
||
t,
|
||
e,
|
||
),
|
||
!0)
|
||
: !1),
|
||
(this.setToBlock = (t, e = this.Editor.Caret.positions.DEFAULT, o = 0) =>
|
||
this.Editor.BlockManager.blocks[t]
|
||
? (this.Editor.Caret.setToBlock(
|
||
this.Editor.BlockManager.blocks[t],
|
||
e,
|
||
o,
|
||
),
|
||
!0)
|
||
: !1),
|
||
(this.focus = (t = !1) =>
|
||
t
|
||
? this.setToLastBlock(this.Editor.Caret.positions.END)
|
||
: this.setToFirstBlock(this.Editor.Caret.positions.START));
|
||
}
|
||
get methods() {
|
||
return {
|
||
setToFirstBlock: this.setToFirstBlock,
|
||
setToLastBlock: this.setToLastBlock,
|
||
setToPreviousBlock: this.setToPreviousBlock,
|
||
setToNextBlock: this.setToNextBlock,
|
||
setToBlock: this.setToBlock,
|
||
focus: this.focus,
|
||
};
|
||
}
|
||
}
|
||
class co extends T {
|
||
get methods() {
|
||
return {
|
||
emit: (t, e) => this.emit(t, e),
|
||
off: (t, e) => this.off(t, e),
|
||
on: (t, e) => this.on(t, e),
|
||
};
|
||
}
|
||
on(t, e) {
|
||
this.eventsDispatcher.on(t, e);
|
||
}
|
||
emit(t, e) {
|
||
this.eventsDispatcher.emit(t, e);
|
||
}
|
||
off(t, e) {
|
||
this.eventsDispatcher.off(t, e);
|
||
}
|
||
}
|
||
class Ft extends T {
|
||
static getNamespace(t) {
|
||
return t.isTune() ? `blockTunes.${t.name}` : `tools.${t.name}`;
|
||
}
|
||
get methods() {
|
||
return {
|
||
t: () => {
|
||
K("I18n.t() method can be accessed only from Tools", "warn");
|
||
},
|
||
};
|
||
}
|
||
getMethodsForTool(t) {
|
||
return Object.assign(this.methods, {
|
||
t: (e) => $.t(Ft.getNamespace(t), e),
|
||
});
|
||
}
|
||
}
|
||
class ho extends T {
|
||
get methods() {
|
||
return {
|
||
blocks: this.Editor.BlocksAPI.methods,
|
||
caret: this.Editor.CaretAPI.methods,
|
||
events: this.Editor.EventsAPI.methods,
|
||
listeners: this.Editor.ListenersAPI.methods,
|
||
notifier: this.Editor.NotifierAPI.methods,
|
||
sanitizer: this.Editor.SanitizerAPI.methods,
|
||
saver: this.Editor.SaverAPI.methods,
|
||
selection: this.Editor.SelectionAPI.methods,
|
||
styles: this.Editor.StylesAPI.classes,
|
||
toolbar: this.Editor.ToolbarAPI.methods,
|
||
inlineToolbar: this.Editor.InlineToolbarAPI.methods,
|
||
tooltip: this.Editor.TooltipAPI.methods,
|
||
i18n: this.Editor.I18nAPI.methods,
|
||
readOnly: this.Editor.ReadOnlyAPI.methods,
|
||
ui: this.Editor.UiAPI.methods,
|
||
};
|
||
}
|
||
getMethodsForTool(t) {
|
||
return Object.assign(this.methods, {
|
||
i18n: this.Editor.I18nAPI.getMethodsForTool(t),
|
||
});
|
||
}
|
||
}
|
||
class po extends T {
|
||
get methods() {
|
||
return { close: () => this.close(), open: () => this.open() };
|
||
}
|
||
open() {
|
||
this.Editor.InlineToolbar.tryToShow();
|
||
}
|
||
close() {
|
||
this.Editor.InlineToolbar.close();
|
||
}
|
||
}
|
||
class uo extends T {
|
||
get methods() {
|
||
return {
|
||
on: (t, e, o, i) => this.on(t, e, o, i),
|
||
off: (t, e, o, i) => this.off(t, e, o, i),
|
||
offById: (t) => this.offById(t),
|
||
};
|
||
}
|
||
on(t, e, o, i) {
|
||
return this.listeners.on(t, e, o, i);
|
||
}
|
||
off(t, e, o, i) {
|
||
this.listeners.off(t, e, o, i);
|
||
}
|
||
offById(t) {
|
||
this.listeners.offById(t);
|
||
}
|
||
}
|
||
var At = {},
|
||
fo = {
|
||
get exports() {
|
||
return At;
|
||
},
|
||
set exports(s) {
|
||
At = s;
|
||
},
|
||
};
|
||
(function (s, t) {
|
||
(function (e, o) {
|
||
s.exports = o();
|
||
})(window, function () {
|
||
return (function (e) {
|
||
var o = {};
|
||
function i(n) {
|
||
if (o[n]) return o[n].exports;
|
||
var r = (o[n] = { i: n, l: !1, exports: {} });
|
||
return e[n].call(r.exports, r, r.exports, i), (r.l = !0), r.exports;
|
||
}
|
||
return (
|
||
(i.m = e),
|
||
(i.c = o),
|
||
(i.d = function (n, r, a) {
|
||
i.o(n, r) || Object.defineProperty(n, r, { enumerable: !0, get: a });
|
||
}),
|
||
(i.r = function (n) {
|
||
typeof Symbol < "u" &&
|
||
Symbol.toStringTag &&
|
||
Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
|
||
Object.defineProperty(n, "__esModule", { value: !0 });
|
||
}),
|
||
(i.t = function (n, r) {
|
||
if (
|
||
(1 & r && (n = i(n)),
|
||
8 & r || (4 & r && typeof n == "object" && n && n.__esModule))
|
||
)
|
||
return n;
|
||
var a = Object.create(null);
|
||
if (
|
||
(i.r(a),
|
||
Object.defineProperty(a, "default", { enumerable: !0, value: n }),
|
||
2 & r && typeof n != "string")
|
||
)
|
||
for (var l in n)
|
||
i.d(
|
||
a,
|
||
l,
|
||
function (c) {
|
||
return n[c];
|
||
}.bind(null, l),
|
||
);
|
||
return a;
|
||
}),
|
||
(i.n = function (n) {
|
||
var r =
|
||
n && n.__esModule
|
||
? function () {
|
||
return n.default;
|
||
}
|
||
: function () {
|
||
return n;
|
||
};
|
||
return i.d(r, "a", r), r;
|
||
}),
|
||
(i.o = function (n, r) {
|
||
return Object.prototype.hasOwnProperty.call(n, r);
|
||
}),
|
||
(i.p = "/"),
|
||
i((i.s = 0))
|
||
);
|
||
})([
|
||
function (e, o, i) {
|
||
i(1),
|
||
(e.exports = (function () {
|
||
var n = i(6),
|
||
r = "cdx-notify--bounce-in",
|
||
a = null;
|
||
return {
|
||
show: function (l) {
|
||
if (l.message) {
|
||
(function () {
|
||
if (a) return !0;
|
||
(a = n.getWrapper()), document.body.appendChild(a);
|
||
})();
|
||
var c = null,
|
||
p = l.time || 8e3;
|
||
switch (l.type) {
|
||
case "confirm":
|
||
c = n.confirm(l);
|
||
break;
|
||
case "prompt":
|
||
c = n.prompt(l);
|
||
break;
|
||
default:
|
||
(c = n.alert(l)),
|
||
window.setTimeout(function () {
|
||
c.remove();
|
||
}, p);
|
||
}
|
||
a.appendChild(c), c.classList.add(r);
|
||
}
|
||
},
|
||
};
|
||
})());
|
||
},
|
||
function (e, o, i) {
|
||
var n = i(2);
|
||
typeof n == "string" && (n = [[e.i, n, ""]]);
|
||
var r = { hmr: !0, transform: void 0, insertInto: void 0 };
|
||
i(4)(n, r), n.locals && (e.exports = n.locals);
|
||
},
|
||
function (e, o, i) {
|
||
(e.exports = i(3)(!1)).push([
|
||
e.i,
|
||
`.cdx-notify--error{background:#fffbfb!important}.cdx-notify--error::before{background:#fb5d5d!important}.cdx-notify__input{max-width:130px;padding:5px 10px;background:#f7f7f7;border:0;border-radius:3px;font-size:13px;color:#656b7c;outline:0}.cdx-notify__input:-ms-input-placeholder{color:#656b7c}.cdx-notify__input::placeholder{color:#656b7c}.cdx-notify__input:focus:-ms-input-placeholder{color:rgba(101,107,124,.3)}.cdx-notify__input:focus::placeholder{color:rgba(101,107,124,.3)}.cdx-notify__button{border:none;border-radius:3px;font-size:13px;padding:5px 10px;cursor:pointer}.cdx-notify__button:last-child{margin-left:10px}.cdx-notify__button--cancel{background:#f2f5f7;box-shadow:0 2px 1px 0 rgba(16,19,29,0);color:#656b7c}.cdx-notify__button--cancel:hover{background:#eee}.cdx-notify__button--confirm{background:#34c992;box-shadow:0 1px 1px 0 rgba(18,49,35,.05);color:#fff}.cdx-notify__button--confirm:hover{background:#33b082}.cdx-notify__btns-wrapper{display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;margin-top:5px}.cdx-notify__cross{position:absolute;top:5px;right:5px;width:10px;height:10px;padding:5px;opacity:.54;cursor:pointer}.cdx-notify__cross::after,.cdx-notify__cross::before{content:'';position:absolute;left:9px;top:5px;height:12px;width:2px;background:#575d67}.cdx-notify__cross::before{transform:rotate(-45deg)}.cdx-notify__cross::after{transform:rotate(45deg)}.cdx-notify__cross:hover{opacity:1}.cdx-notifies{position:fixed;z-index:2;bottom:20px;left:20px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.cdx-notify{position:relative;width:220px;margin-top:15px;padding:13px 16px;background:#fff;box-shadow:0 11px 17px 0 rgba(23,32,61,.13);border-radius:5px;font-size:14px;line-height:1.4em;word-wrap:break-word}.cdx-notify::before{content:'';position:absolute;display:block;top:0;left:0;width:3px;height:calc(100% - 6px);margin:3px;border-radius:5px;background:0 0}@keyframes bounceIn{0%{opacity:0;transform:scale(.3)}50%{opacity:1;transform:scale(1.05)}70%{transform:scale(.9)}100%{transform:scale(1)}}.cdx-notify--bounce-in{animation-name:bounceIn;animation-duration:.6s;animation-iteration-count:1}.cdx-notify--success{background:#fafffe!important}.cdx-notify--success::before{background:#41ffb1!important}`,
|
||
"",
|
||
]);
|
||
},
|
||
function (e, o) {
|
||
e.exports = function (i) {
|
||
var n = [];
|
||
return (
|
||
(n.toString = function () {
|
||
return this.map(function (r) {
|
||
var a = (function (l, c) {
|
||
var p = l[1] || "",
|
||
h = l[3];
|
||
if (!h) return p;
|
||
if (c && typeof btoa == "function") {
|
||
var f =
|
||
((u = h),
|
||
"/*# sourceMappingURL=data:application/json;charset=utf-8;base64," +
|
||
btoa(
|
||
unescape(encodeURIComponent(JSON.stringify(u))),
|
||
) +
|
||
" */"),
|
||
k = h.sources.map(function (C) {
|
||
return "/*# sourceURL=" + h.sourceRoot + C + " */";
|
||
});
|
||
return [p].concat(k).concat([f]).join(`
|
||
`);
|
||
}
|
||
var u;
|
||
return [p].join(`
|
||
`);
|
||
})(r, i);
|
||
return r[2] ? "@media " + r[2] + "{" + a + "}" : a;
|
||
}).join("");
|
||
}),
|
||
(n.i = function (r, a) {
|
||
typeof r == "string" && (r = [[null, r, ""]]);
|
||
for (var l = {}, c = 0; c < this.length; c++) {
|
||
var p = this[c][0];
|
||
typeof p == "number" && (l[p] = !0);
|
||
}
|
||
for (c = 0; c < r.length; c++) {
|
||
var h = r[c];
|
||
(typeof h[0] == "number" && l[h[0]]) ||
|
||
(a && !h[2]
|
||
? (h[2] = a)
|
||
: a && (h[2] = "(" + h[2] + ") and (" + a + ")"),
|
||
n.push(h));
|
||
}
|
||
}),
|
||
n
|
||
);
|
||
};
|
||
},
|
||
function (e, o, i) {
|
||
var n,
|
||
r,
|
||
a = {},
|
||
l =
|
||
((n = function () {
|
||
return window && document && document.all && !window.atob;
|
||
}),
|
||
function () {
|
||
return r === void 0 && (r = n.apply(this, arguments)), r;
|
||
}),
|
||
c = (function (m) {
|
||
var g = {};
|
||
return function (y) {
|
||
if (typeof y == "function") return y();
|
||
if (g[y] === void 0) {
|
||
var B = function (A) {
|
||
return document.querySelector(A);
|
||
}.call(this, y);
|
||
if (
|
||
window.HTMLIFrameElement &&
|
||
B instanceof window.HTMLIFrameElement
|
||
)
|
||
try {
|
||
B = B.contentDocument.head;
|
||
} catch {
|
||
B = null;
|
||
}
|
||
g[y] = B;
|
||
}
|
||
return g[y];
|
||
};
|
||
})(),
|
||
p = null,
|
||
h = 0,
|
||
f = [],
|
||
k = i(5);
|
||
function u(m, g) {
|
||
for (var y = 0; y < m.length; y++) {
|
||
var B = m[y],
|
||
A = a[B.id];
|
||
if (A) {
|
||
A.refs++;
|
||
for (var S = 0; S < A.parts.length; S++) A.parts[S](B.parts[S]);
|
||
for (; S < B.parts.length; S++) A.parts.push(v(B.parts[S], g));
|
||
} else {
|
||
var H = [];
|
||
for (S = 0; S < B.parts.length; S++) H.push(v(B.parts[S], g));
|
||
a[B.id] = { id: B.id, refs: 1, parts: H };
|
||
}
|
||
}
|
||
}
|
||
function C(m, g) {
|
||
for (var y = [], B = {}, A = 0; A < m.length; A++) {
|
||
var S = m[A],
|
||
H = g.base ? S[0] + g.base : S[0],
|
||
M = { css: S[1], media: S[2], sourceMap: S[3] };
|
||
B[H] ? B[H].parts.push(M) : y.push((B[H] = { id: H, parts: [M] }));
|
||
}
|
||
return y;
|
||
}
|
||
function L(m, g) {
|
||
var y = c(m.insertInto);
|
||
if (!y)
|
||
throw new Error(
|
||
"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.",
|
||
);
|
||
var B = f[f.length - 1];
|
||
if (m.insertAt === "top")
|
||
B
|
||
? B.nextSibling
|
||
? y.insertBefore(g, B.nextSibling)
|
||
: y.appendChild(g)
|
||
: y.insertBefore(g, y.firstChild),
|
||
f.push(g);
|
||
else if (m.insertAt === "bottom") y.appendChild(g);
|
||
else {
|
||
if (typeof m.insertAt != "object" || !m.insertAt.before)
|
||
throw new Error(`[Style Loader]
|
||
|
||
Invalid value for parameter 'insertAt' ('options.insertAt') found.
|
||
Must be 'top', 'bottom', or Object.
|
||
(https://github.com/webpack-contrib/style-loader#insertat)
|
||
`);
|
||
var A = c(m.insertInto + " " + m.insertAt.before);
|
||
y.insertBefore(g, A);
|
||
}
|
||
}
|
||
function N(m) {
|
||
if (m.parentNode === null) return !1;
|
||
m.parentNode.removeChild(m);
|
||
var g = f.indexOf(m);
|
||
g >= 0 && f.splice(g, 1);
|
||
}
|
||
function D(m) {
|
||
var g = document.createElement("style");
|
||
return (
|
||
m.attrs.type === void 0 && (m.attrs.type = "text/css"),
|
||
w(g, m.attrs),
|
||
L(m, g),
|
||
g
|
||
);
|
||
}
|
||
function w(m, g) {
|
||
Object.keys(g).forEach(function (y) {
|
||
m.setAttribute(y, g[y]);
|
||
});
|
||
}
|
||
function v(m, g) {
|
||
var y, B, A, S;
|
||
if (g.transform && m.css) {
|
||
if (!(S = g.transform(m.css))) return function () {};
|
||
m.css = S;
|
||
}
|
||
if (g.singleton) {
|
||
var H = h++;
|
||
(y = p || (p = D(g))),
|
||
(B = O.bind(null, y, H, !1)),
|
||
(A = O.bind(null, y, H, !0));
|
||
} else
|
||
m.sourceMap &&
|
||
typeof URL == "function" &&
|
||
typeof URL.createObjectURL == "function" &&
|
||
typeof URL.revokeObjectURL == "function" &&
|
||
typeof Blob == "function" &&
|
||
typeof btoa == "function"
|
||
? ((y = (function (M) {
|
||
var W = document.createElement("link");
|
||
return (
|
||
M.attrs.type === void 0 && (M.attrs.type = "text/css"),
|
||
(M.attrs.rel = "stylesheet"),
|
||
w(W, M.attrs),
|
||
L(M, W),
|
||
W
|
||
);
|
||
})(g)),
|
||
(B = function (M, W, dt) {
|
||
var Q = dt.css,
|
||
Et = dt.sourceMap,
|
||
Ae = W.convertToAbsoluteUrls === void 0 && Et;
|
||
(W.convertToAbsoluteUrls || Ae) && (Q = k(Q)),
|
||
Et &&
|
||
(Q +=
|
||
`
|
||
/*# sourceMappingURL=data:application/json;base64,` +
|
||
btoa(unescape(encodeURIComponent(JSON.stringify(Et)))) +
|
||
" */");
|
||
var Le = new Blob([Q], { type: "text/css" }),
|
||
qt = M.href;
|
||
(M.href = URL.createObjectURL(Le)),
|
||
qt && URL.revokeObjectURL(qt);
|
||
}.bind(null, y, g)),
|
||
(A = function () {
|
||
N(y), y.href && URL.revokeObjectURL(y.href);
|
||
}))
|
||
: ((y = D(g)),
|
||
(B = function (M, W) {
|
||
var dt = W.css,
|
||
Q = W.media;
|
||
if ((Q && M.setAttribute("media", Q), M.styleSheet))
|
||
M.styleSheet.cssText = dt;
|
||
else {
|
||
for (; M.firstChild; ) M.removeChild(M.firstChild);
|
||
M.appendChild(document.createTextNode(dt));
|
||
}
|
||
}.bind(null, y)),
|
||
(A = function () {
|
||
N(y);
|
||
}));
|
||
return (
|
||
B(m),
|
||
function (M) {
|
||
if (M) {
|
||
if (
|
||
M.css === m.css &&
|
||
M.media === m.media &&
|
||
M.sourceMap === m.sourceMap
|
||
)
|
||
return;
|
||
B((m = M));
|
||
} else A();
|
||
}
|
||
);
|
||
}
|
||
e.exports = function (m, g) {
|
||
if (typeof DEBUG < "u" && DEBUG && typeof document != "object")
|
||
throw new Error(
|
||
"The style-loader cannot be used in a non-browser environment",
|
||
);
|
||
((g = g || {}).attrs = typeof g.attrs == "object" ? g.attrs : {}),
|
||
g.singleton ||
|
||
typeof g.singleton == "boolean" ||
|
||
(g.singleton = l()),
|
||
g.insertInto || (g.insertInto = "head"),
|
||
g.insertAt || (g.insertAt = "bottom");
|
||
var y = C(m, g);
|
||
return (
|
||
u(y, g),
|
||
function (B) {
|
||
for (var A = [], S = 0; S < y.length; S++) {
|
||
var H = y[S];
|
||
(M = a[H.id]).refs--, A.push(M);
|
||
}
|
||
for (B && u(C(B, g), g), S = 0; S < A.length; S++) {
|
||
var M;
|
||
if ((M = A[S]).refs === 0) {
|
||
for (var W = 0; W < M.parts.length; W++) M.parts[W]();
|
||
delete a[M.id];
|
||
}
|
||
}
|
||
}
|
||
);
|
||
};
|
||
var x,
|
||
I =
|
||
((x = []),
|
||
function (m, g) {
|
||
return (
|
||
(x[m] = g),
|
||
x.filter(Boolean).join(`
|
||
`)
|
||
);
|
||
});
|
||
function O(m, g, y, B) {
|
||
var A = y ? "" : B.css;
|
||
if (m.styleSheet) m.styleSheet.cssText = I(g, A);
|
||
else {
|
||
var S = document.createTextNode(A),
|
||
H = m.childNodes;
|
||
H[g] && m.removeChild(H[g]),
|
||
H.length ? m.insertBefore(S, H[g]) : m.appendChild(S);
|
||
}
|
||
}
|
||
},
|
||
function (e, o) {
|
||
e.exports = function (i) {
|
||
var n = typeof window < "u" && window.location;
|
||
if (!n) throw new Error("fixUrls requires window.location");
|
||
if (!i || typeof i != "string") return i;
|
||
var r = n.protocol + "//" + n.host,
|
||
a = r + n.pathname.replace(/\/[^\/]*$/, "/");
|
||
return i.replace(
|
||
/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,
|
||
function (l, c) {
|
||
var p,
|
||
h = c
|
||
.trim()
|
||
.replace(/^"(.*)"$/, function (f, k) {
|
||
return k;
|
||
})
|
||
.replace(/^'(.*)'$/, function (f, k) {
|
||
return k;
|
||
});
|
||
return /^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(h)
|
||
? l
|
||
: ((p =
|
||
h.indexOf("//") === 0
|
||
? h
|
||
: h.indexOf("/") === 0
|
||
? r + h
|
||
: a + h.replace(/^\.\//, "")),
|
||
"url(" + JSON.stringify(p) + ")");
|
||
},
|
||
);
|
||
};
|
||
},
|
||
function (e, o, i) {
|
||
var n, r, a, l, c, p, h, f, k;
|
||
e.exports =
|
||
((n = "cdx-notifies"),
|
||
(r = "cdx-notify"),
|
||
(a = "cdx-notify__cross"),
|
||
(l = "cdx-notify__button--confirm"),
|
||
(c = "cdx-notify__button--cancel"),
|
||
(p = "cdx-notify__input"),
|
||
(h = "cdx-notify__button"),
|
||
(f = "cdx-notify__btns-wrapper"),
|
||
{
|
||
alert: (k = function (u) {
|
||
var C = document.createElement("DIV"),
|
||
L = document.createElement("DIV"),
|
||
N = u.message,
|
||
D = u.style;
|
||
return (
|
||
C.classList.add(r),
|
||
D && C.classList.add(r + "--" + D),
|
||
(C.innerHTML = N),
|
||
L.classList.add(a),
|
||
L.addEventListener("click", C.remove.bind(C)),
|
||
C.appendChild(L),
|
||
C
|
||
);
|
||
}),
|
||
confirm: function (u) {
|
||
var C = k(u),
|
||
L = document.createElement("div"),
|
||
N = document.createElement("button"),
|
||
D = document.createElement("button"),
|
||
w = C.querySelector("." + a),
|
||
v = u.cancelHandler,
|
||
x = u.okHandler;
|
||
return (
|
||
L.classList.add(f),
|
||
(N.innerHTML = u.okText || "Confirm"),
|
||
(D.innerHTML = u.cancelText || "Cancel"),
|
||
N.classList.add(h),
|
||
D.classList.add(h),
|
||
N.classList.add(l),
|
||
D.classList.add(c),
|
||
v &&
|
||
typeof v == "function" &&
|
||
(D.addEventListener("click", v),
|
||
w.addEventListener("click", v)),
|
||
x && typeof x == "function" && N.addEventListener("click", x),
|
||
N.addEventListener("click", C.remove.bind(C)),
|
||
D.addEventListener("click", C.remove.bind(C)),
|
||
L.appendChild(N),
|
||
L.appendChild(D),
|
||
C.appendChild(L),
|
||
C
|
||
);
|
||
},
|
||
prompt: function (u) {
|
||
var C = k(u),
|
||
L = document.createElement("div"),
|
||
N = document.createElement("button"),
|
||
D = document.createElement("input"),
|
||
w = C.querySelector("." + a),
|
||
v = u.cancelHandler,
|
||
x = u.okHandler;
|
||
return (
|
||
L.classList.add(f),
|
||
(N.innerHTML = u.okText || "Ok"),
|
||
N.classList.add(h),
|
||
N.classList.add(l),
|
||
D.classList.add(p),
|
||
u.placeholder && D.setAttribute("placeholder", u.placeholder),
|
||
u.default && (D.value = u.default),
|
||
u.inputType && (D.type = u.inputType),
|
||
v && typeof v == "function" && w.addEventListener("click", v),
|
||
x &&
|
||
typeof x == "function" &&
|
||
N.addEventListener("click", function () {
|
||
x(D.value);
|
||
}),
|
||
N.addEventListener("click", C.remove.bind(C)),
|
||
L.appendChild(D),
|
||
L.appendChild(N),
|
||
C.appendChild(L),
|
||
C
|
||
);
|
||
},
|
||
getWrapper: function () {
|
||
var u = document.createElement("DIV");
|
||
return u.classList.add(n), u;
|
||
},
|
||
});
|
||
},
|
||
]);
|
||
});
|
||
})(fo);
|
||
const go = xt(At);
|
||
class mo {
|
||
show(t) {
|
||
go.show(t);
|
||
}
|
||
}
|
||
class bo extends T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
super({ config: t, eventsDispatcher: e }), (this.notifier = new mo());
|
||
}
|
||
get methods() {
|
||
return { show: (t) => this.show(t) };
|
||
}
|
||
show(t) {
|
||
return this.notifier.show(t);
|
||
}
|
||
}
|
||
class ko extends T {
|
||
get methods() {
|
||
const t = () => this.isEnabled;
|
||
return {
|
||
toggle: (e) => this.toggle(e),
|
||
get isEnabled() {
|
||
return t();
|
||
},
|
||
};
|
||
}
|
||
toggle(t) {
|
||
return this.Editor.ReadOnly.toggle(t);
|
||
}
|
||
get isEnabled() {
|
||
return this.Editor.ReadOnly.isEnabled;
|
||
}
|
||
}
|
||
var Lt = {},
|
||
vo = {
|
||
get exports() {
|
||
return Lt;
|
||
},
|
||
set exports(s) {
|
||
Lt = s;
|
||
},
|
||
};
|
||
(function (s, t) {
|
||
(function (e, o) {
|
||
s.exports = o();
|
||
})(He, function () {
|
||
function e(h) {
|
||
var f = h.tags,
|
||
k = Object.keys(f),
|
||
u = k
|
||
.map(function (C) {
|
||
return typeof f[C];
|
||
})
|
||
.every(function (C) {
|
||
return C === "object" || C === "boolean" || C === "function";
|
||
});
|
||
if (!u) throw new Error("The configuration was invalid");
|
||
this.config = h;
|
||
}
|
||
var o = [
|
||
"P",
|
||
"LI",
|
||
"TD",
|
||
"TH",
|
||
"DIV",
|
||
"H1",
|
||
"H2",
|
||
"H3",
|
||
"H4",
|
||
"H5",
|
||
"H6",
|
||
"PRE",
|
||
];
|
||
function i(h) {
|
||
return o.indexOf(h.nodeName) !== -1;
|
||
}
|
||
var n = ["A", "B", "STRONG", "I", "EM", "SUB", "SUP", "U", "STRIKE"];
|
||
function r(h) {
|
||
return n.indexOf(h.nodeName) !== -1;
|
||
}
|
||
(e.prototype.clean = function (h) {
|
||
const f = document.implementation.createHTMLDocument(),
|
||
k = f.createElement("div");
|
||
return (k.innerHTML = h), this._sanitize(f, k), k.innerHTML;
|
||
}),
|
||
(e.prototype._sanitize = function (h, f) {
|
||
var k = a(h, f),
|
||
u = k.firstChild();
|
||
if (u)
|
||
do {
|
||
if (u.nodeType === Node.TEXT_NODE)
|
||
if (
|
||
u.data.trim() === "" &&
|
||
((u.previousElementSibling && i(u.previousElementSibling)) ||
|
||
(u.nextElementSibling && i(u.nextElementSibling)))
|
||
) {
|
||
f.removeChild(u), this._sanitize(h, f);
|
||
break;
|
||
} else continue;
|
||
if (u.nodeType === Node.COMMENT_NODE) {
|
||
f.removeChild(u), this._sanitize(h, f);
|
||
break;
|
||
}
|
||
var C = r(u),
|
||
L;
|
||
C && (L = Array.prototype.some.call(u.childNodes, i));
|
||
var N = !!f.parentNode,
|
||
D = i(f) && i(u) && N,
|
||
w = u.nodeName.toLowerCase(),
|
||
v = l(this.config, w, u),
|
||
x = C && L;
|
||
if (x || c(u, v) || (!this.config.keepNestedBlockElements && D)) {
|
||
if (!(u.nodeName === "SCRIPT" || u.nodeName === "STYLE"))
|
||
for (; u.childNodes.length > 0; )
|
||
f.insertBefore(u.childNodes[0], u);
|
||
f.removeChild(u), this._sanitize(h, f);
|
||
break;
|
||
}
|
||
for (var I = 0; I < u.attributes.length; I += 1) {
|
||
var O = u.attributes[I];
|
||
p(O, v, u) && (u.removeAttribute(O.name), (I = I - 1));
|
||
}
|
||
this._sanitize(h, u);
|
||
} while ((u = k.nextSibling()));
|
||
});
|
||
function a(h, f) {
|
||
return h.createTreeWalker(
|
||
f,
|
||
NodeFilter.SHOW_TEXT |
|
||
NodeFilter.SHOW_ELEMENT |
|
||
NodeFilter.SHOW_COMMENT,
|
||
null,
|
||
!1,
|
||
);
|
||
}
|
||
function l(h, f, k) {
|
||
return typeof h.tags[f] == "function" ? h.tags[f](k) : h.tags[f];
|
||
}
|
||
function c(h, f) {
|
||
return typeof f > "u" ? !0 : typeof f == "boolean" ? !f : !1;
|
||
}
|
||
function p(h, f, k) {
|
||
var u = h.name.toLowerCase();
|
||
return f === !0
|
||
? !1
|
||
: typeof f[u] == "function"
|
||
? !f[u](h.value, k)
|
||
: typeof f[u] > "u" || f[u] === !1
|
||
? !0
|
||
: typeof f[u] == "string"
|
||
? f[u] !== h.value
|
||
: !1;
|
||
}
|
||
return e;
|
||
});
|
||
})(vo);
|
||
const xo = Lt;
|
||
function fe(s, t) {
|
||
return s.map((e) => {
|
||
const o = R(t) ? t(e.tool) : t;
|
||
return V(o) || (e.data = Ht(e.data, o)), e;
|
||
});
|
||
}
|
||
function Z(s, t = {}) {
|
||
const e = { tags: t };
|
||
return new xo(e).clean(s);
|
||
}
|
||
function Ht(s, t) {
|
||
return Array.isArray(s) ? wo(s, t) : z(s) ? yo(s, t) : J(s) ? Eo(s, t) : s;
|
||
}
|
||
function wo(s, t) {
|
||
return s.map((e) => Ht(e, t));
|
||
}
|
||
function yo(s, t) {
|
||
const e = {};
|
||
for (const o in s) {
|
||
if (!Object.prototype.hasOwnProperty.call(s, o)) continue;
|
||
const i = s[o],
|
||
n = Co(t[o]) ? t[o] : t;
|
||
e[o] = Ht(i, n);
|
||
}
|
||
return e;
|
||
}
|
||
function Eo(s, t) {
|
||
return z(t) ? Z(s, t) : t === !1 ? Z(s, {}) : s;
|
||
}
|
||
function Co(s) {
|
||
return z(s) || $e(s) || R(s);
|
||
}
|
||
class Bo extends T {
|
||
get methods() {
|
||
return { clean: (t, e) => this.clean(t, e) };
|
||
}
|
||
clean(t, e) {
|
||
return Z(t, e);
|
||
}
|
||
}
|
||
class To extends T {
|
||
get methods() {
|
||
return { save: () => this.save() };
|
||
}
|
||
save() {
|
||
const t = "Editor's content can not be saved in read-only mode";
|
||
return this.Editor.ReadOnly.isEnabled
|
||
? (K(t, "warn"), Promise.reject(new Error(t)))
|
||
: this.Editor.Saver.save();
|
||
}
|
||
}
|
||
class So extends T {
|
||
get methods() {
|
||
return {
|
||
findParentTag: (t, e) => this.findParentTag(t, e),
|
||
expandToTag: (t) => this.expandToTag(t),
|
||
};
|
||
}
|
||
findParentTag(t, e) {
|
||
return new b().findParentTag(t, e);
|
||
}
|
||
expandToTag(t) {
|
||
new b().expandToTag(t);
|
||
}
|
||
}
|
||
class Io extends T {
|
||
get classes() {
|
||
return {
|
||
block: "cdx-block",
|
||
inlineToolButton: "ce-inline-tool",
|
||
inlineToolButtonActive: "ce-inline-tool--active",
|
||
input: "cdx-input",
|
||
loader: "cdx-loader",
|
||
button: "cdx-button",
|
||
settingsButton: "cdx-settings-button",
|
||
settingsButtonActive: "cdx-settings-button--active",
|
||
};
|
||
}
|
||
}
|
||
class Mo extends T {
|
||
get methods() {
|
||
return {
|
||
close: () => this.close(),
|
||
open: () => this.open(),
|
||
toggleBlockSettings: (t) => this.toggleBlockSettings(t),
|
||
toggleToolbox: (t) => this.toggleToolbox(t),
|
||
};
|
||
}
|
||
open() {
|
||
this.Editor.Toolbar.moveAndOpen();
|
||
}
|
||
close() {
|
||
this.Editor.Toolbar.close();
|
||
}
|
||
toggleBlockSettings(t) {
|
||
if (this.Editor.BlockManager.currentBlockIndex === -1) {
|
||
K(
|
||
"Could't toggle the Toolbar because there is no block selected ",
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
t ?? !this.Editor.BlockSettings.opened
|
||
? (this.Editor.Toolbar.moveAndOpen(), this.Editor.BlockSettings.open())
|
||
: this.Editor.BlockSettings.close();
|
||
}
|
||
toggleToolbox(t) {
|
||
if (this.Editor.BlockManager.currentBlockIndex === -1) {
|
||
K(
|
||
"Could't toggle the Toolbox because there is no block selected ",
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
t ?? !this.Editor.Toolbar.toolbox.opened
|
||
? (this.Editor.Toolbar.moveAndOpen(), this.Editor.Toolbar.toolbox.open())
|
||
: this.Editor.Toolbar.toolbox.close();
|
||
}
|
||
}
|
||
var Ot = {},
|
||
_o = {
|
||
get exports() {
|
||
return Ot;
|
||
},
|
||
set exports(s) {
|
||
Ot = s;
|
||
},
|
||
};
|
||
/*!
|
||
* CodeX.Tooltips
|
||
*
|
||
* @version 1.0.5
|
||
*
|
||
* @licence MIT
|
||
* @author CodeX <https://codex.so>
|
||
*
|
||
*
|
||
*/ (function (s, t) {
|
||
(function (e, o) {
|
||
s.exports = o();
|
||
})(window, function () {
|
||
return (function (e) {
|
||
var o = {};
|
||
function i(n) {
|
||
if (o[n]) return o[n].exports;
|
||
var r = (o[n] = { i: n, l: !1, exports: {} });
|
||
return e[n].call(r.exports, r, r.exports, i), (r.l = !0), r.exports;
|
||
}
|
||
return (
|
||
(i.m = e),
|
||
(i.c = o),
|
||
(i.d = function (n, r, a) {
|
||
i.o(n, r) || Object.defineProperty(n, r, { enumerable: !0, get: a });
|
||
}),
|
||
(i.r = function (n) {
|
||
typeof Symbol < "u" &&
|
||
Symbol.toStringTag &&
|
||
Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
|
||
Object.defineProperty(n, "__esModule", { value: !0 });
|
||
}),
|
||
(i.t = function (n, r) {
|
||
if (
|
||
(1 & r && (n = i(n)),
|
||
8 & r || (4 & r && typeof n == "object" && n && n.__esModule))
|
||
)
|
||
return n;
|
||
var a = Object.create(null);
|
||
if (
|
||
(i.r(a),
|
||
Object.defineProperty(a, "default", { enumerable: !0, value: n }),
|
||
2 & r && typeof n != "string")
|
||
)
|
||
for (var l in n)
|
||
i.d(
|
||
a,
|
||
l,
|
||
function (c) {
|
||
return n[c];
|
||
}.bind(null, l),
|
||
);
|
||
return a;
|
||
}),
|
||
(i.n = function (n) {
|
||
var r =
|
||
n && n.__esModule
|
||
? function () {
|
||
return n.default;
|
||
}
|
||
: function () {
|
||
return n;
|
||
};
|
||
return i.d(r, "a", r), r;
|
||
}),
|
||
(i.o = function (n, r) {
|
||
return Object.prototype.hasOwnProperty.call(n, r);
|
||
}),
|
||
(i.p = ""),
|
||
i((i.s = 0))
|
||
);
|
||
})([
|
||
function (e, o, i) {
|
||
e.exports = i(1);
|
||
},
|
||
function (e, o, i) {
|
||
i.r(o),
|
||
i.d(o, "default", function () {
|
||
return n;
|
||
});
|
||
class n {
|
||
constructor() {
|
||
(this.nodes = { wrapper: null, content: null }),
|
||
(this.showed = !1),
|
||
(this.offsetTop = 10),
|
||
(this.offsetLeft = 10),
|
||
(this.offsetRight = 10),
|
||
(this.hidingDelay = 0),
|
||
(this.handleWindowScroll = () => {
|
||
this.showed && this.hide(!0);
|
||
}),
|
||
this.loadStyles(),
|
||
this.prepare(),
|
||
window.addEventListener("scroll", this.handleWindowScroll, {
|
||
passive: !0,
|
||
});
|
||
}
|
||
get CSS() {
|
||
return {
|
||
tooltip: "ct",
|
||
tooltipContent: "ct__content",
|
||
tooltipShown: "ct--shown",
|
||
placement: {
|
||
left: "ct--left",
|
||
bottom: "ct--bottom",
|
||
right: "ct--right",
|
||
top: "ct--top",
|
||
},
|
||
};
|
||
}
|
||
show(a, l, c) {
|
||
this.nodes.wrapper || this.prepare(),
|
||
this.hidingTimeout && clearTimeout(this.hidingTimeout);
|
||
const p = Object.assign(
|
||
{
|
||
placement: "bottom",
|
||
marginTop: 0,
|
||
marginLeft: 0,
|
||
marginRight: 0,
|
||
marginBottom: 0,
|
||
delay: 70,
|
||
hidingDelay: 0,
|
||
},
|
||
c,
|
||
);
|
||
if (
|
||
(p.hidingDelay && (this.hidingDelay = p.hidingDelay),
|
||
(this.nodes.content.innerHTML = ""),
|
||
typeof l == "string")
|
||
)
|
||
this.nodes.content.appendChild(document.createTextNode(l));
|
||
else {
|
||
if (!(l instanceof Node))
|
||
throw Error(
|
||
"[CodeX Tooltip] Wrong type of «content» passed. It should be an instance of Node or String. But " +
|
||
typeof l +
|
||
" given.",
|
||
);
|
||
this.nodes.content.appendChild(l);
|
||
}
|
||
switch (
|
||
(this.nodes.wrapper.classList.remove(
|
||
...Object.values(this.CSS.placement),
|
||
),
|
||
p.placement)
|
||
) {
|
||
case "top":
|
||
this.placeTop(a, p);
|
||
break;
|
||
case "left":
|
||
this.placeLeft(a, p);
|
||
break;
|
||
case "right":
|
||
this.placeRight(a, p);
|
||
break;
|
||
case "bottom":
|
||
default:
|
||
this.placeBottom(a, p);
|
||
}
|
||
p && p.delay
|
||
? (this.showingTimeout = setTimeout(() => {
|
||
this.nodes.wrapper.classList.add(this.CSS.tooltipShown),
|
||
(this.showed = !0);
|
||
}, p.delay))
|
||
: (this.nodes.wrapper.classList.add(this.CSS.tooltipShown),
|
||
(this.showed = !0));
|
||
}
|
||
hide(a = !1) {
|
||
if (this.hidingDelay && !a)
|
||
return (
|
||
this.hidingTimeout && clearTimeout(this.hidingTimeout),
|
||
void (this.hidingTimeout = setTimeout(() => {
|
||
this.hide(!0);
|
||
}, this.hidingDelay))
|
||
);
|
||
this.nodes.wrapper.classList.remove(this.CSS.tooltipShown),
|
||
(this.showed = !1),
|
||
this.showingTimeout && clearTimeout(this.showingTimeout);
|
||
}
|
||
onHover(a, l, c) {
|
||
a.addEventListener("mouseenter", () => {
|
||
this.show(a, l, c);
|
||
}),
|
||
a.addEventListener("mouseleave", () => {
|
||
this.hide();
|
||
});
|
||
}
|
||
destroy() {
|
||
this.nodes.wrapper.remove(),
|
||
window.removeEventListener("scroll", this.handleWindowScroll);
|
||
}
|
||
prepare() {
|
||
(this.nodes.wrapper = this.make("div", this.CSS.tooltip)),
|
||
(this.nodes.content = this.make("div", this.CSS.tooltipContent)),
|
||
this.append(this.nodes.wrapper, this.nodes.content),
|
||
this.append(document.body, this.nodes.wrapper);
|
||
}
|
||
loadStyles() {
|
||
const a = "codex-tooltips-style";
|
||
if (document.getElementById(a)) return;
|
||
const l = i(2),
|
||
c = this.make("style", null, {
|
||
textContent: l.toString(),
|
||
id: a,
|
||
});
|
||
this.prepend(document.head, c);
|
||
}
|
||
placeBottom(a, l) {
|
||
const c = a.getBoundingClientRect(),
|
||
p =
|
||
c.left + a.clientWidth / 2 - this.nodes.wrapper.offsetWidth / 2,
|
||
h = c.bottom + window.pageYOffset + this.offsetTop + l.marginTop;
|
||
this.applyPlacement("bottom", p, h);
|
||
}
|
||
placeTop(a, l) {
|
||
const c = a.getBoundingClientRect(),
|
||
p =
|
||
c.left + a.clientWidth / 2 - this.nodes.wrapper.offsetWidth / 2,
|
||
h =
|
||
c.top +
|
||
window.pageYOffset -
|
||
this.nodes.wrapper.clientHeight -
|
||
this.offsetTop;
|
||
this.applyPlacement("top", p, h);
|
||
}
|
||
placeLeft(a, l) {
|
||
const c = a.getBoundingClientRect(),
|
||
p =
|
||
c.left -
|
||
this.nodes.wrapper.offsetWidth -
|
||
this.offsetLeft -
|
||
l.marginLeft,
|
||
h =
|
||
c.top +
|
||
window.pageYOffset +
|
||
a.clientHeight / 2 -
|
||
this.nodes.wrapper.offsetHeight / 2;
|
||
this.applyPlacement("left", p, h);
|
||
}
|
||
placeRight(a, l) {
|
||
const c = a.getBoundingClientRect(),
|
||
p = c.right + this.offsetRight + l.marginRight,
|
||
h =
|
||
c.top +
|
||
window.pageYOffset +
|
||
a.clientHeight / 2 -
|
||
this.nodes.wrapper.offsetHeight / 2;
|
||
this.applyPlacement("right", p, h);
|
||
}
|
||
applyPlacement(a, l, c) {
|
||
this.nodes.wrapper.classList.add(this.CSS.placement[a]),
|
||
(this.nodes.wrapper.style.left = l + "px"),
|
||
(this.nodes.wrapper.style.top = c + "px");
|
||
}
|
||
make(a, l = null, c = {}) {
|
||
const p = document.createElement(a);
|
||
Array.isArray(l) ? p.classList.add(...l) : l && p.classList.add(l);
|
||
for (const h in c) c.hasOwnProperty(h) && (p[h] = c[h]);
|
||
return p;
|
||
}
|
||
append(a, l) {
|
||
Array.isArray(l)
|
||
? l.forEach((c) => a.appendChild(c))
|
||
: a.appendChild(l);
|
||
}
|
||
prepend(a, l) {
|
||
Array.isArray(l)
|
||
? (l = l.reverse()).forEach((c) => a.prepend(c))
|
||
: a.prepend(l);
|
||
}
|
||
}
|
||
},
|
||
function (e, o) {
|
||
e.exports = `.ct{z-index:999;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;-webkit-transition:opacity 50ms ease-in,-webkit-transform 70ms cubic-bezier(.215,.61,.355,1);transition:opacity 50ms ease-in,-webkit-transform 70ms cubic-bezier(.215,.61,.355,1);transition:opacity 50ms ease-in,transform 70ms cubic-bezier(.215,.61,.355,1);transition:opacity 50ms ease-in,transform 70ms cubic-bezier(.215,.61,.355,1),-webkit-transform 70ms cubic-bezier(.215,.61,.355,1);will-change:opacity,top,left;-webkit-box-shadow:0 8px 12px 0 rgba(29,32,43,.17),0 4px 5px -3px rgba(5,6,12,.49);box-shadow:0 8px 12px 0 rgba(29,32,43,.17),0 4px 5px -3px rgba(5,6,12,.49);border-radius:9px}.ct,.ct:before{position:absolute;top:0;left:0}.ct:before{content:"";bottom:0;right:0;background-color:#1d202b;z-index:-1;border-radius:4px}@supports(-webkit-mask-box-image:url("")){.ct:before{border-radius:0;-webkit-mask-box-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M10.71 0h2.58c3.02 0 4.64.42 6.1 1.2a8.18 8.18 0 013.4 3.4C23.6 6.07 24 7.7 24 10.71v2.58c0 3.02-.42 4.64-1.2 6.1a8.18 8.18 0 01-3.4 3.4c-1.47.8-3.1 1.21-6.11 1.21H10.7c-3.02 0-4.64-.42-6.1-1.2a8.18 8.18 0 01-3.4-3.4C.4 17.93 0 16.3 0 13.29V10.7c0-3.02.42-4.64 1.2-6.1a8.18 8.18 0 013.4-3.4C6.07.4 7.7 0 10.71 0z"/></svg>') 48% 41% 37.9% 53.3%}}@media (--mobile){.ct{display:none}}.ct__content{padding:6px 10px;color:#cdd1e0;font-size:12px;text-align:center;letter-spacing:.02em;line-height:1em}.ct:after{content:"";width:8px;height:8px;position:absolute;background-color:#1d202b;z-index:-1}.ct--bottom{-webkit-transform:translateY(5px);transform:translateY(5px)}.ct--bottom:after{top:-3px;left:50%;-webkit-transform:translateX(-50%) rotate(-45deg);transform:translateX(-50%) rotate(-45deg)}.ct--top{-webkit-transform:translateY(-5px);transform:translateY(-5px)}.ct--top:after{top:auto;bottom:-3px;left:50%;-webkit-transform:translateX(-50%) rotate(-45deg);transform:translateX(-50%) rotate(-45deg)}.ct--left{-webkit-transform:translateX(-5px);transform:translateX(-5px)}.ct--left:after{top:50%;left:auto;right:0;-webkit-transform:translate(41.6%,-50%) rotate(-45deg);transform:translate(41.6%,-50%) rotate(-45deg)}.ct--right{-webkit-transform:translateX(5px);transform:translateX(5px)}.ct--right:after{top:50%;left:0;-webkit-transform:translate(-41.6%,-50%) rotate(-45deg);transform:translate(-41.6%,-50%) rotate(-45deg)}.ct--shown{opacity:1;-webkit-transform:none;transform:none}`;
|
||
},
|
||
]).default;
|
||
});
|
||
})(_o);
|
||
const Ao = xt(Ot);
|
||
class jt {
|
||
constructor() {
|
||
this.lib = new Ao();
|
||
}
|
||
destroy() {
|
||
this.lib.destroy();
|
||
}
|
||
show(t, e, o) {
|
||
this.lib.show(t, e, o);
|
||
}
|
||
hide(t = !1) {
|
||
this.lib.hide(t);
|
||
}
|
||
onHover(t, e, o) {
|
||
this.lib.onHover(t, e, o);
|
||
}
|
||
}
|
||
class Lo extends T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
super({ config: t, eventsDispatcher: e }), (this.tooltip = new jt());
|
||
}
|
||
destroy() {
|
||
this.tooltip.destroy();
|
||
}
|
||
get methods() {
|
||
return {
|
||
show: (t, e, o) => this.show(t, e, o),
|
||
hide: () => this.hide(),
|
||
onHover: (t, e, o) => this.onHover(t, e, o),
|
||
};
|
||
}
|
||
show(t, e, o) {
|
||
this.tooltip.show(t, e, o);
|
||
}
|
||
hide() {
|
||
this.tooltip.hide();
|
||
}
|
||
onHover(t, e, o) {
|
||
this.tooltip.onHover(t, e, o);
|
||
}
|
||
}
|
||
class Oo extends T {
|
||
get methods() {
|
||
return { nodes: this.editorNodes };
|
||
}
|
||
get editorNodes() {
|
||
return {
|
||
wrapper: this.Editor.UI.nodes.wrapper,
|
||
redactor: this.Editor.UI.nodes.redactor,
|
||
};
|
||
}
|
||
}
|
||
function ge(s, t) {
|
||
const e = {};
|
||
return (
|
||
Object.entries(s).forEach(([o, i]) => {
|
||
if (z(i)) {
|
||
const n = t ? `${t}.${o}` : o;
|
||
Object.values(i).every((r) => J(r)) ? (e[o] = n) : (e[o] = ge(i, n));
|
||
return;
|
||
}
|
||
e[o] = i;
|
||
}),
|
||
e
|
||
);
|
||
}
|
||
const X = ge(ce);
|
||
function No(s, t) {
|
||
const e = {};
|
||
return (
|
||
Object.keys(s).forEach((o) => {
|
||
const i = t[o];
|
||
i !== void 0 ? (e[i] = s[o]) : (e[o] = s[o]);
|
||
}),
|
||
e
|
||
);
|
||
}
|
||
const Do =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M9 12L9 7.1C9 7.04477 9.04477 7 9.1 7H10.4C11.5 7 14 7.1 14 9.5C14 9.5 14 12 11 12M9 12V16.8C9 16.9105 9.08954 17 9.2 17H12.5C14 17 15 16 15 14.5C15 11.7046 11 12 11 12M9 12H11"/></svg>',
|
||
me =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M7 10L11.8586 14.8586C11.9367 14.9367 12.0633 14.9367 12.1414 14.8586L17 10"/></svg>',
|
||
Ro =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M7 15L11.8586 10.1414C11.9367 10.0633 12.0633 10.0633 12.1414 10.1414L17 15"/></svg>',
|
||
Po =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M8 8L12 12M12 12L16 16M12 12L16 8M12 12L8 16"/></svg>',
|
||
Fo =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4" stroke="currentColor" stroke-width="2"/></svg>',
|
||
Ho =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M13.34 10C12.4223 12.7337 11 17 11 17"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M14.21 7H14.2"/></svg>',
|
||
ee =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M7.69998 12.6L7.67896 12.62C6.53993 13.7048 6.52012 15.5155 7.63516 16.625V16.625C8.72293 17.7073 10.4799 17.7102 11.5712 16.6314L13.0263 15.193C14.0703 14.1609 14.2141 12.525 13.3662 11.3266L13.22 11.12"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M16.22 11.12L16.3564 10.9805C17.2895 10.0265 17.3478 8.5207 16.4914 7.49733V7.49733C15.5691 6.39509 13.9269 6.25143 12.8271 7.17675L11.3901 8.38588C10.0935 9.47674 9.95706 11.4241 11.0888 12.6852L11.12 12.72"/></svg>',
|
||
jo =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M9.40999 7.29999H9.4"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M14.6 7.29999H14.59"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M9.30999 12H9.3"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M14.6 12H14.59"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M9.40999 16.7H9.4"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2.6" d="M14.6 16.7H14.59"/></svg>',
|
||
zo =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M12 7V12M12 17V12M17 12H12M12 12H7"/></svg>',
|
||
Uo =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><circle cx="10.5" cy="10.5" r="5.5" stroke="currentColor" stroke-width="2"/><line x1="15.4142" x2="19" y1="15" y2="18.5858" stroke="currentColor" stroke-linecap="round" stroke-width="2"/></svg>',
|
||
$o =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M15.7795 11.5C15.7795 11.5 16.053 11.1962 16.5497 10.6722C17.4442 9.72856 17.4701 8.2475 16.5781 7.30145V7.30145C15.6482 6.31522 14.0873 6.29227 13.1288 7.25073L11.8796 8.49999"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M8.24517 12.3883C8.24517 12.3883 7.97171 12.6922 7.47504 13.2161C6.58051 14.1598 6.55467 15.6408 7.44666 16.5869V16.5869C8.37653 17.5731 9.93744 17.5961 10.8959 16.6376L12.1452 15.3883"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M17.7802 15.1032L16.597 14.9422C16.0109 14.8624 15.4841 15.3059 15.4627 15.8969L15.4199 17.0818"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M6.39064 9.03238L7.58432 9.06668C8.17551 9.08366 8.6522 8.58665 8.61056 7.99669L8.5271 6.81397"/><line x1="12.1142" x2="11.7" y1="12.2" y2="11.7858" stroke="currentColor" stroke-linecap="round" stroke-width="2"/></svg>',
|
||
Wo =
|
||
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><rect width="14" height="14" x="5" y="5" stroke="currentColor" stroke-width="2" rx="4"/><line x1="12" x2="12" y1="9" y2="12" stroke="currentColor" stroke-linecap="round" stroke-width="2"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M12 15.02V15.01"/></svg>';
|
||
class P {
|
||
constructor(t) {
|
||
(this.nodes = { root: null, icon: null }),
|
||
(this.confirmationState = null),
|
||
(this.removeSpecialFocusBehavior = () => {
|
||
this.nodes.root.classList.remove(P.CSS.noFocus);
|
||
}),
|
||
(this.removeSpecialHoverBehavior = () => {
|
||
this.nodes.root.classList.remove(P.CSS.noHover);
|
||
}),
|
||
(this.onErrorAnimationEnd = () => {
|
||
this.nodes.icon.classList.remove(P.CSS.wobbleAnimation),
|
||
this.nodes.icon.removeEventListener(
|
||
"animationend",
|
||
this.onErrorAnimationEnd,
|
||
);
|
||
}),
|
||
(this.params = t),
|
||
(this.nodes.root = this.make(t));
|
||
}
|
||
get isDisabled() {
|
||
return this.params.isDisabled;
|
||
}
|
||
get toggle() {
|
||
return this.params.toggle;
|
||
}
|
||
get title() {
|
||
return this.params.title;
|
||
}
|
||
get closeOnActivate() {
|
||
return this.params.closeOnActivate;
|
||
}
|
||
get isConfirmationStateEnabled() {
|
||
return this.confirmationState !== null;
|
||
}
|
||
get isFocused() {
|
||
return this.nodes.root.classList.contains(P.CSS.focused);
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
container: "ce-popover-item",
|
||
title: "ce-popover-item__title",
|
||
secondaryTitle: "ce-popover-item__secondary-title",
|
||
icon: "ce-popover-item__icon",
|
||
active: "ce-popover-item--active",
|
||
disabled: "ce-popover-item--disabled",
|
||
focused: "ce-popover-item--focused",
|
||
hidden: "ce-popover-item--hidden",
|
||
confirmationState: "ce-popover-item--confirmation",
|
||
noHover: "ce-popover-item--no-hover",
|
||
noFocus: "ce-popover-item--no-focus",
|
||
wobbleAnimation: "wobble",
|
||
};
|
||
}
|
||
getElement() {
|
||
return this.nodes.root;
|
||
}
|
||
handleClick() {
|
||
if (this.isConfirmationStateEnabled) {
|
||
this.activateOrEnableConfirmationMode(this.confirmationState);
|
||
return;
|
||
}
|
||
this.activateOrEnableConfirmationMode(this.params);
|
||
}
|
||
toggleActive(t) {
|
||
this.nodes.root.classList.toggle(P.CSS.active, t);
|
||
}
|
||
toggleHidden(t) {
|
||
this.nodes.root.classList.toggle(P.CSS.hidden, t);
|
||
}
|
||
reset() {
|
||
this.isConfirmationStateEnabled && this.disableConfirmationMode();
|
||
}
|
||
onFocus() {
|
||
this.disableSpecialHoverAndFocusBehavior();
|
||
}
|
||
make(t) {
|
||
const e = d.make("div", P.CSS.container);
|
||
return (
|
||
t.name && (e.dataset.itemName = t.name),
|
||
(this.nodes.icon = d.make("div", P.CSS.icon, {
|
||
innerHTML: t.icon || Fo,
|
||
})),
|
||
e.appendChild(this.nodes.icon),
|
||
e.appendChild(d.make("div", P.CSS.title, { innerHTML: t.title || "" })),
|
||
t.secondaryLabel &&
|
||
e.appendChild(
|
||
d.make("div", P.CSS.secondaryTitle, {
|
||
textContent: t.secondaryLabel,
|
||
}),
|
||
),
|
||
t.isActive && e.classList.add(P.CSS.active),
|
||
t.isDisabled && e.classList.add(P.CSS.disabled),
|
||
e
|
||
);
|
||
}
|
||
enableConfirmationMode(t) {
|
||
const e = { ...this.params, ...t, confirmation: t.confirmation },
|
||
o = this.make(e);
|
||
(this.nodes.root.innerHTML = o.innerHTML),
|
||
this.nodes.root.classList.add(P.CSS.confirmationState),
|
||
(this.confirmationState = t),
|
||
this.enableSpecialHoverAndFocusBehavior();
|
||
}
|
||
disableConfirmationMode() {
|
||
const t = this.make(this.params);
|
||
(this.nodes.root.innerHTML = t.innerHTML),
|
||
this.nodes.root.classList.remove(P.CSS.confirmationState),
|
||
(this.confirmationState = null),
|
||
this.disableSpecialHoverAndFocusBehavior();
|
||
}
|
||
enableSpecialHoverAndFocusBehavior() {
|
||
this.nodes.root.classList.add(P.CSS.noHover),
|
||
this.nodes.root.classList.add(P.CSS.noFocus),
|
||
this.nodes.root.addEventListener(
|
||
"mouseleave",
|
||
this.removeSpecialHoverBehavior,
|
||
{ once: !0 },
|
||
);
|
||
}
|
||
disableSpecialHoverAndFocusBehavior() {
|
||
this.removeSpecialFocusBehavior(),
|
||
this.removeSpecialHoverBehavior(),
|
||
this.nodes.root.removeEventListener(
|
||
"mouseleave",
|
||
this.removeSpecialHoverBehavior,
|
||
);
|
||
}
|
||
activateOrEnableConfirmationMode(t) {
|
||
if (t.confirmation === void 0)
|
||
try {
|
||
t.onActivate(t), this.disableConfirmationMode();
|
||
} catch {
|
||
this.animateError();
|
||
}
|
||
else this.enableConfirmationMode(t.confirmation);
|
||
}
|
||
animateError() {
|
||
this.nodes.icon.classList.contains(P.CSS.wobbleAnimation) ||
|
||
(this.nodes.icon.classList.add(P.CSS.wobbleAnimation),
|
||
this.nodes.icon.addEventListener(
|
||
"animationend",
|
||
this.onErrorAnimationEnd,
|
||
));
|
||
}
|
||
}
|
||
const ht = class {
|
||
constructor(s, t) {
|
||
(this.cursor = -1),
|
||
(this.items = []),
|
||
(this.items = s || []),
|
||
(this.focusedCssClass = t);
|
||
}
|
||
get currentItem() {
|
||
return this.cursor === -1 ? null : this.items[this.cursor];
|
||
}
|
||
setCursor(s) {
|
||
s < this.items.length &&
|
||
s >= -1 &&
|
||
(this.dropCursor(),
|
||
(this.cursor = s),
|
||
this.items[this.cursor].classList.add(this.focusedCssClass));
|
||
}
|
||
setItems(s) {
|
||
this.items = s;
|
||
}
|
||
next() {
|
||
this.cursor = this.leafNodesAndReturnIndex(ht.directions.RIGHT);
|
||
}
|
||
previous() {
|
||
this.cursor = this.leafNodesAndReturnIndex(ht.directions.LEFT);
|
||
}
|
||
dropCursor() {
|
||
this.cursor !== -1 &&
|
||
(this.items[this.cursor].classList.remove(this.focusedCssClass),
|
||
(this.cursor = -1));
|
||
}
|
||
leafNodesAndReturnIndex(s) {
|
||
if (this.items.length === 0) return this.cursor;
|
||
let t = this.cursor;
|
||
return (
|
||
t === -1
|
||
? (t = s === ht.directions.RIGHT ? -1 : 0)
|
||
: this.items[t].classList.remove(this.focusedCssClass),
|
||
s === ht.directions.RIGHT
|
||
? (t = (t + 1) % this.items.length)
|
||
: (t = (this.items.length + t - 1) % this.items.length),
|
||
d.canSetCaret(this.items[t]) &&
|
||
rt(() => b.setCursor(this.items[t]), 50)(),
|
||
this.items[t].classList.add(this.focusedCssClass),
|
||
t
|
||
);
|
||
}
|
||
};
|
||
let nt = ht;
|
||
nt.directions = { RIGHT: "right", LEFT: "left" };
|
||
class G {
|
||
constructor(t) {
|
||
(this.iterator = null),
|
||
(this.activated = !1),
|
||
(this.flipCallbacks = []),
|
||
(this.onKeyDown = (e) => {
|
||
if (this.isEventReadyForHandling(e))
|
||
switch (
|
||
(G.usedKeys.includes(e.keyCode) && e.preventDefault(), e.keyCode)
|
||
) {
|
||
case E.TAB:
|
||
this.handleTabPress(e);
|
||
break;
|
||
case E.LEFT:
|
||
case E.UP:
|
||
this.flipLeft();
|
||
break;
|
||
case E.RIGHT:
|
||
case E.DOWN:
|
||
this.flipRight();
|
||
break;
|
||
case E.ENTER:
|
||
this.handleEnterPress(e);
|
||
break;
|
||
}
|
||
}),
|
||
(this.iterator = new nt(t.items, t.focusedItemClass)),
|
||
(this.activateCallback = t.activateCallback),
|
||
(this.allowedKeys = t.allowedKeys || G.usedKeys);
|
||
}
|
||
get isActivated() {
|
||
return this.activated;
|
||
}
|
||
static get usedKeys() {
|
||
return [E.TAB, E.LEFT, E.RIGHT, E.ENTER, E.UP, E.DOWN];
|
||
}
|
||
activate(t, e) {
|
||
(this.activated = !0),
|
||
t && this.iterator.setItems(t),
|
||
e !== void 0 && this.iterator.setCursor(e),
|
||
document.addEventListener("keydown", this.onKeyDown, !0);
|
||
}
|
||
deactivate() {
|
||
(this.activated = !1),
|
||
this.dropCursor(),
|
||
document.removeEventListener("keydown", this.onKeyDown);
|
||
}
|
||
focusFirst() {
|
||
this.dropCursor(), this.flipRight();
|
||
}
|
||
flipLeft() {
|
||
this.iterator.previous(), this.flipCallback();
|
||
}
|
||
flipRight() {
|
||
this.iterator.next(), this.flipCallback();
|
||
}
|
||
hasFocus() {
|
||
return !!this.iterator.currentItem;
|
||
}
|
||
onFlip(t) {
|
||
this.flipCallbacks.push(t);
|
||
}
|
||
removeOnFlip(t) {
|
||
this.flipCallbacks = this.flipCallbacks.filter((e) => e !== t);
|
||
}
|
||
dropCursor() {
|
||
this.iterator.dropCursor();
|
||
}
|
||
isEventReadyForHandling(t) {
|
||
return this.activated && this.allowedKeys.includes(t.keyCode);
|
||
}
|
||
handleTabPress(t) {
|
||
switch (t.shiftKey ? nt.directions.LEFT : nt.directions.RIGHT) {
|
||
case nt.directions.RIGHT:
|
||
this.flipRight();
|
||
break;
|
||
case nt.directions.LEFT:
|
||
this.flipLeft();
|
||
break;
|
||
}
|
||
}
|
||
handleEnterPress(t) {
|
||
this.activated &&
|
||
(this.iterator.currentItem &&
|
||
(t.stopPropagation(),
|
||
t.preventDefault(),
|
||
this.iterator.currentItem.click()),
|
||
R(this.activateCallback) &&
|
||
this.activateCallback(this.iterator.currentItem));
|
||
}
|
||
flipCallback() {
|
||
this.iterator.currentItem &&
|
||
this.iterator.currentItem.scrollIntoViewIfNeeded(),
|
||
this.flipCallbacks.forEach((t) => t());
|
||
}
|
||
}
|
||
class ut {
|
||
static get CSS() {
|
||
return {
|
||
wrapper: "cdx-search-field",
|
||
icon: "cdx-search-field__icon",
|
||
input: "cdx-search-field__input",
|
||
};
|
||
}
|
||
constructor({ items: t, onSearch: e, placeholder: o }) {
|
||
(this.listeners = new Pt()),
|
||
(this.items = t),
|
||
(this.onSearch = e),
|
||
this.render(o);
|
||
}
|
||
getElement() {
|
||
return this.wrapper;
|
||
}
|
||
focus() {
|
||
this.input.focus();
|
||
}
|
||
clear() {
|
||
(this.input.value = ""),
|
||
(this.searchQuery = ""),
|
||
this.onSearch("", this.foundItems);
|
||
}
|
||
destroy() {
|
||
this.listeners.removeAll();
|
||
}
|
||
render(t) {
|
||
this.wrapper = d.make("div", ut.CSS.wrapper);
|
||
const e = d.make("div", ut.CSS.icon, { innerHTML: Uo });
|
||
(this.input = d.make("input", ut.CSS.input, { placeholder: t })),
|
||
this.wrapper.appendChild(e),
|
||
this.wrapper.appendChild(this.input),
|
||
this.listeners.on(this.input, "input", () => {
|
||
(this.searchQuery = this.input.value),
|
||
this.onSearch(this.searchQuery, this.foundItems);
|
||
});
|
||
}
|
||
get foundItems() {
|
||
return this.items.filter((t) => this.checkItem(t));
|
||
}
|
||
checkItem(t) {
|
||
var e;
|
||
const o = ((e = t.title) == null ? void 0 : e.toLowerCase()) || "",
|
||
i = this.searchQuery.toLowerCase();
|
||
return o.includes(i);
|
||
}
|
||
}
|
||
const pt = class {
|
||
lock() {
|
||
Qt ? this.lockHard() : document.body.classList.add(pt.CSS.scrollLocked);
|
||
}
|
||
unlock() {
|
||
Qt
|
||
? this.unlockHard()
|
||
: document.body.classList.remove(pt.CSS.scrollLocked);
|
||
}
|
||
lockHard() {
|
||
(this.scrollPosition = window.pageYOffset),
|
||
document.documentElement.style.setProperty(
|
||
"--window-scroll-offset",
|
||
`${this.scrollPosition}px`,
|
||
),
|
||
document.body.classList.add(pt.CSS.scrollLockedHard);
|
||
}
|
||
unlockHard() {
|
||
document.body.classList.remove(pt.CSS.scrollLockedHard),
|
||
this.scrollPosition !== null && window.scrollTo(0, this.scrollPosition),
|
||
(this.scrollPosition = null);
|
||
}
|
||
};
|
||
let be = pt;
|
||
be.CSS = {
|
||
scrollLocked: "ce-scroll-locked",
|
||
scrollLockedHard: "ce-scroll-locked--hard",
|
||
};
|
||
var Yo = Object.defineProperty,
|
||
Ko = Object.getOwnPropertyDescriptor,
|
||
Xo = (s, t, e, o) => {
|
||
for (
|
||
var i = o > 1 ? void 0 : o ? Ko(t, e) : t, n = s.length - 1, r;
|
||
n >= 0;
|
||
n--
|
||
)
|
||
(r = s[n]) && (i = (o ? r(t, e, i) : r(i)) || i);
|
||
return o && i && Yo(t, e, i), i;
|
||
},
|
||
gt = ((s) => ((s.Close = "close"), s))(gt || {});
|
||
const j = class extends wt {
|
||
constructor(s) {
|
||
super(),
|
||
(this.scopeElement = document.body),
|
||
(this.listeners = new Pt()),
|
||
(this.scrollLocker = new be()),
|
||
(this.nodes = {
|
||
wrapper: null,
|
||
popover: null,
|
||
nothingFoundMessage: null,
|
||
customContent: null,
|
||
items: null,
|
||
overlay: null,
|
||
}),
|
||
(this.messages = { nothingFound: "Nothing found", search: "Search" }),
|
||
(this.onFlip = () => {
|
||
this.items.find((t) => t.isFocused).onFocus();
|
||
}),
|
||
(this.items = s.items.map((t) => new P(t))),
|
||
s.scopeElement !== void 0 && (this.scopeElement = s.scopeElement),
|
||
s.messages && (this.messages = { ...this.messages, ...s.messages }),
|
||
s.customContentFlippableItems &&
|
||
(this.customContentFlippableItems = s.customContentFlippableItems),
|
||
this.make(),
|
||
s.customContent && this.addCustomContent(s.customContent),
|
||
s.searchable && this.addSearch(),
|
||
this.initializeFlipper();
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
popover: "ce-popover",
|
||
popoverOpenTop: "ce-popover--open-top",
|
||
popoverOpened: "ce-popover--opened",
|
||
search: "ce-popover__search",
|
||
nothingFoundMessage: "ce-popover__nothing-found-message",
|
||
nothingFoundMessageDisplayed:
|
||
"ce-popover__nothing-found-message--displayed",
|
||
customContent: "ce-popover__custom-content",
|
||
customContentHidden: "ce-popover__custom-content--hidden",
|
||
items: "ce-popover__items",
|
||
overlay: "ce-popover__overlay",
|
||
overlayHidden: "ce-popover__overlay--hidden",
|
||
};
|
||
}
|
||
getElement() {
|
||
return this.nodes.wrapper;
|
||
}
|
||
hasFocus() {
|
||
return this.flipper.hasFocus();
|
||
}
|
||
show() {
|
||
this.shouldOpenBottom ||
|
||
(this.nodes.popover.style.setProperty(
|
||
"--popover-height",
|
||
this.height + "px",
|
||
),
|
||
this.nodes.popover.classList.add(j.CSS.popoverOpenTop)),
|
||
this.nodes.overlay.classList.remove(j.CSS.overlayHidden),
|
||
this.nodes.popover.classList.add(j.CSS.popoverOpened),
|
||
this.flipper.activate(this.flippableElements),
|
||
this.search !== void 0 &&
|
||
setTimeout(() => {
|
||
this.search.focus();
|
||
}, 100),
|
||
et() && this.scrollLocker.lock();
|
||
}
|
||
hide() {
|
||
this.nodes.popover.classList.remove(j.CSS.popoverOpened),
|
||
this.nodes.popover.classList.remove(j.CSS.popoverOpenTop),
|
||
this.nodes.overlay.classList.add(j.CSS.overlayHidden),
|
||
this.flipper.deactivate(),
|
||
this.items.forEach((s) => s.reset()),
|
||
this.search !== void 0 && this.search.clear(),
|
||
et() && this.scrollLocker.unlock(),
|
||
this.emit("close");
|
||
}
|
||
destroy() {
|
||
this.flipper.deactivate(),
|
||
this.listeners.removeAll(),
|
||
et() && this.scrollLocker.unlock();
|
||
}
|
||
make() {
|
||
(this.nodes.popover = d.make("div", [j.CSS.popover])),
|
||
(this.nodes.nothingFoundMessage = d.make(
|
||
"div",
|
||
[j.CSS.nothingFoundMessage],
|
||
{ textContent: this.messages.nothingFound },
|
||
)),
|
||
this.nodes.popover.appendChild(this.nodes.nothingFoundMessage),
|
||
(this.nodes.items = d.make("div", [j.CSS.items])),
|
||
this.items.forEach((s) => {
|
||
this.nodes.items.appendChild(s.getElement());
|
||
}),
|
||
this.nodes.popover.appendChild(this.nodes.items),
|
||
this.listeners.on(this.nodes.popover, "click", (s) => {
|
||
const t = this.getTargetItem(s);
|
||
t !== void 0 && this.handleItemClick(t);
|
||
}),
|
||
(this.nodes.wrapper = d.make("div")),
|
||
(this.nodes.overlay = d.make("div", [
|
||
j.CSS.overlay,
|
||
j.CSS.overlayHidden,
|
||
])),
|
||
this.listeners.on(this.nodes.overlay, "click", () => {
|
||
this.hide();
|
||
}),
|
||
this.nodes.wrapper.appendChild(this.nodes.overlay),
|
||
this.nodes.wrapper.appendChild(this.nodes.popover);
|
||
}
|
||
addSearch() {
|
||
this.search = new ut({
|
||
items: this.items,
|
||
placeholder: this.messages.search,
|
||
onSearch: (t, e) => {
|
||
this.items.forEach((i) => {
|
||
const n = !e.includes(i);
|
||
i.toggleHidden(n);
|
||
}),
|
||
this.toggleNothingFoundMessage(e.length === 0),
|
||
this.toggleCustomContent(t !== "");
|
||
const o =
|
||
t === "" ? this.flippableElements : e.map((i) => i.getElement());
|
||
this.flipper.isActivated &&
|
||
(this.flipper.deactivate(), this.flipper.activate(o));
|
||
},
|
||
});
|
||
const s = this.search.getElement();
|
||
s.classList.add(j.CSS.search),
|
||
this.nodes.popover.insertBefore(s, this.nodes.popover.firstChild);
|
||
}
|
||
addCustomContent(s) {
|
||
(this.nodes.customContent = s),
|
||
this.nodes.customContent.classList.add(j.CSS.customContent),
|
||
this.nodes.popover.insertBefore(s, this.nodes.popover.firstChild);
|
||
}
|
||
getTargetItem(s) {
|
||
return this.items.find((t) => s.composedPath().includes(t.getElement()));
|
||
}
|
||
handleItemClick(s) {
|
||
s.isDisabled ||
|
||
(this.items.filter((t) => t !== s).forEach((t) => t.reset()),
|
||
s.handleClick(),
|
||
this.toggleItemActivenessIfNeeded(s),
|
||
s.closeOnActivate && this.hide());
|
||
}
|
||
initializeFlipper() {
|
||
(this.flipper = new G({
|
||
items: this.flippableElements,
|
||
focusedItemClass: P.CSS.focused,
|
||
allowedKeys: [E.TAB, E.UP, E.DOWN, E.ENTER],
|
||
})),
|
||
this.flipper.onFlip(this.onFlip);
|
||
}
|
||
get flippableElements() {
|
||
const s = this.items.map((t) => t.getElement());
|
||
return (this.customContentFlippableItems || []).concat(s);
|
||
}
|
||
get height() {
|
||
let s = 0;
|
||
if (this.nodes.popover === null) return s;
|
||
const t = this.nodes.popover.cloneNode(!0);
|
||
return (
|
||
(t.style.visibility = "hidden"),
|
||
(t.style.position = "absolute"),
|
||
(t.style.top = "-1000px"),
|
||
t.classList.add(j.CSS.popoverOpened),
|
||
document.body.appendChild(t),
|
||
(s = t.offsetHeight),
|
||
t.remove(),
|
||
s
|
||
);
|
||
}
|
||
get shouldOpenBottom() {
|
||
const s = this.nodes.popover.getBoundingClientRect(),
|
||
t = this.scopeElement.getBoundingClientRect(),
|
||
e = this.height,
|
||
o = s.top + e,
|
||
i = s.top - e,
|
||
n = Math.min(window.innerHeight, t.bottom);
|
||
return i < t.top || o <= n;
|
||
}
|
||
toggleNothingFoundMessage(s) {
|
||
this.nodes.nothingFoundMessage.classList.toggle(
|
||
j.CSS.nothingFoundMessageDisplayed,
|
||
s,
|
||
);
|
||
}
|
||
toggleCustomContent(s) {
|
||
var t;
|
||
(t = this.nodes.customContent) == null ||
|
||
t.classList.toggle(j.CSS.customContentHidden, s);
|
||
}
|
||
toggleItemActivenessIfNeeded(s) {
|
||
if ((s.toggle === !0 && s.toggleActive(), typeof s.toggle == "string")) {
|
||
const t = this.items.filter((e) => e.toggle === s.toggle);
|
||
if (t.length === 1) {
|
||
s.toggleActive();
|
||
return;
|
||
}
|
||
t.forEach((e) => {
|
||
e.toggleActive(e === s);
|
||
});
|
||
}
|
||
}
|
||
};
|
||
let zt = j;
|
||
Xo([ct], zt.prototype, "height", 1);
|
||
class Vo extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.opened = !1),
|
||
(this.selection = new b()),
|
||
(this.onPopoverClose = () => {
|
||
this.close();
|
||
});
|
||
}
|
||
get events() {
|
||
return { opened: "block-settings-opened", closed: "block-settings-closed" };
|
||
}
|
||
get CSS() {
|
||
return { settings: "ce-settings" };
|
||
}
|
||
get flipper() {
|
||
var t;
|
||
return (t = this.popover) == null ? void 0 : t.flipper;
|
||
}
|
||
make() {
|
||
this.nodes.wrapper = d.make("div", [this.CSS.settings]);
|
||
}
|
||
destroy() {
|
||
this.removeAllNodes();
|
||
}
|
||
open(t = this.Editor.BlockManager.currentBlock) {
|
||
(this.opened = !0),
|
||
this.selection.save(),
|
||
(t.selected = !0),
|
||
this.Editor.BlockSelection.clearCache();
|
||
const [e, o] = t.getTunes();
|
||
this.eventsDispatcher.emit(this.events.opened),
|
||
(this.popover = new zt({
|
||
searchable: !0,
|
||
items: e.map((i) => this.resolveTuneAliases(i)),
|
||
customContent: o,
|
||
customContentFlippableItems: this.getControls(o),
|
||
scopeElement: this.Editor.API.methods.ui.nodes.redactor,
|
||
messages: {
|
||
nothingFound: $.ui(X.ui.popover, "Nothing found"),
|
||
search: $.ui(X.ui.popover, "Filter"),
|
||
},
|
||
})),
|
||
this.popover.on(gt.Close, this.onPopoverClose),
|
||
this.nodes.wrapper.append(this.popover.getElement()),
|
||
this.popover.show();
|
||
}
|
||
getElement() {
|
||
return this.nodes.wrapper;
|
||
}
|
||
close() {
|
||
(this.opened = !1),
|
||
b.isAtEditor || this.selection.restore(),
|
||
this.selection.clearSaved(),
|
||
!this.Editor.CrossBlockSelection.isCrossBlockSelectionStarted &&
|
||
this.Editor.BlockManager.currentBlock &&
|
||
(this.Editor.BlockManager.currentBlock.selected = !1),
|
||
this.eventsDispatcher.emit(this.events.closed),
|
||
this.popover &&
|
||
(this.popover.off(gt.Close, this.onPopoverClose),
|
||
this.popover.destroy(),
|
||
this.popover.getElement().remove(),
|
||
(this.popover = null));
|
||
}
|
||
getControls(t) {
|
||
const { StylesAPI: e } = this.Editor,
|
||
o = t.querySelectorAll(
|
||
`.${e.classes.settingsButton}, ${d.allInputsSelector}`,
|
||
);
|
||
return Array.from(o);
|
||
}
|
||
resolveTuneAliases(t) {
|
||
const e = No(t, { label: "title" });
|
||
return (
|
||
t.confirmation &&
|
||
(e.confirmation = this.resolveTuneAliases(t.confirmation)),
|
||
e
|
||
);
|
||
}
|
||
}
|
||
class Y extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.opened = !1),
|
||
(this.tools = []),
|
||
(this.flipper = null),
|
||
(this.togglingCallback = null);
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
conversionToolbarWrapper: "ce-conversion-toolbar",
|
||
conversionToolbarShowed: "ce-conversion-toolbar--showed",
|
||
conversionToolbarTools: "ce-conversion-toolbar__tools",
|
||
conversionToolbarLabel: "ce-conversion-toolbar__label",
|
||
conversionTool: "ce-conversion-tool",
|
||
conversionToolHidden: "ce-conversion-tool--hidden",
|
||
conversionToolIcon: "ce-conversion-tool__icon",
|
||
conversionToolSecondaryLabel: "ce-conversion-tool__secondary-label",
|
||
conversionToolFocused: "ce-conversion-tool--focused",
|
||
conversionToolActive: "ce-conversion-tool--active",
|
||
};
|
||
}
|
||
make() {
|
||
(this.nodes.wrapper = d.make("div", [
|
||
Y.CSS.conversionToolbarWrapper,
|
||
...(this.isRtl ? [this.Editor.UI.CSS.editorRtlFix] : []),
|
||
])),
|
||
(this.nodes.tools = d.make("div", Y.CSS.conversionToolbarTools));
|
||
const t = d.make("div", Y.CSS.conversionToolbarLabel, {
|
||
textContent: $.ui(X.ui.inlineToolbar.converter, "Convert to"),
|
||
});
|
||
return (
|
||
this.addTools(),
|
||
this.enableFlipper(),
|
||
d.append(this.nodes.wrapper, t),
|
||
d.append(this.nodes.wrapper, this.nodes.tools),
|
||
this.nodes.wrapper
|
||
);
|
||
}
|
||
destroy() {
|
||
this.flipper && (this.flipper.deactivate(), (this.flipper = null)),
|
||
this.removeAllNodes();
|
||
}
|
||
toggle(t) {
|
||
this.opened ? this.close() : this.open(),
|
||
R(t) && (this.togglingCallback = t);
|
||
}
|
||
open() {
|
||
this.filterTools(),
|
||
(this.opened = !0),
|
||
this.nodes.wrapper.classList.add(Y.CSS.conversionToolbarShowed),
|
||
window.requestAnimationFrame(() => {
|
||
this.flipper.activate(
|
||
this.tools
|
||
.map((t) => t.button)
|
||
.filter((t) => !t.classList.contains(Y.CSS.conversionToolHidden)),
|
||
),
|
||
this.flipper.focusFirst(),
|
||
R(this.togglingCallback) && this.togglingCallback(!0);
|
||
});
|
||
}
|
||
close() {
|
||
(this.opened = !1),
|
||
this.flipper.deactivate(),
|
||
this.nodes.wrapper.classList.remove(Y.CSS.conversionToolbarShowed),
|
||
R(this.togglingCallback) && this.togglingCallback(!1);
|
||
}
|
||
hasTools() {
|
||
return this.tools.length === 1
|
||
? this.tools[0].name !== this.config.defaultBlock
|
||
: !0;
|
||
}
|
||
async replaceWithBlock(t, e) {
|
||
const {
|
||
BlockManager: o,
|
||
BlockSelection: i,
|
||
InlineToolbar: n,
|
||
Caret: r,
|
||
} = this.Editor;
|
||
o.convert(this.Editor.BlockManager.currentBlock, t, e),
|
||
i.clearSelection(),
|
||
this.close(),
|
||
n.close(),
|
||
window.requestAnimationFrame(() => {
|
||
r.setToBlock(this.Editor.BlockManager.currentBlock, r.positions.END);
|
||
});
|
||
}
|
||
addTools() {
|
||
const t = this.Editor.Tools.blockTools;
|
||
Array.from(t.entries()).forEach(([e, o]) => {
|
||
var i;
|
||
const n = o.conversionConfig;
|
||
!n ||
|
||
!n.import ||
|
||
(i = o.toolbox) == null ||
|
||
i.forEach((r) => this.addToolIfValid(e, r));
|
||
});
|
||
}
|
||
addToolIfValid(t, e) {
|
||
V(e) || !e.icon || this.addTool(t, e);
|
||
}
|
||
addTool(t, e) {
|
||
var o;
|
||
const i = d.make("div", [Y.CSS.conversionTool]),
|
||
n = d.make("div", [Y.CSS.conversionToolIcon]);
|
||
(i.dataset.tool = t),
|
||
(n.innerHTML = e.icon),
|
||
d.append(i, n),
|
||
d.append(i, d.text($.t(X.toolNames, e.title || at(t))));
|
||
const r =
|
||
(o = this.Editor.Tools.blockTools.get(t)) == null ? void 0 : o.shortcut;
|
||
if (r) {
|
||
const a = d.make("span", Y.CSS.conversionToolSecondaryLabel, {
|
||
innerText: Rt(r),
|
||
});
|
||
d.append(i, a);
|
||
}
|
||
d.append(this.nodes.tools, i),
|
||
this.tools.push({ name: t, button: i, toolboxItem: e }),
|
||
this.listeners.on(i, "click", async () => {
|
||
await this.replaceWithBlock(t, e.data);
|
||
});
|
||
}
|
||
async filterTools() {
|
||
const { currentBlock: t } = this.Editor.BlockManager,
|
||
e = await t.getActiveToolboxEntry();
|
||
function o(i, n) {
|
||
return i.icon === n.icon && i.title === n.title;
|
||
}
|
||
this.tools.forEach((i) => {
|
||
let n = !1;
|
||
if (e) {
|
||
const r = o(e, i.toolboxItem);
|
||
n = i.button.dataset.tool === t.name && r;
|
||
}
|
||
(i.button.hidden = n),
|
||
i.button.classList.toggle(Y.CSS.conversionToolHidden, n);
|
||
});
|
||
}
|
||
enableFlipper() {
|
||
this.flipper = new G({ focusedItemClass: Y.CSS.conversionToolFocused });
|
||
}
|
||
}
|
||
var Nt = {},
|
||
qo = {
|
||
get exports() {
|
||
return Nt;
|
||
},
|
||
set exports(s) {
|
||
Nt = s;
|
||
},
|
||
};
|
||
/*!
|
||
* Library for handling keyboard shortcuts
|
||
* @copyright CodeX (https://codex.so)
|
||
* @license MIT
|
||
* @author CodeX (https://codex.so)
|
||
* @version 1.2.0
|
||
*/ (function (s, t) {
|
||
(function (e, o) {
|
||
s.exports = o();
|
||
})(window, function () {
|
||
return (function (e) {
|
||
var o = {};
|
||
function i(n) {
|
||
if (o[n]) return o[n].exports;
|
||
var r = (o[n] = { i: n, l: !1, exports: {} });
|
||
return e[n].call(r.exports, r, r.exports, i), (r.l = !0), r.exports;
|
||
}
|
||
return (
|
||
(i.m = e),
|
||
(i.c = o),
|
||
(i.d = function (n, r, a) {
|
||
i.o(n, r) || Object.defineProperty(n, r, { enumerable: !0, get: a });
|
||
}),
|
||
(i.r = function (n) {
|
||
typeof Symbol < "u" &&
|
||
Symbol.toStringTag &&
|
||
Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
|
||
Object.defineProperty(n, "__esModule", { value: !0 });
|
||
}),
|
||
(i.t = function (n, r) {
|
||
if (
|
||
(1 & r && (n = i(n)),
|
||
8 & r || (4 & r && typeof n == "object" && n && n.__esModule))
|
||
)
|
||
return n;
|
||
var a = Object.create(null);
|
||
if (
|
||
(i.r(a),
|
||
Object.defineProperty(a, "default", { enumerable: !0, value: n }),
|
||
2 & r && typeof n != "string")
|
||
)
|
||
for (var l in n)
|
||
i.d(
|
||
a,
|
||
l,
|
||
function (c) {
|
||
return n[c];
|
||
}.bind(null, l),
|
||
);
|
||
return a;
|
||
}),
|
||
(i.n = function (n) {
|
||
var r =
|
||
n && n.__esModule
|
||
? function () {
|
||
return n.default;
|
||
}
|
||
: function () {
|
||
return n;
|
||
};
|
||
return i.d(r, "a", r), r;
|
||
}),
|
||
(i.o = function (n, r) {
|
||
return Object.prototype.hasOwnProperty.call(n, r);
|
||
}),
|
||
(i.p = ""),
|
||
i((i.s = 0))
|
||
);
|
||
})([
|
||
function (e, o, i) {
|
||
function n(l, c) {
|
||
for (var p = 0; p < c.length; p++) {
|
||
var h = c[p];
|
||
(h.enumerable = h.enumerable || !1),
|
||
(h.configurable = !0),
|
||
"value" in h && (h.writable = !0),
|
||
Object.defineProperty(l, h.key, h);
|
||
}
|
||
}
|
||
function r(l, c, p) {
|
||
return c && n(l.prototype, c), p && n(l, p), l;
|
||
}
|
||
i.r(o);
|
||
var a = (function () {
|
||
function l(c) {
|
||
var p = this;
|
||
(function (h, f) {
|
||
if (!(h instanceof f))
|
||
throw new TypeError("Cannot call a class as a function");
|
||
})(this, l),
|
||
(this.commands = {}),
|
||
(this.keys = {}),
|
||
(this.name = c.name),
|
||
this.parseShortcutName(c.name),
|
||
(this.element = c.on),
|
||
(this.callback = c.callback),
|
||
(this.executeShortcut = function (h) {
|
||
p.execute(h);
|
||
}),
|
||
this.element.addEventListener(
|
||
"keydown",
|
||
this.executeShortcut,
|
||
!1,
|
||
);
|
||
}
|
||
return (
|
||
r(l, null, [
|
||
{
|
||
key: "supportedCommands",
|
||
get: function () {
|
||
return {
|
||
SHIFT: ["SHIFT"],
|
||
CMD: ["CMD", "CONTROL", "COMMAND", "WINDOWS", "CTRL"],
|
||
ALT: ["ALT", "OPTION"],
|
||
};
|
||
},
|
||
},
|
||
{
|
||
key: "keyCodes",
|
||
get: function () {
|
||
return {
|
||
0: 48,
|
||
1: 49,
|
||
2: 50,
|
||
3: 51,
|
||
4: 52,
|
||
5: 53,
|
||
6: 54,
|
||
7: 55,
|
||
8: 56,
|
||
9: 57,
|
||
A: 65,
|
||
B: 66,
|
||
C: 67,
|
||
D: 68,
|
||
E: 69,
|
||
F: 70,
|
||
G: 71,
|
||
H: 72,
|
||
I: 73,
|
||
J: 74,
|
||
K: 75,
|
||
L: 76,
|
||
M: 77,
|
||
N: 78,
|
||
O: 79,
|
||
P: 80,
|
||
Q: 81,
|
||
R: 82,
|
||
S: 83,
|
||
T: 84,
|
||
U: 85,
|
||
V: 86,
|
||
W: 87,
|
||
X: 88,
|
||
Y: 89,
|
||
Z: 90,
|
||
BACKSPACE: 8,
|
||
ENTER: 13,
|
||
ESCAPE: 27,
|
||
LEFT: 37,
|
||
UP: 38,
|
||
RIGHT: 39,
|
||
DOWN: 40,
|
||
INSERT: 45,
|
||
DELETE: 46,
|
||
".": 190,
|
||
};
|
||
},
|
||
},
|
||
]),
|
||
r(l, [
|
||
{
|
||
key: "parseShortcutName",
|
||
value: function (c) {
|
||
c = c.split("+");
|
||
for (var p = 0; p < c.length; p++) {
|
||
c[p] = c[p].toUpperCase();
|
||
var h = !1;
|
||
for (var f in l.supportedCommands)
|
||
if (l.supportedCommands[f].includes(c[p])) {
|
||
h = this.commands[f] = !0;
|
||
break;
|
||
}
|
||
h || (this.keys[c[p]] = !0);
|
||
}
|
||
for (var k in l.supportedCommands)
|
||
this.commands[k] || (this.commands[k] = !1);
|
||
},
|
||
},
|
||
{
|
||
key: "execute",
|
||
value: function (c) {
|
||
var p,
|
||
h = {
|
||
CMD: c.ctrlKey || c.metaKey,
|
||
SHIFT: c.shiftKey,
|
||
ALT: c.altKey,
|
||
},
|
||
f = !0;
|
||
for (p in this.commands)
|
||
this.commands[p] !== h[p] && (f = !1);
|
||
var k,
|
||
u = !0;
|
||
for (k in this.keys) u = u && c.keyCode === l.keyCodes[k];
|
||
f && u && this.callback(c);
|
||
},
|
||
},
|
||
{
|
||
key: "remove",
|
||
value: function () {
|
||
this.element.removeEventListener(
|
||
"keydown",
|
||
this.executeShortcut,
|
||
);
|
||
},
|
||
},
|
||
]),
|
||
l
|
||
);
|
||
})();
|
||
o.default = a;
|
||
},
|
||
]).default;
|
||
});
|
||
})(qo);
|
||
const Zo = xt(Nt);
|
||
class Go {
|
||
constructor() {
|
||
this.registeredShortcuts = new Map();
|
||
}
|
||
add(t) {
|
||
if (this.findShortcut(t.on, t.name))
|
||
throw Error(
|
||
`Shortcut ${t.name} is already registered for ${t.on}. Please remove it before add a new handler.`,
|
||
);
|
||
const e = new Zo({ name: t.name, on: t.on, callback: t.handler }),
|
||
o = this.registeredShortcuts.get(t.on) || [];
|
||
this.registeredShortcuts.set(t.on, [...o, e]);
|
||
}
|
||
remove(t, e) {
|
||
const o = this.findShortcut(t, e);
|
||
if (!o) return;
|
||
o.remove();
|
||
const i = this.registeredShortcuts.get(t);
|
||
this.registeredShortcuts.set(
|
||
t,
|
||
i.filter((n) => n !== o),
|
||
);
|
||
}
|
||
findShortcut(t, e) {
|
||
return (this.registeredShortcuts.get(t) || []).find(
|
||
({ name: o }) => o === e,
|
||
);
|
||
}
|
||
}
|
||
const lt = new Go();
|
||
var Jo = Object.defineProperty,
|
||
Qo = Object.getOwnPropertyDescriptor,
|
||
ke = (s, t, e, o) => {
|
||
for (
|
||
var i = o > 1 ? void 0 : o ? Qo(t, e) : t, n = s.length - 1, r;
|
||
n >= 0;
|
||
n--
|
||
)
|
||
(r = s[n]) && (i = (o ? r(t, e, i) : r(i)) || i);
|
||
return o && i && Jo(t, e, i), i;
|
||
},
|
||
bt = ((s) => (
|
||
(s.Opened = "toolbox-opened"),
|
||
(s.Closed = "toolbox-closed"),
|
||
(s.BlockAdded = "toolbox-block-added"),
|
||
s
|
||
))(bt || {});
|
||
const ve = class extends wt {
|
||
constructor({ api: s, tools: t, i18nLabels: e }) {
|
||
super(),
|
||
(this.opened = !1),
|
||
(this.nodes = { toolbox: null }),
|
||
(this.onPopoverClose = () => {
|
||
(this.opened = !1), this.emit("toolbox-closed");
|
||
}),
|
||
(this.api = s),
|
||
(this.tools = t),
|
||
(this.i18nLabels = e);
|
||
}
|
||
get isEmpty() {
|
||
return this.toolsToBeDisplayed.length === 0;
|
||
}
|
||
static get CSS() {
|
||
return { toolbox: "ce-toolbox" };
|
||
}
|
||
make() {
|
||
return (
|
||
(this.popover = new zt({
|
||
scopeElement: this.api.ui.nodes.redactor,
|
||
searchable: !0,
|
||
messages: {
|
||
nothingFound: this.i18nLabels.nothingFound,
|
||
search: this.i18nLabels.filter,
|
||
},
|
||
items: this.toolboxItemsToBeDisplayed,
|
||
})),
|
||
this.popover.on(gt.Close, this.onPopoverClose),
|
||
this.enableShortcuts(),
|
||
(this.nodes.toolbox = this.popover.getElement()),
|
||
this.nodes.toolbox.classList.add(ve.CSS.toolbox),
|
||
this.nodes.toolbox
|
||
);
|
||
}
|
||
hasFocus() {
|
||
var s;
|
||
return (s = this.popover) == null ? void 0 : s.hasFocus();
|
||
}
|
||
destroy() {
|
||
var s;
|
||
super.destroy(),
|
||
this.nodes &&
|
||
this.nodes.toolbox &&
|
||
(this.nodes.toolbox.remove(), (this.nodes.toolbox = null)),
|
||
this.removeAllShortcuts(),
|
||
(s = this.popover) == null || s.off(gt.Close, this.onPopoverClose);
|
||
}
|
||
toolButtonActivated(s, t) {
|
||
this.insertNewBlock(s, t);
|
||
}
|
||
open() {
|
||
var s;
|
||
this.isEmpty ||
|
||
((s = this.popover) == null || s.show(),
|
||
(this.opened = !0),
|
||
this.emit("toolbox-opened"));
|
||
}
|
||
close() {
|
||
var s;
|
||
(s = this.popover) == null || s.hide(),
|
||
(this.opened = !1),
|
||
this.emit("toolbox-closed");
|
||
}
|
||
toggle() {
|
||
this.opened ? this.close() : this.open();
|
||
}
|
||
get toolsToBeDisplayed() {
|
||
const s = [];
|
||
return (
|
||
this.tools.forEach((t) => {
|
||
t.toolbox && s.push(t);
|
||
}),
|
||
s
|
||
);
|
||
}
|
||
get toolboxItemsToBeDisplayed() {
|
||
const s = (t, e) => ({
|
||
icon: t.icon,
|
||
title: $.t(X.toolNames, t.title || at(e.name)),
|
||
name: e.name,
|
||
onActivate: () => {
|
||
this.toolButtonActivated(e.name, t.data);
|
||
},
|
||
secondaryLabel: e.shortcut ? Rt(e.shortcut) : "",
|
||
});
|
||
return this.toolsToBeDisplayed.reduce(
|
||
(t, e) => (
|
||
Array.isArray(e.toolbox)
|
||
? e.toolbox.forEach((o) => {
|
||
t.push(s(o, e));
|
||
})
|
||
: e.toolbox !== void 0 && t.push(s(e.toolbox, e)),
|
||
t
|
||
),
|
||
[],
|
||
);
|
||
}
|
||
enableShortcuts() {
|
||
this.toolsToBeDisplayed.forEach((s) => {
|
||
const t = s.shortcut;
|
||
t && this.enableShortcutForTool(s.name, t);
|
||
});
|
||
}
|
||
enableShortcutForTool(s, t) {
|
||
lt.add({
|
||
name: t,
|
||
on: this.api.ui.nodes.redactor,
|
||
handler: (e) => {
|
||
e.preventDefault();
|
||
const o = this.api.blocks.getCurrentBlockIndex(),
|
||
i = this.api.blocks.getBlockByIndex(o);
|
||
if (i)
|
||
try {
|
||
this.api.blocks.convert(i.id, s),
|
||
window.requestAnimationFrame(() => {
|
||
this.api.caret.setToBlock(o, "end");
|
||
});
|
||
return;
|
||
} catch {}
|
||
this.insertNewBlock(s);
|
||
},
|
||
});
|
||
}
|
||
removeAllShortcuts() {
|
||
this.toolsToBeDisplayed.forEach((s) => {
|
||
const t = s.shortcut;
|
||
t && lt.remove(this.api.ui.nodes.redactor, t);
|
||
});
|
||
}
|
||
async insertNewBlock(s, t) {
|
||
const e = this.api.blocks.getCurrentBlockIndex(),
|
||
o = this.api.blocks.getBlockByIndex(e);
|
||
if (!o) return;
|
||
const i = o.isEmpty ? e : e + 1;
|
||
let n;
|
||
if (t) {
|
||
const a = await this.api.blocks.composeBlockData(s);
|
||
n = Object.assign(a, t);
|
||
}
|
||
const r = this.api.blocks.insert(s, n, void 0, i, void 0, o.isEmpty);
|
||
r.call(q.APPEND_CALLBACK),
|
||
this.api.caret.setToBlock(i),
|
||
this.emit("toolbox-block-added", { block: r }),
|
||
this.api.toolbar.close();
|
||
}
|
||
};
|
||
let Ut = ve;
|
||
ke([ct], Ut.prototype, "toolsToBeDisplayed", 1);
|
||
ke([ct], Ut.prototype, "toolboxItemsToBeDisplayed", 1);
|
||
const xe = "block hovered";
|
||
class ti extends T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
super({ config: t, eventsDispatcher: e }),
|
||
(this.toolboxInstance = null),
|
||
(this.tooltip = new jt());
|
||
}
|
||
get CSS() {
|
||
return {
|
||
toolbar: "ce-toolbar",
|
||
content: "ce-toolbar__content",
|
||
actions: "ce-toolbar__actions",
|
||
actionsOpened: "ce-toolbar__actions--opened",
|
||
toolbarOpened: "ce-toolbar--opened",
|
||
openedToolboxHolderModifier: "codex-editor--toolbox-opened",
|
||
plusButton: "ce-toolbar__plus",
|
||
plusButtonShortcut: "ce-toolbar__plus-shortcut",
|
||
settingsToggler: "ce-toolbar__settings-btn",
|
||
settingsTogglerHidden: "ce-toolbar__settings-btn--hidden",
|
||
};
|
||
}
|
||
get opened() {
|
||
return this.nodes.wrapper.classList.contains(this.CSS.toolbarOpened);
|
||
}
|
||
get toolbox() {
|
||
var t;
|
||
return {
|
||
opened: (t = this.toolboxInstance) == null ? void 0 : t.opened,
|
||
close: () => {
|
||
var e;
|
||
(e = this.toolboxInstance) == null || e.close();
|
||
},
|
||
open: () => {
|
||
if (this.toolboxInstance === null) {
|
||
_("toolbox.open() called before initialization is finished", "warn");
|
||
return;
|
||
}
|
||
(this.Editor.BlockManager.currentBlock = this.hoveredBlock),
|
||
this.toolboxInstance.open();
|
||
},
|
||
toggle: () => {
|
||
if (this.toolboxInstance === null) {
|
||
_(
|
||
"toolbox.toggle() called before initialization is finished",
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
this.toolboxInstance.toggle();
|
||
},
|
||
hasFocus: () => {
|
||
var e;
|
||
return (e = this.toolboxInstance) == null ? void 0 : e.hasFocus();
|
||
},
|
||
};
|
||
}
|
||
get blockActions() {
|
||
return {
|
||
hide: () => {
|
||
this.nodes.actions.classList.remove(this.CSS.actionsOpened);
|
||
},
|
||
show: () => {
|
||
this.nodes.actions.classList.add(this.CSS.actionsOpened);
|
||
},
|
||
};
|
||
}
|
||
get blockTunesToggler() {
|
||
return {
|
||
hide: () =>
|
||
this.nodes.settingsToggler.classList.add(
|
||
this.CSS.settingsTogglerHidden,
|
||
),
|
||
show: () =>
|
||
this.nodes.settingsToggler.classList.remove(
|
||
this.CSS.settingsTogglerHidden,
|
||
),
|
||
};
|
||
}
|
||
toggleReadOnly(t) {
|
||
t
|
||
? (this.destroy(),
|
||
this.Editor.BlockSettings.destroy(),
|
||
this.disableModuleBindings())
|
||
: window.requestIdleCallback(
|
||
() => {
|
||
this.drawUI(), this.enableModuleBindings();
|
||
},
|
||
{ timeout: 2e3 },
|
||
);
|
||
}
|
||
moveAndOpen(t = this.Editor.BlockManager.currentBlock) {
|
||
if (this.toolboxInstance === null) {
|
||
_(
|
||
"Can't open Toolbar since Editor initialization is not finished yet",
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
if (
|
||
(this.toolboxInstance.opened && this.toolboxInstance.close(),
|
||
this.Editor.BlockSettings.opened && this.Editor.BlockSettings.close(),
|
||
!t)
|
||
)
|
||
return;
|
||
this.hoveredBlock = t;
|
||
const e = t.holder,
|
||
{ isMobile: o } = this.Editor.UI,
|
||
i = t.pluginsContent,
|
||
n = window.getComputedStyle(i),
|
||
r = parseInt(n.paddingTop, 10),
|
||
a = e.offsetHeight;
|
||
let l;
|
||
o ? (l = e.offsetTop + a) : (l = e.offsetTop + r),
|
||
(this.nodes.wrapper.style.top = `${Math.floor(l)}px`),
|
||
this.Editor.BlockManager.blocks.length === 1 && t.isEmpty
|
||
? this.blockTunesToggler.hide()
|
||
: this.blockTunesToggler.show(),
|
||
this.open();
|
||
}
|
||
close() {
|
||
var t;
|
||
this.Editor.ReadOnly.isEnabled ||
|
||
(this.nodes.wrapper.classList.remove(this.CSS.toolbarOpened),
|
||
this.blockActions.hide(),
|
||
(t = this.toolboxInstance) == null || t.close(),
|
||
this.Editor.BlockSettings.close());
|
||
}
|
||
open(t = !0) {
|
||
rt(() => {
|
||
this.nodes.wrapper.classList.add(this.CSS.toolbarOpened),
|
||
t ? this.blockActions.show() : this.blockActions.hide();
|
||
}, 50)();
|
||
}
|
||
make() {
|
||
(this.nodes.wrapper = d.make("div", this.CSS.toolbar)),
|
||
["content", "actions"].forEach((e) => {
|
||
this.nodes[e] = d.make("div", this.CSS[e]);
|
||
}),
|
||
d.append(this.nodes.wrapper, this.nodes.content),
|
||
d.append(this.nodes.content, this.nodes.actions),
|
||
(this.nodes.plusButton = d.make("div", this.CSS.plusButton, {
|
||
innerHTML: zo,
|
||
})),
|
||
d.append(this.nodes.actions, this.nodes.plusButton),
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.plusButton,
|
||
"click",
|
||
() => {
|
||
this.tooltip.hide(!0), this.plusButtonClicked();
|
||
},
|
||
!1,
|
||
);
|
||
const t = d.make("div");
|
||
t.appendChild(document.createTextNode($.ui(X.ui.toolbar.toolbox, "Add"))),
|
||
t.appendChild(
|
||
d.make("div", this.CSS.plusButtonShortcut, { textContent: "⇥ Tab" }),
|
||
),
|
||
this.tooltip.onHover(this.nodes.plusButton, t, { hidingDelay: 400 }),
|
||
(this.nodes.settingsToggler = d.make("span", this.CSS.settingsToggler, {
|
||
innerHTML: jo,
|
||
})),
|
||
d.append(this.nodes.actions, this.nodes.settingsToggler),
|
||
this.tooltip.onHover(
|
||
this.nodes.settingsToggler,
|
||
$.ui(X.ui.blockTunes.toggler, "Click to tune"),
|
||
{ hidingDelay: 400 },
|
||
),
|
||
d.append(this.nodes.actions, this.makeToolbox()),
|
||
d.append(this.nodes.actions, this.Editor.BlockSettings.getElement()),
|
||
d.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);
|
||
}
|
||
makeToolbox() {
|
||
return (
|
||
(this.toolboxInstance = new Ut({
|
||
api: this.Editor.API.methods,
|
||
tools: this.Editor.Tools.blockTools,
|
||
i18nLabels: {
|
||
filter: $.ui(X.ui.popover, "Filter"),
|
||
nothingFound: $.ui(X.ui.popover, "Nothing found"),
|
||
},
|
||
})),
|
||
this.toolboxInstance.on(bt.Opened, () => {
|
||
this.Editor.UI.nodes.wrapper.classList.add(
|
||
this.CSS.openedToolboxHolderModifier,
|
||
);
|
||
}),
|
||
this.toolboxInstance.on(bt.Closed, () => {
|
||
this.Editor.UI.nodes.wrapper.classList.remove(
|
||
this.CSS.openedToolboxHolderModifier,
|
||
);
|
||
}),
|
||
this.toolboxInstance.on(bt.BlockAdded, ({ block: t }) => {
|
||
const { BlockManager: e, Caret: o } = this.Editor,
|
||
i = e.getBlockById(t.id);
|
||
i.inputs.length === 0 &&
|
||
(i === e.lastBlock
|
||
? (e.insertAtEnd(), o.setToBlock(e.lastBlock))
|
||
: o.setToBlock(e.nextBlock));
|
||
}),
|
||
this.toolboxInstance.make()
|
||
);
|
||
}
|
||
plusButtonClicked() {
|
||
var t;
|
||
(this.Editor.BlockManager.currentBlock = this.hoveredBlock),
|
||
(t = this.toolboxInstance) == null || t.toggle();
|
||
}
|
||
enableModuleBindings() {
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.settingsToggler,
|
||
"mousedown",
|
||
(t) => {
|
||
var e;
|
||
t.stopPropagation(),
|
||
this.settingsTogglerClicked(),
|
||
(e = this.toolboxInstance) != null &&
|
||
e.opened &&
|
||
this.toolboxInstance.close(),
|
||
this.tooltip.hide(!0);
|
||
},
|
||
!0,
|
||
),
|
||
et() ||
|
||
this.eventsDispatcher.on(xe, (t) => {
|
||
var e;
|
||
this.Editor.BlockSettings.opened ||
|
||
((e = this.toolboxInstance) != null && e.opened) ||
|
||
this.moveAndOpen(t.block);
|
||
});
|
||
}
|
||
disableModuleBindings() {
|
||
this.readOnlyMutableListeners.clearAll();
|
||
}
|
||
settingsTogglerClicked() {
|
||
(this.Editor.BlockManager.currentBlock = this.hoveredBlock),
|
||
this.Editor.BlockSettings.opened
|
||
? this.Editor.BlockSettings.close()
|
||
: this.Editor.BlockSettings.open(this.hoveredBlock);
|
||
}
|
||
drawUI() {
|
||
this.Editor.BlockSettings.make(), this.make();
|
||
}
|
||
destroy() {
|
||
this.removeAllNodes(),
|
||
this.toolboxInstance && this.toolboxInstance.destroy(),
|
||
this.tooltip.destroy();
|
||
}
|
||
}
|
||
var yt = ((s) => (
|
||
(s[(s.Block = 0)] = "Block"),
|
||
(s[(s.Inline = 1)] = "Inline"),
|
||
(s[(s.Tune = 2)] = "Tune"),
|
||
s
|
||
))(yt || {}),
|
||
kt = ((s) => (
|
||
(s.Shortcut = "shortcut"),
|
||
(s.Toolbox = "toolbox"),
|
||
(s.EnabledInlineTools = "inlineToolbar"),
|
||
(s.EnabledBlockTunes = "tunes"),
|
||
(s.Config = "config"),
|
||
s
|
||
))(kt || {}),
|
||
we = ((s) => ((s.Shortcut = "shortcut"), (s.SanitizeConfig = "sanitize"), s))(
|
||
we || {},
|
||
),
|
||
st = ((s) => (
|
||
(s.IsEnabledLineBreaks = "enableLineBreaks"),
|
||
(s.Toolbox = "toolbox"),
|
||
(s.ConversionConfig = "conversionConfig"),
|
||
(s.IsReadOnlySupported = "isReadOnlySupported"),
|
||
(s.PasteConfig = "pasteConfig"),
|
||
s
|
||
))(st || {}),
|
||
$t = ((s) => ((s.IsInline = "isInline"), (s.Title = "title"), s))($t || {}),
|
||
ye = ((s) => ((s.IsTune = "isTune"), s))(ye || {});
|
||
class Wt {
|
||
constructor({
|
||
name: t,
|
||
constructable: e,
|
||
config: o,
|
||
api: i,
|
||
isDefault: n,
|
||
isInternal: r = !1,
|
||
defaultPlaceholder: a,
|
||
}) {
|
||
(this.api = i),
|
||
(this.name = t),
|
||
(this.constructable = e),
|
||
(this.config = o),
|
||
(this.isDefault = n),
|
||
(this.isInternal = r),
|
||
(this.defaultPlaceholder = a);
|
||
}
|
||
get settings() {
|
||
const t = this.config.config || {};
|
||
return (
|
||
this.isDefault &&
|
||
!("placeholder" in t) &&
|
||
this.defaultPlaceholder &&
|
||
(t.placeholder = this.defaultPlaceholder),
|
||
t
|
||
);
|
||
}
|
||
reset() {
|
||
if (R(this.constructable.reset)) return this.constructable.reset();
|
||
}
|
||
prepare() {
|
||
if (R(this.constructable.prepare))
|
||
return this.constructable.prepare({
|
||
toolName: this.name,
|
||
config: this.settings,
|
||
});
|
||
}
|
||
get shortcut() {
|
||
const t = this.constructable.shortcut;
|
||
return this.config.shortcut || t;
|
||
}
|
||
get sanitizeConfig() {
|
||
return this.constructable.sanitize || {};
|
||
}
|
||
isInline() {
|
||
return this.type === 1;
|
||
}
|
||
isBlock() {
|
||
return this.type === 0;
|
||
}
|
||
isTune() {
|
||
return this.type === 2;
|
||
}
|
||
}
|
||
class ei extends T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
super({ config: t, eventsDispatcher: e }),
|
||
(this.CSS = {
|
||
inlineToolbar: "ce-inline-toolbar",
|
||
inlineToolbarShowed: "ce-inline-toolbar--showed",
|
||
inlineToolbarLeftOriented: "ce-inline-toolbar--left-oriented",
|
||
inlineToolbarRightOriented: "ce-inline-toolbar--right-oriented",
|
||
inlineToolbarShortcut: "ce-inline-toolbar__shortcut",
|
||
buttonsWrapper: "ce-inline-toolbar__buttons",
|
||
actionsWrapper: "ce-inline-toolbar__actions",
|
||
inlineToolButton: "ce-inline-tool",
|
||
inputField: "cdx-input",
|
||
focusedButton: "ce-inline-tool--focused",
|
||
conversionToggler: "ce-inline-toolbar__dropdown",
|
||
conversionTogglerArrow: "ce-inline-toolbar__dropdown-arrow",
|
||
conversionTogglerHidden: "ce-inline-toolbar__dropdown--hidden",
|
||
conversionTogglerContent: "ce-inline-toolbar__dropdown-content",
|
||
togglerAndButtonsWrapper:
|
||
"ce-inline-toolbar__toggler-and-button-wrapper",
|
||
}),
|
||
(this.opened = !1),
|
||
(this.toolbarVerticalMargin = et() ? 20 : 6),
|
||
(this.buttonsList = null),
|
||
(this.width = 0),
|
||
(this.flipper = null),
|
||
(this.tooltip = new jt());
|
||
}
|
||
toggleReadOnly(t) {
|
||
t
|
||
? (this.destroy(), this.Editor.ConversionToolbar.destroy())
|
||
: window.requestIdleCallback(
|
||
() => {
|
||
this.make();
|
||
},
|
||
{ timeout: 2e3 },
|
||
);
|
||
}
|
||
tryToShow(t = !1, e = !0) {
|
||
if (!this.allowedToShow()) {
|
||
t && this.close();
|
||
return;
|
||
}
|
||
this.move(), this.open(e), this.Editor.Toolbar.close();
|
||
}
|
||
move() {
|
||
const t = b.rect,
|
||
e = this.Editor.UI.nodes.wrapper.getBoundingClientRect(),
|
||
o = {
|
||
x: t.x - e.left,
|
||
y: t.y + t.height - e.top + this.toolbarVerticalMargin,
|
||
};
|
||
t.width && (o.x += Math.floor(t.width / 2));
|
||
const i = o.x - this.width / 2,
|
||
n = o.x + this.width / 2;
|
||
this.nodes.wrapper.classList.toggle(
|
||
this.CSS.inlineToolbarLeftOriented,
|
||
i < this.Editor.UI.contentRect.left,
|
||
),
|
||
this.nodes.wrapper.classList.toggle(
|
||
this.CSS.inlineToolbarRightOriented,
|
||
n > this.Editor.UI.contentRect.right,
|
||
),
|
||
(this.nodes.wrapper.style.left = Math.floor(o.x) + "px"),
|
||
(this.nodes.wrapper.style.top = Math.floor(o.y) + "px");
|
||
}
|
||
close() {
|
||
this.opened &&
|
||
(this.Editor.ReadOnly.isEnabled ||
|
||
(this.nodes.wrapper.classList.remove(this.CSS.inlineToolbarShowed),
|
||
Array.from(this.toolsInstances.entries()).forEach(([t, e]) => {
|
||
const o = this.getToolShortcut(t);
|
||
o && lt.remove(this.Editor.UI.nodes.redactor, o),
|
||
R(e.clear) && e.clear();
|
||
}),
|
||
(this.opened = !1),
|
||
this.flipper.deactivate(),
|
||
this.Editor.ConversionToolbar.close()));
|
||
}
|
||
open(t = !0) {
|
||
if (this.opened) return;
|
||
this.addToolsFiltered(),
|
||
this.nodes.wrapper.classList.add(this.CSS.inlineToolbarShowed),
|
||
(this.buttonsList = this.nodes.buttons.querySelectorAll(
|
||
`.${this.CSS.inlineToolButton}`,
|
||
)),
|
||
(this.opened = !0),
|
||
t && this.Editor.ConversionToolbar.hasTools()
|
||
? this.setConversionTogglerContent()
|
||
: (this.nodes.conversionToggler.hidden = !0);
|
||
let e = Array.from(this.buttonsList);
|
||
e.unshift(this.nodes.conversionToggler),
|
||
(e = e.filter((o) => !o.hidden)),
|
||
this.flipper.activate(e);
|
||
}
|
||
containsNode(t) {
|
||
return this.nodes.wrapper.contains(t);
|
||
}
|
||
destroy() {
|
||
this.flipper && (this.flipper.deactivate(), (this.flipper = null)),
|
||
this.removeAllNodes(),
|
||
this.tooltip.destroy();
|
||
}
|
||
make() {
|
||
(this.nodes.wrapper = d.make("div", [
|
||
this.CSS.inlineToolbar,
|
||
...(this.isRtl ? [this.Editor.UI.CSS.editorRtlFix] : []),
|
||
])),
|
||
(this.nodes.togglerAndButtonsWrapper = d.make(
|
||
"div",
|
||
this.CSS.togglerAndButtonsWrapper,
|
||
)),
|
||
(this.nodes.buttons = d.make("div", this.CSS.buttonsWrapper)),
|
||
(this.nodes.actions = d.make("div", this.CSS.actionsWrapper)),
|
||
this.listeners.on(this.nodes.wrapper, "mousedown", (t) => {
|
||
t.target.closest(`.${this.CSS.actionsWrapper}`) || t.preventDefault();
|
||
}),
|
||
d.append(this.nodes.wrapper, [
|
||
this.nodes.togglerAndButtonsWrapper,
|
||
this.nodes.actions,
|
||
]),
|
||
d.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper),
|
||
this.addConversionToggler(),
|
||
d.append(this.nodes.togglerAndButtonsWrapper, this.nodes.buttons),
|
||
this.prepareConversionToolbar(),
|
||
window.requestAnimationFrame(() => {
|
||
this.recalculateWidth();
|
||
}),
|
||
this.enableFlipper();
|
||
}
|
||
allowedToShow() {
|
||
const t = ["IMG", "INPUT"],
|
||
e = b.get(),
|
||
o = b.text;
|
||
if (!e || !e.anchorNode || e.isCollapsed || o.length < 1) return !1;
|
||
const i = d.isElement(e.anchorNode)
|
||
? e.anchorNode
|
||
: e.anchorNode.parentElement;
|
||
if (
|
||
(e && t.includes(i.tagName)) ||
|
||
i.closest('[contenteditable="true"]') === null
|
||
)
|
||
return !1;
|
||
const n = this.Editor.BlockManager.getBlock(e.anchorNode);
|
||
return n ? n.tool.inlineTools.size !== 0 : !1;
|
||
}
|
||
recalculateWidth() {
|
||
this.width = this.nodes.wrapper.offsetWidth;
|
||
}
|
||
addConversionToggler() {
|
||
(this.nodes.conversionToggler = d.make("div", this.CSS.conversionToggler)),
|
||
(this.nodes.conversionTogglerContent = d.make(
|
||
"div",
|
||
this.CSS.conversionTogglerContent,
|
||
));
|
||
const t = d.make("div", this.CSS.conversionTogglerArrow, { innerHTML: me });
|
||
this.nodes.conversionToggler.appendChild(
|
||
this.nodes.conversionTogglerContent,
|
||
),
|
||
this.nodes.conversionToggler.appendChild(t),
|
||
this.nodes.togglerAndButtonsWrapper.appendChild(
|
||
this.nodes.conversionToggler,
|
||
),
|
||
this.listeners.on(this.nodes.conversionToggler, "click", () => {
|
||
this.Editor.ConversionToolbar.toggle((e) => {
|
||
!e && this.opened
|
||
? this.flipper.activate()
|
||
: this.opened && this.flipper.deactivate();
|
||
});
|
||
}),
|
||
et() === !1 &&
|
||
this.tooltip.onHover(
|
||
this.nodes.conversionToggler,
|
||
$.ui(X.ui.inlineToolbar.converter, "Convert to"),
|
||
{ placement: "top", hidingDelay: 100 },
|
||
);
|
||
}
|
||
async setConversionTogglerContent() {
|
||
const { BlockManager: t } = this.Editor,
|
||
{ currentBlock: e } = t,
|
||
o = e.name,
|
||
i = e.tool.conversionConfig,
|
||
n = i && i.export;
|
||
(this.nodes.conversionToggler.hidden = !n),
|
||
this.nodes.conversionToggler.classList.toggle(
|
||
this.CSS.conversionTogglerHidden,
|
||
!n,
|
||
);
|
||
const r = (await e.getActiveToolboxEntry()) || {};
|
||
this.nodes.conversionTogglerContent.innerHTML = r.icon || r.title || at(o);
|
||
}
|
||
prepareConversionToolbar() {
|
||
const t = this.Editor.ConversionToolbar.make();
|
||
d.append(this.nodes.wrapper, t);
|
||
}
|
||
addToolsFiltered() {
|
||
const t = b.get(),
|
||
e = this.Editor.BlockManager.getBlock(t.anchorNode);
|
||
(this.nodes.buttons.innerHTML = ""),
|
||
(this.nodes.actions.innerHTML = ""),
|
||
(this.toolsInstances = new Map()),
|
||
Array.from(e.tool.inlineTools.values()).forEach((o) => {
|
||
this.addTool(o);
|
||
}),
|
||
this.recalculateWidth();
|
||
}
|
||
addTool(t) {
|
||
const e = t.create(),
|
||
o = e.render();
|
||
if (!o) {
|
||
_("Render method must return an instance of Node", "warn", t.name);
|
||
return;
|
||
}
|
||
if (
|
||
((o.dataset.tool = t.name),
|
||
this.nodes.buttons.appendChild(o),
|
||
this.toolsInstances.set(t.name, e),
|
||
R(e.renderActions))
|
||
) {
|
||
const a = e.renderActions();
|
||
this.nodes.actions.appendChild(a);
|
||
}
|
||
this.listeners.on(o, "click", (a) => {
|
||
this.toolClicked(e), a.preventDefault();
|
||
});
|
||
const i = this.getToolShortcut(t.name);
|
||
if (i)
|
||
try {
|
||
this.enableShortcuts(e, i);
|
||
} catch {}
|
||
const n = d.make("div"),
|
||
r = $.t(X.toolNames, t.title || at(t.name));
|
||
n.appendChild(d.text(r)),
|
||
i &&
|
||
n.appendChild(
|
||
d.make("div", this.CSS.inlineToolbarShortcut, { textContent: Rt(i) }),
|
||
),
|
||
et() === !1 &&
|
||
this.tooltip.onHover(o, n, { placement: "top", hidingDelay: 100 }),
|
||
e.checkState(b.get());
|
||
}
|
||
getToolShortcut(t) {
|
||
const { Tools: e } = this.Editor,
|
||
o = e.inlineTools.get(t),
|
||
i = e.internal.inlineTools;
|
||
return Array.from(i.keys()).includes(t)
|
||
? this.inlineTools[t][we.Shortcut]
|
||
: o.shortcut;
|
||
}
|
||
enableShortcuts(t, e) {
|
||
lt.add({
|
||
name: e,
|
||
handler: (o) => {
|
||
const { currentBlock: i } = this.Editor.BlockManager;
|
||
i &&
|
||
i.tool.enabledInlineTools &&
|
||
(o.preventDefault(), this.toolClicked(t));
|
||
},
|
||
on: this.Editor.UI.nodes.redactor,
|
||
});
|
||
}
|
||
toolClicked(t) {
|
||
const e = b.range;
|
||
t.surround(e),
|
||
this.checkToolsState(),
|
||
t.renderActions !== void 0 && this.flipper.deactivate();
|
||
}
|
||
checkToolsState() {
|
||
this.toolsInstances.forEach((t) => {
|
||
t.checkState(b.get());
|
||
});
|
||
}
|
||
get inlineTools() {
|
||
const t = {};
|
||
return (
|
||
Array.from(this.Editor.Tools.inlineTools.entries()).forEach(([e, o]) => {
|
||
t[e] = o.create();
|
||
}),
|
||
t
|
||
);
|
||
}
|
||
enableFlipper() {
|
||
this.flipper = new G({
|
||
focusedItemClass: this.CSS.focusedButton,
|
||
allowedKeys: [E.ENTER, E.TAB],
|
||
});
|
||
}
|
||
}
|
||
class oi extends T {
|
||
keydown(t) {
|
||
switch ((this.beforeKeydownProcessing(t), t.keyCode)) {
|
||
case E.BACKSPACE:
|
||
this.backspace(t);
|
||
break;
|
||
case E.DELETE:
|
||
this.delete(t);
|
||
break;
|
||
case E.ENTER:
|
||
this.enter(t);
|
||
break;
|
||
case E.DOWN:
|
||
case E.RIGHT:
|
||
this.arrowRightAndDown(t);
|
||
break;
|
||
case E.UP:
|
||
case E.LEFT:
|
||
this.arrowLeftAndUp(t);
|
||
break;
|
||
case E.TAB:
|
||
this.tabPressed(t);
|
||
break;
|
||
}
|
||
}
|
||
beforeKeydownProcessing(t) {
|
||
this.needToolbarClosing(t) &&
|
||
re(t.keyCode) &&
|
||
(this.Editor.Toolbar.close(),
|
||
this.Editor.ConversionToolbar.close(),
|
||
t.ctrlKey ||
|
||
t.metaKey ||
|
||
t.altKey ||
|
||
t.shiftKey ||
|
||
(this.Editor.BlockManager.clearFocused(),
|
||
this.Editor.BlockSelection.clearSelection(t)));
|
||
}
|
||
keyup(t) {
|
||
t.shiftKey || this.Editor.UI.checkEmptiness();
|
||
}
|
||
tabPressed(t) {
|
||
this.Editor.BlockSelection.clearSelection(t);
|
||
const {
|
||
BlockManager: e,
|
||
InlineToolbar: o,
|
||
ConversionToolbar: i,
|
||
} = this.Editor,
|
||
n = e.currentBlock;
|
||
if (!n) return;
|
||
const r = n.isEmpty,
|
||
a = n.tool.isDefault && r,
|
||
l = !r && i.opened,
|
||
c = !r && !b.isCollapsed && o.opened;
|
||
a ? this.activateToolbox() : !l && !c && this.activateBlockSettings();
|
||
}
|
||
dragOver(t) {
|
||
const e = this.Editor.BlockManager.getBlockByChildNode(t.target);
|
||
e.dropTarget = !0;
|
||
}
|
||
dragLeave(t) {
|
||
const e = this.Editor.BlockManager.getBlockByChildNode(t.target);
|
||
e.dropTarget = !1;
|
||
}
|
||
handleCommandC(t) {
|
||
const { BlockSelection: e } = this.Editor;
|
||
e.anyBlockSelected && e.copySelectedBlocks(t);
|
||
}
|
||
handleCommandX(t) {
|
||
const { BlockSelection: e, BlockManager: o, Caret: i } = this.Editor;
|
||
e.anyBlockSelected &&
|
||
e.copySelectedBlocks(t).then(() => {
|
||
const n = o.removeSelectedBlocks(),
|
||
r = o.insertDefaultBlockAtIndex(n, !0);
|
||
i.setToBlock(r, i.positions.START), e.clearSelection(t);
|
||
});
|
||
}
|
||
enter(t) {
|
||
const { BlockManager: e, UI: o } = this.Editor;
|
||
if (
|
||
e.currentBlock.tool.isLineBreaksEnabled ||
|
||
(o.someToolbarOpened && o.someFlipperButtonFocused) ||
|
||
t.shiftKey
|
||
)
|
||
return;
|
||
let i = this.Editor.BlockManager.currentBlock;
|
||
this.Editor.Caret.isAtStart &&
|
||
!this.Editor.BlockManager.currentBlock.hasMedia
|
||
? this.Editor.BlockManager.insertDefaultBlockAtIndex(
|
||
this.Editor.BlockManager.currentBlockIndex,
|
||
)
|
||
: this.Editor.Caret.isAtEnd
|
||
? (i = this.Editor.BlockManager.insertDefaultBlockAtIndex(
|
||
this.Editor.BlockManager.currentBlockIndex + 1,
|
||
))
|
||
: (i = this.Editor.BlockManager.split()),
|
||
this.Editor.Caret.setToBlock(i),
|
||
this.Editor.Toolbar.moveAndOpen(i),
|
||
t.preventDefault();
|
||
}
|
||
backspace(t) {
|
||
const { BlockManager: e, Caret: o } = this.Editor,
|
||
{ currentBlock: i, previousBlock: n } = e;
|
||
if (!(!b.isCollapsed || !o.isAtStart)) {
|
||
if (
|
||
(t.preventDefault(),
|
||
this.Editor.Toolbar.close(),
|
||
i.currentInput !== i.firstInput)
|
||
) {
|
||
o.navigatePrevious();
|
||
return;
|
||
}
|
||
if (n !== null) {
|
||
if (n.isEmpty) {
|
||
e.removeBlock(n);
|
||
return;
|
||
}
|
||
if (i.isEmpty) {
|
||
e.removeBlock(i);
|
||
const r = e.currentBlock;
|
||
o.setToBlock(r, o.positions.END);
|
||
return;
|
||
}
|
||
te(i, n) ? this.mergeBlocks(n, i) : o.setToBlock(n, o.positions.END);
|
||
}
|
||
}
|
||
}
|
||
delete(t) {
|
||
const { BlockManager: e, Caret: o } = this.Editor,
|
||
{ currentBlock: i, nextBlock: n } = e;
|
||
if (!(!b.isCollapsed || !o.isAtEnd)) {
|
||
if (
|
||
(t.preventDefault(),
|
||
this.Editor.Toolbar.close(),
|
||
i.currentInput !== i.lastInput)
|
||
) {
|
||
o.navigateNext();
|
||
return;
|
||
}
|
||
if (n !== null) {
|
||
if (n.isEmpty) {
|
||
e.removeBlock(n);
|
||
return;
|
||
}
|
||
if (i.isEmpty) {
|
||
e.removeBlock(i), o.setToBlock(n, o.positions.START);
|
||
return;
|
||
}
|
||
te(i, n) ? this.mergeBlocks(i, n) : o.setToBlock(n, o.positions.START);
|
||
}
|
||
}
|
||
}
|
||
mergeBlocks(t, e) {
|
||
const { BlockManager: o, Caret: i, Toolbar: n } = this.Editor;
|
||
i.createShadow(t.pluginsContent),
|
||
o.mergeBlocks(t, e).then(() => {
|
||
window.requestAnimationFrame(() => {
|
||
i.restoreCaret(t.pluginsContent),
|
||
t.pluginsContent.normalize(),
|
||
n.close();
|
||
});
|
||
});
|
||
}
|
||
arrowRightAndDown(t) {
|
||
const e =
|
||
G.usedKeys.includes(t.keyCode) && (!t.shiftKey || t.keyCode === E.TAB);
|
||
if (this.Editor.UI.someToolbarOpened && e) return;
|
||
this.Editor.BlockManager.clearFocused(), this.Editor.Toolbar.close();
|
||
const o =
|
||
this.Editor.Caret.isAtEnd || this.Editor.BlockSelection.anyBlockSelected;
|
||
if (t.shiftKey && t.keyCode === E.DOWN && o) {
|
||
this.Editor.CrossBlockSelection.toggleBlockSelectedState();
|
||
return;
|
||
}
|
||
(
|
||
t.keyCode === E.DOWN || (t.keyCode === E.RIGHT && !this.isRtl)
|
||
? this.Editor.Caret.navigateNext()
|
||
: this.Editor.Caret.navigatePrevious()
|
||
)
|
||
? t.preventDefault()
|
||
: rt(() => {
|
||
this.Editor.BlockManager.currentBlock &&
|
||
this.Editor.BlockManager.currentBlock.updateCurrentInput();
|
||
}, 20)(),
|
||
this.Editor.BlockSelection.clearSelection(t);
|
||
}
|
||
arrowLeftAndUp(t) {
|
||
if (this.Editor.UI.someToolbarOpened) {
|
||
if (
|
||
G.usedKeys.includes(t.keyCode) &&
|
||
(!t.shiftKey || t.keyCode === E.TAB)
|
||
)
|
||
return;
|
||
this.Editor.UI.closeAllToolbars();
|
||
}
|
||
this.Editor.BlockManager.clearFocused(), this.Editor.Toolbar.close();
|
||
const e =
|
||
this.Editor.Caret.isAtStart ||
|
||
this.Editor.BlockSelection.anyBlockSelected;
|
||
if (t.shiftKey && t.keyCode === E.UP && e) {
|
||
this.Editor.CrossBlockSelection.toggleBlockSelectedState(!1);
|
||
return;
|
||
}
|
||
(
|
||
t.keyCode === E.UP || (t.keyCode === E.LEFT && !this.isRtl)
|
||
? this.Editor.Caret.navigatePrevious()
|
||
: this.Editor.Caret.navigateNext()
|
||
)
|
||
? t.preventDefault()
|
||
: rt(() => {
|
||
this.Editor.BlockManager.currentBlock &&
|
||
this.Editor.BlockManager.currentBlock.updateCurrentInput();
|
||
}, 20)(),
|
||
this.Editor.BlockSelection.clearSelection(t);
|
||
}
|
||
needToolbarClosing(t) {
|
||
const e = t.keyCode === E.ENTER && this.Editor.Toolbar.toolbox.opened,
|
||
o = t.keyCode === E.ENTER && this.Editor.BlockSettings.opened,
|
||
i = t.keyCode === E.ENTER && this.Editor.InlineToolbar.opened,
|
||
n = t.keyCode === E.ENTER && this.Editor.ConversionToolbar.opened,
|
||
r = t.keyCode === E.TAB;
|
||
return !(t.shiftKey || r || e || o || i || n);
|
||
}
|
||
activateToolbox() {
|
||
this.Editor.Toolbar.opened || this.Editor.Toolbar.moveAndOpen(),
|
||
this.Editor.Toolbar.toolbox.open();
|
||
}
|
||
activateBlockSettings() {
|
||
this.Editor.Toolbar.opened ||
|
||
((this.Editor.BlockManager.currentBlock.focused = !0),
|
||
this.Editor.Toolbar.moveAndOpen()),
|
||
this.Editor.BlockSettings.opened || this.Editor.BlockSettings.open();
|
||
}
|
||
}
|
||
class Bt {
|
||
constructor(t) {
|
||
(this.blocks = []), (this.workingArea = t);
|
||
}
|
||
get length() {
|
||
return this.blocks.length;
|
||
}
|
||
get array() {
|
||
return this.blocks;
|
||
}
|
||
get nodes() {
|
||
return ae(this.workingArea.children);
|
||
}
|
||
static set(t, e, o) {
|
||
return isNaN(Number(e))
|
||
? (Reflect.set(t, e, o), !0)
|
||
: (t.insert(+e, o), !0);
|
||
}
|
||
static get(t, e) {
|
||
return isNaN(Number(e)) ? Reflect.get(t, e) : t.get(+e);
|
||
}
|
||
push(t) {
|
||
this.blocks.push(t), this.insertToDOM(t);
|
||
}
|
||
swap(t, e) {
|
||
const o = this.blocks[e];
|
||
d.swap(this.blocks[t].holder, o.holder),
|
||
(this.blocks[e] = this.blocks[t]),
|
||
(this.blocks[t] = o);
|
||
}
|
||
move(t, e) {
|
||
const o = this.blocks.splice(e, 1)[0],
|
||
i = t - 1,
|
||
n = Math.max(0, i),
|
||
r = this.blocks[n];
|
||
t > 0
|
||
? this.insertToDOM(o, "afterend", r)
|
||
: this.insertToDOM(o, "beforebegin", r),
|
||
this.blocks.splice(t, 0, o);
|
||
const a = this.composeBlockEvent("move", { fromIndex: e, toIndex: t });
|
||
o.call(q.MOVED, a);
|
||
}
|
||
insert(t, e, o = !1) {
|
||
if (!this.length) {
|
||
this.push(e);
|
||
return;
|
||
}
|
||
t > this.length && (t = this.length),
|
||
o && (this.blocks[t].holder.remove(), this.blocks[t].call(q.REMOVED));
|
||
const i = o ? 1 : 0;
|
||
if ((this.blocks.splice(t, i, e), t > 0)) {
|
||
const n = this.blocks[t - 1];
|
||
this.insertToDOM(e, "afterend", n);
|
||
} else {
|
||
const n = this.blocks[t + 1];
|
||
n ? this.insertToDOM(e, "beforebegin", n) : this.insertToDOM(e);
|
||
}
|
||
}
|
||
replace(t, e) {
|
||
if (this.blocks[t] === void 0) throw Error("Incorrect index");
|
||
this.blocks[t].holder.replaceWith(e.holder), (this.blocks[t] = e);
|
||
}
|
||
insertMany(t, e) {
|
||
const o = new DocumentFragment();
|
||
for (const i of t) o.appendChild(i.holder);
|
||
if (this.length > 0) {
|
||
if (e > 0) {
|
||
const i = Math.min(e - 1, this.length - 1);
|
||
this.blocks[i].holder.after(o);
|
||
} else e === 0 && this.workingArea.prepend(o);
|
||
this.blocks.splice(e, 0, ...t);
|
||
} else this.blocks.push(...t), this.workingArea.appendChild(o);
|
||
t.forEach((i) => i.call(q.RENDERED));
|
||
}
|
||
remove(t) {
|
||
isNaN(t) && (t = this.length - 1),
|
||
this.blocks[t].holder.remove(),
|
||
this.blocks[t].call(q.REMOVED),
|
||
this.blocks.splice(t, 1);
|
||
}
|
||
removeAll() {
|
||
(this.workingArea.innerHTML = ""),
|
||
this.blocks.forEach((t) => t.call(q.REMOVED)),
|
||
(this.blocks.length = 0);
|
||
}
|
||
insertAfter(t, e) {
|
||
const o = this.blocks.indexOf(t);
|
||
this.insert(o + 1, e);
|
||
}
|
||
get(t) {
|
||
return this.blocks[t];
|
||
}
|
||
indexOf(t) {
|
||
return this.blocks.indexOf(t);
|
||
}
|
||
insertToDOM(t, e, o) {
|
||
e
|
||
? o.holder.insertAdjacentElement(e, t.holder)
|
||
: this.workingArea.appendChild(t.holder),
|
||
t.call(q.RENDERED);
|
||
}
|
||
composeBlockEvent(t, e) {
|
||
return new CustomEvent(t, { detail: e });
|
||
}
|
||
}
|
||
const oe = "block-removed",
|
||
ie = "block-added",
|
||
ii = "block-moved",
|
||
ne = "block-changed";
|
||
class ni {
|
||
constructor() {
|
||
this.completed = Promise.resolve();
|
||
}
|
||
add(t) {
|
||
return new Promise((e, o) => {
|
||
this.completed = this.completed.then(t).then(e).catch(o);
|
||
});
|
||
}
|
||
}
|
||
class si extends T {
|
||
constructor() {
|
||
super(...arguments), (this._currentBlockIndex = -1), (this._blocks = null);
|
||
}
|
||
get currentBlockIndex() {
|
||
return this._currentBlockIndex;
|
||
}
|
||
set currentBlockIndex(t) {
|
||
this._currentBlockIndex = t;
|
||
}
|
||
get firstBlock() {
|
||
return this._blocks[0];
|
||
}
|
||
get lastBlock() {
|
||
return this._blocks[this._blocks.length - 1];
|
||
}
|
||
get currentBlock() {
|
||
return this._blocks[this.currentBlockIndex];
|
||
}
|
||
set currentBlock(t) {
|
||
this.currentBlockIndex = this.getBlockIndex(t);
|
||
}
|
||
get nextBlock() {
|
||
return this.currentBlockIndex === this._blocks.length - 1
|
||
? null
|
||
: this._blocks[this.currentBlockIndex + 1];
|
||
}
|
||
get nextContentfulBlock() {
|
||
return this.blocks
|
||
.slice(this.currentBlockIndex + 1)
|
||
.find((t) => !!t.inputs.length);
|
||
}
|
||
get previousContentfulBlock() {
|
||
return this.blocks
|
||
.slice(0, this.currentBlockIndex)
|
||
.reverse()
|
||
.find((t) => !!t.inputs.length);
|
||
}
|
||
get previousBlock() {
|
||
return this.currentBlockIndex === 0
|
||
? null
|
||
: this._blocks[this.currentBlockIndex - 1];
|
||
}
|
||
get blocks() {
|
||
return this._blocks.array;
|
||
}
|
||
get isEditorEmpty() {
|
||
return this.blocks.every((t) => t.isEmpty);
|
||
}
|
||
prepare() {
|
||
const t = new Bt(this.Editor.UI.nodes.redactor);
|
||
(this._blocks = new Proxy(t, { set: Bt.set, get: Bt.get })),
|
||
this.listeners.on(document, "copy", (e) =>
|
||
this.Editor.BlockEvents.handleCommandC(e),
|
||
);
|
||
}
|
||
toggleReadOnly(t) {
|
||
t ? this.disableModuleBindings() : this.enableModuleBindings();
|
||
}
|
||
composeBlock({ tool: t, data: e = {}, id: o = void 0, tunes: i = {} }) {
|
||
const n = this.Editor.ReadOnly.isEnabled,
|
||
r = this.Editor.Tools.blockTools.get(t),
|
||
a = new F(
|
||
{
|
||
id: o,
|
||
data: e,
|
||
tool: r,
|
||
api: this.Editor.API,
|
||
readOnly: n,
|
||
tunesData: i,
|
||
},
|
||
this.eventsDispatcher,
|
||
);
|
||
return (
|
||
n ||
|
||
window.requestIdleCallback(
|
||
() => {
|
||
this.bindBlockEvents(a);
|
||
},
|
||
{ timeout: 2e3 },
|
||
),
|
||
a
|
||
);
|
||
}
|
||
insert({
|
||
id: t = void 0,
|
||
tool: e = this.config.defaultBlock,
|
||
data: o = {},
|
||
index: i,
|
||
needToFocus: n = !0,
|
||
replace: r = !1,
|
||
tunes: a = {},
|
||
} = {}) {
|
||
let l = i;
|
||
l === void 0 && (l = this.currentBlockIndex + (r ? 0 : 1));
|
||
const c = this.composeBlock({ id: t, tool: e, data: o, tunes: a });
|
||
return (
|
||
r && this.blockDidMutated(oe, this.getBlockByIndex(l), { index: l }),
|
||
this._blocks.insert(l, c, r),
|
||
this.blockDidMutated(ie, c, { index: l }),
|
||
n
|
||
? (this.currentBlockIndex = l)
|
||
: l <= this.currentBlockIndex && this.currentBlockIndex++,
|
||
c
|
||
);
|
||
}
|
||
insertMany(t, e = 0) {
|
||
this._blocks.insertMany(t, e);
|
||
}
|
||
async update(t, e) {
|
||
const o = await t.data,
|
||
i = this.composeBlock({
|
||
id: t.id,
|
||
tool: t.name,
|
||
data: Object.assign({}, o, e),
|
||
tunes: t.tunes,
|
||
}),
|
||
n = this.getBlockIndex(t);
|
||
return (
|
||
this._blocks.replace(n, i), this.blockDidMutated(ne, i, { index: n }), i
|
||
);
|
||
}
|
||
replace(t, e, o) {
|
||
const i = this.getBlockIndex(t);
|
||
this.insert({ tool: e, data: o, index: i, replace: !0 });
|
||
}
|
||
paste(t, e, o = !1) {
|
||
const i = this.insert({ tool: t, replace: o });
|
||
try {
|
||
i.call(q.ON_PASTE, e);
|
||
} catch (n) {
|
||
_(`${t}: onPaste callback call is failed`, "error", n);
|
||
}
|
||
return i;
|
||
}
|
||
insertDefaultBlockAtIndex(t, e = !1) {
|
||
const o = this.composeBlock({ tool: this.config.defaultBlock });
|
||
return (
|
||
(this._blocks[t] = o),
|
||
this.blockDidMutated(ie, o, { index: t }),
|
||
e
|
||
? (this.currentBlockIndex = t)
|
||
: t <= this.currentBlockIndex && this.currentBlockIndex++,
|
||
o
|
||
);
|
||
}
|
||
insertAtEnd() {
|
||
return (this.currentBlockIndex = this.blocks.length - 1), this.insert();
|
||
}
|
||
async mergeBlocks(t, e) {
|
||
const o = await e.data;
|
||
V(o) || (await t.mergeWith(o)),
|
||
this.removeBlock(e),
|
||
(this.currentBlockIndex = this._blocks.indexOf(t));
|
||
}
|
||
removeBlock(t, e = !0) {
|
||
return new Promise((o) => {
|
||
const i = this._blocks.indexOf(t);
|
||
if (!this.validateIndex(i))
|
||
throw new Error("Can't find a Block to remove");
|
||
t.destroy(),
|
||
this._blocks.remove(i),
|
||
this.blockDidMutated(oe, t, { index: i }),
|
||
this.currentBlockIndex >= i && this.currentBlockIndex--,
|
||
this.blocks.length
|
||
? i === 0 && (this.currentBlockIndex = 0)
|
||
: ((this.currentBlockIndex = -1), e && this.insert()),
|
||
o();
|
||
});
|
||
}
|
||
removeSelectedBlocks() {
|
||
let t;
|
||
for (let e = this.blocks.length - 1; e >= 0; e--)
|
||
this.blocks[e].selected && (this.removeBlock(this.blocks[e]), (t = e));
|
||
return t;
|
||
}
|
||
removeAllBlocks() {
|
||
for (let t = this.blocks.length - 1; t >= 0; t--) this._blocks.remove(t);
|
||
(this.currentBlockIndex = -1),
|
||
this.insert(),
|
||
this.currentBlock.firstInput.focus();
|
||
}
|
||
split() {
|
||
const t = this.Editor.Caret.extractFragmentFromCaretPosition(),
|
||
e = d.make("div");
|
||
e.appendChild(t);
|
||
const o = { text: d.isEmpty(e) ? "" : e.innerHTML };
|
||
return this.insert({ data: o });
|
||
}
|
||
getBlockByIndex(t) {
|
||
return t === -1 && (t = this._blocks.length - 1), this._blocks[t];
|
||
}
|
||
getBlockIndex(t) {
|
||
return this._blocks.indexOf(t);
|
||
}
|
||
getBlockById(t) {
|
||
return this._blocks.array.find((e) => e.id === t);
|
||
}
|
||
getBlock(t) {
|
||
d.isElement(t) || (t = t.parentNode);
|
||
const e = this._blocks.nodes,
|
||
o = t.closest(`.${F.CSS.wrapper}`),
|
||
i = e.indexOf(o);
|
||
if (i >= 0) return this._blocks[i];
|
||
}
|
||
highlightCurrentNode() {
|
||
this.clearFocused(), (this.currentBlock.focused = !0);
|
||
}
|
||
clearFocused() {
|
||
this.blocks.forEach((t) => {
|
||
t.focused = !1;
|
||
});
|
||
}
|
||
setCurrentBlockByChildNode(t) {
|
||
d.isElement(t) || (t = t.parentNode);
|
||
const e = t.closest(`.${F.CSS.wrapper}`);
|
||
if (!e) return;
|
||
const o = e.closest(`.${this.Editor.UI.CSS.editorWrapper}`);
|
||
if (o != null && o.isEqualNode(this.Editor.UI.nodes.wrapper))
|
||
return (
|
||
(this.currentBlockIndex = this._blocks.nodes.indexOf(e)),
|
||
this.currentBlock.updateCurrentInput(),
|
||
this.currentBlock
|
||
);
|
||
}
|
||
getBlockByChildNode(t) {
|
||
d.isElement(t) || (t = t.parentNode);
|
||
const e = t.closest(`.${F.CSS.wrapper}`);
|
||
return this.blocks.find((o) => o.holder === e);
|
||
}
|
||
swap(t, e) {
|
||
this._blocks.swap(t, e), (this.currentBlockIndex = e);
|
||
}
|
||
move(t, e = this.currentBlockIndex) {
|
||
if (isNaN(t) || isNaN(e)) {
|
||
_("Warning during 'move' call: incorrect indices provided.", "warn");
|
||
return;
|
||
}
|
||
if (!this.validateIndex(t) || !this.validateIndex(e)) {
|
||
_(
|
||
"Warning during 'move' call: indices cannot be lower than 0 or greater than the amount of blocks.",
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
this._blocks.move(t, e),
|
||
(this.currentBlockIndex = t),
|
||
this.blockDidMutated(ii, this.currentBlock, { fromIndex: e, toIndex: t });
|
||
}
|
||
async convert(t, e, o) {
|
||
if (!(await t.save()))
|
||
throw new Error(
|
||
"Could not convert Block. Failed to extract original Block data.",
|
||
);
|
||
const i = this.Editor.Tools.blockTools.get(e);
|
||
if (!i) throw new Error(`Could not convert Block. Tool «${e}» not found.`);
|
||
const n = await t.exportDataAsString(),
|
||
r = Z(n, i.sanitizeConfig);
|
||
let a = ro(r, i.conversionConfig);
|
||
o && (a = Object.assign(a, o)), this.replace(t, i.name, a);
|
||
}
|
||
dropPointer() {
|
||
(this.currentBlockIndex = -1), this.clearFocused();
|
||
}
|
||
async clear(t = !1) {
|
||
const e = new ni();
|
||
this.blocks.forEach((o) => {
|
||
e.add(async () => {
|
||
await this.removeBlock(o, !1);
|
||
});
|
||
}),
|
||
await e.completed,
|
||
this.dropPointer(),
|
||
t && this.insert(),
|
||
this.Editor.UI.checkEmptiness();
|
||
}
|
||
async destroy() {
|
||
await Promise.all(this.blocks.map((t) => t.destroy()));
|
||
}
|
||
bindBlockEvents(t) {
|
||
const { BlockEvents: e } = this.Editor;
|
||
this.readOnlyMutableListeners.on(t.holder, "keydown", (o) => {
|
||
e.keydown(o);
|
||
}),
|
||
this.readOnlyMutableListeners.on(t.holder, "keyup", (o) => {
|
||
e.keyup(o);
|
||
}),
|
||
this.readOnlyMutableListeners.on(t.holder, "dragover", (o) => {
|
||
e.dragOver(o);
|
||
}),
|
||
this.readOnlyMutableListeners.on(t.holder, "dragleave", (o) => {
|
||
e.dragLeave(o);
|
||
}),
|
||
t.on("didMutated", (o) =>
|
||
this.blockDidMutated(ne, o, { index: this.getBlockIndex(o) }),
|
||
);
|
||
}
|
||
disableModuleBindings() {
|
||
this.readOnlyMutableListeners.clearAll();
|
||
}
|
||
enableModuleBindings() {
|
||
this.readOnlyMutableListeners.on(document, "cut", (t) =>
|
||
this.Editor.BlockEvents.handleCommandX(t),
|
||
),
|
||
this.blocks.forEach((t) => {
|
||
this.bindBlockEvents(t);
|
||
});
|
||
}
|
||
validateIndex(t) {
|
||
return !(t < 0 || t >= this._blocks.length);
|
||
}
|
||
blockDidMutated(t, e, o) {
|
||
const i = new CustomEvent(t, { detail: { target: new tt(e), ...o } });
|
||
return this.eventsDispatcher.emit(he, { event: i }), e;
|
||
}
|
||
}
|
||
class ri extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.anyBlockSelectedCache = null),
|
||
(this.needToSelectAll = !1),
|
||
(this.nativeInputSelected = !1),
|
||
(this.readyToBlockSelection = !1);
|
||
}
|
||
get sanitizerConfig() {
|
||
return {
|
||
p: {},
|
||
h1: {},
|
||
h2: {},
|
||
h3: {},
|
||
h4: {},
|
||
h5: {},
|
||
h6: {},
|
||
ol: {},
|
||
ul: {},
|
||
li: {},
|
||
br: !0,
|
||
img: { src: !0, width: !0, height: !0 },
|
||
a: { href: !0 },
|
||
b: {},
|
||
i: {},
|
||
u: {},
|
||
};
|
||
}
|
||
get allBlocksSelected() {
|
||
const { BlockManager: t } = this.Editor;
|
||
return t.blocks.every((e) => e.selected === !0);
|
||
}
|
||
set allBlocksSelected(t) {
|
||
const { BlockManager: e } = this.Editor;
|
||
e.blocks.forEach((o) => {
|
||
o.selected = t;
|
||
}),
|
||
this.clearCache();
|
||
}
|
||
get anyBlockSelected() {
|
||
const { BlockManager: t } = this.Editor;
|
||
return (
|
||
this.anyBlockSelectedCache === null &&
|
||
(this.anyBlockSelectedCache = t.blocks.some((e) => e.selected === !0)),
|
||
this.anyBlockSelectedCache
|
||
);
|
||
}
|
||
get selectedBlocks() {
|
||
return this.Editor.BlockManager.blocks.filter((t) => t.selected);
|
||
}
|
||
prepare() {
|
||
(this.selection = new b()),
|
||
lt.add({
|
||
name: "CMD+A",
|
||
handler: (t) => {
|
||
const { BlockManager: e, ReadOnly: o } = this.Editor;
|
||
if (o.isEnabled) {
|
||
t.preventDefault(), this.selectAllBlocks();
|
||
return;
|
||
}
|
||
e.currentBlock && this.handleCommandA(t);
|
||
},
|
||
on: this.Editor.UI.nodes.redactor,
|
||
});
|
||
}
|
||
toggleReadOnly() {
|
||
b.get().removeAllRanges(), (this.allBlocksSelected = !1);
|
||
}
|
||
unSelectBlockByIndex(t) {
|
||
const { BlockManager: e } = this.Editor;
|
||
let o;
|
||
isNaN(t) ? (o = e.currentBlock) : (o = e.getBlockByIndex(t)),
|
||
(o.selected = !1),
|
||
this.clearCache();
|
||
}
|
||
clearSelection(t, e = !1) {
|
||
const { BlockManager: o, Caret: i, RectangleSelection: n } = this.Editor;
|
||
(this.needToSelectAll = !1),
|
||
(this.nativeInputSelected = !1),
|
||
(this.readyToBlockSelection = !1);
|
||
const r = t && t instanceof KeyboardEvent,
|
||
a = r && re(t.keyCode);
|
||
if (this.anyBlockSelected && r && a && !b.isSelectionExists) {
|
||
const l = o.removeSelectedBlocks();
|
||
o.insertDefaultBlockAtIndex(l, !0),
|
||
i.setToBlock(o.currentBlock),
|
||
rt(() => {
|
||
const c = t.key;
|
||
i.insertContentAtCaretPosition(c.length > 1 ? "" : c);
|
||
}, 20)();
|
||
}
|
||
if (
|
||
(this.Editor.CrossBlockSelection.clear(t),
|
||
!this.anyBlockSelected || n.isRectActivated())
|
||
) {
|
||
this.Editor.RectangleSelection.clearSelection();
|
||
return;
|
||
}
|
||
e && this.selection.restore(), (this.allBlocksSelected = !1);
|
||
}
|
||
copySelectedBlocks(t) {
|
||
t.preventDefault();
|
||
const e = d.make("div");
|
||
this.selectedBlocks.forEach((n) => {
|
||
const r = Z(n.holder.innerHTML, this.sanitizerConfig),
|
||
a = d.make("p");
|
||
(a.innerHTML = r), e.appendChild(a);
|
||
});
|
||
const o = Array.from(e.childNodes).map((n) => n.textContent).join(`
|
||
|
||
`),
|
||
i = e.innerHTML;
|
||
return (
|
||
t.clipboardData.setData("text/plain", o),
|
||
t.clipboardData.setData("text/html", i),
|
||
Promise.all(this.selectedBlocks.map((n) => n.save())).then((n) => {
|
||
try {
|
||
t.clipboardData.setData(
|
||
this.Editor.Paste.MIME_TYPE,
|
||
JSON.stringify(n),
|
||
);
|
||
} catch {}
|
||
})
|
||
);
|
||
}
|
||
selectBlockByIndex(t) {
|
||
const { BlockManager: e } = this.Editor;
|
||
e.clearFocused();
|
||
let o;
|
||
isNaN(t) ? (o = e.currentBlock) : (o = e.getBlockByIndex(t)),
|
||
this.selection.save(),
|
||
b.get().removeAllRanges(),
|
||
(o.selected = !0),
|
||
this.clearCache(),
|
||
this.Editor.InlineToolbar.close();
|
||
}
|
||
clearCache() {
|
||
this.anyBlockSelectedCache = null;
|
||
}
|
||
destroy() {
|
||
lt.remove(this.Editor.UI.nodes.redactor, "CMD+A");
|
||
}
|
||
handleCommandA(t) {
|
||
if (
|
||
(this.Editor.RectangleSelection.clearSelection(),
|
||
d.isNativeInput(t.target) && !this.readyToBlockSelection)
|
||
) {
|
||
this.readyToBlockSelection = !0;
|
||
return;
|
||
}
|
||
const e = this.Editor.BlockManager.getBlock(t.target).inputs;
|
||
if (e.length > 1 && !this.readyToBlockSelection) {
|
||
this.readyToBlockSelection = !0;
|
||
return;
|
||
}
|
||
if (e.length === 1 && !this.needToSelectAll) {
|
||
this.needToSelectAll = !0;
|
||
return;
|
||
}
|
||
this.needToSelectAll
|
||
? (t.preventDefault(),
|
||
this.selectAllBlocks(),
|
||
(this.needToSelectAll = !1),
|
||
(this.readyToBlockSelection = !1),
|
||
this.Editor.ConversionToolbar.close())
|
||
: this.readyToBlockSelection &&
|
||
(t.preventDefault(),
|
||
this.selectBlockByIndex(),
|
||
(this.needToSelectAll = !0));
|
||
}
|
||
selectAllBlocks() {
|
||
this.selection.save(),
|
||
b.get().removeAllRanges(),
|
||
(this.allBlocksSelected = !0),
|
||
this.Editor.InlineToolbar.close();
|
||
}
|
||
}
|
||
class vt extends T {
|
||
get positions() {
|
||
return { START: "start", END: "end", DEFAULT: "default" };
|
||
}
|
||
static get CSS() {
|
||
return { shadowCaret: "cdx-shadow-caret" };
|
||
}
|
||
get isAtStart() {
|
||
const t = b.get(),
|
||
e = d.getDeepestNode(this.Editor.BlockManager.currentBlock.currentInput);
|
||
let o = t.focusNode;
|
||
if (d.isNativeInput(e)) return e.selectionEnd === 0;
|
||
if (!t.anchorNode) return !1;
|
||
let i = o.textContent.search(/\S/);
|
||
i === -1 && (i = 0);
|
||
let n = t.focusOffset;
|
||
return (
|
||
o.nodeType !== Node.TEXT_NODE &&
|
||
o.childNodes.length &&
|
||
(o.childNodes[n]
|
||
? ((o = o.childNodes[n]), (n = 0))
|
||
: ((o = o.childNodes[n - 1]), (n = o.textContent.length))),
|
||
(d.isLineBreakTag(e) || d.isEmpty(e)) &&
|
||
this.getHigherLevelSiblings(o, "left").every((r) => {
|
||
const a = d.isLineBreakTag(r),
|
||
l = r.children.length === 1 && d.isLineBreakTag(r.children[0]),
|
||
c = a || l;
|
||
return d.isEmpty(r) && !c;
|
||
}) &&
|
||
n === i
|
||
? !0
|
||
: e === null || (o === e && n <= i)
|
||
);
|
||
}
|
||
get isAtEnd() {
|
||
const t = b.get();
|
||
let e = t.focusNode;
|
||
const o = d.getDeepestNode(
|
||
this.Editor.BlockManager.currentBlock.currentInput,
|
||
!0,
|
||
);
|
||
if (d.isNativeInput(o)) return o.selectionEnd === o.value.length;
|
||
if (!t.focusNode) return !1;
|
||
let i = t.focusOffset;
|
||
if (
|
||
(e.nodeType !== Node.TEXT_NODE &&
|
||
e.childNodes.length &&
|
||
(e.childNodes[i - 1]
|
||
? ((e = e.childNodes[i - 1]), (i = e.textContent.length))
|
||
: ((e = e.childNodes[0]), (i = 0))),
|
||
d.isLineBreakTag(o) || d.isEmpty(o))
|
||
) {
|
||
const r = this.getHigherLevelSiblings(e, "right");
|
||
if (
|
||
r.every(
|
||
(a, l) =>
|
||
(l === r.length - 1 && d.isLineBreakTag(a)) ||
|
||
(d.isEmpty(a) && !d.isLineBreakTag(a)),
|
||
) &&
|
||
i === e.textContent.length
|
||
)
|
||
return !0;
|
||
}
|
||
const n = o.textContent.replace(/\s+$/, "");
|
||
return e === o && i >= n.length;
|
||
}
|
||
setToBlock(t, e = this.positions.DEFAULT, o = 0) {
|
||
const { BlockManager: i } = this.Editor;
|
||
let n;
|
||
switch (e) {
|
||
case this.positions.START:
|
||
n = t.firstInput;
|
||
break;
|
||
case this.positions.END:
|
||
n = t.lastInput;
|
||
break;
|
||
default:
|
||
n = t.currentInput;
|
||
}
|
||
if (!n) return;
|
||
const r = d.getDeepestNode(n, e === this.positions.END),
|
||
a = d.getContentLength(r);
|
||
switch (!0) {
|
||
case e === this.positions.START:
|
||
o = 0;
|
||
break;
|
||
case e === this.positions.END:
|
||
case o > a:
|
||
o = a;
|
||
break;
|
||
}
|
||
rt(() => {
|
||
this.set(r, o);
|
||
}, 20)(),
|
||
i.setCurrentBlockByChildNode(t.holder),
|
||
(i.currentBlock.currentInput = n);
|
||
}
|
||
setToInput(t, e = this.positions.DEFAULT, o = 0) {
|
||
const { currentBlock: i } = this.Editor.BlockManager,
|
||
n = d.getDeepestNode(t);
|
||
switch (e) {
|
||
case this.positions.START:
|
||
this.set(n, 0);
|
||
break;
|
||
case this.positions.END:
|
||
this.set(n, d.getContentLength(n));
|
||
break;
|
||
default:
|
||
o && this.set(n, o);
|
||
}
|
||
i.currentInput = t;
|
||
}
|
||
set(t, e = 0) {
|
||
const { top: o, bottom: i } = b.setCursor(t, e),
|
||
{ innerHeight: n } = window;
|
||
o < 0 && window.scrollBy(0, o), i > n && window.scrollBy(0, i - n);
|
||
}
|
||
setToTheLastBlock() {
|
||
const t = this.Editor.BlockManager.lastBlock;
|
||
if (t)
|
||
if (t.tool.isDefault && t.isEmpty) this.setToBlock(t);
|
||
else {
|
||
const e = this.Editor.BlockManager.insertAtEnd();
|
||
this.setToBlock(e);
|
||
}
|
||
}
|
||
extractFragmentFromCaretPosition() {
|
||
const t = b.get();
|
||
if (t.rangeCount) {
|
||
const e = t.getRangeAt(0),
|
||
o = this.Editor.BlockManager.currentBlock.currentInput;
|
||
if ((e.deleteContents(), o))
|
||
if (d.isNativeInput(o)) {
|
||
const i = o,
|
||
n = document.createDocumentFragment(),
|
||
r = i.value.substring(0, i.selectionStart),
|
||
a = i.value.substring(i.selectionStart);
|
||
return (n.textContent = a), (i.value = r), n;
|
||
} else {
|
||
const i = e.cloneRange();
|
||
return (
|
||
i.selectNodeContents(o),
|
||
i.setStart(e.endContainer, e.endOffset),
|
||
i.extractContents()
|
||
);
|
||
}
|
||
}
|
||
}
|
||
navigateNext() {
|
||
const { BlockManager: t } = this.Editor,
|
||
{ currentBlock: e, nextContentfulBlock: o } = t,
|
||
{ nextInput: i } = e,
|
||
n = this.isAtEnd;
|
||
let r = o;
|
||
if (!r && !i) {
|
||
if (e.tool.isDefault || !n) return !1;
|
||
r = t.insertAtEnd();
|
||
}
|
||
return n
|
||
? (i
|
||
? this.setToInput(i, this.positions.START)
|
||
: this.setToBlock(r, this.positions.START),
|
||
!0)
|
||
: !1;
|
||
}
|
||
navigatePrevious() {
|
||
const { currentBlock: t, previousContentfulBlock: e } =
|
||
this.Editor.BlockManager;
|
||
if (!t) return !1;
|
||
const { previousInput: o } = t;
|
||
return !e && !o
|
||
? !1
|
||
: this.isAtStart
|
||
? (o
|
||
? this.setToInput(o, this.positions.END)
|
||
: this.setToBlock(e, this.positions.END),
|
||
!0)
|
||
: !1;
|
||
}
|
||
createShadow(t) {
|
||
const e = document.createElement("span");
|
||
e.classList.add(vt.CSS.shadowCaret),
|
||
t.insertAdjacentElement("beforeend", e);
|
||
}
|
||
restoreCaret(t) {
|
||
const e = t.querySelector(`.${vt.CSS.shadowCaret}`);
|
||
if (!e) return;
|
||
new b().expandToTag(e);
|
||
const o = document.createRange();
|
||
o.selectNode(e), o.extractContents();
|
||
}
|
||
insertContentAtCaretPosition(t) {
|
||
const e = document.createDocumentFragment(),
|
||
o = document.createElement("div"),
|
||
i = b.get(),
|
||
n = b.range;
|
||
(o.innerHTML = t),
|
||
Array.from(o.childNodes).forEach((c) => e.appendChild(c)),
|
||
e.childNodes.length === 0 && e.appendChild(new Text());
|
||
const r = e.lastChild;
|
||
n.deleteContents(), n.insertNode(e);
|
||
const a = document.createRange(),
|
||
l = r.nodeType === Node.TEXT_NODE ? r : r.firstChild;
|
||
l !== null && l.textContent !== null && a.setStart(l, l.textContent.length),
|
||
i.removeAllRanges(),
|
||
i.addRange(a);
|
||
}
|
||
getHigherLevelSiblings(t, e) {
|
||
let o = t;
|
||
const i = [];
|
||
for (; o.parentNode && o.parentNode.contentEditable !== "true"; )
|
||
o = o.parentNode;
|
||
const n = e === "left" ? "previousSibling" : "nextSibling";
|
||
for (; o[n]; ) (o = o[n]), i.push(o);
|
||
return i;
|
||
}
|
||
}
|
||
class ai extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.onMouseUp = () => {
|
||
this.listeners.off(document, "mouseover", this.onMouseOver),
|
||
this.listeners.off(document, "mouseup", this.onMouseUp);
|
||
}),
|
||
(this.onMouseOver = (t) => {
|
||
const { BlockManager: e, BlockSelection: o } = this.Editor,
|
||
i = e.getBlockByChildNode(t.relatedTarget) || this.lastSelectedBlock,
|
||
n = e.getBlockByChildNode(t.target);
|
||
if (!(!i || !n) && n !== i) {
|
||
if (i === this.firstSelectedBlock) {
|
||
b.get().removeAllRanges(),
|
||
(i.selected = !0),
|
||
(n.selected = !0),
|
||
o.clearCache();
|
||
return;
|
||
}
|
||
if (n === this.firstSelectedBlock) {
|
||
(i.selected = !1), (n.selected = !1), o.clearCache();
|
||
return;
|
||
}
|
||
this.Editor.InlineToolbar.close(),
|
||
this.toggleBlocksSelectedState(i, n),
|
||
(this.lastSelectedBlock = n);
|
||
}
|
||
});
|
||
}
|
||
async prepare() {
|
||
this.listeners.on(document, "mousedown", (t) => {
|
||
this.enableCrossBlockSelection(t);
|
||
});
|
||
}
|
||
watchSelection(t) {
|
||
if (t.button !== ze.LEFT) return;
|
||
const { BlockManager: e } = this.Editor;
|
||
(this.firstSelectedBlock = e.getBlock(t.target)),
|
||
(this.lastSelectedBlock = this.firstSelectedBlock),
|
||
this.listeners.on(document, "mouseover", this.onMouseOver),
|
||
this.listeners.on(document, "mouseup", this.onMouseUp);
|
||
}
|
||
get isCrossBlockSelectionStarted() {
|
||
return !!this.firstSelectedBlock && !!this.lastSelectedBlock;
|
||
}
|
||
toggleBlockSelectedState(t = !0) {
|
||
const { BlockManager: e, BlockSelection: o } = this.Editor;
|
||
this.lastSelectedBlock ||
|
||
(this.lastSelectedBlock = this.firstSelectedBlock = e.currentBlock),
|
||
this.firstSelectedBlock === this.lastSelectedBlock &&
|
||
((this.firstSelectedBlock.selected = !0),
|
||
o.clearCache(),
|
||
b.get().removeAllRanges());
|
||
const i = e.blocks.indexOf(this.lastSelectedBlock) + (t ? 1 : -1),
|
||
n = e.blocks[i];
|
||
n &&
|
||
(this.lastSelectedBlock.selected !== n.selected
|
||
? ((n.selected = !0), o.clearCache())
|
||
: ((this.lastSelectedBlock.selected = !1), o.clearCache()),
|
||
(this.lastSelectedBlock = n),
|
||
this.Editor.InlineToolbar.close(),
|
||
n.holder.scrollIntoView({ block: "nearest" }));
|
||
}
|
||
clear(t) {
|
||
const { BlockManager: e, BlockSelection: o, Caret: i } = this.Editor,
|
||
n = e.blocks.indexOf(this.firstSelectedBlock),
|
||
r = e.blocks.indexOf(this.lastSelectedBlock);
|
||
if (o.anyBlockSelected && n > -1 && r > -1)
|
||
if (t && t instanceof KeyboardEvent)
|
||
switch (t.keyCode) {
|
||
case E.DOWN:
|
||
case E.RIGHT:
|
||
i.setToBlock(e.blocks[Math.max(n, r)], i.positions.END);
|
||
break;
|
||
case E.UP:
|
||
case E.LEFT:
|
||
i.setToBlock(e.blocks[Math.min(n, r)], i.positions.START);
|
||
break;
|
||
default:
|
||
i.setToBlock(e.blocks[Math.max(n, r)], i.positions.END);
|
||
}
|
||
else i.setToBlock(e.blocks[Math.max(n, r)], i.positions.END);
|
||
this.firstSelectedBlock = this.lastSelectedBlock = null;
|
||
}
|
||
enableCrossBlockSelection(t) {
|
||
const { UI: e } = this.Editor;
|
||
b.isCollapsed || this.Editor.BlockSelection.clearSelection(t),
|
||
e.nodes.redactor.contains(t.target)
|
||
? this.watchSelection(t)
|
||
: this.Editor.BlockSelection.clearSelection(t);
|
||
}
|
||
toggleBlocksSelectedState(t, e) {
|
||
const { BlockManager: o, BlockSelection: i } = this.Editor,
|
||
n = o.blocks.indexOf(t),
|
||
r = o.blocks.indexOf(e),
|
||
a = t.selected !== e.selected;
|
||
for (let l = Math.min(n, r); l <= Math.max(n, r); l++) {
|
||
const c = o.blocks[l];
|
||
c !== this.firstSelectedBlock &&
|
||
c !== (a ? t : e) &&
|
||
((o.blocks[l].selected = !o.blocks[l].selected), i.clearCache());
|
||
}
|
||
}
|
||
}
|
||
class li extends T {
|
||
constructor() {
|
||
super(...arguments), (this.isStartedAtEditor = !1);
|
||
}
|
||
toggleReadOnly(t) {
|
||
t ? this.disableModuleBindings() : this.enableModuleBindings();
|
||
}
|
||
enableModuleBindings() {
|
||
const { UI: t } = this.Editor;
|
||
this.readOnlyMutableListeners.on(
|
||
t.nodes.holder,
|
||
"drop",
|
||
async (e) => {
|
||
await this.processDrop(e);
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(t.nodes.holder, "dragstart", () => {
|
||
this.processDragStart();
|
||
}),
|
||
this.readOnlyMutableListeners.on(
|
||
t.nodes.holder,
|
||
"dragover",
|
||
(e) => {
|
||
this.processDragOver(e);
|
||
},
|
||
!0,
|
||
);
|
||
}
|
||
disableModuleBindings() {
|
||
this.readOnlyMutableListeners.clearAll();
|
||
}
|
||
async processDrop(t) {
|
||
const { BlockManager: e, Caret: o, Paste: i } = this.Editor;
|
||
t.preventDefault(),
|
||
e.blocks.forEach((r) => {
|
||
r.dropTarget = !1;
|
||
}),
|
||
b.isAtEditor &&
|
||
!b.isCollapsed &&
|
||
this.isStartedAtEditor &&
|
||
document.execCommand("delete"),
|
||
(this.isStartedAtEditor = !1);
|
||
const n = e.setCurrentBlockByChildNode(t.target);
|
||
if (n) this.Editor.Caret.setToBlock(n, o.positions.END);
|
||
else {
|
||
const r = e.setCurrentBlockByChildNode(e.lastBlock.holder);
|
||
this.Editor.Caret.setToBlock(r, o.positions.END);
|
||
}
|
||
await i.processDataTransfer(t.dataTransfer, !0);
|
||
}
|
||
processDragStart() {
|
||
b.isAtEditor && !b.isCollapsed && (this.isStartedAtEditor = !0),
|
||
this.Editor.InlineToolbar.close();
|
||
}
|
||
processDragOver(t) {
|
||
t.preventDefault();
|
||
}
|
||
}
|
||
class ci extends T {
|
||
constructor({ config: t, eventsDispatcher: e }) {
|
||
super({ config: t, eventsDispatcher: e }),
|
||
(this.disabled = !1),
|
||
(this.batchingTimeout = null),
|
||
(this.batchingOnChangeQueue = new Map()),
|
||
(this.batchTime = 400),
|
||
(this.mutationObserver = new MutationObserver((o) => {
|
||
this.redactorChanged(o);
|
||
})),
|
||
this.eventsDispatcher.on(he, (o) => {
|
||
this.particularBlockChanged(o.event);
|
||
}),
|
||
this.eventsDispatcher.on(pe, () => {
|
||
this.disable();
|
||
}),
|
||
this.eventsDispatcher.on(ue, () => {
|
||
this.enable();
|
||
});
|
||
}
|
||
enable() {
|
||
this.mutationObserver.observe(this.Editor.UI.nodes.redactor, {
|
||
childList: !0,
|
||
subtree: !0,
|
||
characterData: !0,
|
||
attributes: !0,
|
||
}),
|
||
(this.disabled = !1);
|
||
}
|
||
disable() {
|
||
this.mutationObserver.disconnect(), (this.disabled = !0);
|
||
}
|
||
particularBlockChanged(t) {
|
||
this.disabled ||
|
||
!R(this.config.onChange) ||
|
||
(this.batchingOnChangeQueue.set(
|
||
`block:${t.detail.target.id}:event:${t.type}`,
|
||
t,
|
||
),
|
||
this.batchingTimeout && clearTimeout(this.batchingTimeout),
|
||
(this.batchingTimeout = setTimeout(() => {
|
||
let e;
|
||
this.batchingOnChangeQueue.size === 1
|
||
? (e = this.batchingOnChangeQueue.values().next().value)
|
||
: (e = Array.from(this.batchingOnChangeQueue.values())),
|
||
this.config.onChange &&
|
||
this.config.onChange(this.Editor.API.methods, e),
|
||
this.batchingOnChangeQueue.clear();
|
||
}, this.batchTime)));
|
||
}
|
||
redactorChanged(t) {
|
||
this.eventsDispatcher.emit(_t, { mutations: t });
|
||
}
|
||
}
|
||
const Ee = class extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.MIME_TYPE = "application/x-editor-js"),
|
||
(this.toolsTags = {}),
|
||
(this.tagsByTool = {}),
|
||
(this.toolsPatterns = []),
|
||
(this.toolsFiles = {}),
|
||
(this.exceptionList = []),
|
||
(this.processTool = (s) => {
|
||
try {
|
||
const t = s.create({}, {}, !1);
|
||
if (s.pasteConfig === !1) {
|
||
this.exceptionList.push(s.name);
|
||
return;
|
||
}
|
||
if (!R(t.onPaste)) return;
|
||
this.getTagsConfig(s),
|
||
this.getFilesConfig(s),
|
||
this.getPatternsConfig(s);
|
||
} catch (t) {
|
||
_(
|
||
`Paste handling for «${s.name}» Tool hasn't been set up because of the error`,
|
||
"warn",
|
||
t,
|
||
);
|
||
}
|
||
}),
|
||
(this.handlePasteEvent = async (s) => {
|
||
const { BlockManager: t, Toolbar: e } = this.Editor,
|
||
o = t.setCurrentBlockByChildNode(s.target);
|
||
!o ||
|
||
(this.isNativeBehaviour(s.target) &&
|
||
!s.clipboardData.types.includes("Files")) ||
|
||
(o && this.exceptionList.includes(o.name)) ||
|
||
(s.preventDefault(),
|
||
this.processDataTransfer(s.clipboardData),
|
||
t.clearFocused(),
|
||
e.close());
|
||
});
|
||
}
|
||
async prepare() {
|
||
this.processTools();
|
||
}
|
||
toggleReadOnly(s) {
|
||
s ? this.unsetCallback() : this.setCallback();
|
||
}
|
||
async processDataTransfer(s, t = !1) {
|
||
const { Tools: e } = this.Editor,
|
||
o = s.types;
|
||
if (
|
||
(o.includes ? o.includes("Files") : o.contains("Files")) &&
|
||
!V(this.toolsFiles)
|
||
) {
|
||
await this.processFiles(s.files);
|
||
return;
|
||
}
|
||
const i = s.getData(this.MIME_TYPE),
|
||
n = s.getData("text/plain");
|
||
let r = s.getData("text/html");
|
||
if (i)
|
||
try {
|
||
this.insertEditorJSData(JSON.parse(i));
|
||
return;
|
||
} catch {}
|
||
t && n.trim() && r.trim() && (r = "<p>" + (r.trim() ? r : n) + "</p>");
|
||
const a = Object.keys(this.toolsTags).reduce(
|
||
(p, h) => (
|
||
(p[h.toLowerCase()] = this.toolsTags[h].sanitizationConfig ?? {}), p
|
||
),
|
||
{},
|
||
),
|
||
l = Object.assign({}, a, e.getAllInlineToolsSanitizeConfig(), { br: {} }),
|
||
c = Z(r, l);
|
||
!c.trim() || c.trim() === n || !d.isHTMLString(c)
|
||
? await this.processText(n)
|
||
: await this.processText(c, !0);
|
||
}
|
||
async processText(s, t = !1) {
|
||
const { Caret: e, BlockManager: o } = this.Editor,
|
||
i = t ? this.processHTML(s) : this.processPlain(s);
|
||
if (!i.length) return;
|
||
if (i.length === 1) {
|
||
i[0].isBlock
|
||
? this.processSingleBlock(i.pop())
|
||
: this.processInlinePaste(i.pop());
|
||
return;
|
||
}
|
||
const n =
|
||
o.currentBlock && o.currentBlock.tool.isDefault && o.currentBlock.isEmpty;
|
||
i.map(async (r, a) => this.insertBlock(r, a === 0 && n)),
|
||
o.currentBlock && e.setToBlock(o.currentBlock, e.positions.END);
|
||
}
|
||
setCallback() {
|
||
this.listeners.on(
|
||
this.Editor.UI.nodes.holder,
|
||
"paste",
|
||
this.handlePasteEvent,
|
||
);
|
||
}
|
||
unsetCallback() {
|
||
this.listeners.off(
|
||
this.Editor.UI.nodes.holder,
|
||
"paste",
|
||
this.handlePasteEvent,
|
||
);
|
||
}
|
||
processTools() {
|
||
const s = this.Editor.Tools.blockTools;
|
||
Array.from(s.values()).forEach(this.processTool);
|
||
}
|
||
collectTagNames(s) {
|
||
return J(s) ? [s] : z(s) ? Object.keys(s) : [];
|
||
}
|
||
getTagsConfig(s) {
|
||
if (s.pasteConfig === !1) return;
|
||
const t = s.pasteConfig.tags || [],
|
||
e = [];
|
||
t.forEach((o) => {
|
||
const i = this.collectTagNames(o);
|
||
e.push(...i),
|
||
i.forEach((n) => {
|
||
if (Object.prototype.hasOwnProperty.call(this.toolsTags, n)) {
|
||
_(
|
||
`Paste handler for «${s.name}» Tool on «${n}» tag is skipped because it is already used by «${this.toolsTags[n].tool.name}» Tool.`,
|
||
"warn",
|
||
);
|
||
return;
|
||
}
|
||
const r = z(o) ? o[n] : null;
|
||
this.toolsTags[n.toUpperCase()] = { tool: s, sanitizationConfig: r };
|
||
});
|
||
}),
|
||
(this.tagsByTool[s.name] = e.map((o) => o.toUpperCase()));
|
||
}
|
||
getFilesConfig(s) {
|
||
if (s.pasteConfig === !1) return;
|
||
const { files: t = {} } = s.pasteConfig;
|
||
let { extensions: e, mimeTypes: o } = t;
|
||
(!e && !o) ||
|
||
(e &&
|
||
!Array.isArray(e) &&
|
||
(_(
|
||
`«extensions» property of the onDrop config for «${s.name}» Tool should be an array`,
|
||
),
|
||
(e = [])),
|
||
o &&
|
||
!Array.isArray(o) &&
|
||
(_(
|
||
`«mimeTypes» property of the onDrop config for «${s.name}» Tool should be an array`,
|
||
),
|
||
(o = [])),
|
||
o &&
|
||
(o = o.filter((i) =>
|
||
Ke(i)
|
||
? !0
|
||
: (_(
|
||
`MIME type value «${i}» for the «${s.name}» Tool is not a valid MIME type`,
|
||
"warn",
|
||
),
|
||
!1),
|
||
)),
|
||
(this.toolsFiles[s.name] = { extensions: e || [], mimeTypes: o || [] }));
|
||
}
|
||
getPatternsConfig(s) {
|
||
s.pasteConfig === !1 ||
|
||
!s.pasteConfig.patterns ||
|
||
V(s.pasteConfig.patterns) ||
|
||
Object.entries(s.pasteConfig.patterns).forEach(([t, e]) => {
|
||
e instanceof RegExp ||
|
||
_(
|
||
`Pattern ${e} for «${s.name}» Tool is skipped because it should be a Regexp instance.`,
|
||
"warn",
|
||
),
|
||
this.toolsPatterns.push({ key: t, pattern: e, tool: s });
|
||
});
|
||
}
|
||
isNativeBehaviour(s) {
|
||
return d.isNativeInput(s);
|
||
}
|
||
async processFiles(s) {
|
||
const { BlockManager: t } = this.Editor;
|
||
let e;
|
||
(e = await Promise.all(Array.from(s).map((i) => this.processFile(i)))),
|
||
(e = e.filter((i) => !!i));
|
||
const o = t.currentBlock.tool.isDefault && t.currentBlock.isEmpty;
|
||
e.forEach((i, n) => {
|
||
t.paste(i.type, i.event, n === 0 && o);
|
||
});
|
||
}
|
||
async processFile(s) {
|
||
const t = Ye(s),
|
||
e = Object.entries(this.toolsFiles).find(
|
||
([i, { mimeTypes: n, extensions: r }]) => {
|
||
const [a, l] = s.type.split("/"),
|
||
c = r.find((h) => h.toLowerCase() === t.toLowerCase()),
|
||
p = n.find((h) => {
|
||
const [f, k] = h.split("/");
|
||
return f === a && (k === l || k === "*");
|
||
});
|
||
return !!c || !!p;
|
||
},
|
||
);
|
||
if (!e) return;
|
||
const [o] = e;
|
||
return { event: this.composePasteEvent("file", { file: s }), type: o };
|
||
}
|
||
processHTML(s) {
|
||
const { Tools: t } = this.Editor,
|
||
e = d.make("DIV");
|
||
return (
|
||
(e.innerHTML = s),
|
||
this.getNodes(e)
|
||
.map((o) => {
|
||
let i,
|
||
n = t.defaultTool,
|
||
r = !1;
|
||
switch (o.nodeType) {
|
||
case Node.DOCUMENT_FRAGMENT_NODE:
|
||
(i = d.make("div")), i.appendChild(o);
|
||
break;
|
||
case Node.ELEMENT_NODE:
|
||
(i = o),
|
||
(r = !0),
|
||
this.toolsTags[i.tagName] &&
|
||
(n = this.toolsTags[i.tagName].tool);
|
||
break;
|
||
}
|
||
const { tags: a } = n.pasteConfig || { tags: [] },
|
||
l = a.reduce(
|
||
(h, f) => (
|
||
this.collectTagNames(f).forEach((k) => {
|
||
const u = z(f) ? f[k] : null;
|
||
h[k.toLowerCase()] = u || {};
|
||
}),
|
||
h
|
||
),
|
||
{},
|
||
),
|
||
c = Object.assign({}, l, n.baseSanitizeConfig);
|
||
if (i.tagName.toLowerCase() === "table") {
|
||
const h = Z(i.outerHTML, c);
|
||
i = d.make("div", void 0, { innerHTML: h }).firstChild;
|
||
} else i.innerHTML = Z(i.innerHTML, c);
|
||
const p = this.composePasteEvent("tag", { data: i });
|
||
return { content: i, isBlock: r, tool: n.name, event: p };
|
||
})
|
||
.filter((o) => {
|
||
const i = d.isEmpty(o.content),
|
||
n = d.isSingleTag(o.content);
|
||
return !i || n;
|
||
})
|
||
);
|
||
}
|
||
processPlain(s) {
|
||
const { defaultBlock: t } = this.config;
|
||
if (!s) return [];
|
||
const e = t;
|
||
return s
|
||
.split(/\r?\n/)
|
||
.filter((o) => o.trim())
|
||
.map((o) => {
|
||
const i = d.make("div");
|
||
i.textContent = o;
|
||
const n = this.composePasteEvent("tag", { data: i });
|
||
return { content: i, tool: e, isBlock: !1, event: n };
|
||
});
|
||
}
|
||
async processSingleBlock(s) {
|
||
const { Caret: t, BlockManager: e } = this.Editor,
|
||
{ currentBlock: o } = e;
|
||
if (
|
||
!o ||
|
||
s.tool !== o.name ||
|
||
!d.containsOnlyInlineElements(s.content.innerHTML)
|
||
) {
|
||
this.insertBlock(s, (o == null ? void 0 : o.tool.isDefault) && o.isEmpty);
|
||
return;
|
||
}
|
||
t.insertContentAtCaretPosition(s.content.innerHTML);
|
||
}
|
||
async processInlinePaste(s) {
|
||
const { BlockManager: t, Caret: e } = this.Editor,
|
||
{ content: o } = s;
|
||
if (
|
||
t.currentBlock &&
|
||
t.currentBlock.tool.isDefault &&
|
||
o.textContent.length < Ee.PATTERN_PROCESSING_MAX_LENGTH
|
||
) {
|
||
const i = await this.processPattern(o.textContent);
|
||
if (i) {
|
||
const n =
|
||
t.currentBlock &&
|
||
t.currentBlock.tool.isDefault &&
|
||
t.currentBlock.isEmpty,
|
||
r = t.paste(i.tool, i.event, n);
|
||
e.setToBlock(r, e.positions.END);
|
||
return;
|
||
}
|
||
}
|
||
if (t.currentBlock && t.currentBlock.currentInput) {
|
||
const i = t.currentBlock.tool.baseSanitizeConfig;
|
||
document.execCommand("insertHTML", !1, Z(o.innerHTML, i));
|
||
} else this.insertBlock(s);
|
||
}
|
||
async processPattern(s) {
|
||
const t = this.toolsPatterns.find((e) => {
|
||
const o = e.pattern.exec(s);
|
||
return o ? s === o.shift() : !1;
|
||
});
|
||
return t
|
||
? {
|
||
event: this.composePasteEvent("pattern", { key: t.key, data: s }),
|
||
tool: t.tool.name,
|
||
}
|
||
: void 0;
|
||
}
|
||
insertBlock(s, t = !1) {
|
||
const { BlockManager: e, Caret: o } = this.Editor,
|
||
{ currentBlock: i } = e;
|
||
let n;
|
||
if (t && i && i.isEmpty) {
|
||
(n = e.paste(s.tool, s.event, !0)), o.setToBlock(n, o.positions.END);
|
||
return;
|
||
}
|
||
(n = e.paste(s.tool, s.event)), o.setToBlock(n, o.positions.END);
|
||
}
|
||
insertEditorJSData(s) {
|
||
const { BlockManager: t, Caret: e, Tools: o } = this.Editor;
|
||
fe(s, (i) => o.blockTools.get(i).sanitizeConfig).forEach(
|
||
({ tool: i, data: n }, r) => {
|
||
let a = !1;
|
||
r === 0 &&
|
||
(a =
|
||
t.currentBlock &&
|
||
t.currentBlock.tool.isDefault &&
|
||
t.currentBlock.isEmpty);
|
||
const l = t.insert({ tool: i, data: n, replace: a });
|
||
e.setToBlock(l, e.positions.END);
|
||
},
|
||
);
|
||
}
|
||
processElementNode(s, t, e) {
|
||
const o = Object.keys(this.toolsTags),
|
||
i = s,
|
||
{ tool: n } = this.toolsTags[i.tagName] || {},
|
||
r = this.tagsByTool[n == null ? void 0 : n.name] || [],
|
||
a = o.includes(i.tagName),
|
||
l = d.blockElements.includes(i.tagName.toLowerCase()),
|
||
c = Array.from(i.children).some(
|
||
({ tagName: h }) => o.includes(h) && !r.includes(h),
|
||
),
|
||
p = Array.from(i.children).some(({ tagName: h }) =>
|
||
d.blockElements.includes(h.toLowerCase()),
|
||
);
|
||
if (!l && !a && !c) return e.appendChild(i), [...t, e];
|
||
if ((a && !c) || (l && !p && !c)) return [...t, e, i];
|
||
}
|
||
getNodes(s) {
|
||
const t = Array.from(s.childNodes);
|
||
let e;
|
||
const o = (i, n) => {
|
||
if (d.isEmpty(n) && !d.isSingleTag(n)) return i;
|
||
const r = i[i.length - 1];
|
||
let a = new DocumentFragment();
|
||
switch ((r && d.isFragment(r) && (a = i.pop()), n.nodeType)) {
|
||
case Node.ELEMENT_NODE:
|
||
if (((e = this.processElementNode(n, i, a)), e)) return e;
|
||
break;
|
||
case Node.TEXT_NODE:
|
||
return a.appendChild(n), [...i, a];
|
||
default:
|
||
return [...i, a];
|
||
}
|
||
return [...i, ...Array.from(n.childNodes).reduce(o, [])];
|
||
};
|
||
return t.reduce(o, []);
|
||
}
|
||
composePasteEvent(s, t) {
|
||
return new CustomEvent(s, { detail: t });
|
||
}
|
||
};
|
||
let Ce = Ee;
|
||
Ce.PATTERN_PROCESSING_MAX_LENGTH = 450;
|
||
class di extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.toolsDontSupportReadOnly = []),
|
||
(this.readOnlyEnabled = !1);
|
||
}
|
||
get isEnabled() {
|
||
return this.readOnlyEnabled;
|
||
}
|
||
async prepare() {
|
||
const { Tools: t } = this.Editor,
|
||
{ blockTools: e } = t,
|
||
o = [];
|
||
Array.from(e.entries()).forEach(([i, n]) => {
|
||
n.isReadOnlySupported || o.push(i);
|
||
}),
|
||
(this.toolsDontSupportReadOnly = o),
|
||
this.config.readOnly && o.length > 0 && this.throwCriticalError(),
|
||
this.toggle(this.config.readOnly);
|
||
}
|
||
async toggle(t = !this.readOnlyEnabled) {
|
||
t && this.toolsDontSupportReadOnly.length > 0 && this.throwCriticalError();
|
||
const e = this.readOnlyEnabled;
|
||
this.readOnlyEnabled = t;
|
||
for (const i in this.Editor)
|
||
this.Editor[i].toggleReadOnly && this.Editor[i].toggleReadOnly(t);
|
||
if (e === t) return this.readOnlyEnabled;
|
||
const o = await this.Editor.Saver.save();
|
||
return (
|
||
await this.Editor.BlockManager.clear(),
|
||
await this.Editor.Renderer.render(o.blocks),
|
||
this.readOnlyEnabled
|
||
);
|
||
}
|
||
throwCriticalError() {
|
||
throw new de(
|
||
`To enable read-only mode all connected tools should support it. Tools ${this.toolsDontSupportReadOnly.join(
|
||
", ",
|
||
)} don't support read-only mode.`,
|
||
);
|
||
}
|
||
}
|
||
class ft extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.isRectSelectionActivated = !1),
|
||
(this.SCROLL_SPEED = 3),
|
||
(this.HEIGHT_OF_SCROLL_ZONE = 40),
|
||
(this.BOTTOM_SCROLL_ZONE = 1),
|
||
(this.TOP_SCROLL_ZONE = 2),
|
||
(this.MAIN_MOUSE_BUTTON = 0),
|
||
(this.mousedown = !1),
|
||
(this.isScrolling = !1),
|
||
(this.inScrollZone = null),
|
||
(this.startX = 0),
|
||
(this.startY = 0),
|
||
(this.mouseX = 0),
|
||
(this.mouseY = 0),
|
||
(this.stackOfSelected = []),
|
||
(this.listenerIds = []);
|
||
}
|
||
static get CSS() {
|
||
return {
|
||
overlay: "codex-editor-overlay",
|
||
overlayContainer: "codex-editor-overlay__container",
|
||
rect: "codex-editor-overlay__rectangle",
|
||
topScrollZone: "codex-editor-overlay__scroll-zone--top",
|
||
bottomScrollZone: "codex-editor-overlay__scroll-zone--bottom",
|
||
};
|
||
}
|
||
prepare() {
|
||
this.enableModuleBindings();
|
||
}
|
||
startSelection(t, e) {
|
||
const o = document.elementFromPoint(
|
||
t - window.pageXOffset,
|
||
e - window.pageYOffset,
|
||
);
|
||
o.closest(`.${this.Editor.Toolbar.CSS.toolbar}`) ||
|
||
((this.Editor.BlockSelection.allBlocksSelected = !1),
|
||
this.clearSelection(),
|
||
(this.stackOfSelected = []));
|
||
const i = [
|
||
`.${F.CSS.content}`,
|
||
`.${this.Editor.Toolbar.CSS.toolbar}`,
|
||
`.${this.Editor.InlineToolbar.CSS.inlineToolbar}`,
|
||
],
|
||
n = o.closest("." + this.Editor.UI.CSS.editorWrapper),
|
||
r = i.some((a) => !!o.closest(a));
|
||
!n || r || ((this.mousedown = !0), (this.startX = t), (this.startY = e));
|
||
}
|
||
endSelection() {
|
||
(this.mousedown = !1),
|
||
(this.startX = 0),
|
||
(this.startY = 0),
|
||
(this.overlayRectangle.style.display = "none");
|
||
}
|
||
isRectActivated() {
|
||
return this.isRectSelectionActivated;
|
||
}
|
||
clearSelection() {
|
||
this.isRectSelectionActivated = !1;
|
||
}
|
||
enableModuleBindings() {
|
||
const { container: t } = this.genHTML();
|
||
this.listeners.on(
|
||
t,
|
||
"mousedown",
|
||
(e) => {
|
||
this.processMouseDown(e);
|
||
},
|
||
!1,
|
||
),
|
||
this.listeners.on(
|
||
document.body,
|
||
"mousemove",
|
||
St((e) => {
|
||
this.processMouseMove(e);
|
||
}, 10),
|
||
{ passive: !0 },
|
||
),
|
||
this.listeners.on(document.body, "mouseleave", () => {
|
||
this.processMouseLeave();
|
||
}),
|
||
this.listeners.on(
|
||
window,
|
||
"scroll",
|
||
St((e) => {
|
||
this.processScroll(e);
|
||
}, 10),
|
||
{ passive: !0 },
|
||
),
|
||
this.listeners.on(
|
||
document.body,
|
||
"mouseup",
|
||
() => {
|
||
this.processMouseUp();
|
||
},
|
||
!1,
|
||
);
|
||
}
|
||
processMouseDown(t) {
|
||
t.button === this.MAIN_MOUSE_BUTTON &&
|
||
(t.target.closest(d.allInputsSelector) !== null ||
|
||
this.startSelection(t.pageX, t.pageY));
|
||
}
|
||
processMouseMove(t) {
|
||
this.changingRectangle(t), this.scrollByZones(t.clientY);
|
||
}
|
||
processMouseLeave() {
|
||
this.clearSelection(), this.endSelection();
|
||
}
|
||
processScroll(t) {
|
||
this.changingRectangle(t);
|
||
}
|
||
processMouseUp() {
|
||
this.clearSelection(), this.endSelection();
|
||
}
|
||
scrollByZones(t) {
|
||
if (
|
||
((this.inScrollZone = null),
|
||
t <= this.HEIGHT_OF_SCROLL_ZONE &&
|
||
(this.inScrollZone = this.TOP_SCROLL_ZONE),
|
||
document.documentElement.clientHeight - t <= this.HEIGHT_OF_SCROLL_ZONE &&
|
||
(this.inScrollZone = this.BOTTOM_SCROLL_ZONE),
|
||
!this.inScrollZone)
|
||
) {
|
||
this.isScrolling = !1;
|
||
return;
|
||
}
|
||
this.isScrolling ||
|
||
(this.scrollVertical(
|
||
this.inScrollZone === this.TOP_SCROLL_ZONE
|
||
? -this.SCROLL_SPEED
|
||
: this.SCROLL_SPEED,
|
||
),
|
||
(this.isScrolling = !0));
|
||
}
|
||
genHTML() {
|
||
const { UI: t } = this.Editor,
|
||
e = t.nodes.holder.querySelector("." + t.CSS.editorWrapper),
|
||
o = d.make("div", ft.CSS.overlay, {}),
|
||
i = d.make("div", ft.CSS.overlayContainer, {}),
|
||
n = d.make("div", ft.CSS.rect, {});
|
||
return (
|
||
i.appendChild(n),
|
||
o.appendChild(i),
|
||
e.appendChild(o),
|
||
(this.overlayRectangle = n),
|
||
{ container: e, overlay: o }
|
||
);
|
||
}
|
||
scrollVertical(t) {
|
||
if (!(this.inScrollZone && this.mousedown)) return;
|
||
const e = window.pageYOffset;
|
||
window.scrollBy(0, t),
|
||
(this.mouseY += window.pageYOffset - e),
|
||
setTimeout(() => {
|
||
this.scrollVertical(t);
|
||
}, 0);
|
||
}
|
||
changingRectangle(t) {
|
||
if (!this.mousedown) return;
|
||
t.pageY !== void 0 && ((this.mouseX = t.pageX), (this.mouseY = t.pageY));
|
||
const {
|
||
rightPos: e,
|
||
leftPos: o,
|
||
index: i,
|
||
} = this.genInfoForMouseSelection(),
|
||
n = this.startX > e && this.mouseX > e,
|
||
r = this.startX < o && this.mouseX < o;
|
||
(this.rectCrossesBlocks = !(n || r)),
|
||
this.isRectSelectionActivated ||
|
||
((this.rectCrossesBlocks = !1),
|
||
(this.isRectSelectionActivated = !0),
|
||
this.shrinkRectangleToPoint(),
|
||
(this.overlayRectangle.style.display = "block")),
|
||
this.updateRectangleSize(),
|
||
this.Editor.Toolbar.close(),
|
||
i !== void 0 &&
|
||
(this.trySelectNextBlock(i),
|
||
this.inverseSelection(),
|
||
b.get().removeAllRanges());
|
||
}
|
||
shrinkRectangleToPoint() {
|
||
(this.overlayRectangle.style.left = `${
|
||
this.startX - window.pageXOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.top = `${
|
||
this.startY - window.pageYOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.bottom = `calc(100% - ${
|
||
this.startY - window.pageYOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.right = `calc(100% - ${
|
||
this.startX - window.pageXOffset
|
||
}px`);
|
||
}
|
||
inverseSelection() {
|
||
const t = this.Editor.BlockManager.getBlockByIndex(
|
||
this.stackOfSelected[0],
|
||
).selected;
|
||
if (this.rectCrossesBlocks && !t)
|
||
for (const e of this.stackOfSelected)
|
||
this.Editor.BlockSelection.selectBlockByIndex(e);
|
||
if (!this.rectCrossesBlocks && t)
|
||
for (const e of this.stackOfSelected)
|
||
this.Editor.BlockSelection.unSelectBlockByIndex(e);
|
||
}
|
||
updateRectangleSize() {
|
||
this.mouseY >= this.startY
|
||
? ((this.overlayRectangle.style.top = `${
|
||
this.startY - window.pageYOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.bottom = `calc(100% - ${
|
||
this.mouseY - window.pageYOffset
|
||
}px`))
|
||
: ((this.overlayRectangle.style.bottom = `calc(100% - ${
|
||
this.startY - window.pageYOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.top = `${
|
||
this.mouseY - window.pageYOffset
|
||
}px`)),
|
||
this.mouseX >= this.startX
|
||
? ((this.overlayRectangle.style.left = `${
|
||
this.startX - window.pageXOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.right = `calc(100% - ${
|
||
this.mouseX - window.pageXOffset
|
||
}px`))
|
||
: ((this.overlayRectangle.style.right = `calc(100% - ${
|
||
this.startX - window.pageXOffset
|
||
}px`),
|
||
(this.overlayRectangle.style.left = `${
|
||
this.mouseX - window.pageXOffset
|
||
}px`));
|
||
}
|
||
genInfoForMouseSelection() {
|
||
const t = document.body.offsetWidth / 2,
|
||
e = this.mouseY - window.pageYOffset,
|
||
o = document.elementFromPoint(t, e),
|
||
i = this.Editor.BlockManager.getBlockByChildNode(o);
|
||
let n;
|
||
i !== void 0 &&
|
||
(n = this.Editor.BlockManager.blocks.findIndex(
|
||
(p) => p.holder === i.holder,
|
||
));
|
||
const r = this.Editor.BlockManager.lastBlock.holder.querySelector(
|
||
"." + F.CSS.content,
|
||
),
|
||
a = Number.parseInt(window.getComputedStyle(r).width, 10) / 2,
|
||
l = t - a,
|
||
c = t + a;
|
||
return { index: n, leftPos: l, rightPos: c };
|
||
}
|
||
addBlockInSelection(t) {
|
||
this.rectCrossesBlocks && this.Editor.BlockSelection.selectBlockByIndex(t),
|
||
this.stackOfSelected.push(t);
|
||
}
|
||
trySelectNextBlock(t) {
|
||
const e = this.stackOfSelected[this.stackOfSelected.length - 1] === t,
|
||
o = this.stackOfSelected.length,
|
||
i = 1,
|
||
n = -1,
|
||
r = 0;
|
||
if (e) return;
|
||
const a = this.stackOfSelected[o - 1] - this.stackOfSelected[o - 2] > 0;
|
||
let l = r;
|
||
o > 1 && (l = a ? i : n);
|
||
const c = t > this.stackOfSelected[o - 1] && l === i,
|
||
p = t < this.stackOfSelected[o - 1] && l === n,
|
||
h = !(c || p || l === r);
|
||
if (
|
||
!h &&
|
||
(t > this.stackOfSelected[o - 1] ||
|
||
this.stackOfSelected[o - 1] === void 0)
|
||
) {
|
||
let u = this.stackOfSelected[o - 1] + 1 || t;
|
||
for (u; u <= t; u++) this.addBlockInSelection(u);
|
||
return;
|
||
}
|
||
if (!h && t < this.stackOfSelected[o - 1]) {
|
||
for (let u = this.stackOfSelected[o - 1] - 1; u >= t; u--)
|
||
this.addBlockInSelection(u);
|
||
return;
|
||
}
|
||
if (!h) return;
|
||
let f = o - 1,
|
||
k;
|
||
for (
|
||
t > this.stackOfSelected[o - 1]
|
||
? (k = () => t > this.stackOfSelected[f])
|
||
: (k = () => t < this.stackOfSelected[f]);
|
||
k();
|
||
|
||
)
|
||
this.rectCrossesBlocks &&
|
||
this.Editor.BlockSelection.unSelectBlockByIndex(
|
||
this.stackOfSelected[f],
|
||
),
|
||
this.stackOfSelected.pop(),
|
||
f--;
|
||
}
|
||
}
|
||
class hi extends T {
|
||
async render(t) {
|
||
return new Promise((e) => {
|
||
const { Tools: o, BlockManager: i } = this.Editor,
|
||
n = t.map(({ type: r, data: a, tunes: l, id: c }) => {
|
||
o.available.has(r) === !1 &&
|
||
(K(
|
||
`Tool «${r}» is not found. Check 'tools' property at the Editor.js config.`,
|
||
"warn",
|
||
),
|
||
(a = this.composeStubDataForTool(r, a, c)),
|
||
(r = o.stubTool));
|
||
let p;
|
||
try {
|
||
p = i.composeBlock({ id: c, tool: r, data: a, tunes: l });
|
||
} catch (h) {
|
||
_(`Block «${r}» skipped because of plugins error`, "error", {
|
||
data: a,
|
||
error: h,
|
||
}),
|
||
(a = this.composeStubDataForTool(r, a, c)),
|
||
(r = o.stubTool),
|
||
(p = i.composeBlock({ id: c, tool: r, data: a, tunes: l }));
|
||
}
|
||
return p;
|
||
});
|
||
i.insertMany(n),
|
||
window.requestIdleCallback(
|
||
() => {
|
||
e();
|
||
},
|
||
{ timeout: 2e3 },
|
||
);
|
||
});
|
||
}
|
||
composeStubDataForTool(t, e, o) {
|
||
const { Tools: i } = this.Editor;
|
||
let n = t;
|
||
if (i.unavailable.has(t)) {
|
||
const r = i.unavailable.get(t).toolbox;
|
||
r !== void 0 && r[0].title !== void 0 && (n = r[0].title);
|
||
}
|
||
return { savedData: { id: o, type: t, data: e }, title: n };
|
||
}
|
||
}
|
||
class pi extends T {
|
||
async save() {
|
||
const { BlockManager: t, Tools: e } = this.Editor,
|
||
o = t.blocks,
|
||
i = [];
|
||
try {
|
||
o.forEach((a) => {
|
||
i.push(this.getSavedData(a));
|
||
});
|
||
const n = await Promise.all(i),
|
||
r = await fe(n, (a) => e.blockTools.get(a).sanitizeConfig);
|
||
return this.makeOutput(r);
|
||
} catch (n) {
|
||
K("Saving failed due to the Error %o", "error", n);
|
||
}
|
||
}
|
||
async getSavedData(t) {
|
||
const e = await t.save(),
|
||
o = e && (await t.validate(e.data));
|
||
return { ...e, isValid: o };
|
||
}
|
||
makeOutput(t) {
|
||
const e = [];
|
||
return (
|
||
t.forEach(({ id: o, tool: i, data: n, tunes: r, isValid: a }) => {
|
||
if (!a) {
|
||
_(`Block «${i}» skipped because saved data is invalid`);
|
||
return;
|
||
}
|
||
if (i === this.Editor.Tools.stubTool) {
|
||
e.push(n);
|
||
return;
|
||
}
|
||
const l = { id: o, type: i, data: n, ...(!V(r) && { tunes: r }) };
|
||
e.push(l);
|
||
}),
|
||
{ time: +new Date(), blocks: e, version: "2.28.0" }
|
||
);
|
||
}
|
||
}
|
||
var Dt = {},
|
||
ui = {
|
||
get exports() {
|
||
return Dt;
|
||
},
|
||
set exports(s) {
|
||
Dt = s;
|
||
},
|
||
};
|
||
(function (s, t) {
|
||
(function (e, o) {
|
||
s.exports = o();
|
||
})(window, function () {
|
||
return (function (e) {
|
||
var o = {};
|
||
function i(n) {
|
||
if (o[n]) return o[n].exports;
|
||
var r = (o[n] = { i: n, l: !1, exports: {} });
|
||
return e[n].call(r.exports, r, r.exports, i), (r.l = !0), r.exports;
|
||
}
|
||
return (
|
||
(i.m = e),
|
||
(i.c = o),
|
||
(i.d = function (n, r, a) {
|
||
i.o(n, r) || Object.defineProperty(n, r, { enumerable: !0, get: a });
|
||
}),
|
||
(i.r = function (n) {
|
||
typeof Symbol < "u" &&
|
||
Symbol.toStringTag &&
|
||
Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
|
||
Object.defineProperty(n, "__esModule", { value: !0 });
|
||
}),
|
||
(i.t = function (n, r) {
|
||
if (
|
||
(1 & r && (n = i(n)),
|
||
8 & r || (4 & r && typeof n == "object" && n && n.__esModule))
|
||
)
|
||
return n;
|
||
var a = Object.create(null);
|
||
if (
|
||
(i.r(a),
|
||
Object.defineProperty(a, "default", { enumerable: !0, value: n }),
|
||
2 & r && typeof n != "string")
|
||
)
|
||
for (var l in n)
|
||
i.d(
|
||
a,
|
||
l,
|
||
function (c) {
|
||
return n[c];
|
||
}.bind(null, l),
|
||
);
|
||
return a;
|
||
}),
|
||
(i.n = function (n) {
|
||
var r =
|
||
n && n.__esModule
|
||
? function () {
|
||
return n.default;
|
||
}
|
||
: function () {
|
||
return n;
|
||
};
|
||
return i.d(r, "a", r), r;
|
||
}),
|
||
(i.o = function (n, r) {
|
||
return Object.prototype.hasOwnProperty.call(n, r);
|
||
}),
|
||
(i.p = "/"),
|
||
i((i.s = 4))
|
||
);
|
||
})([
|
||
function (e, o, i) {
|
||
var n = i(1),
|
||
r = i(2);
|
||
typeof (r = r.__esModule ? r.default : r) == "string" &&
|
||
(r = [[e.i, r, ""]]);
|
||
var a = { insert: "head", singleton: !1 };
|
||
n(r, a), (e.exports = r.locals || {});
|
||
},
|
||
function (e, o, i) {
|
||
var n,
|
||
r = function () {
|
||
return (
|
||
n === void 0 &&
|
||
(n = !!(window && document && document.all && !window.atob)),
|
||
n
|
||
);
|
||
},
|
||
a = (function () {
|
||
var w = {};
|
||
return function (v) {
|
||
if (w[v] === void 0) {
|
||
var x = document.querySelector(v);
|
||
if (
|
||
window.HTMLIFrameElement &&
|
||
x instanceof window.HTMLIFrameElement
|
||
)
|
||
try {
|
||
x = x.contentDocument.head;
|
||
} catch {
|
||
x = null;
|
||
}
|
||
w[v] = x;
|
||
}
|
||
return w[v];
|
||
};
|
||
})(),
|
||
l = [];
|
||
function c(w) {
|
||
for (var v = -1, x = 0; x < l.length; x++)
|
||
if (l[x].identifier === w) {
|
||
v = x;
|
||
break;
|
||
}
|
||
return v;
|
||
}
|
||
function p(w, v) {
|
||
for (var x = {}, I = [], O = 0; O < w.length; O++) {
|
||
var m = w[O],
|
||
g = v.base ? m[0] + v.base : m[0],
|
||
y = x[g] || 0,
|
||
B = "".concat(g, " ").concat(y);
|
||
x[g] = y + 1;
|
||
var A = c(B),
|
||
S = { css: m[1], media: m[2], sourceMap: m[3] };
|
||
A !== -1
|
||
? (l[A].references++, l[A].updater(S))
|
||
: l.push({ identifier: B, updater: D(S, v), references: 1 }),
|
||
I.push(B);
|
||
}
|
||
return I;
|
||
}
|
||
function h(w) {
|
||
var v = document.createElement("style"),
|
||
x = w.attributes || {};
|
||
if (x.nonce === void 0) {
|
||
var I = i.nc;
|
||
I && (x.nonce = I);
|
||
}
|
||
if (
|
||
(Object.keys(x).forEach(function (m) {
|
||
v.setAttribute(m, x[m]);
|
||
}),
|
||
typeof w.insert == "function")
|
||
)
|
||
w.insert(v);
|
||
else {
|
||
var O = a(w.insert || "head");
|
||
if (!O)
|
||
throw new Error(
|
||
"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.",
|
||
);
|
||
O.appendChild(v);
|
||
}
|
||
return v;
|
||
}
|
||
var f,
|
||
k =
|
||
((f = []),
|
||
function (w, v) {
|
||
return (
|
||
(f[w] = v),
|
||
f.filter(Boolean).join(`
|
||
`)
|
||
);
|
||
});
|
||
function u(w, v, x, I) {
|
||
var O = x
|
||
? ""
|
||
: I.media
|
||
? "@media ".concat(I.media, " {").concat(I.css, "}")
|
||
: I.css;
|
||
if (w.styleSheet) w.styleSheet.cssText = k(v, O);
|
||
else {
|
||
var m = document.createTextNode(O),
|
||
g = w.childNodes;
|
||
g[v] && w.removeChild(g[v]),
|
||
g.length ? w.insertBefore(m, g[v]) : w.appendChild(m);
|
||
}
|
||
}
|
||
function C(w, v, x) {
|
||
var I = x.css,
|
||
O = x.media,
|
||
m = x.sourceMap;
|
||
if (
|
||
(O ? w.setAttribute("media", O) : w.removeAttribute("media"),
|
||
m &&
|
||
btoa &&
|
||
(I += `
|
||
/*# sourceMappingURL=data:application/json;base64,`.concat(
|
||
btoa(unescape(encodeURIComponent(JSON.stringify(m)))),
|
||
" */",
|
||
)),
|
||
w.styleSheet)
|
||
)
|
||
w.styleSheet.cssText = I;
|
||
else {
|
||
for (; w.firstChild; ) w.removeChild(w.firstChild);
|
||
w.appendChild(document.createTextNode(I));
|
||
}
|
||
}
|
||
var L = null,
|
||
N = 0;
|
||
function D(w, v) {
|
||
var x, I, O;
|
||
if (v.singleton) {
|
||
var m = N++;
|
||
(x = L || (L = h(v))),
|
||
(I = u.bind(null, x, m, !1)),
|
||
(O = u.bind(null, x, m, !0));
|
||
} else
|
||
(x = h(v)),
|
||
(I = C.bind(null, x, v)),
|
||
(O = function () {
|
||
(function (g) {
|
||
if (g.parentNode === null) return !1;
|
||
g.parentNode.removeChild(g);
|
||
})(x);
|
||
});
|
||
return (
|
||
I(w),
|
||
function (g) {
|
||
if (g) {
|
||
if (
|
||
g.css === w.css &&
|
||
g.media === w.media &&
|
||
g.sourceMap === w.sourceMap
|
||
)
|
||
return;
|
||
I((w = g));
|
||
} else O();
|
||
}
|
||
);
|
||
}
|
||
e.exports = function (w, v) {
|
||
(v = v || {}).singleton ||
|
||
typeof v.singleton == "boolean" ||
|
||
(v.singleton = r());
|
||
var x = p((w = w || []), v);
|
||
return function (I) {
|
||
if (
|
||
((I = I || []),
|
||
Object.prototype.toString.call(I) === "[object Array]")
|
||
) {
|
||
for (var O = 0; O < x.length; O++) {
|
||
var m = c(x[O]);
|
||
l[m].references--;
|
||
}
|
||
for (var g = p(I, v), y = 0; y < x.length; y++) {
|
||
var B = c(x[y]);
|
||
l[B].references === 0 && (l[B].updater(), l.splice(B, 1));
|
||
}
|
||
x = g;
|
||
}
|
||
};
|
||
};
|
||
},
|
||
function (e, o, i) {
|
||
(o = i(3)(!1)).push([
|
||
e.i,
|
||
`.ce-paragraph {
|
||
line-height: 1.6em;
|
||
outline: none;
|
||
}
|
||
|
||
.ce-paragraph[data-placeholder]:empty::before{
|
||
content: attr(data-placeholder);
|
||
color: #707684;
|
||
font-weight: normal;
|
||
opacity: 0;
|
||
}
|
||
|
||
/** Show placeholder at the first paragraph if Editor is empty */
|
||
.codex-editor--empty .ce-block:first-child .ce-paragraph[data-placeholder]:empty::before {
|
||
opacity: 1;
|
||
}
|
||
|
||
.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph[data-placeholder]:empty::before,
|
||
.codex-editor--empty .ce-block:first-child .ce-paragraph[data-placeholder]:empty:focus::before {
|
||
opacity: 0;
|
||
}
|
||
|
||
.ce-paragraph p:first-of-type{
|
||
margin-top: 0;
|
||
}
|
||
|
||
.ce-paragraph p:last-of-type{
|
||
margin-bottom: 0;
|
||
}
|
||
`,
|
||
"",
|
||
]),
|
||
(e.exports = o);
|
||
},
|
||
function (e, o, i) {
|
||
e.exports = function (n) {
|
||
var r = [];
|
||
return (
|
||
(r.toString = function () {
|
||
return this.map(function (a) {
|
||
var l = (function (c, p) {
|
||
var h = c[1] || "",
|
||
f = c[3];
|
||
if (!f) return h;
|
||
if (p && typeof btoa == "function") {
|
||
var k =
|
||
((C = f),
|
||
(L = btoa(
|
||
unescape(encodeURIComponent(JSON.stringify(C))),
|
||
)),
|
||
(N =
|
||
"sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(
|
||
L,
|
||
)),
|
||
"/*# ".concat(N, " */")),
|
||
u = f.sources.map(function (D) {
|
||
return "/*# sourceURL="
|
||
.concat(f.sourceRoot || "")
|
||
.concat(D, " */");
|
||
});
|
||
return [h].concat(u).concat([k]).join(`
|
||
`);
|
||
}
|
||
var C, L, N;
|
||
return [h].join(`
|
||
`);
|
||
})(a, n);
|
||
return a[2] ? "@media ".concat(a[2], " {").concat(l, "}") : l;
|
||
}).join("");
|
||
}),
|
||
(r.i = function (a, l, c) {
|
||
typeof a == "string" && (a = [[null, a, ""]]);
|
||
var p = {};
|
||
if (c)
|
||
for (var h = 0; h < this.length; h++) {
|
||
var f = this[h][0];
|
||
f != null && (p[f] = !0);
|
||
}
|
||
for (var k = 0; k < a.length; k++) {
|
||
var u = [].concat(a[k]);
|
||
(c && p[u[0]]) ||
|
||
(l &&
|
||
(u[2]
|
||
? (u[2] = "".concat(l, " and ").concat(u[2]))
|
||
: (u[2] = l)),
|
||
r.push(u));
|
||
}
|
||
}),
|
||
r
|
||
);
|
||
};
|
||
},
|
||
function (e, o, i) {
|
||
i.r(o),
|
||
i.d(o, "default", function () {
|
||
return a;
|
||
}),
|
||
i(0);
|
||
function n(l, c) {
|
||
for (var p = 0; p < c.length; p++) {
|
||
var h = c[p];
|
||
(h.enumerable = h.enumerable || !1),
|
||
(h.configurable = !0),
|
||
"value" in h && (h.writable = !0),
|
||
Object.defineProperty(l, h.key, h);
|
||
}
|
||
}
|
||
function r(l, c, p) {
|
||
return c && n(l.prototype, c), p && n(l, p), l;
|
||
}
|
||
/**
|
||
* Base Paragraph Block for the Editor.js.
|
||
* Represents a regular text block
|
||
*
|
||
* @author CodeX (team@codex.so)
|
||
* @copyright CodeX 2018
|
||
* @license The MIT License (MIT)
|
||
*/ var a = (function () {
|
||
function l(c) {
|
||
var p = c.data,
|
||
h = c.config,
|
||
f = c.api,
|
||
k = c.readOnly;
|
||
(function (u, C) {
|
||
if (!(u instanceof C))
|
||
throw new TypeError("Cannot call a class as a function");
|
||
})(this, l),
|
||
(this.api = f),
|
||
(this.readOnly = k),
|
||
(this._CSS = {
|
||
block: this.api.styles.block,
|
||
wrapper: "ce-paragraph",
|
||
}),
|
||
this.readOnly || (this.onKeyUp = this.onKeyUp.bind(this)),
|
||
(this._placeholder = h.placeholder
|
||
? h.placeholder
|
||
: l.DEFAULT_PLACEHOLDER),
|
||
(this._data = {}),
|
||
(this._element = null),
|
||
(this._preserveBlank =
|
||
h.preserveBlank !== void 0 && h.preserveBlank),
|
||
(this.data = p);
|
||
}
|
||
return (
|
||
r(l, null, [
|
||
{
|
||
key: "DEFAULT_PLACEHOLDER",
|
||
get: function () {
|
||
return "";
|
||
},
|
||
},
|
||
]),
|
||
r(
|
||
l,
|
||
[
|
||
{
|
||
key: "onKeyUp",
|
||
value: function (c) {
|
||
(c.code !== "Backspace" && c.code !== "Delete") ||
|
||
(this._element.textContent === "" &&
|
||
(this._element.innerHTML = ""));
|
||
},
|
||
},
|
||
{
|
||
key: "drawView",
|
||
value: function () {
|
||
var c = document.createElement("DIV");
|
||
return (
|
||
c.classList.add(this._CSS.wrapper, this._CSS.block),
|
||
(c.contentEditable = !1),
|
||
(c.dataset.placeholder = this.api.i18n.t(
|
||
this._placeholder,
|
||
)),
|
||
this.readOnly ||
|
||
((c.contentEditable = !0),
|
||
c.addEventListener("keyup", this.onKeyUp)),
|
||
c
|
||
);
|
||
},
|
||
},
|
||
{
|
||
key: "render",
|
||
value: function () {
|
||
return (
|
||
this._element === null &&
|
||
(this._element = this.drawView()),
|
||
this.hydrate(),
|
||
this._element
|
||
);
|
||
},
|
||
},
|
||
{
|
||
key: "merge",
|
||
value: function (c) {
|
||
var p = { text: this.data.text + c.text };
|
||
this.data = p;
|
||
},
|
||
},
|
||
{
|
||
key: "validate",
|
||
value: function (c) {
|
||
return !(c.text.trim() === "" && !this._preserveBlank);
|
||
},
|
||
},
|
||
{
|
||
key: "save",
|
||
value: function (c) {
|
||
return { text: c.innerHTML };
|
||
},
|
||
},
|
||
{
|
||
key: "onPaste",
|
||
value: function (c) {
|
||
var p = { text: c.detail.data.innerHTML };
|
||
this.data = p;
|
||
},
|
||
},
|
||
{
|
||
key: "hydrate",
|
||
value: function () {
|
||
var c = this;
|
||
window.requestAnimationFrame(function () {
|
||
c._element.innerHTML = c._data.text || "";
|
||
});
|
||
},
|
||
},
|
||
{
|
||
key: "data",
|
||
get: function () {
|
||
if (this._element !== null) {
|
||
var c = this._element.innerHTML;
|
||
this._data.text = c;
|
||
}
|
||
return this._data;
|
||
},
|
||
set: function (c) {
|
||
(this._data = c || {}),
|
||
this._element !== null && this.hydrate();
|
||
},
|
||
},
|
||
],
|
||
[
|
||
{
|
||
key: "conversionConfig",
|
||
get: function () {
|
||
return { export: "text", import: "text" };
|
||
},
|
||
},
|
||
{
|
||
key: "sanitize",
|
||
get: function () {
|
||
return { text: { br: !0 } };
|
||
},
|
||
},
|
||
{
|
||
key: "isReadOnlySupported",
|
||
get: function () {
|
||
return !0;
|
||
},
|
||
},
|
||
{
|
||
key: "pasteConfig",
|
||
get: function () {
|
||
return { tags: ["P"] };
|
||
},
|
||
},
|
||
{
|
||
key: "toolbox",
|
||
get: function () {
|
||
return {
|
||
icon: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M8 9V7.2C8 7.08954 8.08954 7 8.2 7L12 7M16 9V7.2C16 7.08954 15.9105 7 15.8 7L12 7M12 7L12 17M12 17H10M12 17H14"/></svg>',
|
||
title: "Text",
|
||
};
|
||
},
|
||
},
|
||
],
|
||
),
|
||
l
|
||
);
|
||
})();
|
||
},
|
||
]).default;
|
||
});
|
||
})(ui);
|
||
const fi = xt(Dt);
|
||
class Yt {
|
||
constructor() {
|
||
(this.commandName = "bold"),
|
||
(this.CSS = {
|
||
button: "ce-inline-tool",
|
||
buttonActive: "ce-inline-tool--active",
|
||
buttonModifier: "ce-inline-tool--bold",
|
||
}),
|
||
(this.nodes = { button: void 0 });
|
||
}
|
||
static get sanitize() {
|
||
return { b: {} };
|
||
}
|
||
render() {
|
||
return (
|
||
(this.nodes.button = document.createElement("button")),
|
||
(this.nodes.button.type = "button"),
|
||
this.nodes.button.classList.add(this.CSS.button, this.CSS.buttonModifier),
|
||
(this.nodes.button.innerHTML = Do),
|
||
this.nodes.button
|
||
);
|
||
}
|
||
surround() {
|
||
document.execCommand(this.commandName);
|
||
}
|
||
checkState() {
|
||
const t = document.queryCommandState(this.commandName);
|
||
return this.nodes.button.classList.toggle(this.CSS.buttonActive, t), t;
|
||
}
|
||
get shortcut() {
|
||
return "CMD+B";
|
||
}
|
||
}
|
||
Yt.isInline = !0;
|
||
Yt.title = "Bold";
|
||
class Kt {
|
||
constructor() {
|
||
(this.commandName = "italic"),
|
||
(this.CSS = {
|
||
button: "ce-inline-tool",
|
||
buttonActive: "ce-inline-tool--active",
|
||
buttonModifier: "ce-inline-tool--italic",
|
||
}),
|
||
(this.nodes = { button: null });
|
||
}
|
||
static get sanitize() {
|
||
return { i: {} };
|
||
}
|
||
render() {
|
||
return (
|
||
(this.nodes.button = document.createElement("button")),
|
||
(this.nodes.button.type = "button"),
|
||
this.nodes.button.classList.add(this.CSS.button, this.CSS.buttonModifier),
|
||
(this.nodes.button.innerHTML = Ho),
|
||
this.nodes.button
|
||
);
|
||
}
|
||
surround() {
|
||
document.execCommand(this.commandName);
|
||
}
|
||
checkState() {
|
||
const t = document.queryCommandState(this.commandName);
|
||
return this.nodes.button.classList.toggle(this.CSS.buttonActive, t), t;
|
||
}
|
||
get shortcut() {
|
||
return "CMD+I";
|
||
}
|
||
}
|
||
Kt.isInline = !0;
|
||
Kt.title = "Italic";
|
||
class Xt {
|
||
constructor({ api: t }) {
|
||
(this.commandLink = "createLink"),
|
||
(this.commandUnlink = "unlink"),
|
||
(this.ENTER_KEY = 13),
|
||
(this.CSS = {
|
||
button: "ce-inline-tool",
|
||
buttonActive: "ce-inline-tool--active",
|
||
buttonModifier: "ce-inline-tool--link",
|
||
buttonUnlink: "ce-inline-tool--unlink",
|
||
input: "ce-inline-tool-input",
|
||
inputShowed: "ce-inline-tool-input--showed",
|
||
}),
|
||
(this.nodes = { button: null, input: null }),
|
||
(this.inputOpened = !1),
|
||
(this.toolbar = t.toolbar),
|
||
(this.inlineToolbar = t.inlineToolbar),
|
||
(this.notifier = t.notifier),
|
||
(this.i18n = t.i18n),
|
||
(this.selection = new b());
|
||
}
|
||
static get sanitize() {
|
||
return { a: { href: !0, target: "_blank", rel: "nofollow" } };
|
||
}
|
||
render() {
|
||
return (
|
||
(this.nodes.button = document.createElement("button")),
|
||
(this.nodes.button.type = "button"),
|
||
this.nodes.button.classList.add(this.CSS.button, this.CSS.buttonModifier),
|
||
(this.nodes.button.innerHTML = ee),
|
||
this.nodes.button
|
||
);
|
||
}
|
||
renderActions() {
|
||
return (
|
||
(this.nodes.input = document.createElement("input")),
|
||
(this.nodes.input.placeholder = this.i18n.t("Add a link")),
|
||
this.nodes.input.classList.add(this.CSS.input),
|
||
this.nodes.input.addEventListener("keydown", (t) => {
|
||
t.keyCode === this.ENTER_KEY && this.enterPressed(t);
|
||
}),
|
||
this.nodes.input
|
||
);
|
||
}
|
||
surround(t) {
|
||
if (t) {
|
||
this.inputOpened
|
||
? (this.selection.restore(), this.selection.removeFakeBackground())
|
||
: (this.selection.setFakeBackground(), this.selection.save());
|
||
const e = this.selection.findParentTag("A");
|
||
if (e) {
|
||
this.selection.expandToTag(e),
|
||
this.unlink(),
|
||
this.closeActions(),
|
||
this.checkState(),
|
||
this.toolbar.close();
|
||
return;
|
||
}
|
||
}
|
||
this.toggleActions();
|
||
}
|
||
checkState() {
|
||
const t = this.selection.findParentTag("A");
|
||
if (t) {
|
||
(this.nodes.button.innerHTML = $o),
|
||
this.nodes.button.classList.add(this.CSS.buttonUnlink),
|
||
this.nodes.button.classList.add(this.CSS.buttonActive),
|
||
this.openActions();
|
||
const e = t.getAttribute("href");
|
||
(this.nodes.input.value = e !== "null" ? e : ""), this.selection.save();
|
||
} else
|
||
(this.nodes.button.innerHTML = ee),
|
||
this.nodes.button.classList.remove(this.CSS.buttonUnlink),
|
||
this.nodes.button.classList.remove(this.CSS.buttonActive);
|
||
return !!t;
|
||
}
|
||
clear() {
|
||
this.closeActions();
|
||
}
|
||
get shortcut() {
|
||
return "CMD+K";
|
||
}
|
||
toggleActions() {
|
||
this.inputOpened ? this.closeActions(!1) : this.openActions(!0);
|
||
}
|
||
openActions(t = !1) {
|
||
this.nodes.input.classList.add(this.CSS.inputShowed),
|
||
t && this.nodes.input.focus(),
|
||
(this.inputOpened = !0);
|
||
}
|
||
closeActions(t = !0) {
|
||
if (this.selection.isFakeBackgroundEnabled) {
|
||
const e = new b();
|
||
e.save(),
|
||
this.selection.restore(),
|
||
this.selection.removeFakeBackground(),
|
||
e.restore();
|
||
}
|
||
this.nodes.input.classList.remove(this.CSS.inputShowed),
|
||
(this.nodes.input.value = ""),
|
||
t && this.selection.clearSaved(),
|
||
(this.inputOpened = !1);
|
||
}
|
||
enterPressed(t) {
|
||
let e = this.nodes.input.value || "";
|
||
if (!e.trim()) {
|
||
this.selection.restore(),
|
||
this.unlink(),
|
||
t.preventDefault(),
|
||
this.closeActions();
|
||
return;
|
||
}
|
||
if (!this.validateURL(e)) {
|
||
this.notifier.show({
|
||
message: "Pasted link is not valid.",
|
||
style: "error",
|
||
}),
|
||
_("Incorrect Link pasted", "warn", e);
|
||
return;
|
||
}
|
||
(e = this.prepareLink(e)),
|
||
this.selection.restore(),
|
||
this.selection.removeFakeBackground(),
|
||
this.insertLink(e),
|
||
t.preventDefault(),
|
||
t.stopPropagation(),
|
||
t.stopImmediatePropagation(),
|
||
this.selection.collapseToEnd(),
|
||
this.inlineToolbar.close();
|
||
}
|
||
validateURL(t) {
|
||
return !/\s/.test(t);
|
||
}
|
||
prepareLink(t) {
|
||
return (t = t.trim()), (t = this.addProtocol(t)), t;
|
||
}
|
||
addProtocol(t) {
|
||
if (/^(\w+):(\/\/)?/.test(t)) return t;
|
||
const e = /^\/[^/\s]/.test(t),
|
||
o = t.substring(0, 1) === "#",
|
||
i = /^\/\/[^/\s]/.test(t);
|
||
return !e && !o && !i && (t = "http://" + t), t;
|
||
}
|
||
insertLink(t) {
|
||
const e = this.selection.findParentTag("A");
|
||
e && this.selection.expandToTag(e),
|
||
document.execCommand(this.commandLink, !1, t);
|
||
}
|
||
unlink() {
|
||
document.execCommand(this.commandUnlink);
|
||
}
|
||
}
|
||
Xt.isInline = !0;
|
||
Xt.title = "Link";
|
||
class Be {
|
||
constructor({ data: t, api: e }) {
|
||
(this.CSS = {
|
||
wrapper: "ce-stub",
|
||
info: "ce-stub__info",
|
||
title: "ce-stub__title",
|
||
subtitle: "ce-stub__subtitle",
|
||
}),
|
||
(this.api = e),
|
||
(this.title = t.title || this.api.i18n.t("Error")),
|
||
(this.subtitle = this.api.i18n.t(
|
||
"The block can not be displayed correctly.",
|
||
)),
|
||
(this.savedData = t.savedData),
|
||
(this.wrapper = this.make());
|
||
}
|
||
render() {
|
||
return this.wrapper;
|
||
}
|
||
save() {
|
||
return this.savedData;
|
||
}
|
||
make() {
|
||
const t = d.make("div", this.CSS.wrapper),
|
||
e = Wo,
|
||
o = d.make("div", this.CSS.info),
|
||
i = d.make("div", this.CSS.title, { textContent: this.title }),
|
||
n = d.make("div", this.CSS.subtitle, { textContent: this.subtitle });
|
||
return (
|
||
(t.innerHTML = e), o.appendChild(i), o.appendChild(n), t.appendChild(o), t
|
||
);
|
||
}
|
||
}
|
||
Be.isReadOnlySupported = !0;
|
||
class gi extends Wt {
|
||
constructor() {
|
||
super(...arguments), (this.type = yt.Inline);
|
||
}
|
||
get title() {
|
||
return this.constructable[$t.Title];
|
||
}
|
||
create() {
|
||
return new this.constructable({
|
||
api: this.api.getMethodsForTool(this),
|
||
config: this.settings,
|
||
});
|
||
}
|
||
}
|
||
class mi extends Wt {
|
||
constructor() {
|
||
super(...arguments), (this.type = yt.Tune);
|
||
}
|
||
create(t, e) {
|
||
return new this.constructable({
|
||
api: this.api.getMethodsForTool(this),
|
||
config: this.settings,
|
||
block: e,
|
||
data: t,
|
||
});
|
||
}
|
||
}
|
||
class U extends Map {
|
||
get blockTools() {
|
||
const t = Array.from(this.entries()).filter(([, e]) => e.isBlock());
|
||
return new U(t);
|
||
}
|
||
get inlineTools() {
|
||
const t = Array.from(this.entries()).filter(([, e]) => e.isInline());
|
||
return new U(t);
|
||
}
|
||
get blockTunes() {
|
||
const t = Array.from(this.entries()).filter(([, e]) => e.isTune());
|
||
return new U(t);
|
||
}
|
||
get internalTools() {
|
||
const t = Array.from(this.entries()).filter(([, e]) => e.isInternal);
|
||
return new U(t);
|
||
}
|
||
get externalTools() {
|
||
const t = Array.from(this.entries()).filter(([, e]) => !e.isInternal);
|
||
return new U(t);
|
||
}
|
||
}
|
||
var bi = Object.defineProperty,
|
||
ki = Object.getOwnPropertyDescriptor,
|
||
Te = (s, t, e, o) => {
|
||
for (
|
||
var i = o > 1 ? void 0 : o ? ki(t, e) : t, n = s.length - 1, r;
|
||
n >= 0;
|
||
n--
|
||
)
|
||
(r = s[n]) && (i = (o ? r(t, e, i) : r(i)) || i);
|
||
return o && i && bi(t, e, i), i;
|
||
};
|
||
class Vt extends Wt {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.type = yt.Block),
|
||
(this.inlineTools = new U()),
|
||
(this.tunes = new U());
|
||
}
|
||
create(t, e, o) {
|
||
return new this.constructable({
|
||
data: t,
|
||
block: e,
|
||
readOnly: o,
|
||
api: this.api.getMethodsForTool(this),
|
||
config: this.settings,
|
||
});
|
||
}
|
||
get isReadOnlySupported() {
|
||
return this.constructable[st.IsReadOnlySupported] === !0;
|
||
}
|
||
get isLineBreaksEnabled() {
|
||
return this.constructable[st.IsEnabledLineBreaks];
|
||
}
|
||
get toolbox() {
|
||
const t = this.constructable[st.Toolbox],
|
||
e = this.config[kt.Toolbox];
|
||
if (!V(t) && e !== !1)
|
||
return e
|
||
? Array.isArray(t)
|
||
? Array.isArray(e)
|
||
? e.map((o, i) => {
|
||
const n = t[i];
|
||
return n ? { ...n, ...o } : o;
|
||
})
|
||
: [e]
|
||
: Array.isArray(e)
|
||
? e
|
||
: [{ ...t, ...e }]
|
||
: Array.isArray(t)
|
||
? t
|
||
: [t];
|
||
}
|
||
get conversionConfig() {
|
||
return this.constructable[st.ConversionConfig];
|
||
}
|
||
get enabledInlineTools() {
|
||
return this.config[kt.EnabledInlineTools] || !1;
|
||
}
|
||
get enabledBlockTunes() {
|
||
return this.config[kt.EnabledBlockTunes];
|
||
}
|
||
get pasteConfig() {
|
||
return this.constructable[st.PasteConfig] ?? {};
|
||
}
|
||
get sanitizeConfig() {
|
||
const t = super.sanitizeConfig,
|
||
e = this.baseSanitizeConfig;
|
||
if (V(t)) return e;
|
||
const o = {};
|
||
for (const i in t)
|
||
if (Object.prototype.hasOwnProperty.call(t, i)) {
|
||
const n = t[i];
|
||
z(n) ? (o[i] = Object.assign({}, e, n)) : (o[i] = n);
|
||
}
|
||
return o;
|
||
}
|
||
get baseSanitizeConfig() {
|
||
const t = {};
|
||
return (
|
||
Array.from(this.inlineTools.values()).forEach((e) =>
|
||
Object.assign(t, e.sanitizeConfig),
|
||
),
|
||
Array.from(this.tunes.values()).forEach((e) =>
|
||
Object.assign(t, e.sanitizeConfig),
|
||
),
|
||
t
|
||
);
|
||
}
|
||
}
|
||
Te([ct], Vt.prototype, "sanitizeConfig", 1);
|
||
Te([ct], Vt.prototype, "baseSanitizeConfig", 1);
|
||
class vi {
|
||
constructor(t, e, o) {
|
||
(this.api = o), (this.config = t), (this.editorConfig = e);
|
||
}
|
||
get(t) {
|
||
const { class: e, isInternal: o = !1, ...i } = this.config[t],
|
||
n = this.getConstructor(e);
|
||
return new n({
|
||
name: t,
|
||
constructable: e,
|
||
config: i,
|
||
api: this.api,
|
||
isDefault: t === this.editorConfig.defaultBlock,
|
||
defaultPlaceholder: this.editorConfig.placeholder,
|
||
isInternal: o,
|
||
});
|
||
}
|
||
getConstructor(t) {
|
||
switch (!0) {
|
||
case t[$t.IsInline]:
|
||
return gi;
|
||
case t[ye.IsTune]:
|
||
return mi;
|
||
default:
|
||
return Vt;
|
||
}
|
||
}
|
||
}
|
||
class Se {
|
||
constructor({ api: t }) {
|
||
(this.CSS = { animation: "wobble" }), (this.api = t);
|
||
}
|
||
render() {
|
||
return {
|
||
icon: me,
|
||
title: this.api.i18n.t("Move down"),
|
||
onActivate: () => this.handleClick(),
|
||
name: "move-down",
|
||
};
|
||
}
|
||
handleClick() {
|
||
const t = this.api.blocks.getCurrentBlockIndex(),
|
||
e = this.api.blocks.getBlockByIndex(t + 1);
|
||
if (!e)
|
||
throw new Error("Unable to move Block down since it is already the last");
|
||
const o = e.holder,
|
||
i = o.getBoundingClientRect();
|
||
let n = Math.abs(window.innerHeight - o.offsetHeight);
|
||
i.top < window.innerHeight && (n = window.scrollY + o.offsetHeight),
|
||
window.scrollTo(0, n),
|
||
this.api.blocks.move(t + 1),
|
||
this.api.toolbar.toggleBlockSettings(!0);
|
||
}
|
||
}
|
||
Se.isTune = !0;
|
||
class Ie {
|
||
constructor({ api: t }) {
|
||
this.api = t;
|
||
}
|
||
render() {
|
||
return {
|
||
icon: Po,
|
||
title: this.api.i18n.t("Delete"),
|
||
name: "delete",
|
||
confirmation: {
|
||
title: this.api.i18n.t("Click to delete"),
|
||
onActivate: () => this.handleClick(),
|
||
},
|
||
};
|
||
}
|
||
handleClick() {
|
||
this.api.blocks.delete();
|
||
}
|
||
}
|
||
Ie.isTune = !0;
|
||
class Me {
|
||
constructor({ api: t }) {
|
||
(this.CSS = { animation: "wobble" }), (this.api = t);
|
||
}
|
||
render() {
|
||
return {
|
||
icon: Ro,
|
||
title: this.api.i18n.t("Move up"),
|
||
onActivate: () => this.handleClick(),
|
||
name: "move-up",
|
||
};
|
||
}
|
||
handleClick() {
|
||
const t = this.api.blocks.getCurrentBlockIndex(),
|
||
e = this.api.blocks.getBlockByIndex(t),
|
||
o = this.api.blocks.getBlockByIndex(t - 1);
|
||
if (t === 0 || !e || !o)
|
||
throw new Error("Unable to move Block up since it is already the first");
|
||
const i = e.holder,
|
||
n = o.holder,
|
||
r = i.getBoundingClientRect(),
|
||
a = n.getBoundingClientRect();
|
||
let l;
|
||
a.top > 0
|
||
? (l = Math.abs(r.top) - Math.abs(a.top))
|
||
: (l = Math.abs(r.top) + a.height),
|
||
window.scrollBy(0, -1 * l),
|
||
this.api.blocks.move(t - 1),
|
||
this.api.toolbar.toggleBlockSettings(!0);
|
||
}
|
||
}
|
||
Me.isTune = !0;
|
||
var xi = Object.defineProperty,
|
||
wi = Object.getOwnPropertyDescriptor,
|
||
yi = (s, t, e, o) => {
|
||
for (
|
||
var i = o > 1 ? void 0 : o ? wi(t, e) : t, n = s.length - 1, r;
|
||
n >= 0;
|
||
n--
|
||
)
|
||
(r = s[n]) && (i = (o ? r(t, e, i) : r(i)) || i);
|
||
return o && i && xi(t, e, i), i;
|
||
};
|
||
class _e extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.stubTool = "stub"),
|
||
(this.toolsAvailable = new U()),
|
||
(this.toolsUnavailable = new U());
|
||
}
|
||
get available() {
|
||
return this.toolsAvailable;
|
||
}
|
||
get unavailable() {
|
||
return this.toolsUnavailable;
|
||
}
|
||
get inlineTools() {
|
||
return this.available.inlineTools;
|
||
}
|
||
get blockTools() {
|
||
return this.available.blockTools;
|
||
}
|
||
get blockTunes() {
|
||
return this.available.blockTunes;
|
||
}
|
||
get defaultTool() {
|
||
return this.blockTools.get(this.config.defaultBlock);
|
||
}
|
||
get internal() {
|
||
return this.available.internalTools;
|
||
}
|
||
async prepare() {
|
||
if (
|
||
(this.validateTools(),
|
||
(this.config.tools = It({}, this.internalTools, this.config.tools)),
|
||
!Object.prototype.hasOwnProperty.call(this.config, "tools") ||
|
||
Object.keys(this.config.tools).length === 0)
|
||
)
|
||
throw Error("Can't start without tools");
|
||
const t = this.prepareConfig();
|
||
this.factory = new vi(t, this.config, this.Editor.API);
|
||
const e = this.getListOfPrepareFunctions(t);
|
||
if (e.length === 0) return Promise.resolve();
|
||
await We(
|
||
e,
|
||
(o) => {
|
||
this.toolPrepareMethodSuccess(o);
|
||
},
|
||
(o) => {
|
||
this.toolPrepareMethodFallback(o);
|
||
},
|
||
),
|
||
this.prepareBlockTools();
|
||
}
|
||
getAllInlineToolsSanitizeConfig() {
|
||
const t = {};
|
||
return (
|
||
Array.from(this.inlineTools.values()).forEach((e) => {
|
||
Object.assign(t, e.sanitizeConfig);
|
||
}),
|
||
t
|
||
);
|
||
}
|
||
destroy() {
|
||
Object.values(this.available).forEach(async (t) => {
|
||
R(t.reset) && (await t.reset());
|
||
});
|
||
}
|
||
get internalTools() {
|
||
return {
|
||
bold: { class: Yt, isInternal: !0 },
|
||
italic: { class: Kt, isInternal: !0 },
|
||
link: { class: Xt, isInternal: !0 },
|
||
paragraph: { class: fi, inlineToolbar: !0, isInternal: !0 },
|
||
stub: { class: Be, isInternal: !0 },
|
||
moveUp: { class: Me, isInternal: !0 },
|
||
delete: { class: Ie, isInternal: !0 },
|
||
moveDown: { class: Se, isInternal: !0 },
|
||
};
|
||
}
|
||
toolPrepareMethodSuccess(t) {
|
||
const e = this.factory.get(t.toolName);
|
||
if (e.isInline()) {
|
||
const o = ["render", "surround", "checkState"].filter(
|
||
(i) => !e.create()[i],
|
||
);
|
||
if (o.length) {
|
||
_(
|
||
`Incorrect Inline Tool: ${e.name}. Some of required methods is not implemented %o`,
|
||
"warn",
|
||
o,
|
||
),
|
||
this.toolsUnavailable.set(e.name, e);
|
||
return;
|
||
}
|
||
}
|
||
this.toolsAvailable.set(e.name, e);
|
||
}
|
||
toolPrepareMethodFallback(t) {
|
||
this.toolsUnavailable.set(t.toolName, this.factory.get(t.toolName));
|
||
}
|
||
getListOfPrepareFunctions(t) {
|
||
const e = [];
|
||
return (
|
||
Object.entries(t).forEach(([o, i]) => {
|
||
e.push({
|
||
function: R(i.class.prepare) ? i.class.prepare : () => {},
|
||
data: { toolName: o, config: i.config },
|
||
});
|
||
}),
|
||
e
|
||
);
|
||
}
|
||
prepareBlockTools() {
|
||
Array.from(this.blockTools.values()).forEach((t) => {
|
||
this.assignInlineToolsToBlockTool(t), this.assignBlockTunesToBlockTool(t);
|
||
});
|
||
}
|
||
assignInlineToolsToBlockTool(t) {
|
||
if (this.config.inlineToolbar !== !1) {
|
||
if (t.enabledInlineTools === !0) {
|
||
t.inlineTools = new U(
|
||
Array.isArray(this.config.inlineToolbar)
|
||
? this.config.inlineToolbar.map((e) => [e, this.inlineTools.get(e)])
|
||
: Array.from(this.inlineTools.entries()),
|
||
);
|
||
return;
|
||
}
|
||
Array.isArray(t.enabledInlineTools) &&
|
||
(t.inlineTools = new U(
|
||
t.enabledInlineTools.map((e) => [e, this.inlineTools.get(e)]),
|
||
));
|
||
}
|
||
}
|
||
assignBlockTunesToBlockTool(t) {
|
||
if (t.enabledBlockTunes !== !1) {
|
||
if (Array.isArray(t.enabledBlockTunes)) {
|
||
const e = new U(
|
||
t.enabledBlockTunes.map((o) => [o, this.blockTunes.get(o)]),
|
||
);
|
||
t.tunes = new U([...e, ...this.blockTunes.internalTools]);
|
||
return;
|
||
}
|
||
if (Array.isArray(this.config.tunes)) {
|
||
const e = new U(
|
||
this.config.tunes.map((o) => [o, this.blockTunes.get(o)]),
|
||
);
|
||
t.tunes = new U([...e, ...this.blockTunes.internalTools]);
|
||
return;
|
||
}
|
||
t.tunes = this.blockTunes.internalTools;
|
||
}
|
||
}
|
||
validateTools() {
|
||
for (const t in this.config.tools)
|
||
if (Object.prototype.hasOwnProperty.call(this.config.tools, t)) {
|
||
if (t in this.internalTools) return;
|
||
const e = this.config.tools[t];
|
||
if (!R(e) && !R(e.class))
|
||
throw Error(
|
||
`Tool «${t}» must be a constructor function or an object with function in the «class» property`,
|
||
);
|
||
}
|
||
}
|
||
prepareConfig() {
|
||
const t = {};
|
||
for (const e in this.config.tools)
|
||
z(this.config.tools[e])
|
||
? (t[e] = this.config.tools[e])
|
||
: (t[e] = { class: this.config.tools[e] });
|
||
return t;
|
||
}
|
||
}
|
||
yi([ct], _e.prototype, "getAllInlineToolsSanitizeConfig", 1);
|
||
const Ei = `:root{--selectionColor: #e1f2ff;--inlineSelectionColor: #d4ecff;--bg-light: #eff2f5;--grayText: #707684;--color-dark: #1D202B;--color-active-icon: #388AE5;--color-gray-border: rgba(201, 201, 204, .48);--content-width: 650px;--narrow-mode-right-padding: 50px;--toolbox-buttons-size: 26px;--toolbox-buttons-size--mobile: 36px;--icon-size: 20px;--icon-size--mobile: 28px;--block-padding-vertical: .4em;--color-line-gray: #EFF0F1 }.codex-editor{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1}.codex-editor .hide{display:none}.codex-editor__redactor [contenteditable]:empty:after{content:"\\feff"}@media (min-width: 651px){.codex-editor--narrow .codex-editor__redactor{margin-right:50px}}@media (min-width: 651px){.codex-editor--narrow.codex-editor--rtl .codex-editor__redactor{margin-left:50px;margin-right:0}}@media (min-width: 651px){.codex-editor--narrow .ce-toolbar__actions{right:-5px}}.codex-editor-copyable{position:absolute;height:1px;width:1px;top:-400%;opacity:.001}.codex-editor-overlay{position:fixed;top:0px;left:0px;right:0px;bottom:0px;z-index:999;pointer-events:none;overflow:hidden}.codex-editor-overlay__container{position:relative;pointer-events:auto;z-index:0}.codex-editor-overlay__rectangle{position:absolute;pointer-events:none;background-color:#2eaadc33;border:1px solid transparent}.codex-editor svg{max-height:100%}.codex-editor path{stroke:currentColor}.codex-editor ::-moz-selection{background-color:#d4ecff}.codex-editor ::selection{background-color:#d4ecff}.codex-editor--toolbox-opened [contentEditable=true][data-placeholder]:focus:before{opacity:0!important}.ce-scroll-locked{overflow:hidden}.ce-scroll-locked--hard{overflow:hidden;top:calc(-1 * var(--window-scroll-offset));position:fixed;width:100%}.ce-toolbar{position:absolute;left:0;right:0;top:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;will-change:opacity,top;display:none}.ce-toolbar--opened{display:block}.ce-toolbar__content{max-width:650px;margin:0 auto;position:relative}.ce-toolbar__plus{color:#1d202b;cursor:pointer;width:26px;height:26px;border-radius:7px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0}@media (max-width: 650px){.ce-toolbar__plus{width:36px;height:36px}}@media (hover: hover){.ce-toolbar__plus:hover{background-color:#eff2f5}}.ce-toolbar__plus--active{background-color:#eff2f5;-webkit-animation:bounceIn .75s 1;animation:bounceIn .75s 1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.ce-toolbar__plus-shortcut{opacity:.6;word-spacing:-2px;margin-top:5px}@media (max-width: 650px){.ce-toolbar__plus{position:absolute;background-color:#fff;border:1px solid #E8E8EB;-webkit-box-shadow:0 3px 15px -3px rgba(13,20,33,.13);box-shadow:0 3px 15px -3px #0d142121;border-radius:6px;z-index:2;position:static}.ce-toolbar__plus--left-oriented:before{left:15px;margin-left:0}.ce-toolbar__plus--right-oriented:before{left:auto;right:15px;margin-left:0}}.ce-toolbar__actions{position:absolute;right:100%;opacity:0;display:-webkit-box;display:-ms-flexbox;display:flex;padding-right:5px}.ce-toolbar__actions--opened{opacity:1}@media (max-width: 650px){.ce-toolbar__actions{right:auto}}.ce-toolbar__settings-btn{color:#1d202b;width:26px;height:26px;border-radius:7px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;margin-left:3px;cursor:pointer;user-select:none}@media (max-width: 650px){.ce-toolbar__settings-btn{width:36px;height:36px}}@media (hover: hover){.ce-toolbar__settings-btn:hover{background-color:#eff2f5}}.ce-toolbar__settings-btn--active{background-color:#eff2f5;-webkit-animation:bounceIn .75s 1;animation:bounceIn .75s 1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@media (min-width: 651px){.ce-toolbar__settings-btn{width:24px}}.ce-toolbar__settings-btn--hidden{display:none}@media (max-width: 650px){.ce-toolbar__settings-btn{position:absolute;background-color:#fff;border:1px solid #E8E8EB;-webkit-box-shadow:0 3px 15px -3px rgba(13,20,33,.13);box-shadow:0 3px 15px -3px #0d142121;border-radius:6px;z-index:2;position:static}.ce-toolbar__settings-btn--left-oriented:before{left:15px;margin-left:0}.ce-toolbar__settings-btn--right-oriented:before{left:auto;right:15px;margin-left:0}}.ce-toolbar__plus svg,.ce-toolbar__settings-btn svg{width:24px;height:24px}@media (min-width: 651px){.codex-editor--narrow .ce-toolbar__plus{left:5px}}@media (min-width: 651px){.codex-editor--narrow .ce-toolbox .ce-popover{right:0;left:auto;left:initial}}.ce-inline-toolbar{--y-offset: 8px;position:absolute;background-color:#fff;border:1px solid #E8E8EB;-webkit-box-shadow:0 3px 15px -3px rgba(13,20,33,.13);box-shadow:0 3px 15px -3px #0d142121;border-radius:6px;z-index:2;-webkit-transform:translateX(-50%) translateY(8px) scale(.94);transform:translate(-50%) translateY(8px) scale(.94);opacity:0;visibility:hidden;-webkit-transition:opacity .25s ease,-webkit-transform .15s ease;transition:opacity .25s ease,-webkit-transform .15s ease;transition:transform .15s ease,opacity .25s ease;transition:transform .15s ease,opacity .25s ease,-webkit-transform .15s ease;will-change:transform,opacity;top:0;left:0;z-index:3}.ce-inline-toolbar--left-oriented:before{left:15px;margin-left:0}.ce-inline-toolbar--right-oriented:before{left:auto;right:15px;margin-left:0}.ce-inline-toolbar--showed{opacity:1;visibility:visible;-webkit-transform:translateX(-50%);transform:translate(-50%)}.ce-inline-toolbar--left-oriented{-webkit-transform:translateX(-23px) translateY(8px) scale(.94);transform:translate(-23px) translateY(8px) scale(.94)}.ce-inline-toolbar--left-oriented.ce-inline-toolbar--showed{-webkit-transform:translateX(-23px);transform:translate(-23px)}.ce-inline-toolbar--right-oriented{-webkit-transform:translateX(-100%) translateY(8px) scale(.94);transform:translate(-100%) translateY(8px) scale(.94);margin-left:23px}.ce-inline-toolbar--right-oriented.ce-inline-toolbar--showed{-webkit-transform:translateX(-100%);transform:translate(-100%)}.ce-inline-toolbar [hidden]{display:none!important}.ce-inline-toolbar__toggler-and-button-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;padding:0 6px}.ce-inline-toolbar__buttons{display:-webkit-box;display:-ms-flexbox;display:flex}.ce-inline-toolbar__dropdown{display:-webkit-box;display:-ms-flexbox;display:flex;padding:6px;margin:0 6px 0 -6px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;border-right:1px solid rgba(201,201,204,.48);-webkit-box-sizing:border-box;box-sizing:border-box}@media (hover: hover){.ce-inline-toolbar__dropdown:hover{background:#eff2f5}}.ce-inline-toolbar__dropdown--hidden{display:none}.ce-inline-toolbar__dropdown-content,.ce-inline-toolbar__dropdown-arrow{display:-webkit-box;display:-ms-flexbox;display:flex}.ce-inline-toolbar__dropdown-content svg,.ce-inline-toolbar__dropdown-arrow svg{width:20px;height:20px}.ce-inline-toolbar__shortcut{opacity:.6;word-spacing:-3px;margin-top:3px}.ce-inline-tool{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:6px 1px;cursor:pointer;border:0;outline:none;background-color:transparent;vertical-align:bottom;color:inherit;margin:0;border-radius:0;line-height:normal}.ce-inline-tool svg{width:20px;height:20px}@media (max-width: 650px){.ce-inline-tool svg{width:28px;height:28px}}@media (hover: hover){.ce-inline-tool:hover{background-color:#eff2f5}}.ce-inline-tool--active{color:#388ae5}.ce-inline-tool--focused{background:rgba(34,186,255,.08)!important}.ce-inline-tool--focused{-webkit-box-shadow:inset 0 0 0px 1px rgba(7,161,227,.08);box-shadow:inset 0 0 0 1px #07a1e314}.ce-inline-tool--focused-animated{-webkit-animation-name:buttonClicked;animation-name:buttonClicked;-webkit-animation-duration:.25s;animation-duration:.25s}.ce-inline-tool--link .icon--unlink,.ce-inline-tool--unlink .icon--link{display:none}.ce-inline-tool--unlink .icon--unlink{display:inline-block;margin-bottom:-1px}.ce-inline-tool-input{outline:none;border:0;border-radius:0 0 4px 4px;margin:0;font-size:13px;padding:10px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;display:none;font-weight:500;border-top:1px solid rgba(201,201,204,.48);-webkit-appearance:none;font-family:inherit}@media (max-width: 650px){.ce-inline-tool-input{font-size:15px;font-weight:500}}.ce-inline-tool-input::-webkit-input-placeholder{color:#707684}.ce-inline-tool-input::-moz-placeholder{color:#707684}.ce-inline-tool-input:-ms-input-placeholder{color:#707684}.ce-inline-tool-input::-ms-input-placeholder{color:#707684}.ce-inline-tool-input::placeholder{color:#707684}.ce-inline-tool-input--showed{display:block}.ce-conversion-toolbar{position:absolute;background-color:#fff;border:1px solid #E8E8EB;-webkit-box-shadow:0 3px 15px -3px rgba(13,20,33,.13);box-shadow:0 3px 15px -3px #0d142121;border-radius:6px;z-index:2;opacity:0;visibility:hidden;will-change:transform,opacity;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;-webkit-transform:translateY(-8px);transform:translateY(-8px);left:-1px;width:190px;margin-top:5px;-webkit-box-sizing:content-box;box-sizing:content-box}.ce-conversion-toolbar--left-oriented:before{left:15px;margin-left:0}.ce-conversion-toolbar--right-oriented:before{left:auto;right:15px;margin-left:0}.ce-conversion-toolbar--showed{opacity:1;visibility:visible;-webkit-transform:none;transform:none}.ce-conversion-toolbar [hidden]{display:none!important}.ce-conversion-toolbar__buttons{display:-webkit-box;display:-ms-flexbox;display:flex}.ce-conversion-toolbar__label{color:#707684;font-size:11px;font-weight:500;letter-spacing:.33px;padding:10px 10px 5px;text-transform:uppercase}.ce-conversion-tool{display:-webkit-box;display:-ms-flexbox;display:flex;padding:5px 10px;font-size:14px;line-height:20px;font-weight:500;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ce-conversion-tool--hidden{display:none}.ce-conversion-tool--focused{background:rgba(34,186,255,.08)!important}.ce-conversion-tool--focused{-webkit-box-shadow:inset 0 0 0px 1px rgba(7,161,227,.08);box-shadow:inset 0 0 0 1px #07a1e314}.ce-conversion-tool--focused-animated{-webkit-animation-name:buttonClicked;animation-name:buttonClicked;-webkit-animation-duration:.25s;animation-duration:.25s}.ce-conversion-tool:hover{background:#eff2f5}.ce-conversion-tool__icon{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;width:26px;height:26px;-webkit-box-shadow:0 0 0 1px rgba(201,201,204,.48);box-shadow:0 0 0 1px #c9c9cc7a;border-radius:5px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:#fff;-webkit-box-sizing:content-box;box-sizing:content-box;-ms-flex-negative:0;flex-shrink:0;margin-right:10px}.ce-conversion-tool__icon svg{width:20px;height:20px}@media (max-width: 650px){.ce-conversion-tool__icon{width:36px;height:36px;border-radius:8px}.ce-conversion-tool__icon svg{width:28px;height:28px}}.ce-conversion-tool--last{margin-right:0!important}.ce-conversion-tool--active{color:#388ae5!important}.ce-conversion-tool--active{-webkit-animation:bounceIn .75s 1;animation:bounceIn .75s 1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.ce-conversion-tool__secondary-label{color:#707684;font-size:12px;margin-left:auto;white-space:nowrap;letter-spacing:-.1em;padding-right:5px;margin-bottom:-2px;opacity:.6}@media (max-width: 650px){.ce-conversion-tool__secondary-label{display:none}}.ce-settings__button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:6px 1px;border-radius:3px;cursor:pointer;border:0;outline:none;background-color:transparent;vertical-align:bottom;color:inherit;margin:0;line-height:32px}.ce-settings__button svg{width:20px;height:20px}@media (max-width: 650px){.ce-settings__button svg{width:28px;height:28px}}@media (hover: hover){.ce-settings__button:hover{background-color:#eff2f5}}.ce-settings__button--active{color:#388ae5}.ce-settings__button--focused{background:rgba(34,186,255,.08)!important}.ce-settings__button--focused{-webkit-box-shadow:inset 0 0 0px 1px rgba(7,161,227,.08);box-shadow:inset 0 0 0 1px #07a1e314}.ce-settings__button--focused-animated{-webkit-animation-name:buttonClicked;animation-name:buttonClicked;-webkit-animation-duration:.25s;animation-duration:.25s}.ce-settings__button:not(:nth-child(3n+3)){margin-right:3px}.ce-settings__button:nth-child(n+4){margin-top:3px}.ce-settings__button--disabled{cursor:not-allowed!important}.ce-settings__button--disabled{opacity:.3}.ce-settings__button--selected{color:#388ae5}@media (min-width: 651px){.codex-editor--narrow .ce-settings .ce-popover{right:0;left:auto;left:initial}}@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ce-block{-webkit-animation:fade-in .3s ease;animation:fade-in .3s ease;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-animation-fill-mode:initial;animation-fill-mode:initial}.ce-block:first-of-type{margin-top:0}.ce-block--selected .ce-block__content{background:#e1f2ff}.ce-block--selected .ce-block__content [contenteditable]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ce-block--selected .ce-block__content img,.ce-block--selected .ce-block__content .ce-stub{opacity:.55}.ce-block--stretched .ce-block__content{max-width:none}.ce-block__content{position:relative;max-width:650px;margin:0 auto;-webkit-transition:background-color .15s ease;transition:background-color .15s ease}.ce-block--drop-target .ce-block__content:before{content:"";position:absolute;top:100%;left:-20px;margin-top:-1px;height:8px;width:8px;border:solid #388AE5;border-width:1px 1px 0 0;-webkit-transform-origin:right;transform-origin:right;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ce-block--drop-target .ce-block__content:after{content:"";position:absolute;top:100%;height:1px;width:100%;color:#388ae5;background:repeating-linear-gradient(90deg,#388AE5,#388AE5 1px,#fff 1px,#fff 6px)}.ce-block a{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline}.ce-block b{font-weight:700}.ce-block i{font-style:italic}@media (min-width: 651px){.codex-editor--narrow .ce-block--focused{margin-right:-50px;padding-right:50px}}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}20%{-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}20%{-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}@-webkit-keyframes selectionBounce{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}50%{-webkit-transform:scale3d(1.01,1.01,1.01);transform:scale3d(1.01,1.01,1.01)}70%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}@keyframes selectionBounce{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}50%{-webkit-transform:scale3d(1.01,1.01,1.01);transform:scale3d(1.01,1.01,1.01)}70%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}@-webkit-keyframes buttonClicked{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.95,.95,.95);transform:scale3d(.95,.95,.95)}60%{-webkit-transform:scale3d(1.02,1.02,1.02);transform:scale3d(1.02,1.02,1.02)}80%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}@keyframes buttonClicked{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.95,.95,.95);transform:scale3d(.95,.95,.95)}60%{-webkit-transform:scale3d(1.02,1.02,1.02);transform:scale3d(1.02,1.02,1.02)}80%{-webkit-transform:scale3d(1,1,1);transform:scaleZ(1)}}.cdx-block{padding:.4em 0}.cdx-block::-webkit-input-placeholder{line-height:normal!important}.cdx-input{border:1px solid rgba(201,201,204,.48);-webkit-box-shadow:inset 0 1px 2px 0 rgba(35,44,72,.06);box-shadow:inset 0 1px 2px #232c480f;border-radius:3px;padding:10px 12px;outline:none;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.cdx-input[data-placeholder]:before{position:static!important}.cdx-input[data-placeholder]:before{display:inline-block;width:0;white-space:nowrap;pointer-events:none}.cdx-settings-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:6px 1px;border-radius:3px;cursor:pointer;border:0;outline:none;background-color:transparent;vertical-align:bottom;color:inherit;margin:0;min-width:26px;min-height:26px}.cdx-settings-button svg{width:20px;height:20px}@media (max-width: 650px){.cdx-settings-button svg{width:28px;height:28px}}@media (hover: hover){.cdx-settings-button:hover{background-color:#eff2f5}}.cdx-settings-button--focused{background:rgba(34,186,255,.08)!important}.cdx-settings-button--focused{-webkit-box-shadow:inset 0 0 0px 1px rgba(7,161,227,.08);box-shadow:inset 0 0 0 1px #07a1e314}.cdx-settings-button--focused-animated{-webkit-animation-name:buttonClicked;animation-name:buttonClicked;-webkit-animation-duration:.25s;animation-duration:.25s}.cdx-settings-button--active{color:#388ae5}.cdx-settings-button svg{width:auto;height:auto}@media (max-width: 650px){.cdx-settings-button{width:36px;height:36px;border-radius:8px}}.cdx-loader{position:relative;border:1px solid rgba(201,201,204,.48)}.cdx-loader:before{content:"";position:absolute;left:50%;top:50%;width:18px;height:18px;margin:-11px 0 0 -11px;border:2px solid rgba(201,201,204,.48);border-left-color:#388ae5;border-radius:50%;-webkit-animation:cdxRotation 1.2s infinite linear;animation:cdxRotation 1.2s infinite linear}@-webkit-keyframes cdxRotation{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes cdxRotation{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cdx-button{padding:13px;border-radius:3px;border:1px solid rgba(201,201,204,.48);font-size:14.9px;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(18,30,57,.04);box-shadow:0 2px 2px #121e390a;color:#707684;text-align:center;cursor:pointer}@media (hover: hover){.cdx-button:hover{background:#FBFCFE;-webkit-box-shadow:0 1px 3px 0 rgba(18,30,57,.08);box-shadow:0 1px 3px #121e3914}}.cdx-button svg{height:20px;margin-right:.2em;margin-top:-2px}.ce-stub{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:12px 18px;margin:10px 0;border-radius:10px;background:#eff2f5;border:1px solid #EFF0F1;color:#707684;font-size:14px}.ce-stub svg{width:20px;height:20px}.ce-stub__info{margin-left:14px}.ce-stub__title{font-weight:500;text-transform:capitalize}.codex-editor.codex-editor--rtl{direction:rtl}.codex-editor.codex-editor--rtl .cdx-list{padding-left:0;padding-right:40px}.codex-editor.codex-editor--rtl .ce-toolbar__plus{right:-26px;left:auto}.codex-editor.codex-editor--rtl .ce-toolbar__actions{right:auto;left:-26px}@media (max-width: 650px){.codex-editor.codex-editor--rtl .ce-toolbar__actions{margin-left:0;margin-right:auto;padding-right:0;padding-left:10px}}.codex-editor.codex-editor--rtl .ce-settings{left:5px;right:auto}.codex-editor.codex-editor--rtl .ce-settings:before{right:auto;left:25px}.codex-editor.codex-editor--rtl .ce-settings__button:not(:nth-child(3n+3)){margin-left:3px;margin-right:0}.codex-editor.codex-editor--rtl .ce-conversion-tool__icon{margin-right:0;margin-left:10px}.codex-editor.codex-editor--rtl .ce-inline-toolbar__dropdown{border-right:0px solid transparent;border-left:1px solid rgba(201,201,204,.48);margin:0 -6px 0 6px}.codex-editor.codex-editor--rtl .ce-inline-toolbar__dropdown .icon--toggler-down{margin-left:0;margin-right:4px}@media (min-width: 651px){.codex-editor--narrow.codex-editor--rtl .ce-toolbar__plus{left:0px;right:5px}}@media (min-width: 651px){.codex-editor--narrow.codex-editor--rtl .ce-toolbar__actions{left:-5px}}.cdx-search-field{--icon-margin-right: 10px;background:rgba(232,232,235,.49);border:1px solid rgba(226,226,229,.2);border-radius:6px;padding:2px;display:grid;grid-template-columns:auto auto 1fr;grid-template-rows:auto}.cdx-search-field__icon{width:26px;height:26px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:var(--icon-margin-right)}.cdx-search-field__icon svg{width:20px;height:20px;color:#707684}.cdx-search-field__input{font-size:14px;outline:none;font-weight:500;font-family:inherit;border:0;background:transparent;margin:0;padding:0;line-height:22px;min-width:calc(100% - 26px - var(--icon-margin-right))}.cdx-search-field__input::-webkit-input-placeholder{color:#707684;font-weight:500}.cdx-search-field__input::-moz-placeholder{color:#707684;font-weight:500}.cdx-search-field__input:-ms-input-placeholder{color:#707684;font-weight:500}.cdx-search-field__input::-ms-input-placeholder{color:#707684;font-weight:500}.cdx-search-field__input::placeholder{color:#707684;font-weight:500}.ce-popover{--border-radius: 6px;--width: 200px;--max-height: 270px;--padding: 6px;--offset-from-target: 8px;--color-border: #e8e8eb;--color-shadow: rgba(13,20,33,.13);--color-background: white;--color-text-primary: black;--color-text-secondary: #707684;--color-border-icon: rgba(201, 201, 204, .48);--color-border-icon-disabled: #EFF0F1;--color-text-icon-active: #388AE5;--color-background-icon-active: rgba(56, 138, 229, .1);--color-background-item-focus: rgba(34, 186, 255, .08);--color-shadow-item-focus: rgba(7, 161, 227, .08);--color-background-item-hover: #eff2f5;--color-background-item-confirm: #E24A4A;--color-background-item-confirm-hover: #CE4343;min-width:var(--width);width:var(--width);max-height:var(--max-height);border-radius:var(--border-radius);overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 3px 15px -3px var(--color-shadow);box-shadow:0 3px 15px -3px var(--color-shadow);position:absolute;left:0;top:calc(100% + var(--offset-from-target));background:var(--color-background);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:4;opacity:0;max-height:0;pointer-events:none;padding:0;border:none}.ce-popover--opened{opacity:1;padding:var(--padding);max-height:var(--max-height);pointer-events:auto;-webkit-animation:panelShowing .1s ease;animation:panelShowing .1s ease;border:1px solid var(--color-border)}@media (max-width: 650px){.ce-popover--opened{-webkit-animation:panelShowingMobile .25s ease;animation:panelShowingMobile .25s ease}}.ce-popover__items{overflow-y:auto;-ms-scroll-chaining:none;overscroll-behavior:contain}@media (max-width: 650px){.ce-popover__overlay{position:fixed;top:0;bottom:0;left:0;right:0;background:#1D202B;z-index:3;opacity:.5;-webkit-transition:opacity .12s ease-in;transition:opacity .12s ease-in;will-change:opacity;visibility:visible}}.ce-popover__overlay--hidden{display:none}.ce-popover--open-top{top:calc(-1 * (var(--offset-from-target) + var(--popover-height)))}@media (max-width: 650px){.ce-popover{--offset: 5px;position:fixed;max-width:none;min-width:calc(100% - var(--offset) * 2);left:var(--offset);right:var(--offset);bottom:calc(var(--offset) + env(safe-area-inset-bottom));top:auto;border-radius:10px}.ce-popover .ce-popover__search{display:none}}.ce-popover__search,.ce-popover__custom-content:not(:empty){margin-bottom:5px}.ce-popover__nothing-found-message{color:#707684;display:none;cursor:default;padding:3px;font-size:14px;line-height:20px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ce-popover__nothing-found-message--displayed{display:block}.ce-popover__custom-content:not(:empty){padding:4px}@media (min-width: 651px){.ce-popover__custom-content:not(:empty){padding:0}}.ce-popover__custom-content--hidden{display:none}.ce-popover-item{--border-radius: 6px;--icon-size: 20px;--icon-size-mobile: 28px;border-radius:var(--border-radius);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px;color:var(--color-text-primary);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (max-width: 650px){.ce-popover-item{padding:4px}}.ce-popover-item:not(:last-of-type){margin-bottom:1px}.ce-popover-item__icon{border-radius:5px;width:26px;height:26px;-webkit-box-shadow:0 0 0 1px var(--color-border-icon);box-shadow:0 0 0 1px var(--color-border-icon);background:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:10px}.ce-popover-item__icon svg{width:20px;height:20px}@media (max-width: 650px){.ce-popover-item__icon{width:36px;height:36px;border-radius:8px}.ce-popover-item__icon svg{width:var(--icon-size-mobile);height:var(--icon-size-mobile)}}.ce-popover-item__title{font-size:14px;line-height:20px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media (max-width: 650px){.ce-popover-item__title{font-size:16px}}.ce-popover-item__secondary-title{color:var(--color-text-secondary);font-size:12px;margin-left:auto;white-space:nowrap;letter-spacing:-.1em;padding-right:5px;margin-bottom:-2px;opacity:.6}@media (max-width: 650px){.ce-popover-item__secondary-title{display:none}}.ce-popover-item--active{background:var(--color-background-icon-active);color:var(--color-text-icon-active)}.ce-popover-item--active .ce-popover-item__icon{-webkit-box-shadow:none;box-shadow:none}.ce-popover-item--disabled{color:var(--color-text-secondary);cursor:default;pointer-events:none}.ce-popover-item--disabled .ce-popover-item__icon{-webkit-box-shadow:0 0 0 1px var(--color-border-icon-disabled);box-shadow:0 0 0 1px var(--color-border-icon-disabled)}.ce-popover-item--focused:not(.ce-popover-item--no-focus){background:var(--color-background-item-focus)!important}.ce-popover-item--focused:not(.ce-popover-item--no-focus){-webkit-box-shadow:inset 0 0 0px 1px var(--color-shadow-item-focus);box-shadow:inset 0 0 0 1px var(--color-shadow-item-focus)}.ce-popover-item--hidden{display:none}@media (hover: hover){.ce-popover-item:hover{cursor:pointer}.ce-popover-item:hover:not(.ce-popover-item--no-hover){background-color:var(--color-background-item-hover)}.ce-popover-item:hover .ce-popover-item__icon{-webkit-box-shadow:none;box-shadow:none}}.ce-popover-item--confirmation{background:var(--color-background-item-confirm)}.ce-popover-item--confirmation .ce-popover-item__icon{color:var(--color-background-item-confirm)}.ce-popover-item--confirmation .ce-popover-item__title{color:#fff}@media (hover: hover){.ce-popover-item--confirmation:not(.ce-popover-item--no-hover):hover{background:var(--color-background-item-confirm-hover)}}.ce-popover-item--confirmation:not(.ce-popover-item--no-focus).ce-popover-item--focused{background:var(--color-background-item-confirm-hover)!important}.ce-popover-item--confirmation .ce-popover-item__icon,.ce-popover-item--active .ce-popover-item__icon,.ce-popover-item--focused .ce-popover-item__icon{-webkit-box-shadow:none;box-shadow:none}@-webkit-keyframes panelShowing{0%{opacity:0;-webkit-transform:translateY(-8px) scale(.9);transform:translateY(-8px) scale(.9)}70%{opacity:1;-webkit-transform:translateY(2px);transform:translateY(2px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes panelShowing{0%{opacity:0;-webkit-transform:translateY(-8px) scale(.9);transform:translateY(-8px) scale(.9)}70%{opacity:1;-webkit-transform:translateY(2px);transform:translateY(2px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes panelShowingMobile{0%{opacity:0;-webkit-transform:translateY(14px) scale(.98);transform:translateY(14px) scale(.98)}70%{opacity:1;-webkit-transform:translateY(-4px);transform:translateY(-4px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes panelShowingMobile{0%{opacity:0;-webkit-transform:translateY(14px) scale(.98);transform:translateY(14px) scale(.98)}70%{opacity:1;-webkit-transform:translateY(-4px);transform:translateY(-4px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble;-webkit-animation-duration:.4s;animation-duration:.4s}@-webkit-keyframes wobble{0%{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-9%,0,0);transform:translate3d(-9%,0,0)}30%{-webkit-transform:translate3d(9%,0,0);transform:translate3d(9%,0,0)}45%{-webkit-transform:translate3d(-4%,0,0);transform:translate3d(-4%,0,0)}60%{-webkit-transform:translate3d(4%,0,0);transform:translate3d(4%,0,0)}75%{-webkit-transform:translate3d(-1%,0,0);transform:translate3d(-1%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes wobble{0%{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-9%,0,0);transform:translate3d(-9%,0,0)}30%{-webkit-transform:translate3d(9%,0,0);transform:translate3d(9%,0,0)}45%{-webkit-transform:translate3d(-4%,0,0);transform:translate3d(-4%,0,0)}60%{-webkit-transform:translate3d(4%,0,0);transform:translate3d(4%,0,0)}75%{-webkit-transform:translate3d(-1%,0,0);transform:translate3d(-1%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}
|
||
`;
|
||
class Ci extends T {
|
||
constructor() {
|
||
super(...arguments),
|
||
(this.isMobile = !1),
|
||
(this.contentRectCache = void 0),
|
||
(this.resizeDebouncer = Xe(() => {
|
||
this.windowResize();
|
||
}, 200));
|
||
}
|
||
get CSS() {
|
||
return {
|
||
editorWrapper: "codex-editor",
|
||
editorWrapperNarrow: "codex-editor--narrow",
|
||
editorZone: "codex-editor__redactor",
|
||
editorZoneHidden: "codex-editor__redactor--hidden",
|
||
editorEmpty: "codex-editor--empty",
|
||
editorRtlFix: "codex-editor--rtl",
|
||
};
|
||
}
|
||
get contentRect() {
|
||
if (this.contentRectCache) return this.contentRectCache;
|
||
const t = this.nodes.wrapper.querySelector(`.${F.CSS.content}`);
|
||
return t
|
||
? ((this.contentRectCache = t.getBoundingClientRect()),
|
||
this.contentRectCache)
|
||
: { width: 650, left: 0, right: 0 };
|
||
}
|
||
async prepare() {
|
||
this.checkIsMobile(), this.make(), this.loadStyles();
|
||
}
|
||
toggleReadOnly(t) {
|
||
t ? this.disableModuleBindings() : this.enableModuleBindings();
|
||
}
|
||
checkEmptiness() {
|
||
const { BlockManager: t } = this.Editor;
|
||
this.nodes.wrapper.classList.toggle(this.CSS.editorEmpty, t.isEditorEmpty);
|
||
}
|
||
get someToolbarOpened() {
|
||
const {
|
||
Toolbar: t,
|
||
BlockSettings: e,
|
||
InlineToolbar: o,
|
||
ConversionToolbar: i,
|
||
} = this.Editor;
|
||
return e.opened || o.opened || i.opened || t.toolbox.opened;
|
||
}
|
||
get someFlipperButtonFocused() {
|
||
return this.Editor.Toolbar.toolbox.hasFocus()
|
||
? !0
|
||
: Object.entries(this.Editor)
|
||
.filter(([t, e]) => e.flipper instanceof G)
|
||
.some(([t, e]) => e.flipper.hasFocus());
|
||
}
|
||
destroy() {
|
||
this.nodes.holder.innerHTML = "";
|
||
}
|
||
closeAllToolbars() {
|
||
const {
|
||
Toolbar: t,
|
||
BlockSettings: e,
|
||
InlineToolbar: o,
|
||
ConversionToolbar: i,
|
||
} = this.Editor;
|
||
e.close(), o.close(), i.close(), t.toolbox.close();
|
||
}
|
||
checkIsMobile() {
|
||
this.isMobile = window.innerWidth < le;
|
||
}
|
||
make() {
|
||
(this.nodes.holder = d.getHolder(this.config.holder)),
|
||
(this.nodes.wrapper = d.make("div", [
|
||
this.CSS.editorWrapper,
|
||
...(this.isRtl ? [this.CSS.editorRtlFix] : []),
|
||
])),
|
||
(this.nodes.redactor = d.make("div", this.CSS.editorZone)),
|
||
this.nodes.holder.offsetWidth < this.contentRect.width &&
|
||
this.nodes.wrapper.classList.add(this.CSS.editorWrapperNarrow),
|
||
(this.nodes.redactor.style.paddingBottom = this.config.minHeight + "px"),
|
||
this.nodes.wrapper.appendChild(this.nodes.redactor),
|
||
this.nodes.holder.appendChild(this.nodes.wrapper);
|
||
}
|
||
loadStyles() {
|
||
const t = "editor-js-styles";
|
||
if (d.get(t)) return;
|
||
const e = d.make("style", null, { id: t, textContent: Ei.toString() });
|
||
d.prepend(document.head, e);
|
||
}
|
||
enableModuleBindings() {
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.redactor,
|
||
"click",
|
||
(t) => {
|
||
this.redactorClicked(t);
|
||
},
|
||
!1,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.redactor,
|
||
"mousedown",
|
||
(t) => {
|
||
this.documentTouched(t);
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.redactor,
|
||
"touchstart",
|
||
(t) => {
|
||
this.documentTouched(t);
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
document,
|
||
"keydown",
|
||
(t) => {
|
||
this.documentKeydown(t);
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
document,
|
||
"mousedown",
|
||
(t) => {
|
||
this.documentClicked(t);
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
document,
|
||
"selectionchange",
|
||
() => {
|
||
this.selectionChanged();
|
||
},
|
||
!0,
|
||
),
|
||
this.readOnlyMutableListeners.on(
|
||
window,
|
||
"resize",
|
||
() => {
|
||
this.resizeDebouncer();
|
||
},
|
||
{ passive: !0 },
|
||
),
|
||
this.watchBlockHoveredEvents();
|
||
}
|
||
watchBlockHoveredEvents() {
|
||
let t;
|
||
this.readOnlyMutableListeners.on(
|
||
this.nodes.redactor,
|
||
"mousemove",
|
||
St((e) => {
|
||
const o = e.target.closest(".ce-block");
|
||
this.Editor.BlockSelection.anyBlockSelected ||
|
||
(o &&
|
||
t !== o &&
|
||
((t = o),
|
||
this.eventsDispatcher.emit(xe, {
|
||
block: this.Editor.BlockManager.getBlockByChildNode(o),
|
||
})));
|
||
}, 20),
|
||
{ passive: !0 },
|
||
);
|
||
}
|
||
disableModuleBindings() {
|
||
this.readOnlyMutableListeners.clearAll();
|
||
}
|
||
windowResize() {
|
||
(this.contentRectCache = null), this.checkIsMobile();
|
||
}
|
||
documentKeydown(t) {
|
||
switch (t.keyCode) {
|
||
case E.ENTER:
|
||
this.enterPressed(t);
|
||
break;
|
||
case E.BACKSPACE:
|
||
case E.DELETE:
|
||
this.backspacePressed(t);
|
||
break;
|
||
case E.ESC:
|
||
this.escapePressed(t);
|
||
break;
|
||
default:
|
||
this.defaultBehaviour(t);
|
||
break;
|
||
}
|
||
}
|
||
defaultBehaviour(t) {
|
||
const { currentBlock: e } = this.Editor.BlockManager,
|
||
o = t.target.closest(`.${this.CSS.editorWrapper}`),
|
||
i = t.altKey || t.ctrlKey || t.metaKey || t.shiftKey;
|
||
if (e !== void 0 && o === null) {
|
||
this.Editor.BlockEvents.keydown(t);
|
||
return;
|
||
}
|
||
o ||
|
||
(e && i) ||
|
||
(this.Editor.BlockManager.dropPointer(), this.Editor.Toolbar.close());
|
||
}
|
||
backspacePressed(t) {
|
||
const { BlockManager: e, BlockSelection: o, Caret: i } = this.Editor;
|
||
if (o.anyBlockSelected && !b.isSelectionExists) {
|
||
const n = e.removeSelectedBlocks();
|
||
i.setToBlock(e.insertDefaultBlockAtIndex(n, !0), i.positions.START),
|
||
o.clearSelection(t),
|
||
t.preventDefault(),
|
||
t.stopPropagation(),
|
||
t.stopImmediatePropagation();
|
||
}
|
||
}
|
||
escapePressed(t) {
|
||
this.Editor.BlockSelection.clearSelection(t),
|
||
this.Editor.Toolbar.toolbox.opened
|
||
? (this.Editor.Toolbar.toolbox.close(),
|
||
this.Editor.Caret.setToBlock(this.Editor.BlockManager.currentBlock))
|
||
: this.Editor.BlockSettings.opened
|
||
? this.Editor.BlockSettings.close()
|
||
: this.Editor.ConversionToolbar.opened
|
||
? this.Editor.ConversionToolbar.close()
|
||
: this.Editor.InlineToolbar.opened
|
||
? this.Editor.InlineToolbar.close()
|
||
: this.Editor.Toolbar.close();
|
||
}
|
||
enterPressed(t) {
|
||
const { BlockManager: e, BlockSelection: o } = this.Editor,
|
||
i = e.currentBlockIndex >= 0;
|
||
if (o.anyBlockSelected && !b.isSelectionExists) {
|
||
o.clearSelection(t),
|
||
t.preventDefault(),
|
||
t.stopImmediatePropagation(),
|
||
t.stopPropagation();
|
||
return;
|
||
}
|
||
if (!this.someToolbarOpened && i && t.target.tagName === "BODY") {
|
||
const n = this.Editor.BlockManager.insert();
|
||
this.Editor.Caret.setToBlock(n),
|
||
this.Editor.BlockManager.highlightCurrentNode(),
|
||
this.Editor.Toolbar.moveAndOpen(n);
|
||
}
|
||
this.Editor.BlockSelection.clearSelection(t);
|
||
}
|
||
documentClicked(t) {
|
||
if (!t.isTrusted) return;
|
||
const e = t.target;
|
||
this.nodes.holder.contains(e) ||
|
||
b.isAtEditor ||
|
||
(this.Editor.BlockManager.dropPointer(), this.Editor.Toolbar.close());
|
||
const o = this.Editor.BlockSettings.nodes.wrapper.contains(e),
|
||
i = this.Editor.Toolbar.nodes.settingsToggler.contains(e),
|
||
n = o || i;
|
||
if (this.Editor.BlockSettings.opened && !n) {
|
||
this.Editor.BlockSettings.close();
|
||
const r = this.Editor.BlockManager.getBlockByChildNode(e);
|
||
this.Editor.Toolbar.moveAndOpen(r);
|
||
}
|
||
this.Editor.BlockSelection.clearSelection(t);
|
||
}
|
||
documentTouched(t) {
|
||
let e = t.target;
|
||
if (e === this.nodes.redactor) {
|
||
const o = t instanceof MouseEvent ? t.clientX : t.touches[0].clientX,
|
||
i = t instanceof MouseEvent ? t.clientY : t.touches[0].clientY;
|
||
e = document.elementFromPoint(o, i);
|
||
}
|
||
try {
|
||
this.Editor.BlockManager.setCurrentBlockByChildNode(e),
|
||
this.Editor.BlockManager.highlightCurrentNode();
|
||
} catch {
|
||
this.Editor.RectangleSelection.isRectActivated() ||
|
||
this.Editor.Caret.setToTheLastBlock();
|
||
}
|
||
this.Editor.Toolbar.moveAndOpen();
|
||
}
|
||
redactorClicked(t) {
|
||
const { BlockSelection: e } = this.Editor;
|
||
if (!b.isCollapsed) return;
|
||
const o = () => {
|
||
t.stopImmediatePropagation(), t.stopPropagation();
|
||
},
|
||
i = t.target,
|
||
n = t.metaKey || t.ctrlKey;
|
||
if (d.isAnchor(i) && n) {
|
||
o();
|
||
const c = i.getAttribute("href"),
|
||
p = qe(c);
|
||
Ge(p);
|
||
return;
|
||
}
|
||
const r = this.Editor.BlockManager.getBlockByIndex(-1),
|
||
a = d.offset(r.holder).bottom,
|
||
l = t.pageY;
|
||
if (
|
||
t.target instanceof Element &&
|
||
t.target.isEqualNode(this.nodes.redactor) &&
|
||
!e.anyBlockSelected &&
|
||
a < l
|
||
) {
|
||
o();
|
||
const { BlockManager: c, Caret: p, Toolbar: h } = this.Editor;
|
||
(!c.lastBlock.tool.isDefault || !c.lastBlock.isEmpty) && c.insertAtEnd(),
|
||
p.setToTheLastBlock(),
|
||
h.moveAndOpen(c.lastBlock);
|
||
}
|
||
}
|
||
selectionChanged() {
|
||
const { CrossBlockSelection: t, BlockSelection: e } = this.Editor,
|
||
o = b.anchorElement;
|
||
if (
|
||
(t.isCrossBlockSelectionStarted &&
|
||
e.anyBlockSelected &&
|
||
b.get().removeAllRanges(),
|
||
!o)
|
||
) {
|
||
b.range || this.Editor.InlineToolbar.close();
|
||
return;
|
||
}
|
||
const i = o.closest(`.${F.CSS.content}`) === null;
|
||
if (
|
||
i &&
|
||
(this.Editor.InlineToolbar.containsNode(o) ||
|
||
this.Editor.InlineToolbar.close(),
|
||
o.dataset.inlineToolbar !== "true")
|
||
)
|
||
return;
|
||
this.Editor.BlockManager.currentBlock ||
|
||
this.Editor.BlockManager.setCurrentBlockByChildNode(o);
|
||
const n = i !== !0;
|
||
this.Editor.InlineToolbar.tryToShow(!0, n);
|
||
}
|
||
}
|
||
const Bi = {
|
||
BlocksAPI: ao,
|
||
CaretAPI: lo,
|
||
EventsAPI: co,
|
||
I18nAPI: Ft,
|
||
API: ho,
|
||
InlineToolbarAPI: po,
|
||
ListenersAPI: uo,
|
||
NotifierAPI: bo,
|
||
ReadOnlyAPI: ko,
|
||
SanitizerAPI: Bo,
|
||
SaverAPI: To,
|
||
SelectionAPI: So,
|
||
StylesAPI: Io,
|
||
ToolbarAPI: Mo,
|
||
TooltipAPI: Lo,
|
||
UiAPI: Oo,
|
||
BlockSettings: Vo,
|
||
ConversionToolbar: Y,
|
||
Toolbar: ti,
|
||
InlineToolbar: ei,
|
||
BlockEvents: oi,
|
||
BlockManager: si,
|
||
BlockSelection: ri,
|
||
Caret: vt,
|
||
CrossBlockSelection: ai,
|
||
DragNDrop: li,
|
||
ModificationsObserver: ci,
|
||
Paste: Ce,
|
||
ReadOnly: di,
|
||
RectangleSelection: ft,
|
||
Renderer: hi,
|
||
Saver: pi,
|
||
Tools: _e,
|
||
UI: Ci,
|
||
};
|
||
class Ti {
|
||
constructor(t) {
|
||
(this.moduleInstances = {}), (this.eventsDispatcher = new wt());
|
||
let e, o;
|
||
(this.isReady = new Promise((i, n) => {
|
||
(e = i), (o = n);
|
||
})),
|
||
Promise.resolve()
|
||
.then(async () => {
|
||
(this.configuration = t),
|
||
this.validate(),
|
||
this.init(),
|
||
await this.start(),
|
||
await this.render();
|
||
const {
|
||
BlockManager: i,
|
||
Caret: n,
|
||
UI: r,
|
||
ModificationsObserver: a,
|
||
} = this.moduleInstances;
|
||
r.checkEmptiness(),
|
||
a.enable(),
|
||
this.configuration.autofocus &&
|
||
(n.setToBlock(i.blocks[0], n.positions.START),
|
||
i.highlightCurrentNode()),
|
||
e();
|
||
})
|
||
.catch((i) => {
|
||
_(`Editor.js is not ready because of ${i}`, "error"), o(i);
|
||
});
|
||
}
|
||
set configuration(t) {
|
||
var e, o;
|
||
z(t) ? (this.config = { ...t }) : (this.config = { holder: t }),
|
||
Mt(!!this.config.holderId, "config.holderId", "config.holder"),
|
||
this.config.holderId &&
|
||
!this.config.holder &&
|
||
((this.config.holder = this.config.holderId),
|
||
(this.config.holderId = null)),
|
||
this.config.holder == null && (this.config.holder = "editorjs"),
|
||
this.config.logLevel || (this.config.logLevel = se.VERBOSE),
|
||
Ue(this.config.logLevel),
|
||
Mt(
|
||
!!this.config.initialBlock,
|
||
"config.initialBlock",
|
||
"config.defaultBlock",
|
||
),
|
||
(this.config.defaultBlock =
|
||
this.config.defaultBlock || this.config.initialBlock || "paragraph"),
|
||
(this.config.minHeight =
|
||
this.config.minHeight !== void 0 ? this.config.minHeight : 300);
|
||
const i = { type: this.config.defaultBlock, data: {} };
|
||
(this.config.placeholder = this.config.placeholder || !1),
|
||
(this.config.sanitizer = this.config.sanitizer || {
|
||
p: !0,
|
||
b: !0,
|
||
a: !0,
|
||
}),
|
||
(this.config.hideToolbar = this.config.hideToolbar
|
||
? this.config.hideToolbar
|
||
: !1),
|
||
(this.config.tools = this.config.tools || {}),
|
||
(this.config.i18n = this.config.i18n || {}),
|
||
(this.config.data = this.config.data || { blocks: [] }),
|
||
(this.config.onReady = this.config.onReady || (() => {})),
|
||
(this.config.onChange = this.config.onChange || (() => {})),
|
||
(this.config.inlineToolbar =
|
||
this.config.inlineToolbar !== void 0 ? this.config.inlineToolbar : !0),
|
||
(V(this.config.data) ||
|
||
!this.config.data.blocks ||
|
||
this.config.data.blocks.length === 0) &&
|
||
(this.config.data = { blocks: [i] }),
|
||
(this.config.readOnly = this.config.readOnly || !1),
|
||
(e = this.config.i18n) != null &&
|
||
e.messages &&
|
||
$.setDictionary(this.config.i18n.messages),
|
||
(this.config.i18n.direction =
|
||
((o = this.config.i18n) == null ? void 0 : o.direction) || "ltr");
|
||
}
|
||
get configuration() {
|
||
return this.config;
|
||
}
|
||
validate() {
|
||
const { holderId: t, holder: e } = this.config;
|
||
if (t && e)
|
||
throw Error(
|
||
"«holderId» and «holder» param can't assign at the same time.",
|
||
);
|
||
if (J(e) && !d.get(e))
|
||
throw Error(
|
||
`element with ID «${e}» is missing. Pass correct holder's ID.`,
|
||
);
|
||
if (e && z(e) && !d.isElement(e))
|
||
throw Error("«holder» value must be an Element node");
|
||
}
|
||
init() {
|
||
this.constructModules(), this.configureModules();
|
||
}
|
||
async start() {
|
||
await [
|
||
"Tools",
|
||
"UI",
|
||
"BlockManager",
|
||
"Paste",
|
||
"BlockSelection",
|
||
"RectangleSelection",
|
||
"CrossBlockSelection",
|
||
"ReadOnly",
|
||
].reduce(
|
||
(t, e) =>
|
||
t.then(async () => {
|
||
try {
|
||
await this.moduleInstances[e].prepare();
|
||
} catch (o) {
|
||
if (o instanceof de) throw new Error(o.message);
|
||
_(`Module ${e} was skipped because of %o`, "warn", o);
|
||
}
|
||
}),
|
||
Promise.resolve(),
|
||
);
|
||
}
|
||
render() {
|
||
return this.moduleInstances.Renderer.render(this.config.data.blocks);
|
||
}
|
||
constructModules() {
|
||
Object.entries(Bi).forEach(([t, e]) => {
|
||
try {
|
||
this.moduleInstances[t] = new e({
|
||
config: this.configuration,
|
||
eventsDispatcher: this.eventsDispatcher,
|
||
});
|
||
} catch (o) {
|
||
_("[constructModules]", `Module ${t} skipped because`, "error", o);
|
||
}
|
||
});
|
||
}
|
||
configureModules() {
|
||
for (const t in this.moduleInstances)
|
||
Object.prototype.hasOwnProperty.call(this.moduleInstances, t) &&
|
||
(this.moduleInstances[t].state = this.getModulesDiff(t));
|
||
}
|
||
getModulesDiff(t) {
|
||
const e = {};
|
||
for (const o in this.moduleInstances)
|
||
o !== t && (e[o] = this.moduleInstances[o]);
|
||
return e;
|
||
}
|
||
}
|
||
/**
|
||
* Editor.js
|
||
*
|
||
* @license Apache-2.0
|
||
* @see Editor.js <https://editorjs.io>
|
||
* @author CodeX Team <https://codex.so>
|
||
*/ class Si {
|
||
static get version() {
|
||
return "2.28.0";
|
||
}
|
||
constructor(t) {
|
||
let e = () => {};
|
||
z(t) && R(t.onReady) && (e = t.onReady);
|
||
const o = new Ti(t);
|
||
this.isReady = o.isReady.then(() => {
|
||
this.exportAPI(o), e();
|
||
});
|
||
}
|
||
exportAPI(t) {
|
||
const e = ["configuration"],
|
||
o = () => {
|
||
Object.values(t.moduleInstances).forEach((i) => {
|
||
R(i.destroy) && i.destroy(), i.listeners.removeAll();
|
||
}),
|
||
(t = null);
|
||
for (const i in this)
|
||
Object.prototype.hasOwnProperty.call(this, i) && delete this[i];
|
||
Object.setPrototypeOf(this, null);
|
||
};
|
||
e.forEach((i) => {
|
||
this[i] = t[i];
|
||
}),
|
||
(this.destroy = o),
|
||
Object.setPrototypeOf(this, t.moduleInstances.API.methods),
|
||
delete this.exportAPI,
|
||
Object.entries({
|
||
blocks: { clear: "clear", render: "render" },
|
||
caret: { focus: "focus" },
|
||
events: { on: "on", off: "off", emit: "emit" },
|
||
saver: { save: "save" },
|
||
}).forEach(([i, n]) => {
|
||
Object.entries(n).forEach(([r, a]) => {
|
||
this[a] = t.moduleInstances.API.methods[i][r];
|
||
});
|
||
});
|
||
}
|
||
}
|
||
const Tt = {
|
||
header: Zt(
|
||
() => import("./bundle-9b767e03.js").then((s) => s.b),
|
||
[
|
||
"assets/bundle-9b767e03.js",
|
||
"assets/app-admin-62da08c5.js",
|
||
"assets/index-8746c87e.js",
|
||
"assets/app-admin-935fc652.css",
|
||
],
|
||
),
|
||
list: Zt(
|
||
() => import("./bundle-13ffaba5.js").then((s) => s.b),
|
||
[
|
||
"assets/bundle-13ffaba5.js",
|
||
"assets/app-admin-62da08c5.js",
|
||
"assets/index-8746c87e.js",
|
||
"assets/app-admin-935fc652.css",
|
||
],
|
||
),
|
||
},
|
||
Ii = Ne({
|
||
name: "vue-editor-js",
|
||
props: {
|
||
holder: { type: String, default: () => "vue-editor-js", require: !0 },
|
||
config: { type: Object, default: () => ({}), require: !0 },
|
||
initialized: { type: Function, default: () => {} },
|
||
},
|
||
setup: (s, t) => {
|
||
const e = Re({ editor: null });
|
||
function o(r) {
|
||
i(),
|
||
(e.editor = new Si({
|
||
holder: r.holder || "vue-editor-js",
|
||
...r.config,
|
||
onChange: (a, l) => {
|
||
n();
|
||
},
|
||
})),
|
||
r.initialized(e.editor);
|
||
}
|
||
function i() {
|
||
e.editor && (e.editor.destroy(), (e.editor = null));
|
||
}
|
||
function n() {
|
||
console.log("saveEditor"),
|
||
e.editor &&
|
||
e.editor.save().then((r) => {
|
||
console.log(r), t.emit("saved", r);
|
||
});
|
||
}
|
||
return Pe((r) => o(s)), { props: s, state: e };
|
||
},
|
||
methods: {
|
||
useTools(s, t) {
|
||
const e = Object.keys(Tt),
|
||
o = { ...s.customTools };
|
||
return e.every((i) => !s[i])
|
||
? (e.forEach((i) => (o[i] = { class: Tt[i] })),
|
||
Object.keys(t).forEach((i) => {
|
||
o[i] !== void 0 && o[i] !== null && (o[i].config = t[i]);
|
||
}),
|
||
o)
|
||
: (e.forEach((i) => {
|
||
const n = s[i];
|
||
if (n && ((o[i] = { class: Tt[i] }), typeof n == "object")) {
|
||
const r = Object.assign({}, s[i]);
|
||
delete r.class, (o[i] = Object.assign(o[i], r));
|
||
}
|
||
}),
|
||
Object.keys(t).forEach((i) => {
|
||
o[i] !== void 0 && o[i] !== null && (o[i].config = t[i]);
|
||
}),
|
||
o);
|
||
},
|
||
},
|
||
}),
|
||
Mi = ["id"];
|
||
function _i(s, t, e, o, i, n) {
|
||
return Fe(), De("div", { id: s.holder }, null, 8, Mi);
|
||
}
|
||
const Oi = Oe(Ii, [["render", _i]]);
|
||
export { Tt as PLUGINS, Oi as default };
|