@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 CHANGED
@@ -1,17 +1,26 @@
1
- # Premium Rich Text Editor
1
+ # @meenainwal/rich-text-editor ๐Ÿš€
2
2
 
3
- A lightweight, framework-agnostic, and beautifully designed rich text editor built with TypeScript. Featuring a sophisticated **Slate & Indigo** design system, it provides a premium writing experience with modern interactive states and smooth transitions.
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
- ![Editor Preview](file:///home/nainwal/.gemini/antigravity/brain/3f0400ba-f085-44cc-ad19-5a06d9e21eb0/media__1772819009508.png)
5
+ ![Editor Preview](./editor-preview.png)
6
6
 
7
- ## โœจ Features
7
+ ## โœจ Why Choose This Editor? (Pros & Cons)
8
8
 
9
- - ๐Ÿ’… **Premium UI**: Modern aesthetic with a curated color palette and refined geometry.
10
- - ๐Ÿš€ **Zero Dependencies**: Pure Vanilla JS/TypeScript implementation.
11
- - ๐Ÿ›  **Framework Agnostic**: Works perfectly with React, Vue, Svelte, or Next.js.
12
- - ๐Ÿ— **Clean HTML**: Produces semantic and sanitized HTML output.
13
- - ๐Ÿ”— **Smart Links**: Automatically adds `target="_blank"` and security attributes.
14
- - ๐Ÿ”ก **Advanced Formatting**: Headings (H1-H6), dynamic font sizes, font families, and more.
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/test-editor.css';
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
- // Get content
37
- const content = editor.getHTML();
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/test-editor.css';
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
- ## โš™๏ธ Configuration
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)`: Sets the editor content.
71
- - `focus()`: Programmatically focus the editor.
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/anujnainwal)
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}
@@ -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(),i=d.filter(o=>o.name.toLowerCase().includes(t)||o.category.toLowerCase().includes(t));this.renderEmojis(i)});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(o=>{const a=e.filter(n=>n.category===o);if(a.length>0){const n=document.createElement("div");n.classList.add("te-emoji-category-title"),n.textContent=o,this.emojiGrid.appendChild(n),this.renderGridItems(a)}})}renderGridItems(e){e.forEach(t=>{const i=document.createElement("button");i.type="button",i.classList.add("te-emoji-item"),i.textContent=t.emoji,i.title=t.name,i.addEventListener("click",()=>{this.onSelect(t.emoji),this.close()}),this.emojiGrid.appendChild(i)})}show(e){document.body.appendChild(this.container);const t=e.getBoundingClientRect(),i=280;let o=t.bottom+window.scrollY+5,a=t.left+window.scrollX;a+i>window.innerWidth&&(a=window.innerWidth-i-10),this.container.style.top=`${o}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 h{editor;container;savedRange=null;items=z;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",i=>{if(i.preventDefault(),e.command==="insertEmoji"){this.activePicker?this.activePicker.close():(this.activePicker=new G(o=>{this.editor.execute("insertText",o)},()=>{this.activePicker=null}),this.activePicker.show(t));return}if(e.command==="createLink"){const o=window.prompt("Enter the URL");o&&this.editor.createLink(o);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 i=()=>{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",i),t.addEventListener("focus",i);const o=()=>{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",o),t.addEventListener("keydown",a=>{a.key==="Enter"&&(o(),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(i=>{const o=document.createElement("option");o.value=i.value,o.textContent=i.label,t.appendChild(o)}),t.addEventListener("change",()=>{const i=t.value;this.savedRange&&this.editor.selection.restoreSelection(this.savedRange),e.command==="formatBlock"?this.editor.execute(e.command,i):e.command==="fontFamily"&&this.editor.setStyle("font-family",i),this.editor.focus()}),t.addEventListener("mousedown",()=>{this.savedRange=this.editor.selection.saveSelection()}),this.container.appendChild(t)}renderColorPicker(e){const t=document.createElement("input");t.type="color",t.classList.add("te-color-picker"),t.title=e.title,t.value=e.value||"#000000",t.addEventListener("mousedown",()=>{this.savedRange=this.editor.selection.saveSelection()}),t.addEventListener("change",()=>{this.savedRange&&this.editor.selection.restoreSelection(this.savedRange),e.command&&this.editor.execute(e.command,t.value),this.editor.focus()}),this.container.appendChild(t)}get el(){return this.container}updateActiveStates(){const e=this.container.querySelectorAll(".te-button");let t=0;this.items.forEach(i=>{if(i.type==="button"){const o=e[t++];i.command&&document.queryCommandState(i.command)?o.classList.add("active"):o.classList.remove("active")}})}}class V extends j{toolbar;constructor(e,t={}){super(e,t),this.toolbar=new h(this),this.container.insertBefore(this.toolbar.el,this.editableElement)}}exports.CoreEditor=j;exports.SelectionManager=g;exports.TestEditor=V;exports.Toolbar=h;
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;