neiki-editor 2.2.1 → 2.4.0

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Jindřich Stoklasa
3
+ Copyright (c) 2026 neikiri
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  <img src="https://img.shields.io/badge/css-%23663399.svg?style=for-the-badge&logo=css&logoColor=white" alt="CSS">
12
12
  <br>
13
13
  <img src="https://img.shields.io/badge/License-MIT-2563EB?style=for-the-badge&logo=open-source-initiative&logoColor=white&labelColor=000F15&logoWidth=20" alt="License">
14
- <img src="https://img.shields.io/badge/Version-2.2.1-2563EB?style=for-the-badge&logo=semantic-release&logoColor=white&labelColor=000F15&logoWidth=20" alt="Version">
14
+ <img src="https://img.shields.io/badge/Version-2.4.0-2563EB?style=for-the-badge&logo=semantic-release&logoColor=white&labelColor=000F15&logoWidth=20" alt="Version">
15
15
  </p>
16
16
 
17
17
  <p align="center">
@@ -38,16 +38,38 @@
38
38
 
39
39
  ### CDN (Recommended)
40
40
 
41
+ Just one file — CSS is embedded automatically:
42
+
41
43
  ```html
42
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.2.1/dist/neiki-editor.css">
43
- <script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.2.1/dist/neiki-editor.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.4.0/dist/neiki-editor.min.js"></script>
45
+ ```
46
+
47
+ Or if you prefer loading CSS separately:
48
+
49
+ ```html
50
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.4.0/dist/neiki-editor.css">
51
+ <script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.4.0/dist/neiki-editor.js"></script>
52
+ ```
53
+
54
+ ### Package Manager
55
+
56
+ ```bash
57
+ npm install neiki-editor
58
+ # or
59
+ yarn add neiki-editor
60
+ # or
61
+ pnpm add neiki-editor
44
62
  ```
45
63
 
46
64
  ### Self-hosted
47
65
 
48
- Download `neiki-editor.js` and `neiki-editor.css`, then include them in your project:
66
+ Download `neiki-editor.min.js` (includes CSS) or `neiki-editor.js` + `neiki-editor.css` separately:
49
67
 
50
68
  ```html
69
+ <!-- Single file (recommended) -->
70
+ <script src="path/to/neiki-editor.min.js"></script>
71
+
72
+ <!-- Or separate files -->
51
73
  <link rel="stylesheet" href="path/to/neiki-editor.css">
52
74
  <script src="path/to/neiki-editor.js"></script>
53
75
  ```
@@ -79,6 +101,8 @@ const editor = new NeikiEditor('#editor', {
79
101
  spellcheck: true,
80
102
  readonly: false,
81
103
  theme: 'light', // 'light' or 'dark'
104
+ language: 'en', // 'en', 'cs', or custom via addTranslation()
105
+ translations: null, // custom translation keys (merged with built-in)
82
106
  toolbar: [
83
107
  'viewCode', 'undo', 'redo', 'findReplace', '|',
84
108
  'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'removeFormat', '|',
@@ -114,6 +138,7 @@ const editor = new NeikiEditor('#editor', {
114
138
  | `readonly` | `boolean` | `false` | Make editor read-only |
115
139
  | `theme` | `string` | `'light'` | `'light'` or `'dark'` |
116
140
  | `language` | `string` | `'en'` | UI language: `'en'` (English) or `'cs'` (Czech) |
141
+ | `translations` | `object\|null` | `null` | Custom translation keys (merged with built-in) |
117
142
  | `toolbar` | `array` | *(see above)* | Toolbar button configuration |
118
143
  | `onChange` | `function\|null` | `null` | Callback on content change |
119
144
  | `onSave` | `function\|null` | `null` | Callback on save (triggered by Ctrl+S or More menu → Save) |
@@ -234,7 +259,7 @@ The selected theme persists across page reloads via `localStorage`.
234
259
 
235
260
  ## 🌍 Localization (i18n)
236
261
 
237
- Neiki Editor supports multiple UI languages. Currently available:
262
+ Neiki Editor supports multiple UI languages. Built-in:
238
263
 
239
264
  - **English** (`en`) — default
240
265
  - **Czech** (`cs`)
@@ -247,7 +272,37 @@ const editor = new NeikiEditor('#editor', {
247
272
  });
248
273
  ```
249
274
 
250
- All toolbar tooltips, modal dialogs, status bar texts, and system messages are translated.
275
+ ### Custom translations
276
+
277
+ Add your own language or override existing translations using the static method:
278
+
279
+ ```javascript
280
+ NeikiEditor.addTranslation('de', {
281
+ 'toolbar.bold': 'Fett (Strg+B)',
282
+ 'toolbar.italic': 'Kursiv (Strg+I)',
283
+ 'toolbar.undo': 'Rückgängig (Strg+Z)',
284
+ // only override what you need — English is the fallback
285
+ });
286
+
287
+ const editor = new NeikiEditor('#editor', { language: 'de' });
288
+ ```
289
+
290
+ Or pass translations directly in config:
291
+
292
+ ```javascript
293
+ const editor = new NeikiEditor('#editor', {
294
+ language: 'de',
295
+ translations: {
296
+ de: {
297
+ 'toolbar.bold': 'Fett (Strg+B)',
298
+ 'toolbar.italic': 'Kursiv (Strg+I)',
299
+ // ...
300
+ }
301
+ }
302
+ });
303
+ ```
304
+
305
+ All toolbar tooltips, modal dialogs, status bar texts, and system messages are translatable.
251
306
 
252
307
  ---
253
308
 
@@ -297,6 +352,12 @@ editor.downloadContent(); // Download content as HTML file
297
352
  editor.clearAll(); // Clear all content
298
353
  ```
299
354
 
355
+ ### Localization
356
+
357
+ ```javascript
358
+ NeikiEditor.addTranslation('de', { ... }); // Add/override translations (static)
359
+ ```
360
+
300
361
  ### Command Execution
301
362
 
302
363
  ```javascript
@@ -570,8 +631,10 @@ function NeikiEditorComponent({ value, onChange }) {
570
631
  ```
571
632
  neiki-editor/
572
633
  ├── dist/
573
- │ ├── neiki-editor.js # Editor core
574
- └── neiki-editor.css # Editor styles
634
+ │ ├── neiki-editor.min.js # Minified editor + embedded CSS (recommended)
635
+ ├── neiki-editor.min.css # Minified styles
636
+ │ ├── neiki-editor.js # Editor core (unminified)
637
+ │ └── neiki-editor.css # Editor styles (unminified)
575
638
  ├── demo/
576
639
  │ └── index.html # Interactive demo page
577
640
  │ └── logo.png # Demo logo
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NeikiEditor - Production-Ready WYSIWYG Rich Text Editor
3
3
  * CSS Stylesheet
4
- * Version: 1.0.0
4
+ * Version: 2.4.0
5
5
  */
6
6
 
7
7
  /* ============================================
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * NeikiEditor - A Modern WYSIWYG Editor
3
- * Version: 2.2.1
3
+ * Version: 2.4.0
4
4
  *
5
5
  * A lightweight, feature-rich text editor with support for:
6
6
  * - Rich text formatting (bold, italic, underline, etc.)
@@ -301,6 +301,13 @@
301
301
  // Current language (will be set per editor instance)
302
302
  let _currentLanguage = 'en';
303
303
 
304
+ // Register a custom translation (static method — available before init)
305
+ function addTranslation(lang, keys) {
306
+ if (!lang || typeof keys !== 'object') return;
307
+ if (!TRANSLATIONS[lang]) TRANSLATIONS[lang] = {};
308
+ Object.assign(TRANSLATIONS[lang], keys);
309
+ }
310
+
304
311
  // Translation helper function
305
312
  function t(key, params = {}) {
306
313
  const lang = _currentLanguage || 'en';
@@ -334,6 +341,7 @@
334
341
  readonly: false,
335
342
  theme: 'light',
336
343
  language: 'en',
344
+ translations: null,
337
345
  plugins: [],
338
346
  onChange: null,
339
347
  onSave: null,
@@ -1780,6 +1788,13 @@
1780
1788
  // Set language for translations
1781
1789
  _currentLanguage = this.config.language || 'en';
1782
1790
 
1791
+ // Merge custom translations from config
1792
+ if (this.config.translations && typeof this.config.translations === 'object') {
1793
+ Object.keys(this.config.translations).forEach(lang => {
1794
+ addTranslation(lang, this.config.translations[lang]);
1795
+ });
1796
+ }
1797
+
1783
1798
  // Load theme preference
1784
1799
  const savedTheme = StorageManager.getGlobal('theme', this.config.theme);
1785
1800
  this.config.theme = savedTheme;
@@ -3516,6 +3531,9 @@
3516
3531
  };
3517
3532
  }
3518
3533
 
3534
+ // Static methods
3535
+ NeikiEditor.addTranslation = addTranslation;
3536
+
3519
3537
  // Export
3520
3538
  global.NeikiEditor = NeikiEditor;
3521
3539
  global.createNeikiEditor = createEditor;
@@ -0,0 +1 @@
1
+ .neiki-checkbox,.neiki-find-replace-option input{accent-color:var(--neiki-accent-color)}.neiki-modal,.neiki-modal-overlay.show .neiki-modal{animation:.2s neiki-modal-in}:root{--neiki-bg-primary:#ffffff;--neiki-bg-secondary:#f8f9fa;--neiki-bg-tertiary:#e9ecef;--neiki-bg-hover:#dee2e6;--neiki-bg-active:#ced4da;--neiki-border-color:#dee2e6;--neiki-border-color-dark:#adb5bd;--neiki-text-primary:#212529;--neiki-text-secondary:#495057;--neiki-text-muted:#6c757d;--neiki-accent-color:#0d6efd;--neiki-accent-hover:#0b5ed7;--neiki-danger-color:#dc3545;--neiki-success-color:#198754;--neiki-shadow-sm:0 1px 2px rgba(0, 0, 0, 0.05);--neiki-shadow-md:0 4px 6px rgba(0, 0, 0, 0.1);--neiki-shadow-lg:0 10px 15px rgba(0, 0, 0, 0.1);--neiki-editor-bg:#ffffff;--neiki-toolbar-bg:#f8f9fa;--neiki-statusbar-bg:#f8f9fa;--neiki-modal-overlay:rgba(0, 0, 0, 0.5);--neiki-scrollbar-thumb:#ced4da;--neiki-scrollbar-track:#f8f9fa;--neiki-selection-bg:#b3d7ff;--neiki-highlight-color:#fff3cd;--neiki-table-border:#dee2e6}.neiki-editor.neiki-dark{--neiki-bg-primary:#1e1e1e;--neiki-bg-secondary:#252526;--neiki-bg-tertiary:#2d2d30;--neiki-bg-hover:#3e3e42;--neiki-bg-active:#505050;--neiki-border-color:#3e3e42;--neiki-border-color-dark:#505050;--neiki-text-primary:#d4d4d4;--neiki-text-secondary:#a0a0a0;--neiki-text-muted:#808080;--neiki-accent-color:#4fc3f7;--neiki-accent-hover:#29b6f6;--neiki-danger-color:#f44336;--neiki-success-color:#4caf50;--neiki-shadow-sm:0 1px 2px rgba(0, 0, 0, 0.2);--neiki-shadow-md:0 4px 6px rgba(0, 0, 0, 0.3);--neiki-shadow-lg:0 10px 15px rgba(0, 0, 0, 0.4);--neiki-editor-bg:#1e1e1e;--neiki-toolbar-bg:#252526;--neiki-statusbar-bg:#252526;--neiki-modal-overlay:rgba(0, 0, 0, 0.7);--neiki-scrollbar-thumb:#505050;--neiki-scrollbar-track:#2d2d30;--neiki-selection-bg:#264f78;--neiki-highlight-color:#5c4d00;--neiki-table-border:#3e3e42}.neiki-editor{display:flex;flex-direction:column;width:100%;height:100%;min-height:400px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;color:var(--neiki-text-primary);box-shadow:var(--neiki-shadow-md)}.neiki-editor *{box-sizing:border-box}.neiki-editor.neiki-fullscreen{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:0!important;width:100vw!important;height:100vh!important;z-index:999999!important;border-radius:0!important;border:none!important}.neiki-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:var(--neiki-toolbar-bg);border-bottom:1px solid var(--neiki-border-color);min-height:44px}.neiki-toolbar-group{display:inline-flex;align-items:center;gap:2px;padding:0 4px;flex-wrap:nowrap}.neiki-toolbar-group:not(:last-child){border-right:1px solid var(--neiki-border-color);padding-right:8px;margin-right:4px}.neiki-toolbar-divider{width:1px;height:24px;background:var(--neiki-border-color);margin:0 4px}.neiki-btn,.neiki-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:0 0;border:1px solid transparent;border-radius:4px;cursor:pointer;color:var(--neiki-text-secondary);transition:.15s;position:relative}.neiki-btn:hover,.neiki-fontsize-btn:hover,.neiki-modal-close:hover,.neiki-preview-close:hover,.neiki-toolbar-btn:hover{background:var(--neiki-bg-hover);color:var(--neiki-text-primary)}.neiki-btn:active,.neiki-floating-btn:active,.neiki-toolbar-btn:active{background:var(--neiki-bg-active)}.neiki-btn.active,.neiki-toolbar-btn.active{background:var(--neiki-bg-active);color:var(--neiki-accent-color);border-color:var(--neiki-accent-color)}.neiki-btn:disabled,.neiki-toolbar-btn:disabled{opacity:.4;cursor:not-allowed}.neiki-btn svg,.neiki-toolbar-btn svg{width:18px;height:18px;fill:currentColor;pointer-events:none}.neiki-select{height:32px;padding:0 28px 0 10px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:4px;color:var(--neiki-text-primary);font-size:13px;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;min-width:100px}.neiki-select:hover{border-color:var(--neiki-border-color-dark)}.neiki-select:focus{outline:0;border-color:var(--neiki-accent-color);box-shadow:0 0 0 2px rgba(13,110,253,.15)}.neiki-color-btn{position:relative;width:36px}.neiki-color-btn .neiki-color-indicator{position:absolute;bottom:4px;left:50%;transform:translateX(-50%);width:16px;height:3px;border-radius:1px;background:currentColor}.neiki-checkbox-wrapper{display:flex;align-items:center;gap:6px;padding:0 8px;height:32px;font-size:12px;color:var(--neiki-text-secondary);cursor:pointer;user-select:none}.neiki-checkbox{width:16px;height:16px;cursor:pointer}.neiki-content-wrapper,.neiki-editor-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.neiki-content{flex:1;padding:20px 24px;background:var(--neiki-editor-bg);overflow-y:auto;outline:0;line-height:1.6;color:var(--neiki-text-primary);min-height:200px}.neiki-code-view-textarea:focus,.neiki-content:focus{outline:0}.neiki-content:empty::before{content:attr(data-placeholder);color:var(--neiki-text-muted);font-style:italic;pointer-events:none}.neiki-content.neiki-drag-over{border:2px dashed var(--neiki-accent-color);background:rgba(13,110,253,.05)}.neiki-content.neiki-drag-over::after{content:'Drop images here';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--neiki-accent-color);font-weight:600;font-size:16px;pointer-events:none;z-index:10}.neiki-editor.neiki-disabled{opacity:.6;pointer-events:none}.neiki-content::-webkit-scrollbar{width:10px}.neiki-content::-webkit-scrollbar-track{background:var(--neiki-scrollbar-track)}.neiki-content::-webkit-scrollbar-thumb{background:var(--neiki-scrollbar-thumb);border-radius:5px}.neiki-content::-webkit-scrollbar-thumb:hover{background:var(--neiki-border-color-dark)}.neiki-content p{margin:0 0 1em}.neiki-content h1{font-size:2em;font-weight:700;margin:0 0 .5em}.neiki-content h2{font-size:1.5em;font-weight:600;margin:0 0 .5em}.neiki-content h3{font-size:1.25em;font-weight:600;margin:0 0 .5em}.neiki-content h4{font-size:1.1em;font-weight:600;margin:0 0 .5em}.neiki-content h5{font-size:1em;font-weight:600;margin:0 0 .5em}.neiki-content h6{font-size:.9em;font-weight:600;margin:0 0 .5em}.neiki-content ol,.neiki-content ul{margin:0 0 1em;padding-left:2em}.neiki-content li{margin-bottom:.25em}.neiki-content blockquote{margin:0 0 1em;padding:10px 20px;border-left:4px solid var(--neiki-accent-color);background:var(--neiki-bg-secondary);font-style:italic}.neiki-content code,.neiki-content pre{background:var(--neiki-bg-tertiary);font-family:Consolas,Monaco,monospace}.neiki-content pre{margin:0 0 1em;padding:16px;border-radius:4px;overflow-x:auto;font-size:13px}.neiki-content code{padding:2px 6px;border-radius:3px;font-size:.9em}.neiki-content a{color:var(--neiki-accent-color);text-decoration:underline}.neiki-content a:hover{color:var(--neiki-accent-hover)}.neiki-content img{max-width:100%;height:auto;border-radius:4px;cursor:pointer}.neiki-content img.neiki-selected{outline:2px solid var(--neiki-accent-color);outline-offset:2px}.neiki-highlight{background:var(--neiki-highlight-color);padding:1px 0}.neiki-content table,.neiki-table{width:100%;border-collapse:collapse;margin:1em 0;table-layout:fixed}.neiki-content table td,.neiki-content table th{border:1px solid var(--neiki-table-border);padding:8px 12px;min-width:50px;vertical-align:top;position:relative}.neiki-content table th{background:var(--neiki-bg-secondary);font-weight:600}.neiki-btn-secondary:hover,.neiki-button-secondary:hover,.neiki-content table td:hover,.neiki-content table th:hover,.neiki-context-item:hover,.neiki-context-menu-item:hover,.neiki-dropdown-item:hover,.neiki-fontsize-dropdown-item:hover,.neiki-special-char-item:hover{background:var(--neiki-bg-hover)}.neiki-content table td.neiki-cell-selected,.neiki-content table th.neiki-cell-selected{background:var(--neiki-selection-bg)}.neiki-table-resize-handle{position:absolute;top:0;right:-3px;width:6px;height:100%;cursor:col-resize;z-index:10}.neiki-table-resize-handle:hover{background:var(--neiki-accent-color)}.neiki-statusbar{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background:var(--neiki-statusbar-bg);border-top:1px solid var(--neiki-border-color);font-size:12px;color:var(--neiki-text-muted)}.neiki-statusbar-left,.neiki-statusbar-right{display:flex;align-items:center;gap:16px}.neiki-statusbar-item{display:flex;align-items:center;gap:4px}.neiki-statusbar-block{font-family:Consolas,Monaco,monospace;font-size:11px;padding:2px 6px;background:var(--neiki-bg-tertiary);border-radius:3px;color:var(--neiki-accent-color);font-weight:600;border:1px solid var(--neiki-border-color)}.neiki-dropdown{position:absolute;top:100%;left:0;z-index:1000;min-width:180px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:6px;box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-dropdown-item{display:flex;align-items:center;gap:6px;padding:7px 10px;border-radius:4px;cursor:pointer;color:var(--neiki-text-primary);font-size:13px;transition:background .1s}.neiki-color-picker,.neiki-emoji-picker{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.neiki-dropdown-item.active{background:var(--neiki-bg-active);color:var(--neiki-accent-color)}.neiki-context-divider,.neiki-context-menu-divider,.neiki-dropdown-divider{height:1px;background:var(--neiki-border-color);margin:4px 0}.neiki-color-picker,.neiki-emoji-picker,.neiki-special-picker{background:var(--neiki-bg-primary);padding:8px;margin-top:4px;position:absolute;top:100%;z-index:1000;box-shadow:var(--neiki-shadow-lg);left:0}.neiki-color-picker{width:220px;border:1px solid var(--neiki-border-color);border-radius:8px}.neiki-color-swatch{width:20px;height:20px;border-radius:3px;cursor:pointer;border:1px solid var(--neiki-border-color);transition:transform .1s}.neiki-color-swatch:hover{transform:scale(1.2);z-index:1}.neiki-color-swatch.neiki-color-reset{background:#fff;position:relative;overflow:hidden;border:1px solid #ccc}.neiki-color-preset.active,.neiki-special-item:hover{border-color:var(--neiki-accent-color)}.neiki-color-swatch.neiki-color-reset::after{content:'';position:absolute;top:50%;left:-2px;right:-2px;height:2px;background:#e53935;transform:rotate(-45deg);transform-origin:center;pointer-events:none}.neiki-color-picker-label{font-size:11px;font-weight:600;color:var(--neiki-text-muted);text-transform:uppercase;margin-bottom:8px}.neiki-emoji-item,.neiki-special-item{align-items:center;font-size:18px;cursor:pointer}.neiki-emoji-picker{width:280px;max-height:250px;overflow-y:auto;border:1px solid var(--neiki-border-color);border-radius:8px}.neiki-emoji-item{display:flex;justify-content:center;width:24px;height:24px;border-radius:4px;transition:background .15s,transform .1s}.neiki-emoji-item:hover{background:var(--neiki-bg-hover);transform:scale(1.2)}.neiki-special-picker{width:320px;max-height:280px;overflow-y:auto;border:1px solid var(--neiki-border-color);border-radius:8px;display:grid;grid-template-columns:repeat(8,1fr);gap:4px}.neiki-special-item{display:flex;justify-content:center;width:32px;height:32px;border-radius:4px;border:1px solid var(--neiki-border-color);background:var(--neiki-bg-secondary);transition:.15s}.neiki-special-item:hover{background:var(--neiki-accent-color);color:#fff;transform:scale(1.1)}.neiki-highlight-find{background:#ffeb3b;padding:1px 0;border-radius:2px}.neiki-highlight-current{background:#ff9800;outline:#e65100 solid 2px}.neiki-color-presets{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-bottom:12px}.neiki-color-preset{width:32px;height:32px;border-radius:4px;border:2px solid transparent;cursor:pointer;transition:transform .1s,border-color .1s}.neiki-color-preset:hover{transform:scale(1.1)}.neiki-color-preset.neiki-color-reset{background:linear-gradient(45deg,#fff 45%,red 45%,red 55%,#fff 55%);border:1px solid var(--neiki-border-color)}.neiki-color-custom{display:flex;align-items:center;gap:8px;padding-top:8px;border-top:1px solid var(--neiki-border-color)}.neiki-color-custom input[type=color]{width:40px;height:32px;padding:0;border:1px solid var(--neiki-border-color);border-radius:4px;cursor:pointer}.neiki-color-custom input[type=text]{flex:1;height:32px;padding:0 8px;border:1px solid var(--neiki-border-color);border-radius:4px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:12px;font-family:monospace}.neiki-table-picker,.neiki-table-picker-cell{border:1px solid var(--neiki-border-color);background:var(--neiki-bg-primary)}.neiki-table-picker{position:absolute;top:100%;left:0;z-index:1000;border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:12px;display:none}.neiki-context-menu.show,.neiki-find-replace.show,.neiki-fontsize-dropdown.show,.neiki-table-picker.show{display:block}.neiki-table-picker-label{font-size:12px;color:var(--neiki-text-secondary);margin-bottom:8px;text-align:center}.neiki-dark .neiki-modal h3,.neiki-dark .neiki-modal-header h3,.neiki-modal-title{color:var(--neiki-text-primary)}.neiki-table-picker-grid{display:grid;grid-template-columns:repeat(10,20px);gap:2px}.neiki-table-picker-cell{width:20px;height:20px;border-radius:2px;cursor:pointer;transition:background .1s}.neiki-table-picker-cell.active,.neiki-table-picker-cell:hover{background:var(--neiki-accent-color);border-color:var(--neiki-accent-color)}.neiki-form-divider::after,.neiki-form-divider::before{content:'';height:1px;background:var(--neiki-border-color)}.neiki-special-chars{position:absolute;top:100%;left:0;z-index:1000;width:280px;max-height:300px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);display:none;overflow:hidden}.neiki-special-chars.show{display:flex;flex-direction:column}.neiki-special-chars-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;padding:8px;overflow-y:auto}.neiki-special-char-item{display:flex;align-items:center;justify-content:center;width:24px;height:24px;font-size:16px;border-radius:4px;cursor:pointer;transition:background .1s}.neiki-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--neiki-modal-overlay);z-index:10000;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s}.neiki-modal-overlay.active,[data-tooltip]:hover::after{opacity:1;visibility:visible}.neiki-modal{background:var(--neiki-bg-primary);border-radius:12px;box-shadow:var(--neiki-shadow-lg);width:100%;max-width:440px;max-height:90vh;overflow:hidden}.neiki-modal-wide{max-width:520px}.neiki-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--neiki-border-color)}.neiki-modal-title{font-size:16px;font-weight:600;margin:0}.neiki-modal-close,.neiki-preview-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:0 0;border:none;border-radius:4px;cursor:pointer;color:var(--neiki-text-muted);transition:background .15s}.neiki-modal-body{padding:20px;overflow-y:auto}.neiki-modal h3,.neiki-modal-header h3{color:#000;margin:0}.neiki-modal-footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid var(--neiki-border-color)}.neiki-form-group{margin-bottom:16px}.neiki-find-replace-row:last-child,.neiki-form-group:last-child{margin-bottom:0}.neiki-form-group label,.neiki-form-label{display:block;margin-bottom:6px;font-size:13px;font-weight:500;color:var(--neiki-text-secondary)}.neiki-form-input,.neiki-form-textarea,.neiki-input{width:100%;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;transition:border-color .15s}.neiki-form-input,.neiki-input{height:40px;padding:0 12px;border:1px solid var(--neiki-border-color);border-radius:6px}.neiki-find-replace,.neiki-form-textarea{border:1px solid var(--neiki-border-color)}.neiki-form-input:focus,.neiki-form-textarea:focus,.neiki-input:focus{outline:0;border-color:var(--neiki-accent-color);box-shadow:0 0 0 3px rgba(13,110,253,.15)}.neiki-form-input::placeholder,.neiki-input::placeholder{color:var(--neiki-text-muted)}.neiki-form-row{display:flex;gap:16px}.neiki-form-divider{display:flex;align-items:center;margin:16px 0;text-align:center;position:relative}.neiki-form-divider::before{flex:1;margin-right:12px}.neiki-form-divider::after{flex:1;margin-left:12px}.neiki-form-divider span{color:var(--neiki-text-muted);font-size:12px;font-weight:500;text-transform:uppercase}.neiki-form-textarea{min-height:120px;padding:12px;border-radius:6px;font-family:inherit;resize:vertical}.neiki-btn-primary,.neiki-btn-secondary,.neiki-button{display:inline-flex;align-items:center;height:38px;padding:0 16px;font-size:14px;transition:.15s;font-weight:500;cursor:pointer}.neiki-button{justify-content:center;gap:6px;border:1px solid transparent;border-radius:6px}.neiki-btn-primary,.neiki-button-primary{background:var(--neiki-accent-color);color:#fff}.neiki-btn-primary:hover,.neiki-button-primary:hover{background:var(--neiki-accent-hover)}.neiki-btn-secondary,.neiki-button-secondary{background:var(--neiki-bg-secondary);color:var(--neiki-text-primary);border-color:var(--neiki-border-color)}.neiki-btn-primary,.neiki-btn-secondary{justify-content:center;border:1px solid transparent;border-radius:6px}.neiki-btn-secondary{border-color:var(--neiki-border-color)}.neiki-button-danger{background:var(--neiki-danger-color);color:#fff}.neiki-code-view,.neiki-find-replace,.neiki-find-replace-input{background:var(--neiki-bg-primary)}.neiki-button-danger:hover{opacity:.9}.neiki-find-replace{position:absolute;top:0;right:0;z-index:100;width:360px;border-radius:0 0 0 8px;box-shadow:var(--neiki-shadow-lg);display:none}.neiki-find-replace-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--neiki-border-color)}.neiki-code-view-title,.neiki-find-replace-title{font-size:13px;font-weight:600;color:var(--neiki-text-primary)}.neiki-find-replace-body{padding:12px}.neiki-find-replace-row{display:flex;gap:8px;margin-bottom:10px}.neiki-find-replace-input{flex:1;height:32px;padding:0 10px;border:1px solid var(--neiki-border-color);border-radius:4px;color:var(--neiki-text-primary);font-size:13px}.neiki-find-replace-input:focus{outline:0;border-color:var(--neiki-accent-color)}.neiki-find-replace-options{display:flex;align-items:center;gap:12px;margin-bottom:10px}.neiki-find-replace-option{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--neiki-text-secondary);cursor:pointer}.neiki-find-replace-actions{display:flex;gap:6px;flex-wrap:wrap}.neiki-find-replace-btn{height:28px;padding:0 10px;font-size:12px;border-radius:4px}.neiki-find-replace-count{font-size:12px;color:var(--neiki-text-muted);margin-left:auto}.neiki-code-view{position:absolute;top:0;left:0;right:0;bottom:0;z-index:50;display:none;flex-direction:column}.neiki-code-view.show,.neiki-drop-overlay.show{display:flex}.neiki-code-view-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--neiki-bg-secondary);border-bottom:1px solid var(--neiki-border-color);flex-shrink:0}.neiki-code-view-textarea{flex:1;width:100%;padding:16px;border:none;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-family:Consolas,Monaco,'Courier New',monospace;font-size:13px;line-height:1.5;resize:none}.neiki-code-view-apply{width:auto!important;padding:0 12px!important;display:inline-flex;align-items:center;gap:4px;height:30px;font-size:12px;background:var(--neiki-accent-color)!important;color:#fff!important;border-radius:5px}.neiki-context-menu,.neiki-floating-btn,.neiki-floating-toolbar{background:var(--neiki-bg-primary)}.neiki-code-view-apply:hover{background:var(--neiki-accent-hover)!important;color:#fff!important}.neiki-code-view-apply svg{width:14px!important;height:14px!important}.neiki-context-menu{position:fixed;z-index:10001;min-width:180px;border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:4px;display:none}.neiki-context-item,.neiki-context-menu-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:4px;cursor:pointer;color:var(--neiki-text-primary);font-size:13px;transition:background .1s}.neiki-context-item.neiki-context-danger,.neiki-context-menu-item.danger{color:var(--neiki-danger-color)}.neiki-context-item svg,.neiki-context-menu-item svg,.neiki-dropdown-item-icon svg,.neiki-floating-btn svg{width:16px;height:16px;fill:currentColor}.neiki-floating-toolbar{position:absolute;z-index:1000;display:none;border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:4px}.neiki-floating-toolbar.show{display:flex;align-items:center;gap:2px}.neiki-floating-btn{width:32px;height:32px;border:none;color:var(--neiki-text-primary);border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.15s}.neiki-floating-btn:hover{background:var(--neiki-bg-hover);color:var(--neiki-accent-color)}.neiki-floating-toolbar .neiki-btn{width:28px;height:28px}.neiki-chevron svg,.neiki-floating-toolbar .neiki-btn svg{width:14px;height:14px}.neiki-more-btn,[data-tooltip]{position:relative}[data-tooltip]::after{content:attr(data-tooltip);position:absolute;bottom:100%;left:50%;transform:translateX(-50%);padding:6px 10px;background:var(--neiki-text-primary);color:var(--neiki-bg-primary);font-size:11px;font-weight:500;white-space:nowrap;border-radius:4px;opacity:0;visibility:hidden;transition:opacity .15s,visibility .15s;pointer-events:none;z-index:10002;margin-bottom:6px}.neiki-drop-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(13,110,253,.1);border:3px dashed var(--neiki-accent-color);border-radius:8px;display:none;align-items:center;justify-content:center;z-index:100;pointer-events:none}.neiki-drop-overlay-text{font-size:18px;font-weight:600;color:var(--neiki-accent-color)}.neiki-image-wrapper{display:inline-block;position:relative}.neiki-image-wrapper.selected{outline:2px solid var(--neiki-accent-color)}.neiki-resize-handle{position:absolute;width:10px;height:10px;background:var(--neiki-accent-color);border:2px solid #fff;border-radius:2px}.neiki-resize-handle.nw{top:-5px;left:-5px;cursor:nw-resize}.neiki-resize-handle.ne{top:-5px;right:-5px;cursor:ne-resize}.neiki-resize-handle.sw{bottom:-5px;left:-5px;cursor:sw-resize}.neiki-resize-handle.se{bottom:-5px;right:-5px;cursor:se-resize}@media print{.neiki-content,.neiki-editor-wrapper{overflow:visible!important}.neiki-editor{border:none!important;box-shadow:none!important}.neiki-code-view-header,.neiki-find-replace,.neiki-floating-toolbar,.neiki-statusbar,.neiki-toolbar{display:none!important}.neiki-content{padding:0!important}}@media (max-width:768px){.neiki-toolbar{padding:4px;gap:1px}.neiki-toolbar-group{padding:0 2px}.neiki-toolbar-group:not(:last-child){padding-right:4px;margin-right:2px}.neiki-btn{width:28px;height:28px}.neiki-btn svg{width:16px;height:16px}.neiki-select{height:28px;min-width:80px;font-size:12px;padding:0 24px 0 8px}.neiki-content{padding:12px 16px}.neiki-statusbar{padding:4px 8px;font-size:11px}.neiki-modal{width:95%;max-width:none;margin:10px}.neiki-find-replace{width:100%;border-radius:0}.neiki-checkbox-wrapper{padding:0 4px;font-size:11px}}@media (max-width:480px){.neiki-toolbar-group:not(:last-child){border-right:none;padding-right:2px;margin-right:0}.neiki-select{min-width:60px}.neiki-statusbar-left,.neiki-statusbar-right{gap:8px}}@keyframes neiki-fade-in{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.neiki-color-picker.show,.neiki-dropdown.show,.neiki-emoji-picker.show,.neiki-special-chars.show,.neiki-table-picker.show{animation:.15s neiki-fade-in}@keyframes neiki-modal-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neiki-fontsize-widget{display:inline-flex;align-items:center;position:relative;height:32px;border:1px solid var(--neiki-border-color);border-radius:4px;overflow:visible;background:var(--neiki-bg-primary)}.neiki-fontsize-btn{display:flex;align-items:center;justify-content:center;width:26px;height:30px;background:0 0;border:none;cursor:pointer;color:var(--neiki-text-secondary);transition:background .15s,color .15s;padding:0}.neiki-fontsize-dropdown-item,.neiki-fontsize-input{color:var(--neiki-text-primary);text-align:center;font-size:13px}.neiki-fontsize-input{width:38px;height:30px;border:none;border-left:1px solid var(--neiki-border-color);border-right:1px solid var(--neiki-border-color);background:var(--neiki-bg-primary);outline:0;-moz-appearance:textfield;appearance:textfield;padding:0}.neiki-fontsize-dropdown,.neiki-insert-dropdown{left:0;border:1px solid var(--neiki-border-color)}.neiki-fontsize-input::-webkit-inner-spin-button,.neiki-fontsize-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.neiki-fontsize-dropdown{display:none;position:absolute;top:100%;z-index:1000;min-width:70px;max-height:240px;overflow-y:auto;background:var(--neiki-bg-primary);border-radius:6px;box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-fontsize-dropdown-item{padding:6px 12px;cursor:pointer;border-radius:4px;transition:background .1s}.neiki-insert-dropdown-btn{width:auto!important;padding:0 8px!important;gap:4px;font-size:13px;font-weight:500}.neiki-insert-label{font-size:13px;pointer-events:none}.neiki-chevron{display:inline-flex;pointer-events:none}.neiki-insert-dropdown,.neiki-more-dropdown{display:none;position:absolute;top:100%;z-index:1000;background:var(--neiki-bg-primary);box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-insert-dropdown{min-width:160px;border-radius:6px}.neiki-insert-dropdown.show,.neiki-more-dropdown.show{display:block;animation:.15s neiki-fade-in}.neiki-more-dropdown{right:0;min-width:140px;max-width:170px;border:1px solid var(--neiki-border-color);border-radius:6px}.neiki-lang-cs .neiki-more-dropdown{min-width:165px}.neiki-dropdown-item-icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0}.neiki-dropdown-item-danger{color:var(--neiki-danger-color)!important}.neiki-dropdown-item-danger:hover{background:rgba(220,53,69,.1)}.neiki-autosave-badge{font-size:12px;font-weight:600;color:var(--neiki-text-muted);padding:0 4px}.neiki-autosave-badge.active{color:var(--neiki-success-color)}.neiki-preview-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:100000;display:flex;align-items:center;justify-content:center;padding:30px;animation:.2s neiki-fade-in}.neiki-preview-modal{background:var(--neiki-bg-primary);border-radius:12px;width:100%;max-width:900px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 25px 60px rgba(0,0,0,.3);animation:.2s neiki-modal-in}.neiki-preview-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:var(--neiki-bg-secondary);border-bottom:1px solid var(--neiki-border-color);font-weight:600;font-size:14px;color:var(--neiki-text-primary)}.neiki-preview-close svg{width:18px;height:18px;fill:currentColor}.neiki-preview-body{flex:1;overflow:auto;padding:30px;color:var(--neiki-text-primary);font-size:15px;line-height:1.7}.neiki-preview-body img{max-width:100%}.neiki-preview-body table{border-collapse:collapse;width:100%}.neiki-preview-body table td,.neiki-preview-body table th{border:1px solid var(--neiki-border-color);padding:8px 12px}.neiki-statusbar-autosave{font-style:italic;color:var(--neiki-success-color);font-size:11px}
@@ -0,0 +1 @@
1
+ !function(e){"use strict";!function(){if(document.getElementById("neiki-editor-styles"))return;const e=document.createElement("style");e.id="neiki-editor-styles",e.textContent=".neiki-checkbox,.neiki-find-replace-option input{accent-color:var(--neiki-accent-color)}.neiki-modal,.neiki-modal-overlay.show .neiki-modal{animation:.2s neiki-modal-in}:root{--neiki-bg-primary:#ffffff;--neiki-bg-secondary:#f8f9fa;--neiki-bg-tertiary:#e9ecef;--neiki-bg-hover:#dee2e6;--neiki-bg-active:#ced4da;--neiki-border-color:#dee2e6;--neiki-border-color-dark:#adb5bd;--neiki-text-primary:#212529;--neiki-text-secondary:#495057;--neiki-text-muted:#6c757d;--neiki-accent-color:#0d6efd;--neiki-accent-hover:#0b5ed7;--neiki-danger-color:#dc3545;--neiki-success-color:#198754;--neiki-shadow-sm:0 1px 2px rgba(0, 0, 0, 0.05);--neiki-shadow-md:0 4px 6px rgba(0, 0, 0, 0.1);--neiki-shadow-lg:0 10px 15px rgba(0, 0, 0, 0.1);--neiki-editor-bg:#ffffff;--neiki-toolbar-bg:#f8f9fa;--neiki-statusbar-bg:#f8f9fa;--neiki-modal-overlay:rgba(0, 0, 0, 0.5);--neiki-scrollbar-thumb:#ced4da;--neiki-scrollbar-track:#f8f9fa;--neiki-selection-bg:#b3d7ff;--neiki-highlight-color:#fff3cd;--neiki-table-border:#dee2e6}.neiki-editor.neiki-dark{--neiki-bg-primary:#1e1e1e;--neiki-bg-secondary:#252526;--neiki-bg-tertiary:#2d2d30;--neiki-bg-hover:#3e3e42;--neiki-bg-active:#505050;--neiki-border-color:#3e3e42;--neiki-border-color-dark:#505050;--neiki-text-primary:#d4d4d4;--neiki-text-secondary:#a0a0a0;--neiki-text-muted:#808080;--neiki-accent-color:#4fc3f7;--neiki-accent-hover:#29b6f6;--neiki-danger-color:#f44336;--neiki-success-color:#4caf50;--neiki-shadow-sm:0 1px 2px rgba(0, 0, 0, 0.2);--neiki-shadow-md:0 4px 6px rgba(0, 0, 0, 0.3);--neiki-shadow-lg:0 10px 15px rgba(0, 0, 0, 0.4);--neiki-editor-bg:#1e1e1e;--neiki-toolbar-bg:#252526;--neiki-statusbar-bg:#252526;--neiki-modal-overlay:rgba(0, 0, 0, 0.7);--neiki-scrollbar-thumb:#505050;--neiki-scrollbar-track:#2d2d30;--neiki-selection-bg:#264f78;--neiki-highlight-color:#5c4d00;--neiki-table-border:#3e3e42}.neiki-editor{display:flex;flex-direction:column;width:100%;height:100%;min-height:400px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;color:var(--neiki-text-primary);box-shadow:var(--neiki-shadow-md)}.neiki-editor *{box-sizing:border-box}.neiki-editor.neiki-fullscreen{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:0!important;width:100vw!important;height:100vh!important;z-index:999999!important;border-radius:0!important;border:none!important}.neiki-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:var(--neiki-toolbar-bg);border-bottom:1px solid var(--neiki-border-color);min-height:44px}.neiki-toolbar-group{display:inline-flex;align-items:center;gap:2px;padding:0 4px;flex-wrap:nowrap}.neiki-toolbar-group:not(:last-child){border-right:1px solid var(--neiki-border-color);padding-right:8px;margin-right:4px}.neiki-toolbar-divider{width:1px;height:24px;background:var(--neiki-border-color);margin:0 4px}.neiki-btn,.neiki-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:0 0;border:1px solid transparent;border-radius:4px;cursor:pointer;color:var(--neiki-text-secondary);transition:.15s;position:relative}.neiki-btn:hover,.neiki-fontsize-btn:hover,.neiki-modal-close:hover,.neiki-preview-close:hover,.neiki-toolbar-btn:hover{background:var(--neiki-bg-hover);color:var(--neiki-text-primary)}.neiki-btn:active,.neiki-floating-btn:active,.neiki-toolbar-btn:active{background:var(--neiki-bg-active)}.neiki-btn.active,.neiki-toolbar-btn.active{background:var(--neiki-bg-active);color:var(--neiki-accent-color);border-color:var(--neiki-accent-color)}.neiki-btn:disabled,.neiki-toolbar-btn:disabled{opacity:.4;cursor:not-allowed}.neiki-btn svg,.neiki-toolbar-btn svg{width:18px;height:18px;fill:currentColor;pointer-events:none}.neiki-select{height:32px;padding:0 28px 0 10px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:4px;color:var(--neiki-text-primary);font-size:13px;cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;min-width:100px}.neiki-select:hover{border-color:var(--neiki-border-color-dark)}.neiki-select:focus{outline:0;border-color:var(--neiki-accent-color);box-shadow:0 0 0 2px rgba(13,110,253,.15)}.neiki-color-btn{position:relative;width:36px}.neiki-color-btn .neiki-color-indicator{position:absolute;bottom:4px;left:50%;transform:translateX(-50%);width:16px;height:3px;border-radius:1px;background:currentColor}.neiki-checkbox-wrapper{display:flex;align-items:center;gap:6px;padding:0 8px;height:32px;font-size:12px;color:var(--neiki-text-secondary);cursor:pointer;user-select:none}.neiki-checkbox{width:16px;height:16px;cursor:pointer}.neiki-content-wrapper,.neiki-editor-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.neiki-content{flex:1;padding:20px 24px;background:var(--neiki-editor-bg);overflow-y:auto;outline:0;line-height:1.6;color:var(--neiki-text-primary);min-height:200px}.neiki-code-view-textarea:focus,.neiki-content:focus{outline:0}.neiki-content:empty::before{content:attr(data-placeholder);color:var(--neiki-text-muted);font-style:italic;pointer-events:none}.neiki-content.neiki-drag-over{border:2px dashed var(--neiki-accent-color);background:rgba(13,110,253,.05)}.neiki-content.neiki-drag-over::after{content:'Drop images here';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--neiki-accent-color);font-weight:600;font-size:16px;pointer-events:none;z-index:10}.neiki-editor.neiki-disabled{opacity:.6;pointer-events:none}.neiki-content::-webkit-scrollbar{width:10px}.neiki-content::-webkit-scrollbar-track{background:var(--neiki-scrollbar-track)}.neiki-content::-webkit-scrollbar-thumb{background:var(--neiki-scrollbar-thumb);border-radius:5px}.neiki-content::-webkit-scrollbar-thumb:hover{background:var(--neiki-border-color-dark)}.neiki-content p{margin:0 0 1em}.neiki-content h1{font-size:2em;font-weight:700;margin:0 0 .5em}.neiki-content h2{font-size:1.5em;font-weight:600;margin:0 0 .5em}.neiki-content h3{font-size:1.25em;font-weight:600;margin:0 0 .5em}.neiki-content h4{font-size:1.1em;font-weight:600;margin:0 0 .5em}.neiki-content h5{font-size:1em;font-weight:600;margin:0 0 .5em}.neiki-content h6{font-size:.9em;font-weight:600;margin:0 0 .5em}.neiki-content ol,.neiki-content ul{margin:0 0 1em;padding-left:2em}.neiki-content li{margin-bottom:.25em}.neiki-content blockquote{margin:0 0 1em;padding:10px 20px;border-left:4px solid var(--neiki-accent-color);background:var(--neiki-bg-secondary);font-style:italic}.neiki-content code,.neiki-content pre{background:var(--neiki-bg-tertiary);font-family:Consolas,Monaco,monospace}.neiki-content pre{margin:0 0 1em;padding:16px;border-radius:4px;overflow-x:auto;font-size:13px}.neiki-content code{padding:2px 6px;border-radius:3px;font-size:.9em}.neiki-content a{color:var(--neiki-accent-color);text-decoration:underline}.neiki-content a:hover{color:var(--neiki-accent-hover)}.neiki-content img{max-width:100%;height:auto;border-radius:4px;cursor:pointer}.neiki-content img.neiki-selected{outline:2px solid var(--neiki-accent-color);outline-offset:2px}.neiki-highlight{background:var(--neiki-highlight-color);padding:1px 0}.neiki-content table,.neiki-table{width:100%;border-collapse:collapse;margin:1em 0;table-layout:fixed}.neiki-content table td,.neiki-content table th{border:1px solid var(--neiki-table-border);padding:8px 12px;min-width:50px;vertical-align:top;position:relative}.neiki-content table th{background:var(--neiki-bg-secondary);font-weight:600}.neiki-btn-secondary:hover,.neiki-button-secondary:hover,.neiki-content table td:hover,.neiki-content table th:hover,.neiki-context-item:hover,.neiki-context-menu-item:hover,.neiki-dropdown-item:hover,.neiki-fontsize-dropdown-item:hover,.neiki-special-char-item:hover{background:var(--neiki-bg-hover)}.neiki-content table td.neiki-cell-selected,.neiki-content table th.neiki-cell-selected{background:var(--neiki-selection-bg)}.neiki-table-resize-handle{position:absolute;top:0;right:-3px;width:6px;height:100%;cursor:col-resize;z-index:10}.neiki-table-resize-handle:hover{background:var(--neiki-accent-color)}.neiki-statusbar{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background:var(--neiki-statusbar-bg);border-top:1px solid var(--neiki-border-color);font-size:12px;color:var(--neiki-text-muted)}.neiki-statusbar-left,.neiki-statusbar-right{display:flex;align-items:center;gap:16px}.neiki-statusbar-item{display:flex;align-items:center;gap:4px}.neiki-statusbar-block{font-family:Consolas,Monaco,monospace;font-size:11px;padding:2px 6px;background:var(--neiki-bg-tertiary);border-radius:3px;color:var(--neiki-accent-color);font-weight:600;border:1px solid var(--neiki-border-color)}.neiki-dropdown{position:absolute;top:100%;left:0;z-index:1000;min-width:180px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:6px;box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-dropdown-item{display:flex;align-items:center;gap:6px;padding:7px 10px;border-radius:4px;cursor:pointer;color:var(--neiki-text-primary);font-size:13px;transition:background .1s}.neiki-color-picker,.neiki-emoji-picker{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.neiki-dropdown-item.active{background:var(--neiki-bg-active);color:var(--neiki-accent-color)}.neiki-context-divider,.neiki-context-menu-divider,.neiki-dropdown-divider{height:1px;background:var(--neiki-border-color);margin:4px 0}.neiki-color-picker,.neiki-emoji-picker,.neiki-special-picker{background:var(--neiki-bg-primary);padding:8px;margin-top:4px;position:absolute;top:100%;z-index:1000;box-shadow:var(--neiki-shadow-lg);left:0}.neiki-color-picker{width:220px;border:1px solid var(--neiki-border-color);border-radius:8px}.neiki-color-swatch{width:20px;height:20px;border-radius:3px;cursor:pointer;border:1px solid var(--neiki-border-color);transition:transform .1s}.neiki-color-swatch:hover{transform:scale(1.2);z-index:1}.neiki-color-swatch.neiki-color-reset{background:#fff;position:relative;overflow:hidden;border:1px solid #ccc}.neiki-color-preset.active,.neiki-special-item:hover{border-color:var(--neiki-accent-color)}.neiki-color-swatch.neiki-color-reset::after{content:'';position:absolute;top:50%;left:-2px;right:-2px;height:2px;background:#e53935;transform:rotate(-45deg);transform-origin:center;pointer-events:none}.neiki-color-picker-label{font-size:11px;font-weight:600;color:var(--neiki-text-muted);text-transform:uppercase;margin-bottom:8px}.neiki-emoji-item,.neiki-special-item{align-items:center;font-size:18px;cursor:pointer}.neiki-emoji-picker{width:280px;max-height:250px;overflow-y:auto;border:1px solid var(--neiki-border-color);border-radius:8px}.neiki-emoji-item{display:flex;justify-content:center;width:24px;height:24px;border-radius:4px;transition:background .15s,transform .1s}.neiki-emoji-item:hover{background:var(--neiki-bg-hover);transform:scale(1.2)}.neiki-special-picker{width:320px;max-height:280px;overflow-y:auto;border:1px solid var(--neiki-border-color);border-radius:8px;display:grid;grid-template-columns:repeat(8,1fr);gap:4px}.neiki-special-item{display:flex;justify-content:center;width:32px;height:32px;border-radius:4px;border:1px solid var(--neiki-border-color);background:var(--neiki-bg-secondary);transition:.15s}.neiki-special-item:hover{background:var(--neiki-accent-color);color:#fff;transform:scale(1.1)}.neiki-highlight-find{background:#ffeb3b;padding:1px 0;border-radius:2px}.neiki-highlight-current{background:#ff9800;outline:#e65100 solid 2px}.neiki-color-presets{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-bottom:12px}.neiki-color-preset{width:32px;height:32px;border-radius:4px;border:2px solid transparent;cursor:pointer;transition:transform .1s,border-color .1s}.neiki-color-preset:hover{transform:scale(1.1)}.neiki-color-preset.neiki-color-reset{background:linear-gradient(45deg,#fff 45%,red 45%,red 55%,#fff 55%);border:1px solid var(--neiki-border-color)}.neiki-color-custom{display:flex;align-items:center;gap:8px;padding-top:8px;border-top:1px solid var(--neiki-border-color)}.neiki-color-custom input[type=color]{width:40px;height:32px;padding:0;border:1px solid var(--neiki-border-color);border-radius:4px;cursor:pointer}.neiki-color-custom input[type=text]{flex:1;height:32px;padding:0 8px;border:1px solid var(--neiki-border-color);border-radius:4px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:12px;font-family:monospace}.neiki-table-picker,.neiki-table-picker-cell{border:1px solid var(--neiki-border-color);background:var(--neiki-bg-primary)}.neiki-table-picker{position:absolute;top:100%;left:0;z-index:1000;border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:12px;display:none}.neiki-context-menu.show,.neiki-find-replace.show,.neiki-fontsize-dropdown.show,.neiki-table-picker.show{display:block}.neiki-table-picker-label{font-size:12px;color:var(--neiki-text-secondary);margin-bottom:8px;text-align:center}.neiki-dark .neiki-modal h3,.neiki-dark .neiki-modal-header h3,.neiki-modal-title{color:var(--neiki-text-primary)}.neiki-table-picker-grid{display:grid;grid-template-columns:repeat(10,20px);gap:2px}.neiki-table-picker-cell{width:20px;height:20px;border-radius:2px;cursor:pointer;transition:background .1s}.neiki-table-picker-cell.active,.neiki-table-picker-cell:hover{background:var(--neiki-accent-color);border-color:var(--neiki-accent-color)}.neiki-form-divider::after,.neiki-form-divider::before{content:'';height:1px;background:var(--neiki-border-color)}.neiki-special-chars{position:absolute;top:100%;left:0;z-index:1000;width:280px;max-height:300px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);display:none;overflow:hidden}.neiki-special-chars.show{display:flex;flex-direction:column}.neiki-special-chars-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;padding:8px;overflow-y:auto}.neiki-special-char-item{display:flex;align-items:center;justify-content:center;width:24px;height:24px;font-size:16px;border-radius:4px;cursor:pointer;transition:background .1s}.neiki-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--neiki-modal-overlay);z-index:10000;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:opacity .2s,visibility .2s}.neiki-modal-overlay.active,[data-tooltip]:hover::after{opacity:1;visibility:visible}.neiki-modal{background:var(--neiki-bg-primary);border-radius:12px;box-shadow:var(--neiki-shadow-lg);width:100%;max-width:440px;max-height:90vh;overflow:hidden}.neiki-modal-wide{max-width:520px}.neiki-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--neiki-border-color)}.neiki-modal-title{font-size:16px;font-weight:600;margin:0}.neiki-modal-close,.neiki-preview-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:0 0;border:none;border-radius:4px;cursor:pointer;color:var(--neiki-text-muted);transition:background .15s}.neiki-modal-body{padding:20px;overflow-y:auto}.neiki-modal h3,.neiki-modal-header h3{color:#000;margin:0}.neiki-modal-footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid var(--neiki-border-color)}.neiki-form-group{margin-bottom:16px}.neiki-find-replace-row:last-child,.neiki-form-group:last-child{margin-bottom:0}.neiki-form-group label,.neiki-form-label{display:block;margin-bottom:6px;font-size:13px;font-weight:500;color:var(--neiki-text-secondary)}.neiki-form-input,.neiki-form-textarea,.neiki-input{width:100%;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;transition:border-color .15s}.neiki-form-input,.neiki-input{height:40px;padding:0 12px;border:1px solid var(--neiki-border-color);border-radius:6px}.neiki-find-replace,.neiki-form-textarea{border:1px solid var(--neiki-border-color)}.neiki-form-input:focus,.neiki-form-textarea:focus,.neiki-input:focus{outline:0;border-color:var(--neiki-accent-color);box-shadow:0 0 0 3px rgba(13,110,253,.15)}.neiki-form-input::placeholder,.neiki-input::placeholder{color:var(--neiki-text-muted)}.neiki-form-row{display:flex;gap:16px}.neiki-form-divider{display:flex;align-items:center;margin:16px 0;text-align:center;position:relative}.neiki-form-divider::before{flex:1;margin-right:12px}.neiki-form-divider::after{flex:1;margin-left:12px}.neiki-form-divider span{color:var(--neiki-text-muted);font-size:12px;font-weight:500;text-transform:uppercase}.neiki-form-textarea{min-height:120px;padding:12px;border-radius:6px;font-family:inherit;resize:vertical}.neiki-btn-primary,.neiki-btn-secondary,.neiki-button{display:inline-flex;align-items:center;height:38px;padding:0 16px;font-size:14px;transition:.15s;font-weight:500;cursor:pointer}.neiki-button{justify-content:center;gap:6px;border:1px solid transparent;border-radius:6px}.neiki-btn-primary,.neiki-button-primary{background:var(--neiki-accent-color);color:#fff}.neiki-btn-primary:hover,.neiki-button-primary:hover{background:var(--neiki-accent-hover)}.neiki-btn-secondary,.neiki-button-secondary{background:var(--neiki-bg-secondary);color:var(--neiki-text-primary);border-color:var(--neiki-border-color)}.neiki-btn-primary,.neiki-btn-secondary{justify-content:center;border:1px solid transparent;border-radius:6px}.neiki-btn-secondary{border-color:var(--neiki-border-color)}.neiki-button-danger{background:var(--neiki-danger-color);color:#fff}.neiki-code-view,.neiki-find-replace,.neiki-find-replace-input{background:var(--neiki-bg-primary)}.neiki-button-danger:hover{opacity:.9}.neiki-find-replace{position:absolute;top:0;right:0;z-index:100;width:360px;border-radius:0 0 0 8px;box-shadow:var(--neiki-shadow-lg);display:none}.neiki-find-replace-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--neiki-border-color)}.neiki-code-view-title,.neiki-find-replace-title{font-size:13px;font-weight:600;color:var(--neiki-text-primary)}.neiki-find-replace-body{padding:12px}.neiki-find-replace-row{display:flex;gap:8px;margin-bottom:10px}.neiki-find-replace-input{flex:1;height:32px;padding:0 10px;border:1px solid var(--neiki-border-color);border-radius:4px;color:var(--neiki-text-primary);font-size:13px}.neiki-find-replace-input:focus{outline:0;border-color:var(--neiki-accent-color)}.neiki-find-replace-options{display:flex;align-items:center;gap:12px;margin-bottom:10px}.neiki-find-replace-option{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--neiki-text-secondary);cursor:pointer}.neiki-find-replace-actions{display:flex;gap:6px;flex-wrap:wrap}.neiki-find-replace-btn{height:28px;padding:0 10px;font-size:12px;border-radius:4px}.neiki-find-replace-count{font-size:12px;color:var(--neiki-text-muted);margin-left:auto}.neiki-code-view{position:absolute;top:0;left:0;right:0;bottom:0;z-index:50;display:none;flex-direction:column}.neiki-code-view.show,.neiki-drop-overlay.show{display:flex}.neiki-code-view-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--neiki-bg-secondary);border-bottom:1px solid var(--neiki-border-color);flex-shrink:0}.neiki-code-view-textarea{flex:1;width:100%;padding:16px;border:none;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-family:Consolas,Monaco,'Courier New',monospace;font-size:13px;line-height:1.5;resize:none}.neiki-code-view-apply{width:auto!important;padding:0 12px!important;display:inline-flex;align-items:center;gap:4px;height:30px;font-size:12px;background:var(--neiki-accent-color)!important;color:#fff!important;border-radius:5px}.neiki-context-menu,.neiki-floating-btn,.neiki-floating-toolbar{background:var(--neiki-bg-primary)}.neiki-code-view-apply:hover{background:var(--neiki-accent-hover)!important;color:#fff!important}.neiki-code-view-apply svg{width:14px!important;height:14px!important}.neiki-context-menu{position:fixed;z-index:10001;min-width:180px;border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:4px;display:none}.neiki-context-item,.neiki-context-menu-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:4px;cursor:pointer;color:var(--neiki-text-primary);font-size:13px;transition:background .1s}.neiki-context-item.neiki-context-danger,.neiki-context-menu-item.danger{color:var(--neiki-danger-color)}.neiki-context-item svg,.neiki-context-menu-item svg,.neiki-dropdown-item-icon svg,.neiki-floating-btn svg{width:16px;height:16px;fill:currentColor}.neiki-floating-toolbar{position:absolute;z-index:1000;display:none;border:1px solid var(--neiki-border-color);border-radius:8px;box-shadow:var(--neiki-shadow-lg);padding:4px}.neiki-floating-toolbar.show{display:flex;align-items:center;gap:2px}.neiki-floating-btn{width:32px;height:32px;border:none;color:var(--neiki-text-primary);border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.15s}.neiki-floating-btn:hover{background:var(--neiki-bg-hover);color:var(--neiki-accent-color)}.neiki-floating-toolbar .neiki-btn{width:28px;height:28px}.neiki-chevron svg,.neiki-floating-toolbar .neiki-btn svg{width:14px;height:14px}.neiki-more-btn,[data-tooltip]{position:relative}[data-tooltip]::after{content:attr(data-tooltip);position:absolute;bottom:100%;left:50%;transform:translateX(-50%);padding:6px 10px;background:var(--neiki-text-primary);color:var(--neiki-bg-primary);font-size:11px;font-weight:500;white-space:nowrap;border-radius:4px;opacity:0;visibility:hidden;transition:opacity .15s,visibility .15s;pointer-events:none;z-index:10002;margin-bottom:6px}.neiki-drop-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(13,110,253,.1);border:3px dashed var(--neiki-accent-color);border-radius:8px;display:none;align-items:center;justify-content:center;z-index:100;pointer-events:none}.neiki-drop-overlay-text{font-size:18px;font-weight:600;color:var(--neiki-accent-color)}.neiki-image-wrapper{display:inline-block;position:relative}.neiki-image-wrapper.selected{outline:2px solid var(--neiki-accent-color)}.neiki-resize-handle{position:absolute;width:10px;height:10px;background:var(--neiki-accent-color);border:2px solid #fff;border-radius:2px}.neiki-resize-handle.nw{top:-5px;left:-5px;cursor:nw-resize}.neiki-resize-handle.ne{top:-5px;right:-5px;cursor:ne-resize}.neiki-resize-handle.sw{bottom:-5px;left:-5px;cursor:sw-resize}.neiki-resize-handle.se{bottom:-5px;right:-5px;cursor:se-resize}@media print{.neiki-content,.neiki-editor-wrapper{overflow:visible!important}.neiki-editor{border:none!important;box-shadow:none!important}.neiki-code-view-header,.neiki-find-replace,.neiki-floating-toolbar,.neiki-statusbar,.neiki-toolbar{display:none!important}.neiki-content{padding:0!important}}@media (max-width:768px){.neiki-toolbar{padding:4px;gap:1px}.neiki-toolbar-group{padding:0 2px}.neiki-toolbar-group:not(:last-child){padding-right:4px;margin-right:2px}.neiki-btn{width:28px;height:28px}.neiki-btn svg{width:16px;height:16px}.neiki-select{height:28px;min-width:80px;font-size:12px;padding:0 24px 0 8px}.neiki-content{padding:12px 16px}.neiki-statusbar{padding:4px 8px;font-size:11px}.neiki-modal{width:95%;max-width:none;margin:10px}.neiki-find-replace{width:100%;border-radius:0}.neiki-checkbox-wrapper{padding:0 4px;font-size:11px}}@media (max-width:480px){.neiki-toolbar-group:not(:last-child){border-right:none;padding-right:2px;margin-right:0}.neiki-select{min-width:60px}.neiki-statusbar-left,.neiki-statusbar-right{gap:8px}}@keyframes neiki-fade-in{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.neiki-color-picker.show,.neiki-dropdown.show,.neiki-emoji-picker.show,.neiki-special-chars.show,.neiki-table-picker.show{animation:.15s neiki-fade-in}@keyframes neiki-modal-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neiki-fontsize-widget{display:inline-flex;align-items:center;position:relative;height:32px;border:1px solid var(--neiki-border-color);border-radius:4px;overflow:visible;background:var(--neiki-bg-primary)}.neiki-fontsize-btn{display:flex;align-items:center;justify-content:center;width:26px;height:30px;background:0 0;border:none;cursor:pointer;color:var(--neiki-text-secondary);transition:background .15s,color .15s;padding:0}.neiki-fontsize-dropdown-item,.neiki-fontsize-input{color:var(--neiki-text-primary);text-align:center;font-size:13px}.neiki-fontsize-input{width:38px;height:30px;border:none;border-left:1px solid var(--neiki-border-color);border-right:1px solid var(--neiki-border-color);background:var(--neiki-bg-primary);outline:0;-moz-appearance:textfield;appearance:textfield;padding:0}.neiki-fontsize-dropdown,.neiki-insert-dropdown{left:0;border:1px solid var(--neiki-border-color)}.neiki-fontsize-input::-webkit-inner-spin-button,.neiki-fontsize-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.neiki-fontsize-dropdown{display:none;position:absolute;top:100%;z-index:1000;min-width:70px;max-height:240px;overflow-y:auto;background:var(--neiki-bg-primary);border-radius:6px;box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-fontsize-dropdown-item{padding:6px 12px;cursor:pointer;border-radius:4px;transition:background .1s}.neiki-insert-dropdown-btn{width:auto!important;padding:0 8px!important;gap:4px;font-size:13px;font-weight:500}.neiki-insert-label{font-size:13px;pointer-events:none}.neiki-chevron{display:inline-flex;pointer-events:none}.neiki-insert-dropdown,.neiki-more-dropdown{display:none;position:absolute;top:100%;z-index:1000;background:var(--neiki-bg-primary);box-shadow:var(--neiki-shadow-lg);padding:4px;margin-top:4px}.neiki-insert-dropdown{min-width:160px;border-radius:6px}.neiki-insert-dropdown.show,.neiki-more-dropdown.show{display:block;animation:.15s neiki-fade-in}.neiki-more-dropdown{right:0;min-width:140px;max-width:170px;border:1px solid var(--neiki-border-color);border-radius:6px}.neiki-lang-cs .neiki-more-dropdown{min-width:165px}.neiki-dropdown-item-icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0}.neiki-dropdown-item-danger{color:var(--neiki-danger-color)!important}.neiki-dropdown-item-danger:hover{background:rgba(220,53,69,.1)}.neiki-autosave-badge{font-size:12px;font-weight:600;color:var(--neiki-text-muted);padding:0 4px}.neiki-autosave-badge.active{color:var(--neiki-success-color)}.neiki-preview-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:100000;display:flex;align-items:center;justify-content:center;padding:30px;animation:.2s neiki-fade-in}.neiki-preview-modal{background:var(--neiki-bg-primary);border-radius:12px;width:100%;max-width:900px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 25px 60px rgba(0,0,0,.3);animation:.2s neiki-modal-in}.neiki-preview-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:var(--neiki-bg-secondary);border-bottom:1px solid var(--neiki-border-color);font-weight:600;font-size:14px;color:var(--neiki-text-primary)}.neiki-preview-close svg{width:18px;height:18px;fill:currentColor}.neiki-preview-body{flex:1;overflow:auto;padding:30px;color:var(--neiki-text-primary);font-size:15px;line-height:1.7}.neiki-preview-body img{max-width:100%}.neiki-preview-body table{border-collapse:collapse;width:100%}.neiki-preview-body table td,.neiki-preview-body table th{border:1px solid var(--neiki-border-color);padding:8px 12px}.neiki-statusbar-autosave{font-style:italic;color:var(--neiki-success-color);font-size:11px}",document.head.appendChild(e)}();const t={en:{"toolbar.undo":"Undo (Ctrl+Z)","toolbar.redo":"Redo (Ctrl+Y)","toolbar.bold":"Bold (Ctrl+B)","toolbar.italic":"Italic (Ctrl+I)","toolbar.underline":"Underline (Ctrl+U)","toolbar.strikethrough":"Strikethrough","toolbar.heading":"Heading","toolbar.fontSize":"Font Size","toolbar.fontFamily":"Font Family","toolbar.foreColor":"Text Color","toolbar.backColor":"Background Color","toolbar.alignLeft":"Align Left","toolbar.alignCenter":"Align Center","toolbar.alignRight":"Align Right","toolbar.alignJustify":"Justify","toolbar.bulletList":"Bullet List","toolbar.numberedList":"Numbered List","toolbar.indent":"Increase Indent","toolbar.outdent":"Decrease Indent","toolbar.link":"Insert Link (Ctrl+K)","toolbar.image":"Insert Image","toolbar.table":"Insert Table","toolbar.blockquote":"Blockquote","toolbar.viewCode":"View Code (Toggle HTML)","toolbar.horizontalRule":"Horizontal Line","toolbar.subscript":"Subscript","toolbar.superscript":"Superscript","toolbar.removeFormat":"Remove Formatting","toolbar.findReplace":"Find & Replace","toolbar.emoji":"Insert Emoji","toolbar.specialChars":"Special Characters","toolbar.fullscreen":"Fullscreen","toolbar.autosave":"Toggle Autosave","toolbar.themeToggle":"Toggle Theme","toolbar.print":"Print","toolbar.insert":"Insert","toolbar.moreOptions":"More options","toolbar.decreaseFontSize":"Decrease font size","toolbar.increaseFontSize":"Increase font size","heading.paragraph":"Paragraph","heading.h1":"Heading 1","heading.h2":"Heading 2","heading.h3":"Heading 3","heading.h4":"Heading 4","heading.h5":"Heading 5","heading.h6":"Heading 6","font.sansSerif":"Sans Serif","font.serif":"Serif","font.monospace":"Monospace","font.cursive":"Cursive","insert.link":"Link","insert.image":"Image","insert.table":"Table","insert.emoji":"Emoji","insert.symbol":"Symbol","menu.save":"Save","menu.preview":"Preview","menu.download":"Download","menu.print":"Print","menu.autosave":"Autosave","menu.clearAll":"Clear all","menu.toggleTheme":"Toggle Theme","menu.fullscreen":"Fullscreen","modal.insertLink":"Insert Link","modal.url":"URL","modal.text":"Text","modal.linkText":"Link text","modal.openInNewTab":"Open in new tab","modal.cancel":"Cancel","modal.insert":"Insert","modal.insertImage":"Insert Image","modal.uploadImage":"Upload Image","modal.convertedToBase64":"Will be converted to base64","modal.or":"OR","modal.imageUrl":"Image URL","modal.altText":"Alt Text","modal.describeImage":"Describe the image","modal.widthOptional":"Width (optional)","modal.invalidImageFile":"Please select a valid image file.","modal.insertTable":"Insert Table","modal.rows":"Rows","modal.columns":"Columns","modal.includeHeaderRow":"Include header row","modal.findReplace":"Find & Replace","modal.find":"Find","modal.searchText":"Search text...","modal.replaceWith":"Replace with","modal.replacementText":"Replacement text...","modal.useRegex":"Use Regular Expression","modal.caseSensitive":"Case Sensitive","modal.findNext":"Find Next","modal.replace":"Replace","modal.replaceAll":"Replace All","modal.invalidRegex":"Invalid regex","modal.matchesFound":"{count} match(es) found","modal.matchOf":"Match {current} of {total}","modal.matchesRemaining":"{count} match(es) remaining","modal.replacedOccurrences":"Replaced {count} occurrence(s)","status.words":"words","status.word":"word","status.chars":"chars","status.char":"char","autosave.savedLocally":"Saved locally","autosave.autosaving":"Autosaving...","preview.title":"Document Preview","confirm.clearAll":"Clear all content?",placeholder:"Start typing..."},cs:{"toolbar.undo":"Zpět (Ctrl+Z)","toolbar.redo":"Znovu (Ctrl+Y)","toolbar.bold":"Tučné (Ctrl+B)","toolbar.italic":"Kurzíva (Ctrl+I)","toolbar.underline":"Podtržené (Ctrl+U)","toolbar.strikethrough":"Přeškrtnuté","toolbar.heading":"Nadpis","toolbar.fontSize":"Velikost písma","toolbar.fontFamily":"Rodina písma","toolbar.foreColor":"Barva textu","toolbar.backColor":"Barva pozadí","toolbar.alignLeft":"Zarovnat vlevo","toolbar.alignCenter":"Zarovnat na střed","toolbar.alignRight":"Zarovnat vpravo","toolbar.alignJustify":"Do bloku","toolbar.bulletList":"Odrážkový seznam","toolbar.numberedList":"Číslovaný seznam","toolbar.indent":"Zvětšit odsazení","toolbar.outdent":"Zmenšit odsazení","toolbar.link":"Vložit odkaz (Ctrl+K)","toolbar.image":"Vložit obrázek","toolbar.table":"Vložit tabulku","toolbar.blockquote":"Citace","toolbar.viewCode":"Zobrazit kód (HTML)","toolbar.horizontalRule":"Vodorovná čára","toolbar.subscript":"Dolní index","toolbar.superscript":"Horní index","toolbar.removeFormat":"Odstranit formátování","toolbar.findReplace":"Najít a nahradit","toolbar.emoji":"Vložit emoji","toolbar.specialChars":"Speciální znaky","toolbar.fullscreen":"Celá obrazovka","toolbar.autosave":"Auto. ukládání","toolbar.themeToggle":"Přepnout motiv","toolbar.print":"Tisk","toolbar.insert":"Vložit","toolbar.moreOptions":"Další možnosti","toolbar.decreaseFontSize":"Zmenšit písmo","toolbar.increaseFontSize":"Zvětšit písmo","heading.paragraph":"Odstavec","heading.h1":"Nadpis 1","heading.h2":"Nadpis 2","heading.h3":"Nadpis 3","heading.h4":"Nadpis 4","heading.h5":"Nadpis 5","heading.h6":"Nadpis 6","font.sansSerif":"Sans Serif","font.serif":"Serif","font.monospace":"Monospace","font.cursive":"Cursive","insert.link":"Odkaz","insert.image":"Obrázek","insert.table":"Tabulka","insert.emoji":"Emoji","insert.symbol":"Symbol","menu.save":"Uložit","menu.preview":"Náhled","menu.download":"Stáhnout","menu.print":"Tisk","menu.autosave":"Auto. ukládání","menu.clearAll":"Vymazat vše","menu.toggleTheme":"Přepnout motiv","menu.fullscreen":"Celá obrazovka","modal.insertLink":"Vložit odkaz","modal.url":"URL","modal.text":"Text","modal.linkText":"Text odkazu","modal.openInNewTab":"Otevřít v nové záložce","modal.cancel":"Zrušit","modal.insert":"Vložit","modal.insertImage":"Vložit obrázek","modal.uploadImage":"Nahrát obrázek","modal.convertedToBase64":"Bude převeden na base64","modal.or":"NEBO","modal.imageUrl":"URL obrázku","modal.altText":"Alternativní text","modal.describeImage":"Popis obrázku","modal.widthOptional":"Šířka (volitelné)","modal.invalidImageFile":"Vyberte prosím platný soubor obrázku.","modal.insertTable":"Vložit tabulku","modal.rows":"Řádky","modal.columns":"Sloupce","modal.includeHeaderRow":"Včetně řádku záhlaví","modal.findReplace":"Najít a nahradit","modal.find":"Najít","modal.searchText":"Hledaný text...","modal.replaceWith":"Nahradit za","modal.replacementText":"Text náhrady...","modal.useRegex":"Použít regulární výraz","modal.caseSensitive":"Rozlišovat velikost písmen","modal.findNext":"Najít další","modal.replace":"Nahradit","modal.replaceAll":"Nahradit vše","modal.invalidRegex":"Neplatný regulární výraz","modal.matchesFound":"Nalezeno {count} shod","modal.matchOf":"Shoda {current} z {total}","modal.matchesRemaining":"Zbývá {count} shod","modal.replacedOccurrences":"Nahrazeno {count} výskytů","status.words":"slov","status.word":"slovo","status.chars":"znaků","status.char":"znak","autosave.savedLocally":"Uloženo lokálně","autosave.autosaving":"Ukládám...","preview.title":"Náhled dokumentu","confirm.clearAll":"Vymazat veškerý obsah?",placeholder:"Začněte psát..."}};let i="en";function n(e,i){e&&"object"==typeof i&&(t[e]||(t[e]={}),Object.assign(t[e],i))}function o(e,n={}){const o=i||"en";let a=t[o]?.[e]||t.en?.[e]||e;return Object.keys(n).forEach(e=>{a=a.replace(new RegExp(`\\{${e}\\}`,"g"),n[e])}),a}const a={toolbar:["viewCode","undo","redo","findReplace","|","bold","italic","underline","strikethrough","superscript","subscript","removeFormat","|","heading","fontFamily","fontSize","|","foreColor","backColor","|","alignLeft","alignCenter","alignRight","alignJustify","|","indent","outdent","|","bulletList","numberedList","blockquote","horizontalRule","|","insertDropdown","|","moreMenu"],placeholder:"Start typing...",minHeight:300,maxHeight:null,autofocus:!1,spellcheck:!0,readonly:!1,theme:"light",language:"en",translations:null,plugins:[],onChange:null,onSave:null,onFocus:null,onBlur:null,onReady:null},r={undo:{icon:"undo",titleKey:"toolbar.undo",command:"undo"},redo:{icon:"redo",titleKey:"toolbar.redo",command:"redo"},bold:{icon:"bold",titleKey:"toolbar.bold",command:"bold"},italic:{icon:"italic",titleKey:"toolbar.italic",command:"italic"},underline:{icon:"underline",titleKey:"toolbar.underline",command:"underline"},strikethrough:{icon:"strikethrough",titleKey:"toolbar.strikethrough",command:"strikeThrough"},heading:{titleKey:"toolbar.heading",command:"heading",type:"select"},fontSize:{titleKey:"toolbar.fontSize",command:"fontSize",type:"fontSizeWidget"},fontFamily:{titleKey:"toolbar.fontFamily",command:"fontFamily",type:"select"},foreColor:{icon:"text-color",titleKey:"toolbar.foreColor",command:"foreColor",picker:"color"},backColor:{icon:"highlight",titleKey:"toolbar.backColor",command:"backColor",picker:"color"},alignLeft:{icon:"align-left",titleKey:"toolbar.alignLeft",command:"justifyLeft"},alignCenter:{icon:"align-center",titleKey:"toolbar.alignCenter",command:"justifyCenter"},alignRight:{icon:"align-right",titleKey:"toolbar.alignRight",command:"justifyRight"},alignJustify:{icon:"align-justify",titleKey:"toolbar.alignJustify",command:"justifyFull"},bulletList:{icon:"list-ul",titleKey:"toolbar.bulletList",command:"insertUnorderedList"},numberedList:{icon:"list-ol",titleKey:"toolbar.numberedList",command:"insertOrderedList"},indent:{icon:"indent",titleKey:"toolbar.indent",command:"indent"},outdent:{icon:"outdent",titleKey:"toolbar.outdent",command:"outdent"},link:{icon:"link",titleKey:"toolbar.link",command:"createLink",modal:!0},image:{icon:"image",titleKey:"toolbar.image",command:"insertImage",modal:!0},table:{icon:"table",titleKey:"toolbar.table",command:"insertTable",modal:!0},blockquote:{icon:"quote",titleKey:"toolbar.blockquote",command:"formatBlock",value:"blockquote"},viewCode:{icon:"code",titleKey:"toolbar.viewCode",command:"viewCode"},horizontalRule:{icon:"minus",titleKey:"toolbar.horizontalRule",command:"insertHorizontalRule"},subscript:{icon:"subscript",titleKey:"toolbar.subscript",command:"subscript"},superscript:{icon:"superscript",titleKey:"toolbar.superscript",command:"superscript"},removeFormat:{icon:"eraser",titleKey:"toolbar.removeFormat",command:"removeFormat"},findReplace:{icon:"search",titleKey:"toolbar.findReplace",command:"findReplace",modal:!0},emoji:{icon:"emoji",titleKey:"toolbar.emoji",command:"emoji",picker:"emoji"},specialChars:{icon:"specialChars",titleKey:"toolbar.specialChars",command:"specialChars",picker:"specialChars"},fullscreen:{icon:"fullscreen",titleKey:"toolbar.fullscreen",command:"fullscreen"},autosave:{icon:"save",titleKey:"toolbar.autosave",command:"autosave",toggle:!0},themeToggle:{icon:"sun",titleKey:"toolbar.themeToggle",command:"themeToggle",toggle:!0},print:{icon:"print",titleKey:"toolbar.print",command:"print"},insertDropdown:{icon:"plus",titleKey:"toolbar.insert",type:"insertDropdown"},moreMenu:{icon:"more",titleKey:"toolbar.moreOptions",type:"moreMenu"}},s=[8,9,10,11,12,14,18,24,30,36,48,60,72,96],l=[{labelKey:"font.sansSerif",value:"Arial, sans-serif"},{labelKey:"font.serif",value:"Georgia, serif"},{labelKey:"font.monospace",value:"Consolas, monospace"},{labelKey:"font.cursive",value:"Comic Sans MS, cursive"}],c=[{labelKey:"heading.paragraph",value:"p"},{labelKey:"heading.h1",value:"h1"},{labelKey:"heading.h2",value:"h2"},{labelKey:"heading.h3",value:"h3"},{labelKey:"heading.h4",value:"h4"},{labelKey:"heading.h5",value:"h5"},{labelKey:"heading.h6",value:"h6"}],d=["😀","😃","😄","😁","😅","😂","🤣","😊","😇","🙂","😉","😌","😍","🥰","😘","😗","😙","😚","😋","😛","😜","🤪","😝","🤑","🤗","🤭","🤫","🤔","🤐","🤨","😐","😑","😶","😏","😒","🙄","😬","🤥","😌","😔","😪","🤤","😴","😷","🤒","🤕","🤢","🤮","🤧","🥵","👍","👎","👌","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","👇","☝️","👋","🤚","🖐️","✋","🖖","👏","🙌","❤️","🧡","💛","💚","💙","💜","🖤","🤍","🤎","💔","⭐","🌟","✨","💫","🔥","💥","💯","✅","❌","❓"],h=[{char:"©",name:"Copyright"},{char:"®",name:"Registered"},{char:"™",name:"Trademark"},{char:"€",name:"Euro"},{char:"£",name:"Pound"},{char:"¥",name:"Yen"},{char:"¢",name:"Cent"},{char:"°",name:"Degree"},{char:"±",name:"Plus-Minus"},{char:"×",name:"Multiply"},{char:"÷",name:"Divide"},{char:"≠",name:"Not Equal"},{char:"≤",name:"Less or Equal"},{char:"≥",name:"Greater or Equal"},{char:"∞",name:"Infinity"},{char:"√",name:"Square Root"},{char:"π",name:"Pi"},{char:"Ω",name:"Omega"},{char:"α",name:"Alpha"},{char:"β",name:"Beta"},{char:"γ",name:"Gamma"},{char:"δ",name:"Delta"},{char:"µ",name:"Micro"},{char:"∑",name:"Sum"},{char:"∆",name:"Delta (big)"},{char:"←",name:"Left Arrow"},{char:"→",name:"Right Arrow"},{char:"↑",name:"Up Arrow"},{char:"↓",name:"Down Arrow"},{char:"↔",name:"Left-Right Arrow"},{char:"•",name:"Bullet"},{char:"…",name:"Ellipsis"},{char:"—",name:"Em Dash"},{char:"–",name:"En Dash"},{char:"§",name:"Section"},{char:"¶",name:"Paragraph"},{char:"†",name:"Dagger"},{char:"‡",name:"Double Dagger"},{char:"♠",name:"Spade"},{char:"♣",name:"Club"},{char:"♥",name:"Heart"},{char:"♦",name:"Diamond"}],p=["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#f3f3f3","#ffffff","#980000","#ff0000","#ff9900","#ffff00","#00ff00","#00ffff","#4a86e8","#0000ff","#9900ff","#ff00ff","#e6b8af","#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#c9daf8","#cfe2f3","#d9d2e9","#ead1dc","#dd7e6b","#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#a4c2f4","#9fc5e8","#b4a7d6","#d5a6bd","#cc4125","#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6d9eeb","#6fa8dc","#8e7cc3","#c27ba0","#a61c00","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79","#85200c","#990000","#b45f06","#bf9000","#38761d","#134f5c","#1155cc","#0b5394","#351c75","#741b47","#5b0f00","#660000","#783f04","#7f6000","#274e13","#0c343d","#1c4587","#073763","#20124d","#4c1130"],m={generateId:()=>"neiki-"+Math.random().toString(36).substr(2,9),createElement(e,t={},i=[]){const n=document.createElement(e);return Object.entries(t).forEach(([e,t])=>{"className"===e?n.className=t:"innerHTML"===e?n.innerHTML=t:"textContent"===e?n.textContent=t:e.startsWith("on")&&"function"==typeof t?n.addEventListener(e.slice(2).toLowerCase(),t):"style"===e&&"object"==typeof t?Object.assign(n.style,t):n.setAttribute(e,t)}),i.forEach(e=>{"string"==typeof e?n.appendChild(document.createTextNode(e)):e instanceof Node&&n.appendChild(e)}),n},debounce(e,t){let i;return function(...n){clearTimeout(i),i=setTimeout(()=>e.apply(this,n),t)}},deepMerge(e,t){const i={...e};return Object.keys(t).forEach(e=>{t[e]&&"object"==typeof t[e]&&!Array.isArray(t[e])?i[e]=m.deepMerge(i[e]||{},t[e]):i[e]=t[e]}),i},sanitizeHTML(e){const t=document.createElement("div");t.innerHTML=e;return t.querySelectorAll("script").forEach(e=>e.remove()),t.innerHTML},isValidUrl(e){try{return new URL(e),!0}catch(e){return!1}},getSelection:()=>window.getSelection(),saveSelection(){const e=window.getSelection();return e.rangeCount>0?e.getRangeAt(0).cloneRange():null},restoreSelection(e){if(e){const t=window.getSelection();t.removeAllRanges(),t.addRange(e)}}},u={undo:'<svg viewBox="0 0 24 24"><path d="M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"/></svg>',redo:'<svg viewBox="0 0 24 24"><path d="M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"/></svg>',bold:'<svg viewBox="0 0 24 24"><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></svg>',italic:'<svg viewBox="0 0 24 24"><path d="M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z"/></svg>',underline:'<svg viewBox="0 0 24 24"><path d="M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z"/></svg>',strikethrough:'<svg viewBox="0 0 24 24"><path d="M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z"/></svg>',heading:'<svg viewBox="0 0 24 24"><path d="M5 4v3h5.5v12h3V7H19V4z"/></svg>',"font-size":'<svg viewBox="0 0 24 24"><path d="M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3v-3H3v3z"/></svg>',font:'<svg viewBox="0 0 24 24"><path d="M9.93 13.5h4.14L12 7.98 9.93 13.5zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z"/></svg>',"text-color":'<svg viewBox="0 0 24 24"><path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/><rect x="3" y="19" width="18" height="3" fill="currentColor"/></svg>',highlight:'<svg viewBox="0 0 24 24"><path d="M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z"/><rect x="0" y="20" width="24" height="4"/></svg>',"align-left":'<svg viewBox="0 0 24 24"><path d="M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z"/></svg>',"align-center":'<svg viewBox="0 0 24 24"><path d="M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z"/></svg>',"align-right":'<svg viewBox="0 0 24 24"><path d="M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z"/></svg>',"align-justify":'<svg viewBox="0 0 24 24"><path d="M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z"/></svg>',"list-ul":'<svg viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>',"list-ol":'<svg viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>',indent:'<svg viewBox="0 0 24 24"><path d="M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></svg>',outdent:'<svg viewBox="0 0 24 24"><path d="M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></svg>',link:'<svg viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>',image:'<svg viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',table:'<svg viewBox="0 0 24 24"><path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"/></svg>',quote:'<svg viewBox="0 0 24 24"><path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z"/></svg>',code:'<svg viewBox="0 0 24 24"><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></svg>',minus:'<svg viewBox="0 0 24 24"><path d="M19 13H5v-2h14v2z"/></svg>',eraser:'<svg viewBox="0 0 24 24"><path d="M16.24 3.56l4.95 4.94c.78.79.78 2.05 0 2.84L12 20.53a4.008 4.008 0 01-5.66 0L2.81 17c-.78-.79-.78-2.05 0-2.84l10.6-10.6c.79-.78 2.05-.78 2.83 0zm-1.41 1.42L6.93 12.9l4.24 4.24 7.9-7.9-4.24-4.26z"/></svg>',fullscreen:'<svg viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>',close:'<svg viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>',check:'<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>',save:'<svg viewBox="0 0 24 24"><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>',print:'<svg viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></svg>',subscript:'<svg viewBox="0 0 24 24"><path d="M22 18h-2v1h3v1h-4v-2.5c0-.83.67-1.5 1.5-1.5h1.5v-1h-3v-1h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 18h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 4h-2.68l-3.07 4.99h-.12L8.87 4H6.19l4.32 6.73L5.88 18z"/></svg>',superscript:'<svg viewBox="0 0 24 24"><path d="M22 7h-2v1h3v1h-4V6.5c0-.83.67-1.5 1.5-1.5h1.5V4h-3V3h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 20h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 6h-2.68l-3.07 4.99h-.12L8.87 6H6.19l4.32 6.73L5.88 20z"/></svg>',search:'<svg viewBox="0 0 24 24"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>',emoji:'<svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></svg>',specialChars:'<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><text x="12" y="16" text-anchor="middle" font-size="12" font-weight="bold" fill="currentColor">©</text></svg>',sun:'<svg viewBox="0 0 24 24"><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></svg>',moon:'<svg viewBox="0 0 24 24"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z"/></svg>',plus:'<svg viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>',more:'<svg viewBox="0 0 24 24"><circle cx="6" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="18" cy="12" r="2"/></svg>',download:'<svg viewBox="0 0 24 24"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg>',eye:'<svg viewBox="0 0 24 24"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>',trash:'<svg viewBox="0 0 24 24"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg>',"chevron-down":'<svg viewBox="0 0 24 24"><path d="M7 10l5 5 5-5z"/></svg>'};class g{constructor(e){this.prefix="neiki_"+e+"_"}set(e,t){try{localStorage.setItem(this.prefix+e,JSON.stringify(t))}catch(e){console.warn("NeikiEditor: localStorage not available")}}get(e,t=null){try{const i=localStorage.getItem(this.prefix+e);return i?JSON.parse(i):t}catch(e){return t}}remove(e){try{localStorage.removeItem(this.prefix+e)}catch(e){}}static setGlobal(e,t){try{localStorage.setItem("neiki_global_"+e,JSON.stringify(t))}catch(e){}}static getGlobal(e,t=null){try{const i=localStorage.getItem("neiki_global_"+e);return i?JSON.parse(i):t}catch(e){return t}}}class v{constructor(e,t=100){this.editor=e,this.maxSize=t,this.undoStack=[],this.redoStack=[],this.isRecording=!0,this.loadFromStorage()}record(){if(!this.isRecording)return;const e=this.editor.getContent();this.undoStack[this.undoStack.length-1]!==e&&(this.undoStack.push(e),this.redoStack=[],this.undoStack.length>this.maxSize&&this.undoStack.shift(),this.saveToStorage())}undo(){if(this.undoStack.length<=1)return!1;const e=this.undoStack.pop();this.redoStack.push(e);const t=this.undoStack[this.undoStack.length-1];return this.isRecording=!1,this.editor.setContent(t),this.isRecording=!0,this.saveToStorage(),!0}redo(){if(0===this.redoStack.length)return!1;const e=this.redoStack.pop();return this.undoStack.push(e),this.isRecording=!1,this.editor.setContent(e),this.isRecording=!0,this.saveToStorage(),!0}canUndo(){return this.undoStack.length>1}canRedo(){return this.redoStack.length>0}clear(){this.undoStack=[],this.redoStack=[],this.record()}saveToStorage(){}loadFromStorage(){}clearStorage(){}}class b{constructor(e){this.editor=e,this.activeModal=null,this.overlay=null}createOverlay(){return this.overlay||(this.overlay=m.createElement("div",{className:"neiki-modal-overlay",onClick:e=>{e.target===this.overlay&&this.close()}}),document.body.appendChild(this.overlay)),this.overlay}open(e,t={}){let i;switch(this.close(),this.createOverlay(),e){case"link":i=this.createLinkModal(t);break;case"image":i=this.createImageModal(t);break;case"table":i=this.createTableModal(t);break;case"findReplace":i=this.createFindReplaceModal(t);break;default:return}this.activeModal=i,this.overlay.appendChild(i),this.overlay.classList.add("active");const n=i.querySelector("input");n&&n.focus()}close(){this.overlay&&(this.overlay.classList.remove("active"),this.activeModal&&(this.activeModal.remove(),this.activeModal=null))}createLinkModal(e){const t=m.createElement("div",{className:"neiki-modal"});return t.innerHTML=`\n <div class="neiki-modal-header">\n <h3>${o("modal.insertLink")}</h3>\n <button class="neiki-modal-close" type="button">${u.close}</button>\n </div>\n <div class="neiki-modal-body">\n <div class="neiki-form-group">\n <label>${o("modal.url")}</label>\n <input type="url" class="neiki-input" name="url" placeholder="https://example.com" value="${e.url||""}">\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.text")}</label>\n <input type="text" class="neiki-input" name="text" placeholder="${o("modal.linkText")}" value="${e.text||""}">\n </div>\n <div class="neiki-form-group">\n <label>\n <input type="checkbox" name="newTab" ${e.newTab?"checked":""}> ${o("modal.openInNewTab")}\n </label>\n </div>\n </div>\n <div class="neiki-modal-footer">\n <button class="neiki-btn neiki-btn-secondary" type="button" data-action="cancel">${o("modal.cancel")}</button>\n <button class="neiki-btn neiki-btn-primary" type="button" data-action="insert">${o("modal.insert")}</button>\n </div>\n `,t.querySelector(".neiki-modal-close").addEventListener("click",()=>this.close()),t.querySelector('[data-action="cancel"]').addEventListener("click",()=>this.close()),t.querySelector('[data-action="insert"]').addEventListener("click",()=>{const e=t.querySelector('[name="url"]').value,i=t.querySelector('[name="text"]').value||e,n=t.querySelector('[name="newTab"]').checked;e&&this.editor.commands.insertLink(e,i,n),this.close()}),t}createImageModal(e){const t=m.createElement("div",{className:"neiki-modal"});t.innerHTML=`\n <div class="neiki-modal-header">\n <h3>${o("modal.insertImage")}</h3>\n <button class="neiki-modal-close" type="button">${u.close}</button>\n </div>\n <div class="neiki-modal-body">\n <div class="neiki-form-group">\n <label>${o("modal.uploadImage")}</label>\n <input type="file" class="neiki-input" name="upload" accept="image/*">\n <small style="color: var(--neiki-text-muted); font-size: 11px;">${o("modal.convertedToBase64")}</small>\n </div>\n <div class="neiki-form-divider">\n <span>${o("modal.or")}</span>\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.imageUrl")}</label>\n <input type="url" class="neiki-input" name="url" placeholder="https://example.com/image.jpg" value="${e.url||""}">\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.altText")}</label>\n <input type="text" class="neiki-input" name="alt" placeholder="${o("modal.describeImage")}" value="${e.alt||""}">\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.widthOptional")}</label>\n <input type="text" class="neiki-input" name="width" placeholder="e.g. 300px or 50%" value="${e.width||""}">\n </div>\n </div>\n <div class="neiki-modal-footer">\n <button class="neiki-btn neiki-btn-secondary" type="button" data-action="cancel">${o("modal.cancel")}</button>\n <button class="neiki-btn neiki-btn-primary" type="button" data-action="insert">${o("modal.insert")}</button>\n </div>\n `;const i=t.querySelector('[name="upload"]'),n=t.querySelector('[name="url"]');return i.addEventListener("change",e=>{const t=e.target.files[0];if(t&&t.type.startsWith("image/")){const e=new FileReader;e.onload=e=>{n.value=e.target.result,n.disabled=!0},e.readAsDataURL(t)}else t&&(alert(o("modal.invalidImageFile")),i.value="")}),n.addEventListener("input",()=>{n.value||(n.disabled=!1,i.value="")}),t.querySelector(".neiki-modal-close").addEventListener("click",()=>this.close()),t.querySelector('[data-action="cancel"]').addEventListener("click",()=>this.close()),t.querySelector('[data-action="insert"]').addEventListener("click",()=>{const e=t.querySelector('[name="url"]').value,i=t.querySelector('[name="alt"]').value,n=t.querySelector('[name="width"]').value;e&&this.editor.commands.insertImage(e,i,n),this.close()}),t}createTableModal(e){const t=m.createElement("div",{className:"neiki-modal"});return t.innerHTML=`\n <div class="neiki-modal-header">\n <h3>${o("modal.insertTable")}</h3>\n <button class="neiki-modal-close" type="button">${u.close}</button>\n </div>\n <div class="neiki-modal-body">\n <div class="neiki-form-row">\n <div class="neiki-form-group">\n <label>${o("modal.rows")}</label>\n <input type="number" class="neiki-input" name="rows" min="1" max="20" value="${e.rows||3}">\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.columns")}</label>\n <input type="number" class="neiki-input" name="cols" min="1" max="10" value="${e.cols||3}">\n </div>\n </div>\n <div class="neiki-form-group">\n <label>\n <input type="checkbox" name="header" ${!1!==e.header?"checked":""}> ${o("modal.includeHeaderRow")}\n </label>\n </div>\n </div>\n <div class="neiki-modal-footer">\n <button class="neiki-btn neiki-btn-secondary" type="button" data-action="cancel">${o("modal.cancel")}</button>\n <button class="neiki-btn neiki-btn-primary" type="button" data-action="insert">${o("modal.insert")}</button>\n </div>\n `,t.querySelector(".neiki-modal-close").addEventListener("click",()=>this.close()),t.querySelector('[data-action="cancel"]').addEventListener("click",()=>this.close()),t.querySelector('[data-action="insert"]').addEventListener("click",()=>{const e=parseInt(t.querySelector('[name="rows"]').value)||3,i=parseInt(t.querySelector('[name="cols"]').value)||3,n=t.querySelector('[name="header"]').checked;this.editor.commands.insertTable(e,i,n),this.close()}),t}createFindReplaceModal(e){const t=m.createElement("div",{className:"neiki-modal neiki-modal-wide"});t.innerHTML=`\n <div class="neiki-modal-header">\n <h3>${o("modal.findReplace")}</h3>\n <button class="neiki-modal-close" type="button">${u.close}</button>\n </div>\n <div class="neiki-modal-body">\n <div class="neiki-form-group">\n <label>${o("modal.find")}</label>\n <input type="text" class="neiki-input" name="find" placeholder="${o("modal.searchText")}">\n </div>\n <div class="neiki-form-group">\n <label>${o("modal.replaceWith")}</label>\n <input type="text" class="neiki-input" name="replace" placeholder="${o("modal.replacementText")}">\n </div>\n <div class="neiki-form-group neiki-form-row">\n <label><input type="checkbox" name="regex"> ${o("modal.useRegex")}</label>\n <label><input type="checkbox" name="caseSensitive"> ${o("modal.caseSensitive")}</label>\n </div>\n <div class="neiki-find-results" style="margin-top:10px;font-size:13px;color:var(--neiki-text-muted);"></div>\n </div>\n <div class="neiki-modal-footer">\n <button class="neiki-btn neiki-btn-secondary" type="button" data-action="findNext">${o("modal.findNext")}</button>\n <button class="neiki-btn neiki-btn-secondary" type="button" data-action="replaceOne">${o("modal.replace")}</button>\n <button class="neiki-btn neiki-btn-primary" type="button" data-action="replaceAll">${o("modal.replaceAll")}</button>\n </div>\n `;const i=t.querySelector('[name="find"]'),n=t.querySelector('[name="replace"]'),a=t.querySelector('[name="regex"]'),r=t.querySelector('[name="caseSensitive"]'),s=t.querySelector(".neiki-find-results");let l=[],c=-1;const d=()=>{this.editor.contentArea.querySelectorAll(".neiki-highlight-find").forEach(e=>{const t=document.createTextNode(e.textContent);e.parentNode.replaceChild(t,e)}),this.editor.contentArea.normalize()},h=()=>{d(),l=[],c=-1;const e=i.value;if(!e)return void(s.textContent="");this.editor.contentArea.innerHTML;let t,n="g";r.checked||(n+="i");try{t=a.checked?new RegExp(e,n):new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n)}catch(e){return void(s.textContent=o("modal.invalidRegex"))}const h=document.createTreeWalker(this.editor.contentArea,NodeFilter.SHOW_TEXT,null,!1),p=[];for(;h.nextNode();)p.push(h.currentNode);p.forEach(e=>{const i=e.textContent,n=[...i.matchAll(t)];if(n.length>0){const t=document.createDocumentFragment();let o=0;n.forEach(e=>{e.index>o&&t.appendChild(document.createTextNode(i.slice(o,e.index)));const n=document.createElement("span");n.className="neiki-highlight-find",n.textContent=e[0],t.appendChild(n),l.push(n),o=e.index+e[0].length}),o<i.length&&t.appendChild(document.createTextNode(i.slice(o))),e.parentNode.replaceChild(t,e)}}),s.textContent=o("modal.matchesFound",{count:l.length})},p=()=>{if(0===l.length&&h(),0===l.length)return;c>=0&&l[c]&&l[c].classList.remove("neiki-highlight-current"),c=(c+1)%l.length;const e=l[c];e.classList.add("neiki-highlight-current"),e.scrollIntoView({behavior:"smooth",block:"center"}),s.textContent=o("modal.matchOf",{current:c+1,total:l.length})};return i.addEventListener("input",m.debounce(h,300)),t.querySelector(".neiki-modal-close").addEventListener("click",()=>{d(),this.close()}),t.querySelector('[data-action="findNext"]').addEventListener("click",p),t.querySelector('[data-action="replaceOne"]').addEventListener("click",()=>{if(c>=0&&l[c]){const e=l[c];e.textContent=n.value,e.classList.remove("neiki-highlight-find","neiki-highlight-current"),l.splice(c,1),c--,this.editor.history.record(),this.editor.triggerChange(),s.textContent=o("modal.matchesRemaining",{count:l.length}),l.length>0&&p()}}),t.querySelector('[data-action="replaceAll"]').addEventListener("click",()=>{d();const e=i.value,t=n.value;if(!e)return;let h,p="g";r.checked||(p+="i");try{h=a.checked?new RegExp(e,p):new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p)}catch(e){return}const m=document.createTreeWalker(this.editor.contentArea,NodeFilter.SHOW_TEXT,null,!1),u=[];for(;m.nextNode();)u.push(m.currentNode);let g=0;u.forEach(e=>{const i=e.textContent,n=i.replace(h,()=>(g++,t));n!==i&&(e.textContent=n)}),this.editor.history.record(),this.editor.triggerChange(),l=[],c=-1,s.textContent=o("modal.replacedOccurrences",{count:g})}),t}}class k{constructor(e){this.editor=e,this.activeDropdown=null,document.addEventListener("click",e=>{this.activeDropdown&&!this.activeDropdown.contains(e.target)&&this.close()})}toggle(e,t){if(e.querySelector(".neiki-dropdown"))return void this.close();let i;switch(this.close(),t){case"heading":i=this.createHeadingDropdown();break;case"fontSize":i=this.createFontSizeDropdown();break;case"fontFamily":i=this.createFontFamilyDropdown();break;default:return}e.appendChild(i),this.activeDropdown=i}close(){this.activeDropdown&&(this.activeDropdown.remove(),this.activeDropdown=null)}createHeadingDropdown(){const e=m.createElement("div",{className:"neiki-dropdown"});return c.forEach(({label:t,value:i})=>{const n=m.createElement("div",{className:"neiki-dropdown-item",innerHTML:`<${i}>${t}</${i}>`,onClick:()=>{this.editor.commands.formatBlock(i),this.close()}});e.appendChild(n)}),e}createFontSizeDropdown(){const e=m.createElement("div",{className:"neiki-dropdown"});return s.forEach(t=>{const i=m.createElement("div",{className:"neiki-dropdown-item",textContent:t+"px",onClick:()=>{this.editor.commands.fontSize(t+"px"),this.close()}});e.appendChild(i)}),e}createFontFamilyDropdown(){const e=m.createElement("div",{className:"neiki-dropdown"});return l.forEach(({label:t,value:i})=>{const n=m.createElement("div",{className:"neiki-dropdown-item",textContent:t,style:{fontFamily:i},onClick:()=>{this.editor.commands.fontFamily(i),this.close()}});e.appendChild(n)}),e}}class f{constructor(e){this.editor=e,this.activePicker=null,this.activeButton=null,document.addEventListener("mousedown",e=>{!this.activePicker||this.activePicker.contains(e.target)||this.activeButton&&this.activeButton.contains(e.target)||this.close()})}toggle(e,t){if(this.activeButton===e&&this.activePicker)return void this.close();this.close();const i=m.createElement("div",{className:"neiki-color-picker"}),n=m.createElement("div",{className:"neiki-color-swatch neiki-color-reset",title:"Reset to default"});n.addEventListener("mousedown",e=>{e.preventDefault(),e.stopPropagation(),"foreColor"===t?this.editor.commands.resetForeColor():this.editor.commands.resetBackColor(),this.close()}),i.appendChild(n),p.forEach(e=>{const n=m.createElement("div",{className:"neiki-color-swatch",style:{backgroundColor:e},title:e});n.addEventListener("mousedown",i=>{i.preventDefault(),i.stopPropagation(),"foreColor"===t?this.editor.commands.foreColor(e):this.editor.commands.backColor(e),this.close()}),i.appendChild(n)}),e.appendChild(i),this.activePicker=i,this.activeButton=e}close(){this.activePicker&&(this.activePicker.remove(),this.activePicker=null,this.activeButton=null)}}class x{constructor(e){this.editor=e,this.picker=null,this.activeButton=null,document.addEventListener("mousedown",e=>{!this.picker||this.picker.contains(e.target)||this.activeButton&&this.activeButton.contains(e.target)||this.close()})}toggle(e){this.activeButton===e&&this.picker?this.close():(this.close(),this.picker=m.createElement("div",{className:"neiki-emoji-picker"}),d.forEach(e=>{const t=document.createElement("span");t.className="neiki-emoji-item",t.textContent=e,t.title=e,t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),this.editor.focus(),document.execCommand("insertText",!1,e),this.editor.history.record(),this.editor.triggerChange(),this.close()}),this.picker.appendChild(t)}),e.appendChild(this.picker),this.activeButton=e)}close(){this.picker&&(this.picker.remove(),this.picker=null,this.activeButton=null)}}class y{constructor(e){this.editor=e,this.picker=null,this.activeButton=null,document.addEventListener("mousedown",e=>{!this.picker||this.picker.contains(e.target)||this.activeButton&&this.activeButton.contains(e.target)||this.close()})}toggle(e){this.activeButton===e&&this.picker?this.close():(this.close(),this.picker=m.createElement("div",{className:"neiki-special-picker"}),h.forEach(({char:e,name:t})=>{const i=document.createElement("span");i.className="neiki-special-item",i.textContent=e,i.title=t,i.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),this.editor.focus(),document.execCommand("insertText",!1,e),this.editor.history.record(),this.editor.triggerChange(),this.close()}),this.picker.appendChild(i)}),e.appendChild(this.picker),this.activeButton=e)}close(){this.picker&&(this.picker.remove(),this.picker=null,this.activeButton=null)}}class w{constructor(e){this.editor=e}exec(e,t=null){this.editor.focus();["bold","italic","underline","strikeThrough","subscript","superscript","foreColor","backColor","fontName","fontSize","removeFormat"].includes(e)&&this._expandToWordIfCollapsed(),document.execCommand(e,!1,t),this.editor.history.record(),this.editor.updateToolbar(),this.editor.triggerChange()}_expandToWordIfCollapsed(){const e=window.getSelection();if(!e||!e.rangeCount||!e.isCollapsed)return;const t=e.getRangeAt(0),i=t.startContainer;if(i.nodeType!==Node.TEXT_NODE)return;const n=i.textContent;let o=t.startOffset,a=t.startOffset;for(;o>0&&/\S/.test(n[o-1]);)o--;for(;a<n.length&&/\S/.test(n[a]);)a++;o!==a&&(t.setStart(i,o),t.setEnd(i,a),e.removeAllRanges(),e.addRange(t))}bold(){this.exec("bold")}italic(){this.exec("italic")}underline(){this.exec("underline")}strikeThrough(){this.exec("strikeThrough")}subscript(){this.exec("subscript")}superscript(){this.exec("superscript")}justifyLeft(){this.exec("justifyLeft")}justifyCenter(){this.exec("justifyCenter")}justifyRight(){this.exec("justifyRight")}justifyFull(){this.exec("justifyFull")}insertUnorderedList(){this.exec("insertUnorderedList")}insertOrderedList(){this.exec("insertOrderedList")}indent(){this.exec("indent")}outdent(){this.exec("outdent")}removeFormat(){this.exec("removeFormat")}insertHorizontalRule(){this.exec("insertHorizontalRule")}formatBlock(e){this.exec("formatBlock",`<${e}>`)}fontSize(e){this.editor.focus(),this._expandToWordIfCollapsed(),document.execCommand("fontSize",!1,"7");this.editor.contentArea.querySelectorAll('font[size="7"]').forEach(t=>{const i=document.createElement("span");for(i.style.fontSize=e;t.firstChild;)i.appendChild(t.firstChild);t.parentNode.replaceChild(i,t)}),this.editor.history.record(),this.editor.updateToolbar(),this.editor.triggerChange()}fontFamily(e){this.exec("fontName",e)}foreColor(e){this.exec("foreColor",e)}backColor(e){this.exec("backColor",e)}resetForeColor(){this._resetColorProperty("color")}resetBackColor(){this._resetColorProperty("backgroundColor")}_resetColorProperty(e){this.editor.focus();const t=window.getSelection();if(!t||!t.rangeCount)return;const i=t.getRangeAt(0);if(i.collapsed)return;const n=i.extractContents(),o=t=>{if(t.nodeType===Node.ELEMENT_NODE){if(t.style&&t.style[e]&&(t.style[e]="",t.getAttribute("style")&&t.getAttribute("style").trim()||t.removeAttribute("style")),"color"===e&&"FONT"===t.tagName&&t.hasAttribute("color")&&t.removeAttribute("color"),"backgroundColor"===e&&"FONT"===t.tagName&&t.style.backgroundColor&&(t.style.backgroundColor=""),!("FONT"!==t.tagName||t.hasAttribute("color")||t.hasAttribute("face")||t.hasAttribute("size")||t.getAttribute("style")&&t.getAttribute("style").trim())){const e=t.parentNode;if(e){for(;t.firstChild;)e.insertBefore(t.firstChild,t);e.removeChild(t)}return}if(!("SPAN"!==t.tagName||t.getAttribute("style")&&t.getAttribute("style").trim()||t.className)){const e=t.parentNode;if(e){for(;t.firstChild;)e.insertBefore(t.firstChild,t);e.removeChild(t)}return}Array.from(t.childNodes).forEach(o)}};Array.from(n.childNodes).forEach(o),i.insertNode(n),t.removeAllRanges(),t.addRange(i),this.editor.history.record(),this.editor.updateToolbar(),this.editor.triggerChange()}viewCode(){this.editor.toggleCodeView()}autosave(){this.editor.toggleAutosave()}print(){this.editor.printContent()}insertHTML(e){this.editor.focus(),document.execCommand("insertHTML",!1,e),this.editor.history.record(),this.editor.triggerChange()}insertLink(e,t,i=!1){const n=m.getSelection(),o=n.rangeCount>0?n.getRangeAt(0):null;if(o&&!o.collapsed){if(this.exec("createLink",e),i){this.editor.contentArea.querySelectorAll('a[href="'+e+'"]').forEach(e=>e.setAttribute("target","_blank"))}}else{const n=document.createElement("a");n.href=e,n.textContent=t||e,i&&(n.target="_blank"),this.editor.focus(),document.execCommand("insertHTML",!1,n.outerHTML),this.editor.history.record(),this.editor.triggerChange()}}insertImage(e,t="",i=""){let n=`<img src="${e}"`;t&&(n+=` alt="${t}"`),i&&(n+=` width="${i}"`),n+=">",this.editor.focus(),document.execCommand("insertHTML",!1,n),this.editor.history.record(),this.editor.triggerChange()}insertTable(e,t,i=!0){let n='<table class="neiki-table">';for(let o=0;o<e;o++){n+="<tr>";for(let e=0;e<t;e++)n+=0===o&&i?"<th>Header</th>":"<td>Cell</td>";n+="</tr>"}n+="</table><p><br></p>",this.editor.focus(),document.execCommand("insertHTML",!1,n),this.editor.history.record(),this.editor.triggerChange()}undo(){this.editor.history.undo()&&(this.editor.updateToolbar(),this.editor.triggerChange())}redo(){this.editor.history.redo()&&(this.editor.updateToolbar(),this.editor.triggerChange())}}class C{constructor(e,t={}){if(this.originalElement="string"==typeof e?document.querySelector(e):e,!this.originalElement)throw new Error("NeikiEditor: Element not found");this.id=this.originalElement.id||this.originalElement.getAttribute("data-neiki-id")||"neiki_"+("string"==typeof e?e.replace(/[^a-zA-Z0-9]/g,"_"):"editor"),this.config=m.deepMerge(a,t),this.isFullscreen=!1,this.isAutosaveEnabled=!1,this.autosaveInterval=null,this.init()}init(){this.storage=new g(this.id),i=this.config.language||"en",this.config.translations&&"object"==typeof this.config.translations&&Object.keys(this.config.translations).forEach(e=>{n(e,this.config.translations[e])});const e=g.getGlobal("theme",this.config.theme);this.config.theme=e,this.createStructure(),this.createToolbar(),this.createContentArea(),this.createStatusBar(),this.history=new v(this),this.modal=new b(this),this.dropdown=new k(this),this.colorPicker=new f(this),this.emojiPicker=new x(this),this.specialCharsPicker=new y(this),this.commands=new w(this),this.tableContextMenu=new L(this),this.floatingToolbar=new z(this),this.bindEvents(),this.initDragDrop(),this.initPlugins(),this.syncToOriginal(),this.history.record();this.storage.get("autosave_enabled",!1)&&this.enableAutosave(),this.updateStatusBar(),this.updateToolbar(),this.config.autofocus&&this.focus(),this.config.onReady&&this.config.onReady(this)}createStructure(){const e="en"!==i?`neiki-lang-${i}`:"";this.container=m.createElement("div",{className:`neiki-editor ${"dark"===this.config.theme?"neiki-dark":""} ${e}`.trim(),id:this.id}),this.originalElement.style.display="none",this.originalElement.parentNode.insertBefore(this.container,this.originalElement)}createToolbar(){this.toolbar=m.createElement("div",{className:"neiki-toolbar"}),this.toolbarButtons={},this.toolbarSelects={};let e=m.createElement("div",{className:"neiki-toolbar-group"});const t=t=>{e.appendChild(t)},i=()=>{e.childNodes.length>0&&this.toolbar.appendChild(e),e=m.createElement("div",{className:"neiki-toolbar-group"})};this.config.toolbar.forEach(n=>{if("|"===n)return void i();const a=r[n];if(!a)return;if("select"===a.type){const e=m.createElement("select",{className:"neiki-select",title:o(a.titleKey),"data-command":n});return"heading"===n?c.forEach(({labelKey:t,value:i})=>{const n=document.createElement("option");n.value=i,n.textContent=o(t),e.appendChild(n)}):"fontFamily"===n&&l.forEach(({labelKey:t,value:i})=>{const n=document.createElement("option");n.value=i,n.textContent=o(t),n.style.fontFamily=i,e.appendChild(n)}),e.addEventListener("change",t=>{t.preventDefault(),"heading"===n?this.commands.formatBlock(e.value):"fontFamily"===n&&this.commands.fontFamily(e.value),this.focus()}),this.toolbarSelects[n]=e,void t(e)}if("fontSizeWidget"===a.type){const e=m.createElement("div",{className:"neiki-fontsize-widget"}),i=m.createElement("button",{className:"neiki-fontsize-btn",type:"button",title:o("toolbar.decreaseFontSize"),innerHTML:'<svg viewBox="0 0 24 24" width="14" height="14"><path d="M19 13H5v-2h14v2z" fill="currentColor"/></svg>'}),n=m.createElement("input",{className:"neiki-fontsize-input",type:"text",title:o("toolbar.fontSize"),value:"16"}),a=m.createElement("button",{className:"neiki-fontsize-btn",type:"button",title:o("toolbar.increaseFontSize"),innerHTML:'<svg viewBox="0 0 24 24" width="14" height="14"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" fill="currentColor"/></svg>'});let r=null;const l=()=>{const e=window.getSelection();e&&e.rangeCount>0&&(r=e.getRangeAt(0).cloneRange())},c=()=>{if(r){const e=window.getSelection();e.removeAllRanges(),e.addRange(r)}},d=m.createElement("div",{className:"neiki-fontsize-dropdown"});s.forEach(e=>{const t=m.createElement("div",{className:"neiki-fontsize-dropdown-item",textContent:e,"data-size":String(e)});t.addEventListener("mousedown",e=>{e.preventDefault(),e.stopPropagation()}),t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),n.value=e,c(),this.commands.fontSize(e+"px"),d.classList.remove("show")}),d.appendChild(t)});const h=()=>{const e=parseInt(n.value);e&&e>0&&(c(),this.commands.fontSize(e+"px"))};return i.addEventListener("mousedown",e=>{e.preventDefault(),e.stopPropagation(),l()}),i.addEventListener("click",e=>{e.preventDefault(),c();const t=parseInt(n.value)||16,i=Math.max(1,t-1);n.value=i,this.commands.fontSize(i+"px")}),a.addEventListener("mousedown",e=>{e.preventDefault(),e.stopPropagation(),l()}),a.addEventListener("click",e=>{e.preventDefault(),c();const t=parseInt(n.value)||16,i=Math.min(999,t+1);n.value=i,this.commands.fontSize(i+"px")}),n.addEventListener("mousedown",e=>{l()}),n.addEventListener("focus",()=>{d.classList.add("show")}),n.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),h(),d.classList.remove("show"),this.focus()),"Escape"===e.key&&(d.classList.remove("show"),this.focus())}),document.addEventListener("mousedown",t=>{e.contains(t.target)||d.classList.remove("show")}),e.appendChild(i),e.appendChild(n),e.appendChild(a),e.appendChild(d),this.fontSizeInput=n,void t(e)}if("insertDropdown"===a.type){const e=m.createElement("button",{className:"neiki-toolbar-btn neiki-insert-dropdown-btn",title:o(a.titleKey),type:"button"});e.innerHTML=u[a.icon]+'<span class="neiki-insert-label">'+o("toolbar.insert")+'</span><span class="neiki-chevron">'+u["chevron-down"]+"</span>";const i=m.createElement("div",{className:"neiki-insert-dropdown"});return[{key:"link",icon:u.link,labelKey:"insert.link",action:()=>this.modal.open("link",{text:m.getSelection().toString()})},{key:"image",icon:u.image,labelKey:"insert.image",action:()=>this.modal.open("image",{})},{key:"table",icon:u.table,labelKey:"insert.table",action:()=>this.modal.open("table",{})},{key:"emoji",icon:u.emoji,labelKey:"insert.emoji",action:()=>this.emojiPicker.toggle(e)},{key:"specialChars",icon:u.specialChars,labelKey:"insert.symbol",action:()=>this.specialCharsPicker.toggle(e)}].forEach(({icon:e,labelKey:t,action:n})=>{const a=m.createElement("div",{className:"neiki-dropdown-item"});a.innerHTML='<span class="neiki-dropdown-item-icon">'+e+"</span>"+o(t),a.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),i.classList.remove("show"),n()}),i.appendChild(a)}),e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const t=this.toolbar.querySelector(".neiki-more-dropdown.show");t&&t.classList.remove("show"),this.emojiPicker.close(),this.specialCharsPicker.close(),i.classList.toggle("show")}),document.addEventListener("mousedown",t=>{e.contains(t.target)||i.contains(t.target)||i.classList.remove("show")}),e.appendChild(i),this.toolbarButtons[n]=e,void t(e)}if("moreMenu"===a.type){const i=m.createElement("button",{className:"neiki-toolbar-btn neiki-more-btn",title:o(a.titleKey),type:"button",innerHTML:u[a.icon],"data-command":n}),r=m.createElement("div",{className:"neiki-more-dropdown"});return[{key:"save",icon:u.save,labelKey:"menu.save",action:()=>this.triggerSave()},{key:"preview",icon:u.eye,labelKey:"menu.preview",action:()=>this.previewContent()},{key:"download",icon:u.download,labelKey:"menu.download",action:()=>this.downloadContent()},{key:"print",icon:u.print,labelKey:"menu.print",action:()=>this.printContent()},{key:"divider"},{key:"autosave",icon:u.save,labelKey:"menu.autosave",action:()=>this.toggleAutosave(),toggle:!0},{key:"divider"},{key:"clearAll",icon:u.trash,labelKey:"menu.clearAll",action:()=>this.clearAll(),danger:!0},{key:"themeToggle",icon:u.sun,labelKey:"menu.toggleTheme",action:()=>{this.toggleTheme(),this._updateThemeMenuItem()}},{key:"fullscreen",icon:u.fullscreen,labelKey:"menu.fullscreen",action:()=>this.toggleFullscreen()}].forEach(({key:e,icon:t,labelKey:i,action:n,danger:a,toggle:s})=>{if("divider"===e)return void r.appendChild(m.createElement("div",{className:"neiki-dropdown-divider"}));const l=m.createElement("div",{className:"neiki-dropdown-item"+(a?" neiki-dropdown-item-danger":"")});if(l.innerHTML='<span class="neiki-dropdown-item-icon">'+t+'</span><span class="neiki-dropdown-item-label">'+o(i)+"</span>","autosave"===e){const e=m.createElement("span",{className:"neiki-autosave-badge"});e.textContent="✕",l.appendChild(e),this._autosaveMenuItem=l,this._autosaveBadge=e}"themeToggle"===e&&(this._themeMenuItem=l,this._themeMenuIcon=l.querySelector(".neiki-dropdown-item-icon")),l.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),"autosave"!==e&&r.classList.remove("show"),n()}),r.appendChild(l)}),i.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const t=this.toolbar.querySelector(".neiki-insert-dropdown.show");t&&t.classList.remove("show"),r.classList.toggle("show")}),document.addEventListener("mousedown",e=>{i.contains(e.target)||r.contains(e.target)||r.classList.remove("show")}),i.appendChild(r),this.toolbarButtons[n]=i,t(i),void(e.style.marginLeft="auto")}const d=m.createElement("button",{className:"neiki-toolbar-btn",title:o(a.titleKey),type:"button",innerHTML:u[a.icon]||"","data-command":n});d.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.handleToolbarClick(n,d)}),this.toolbarButtons[n]=d,t(d)}),i(),this.container.appendChild(this.toolbar)}createContentArea(){this.contentWrapper=m.createElement("div",{className:"neiki-content-wrapper"}),this.contentArea=m.createElement("div",{className:"neiki-content",contentEditable:!this.config.readonly,spellcheck:this.config.spellcheck,"data-placeholder":o("placeholder")}),this.config.minHeight&&(this.contentArea.style.minHeight=this.config.minHeight+"px"),this.config.maxHeight&&(this.contentArea.style.maxHeight=this.config.maxHeight+"px",this.contentArea.style.overflowY="auto");const e=this.storage.get("autosave_enabled",!1),t=this.storage.get("autosave_content",null);e&&t?this.contentArea.innerHTML=t:this.originalElement.value?this.contentArea.innerHTML=this.originalElement.value:this.originalElement.innerHTML.trim()&&(this.contentArea.innerHTML=this.originalElement.innerHTML),this._ensureDefaultBlock(),this.contentWrapper.appendChild(this.contentArea),this.isCodeViewOpen=!1,this.codeView=m.createElement("div",{className:"neiki-code-view"});const i=m.createElement("div",{className:"neiki-code-view-header"}),n=m.createElement("span",{className:"neiki-code-view-title",textContent:"HTML Source"}),a=m.createElement("button",{className:"neiki-btn neiki-code-view-apply",type:"button",title:"Apply changes and close"});a.innerHTML=u.close+'<span style="margin-left:5px;font-size:12px;font-weight:500;">Apply & Close</span>',a.addEventListener("click",()=>this.toggleCodeView()),i.appendChild(n),i.appendChild(a),this.codeViewTextarea=m.createElement("textarea",{className:"neiki-code-view-textarea",spellcheck:"false"}),this.codeView.appendChild(i),this.codeView.appendChild(this.codeViewTextarea),this.contentWrapper.appendChild(this.codeView),this.container.appendChild(this.contentWrapper)}bindEvents(){this.contentArea.addEventListener("input",m.debounce(()=>{this._ensureDefaultBlock(),this.history.record(),this.syncToOriginal(),this.triggerChange(),this.updateStatusBar()},300)),document.addEventListener("selectionchange",()=>{(this.contentArea.contains(document.activeElement)||document.activeElement===this.contentArea)&&(this.updateToolbar(),this.updateStatusBar())}),this.contentArea.addEventListener("focus",()=>{this.config.onFocus&&this.config.onFocus(this)}),this.contentArea.addEventListener("blur",()=>{this.config.onBlur&&this.config.onBlur(this)}),this.contentArea.addEventListener("keydown",e=>this.handleKeydown(e)),this.contentArea.addEventListener("paste",e=>this.handlePaste(e))}handleToolbarClick(e,t){const i=r[e];if(i&&!i.type)if("color"!==i.picker)if("emoji"!==i.picker)if("specialChars"!==i.picker){if(i.modal){const t=m.saveSelection();let i={};if("link"===e){const e=m.getSelection();i.text=e.toString()}return this.modal.open(e,i),void m.restoreSelection(t)}"fullscreen"!==e?"themeToggle"!==e?i.value?this.commands[i.command](i.value):this.commands[i.command]?this.commands[i.command]():this.commands.exec(i.command):this.toggleTheme():this.toggleFullscreen()}else this.specialCharsPicker.toggle(t);else this.emojiPicker.toggle(t);else this.colorPicker.toggle(t,i.command)}handleKeydown(e){if(e.ctrlKey||e.metaKey)switch(e.key.toLowerCase()){case"b":e.preventDefault(),this.commands.bold();break;case"i":e.preventDefault(),this.commands.italic();break;case"u":e.preventDefault(),this.commands.underline();break;case"k":e.preventDefault(),this.modal.open("link",{text:m.getSelection().toString()});break;case"z":e.preventDefault(),e.shiftKey?this.commands.redo():this.commands.undo();break;case"y":e.preventDefault(),this.commands.redo();break;case"s":e.preventDefault(),this.triggerSave()}"Tab"===e.key&&(e.preventDefault(),e.shiftKey?this.commands.outdent():this.commands.indent())}handlePaste(e){e.preventDefault();let t="";if(e.clipboardData){let i=e.clipboardData.getData("text/html");i?t=m.sanitizeHTML(i):(t=e.clipboardData.getData("text/plain"),t=t.replace(/\n/g,"<br>"))}document.execCommand("insertHTML",!1,t),this.history.record(),this.triggerChange()}updateToolbar(){if(Object.entries(this.toolbarButtons).forEach(([e,t])=>{const i=r[e];if(!i||i.type)return;let n=!1;try{switch(i.command){case"bold":case"italic":case"underline":case"strikeThrough":case"subscript":case"superscript":case"insertUnorderedList":case"insertOrderedList":case"justifyLeft":case"justifyCenter":case"justifyRight":case"justifyFull":n=document.queryCommandState(i.command)}}catch(e){}t.classList.toggle("active",n)}),this.toolbarButtons.undo&&(this.toolbarButtons.undo.disabled=!this.history.canUndo()),this.toolbarButtons.redo&&(this.toolbarButtons.redo.disabled=!this.history.canRedo()),this.toolbarButtons.viewCode&&this.toolbarButtons.viewCode.classList.toggle("active",this.isCodeViewOpen),this.toolbarSelects.heading){const e=this.getCurrentBlockType(),t=c.map(e=>e.value);this.toolbarSelects.heading.value=t.includes(e)?e:"p"}if(this.toolbarSelects.fontFamily)try{const e=document.queryCommandValue("fontName");if(e){const t=l.find(t=>t.value.toLowerCase().includes(e.toLowerCase().replace(/"/g,"")));t&&(this.toolbarSelects.fontFamily.value=t.value)}}catch(e){}if(this.fontSizeInput)try{const e=window.getSelection();if(e&&e.rangeCount){let t=e.getRangeAt(0).startContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const i=window.getComputedStyle(t),n=Math.round(parseFloat(i.fontSize));n&&(this.fontSizeInput.value=n)}}catch(e){}this._autosaveBadge&&(this._autosaveBadge.textContent=this.isAutosaveEnabled?"✓":"✕",this._autosaveBadge.classList.toggle("active",this.isAutosaveEnabled))}toggleFullscreen(){this.isFullscreen=!this.isFullscreen,this.container.classList.toggle("neiki-fullscreen",this.isFullscreen),document.body.classList.toggle("neiki-fullscreen-active",this.isFullscreen),this.toolbarButtons.fullscreen&&this.toolbarButtons.fullscreen.classList.toggle("active",this.isFullscreen)}toggleTheme(){const e=this.container.classList.contains("neiki-dark"),t=e?"light":"dark";this.container.classList.toggle("neiki-dark",!e),this.config.theme=t,g.setGlobal("theme",t),this.toolbarButtons.themeToggle&&(this.toolbarButtons.themeToggle.innerHTML=e?u.sun:u.moon,this.toolbarButtons.themeToggle.classList.toggle("active",!e),this.toolbarButtons.themeToggle.title=e?"Switch to Dark Mode":"Switch to Light Mode"),this._updateThemeMenuItem()}_updateThemeMenuItem(){if(this._themeMenuIcon){const e=this.container.classList.contains("neiki-dark");this._themeMenuIcon.innerHTML=e?u.moon:u.sun}}triggerSave(){this.config.onSave&&this.config.onSave(this.getContent(),this)}previewContent(){const e=this.getContent(),t=m.createElement("div",{className:"neiki-preview-overlay"}),i=m.createElement("div",{className:"neiki-preview-modal"}),n=m.createElement("div",{className:"neiki-preview-header"});n.innerHTML="<span>"+o("preview.title")+"</span>";const a=m.createElement("button",{className:"neiki-preview-close",type:"button",innerHTML:u.close});a.addEventListener("click",()=>t.remove()),n.appendChild(a);const r=m.createElement("div",{className:"neiki-preview-body"});r.innerHTML=e,i.appendChild(n),i.appendChild(r),t.appendChild(i),t.addEventListener("click",e=>{e.target===t&&t.remove()}),document.addEventListener("keydown",function e(i){"Escape"===i.key&&(t.remove(),document.removeEventListener("keydown",e))}),document.body.appendChild(t)}downloadContent(){const e=this.getContent(),t=new Blob(['<!DOCTYPE html>\n<html lang="en">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n<title>Document</title>\n<style>\nbody{font-family:-apple-system,BlinkMacSystemFont,\'Segoe UI\',Roboto,sans-serif;max-width:800px;margin:40px auto;padding:0 20px;line-height:1.7;color:#1e293b;}\nimg{max-width:100%;}\ntable{border-collapse:collapse;width:100%;}\ntable td,table th{border:1px solid #d1d5db;padding:8px 12px;}\n</style>\n</head>\n<body>\n'+e+"\n</body>\n</html>"],{type:"text/html"}),i=URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download="document.html",n.click(),URL.revokeObjectURL(i)}clearAll(){this.getContent().trim()&&!confirm(o("confirm.clearAll"))||(this.setContent(""),this.history.record(),this.triggerChange(),this.updateStatusBar())}_ensureDefaultBlock(){if(!this.contentArea)return;const e=this.contentArea.innerHTML.trim();if(!e||"<br>"===e){this.contentArea.innerHTML="<p><br></p>";try{if(document.activeElement===this.contentArea){const e=this.contentArea.querySelector("p");if(e){const t=window.getSelection(),i=document.createRange();i.setStart(e,0),i.collapse(!0),t.removeAllRanges(),t.addRange(i)}}}catch(e){}return}Array.from(this.contentArea.childNodes).forEach(e=>{if(e.nodeType===Node.TEXT_NODE&&e.textContent.trim()){const t=document.createElement("p");e.parentNode.insertBefore(t,e),t.appendChild(e)}})}syncToOriginal(){"TEXTAREA"===this.originalElement.tagName||"INPUT"===this.originalElement.tagName?this.originalElement.value=this.getContent():this.originalElement.innerHTML=this.getContent()}triggerChange(){this.config.onChange&&this.config.onChange(this.getContent(),this),this.container.dispatchEvent(new CustomEvent("neiki:change",{detail:{content:this.getContent(),editor:this}}))}getContent(){return this.contentArea.innerHTML}setContent(e){this.contentArea.innerHTML=m.sanitizeHTML(e),this._ensureDefaultBlock(),this.syncToOriginal()}getText(){return this.contentArea.textContent||this.contentArea.innerText}isEmpty(){const e=this.getText().trim();return""===e||"\n"===e}focus(){this.contentArea.focus()}blur(){this.contentArea.blur()}enable(){this.contentArea.contentEditable="true",this.container.classList.remove("neiki-disabled")}disable(){this.contentArea.contentEditable="false",this.container.classList.add("neiki-disabled")}destroy(){this.modal.close(),this.dropdown.close(),this.colorPicker.close(),this.container.remove(),this.originalElement.style.display="",this.modal.overlay&&this.modal.overlay.remove()}setTheme(e){this.config.theme=e,this.container.classList.toggle("neiki-dark","dark"===e),g.setGlobal("theme",e)}createStatusBar(){this.statusBar=m.createElement("div",{className:"neiki-statusbar"});const e=m.createElement("div",{className:"neiki-statusbar-left"}),t=m.createElement("div",{className:"neiki-statusbar-right"});this.statusWordCount=m.createElement("span",{className:"neiki-statusbar-item",textContent:"0 "+o("status.words")}),this.statusCharCount=m.createElement("span",{className:"neiki-statusbar-item",textContent:"0 "+o("status.chars")}),this.statusAutosave=m.createElement("span",{className:"neiki-statusbar-item neiki-statusbar-autosave"}),this.statusAutosave.style.display="none",this.statusBlockType=m.createElement("span",{className:"neiki-statusbar-item neiki-statusbar-block",textContent:"p"}),e.appendChild(this.statusWordCount),e.appendChild(this.statusCharCount),t.appendChild(this.statusAutosave),t.appendChild(this.statusBlockType),this.statusBar.appendChild(e),this.statusBar.appendChild(t),this.container.appendChild(this.statusBar)}updateStatusBar(){if(!this.statusBar)return;const e=this.getText().trim(),t=e?e.split(/\s+/).filter(e=>e.length>0).length:0,i=this.getText().length;this.statusWordCount.textContent=t+" "+o(1===t?"status.word":"status.words"),this.statusCharCount.textContent=i+" "+o(1===i?"status.char":"status.chars"),this.statusBlockType.textContent=this.getCurrentBlockType()}getCurrentBlockType(){const e=window.getSelection();if(!e||!e.rangeCount)return"p";let t=e.getRangeAt(0).startContainer;t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);const i=["P","H1","H2","H3","H4","H5","H6","BLOCKQUOTE","PRE","LI","DIV"];for(;t&&t!==this.contentArea;){if(i.includes(t.tagName))return t.tagName.toLowerCase();t=t.parentNode}return"p"}toggleCodeView(){this.isCodeViewOpen?(this.contentArea.innerHTML=m.sanitizeHTML(this.codeViewTextarea.value),this.codeView.classList.remove("show"),this.isCodeViewOpen=!1,this.history.record(),this.syncToOriginal(),this.triggerChange(),this.updateStatusBar(),this._codeViewEsc&&(document.removeEventListener("keydown",this._codeViewEsc),this._codeViewEsc=null)):(this.codeViewTextarea.value=this.contentArea.innerHTML,this.codeView.classList.add("show"),this.isCodeViewOpen=!0,this.codeViewTextarea.focus(),this._codeViewEsc=e=>{"Escape"===e.key&&this.toggleCodeView()},document.addEventListener("keydown",this._codeViewEsc)),this.updateToolbar()}toggleAutosave(){this.isAutosaveEnabled?this.disableAutosave():this.enableAutosave(),this.updateToolbar()}enableAutosave(){this.isAutosaveEnabled=!0,this.storage.set("autosave_enabled",!0),this.statusAutosave&&(this.statusAutosave.style.display="",this.statusAutosave.textContent=o("autosave.savedLocally")),this._autosaveContentHandler||(this._autosaveContentHandler=m.debounce(()=>{this.isAutosaveEnabled&&(this.statusAutosave&&(this.statusAutosave.textContent=o("autosave.autosaving"),this.statusAutosave.style.display=""),this.storage.set("autosave_content",this.getContent()),setTimeout(()=>{this.statusAutosave&&this.isAutosaveEnabled&&(this.statusAutosave.textContent=o("autosave.savedLocally"))},500))},1e3),this.contentArea.addEventListener("input",this._autosaveContentHandler)),this.storage.set("autosave_content",this.getContent()),this.updateToolbar()}disableAutosave(){this.isAutosaveEnabled=!1,this.storage.set("autosave_enabled",!1),this.autosaveInterval&&(clearInterval(this.autosaveInterval),this.autosaveInterval=null),this.statusAutosave&&(this.statusAutosave.style.display="none"),this.updateToolbar()}printContent(){const e=window.open("","_blank"),t=this.getContent();e.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Print</title>\n <style>\n body { font-family: Arial, sans-serif; padding: 20px; line-height: 1.6; }\n table { border-collapse: collapse; width: 100%; margin: 1em 0; }\n td, th { border: 1px solid #ccc; padding: 8px; }\n img { max-width: 100%; }\n blockquote { border-left: 4px solid #ccc; margin: 1em 0; padding-left: 1em; font-style: italic; }\n pre { background: #f5f5f5; padding: 1em; overflow-x: auto; }\n </style>\n </head>\n <body>${t}</body>\n </html>\n `),e.document.close(),e.focus(),setTimeout(()=>{e.print(),e.close()},250)}getJSON(){const e=t=>{if(t.nodeType===Node.TEXT_NODE)return{type:"text",content:t.textContent};if(t.nodeType!==Node.ELEMENT_NODE)return null;const i={type:t.tagName.toLowerCase(),children:[]};if(t.attributes.length>0){i.attrs={};for(let e of t.attributes)i.attrs[e.name]=e.value}t.style&&t.style.cssText&&(i.style=t.style.cssText);for(let n of t.childNodes){const t=e(n);t&&i.children.push(t)}return i},t=[];for(let i of this.contentArea.childNodes){const n=e(i);n&&t.push(n)}return{version:"1.0",content:t}}setJSON(e){if(!e||!e.content)return;const t=e=>{if("text"===e.type)return document.createTextNode(e.content||"");const i=document.createElement(e.type);if(e.attrs)for(let[t,n]of Object.entries(e.attrs))i.setAttribute(t,n);if(e.style&&(i.style.cssText=e.style),e.children)for(let n of e.children){const e=t(n);e&&i.appendChild(e)}return i};this.contentArea.innerHTML="";for(let i of e.content){const e=t(i);e&&this.contentArea.appendChild(e)}this.history.record(),this.syncToOriginal(),this.triggerChange(),this.updateStatusBar()}getHTML(){return this.getContent()}setHTML(e){this.setContent(e)}initPlugins(){C.getPlugins().forEach(e=>{try{if(e.icon&&e.action){const t=m.createElement("button",{className:"neiki-toolbar-btn neiki-plugin-btn",title:e.tooltip||e.name,type:"button",innerHTML:e.icon,"data-plugin":e.name});t.addEventListener("click",t=>{t.preventDefault(),e.action(this)}),this.toolbar.appendChild(t)}e.init&&e.init(this)}catch(t){console.error(`NeikiEditor: Plugin "${e.name}" failed to initialize`,t)}})}insertHTML(e){this.commands.insertHTML(e)}getSelection(){return m.getSelection()}wrapSelection(e,t={}){const i=window.getSelection();if(!i.rangeCount||i.getRangeAt(0).collapsed)return;const n=i.getRangeAt(0),o=document.createElement(e);Object.entries(t).forEach(([e,t])=>{o.setAttribute(e,t)});try{n.surroundContents(o),this.history.record(),this.triggerChange()}catch(e){const t=n.extractContents();o.appendChild(t),n.insertNode(o),this.history.record(),this.triggerChange()}}unwrapSelection(e){const t=window.getSelection();if(!t.rangeCount)return;let i=t.getRangeAt(0).commonAncestorContainer;i.nodeType===Node.TEXT_NODE&&(i=i.parentNode);const n=i.closest(e);if(n&&this.contentArea.contains(n)){const e=n.parentNode;for(;n.firstChild;)e.insertBefore(n.firstChild,n);e.removeChild(n),this.history.record(),this.triggerChange()}}execCommand(e,t=null){this.commands.exec(e,t)}initDragDrop(){let e=0;this.contentArea.addEventListener("dragenter",t=>{t.preventDefault(),e++,this.contentArea.classList.add("neiki-drag-over")}),this.contentArea.addEventListener("dragleave",t=>{t.preventDefault(),e--,0===e&&this.contentArea.classList.remove("neiki-drag-over")}),this.contentArea.addEventListener("dragover",e=>{e.preventDefault()}),this.contentArea.addEventListener("drop",t=>{t.preventDefault(),e=0,this.contentArea.classList.remove("neiki-drag-over");const i=Array.from(t.dataTransfer.files).filter(e=>e.type.startsWith("image/"));if(i.length>0){const e=t.clientX,n=t.clientY;i.forEach(t=>{const i=new FileReader;i.onload=i=>{const o=document.caretRangeFromPoint(e,n);if(o){const e=window.getSelection();e.removeAllRanges(),e.addRange(o)}this.commands.insertImage(i.target.result,t.name,"")},i.readAsDataURL(t)})}})}}class z{constructor(e){this.editor=e,this.toolbar=null,this.isVisible=!1,this.hideTimeout=null,this.createToolbar(),this.bindEvents()}createToolbar(){this.toolbar=m.createElement("div",{className:"neiki-floating-toolbar"});[{item:"bold",icon:u.bold,title:"Bold"},{item:"italic",icon:u.italic,title:"Italic"},{item:"underline",icon:u.underline,title:"Underline"},{item:"strikeThrough",icon:u.strikethrough,title:"Strikethrough"},{item:"link",icon:u.link,title:"Link"}].forEach(({item:e,icon:t,title:i})=>{const n=m.createElement("button",{className:"neiki-toolbar-btn neiki-floating-btn",title:i,type:"button",innerHTML:t,"data-command":e});n.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.handleButtonClick(e)}),this.toolbar.appendChild(n)}),document.body.appendChild(this.toolbar)}bindEvents(){document.addEventListener("selectionchange",()=>{clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(()=>this.updatePosition(),100)}),document.addEventListener("mouseup",()=>{setTimeout(()=>this.updatePosition(),10)}),document.addEventListener("scroll",()=>{this.isVisible&&this.updatePosition()})}updatePosition(){const e=window.getSelection();if(!e.rangeCount||e.isCollapsed||!this.editor.contentArea.contains(e.anchorNode))return void this.hide();const t=e.getRangeAt(0).getBoundingClientRect();if(0===t.width&&0===t.height)return void this.hide();this.show();const i=this.toolbar.getBoundingClientRect(),n=t.left+t.width/2-i.width/2,o=t.top-i.height-10,a=Math.max(10,Math.min(n,window.innerWidth-i.width-10)),r=Math.max(10,o);this.toolbar.style.left=a+"px",this.toolbar.style.top=r+"px"}show(){this.isVisible||(this.toolbar.classList.add("show"),this.isVisible=!0)}hide(){this.isVisible&&(this.toolbar.classList.remove("show"),this.isVisible=!1)}handleButtonClick(e){if("link"===e){const e=m.getSelection();this.editor.modal.open("link",{text:e.toString()})}else this.editor.commands[e]();this.hide()}}const E=[];C.registerPlugin=function(e){e.name?E.push(e):console.error("NeikiEditor: Plugin must have a name")},C.getPlugins=function(){return[...E]};class L{constructor(e){this.editor=e,this.menu=null,this.currentCell=null,this.createMenu(),this.bindEvents()}createMenu(){this.menu=m.createElement("div",{className:"neiki-context-menu"}),this.menu.innerHTML=`\n <div class="neiki-context-item" data-action="insertRowAbove">${u.table} Insert Row Above</div>\n <div class="neiki-context-item" data-action="insertRowBelow">${u.table} Insert Row Below</div>\n <div class="neiki-context-item" data-action="insertColLeft">${u.table} Insert Column Left</div>\n <div class="neiki-context-item" data-action="insertColRight">${u.table} Insert Column Right</div>\n <div class="neiki-context-divider"></div>\n <div class="neiki-context-item" data-action="deleteRow">${u.eraser} Delete Row</div>\n <div class="neiki-context-item" data-action="deleteCol">${u.eraser} Delete Column</div>\n <div class="neiki-context-item neiki-context-danger" data-action="deleteTable">${u.eraser} Delete Table</div>\n <div class="neiki-context-divider"></div>\n <div class="neiki-context-item" data-action="mergeCells">${u.table} Merge Cells</div>\n <div class="neiki-context-item" data-action="splitCell">${u.table} Split Cell</div>\n `,document.body.appendChild(this.menu),this.menu.querySelectorAll(".neiki-context-item").forEach(e=>{e.addEventListener("click",t=>{const i=e.dataset.action;this.executeAction(i),this.hide()})})}bindEvents(){this.editor.contentArea.addEventListener("contextmenu",e=>{const t=e.target.closest("td, th");t&&(e.preventDefault(),this.currentCell=t,this.show(e.clientX,e.clientY))}),document.addEventListener("click",e=>{this.menu.contains(e.target)||this.hide()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.hide()})}show(e,t){this.menu.style.display="block";const i=this.menu.getBoundingClientRect(),n=window.innerWidth,o=window.innerHeight;e+i.width>n&&(e=n-i.width-10),t+i.height>o&&(t=o-i.height-10),this.menu.style.left=e+"px",this.menu.style.top=t+"px"}hide(){this.menu.style.display="none",this.currentCell=null}executeAction(e){if(!this.currentCell)return;const t=this.currentCell.closest("table"),i=this.currentCell.closest("tr");if(!t||!i)return;const n=Array.from(t.rows).indexOf(i),o=Array.from(i.cells).indexOf(this.currentCell);switch(e){case"insertRowAbove":this.insertRow(t,n,"before");break;case"insertRowBelow":this.insertRow(t,n,"after");break;case"insertColLeft":this.insertColumn(t,o,"before");break;case"insertColRight":this.insertColumn(t,o,"after");break;case"deleteRow":this.deleteRow(t,n);break;case"deleteCol":this.deleteColumn(t,o);break;case"deleteTable":t.remove();break;case"mergeCells":this.mergeCells();break;case"splitCell":this.splitCell()}this.editor.history.record(),this.editor.triggerChange()}insertRow(e,t,i){const n=e.rows[t].cells.length,o=e.insertRow("before"===i?t:t+1);for(let e=0;e<n;e++){o.insertCell().innerHTML="&nbsp;"}}insertColumn(e,t,i){const n="before"===i?t:t+1;for(let t of e.rows){const e=t.insertCell(n);if(e.innerHTML="&nbsp;",t.cells[0]&&"TH"===t.cells[0].tagName){const t=document.createElement("th");t.innerHTML="&nbsp;",e.parentNode.replaceChild(t,e)}}}deleteRow(e,t){e.rows.length>1&&e.deleteRow(t)}deleteColumn(e,t){for(let i of e.rows)i.cells.length>1&&i.cells[t]&&i.deleteCell(t)}mergeCells(){if(!window.getSelection().rangeCount)return;const e=this.currentCell,t=parseInt(e.getAttribute("colspan")||1);e.setAttribute("colspan",t+1);const i=e.nextElementSibling;!i||"TD"!==i.tagName&&"TH"!==i.tagName||(e.innerHTML+=" "+i.innerHTML,i.remove())}splitCell(){const e=this.currentCell,t=parseInt(e.getAttribute("colspan")||1);if(t>1){e.setAttribute("colspan",t-1);const i=document.createElement(e.tagName);i.innerHTML="&nbsp;",e.after(i)}}}"undefined"!=typeof jQuery&&(jQuery.fn.neikiEditor=function(e){return this.each(function(){jQuery.data(this,"neikiEditor")||jQuery.data(this,"neikiEditor",new C(this,e))})}),C.addTranslation=n,e.NeikiEditor=C,e.createNeikiEditor=function(e,t){return new C(e,t)},"function"==typeof define&&define.amd&&define("NeikiEditor",[],function(){return C}),"object"==typeof module&&module.exports&&(module.exports=C)}("undefined"!=typeof window?window:this);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neiki-editor",
3
- "version": "2.2.1",
3
+ "version": "2.4.0",
4
4
  "description": "Lightweight, dependency-free WYSIWYG editor",
5
5
  "keywords": [
6
6
  "wysiwyg",
@@ -11,6 +11,7 @@
11
11
  "main": "dist/neiki-editor.js",
12
12
  "exports": {
13
13
  ".": "./dist/neiki-editor.js",
14
+ "./min": "./dist/neiki-editor.min.js",
14
15
  "./style": "./dist/neiki-editor.css"
15
16
  },
16
17
  "files": [
@@ -19,13 +20,13 @@
19
20
  "style": "dist/neiki-editor.css",
20
21
  "repository": {
21
22
  "type": "git",
22
- "url": "https://github.com/neikiri/neiki-editor.git"
23
+ "url": "git+https://github.com/neikiri/neiki-editor.git"
23
24
  },
24
25
  "bugs": {
25
26
  "url": "https://github.com/neikiri/neiki-editor/issues"
26
27
  },
27
- "unpkg": "dist/neiki-editor.js",
28
- "jsdelivr": "dist/neiki-editor.js",
28
+ "unpkg": "dist/neiki-editor.min.js",
29
+ "jsdelivr": "dist/neiki-editor.min.js",
29
30
  "homepage": "https://github.com/neikiri/neiki-editor#readme",
30
31
  "author": "Jindřich Stoklasa <jindrichstoklasa1@gmail.com>",
31
32
  "license": "MIT"