trotl-texteditor 1.0.3 → 1.0.5
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/README.md +19 -24
- package/dist/index.cjs +1 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +301 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +18 -10
- package/dist/index.cjs.js +0 -333
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.esm.js +0 -331
- package/dist/index.esm.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trotl-texteditor",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "dist/index.cjs",
|
|
6
|
-
"module": "dist/index.
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "Texteditor table UI",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"default": "./dist/index.mjs"
|
|
14
|
+
},
|
|
15
|
+
"./dist/index.css": "./dist/index.css"
|
|
16
|
+
},
|
|
8
17
|
"files": [
|
|
9
|
-
"dist"
|
|
18
|
+
"dist",
|
|
19
|
+
"dist/index.css"
|
|
10
20
|
],
|
|
11
21
|
"scripts": {
|
|
12
|
-
"dev": "vite",
|
|
13
|
-
"build": "rollup -c",
|
|
22
|
+
"dev": "vite --config vite.dev.config.js",
|
|
23
|
+
"build": "rollup -c rollup.config.js",
|
|
14
24
|
"prepublishOnly": "npm run build"
|
|
15
25
|
},
|
|
16
26
|
"peerDependencies": {
|
|
@@ -41,8 +51,6 @@
|
|
|
41
51
|
"dependencies": {},
|
|
42
52
|
"keywords": [
|
|
43
53
|
"react",
|
|
44
|
-
"calendar",
|
|
45
|
-
"drag-and-drop",
|
|
46
54
|
"ui-library"
|
|
47
55
|
]
|
|
48
56
|
}
|
package/dist/index.cjs.js
DELETED
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
|
|
5
|
-
const DEFAULT_HTML = `
|
|
6
|
-
<h1>Welcome</h1>
|
|
7
|
-
<p>This is a lightweight WYSIWYG editor built without external libraries.</p>
|
|
8
|
-
<ul>
|
|
9
|
-
<li>Edit text directly</li>
|
|
10
|
-
<li>Use the toolbar for formatting</li>
|
|
11
|
-
<li>Copy, paste, and export HTML</li>
|
|
12
|
-
</ul>
|
|
13
|
-
`;
|
|
14
|
-
const COMMANDS = [{
|
|
15
|
-
cmd: "bold",
|
|
16
|
-
label: "Bold",
|
|
17
|
-
icon: "B"
|
|
18
|
-
}, {
|
|
19
|
-
cmd: "italic",
|
|
20
|
-
label: "Italic",
|
|
21
|
-
icon: "I"
|
|
22
|
-
}, {
|
|
23
|
-
cmd: "underline",
|
|
24
|
-
label: "Underline",
|
|
25
|
-
icon: "U"
|
|
26
|
-
}, {
|
|
27
|
-
cmd: "strikeThrough",
|
|
28
|
-
label: "Strike",
|
|
29
|
-
icon: "S"
|
|
30
|
-
}, {
|
|
31
|
-
cmd: "insertUnorderedList",
|
|
32
|
-
label: "Bullets",
|
|
33
|
-
icon: "•"
|
|
34
|
-
}, {
|
|
35
|
-
cmd: "insertOrderedList",
|
|
36
|
-
label: "Numbered",
|
|
37
|
-
icon: "1."
|
|
38
|
-
}, {
|
|
39
|
-
cmd: "justifyLeft",
|
|
40
|
-
label: "Left",
|
|
41
|
-
icon: "⟸"
|
|
42
|
-
}, {
|
|
43
|
-
cmd: "justifyCenter",
|
|
44
|
-
label: "Center",
|
|
45
|
-
icon: "⇔"
|
|
46
|
-
}, {
|
|
47
|
-
cmd: "justifyRight",
|
|
48
|
-
label: "Right",
|
|
49
|
-
icon: "⟹"
|
|
50
|
-
}];
|
|
51
|
-
function Editor({
|
|
52
|
-
theme = "dark",
|
|
53
|
-
tools = COMMANDS.map(item => item.cmd),
|
|
54
|
-
showHeading = true,
|
|
55
|
-
showFontSize = true,
|
|
56
|
-
showLink = true,
|
|
57
|
-
showUndoRedo = true,
|
|
58
|
-
showClear = true,
|
|
59
|
-
showPlainPaste = true,
|
|
60
|
-
showColor = true,
|
|
61
|
-
showLiveHtml = true,
|
|
62
|
-
showStats = true,
|
|
63
|
-
showCopyHtml = true,
|
|
64
|
-
onChange = () => {}
|
|
65
|
-
}) {
|
|
66
|
-
const editorRef = react.useRef(null);
|
|
67
|
-
const [html, setHtml] = react.useState("");
|
|
68
|
-
const [plainPaste, setPlainPaste] = react.useState(true);
|
|
69
|
-
const [selectionText, setSelectionText] = react.useState("");
|
|
70
|
-
const [heading, setHeading] = react.useState("p");
|
|
71
|
-
const [fontSize, setFontSize] = react.useState("16");
|
|
72
|
-
const [textColor, setTextColor] = react.useState("#1f2937");
|
|
73
|
-
const [activeToolMap, setActiveToolMap] = react.useState({});
|
|
74
|
-
react.useEffect(() => {
|
|
75
|
-
if (editorRef.current) {
|
|
76
|
-
editorRef.current.innerHTML = DEFAULT_HTML;
|
|
77
|
-
setHtml(editorRef.current.innerHTML);
|
|
78
|
-
}
|
|
79
|
-
}, []);
|
|
80
|
-
const stats = react.useMemo(() => {
|
|
81
|
-
const text = editorRef.current?.innerText || "";
|
|
82
|
-
const words = text.trim() ? text.trim().split(/\s+/).length : 0;
|
|
83
|
-
return {
|
|
84
|
-
words,
|
|
85
|
-
chars: text.length
|
|
86
|
-
};
|
|
87
|
-
}, []);
|
|
88
|
-
const exec = (cmd, value = null) => {
|
|
89
|
-
editorRef.current?.focus();
|
|
90
|
-
document.execCommand(cmd, false, value);
|
|
91
|
-
const nextHtml = editorRef.current?.innerHTML || "";
|
|
92
|
-
setHtml(nextHtml);
|
|
93
|
-
onChange({
|
|
94
|
-
html: nextHtml,
|
|
95
|
-
text: editorRef.current?.innerText || ""
|
|
96
|
-
});
|
|
97
|
-
updateToolbarState();
|
|
98
|
-
};
|
|
99
|
-
const applyHeading = next => {
|
|
100
|
-
setHeading(next);
|
|
101
|
-
if (next === "p") {
|
|
102
|
-
exec("formatBlock", "P");
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
exec("formatBlock", next.toUpperCase());
|
|
106
|
-
};
|
|
107
|
-
const applyFontSize = next => {
|
|
108
|
-
setFontSize(next);
|
|
109
|
-
exec("fontSize", "7");
|
|
110
|
-
const fontElements = editorRef.current?.querySelectorAll("font[size='7']") || [];
|
|
111
|
-
fontElements.forEach(el => {
|
|
112
|
-
el.removeAttribute("size");
|
|
113
|
-
el.style.fontSize = `${next}px`;
|
|
114
|
-
});
|
|
115
|
-
setHtml(editorRef.current?.innerHTML || "");
|
|
116
|
-
updateToolbarState();
|
|
117
|
-
};
|
|
118
|
-
const applyTextColor = next => {
|
|
119
|
-
setTextColor(next);
|
|
120
|
-
exec("foreColor", next);
|
|
121
|
-
};
|
|
122
|
-
const insertLink = () => {
|
|
123
|
-
const url = window.prompt("Enter URL", "https://");
|
|
124
|
-
if (!url) return;
|
|
125
|
-
exec("createLink", url);
|
|
126
|
-
};
|
|
127
|
-
const removeFormat = () => exec("removeFormat");
|
|
128
|
-
const clearAll = () => {
|
|
129
|
-
if (!editorRef.current) return;
|
|
130
|
-
editorRef.current.innerHTML = "<p></p>";
|
|
131
|
-
setHtml(editorRef.current.innerHTML);
|
|
132
|
-
onChange({
|
|
133
|
-
html: editorRef.current.innerHTML,
|
|
134
|
-
text: editorRef.current.innerText || ""
|
|
135
|
-
});
|
|
136
|
-
updateToolbarState();
|
|
137
|
-
};
|
|
138
|
-
const onInput = () => {
|
|
139
|
-
const nextHtml = editorRef.current?.innerHTML || "";
|
|
140
|
-
setHtml(nextHtml);
|
|
141
|
-
onChange({
|
|
142
|
-
html: nextHtml,
|
|
143
|
-
text: editorRef.current?.innerText || ""
|
|
144
|
-
});
|
|
145
|
-
updateToolbarState();
|
|
146
|
-
};
|
|
147
|
-
const onPaste = event => {
|
|
148
|
-
if (!plainPaste) return;
|
|
149
|
-
event.preventDefault();
|
|
150
|
-
const text = event.clipboardData.getData("text/plain");
|
|
151
|
-
document.execCommand("insertText", false, text);
|
|
152
|
-
};
|
|
153
|
-
const updateToolbarState = react.useCallback(() => {
|
|
154
|
-
const selection = document.getSelection();
|
|
155
|
-
if (!selection || selection.rangeCount === 0 || !editorRef.current) return;
|
|
156
|
-
const anchorNode = selection.anchorNode;
|
|
157
|
-
const isInsideEditor = anchorNode && editorRef.current.contains(anchorNode);
|
|
158
|
-
if (!isInsideEditor) {
|
|
159
|
-
setSelectionText("");
|
|
160
|
-
setActiveToolMap({});
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
setSelectionText(selection.toString());
|
|
164
|
-
const nextActive = {};
|
|
165
|
-
COMMANDS.forEach(item => {
|
|
166
|
-
try {
|
|
167
|
-
nextActive[item.cmd] = document.queryCommandState(item.cmd);
|
|
168
|
-
} catch {
|
|
169
|
-
nextActive[item.cmd] = false;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
setActiveToolMap(nextActive);
|
|
173
|
-
}, []);
|
|
174
|
-
react.useEffect(() => {
|
|
175
|
-
document.addEventListener("selectionchange", updateToolbarState);
|
|
176
|
-
return () => document.removeEventListener("selectionchange", updateToolbarState);
|
|
177
|
-
}, [updateToolbarState]);
|
|
178
|
-
const exportHtml = async () => {
|
|
179
|
-
const payload = editorRef.current?.innerHTML || "";
|
|
180
|
-
await navigator.clipboard.writeText(payload);
|
|
181
|
-
alert("HTML copied to clipboard.");
|
|
182
|
-
};
|
|
183
|
-
const activeCommands = react.useMemo(() => COMMANDS.filter(item => tools.includes(item.cmd)), [tools]);
|
|
184
|
-
return /*#__PURE__*/React.createElement("section", {
|
|
185
|
-
className: `editor-root theme-${theme}${showLiveHtml ? "" : " no-preview"}`,
|
|
186
|
-
"data-theme": theme
|
|
187
|
-
}, /*#__PURE__*/React.createElement("div", {
|
|
188
|
-
className: "toolbar"
|
|
189
|
-
}, activeCommands.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
190
|
-
className: "toolbar-group"
|
|
191
|
-
}, activeCommands.map(item => /*#__PURE__*/React.createElement("button", {
|
|
192
|
-
key: item.cmd,
|
|
193
|
-
type: "button",
|
|
194
|
-
className: `toolbar-btn${activeToolMap[item.cmd] ? " active" : ""}`,
|
|
195
|
-
onMouseDown: event => event.preventDefault(),
|
|
196
|
-
onClick: () => exec(item.cmd),
|
|
197
|
-
title: item.label,
|
|
198
|
-
"aria-pressed": activeToolMap[item.cmd] || false
|
|
199
|
-
}, item.icon))), (showHeading || showFontSize || showColor) && /*#__PURE__*/React.createElement("div", {
|
|
200
|
-
className: "toolbar-group"
|
|
201
|
-
}, showHeading && /*#__PURE__*/React.createElement("label", {
|
|
202
|
-
className: "toolbar-label"
|
|
203
|
-
}, "Heading", /*#__PURE__*/React.createElement("select", {
|
|
204
|
-
value: heading,
|
|
205
|
-
onChange: event => applyHeading(event.target.value),
|
|
206
|
-
className: "toolbar-select"
|
|
207
|
-
}, /*#__PURE__*/React.createElement("option", {
|
|
208
|
-
value: "p"
|
|
209
|
-
}, "Paragraph"), /*#__PURE__*/React.createElement("option", {
|
|
210
|
-
value: "h1"
|
|
211
|
-
}, "Heading 1"), /*#__PURE__*/React.createElement("option", {
|
|
212
|
-
value: "h2"
|
|
213
|
-
}, "Heading 2"), /*#__PURE__*/React.createElement("option", {
|
|
214
|
-
value: "h3"
|
|
215
|
-
}, "Heading 3"))), showFontSize && /*#__PURE__*/React.createElement("label", {
|
|
216
|
-
className: "toolbar-label"
|
|
217
|
-
}, "Size", /*#__PURE__*/React.createElement("select", {
|
|
218
|
-
value: fontSize,
|
|
219
|
-
onChange: event => applyFontSize(event.target.value),
|
|
220
|
-
className: "toolbar-select"
|
|
221
|
-
}, /*#__PURE__*/React.createElement("option", {
|
|
222
|
-
value: "14"
|
|
223
|
-
}, "14px"), /*#__PURE__*/React.createElement("option", {
|
|
224
|
-
value: "16"
|
|
225
|
-
}, "16px"), /*#__PURE__*/React.createElement("option", {
|
|
226
|
-
value: "18"
|
|
227
|
-
}, "18px"), /*#__PURE__*/React.createElement("option", {
|
|
228
|
-
value: "22"
|
|
229
|
-
}, "22px"), /*#__PURE__*/React.createElement("option", {
|
|
230
|
-
value: "28"
|
|
231
|
-
}, "28px"))), showColor && /*#__PURE__*/React.createElement("label", {
|
|
232
|
-
className: "toolbar-label color-label"
|
|
233
|
-
}, "Color", /*#__PURE__*/React.createElement("input", {
|
|
234
|
-
type: "color",
|
|
235
|
-
className: "toolbar-color",
|
|
236
|
-
value: textColor,
|
|
237
|
-
onChange: event => applyTextColor(event.target.value),
|
|
238
|
-
"aria-label": "Text color"
|
|
239
|
-
}))), (showLink || showUndoRedo || showClear) && /*#__PURE__*/React.createElement("div", {
|
|
240
|
-
className: "toolbar-group"
|
|
241
|
-
}, showLink && /*#__PURE__*/React.createElement("button", {
|
|
242
|
-
type: "button",
|
|
243
|
-
className: "toolbar-btn",
|
|
244
|
-
onClick: insertLink
|
|
245
|
-
}, "Link"), showUndoRedo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
246
|
-
type: "button",
|
|
247
|
-
className: "toolbar-btn",
|
|
248
|
-
onClick: () => exec("undo")
|
|
249
|
-
}, "Undo"), /*#__PURE__*/React.createElement("button", {
|
|
250
|
-
type: "button",
|
|
251
|
-
className: "toolbar-btn",
|
|
252
|
-
onClick: () => exec("redo")
|
|
253
|
-
}, "Redo")), showClear && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
254
|
-
type: "button",
|
|
255
|
-
className: "toolbar-btn",
|
|
256
|
-
onClick: removeFormat
|
|
257
|
-
}, "Clear format"), /*#__PURE__*/React.createElement("button", {
|
|
258
|
-
type: "button",
|
|
259
|
-
className: "toolbar-btn danger",
|
|
260
|
-
onClick: clearAll
|
|
261
|
-
}, "Clear all"))), showPlainPaste && /*#__PURE__*/React.createElement("div", {
|
|
262
|
-
className: "toolbar-group toggle"
|
|
263
|
-
}, /*#__PURE__*/React.createElement("label", {
|
|
264
|
-
className: "toggle-row"
|
|
265
|
-
}, /*#__PURE__*/React.createElement("input", {
|
|
266
|
-
type: "checkbox",
|
|
267
|
-
checked: plainPaste,
|
|
268
|
-
onChange: event => setPlainPaste(event.target.checked)
|
|
269
|
-
}), "Paste as plain text"))), /*#__PURE__*/React.createElement("div", {
|
|
270
|
-
className: "editor-area"
|
|
271
|
-
}, /*#__PURE__*/React.createElement("div", {
|
|
272
|
-
ref: editorRef,
|
|
273
|
-
className: "editor-surface",
|
|
274
|
-
contentEditable: true,
|
|
275
|
-
onInput: onInput,
|
|
276
|
-
onPaste: onPaste,
|
|
277
|
-
onKeyUp: updateToolbarState,
|
|
278
|
-
onMouseUp: updateToolbarState,
|
|
279
|
-
suppressContentEditableWarning: true,
|
|
280
|
-
spellCheck: true
|
|
281
|
-
})), (showStats || showCopyHtml) && /*#__PURE__*/React.createElement("footer", {
|
|
282
|
-
className: "editor-footer"
|
|
283
|
-
}, showStats && /*#__PURE__*/React.createElement("div", {
|
|
284
|
-
className: "footer-stats"
|
|
285
|
-
}, /*#__PURE__*/React.createElement("span", null, stats.words, " words"), /*#__PURE__*/React.createElement("span", null, stats.chars, " characters"), /*#__PURE__*/React.createElement("span", null, selectionText ? `${selectionText.length} selected` : "No selection")), showCopyHtml && /*#__PURE__*/React.createElement("div", {
|
|
286
|
-
className: "footer-actions"
|
|
287
|
-
}, /*#__PURE__*/React.createElement("button", {
|
|
288
|
-
type: "button",
|
|
289
|
-
className: "toolbar-btn",
|
|
290
|
-
onClick: exportHtml
|
|
291
|
-
}, "Copy HTML"))), showLiveHtml && /*#__PURE__*/React.createElement("aside", {
|
|
292
|
-
className: "editor-preview"
|
|
293
|
-
}, /*#__PURE__*/React.createElement("div", {
|
|
294
|
-
className: "preview-header"
|
|
295
|
-
}, "Live HTML"), /*#__PURE__*/React.createElement("pre", {
|
|
296
|
-
className: "preview-code"
|
|
297
|
-
}, html)));
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
function styleInject(css, ref) {
|
|
301
|
-
if ( ref === void 0 ) ref = {};
|
|
302
|
-
var insertAt = ref.insertAt;
|
|
303
|
-
|
|
304
|
-
if (typeof document === 'undefined') { return; }
|
|
305
|
-
|
|
306
|
-
var head = document.head || document.getElementsByTagName('head')[0];
|
|
307
|
-
var style = document.createElement('style');
|
|
308
|
-
style.type = 'text/css';
|
|
309
|
-
|
|
310
|
-
if (insertAt === 'top') {
|
|
311
|
-
if (head.firstChild) {
|
|
312
|
-
head.insertBefore(style, head.firstChild);
|
|
313
|
-
} else {
|
|
314
|
-
head.appendChild(style);
|
|
315
|
-
}
|
|
316
|
-
} else {
|
|
317
|
-
head.appendChild(style);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (style.styleSheet) {
|
|
321
|
-
style.styleSheet.cssText = css;
|
|
322
|
-
} else {
|
|
323
|
-
style.appendChild(document.createTextNode(css));
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
var css_248z = ".app-shell{background:radial-gradient(circle at top,rgba(99,102,241,.12),transparent 45%),#0b0f19;min-height:100vh}.app-header,.app-shell{display:flex;flex-direction:column}.app-header{gap:6px;padding:24px 32px 12px}.app-title{font-size:24px;font-weight:600}.app-subtitle{color:rgba(226,232,240,.68);font-size:14px}.app-main{flex:1;padding:0 32px 32px}.editor-root{--editor-bg:rgba(15,23,42,.78);--editor-panel:rgba(15,23,42,.85);--editor-border:rgba(148,163,184,.12);--editor-text:#f8fafc;--editor-muted:rgba(226,232,240,.65);--editor-btn-bg:rgba(30,41,59,.65);--editor-btn-border:rgba(148,163,184,.2);--editor-btn-hover:rgba(99,102,241,.7);--editor-code-bg:rgba(2,6,23,.8);display:grid;gap:16px;grid-template-columns:1.35fr .65fr}.editor-root.theme-light{--editor-bg:hsla(0,0%,100%,.9);--editor-panel:rgba(248,250,252,.95);--editor-border:rgba(15,23,42,.12);--editor-text:#0f172a;--editor-muted:rgba(15,23,42,.6);--editor-btn-bg:hsla(0,0%,100%,.9);--editor-btn-border:rgba(15,23,42,.2);--editor-btn-hover:rgba(79,70,229,.7);--editor-code-bg:rgba(226,232,240,.8)}.editor-root.no-preview{grid-template-columns:1fr}.toolbar{backdrop-filter:blur(8px);background:var(--editor-panel);border:1px solid var(--editor-border);border-radius:2px;gap:10px;grid-column:1/-1;padding:10px}.toolbar,.toolbar-group{display:flex;flex-wrap:wrap}.toolbar-group{align-items:center;gap:8px}.toolbar-group.toggle{margin-left:auto}.toolbar-btn{background:var(--editor-btn-bg);border:1px solid var(--editor-btn-border);border-radius:2px;color:var(--editor-text);cursor:pointer;font-size:13px;padding:8px 12px;transition:all .15s ease}.toolbar-btn:hover{border-color:var(--editor-btn-hover);transform:translateY(-1px)}.toolbar-btn.active{border-color:var(--editor-btn-hover);box-shadow:0 0 0 2px rgba(99,102,241,.18)}.toolbar-btn.danger{border-color:hsla(0,91%,71%,.45);color:#fecaca}.toolbar-label{align-items:center;color:var(--editor-muted);display:flex;font-size:12px;gap:6px}.toolbar-select{background:var(--editor-panel);border:1px solid var(--editor-btn-border);border-radius:2px;color:var(--editor-text);padding:6px 10px}.color-label{gap:10px}.toolbar-color{background:transparent;border:none;cursor:pointer;height:30px;padding:0;width:34px}.toggle-row{align-items:center;color:var(--editor-muted);display:flex;font-size:12px;gap:8px}.editor-area{background:var(--editor-bg);border:1px solid var(--editor-border);border-radius:2px;min-height:520px;padding:10px}.editor-surface{color:var(--editor-text);font-size:16px;line-height:1.7;min-height:460px;outline:none}.editor-surface h1,.editor-surface h2,.editor-surface h3{margin-top:1.4em}.editor-footer{align-items:center;color:var(--editor-muted);display:flex;font-size:12px;grid-column:1/2;justify-content:space-between;padding:12px 6px 0}.editor-root.no-preview .editor-footer{grid-column:1/-1}.footer-stats{display:flex;gap:16px}.editor-preview{background:var(--editor-bg);border:1px solid var(--editor-border);border-radius:2px;display:flex;flex-direction:column;grid-column:2/3;grid-row:2/4;min-height:520px;padding:16px}.preview-header{color:var(--editor-muted);font-size:13px;margin-bottom:12px}.preview-code{background:var(--editor-code-bg);border-radius:2px;color:var(--editor-text);flex:1;font-family:JetBrains Mono,Fira Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;margin:0;overflow:auto;padding:12px}@media (max-width:1024px){.editor-root{grid-template-columns:1fr}.editor-preview{grid-row:auto}.editor-footer,.editor-preview{grid-column:1/-1}}\n/*# sourceMappingURL=data:application/json;base64,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LWhlaWdodDogMTAwdmg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wLCByZ2JhKDk5LCAxMDIsIDI0MSwgMC4xMiksIHRyYW5zcGFyZW50IDQ1JSksXHJcbiAgICAjMGIwZjE5O1xyXG59XHJcblxyXG4uYXBwLWhlYWRlciB7XHJcbiAgcGFkZGluZzogMjRweCAzMnB4IDEycHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogNnB4O1xyXG59XHJcblxyXG4uYXBwLXRpdGxlIHtcclxuICBmb250LXNpemU6IDI0cHg7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxufVxyXG5cclxuLmFwcC1zdWJ0aXRsZSB7XHJcbiAgZm9udC1zaXplOiAxNHB4O1xyXG4gIGNvbG9yOiByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuNjgpO1xyXG59XHJcblxyXG4uYXBwLW1haW4ge1xyXG4gIGZsZXg6IDE7XHJcbiAgcGFkZGluZzogMCAzMnB4IDMycHg7XHJcbn1cclxuXHJcbi5lZGl0b3Itcm9vdCB7XHJcbiAgLS1lZGl0b3ItYmc6IHJnYmEoMTUsIDIzLCA0MiwgMC43OCk7XHJcbiAgLS1lZGl0b3ItcGFuZWw6IHJnYmEoMTUsIDIzLCA0MiwgMC44NSk7XHJcbiAgLS1lZGl0b3ItYm9yZGVyOiByZ2JhKDE0OCwgMTYzLCAxODQsIDAuMTIpO1xyXG4gIC0tZWRpdG9yLXRleHQ6ICNmOGZhZmM7XHJcbiAgLS1lZGl0b3ItbXV0ZWQ6IHJnYmEoMjI2LCAyMzIsIDI0MCwgMC42NSk7XHJcbiAgLS1lZGl0b3ItYnRuLWJnOiByZ2JhKDMwLCA0MSwgNTksIDAuNjUpO1xyXG4gIC0tZWRpdG9yLWJ0bi1ib3JkZXI6IHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4yKTtcclxuICAtLWVkaXRvci1idG4taG92ZXI6IHJnYmEoOTksIDEwMiwgMjQxLCAwLjcpO1xyXG4gIC0tZWRpdG9yLWNvZGUtYmc6IHJnYmEoMiwgNiwgMjMsIDAuOCk7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEuMzVmciAwLjY1ZnI7XHJcbiAgZ2FwOiAxNnB4O1xyXG59XHJcblxyXG4uZWRpdG9yLXJvb3QudGhlbWUtbGlnaHQge1xyXG4gIC0tZWRpdG9yLWJnOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XHJcbiAgLS1lZGl0b3ItcGFuZWw6IHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45NSk7XHJcbiAgLS1lZGl0b3ItYm9yZGVyOiByZ2JhKDE1LCAyMywgNDIsIDAuMTIpO1xyXG4gIC0tZWRpdG9yLXRleHQ6ICMwZjE3MmE7XHJcbiAgLS1lZGl0b3ItbXV0ZWQ6IHJnYmEoMTUsIDIzLCA0MiwgMC42KTtcclxuICAtLWVkaXRvci1idG4tYmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcclxuICAtLWVkaXRvci1idG4tYm9yZGVyOiByZ2JhKDE1LCAyMywgNDIsIDAuMik7XHJcbiAgLS1lZGl0b3ItYnRuLWhvdmVyOiByZ2JhKDc5LCA3MCwgMjI5LCAwLjcpO1xyXG4gIC0tZWRpdG9yLWNvZGUtYmc6IHJnYmEoMjI2LCAyMzIsIDI0MCwgMC44KTtcclxufVxyXG5cclxuLmVkaXRvci1yb290Lm5vLXByZXZpZXcge1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG59XHJcblxyXG4udG9vbGJhciB7XHJcbiAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtd3JhcDogd3JhcDtcclxuICBnYXA6IDEwcHg7XHJcbiAgcGFkZGluZzogMTBweDtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1lZGl0b3ItcGFuZWwpO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWVkaXRvci1ib3JkZXIpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcclxuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcclxufVxyXG5cclxuLnRvb2xiYXItZ3JvdXAge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDhweDtcclxuICBmbGV4LXdyYXA6IHdyYXA7XHJcbn1cclxuXHJcbi50b29sYmFyLWdyb3VwLnRvZ2dsZSB7XHJcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XHJcbn1cclxuXHJcbi50b29sYmFyLWJ0biB7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZWRpdG9yLWJ0bi1ib3JkZXIpO1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLWVkaXRvci1idG4tYmcpO1xyXG4gIGNvbG9yOiB2YXIoLS1lZGl0b3ItdGV4dCk7XHJcbiAgcGFkZGluZzogOHB4IDEycHg7XHJcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XHJcbn1cclxuXHJcbi50b29sYmFyLWJ0bjpob3ZlciB7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1lZGl0b3ItYnRuLWhvdmVyKTtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XHJcbn1cclxuXHJcbi50b29sYmFyLWJ0bi5hY3RpdmUge1xyXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZWRpdG9yLWJ0bi1ob3Zlcik7XHJcbiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoOTksIDEwMiwgMjQxLCAwLjE4KTtcclxufVxyXG5cclxuLnRvb2xiYXItYnRuLmRhbmdlciB7XHJcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuNDUpO1xyXG4gIGNvbG9yOiAjZmVjYWNhO1xyXG59XHJcblxyXG4udG9vbGJhci1sYWJlbCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogNnB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBjb2xvcjogdmFyKC0tZWRpdG9yLW11dGVkKTtcclxufVxyXG5cclxuLnRvb2xiYXItc2VsZWN0IHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1lZGl0b3ItcGFuZWwpO1xyXG4gIGNvbG9yOiB2YXIoLS1lZGl0b3ItdGV4dCk7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZWRpdG9yLWJ0bi1ib3JkZXIpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcclxuICBwYWRkaW5nOiA2cHggMTBweDtcclxufVxyXG5cclxuLmNvbG9yLWxhYmVsIHtcclxuICBnYXA6IDEwcHg7XHJcbn1cclxuXHJcbi50b29sYmFyLWNvbG9yIHtcclxuICB3aWR0aDogMzRweDtcclxuICBoZWlnaHQ6IDMwcHg7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIHBhZGRpbmc6IDA7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4udG9nZ2xlLXJvdyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBnYXA6IDhweDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBjb2xvcjogdmFyKC0tZWRpdG9yLW11dGVkKTtcclxufVxyXG5cclxuLmVkaXRvci1hcmVhIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1lZGl0b3ItYmcpO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWVkaXRvci1ib3JkZXIpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcclxuICBwYWRkaW5nOiAxMHB4O1xyXG4gIG1pbi1oZWlnaHQ6IDUyMHB4O1xyXG59XHJcblxyXG4uZWRpdG9yLXN1cmZhY2Uge1xyXG4gIG1pbi1oZWlnaHQ6IDQ2MHB4O1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgY29sb3I6IHZhcigtLWVkaXRvci10ZXh0KTtcclxuICBmb250LXNpemU6IDE2cHg7XHJcbiAgbGluZS1oZWlnaHQ6IDEuNztcclxufVxyXG5cclxuLmVkaXRvci1zdXJmYWNlIGgxLFxyXG4uZWRpdG9yLXN1cmZhY2UgaDIsXHJcbi5lZGl0b3Itc3VyZmFjZSBoMyB7XHJcbiAgbWFyZ2luLXRvcDogMS40ZW07XHJcbn1cclxuXHJcbi5lZGl0b3ItZm9vdGVyIHtcclxuICBncmlkLWNvbHVtbjogMSAvIDI7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICBwYWRkaW5nOiAxMnB4IDZweCAwO1xyXG4gIGNvbG9yOiB2YXIoLS1lZGl0b3ItbXV0ZWQpO1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxufVxyXG5cclxuLmVkaXRvci1yb290Lm5vLXByZXZpZXcgLmVkaXRvci1mb290ZXIge1xyXG4gIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbn1cclxuXHJcbi5mb290ZXItc3RhdHMge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZ2FwOiAxNnB4O1xyXG59XHJcblxyXG4uZWRpdG9yLXByZXZpZXcge1xyXG4gIGdyaWQtY29sdW1uOiAyIC8gMztcclxuICBncmlkLXJvdzogMiAvIDQ7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tZWRpdG9yLWJnKTtcclxuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1lZGl0b3ItYm9yZGVyKTtcclxuICBib3JkZXItcmFkaXVzOiAycHg7XHJcbiAgcGFkZGluZzogMTZweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgbWluLWhlaWdodDogNTIwcHg7XHJcbn1cclxuXHJcbi5wcmV2aWV3LWhlYWRlciB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGNvbG9yOiB2YXIoLS1lZGl0b3ItbXV0ZWQpO1xyXG4gIG1hcmdpbi1ib3R0b206IDEycHg7XHJcbn1cclxuXHJcbi5wcmV2aWV3LWNvZGUge1xyXG4gIGZsZXg6IDE7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGZvbnQtZmFtaWx5OiBcIkpldEJyYWlucyBNb25vXCIsIFwiRmlyYSBDb2RlXCIsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLFxyXG4gICAgXCJMaWJlcmF0aW9uIE1vbm9cIiwgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2U7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGNvbG9yOiB2YXIoLS1lZGl0b3ItdGV4dCk7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tZWRpdG9yLWNvZGUtYmcpO1xyXG4gIHBhZGRpbmc6IDEycHg7XHJcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7XHJcbiAgLmVkaXRvci1yb290IHtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG4gIH1cclxuXHJcbiAgLmVkaXRvci1wcmV2aWV3IHtcclxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbiAgICBncmlkLXJvdzogYXV0bztcclxuICB9XHJcblxyXG4gIC5lZGl0b3ItZm9vdGVyIHtcclxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbiAgfVxyXG59XHJcbiJdfQ== */";
|
|
328
|
-
styleInject(css_248z);
|
|
329
|
-
|
|
330
|
-
// src/index.js
|
|
331
|
-
|
|
332
|
-
module.exports = Editor;
|
|
333
|
-
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/components/Editor.jsx","../node_modules/style-inject/dist/style-inject.es.js","../src/index.js"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nconst DEFAULT_HTML = `\r\n\t<h1>Welcome</h1>\r\n\t<p>This is a lightweight WYSIWYG editor built without external libraries.</p>\r\n\t<ul>\r\n\t\t<li>Edit text directly</li>\r\n\t\t<li>Use the toolbar for formatting</li>\r\n\t\t<li>Copy, paste, and export HTML</li>\r\n\t</ul>\r\n`;\r\n\r\nconst COMMANDS = [\r\n\t{ cmd: \"bold\", label: \"Bold\", icon: \"B\" },\r\n\t{ cmd: \"italic\", label: \"Italic\", icon: \"I\" },\r\n\t{ cmd: \"underline\", label: \"Underline\", icon: \"U\" },\r\n\t{ cmd: \"strikeThrough\", label: \"Strike\", icon: \"S\" },\r\n\t{ cmd: \"insertUnorderedList\", label: \"Bullets\", icon: \"•\" },\r\n\t{ cmd: \"insertOrderedList\", label: \"Numbered\", icon: \"1.\" },\r\n\t{ cmd: \"justifyLeft\", label: \"Left\", icon: \"⟸\" },\r\n\t{ cmd: \"justifyCenter\", label: \"Center\", icon: \"⇔\" },\r\n\t{ cmd: \"justifyRight\", label: \"Right\", icon: \"⟹\" },\r\n];\r\n\r\nexport default function Editor({\r\n\ttheme = \"dark\",\r\n\ttools = COMMANDS.map((item) => item.cmd),\r\n\tshowHeading = true,\r\n\tshowFontSize = true,\r\n\tshowLink = true,\r\n\tshowUndoRedo = true,\r\n\tshowClear = true,\r\n\tshowPlainPaste = true,\r\n\tshowColor = true,\r\n\tshowLiveHtml = true,\r\n\tshowStats = true,\r\n\tshowCopyHtml = true,\r\n\tonChange = () => {},\r\n}) {\r\n\tconst editorRef = useRef(null);\r\n\tconst [html, setHtml] = useState(\"\");\r\n\tconst [plainPaste, setPlainPaste] = useState(true);\r\n\tconst [selectionText, setSelectionText] = useState(\"\");\r\n\tconst [heading, setHeading] = useState(\"p\");\r\n\tconst [fontSize, setFontSize] = useState(\"16\");\r\n\tconst [textColor, setTextColor] = useState(\"#1f2937\");\r\n\tconst [activeToolMap, setActiveToolMap] = useState({});\r\n\r\n\tuseEffect(() => {\r\n\t\tif (editorRef.current) {\r\n\t\t\teditorRef.current.innerHTML = DEFAULT_HTML;\r\n\t\t\tsetHtml(editorRef.current.innerHTML);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst stats = useMemo(() => {\r\n\t\tconst text = editorRef.current?.innerText || \"\";\r\n\t\tconst words = text.trim() ? text.trim().split(/\\s+/).length : 0;\r\n\t\treturn {\r\n\t\t\twords,\r\n\t\t\tchars: text.length,\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst exec = (cmd, value = null) => {\r\n\t\teditorRef.current?.focus();\r\n\t\tdocument.execCommand(cmd, false, value);\r\n\t\tconst nextHtml = editorRef.current?.innerHTML || \"\";\r\n\t\tsetHtml(nextHtml);\r\n\t\tonChange({ html: nextHtml, text: editorRef.current?.innerText || \"\" });\r\n\t\tupdateToolbarState();\r\n\t};\r\n\r\n\tconst applyHeading = (next) => {\r\n\t\tsetHeading(next);\r\n\t\tif (next === \"p\") {\r\n\t\t\texec(\"formatBlock\", \"P\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\texec(\"formatBlock\", next.toUpperCase());\r\n\t};\r\n\r\n\tconst applyFontSize = (next) => {\r\n\t\tsetFontSize(next);\r\n\t\texec(\"fontSize\", \"7\");\r\n\t\tconst fontElements = editorRef.current?.querySelectorAll(\"font[size='7']\") || [];\r\n\t\tfontElements.forEach((el) => {\r\n\t\t\tel.removeAttribute(\"size\");\r\n\t\t\tel.style.fontSize = `${next}px`;\r\n\t\t});\r\n\t\tsetHtml(editorRef.current?.innerHTML || \"\");\r\n\t\tupdateToolbarState();\r\n\t};\r\n\r\n\tconst applyTextColor = (next) => {\r\n\t\tsetTextColor(next);\r\n\t\texec(\"foreColor\", next);\r\n\t};\r\n\r\n\tconst insertLink = () => {\r\n\t\tconst url = window.prompt(\"Enter URL\", \"https://\");\r\n\t\tif (!url) return;\r\n\t\texec(\"createLink\", url);\r\n\t};\r\n\r\n\tconst removeFormat = () => exec(\"removeFormat\");\r\n\r\n\tconst clearAll = () => {\r\n\t\tif (!editorRef.current) return;\r\n\t\teditorRef.current.innerHTML = \"<p></p>\";\r\n\t\tsetHtml(editorRef.current.innerHTML);\r\n\t\tonChange({ html: editorRef.current.innerHTML, text: editorRef.current.innerText || \"\" });\r\n\t\tupdateToolbarState();\r\n\t};\r\n\r\n\tconst onInput = () => {\r\n\t\tconst nextHtml = editorRef.current?.innerHTML || \"\";\r\n\t\tsetHtml(nextHtml);\r\n\t\tonChange({ html: nextHtml, text: editorRef.current?.innerText || \"\" });\r\n\t\tupdateToolbarState();\r\n\t};\r\n\r\n\tconst onPaste = (event) => {\r\n\t\tif (!plainPaste) return;\r\n\t\tevent.preventDefault();\r\n\t\tconst text = event.clipboardData.getData(\"text/plain\");\r\n\t\tdocument.execCommand(\"insertText\", false, text);\r\n\t};\r\n\r\n\tconst updateToolbarState = useCallback(() => {\r\n\t\tconst selection = document.getSelection();\r\n\t\tif (!selection || selection.rangeCount === 0 || !editorRef.current) return;\r\n\t\tconst anchorNode = selection.anchorNode;\r\n\t\tconst isInsideEditor = anchorNode && editorRef.current.contains(anchorNode);\r\n\t\tif (!isInsideEditor) {\r\n\t\t\tsetSelectionText(\"\");\r\n\t\t\tsetActiveToolMap({});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetSelectionText(selection.toString());\r\n\t\tconst nextActive = {};\r\n\t\tCOMMANDS.forEach((item) => {\r\n\t\t\ttry {\r\n\t\t\t\tnextActive[item.cmd] = document.queryCommandState(item.cmd);\r\n\t\t\t} catch {\r\n\t\t\t\tnextActive[item.cmd] = false;\r\n\t\t\t}\r\n\t\t});\r\n\t\tsetActiveToolMap(nextActive);\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tdocument.addEventListener(\"selectionchange\", updateToolbarState);\r\n\t\treturn () => document.removeEventListener(\"selectionchange\", updateToolbarState);\r\n\t}, [updateToolbarState]);\r\n\r\n\tconst exportHtml = async () => {\r\n\t\tconst payload = editorRef.current?.innerHTML || \"\";\r\n\t\tawait navigator.clipboard.writeText(payload);\r\n\t\talert(\"HTML copied to clipboard.\");\r\n\t};\r\n\r\n\tconst activeCommands = useMemo(\r\n\t\t() => COMMANDS.filter((item) => tools.includes(item.cmd)),\r\n\t\t[tools]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<section\r\n\t\t\tclassName={`editor-root theme-${theme}${showLiveHtml ? \"\" : \" no-preview\"}`}\r\n\t\t\tdata-theme={theme}\r\n\t\t>\r\n\t\t\t<div className=\"toolbar\">\r\n\t\t\t\t{activeCommands.length > 0 && (\r\n\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t{activeCommands.map((item) => (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tkey={item.cmd}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName={`toolbar-btn${activeToolMap[item.cmd] ? \" active\" : \"\"}`}\r\n\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\r\n\t\t\t\t\t\t\t\tonClick={() => exec(item.cmd)}\r\n\t\t\t\t\t\t\t\ttitle={item.label}\r\n\t\t\t\t\t\t\t\taria-pressed={activeToolMap[item.cmd] || false}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{item.icon}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showHeading || showFontSize || showColor) && (\r\n\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t{showHeading && (\r\n\t\t\t\t\t\t\t<label className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\tHeading\r\n\t\t\t\t\t\t\t\t<select\r\n\t\t\t\t\t\t\t\t\tvalue={heading}\r\n\t\t\t\t\t\t\t\t\tonChange={(event) => applyHeading(event.target.value)}\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-select\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<option value=\"p\">Paragraph</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"h1\">Heading 1</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"h2\">Heading 2</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"h3\">Heading 3</option>\r\n\t\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{showFontSize && (\r\n\t\t\t\t\t\t\t<label className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\tSize\r\n\t\t\t\t\t\t\t\t<select\r\n\t\t\t\t\t\t\t\t\tvalue={fontSize}\r\n\t\t\t\t\t\t\t\t\tonChange={(event) => applyFontSize(event.target.value)}\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-select\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<option value=\"14\">14px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"16\">16px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"18\">18px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"22\">22px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"28\">28px</option>\r\n\t\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{showColor && (\r\n\t\t\t\t\t\t\t<label className=\"toolbar-label color-label\">\r\n\t\t\t\t\t\t\t\tColor\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\ttype=\"color\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-color\"\r\n\t\t\t\t\t\t\t\t\tvalue={textColor}\r\n\t\t\t\t\t\t\t\t\tonChange={(event) => applyTextColor(event.target.value)}\r\n\t\t\t\t\t\t\t\t\taria-label=\"Text color\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showLink || showUndoRedo || showClear) && (\r\n\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t{showLink && (\r\n\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn\" onClick={insertLink}>\r\n\t\t\t\t\t\t\t\tLink\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{showUndoRedo && (\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn\" onClick={() => exec(\"undo\")}>\r\n\t\t\t\t\t\t\t\t\tUndo\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn\" onClick={() => exec(\"redo\")}>\r\n\t\t\t\t\t\t\t\t\tRedo\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{showClear && (\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn\" onClick={removeFormat}>\r\n\t\t\t\t\t\t\t\t\tClear format\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn danger\" onClick={clearAll}>\r\n\t\t\t\t\t\t\t\t\tClear all\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t\t{showPlainPaste && (\r\n\t\t\t\t\t<div className=\"toolbar-group toggle\">\r\n\t\t\t\t\t\t<label className=\"toggle-row\">\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\tchecked={plainPaste}\r\n\t\t\t\t\t\t\t\tonChange={(event) => setPlainPaste(event.target.checked)}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\tPaste as plain text\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\r\n\t\t\t<div className=\"editor-area\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tref={editorRef}\r\n\t\t\t\t\tclassName=\"editor-surface\"\r\n\t\t\t\t\tcontentEditable\r\n\t\t\t\t\tonInput={onInput}\r\n\t\t\t\t\tonPaste={onPaste}\r\n\t\t\t\t\tonKeyUp={updateToolbarState}\r\n\t\t\t\t\tonMouseUp={updateToolbarState}\r\n\t\t\t\t\tsuppressContentEditableWarning\r\n\t\t\t\t\tspellCheck\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\r\n\t\t\t{(showStats || showCopyHtml) && (\r\n\t\t\t\t<footer className=\"editor-footer\">\r\n\t\t\t\t\t{showStats && (\r\n\t\t\t\t\t\t<div className=\"footer-stats\">\r\n\t\t\t\t\t\t\t<span>{stats.words} words</span>\r\n\t\t\t\t\t\t\t<span>{stats.chars} characters</span>\r\n\t\t\t\t\t\t\t<span>{selectionText ? `${selectionText.length} selected` : \"No selection\"}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{showCopyHtml && (\r\n\t\t\t\t\t\t<div className=\"footer-actions\">\r\n\t\t\t\t\t\t\t<button type=\"button\" className=\"toolbar-btn\" onClick={exportHtml}>\r\n\t\t\t\t\t\t\t\tCopy HTML\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</footer>\r\n\t\t\t)}\r\n\r\n\t\t\t{showLiveHtml && (\r\n\t\t\t\t<aside className=\"editor-preview\">\r\n\t\t\t\t\t<div className=\"preview-header\">Live HTML</div>\r\n\t\t\t\t\t<pre className=\"preview-code\">{html}</pre>\r\n\t\t\t\t</aside>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","// src/index.js\r\nimport Editor from \"./components/Editor.jsx\";\r\nimport \"./index.css\";\r\n\r\n// Export default only to avoid mixing named and default exports\r\nexport default Editor;\r\n"],"names":["DEFAULT_HTML","COMMANDS","cmd","label","icon","Editor","theme","tools","map","item","showHeading","showFontSize","showLink","showUndoRedo","showClear","showPlainPaste","showColor","showLiveHtml","showStats","showCopyHtml","onChange","editorRef","useRef","html","setHtml","useState","plainPaste","setPlainPaste","selectionText","setSelectionText","heading","setHeading","fontSize","setFontSize","textColor","setTextColor","activeToolMap","setActiveToolMap","useEffect","current","innerHTML","stats","useMemo","text","innerText","words","trim","split","length","chars","exec","value","focus","document","execCommand","nextHtml","updateToolbarState","applyHeading","next","toUpperCase","applyFontSize","fontElements","querySelectorAll","forEach","el","removeAttribute","style","applyTextColor","insertLink","url","window","prompt","removeFormat","clearAll","onInput","onPaste","event","preventDefault","clipboardData","getData","useCallback","selection","getSelection","rangeCount","anchorNode","isInsideEditor","contains","toString","nextActive","queryCommandState","addEventListener","removeEventListener","exportHtml","payload","navigator","clipboard","writeText","alert","activeCommands","filter","includes","React","createElement","className","key","type","onMouseDown","onClick","title","target","Fragment","checked","ref","contentEditable","onKeyUp","onMouseUp","suppressContentEditableWarning","spellCheck"],"mappings":";;;;AAEA,MAAMA,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,MAAMC,QAAQ,GAAG,CAChB;AAAEC,EAAAA,GAAG,EAAE,MAAM;AAAEC,EAAAA,KAAK,EAAE,MAAM;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACzC;AAAEF,EAAAA,GAAG,EAAE,QAAQ;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAC7C;AAAEF,EAAAA,GAAG,EAAE,WAAW;AAAEC,EAAAA,KAAK,EAAE,WAAW;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACnD;AAAEF,EAAAA,GAAG,EAAE,eAAe;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACpD;AAAEF,EAAAA,GAAG,EAAE,qBAAqB;AAAEC,EAAAA,KAAK,EAAE,SAAS;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAC3D;AAAEF,EAAAA,GAAG,EAAE,mBAAmB;AAAEC,EAAAA,KAAK,EAAE,UAAU;AAAEC,EAAAA,IAAI,EAAE;AAAK,CAAC,EAC3D;AAAEF,EAAAA,GAAG,EAAE,aAAa;AAAEC,EAAAA,KAAK,EAAE,MAAM;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAChD;AAAEF,EAAAA,GAAG,EAAE,eAAe;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACpD;AAAEF,EAAAA,GAAG,EAAE,cAAc;AAAEC,EAAAA,KAAK,EAAE,OAAO;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,CAClD;AAEc,SAASC,MAAMA,CAAC;AAC9BC,EAAAA,KAAK,GAAG,MAAM;EACdC,KAAK,GAAGN,QAAQ,CAACO,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACP,GAAG,CAAC;AACxCQ,EAAAA,WAAW,GAAG,IAAI;AAClBC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,QAAQ,GAAG,IAAI;AACfC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,cAAc,GAAG,IAAI;AACrBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,YAAY,GAAG,IAAI;EACnBC,QAAQ,GAAGA,MAAM,CAAC;AACnB,CAAC,EAAE;AACF,EAAA,MAAMC,SAAS,GAAGC,YAAM,CAAC,IAAI,CAAC;EAC9B,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGC,cAAQ,CAAC,EAAE,CAAC;EACpC,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGF,cAAQ,CAAC,IAAI,CAAC;EAClD,MAAM,CAACG,aAAa,EAAEC,gBAAgB,CAAC,GAAGJ,cAAQ,CAAC,EAAE,CAAC;EACtD,MAAM,CAACK,OAAO,EAAEC,UAAU,CAAC,GAAGN,cAAQ,CAAC,GAAG,CAAC;EAC3C,MAAM,CAACO,QAAQ,EAAEC,WAAW,CAAC,GAAGR,cAAQ,CAAC,IAAI,CAAC;EAC9C,MAAM,CAACS,SAAS,EAAEC,YAAY,CAAC,GAAGV,cAAQ,CAAC,SAAS,CAAC;EACrD,MAAM,CAACW,aAAa,EAAEC,gBAAgB,CAAC,GAAGZ,cAAQ,CAAC,EAAE,CAAC;AAEtDa,EAAAA,eAAS,CAAC,MAAM;IACf,IAAIjB,SAAS,CAACkB,OAAO,EAAE;AACtBlB,MAAAA,SAAS,CAACkB,OAAO,CAACC,SAAS,GAAGxC,YAAY;AAC1CwB,MAAAA,OAAO,CAACH,SAAS,CAACkB,OAAO,CAACC,SAAS,CAAC;AACrC,IAAA;EACD,CAAC,EAAE,EAAE,CAAC;AAEN,EAAA,MAAMC,KAAK,GAAGC,aAAO,CAAC,MAAM;IAC3B,MAAMC,IAAI,GAAGtB,SAAS,CAACkB,OAAO,EAAEK,SAAS,IAAI,EAAE;IAC/C,MAAMC,KAAK,GAAGF,IAAI,CAACG,IAAI,EAAE,GAAGH,IAAI,CAACG,IAAI,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC,CAACC,MAAM,GAAG,CAAC;IAC/D,OAAO;MACNH,KAAK;MACLI,KAAK,EAAEN,IAAI,CAACK;KACZ;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,IAAI,GAAGA,CAAChD,GAAG,EAAEiD,KAAK,GAAG,IAAI,KAAK;AACnC9B,IAAAA,SAAS,CAACkB,OAAO,EAAEa,KAAK,EAAE;IAC1BC,QAAQ,CAACC,WAAW,CAACpD,GAAG,EAAE,KAAK,EAAEiD,KAAK,CAAC;IACvC,MAAMI,QAAQ,GAAGlC,SAAS,CAACkB,OAAO,EAAEC,SAAS,IAAI,EAAE;IACnDhB,OAAO,CAAC+B,QAAQ,CAAC;AACjBnC,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAEgC,QAAQ;AAAEZ,MAAAA,IAAI,EAAEtB,SAAS,CAACkB,OAAO,EAAEK,SAAS,IAAI;AAAG,KAAC,CAAC;AACtEY,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMC,YAAY,GAAIC,IAAI,IAAK;IAC9B3B,UAAU,CAAC2B,IAAI,CAAC;IAChB,IAAIA,IAAI,KAAK,GAAG,EAAE;AACjBR,MAAAA,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;AACxB,MAAA;AACD,IAAA;IACAA,IAAI,CAAC,aAAa,EAAEQ,IAAI,CAACC,WAAW,EAAE,CAAC;EACxC,CAAC;EAED,MAAMC,aAAa,GAAIF,IAAI,IAAK;IAC/BzB,WAAW,CAACyB,IAAI,CAAC;AACjBR,IAAAA,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;IACrB,MAAMW,YAAY,GAAGxC,SAAS,CAACkB,OAAO,EAAEuB,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAChFD,IAAAA,YAAY,CAACE,OAAO,CAAEC,EAAE,IAAK;AAC5BA,MAAAA,EAAE,CAACC,eAAe,CAAC,MAAM,CAAC;AAC1BD,MAAAA,EAAE,CAACE,KAAK,CAAClC,QAAQ,GAAG,CAAA,EAAG0B,IAAI,CAAA,EAAA,CAAI;AAChC,IAAA,CAAC,CAAC;IACFlC,OAAO,CAACH,SAAS,CAACkB,OAAO,EAAEC,SAAS,IAAI,EAAE,CAAC;AAC3CgB,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMW,cAAc,GAAIT,IAAI,IAAK;IAChCvB,YAAY,CAACuB,IAAI,CAAC;AAClBR,IAAAA,IAAI,CAAC,WAAW,EAAEQ,IAAI,CAAC;EACxB,CAAC;EAED,MAAMU,UAAU,GAAGA,MAAM;IACxB,MAAMC,GAAG,GAAGC,MAAM,CAACC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;IAClD,IAAI,CAACF,GAAG,EAAE;AACVnB,IAAAA,IAAI,CAAC,YAAY,EAAEmB,GAAG,CAAC;EACxB,CAAC;AAED,EAAA,MAAMG,YAAY,GAAGA,MAAMtB,IAAI,CAAC,cAAc,CAAC;EAE/C,MAAMuB,QAAQ,GAAGA,MAAM;AACtB,IAAA,IAAI,CAACpD,SAAS,CAACkB,OAAO,EAAE;AACxBlB,IAAAA,SAAS,CAACkB,OAAO,CAACC,SAAS,GAAG,SAAS;AACvChB,IAAAA,OAAO,CAACH,SAAS,CAACkB,OAAO,CAACC,SAAS,CAAC;AACpCpB,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAEF,SAAS,CAACkB,OAAO,CAACC,SAAS;AAAEG,MAAAA,IAAI,EAAEtB,SAAS,CAACkB,OAAO,CAACK,SAAS,IAAI;AAAG,KAAC,CAAC;AACxFY,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMkB,OAAO,GAAGA,MAAM;IACrB,MAAMnB,QAAQ,GAAGlC,SAAS,CAACkB,OAAO,EAAEC,SAAS,IAAI,EAAE;IACnDhB,OAAO,CAAC+B,QAAQ,CAAC;AACjBnC,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAEgC,QAAQ;AAAEZ,MAAAA,IAAI,EAAEtB,SAAS,CAACkB,OAAO,EAAEK,SAAS,IAAI;AAAG,KAAC,CAAC;AACtEY,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMmB,OAAO,GAAIC,KAAK,IAAK;IAC1B,IAAI,CAAClD,UAAU,EAAE;IACjBkD,KAAK,CAACC,cAAc,EAAE;IACtB,MAAMlC,IAAI,GAAGiC,KAAK,CAACE,aAAa,CAACC,OAAO,CAAC,YAAY,CAAC;IACtD1B,QAAQ,CAACC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAEX,IAAI,CAAC;EAChD,CAAC;AAED,EAAA,MAAMa,kBAAkB,GAAGwB,iBAAW,CAAC,MAAM;AAC5C,IAAA,MAAMC,SAAS,GAAG5B,QAAQ,CAAC6B,YAAY,EAAE;AACzC,IAAA,IAAI,CAACD,SAAS,IAAIA,SAAS,CAACE,UAAU,KAAK,CAAC,IAAI,CAAC9D,SAAS,CAACkB,OAAO,EAAE;AACpE,IAAA,MAAM6C,UAAU,GAAGH,SAAS,CAACG,UAAU;IACvC,MAAMC,cAAc,GAAGD,UAAU,IAAI/D,SAAS,CAACkB,OAAO,CAAC+C,QAAQ,CAACF,UAAU,CAAC;IAC3E,IAAI,CAACC,cAAc,EAAE;MACpBxD,gBAAgB,CAAC,EAAE,CAAC;MACpBQ,gBAAgB,CAAC,EAAE,CAAC;AACpB,MAAA;AACD,IAAA;AACAR,IAAAA,gBAAgB,CAACoD,SAAS,CAACM,QAAQ,EAAE,CAAC;IACtC,MAAMC,UAAU,GAAG,EAAE;AACrBvF,IAAAA,QAAQ,CAAC8D,OAAO,CAAEtD,IAAI,IAAK;MAC1B,IAAI;AACH+E,QAAAA,UAAU,CAAC/E,IAAI,CAACP,GAAG,CAAC,GAAGmD,QAAQ,CAACoC,iBAAiB,CAAChF,IAAI,CAACP,GAAG,CAAC;AAC5D,MAAA,CAAC,CAAC,MAAM;AACPsF,QAAAA,UAAU,CAAC/E,IAAI,CAACP,GAAG,CAAC,GAAG,KAAK;AAC7B,MAAA;AACD,IAAA,CAAC,CAAC;IACFmC,gBAAgB,CAACmD,UAAU,CAAC;EAC7B,CAAC,EAAE,EAAE,CAAC;AAENlD,EAAAA,eAAS,CAAC,MAAM;AACfe,IAAAA,QAAQ,CAACqC,gBAAgB,CAAC,iBAAiB,EAAElC,kBAAkB,CAAC;IAChE,OAAO,MAAMH,QAAQ,CAACsC,mBAAmB,CAAC,iBAAiB,EAAEnC,kBAAkB,CAAC;AACjF,EAAA,CAAC,EAAE,CAACA,kBAAkB,CAAC,CAAC;AAExB,EAAA,MAAMoC,UAAU,GAAG,YAAY;IAC9B,MAAMC,OAAO,GAAGxE,SAAS,CAACkB,OAAO,EAAEC,SAAS,IAAI,EAAE;AAClD,IAAA,MAAMsD,SAAS,CAACC,SAAS,CAACC,SAAS,CAACH,OAAO,CAAC;IAC5CI,KAAK,CAAC,2BAA2B,CAAC;EACnC,CAAC;EAED,MAAMC,cAAc,GAAGxD,aAAO,CAC7B,MAAMzC,QAAQ,CAACkG,MAAM,CAAE1F,IAAI,IAAKF,KAAK,CAAC6F,QAAQ,CAAC3F,IAAI,CAACP,GAAG,CAAC,CAAC,EACzD,CAACK,KAAK,CACP,CAAC;EAED,oBACC8F,KAAA,CAAAC,aAAA,CAAA,SAAA,EAAA;IACCC,SAAS,EAAE,qBAAqBjG,KAAK,CAAA,EAAGW,YAAY,GAAG,EAAE,GAAG,aAAa,CAAA,CAAG;IAC5E,YAAA,EAAYX;GAAM,eAElB+F,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAS,EACtBL,cAAc,CAAClD,MAAM,GAAG,CAAC,iBACzBqD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAe,EAC5BL,cAAc,CAAC1F,GAAG,CAAEC,IAAI,iBACxB4F,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;IACCE,GAAG,EAAE/F,IAAI,CAACP,GAAI;AACduG,IAAAA,IAAI,EAAC,QAAQ;AACbF,IAAAA,SAAS,EAAE,CAAA,WAAA,EAAcnE,aAAa,CAAC3B,IAAI,CAACP,GAAG,CAAC,GAAG,SAAS,GAAG,EAAE,CAAA,CAAG;AACpEwG,IAAAA,WAAW,EAAG9B,KAAK,IAAKA,KAAK,CAACC,cAAc,EAAG;IAC/C8B,OAAO,EAAEA,MAAMzD,IAAI,CAACzC,IAAI,CAACP,GAAG,CAAE;IAC9B0G,KAAK,EAAEnG,IAAI,CAACN,KAAM;AAClB,IAAA,cAAA,EAAciC,aAAa,CAAC3B,IAAI,CAACP,GAAG,CAAC,IAAI;AAAM,GAAA,EAE9CO,IAAI,CAACL,IACC,CACR,CACG,CACL,EACA,CAACM,WAAW,IAAIC,YAAY,IAAIK,SAAS,kBACzCqF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC5B7F,WAAW,iBACX2F,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAC,SAEhC,eAAAF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACCnD,IAAAA,KAAK,EAAErB,OAAQ;IACfV,QAAQ,EAAGwD,KAAK,IAAKnB,YAAY,CAACmB,KAAK,CAACiC,MAAM,CAAC1D,KAAK,CAAE;AACtDoD,IAAAA,SAAS,EAAC;GAAgB,eAE1BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAG,GAAA,EAAC,WAAiB,CAAC,eACpCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,WAAiB,CAAC,eACrCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,WAAiB,CAAC,eACrCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;GAAI,EAAC,WAAiB,CAC7B,CACF,CACP,EACAxC,YAAY,iBACZ0F,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAC,MAEhC,eAAAF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACCnD,IAAAA,KAAK,EAAEnB,QAAS;IAChBZ,QAAQ,EAAGwD,KAAK,IAAKhB,aAAa,CAACgB,KAAK,CAACiC,MAAM,CAAC1D,KAAK,CAAE;AACvDoD,IAAAA,SAAS,EAAC;GAAgB,eAE1BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCkD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQnD,IAAAA,KAAK,EAAC;GAAI,EAAC,MAAY,CACxB,CACF,CACP,EACAnC,SAAS,iBACTqF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAA2B,GAAA,EAAC,OAE5C,eAAAF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AACCG,IAAAA,IAAI,EAAC,OAAO;AACZF,IAAAA,SAAS,EAAC,eAAe;AACzBpD,IAAAA,KAAK,EAAEjB,SAAU;IACjBd,QAAQ,EAAGwD,KAAK,IAAKT,cAAc,CAACS,KAAK,CAACiC,MAAM,CAAC1D,KAAK,CAAE;IACxD,YAAA,EAAW;AAAY,GACvB,CACK,CAEJ,CACL,EACA,CAACvC,QAAQ,IAAIC,YAAY,IAAIC,SAAS,kBACtCuF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC5B3F,QAAQ,iBACRyF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEvC;AAAW,GAAA,EAAC,MAE3D,CACR,EACAvD,YAAY,iBACZwF,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAAS,QAAA,EAAA,IAAA,eACCT,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEA,MAAMzD,IAAI,CAAC,MAAM;AAAE,GAAA,EAAC,MAEnE,CAAC,eACTmD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEA,MAAMzD,IAAI,CAAC,MAAM;AAAE,GAAA,EAAC,MAEnE,CACP,CACF,EACApC,SAAS,iBACTuF,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAAS,QAAA,EAAA,IAAA,eACCT,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEnC;AAAa,GAAA,EAAC,cAE7D,CAAC,eACT6B,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,oBAAoB;AAACI,IAAAA,OAAO,EAAElC;GAAS,EAAC,WAEhE,CACP,CAEC,CACL,EACA1D,cAAc,iBACdsF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAsB,eACpCF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;GAAY,eAC5BF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AACCG,IAAAA,IAAI,EAAC,UAAU;AACfM,IAAAA,OAAO,EAAErF,UAAW;IACpBN,QAAQ,EAAGwD,KAAK,IAAKjD,aAAa,CAACiD,KAAK,CAACiC,MAAM,CAACE,OAAO;GACvD,CAAC,uBAEI,CACH,CAEF,CAAC,eAENV,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAa,eAC3BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AACCU,IAAAA,GAAG,EAAE3F,SAAU;AACfkF,IAAAA,SAAS,EAAC,gBAAgB;IAC1BU,eAAe,EAAA,IAAA;AACfvC,IAAAA,OAAO,EAAEA,OAAQ;AACjBC,IAAAA,OAAO,EAAEA,OAAQ;AACjBuC,IAAAA,OAAO,EAAE1D,kBAAmB;AAC5B2D,IAAAA,SAAS,EAAE3D,kBAAmB;IAC9B4D,8BAA8B,EAAA,IAAA;IAC9BC,UAAU,EAAA;GACV,CACG,CAAC,EAEL,CAACnG,SAAS,IAAIC,YAAY,kBAC1BkF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC/BrF,SAAS,iBACTmF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAc,GAAA,eAC5BF,KAAA,CAAAC,aAAA,eAAO7D,KAAK,CAACI,KAAK,EAAC,QAAY,CAAC,eAChCwD,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAO7D,KAAK,CAACQ,KAAK,EAAC,aAAiB,CAAC,eACrCoD,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAO1E,aAAa,GAAG,CAAA,EAAGA,aAAa,CAACoB,MAAM,WAAW,GAAG,cAAqB,CAC7E,CACL,EACA7B,YAAY,iBACZkF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAgB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEf;GAAW,EAAC,WAE3D,CACJ,CAEC,CACR,EAEA3E,YAAY,iBACZoF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;GAAgB,eAChCF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAgB,GAAA,EAAC,WAAc,CAAC,eAC/CF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAc,EAAEhF,IAAU,CACnC,CAEA,CAAC;AAEZ;;ACjUA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAY,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;ACzBA;;;;","x_google_ignoreList":[1]}
|