@meenainwal/rich-text-editor 1.0.0 โ 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ReadME.md +43 -21
- package/dist/rich-text-editor.css +1 -1
- package/dist/test-editor.cjs +2 -3
- package/dist/test-editor.mjs +339 -121
- package/package.json +1 -1
- package/dist/test-editor.cjs.map +0 -1
- package/dist/test-editor.mjs.map +0 -1
package/ReadME.md
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @meenainwal/rich-text-editor ๐
|
|
2
2
|
|
|
3
|
-
A lightweight, framework-agnostic
|
|
3
|
+
A premium, ultra-lightweight, framework-agnostic rich text editor built entirely with Vanilla TypeScript. Featuring a sophisticated **Slate & Indigo** design system, it provides a flawless writing experience out-of-the-box.
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
|
|
7
|
-
## โจ
|
|
7
|
+
## โจ Why Choose This Editor? (Pros & Cons)
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
9
|
+
### ๐ Pros
|
|
10
|
+
- **Zero Dependencies**: Pure Vanilla JS/TypeScript. No bloated third-party libraries.
|
|
11
|
+
- **Microscopic Footprint**: Only **~25kB** compressed (Gzipped), meaning zero impact on your site's load time.
|
|
12
|
+
- **Framework Agnostic**: Drop it into React, Vue, Angular, Svelte, or plain HTML projects seamlessly.
|
|
13
|
+
- **Auto-Formatting Magic**: Intelligently parses pasted HTML strings automatically into perfectly formatted rich text.
|
|
14
|
+
- **Beautiful UI**: Modern aesthetics curated with a polished Slate & Indigo color palette, smooth transitions, and dynamic SVG icons.
|
|
15
|
+
- **Local Image Uploads**: Natively integrates with the OS file picker for rapid inline base64 image insertions.
|
|
16
|
+
- **Flexible Styling**: Full control over font families, complex line heights, text colors, and highlighting.
|
|
17
|
+
|
|
18
|
+
### ๐ Cons (Current Limitations)
|
|
19
|
+
- Base64 image storage can increase the raw output string size for very large images (Backend S3 uploading adapter coming soon).
|
|
20
|
+
- Lacks advanced table grid manipulations in the current version.
|
|
21
|
+
- Markdown shortcut typing (e.g., typing `#` for H1) is not natively supported yet.
|
|
22
|
+
|
|
23
|
+
---
|
|
15
24
|
|
|
16
25
|
## ๐ฆ Installation
|
|
17
26
|
|
|
@@ -21,11 +30,11 @@ npm install @meenainwal/rich-text-editor
|
|
|
21
30
|
|
|
22
31
|
## ๐ Quick Start
|
|
23
32
|
|
|
24
|
-
### Basic Usage
|
|
33
|
+
### Basic Usage (Vanilla JS)
|
|
25
34
|
|
|
26
35
|
```javascript
|
|
27
36
|
import { CoreEditor } from '@meenainwal/rich-text-editor';
|
|
28
|
-
import '@meenainwal/rich-text-editor/dist/
|
|
37
|
+
import '@meenainwal/rich-text-editor/dist/rich-text-editor.css'; // Import the CSS!
|
|
29
38
|
|
|
30
39
|
const container = document.getElementById('editor');
|
|
31
40
|
const editor = new CoreEditor(container, {
|
|
@@ -33,8 +42,8 @@ const editor = new CoreEditor(container, {
|
|
|
33
42
|
autofocus: true
|
|
34
43
|
});
|
|
35
44
|
|
|
36
|
-
//
|
|
37
|
-
const
|
|
45
|
+
// To extract the customized HTML:
|
|
46
|
+
const htmlOutput = editor.getHTML();
|
|
38
47
|
```
|
|
39
48
|
|
|
40
49
|
### In React
|
|
@@ -42,7 +51,7 @@ const content = editor.getHTML();
|
|
|
42
51
|
```tsx
|
|
43
52
|
import { useEffect, useRef } from 'react';
|
|
44
53
|
import { CoreEditor } from '@meenainwal/rich-text-editor';
|
|
45
|
-
import '@meenainwal/rich-text-editor/dist/
|
|
54
|
+
import '@meenainwal/rich-text-editor/dist/rich-text-editor.css';
|
|
46
55
|
|
|
47
56
|
export const EditorComponent = () => {
|
|
48
57
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
@@ -57,20 +66,33 @@ export const EditorComponent = () => {
|
|
|
57
66
|
};
|
|
58
67
|
```
|
|
59
68
|
|
|
60
|
-
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## ๐บ๏ธ Future Roadmap & Upcoming Updates
|
|
72
|
+
|
|
73
|
+
As the project manager, we are aggressively expanding this editor. Next releases will feature:
|
|
74
|
+
|
|
75
|
+
1. **Phase 2.1 - Markdown Power:** Seamless markdown shortcuts (typing `**bold**`, `## Header`) that auto-convert to rich text instantly.
|
|
76
|
+
2. **Phase 2.2 - Table Support:** An interactive grid UI to insert, resize, and style complex HTML tables.
|
|
77
|
+
3. **Phase 2.3 - Framework Wrappers:** Official, first-party wrapper components for `<ReactEditor />` and `<VueEditor />` for even faster plug-and-play.
|
|
78
|
+
4. **Phase 2.4 - Advanced Image Handlers:** Providing hooks to intercept image uploads and pipe them to external buckets (AWS S3, Cloudinary) to return URLs instead of raw base64.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## โ๏ธ Configuration Options
|
|
61
83
|
|
|
62
84
|
| Option | Type | Default | Description |
|
|
63
85
|
| :--- | :--- | :--- | :--- |
|
|
64
86
|
| `placeholder` | `string` | `undefined` | The placeholder text when the editor is empty. |
|
|
65
|
-
| `autofocus` | `boolean` | `false` | Whether to focus the editor on initialization. |
|
|
87
|
+
| `autofocus` | `boolean` | `false` | Whether to focus the editor automatically on initialization. |
|
|
66
88
|
|
|
67
89
|
## ๐ API Methods
|
|
68
90
|
|
|
69
91
|
- `getHTML()`: Returns the content as a sanitized HTML string.
|
|
70
|
-
- `setHTML(html)`:
|
|
71
|
-
- `focus()`:
|
|
72
|
-
- `execute(command, value)`: Execute standard editor commands.
|
|
92
|
+
- `setHTML(html)`: Programmatically sets the editor content.
|
|
93
|
+
- `focus()`: Forces focus onto the editor.
|
|
94
|
+
- `execute(command, value)`: Execute standard editor commands internally.
|
|
73
95
|
|
|
74
96
|
## ๐ License
|
|
75
97
|
|
|
76
|
-
MIT ยฉ [Anuj Nainwal](https://github.com/
|
|
98
|
+
MIT ยฉ [Anuj Nainwal](https://github.com/meenainwal)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--te-primary-color: #6366f1;--te-primary-hover: #4f46e5;--te-bg-app: #f8fafc;--te-bg-editor: #ffffff;--te-toolbar-bg: #ffffff;--te-border-color: #e2e8f0;--te-border-focus: #cbd5e1;--te-text-main: #1e293b;--te-text-muted: #64748b;--te-placeholder: #94a3b8;--te-btn-hover: #f1f5f9;--te-btn-active: #e2e8f0;--te-radius-lg: 12px;--te-radius-md: 8px;--te-radius-sm: 6px;--te-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--te-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--te-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--te-transition: all .2s cubic-bezier(.4, 0, .2, 1)}.te-container{display:flex;flex-direction:column;height:500px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-lg);background:var(--te-bg-editor);box-shadow:var(--te-shadow-sm);overflow:hidden;font-family:Inter,-apple-system,system-ui,sans-serif;color:var(--te-text-main);transition:var(--te-transition);max-width:100%}.te-container:focus-within{border-color:var(--te-primary-color);box-shadow:0 0 0 4px #6366f11a,var(--te-shadow-md)}.te-toolbar{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;border-bottom:1px solid var(--te-border-color);background:var(--te-toolbar-bg);align-items:center;-webkit-user-select:none;user-select:none;position:sticky;top:0;z-index:10}.te-divider{width:1px;height:20px;background-color:var(--te-border-color);margin:0 6px}.te-button,.te-select,.te-input{display:flex;align-items:center;justify-content:center;height:32px;border:1px solid transparent;background:transparent;border-radius:var(--te-radius-sm);cursor:pointer;color:var(--te-text-muted);font-size:13px;font-weight:500;transition:var(--te-transition);box-sizing:border-box}.te-button{width:32px;padding:0}.te-button svg{width:16px;height:16px;stroke:currentColor;stroke-width:2.2;fill:none}.te-select{padding:0 24px 0 8px;min-width:120px;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2.5' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 6px center;background-size:12px;border:1px solid var(--te-border-color);background-color:#fff}.te-input{width:56px;padding:0 4px;text-align:center;cursor:text;border:1px solid var(--te-border-color);background-color:#fff}.te-color-picker{width:32px;height:32px;padding:4px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-sm);background:#fff;cursor:pointer;box-sizing:border-box}.te-color-picker:hover{border-color:var(--te-border-focus)}.te-emoji-picker{position:absolute;width:280px;height:320px;background:#fff;border:1px solid var(--te-border-color);border-radius:var(--te-radius-md);box-shadow:var(--te-shadow-lg);display:flex;flex-direction:column;z-index:1000;animation:te-fade-in .2s ease-out}@keyframes te-fade-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.te-emoji-header{padding:12px;border-bottom:1px solid var(--te-border-color)}.te-emoji-search{width:100%;padding:8px 12px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-sm);font-size:13px;outline:none;transition:var(--te-transition)}.te-emoji-search:focus{border-color:var(--te-primary-color);box-shadow:0 0 0 2px #6366f11a}.te-emoji-body{flex:1;overflow-y:auto;padding:8px}.te-emoji-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.te-emoji-category-title{grid-column:span 7;padding:8px 4px 4px;font-size:11px;font-weight:600;color:var(--te-text-muted);text-transform:uppercase;letter-spacing:.05em}.te-emoji-item{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:20px;border:none;background:transparent;cursor:pointer;border-radius:var(--te-radius-sm);transition:var(--te-transition)}.te-emoji-item:hover{background:var(--te-btn-hover);transform:scale(1.1)}.te-emoji-empty{grid-column:span 7;text-align:center;padding:20px;color:var(--te-text-muted);font-size:13px}.te-button:hover{background:var(--te-btn-hover);color:var(--te-text-main)}.te-select:hover,.te-input:hover{border-color:var(--te-border-focus)}.te-button.active{background:var(--te-btn-active);color:var(--te-primary-color);border-color:#6366f133}.te-select:focus,.te-input:focus{border-color:var(--te-primary-color);box-shadow:0 0 0 2px #6366f11a;outline:none;background:#fff;color:var(--te-text-main)}.te-content{flex:1;overflow-y:auto;min-height:240px;padding:24px;line-height:1.25;outline:none;font-size:16px}.te-content p{margin:0 0 1.25em}.te-content h1,.te-content h2,.te-content h3,.te-content h4,.te-content h5,.te-content h6{color:var(--te-text-main);font-weight:700;margin:1.5em 0 .5em;line-height:1.25}.te-content h1:first-child,.te-content p:first-child{margin-top:0}.te-content h1{font-size:2.25em}.te-content h2{font-size:1.875em}.te-content h3{font-size:1.5em}.te-content h4{font-size:1.25em}.te-content[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--te-placeholder);pointer-events:none}
|
|
1
|
+
:root{--te-primary-color: #6366f1;--te-primary-hover: #4f46e5;--te-bg-app: #f8fafc;--te-bg-editor: #ffffff;--te-toolbar-bg: #ffffff;--te-border-color: #e2e8f0;--te-border-focus: #cbd5e1;--te-text-main: #1e293b;--te-text-muted: #64748b;--te-placeholder: #94a3b8;--te-btn-hover: #f1f5f9;--te-btn-active: #e2e8f0;--te-radius-lg: 12px;--te-radius-md: 8px;--te-radius-sm: 6px;--te-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--te-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--te-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--te-transition: all .2s cubic-bezier(.4, 0, .2, 1)}.te-container{display:flex;flex-direction:column;height:500px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-lg);background:var(--te-bg-editor);box-shadow:var(--te-shadow-sm);overflow:hidden;font-family:Inter,-apple-system,system-ui,sans-serif;color:var(--te-text-main);transition:var(--te-transition);max-width:100%}.te-container:focus-within{border-color:var(--te-primary-color);box-shadow:0 0 0 4px #6366f11a,var(--te-shadow-md)}.te-toolbar{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;border-bottom:1px solid var(--te-border-color);background:var(--te-toolbar-bg);align-items:center;-webkit-user-select:none;user-select:none;position:sticky;top:0;z-index:10}.te-divider{width:1px;height:20px;background-color:var(--te-border-color);margin:0 6px}.te-button,.te-select,.te-input{display:flex;align-items:center;justify-content:center;height:32px;border:1px solid transparent;background:transparent;border-radius:var(--te-radius-sm);cursor:pointer;color:var(--te-text-muted);font-size:13px;font-weight:500;transition:var(--te-transition);box-sizing:border-box}.te-button{width:32px;padding:0}.te-button svg{width:16px;height:16px;stroke:currentColor;stroke-width:2.2;fill:none}.te-select{padding:0 24px 0 8px;min-width:120px;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2.5' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 6px center;background-size:12px;border:1px solid var(--te-border-color);background-color:#fff}.te-input{width:56px;padding:0 4px;text-align:center;cursor:text;border:1px solid var(--te-border-color);background-color:#fff}.te-color-picker{width:32px;height:32px;padding:4px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-sm);background:#fff;cursor:pointer;box-sizing:border-box}.te-color-picker:hover{border-color:var(--te-border-focus)}.te-color-picker-wrapper{position:relative;display:inline-flex;width:32px;height:32px;border-radius:var(--te-radius-sm);transition:var(--te-transition)}.te-color-picker-wrapper:hover{background:var(--te-btn-hover)}.te-color-picker-input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:2}.te-color-icon{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;z-index:1}.te-color-indicator{position:absolute;bottom:4px;left:6px;right:6px;height:3px;border-radius:2px;box-shadow:0 1px 1px #0000001a}.te-emoji-picker{position:absolute;width:280px;height:320px;background:#fff;border:1px solid var(--te-border-color);border-radius:var(--te-radius-md);box-shadow:var(--te-shadow-lg);display:flex;flex-direction:column;z-index:1000;animation:te-fade-in .2s ease-out}@keyframes te-fade-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.te-emoji-header{padding:12px;border-bottom:1px solid var(--te-border-color)}.te-emoji-search{width:100%;padding:8px 12px;border:1px solid var(--te-border-color);border-radius:var(--te-radius-sm);font-size:13px;outline:none;transition:var(--te-transition)}.te-emoji-search:focus{border-color:var(--te-primary-color);box-shadow:0 0 0 2px #6366f11a}.te-emoji-body{flex:1;overflow-y:auto;padding:8px}.te-emoji-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.te-emoji-category-title{grid-column:span 7;padding:8px 4px 4px;font-size:11px;font-weight:600;color:var(--te-text-muted);text-transform:uppercase;letter-spacing:.05em}.te-emoji-item{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:20px;border:none;background:transparent;cursor:pointer;border-radius:var(--te-radius-sm);transition:var(--te-transition)}.te-emoji-item:hover{background:var(--te-btn-hover);transform:scale(1.1)}.te-emoji-empty{grid-column:span 7;text-align:center;padding:20px;color:var(--te-text-muted);font-size:13px}.te-button:hover{background:var(--te-btn-hover);color:var(--te-text-main)}.te-select:hover,.te-input:hover{border-color:var(--te-border-focus)}.te-button.active{background:var(--te-btn-active);color:var(--te-primary-color);border-color:#6366f133}.te-select:focus,.te-input:focus{border-color:var(--te-primary-color);box-shadow:0 0 0 2px #6366f11a;outline:none;background:#fff;color:var(--te-text-main)}.te-content{flex:1;overflow-y:auto;min-height:240px;padding:24px;line-height:1.25;outline:none;font-size:16px}.te-content p{margin:0 0 1.25em}.te-content h1,.te-content h2,.te-content h3,.te-content h4,.te-content h5,.te-content h6{color:var(--te-text-main);font-weight:700;margin:1.5em 0 .5em;line-height:1.25}.te-content h1:first-child,.te-content p:first-child{margin-top:0}.te-content h1{font-size:2.25em}.te-content h2{font-size:1.875em}.te-content h3{font-size:1.5em}.te-content h4{font-size:1.25em}.te-content[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--te-placeholder);pointer-events:none}.te-image-container{position:relative;display:inline-block;margin:1.5rem 0;max-width:100%;border-radius:var(--te-radius-lg);overflow:visible;transition:box-shadow var(--te-transition-fast);line-height:0}.te-image-container:hover{box-shadow:0 0 0 2px var(--te-primary-color)}.te-image-container.active{box-shadow:0 0 0 2px var(--te-primary-color),var(--te-shadow-lg)}.te-image{display:block;max-width:100%;height:auto;-webkit-user-select:none;user-select:none}.te-image-caption{font-size:.875rem;color:var(--te-text-muted);text-align:center;padding:.75rem;background:var(--te-bg-app);line-height:normal;border-bottom-left-radius:var(--te-radius-lg);border-bottom-right-radius:var(--te-radius-lg)}.te-image-caption:empty:before{content:attr(data-placeholder);color:var(--te-placeholder)}.te-image-resizer{position:absolute;width:10px;height:10px;background:var(--te-primary-color);border:1px solid white;z-index:10;display:none}.te-image-container:hover .te-image-resizer,.te-image-container.active .te-image-resizer{display:block}.te-resizer-top-left{top:-5px;left:-5px;cursor:nwse-resize}.te-resizer-top-right{top:-5px;right:-5px;cursor:nesw-resize}.te-resizer-bottom-left{bottom:-5px;left:-5px;cursor:nesw-resize}.te-resizer-bottom-right{bottom:-5px;right:-5px;cursor:nwse-resize}.te-content.dragover{background:#f0f7ff;outline:2px dashed var(--te-primary-color);outline-offset:-4px}
|
package/dist/test-editor.cjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class g{getSelection(){return window.getSelection()}getRange(){const e=this.getSelection();return!e||e.rangeCount===0?null:e.getRangeAt(0)}saveSelection(){const e=this.getRange();return e?e.cloneRange():null}restoreSelection(e){if(!e)return;const t=this.getSelection();t&&(t.removeAllRanges(),t.addRange(e))}isSelectionInElement(e){const t=this.getRange();return t?e.contains(t.commonAncestorContainer):!1}clearSelection(){const e=this.getSelection();e&&e.removeAllRanges()}}class j{container;editableElement;selection;options;pendingStyles={};constructor(e,t={}){this.container=e,this.container.classList.add("te-container"),this.options=t,this.selection=new g,this.editableElement=this.createEditableElement(),this.setupInputHandlers(),this.container.appendChild(this.editableElement),this.options.autofocus&&this.focus(),document.execCommand("defaultParagraphSeparator",!1,"p")}setupInputHandlers(){this.editableElement.addEventListener("beforeinput",e=>{if(e.inputType==="insertText"&&Object.keys(this.pendingStyles).length>0){const t=e.data;if(!t)return;e.preventDefault();const i=document.createElement("span");for(const[a,n]of Object.entries(this.pendingStyles))i.style.setProperty(a,n);i.textContent=t;const o=this.selection.getRange();if(o){o.deleteContents(),o.insertNode(i);const a=document.createRange();a.setStart(i.firstChild,t.length),a.setEnd(i.firstChild,t.length),this.selection.restoreSelection(a),this.pendingStyles={},this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}}}),document.addEventListener("selectionchange",()=>{const e=window.getSelection();e&&e.rangeCount>0&&(e.getRangeAt(0).collapsed||(this.pendingStyles={}))})}createEditableElement(){const e=document.createElement("div");return e.setAttribute("contenteditable","true"),e.setAttribute("role","textbox"),e.setAttribute("spellcheck","true"),e.classList.add("te-content"),this.options.placeholder&&e.setAttribute("data-placeholder",this.options.placeholder),e.style.minHeight="150px",e.style.outline="none",e.style.padding="1rem",e.innerHTML===""&&(e.innerHTML="<p><br></p>"),e}focus(){this.editableElement.focus()}execute(e,t=null){this.focus(),document.execCommand(e,!1,t??void 0),this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}clearStyleRecursive(e,t){const i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let o=i.nextNode();for(;o;)o.style.getPropertyValue(t)&&o.style.removeProperty(t),o=i.nextNode()}setStyle(e,t,i){if(e==="font-size"){const n=parseInt(t,10);isNaN(n)||(t=`${Math.max(1,Math.min(100,n))}px`)}if(!i){const n=window.getSelection();if(!n||n.rangeCount===0)return null;i=n.getRangeAt(0)}if(i.collapsed)return this.pendingStyles[e]=t,i;let o=i.commonAncestorContainer;o.nodeType===Node.TEXT_NODE&&(o=o.parentElement);let a=null;if(o.tagName==="SPAN"&&o.children.length===0&&o.textContent===i.toString())o.style.setProperty(e,t),a=i.cloneRange();else{const n=document.createElement("span");n.style.setProperty(e,t);try{const r=o.tagName==="SPAN"?o:null,y=i.extractContents();this.clearStyleRecursive(y,e),n.appendChild(y),i.insertNode(n),r&&r.innerHTML===""&&r.remove();const l=document.createRange();l.selectNodeContents(n),a=l;const c=window.getSelection();c&&c.rangeCount>0&&(c.removeAllRanges(),c.addRange(l))}catch(r){console.warn("Failed to apply style:",r)}}return this.editableElement.dispatchEvent(new Event("input",{bubbles:!0})),a}createLink(e){this.focus(),!/^https?:\/\//i.test(e)&&!/^mailto:/i.test(e)&&!e.startsWith("#")&&(e="https://"+e),document.execCommand("createLink",!1,e);const t=window.getSelection();if(t&&t.rangeCount>0){let o=t.getRangeAt(0).commonAncestorContainer;o.nodeType===Node.TEXT_NODE&&(o=o.parentElement);let a=null;o.tagName==="A"?a=o:a=o.querySelector("a"),a&&(a.setAttribute("target","_blank"),a.setAttribute("rel","noopener noreferrer"))}this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}getHTML(){return this.editableElement.innerHTML}setHTML(e){this.editableElement.innerHTML=e}get el(){return this.editableElement}}const u={type:"button",title:"Undo",command:"undo",icon:'<svg viewBox="0 0 24 24"><path d="M9 14L4 9l5-5"></path><path d="M20 20v-7a4 4 0 0 0-4-4H4"></path></svg>'},p={type:"button",title:"Redo",command:"redo",icon:'<svg viewBox="0 0 24 24"><path d="M15 14l5-5-5-5"></path><path d="M4 20v-7a4 4 0 0 1 4-4h12"></path></svg>'},v={type:"select",title:"Heading",command:"formatBlock",options:[{label:"Paragraph",value:"P"},{label:"Heading 1",value:"H1"},{label:"Heading 2",value:"H2"},{label:"Heading 3",value:"H3"},{label:"Heading 4",value:"H4"},{label:"Heading 5",value:"H5"},{label:"Heading 6",value:"H6"}]},b={type:"select",title:"Font",command:"fontFamily",options:[{label:"Inter",value:"'Inter', sans-serif"},{label:"Arial",value:"Arial, sans-serif"},{label:"Georgia",value:"Georgia, serif"},{label:"Courier",value:"'Courier New', monospace"},{label:"Times New Roman",value:"'Times New Roman', serif"},{label:"Verdana",value:"Verdana, sans-serif"},{label:"Tahoma",value:"Tahoma, sans-serif"},{label:"Roboto",value:"'Roboto', sans-serif"},{label:"Open Sans",value:"'Open Sans', sans-serif"},{label:"Montserrat",value:"'Montserrat', sans-serif"},{label:"Lato",value:"'Lato', sans-serif"},{label:"Poppins",value:"'Poppins', sans-serif"},{label:"Oswald",value:"'Oswald', sans-serif"},{label:"Playfair Display",value:"'Playfair Display', serif"},{label:"Merriweather",value:"'Merriweather', serif"}]},f={type:"input",title:"Size (px)",command:"fontSize",placeholder:"Size",value:"16"},S={type:"button",title:"Bold",command:"bold",icon:'<svg viewBox="0 0 24 24"><path d="M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path><path d="M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path></svg>'},x={type:"button",title:"Italic",command:"italic",icon:'<svg viewBox="0 0 24 24"><line x1="19" y1="4" x2="10" y2="4"></line><line x1="14" y1="20" x2="5" y2="20"></line><line x1="15" y1="4" x2="9" y2="20"></line></svg>'},w={type:"button",title:"Underline",command:"underline",icon:'<svg viewBox="0 0 24 24"><path d="M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3"></path><line x1="4" y1="21" x2="20" y2="21"></line></svg>'},A={type:"button",title:"Strikethrough",command:"strikeThrough",icon:'<svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line><path d="M16 4.9C15.1 4.3 13.9 4 12.6 4c-3.1 0-5.6 1.8-5.6 4s1.8 3.3 4.4 3.8"></path><path d="M7 19.1c.9.6 2.1.9 3.4.9 3.1 0 5.6-1.8 5.6-4s-1.8-3.3-4.4-3.8"></path></svg>'},k={type:"color-picker",title:"Text Color",command:"foreColor",value:"#1e293b"},E={type:"color-picker",title:"Highlight Color",command:"backColor",value:"#ffffff"},F={type:"button",title:"Align Left",command:"justifyLeft",icon:'<svg viewBox="0 0 24 24"><line x1="17" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="17" y1="18" x2="3" y2="18"></line></svg>'},L={type:"button",title:"Align Center",command:"justifyCenter",icon:'<svg viewBox="0 0 24 24"><line x1="18" y1="10" x2="6" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="18" y1="18" x2="6" y2="18"></line></svg>'},C={type:"button",title:"Align Right",command:"justifyRight",icon:'<svg viewBox="0 0 24 24"><line x1="21" y1="10" x2="7" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="7" y2="18"></line></svg>'},T={type:"button",title:"Justify",command:"justifyFull",icon:'<svg viewBox="0 0 24 24"><line x1="21" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="3" y2="18"></line></svg>'},H={type:"button",title:"Bulleted List",command:"insertUnorderedList",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><circle cx="3" cy="6" r="1" fill="currentColor"></circle><circle cx="3" cy="12" r="1" fill="currentColor"></circle><circle cx="3" cy="18" r="1" fill="currentColor"></circle></svg>'},O={type:"button",title:"Numbered List",command:"insertOrderedList",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" y1="6" x2="21" y2="6"></line><line x1="10" y1="12" x2="21" y2="21"></line><line x1="10" y1="18" x2="21" y2="18"></line><path d="M4 6h1v4"></path><path d="M4 10h2"></path><path d="M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"></path></svg>'},R={type:"button",title:"Outdent",command:"outdent",icon:'<svg viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"></polyline><line x1="21" y1="12" x2="9" y2="12"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="18" x2="3" y2="18"></line></svg>'},M={type:"button",title:"Indent",command:"indent",icon:'<svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"></polyline><line x1="3" y1="12" x2="15" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>'},I={type:"button",title:"Horizontal Rule",command:"insertHorizontalRule",icon:'<svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line></svg>'},P={type:"button",title:"Clear Formatting",command:"removeFormat",icon:'<svg viewBox="0 0 24 24"><path d="M17.41 15.41L12 10l-5.41 5.41L5.17 14l5.41-5.41L5.17 3.17 6.59 1.76 12 7.17l5.41-5.41 1.41 1.41-5.41 5.41 5.41 5.41-1.41 1.42z"></path></svg>'},B={type:"button",title:"Insert Emoji",command:"insertEmoji",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M8 14s1.5 2 4 2 4-2 4-2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line></svg>'},N={type:"button",title:"Insert Link",command:"createLink",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg>'},m={type:"divider",title:""},z=[u,p,m,v,b,f,m,S,x,w,A,m,k,E,m,F,L,C,T,m,H,O,R,M,m,I,B,N,P],d=[{emoji:"๐",name:"grinning",category:"Smileys"},{emoji:"๐",name:"smiley",category:"Smileys"},{emoji:"๐",name:"smile",category:"Smileys"},{emoji:"๐",name:"grin",category:"Smileys"},{emoji:"๐",name:"laughing",category:"Smileys"},{emoji:"๐
",name:"sweat smile",category:"Smileys"},{emoji:"๐คฃ",name:"rofl",category:"Smileys"},{emoji:"๐",name:"joy",category:"Smileys"},{emoji:"๐",name:"slight smile",category:"Smileys"},{emoji:"๐",name:"upside down",category:"Smileys"},{emoji:"๐",name:"wink",category:"Smileys"},{emoji:"๐",name:"blush",category:"Smileys"},{emoji:"๐",name:"innocent",category:"Smileys"},{emoji:"๐ฅฐ",name:"smiling face with hearts",category:"Smileys"},{emoji:"๐",name:"heart eyes",category:"Smileys"},{emoji:"๐คฉ",name:"star struck",category:"Smileys"},{emoji:"๐",name:"kissing heart",category:"Smileys"},{emoji:"๐",name:"kissing",category:"Smileys"},{emoji:"๐",name:"kissing closed eyes",category:"Smileys"},{emoji:"๐",name:"yum",category:"Smileys"},{emoji:"๐",name:"stuck out tongue",category:"Smileys"},{emoji:"๐",name:"stuck out tongue winking eye",category:"Smileys"},{emoji:"๐คช",name:"zany face",category:"Smileys"},{emoji:"๐คจ",name:"raised eyebrow",category:"Smileys"},{emoji:"๐ง",name:"monocle",category:"Smileys"},{emoji:"๐ค",name:"nerd",category:"Smileys"},{emoji:"๐",name:"sunglasses",category:"Smileys"},{emoji:"๐ฅณ",name:"partying face",category:"Smileys"},{emoji:"๐",name:"smirk",category:"Smileys"},{emoji:"๐",name:"unamused",category:"Smileys"},{emoji:"๐",name:"disappointed",category:"Smileys"},{emoji:"๐",name:"pensive",category:"Smileys"},{emoji:"๐",name:"worried",category:"Smileys"},{emoji:"๐",name:"confused",category:"Smileys"},{emoji:"๐ซ",name:"tired",category:"Smileys"},{emoji:"๐ฅต",name:"hot face",category:"Smileys"},{emoji:"๐ฅถ",name:"cold face",category:"Smileys"},{emoji:"๐ณ",name:"flushed",category:"Smileys"},{emoji:"๐ฑ",name:"scream",category:"Smileys"},{emoji:"๐คข",name:"nauseated",category:"Smileys"},{emoji:"๐คฎ",name:"vomiting",category:"Smileys"},{emoji:"๐คฌ",name:"cursing",category:"Smileys"},{emoji:"๐คซ",name:"shushing",category:"Smileys"},{emoji:"๐ค",name:"thinking",category:"Smileys"},{emoji:"๐ค",name:"hugs",category:"Smileys"},{emoji:"๐ฅฑ",name:"yawn",category:"Smileys"},{emoji:"๐ด",name:"sleeping",category:"Smileys"},{emoji:"๐คค",name:"drooling",category:"Smileys"},{emoji:"๐ต",name:"dizzy",category:"Smileys"},{emoji:"๐ค",name:"zipper mouth",category:"Smileys"},{emoji:"๐ฅด",name:"woozy",category:"Smileys"},{emoji:"๐ค",name:"fever",category:"Smileys"},{emoji:"๐ค",name:"bandage",category:"Smileys"},{emoji:"๐คก",name:"clown",category:"Smileys"},{emoji:"๐ป",name:"ghost",category:"Smileys"},{emoji:"๐ฝ",name:"alien",category:"Smileys"},{emoji:"๐พ",name:"robot",category:"Smileys"},{emoji:"๐ฉ",name:"poop",category:"Smileys"},{emoji:"โค๏ธ",name:"heart",category:"Symbols"},{emoji:"๐งก",name:"orange heart",category:"Symbols"},{emoji:"๐",name:"yellow heart",category:"Symbols"},{emoji:"๐",name:"green heart",category:"Symbols"},{emoji:"๐",name:"blue heart",category:"Symbols"},{emoji:"๐",name:"purple heart",category:"Symbols"},{emoji:"๐ค",name:"black heart",category:"Symbols"},{emoji:"๐ค",name:"white heart",category:"Symbols"},{emoji:"๐ค",name:"brown heart",category:"Symbols"},{emoji:"๐",name:"broken heart",category:"Symbols"},{emoji:"โฃ๏ธ",name:"heart exclamation",category:"Symbols"},{emoji:"๐",name:"two hearts",category:"Symbols"},{emoji:"๐",name:"revolving hearts",category:"Symbols"},{emoji:"โจ",name:"sparkles",category:"Symbols"},{emoji:"๐ฅ",name:"fire",category:"Symbols"},{emoji:"โญ",name:"star",category:"Symbols"},{emoji:"๐",name:"glowing star",category:"Symbols"},{emoji:"โ
",name:"check",category:"Symbols"},{emoji:"โ",name:"cross",category:"Symbols"},{emoji:"๐ฏ",name:"hundred",category:"Symbols"},{emoji:"๐ข",name:"anger",category:"Symbols"},{emoji:"๐ฅ",name:"collision",category:"Symbols"},{emoji:"๐ซ",name:"dizzy symbol",category:"Symbols"},{emoji:"๐ฆ",name:"sweat drops",category:"Symbols"},{emoji:"๐จ",name:"dash",category:"Symbols"},{emoji:"๐",name:"thumbs up",category:"Hands"},{emoji:"๐",name:"thumbs down",category:"Hands"},{emoji:"๐",name:"ok",category:"Hands"},{emoji:"โ๏ธ",name:"victory",category:"Hands"},{emoji:"๐ค",name:"fingers crossed",category:"Hands"},{emoji:"๐ค",name:"rock on",category:"Hands"},{emoji:"๐ค",name:"horns",category:"Hands"},{emoji:"๐ค",name:"call me",category:"Hands"},{emoji:"๐",name:"point left",category:"Hands"},{emoji:"๐",name:"point right",category:"Hands"},{emoji:"๐",name:"point up",category:"Hands"},{emoji:"๐",name:"point down",category:"Hands"},{emoji:"๐๏ธ",name:"hand splayed",category:"Hands"},{emoji:"โ",name:"raised hand",category:"Hands"},{emoji:"๐",name:"vulcan salute",category:"Hands"},{emoji:"๐",name:"wave",category:"Hands"},{emoji:"๐",name:"clap",category:"Hands"},{emoji:"๐",name:"hands up",category:"Hands"},{emoji:"๐",name:"open hands",category:"Hands"},{emoji:"๐คฒ",name:"palms up",category:"Hands"},{emoji:"๐ค",name:"handshake",category:"Hands"},{emoji:"๐",name:"pray",category:"Hands"},{emoji:"๐ช",name:"flex",category:"Hands"},{emoji:"โ๏ธ",name:"writing",category:"Hands"},{emoji:"๐คณ",name:"selfie",category:"Hands"},{emoji:"๐ถ",name:"dog",category:"Animals"},{emoji:"๐ฑ",name:"cat",category:"Animals"},{emoji:"๐ญ",name:"mouse",category:"Animals"},{emoji:"๐น",name:"hamster",category:"Animals"},{emoji:"๐ฐ",name:"rabbit",category:"Animals"},{emoji:"๐ฆ",name:"fox",category:"Animals"},{emoji:"๐ป",name:"bear",category:"Animals"},{emoji:"๐ผ",name:"panda",category:"Animals"},{emoji:"๐จ",name:"koala",category:"Animals"},{emoji:"๐ฏ",name:"tiger",category:"Animals"},{emoji:"๐ฆ",name:"lion",category:"Animals"},{emoji:"๐ฎ",name:"cow",category:"Animals"},{emoji:"๐ท",name:"pig",category:"Animals"},{emoji:"๐ธ",name:"frog",category:"Animals"},{emoji:"๐ต",name:"monkey",category:"Animals"},{emoji:"๐",name:"chicken",category:"Animals"},{emoji:"๐ง",name:"penguin",category:"Animals"},{emoji:"๐ฆ",name:"bird",category:"Animals"},{emoji:"๐ค",name:"chick",category:"Animals"},{emoji:"๐ฆ",name:"duck",category:"Animals"},{emoji:"๐ฆ
",name:"eagle",category:"Animals"},{emoji:"๐ฆ",name:"owl",category:"Animals"},{emoji:"๐ฆ",name:"bat",category:"Animals"},{emoji:"๐ฆ",name:"unicorn",category:"Animals"},{emoji:"๐",name:"bee",category:"Animals"},{emoji:"๐ฆ",name:"butterfly",category:"Animals"},{emoji:"๐",name:"snail",category:"Animals"},{emoji:"๐",name:"ladybeetle",category:"Animals"},{emoji:"๐ข",name:"turtle",category:"Animals"},{emoji:"๐",name:"snake",category:"Animals"},{emoji:"๐",name:"octopus",category:"Animals"},{emoji:"๐ฌ",name:"dolphin",category:"Animals"},{emoji:"๐ณ",name:"whale",category:"Animals"},{emoji:"๐",name:"fish",category:"Animals"},{emoji:"๐ฆ",name:"zebra",category:"Animals"},{emoji:"๐ฆ",name:"giraffe",category:"Animals"},{emoji:"๐",name:"elephant",category:"Animals"},{emoji:"๐ฆ",name:"rhino",category:"Animals"},{emoji:"๐ช",name:"camel",category:"Animals"},{emoji:"๐",name:"monkey",category:"Animals"},{emoji:"๐",name:"apple",category:"Food"},{emoji:"๐",name:"pear",category:"Food"},{emoji:"๐",name:"tangerine",category:"Food"},{emoji:"๐",name:"lemon",category:"Food"},{emoji:"๐",name:"banana",category:"Food"},{emoji:"๐",name:"watermelon",category:"Food"},{emoji:"๐",name:"grapes",category:"Food"},{emoji:"๐",name:"strawberry",category:"Food"},{emoji:"๐",name:"cherries",category:"Food"},{emoji:"๐",name:"peach",category:"Food"},{emoji:"๐ฅญ",name:"mango",category:"Food"},{emoji:"๐",name:"pineapple",category:"Food"},{emoji:"๐ฅฅ",name:"coconut",category:"Food"},{emoji:"๐ฅ",name:"kiwi",category:"Food"},{emoji:"๐
",name:"tomato",category:"Food"},{emoji:"๐ฅ",name:"avocado",category:"Food"},{emoji:"๐",name:"eggplant",category:"Food"},{emoji:"๐ฅ",name:"potato",category:"Food"},{emoji:"๐ฅ",name:"carrot",category:"Food"},{emoji:"๐ฝ",name:"corn",category:"Food"},{emoji:"๐ถ๏ธ",name:"hot pepper",category:"Food"},{emoji:"๐ฅฆ",name:"broccoli",category:"Food"},{emoji:"๐",name:"mushroom",category:"Food"},{emoji:"๐ฅ",name:"peanuts",category:"Food"},{emoji:"๐",name:"bread",category:"Food"},{emoji:"๐ฅ",name:"croissant",category:"Food"},{emoji:"๐ฅฏ",name:"bagel",category:"Food"},{emoji:"๐ฅ",name:"pancakes",category:"Food"},{emoji:"๐ง",name:"cheese",category:"Food"},{emoji:"๐",name:"meat",category:"Food"},{emoji:"๐",name:"poultry leg",category:"Food"},{emoji:"๐ฅ",name:"bacon",category:"Food"},{emoji:"๐",name:"hamburger",category:"Food"},{emoji:"๐",name:"fries",category:"Food"},{emoji:"๐",name:"pizza",category:"Food"},{emoji:"๐ญ",name:"hot dog",category:"Food"},{emoji:"๐ฅช",name:"sandwich",category:"Food"},{emoji:"๐ฎ",name:"taco",category:"Food"},{emoji:"๐ฏ",name:"burrito",category:"Food"},{emoji:"๐ณ",name:"egg",category:"Food"},{emoji:"๐ฒ",name:"stew",category:"Food"},{emoji:"๐ฅฃ",name:"bowl",category:"Food"},{emoji:"๐ฅ",name:"salad",category:"Food"},{emoji:"๐ฟ",name:"popcorn",category:"Food"},{emoji:"๐ฑ",name:"bento",category:"Food"},{emoji:"๐ฃ",name:"sushi",category:"Food"},{emoji:"๐ค",name:"shrimp",category:"Food"},{emoji:"๐ฆ",name:"ice cream",category:"Food"},{emoji:"๐ง",name:"shaved ice",category:"Food"},{emoji:"๐จ",name:"ice cream",category:"Food"},{emoji:"๐ฉ",name:"donut",category:"Food"},{emoji:"๐ช",name:"cookie",category:"Food"},{emoji:"๐",name:"cake",category:"Food"},{emoji:"๐ฐ",name:"shortcake",category:"Food"},{emoji:"๐ง",name:"cupcake",category:"Food"},{emoji:"๐ฅง",name:"pie",category:"Food"},{emoji:"๐ซ",name:"chocolate",category:"Food"},{emoji:"๐ฌ",name:"candy",category:"Food"},{emoji:"๐ญ",name:"lollipop",category:"Food"},{emoji:"๐ฎ",name:"custard",category:"Food"},{emoji:"๐ฏ",name:"honey",category:"Food"},{emoji:"๐ผ",name:"baby bottle",category:"Food"},{emoji:"๐ฅ",name:"milk",category:"Food"},{emoji:"โ",name:"coffee",category:"Food"},{emoji:"๐ต",name:"tea",category:"Food"},{emoji:"๐ถ",name:"sake",category:"Food"},{emoji:"๐พ",name:"champagne",category:"Food"},{emoji:"๐ท",name:"wine",category:"Food"},{emoji:"๐ธ",name:"cocktail",category:"Food"},{emoji:"๐น",name:"tropical drink",category:"Food"},{emoji:"๐บ",name:"beer",category:"Food"},{emoji:"๐ป",name:"beers",category:"Food"},{emoji:"๐ฅ",name:"tumbler glass",category:"Food"},{emoji:"๐ฅค",name:"soda",category:"Food"},{emoji:"๐",name:"car",category:"Travel"},{emoji:"๐",name:"taxi",category:"Travel"},{emoji:"๐",name:"bus",category:"Travel"},{emoji:"๐",name:"trolleybus",category:"Travel"},{emoji:"๐๏ธ",name:"racing car",category:"Travel"},{emoji:"๐",name:"police car",category:"Travel"},{emoji:"๐",name:"ambulance",category:"Travel"},{emoji:"๐",name:"fire engine",category:"Travel"},{emoji:"๐",name:"minibus",category:"Travel"},{emoji:"๐",name:"truck",category:"Travel"},{emoji:"๐",name:"articulated lorry",category:"Travel"},{emoji:"๐",name:"tractor",category:"Travel"},{emoji:"๐ฒ",name:"bicycle",category:"Travel"},{emoji:"๐ต",name:"scooter",category:"Travel"},{emoji:"๐๏ธ",name:"motorcycle",category:"Travel"},{emoji:"๐",name:"bullet train",category:"Travel"},{emoji:"๐",name:"train",category:"Travel"},{emoji:"โ๏ธ",name:"airplane",category:"Travel"},{emoji:"๐",name:"rocket",category:"Travel"},{emoji:"๐ธ",name:"ufo",category:"Travel"},{emoji:"๐",name:"helicopter",category:"Travel"},{emoji:"๐ข",name:"ship",category:"Travel"},{emoji:"โต",name:"sailboat",category:"Travel"},{emoji:"โ",name:"anchor",category:"Travel"},{emoji:"โฝ",name:"fuel pump",category:"Travel"},{emoji:"๐ฆ",name:"traffic light",category:"Travel"},{emoji:"๐ป",name:"laptop",category:"Objects"},{emoji:"๐ฑ",name:"mobile",category:"Objects"},{emoji:"โ๏ธ",name:"telephone",category:"Objects"},{emoji:"โจ๏ธ",name:"keyboard",category:"Objects"},{emoji:"๐ฅ๏ธ",name:"desktop",category:"Objects"},{emoji:"๐จ๏ธ",name:"printer",category:"Objects"},{emoji:"๐ธ",name:"camera",category:"Objects"},{emoji:"๐ฅ",name:"video camera",category:"Objects"},{emoji:"๐บ",name:"tv",category:"Objects"},{emoji:"๐ป",name:"radio",category:"Objects"},{emoji:"โฐ",name:"alarm clock",category:"Objects"},{emoji:"๐ก",name:"light bulb",category:"Objects"},{emoji:"๐ฆ",name:"flashlight",category:"Objects"},{emoji:"๐ฏ๏ธ",name:"candle",category:"Objects"},{emoji:"๐จ",name:"hammer",category:"Objects"},{emoji:"๐ง",name:"wrench",category:"Objects"},{emoji:"๐ฉ",name:"nut and bolt",category:"Objects"},{emoji:"๐ซ",name:"water pistol",category:"Objects"},{emoji:"๐ธ",name:"money",category:"Objects"},{emoji:"๐ต",name:"dollar bill",category:"Objects"},{emoji:"๐ณ",name:"credit card",category:"Objects"},{emoji:"๐",name:"gem",category:"Objects"},{emoji:"โ๏ธ",name:"balance scale",category:"Objects"},{emoji:"๐",name:"link",category:"Objects"},{emoji:"โ๏ธ",name:"chains",category:"Objects"},{emoji:"๐",name:"syringe",category:"Objects"},{emoji:"๐",name:"pill",category:"Objects"},{emoji:"๐ช",name:"door",category:"Objects"},{emoji:"๐๏ธ",name:"bed",category:"Objects"},{emoji:"๐๏ธ",name:"couch",category:"Objects"},{emoji:"๐ฟ",name:"shower",category:"Objects"},{emoji:"๐",name:"bathtub",category:"Objects"},{emoji:"๐",name:"key",category:"Objects"},{emoji:"๐งน",name:"broom",category:"Objects"},{emoji:"โฝ",name:"soccer",category:"Activities"},{emoji:"๐",name:"basketball",category:"Activities"},{emoji:"๐",name:"football",category:"Activities"},{emoji:"โพ",name:"baseball",category:"Activities"},{emoji:"๐พ",name:"tennis",category:"Activities"},{emoji:"๐",name:"volleyball",category:"Activities"},{emoji:"๐",name:"rugby",category:"Activities"},{emoji:"๐ฑ",name:"pool",category:"Activities"},{emoji:"โณ",name:"golf",category:"Activities"},{emoji:"๐ช",name:"kite",category:"Activities"},{emoji:"๐น",name:"bow and arrow",category:"Activities"},{emoji:"๐ฃ",name:"fishing",category:"Activities"},{emoji:"๐ฅ",name:"boxing",category:"Activities"},{emoji:"๐ฅ",name:"martial arts",category:"Activities"},{emoji:"โธ๏ธ",name:"ice skate",category:"Activities"},{emoji:"๐ฟ",name:"ski",category:"Activities"},{emoji:"๐",name:"snowboard",category:"Activities"},{emoji:"๐๏ธ",name:"weightlifter",category:"Activities"},{emoji:"๐คบ",name:"fencing",category:"Activities"},{emoji:"๐คผ",name:"wrestling",category:"Activities"},{emoji:"๐คธ",name:"cartwheel",category:"Activities"},{emoji:"๐",name:"trophy",category:"Activities"},{emoji:"๐
",name:"medal",category:"Activities"},{emoji:"๐ฅ",name:"first place",category:"Activities"},{emoji:"๐๏ธ",name:"ticket",category:"Activities"},{emoji:"๐ฎ",name:"video game",category:"Activities"},{emoji:"๐ฒ",name:"die",category:"Activities"},{emoji:"โ๏ธ",name:"chess",category:"Activities"},{emoji:"๐น",name:"piano",category:"Activities"},{emoji:"๐ธ",name:"guitar",category:"Activities"},{emoji:"๐บ",name:"trumpet",category:"Activities"},{emoji:"๐ป",name:"violin",category:"Activities"},{emoji:"๐ฅ",name:"drum",category:"Activities"},{emoji:"๐ญ",name:"performing arts",category:"Activities"},{emoji:"๐จ",name:"artist palette",category:"Activities"},{emoji:"๐ฌ",name:"clapper board",category:"Activities"},{emoji:"๐ค",name:"microphone",category:"Activities"},{emoji:"๐ง",name:"headphone",category:"Activities"}];class G{container;searchInput;emojiGrid;onSelect;onClose;constructor(e,t){this.onSelect=e,this.onClose=t,this.container=this.createPickerElement(),this.searchInput=this.container.querySelector(".te-emoji-search"),this.emojiGrid=this.container.querySelector(".te-emoji-grid"),this.setupEvents(),this.renderEmojis(d)}createPickerElement(){const e=document.createElement("div");return e.classList.add("te-emoji-picker"),e.innerHTML=`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class y{getSelection(){return window.getSelection()}getRange(){const e=this.getSelection();return!e||e.rangeCount===0?null:e.getRangeAt(0)}saveSelection(){const e=this.getRange();return e?e.cloneRange():null}restoreSelection(e){if(!e)return;const t=this.getSelection();t&&(t.removeAllRanges(),t.addRange(e))}isSelectionInElement(e){const t=this.getRange();return t?e.contains(t.commonAncestorContainer):!1}clearSelection(){const e=this.getSelection();e&&e.removeAllRanges()}}class p{editor;activeContainer=null;isResizing=!1;startX=0;startY=0;startWidth=0;startHeight=0;currentHandle=null;aspectRatio=1;constructor(e){this.editor=e,this.setupListeners()}setupListeners(){const e=this.editor.el;e.addEventListener("mousedown",t=>{const o=t.target;if(o.classList.contains("te-image-resizer")){t.preventDefault(),t.stopPropagation();const a=o.closest(".te-image-container");a&&(this.selectImage(a),this.startResize(t,o));return}const i=o.closest(".te-image-container");i?this.selectImage(i):this.deselectImage()}),window.addEventListener("mousemove",t=>{this.isResizing&&this.handleResize(t)}),window.addEventListener("mouseup",()=>{this.isResizing&&this.stopResize()}),e.addEventListener("keydown",t=>{(t.key==="Backspace"||t.key==="Delete")&&this.activeContainer&&(t.preventDefault(),this.activeContainer.remove(),this.activeContainer=null,this.editor.el.dispatchEvent(new Event("input",{bubbles:!0})))})}selectImage(e){this.activeContainer&&this.activeContainer.classList.remove("active"),this.activeContainer=e,this.activeContainer.classList.add("active")}deselectImage(){this.activeContainer&&(this.activeContainer.classList.remove("active"),this.activeContainer=null)}startResize(e,t){if(!this.activeContainer)return;this.isResizing=!0,this.currentHandle=Array.from(t.classList).find(i=>i.startsWith("te-resizer-"))?.replace("te-resizer-","")||null;const o=this.activeContainer.querySelector("img");this.startX=e.clientX,this.startY=e.clientY,this.startWidth=o.clientWidth,this.startHeight=o.clientHeight,this.aspectRatio=this.startWidth/this.startHeight,document.body.style.cursor=window.getComputedStyle(t).cursor}handleResize(e){if(!this.activeContainer||!this.isResizing)return;const t=this.activeContainer.querySelector("img"),o=e.clientX-this.startX,i=e.clientY-this.startY;let a=this.startWidth,n=this.startHeight;this.currentHandle?.includes("right")?a=this.startWidth+o:this.currentHandle?.includes("left")?a=this.startWidth-o:this.currentHandle?.includes("bottom")?a=this.startWidth+i*this.aspectRatio:this.currentHandle?.includes("top")&&(a=this.startWidth-i*this.aspectRatio),n=a/this.aspectRatio,a>50&&a<this.editor.el.clientWidth&&(t.style.width=`${a}px`,t.style.height=`${n}px`)}stopResize(){this.isResizing=!1,this.currentHandle=null,document.body.style.cursor="",this.editor.el.dispatchEvent(new Event("input",{bubbles:!0}))}}class h{container;editableElement;selection;imageManager;options;pendingStyles={};constructor(e,t={}){this.container=e,this.container.classList.add("te-container"),this.options=t,this.editableElement=this.createEditableElement(),this.selection=new y,this.imageManager=new p(this),this.setupInputHandlers(),this.setupImageObserver(),this.container.appendChild(this.editableElement),this.options.autofocus&&this.focus(),document.execCommand("defaultParagraphSeparator",!1,"p")}setupImageObserver(){new MutationObserver(t=>{t.forEach(o=>{o.addedNodes.forEach(i=>{if(i.nodeType===Node.ELEMENT_NODE){const a=i;a.tagName==="IMG"&&!a.closest(".te-image-container")?this.wrapImage(a):a.querySelectorAll("img:not(.te-image)").forEach(s=>{s.closest(".te-image-container")||this.wrapImage(s)})}})})}).observe(this.editableElement,{childList:!0,subtree:!0})}wrapImage(e){const t=e.parentElement;if(!t)return;const o=document.createElement("figure");o.classList.add("te-image-container"),o.setAttribute("contenteditable","false");const i=document.createElement("img");i.src=e.src,i.alt=e.alt||"",e.width&&(i.style.width=`${e.width}px`),e.height&&(i.style.height=`${e.height}px`),i.classList.add("te-image");const a=document.createElement("figcaption");if(a.classList.add("te-image-caption"),a.setAttribute("contenteditable","true"),a.setAttribute("data-placeholder","Type caption..."),["top-left","top-right","bottom-left","bottom-right"].forEach(s=>{const r=document.createElement("div");r.classList.add("te-image-resizer",`te-resizer-${s}`),o.appendChild(r)}),o.appendChild(i),o.appendChild(a),t.replaceChild(o,e),!o.nextElementSibling){const s=document.createElement("p");s.innerHTML="<br>",o.after(s)}}setupInputHandlers(){this.editableElement.addEventListener("beforeinput",e=>{if(e.inputType==="insertText"&&Object.keys(this.pendingStyles).length>0){const t=e.data;if(!t)return;e.preventDefault();const o=document.createElement("span");for(const[a,n]of Object.entries(this.pendingStyles))o.style.setProperty(a,n);o.textContent=t;const i=this.selection.getRange();if(i){i.deleteContents(),i.insertNode(o);const a=document.createRange();a.setStart(o.firstChild,t.length),a.setEnd(o.firstChild,t.length),this.selection.restoreSelection(a),this.pendingStyles={},this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}}}),document.addEventListener("selectionchange",()=>{const e=window.getSelection();e&&e.rangeCount>0&&(e.getRangeAt(0).collapsed||(this.pendingStyles={}))}),this.editableElement.addEventListener("dragover",e=>{e.preventDefault(),e.dataTransfer.dropEffect="copy",this.editableElement.classList.add("dragover")}),this.editableElement.addEventListener("dragleave",()=>{this.editableElement.classList.remove("dragover")}),this.editableElement.addEventListener("drop",e=>{e.preventDefault(),this.editableElement.classList.remove("dragover");const t=e.dataTransfer?.files;if(t&&t.length>0)for(let o=0;o<t.length;o++){const i=t[o];if(i.type.startsWith("image/")){const a=new FileReader;a.onload=n=>{const s=n.target?.result;this.insertImage(s)},a.readAsDataURL(i)}}}),this.editableElement.addEventListener("paste",e=>{const t=e.clipboardData;if(!t)return;if(t.items)for(let a=0;a<t.items.length;a++){const n=t.items[a];if(n.type.startsWith("image/")){const s=n.getAsFile();if(s){e.preventDefault();const r=new FileReader;r.onload=l=>{const c=l.target?.result;this.insertImage(c)},r.readAsDataURL(s);return}}}const o=t.getData("text/plain"),i=/<([a-z1-6]+)\b[^>]*>[\s\S]*<\/\1>/i.test(o)||/^\s*<[a-z1-6]+\b[^>]*>/i.test(o);if(o&&i){const a=o.replace(/(\r\n|\n|\r)/gm," ").replace(/>\s+</g,"><").trim();e.preventDefault(),this.execute("insertHTML",a);return}})}createEditableElement(){const e=document.createElement("div");return e.setAttribute("contenteditable","true"),e.setAttribute("role","textbox"),e.setAttribute("spellcheck","true"),e.classList.add("te-content"),this.options.placeholder&&e.setAttribute("data-placeholder",this.options.placeholder),e.style.minHeight="150px",e.style.outline="none",e.style.padding="1rem",e.innerHTML===""&&(e.innerHTML="<p><br></p>"),e}focus(){this.editableElement.focus()}execute(e,t=null){this.focus(),document.execCommand(e,!1,t??void 0),this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}clearStyleRecursive(e,t){const o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let i=o.nextNode();for(;i;)i.style.getPropertyValue(t)&&i.style.removeProperty(t),i=o.nextNode()}setStyle(e,t,o){if(e==="font-size"&&t.endsWith("px"),!o){const n=window.getSelection();if(!n||n.rangeCount===0)return null;o=n.getRangeAt(0)}if(o.collapsed)return this.pendingStyles[e]=t,o;let i=o.commonAncestorContainer;i.nodeType===Node.TEXT_NODE&&(i=i.parentElement);let a=null;if(i.tagName==="SPAN"&&i.children.length===0&&i.textContent===o.toString())i.style.setProperty(e,t),a=o.cloneRange();else{const n=document.createElement("span");n.style.setProperty(e,t);try{const s=i.tagName==="SPAN"?i:null,r=o.extractContents();this.clearStyleRecursive(r,e),n.appendChild(r),o.insertNode(n),s&&s.innerHTML===""&&s.remove();const l=document.createRange();l.selectNodeContents(n),a=l;const c=window.getSelection();c&&c.rangeCount>0&&(c.removeAllRanges(),c.addRange(l))}catch(s){console.warn("Failed to apply style:",s)}}return this.editableElement.dispatchEvent(new Event("input",{bubbles:!0})),a}createLink(e){this.focus(),!/^https?:\/\//i.test(e)&&!/^mailto:/i.test(e)&&!e.startsWith("#")&&(e="https://"+e),document.execCommand("createLink",!1,e);const t=window.getSelection();if(t&&t.rangeCount>0){let i=t.getRangeAt(0).commonAncestorContainer;i.nodeType===Node.TEXT_NODE&&(i=i.parentElement);let a=null;i.tagName==="A"?a=i:a=i.querySelector("a"),a&&(a.setAttribute("target","_blank"),a.setAttribute("rel","noopener noreferrer"))}this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}insertImage(e){this.focus();const t=this.selection.getRange();if(!t)return;const o=document.createElement("figure");o.classList.add("te-image-container"),o.setAttribute("contenteditable","false");const i=document.createElement("img");i.src=e,i.classList.add("te-image");const a=document.createElement("figcaption");a.classList.add("te-image-caption"),a.setAttribute("contenteditable","true"),a.setAttribute("data-placeholder","Type caption..."),["top-left","top-right","bottom-left","bottom-right"].forEach(l=>{const c=document.createElement("div");c.classList.add("te-image-resizer",`te-resizer-${l}`),o.appendChild(c)}),o.appendChild(i),o.appendChild(a),t.deleteContents(),t.insertNode(o);const s=document.createElement("p");s.innerHTML="<br>",o.after(s);const r=document.createRange();r.setStart(s,0),r.setEnd(s,0),this.selection.restoreSelection(r),this.editableElement.dispatchEvent(new Event("input",{bubbles:!0}))}getHTML(){return this.editableElement.innerHTML}setHTML(e){this.editableElement.innerHTML=e}get el(){return this.editableElement}}const j={type:"button",title:"Undo",command:"undo",icon:'<svg viewBox="0 0 24 24"><path d="M9 14L4 9l5-5"></path><path d="M20 20v-7a4 4 0 0 0-4-4H4"></path></svg>'},v={type:"button",title:"Redo",command:"redo",icon:'<svg viewBox="0 0 24 24"><path d="M15 14l5-5-5-5"></path><path d="M4 20v-7a4 4 0 0 1 4-4h12"></path></svg>'},b={type:"select",title:"Heading",command:"formatBlock",options:[{label:"Paragraph",value:"P"},{label:"Heading 1",value:"H1"},{label:"Heading 2",value:"H2"},{label:"Heading 3",value:"H3"},{label:"Heading 4",value:"H4"},{label:"Heading 5",value:"H5"},{label:"Heading 6",value:"H6"}]},f={type:"select",title:"Font",command:"fontFamily",options:[{label:"Inter",value:"'Inter', sans-serif"},{label:"Arial",value:"Arial, sans-serif"},{label:"Georgia",value:"Georgia, serif"},{label:"Courier",value:"'Courier New', monospace"},{label:"Times New Roman",value:"'Times New Roman', serif"},{label:"Verdana",value:"Verdana, sans-serif"},{label:"Tahoma",value:"Tahoma, sans-serif"},{label:"Roboto",value:"'Roboto', sans-serif"},{label:"Open Sans",value:"'Open Sans', sans-serif"},{label:"Montserrat",value:"'Montserrat', sans-serif"},{label:"Lato",value:"'Lato', sans-serif"},{label:"Poppins",value:"'Poppins', sans-serif"},{label:"Oswald",value:"'Oswald', sans-serif"},{label:"Playfair Display",value:"'Playfair Display', serif"},{label:"Merriweather",value:"'Merriweather', serif"}]},S={type:"input",title:"Size (px)",command:"fontSize",placeholder:"Size",value:"16"},w={type:"select",title:"Line Height",command:"lineHeight",options:[{label:"Normal",value:"normal"},{label:"0.5",value:"0.5"},{label:"1.0",value:"1.0"},{label:"1.15",value:"1.15"},{label:"1.5",value:"1.5"},{label:"2.0",value:"2.0"},{label:"2.5",value:"2.5"},{label:"3.0",value:"3.0"},{label:"3.5",value:"3.5"},{label:"4.0",value:"4.0"},{label:"4.5",value:"4.5"},{label:"5.0",value:"5.0"},{label:"5.5",value:"5.5"},{label:"6.0",value:"6.0"},{label:"6.5",value:"6.5"},{label:"7.0",value:"7.0"},{label:"7.5",value:"7.5"},{label:"8.0",value:"8.0"},{label:"8.5",value:"8.5"},{label:"9.0",value:"9.0"},{label:"9.5",value:"9.5"},{label:"10.0",value:"10.0"}],value:"normal"},x={type:"button",title:"Bold",command:"bold",icon:'<svg viewBox="0 0 24 24"><path d="M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path><path d="M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path></svg>'},E={type:"button",title:"Italic",command:"italic",icon:'<svg viewBox="0 0 24 24"><line x1="19" y1="4" x2="10" y2="4"></line><line x1="14" y1="20" x2="5" y2="20"></line><line x1="15" y1="4" x2="9" y2="20"></line></svg>'},A={type:"button",title:"Underline",command:"underline",icon:'<svg viewBox="0 0 24 24"><path d="M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3"></path><line x1="4" y1="21" x2="20" y2="21"></line></svg>'},k={type:"button",title:"Strikethrough",command:"strikeThrough",icon:'<svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line><path d="M16 4.9C15.1 4.3 13.9 4 12.6 4c-3.1 0-5.6 1.8-5.6 4s1.8 3.3 4.4 3.8"></path><path d="M7 19.1c.9.6 2.1.9 3.4.9 3.1 0 5.6-1.8 5.6-4s-1.8-3.3-4.4-3.8"></path></svg>'},L={type:"color-picker",title:"Text Color",command:"foreColor",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20h16"/><path d="m6 16 6-12 6 12"/><path d="M8 12h8"/></svg>',value:"#1e293b"},C={type:"color-picker",title:"Highlight Color",command:"backColor",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 11-6 6v3h9l3-3"/><path d="m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4"/></svg>',value:"#ffffff"},F={type:"button",title:"Align Left",command:"justifyLeft",icon:'<svg viewBox="0 0 24 24"><line x1="17" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="17" y1="18" x2="3" y2="18"></line></svg>'},H={type:"button",title:"Align Center",command:"justifyCenter",icon:'<svg viewBox="0 0 24 24"><line x1="18" y1="10" x2="6" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="18" y1="18" x2="6" y2="18"></line></svg>'},T={type:"button",title:"Align Right",command:"justifyRight",icon:'<svg viewBox="0 0 24 24"><line x1="21" y1="10" x2="7" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="7" y2="18"></line></svg>'},R={type:"button",title:"Justify",command:"justifyFull",icon:'<svg viewBox="0 0 24 24"><line x1="21" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="3" y2="18"></line></svg>'},O={type:"button",title:"Bulleted List",command:"insertUnorderedList",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><circle cx="3" cy="6" r="1" fill="currentColor"></circle><circle cx="3" cy="12" r="1" fill="currentColor"></circle><circle cx="3" cy="18" r="1" fill="currentColor"></circle></svg>'},M={type:"button",title:"Numbered List",command:"insertOrderedList",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" y1="6" x2="21" y2="6"></line><line x1="10" y1="12" x2="21" y2="12"></line><line x1="10" y1="18" x2="21" y2="18"></line><path d="M4 6h1v4"></path><path d="M4 10h2"></path><path d="M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"></path></svg>'},I={type:"button",title:"Outdent",command:"outdent",icon:'<svg viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"></polyline><line x1="21" y1="12" x2="9" y2="12"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="18" x2="3" y2="18"></line></svg>'},z={type:"button",title:"Indent",command:"indent",icon:'<svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"></polyline><line x1="3" y1="12" x2="15" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>'},B={type:"button",title:"Horizontal Rule",command:"insertHorizontalRule",icon:'<svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line></svg>'},N={type:"button",title:"Clear Formatting",command:"removeFormat",icon:'<svg viewBox="0 0 24 24"><path d="M17.41 15.41L12 10l-5.41 5.41L5.17 14l5.41-5.41L5.17 3.17 6.59 1.76 12 7.17l5.41-5.41 1.41 1.41-5.41 5.41 5.41 5.41-1.41 1.42z"></path></svg>'},P={type:"button",title:"Insert Emoji",command:"insertEmoji",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M8 14s1.5 2 4 2 4-2 4-2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line></svg>'},W={type:"button",title:"Insert Link",command:"createLink",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg>'},D={type:"button",title:"Insert Image",command:"insertImage",icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><polyline points="21 15 16 10 5 21"></polyline></svg>'},m={type:"divider",title:""},G=[j,v,m,b,f,S,w,m,x,E,A,k,m,L,C,m,F,H,T,R,m,O,M,I,z,m,B,P,W,D,N],g=[{emoji:"๐",name:"grinning",category:"Smileys"},{emoji:"๐",name:"smiley",category:"Smileys"},{emoji:"๐",name:"smile",category:"Smileys"},{emoji:"๐",name:"grin",category:"Smileys"},{emoji:"๐",name:"laughing",category:"Smileys"},{emoji:"๐
",name:"sweat smile",category:"Smileys"},{emoji:"๐คฃ",name:"rofl",category:"Smileys"},{emoji:"๐",name:"joy",category:"Smileys"},{emoji:"๐",name:"slight smile",category:"Smileys"},{emoji:"๐",name:"upside down",category:"Smileys"},{emoji:"๐",name:"wink",category:"Smileys"},{emoji:"๐",name:"blush",category:"Smileys"},{emoji:"๐",name:"innocent",category:"Smileys"},{emoji:"๐ฅฐ",name:"smiling face with hearts",category:"Smileys"},{emoji:"๐",name:"heart eyes",category:"Smileys"},{emoji:"๐คฉ",name:"star struck",category:"Smileys"},{emoji:"๐",name:"kissing heart",category:"Smileys"},{emoji:"๐",name:"kissing",category:"Smileys"},{emoji:"๐",name:"kissing closed eyes",category:"Smileys"},{emoji:"๐",name:"yum",category:"Smileys"},{emoji:"๐",name:"stuck out tongue",category:"Smileys"},{emoji:"๐",name:"stuck out tongue winking eye",category:"Smileys"},{emoji:"๐คช",name:"zany face",category:"Smileys"},{emoji:"๐คจ",name:"raised eyebrow",category:"Smileys"},{emoji:"๐ง",name:"monocle",category:"Smileys"},{emoji:"๐ค",name:"nerd",category:"Smileys"},{emoji:"๐",name:"sunglasses",category:"Smileys"},{emoji:"๐ฅณ",name:"partying face",category:"Smileys"},{emoji:"๐",name:"smirk",category:"Smileys"},{emoji:"๐",name:"unamused",category:"Smileys"},{emoji:"๐",name:"disappointed",category:"Smileys"},{emoji:"๐",name:"pensive",category:"Smileys"},{emoji:"๐",name:"worried",category:"Smileys"},{emoji:"๐",name:"confused",category:"Smileys"},{emoji:"๐ซ",name:"tired",category:"Smileys"},{emoji:"๐ฅต",name:"hot face",category:"Smileys"},{emoji:"๐ฅถ",name:"cold face",category:"Smileys"},{emoji:"๐ณ",name:"flushed",category:"Smileys"},{emoji:"๐ฑ",name:"scream",category:"Smileys"},{emoji:"๐คข",name:"nauseated",category:"Smileys"},{emoji:"๐คฎ",name:"vomiting",category:"Smileys"},{emoji:"๐คฌ",name:"cursing",category:"Smileys"},{emoji:"๐คซ",name:"shushing",category:"Smileys"},{emoji:"๐ค",name:"thinking",category:"Smileys"},{emoji:"๐ค",name:"hugs",category:"Smileys"},{emoji:"๐ฅฑ",name:"yawn",category:"Smileys"},{emoji:"๐ด",name:"sleeping",category:"Smileys"},{emoji:"๐คค",name:"drooling",category:"Smileys"},{emoji:"๐ต",name:"dizzy",category:"Smileys"},{emoji:"๐ค",name:"zipper mouth",category:"Smileys"},{emoji:"๐ฅด",name:"woozy",category:"Smileys"},{emoji:"๐ค",name:"fever",category:"Smileys"},{emoji:"๐ค",name:"bandage",category:"Smileys"},{emoji:"๐คก",name:"clown",category:"Smileys"},{emoji:"๐ป",name:"ghost",category:"Smileys"},{emoji:"๐ฝ",name:"alien",category:"Smileys"},{emoji:"๐พ",name:"robot",category:"Smileys"},{emoji:"๐ฉ",name:"poop",category:"Smileys"},{emoji:"โค๏ธ",name:"heart",category:"Symbols"},{emoji:"๐งก",name:"orange heart",category:"Symbols"},{emoji:"๐",name:"yellow heart",category:"Symbols"},{emoji:"๐",name:"green heart",category:"Symbols"},{emoji:"๐",name:"blue heart",category:"Symbols"},{emoji:"๐",name:"purple heart",category:"Symbols"},{emoji:"๐ค",name:"black heart",category:"Symbols"},{emoji:"๐ค",name:"white heart",category:"Symbols"},{emoji:"๐ค",name:"brown heart",category:"Symbols"},{emoji:"๐",name:"broken heart",category:"Symbols"},{emoji:"โฃ๏ธ",name:"heart exclamation",category:"Symbols"},{emoji:"๐",name:"two hearts",category:"Symbols"},{emoji:"๐",name:"revolving hearts",category:"Symbols"},{emoji:"โจ",name:"sparkles",category:"Symbols"},{emoji:"๐ฅ",name:"fire",category:"Symbols"},{emoji:"โญ",name:"star",category:"Symbols"},{emoji:"๐",name:"glowing star",category:"Symbols"},{emoji:"โ
",name:"check",category:"Symbols"},{emoji:"โ",name:"cross",category:"Symbols"},{emoji:"๐ฏ",name:"hundred",category:"Symbols"},{emoji:"๐ข",name:"anger",category:"Symbols"},{emoji:"๐ฅ",name:"collision",category:"Symbols"},{emoji:"๐ซ",name:"dizzy symbol",category:"Symbols"},{emoji:"๐ฆ",name:"sweat drops",category:"Symbols"},{emoji:"๐จ",name:"dash",category:"Symbols"},{emoji:"๐",name:"thumbs up",category:"Hands"},{emoji:"๐",name:"thumbs down",category:"Hands"},{emoji:"๐",name:"ok",category:"Hands"},{emoji:"โ๏ธ",name:"victory",category:"Hands"},{emoji:"๐ค",name:"fingers crossed",category:"Hands"},{emoji:"๐ค",name:"rock on",category:"Hands"},{emoji:"๐ค",name:"horns",category:"Hands"},{emoji:"๐ค",name:"call me",category:"Hands"},{emoji:"๐",name:"point left",category:"Hands"},{emoji:"๐",name:"point right",category:"Hands"},{emoji:"๐",name:"point up",category:"Hands"},{emoji:"๐",name:"point down",category:"Hands"},{emoji:"๐๏ธ",name:"hand splayed",category:"Hands"},{emoji:"โ",name:"raised hand",category:"Hands"},{emoji:"๐",name:"vulcan salute",category:"Hands"},{emoji:"๐",name:"wave",category:"Hands"},{emoji:"๐",name:"clap",category:"Hands"},{emoji:"๐",name:"hands up",category:"Hands"},{emoji:"๐",name:"open hands",category:"Hands"},{emoji:"๐คฒ",name:"palms up",category:"Hands"},{emoji:"๐ค",name:"handshake",category:"Hands"},{emoji:"๐",name:"pray",category:"Hands"},{emoji:"๐ช",name:"flex",category:"Hands"},{emoji:"โ๏ธ",name:"writing",category:"Hands"},{emoji:"๐คณ",name:"selfie",category:"Hands"},{emoji:"๐ถ",name:"dog",category:"Animals"},{emoji:"๐ฑ",name:"cat",category:"Animals"},{emoji:"๐ญ",name:"mouse",category:"Animals"},{emoji:"๐น",name:"hamster",category:"Animals"},{emoji:"๐ฐ",name:"rabbit",category:"Animals"},{emoji:"๐ฆ",name:"fox",category:"Animals"},{emoji:"๐ป",name:"bear",category:"Animals"},{emoji:"๐ผ",name:"panda",category:"Animals"},{emoji:"๐จ",name:"koala",category:"Animals"},{emoji:"๐ฏ",name:"tiger",category:"Animals"},{emoji:"๐ฆ",name:"lion",category:"Animals"},{emoji:"๐ฎ",name:"cow",category:"Animals"},{emoji:"๐ท",name:"pig",category:"Animals"},{emoji:"๐ธ",name:"frog",category:"Animals"},{emoji:"๐ต",name:"monkey",category:"Animals"},{emoji:"๐",name:"chicken",category:"Animals"},{emoji:"๐ง",name:"penguin",category:"Animals"},{emoji:"๐ฆ",name:"bird",category:"Animals"},{emoji:"๐ค",name:"chick",category:"Animals"},{emoji:"๐ฆ",name:"duck",category:"Animals"},{emoji:"๐ฆ
",name:"eagle",category:"Animals"},{emoji:"๐ฆ",name:"owl",category:"Animals"},{emoji:"๐ฆ",name:"bat",category:"Animals"},{emoji:"๐ฆ",name:"unicorn",category:"Animals"},{emoji:"๐",name:"bee",category:"Animals"},{emoji:"๐ฆ",name:"butterfly",category:"Animals"},{emoji:"๐",name:"snail",category:"Animals"},{emoji:"๐",name:"ladybeetle",category:"Animals"},{emoji:"๐ข",name:"turtle",category:"Animals"},{emoji:"๐",name:"snake",category:"Animals"},{emoji:"๐",name:"octopus",category:"Animals"},{emoji:"๐ฌ",name:"dolphin",category:"Animals"},{emoji:"๐ณ",name:"whale",category:"Animals"},{emoji:"๐",name:"fish",category:"Animals"},{emoji:"๐ฆ",name:"zebra",category:"Animals"},{emoji:"๐ฆ",name:"giraffe",category:"Animals"},{emoji:"๐",name:"elephant",category:"Animals"},{emoji:"๐ฆ",name:"rhino",category:"Animals"},{emoji:"๐ช",name:"camel",category:"Animals"},{emoji:"๐",name:"monkey",category:"Animals"},{emoji:"๐",name:"apple",category:"Food"},{emoji:"๐",name:"pear",category:"Food"},{emoji:"๐",name:"tangerine",category:"Food"},{emoji:"๐",name:"lemon",category:"Food"},{emoji:"๐",name:"banana",category:"Food"},{emoji:"๐",name:"watermelon",category:"Food"},{emoji:"๐",name:"grapes",category:"Food"},{emoji:"๐",name:"strawberry",category:"Food"},{emoji:"๐",name:"cherries",category:"Food"},{emoji:"๐",name:"peach",category:"Food"},{emoji:"๐ฅญ",name:"mango",category:"Food"},{emoji:"๐",name:"pineapple",category:"Food"},{emoji:"๐ฅฅ",name:"coconut",category:"Food"},{emoji:"๐ฅ",name:"kiwi",category:"Food"},{emoji:"๐
",name:"tomato",category:"Food"},{emoji:"๐ฅ",name:"avocado",category:"Food"},{emoji:"๐",name:"eggplant",category:"Food"},{emoji:"๐ฅ",name:"potato",category:"Food"},{emoji:"๐ฅ",name:"carrot",category:"Food"},{emoji:"๐ฝ",name:"corn",category:"Food"},{emoji:"๐ถ๏ธ",name:"hot pepper",category:"Food"},{emoji:"๐ฅฆ",name:"broccoli",category:"Food"},{emoji:"๐",name:"mushroom",category:"Food"},{emoji:"๐ฅ",name:"peanuts",category:"Food"},{emoji:"๐",name:"bread",category:"Food"},{emoji:"๐ฅ",name:"croissant",category:"Food"},{emoji:"๐ฅฏ",name:"bagel",category:"Food"},{emoji:"๐ฅ",name:"pancakes",category:"Food"},{emoji:"๐ง",name:"cheese",category:"Food"},{emoji:"๐",name:"meat",category:"Food"},{emoji:"๐",name:"poultry leg",category:"Food"},{emoji:"๐ฅ",name:"bacon",category:"Food"},{emoji:"๐",name:"hamburger",category:"Food"},{emoji:"๐",name:"fries",category:"Food"},{emoji:"๐",name:"pizza",category:"Food"},{emoji:"๐ญ",name:"hot dog",category:"Food"},{emoji:"๐ฅช",name:"sandwich",category:"Food"},{emoji:"๐ฎ",name:"taco",category:"Food"},{emoji:"๐ฏ",name:"burrito",category:"Food"},{emoji:"๐ณ",name:"egg",category:"Food"},{emoji:"๐ฒ",name:"stew",category:"Food"},{emoji:"๐ฅฃ",name:"bowl",category:"Food"},{emoji:"๐ฅ",name:"salad",category:"Food"},{emoji:"๐ฟ",name:"popcorn",category:"Food"},{emoji:"๐ฑ",name:"bento",category:"Food"},{emoji:"๐ฃ",name:"sushi",category:"Food"},{emoji:"๐ค",name:"shrimp",category:"Food"},{emoji:"๐ฆ",name:"ice cream",category:"Food"},{emoji:"๐ง",name:"shaved ice",category:"Food"},{emoji:"๐จ",name:"ice cream",category:"Food"},{emoji:"๐ฉ",name:"donut",category:"Food"},{emoji:"๐ช",name:"cookie",category:"Food"},{emoji:"๐",name:"cake",category:"Food"},{emoji:"๐ฐ",name:"shortcake",category:"Food"},{emoji:"๐ง",name:"cupcake",category:"Food"},{emoji:"๐ฅง",name:"pie",category:"Food"},{emoji:"๐ซ",name:"chocolate",category:"Food"},{emoji:"๐ฌ",name:"candy",category:"Food"},{emoji:"๐ญ",name:"lollipop",category:"Food"},{emoji:"๐ฎ",name:"custard",category:"Food"},{emoji:"๐ฏ",name:"honey",category:"Food"},{emoji:"๐ผ",name:"baby bottle",category:"Food"},{emoji:"๐ฅ",name:"milk",category:"Food"},{emoji:"โ",name:"coffee",category:"Food"},{emoji:"๐ต",name:"tea",category:"Food"},{emoji:"๐ถ",name:"sake",category:"Food"},{emoji:"๐พ",name:"champagne",category:"Food"},{emoji:"๐ท",name:"wine",category:"Food"},{emoji:"๐ธ",name:"cocktail",category:"Food"},{emoji:"๐น",name:"tropical drink",category:"Food"},{emoji:"๐บ",name:"beer",category:"Food"},{emoji:"๐ป",name:"beers",category:"Food"},{emoji:"๐ฅ",name:"tumbler glass",category:"Food"},{emoji:"๐ฅค",name:"soda",category:"Food"},{emoji:"๐",name:"car",category:"Travel"},{emoji:"๐",name:"taxi",category:"Travel"},{emoji:"๐",name:"bus",category:"Travel"},{emoji:"๐",name:"trolleybus",category:"Travel"},{emoji:"๐๏ธ",name:"racing car",category:"Travel"},{emoji:"๐",name:"police car",category:"Travel"},{emoji:"๐",name:"ambulance",category:"Travel"},{emoji:"๐",name:"fire engine",category:"Travel"},{emoji:"๐",name:"minibus",category:"Travel"},{emoji:"๐",name:"truck",category:"Travel"},{emoji:"๐",name:"articulated lorry",category:"Travel"},{emoji:"๐",name:"tractor",category:"Travel"},{emoji:"๐ฒ",name:"bicycle",category:"Travel"},{emoji:"๐ต",name:"scooter",category:"Travel"},{emoji:"๐๏ธ",name:"motorcycle",category:"Travel"},{emoji:"๐",name:"bullet train",category:"Travel"},{emoji:"๐",name:"train",category:"Travel"},{emoji:"โ๏ธ",name:"airplane",category:"Travel"},{emoji:"๐",name:"rocket",category:"Travel"},{emoji:"๐ธ",name:"ufo",category:"Travel"},{emoji:"๐",name:"helicopter",category:"Travel"},{emoji:"๐ข",name:"ship",category:"Travel"},{emoji:"โต",name:"sailboat",category:"Travel"},{emoji:"โ",name:"anchor",category:"Travel"},{emoji:"โฝ",name:"fuel pump",category:"Travel"},{emoji:"๐ฆ",name:"traffic light",category:"Travel"},{emoji:"๐ป",name:"laptop",category:"Objects"},{emoji:"๐ฑ",name:"mobile",category:"Objects"},{emoji:"โ๏ธ",name:"telephone",category:"Objects"},{emoji:"โจ๏ธ",name:"keyboard",category:"Objects"},{emoji:"๐ฅ๏ธ",name:"desktop",category:"Objects"},{emoji:"๐จ๏ธ",name:"printer",category:"Objects"},{emoji:"๐ธ",name:"camera",category:"Objects"},{emoji:"๐ฅ",name:"video camera",category:"Objects"},{emoji:"๐บ",name:"tv",category:"Objects"},{emoji:"๐ป",name:"radio",category:"Objects"},{emoji:"โฐ",name:"alarm clock",category:"Objects"},{emoji:"๐ก",name:"light bulb",category:"Objects"},{emoji:"๐ฆ",name:"flashlight",category:"Objects"},{emoji:"๐ฏ๏ธ",name:"candle",category:"Objects"},{emoji:"๐จ",name:"hammer",category:"Objects"},{emoji:"๐ง",name:"wrench",category:"Objects"},{emoji:"๐ฉ",name:"nut and bolt",category:"Objects"},{emoji:"๐ซ",name:"water pistol",category:"Objects"},{emoji:"๐ธ",name:"money",category:"Objects"},{emoji:"๐ต",name:"dollar bill",category:"Objects"},{emoji:"๐ณ",name:"credit card",category:"Objects"},{emoji:"๐",name:"gem",category:"Objects"},{emoji:"โ๏ธ",name:"balance scale",category:"Objects"},{emoji:"๐",name:"link",category:"Objects"},{emoji:"โ๏ธ",name:"chains",category:"Objects"},{emoji:"๐",name:"syringe",category:"Objects"},{emoji:"๐",name:"pill",category:"Objects"},{emoji:"๐ช",name:"door",category:"Objects"},{emoji:"๐๏ธ",name:"bed",category:"Objects"},{emoji:"๐๏ธ",name:"couch",category:"Objects"},{emoji:"๐ฟ",name:"shower",category:"Objects"},{emoji:"๐",name:"bathtub",category:"Objects"},{emoji:"๐",name:"key",category:"Objects"},{emoji:"๐งน",name:"broom",category:"Objects"},{emoji:"โฝ",name:"soccer",category:"Activities"},{emoji:"๐",name:"basketball",category:"Activities"},{emoji:"๐",name:"football",category:"Activities"},{emoji:"โพ",name:"baseball",category:"Activities"},{emoji:"๐พ",name:"tennis",category:"Activities"},{emoji:"๐",name:"volleyball",category:"Activities"},{emoji:"๐",name:"rugby",category:"Activities"},{emoji:"๐ฑ",name:"pool",category:"Activities"},{emoji:"โณ",name:"golf",category:"Activities"},{emoji:"๐ช",name:"kite",category:"Activities"},{emoji:"๐น",name:"bow and arrow",category:"Activities"},{emoji:"๐ฃ",name:"fishing",category:"Activities"},{emoji:"๐ฅ",name:"boxing",category:"Activities"},{emoji:"๐ฅ",name:"martial arts",category:"Activities"},{emoji:"โธ๏ธ",name:"ice skate",category:"Activities"},{emoji:"๐ฟ",name:"ski",category:"Activities"},{emoji:"๐",name:"snowboard",category:"Activities"},{emoji:"๐๏ธ",name:"weightlifter",category:"Activities"},{emoji:"๐คบ",name:"fencing",category:"Activities"},{emoji:"๐คผ",name:"wrestling",category:"Activities"},{emoji:"๐คธ",name:"cartwheel",category:"Activities"},{emoji:"๐",name:"trophy",category:"Activities"},{emoji:"๐
",name:"medal",category:"Activities"},{emoji:"๐ฅ",name:"first place",category:"Activities"},{emoji:"๐๏ธ",name:"ticket",category:"Activities"},{emoji:"๐ฎ",name:"video game",category:"Activities"},{emoji:"๐ฒ",name:"die",category:"Activities"},{emoji:"โ๏ธ",name:"chess",category:"Activities"},{emoji:"๐น",name:"piano",category:"Activities"},{emoji:"๐ธ",name:"guitar",category:"Activities"},{emoji:"๐บ",name:"trumpet",category:"Activities"},{emoji:"๐ป",name:"violin",category:"Activities"},{emoji:"๐ฅ",name:"drum",category:"Activities"},{emoji:"๐ญ",name:"performing arts",category:"Activities"},{emoji:"๐จ",name:"artist palette",category:"Activities"},{emoji:"๐ฌ",name:"clapper board",category:"Activities"},{emoji:"๐ค",name:"microphone",category:"Activities"},{emoji:"๐ง",name:"headphone",category:"Activities"}];class q{container;searchInput;emojiGrid;onSelect;onClose;constructor(e,t){this.onSelect=e,this.onClose=t,this.container=this.createPickerElement(),this.searchInput=this.container.querySelector(".te-emoji-search"),this.emojiGrid=this.container.querySelector(".te-emoji-grid"),this.setupEvents(),this.renderEmojis(g)}createPickerElement(){const e=document.createElement("div");return e.classList.add("te-emoji-picker"),e.innerHTML=`
|
|
2
2
|
<div class="te-emoji-header">
|
|
3
3
|
<input type="text" class="te-emoji-search" placeholder="Search emoji...">
|
|
4
4
|
</div>
|
|
5
5
|
<div class="te-emoji-body">
|
|
6
6
|
<div class="te-emoji-grid"></div>
|
|
7
7
|
</div>
|
|
8
|
-
`,e}setupEvents(){this.searchInput.addEventListener("mousedown",t=>t.stopPropagation()),this.searchInput.addEventListener("click",t=>t.stopPropagation()),this.searchInput.addEventListener("input",()=>{const t=this.searchInput.value.toLowerCase(),
|
|
9
|
-
//# sourceMappingURL=test-editor.cjs.map
|
|
8
|
+
`,e}setupEvents(){this.searchInput.addEventListener("mousedown",t=>t.stopPropagation()),this.searchInput.addEventListener("click",t=>t.stopPropagation()),this.searchInput.addEventListener("input",()=>{const t=this.searchInput.value.toLowerCase(),o=g.filter(i=>i.name.toLowerCase().includes(t)||i.category.toLowerCase().includes(t));this.renderEmojis(o)});const e=t=>{this.container.contains(t.target)||(this.close(),document.removeEventListener("mousedown",e))};setTimeout(()=>document.addEventListener("mousedown",e),0)}renderEmojis(e){if(this.emojiGrid.innerHTML="",e.length===0){this.emojiGrid.innerHTML='<div class="te-emoji-empty">No emoji found</div>';return}this.searchInput.value.length>0?this.renderGridItems(e):["Smileys","Symbols","Hands","Animals","Food","Travel","Objects","Activities"].forEach(i=>{const a=e.filter(n=>n.category===i);if(a.length>0){const n=document.createElement("div");n.classList.add("te-emoji-category-title"),n.textContent=i,this.emojiGrid.appendChild(n),this.renderGridItems(a)}})}renderGridItems(e){e.forEach(t=>{const o=document.createElement("button");o.type="button",o.classList.add("te-emoji-item"),o.textContent=t.emoji,o.title=t.name,o.addEventListener("click",()=>{this.onSelect(t.emoji),this.close()}),this.emojiGrid.appendChild(o)})}show(e){document.body.appendChild(this.container);const t=e.getBoundingClientRect(),o=280;let i=t.bottom+window.scrollY+5,a=t.left+window.scrollX;a+o>window.innerWidth&&(a=window.innerWidth-o-10),this.container.style.top=`${i}px`,this.container.style.left=`${a}px`,this.searchInput.focus()}close(){this.container.parentElement&&(this.container.remove(),this.onClose())}get el(){return this.container}}class u{editor;container;savedRange=null;items=G;activePicker=null;constructor(e){this.editor=e,this.container=this.createToolbarElement(),this.render()}createToolbarElement(){const e=document.createElement("div");return e.classList.add("te-toolbar"),e}render(){this.items.forEach(e=>{if(e.type==="button")this.renderButton(e);else if(e.type==="select")this.renderSelect(e);else if(e.type==="input")this.renderInput(e);else if(e.type==="color-picker")this.renderColorPicker(e);else if(e.type==="divider"){const t=document.createElement("div");t.classList.add("te-divider"),this.container.appendChild(t)}}),this.editor.el.addEventListener("keyup",()=>this.updateActiveStates()),this.editor.el.addEventListener("mouseup",()=>this.updateActiveStates())}renderButton(e){const t=document.createElement("button");t.classList.add("te-button"),t.innerHTML=e.icon||"",t.title=e.title,t.addEventListener("mousedown",o=>{if(o.preventDefault(),e.command==="insertEmoji"){this.activePicker?this.activePicker.close():(this.activePicker=new q(i=>{this.editor.execute("insertText",i)},()=>{this.activePicker=null}),this.activePicker.show(t));return}if(e.command==="createLink"){const i=window.prompt("Enter the URL");i&&this.editor.createLink(i);return}if(e.command==="insertImage"){const i=document.createElement("input");i.type="file",i.accept="image/*",i.style.display="none",i.addEventListener("change",a=>{const s=a.target.files?.[0];if(s){const r=new FileReader;r.onload=l=>{const c=l.target?.result;this.editor.insertImage(c)},r.readAsDataURL(s)}document.body.removeChild(i)}),document.body.appendChild(i),i.click();return}e.command&&this.editor.execute(e.command,e.value||null),this.updateActiveStates()}),this.container.appendChild(t)}renderInput(e){const t=document.createElement("input");t.type="number",t.classList.add("te-input"),t.title=e.title,t.value=e.value||"",t.min="1",t.max="100";const o=()=>{const a=window.getSelection();if(a&&a.rangeCount>0){const n=a.getRangeAt(0);this.editor.el.contains(n.commonAncestorContainer)&&(this.savedRange=n.cloneRange())}};t.addEventListener("mousedown",o),t.addEventListener("focus",o);const i=()=>{let a=parseInt(t.value,10);if(!isNaN(a)&&(a=Math.max(1,Math.min(100,a)),t.value=a.toString(),e.command==="fontSize")){if(this.savedRange){const n=this.editor.setStyle("font-size",`${a}px`,this.savedRange);n&&(this.savedRange=n)}else this.editor.setStyle("font-size",`${a}px`);t.focus()}};t.addEventListener("input",i),t.addEventListener("keydown",a=>{a.key==="Enter"&&(i(),this.editor.focus())}),this.container.appendChild(t)}renderSelect(e){const t=document.createElement("select");t.classList.add("te-select"),t.title=e.title,e.options&&e.options.forEach(o=>{const i=document.createElement("option");i.value=o.value,i.textContent=o.label,t.appendChild(i)}),t.addEventListener("change",()=>{const o=t.value;this.savedRange&&this.editor.selection.restoreSelection(this.savedRange),e.command==="formatBlock"?this.editor.execute(e.command,o):e.command==="fontFamily"?this.editor.setStyle("font-family",o):e.command==="lineHeight"&&this.editor.setStyle("line-height",o),this.editor.focus()}),t.addEventListener("mousedown",()=>{this.savedRange=this.editor.selection.saveSelection()}),this.container.appendChild(t)}renderColorPicker(e){const t=document.createElement("div");if(t.classList.add("te-color-picker-wrapper"),t.title=e.title,e.icon){const i=document.createElement("div");i.classList.add("te-button","te-color-icon"),i.innerHTML=e.icon;const a=document.createElement("div");a.classList.add("te-color-indicator"),a.style.backgroundColor=e.value||"#000000",i.appendChild(a),t.appendChild(i)}const o=document.createElement("input");o.type="color",o.classList.add("te-color-picker-input"),e.icon||(o.classList.add("te-color-picker"),o.title=e.title),o.value=e.value||"#000000",o.addEventListener("mousedown",()=>{this.savedRange=this.editor.selection.saveSelection()}),o.addEventListener("input",()=>{if(e.icon){const i=t.querySelector(".te-color-indicator");i&&(i.style.backgroundColor=o.value)}}),o.addEventListener("change",()=>{this.savedRange&&this.editor.selection.restoreSelection(this.savedRange),e.command&&this.editor.execute(e.command,o.value),this.editor.focus()}),t.appendChild(o),this.container.appendChild(e.icon?t:o)}get el(){return this.container}updateActiveStates(){const e=this.container.querySelectorAll(".te-button");let t=0;this.items.forEach(o=>{if(o.type==="button"){const i=e[t++];o.command&&document.queryCommandState(o.command)?i.classList.add("active"):i.classList.remove("active")}})}}class $ extends h{toolbar;constructor(e,t={}){super(e,t),this.toolbar=new u(this),this.container.insertBefore(this.toolbar.el,this.editableElement),setTimeout(()=>{console.log("TOOLBAR HTML:",this.toolbar.el.outerHTML),console.log("CONTAINER HTML:",this.container.outerHTML)},1e3)}}exports.CoreEditor=h;exports.SelectionManager=y;exports.TestEditor=$;exports.Toolbar=u;
|