trotl-texteditor 1.0.7 → 1.0.9
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/dist/index.cjs +281 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +279 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/index.css +0 -2
- package/dist/index.css.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,92 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var React = require('react');
|
|
4
6
|
|
|
7
|
+
const DEFAULT_LANGUAGES = [{
|
|
8
|
+
value: "plain",
|
|
9
|
+
label: "Plain"
|
|
10
|
+
}, {
|
|
11
|
+
value: "js",
|
|
12
|
+
label: "JavaScript"
|
|
13
|
+
}, {
|
|
14
|
+
value: "ts",
|
|
15
|
+
label: "TypeScript"
|
|
16
|
+
}, {
|
|
17
|
+
value: "java",
|
|
18
|
+
label: "Java"
|
|
19
|
+
}, {
|
|
20
|
+
value: "css",
|
|
21
|
+
label: "CSS"
|
|
22
|
+
}, {
|
|
23
|
+
value: "html",
|
|
24
|
+
label: "HTML"
|
|
25
|
+
}, {
|
|
26
|
+
value: "json",
|
|
27
|
+
label: "JSON"
|
|
28
|
+
}];
|
|
29
|
+
const DEFAULT_THEMES = [{
|
|
30
|
+
value: "dark",
|
|
31
|
+
label: "Dark"
|
|
32
|
+
}, {
|
|
33
|
+
value: "light",
|
|
34
|
+
label: "Light"
|
|
35
|
+
}];
|
|
36
|
+
function CodeBlock({
|
|
37
|
+
value = "",
|
|
38
|
+
language = "plain",
|
|
39
|
+
theme = "dark",
|
|
40
|
+
languages = DEFAULT_LANGUAGES,
|
|
41
|
+
themes = DEFAULT_THEMES,
|
|
42
|
+
onChange = () => {},
|
|
43
|
+
onLanguageChange = () => {},
|
|
44
|
+
onThemeChange = () => {},
|
|
45
|
+
placeholder = "Paste code here"
|
|
46
|
+
}) {
|
|
47
|
+
const normalizedLanguages = React.useMemo(() => {
|
|
48
|
+
if (!Array.isArray(languages) || languages.length === 0) return DEFAULT_LANGUAGES;
|
|
49
|
+
if (typeof languages[0] === "string") {
|
|
50
|
+
return languages.map(item => ({
|
|
51
|
+
value: item,
|
|
52
|
+
label: item
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
return languages;
|
|
56
|
+
}, [languages]);
|
|
57
|
+
const currentLanguage = React.useMemo(() => normalizedLanguages.find(item => item.value === language) || normalizedLanguages[0], [language, normalizedLanguages]);
|
|
58
|
+
return /*#__PURE__*/React.createElement("section", {
|
|
59
|
+
className: `code-block code-block-${theme}`,
|
|
60
|
+
"data-language": currentLanguage?.value
|
|
61
|
+
}, /*#__PURE__*/React.createElement("header", {
|
|
62
|
+
className: "code-block-toolbar"
|
|
63
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
64
|
+
className: "code-block-label"
|
|
65
|
+
}, "Language", /*#__PURE__*/React.createElement("select", {
|
|
66
|
+
className: "code-block-select",
|
|
67
|
+
value: currentLanguage?.value,
|
|
68
|
+
onChange: event => onLanguageChange(event.target.value)
|
|
69
|
+
}, normalizedLanguages.map(item => /*#__PURE__*/React.createElement("option", {
|
|
70
|
+
key: item.value,
|
|
71
|
+
value: item.value
|
|
72
|
+
}, item.label)))), /*#__PURE__*/React.createElement("label", {
|
|
73
|
+
className: "code-block-label"
|
|
74
|
+
}, "Theme", /*#__PURE__*/React.createElement("select", {
|
|
75
|
+
className: "code-block-select",
|
|
76
|
+
value: theme,
|
|
77
|
+
onChange: event => onThemeChange(event.target.value)
|
|
78
|
+
}, themes.map(item => /*#__PURE__*/React.createElement("option", {
|
|
79
|
+
key: item.value,
|
|
80
|
+
value: item.value
|
|
81
|
+
}, item.label))))), /*#__PURE__*/React.createElement("textarea", {
|
|
82
|
+
className: "code-block-area",
|
|
83
|
+
value: value,
|
|
84
|
+
onChange: event => onChange(event.target.value),
|
|
85
|
+
placeholder: placeholder,
|
|
86
|
+
spellCheck: false
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
|
|
5
90
|
const COMMANDS = [{
|
|
6
91
|
cmd: "bold",
|
|
7
92
|
label: "Bold",
|
|
@@ -44,11 +129,14 @@ function Editor({
|
|
|
44
129
|
tools = COMMANDS.map(item => item.cmd),
|
|
45
130
|
showHeading = true,
|
|
46
131
|
showFontSize = true,
|
|
132
|
+
showAlign = true,
|
|
47
133
|
showLink = true,
|
|
48
134
|
showUndoRedo = true,
|
|
49
135
|
showClear = true,
|
|
50
136
|
showPlainPaste = true,
|
|
51
137
|
showColor = true,
|
|
138
|
+
codeBlock = false,
|
|
139
|
+
codeBlockLanguages,
|
|
52
140
|
showLiveHtml = true,
|
|
53
141
|
showStats = true,
|
|
54
142
|
showCopyHtml = true,
|
|
@@ -60,8 +148,17 @@ function Editor({
|
|
|
60
148
|
const [selectionText, setSelectionText] = React.useState("");
|
|
61
149
|
const [heading, setHeading] = React.useState("p");
|
|
62
150
|
const [fontSize, setFontSize] = React.useState("16");
|
|
151
|
+
const [customSize, setCustomSize] = React.useState("");
|
|
63
152
|
const [textColor, setTextColor] = React.useState("#1f2937");
|
|
153
|
+
const [backgroundColor, setBackgroundColor] = React.useState("#ffff00");
|
|
64
154
|
const [activeToolMap, setActiveToolMap] = React.useState({});
|
|
155
|
+
const [isCodeModalOpen, setIsCodeModalOpen] = React.useState(false);
|
|
156
|
+
const [codeValue, setCodeValue] = React.useState("");
|
|
157
|
+
const [codeLanguage, setCodeLanguage] = React.useState("js");
|
|
158
|
+
const [codeTheme, setCodeTheme] = React.useState(theme);
|
|
159
|
+
React.useEffect(() => {
|
|
160
|
+
setCodeTheme(theme);
|
|
161
|
+
}, [theme]);
|
|
65
162
|
|
|
66
163
|
// useEffect(() => {
|
|
67
164
|
// if (editorRef.current) {
|
|
@@ -77,7 +174,7 @@ function Editor({
|
|
|
77
174
|
words,
|
|
78
175
|
chars: text.length
|
|
79
176
|
};
|
|
80
|
-
}, []);
|
|
177
|
+
}, [html]);
|
|
81
178
|
const exec = (cmd, value = null) => {
|
|
82
179
|
editorRef.current?.focus();
|
|
83
180
|
document.execCommand(cmd, false, value);
|
|
@@ -95,9 +192,17 @@ function Editor({
|
|
|
95
192
|
exec("formatBlock", "P");
|
|
96
193
|
return;
|
|
97
194
|
}
|
|
195
|
+
if (next === "pre") {
|
|
196
|
+
exec("formatBlock", "PRE");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
98
199
|
exec("formatBlock", next.toUpperCase());
|
|
99
200
|
};
|
|
100
201
|
const applyFontSize = next => {
|
|
202
|
+
if (next === "custom") {
|
|
203
|
+
setFontSize("custom");
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
101
206
|
setFontSize(next);
|
|
102
207
|
exec("fontSize", "7");
|
|
103
208
|
const fontElements = editorRef.current?.querySelectorAll("font[size='7']") || [];
|
|
@@ -108,10 +213,42 @@ function Editor({
|
|
|
108
213
|
setHtml(editorRef.current?.innerHTML || "");
|
|
109
214
|
updateToolbarState();
|
|
110
215
|
};
|
|
216
|
+
const applyCustomFontSize = value => {
|
|
217
|
+
setCustomSize(value);
|
|
218
|
+
if (!value || isNaN(value)) return;
|
|
219
|
+
exec("fontSize", "7");
|
|
220
|
+
const fontElements = editorRef.current?.querySelectorAll("font[size='7']") || [];
|
|
221
|
+
fontElements.forEach(el => {
|
|
222
|
+
el.removeAttribute("size");
|
|
223
|
+
el.style.fontSize = `${value}px`;
|
|
224
|
+
});
|
|
225
|
+
setHtml(editorRef.current?.innerHTML || "");
|
|
226
|
+
updateToolbarState();
|
|
227
|
+
};
|
|
111
228
|
const applyTextColor = next => {
|
|
112
229
|
setTextColor(next);
|
|
113
230
|
exec("foreColor", next);
|
|
114
231
|
};
|
|
232
|
+
const applyBackgroundColor = next => {
|
|
233
|
+
setBackgroundColor(next);
|
|
234
|
+
exec("hiliteColor", next);
|
|
235
|
+
};
|
|
236
|
+
const resetColors = () => {
|
|
237
|
+
const defaultText = theme === "dark" ? "#e5e7eb" : "#1f2937";
|
|
238
|
+
const defaultBg = "#ffff00";
|
|
239
|
+
setTextColor(defaultText);
|
|
240
|
+
setBackgroundColor(defaultBg);
|
|
241
|
+
exec("removeFormat");
|
|
242
|
+
};
|
|
243
|
+
const escapeHtml = value => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\"/g, """).replace(/'/g, "'");
|
|
244
|
+
const insertCodeBlock = () => {
|
|
245
|
+
const safeCode = escapeHtml(codeValue || "");
|
|
246
|
+
const languageClass = codeLanguage ? `language-${codeLanguage}` : "language-plain";
|
|
247
|
+
const htmlBlock = `<pre class="code-block-shell" data-theme="${codeTheme}"><code class="${languageClass}">${safeCode}</code></pre>`;
|
|
248
|
+
exec("insertHTML", htmlBlock);
|
|
249
|
+
setIsCodeModalOpen(false);
|
|
250
|
+
setCodeValue("");
|
|
251
|
+
};
|
|
115
252
|
const insertLink = () => {
|
|
116
253
|
const url = window.prompt("Enter URL", "https://");
|
|
117
254
|
if (!url) return;
|
|
@@ -175,11 +312,25 @@ function Editor({
|
|
|
175
312
|
};
|
|
176
313
|
const activeCommands = React.useMemo(() => COMMANDS.filter(item => tools.includes(item.cmd)), [tools]);
|
|
177
314
|
return /*#__PURE__*/React.createElement("section", {
|
|
178
|
-
className: `editor-root theme-${theme}${showLiveHtml ? "" : " no-preview"}`,
|
|
315
|
+
className: `editor-root theme-${theme}${showLiveHtml ? " show-preview" : " no-preview"}`,
|
|
179
316
|
"data-theme": theme
|
|
180
317
|
}, /*#__PURE__*/React.createElement("div", {
|
|
181
318
|
className: "toolbar"
|
|
182
|
-
},
|
|
319
|
+
}, showUndoRedo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
320
|
+
className: "toolbar-group"
|
|
321
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
322
|
+
type: "button",
|
|
323
|
+
className: "toolbar-btn",
|
|
324
|
+
onClick: () => exec("undo"),
|
|
325
|
+
title: "Undo"
|
|
326
|
+
}, "\u21B6"), /*#__PURE__*/React.createElement("button", {
|
|
327
|
+
type: "button",
|
|
328
|
+
className: "toolbar-btn",
|
|
329
|
+
onClick: () => exec("redo"),
|
|
330
|
+
title: "Redo"
|
|
331
|
+
}, "\u21B7")), /*#__PURE__*/React.createElement("span", {
|
|
332
|
+
className: "toolbar-separator"
|
|
333
|
+
}, "|")), activeCommands.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
183
334
|
className: "toolbar-group"
|
|
184
335
|
}, activeCommands.map(item => /*#__PURE__*/React.createElement("button", {
|
|
185
336
|
key: item.cmd,
|
|
@@ -189,11 +340,13 @@ function Editor({
|
|
|
189
340
|
onClick: () => exec(item.cmd),
|
|
190
341
|
title: item.label,
|
|
191
342
|
"aria-pressed": activeToolMap[item.cmd] || false
|
|
192
|
-
}, item.icon))),
|
|
343
|
+
}, item.icon))), /*#__PURE__*/React.createElement("span", {
|
|
344
|
+
className: "toolbar-separator"
|
|
345
|
+
}, "|")), (showHeading || showFontSize || showColor) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
193
346
|
className: "toolbar-group"
|
|
194
347
|
}, showHeading && /*#__PURE__*/React.createElement("label", {
|
|
195
348
|
className: "toolbar-label"
|
|
196
|
-
}, "
|
|
349
|
+
}, "Format", /*#__PURE__*/React.createElement("select", {
|
|
197
350
|
value: heading,
|
|
198
351
|
onChange: event => applyHeading(event.target.value),
|
|
199
352
|
className: "toolbar-select"
|
|
@@ -205,45 +358,119 @@ function Editor({
|
|
|
205
358
|
value: "h2"
|
|
206
359
|
}, "Heading 2"), /*#__PURE__*/React.createElement("option", {
|
|
207
360
|
value: "h3"
|
|
208
|
-
}, "Heading 3")
|
|
361
|
+
}, "Heading 3"), /*#__PURE__*/React.createElement("option", {
|
|
362
|
+
value: "h4"
|
|
363
|
+
}, "Heading 4"), /*#__PURE__*/React.createElement("option", {
|
|
364
|
+
value: "blockquote"
|
|
365
|
+
}, "Blockquote"), codeBlock && /*#__PURE__*/React.createElement("option", {
|
|
366
|
+
value: "pre"
|
|
367
|
+
}, "Code Block"))), showFontSize && /*#__PURE__*/React.createElement("label", {
|
|
209
368
|
className: "toolbar-label"
|
|
210
369
|
}, "Size", /*#__PURE__*/React.createElement("select", {
|
|
211
370
|
value: fontSize,
|
|
212
371
|
onChange: event => applyFontSize(event.target.value),
|
|
213
372
|
className: "toolbar-select"
|
|
214
373
|
}, /*#__PURE__*/React.createElement("option", {
|
|
374
|
+
value: "10"
|
|
375
|
+
}, "10px"), /*#__PURE__*/React.createElement("option", {
|
|
376
|
+
value: "12"
|
|
377
|
+
}, "12px"), /*#__PURE__*/React.createElement("option", {
|
|
215
378
|
value: "14"
|
|
216
379
|
}, "14px"), /*#__PURE__*/React.createElement("option", {
|
|
217
380
|
value: "16"
|
|
218
381
|
}, "16px"), /*#__PURE__*/React.createElement("option", {
|
|
219
382
|
value: "18"
|
|
220
383
|
}, "18px"), /*#__PURE__*/React.createElement("option", {
|
|
384
|
+
value: "20"
|
|
385
|
+
}, "20px"), /*#__PURE__*/React.createElement("option", {
|
|
221
386
|
value: "22"
|
|
222
387
|
}, "22px"), /*#__PURE__*/React.createElement("option", {
|
|
388
|
+
value: "24"
|
|
389
|
+
}, "24px"), /*#__PURE__*/React.createElement("option", {
|
|
223
390
|
value: "28"
|
|
224
|
-
}, "28px")
|
|
391
|
+
}, "28px"), /*#__PURE__*/React.createElement("option", {
|
|
392
|
+
value: "32"
|
|
393
|
+
}, "32px"), /*#__PURE__*/React.createElement("option", {
|
|
394
|
+
value: "36"
|
|
395
|
+
}, "36px"), /*#__PURE__*/React.createElement("option", {
|
|
396
|
+
value: "48"
|
|
397
|
+
}, "48px"), /*#__PURE__*/React.createElement("option", {
|
|
398
|
+
value: "custom"
|
|
399
|
+
}, "Custom"))), showFontSize && fontSize === "custom" && /*#__PURE__*/React.createElement("label", {
|
|
400
|
+
className: "toolbar-label"
|
|
401
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
402
|
+
type: "number",
|
|
403
|
+
min: "8",
|
|
404
|
+
max: "200",
|
|
405
|
+
value: customSize,
|
|
406
|
+
onChange: event => applyCustomFontSize(event.target.value),
|
|
407
|
+
placeholder: "Size",
|
|
408
|
+
className: "toolbar-input",
|
|
409
|
+
style: {
|
|
410
|
+
width: "60px"
|
|
411
|
+
}
|
|
412
|
+
}), "px"), showColor && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("label", {
|
|
225
413
|
className: "toolbar-label color-label"
|
|
226
|
-
}, "
|
|
414
|
+
}, "Font", /*#__PURE__*/React.createElement("input", {
|
|
227
415
|
type: "color",
|
|
228
416
|
className: "toolbar-color",
|
|
229
417
|
value: textColor,
|
|
230
418
|
onChange: event => applyTextColor(event.target.value),
|
|
231
419
|
"aria-label": "Text color"
|
|
232
|
-
}))
|
|
233
|
-
className: "toolbar-
|
|
234
|
-
},
|
|
420
|
+
})), /*#__PURE__*/React.createElement("label", {
|
|
421
|
+
className: "toolbar-label color-label"
|
|
422
|
+
}, "Background", /*#__PURE__*/React.createElement("input", {
|
|
423
|
+
type: "color",
|
|
424
|
+
className: "toolbar-color",
|
|
425
|
+
value: backgroundColor,
|
|
426
|
+
onChange: event => applyBackgroundColor(event.target.value),
|
|
427
|
+
"aria-label": "Background color"
|
|
428
|
+
})), /*#__PURE__*/React.createElement("button", {
|
|
235
429
|
type: "button",
|
|
236
|
-
className: "toolbar-btn",
|
|
237
|
-
onClick:
|
|
238
|
-
|
|
430
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
431
|
+
onClick: resetColors,
|
|
432
|
+
title: "Reset colors"
|
|
433
|
+
}, "\u21BA")), codeBlock && /*#__PURE__*/React.createElement("button", {
|
|
239
434
|
type: "button",
|
|
240
435
|
className: "toolbar-btn",
|
|
241
|
-
onClick: () =>
|
|
242
|
-
|
|
436
|
+
onClick: () => {
|
|
437
|
+
setCodeTheme(theme);
|
|
438
|
+
setIsCodeModalOpen(true);
|
|
439
|
+
},
|
|
440
|
+
title: "Insert code block"
|
|
441
|
+
}, "Code Block"), showAlign && /*#__PURE__*/React.createElement("div", {
|
|
442
|
+
className: "toolbar-label"
|
|
443
|
+
}, "Align", /*#__PURE__*/React.createElement("div", {
|
|
444
|
+
className: "align-buttons"
|
|
445
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
446
|
+
type: "button",
|
|
447
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
448
|
+
onClick: () => exec("justifyLeft"),
|
|
449
|
+
title: "Align Left"
|
|
450
|
+
}, "\u27F8"), /*#__PURE__*/React.createElement("button", {
|
|
451
|
+
type: "button",
|
|
452
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
453
|
+
onClick: () => exec("justifyCenter"),
|
|
454
|
+
title: "Align Center"
|
|
455
|
+
}, "\u21D4"), /*#__PURE__*/React.createElement("button", {
|
|
456
|
+
type: "button",
|
|
457
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
458
|
+
onClick: () => exec("justifyRight"),
|
|
459
|
+
title: "Align Right"
|
|
460
|
+
}, "\u27F9"), /*#__PURE__*/React.createElement("button", {
|
|
461
|
+
type: "button",
|
|
462
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
463
|
+
onClick: () => exec("justifyFull"),
|
|
464
|
+
title: "Justify"
|
|
465
|
+
}, "\u21FF")))), /*#__PURE__*/React.createElement("span", {
|
|
466
|
+
className: "toolbar-separator"
|
|
467
|
+
}, "|")), (showLink || showClear) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
468
|
+
className: "toolbar-group"
|
|
469
|
+
}, showLink && /*#__PURE__*/React.createElement("button", {
|
|
243
470
|
type: "button",
|
|
244
471
|
className: "toolbar-btn",
|
|
245
|
-
onClick:
|
|
246
|
-
}, "
|
|
472
|
+
onClick: insertLink
|
|
473
|
+
}, "\uD83D\uDD17"), showClear && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
247
474
|
type: "button",
|
|
248
475
|
className: "toolbar-btn",
|
|
249
476
|
onClick: removeFormat
|
|
@@ -251,7 +478,9 @@ function Editor({
|
|
|
251
478
|
type: "button",
|
|
252
479
|
className: "toolbar-btn danger",
|
|
253
480
|
onClick: clearAll
|
|
254
|
-
}, "Clear all"))),
|
|
481
|
+
}, "Clear all"))), /*#__PURE__*/React.createElement("span", {
|
|
482
|
+
className: "toolbar-separator"
|
|
483
|
+
}, "|")), showPlainPaste && /*#__PURE__*/React.createElement("div", {
|
|
255
484
|
className: "toolbar-group toggle"
|
|
256
485
|
}, /*#__PURE__*/React.createElement("label", {
|
|
257
486
|
className: "toggle-row"
|
|
@@ -283,14 +512,42 @@ function Editor({
|
|
|
283
512
|
onClick: exportHtml
|
|
284
513
|
}, "Copy HTML"))), showLiveHtml && /*#__PURE__*/React.createElement("aside", {
|
|
285
514
|
className: "editor-preview"
|
|
286
|
-
}, /*#__PURE__*/React.createElement("
|
|
287
|
-
className: "preview-header"
|
|
288
|
-
}, "Live HTML"), /*#__PURE__*/React.createElement("pre", {
|
|
515
|
+
}, /*#__PURE__*/React.createElement("pre", {
|
|
289
516
|
className: "preview-code"
|
|
290
|
-
}, html)
|
|
517
|
+
}, html), /*#__PURE__*/React.createElement("div", {
|
|
518
|
+
className: "preview-header"
|
|
519
|
+
}, "Live HTML")), codeBlock && isCodeModalOpen && /*#__PURE__*/React.createElement("div", {
|
|
520
|
+
className: "modal-backdrop",
|
|
521
|
+
role: "dialog",
|
|
522
|
+
"aria-modal": "true"
|
|
523
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
524
|
+
className: "modal"
|
|
525
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
526
|
+
className: "modal-header"
|
|
527
|
+
}, "Insert Code Block"), /*#__PURE__*/React.createElement(CodeBlock, {
|
|
528
|
+
value: codeValue,
|
|
529
|
+
language: codeLanguage,
|
|
530
|
+
theme: codeTheme,
|
|
531
|
+
languages: codeBlockLanguages,
|
|
532
|
+
onChange: setCodeValue,
|
|
533
|
+
onLanguageChange: setCodeLanguage,
|
|
534
|
+
onThemeChange: setCodeTheme,
|
|
535
|
+
placeholder: "Paste your code here"
|
|
536
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
537
|
+
className: "modal-actions"
|
|
538
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
539
|
+
type: "button",
|
|
540
|
+
className: "toolbar-btn",
|
|
541
|
+
onClick: () => setIsCodeModalOpen(false)
|
|
542
|
+
}, "Cancel"), /*#__PURE__*/React.createElement("button", {
|
|
543
|
+
type: "button",
|
|
544
|
+
className: "toolbar-btn",
|
|
545
|
+
onClick: insertCodeBlock
|
|
546
|
+
}, "Insert")))));
|
|
291
547
|
}
|
|
292
548
|
|
|
293
549
|
// src/index.js - Library entry point
|
|
294
550
|
|
|
295
|
-
|
|
551
|
+
exports.CodeBlock = CodeBlock;
|
|
552
|
+
exports.default = Editor;
|
|
296
553
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/components/Editor.jsx","../src/index.js"],"sourcesContent":["import React, { 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\t// useEffect(() => {\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","// src/index.js - Library entry point\r\nimport Editor from \"./components/Editor.jsx\";\r\nimport \"./index.css\";\r\n// Export default only to avoid mixing named and default exports\r\nexport default Editor;\r\n"],"names":["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","stats","useMemo","text","current","innerText","words","trim","split","length","chars","exec","value","focus","document","execCommand","nextHtml","innerHTML","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","useEffect","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":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/components/CodeBlock.jsx","../src/components/Editor.jsx","../src/index.js"],"sourcesContent":["import React, { useMemo } from \"react\";\r\n\r\nconst DEFAULT_LANGUAGES = [\r\n { value: \"plain\", label: \"Plain\" },\r\n { value: \"js\", label: \"JavaScript\" },\r\n { value: \"ts\", label: \"TypeScript\" },\r\n { value: \"java\", label: \"Java\" },\r\n { value: \"css\", label: \"CSS\" },\r\n { value: \"html\", label: \"HTML\" },\r\n { value: \"json\", label: \"JSON\" },\r\n];\r\n\r\nconst DEFAULT_THEMES = [\r\n { value: \"dark\", label: \"Dark\" },\r\n { value: \"light\", label: \"Light\" },\r\n];\r\n\r\nexport default function CodeBlock({\r\n value = \"\",\r\n language = \"plain\",\r\n theme = \"dark\",\r\n languages = DEFAULT_LANGUAGES,\r\n themes = DEFAULT_THEMES,\r\n onChange = () => {},\r\n onLanguageChange = () => {},\r\n onThemeChange = () => {},\r\n placeholder = \"Paste code here\",\r\n}) {\r\n const normalizedLanguages = useMemo(() => {\r\n if (!Array.isArray(languages) || languages.length === 0) return DEFAULT_LANGUAGES;\r\n if (typeof languages[0] === \"string\") {\r\n return languages.map((item) => ({ value: item, label: item }));\r\n }\r\n return languages;\r\n }, [languages]);\r\n\r\n const currentLanguage = useMemo(\r\n () => normalizedLanguages.find((item) => item.value === language) || normalizedLanguages[0],\r\n [language, normalizedLanguages]\r\n );\r\n\r\n return (\r\n <section className={`code-block code-block-${theme}`} data-language={currentLanguage?.value}>\r\n <header className=\"code-block-toolbar\">\r\n <label className=\"code-block-label\">\r\n Language\r\n <select\r\n className=\"code-block-select\"\r\n value={currentLanguage?.value}\r\n onChange={(event) => onLanguageChange(event.target.value)}\r\n >\r\n {normalizedLanguages.map((item) => (\r\n <option key={item.value} value={item.value}>\r\n {item.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label className=\"code-block-label\">\r\n Theme\r\n <select\r\n className=\"code-block-select\"\r\n value={theme}\r\n onChange={(event) => onThemeChange(event.target.value)}\r\n >\r\n {themes.map((item) => (\r\n <option key={item.value} value={item.value}>\r\n {item.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n </header>\r\n <textarea\r\n className=\"code-block-area\"\r\n value={value}\r\n onChange={(event) => onChange(event.target.value)}\r\n placeholder={placeholder}\r\n spellCheck={false}\r\n />\r\n </section>\r\n );\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport CodeBlock from \"./CodeBlock.jsx\";\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\tshowAlign = true,\r\n\tshowLink = true,\r\n\tshowUndoRedo = true,\r\n\tshowClear = true,\r\n\tshowPlainPaste = true,\r\n\tshowColor = true,\r\n\tcodeBlock = false,\r\n\tcodeBlockLanguages,\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 [customSize, setCustomSize] = useState(\"\");\r\n\tconst [textColor, setTextColor] = useState(\"#1f2937\");\r\n\tconst [backgroundColor, setBackgroundColor] = useState(\"#ffff00\");\r\n\tconst [activeToolMap, setActiveToolMap] = useState({});\r\n\tconst [isCodeModalOpen, setIsCodeModalOpen] = useState(false);\r\n\tconst [codeValue, setCodeValue] = useState(\"\");\r\n\tconst [codeLanguage, setCodeLanguage] = useState(\"js\");\r\n\tconst [codeTheme, setCodeTheme] = useState(theme);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetCodeTheme(theme);\r\n\t}, [theme]);\r\n\r\n\t// useEffect(() => {\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}, [html]);\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\tif (next === \"pre\") {\r\n\t\t\texec(\"formatBlock\", \"PRE\");\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\tif (next === \"custom\") {\r\n\t\t\tsetFontSize(\"custom\");\r\n\t\t\treturn;\r\n\t\t}\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 applyCustomFontSize = (value) => {\r\n\t\tsetCustomSize(value);\r\n\t\tif (!value || isNaN(value)) return;\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 = `${value}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 applyBackgroundColor = (next) => {\r\n\t\tsetBackgroundColor(next);\r\n\t\texec(\"hiliteColor\", next);\r\n\t};\r\n\r\n\tconst resetColors = () => {\r\n\t\tconst defaultText = theme === \"dark\" ? \"#e5e7eb\" : \"#1f2937\";\r\n\t\tconst defaultBg = \"#ffff00\";\r\n\t\tsetTextColor(defaultText);\r\n\t\tsetBackgroundColor(defaultBg);\r\n\t\texec(\"removeFormat\");\r\n\t};\r\n\r\n\tconst escapeHtml = (value) =>\r\n\t\tvalue\r\n\t\t\t.replace(/&/g, \"&\")\r\n\t\t\t.replace(/</g, \"<\")\r\n\t\t\t.replace(/>/g, \">\")\r\n\t\t\t.replace(/\\\"/g, \""\")\r\n\t\t\t.replace(/'/g, \"'\");\r\n\r\n\tconst insertCodeBlock = () => {\r\n\t\tconst safeCode = escapeHtml(codeValue || \"\");\r\n\t\tconst languageClass = codeLanguage ? `language-${codeLanguage}` : \"language-plain\";\r\n\t\tconst htmlBlock = `<pre class=\"code-block-shell\" data-theme=\"${codeTheme}\"><code class=\"${languageClass}\">${safeCode}</code></pre>`;\r\n\t\texec(\"insertHTML\", htmlBlock);\r\n\t\tsetIsCodeModalOpen(false);\r\n\t\tsetCodeValue(\"\");\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 ? \" show-preview\" : \" 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{showUndoRedo && (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => exec(\"undo\")}\r\n\t\t\t\t\t\t\t\ttitle=\"Undo\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t↶\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => exec(\"redo\")}\r\n\t\t\t\t\t\t\t\ttitle=\"Redo\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t↷\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\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{activeCommands.length > 0 && (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t\t{activeCommands.map((item) => (\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tkey={item.cmd}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tclassName={`toolbar-btn${activeToolMap[item.cmd] ? \" active\" : \"\"}`}\r\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\r\n\t\t\t\t\t\t\t\t\tonClick={() => exec(item.cmd)}\r\n\t\t\t\t\t\t\t\t\ttitle={item.label}\r\n\t\t\t\t\t\t\t\t\taria-pressed={activeToolMap[item.cmd] || false}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{item.icon}\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</div>\r\n\t\t\t\t\t\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showHeading || showFontSize || showColor) && (\r\n\t\t\t\t\t<>\r\n\t\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\tFormat\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\t<option value=\"h4\">Heading 4</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"blockquote\">Blockquote</option>\r\n\t\t\t\t\t\t\t\t\t{codeBlock && <option value=\"pre\">Code Block</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=\"10\">10px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"12\">12px</option>\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=\"20\">20px</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=\"24\">24px</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\t<option value=\"32\">32px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"36\">36px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"48\">48px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"custom\">Custom</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 && fontSize === \"custom\" && (\r\n\t\t\t\t\t\t\t<label className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\tmin=\"8\"\r\n\t\t\t\t\t\t\t\t\tmax=\"200\"\r\n\t\t\t\t\t\t\t\t\tvalue={customSize}\r\n\t\t\t\t\t\t\t\t\tonChange={(event) => applyCustomFontSize(event.target.value)}\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"Size\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-input\"\r\n\t\t\t\t\t\t\t\t\tstyle={{ width: \"60px\" }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\tpx\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<>\r\n\t\t\t\t\t\t\t\t<label className=\"toolbar-label color-label\">\r\n\t\t\t\t\t\t\t\t\tFont\r\n\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-color\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={textColor}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => applyTextColor(event.target.value)}\r\n\t\t\t\t\t\t\t\t\t\taria-label=\"Text color\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t<label className=\"toolbar-label color-label\">\r\n\t\t\t\t\t\t\t\t\tBackground\r\n\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-color\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={backgroundColor}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => applyBackgroundColor(event.target.value)}\r\n\t\t\t\t\t\t\t\t\t\taria-label=\"Background color\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\tonClick={resetColors}\r\n\t\t\t\t\t\t\t\t\ttitle=\"Reset colors\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t↺\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{codeBlock && (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCodeTheme(theme);\r\n\t\t\t\t\t\t\t\t\tsetIsCodeModalOpen(true);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\ttitle=\"Insert code block\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tCode Block\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{showAlign && (\r\n\t\t\t\t\t\t\t<div className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\tAlign\r\n\t\t\t\t\t\t\t\t<div className=\"align-buttons\">\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyLeft\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Left\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⟸\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyCenter\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Center\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⇔\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyRight\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Right\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⟹\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyFull\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Justify\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⇿\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showLink || showClear) && (\r\n\t\t\t\t\t<>\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\t🔗\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{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\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t</>\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<pre className=\"preview-code\">{html}</pre>\r\n\t\t\t\t\t<div className=\"preview-header\">Live HTML</div>\r\n\t\t\t\t</aside>\r\n\t\t\t)}\r\n\r\n\t\t\t{codeBlock && isCodeModalOpen && (\r\n\t\t\t\t<div className=\"modal-backdrop\" role=\"dialog\" aria-modal=\"true\">\r\n\t\t\t\t\t<div className=\"modal\">\r\n\t\t\t\t\t\t<div className=\"modal-header\">\r\n\t\t\t\t\t\t\tInsert Code Block\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<CodeBlock\r\n\t\t\t\t\t\t\tvalue={codeValue}\r\n\t\t\t\t\t\t\tlanguage={codeLanguage}\r\n\t\t\t\t\t\t\ttheme={codeTheme}\r\n\t\t\t\t\t\t\tlanguages={codeBlockLanguages}\r\n\t\t\t\t\t\t\tonChange={setCodeValue}\r\n\t\t\t\t\t\t\tonLanguageChange={setCodeLanguage}\r\n\t\t\t\t\t\t\tonThemeChange={setCodeTheme}\r\n\t\t\t\t\t\t\tplaceholder=\"Paste your code here\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<div className=\"modal-actions\">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => setIsCodeModalOpen(false)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tCancel\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={insertCodeBlock}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tInsert\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</div>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n","// src/index.js - Library entry point\r\nimport Editor from \"./components/Editor.jsx\";\r\nimport CodeBlock from \"./components/CodeBlock.jsx\";\r\n\r\nexport default Editor;\r\nexport { CodeBlock };\r\n"],"names":["DEFAULT_LANGUAGES","value","label","DEFAULT_THEMES","CodeBlock","language","theme","languages","themes","onChange","onLanguageChange","onThemeChange","placeholder","normalizedLanguages","useMemo","Array","isArray","length","map","item","currentLanguage","find","React","createElement","className","event","target","key","spellCheck","COMMANDS","cmd","icon","Editor","tools","showHeading","showFontSize","showAlign","showLink","showUndoRedo","showClear","showPlainPaste","showColor","codeBlock","codeBlockLanguages","showLiveHtml","showStats","showCopyHtml","editorRef","useRef","html","setHtml","useState","plainPaste","setPlainPaste","selectionText","setSelectionText","heading","setHeading","fontSize","setFontSize","customSize","setCustomSize","textColor","setTextColor","backgroundColor","setBackgroundColor","activeToolMap","setActiveToolMap","isCodeModalOpen","setIsCodeModalOpen","codeValue","setCodeValue","codeLanguage","setCodeLanguage","codeTheme","setCodeTheme","useEffect","stats","text","current","innerText","words","trim","split","chars","exec","focus","document","execCommand","nextHtml","innerHTML","updateToolbarState","applyHeading","next","toUpperCase","applyFontSize","fontElements","querySelectorAll","forEach","el","removeAttribute","style","applyCustomFontSize","isNaN","applyTextColor","applyBackgroundColor","resetColors","defaultText","defaultBg","escapeHtml","replace","insertCodeBlock","safeCode","languageClass","htmlBlock","insertLink","url","window","prompt","removeFormat","clearAll","onInput","onPaste","preventDefault","clipboardData","getData","useCallback","selection","getSelection","rangeCount","anchorNode","isInsideEditor","contains","toString","nextActive","queryCommandState","addEventListener","removeEventListener","exportHtml","payload","navigator","clipboard","writeText","alert","activeCommands","filter","includes","Fragment","type","onClick","title","onMouseDown","min","max","width","checked","ref","contentEditable","onKeyUp","onMouseUp","suppressContentEditableWarning","role"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,87 @@
|
|
|
1
|
-
import React, { useRef, useState,
|
|
1
|
+
import React, { useMemo, useRef, useState, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_LANGUAGES = [{
|
|
4
|
+
value: "plain",
|
|
5
|
+
label: "Plain"
|
|
6
|
+
}, {
|
|
7
|
+
value: "js",
|
|
8
|
+
label: "JavaScript"
|
|
9
|
+
}, {
|
|
10
|
+
value: "ts",
|
|
11
|
+
label: "TypeScript"
|
|
12
|
+
}, {
|
|
13
|
+
value: "java",
|
|
14
|
+
label: "Java"
|
|
15
|
+
}, {
|
|
16
|
+
value: "css",
|
|
17
|
+
label: "CSS"
|
|
18
|
+
}, {
|
|
19
|
+
value: "html",
|
|
20
|
+
label: "HTML"
|
|
21
|
+
}, {
|
|
22
|
+
value: "json",
|
|
23
|
+
label: "JSON"
|
|
24
|
+
}];
|
|
25
|
+
const DEFAULT_THEMES = [{
|
|
26
|
+
value: "dark",
|
|
27
|
+
label: "Dark"
|
|
28
|
+
}, {
|
|
29
|
+
value: "light",
|
|
30
|
+
label: "Light"
|
|
31
|
+
}];
|
|
32
|
+
function CodeBlock({
|
|
33
|
+
value = "",
|
|
34
|
+
language = "plain",
|
|
35
|
+
theme = "dark",
|
|
36
|
+
languages = DEFAULT_LANGUAGES,
|
|
37
|
+
themes = DEFAULT_THEMES,
|
|
38
|
+
onChange = () => {},
|
|
39
|
+
onLanguageChange = () => {},
|
|
40
|
+
onThemeChange = () => {},
|
|
41
|
+
placeholder = "Paste code here"
|
|
42
|
+
}) {
|
|
43
|
+
const normalizedLanguages = useMemo(() => {
|
|
44
|
+
if (!Array.isArray(languages) || languages.length === 0) return DEFAULT_LANGUAGES;
|
|
45
|
+
if (typeof languages[0] === "string") {
|
|
46
|
+
return languages.map(item => ({
|
|
47
|
+
value: item,
|
|
48
|
+
label: item
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
return languages;
|
|
52
|
+
}, [languages]);
|
|
53
|
+
const currentLanguage = useMemo(() => normalizedLanguages.find(item => item.value === language) || normalizedLanguages[0], [language, normalizedLanguages]);
|
|
54
|
+
return /*#__PURE__*/React.createElement("section", {
|
|
55
|
+
className: `code-block code-block-${theme}`,
|
|
56
|
+
"data-language": currentLanguage?.value
|
|
57
|
+
}, /*#__PURE__*/React.createElement("header", {
|
|
58
|
+
className: "code-block-toolbar"
|
|
59
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
60
|
+
className: "code-block-label"
|
|
61
|
+
}, "Language", /*#__PURE__*/React.createElement("select", {
|
|
62
|
+
className: "code-block-select",
|
|
63
|
+
value: currentLanguage?.value,
|
|
64
|
+
onChange: event => onLanguageChange(event.target.value)
|
|
65
|
+
}, normalizedLanguages.map(item => /*#__PURE__*/React.createElement("option", {
|
|
66
|
+
key: item.value,
|
|
67
|
+
value: item.value
|
|
68
|
+
}, item.label)))), /*#__PURE__*/React.createElement("label", {
|
|
69
|
+
className: "code-block-label"
|
|
70
|
+
}, "Theme", /*#__PURE__*/React.createElement("select", {
|
|
71
|
+
className: "code-block-select",
|
|
72
|
+
value: theme,
|
|
73
|
+
onChange: event => onThemeChange(event.target.value)
|
|
74
|
+
}, themes.map(item => /*#__PURE__*/React.createElement("option", {
|
|
75
|
+
key: item.value,
|
|
76
|
+
value: item.value
|
|
77
|
+
}, item.label))))), /*#__PURE__*/React.createElement("textarea", {
|
|
78
|
+
className: "code-block-area",
|
|
79
|
+
value: value,
|
|
80
|
+
onChange: event => onChange(event.target.value),
|
|
81
|
+
placeholder: placeholder,
|
|
82
|
+
spellCheck: false
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
2
85
|
|
|
3
86
|
const COMMANDS = [{
|
|
4
87
|
cmd: "bold",
|
|
@@ -42,11 +125,14 @@ function Editor({
|
|
|
42
125
|
tools = COMMANDS.map(item => item.cmd),
|
|
43
126
|
showHeading = true,
|
|
44
127
|
showFontSize = true,
|
|
128
|
+
showAlign = true,
|
|
45
129
|
showLink = true,
|
|
46
130
|
showUndoRedo = true,
|
|
47
131
|
showClear = true,
|
|
48
132
|
showPlainPaste = true,
|
|
49
133
|
showColor = true,
|
|
134
|
+
codeBlock = false,
|
|
135
|
+
codeBlockLanguages,
|
|
50
136
|
showLiveHtml = true,
|
|
51
137
|
showStats = true,
|
|
52
138
|
showCopyHtml = true,
|
|
@@ -58,8 +144,17 @@ function Editor({
|
|
|
58
144
|
const [selectionText, setSelectionText] = useState("");
|
|
59
145
|
const [heading, setHeading] = useState("p");
|
|
60
146
|
const [fontSize, setFontSize] = useState("16");
|
|
147
|
+
const [customSize, setCustomSize] = useState("");
|
|
61
148
|
const [textColor, setTextColor] = useState("#1f2937");
|
|
149
|
+
const [backgroundColor, setBackgroundColor] = useState("#ffff00");
|
|
62
150
|
const [activeToolMap, setActiveToolMap] = useState({});
|
|
151
|
+
const [isCodeModalOpen, setIsCodeModalOpen] = useState(false);
|
|
152
|
+
const [codeValue, setCodeValue] = useState("");
|
|
153
|
+
const [codeLanguage, setCodeLanguage] = useState("js");
|
|
154
|
+
const [codeTheme, setCodeTheme] = useState(theme);
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
setCodeTheme(theme);
|
|
157
|
+
}, [theme]);
|
|
63
158
|
|
|
64
159
|
// useEffect(() => {
|
|
65
160
|
// if (editorRef.current) {
|
|
@@ -75,7 +170,7 @@ function Editor({
|
|
|
75
170
|
words,
|
|
76
171
|
chars: text.length
|
|
77
172
|
};
|
|
78
|
-
}, []);
|
|
173
|
+
}, [html]);
|
|
79
174
|
const exec = (cmd, value = null) => {
|
|
80
175
|
editorRef.current?.focus();
|
|
81
176
|
document.execCommand(cmd, false, value);
|
|
@@ -93,9 +188,17 @@ function Editor({
|
|
|
93
188
|
exec("formatBlock", "P");
|
|
94
189
|
return;
|
|
95
190
|
}
|
|
191
|
+
if (next === "pre") {
|
|
192
|
+
exec("formatBlock", "PRE");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
96
195
|
exec("formatBlock", next.toUpperCase());
|
|
97
196
|
};
|
|
98
197
|
const applyFontSize = next => {
|
|
198
|
+
if (next === "custom") {
|
|
199
|
+
setFontSize("custom");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
99
202
|
setFontSize(next);
|
|
100
203
|
exec("fontSize", "7");
|
|
101
204
|
const fontElements = editorRef.current?.querySelectorAll("font[size='7']") || [];
|
|
@@ -106,10 +209,42 @@ function Editor({
|
|
|
106
209
|
setHtml(editorRef.current?.innerHTML || "");
|
|
107
210
|
updateToolbarState();
|
|
108
211
|
};
|
|
212
|
+
const applyCustomFontSize = value => {
|
|
213
|
+
setCustomSize(value);
|
|
214
|
+
if (!value || isNaN(value)) return;
|
|
215
|
+
exec("fontSize", "7");
|
|
216
|
+
const fontElements = editorRef.current?.querySelectorAll("font[size='7']") || [];
|
|
217
|
+
fontElements.forEach(el => {
|
|
218
|
+
el.removeAttribute("size");
|
|
219
|
+
el.style.fontSize = `${value}px`;
|
|
220
|
+
});
|
|
221
|
+
setHtml(editorRef.current?.innerHTML || "");
|
|
222
|
+
updateToolbarState();
|
|
223
|
+
};
|
|
109
224
|
const applyTextColor = next => {
|
|
110
225
|
setTextColor(next);
|
|
111
226
|
exec("foreColor", next);
|
|
112
227
|
};
|
|
228
|
+
const applyBackgroundColor = next => {
|
|
229
|
+
setBackgroundColor(next);
|
|
230
|
+
exec("hiliteColor", next);
|
|
231
|
+
};
|
|
232
|
+
const resetColors = () => {
|
|
233
|
+
const defaultText = theme === "dark" ? "#e5e7eb" : "#1f2937";
|
|
234
|
+
const defaultBg = "#ffff00";
|
|
235
|
+
setTextColor(defaultText);
|
|
236
|
+
setBackgroundColor(defaultBg);
|
|
237
|
+
exec("removeFormat");
|
|
238
|
+
};
|
|
239
|
+
const escapeHtml = value => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\"/g, """).replace(/'/g, "'");
|
|
240
|
+
const insertCodeBlock = () => {
|
|
241
|
+
const safeCode = escapeHtml(codeValue || "");
|
|
242
|
+
const languageClass = codeLanguage ? `language-${codeLanguage}` : "language-plain";
|
|
243
|
+
const htmlBlock = `<pre class="code-block-shell" data-theme="${codeTheme}"><code class="${languageClass}">${safeCode}</code></pre>`;
|
|
244
|
+
exec("insertHTML", htmlBlock);
|
|
245
|
+
setIsCodeModalOpen(false);
|
|
246
|
+
setCodeValue("");
|
|
247
|
+
};
|
|
113
248
|
const insertLink = () => {
|
|
114
249
|
const url = window.prompt("Enter URL", "https://");
|
|
115
250
|
if (!url) return;
|
|
@@ -173,11 +308,25 @@ function Editor({
|
|
|
173
308
|
};
|
|
174
309
|
const activeCommands = useMemo(() => COMMANDS.filter(item => tools.includes(item.cmd)), [tools]);
|
|
175
310
|
return /*#__PURE__*/React.createElement("section", {
|
|
176
|
-
className: `editor-root theme-${theme}${showLiveHtml ? "" : " no-preview"}`,
|
|
311
|
+
className: `editor-root theme-${theme}${showLiveHtml ? " show-preview" : " no-preview"}`,
|
|
177
312
|
"data-theme": theme
|
|
178
313
|
}, /*#__PURE__*/React.createElement("div", {
|
|
179
314
|
className: "toolbar"
|
|
180
|
-
},
|
|
315
|
+
}, showUndoRedo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
316
|
+
className: "toolbar-group"
|
|
317
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
318
|
+
type: "button",
|
|
319
|
+
className: "toolbar-btn",
|
|
320
|
+
onClick: () => exec("undo"),
|
|
321
|
+
title: "Undo"
|
|
322
|
+
}, "\u21B6"), /*#__PURE__*/React.createElement("button", {
|
|
323
|
+
type: "button",
|
|
324
|
+
className: "toolbar-btn",
|
|
325
|
+
onClick: () => exec("redo"),
|
|
326
|
+
title: "Redo"
|
|
327
|
+
}, "\u21B7")), /*#__PURE__*/React.createElement("span", {
|
|
328
|
+
className: "toolbar-separator"
|
|
329
|
+
}, "|")), activeCommands.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
181
330
|
className: "toolbar-group"
|
|
182
331
|
}, activeCommands.map(item => /*#__PURE__*/React.createElement("button", {
|
|
183
332
|
key: item.cmd,
|
|
@@ -187,11 +336,13 @@ function Editor({
|
|
|
187
336
|
onClick: () => exec(item.cmd),
|
|
188
337
|
title: item.label,
|
|
189
338
|
"aria-pressed": activeToolMap[item.cmd] || false
|
|
190
|
-
}, item.icon))),
|
|
339
|
+
}, item.icon))), /*#__PURE__*/React.createElement("span", {
|
|
340
|
+
className: "toolbar-separator"
|
|
341
|
+
}, "|")), (showHeading || showFontSize || showColor) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
191
342
|
className: "toolbar-group"
|
|
192
343
|
}, showHeading && /*#__PURE__*/React.createElement("label", {
|
|
193
344
|
className: "toolbar-label"
|
|
194
|
-
}, "
|
|
345
|
+
}, "Format", /*#__PURE__*/React.createElement("select", {
|
|
195
346
|
value: heading,
|
|
196
347
|
onChange: event => applyHeading(event.target.value),
|
|
197
348
|
className: "toolbar-select"
|
|
@@ -203,45 +354,119 @@ function Editor({
|
|
|
203
354
|
value: "h2"
|
|
204
355
|
}, "Heading 2"), /*#__PURE__*/React.createElement("option", {
|
|
205
356
|
value: "h3"
|
|
206
|
-
}, "Heading 3")
|
|
357
|
+
}, "Heading 3"), /*#__PURE__*/React.createElement("option", {
|
|
358
|
+
value: "h4"
|
|
359
|
+
}, "Heading 4"), /*#__PURE__*/React.createElement("option", {
|
|
360
|
+
value: "blockquote"
|
|
361
|
+
}, "Blockquote"), codeBlock && /*#__PURE__*/React.createElement("option", {
|
|
362
|
+
value: "pre"
|
|
363
|
+
}, "Code Block"))), showFontSize && /*#__PURE__*/React.createElement("label", {
|
|
207
364
|
className: "toolbar-label"
|
|
208
365
|
}, "Size", /*#__PURE__*/React.createElement("select", {
|
|
209
366
|
value: fontSize,
|
|
210
367
|
onChange: event => applyFontSize(event.target.value),
|
|
211
368
|
className: "toolbar-select"
|
|
212
369
|
}, /*#__PURE__*/React.createElement("option", {
|
|
370
|
+
value: "10"
|
|
371
|
+
}, "10px"), /*#__PURE__*/React.createElement("option", {
|
|
372
|
+
value: "12"
|
|
373
|
+
}, "12px"), /*#__PURE__*/React.createElement("option", {
|
|
213
374
|
value: "14"
|
|
214
375
|
}, "14px"), /*#__PURE__*/React.createElement("option", {
|
|
215
376
|
value: "16"
|
|
216
377
|
}, "16px"), /*#__PURE__*/React.createElement("option", {
|
|
217
378
|
value: "18"
|
|
218
379
|
}, "18px"), /*#__PURE__*/React.createElement("option", {
|
|
380
|
+
value: "20"
|
|
381
|
+
}, "20px"), /*#__PURE__*/React.createElement("option", {
|
|
219
382
|
value: "22"
|
|
220
383
|
}, "22px"), /*#__PURE__*/React.createElement("option", {
|
|
384
|
+
value: "24"
|
|
385
|
+
}, "24px"), /*#__PURE__*/React.createElement("option", {
|
|
221
386
|
value: "28"
|
|
222
|
-
}, "28px")
|
|
387
|
+
}, "28px"), /*#__PURE__*/React.createElement("option", {
|
|
388
|
+
value: "32"
|
|
389
|
+
}, "32px"), /*#__PURE__*/React.createElement("option", {
|
|
390
|
+
value: "36"
|
|
391
|
+
}, "36px"), /*#__PURE__*/React.createElement("option", {
|
|
392
|
+
value: "48"
|
|
393
|
+
}, "48px"), /*#__PURE__*/React.createElement("option", {
|
|
394
|
+
value: "custom"
|
|
395
|
+
}, "Custom"))), showFontSize && fontSize === "custom" && /*#__PURE__*/React.createElement("label", {
|
|
396
|
+
className: "toolbar-label"
|
|
397
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
398
|
+
type: "number",
|
|
399
|
+
min: "8",
|
|
400
|
+
max: "200",
|
|
401
|
+
value: customSize,
|
|
402
|
+
onChange: event => applyCustomFontSize(event.target.value),
|
|
403
|
+
placeholder: "Size",
|
|
404
|
+
className: "toolbar-input",
|
|
405
|
+
style: {
|
|
406
|
+
width: "60px"
|
|
407
|
+
}
|
|
408
|
+
}), "px"), showColor && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("label", {
|
|
223
409
|
className: "toolbar-label color-label"
|
|
224
|
-
}, "
|
|
410
|
+
}, "Font", /*#__PURE__*/React.createElement("input", {
|
|
225
411
|
type: "color",
|
|
226
412
|
className: "toolbar-color",
|
|
227
413
|
value: textColor,
|
|
228
414
|
onChange: event => applyTextColor(event.target.value),
|
|
229
415
|
"aria-label": "Text color"
|
|
230
|
-
}))
|
|
231
|
-
className: "toolbar-
|
|
232
|
-
},
|
|
416
|
+
})), /*#__PURE__*/React.createElement("label", {
|
|
417
|
+
className: "toolbar-label color-label"
|
|
418
|
+
}, "Background", /*#__PURE__*/React.createElement("input", {
|
|
419
|
+
type: "color",
|
|
420
|
+
className: "toolbar-color",
|
|
421
|
+
value: backgroundColor,
|
|
422
|
+
onChange: event => applyBackgroundColor(event.target.value),
|
|
423
|
+
"aria-label": "Background color"
|
|
424
|
+
})), /*#__PURE__*/React.createElement("button", {
|
|
233
425
|
type: "button",
|
|
234
|
-
className: "toolbar-btn",
|
|
235
|
-
onClick:
|
|
236
|
-
|
|
426
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
427
|
+
onClick: resetColors,
|
|
428
|
+
title: "Reset colors"
|
|
429
|
+
}, "\u21BA")), codeBlock && /*#__PURE__*/React.createElement("button", {
|
|
237
430
|
type: "button",
|
|
238
431
|
className: "toolbar-btn",
|
|
239
|
-
onClick: () =>
|
|
240
|
-
|
|
432
|
+
onClick: () => {
|
|
433
|
+
setCodeTheme(theme);
|
|
434
|
+
setIsCodeModalOpen(true);
|
|
435
|
+
},
|
|
436
|
+
title: "Insert code block"
|
|
437
|
+
}, "Code Block"), showAlign && /*#__PURE__*/React.createElement("div", {
|
|
438
|
+
className: "toolbar-label"
|
|
439
|
+
}, "Align", /*#__PURE__*/React.createElement("div", {
|
|
440
|
+
className: "align-buttons"
|
|
441
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
442
|
+
type: "button",
|
|
443
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
444
|
+
onClick: () => exec("justifyLeft"),
|
|
445
|
+
title: "Align Left"
|
|
446
|
+
}, "\u27F8"), /*#__PURE__*/React.createElement("button", {
|
|
447
|
+
type: "button",
|
|
448
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
449
|
+
onClick: () => exec("justifyCenter"),
|
|
450
|
+
title: "Align Center"
|
|
451
|
+
}, "\u21D4"), /*#__PURE__*/React.createElement("button", {
|
|
452
|
+
type: "button",
|
|
453
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
454
|
+
onClick: () => exec("justifyRight"),
|
|
455
|
+
title: "Align Right"
|
|
456
|
+
}, "\u27F9"), /*#__PURE__*/React.createElement("button", {
|
|
457
|
+
type: "button",
|
|
458
|
+
className: "toolbar-btn toolbar-btn-small",
|
|
459
|
+
onClick: () => exec("justifyFull"),
|
|
460
|
+
title: "Justify"
|
|
461
|
+
}, "\u21FF")))), /*#__PURE__*/React.createElement("span", {
|
|
462
|
+
className: "toolbar-separator"
|
|
463
|
+
}, "|")), (showLink || showClear) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
464
|
+
className: "toolbar-group"
|
|
465
|
+
}, showLink && /*#__PURE__*/React.createElement("button", {
|
|
241
466
|
type: "button",
|
|
242
467
|
className: "toolbar-btn",
|
|
243
|
-
onClick:
|
|
244
|
-
}, "
|
|
468
|
+
onClick: insertLink
|
|
469
|
+
}, "\uD83D\uDD17"), showClear && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
245
470
|
type: "button",
|
|
246
471
|
className: "toolbar-btn",
|
|
247
472
|
onClick: removeFormat
|
|
@@ -249,7 +474,9 @@ function Editor({
|
|
|
249
474
|
type: "button",
|
|
250
475
|
className: "toolbar-btn danger",
|
|
251
476
|
onClick: clearAll
|
|
252
|
-
}, "Clear all"))),
|
|
477
|
+
}, "Clear all"))), /*#__PURE__*/React.createElement("span", {
|
|
478
|
+
className: "toolbar-separator"
|
|
479
|
+
}, "|")), showPlainPaste && /*#__PURE__*/React.createElement("div", {
|
|
253
480
|
className: "toolbar-group toggle"
|
|
254
481
|
}, /*#__PURE__*/React.createElement("label", {
|
|
255
482
|
className: "toggle-row"
|
|
@@ -281,14 +508,41 @@ function Editor({
|
|
|
281
508
|
onClick: exportHtml
|
|
282
509
|
}, "Copy HTML"))), showLiveHtml && /*#__PURE__*/React.createElement("aside", {
|
|
283
510
|
className: "editor-preview"
|
|
284
|
-
}, /*#__PURE__*/React.createElement("
|
|
285
|
-
className: "preview-header"
|
|
286
|
-
}, "Live HTML"), /*#__PURE__*/React.createElement("pre", {
|
|
511
|
+
}, /*#__PURE__*/React.createElement("pre", {
|
|
287
512
|
className: "preview-code"
|
|
288
|
-
}, html)
|
|
513
|
+
}, html), /*#__PURE__*/React.createElement("div", {
|
|
514
|
+
className: "preview-header"
|
|
515
|
+
}, "Live HTML")), codeBlock && isCodeModalOpen && /*#__PURE__*/React.createElement("div", {
|
|
516
|
+
className: "modal-backdrop",
|
|
517
|
+
role: "dialog",
|
|
518
|
+
"aria-modal": "true"
|
|
519
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
520
|
+
className: "modal"
|
|
521
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
522
|
+
className: "modal-header"
|
|
523
|
+
}, "Insert Code Block"), /*#__PURE__*/React.createElement(CodeBlock, {
|
|
524
|
+
value: codeValue,
|
|
525
|
+
language: codeLanguage,
|
|
526
|
+
theme: codeTheme,
|
|
527
|
+
languages: codeBlockLanguages,
|
|
528
|
+
onChange: setCodeValue,
|
|
529
|
+
onLanguageChange: setCodeLanguage,
|
|
530
|
+
onThemeChange: setCodeTheme,
|
|
531
|
+
placeholder: "Paste your code here"
|
|
532
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
533
|
+
className: "modal-actions"
|
|
534
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
535
|
+
type: "button",
|
|
536
|
+
className: "toolbar-btn",
|
|
537
|
+
onClick: () => setIsCodeModalOpen(false)
|
|
538
|
+
}, "Cancel"), /*#__PURE__*/React.createElement("button", {
|
|
539
|
+
type: "button",
|
|
540
|
+
className: "toolbar-btn",
|
|
541
|
+
onClick: insertCodeBlock
|
|
542
|
+
}, "Insert")))));
|
|
289
543
|
}
|
|
290
544
|
|
|
291
545
|
// src/index.js - Library entry point
|
|
292
546
|
|
|
293
|
-
export { Editor as default };
|
|
547
|
+
export { CodeBlock, Editor as default };
|
|
294
548
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/components/Editor.jsx","../src/index.js"],"sourcesContent":["import React, { 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\t// useEffect(() => {\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","// src/index.js - Library entry point\r\nimport Editor from \"./components/Editor.jsx\";\r\nimport \"./index.css\";\r\n// Export default only to avoid mixing named and default exports\r\nexport default Editor;\r\n"],"names":["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","stats","useMemo","text","current","innerText","words","trim","split","length","chars","exec","value","focus","document","execCommand","nextHtml","innerHTML","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","useEffect","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":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/CodeBlock.jsx","../src/components/Editor.jsx","../src/index.js"],"sourcesContent":["import React, { useMemo } from \"react\";\r\n\r\nconst DEFAULT_LANGUAGES = [\r\n { value: \"plain\", label: \"Plain\" },\r\n { value: \"js\", label: \"JavaScript\" },\r\n { value: \"ts\", label: \"TypeScript\" },\r\n { value: \"java\", label: \"Java\" },\r\n { value: \"css\", label: \"CSS\" },\r\n { value: \"html\", label: \"HTML\" },\r\n { value: \"json\", label: \"JSON\" },\r\n];\r\n\r\nconst DEFAULT_THEMES = [\r\n { value: \"dark\", label: \"Dark\" },\r\n { value: \"light\", label: \"Light\" },\r\n];\r\n\r\nexport default function CodeBlock({\r\n value = \"\",\r\n language = \"plain\",\r\n theme = \"dark\",\r\n languages = DEFAULT_LANGUAGES,\r\n themes = DEFAULT_THEMES,\r\n onChange = () => {},\r\n onLanguageChange = () => {},\r\n onThemeChange = () => {},\r\n placeholder = \"Paste code here\",\r\n}) {\r\n const normalizedLanguages = useMemo(() => {\r\n if (!Array.isArray(languages) || languages.length === 0) return DEFAULT_LANGUAGES;\r\n if (typeof languages[0] === \"string\") {\r\n return languages.map((item) => ({ value: item, label: item }));\r\n }\r\n return languages;\r\n }, [languages]);\r\n\r\n const currentLanguage = useMemo(\r\n () => normalizedLanguages.find((item) => item.value === language) || normalizedLanguages[0],\r\n [language, normalizedLanguages]\r\n );\r\n\r\n return (\r\n <section className={`code-block code-block-${theme}`} data-language={currentLanguage?.value}>\r\n <header className=\"code-block-toolbar\">\r\n <label className=\"code-block-label\">\r\n Language\r\n <select\r\n className=\"code-block-select\"\r\n value={currentLanguage?.value}\r\n onChange={(event) => onLanguageChange(event.target.value)}\r\n >\r\n {normalizedLanguages.map((item) => (\r\n <option key={item.value} value={item.value}>\r\n {item.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label className=\"code-block-label\">\r\n Theme\r\n <select\r\n className=\"code-block-select\"\r\n value={theme}\r\n onChange={(event) => onThemeChange(event.target.value)}\r\n >\r\n {themes.map((item) => (\r\n <option key={item.value} value={item.value}>\r\n {item.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n </header>\r\n <textarea\r\n className=\"code-block-area\"\r\n value={value}\r\n onChange={(event) => onChange(event.target.value)}\r\n placeholder={placeholder}\r\n spellCheck={false}\r\n />\r\n </section>\r\n );\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport CodeBlock from \"./CodeBlock.jsx\";\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\tshowAlign = true,\r\n\tshowLink = true,\r\n\tshowUndoRedo = true,\r\n\tshowClear = true,\r\n\tshowPlainPaste = true,\r\n\tshowColor = true,\r\n\tcodeBlock = false,\r\n\tcodeBlockLanguages,\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 [customSize, setCustomSize] = useState(\"\");\r\n\tconst [textColor, setTextColor] = useState(\"#1f2937\");\r\n\tconst [backgroundColor, setBackgroundColor] = useState(\"#ffff00\");\r\n\tconst [activeToolMap, setActiveToolMap] = useState({});\r\n\tconst [isCodeModalOpen, setIsCodeModalOpen] = useState(false);\r\n\tconst [codeValue, setCodeValue] = useState(\"\");\r\n\tconst [codeLanguage, setCodeLanguage] = useState(\"js\");\r\n\tconst [codeTheme, setCodeTheme] = useState(theme);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetCodeTheme(theme);\r\n\t}, [theme]);\r\n\r\n\t// useEffect(() => {\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}, [html]);\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\tif (next === \"pre\") {\r\n\t\t\texec(\"formatBlock\", \"PRE\");\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\tif (next === \"custom\") {\r\n\t\t\tsetFontSize(\"custom\");\r\n\t\t\treturn;\r\n\t\t}\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 applyCustomFontSize = (value) => {\r\n\t\tsetCustomSize(value);\r\n\t\tif (!value || isNaN(value)) return;\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 = `${value}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 applyBackgroundColor = (next) => {\r\n\t\tsetBackgroundColor(next);\r\n\t\texec(\"hiliteColor\", next);\r\n\t};\r\n\r\n\tconst resetColors = () => {\r\n\t\tconst defaultText = theme === \"dark\" ? \"#e5e7eb\" : \"#1f2937\";\r\n\t\tconst defaultBg = \"#ffff00\";\r\n\t\tsetTextColor(defaultText);\r\n\t\tsetBackgroundColor(defaultBg);\r\n\t\texec(\"removeFormat\");\r\n\t};\r\n\r\n\tconst escapeHtml = (value) =>\r\n\t\tvalue\r\n\t\t\t.replace(/&/g, \"&\")\r\n\t\t\t.replace(/</g, \"<\")\r\n\t\t\t.replace(/>/g, \">\")\r\n\t\t\t.replace(/\\\"/g, \""\")\r\n\t\t\t.replace(/'/g, \"'\");\r\n\r\n\tconst insertCodeBlock = () => {\r\n\t\tconst safeCode = escapeHtml(codeValue || \"\");\r\n\t\tconst languageClass = codeLanguage ? `language-${codeLanguage}` : \"language-plain\";\r\n\t\tconst htmlBlock = `<pre class=\"code-block-shell\" data-theme=\"${codeTheme}\"><code class=\"${languageClass}\">${safeCode}</code></pre>`;\r\n\t\texec(\"insertHTML\", htmlBlock);\r\n\t\tsetIsCodeModalOpen(false);\r\n\t\tsetCodeValue(\"\");\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 ? \" show-preview\" : \" 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{showUndoRedo && (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => exec(\"undo\")}\r\n\t\t\t\t\t\t\t\ttitle=\"Undo\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t↶\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => exec(\"redo\")}\r\n\t\t\t\t\t\t\t\ttitle=\"Redo\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t↷\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\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{activeCommands.length > 0 && (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<div className=\"toolbar-group\">\r\n\t\t\t\t\t\t\t{activeCommands.map((item) => (\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tkey={item.cmd}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tclassName={`toolbar-btn${activeToolMap[item.cmd] ? \" active\" : \"\"}`}\r\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\r\n\t\t\t\t\t\t\t\t\tonClick={() => exec(item.cmd)}\r\n\t\t\t\t\t\t\t\t\ttitle={item.label}\r\n\t\t\t\t\t\t\t\t\taria-pressed={activeToolMap[item.cmd] || false}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{item.icon}\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</div>\r\n\t\t\t\t\t\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showHeading || showFontSize || showColor) && (\r\n\t\t\t\t\t<>\r\n\t\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\tFormat\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\t<option value=\"h4\">Heading 4</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"blockquote\">Blockquote</option>\r\n\t\t\t\t\t\t\t\t\t{codeBlock && <option value=\"pre\">Code Block</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=\"10\">10px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"12\">12px</option>\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=\"20\">20px</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=\"24\">24px</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\t<option value=\"32\">32px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"36\">36px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"48\">48px</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"custom\">Custom</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 && fontSize === \"custom\" && (\r\n\t\t\t\t\t\t\t<label className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\tmin=\"8\"\r\n\t\t\t\t\t\t\t\t\tmax=\"200\"\r\n\t\t\t\t\t\t\t\t\tvalue={customSize}\r\n\t\t\t\t\t\t\t\t\tonChange={(event) => applyCustomFontSize(event.target.value)}\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"Size\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-input\"\r\n\t\t\t\t\t\t\t\t\tstyle={{ width: \"60px\" }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\tpx\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<>\r\n\t\t\t\t\t\t\t\t<label className=\"toolbar-label color-label\">\r\n\t\t\t\t\t\t\t\t\tFont\r\n\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-color\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={textColor}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => applyTextColor(event.target.value)}\r\n\t\t\t\t\t\t\t\t\t\taria-label=\"Text color\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t<label className=\"toolbar-label color-label\">\r\n\t\t\t\t\t\t\t\t\tBackground\r\n\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\ttype=\"color\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-color\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={backgroundColor}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => applyBackgroundColor(event.target.value)}\r\n\t\t\t\t\t\t\t\t\t\taria-label=\"Background color\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\tonClick={resetColors}\r\n\t\t\t\t\t\t\t\t\ttitle=\"Reset colors\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t↺\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{codeBlock && (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCodeTheme(theme);\r\n\t\t\t\t\t\t\t\t\tsetIsCodeModalOpen(true);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\ttitle=\"Insert code block\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tCode Block\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{showAlign && (\r\n\t\t\t\t\t\t\t<div className=\"toolbar-label\">\r\n\t\t\t\t\t\t\t\tAlign\r\n\t\t\t\t\t\t\t\t<div className=\"align-buttons\">\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyLeft\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Left\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⟸\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyCenter\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Center\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⇔\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyRight\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Align Right\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⟹\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"toolbar-btn toolbar-btn-small\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => exec(\"justifyFull\")}\r\n\t\t\t\t\t\t\t\t\t\ttitle=\"Justify\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t⇿\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t\t{(showLink || showClear) && (\r\n\t\t\t\t\t<>\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\t🔗\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{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\t<span className=\"toolbar-separator\">|</span>\r\n\t\t\t\t</>\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<pre className=\"preview-code\">{html}</pre>\r\n\t\t\t\t\t<div className=\"preview-header\">Live HTML</div>\r\n\t\t\t\t</aside>\r\n\t\t\t)}\r\n\r\n\t\t\t{codeBlock && isCodeModalOpen && (\r\n\t\t\t\t<div className=\"modal-backdrop\" role=\"dialog\" aria-modal=\"true\">\r\n\t\t\t\t\t<div className=\"modal\">\r\n\t\t\t\t\t\t<div className=\"modal-header\">\r\n\t\t\t\t\t\t\tInsert Code Block\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<CodeBlock\r\n\t\t\t\t\t\t\tvalue={codeValue}\r\n\t\t\t\t\t\t\tlanguage={codeLanguage}\r\n\t\t\t\t\t\t\ttheme={codeTheme}\r\n\t\t\t\t\t\t\tlanguages={codeBlockLanguages}\r\n\t\t\t\t\t\t\tonChange={setCodeValue}\r\n\t\t\t\t\t\t\tonLanguageChange={setCodeLanguage}\r\n\t\t\t\t\t\t\tonThemeChange={setCodeTheme}\r\n\t\t\t\t\t\t\tplaceholder=\"Paste your code here\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<div className=\"modal-actions\">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={() => setIsCodeModalOpen(false)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tCancel\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"toolbar-btn\"\r\n\t\t\t\t\t\t\t\tonClick={insertCodeBlock}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tInsert\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</div>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n","// src/index.js - Library entry point\r\nimport Editor from \"./components/Editor.jsx\";\r\nimport CodeBlock from \"./components/CodeBlock.jsx\";\r\n\r\nexport default Editor;\r\nexport { CodeBlock };\r\n"],"names":["DEFAULT_LANGUAGES","value","label","DEFAULT_THEMES","CodeBlock","language","theme","languages","themes","onChange","onLanguageChange","onThemeChange","placeholder","normalizedLanguages","useMemo","Array","isArray","length","map","item","currentLanguage","find","React","createElement","className","event","target","key","spellCheck","COMMANDS","cmd","icon","Editor","tools","showHeading","showFontSize","showAlign","showLink","showUndoRedo","showClear","showPlainPaste","showColor","codeBlock","codeBlockLanguages","showLiveHtml","showStats","showCopyHtml","editorRef","useRef","html","setHtml","useState","plainPaste","setPlainPaste","selectionText","setSelectionText","heading","setHeading","fontSize","setFontSize","customSize","setCustomSize","textColor","setTextColor","backgroundColor","setBackgroundColor","activeToolMap","setActiveToolMap","isCodeModalOpen","setIsCodeModalOpen","codeValue","setCodeValue","codeLanguage","setCodeLanguage","codeTheme","setCodeTheme","useEffect","stats","text","current","innerText","words","trim","split","chars","exec","focus","document","execCommand","nextHtml","innerHTML","updateToolbarState","applyHeading","next","toUpperCase","applyFontSize","fontElements","querySelectorAll","forEach","el","removeAttribute","style","applyCustomFontSize","isNaN","applyTextColor","applyBackgroundColor","resetColors","defaultText","defaultBg","escapeHtml","replace","insertCodeBlock","safeCode","languageClass","htmlBlock","insertLink","url","window","prompt","removeFormat","clearAll","onInput","onPaste","preventDefault","clipboardData","getData","useCallback","selection","getSelection","rangeCount","anchorNode","isInsideEditor","contains","toString","nextActive","queryCommandState","addEventListener","removeEventListener","exportHtml","payload","navigator","clipboard","writeText","alert","activeCommands","filter","includes","Fragment","type","onClick","title","onMouseDown","min","max","width","checked","ref","contentEditable","onKeyUp","onMouseUp","suppressContentEditableWarning","role"],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/index.css
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
.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}}
|
|
2
|
-
/*# sourceMappingURL=index.css.map */
|
package/dist/index.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["index.css"],"names":[],"mappings":"AAEA,WAIE,sFACS,CAJT,gBAKF,CAEA,uBANE,YAAa,CACb,qBAUF,CALA,YAIE,OAAQ,CAHR,sBAIF,CAEA,WACE,cAAe,CACf,eACF,CAEA,cAEE,2BAAgC,CADhC,cAEF,CAEA,UACE,MAAO,CACP,mBACF,CAEA,aACE,8BAAmC,CACnC,iCAAsC,CACtC,qCAA0C,CAC1C,qBAAsB,CACtB,oCAAyC,CACzC,kCAAuC,CACvC,wCAA6C,CAC7C,sCAA2C,CAC3C,gCAAqC,CACrC,YAAa,CAEb,QAAS,CADT,kCAEF,CAEA,yBACE,8BAAqC,CACrC,oCAAyC,CACzC,kCAAuC,CACvC,qBAAsB,CACtB,gCAAqC,CACrC,kCAAyC,CACzC,qCAA0C,CAC1C,qCAA0C,CAC1C,qCACF,CAEA,wBACE,yBACF,CAEA,SASE,yBAA0B,CAH1B,8BAA+B,CAC/B,qCAAsC,CACtC,iBAAkB,CAJlB,QAAS,CAHT,gBAAmB,CAInB,YAKF,CAEA,wBAVE,YAAa,CACb,cAcF,CALA,eAEE,kBAAmB,CACnB,OAEF,CAEA,sBACE,gBACF,CAEA,aAEE,+BAAgC,CADhC,yCAA0C,CAI1C,iBAAkB,CAFlB,wBAAyB,CAGzB,cAAe,CACf,cAAe,CAHf,gBAAiB,CAIjB,wBACF,CAEA,mBACE,oCAAqC,CACrC,0BACF,CAEA,oBACE,oCAAqC,CACrC,yCACF,CAEA,oBACE,gCAAuC,CACvC,aACF,CAEA,eAEE,kBAAmB,CAGnB,yBAA0B,CAJ1B,YAAa,CAGb,cAAe,CADf,OAGF,CAEA,gBACE,8BAA+B,CAE/B,yCAA0C,CAC1C,iBAAkB,CAFlB,wBAAyB,CAGzB,gBACF,CAEA,aACE,QACF,CAEA,eAKE,sBAAuB,CAFvB,WAAY,CAGZ,cAAe,CAJf,WAAY,CAEZ,SAAU,CAHV,UAMF,CAEA,YAGE,kBAAmB,CAEnB,yBAA0B,CAJ1B,YAAa,CAGb,cAAe,CAFf,OAIF,CAEA,aACE,2BAA4B,CAC5B,qCAAsC,CACtC,iBAAkB,CAElB,gBAAiB,CADjB,YAEF,CAEA,gBAGE,wBAAyB,CACzB,cAAe,CACf,eAAgB,CAJhB,gBAAiB,CACjB,YAIF,CAEA,yDAGE,gBACF,CAEA,eAGE,kBAAmB,CAGnB,yBAA0B,CAJ1B,YAAa,CAKb,cAAe,CANf,eAAkB,CAGlB,6BAA8B,CAC9B,kBAGF,CAEA,uCACE,gBACF,CAEA,cACE,YAAa,CACb,QACF,CAEA,gBAGE,2BAA4B,CAC5B,qCAAsC,CACtC,iBAAkB,CAElB,YAAa,CACb,qBAAsB,CAPtB,eAAkB,CAClB,YAAe,CAOf,gBAAiB,CAHjB,YAIF,CAEA,gBAEE,yBAA0B,CAD1B,cAAe,CAEf,kBACF,CAEA,cAOE,gCAAiC,CAEjC,iBAAkB,CAHlB,wBAAyB,CALzB,MAAO,CAEP,4HAC6C,CAC7C,cAAe,CAHf,QAAS,CAQT,aAAc,CAFd,YAGF,CAEA,0BACE,aACE,yBACF,CAEA,gBAEE,aACF,CAEA,+BAJE,gBAMF,CACF","file":"index.css","sourcesContent":["\r\n\r\n.app-shell {\r\n min-height: 100vh;\r\n display: flex;\r\n flex-direction: column;\r\n background: radial-gradient(circle at top, rgba(99, 102, 241, 0.12), transparent 45%),\r\n #0b0f19;\r\n}\r\n\r\n.app-header {\r\n padding: 24px 32px 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n\r\n.app-title {\r\n font-size: 24px;\r\n font-weight: 600;\r\n}\r\n\r\n.app-subtitle {\r\n font-size: 14px;\r\n color: rgba(226, 232, 240, 0.68);\r\n}\r\n\r\n.app-main {\r\n flex: 1;\r\n padding: 0 32px 32px;\r\n}\r\n\r\n.editor-root {\r\n --editor-bg: rgba(15, 23, 42, 0.78);\r\n --editor-panel: rgba(15, 23, 42, 0.85);\r\n --editor-border: rgba(148, 163, 184, 0.12);\r\n --editor-text: #f8fafc;\r\n --editor-muted: rgba(226, 232, 240, 0.65);\r\n --editor-btn-bg: rgba(30, 41, 59, 0.65);\r\n --editor-btn-border: rgba(148, 163, 184, 0.2);\r\n --editor-btn-hover: rgba(99, 102, 241, 0.7);\r\n --editor-code-bg: rgba(2, 6, 23, 0.8);\r\n display: grid;\r\n grid-template-columns: 1.35fr 0.65fr;\r\n gap: 16px;\r\n}\r\n\r\n.editor-root.theme-light {\r\n --editor-bg: rgba(255, 255, 255, 0.9);\r\n --editor-panel: rgba(248, 250, 252, 0.95);\r\n --editor-border: rgba(15, 23, 42, 0.12);\r\n --editor-text: #0f172a;\r\n --editor-muted: rgba(15, 23, 42, 0.6);\r\n --editor-btn-bg: rgba(255, 255, 255, 0.9);\r\n --editor-btn-border: rgba(15, 23, 42, 0.2);\r\n --editor-btn-hover: rgba(79, 70, 229, 0.7);\r\n --editor-code-bg: rgba(226, 232, 240, 0.8);\r\n}\r\n\r\n.editor-root.no-preview {\r\n grid-template-columns: 1fr;\r\n}\r\n\r\n.toolbar {\r\n grid-column: 1 / -1;\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n padding: 10px;\r\n background: var(--editor-panel);\r\n border: 1px solid var(--editor-border);\r\n border-radius: 2px;\r\n backdrop-filter: blur(8px);\r\n}\r\n\r\n.toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.toolbar-group.toggle {\r\n margin-left: auto;\r\n}\r\n\r\n.toolbar-btn {\r\n border: 1px solid var(--editor-btn-border);\r\n background: var(--editor-btn-bg);\r\n color: var(--editor-text);\r\n padding: 8px 12px;\r\n border-radius: 2px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n transition: all 0.15s ease;\r\n}\r\n\r\n.toolbar-btn:hover {\r\n border-color: var(--editor-btn-hover);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.toolbar-btn.active {\r\n border-color: var(--editor-btn-hover);\r\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.18);\r\n}\r\n\r\n.toolbar-btn.danger {\r\n border-color: rgba(248, 113, 113, 0.45);\r\n color: #fecaca;\r\n}\r\n\r\n.toolbar-label {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n color: var(--editor-muted);\r\n}\r\n\r\n.toolbar-select {\r\n background: var(--editor-panel);\r\n color: var(--editor-text);\r\n border: 1px solid var(--editor-btn-border);\r\n border-radius: 2px;\r\n padding: 6px 10px;\r\n}\r\n\r\n.color-label {\r\n gap: 10px;\r\n}\r\n\r\n.toolbar-color {\r\n width: 34px;\r\n height: 30px;\r\n border: none;\r\n padding: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n}\r\n\r\n.toggle-row {\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n font-size: 12px;\r\n color: var(--editor-muted);\r\n}\r\n\r\n.editor-area {\r\n background: var(--editor-bg);\r\n border: 1px solid var(--editor-border);\r\n border-radius: 2px;\r\n padding: 10px;\r\n min-height: 520px;\r\n}\r\n\r\n.editor-surface {\r\n min-height: 460px;\r\n outline: none;\r\n color: var(--editor-text);\r\n font-size: 16px;\r\n line-height: 1.7;\r\n}\r\n\r\n.editor-surface h1,\r\n.editor-surface h2,\r\n.editor-surface h3 {\r\n margin-top: 1.4em;\r\n}\r\n\r\n.editor-footer {\r\n grid-column: 1 / 2;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 6px 0;\r\n color: var(--editor-muted);\r\n font-size: 12px;\r\n}\r\n\r\n.editor-root.no-preview .editor-footer {\r\n grid-column: 1 / -1;\r\n}\r\n\r\n.footer-stats {\r\n display: flex;\r\n gap: 16px;\r\n}\r\n\r\n.editor-preview {\r\n grid-column: 2 / 3;\r\n grid-row: 2 / 4;\r\n background: var(--editor-bg);\r\n border: 1px solid var(--editor-border);\r\n border-radius: 2px;\r\n padding: 16px;\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 520px;\r\n}\r\n\r\n.preview-header {\r\n font-size: 13px;\r\n color: var(--editor-muted);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.preview-code {\r\n flex: 1;\r\n margin: 0;\r\n font-family: \"JetBrains Mono\", \"Fira Code\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\r\n \"Liberation Mono\", \"Courier New\", monospace;\r\n font-size: 12px;\r\n color: var(--editor-text);\r\n background: var(--editor-code-bg);\r\n padding: 12px;\r\n border-radius: 2px;\r\n overflow: auto;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n .editor-root {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .editor-preview {\r\n grid-column: 1 / -1;\r\n grid-row: auto;\r\n }\r\n\r\n .editor-footer {\r\n grid-column: 1 / -1;\r\n }\r\n}\r\n"]}
|