@aquera/nile-elements 0.1.67-beta-1.5 → 0.1.67-beta-1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/index.html +13 -6
- package/dist/index.js +51 -48
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +11 -8
- package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.esm.js +39 -39
- package/dist/nile-rich-text-editor/utils.cjs.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +11 -8
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +33 -25
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-select.js +62 -57
- package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
- package/dist/src/nile-rich-text-editor/rte-utils/content.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/content.js +25 -0
- package/dist/src/nile-rich-text-editor/rte-utils/content.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.js +9 -0
- package/dist/src/nile-rich-text-editor/rte-utils/css.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.js +48 -0
- package/dist/src/nile-rich-text-editor/rte-utils/dom.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.js +69 -0
- package/dist/src/nile-rich-text-editor/rte-utils/formatting.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.js +38 -0
- package/dist/src/nile-rich-text-editor/rte-utils/keys.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.d.ts +2 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.js +28 -0
- package/dist/src/nile-rich-text-editor/rte-utils/lists.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.d.ts +17 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.js +39 -0
- package/dist/src/nile-rich-text-editor/rte-utils/selection.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.d.ts +28 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js +161 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbar.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.d.ts +13 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js +119 -0
- package/dist/src/nile-rich-text-editor/rte-utils/toolbarState.js.map +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.js +14 -0
- package/dist/src/nile-rich-text-editor/rte-utils/vars.js.map +1 -0
- package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +11 -8
- package/src/nile-rich-text-editor/nile-rich-text-editor.ts +46 -26
- package/src/nile-rich-text-editor/nile-rte-select.ts +178 -173
- package/src/nile-rich-text-editor/utils.ts +342 -341
@@ -1,47 +1,32 @@
|
|
1
|
-
import{__decorate as t}from"tslib";import{LitElement as e,html as n}from"lit";import{property as i,state as
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
<nile-dropdown class="rte-default-dd">
|
19
|
-
<nile-button
|
20
|
-
slot="trigger"
|
21
|
-
variant="tertiary"
|
22
|
-
class="rte-default-trigger"
|
23
|
-
style="font-family: ${e?.value||"inherit"}">
|
24
|
-
${i} <nile-icon name="arrowdown"></nile-icon>
|
25
|
-
</nile-button>
|
26
|
-
<nile-menu class="rte-default-menu">
|
27
|
-
${t.map((t=>n`
|
28
|
-
<nile-menu-item
|
29
|
-
style="font-family: ${t.value}"
|
30
|
-
?active=${t.value===this.selectedValue}
|
31
|
-
@click=${()=>this.onSelect(t.value)}>
|
32
|
-
${t.label}
|
33
|
-
</nile-menu-item>
|
34
|
-
`))}
|
35
|
-
</nile-menu>
|
36
|
-
</nile-dropdown>
|
37
|
-
`}const i=e?.label||this.label||"Select";return n`
|
1
|
+
import{__decorate as t}from"tslib";import{LitElement as e,html as n}from"lit";import{property as i,state as r,customElement as l}from"lit/decorators.js";const s=new Set(["p","h1","h2","h3","h4","h5","h6"]);function a(t){return s.has(t)}let o=class extends e{constructor(){super(...arguments),this.type="",this.options="[]",this.label="",this.selectedValue=""}createRenderRoot(){return this}mapAlignIcon(t){return{left:"format_align_left",center:"format_align_middle",right:"format_align_right",justify:"format_align_justify"}[t]||"format_align_left"}get parsedOptions(){const t=this.optionsObj??this.options;let e=(()=>{if(Array.isArray(t))return t;try{return JSON.parse(String(t))}catch{return[]}})().map((t=>{const e=t?.value??t;return{value:e,label:t?.label??t?.value??t,icon:t?.icon??("align"===this.type?this.mapAlignIcon(String(e)):void 0)}}));if("heading"===this.type){e.length;e=e.filter((t=>a(t.value))),e.length,this.selectedValue&&!a(this.selectedValue)&&(this.selectedValue="")}return e}ensureDefault(){if(!this.selectedValue){const t=this.parsedOptions[0];t&&(this.selectedValue=t.value)}}onSelect(t){"heading"!==this.type||a(t)?(this.selectedValue=t,this.dispatchEvent(new CustomEvent("change",{detail:t,bubbles:!0,composed:!0}))):console.warn(`[nile-rte-select] Ignoring invalid heading value: ${t}`)}connectedCallback(){super.connectedCallback(),this.injectLocalStyles()}injectLocalStyles(){if(this.querySelector("style[data-rte-select-style]"))return;const t=document.createElement("style");t.setAttribute("data-rte-select-style","true"),t.textContent="\n nile-menu.rte-align-menu::part(menu__items-wrapper) {\n display: flex;\n }\n nile-menu.rte-align-menu,\n nile-menu.rte-default-menu {\n margin-top: 0px;\n }\n nile-button.rte-align-trigger::part(base),\n nile-button.rte-default-trigger::part(base) {\n min-width: 32px;\n height: 32px;\n padding: 0px 6px;\n box-shadow: none;\n }\n nile-button.rte-align-trigger::part(base) {\n \n\n border: none;\n}\n ",this.insertBefore(t,this.firstChild)}render(){const t=this.parsedOptions;this.ensureDefault();const e=t.find((t=>t.value===this.selectedValue));if("align"===this.type){const i=e?.icon?n`<nile-icon name="${e.icon}"></nile-icon>`:this.label||"Align";return n`
|
2
|
+
<nile-dropdown class="rte-align-dd">
|
3
|
+
<nile-button slot="trigger" variant="tertiary" class="rte-align-trigger">
|
4
|
+
${i}
|
5
|
+
</nile-button>
|
6
|
+
<nile-menu class="rte-align-menu">
|
7
|
+
${t.map((t=>n`
|
8
|
+
<nile-menu-item
|
9
|
+
class="rte-align-item"
|
10
|
+
?active=${t.value===this.selectedValue}
|
11
|
+
@click=${()=>this.onSelect(t.value)}>
|
12
|
+
<nile-icon name="${t.icon}"></nile-icon>
|
13
|
+
</nile-menu-item>
|
14
|
+
`))}
|
15
|
+
</nile-menu>
|
16
|
+
</nile-dropdown>
|
17
|
+
`}if("font"===this.type){const i=e?.label||this.label||"Font";return n`
|
38
18
|
<nile-dropdown class="rte-default-dd">
|
39
|
-
<nile-button
|
19
|
+
<nile-button
|
20
|
+
slot="trigger"
|
21
|
+
variant="tertiary"
|
22
|
+
class="rte-default-trigger"
|
23
|
+
style="font-family: ${e?.value||"inherit"}">
|
40
24
|
${i} <nile-icon name="arrowdown"></nile-icon>
|
41
25
|
</nile-button>
|
42
26
|
<nile-menu class="rte-default-menu">
|
43
27
|
${t.map((t=>n`
|
44
28
|
<nile-menu-item
|
29
|
+
style="font-family: ${t.value}"
|
45
30
|
?active=${t.value===this.selectedValue}
|
46
31
|
@click=${()=>this.onSelect(t.value)}>
|
47
32
|
${t.label}
|
@@ -49,4 +34,19 @@ import{__decorate as t}from"tslib";import{LitElement as e,html as n}from"lit";im
|
|
49
34
|
`))}
|
50
35
|
</nile-menu>
|
51
36
|
</nile-dropdown>
|
52
|
-
`}
|
37
|
+
`}const i=e?.label||this.label||"Select";return n`
|
38
|
+
<nile-dropdown class="rte-default-dd">
|
39
|
+
<nile-button slot="trigger" variant="tertiary" class="rte-default-trigger">
|
40
|
+
${i} <nile-icon name="arrowdown"></nile-icon>
|
41
|
+
</nile-button>
|
42
|
+
<nile-menu class="rte-default-menu">
|
43
|
+
${t.map((t=>n`
|
44
|
+
<nile-menu-item
|
45
|
+
?active=${t.value===this.selectedValue}
|
46
|
+
@click=${()=>this.onSelect(t.value)}>
|
47
|
+
${t.label}
|
48
|
+
</nile-menu-item>
|
49
|
+
`))}
|
50
|
+
</nile-menu>
|
51
|
+
</nile-dropdown>
|
52
|
+
`}};t([i({type:String})],o.prototype,"type",void 0),t([i({type:String})],o.prototype,"options",void 0),t([i({attribute:!1})],o.prototype,"optionsObj",void 0),t([i({type:String})],o.prototype,"label",void 0),t([r()],o.prototype,"selectedValue",void 0),o=t([l("nile-rte-select")],o);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.cjs.js","sources":["../../../src/nile-rich-text-editor/utils.ts"],"sourcesContent":["// src/nile-rich-text-editor/utils.ts\nexport function closestBlock(node: Node | null, root: HTMLElement): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) || display === 'block' || display === 'list-item') {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n}\n\nexport function nearestElement(n: Node | null): HTMLElement | null {\n while (n && !(n instanceof HTMLElement)) n = n.parentNode as Node | null;\n return n as HTMLElement | null;\n}\n\nexport function rgbToHex(rgb: string): string {\n const m = rgb.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!m) return '#000000';\n const r = Number(m[1]).toString(16).padStart(2,'0');\n const g = Number(m[2]).toString(16).padStart(2,'0');\n const b = Number(m[3]).toString(16).padStart(2,'0');\n return `#${r}${g}${b}`;\n}\n\nexport function unwrap(node: HTMLElement) {\n const p = node.parentNode; if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n}\n\nexport function surroundInline(range: Range, tag: string, attrs?: Record<string,string>) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => wrap.setAttribute(k, v));\n try { range.surroundContents(wrap); }\n catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n}\n\nexport function toggleInlineTag(root: HTMLElement, tag: 'strong'|'em'|'u'|'span', attrs?: Record<string,string>) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n if (range.collapsed) {\n const elm = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => elm.setAttribute(k,v));\n elm.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(elm);\n const r = document.createRange();\n r.setStart(elm.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n\n let n: Node | null = range.startContainer;\n let target: HTMLElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLElement && n.tagName.toLowerCase() === tag) { target = n; break; }\n n = n.parentNode;\n }\n if (target) unwrap(target); else surroundInline(range, tag, attrs);\n}\n\nexport function setBlockTag(root: HTMLElement, tag: 'p'|'h1'|'h2'|'h3') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n if (block.tagName.toLowerCase() === tag) return;\n const nb = document.createElement(tag);\n while (block.firstChild) nb.appendChild(block.firstChild);\n block.replaceWith(nb);\n const r = document.createRange(); r.selectNodeContents(nb); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n}\n\nexport function setAlignment(root: HTMLElement, align: 'left'|'center'|'right'|'justify') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n block.style.textAlign = align === 'justify' ? 'justify' : align;\n}\n\nexport function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const span = document.createElement('span');\n span.style.fontFamily = family;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange(); r.setStart(span.firstChild!, 1); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n}\n\n\nfunction enclosingStyledSpan(\neditor: HTMLElement,\nnode: Node | null,\ndataAttr: 'data-rte-color' | 'data-rte-bg'\n): HTMLSpanElement | null {\nwhile (node && node !== editor) {\n if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {\n return node;\n }\n node = node.parentNode;\n}\nreturn null;\n}\n\n\nfunction applyInlineStyle(\neditor: HTMLElement,\ncssProp: 'color' | 'backgroundColor',\nvalue: string,\ndataAttr: 'data-rte-color' | 'data-rte-bg'\n) {\nconst sel = window.getSelection();\nif (!sel || sel.rangeCount === 0) return;\nconst r0 = sel.getRangeAt(0);\nif (!editor.contains(r0.commonAncestorContainer)) return;\n\nconst range = r0.cloneRange();\n\n \nif (range.collapsed) {\n const enclosing = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n if (enclosing) {\n (enclosing.style as any)[cssProp] = value;\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = value;\n s.appendChild(document.createTextNode('\\u200B')); \n range.insertNode(s);\n\n\n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges(); sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n}\n\n\nconst leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\nconst rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\nif (leftEdge && leftEdge === rightEdge) {\n \n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n \n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\n\n\n const sel = window.getSelection();\n const r = document.createRange();\n r.selectNodeContents(mid);\n sel?.removeAllRanges();\n sel?.addRange(r);\n }\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n}\n\n \n const commonEl = (() => {\n let n: Node | null = range.commonAncestorContainer;\n while (n && !(n instanceof HTMLElement)) n = n.parentNode;\n return n as HTMLElement | null;\n })();\n\nconst walker = document.createTreeWalker(\n commonEl || editor,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (n) => {\n if (!n.nodeValue || !n.nodeValue.trim()) return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }\n }\n);\n\nconst toProcess: Text[] = [];\nlet t: Node | null;\nwhile ((t = walker.nextNode())) toProcess.push(t as Text);\n\ntoProcess.forEach((text) => {\n \n let start = 0, end = text.length;\n if (text === range.startContainer) start = range.startOffset;\n if (text === range.endContainer) end = range.endOffset;\n if (start > 0) text = text.splitText(start);\n if (end < text.length) text.splitText(end);\n\n // If this slice already sits in a styled span → update it, don’t nest.\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n // Create a new, single-purpose span\n const span = document.createElement('span');\n span.setAttribute(dataAttr, '1');\n (span.style as any)[cssProp] = value;\n const parent = text.parentElement!;\n parent.replaceChild(span, text);\n span.appendChild(text);\n});\n\nmergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n\n// restore selection\nsel.removeAllRanges(); sel.addRange(range);\n}\n\n// Is the range covering the entire node's contents?\nfunction rangeCoversWholeNode(range: Range, node: Node): boolean {\nconst all = document.createRange();\nall.selectNodeContents(node);\nreturn (\n range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, all) >= 0\n);\n}\n\nfunction hasRangeContent(r: Range): boolean {\nif (r.collapsed) return false;\nconst text = r.cloneContents().textContent || '';\nreturn text.length > 0;\n}\n\n// Split one styled span into [left][middle][right]; recolor only middle\nfunction splitAndRecolorWithinSpan(\nspan: HTMLSpanElement,\nrange: Range,\ndataAttr: 'data-rte-color' | 'data-rte-bg',\ncssProp: 'color' | 'backgroundColor',\nnewValue: string\n): HTMLSpanElement {\nconst oldValue = (span.style as any)[cssProp];\n\nconst left = document.createRange();\nleft.setStart(span, 0);\nleft.setEnd(range.startContainer, range.startOffset);\n\nconst right = document.createRange();\nright.setStart(range.endContainer, range.endOffset);\nright.setEnd(span, span.childNodes.length);\n\n// Build replacement fragment\nconst frag = document.createDocumentFragment();\n\n// helper to make a styled clone shell\nconst makeShell = (val: string) => {\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = val;\n return s;\n};\n\nif (hasRangeContent(left)) {\n const sLeft = makeShell(oldValue);\n sLeft.appendChild(left.cloneContents());\n frag.appendChild(sLeft);\n}\n\nconst mid = makeShell(newValue);\nmid.appendChild(range.cloneContents());\nfrag.appendChild(mid);\n\nif (hasRangeContent(right)) {\n const sRight = makeShell(oldValue);\n sRight.appendChild(right.cloneContents());\n frag.appendChild(sRight);\n}\n\n// Replace original span\nspan.replaceWith(frag);\nreturn mid; // return the middle span so caller can restore selection\n}\n\n\nfunction mergeAdjacentStyledSpans(\nroot: HTMLElement,\ndataAttr: 'data-rte-color' | 'data-rte-bg',\ncssProp: 'color' | 'backgroundColor'\n) {\nconst spans = Array.from(root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\n\nconst valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\nspans.forEach((s) => {\n\n const nested = Array.from(s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\n nested.forEach((child) => {\n if (valOf(child) === valOf(s)) {\n while (child.firstChild) s.insertBefore(child.firstChild, child);\n child.remove();\n }\n });\n\n \n const prev = s.previousSibling;\n if (prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return; // s is gone, next checks not needed\n }\n\n // 3) Merge with next sibling if identical\n const next = s.nextSibling;\n if (next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\n});\n}\n\n\nexport function setForeColor(editor: HTMLElement, hex: string) {\napplyInlineStyle(editor, 'color', hex, 'data-rte-color');\n}\nexport function setBackColor(editor: HTMLElement, hex: string) {\napplyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');\n}\n\n\nexport function toggleList(root: HTMLElement, kind: 'ul'|'ol') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n\n let li = block.closest('li');\n if (li) {\n const list = li.closest('ul,ol') as HTMLElement | null;\n if (!list) return;\n if (list.tagName.toLowerCase() === kind) {\n const parent = list.parentElement!;\n const frag = document.createDocumentFragment();\n for (const child of Array.from(list.children)) {\n if (child.tagName.toLowerCase() === 'li') {\n const p = document.createElement('p');\n while (child.firstChild) p.appendChild(child.firstChild);\n frag.appendChild(p);\n }\n }\n parent.replaceChild(frag, list);\n } else {\n const newList = document.createElement(kind);\n while (list.firstChild) newList.appendChild(list.firstChild);\n list.replaceWith(newList);\n }\n return;\n }\n\n const list = document.createElement(kind);\n const item = document.createElement('li'); list.appendChild(item);\n while (block.firstChild) item.appendChild(block.firstChild);\n block.replaceWith(list);\n}\n\nexport function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n let n: Node | null = range.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== root) { if (n instanceof HTMLAnchorElement) { a = n; break; } n = n.parentNode; }\n\n const url = href ?? (typeof window !== 'undefined' ? window.prompt('Enter URL', a?.href || 'https://') || '' : '');\n if (!url) return;\n\n if (a) { a.href = url; return; }\n\n if (range.collapsed) {\n const link = document.createElement('a'); link.href = url; link.textContent = url; range.insertNode(link);\n const r = document.createRange(); r.setStartAfter(link); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n\n const link = document.createElement('a'); link.href = url;\n try { range.surroundContents(link); }\n catch { const frag = range.extractContents(); link.appendChild(frag); range.insertNode(link); }\n}\n"],"names":["closestBlock","node","root","_n","HTMLElement","display","getComputedStyle","tagName","match","parentNode","nearestElement","n","rgbToHex","rgb","m","concat","Number","toString","padStart","surroundInline","range","tag","attrs","wrap","document","createElement","Object","entries","forEach","_ref","_ref2","_slicedToArray","k","v","setAttribute","surroundContents","_unused","frag","extractContents","appendChild","insertNode","toggleInlineTag","sel","getSelection","rangeCount","getRangeAt","collapsed","elm","_ref3","_ref4","createTextNode","r","createRange","setStart","firstChild","collapse","removeAllRanges","addRange","startContainer","target","toLowerCase","p","insertBefore","removeChild","unwrap","setBlockTag","block","nb","replaceWith","selectNodeContents","setAlignment","align","style","textAlign","setFontFamily","family","span","fontFamily","enclosingStyledSpan","editor","dataAttr","HTMLSpanElement","hasAttribute","applyInlineStyle","cssProp","value","window","r0","contains","commonAncestorContainer","cloneRange","enclosing","mergeAdjacentStyledSpans","s","caret","leftEdge","rightEdge","endContainer","all","compareBoundaryPoints","Range","START_TO_START","END_TO_END","rangeCoversWholeNode","mid","newValue","oldValue","left","setEnd","startOffset","right","endOffset","childNodes","length","createDocumentFragment","makeShell","val","hasRangeContent","sLeft","cloneContents","sRight","splitAndRecolorWithinSpan","commonEl","walker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","nodeValue","trim","FILTER_REJECT","nodeRange","END_TO_START","START_TO_END","FILTER_ACCEPT","toProcess","t","nextNode","push","text","start","end","splitText","existing","parentElement","replaceChild","textContent","spans","Array","from","querySelectorAll","valOf","el","child","remove","prev","previousSibling","next","nextSibling","setForeColor","hex","setBackColor","insertOrEditLink","href","_r3","a","HTMLAnchorElement","url","prompt","link","setStartAfter","_unused2"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"utils.cjs.js","sources":["../../../src/nile-rich-text-editor/utils.ts"],"sourcesContent":["// src/nile-rich-text-editor/utils.ts\nexport function closestBlock(node: Node | null, root: HTMLElement): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) || display === 'block' || display === 'list-item') {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n }\n \n export function nearestElement(n: Node | null): HTMLElement | null {\n while (n && !(n instanceof HTMLElement)) n = n.parentNode as Node | null;\n return n as HTMLElement | null;\n }\n \n export function rgbToHex(rgb: string): string {\n const m = rgb.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!m) return '#000000';\n const r = Number(m[1]).toString(16).padStart(2,'0');\n const g = Number(m[2]).toString(16).padStart(2,'0');\n const b = Number(m[3]).toString(16).padStart(2,'0');\n return `#${r}${g}${b}`;\n }\n \n export function unwrap(node: HTMLElement) {\n const p = node.parentNode; if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n }\n \n export function surroundInline(range: Range, tag: string, attrs?: Record<string,string>) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => wrap.setAttribute(k, v));\n try { range.surroundContents(wrap); }\n catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n }\n \n export function toggleInlineTag(root: HTMLElement, tag: 'strong'|'em'|'u'|'span', attrs?: Record<string,string>) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n \n if (range.collapsed) {\n const elm = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => elm.setAttribute(k,v));\n elm.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(elm);\n const r = document.createRange();\n r.setStart(elm.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n let n: Node | null = range.startContainer;\n let target: HTMLElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLElement && n.tagName.toLowerCase() === tag) { target = n; break; }\n n = n.parentNode;\n }\n if (target) unwrap(target); else surroundInline(range, tag, attrs);\n }\n \n export function setBlockTag(root: HTMLElement, tag: 'p'|'h1'|'h2'|'h3') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n if (block.tagName.toLowerCase() === tag) return;\n const nb = document.createElement(tag);\n while (block.firstChild) nb.appendChild(block.firstChild);\n block.replaceWith(nb);\n const r = document.createRange(); r.selectNodeContents(nb); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n }\n \n export function setAlignment(root: HTMLElement, align: 'left'|'center'|'right'|'justify') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n block.style.textAlign = align === 'justify' ? 'justify' : align;\n }\n \n export function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const span = document.createElement('span');\n span.style.fontFamily = family;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange(); r.setStart(span.firstChild!, 1); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n }\n\n \nfunction enclosingStyledSpan(\n editor: HTMLElement,\n node: Node | null,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n): HTMLSpanElement | null {\n while (node && node !== editor) {\n if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\n\n \nfunction applyInlineStyle(\n editor: HTMLElement,\n cssProp: 'color' | 'backgroundColor',\n value: string,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r0 = sel.getRangeAt(0);\n if (!editor.contains(r0.commonAncestorContainer)) return;\n\n const range = r0.cloneRange();\n\n \n if (range.collapsed) {\n const enclosing = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n if (enclosing) {\n (enclosing.style as any)[cssProp] = value;\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = value;\n s.appendChild(document.createTextNode('\\u200B')); \n range.insertNode(s);\n\n \n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges(); sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n \n const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\n if (leftEdge && leftEdge === rightEdge) {\n \n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n \n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\n \n \n const sel = window.getSelection();\n const r = document.createRange();\n r.selectNodeContents(mid);\n sel?.removeAllRanges();\n sel?.addRange(r);\n }\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n \n const commonEl = (() => {\n let n: Node | null = range.commonAncestorContainer;\n while (n && !(n instanceof HTMLElement)) n = n.parentNode;\n return n as HTMLElement | null;\n })();\n\n const walker = document.createTreeWalker(\n commonEl || editor,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (n) => {\n if (!n.nodeValue || !n.nodeValue.trim()) return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }\n }\n );\n\n const toProcess: Text[] = [];\n let t: Node | null;\n while ((t = walker.nextNode())) toProcess.push(t as Text);\n\n toProcess.forEach((text) => {\n \n let start = 0, end = text.length;\n if (text === range.startContainer) start = range.startOffset;\n if (text === range.endContainer) end = range.endOffset;\n if (start > 0) text = text.splitText(start);\n if (end < text.length) text.splitText(end);\n\n // If this slice already sits in a styled span → update it, don’t nest.\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n // Create a new, single-purpose span\n const span = document.createElement('span');\n span.setAttribute(dataAttr, '1');\n (span.style as any)[cssProp] = value;\n const parent = text.parentElement!;\n parent.replaceChild(span, text);\n span.appendChild(text);\n });\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n\n // restore selection\n sel.removeAllRanges(); sel.addRange(range);\n}\n\n // Is the range covering the entire node's contents?\nfunction rangeCoversWholeNode(range: Range, node: Node): boolean {\n const all = document.createRange();\n all.selectNodeContents(node);\n return (\n range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, all) >= 0\n );\n}\n\nfunction hasRangeContent(r: Range): boolean {\n if (r.collapsed) return false;\n const text = r.cloneContents().textContent || '';\n return text.length > 0;\n}\n\n// Split one styled span into [left][middle][right]; recolor only middle\nfunction splitAndRecolorWithinSpan(\n span: HTMLSpanElement,\n range: Range,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor',\n newValue: string\n): HTMLSpanElement {\n const oldValue = (span.style as any)[cssProp];\n\n const left = document.createRange();\n left.setStart(span, 0);\n left.setEnd(range.startContainer, range.startOffset);\n\n const right = document.createRange();\n right.setStart(range.endContainer, range.endOffset);\n right.setEnd(span, span.childNodes.length);\n\n // Build replacement fragment\n const frag = document.createDocumentFragment();\n\n // helper to make a styled clone shell\n const makeShell = (val: string) => {\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = val;\n return s;\n };\n\n if (hasRangeContent(left)) {\n const sLeft = makeShell(oldValue);\n sLeft.appendChild(left.cloneContents());\n frag.appendChild(sLeft);\n }\n\n const mid = makeShell(newValue);\n mid.appendChild(range.cloneContents());\n frag.appendChild(mid);\n\n if (hasRangeContent(right)) {\n const sRight = makeShell(oldValue);\n sRight.appendChild(right.cloneContents());\n frag.appendChild(sRight);\n }\n\n // Replace original span\n span.replaceWith(frag);\n return mid; // return the middle span so caller can restore selection\n}\n\n\nfunction mergeAdjacentStyledSpans(\n root: HTMLElement,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor'\n) {\n const spans = Array.from(root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\n\n const valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\n spans.forEach((s) => {\n \n const nested = Array.from(s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\n nested.forEach((child) => {\n if (valOf(child) === valOf(s)) {\n while (child.firstChild) s.insertBefore(child.firstChild, child);\n child.remove();\n }\n });\n\n \n const prev = s.previousSibling;\n if (prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return; // s is gone, next checks not needed\n }\n\n // 3) Merge with next sibling if identical\n const next = s.nextSibling;\n if (next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\n });\n}\n\n\nexport function setForeColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'color', hex, 'data-rte-color');\n}\nexport function setBackColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');\n}\n\n\n export function toggleList(root: HTMLElement, kind: 'ul'|'ol') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n \n let li = block.closest('li');\n if (li) {\n const list = li.closest('ul,ol') as HTMLElement | null;\n if (!list) return;\n if (list.tagName.toLowerCase() === kind) {\n const parent = list.parentElement!;\n const frag = document.createDocumentFragment();\n for (const child of Array.from(list.children)) {\n if (child.tagName.toLowerCase() === 'li') {\n const p = document.createElement('p');\n while (child.firstChild) p.appendChild(child.firstChild);\n frag.appendChild(p);\n }\n }\n parent.replaceChild(frag, list);\n } else {\n const newList = document.createElement(kind);\n while (list.firstChild) newList.appendChild(list.firstChild);\n list.replaceWith(newList);\n }\n return;\n }\n \n const list = document.createElement(kind);\n const item = document.createElement('li'); list.appendChild(item);\n while (block.firstChild) item.appendChild(block.firstChild);\n block.replaceWith(list);\n }\n \n export function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n \n let n: Node | null = range.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== root) { if (n instanceof HTMLAnchorElement) { a = n; break; } n = n.parentNode; }\n \n const url = href ?? (typeof window !== 'undefined' ? window.prompt('Enter URL', a?.href || 'https://') || '' : '');\n if (!url) return;\n \n if (a) { a.href = url; return; }\n \n if (range.collapsed) {\n const link = document.createElement('a'); link.href = url; link.textContent = url; range.insertNode(link);\n const r = document.createRange(); r.setStartAfter(link); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n const link = document.createElement('a'); link.href = url;\n try { range.surroundContents(link); }\n catch { const frag = range.extractContents(); link.appendChild(frag); range.insertNode(link); }\n }\n "],"names":["closestBlock","node","root","_n","HTMLElement","display","getComputedStyle","tagName","match","parentNode","nearestElement","n","rgbToHex","rgb","m","concat","Number","toString","padStart","surroundInline","range","tag","attrs","wrap","document","createElement","Object","entries","forEach","_ref","_ref2","_slicedToArray","k","v","setAttribute","surroundContents","_unused","frag","extractContents","appendChild","insertNode","toggleInlineTag","sel","getSelection","rangeCount","getRangeAt","collapsed","elm","_ref3","_ref4","createTextNode","r","createRange","setStart","firstChild","collapse","removeAllRanges","addRange","startContainer","target","toLowerCase","p","insertBefore","removeChild","unwrap","setBlockTag","block","nb","replaceWith","selectNodeContents","setAlignment","align","style","textAlign","setFontFamily","family","span","fontFamily","enclosingStyledSpan","editor","dataAttr","HTMLSpanElement","hasAttribute","applyInlineStyle","cssProp","value","window","r0","contains","commonAncestorContainer","cloneRange","enclosing","mergeAdjacentStyledSpans","s","caret","leftEdge","rightEdge","endContainer","all","compareBoundaryPoints","Range","START_TO_START","END_TO_END","rangeCoversWholeNode","mid","newValue","oldValue","left","setEnd","startOffset","right","endOffset","childNodes","length","createDocumentFragment","makeShell","val","hasRangeContent","sLeft","cloneContents","sRight","splitAndRecolorWithinSpan","commonEl","walker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","nodeValue","trim","FILTER_REJECT","nodeRange","END_TO_START","START_TO_END","FILTER_ACCEPT","toProcess","t","nextNode","push","text","start","end","splitText","existing","parentElement","replaceChild","textContent","spans","Array","from","querySelectorAll","valOf","el","child","remove","prev","previousSibling","next","nextSibling","setForeColor","hex","setBackColor","insertOrEditLink","href","_r3","a","HTMLAnchorElement","url","prompt","link","setStartAfter","_unused2"],"mappings":"0yCACgB,QAAAA,CAAAA,CAAaC,CAAAA,CAAAA,CAAmBC,CAC5C,CAAA,CAAA,KAAOD,CAAQA,EAAAA,CAAAA,GAASC,CAAM,EAAA,KAAAC,EAAA,CAC5B,GAAIF,CAAAA,WAAgBG,CAAAA,WAAa,CAAA,CAC/B,GAAMC,CAAAA,EAAUC,CAAAA,gBAAAA,CAAiBL,CAAMI,CAAAA,CAAAA,OAAAA,CACvC,GAAIJ,CAAAA,CAAKM,OAAQC,CAAAA,KAAAA,CAAM,mCAAiD,OAAZH,GAAAA,EAAAA,EAAmC,WAAZA,GAAAA,EAAAA,CACjF,MAAOJ,CAAAA,CAEV,EACDA,CAAAA,CAAOA,EAAAA,EAAAA,CAAAA,8BAAAA,EAAAA,CAAMQ,UAAc,GAAA,IAC5B,EACD,MAAOP,CAAAA,CACT,EAEM,QAAUQ,CAAAA,CAAAA,CAAeC,GAC7B,KAAOA,CAAAA,EAAAA,EAAOA,CAAaP,WAAAA,CAAAA,WAAAA,CAAAA,EAAcO,CAAIA,CAAAA,CAAAA,CAAEF,UAC/C,CAAA,MAAOE,CAAAA,CACT,EAEM,QAAUC,CAAAA,CAASC,CAAAA,CAAAA,CAAAA,CACvB,GAAMC,CAAAA,CAAAA,CAAID,CAAIL,CAAAA,KAAAA,CAAM,mCACpB,GAAKM,CAAAA,CAAAA,CAAG,MAAO,SAAA,CAIf,UAAAC,MAAA,CAHUC,MAAOF,CAAAA,CAAAA,CAAE,IAAIG,QAAS,CAAA,EAAA,CAAA,CAAIC,QAAS,CAAA,CAAA,CAAE,GACrCF,CAAAA,EAAAA,MAAAA,CAAAA,MAAAA,CAAOF,CAAE,CAAA,CAAA,CAAA,CAAA,CAAIG,SAAS,EAAIC,CAAAA,CAAAA,QAAAA,CAAS,CAAE,CAAA,GAAA,CAAA,EAAAH,MAAA,CACrCC,MAAOF,CAAAA,CAAAA,CAAE,CAAIG,CAAAA,CAAAA,CAAAA,QAAAA,CAAS,IAAIC,QAAS,CAAA,CAAA,CAAE,GAEjD,CAAA,EAAA,SAQgBC,CAAAA,CAAAA,CAAeC,CAAcC,CAAAA,CAAAA,CAAaC,GACxD,GAAMC,CAAAA,CAAAA,CAAOC,QAASC,CAAAA,aAAAA,CAAcJ,CAChCC,CAAAA,CAAAA,CAAAA,EAAOI,MAAOC,CAAAA,OAAAA,CAAQL,GAAOM,OAAQ,CAAA,SAAAC,IAAA,MAAAC,KAAA,CAAAC,cAAA,CAAAF,IAAA,IAAEG,CAAEC,CAAAA,KAAAA,IAAAA,CAAAA,CAAAA,KAAAA,UAAOV,CAAAA,CAAKW,CAAAA,YAAAA,CAAaF,CAAGC,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,CACzE,IAAMb,CAAMe,CAAAA,gBAAAA,CAAiBZ,CAAQ,CAAA,EACrC,MAAAa,OAAA,CACE,CAAA,GAAMC,CAAAA,GAAOjB,CAAAA,CAAAA,CAAMkB,kBACnBf,CAAKgB,CAAAA,WAAAA,CAAYF,GACjBjB,CAAAA,CAAAA,CAAAA,CAAMoB,UAAWjB,CAAAA,CAAAA,CAClB,EACH,SAEgBkB,CAAAA,CAAgBvC,CAAAA,CAAAA,CAAmBmB,CAA+BC,CAAAA,CAAAA,CAAAA,CAChF,GAAMoB,CAAAA,CAAAA,CAAMlB,QAASmB,CAAAA,YAAAA,CAAAA,CAAAA,CACrB,IAAKD,CAA0B,EAAA,CAAA,GAAnBA,CAAIE,CAAAA,UAAAA,CAAkB,OAClC,GAAMxB,CAAAA,CAAQsB,CAAAA,CAAAA,CAAIG,WAAW,CAE7B,CAAA,CAAA,GAAIzB,CAAM0B,CAAAA,SAAAA,CAAW,CACnB,GAAMC,CAAAA,GAAMvB,CAAAA,QAAAA,CAASC,cAAcJ,CAC/BC,CAAAA,CAAAA,CAAAA,EAAOI,MAAOC,CAAAA,OAAAA,CAAQL,CAAOM,CAAAA,CAAAA,OAAAA,CAAQ,SAAAoB,KAAA,MAAAC,KAAA,CAAAlB,cAAA,CAAAiB,KAAA,IAAEhB,CAAAA,CAAAA,KAAAA,IAAEC,iBAAOc,CAAAA,GAAIb,CAAAA,YAAAA,CAAaF,CAAEC,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,CACvEc,GAAIR,CAAAA,WAAAA,CAAYf,QAAS0B,CAAAA,cAAAA,CAAe,MACxC9B,CAAMoB,CAAAA,UAAAA,CAAWO,GACjB,CAAA,CAAA,GAAMI,CAAAA,EAAI3B,CAAAA,QAAAA,CAAS4B,WAInB,CAAA,CAAA,CAAA,MAHAD,CAAAA,GAAEE,QAASN,CAAAA,GAAAA,CAAIO,UAAa,CAAA,CAAA,CAAA,CAC5BH,EAAEI,CAAAA,QAAAA,CAAAA,CAAS,CACXb,CAAAA,CAAAA,CAAAA,CAAIc,sBAAmBd,CAAAA,CAAIe,CAAAA,QAAAA,CAASN,EAErC,CAAA,EAED,GAAIxC,CAAAA,CAAAA,CAAiBS,CAAMsC,CAAAA,cAAAA,CACvBC,EAA6B,IACjC,CAAA,KAAOhD,CAAKA,EAAAA,CAAAA,GAAMT,CAAM,EAAA,CACtB,GAAIS,CAAAA,WAAaP,CAAAA,aAAeO,CAAEJ,CAAAA,OAAAA,CAAQqD,WAAkBvC,CAAAA,CAAAA,GAAAA,CAAAA,CAAK,CAAEsC,CAAAA,CAAShD,CAAG,CAAA,MAAQ,CACvFA,CAAIA,CAAAA,CAAAA,CAAEF,UACP,EACGkD,CAxCA,CAAA,SAAiB1D,CACrB,CAAA,CAAA,GAAM4D,CAAAA,EAAI5D,CAAKQ,CAAAA,UAAAA,CAAY,GAAKoD,CAAAA,CAAL,CAC3B,KAAO5D,CAAKqD,CAAAA,UAAAA,EAAYO,EAAEC,YAAa7D,CAAAA,CAAAA,CAAKqD,UAAYrD,CAAAA,CAAAA,CAAAA,CACxD4D,CAAEE,CAAAA,WAAAA,CAAY9D,CAF4B,CAAA,EAG5C,CAoCc+D,CAAOL,CAAAA,CAAAA,CAAcxC,CAAeC,CAAAA,CAAAA,CAAOC,CAAKC,CAAAA,CAAAA,CAC9D,EAEgB,QAAA2C,CAAAA,EAAY/D,CAAmBmB,CAAAA,CAAAA,CAAAA,CAC7C,GAAMqB,CAAAA,CAAAA,CAAMlB,QAASmB,CAAAA,YAAAA,CAAAA,CAAAA,CAAgB,GAAKD,CAAAA,CAAAA,EAA0B,IAAnBA,CAAIE,CAAAA,UAAAA,CAAkB,OACvE,GACMsB,CAAAA,CAAQlE,CAAAA,CAAAA,CADA0C,CAAIG,CAAAA,UAAAA,CAAW,GACIa,cAAgBxD,CAAAA,CAAAA,CAAAA,CAAO,GAAKgE,CAAAA,CAAAA,CAAO,OACpE,GAAIA,CAAM3D,CAAAA,OAAAA,CAAQqD,gBAAkBvC,CAAK,CAAA,OACzC,GAAM8C,CAAAA,CAAAA,CAAK3C,QAASC,CAAAA,aAAAA,CAAcJ,CAClC,CAAA,CAAA,KAAO6C,CAAMZ,CAAAA,UAAAA,EAAYa,CAAG5B,CAAAA,WAAAA,CAAY2B,CAAMZ,CAAAA,UAAAA,CAAAA,CAC9CY,CAAME,CAAAA,WAAAA,CAAYD,GAClB,GAAMhB,CAAAA,CAAAA,CAAI3B,QAAS4B,CAAAA,WAAAA,CAAAA,CAAAA,CAAeD,CAAEkB,CAAAA,kBAAAA,CAAmBF,CAAKhB,CAAAA,CAAAA,CAAAA,CAAEI,UAAS,CACvEb,CAAAA,CAAAA,CAAAA,CAAIc,eAAmBd,CAAAA,CAAAA,CAAAA,CAAAA,CAAIe,QAASN,CAAAA,CAAAA,CACtC,EAEgB,QAAAmB,CAAAA,EAAapE,CAAmBqE,CAAAA,CAAAA,CAAAA,CAC9C,GAAM7B,CAAAA,CAAAA,CAAMlB,QAASmB,CAAAA,YAAAA,CAAAA,CAAAA,CAAgB,GAAKD,CAAAA,CAAAA,EAA0B,IAAnBA,CAAIE,CAAAA,UAAAA,CAAkB,OACvE,GACMsB,CAAAA,CAAQlE,CAAAA,CAAAA,CADA0C,CAAIG,CAAAA,UAAAA,CAAW,GACIa,cAAgBxD,CAAAA,CAAAA,CAAAA,CAAYgE,CAC7DA,GAAAA,CAAAA,CAAMM,KAAMC,CAAAA,SAAAA,CAAsB,SAAVF,GAAAA,CAAAA,CAAsB,UAAYA,CAC5D,CAAA,EAEgB,QAAAG,CAAAA,CAAAA,CAAcxE,CAAmByE,CAAAA,CAAAA,CAAAA,CAC/C,GAAMjC,CAAAA,CAAAA,CAAMlB,SAASmB,YAAgB,CAAA,CAAA,CAAA,GAAA,CAAKD,CAA0B,EAAA,CAAA,GAAnBA,CAAIE,CAAAA,UAAAA,CAAkB,OACvE,GAAMxB,CAAAA,EAAQsB,CAAIG,CAAAA,UAAAA,CAAW,CAC7B,CAAA,CAAA,GAAIzB,CAAM0B,CAAAA,SAAAA,CAAW,CACnB,GAAM8B,CAAAA,IAAOpD,QAASC,CAAAA,aAAAA,CAAc,MACpCmD,CAAAA,CAAAA,GAAAA,CAAKJ,KAAMK,CAAAA,UAAAA,CAAaF,CACxBC,CAAAA,GAAAA,CAAKrC,YAAYf,QAAS0B,CAAAA,cAAAA,CAAe,GACzC9B,CAAAA,CAAAA,CAAAA,CAAAA,CAAMoB,UAAWoC,CAAAA,GAAAA,CAAAA,CACjB,GAAMzB,CAAAA,GAAAA,CAAI3B,SAAS4B,WAEnB,CAAA,CAAA,CAAA,MAFkCD,CAAAA,GAAEE,CAAAA,QAAAA,CAASuB,GAAKtB,CAAAA,UAAAA,CAAa,CAAIH,CAAAA,CAAAA,GAAAA,CAAEI,UAAS,CAC9Eb,CAAAA,CAAAA,CAAAA,CAAIc,eAAmBd,CAAAA,CAAAA,CAAAA,IAAAA,CAAAA,CAAAA,CAAIe,QAASN,CAAAA,GAAAA,CAErC,EACDhC,CAAAA,CAAeC,EAAO,MAAQ,CAAA,CAAEoD,KAAO,gBAAAzD,MAAA,CAAe4D,CACxD,CAAA,CAAA,CAAA,EAGF,QAASG,CAAAA,CAAAA,CACPC,EACA9E,CACA+E,CAAAA,CAAAA,CAAAA,CAEA,KAAO/E,CAAAA,EAAQA,CAAS8E,GAAAA,CAAAA,EAAQ,CAC9B,GAAI9E,YAAgBgF,CAAAA,eAAmBhF,EAAAA,CAAAA,CAAKiF,YAAaF,CAAAA,CAAAA,CAAAA,CACvD,MAAO/E,CAAAA,CAAAA,CAETA,CAAOA,CAAAA,CAAAA,CAAKQ,UACb,EACD,MAAO,KACT,EAGA,QAAS0E,CAAAA,CAAAA,CACPJ,CACAK,CAAAA,CAAAA,CACAC,EACAL,CAEA,CAAA,CAAA,GAAMtC,CAAAA,CAAM4C,CAAAA,MAAAA,CAAO3C,YACnB,CAAA,CAAA,CAAA,GAAA,CAAKD,CAA0B,EAAA,CAAA,GAAnBA,EAAIE,UAAkB,CAAA,OAClC,GAAM2C,CAAAA,CAAAA,CAAK7C,CAAIG,CAAAA,UAAAA,CAAW,CAC1B,CAAA,CAAA,GAAA,CAAKkC,EAAOS,QAASD,CAAAA,CAAAA,CAAGE,uBAA0B,CAAA,CAAA,OAElD,GAAMrE,CAAAA,CAAAA,CAAQmE,CAAGG,CAAAA,UAAAA,CAAAA,CAAAA,CAGjB,GAAItE,CAAM0B,CAAAA,SAAAA,CAAW,CACnB,GAAM6C,CAAAA,EAAYb,CAAAA,CAAAA,CAAoBC,CAAQ3D,CAAAA,CAAAA,CAAMsC,eAAgBsB,CACpE,CAAA,CAAA,GAAIW,EAGF,CAAA,MAFCA,CAAAA,EAAUnB,CAAAA,KAAAA,CAAcY,CAAWC,CAAAA,CAAAA,CAAAA,CAAAA,IACpCO,CAAAA,EAAyBb,CAAQC,CAAAA,CAAAA,CAAUI,CAI7C,CAAA,CAAA,GAAMS,CAAAA,EAAIrE,CAAAA,QAAAA,CAASC,aAAc,CAAA,MAAA,CAAA,CACjCoE,GAAE3D,YAAa8C,CAAAA,CAAAA,CAAU,GACxBa,CAAAA,CAAAA,EAAAA,CAAErB,KAAcY,CAAAA,CAAAA,CAAAA,CAAWC,CAC5BQ,CAAAA,EAAAA,CAAEtD,YAAYf,QAAS0B,CAAAA,cAAAA,CAAe,GACtC9B,CAAAA,CAAAA,CAAAA,CAAAA,CAAMoB,UAAWqD,CAAAA,EAAAA,CAAAA,CAGjB,GAAMC,CAAAA,EAAAA,CAAQtE,SAAS4B,WAMvB,CAAA,CAAA,CAAA,MALA0C,CAAAA,EAAMzC,CAAAA,QAAAA,CAASwC,EAAEvC,CAAAA,UAAAA,CAAa,CAC9BwC,CAAAA,CAAAA,EAAAA,CAAMvC,UAAS,CACfb,CAAAA,CAAAA,CAAAA,CAAIc,eAAmBd,CAAAA,CAAAA,CAAAA,CAAAA,CAAIe,QAASqC,CAAAA,EAAAA,CAAAA,CAAAA,IAEpCF,CAAAA,CAAyBb,CAAAA,CAAAA,CAAQC,EAAUI,CAE5C,CAAA,EAGD,GAAMW,CAAAA,CAAAA,CAAWjB,CAAoBC,CAAAA,CAAAA,CAAQ3D,CAAMsC,CAAAA,cAAAA,CAAgBsB,GAC7DgB,CAAYlB,CAAAA,CAAAA,CAAoBC,CAAQ3D,CAAAA,CAAAA,CAAM6E,YAAcjB,CAAAA,CAAAA,CAAAA,CAClE,GAAIe,CAAAA,EAAYA,IAAaC,CAAW,CAAA,CAEtC,GAiFJ,SAA8B5E,CAAcnB,CAAAA,CAAAA,CAAAA,CAC1C,GAAMiG,CAAAA,CAAAA,CAAM1E,SAAS4B,WAErB,CAAA,CAAA,CAAA,MADA8C,CAAAA,CAAI7B,CAAAA,kBAAAA,CAAmBpE,CAErBmB,CAAAA,CAAAA,CAAAA,CAAM+E,qBAAsBC,CAAAA,KAAAA,CAAMC,eAAgBH,CAAQ,CAAA,EAAA,CAAA,EAC1D9E,CAAM+E,CAAAA,qBAAAA,CAAsBC,KAAME,CAAAA,UAAAA,CAAYJ,CAAQ,CAAA,EAAA,CAE1D,EAxFQK,CAAqBnF,CAAO2E,CAAAA,CAAAA,CAAAA,CAC7BA,CAASvB,CAAAA,KAAAA,CAAcY,CAAWC,CAAAA,CAAAA,CAAAA,CAAAA,IAC9B,CAEL,GAAMmB,CAAAA,GAAAA,CA6FZ,SACE5B,CAAAA,CACAxD,CACA4D,CAAAA,CAAAA,CACAI,CACAqB,CAAAA,CAAAA,CAAAA,CAEA,GAAMC,CAAAA,CAAY9B,CAAAA,CAAAA,CAAKJ,KAAcY,CAAAA,CAAAA,CAAAA,CAE/BuB,CAAOnF,CAAAA,QAAAA,CAAS4B,WACtBuD,CAAAA,CAAAA,CAAAA,CAAAA,CAAKtD,SAASuB,CAAM,CAAA,CAAA,CAAA,CACpB+B,CAAKC,CAAAA,MAAAA,CAAOxF,CAAMsC,CAAAA,cAAAA,CAAgBtC,CAAMyF,CAAAA,WAAAA,CAAAA,CAExC,GAAMC,CAAAA,CAAQtF,CAAAA,QAAAA,CAAS4B,WACvB0D,CAAAA,CAAAA,CAAAA,CAAAA,CAAMzD,QAASjC,CAAAA,CAAAA,CAAM6E,YAAc7E,CAAAA,CAAAA,CAAM2F,WACzCD,CAAMF,CAAAA,MAAAA,CAAOhC,CAAMA,CAAAA,CAAAA,CAAKoC,UAAWC,CAAAA,MAAAA,CAAAA,CAGnC,GAAM5E,CAAAA,CAAAA,CAAOb,SAAS0F,sBAGhBC,CAAAA,CAAAA,CAAAA,CAAAA,CAAaC,QAAbD,CAAAA,CAAAA,CAAaC,CACjB,CAAA,CAAA,GAAMvB,CAAAA,CAAIrE,CAAAA,QAAAA,CAASC,aAAc,CAAA,MAAA,CAAA,CAGjC,MAFAoE,CAAAA,CAAE3D,CAAAA,YAAAA,CAAa8C,CAAU,CAAA,GAAA,CAAA,CACxBa,CAAErB,CAAAA,KAAAA,CAAcY,CAAWgC,CAAAA,CAAAA,CAAAA,CACrBvB,CAAC,EAGV,CAAA,GAAIwB,CAAgBV,CAAAA,CAAAA,CAAAA,CAAO,CACzB,GAAMW,CAAAA,GAAQH,CAAAA,CAAAA,CAAUT,GACxBY,GAAM/E,CAAAA,WAAAA,CAAYoE,CAAKY,CAAAA,aAAAA,CAAAA,CAAAA,CAAAA,CACvBlF,CAAKE,CAAAA,WAAAA,CAAY+E,GAClB,CAAA,EAED,GAAMd,CAAAA,CAAMW,CAAAA,CAAAA,CAAUV,CAItB,CAAA,CAAA,GAHAD,CAAIjE,CAAAA,WAAAA,CAAYnB,CAAMmG,CAAAA,aAAAA,CAAAA,CAAAA,CAAAA,CACtBlF,EAAKE,WAAYiE,CAAAA,CAAAA,CAAAA,CAEba,CAAgBP,CAAAA,CAAAA,CAAAA,CAAQ,CAC1B,GAAMU,CAAAA,GAASL,CAAAA,CAAAA,CAAUT,GACzBc,GAAOjF,CAAAA,WAAAA,CAAYuE,CAAMS,CAAAA,aAAAA,CAAAA,CAAAA,CAAAA,CACzBlF,CAAKE,CAAAA,WAAAA,CAAYiF,GAClB,CAAA,EAID,MADA5C,CAAAA,CAAKR,CAAAA,WAAAA,CAAY/B,CACVmE,CAAAA,CAAAA,CACT,EA5IkBiB,CACV1B,CACA3E,CAAAA,CAAAA,CACA4D,EACAI,CACAC,CAAAA,CAAAA,CAAAA,CAII3C,EAAM4C,CAAAA,MAAAA,CAAO3C,YACbQ,CAAAA,CAAAA,CAAAA,GAAAA,CAAI3B,QAAS4B,CAAAA,WAAAA,CAAAA,CAAAA,CACnBD,IAAEkB,kBAAmBmC,CAAAA,GAAAA,CAAAA,CACrB9D,EAAKc,SAALd,EAAKc,WAALd,EAAKc,CAAAA,eAAAA,CAAAA,CAAAA,CACLd,EAAKe,SAALf,EAAKe,iBAALf,EAAKe,CAAAA,QAAAA,CAASN,GACf,CAAA,EAED,WADAyC,CAAAA,CAAyBb,CAAAA,CAAAA,CAAQC,CAAUI,CAAAA,CAAAA,CAE5C,EAGD,GAAMsC,CAAAA,CAAW,CAAA,UAAA,CACf,GAAI/G,CAAAA,CAAiBS,CAAAA,CAAAA,CAAMqE,uBAC3B,CAAA,KAAO9E,CAAOA,EAAAA,EAAAA,CAAAA,WAAaP,CAAAA,WAAcO,CAAAA,EAAAA,CAAAA,CAAIA,EAAEF,UAC/C,CAAA,MAAOE,CAAAA,CACR,EAAA,CAEKgH,CAAAA,CAAAA,CAAAA,CAASnG,QAASoG,CAAAA,gBAAAA,CACtBF,GAAY3C,CACZ8C,CAAAA,UAAAA,CAAWC,SACX,CAAA,CACEC,UAAapH,CAAAA,QAAboH,CAAAA,UAAapH,CAAAA,CAAAA,CAAAA,CACX,GAAKA,CAAAA,CAAAA,CAAEqH,YAAcrH,CAAEqH,CAAAA,SAAAA,CAAUC,IAAQ,CAAA,CAAA,CAAA,MAAOJ,CAAAA,UAAWK,CAAAA,aAAAA,CAC3D,GAAMC,CAAAA,CAAAA,CAAY3G,SAAS4B,WAC3B+E,CAAAA,CAAAA,CAAAA,CAAAA,CAAU9D,kBAAmB1D,CAAAA,CAAAA,CAAAA,CAI7B,MAFES,CAAAA,CAAAA,CAAM+E,qBAAsBC,CAAAA,KAAAA,CAAMgC,aAAcD,CAAa,CAAA,CAAA,CAAA,EAC7D/G,CAAM+E,CAAAA,qBAAAA,CAAsBC,KAAMiC,CAAAA,YAAAA,CAAcF,CAAa,CAAA,CAAA,CAAA,CAC3CN,WAAWS,aAAgBT,CAAAA,UAAAA,CAAWK,aAAa,EAAA,CAAA,CAAA,CAKvEK,CAAoB,CAAA,EAAA,CAC1B,GAAIC,CAAAA,CAAAA,CACJ,KAAQA,CAAIb,CAAAA,CAAAA,CAAOc,QAAaF,CAAAA,CAAAA,EAAAA,CAAAA,CAAUG,IAAKF,CAAAA,CAAAA,CAAAA,CAE/CD,CAAU3G,CAAAA,OAAAA,CAAS+G,SAAAA,GAEjB,GAAIC,CAAAA,CAAAA,CAAQ,CAAGC,CAAAA,CAAAA,CAAMF,CAAK1B,CAAAA,MAAAA,CACtB0B,CAASvH,GAAAA,CAAAA,CAAMsC,iBAAgBkF,CAAQxH,CAAAA,CAAAA,CAAMyF,WAC7C8B,CAAAA,CAAAA,CAAAA,GAASvH,CAAM6E,CAAAA,YAAAA,GAAgB4C,CAAQzH,CAAAA,CAAAA,CAAM2F,WAC7C6B,CAAQ,CAAA,CAAA,GAAGD,CAAOA,CAAAA,CAAAA,CAAKG,SAAUF,CAAAA,CAAAA,CAAAA,CAAAA,CACjCC,CAAQF,CAAAA,CAAAA,CAAK1B,QAAQ0B,CAAKG,CAAAA,SAAAA,CAAUD,CAGxC,CAAA,CAAA,GAAME,CAAAA,CAAWjE,CAAAA,CAAAA,CAAoBC,CAAQ4D,CAAAA,CAAAA,CAAM3D,GACnD,GAAI+D,CAAAA,CAEF,MADCA,MAAAA,CAAAA,CAASvE,KAAcY,CAAAA,CAAAA,CAAAA,CAAWC,CAKrC,CAAA,CAAA,GAAMT,CAAAA,EAAOpD,QAASC,CAAAA,aAAAA,CAAc,MACpCmD,CAAAA,CAAAA,CAAAA,CAAK1C,YAAa8C,CAAAA,CAAAA,CAAU,GAC3BJ,CAAAA,CAAAA,CAAAA,CAAKJ,MAAcY,CAAWC,CAAAA,CAAAA,CAAAA,CAChBsD,CAAKK,CAAAA,aAAAA,CACbC,YAAarE,CAAAA,CAAAA,CAAM+D,CAC1B/D,CAAAA,CAAAA,CAAAA,CAAKrC,WAAYoG,CAAAA,CAAAA,CAAK,EAGxB/C,CAAAA,CAAAA,CAAAA,CAAyBb,CAAQC,CAAAA,CAAAA,CAAUI,CAG3C1C,CAAAA,CAAAA,CAAAA,CAAIc,kBAAmBd,CAAIe,CAAAA,QAAAA,CAASrC,CACtC,CAAA,EAYA,QAASiG,CAAAA,CAAAA,CAAgBlE,CACvB,CAAA,CAAA,GAAIA,EAAEL,SAAW,CAAA,MAAA,CAAO,CAExB,CAAA,MAAA,CADaK,CAAEoE,CAAAA,aAAAA,CAAAA,CAAAA,CAAgB2B,WAAe,EAAA,EAAA,EAClCjC,OAAS,CACvB,EAqDA,QAASrB,CAAAA,CAAAA,CACP1F,CACA8E,CAAAA,CAAAA,CACAI,CAEA,CAAA,CAAA,GAAM+D,CAAAA,EAAQC,KAAMC,CAAAA,IAAAA,CAAKnJ,CAAKoJ,CAAAA,gBAAAA,SAAAA,MAAAA,CAA0CtE,CAAAA,KAAAA,CAAAA,CAAAA,CAElEuE,CAASC,CAAAA,QAATD,CAAAA,CAASC,CAAAA,CAAAA,QAAqBA,CAAAA,EAAGhF,KAAcY,CAAAA,CAAAA,CAAAA,GAErD+D,CAAMvH,CAAAA,OAAAA,CAASiE,SAAAA,CAEEuD,CAAAA,CAAAA,KAAAA,CAAMC,IAAKxD,CAAAA,CAAAA,CAAEyD,gCAA0CtE,CAAAA,KAAAA,CAAAA,CAAAA,CAC/DpD,OAAS6H,CAAAA,SAAAA,CAAAA,CAAAA,CACd,GAAIF,CAAAA,CAAME,CAAWF,CAAAA,GAAAA,CAAAA,CAAM1D,GAAI,CAC7B,KAAO4D,CAAMnG,CAAAA,UAAAA,EAAYuC,CAAE/B,CAAAA,YAAAA,CAAa2F,CAAMnG,CAAAA,UAAAA,CAAYmG,GAC1DA,CAAMC,CAAAA,MAAAA,CAAAA,CACP,EAIH,CAAA,CAAA,CAAA,GAAMC,CAAAA,CAAO9D,CAAAA,CAAAA,CAAE+D,eACf,CAAA,GAAID,YAAgB1E,CAAAA,eAChB0E,EAAAA,CAAAA,CAAKzE,YAAaF,CAAAA,CAAAA,CAAAA,EAClBuE,CAAMI,CAAAA,CAAAA,CAAAA,GAAUJ,CAAM1D,CAAAA,CAAAA,CAAAA,CAAI,CAC5B,KAAOA,CAAAA,CAAEvC,UAAYqG,EAAAA,CAAAA,CAAKpH,WAAYsD,CAAAA,CAAAA,CAAEvC,UAExC,CAAA,CAAA,MAAA,KADAuC,CAAAA,EAAE6D,MAEH,CAAA,CAAA,EAGD,GAAMG,CAAAA,CAAAA,CAAOhE,CAAEiE,CAAAA,WAAAA,CACf,GAAID,CAAAA,WAAgB5E,CAAAA,iBAChB4E,CAAK3E,CAAAA,YAAAA,CAAaF,CAClBuE,CAAAA,EAAAA,CAAAA,CAAMM,CAAUN,CAAAA,GAAAA,CAAAA,CAAM1D,CAAI,CAAA,CAAA,CAC5B,KAAOgE,CAAKvG,CAAAA,UAAAA,EAAYuC,CAAEtD,CAAAA,WAAAA,CAAYsH,CAAKvG,CAAAA,UAAAA,CAAAA,CAC3CuG,CAAKH,CAAAA,MAAAA,CAAAA,CACN,IAEL,EAGgB,QAAAK,CAAAA,CAAahF,CAAAA,CAAAA,CAAqBiF,CAChD7E,CAAAA,CAAAA,CAAAA,CAAiBJ,CAAQ,CAAA,OAAA,CAASiF,EAAK,gBACzC,CAAA,EACgB,QAAAC,CAAAA,CAAAA,CAAalF,CAAqBiF,CAAAA,CAAAA,CAAAA,CAChD7E,CAAiBJ,CAAAA,CAAAA,CAAQ,kBAAmBiF,CAAK,CAAA,aAAA,CACnD,EAqCkB,QAAAE,CAAAA,CAAiBhK,CAAAA,CAAAA,CAAmBiK,CAClD,CAAA,KAAAC,GAAA,CAAA,GAAM1H,CAAAA,EAAMlB,QAASmB,CAAAA,YAAAA,CAAAA,CAAAA,CAAgB,GAAKD,CAAAA,CAAAA,EAA0B,CAAnBA,GAAAA,CAAAA,CAAIE,UAAkB,CAAA,OACvE,GAAMxB,CAAAA,CAAQsB,CAAAA,CAAAA,CAAIG,UAAW,CAAA,CAAA,CAAA,CAE7B,GAAIlC,CAAAA,CAAAA,CAAiBS,CAAMsC,CAAAA,cAAAA,CACvB2G,EAA8B,IAClC,CAAA,KAAO1J,CAAKA,EAAAA,CAAAA,GAAMT,CAAM,EAAA,CAAE,GAAIS,CAAAA,WAAa2J,CAAAA,kBAAmB,CAAED,CAAAA,CAAI1J,CAAG,CAAA,MAAQ,CAACA,CAAAA,CAAIA,CAAEF,CAAAA,UAAa,EAEnG,GAAM8J,CAAAA,CAAAA,CAAMJ,CAA2B,SAA3BA,CAA2B,UAA3BA,CAA2B,CAAA,WAAA,EAAA,MAAX7E,CAAAA,MAAyBA,EAAAA,MAAAA,CAAOkF,MAAO,CAAA,WAAA,CAAaH,EAAAA,GAAAA,CAAAA,+BAAAA,GAAAA,CAAGF,IAAQ,GAAA,UAAA,CAAA,EAAoB,EAC/G,CAAA,GAAA,CAAKI,CAAK,CAAA,OAEV,GAAIF,CAAAA,CAAmB,YAAdA,CAAEF,CAAAA,IAAAA,CAAOI,CAElB,CAAA,CAAA,GAAInJ,CAAM0B,CAAAA,SAAAA,CAAW,CACnB,GAAM2H,CAAAA,IAAOjJ,QAASC,CAAAA,aAAAA,CAAc,GAAMgJ,CAAAA,CAAAA,GAAAA,CAAKN,IAAOI,CAAAA,CAAAA,CAAKE,GAAKvB,CAAAA,WAAAA,CAAcqB,EAAKnJ,CAAMoB,CAAAA,UAAAA,CAAWiI,GACpG,CAAA,CAAA,GAAMtH,CAAAA,GAAI3B,CAAAA,QAAAA,CAAS4B,WAEnB,CAAA,CAAA,CAAA,MAFkCD,CAAAA,IAAEuH,aAAcD,CAAAA,GAAAA,CAAAA,CAAOtH,GAAEI,CAAAA,QAAAA,CAAAA,CAAS,CACpEb,CAAAA,CAAAA,CAAAA,CAAIc,eAAmBd,CAAAA,CAAAA,CAAAA,IAAAA,CAAAA,CAAAA,CAAIe,SAASN,GAErC,CAAA,EAED,GAAMsH,CAAAA,CAAAA,CAAOjJ,QAASC,CAAAA,aAAAA,CAAc,GAAMgJ,CAAAA,CAAAA,CAAAA,CAAKN,KAAOI,CACtD,CAAA,GAAA,CAAMnJ,CAAMe,CAAAA,gBAAAA,CAAiBsI,CAAQ,CAAA,EACrC,MAAAE,QAAA,CAAQ,CAAA,GAAMtI,CAAAA,IAAOjB,CAAMkB,CAAAA,eAAAA,CAAAA,CAAAA,CAAmBmI,CAAKlI,CAAAA,WAAAA,CAAYF,GAAOjB,CAAAA,CAAAA,CAAAA,CAAMoB,UAAWiI,CAAAA,CAAAA,CAAQ,EACjG"}
|
@@ -18,7 +18,7 @@ nile-rte-toolbar-item > nile-button::part(base) {
|
|
18
18
|
|
19
19
|
|
20
20
|
.toolbar, nile-rte-toolbar {
|
21
|
-
display:flex; align-items:center; gap:
|
21
|
+
display:flex; align-items:center; gap:6px; padding:8px;
|
22
22
|
border:1px solid #e5e7eb; border-bottom:none; border-radius:8px 8px 0 0; background:#fff;
|
23
23
|
}
|
24
24
|
|
@@ -65,14 +65,17 @@ font-weight: bold;}
|
|
65
65
|
display: inline-flex;
|
66
66
|
align-items: center;
|
67
67
|
justify-content: center;
|
68
|
-
|
69
|
-
padding: 0 8px;
|
70
|
-
border: 1px solid var(--nile-color-border, #d9d9d9);
|
68
|
+
/* border: 1px solid var(--nile-color-border, #d9d9d9); */
|
71
69
|
border-radius: 6px;
|
72
70
|
background: #fff;
|
73
71
|
cursor: pointer;
|
74
|
-
|
72
|
+
border:none;
|
73
|
+
|
75
74
|
|
75
|
+
}
|
76
|
+
nile-button.rte-color-trigger::part(base){
|
77
|
+
width:32px; height:32px; padding:0px 6px;
|
78
|
+
}
|
76
79
|
.rte-color-trigger .glyph-stack {
|
77
80
|
display: grid; /* stack vertically */
|
78
81
|
grid-auto-rows: max-content;
|
@@ -84,17 +87,17 @@ font-weight: bold;}
|
|
84
87
|
.rte-color-trigger .glyph {
|
85
88
|
font-size: 14px;
|
86
89
|
line-height: 1;
|
87
|
-
margin-bottom: 2px;
|
90
|
+
margin-bottom: 2px;
|
88
91
|
}
|
89
92
|
|
90
93
|
.rte-color-trigger .underline {
|
91
94
|
width: 18px;
|
92
95
|
height: 3px;
|
93
96
|
border-radius: 2px;
|
94
|
-
background: currentColor;
|
97
|
+
background: currentColor;
|
95
98
|
}
|
96
99
|
|
97
|
-
|
100
|
+
|
98
101
|
.rte-color-trigger .swatch-box {
|
99
102
|
width: 18px;
|
100
103
|
height: 16px;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nile-rich-text-editor.css.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.css.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA
|
1
|
+
{"version":3,"file":"nile-rich-text-editor.css.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rich-text-editor.css.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0GxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["// rte-styles.ts\nimport { css } from 'lit';\n\nexport const styles = css`\n .editor * {\n all: revert;\n}\n\n nile-rich-text-editor { position: relative; display: block; font-family: inherit; }\n\n \nnile-rte-toolbar-item > nile-button::part(base) {\n \n width:32px; height:32px; padding:0px 6px;\n border: none;\n}\n \n \n\n\n .toolbar, nile-rte-toolbar {\n display:flex; align-items:center; gap:6px; padding:8px; \n border:1px solid #e5e7eb; border-bottom:none; border-radius:8px 8px 0 0; background:#fff;\n }\n\n nile-rte-toolbar-item > button, .toolbar button, nile-rte-toolbar button {\n border:1px solid #e5e7eb; background:#fff; border-radius:6px;\n cursor:pointer;\n }\n\n \n /* Ensure clicks hit the button (not nested icon internals) */\n nile-rte-toolbar-item > button nile-icon { pointer-events:none; }\n\n nile-rte-toolbar-item > button.active { border-color:#2563eb; background:#eff6ff; }\n nile-rte-select select { height:32px; border:1px solid #e5e7eb; border-radius:6px; background:#fff; }\n nile-rte-color input[type=\"color\"] { height:32px; width:36px; border:1px solid #e5e7eb; padding:0; border-radius:6px; background:#fff; }\n nile-rte-divider { width:1px; height:20px; background:#e5e7eb; display:inline-block; margin:0 4px; }\n\n .editor p { margin:1em 0; }\n .editor h1 { font-size:2em, all: revert; display: block;\nfont-size: 2em;\nmargin-top: 0.67em;\nmargin-bottom: 0.67em;\nmargin-left: 0;\nmargin-right: 0;\nfont-weight: bold; }\n .editor h2 { all: revert;\tdisplay: block;\nfont-size: 1.5em;\nmargin-top: 0.83em;\nmargin-bottom: 0.83em;\nmargin-left: 0;\nmargin-right: 0;\nfont-weight: bold;}\n .editor h3 { font-size:1.17em }\n .editor h4 { font-size:1em }\n .editor h5 { font-size:0.83em }\n .editor h6 { font-size:0.67em }\n\n .editor { min-height:160px; padding:12px; border:1px solid #e5e7eb; border-radius:0 0 8px 8px; background:#fff; outline:none; white-space: pre-wrap;\n tab-size: 4; \n -moz-tab-size: 4; }\n nile-rte-preview { display:block; margin-top:10px; padding:10px; border:1px dashed #cbd5e1; border-radius:8px; background:#fafafa; }\n\n .rte-color-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* border: 1px solid var(--nile-color-border, #d9d9d9); */\n border-radius: 6px;\n background: #fff;\n cursor: pointer;\n border:none;\n \n\n}\nnile-button.rte-color-trigger::part(base){\n width:32px; height:32px; padding:0px 6px;\n}\n.rte-color-trigger .glyph-stack {\n display: grid; /* stack vertically */\n grid-auto-rows: max-content; \n align-items: center;\n justify-items: center;\n line-height: 1;\n}\n\n.rte-color-trigger .glyph {\n font-size: 14px;\n line-height: 1;\n margin-bottom: 2px; \n}\n\n.rte-color-trigger .underline {\n width: 18px;\n height: 3px;\n border-radius: 2px;\n background: currentColor; \n}\n\n \n.rte-color-trigger .swatch-box {\n width: 18px;\n height: 16px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0.35);\n background: currentColor; /* overridden via JS */\n}\n\n`;\n\nexport default [styles];"]}
|
@@ -24,8 +24,8 @@ const DEFAULT_ICONS = {
|
|
24
24
|
center: 'format_align_middle',
|
25
25
|
right: 'format_align_right',
|
26
26
|
justify: 'format_align_justify',
|
27
|
-
ul: '
|
28
|
-
ol: '
|
27
|
+
ul: 'format_list_bulleted',
|
28
|
+
ol: 'format_list_numbered',
|
29
29
|
clear: 'error',
|
30
30
|
};
|
31
31
|
let NileRichTextEditor = class NileRichTextEditor extends LitElement {
|
@@ -267,27 +267,25 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
|
|
267
267
|
}
|
268
268
|
input.title = label;
|
269
269
|
input.value = value;
|
270
|
-
|
271
|
-
let trigger = child.querySelector(':scope > button.rte-color-trigger');
|
270
|
+
let trigger = child.querySelector(':scope > nile-button');
|
272
271
|
if (!trigger) {
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
272
|
+
const nb = document.createElement('nile-button');
|
273
|
+
nb.variant = 'ghost';
|
274
|
+
nb.className = 'rte-color-trigger';
|
275
|
+
nb.setAttribute('aria-label', label);
|
277
276
|
if (mode === 'background') {
|
278
|
-
|
279
|
-
<span class="swatch-box" aria-hidden="true"></span>
|
280
|
-
`;
|
277
|
+
nb.innerHTML = `<span class="swatch-box" aria-hidden="true"></span>`;
|
281
278
|
}
|
282
279
|
else {
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
280
|
+
nb.innerHTML = `
|
281
|
+
<span class="glyph-stack" aria-hidden="true">
|
282
|
+
<span class="glyph">A</span>
|
283
|
+
<span class="underline"></span>
|
284
|
+
</span>
|
288
285
|
`;
|
289
286
|
}
|
290
|
-
child.appendChild(
|
287
|
+
child.appendChild(nb);
|
288
|
+
trigger = nb;
|
291
289
|
}
|
292
290
|
// Cache swatch elements to update later
|
293
291
|
const underline = trigger.querySelector('.underline');
|
@@ -592,27 +590,37 @@ let NileRichTextEditor = class NileRichTextEditor extends LitElement {
|
|
592
590
|
if (!this.editorEl)
|
593
591
|
return;
|
594
592
|
this.ensureAtLeastOneParagraph();
|
595
|
-
// Clone content for safe manipulation
|
596
593
|
const clone = this.editorEl.cloneNode(true);
|
597
|
-
// Walk the original DOM and the clone in parallel
|
598
594
|
const origWalker = document.createTreeWalker(this.editorEl, NodeFilter.SHOW_ELEMENT);
|
599
595
|
const cloneWalker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT);
|
596
|
+
const importantProps = [
|
597
|
+
'font-weight',
|
598
|
+
'font-style',
|
599
|
+
'text-decoration',
|
600
|
+
'color',
|
601
|
+
'background-color',
|
602
|
+
'font-size',
|
603
|
+
'font-family',
|
604
|
+
'text-align',
|
605
|
+
'line-height',
|
606
|
+
'letter-spacing',
|
607
|
+
'white-space',
|
608
|
+
'vertical-align'
|
609
|
+
];
|
600
610
|
while (origWalker.nextNode() && cloneWalker.nextNode()) {
|
601
611
|
const origEl = origWalker.currentNode;
|
602
612
|
const cloneEl = cloneWalker.currentNode;
|
603
613
|
const computed = window.getComputedStyle(origEl);
|
604
|
-
|
605
|
-
const cssText = Array.from(computed)
|
614
|
+
const cssText = importantProps
|
606
615
|
.map(prop => `${prop}:${computed.getPropertyValue(prop)}`)
|
607
616
|
.join(';');
|
608
|
-
|
617
|
+
if (cssText.trim()) {
|
618
|
+
cloneEl.setAttribute('style', cssText);
|
619
|
+
}
|
609
620
|
}
|
610
|
-
// Store the fully inlined HTML
|
611
621
|
this.content = clone.innerHTML;
|
612
|
-
// Live preview updates
|
613
622
|
if (this.previewEl)
|
614
623
|
this.previewEl.innerHTML = this.content;
|
615
|
-
// Emit event with full inline styles
|
616
624
|
this.dispatchEvent(new CustomEvent('content-changed', {
|
617
625
|
detail: { content: this.content },
|
618
626
|
bubbles: true,
|