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 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&#039;");
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
- }, activeCommands.length > 0 && /*#__PURE__*/React.createElement("div", {
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))), (showHeading || showFontSize || showColor) && /*#__PURE__*/React.createElement("div", {
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
- }, "Heading", /*#__PURE__*/React.createElement("select", {
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"))), showFontSize && /*#__PURE__*/React.createElement("label", {
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"))), showColor && /*#__PURE__*/React.createElement("label", {
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
- }, "Color", /*#__PURE__*/React.createElement("input", {
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
- }))), (showLink || showUndoRedo || showClear) && /*#__PURE__*/React.createElement("div", {
233
- className: "toolbar-group"
234
- }, showLink && /*#__PURE__*/React.createElement("button", {
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: insertLink
238
- }, "Link"), showUndoRedo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
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: () => exec("undo")
242
- }, "Undo"), /*#__PURE__*/React.createElement("button", {
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: () => exec("redo")
246
- }, "Redo")), showClear && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
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"))), showPlainPaste && /*#__PURE__*/React.createElement("div", {
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("div", {
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
- module.exports = Editor;
551
+ exports.CodeBlock = CodeBlock;
552
+ exports.default = Editor;
296
553
  //# sourceMappingURL=index.cjs.map
@@ -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, \"&amp;\")\r\n\t\t\t.replace(/</g, \"&lt;\")\r\n\t\t\t.replace(/>/g, \"&gt;\")\r\n\t\t\t.replace(/\\\"/g, \"&quot;\")\r\n\t\t\t.replace(/'/g, \"&#039;\");\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, useMemo, useCallback, useEffect } from 'react';
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&#039;");
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
- }, activeCommands.length > 0 && /*#__PURE__*/React.createElement("div", {
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))), (showHeading || showFontSize || showColor) && /*#__PURE__*/React.createElement("div", {
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
- }, "Heading", /*#__PURE__*/React.createElement("select", {
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"))), showFontSize && /*#__PURE__*/React.createElement("label", {
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"))), showColor && /*#__PURE__*/React.createElement("label", {
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
- }, "Color", /*#__PURE__*/React.createElement("input", {
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
- }))), (showLink || showUndoRedo || showClear) && /*#__PURE__*/React.createElement("div", {
231
- className: "toolbar-group"
232
- }, showLink && /*#__PURE__*/React.createElement("button", {
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: insertLink
236
- }, "Link"), showUndoRedo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
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: () => exec("undo")
240
- }, "Undo"), /*#__PURE__*/React.createElement("button", {
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: () => exec("redo")
244
- }, "Redo")), showClear && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
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"))), showPlainPaste && /*#__PURE__*/React.createElement("div", {
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("div", {
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
@@ -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":";;AAYA,MAAMA,QAAQ,GAAG,CAChB;AAAEC,EAAAA,GAAG,EAAE,MAAM;AAAEC,EAAAA,KAAK,EAAE,MAAM;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACzC;AAAEF,EAAAA,GAAG,EAAE,QAAQ;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAC7C;AAAEF,EAAAA,GAAG,EAAE,WAAW;AAAEC,EAAAA,KAAK,EAAE,WAAW;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACnD;AAAEF,EAAAA,GAAG,EAAE,eAAe;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACpD;AAAEF,EAAAA,GAAG,EAAE,qBAAqB;AAAEC,EAAAA,KAAK,EAAE,SAAS;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAC3D;AAAEF,EAAAA,GAAG,EAAE,mBAAmB;AAAEC,EAAAA,KAAK,EAAE,UAAU;AAAEC,EAAAA,IAAI,EAAE;AAAK,CAAC,EAC3D;AAAEF,EAAAA,GAAG,EAAE,aAAa;AAAEC,EAAAA,KAAK,EAAE,MAAM;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EAChD;AAAEF,EAAAA,GAAG,EAAE,eAAe;AAAEC,EAAAA,KAAK,EAAE,QAAQ;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,EACpD;AAAEF,EAAAA,GAAG,EAAE,cAAc;AAAEC,EAAAA,KAAK,EAAE,OAAO;AAAEC,EAAAA,IAAI,EAAE;AAAI,CAAC,CAClD;AAEc,SAASC,MAAMA,CAAC;AAC9BC,EAAAA,KAAK,GAAG,MAAM;EACdC,KAAK,GAAGN,QAAQ,CAACO,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACP,GAAG,CAAC;AACxCQ,EAAAA,WAAW,GAAG,IAAI;AAClBC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,QAAQ,GAAG,IAAI;AACfC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,cAAc,GAAG,IAAI;AACrBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,YAAY,GAAG,IAAI;EACnBC,QAAQ,GAAGA,MAAM,CAAC;AACnB,CAAC,EAAE;AACF,EAAA,MAAMC,SAAS,GAAGC,MAAM,CAAC,IAAI,CAAC;EAC9B,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGC,QAAQ,CAAC,EAAE,CAAC;EACpC,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGF,QAAQ,CAAC,IAAI,CAAC;EAClD,MAAM,CAACG,aAAa,EAAEC,gBAAgB,CAAC,GAAGJ,QAAQ,CAAC,EAAE,CAAC;EACtD,MAAM,CAACK,OAAO,EAAEC,UAAU,CAAC,GAAGN,QAAQ,CAAC,GAAG,CAAC;EAC3C,MAAM,CAACO,QAAQ,EAAEC,WAAW,CAAC,GAAGR,QAAQ,CAAC,IAAI,CAAC;EAC9C,MAAM,CAACS,SAAS,EAAEC,YAAY,CAAC,GAAGV,QAAQ,CAAC,SAAS,CAAC;EACrD,MAAM,CAACW,aAAa,EAAEC,gBAAgB,CAAC,GAAGZ,QAAQ,CAAC,EAAE,CAAC;;AAEtD;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAA,MAAMa,KAAK,GAAGC,OAAO,CAAC,MAAM;IAC3B,MAAMC,IAAI,GAAGnB,SAAS,CAACoB,OAAO,EAAEC,SAAS,IAAI,EAAE;IAC/C,MAAMC,KAAK,GAAGH,IAAI,CAACI,IAAI,EAAE,GAAGJ,IAAI,CAACI,IAAI,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC,CAACC,MAAM,GAAG,CAAC;IAC/D,OAAO;MACNH,KAAK;MACLI,KAAK,EAAEP,IAAI,CAACM;KACZ;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,IAAI,GAAGA,CAAC9C,GAAG,EAAE+C,KAAK,GAAG,IAAI,KAAK;AACnC5B,IAAAA,SAAS,CAACoB,OAAO,EAAES,KAAK,EAAE;IAC1BC,QAAQ,CAACC,WAAW,CAAClD,GAAG,EAAE,KAAK,EAAE+C,KAAK,CAAC;IACvC,MAAMI,QAAQ,GAAGhC,SAAS,CAACoB,OAAO,EAAEa,SAAS,IAAI,EAAE;IACnD9B,OAAO,CAAC6B,QAAQ,CAAC;AACjBjC,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAE8B,QAAQ;AAAEb,MAAAA,IAAI,EAAEnB,SAAS,CAACoB,OAAO,EAAEC,SAAS,IAAI;AAAG,KAAC,CAAC;AACtEa,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMC,YAAY,GAAIC,IAAI,IAAK;IAC9B1B,UAAU,CAAC0B,IAAI,CAAC;IAChB,IAAIA,IAAI,KAAK,GAAG,EAAE;AACjBT,MAAAA,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;AACxB,MAAA;AACD,IAAA;IACAA,IAAI,CAAC,aAAa,EAAES,IAAI,CAACC,WAAW,EAAE,CAAC;EACxC,CAAC;EAED,MAAMC,aAAa,GAAIF,IAAI,IAAK;IAC/BxB,WAAW,CAACwB,IAAI,CAAC;AACjBT,IAAAA,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;IACrB,MAAMY,YAAY,GAAGvC,SAAS,CAACoB,OAAO,EAAEoB,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAChFD,IAAAA,YAAY,CAACE,OAAO,CAAEC,EAAE,IAAK;AAC5BA,MAAAA,EAAE,CAACC,eAAe,CAAC,MAAM,CAAC;AAC1BD,MAAAA,EAAE,CAACE,KAAK,CAACjC,QAAQ,GAAG,CAAA,EAAGyB,IAAI,CAAA,EAAA,CAAI;AAChC,IAAA,CAAC,CAAC;IACFjC,OAAO,CAACH,SAAS,CAACoB,OAAO,EAAEa,SAAS,IAAI,EAAE,CAAC;AAC3CC,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMW,cAAc,GAAIT,IAAI,IAAK;IAChCtB,YAAY,CAACsB,IAAI,CAAC;AAClBT,IAAAA,IAAI,CAAC,WAAW,EAAES,IAAI,CAAC;EACxB,CAAC;EAED,MAAMU,UAAU,GAAGA,MAAM;IACxB,MAAMC,GAAG,GAAGC,MAAM,CAACC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;IAClD,IAAI,CAACF,GAAG,EAAE;AACVpB,IAAAA,IAAI,CAAC,YAAY,EAAEoB,GAAG,CAAC;EACxB,CAAC;AAED,EAAA,MAAMG,YAAY,GAAGA,MAAMvB,IAAI,CAAC,cAAc,CAAC;EAE/C,MAAMwB,QAAQ,GAAGA,MAAM;AACtB,IAAA,IAAI,CAACnD,SAAS,CAACoB,OAAO,EAAE;AACxBpB,IAAAA,SAAS,CAACoB,OAAO,CAACa,SAAS,GAAG,SAAS;AACvC9B,IAAAA,OAAO,CAACH,SAAS,CAACoB,OAAO,CAACa,SAAS,CAAC;AACpClC,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAEF,SAAS,CAACoB,OAAO,CAACa,SAAS;AAAEd,MAAAA,IAAI,EAAEnB,SAAS,CAACoB,OAAO,CAACC,SAAS,IAAI;AAAG,KAAC,CAAC;AACxFa,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMkB,OAAO,GAAGA,MAAM;IACrB,MAAMpB,QAAQ,GAAGhC,SAAS,CAACoB,OAAO,EAAEa,SAAS,IAAI,EAAE;IACnD9B,OAAO,CAAC6B,QAAQ,CAAC;AACjBjC,IAAAA,QAAQ,CAAC;AAAEG,MAAAA,IAAI,EAAE8B,QAAQ;AAAEb,MAAAA,IAAI,EAAEnB,SAAS,CAACoB,OAAO,EAAEC,SAAS,IAAI;AAAG,KAAC,CAAC;AACtEa,IAAAA,kBAAkB,EAAE;EACrB,CAAC;EAED,MAAMmB,OAAO,GAAIC,KAAK,IAAK;IAC1B,IAAI,CAACjD,UAAU,EAAE;IACjBiD,KAAK,CAACC,cAAc,EAAE;IACtB,MAAMpC,IAAI,GAAGmC,KAAK,CAACE,aAAa,CAACC,OAAO,CAAC,YAAY,CAAC;IACtD3B,QAAQ,CAACC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAEZ,IAAI,CAAC;EAChD,CAAC;AAED,EAAA,MAAMe,kBAAkB,GAAGwB,WAAW,CAAC,MAAM;AAC5C,IAAA,MAAMC,SAAS,GAAG7B,QAAQ,CAAC8B,YAAY,EAAE;AACzC,IAAA,IAAI,CAACD,SAAS,IAAIA,SAAS,CAACE,UAAU,KAAK,CAAC,IAAI,CAAC7D,SAAS,CAACoB,OAAO,EAAE;AACpE,IAAA,MAAM0C,UAAU,GAAGH,SAAS,CAACG,UAAU;IACvC,MAAMC,cAAc,GAAGD,UAAU,IAAI9D,SAAS,CAACoB,OAAO,CAAC4C,QAAQ,CAACF,UAAU,CAAC;IAC3E,IAAI,CAACC,cAAc,EAAE;MACpBvD,gBAAgB,CAAC,EAAE,CAAC;MACpBQ,gBAAgB,CAAC,EAAE,CAAC;AACpB,MAAA;AACD,IAAA;AACAR,IAAAA,gBAAgB,CAACmD,SAAS,CAACM,QAAQ,EAAE,CAAC;IACtC,MAAMC,UAAU,GAAG,EAAE;AACrBtF,IAAAA,QAAQ,CAAC6D,OAAO,CAAErD,IAAI,IAAK;MAC1B,IAAI;AACH8E,QAAAA,UAAU,CAAC9E,IAAI,CAACP,GAAG,CAAC,GAAGiD,QAAQ,CAACqC,iBAAiB,CAAC/E,IAAI,CAACP,GAAG,CAAC;AAC5D,MAAA,CAAC,CAAC,MAAM;AACPqF,QAAAA,UAAU,CAAC9E,IAAI,CAACP,GAAG,CAAC,GAAG,KAAK;AAC7B,MAAA;AACD,IAAA,CAAC,CAAC;IACFmC,gBAAgB,CAACkD,UAAU,CAAC;EAC7B,CAAC,EAAE,EAAE,CAAC;AAENE,EAAAA,SAAS,CAAC,MAAM;AACftC,IAAAA,QAAQ,CAACuC,gBAAgB,CAAC,iBAAiB,EAAEnC,kBAAkB,CAAC;IAChE,OAAO,MAAMJ,QAAQ,CAACwC,mBAAmB,CAAC,iBAAiB,EAAEpC,kBAAkB,CAAC;AACjF,EAAA,CAAC,EAAE,CAACA,kBAAkB,CAAC,CAAC;AAExB,EAAA,MAAMqC,UAAU,GAAG,YAAY;IAC9B,MAAMC,OAAO,GAAGxE,SAAS,CAACoB,OAAO,EAAEa,SAAS,IAAI,EAAE;AAClD,IAAA,MAAMwC,SAAS,CAACC,SAAS,CAACC,SAAS,CAACH,OAAO,CAAC;IAC5CI,KAAK,CAAC,2BAA2B,CAAC;EACnC,CAAC;EAED,MAAMC,cAAc,GAAG3D,OAAO,CAC7B,MAAMtC,QAAQ,CAACkG,MAAM,CAAE1F,IAAI,IAAKF,KAAK,CAAC6F,QAAQ,CAAC3F,IAAI,CAACP,GAAG,CAAC,CAAC,EACzD,CAACK,KAAK,CACP,CAAC;EAED,oBACC8F,KAAA,CAAAC,aAAA,CAAA,SAAA,EAAA;IACCC,SAAS,EAAE,qBAAqBjG,KAAK,CAAA,EAAGW,YAAY,GAAG,EAAE,GAAG,aAAa,CAAA,CAAG;IAC5E,YAAA,EAAYX;GAAM,eAElB+F,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAS,EACtBL,cAAc,CAACpD,MAAM,GAAG,CAAC,iBACzBuD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAe,EAC5BL,cAAc,CAAC1F,GAAG,CAAEC,IAAI,iBACxB4F,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;IACCE,GAAG,EAAE/F,IAAI,CAACP,GAAI;AACduG,IAAAA,IAAI,EAAC,QAAQ;AACbF,IAAAA,SAAS,EAAE,CAAA,WAAA,EAAcnE,aAAa,CAAC3B,IAAI,CAACP,GAAG,CAAC,GAAG,SAAS,GAAG,EAAE,CAAA,CAAG;AACpEwG,IAAAA,WAAW,EAAG/B,KAAK,IAAKA,KAAK,CAACC,cAAc,EAAG;IAC/C+B,OAAO,EAAEA,MAAM3D,IAAI,CAACvC,IAAI,CAACP,GAAG,CAAE;IAC9B0G,KAAK,EAAEnG,IAAI,CAACN,KAAM;AAClB,IAAA,cAAA,EAAciC,aAAa,CAAC3B,IAAI,CAACP,GAAG,CAAC,IAAI;AAAM,GAAA,EAE9CO,IAAI,CAACL,IACC,CACR,CACG,CACL,EACA,CAACM,WAAW,IAAIC,YAAY,IAAIK,SAAS,kBACzCqF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC5B7F,WAAW,iBACX2F,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAC,SAEhC,eAAAF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACCrD,IAAAA,KAAK,EAAEnB,OAAQ;IACfV,QAAQ,EAAGuD,KAAK,IAAKnB,YAAY,CAACmB,KAAK,CAACkC,MAAM,CAAC5D,KAAK,CAAE;AACtDsD,IAAAA,SAAS,EAAC;GAAgB,eAE1BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAG,GAAA,EAAC,WAAiB,CAAC,eACpCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,WAAiB,CAAC,eACrCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,WAAiB,CAAC,eACrCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;GAAI,EAAC,WAAiB,CAC7B,CACF,CACP,EACAtC,YAAY,iBACZ0F,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAC,MAEhC,eAAAF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACCrD,IAAAA,KAAK,EAAEjB,QAAS;IAChBZ,QAAQ,EAAGuD,KAAK,IAAKhB,aAAa,CAACgB,KAAK,CAACkC,MAAM,CAAC5D,KAAK,CAAE;AACvDsD,IAAAA,SAAS,EAAC;GAAgB,eAE1BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;AAAI,GAAA,EAAC,MAAY,CAAC,eAChCoD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQrD,IAAAA,KAAK,EAAC;GAAI,EAAC,MAAY,CACxB,CACF,CACP,EACAjC,SAAS,iBACTqF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAA2B,GAAA,EAAC,OAE5C,eAAAF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AACCG,IAAAA,IAAI,EAAC,OAAO;AACZF,IAAAA,SAAS,EAAC,eAAe;AACzBtD,IAAAA,KAAK,EAAEf,SAAU;IACjBd,QAAQ,EAAGuD,KAAK,IAAKT,cAAc,CAACS,KAAK,CAACkC,MAAM,CAAC5D,KAAK,CAAE;IACxD,YAAA,EAAW;AAAY,GACvB,CACK,CAEJ,CACL,EACA,CAACrC,QAAQ,IAAIC,YAAY,IAAIC,SAAS,kBACtCuF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC5B3F,QAAQ,iBACRyF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAExC;AAAW,GAAA,EAAC,MAE3D,CACR,EACAtD,YAAY,iBACZwF,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAAS,QAAA,EAAA,IAAA,eACCT,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEA,MAAM3D,IAAI,CAAC,MAAM;AAAE,GAAA,EAAC,MAEnE,CAAC,eACTqD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEA,MAAM3D,IAAI,CAAC,MAAM;AAAE,GAAA,EAAC,MAEnE,CACP,CACF,EACAlC,SAAS,iBACTuF,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAAS,QAAA,EAAA,IAAA,eACCT,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEpC;AAAa,GAAA,EAAC,cAE7D,CAAC,eACT8B,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,oBAAoB;AAACI,IAAAA,OAAO,EAAEnC;GAAS,EAAC,WAEhE,CACP,CAEC,CACL,EACAzD,cAAc,iBACdsF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAsB,eACpCF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;GAAY,eAC5BF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AACCG,IAAAA,IAAI,EAAC,UAAU;AACfM,IAAAA,OAAO,EAAErF,UAAW;IACpBN,QAAQ,EAAGuD,KAAK,IAAKhD,aAAa,CAACgD,KAAK,CAACkC,MAAM,CAACE,OAAO;GACvD,CAAC,uBAEI,CACH,CAEF,CAAC,eAENV,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAa,eAC3BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AACCU,IAAAA,GAAG,EAAE3F,SAAU;AACfkF,IAAAA,SAAS,EAAC,gBAAgB;IAC1BU,eAAe,EAAA,IAAA;AACfxC,IAAAA,OAAO,EAAEA,OAAQ;AACjBC,IAAAA,OAAO,EAAEA,OAAQ;AACjBwC,IAAAA,OAAO,EAAE3D,kBAAmB;AAC5B4D,IAAAA,SAAS,EAAE5D,kBAAmB;IAC9B6D,8BAA8B,EAAA,IAAA;IAC9BC,UAAU,EAAA;GACV,CACG,CAAC,EAEL,CAACnG,SAAS,IAAIC,YAAY,kBAC1BkF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC/BrF,SAAS,iBACTmF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAc,GAAA,eAC5BF,KAAA,CAAAC,aAAA,eAAOhE,KAAK,CAACK,KAAK,EAAC,QAAY,CAAC,eAChC0D,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAOhE,KAAK,CAACS,KAAK,EAAC,aAAiB,CAAC,eACrCsD,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAO1E,aAAa,GAAG,CAAA,EAAGA,aAAa,CAACkB,MAAM,WAAW,GAAG,cAAqB,CAC7E,CACL,EACA3B,YAAY,iBACZkF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAgB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQG,IAAAA,IAAI,EAAC,QAAQ;AAACF,IAAAA,SAAS,EAAC,aAAa;AAACI,IAAAA,OAAO,EAAEf;GAAW,EAAC,WAE3D,CACJ,CAEC,CACR,EAEA3E,YAAY,iBACZoF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;GAAgB,eAChCF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAgB,GAAA,EAAC,WAAc,CAAC,eAC/CF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAc,EAAEhF,IAAU,CACnC,CAEA,CAAC;AAEZ;;ACjUA;;;;"}
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, \"&amp;\")\r\n\t\t\t.replace(/</g, \"&lt;\")\r\n\t\t\t.replace(/>/g, \"&gt;\")\r\n\t\t\t.replace(/\\\"/g, \"&quot;\")\r\n\t\t\t.replace(/'/g, \"&#039;\");\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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trotl-texteditor",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Texteditor table UI",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
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 */
@@ -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"]}