neiki-editor 2.9.4 → 2.10.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 +657 -13
- package/README.md +11 -8
- package/dist/neiki-editor.css +2 -1
- package/dist/neiki-editor.js +187 -11
- package/dist/neiki-editor.min.css +1 -1
- package/dist/neiki-editor.min.js +1 -1
- package/package.json +1 -1
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-AGPL--3.0-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.
|
|
14
|
+
<img src="https://img.shields.io/badge/Version-2.10.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">
|
|
@@ -62,7 +62,7 @@ Add this single line — CSS is included automatically, always the **latest vers
|
|
|
62
62
|
#### Pin a specific version
|
|
63
63
|
|
|
64
64
|
```html
|
|
65
|
-
<script src="https://cdn.neikiri.dev/neiki-editor/2.
|
|
65
|
+
<script src="https://cdn.neikiri.dev/neiki-editor/2.10.0/neiki-editor.min.js"></script>
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
#### Load CSS and JS separately
|
|
@@ -73,8 +73,8 @@ Add this single line — CSS is included automatically, always the **latest vers
|
|
|
73
73
|
<script src="https://cdn.neikiri.dev/neiki-editor/neiki-editor.js"></script>
|
|
74
74
|
|
|
75
75
|
<!-- Or pinned -->
|
|
76
|
-
<link rel="stylesheet" href="https://cdn.neikiri.dev/neiki-editor/2.
|
|
77
|
-
<script src="https://cdn.neikiri.dev/neiki-editor/2.
|
|
76
|
+
<link rel="stylesheet" href="https://cdn.neikiri.dev/neiki-editor/2.10.0/neiki-editor.css">
|
|
77
|
+
<script src="https://cdn.neikiri.dev/neiki-editor/2.10.0/neiki-editor.js"></script>
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
#### Alternative CDN — jsDelivr
|
|
@@ -84,15 +84,15 @@ Add this single line — CSS is included automatically, always the **latest vers
|
|
|
84
84
|
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@latest/dist/neiki-editor.min.js"></script>
|
|
85
85
|
|
|
86
86
|
<!-- Pinned -->
|
|
87
|
-
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.
|
|
87
|
+
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.10.0/dist/neiki-editor.min.js"></script>
|
|
88
88
|
|
|
89
89
|
<!-- Separate files (latest) -->
|
|
90
90
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@latest/dist/neiki-editor.css">
|
|
91
91
|
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@latest/dist/neiki-editor.js"></script>
|
|
92
92
|
|
|
93
93
|
<!-- Separate files (pinned) -->
|
|
94
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.
|
|
95
|
-
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.
|
|
94
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.10.0/dist/neiki-editor.css">
|
|
95
|
+
<script src="https://cdn.jsdelivr.net/gh/neikiri/neiki-editor@2.10.0/dist/neiki-editor.js"></script>
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
#### Package Manager
|
|
@@ -147,9 +147,10 @@ const editor = new NeikiEditor('#editor', {
|
|
|
147
147
|
language: 'en', // 'en', 'cs', or custom via addTranslation()
|
|
148
148
|
translations: null, // custom translation keys (merged with built-in)
|
|
149
149
|
autosaveKey: null, // optional custom localStorage scope for autosave
|
|
150
|
+
customClass: null, // optional custom CSS class for the content area
|
|
150
151
|
toolbar: [
|
|
151
152
|
'viewCode', 'undo', 'redo', 'findReplace', '|',
|
|
152
|
-
'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'removeFormat', '|',
|
|
153
|
+
'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'code', 'removeFormat', '|',
|
|
153
154
|
'heading', 'fontFamily', 'fontSize', '|',
|
|
154
155
|
'foreColor', 'backColor', '|',
|
|
155
156
|
'alignLeft', 'alignCenter', 'alignRight', 'alignJustify', '|',
|
|
@@ -192,6 +193,7 @@ const editor = new NeikiEditor('#editor', {
|
|
|
192
193
|
| `onReady` | `function\|null` | `null` | Callback when editor is ready |
|
|
193
194
|
| `showHelp` | `boolean` | `true` | Show Help button in More menu (⋯) |
|
|
194
195
|
| `imageUploadHandler` | `function\|null` | `null` | Async callback `(file) => Promise<url>` for uploading images to a server/CDN instead of base64 |
|
|
196
|
+
| `customClass` | `string\|null` | `null` | Custom CSS class appended to the editor content area (`neiki-content`) |
|
|
195
197
|
|
|
196
198
|
---
|
|
197
199
|
|
|
@@ -209,6 +211,7 @@ Use the `toolbar` array to customize which buttons appear and in what order. Use
|
|
|
209
211
|
| `strikethrough` | Strikethrough text |
|
|
210
212
|
| `subscript` | Subscript text |
|
|
211
213
|
| `superscript` | Superscript text |
|
|
214
|
+
| `code` | Toggle code formatting — inline `<code>` or `<pre><code>` block |
|
|
212
215
|
| `removeFormat` | Remove all formatting |
|
|
213
216
|
|
|
214
217
|
> **Note:** When no text is selected, formatting commands (including Remove Formatting) automatically expand to the word at the cursor position.
|
package/dist/neiki-editor.css
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* NeikiEditor - Production-Ready WYSIWYG Rich Text Editor
|
|
3
3
|
* CSS Stylesheet
|
|
4
|
-
* Version: 2.
|
|
4
|
+
* Version: 2.10.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
/* ============================================
|
|
@@ -433,6 +433,7 @@
|
|
|
433
433
|
}
|
|
434
434
|
|
|
435
435
|
.neiki-content img {
|
|
436
|
+
display: inline-block;
|
|
436
437
|
max-width: 100%;
|
|
437
438
|
height: auto;
|
|
438
439
|
border-radius: 4px;
|
package/dist/neiki-editor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* NeikiEditor - A Modern WYSIWYG Editor
|
|
3
|
-
* Version: 2.
|
|
3
|
+
* Version: 2.10.0
|
|
4
4
|
*
|
|
5
5
|
* A lightweight, feature-rich text editor with support for:
|
|
6
6
|
* - Rich text formatting (bold, italic, underline, etc.)
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
'toolbar.autosave': 'Toggle Autosave',
|
|
64
64
|
'toolbar.themeToggle': 'Toggle Theme',
|
|
65
65
|
'toolbar.print': 'Print',
|
|
66
|
+
'toolbar.code': 'Code',
|
|
66
67
|
'toolbar.insert': 'Insert',
|
|
67
68
|
'toolbar.moreOptions': 'More options',
|
|
68
69
|
'toolbar.decreaseFontSize': 'Decrease font size',
|
|
@@ -219,6 +220,7 @@
|
|
|
219
220
|
'toolbar.autosave': 'Auto. ukládání',
|
|
220
221
|
'toolbar.themeToggle': 'Přepnout motiv',
|
|
221
222
|
'toolbar.print': 'Tisk',
|
|
223
|
+
'toolbar.code': 'Kód',
|
|
222
224
|
'toolbar.insert': 'Vložit',
|
|
223
225
|
'toolbar.moreOptions': 'Další možnosti',
|
|
224
226
|
'toolbar.decreaseFontSize': 'Zmenšit písmo',
|
|
@@ -369,6 +371,7 @@
|
|
|
369
371
|
'toolbar.autosave': '自动保存',
|
|
370
372
|
'toolbar.themeToggle': '切换主题',
|
|
371
373
|
'toolbar.print': '打印',
|
|
374
|
+
'toolbar.code': '代码',
|
|
372
375
|
'toolbar.insert': '插入',
|
|
373
376
|
'toolbar.moreOptions': '更多选项',
|
|
374
377
|
'toolbar.decreaseFontSize': '缩小字体',
|
|
@@ -494,6 +497,7 @@
|
|
|
494
497
|
'toolbar.autosave': 'Guardado automático',
|
|
495
498
|
'toolbar.themeToggle': 'Cambiar tema',
|
|
496
499
|
'toolbar.print': 'Imprimir',
|
|
500
|
+
'toolbar.code': 'Código',
|
|
497
501
|
'toolbar.insert': 'Insertar',
|
|
498
502
|
'toolbar.moreOptions': 'Más opciones',
|
|
499
503
|
'toolbar.decreaseFontSize': 'Reducir tamaño de fuente',
|
|
@@ -619,6 +623,7 @@
|
|
|
619
623
|
'toolbar.autosave': 'Automatisch speichern',
|
|
620
624
|
'toolbar.themeToggle': 'Design wechseln',
|
|
621
625
|
'toolbar.print': 'Drucken',
|
|
626
|
+
'toolbar.code': 'Code',
|
|
622
627
|
'toolbar.insert': 'Einfügen',
|
|
623
628
|
'toolbar.moreOptions': 'Weitere Optionen',
|
|
624
629
|
'toolbar.decreaseFontSize': 'Schrift verkleinern',
|
|
@@ -744,6 +749,7 @@
|
|
|
744
749
|
'toolbar.autosave': 'Sauvegarde automatique',
|
|
745
750
|
'toolbar.themeToggle': 'Changer de thème',
|
|
746
751
|
'toolbar.print': 'Imprimer',
|
|
752
|
+
'toolbar.code': 'Code',
|
|
747
753
|
'toolbar.insert': 'Insérer',
|
|
748
754
|
'toolbar.moreOptions': 'Plus d\'options',
|
|
749
755
|
'toolbar.decreaseFontSize': 'Réduire la taille de police',
|
|
@@ -869,6 +875,7 @@
|
|
|
869
875
|
'toolbar.autosave': 'Salvamento automático',
|
|
870
876
|
'toolbar.themeToggle': 'Alternar tema',
|
|
871
877
|
'toolbar.print': 'Imprimir',
|
|
878
|
+
'toolbar.code': 'Código',
|
|
872
879
|
'toolbar.insert': 'Inserir',
|
|
873
880
|
'toolbar.moreOptions': 'Mais opções',
|
|
874
881
|
'toolbar.decreaseFontSize': 'Diminuir fonte',
|
|
@@ -994,6 +1001,7 @@
|
|
|
994
1001
|
'toolbar.autosave': '自動保存',
|
|
995
1002
|
'toolbar.themeToggle': 'テーマ切替',
|
|
996
1003
|
'toolbar.print': '印刷',
|
|
1004
|
+
'toolbar.code': 'コード',
|
|
997
1005
|
'toolbar.insert': '挿入',
|
|
998
1006
|
'toolbar.moreOptions': 'その他',
|
|
999
1007
|
'toolbar.decreaseFontSize': 'フォント縮小',
|
|
@@ -1112,7 +1120,7 @@
|
|
|
1112
1120
|
const DEFAULT_CONFIG = {
|
|
1113
1121
|
toolbar: [
|
|
1114
1122
|
'viewCode', 'undo', 'redo', 'findReplace', '|',
|
|
1115
|
-
'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'removeFormat', '|',
|
|
1123
|
+
'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'code', 'removeFormat', '|',
|
|
1116
1124
|
'heading', 'fontFamily', 'fontSize', '|',
|
|
1117
1125
|
'foreColor', 'backColor', '|',
|
|
1118
1126
|
'alignLeft', 'alignCenter', 'alignRight', 'alignJustify', '|',
|
|
@@ -1138,7 +1146,8 @@
|
|
|
1138
1146
|
onBlur: null,
|
|
1139
1147
|
onReady: null,
|
|
1140
1148
|
showHelp: true,
|
|
1141
|
-
imageUploadHandler: null
|
|
1149
|
+
imageUploadHandler: null,
|
|
1150
|
+
customClass: null
|
|
1142
1151
|
};
|
|
1143
1152
|
|
|
1144
1153
|
const TOOLBAR_ITEMS = {
|
|
@@ -1169,6 +1178,7 @@
|
|
|
1169
1178
|
horizontalRule: { icon: 'minus', titleKey: 'toolbar.horizontalRule', command: 'insertHorizontalRule' },
|
|
1170
1179
|
subscript: { icon: 'subscript', titleKey: 'toolbar.subscript', command: 'subscript' },
|
|
1171
1180
|
superscript: { icon: 'superscript', titleKey: 'toolbar.superscript', command: 'superscript' },
|
|
1181
|
+
code: { icon: 'code-inline', titleKey: 'toolbar.code', command: 'toggleCode' },
|
|
1172
1182
|
removeFormat: { icon: 'eraser', titleKey: 'toolbar.removeFormat', command: 'removeFormat' },
|
|
1173
1183
|
findReplace: { icon: 'search', titleKey: 'toolbar.findReplace', command: 'findReplace', modal: true },
|
|
1174
1184
|
emoji: { icon: 'emoji', titleKey: 'toolbar.emoji', command: 'emoji', picker: 'emoji' },
|
|
@@ -1361,16 +1371,22 @@
|
|
|
1361
1371
|
|
|
1362
1372
|
const currentParent = () => stack[stack.length - 1];
|
|
1363
1373
|
|
|
1374
|
+
const decodeEntities = (text) => {
|
|
1375
|
+
const el = document.createElement('span');
|
|
1376
|
+
el.innerHTML = text;
|
|
1377
|
+
return el.textContent;
|
|
1378
|
+
};
|
|
1379
|
+
|
|
1364
1380
|
while (index < input.length) {
|
|
1365
1381
|
const tagStart = input.indexOf('<', index);
|
|
1366
1382
|
|
|
1367
1383
|
if (tagStart === -1) {
|
|
1368
|
-
currentParent().appendChild(document.createTextNode(input.slice(index)));
|
|
1384
|
+
currentParent().appendChild(document.createTextNode(decodeEntities(input.slice(index))));
|
|
1369
1385
|
break;
|
|
1370
1386
|
}
|
|
1371
1387
|
|
|
1372
1388
|
if (tagStart > index) {
|
|
1373
|
-
currentParent().appendChild(document.createTextNode(input.slice(index, tagStart)));
|
|
1389
|
+
currentParent().appendChild(document.createTextNode(decodeEntities(input.slice(index, tagStart))));
|
|
1374
1390
|
}
|
|
1375
1391
|
|
|
1376
1392
|
if (input.slice(tagStart, tagStart + 4) === '<!--') {
|
|
@@ -1718,6 +1734,7 @@
|
|
|
1718
1734
|
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>',
|
|
1719
1735
|
quote: '<svg viewBox="0 0 24 24"><path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z"/></svg>',
|
|
1720
1736
|
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>',
|
|
1737
|
+
'code-inline': '<svg viewBox="0 0 256 256"><path d="M0 0h256v256H0z" fill="none"/><path fill="currentColor" d="M71.68 97.22L34.74 128l36.94 30.78a12 12 0 1 1-15.36 18.44l-48-40a12 12 0 0 1 0-18.44l48-40a12 12 0 0 1 15.36 18.44m176 21.56l-48-40a12 12 0 1 0-15.36 18.44L221.26 128l-36.94 30.78a12 12 0 1 0 15.36 18.44l48-40a12 12 0 0 0 0-18.44M164.1 28.72a12 12 0 0 0-15.38 7.18l-64 176a12 12 0 0 0 7.18 15.37a11.8 11.8 0 0 0 4.1.73a12 12 0 0 0 11.28-7.9l64-176a12 12 0 0 0-7.18-15.38"/></svg>',
|
|
1721
1738
|
minus: '<svg viewBox="0 0 24 24"><path d="M19 13H5v-2h14v2z"/></svg>',
|
|
1722
1739
|
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>',
|
|
1723
1740
|
fullscreen: '<svg viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>',
|
|
@@ -2511,7 +2528,7 @@
|
|
|
2511
2528
|
<img src="https://github.com/neikiri/neiki-editor/raw/main/logo.png" alt="Neiki's Editor" style="width: 120px; height: auto; margin: 0 auto 16px; display: block;">
|
|
2512
2529
|
<div style="font-size: 14px; line-height: 2; color: var(--neiki-text-primary);">
|
|
2513
2530
|
<div><strong>${Utils.escapeHTML(t('help.author'))}:</strong> neikiri (Jindřich Stoklasa)</div>
|
|
2514
|
-
<div><strong>${Utils.escapeHTML(t('help.version'))}:</strong> 2.
|
|
2531
|
+
<div><strong>${Utils.escapeHTML(t('help.version'))}:</strong> 2.10.0</div>
|
|
2515
2532
|
<div><strong>${Utils.escapeHTML(t('help.github'))}:</strong> <a href="https://github.com/neikiri/neiki-editor" target="_blank" rel="noopener noreferrer" style="color: var(--neiki-accent);">github.com/neikiri/neiki-editor</a></div>
|
|
2516
2533
|
<div><strong>${Utils.escapeHTML(t('help.documentation'))}:</strong> <a href="https://github.com/neikiri/neiki-editor/wiki" target="_blank" rel="noopener noreferrer" style="color: var(--neiki-accent);">Wiki</a></div>
|
|
2517
2534
|
</div>
|
|
@@ -2970,6 +2987,112 @@
|
|
|
2970
2987
|
subscript() { this.exec('subscript'); }
|
|
2971
2988
|
superscript() { this.exec('superscript'); }
|
|
2972
2989
|
|
|
2990
|
+
toggleCode() {
|
|
2991
|
+
const sel = window.getSelection();
|
|
2992
|
+
if (!sel || !sel.rangeCount) return;
|
|
2993
|
+
|
|
2994
|
+
const range = sel.getRangeAt(0);
|
|
2995
|
+
|
|
2996
|
+
// Detect if selection is inside or contains <pre> or <code>
|
|
2997
|
+
const findCodeAncestor = (n) => {
|
|
2998
|
+
if (n.nodeType === Node.TEXT_NODE) n = n.parentNode;
|
|
2999
|
+
if (!n || !n.closest) return null;
|
|
3000
|
+
const pre = n.closest('pre');
|
|
3001
|
+
if (pre && this.editor.contentArea.contains(pre)) return { type: 'pre', el: pre };
|
|
3002
|
+
const code = n.closest('code');
|
|
3003
|
+
if (code && this.editor.contentArea.contains(code)) return { type: 'code', el: code };
|
|
3004
|
+
return null;
|
|
3005
|
+
};
|
|
3006
|
+
|
|
3007
|
+
// Check start, end, and common ancestor
|
|
3008
|
+
const fromStart = findCodeAncestor(range.startContainer);
|
|
3009
|
+
const fromEnd = findCodeAncestor(range.endContainer);
|
|
3010
|
+
const fromCommon = findCodeAncestor(range.commonAncestorContainer);
|
|
3011
|
+
const existing = fromStart || fromEnd || fromCommon;
|
|
3012
|
+
|
|
3013
|
+
// Also check if selection contains <code> elements inside it
|
|
3014
|
+
let containedCode = null;
|
|
3015
|
+
if (!existing && !range.collapsed) {
|
|
3016
|
+
const container = range.commonAncestorContainer;
|
|
3017
|
+
const el = container.nodeType === Node.TEXT_NODE ? container.parentNode : container;
|
|
3018
|
+
if (el) containedCode = el.querySelector ? el.querySelector('code') : null;
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
if (existing && existing.type === 'pre') {
|
|
3022
|
+
// Unwrap <pre><code> block: convert back to <p> paragraphs
|
|
3023
|
+
const pre = existing.el;
|
|
3024
|
+
const lines = pre.textContent.split('\n');
|
|
3025
|
+
const fragment = document.createDocumentFragment();
|
|
3026
|
+
lines.forEach(line => {
|
|
3027
|
+
const p = document.createElement('p');
|
|
3028
|
+
p.textContent = line || '\u00A0';
|
|
3029
|
+
fragment.appendChild(p);
|
|
3030
|
+
});
|
|
3031
|
+
pre.parentNode.replaceChild(fragment, pre);
|
|
3032
|
+
} else if (existing && existing.type === 'code') {
|
|
3033
|
+
// Unwrap inline <code>
|
|
3034
|
+
const codeEl = existing.el;
|
|
3035
|
+
const parent = codeEl.parentNode;
|
|
3036
|
+
while (codeEl.firstChild) {
|
|
3037
|
+
parent.insertBefore(codeEl.firstChild, codeEl);
|
|
3038
|
+
}
|
|
3039
|
+
parent.removeChild(codeEl);
|
|
3040
|
+
} else if (containedCode) {
|
|
3041
|
+
// Selection contains <code> elements — unwrap them all
|
|
3042
|
+
const container = range.commonAncestorContainer;
|
|
3043
|
+
const el = container.nodeType === Node.TEXT_NODE ? container.parentNode : container;
|
|
3044
|
+
const codes = el.querySelectorAll('code');
|
|
3045
|
+
codes.forEach(codeEl => {
|
|
3046
|
+
if (this.editor.contentArea.contains(codeEl)) {
|
|
3047
|
+
const p = codeEl.parentNode;
|
|
3048
|
+
while (codeEl.firstChild) p.insertBefore(codeEl.firstChild, codeEl);
|
|
3049
|
+
p.removeChild(codeEl);
|
|
3050
|
+
}
|
|
3051
|
+
});
|
|
3052
|
+
} else {
|
|
3053
|
+
// Apply code formatting
|
|
3054
|
+
if (sel.isCollapsed) this._expandToWordIfCollapsed();
|
|
3055
|
+
|
|
3056
|
+
const startBlock = this._getBlockParent(range.startContainer);
|
|
3057
|
+
const endBlock = this._getBlockParent(range.endContainer);
|
|
3058
|
+
|
|
3059
|
+
if (startBlock && endBlock && startBlock !== endBlock) {
|
|
3060
|
+
// Multi-block selection: create a <pre><code> block
|
|
3061
|
+
const blocks = [];
|
|
3062
|
+
let cur = startBlock;
|
|
3063
|
+
while (cur) {
|
|
3064
|
+
blocks.push(cur);
|
|
3065
|
+
if (cur === endBlock) break;
|
|
3066
|
+
cur = cur.nextElementSibling;
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
const textLines = blocks.map(block => block.textContent);
|
|
3070
|
+
const pre = document.createElement('pre');
|
|
3071
|
+
const code = document.createElement('code');
|
|
3072
|
+
code.textContent = textLines.join('\n');
|
|
3073
|
+
pre.appendChild(code);
|
|
3074
|
+
|
|
3075
|
+
startBlock.parentNode.insertBefore(pre, startBlock);
|
|
3076
|
+
blocks.forEach(block => block.parentNode.removeChild(block));
|
|
3077
|
+
} else {
|
|
3078
|
+
// Single block: inline <code> wrap
|
|
3079
|
+
this.editor.wrapSelection('code');
|
|
3080
|
+
}
|
|
3081
|
+
}
|
|
3082
|
+
this.editor.history.record();
|
|
3083
|
+
this.editor.updateToolbar();
|
|
3084
|
+
this.editor.triggerChange();
|
|
3085
|
+
}
|
|
3086
|
+
|
|
3087
|
+
_getBlockParent(node) {
|
|
3088
|
+
if (node.nodeType === Node.TEXT_NODE) node = node.parentNode;
|
|
3089
|
+
while (node && node !== this.editor.contentArea) {
|
|
3090
|
+
if (node.parentNode === this.editor.contentArea) return node;
|
|
3091
|
+
node = node.parentNode;
|
|
3092
|
+
}
|
|
3093
|
+
return null;
|
|
3094
|
+
}
|
|
3095
|
+
|
|
2973
3096
|
justifyLeft() { this.exec('justifyLeft'); }
|
|
2974
3097
|
justifyCenter() { this.exec('justifyCenter'); }
|
|
2975
3098
|
justifyRight() { this.exec('justifyRight'); }
|
|
@@ -3227,6 +3350,11 @@
|
|
|
3227
3350
|
'neiki_' + (typeof element === 'string' ? element.replace(/[^a-zA-Z0-9]/g, '_') : 'editor');
|
|
3228
3351
|
|
|
3229
3352
|
this.config = Utils.deepMerge(DEFAULT_CONFIG, options);
|
|
3353
|
+
|
|
3354
|
+
// Backward compatibility: support old custom_class option
|
|
3355
|
+
if (this.config.custom_class && !this.config.customClass) {
|
|
3356
|
+
this.config.customClass = this.config.custom_class;
|
|
3357
|
+
}
|
|
3230
3358
|
this.instanceIndex = ++EDITOR_INSTANCE_COUNTER;
|
|
3231
3359
|
this.storageId = this.createAutosaveStorageId(element);
|
|
3232
3360
|
this.isFullscreen = false;
|
|
@@ -3814,8 +3942,12 @@
|
|
|
3814
3942
|
createContentArea() {
|
|
3815
3943
|
this.contentWrapper = Utils.createElement('div', { className: 'neiki-content-wrapper' });
|
|
3816
3944
|
|
|
3945
|
+
const contentClasses = this.config.customClass
|
|
3946
|
+
? `neiki-content ${this.config.customClass}`
|
|
3947
|
+
: 'neiki-content';
|
|
3948
|
+
|
|
3817
3949
|
this.contentArea = Utils.createElement('div', {
|
|
3818
|
-
className:
|
|
3950
|
+
className: contentClasses,
|
|
3819
3951
|
contentEditable: !this.config.readonly,
|
|
3820
3952
|
spellcheck: this.config.spellcheck,
|
|
3821
3953
|
'data-placeholder': t('placeholder')
|
|
@@ -4174,6 +4306,17 @@
|
|
|
4174
4306
|
case 'justifyFull':
|
|
4175
4307
|
isActive = document.queryCommandState(config.command);
|
|
4176
4308
|
break;
|
|
4309
|
+
case 'toggleCode': {
|
|
4310
|
+
const sel = window.getSelection();
|
|
4311
|
+
if (sel && sel.rangeCount) {
|
|
4312
|
+
let node = sel.getRangeAt(0).startContainer;
|
|
4313
|
+
if (node.nodeType === Node.TEXT_NODE) node = node.parentNode;
|
|
4314
|
+
const inCode = node.closest && node.closest('code') && this.contentArea.contains(node.closest('code'));
|
|
4315
|
+
const inPre = node.closest && node.closest('pre') && this.contentArea.contains(node.closest('pre'));
|
|
4316
|
+
isActive = !!(inCode || inPre);
|
|
4317
|
+
}
|
|
4318
|
+
break;
|
|
4319
|
+
}
|
|
4177
4320
|
case 'formatBlock':
|
|
4178
4321
|
if (config.value === 'blockquote') {
|
|
4179
4322
|
const sel = window.getSelection();
|
|
@@ -4367,15 +4510,48 @@
|
|
|
4367
4510
|
} catch (e) {}
|
|
4368
4511
|
return;
|
|
4369
4512
|
}
|
|
4370
|
-
// Wrap bare text nodes
|
|
4513
|
+
// Wrap bare text nodes and normalize non-block elements into <p>
|
|
4514
|
+
const BLOCK_TAGS = new Set(['P','H1','H2','H3','H4','H5','H6','UL','OL','BLOCKQUOTE','TABLE','HR','PRE','FIGURE','SECTION','ARTICLE']);
|
|
4371
4515
|
const childNodes = Array.from(this.contentArea.childNodes);
|
|
4516
|
+
|
|
4517
|
+
// First pass: convert stray <div> to <p>
|
|
4372
4518
|
childNodes.forEach(node => {
|
|
4373
|
-
if (node.nodeType === Node.
|
|
4519
|
+
if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'DIV') {
|
|
4374
4520
|
const p = document.createElement('p');
|
|
4375
|
-
node.
|
|
4376
|
-
|
|
4521
|
+
while (node.firstChild) p.appendChild(node.firstChild);
|
|
4522
|
+
node.parentNode.replaceChild(p, node);
|
|
4377
4523
|
}
|
|
4378
4524
|
});
|
|
4525
|
+
|
|
4526
|
+
// Second pass: group consecutive inline/text nodes into <p>
|
|
4527
|
+
const updatedNodes = Array.from(this.contentArea.childNodes);
|
|
4528
|
+
let inlineGroup = [];
|
|
4529
|
+
|
|
4530
|
+
const flushGroup = () => {
|
|
4531
|
+
if (inlineGroup.length === 0) return;
|
|
4532
|
+
const p = document.createElement('p');
|
|
4533
|
+
const firstNode = inlineGroup[0];
|
|
4534
|
+
this.contentArea.insertBefore(p, firstNode);
|
|
4535
|
+
inlineGroup.forEach(n => p.appendChild(n));
|
|
4536
|
+
inlineGroup = [];
|
|
4537
|
+
};
|
|
4538
|
+
|
|
4539
|
+
updatedNodes.forEach(node => {
|
|
4540
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
4541
|
+
if (node.textContent.trim()) {
|
|
4542
|
+
inlineGroup.push(node);
|
|
4543
|
+
} else if (inlineGroup.length > 0) {
|
|
4544
|
+
inlineGroup.push(node);
|
|
4545
|
+
}
|
|
4546
|
+
} else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
4547
|
+
if (BLOCK_TAGS.has(node.tagName)) {
|
|
4548
|
+
flushGroup();
|
|
4549
|
+
} else {
|
|
4550
|
+
inlineGroup.push(node);
|
|
4551
|
+
}
|
|
4552
|
+
}
|
|
4553
|
+
});
|
|
4554
|
+
flushGroup();
|
|
4379
4555
|
}
|
|
4380
4556
|
|
|
4381
4557
|
syncToOriginal() {
|
|
@@ -1 +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-editor.neiki-sticky-toolbar{overflow:visible}.neiki-editor.neiki-sticky-toolbar .neiki-toolbar{position:sticky;top:0;z-index:100;border-radius:8px 8px 0 0}.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-custom,.neiki-statusbar{border-top:1px solid var(--neiki-border-color)}.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);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-color-picker,.neiki-dropdown{position:absolute;top:100%;left:0;z-index:1000;border:1px solid var(--neiki-border-color);box-shadow:var(--neiki-shadow-lg)}.neiki-dropdown{min-width:180px;background:var(--neiki-bg-primary);border-radius:6px;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-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{background:var(--neiki-bg-primary);border-radius:8px;padding:8px;margin-top:4px;display:flex;flex-direction:column;gap:6px}.neiki-color-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.neiki-color-custom{display:flex;align-items:center;gap:6px}.neiki-color-custom-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:28px;height:28px;border:1px solid var(--neiki-border-color);border-radius:4px;padding:2px;cursor:pointer;background:0 0}.neiki-color-custom-input::-webkit-color-swatch-wrapper{padding:0}.neiki-color-custom-input::-webkit-color-swatch{border:none;border-radius:2px}.neiki-color-custom-input::-moz-color-swatch{border:none;border-radius:2px}.neiki-color-hex-input{flex:1;height:28px;padding:0 8px;border:1px solid var(--neiki-border-color);border-radius:4px;font-size:12px;font-family:monospace;background:var(--neiki-bg-secondary);color:var(--neiki-text-primary);outline:0}.neiki-color-hex-input:focus{border-color:var(--neiki-accent-color);box-shadow:0 0 0 2px rgba(13,110,253,.15)}.neiki-color-apply-btn{height:28px;padding:0 10px;border:none;border-radius:4px;font-size:12px;font-weight:500;background:var(--neiki-accent-color);color:#fff;cursor:pointer;transition:background .15s}.neiki-emoji-picker,.neiki-special-picker{max-width:calc(100vw - 16px);overflow-y:auto;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-btn-primary:hover,.neiki-button-primary:hover,.neiki-color-apply-btn:hover{background:var(--neiki-accent-hover)}.neiki-color-swatch{width:22px;height:22px;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;border:1px solid var(--neiki-border-color);border-radius:8px;display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.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;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-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-modal-footer .neiki-btn{width:auto;height:38px;padding:0 16px;font-size:14px;font-weight:500;border-radius:6px}.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-input{width:100%;height:40px;padding:0 12px;border:1px solid var(--neiki-border-color);border-radius:6px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;transition:border-color .15s}.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-input[type=file]{display:flex;align-items:center;padding:0;cursor:pointer}.neiki-input[type=file]::file-selector-button{height:100%;padding:0 14px;margin-right:12px;border:none;border-right:1px solid var(--neiki-border-color);background:var(--neiki-bg-tertiary,var(--neiki-bg-hover));color:var(--neiki-text-primary);font-size:13px;font-weight:500;cursor:pointer;border-radius:5px 0 0 5px}.neiki-image-upload-zone{position:relative;display:grid;justify-items:center;gap:7px;padding:24px 18px;border:2px dashed var(--neiki-border-color);border-radius:8px;background:var(--neiki-bg-secondary);color:var(--neiki-text-secondary);text-align:center;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s}.neiki-find-replace,.neiki-form-textarea{border:1px solid var(--neiki-border-color)}.neiki-image-upload-zone:focus-visible,.neiki-image-upload-zone:hover{border-color:var(--neiki-accent-color);background:var(--neiki-bg-primary);box-shadow:0 0 0 3px rgba(13,110,253,.12);outline:0}.neiki-image-upload-zone.drag-over{border-color:var(--neiki-accent-color);background:rgba(13,110,253,.08)}.neiki-form-divider::after,.neiki-form-divider::before{content:'';height:1px;background:var(--neiki-border-color)}.neiki-image-upload-zone.has-files{border-style:solid;border-color:var(--neiki-accent-color)}.neiki-image-upload-input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.neiki-image-upload-icon{width:38px;height:38px;color:var(--neiki-accent-color)}.neiki-image-upload-icon svg{width:100%;height:100%;fill:currentColor}.neiki-image-upload-title{color:var(--neiki-text-primary);font-size:14px;font-weight:600}.neiki-image-upload-files,.neiki-image-upload-hint{max-width:100%;color:var(--neiki-text-muted);font-size:12px;line-height:1.4}.neiki-image-upload-files{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neiki-image-upload-zone.has-files .neiki-image-upload-files{color:var(--neiki-accent-color);font-weight:500}.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{width:100%;min-height:120px;padding:12px;border-radius:6px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;font-family:inherit;resize:vertical;transition:border-color .15s}.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-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-context-menu,.neiki-floating-toolbar{position:fixed;box-shadow:var(--neiki-shadow-lg)}.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{z-index:10001;min-width:180px;border:1px solid var(--neiki-border-color);border-radius:8px;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,.neiki-img-toolbar-btn svg{width:16px;height:16px;fill:currentColor}.neiki-floating-toolbar{z-index:1000;display:none;border:1px solid var(--neiki-border-color);border-radius:8px;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,.neiki-img-toolbar-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-floating-divider,.neiki-img-toolbar-separator{width:1px;height:20px;background:var(--neiki-border-color);margin:0 2px}.neiki-floating-move-btn svg{width:16px;height:16px}.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-img-size-label,.neiki-img-toolbar{left:50%;transform:translateX(-50%);white-space:nowrap}.neiki-drop-overlay-text{font-size:18px;font-weight:600;color:var(--neiki-accent-color)}.neiki-img-resizable{display:inline-block;position:relative;outline:2px solid var(--neiki-accent-color);outline-offset:2px;border-radius:4px;line-height:0}.neiki-img-resizable img{display:block;max-width:100%}.neiki-img-resize-handle{position:absolute;width:12px;height:12px;background:var(--neiki-accent-color);border:2px solid #fff;border-radius:2px;z-index:10;box-shadow:0 1px 3px rgba(0,0,0,.3)}.neiki-img-resize-handle.nw{top:-6px;left:-6px;cursor:nw-resize}.neiki-img-resize-handle.ne{top:-6px;right:-6px;cursor:ne-resize}.neiki-img-resize-handle.sw{bottom:-6px;left:-6px;cursor:sw-resize}.neiki-img-resize-handle.se{bottom:-6px;right:-6px;cursor:se-resize}.neiki-img-size-label{position:absolute;bottom:-32px;background:var(--neiki-text-primary);color:var(--neiki-bg-primary);font-size:13px;line-height:1.4;font-weight:600;padding:4px 12px;border-radius:6px;pointer-events:none;z-index:10;opacity:.9}@media (pointer:coarse){.neiki-img-resize-handle{width:20px;height:20px}.neiki-img-resize-handle.nw{top:-10px;left:-10px}.neiki-img-resize-handle.ne{top:-10px;right:-10px}.neiki-img-resize-handle.sw{bottom:-10px;left:-10px}.neiki-img-resize-handle.se{bottom:-10px;right:-10px}}.neiki-img-toolbar{position:absolute;display:flex;align-items:center;gap:2px;padding:4px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:6px;box-shadow:var(--neiki-shadow-md);z-index:20}.neiki-img-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:4px;background:0 0;color:var(--neiki-text-secondary);cursor:pointer;transition:.15s}.neiki-img-toolbar-btn-danger:hover{background:#fee2e2;color:#dc2626}.neiki-editor.neiki-dark .neiki-img-toolbar-btn-danger:hover{background:#451a1a;color:#f87171}.neiki-img-drag-handle{cursor:grab}.neiki-block-grip:active,.neiki-img-drag-handle:active{cursor:grabbing}.neiki-table-col-resize-handle{position:absolute;width:6px;cursor:col-resize;z-index:10;background:0 0;transition:background .1s}.neiki-table-col-resize-handle:active,.neiki-table-col-resize-handle:hover{background:var(--neiki-accent-color);opacity:.6;border-radius:3px}.neiki-block-grip{position:absolute;width:22px;height:22px;display:flex;align-items:center;justify-content:center;cursor:grab;color:var(--neiki-text-muted);opacity:0;transition:opacity .15s,color .15s;border-radius:4px;z-index:5;user-select:none}.neiki-content:hover .neiki-block-grip{opacity:.5}.neiki-block-grip:hover{opacity:1!important;color:var(--neiki-text-primary);background:var(--neiki-bg-hover)}.neiki-block-grip svg{width:14px;height:14px;fill:currentColor;pointer-events:none}.neiki-block-ghost{position:fixed;z-index:100000;pointer-events:none;opacity:.7;background:var(--neiki-bg-primary);border:2px solid var(--neiki-accent-color);border-radius:6px;padding:8px 12px;box-shadow:var(--neiki-shadow-lg);max-height:120px;overflow:hidden}.neiki-block-placeholder{border:2px dashed var(--neiki-accent-color);border-radius:6px;background:rgba(13,110,253,.05);margin:2px 0;transition:height .15s}@media print{.neiki-content,.neiki-editor-wrapper{overflow:visible!important}.neiki-editor{border:none!important;box-shadow:none!important}.neiki-block-grip,.neiki-code-view-header,.neiki-find-replace,.neiki-floating-toolbar,.neiki-img-resize-handle,.neiki-img-size-label,.neiki-img-toolbar,.neiki-statusbar,.neiki-table-col-resize-handle,.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,.neiki-modal-footer,.neiki-modal-header{padding:12px 16px}.neiki-statusbar{padding:4px 8px;font-size:11px}.neiki-modal{width:calc(100% - 20px);max-width:none;margin:10px;max-height:calc(100vh - 40px);border-radius:10px}.neiki-modal-overlay{padding:10px}.neiki-modal-body{padding:16px;max-height:calc(100vh - 160px);overflow-y:auto;-webkit-overflow-scrolling:touch}.neiki-modal-footer .neiki-btn{height:36px;padding:0 14px;font-size:13px}.neiki-form-row{flex-direction:column;gap:12px}.neiki-form-input,.neiki-input{height:38px;font-size:16px}.neiki-image-upload-zone{grid-template-columns:32px 1fr;justify-items:start;gap:4px 10px;padding:14px;text-align:left}.neiki-image-upload-icon{grid-row:span 3;width:30px;height:30px}.neiki-image-upload-title{font-size:13px}.neiki-image-upload-files,.neiki-image-upload-hint{font-size:11px}.neiki-find-replace{width:100%;border-radius:0}.neiki-checkbox-wrapper{padding:0 4px;font-size:11px}.neiki-color-picker{left:auto;right:0}}@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}.neiki-img-toolbar{padding:3px;gap:1px;border-radius:5px;left:0;transform:none;max-width:calc(100vw - 20px)}.neiki-img-toolbar-btn{width:26px;height:26px}.neiki-img-toolbar-btn svg{width:14px;height:14px}.neiki-img-toolbar-separator{height:16px;margin:0 1px}}@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;max-width:calc(100vw - 16px);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}
|
|
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-editor.neiki-sticky-toolbar{overflow:visible}.neiki-editor.neiki-sticky-toolbar .neiki-toolbar{position:sticky;top:0;z-index:100;border-radius:8px 8px 0 0}.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-custom,.neiki-statusbar{border-top:1px solid var(--neiki-border-color)}.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{display:inline-block;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);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-color-picker,.neiki-dropdown{position:absolute;top:100%;left:0;z-index:1000;border:1px solid var(--neiki-border-color);box-shadow:var(--neiki-shadow-lg)}.neiki-dropdown{min-width:180px;background:var(--neiki-bg-primary);border-radius:6px;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-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{background:var(--neiki-bg-primary);border-radius:8px;padding:8px;margin-top:4px;display:flex;flex-direction:column;gap:6px}.neiki-color-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.neiki-color-custom{display:flex;align-items:center;gap:6px}.neiki-color-custom-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:28px;height:28px;border:1px solid var(--neiki-border-color);border-radius:4px;padding:2px;cursor:pointer;background:0 0}.neiki-color-custom-input::-webkit-color-swatch-wrapper{padding:0}.neiki-color-custom-input::-webkit-color-swatch{border:none;border-radius:2px}.neiki-color-custom-input::-moz-color-swatch{border:none;border-radius:2px}.neiki-color-hex-input{flex:1;height:28px;padding:0 8px;border:1px solid var(--neiki-border-color);border-radius:4px;font-size:12px;font-family:monospace;background:var(--neiki-bg-secondary);color:var(--neiki-text-primary);outline:0}.neiki-color-hex-input:focus{border-color:var(--neiki-accent-color);box-shadow:0 0 0 2px rgba(13,110,253,.15)}.neiki-color-apply-btn{height:28px;padding:0 10px;border:none;border-radius:4px;font-size:12px;font-weight:500;background:var(--neiki-accent-color);color:#fff;cursor:pointer;transition:background .15s}.neiki-emoji-picker,.neiki-special-picker{max-width:calc(100vw - 16px);overflow-y:auto;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-btn-primary:hover,.neiki-button-primary:hover,.neiki-color-apply-btn:hover{background:var(--neiki-accent-hover)}.neiki-color-swatch{width:22px;height:22px;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;border:1px solid var(--neiki-border-color);border-radius:8px;display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.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;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-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-modal-footer .neiki-btn{width:auto;height:38px;padding:0 16px;font-size:14px;font-weight:500;border-radius:6px}.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-input{width:100%;height:40px;padding:0 12px;border:1px solid var(--neiki-border-color);border-radius:6px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;transition:border-color .15s}.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-input[type=file]{display:flex;align-items:center;padding:0;cursor:pointer}.neiki-input[type=file]::file-selector-button{height:100%;padding:0 14px;margin-right:12px;border:none;border-right:1px solid var(--neiki-border-color);background:var(--neiki-bg-tertiary,var(--neiki-bg-hover));color:var(--neiki-text-primary);font-size:13px;font-weight:500;cursor:pointer;border-radius:5px 0 0 5px}.neiki-image-upload-zone{position:relative;display:grid;justify-items:center;gap:7px;padding:24px 18px;border:2px dashed var(--neiki-border-color);border-radius:8px;background:var(--neiki-bg-secondary);color:var(--neiki-text-secondary);text-align:center;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s}.neiki-find-replace,.neiki-form-textarea{border:1px solid var(--neiki-border-color)}.neiki-image-upload-zone:focus-visible,.neiki-image-upload-zone:hover{border-color:var(--neiki-accent-color);background:var(--neiki-bg-primary);box-shadow:0 0 0 3px rgba(13,110,253,.12);outline:0}.neiki-image-upload-zone.drag-over{border-color:var(--neiki-accent-color);background:rgba(13,110,253,.08)}.neiki-form-divider::after,.neiki-form-divider::before{content:'';height:1px;background:var(--neiki-border-color)}.neiki-image-upload-zone.has-files{border-style:solid;border-color:var(--neiki-accent-color)}.neiki-image-upload-input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.neiki-image-upload-icon{width:38px;height:38px;color:var(--neiki-accent-color)}.neiki-image-upload-icon svg{width:100%;height:100%;fill:currentColor}.neiki-image-upload-title{color:var(--neiki-text-primary);font-size:14px;font-weight:600}.neiki-image-upload-files,.neiki-image-upload-hint{max-width:100%;color:var(--neiki-text-muted);font-size:12px;line-height:1.4}.neiki-image-upload-files{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neiki-image-upload-zone.has-files .neiki-image-upload-files{color:var(--neiki-accent-color);font-weight:500}.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{width:100%;min-height:120px;padding:12px;border-radius:6px;background:var(--neiki-bg-primary);color:var(--neiki-text-primary);font-size:14px;font-family:inherit;resize:vertical;transition:border-color .15s}.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-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-context-menu,.neiki-floating-toolbar{position:fixed;box-shadow:var(--neiki-shadow-lg)}.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{z-index:10001;min-width:180px;border:1px solid var(--neiki-border-color);border-radius:8px;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,.neiki-img-toolbar-btn svg{width:16px;height:16px;fill:currentColor}.neiki-floating-toolbar{z-index:1000;display:none;border:1px solid var(--neiki-border-color);border-radius:8px;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,.neiki-img-toolbar-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-floating-divider,.neiki-img-toolbar-separator{width:1px;height:20px;background:var(--neiki-border-color);margin:0 2px}.neiki-floating-move-btn svg{width:16px;height:16px}.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-img-size-label,.neiki-img-toolbar{left:50%;transform:translateX(-50%);white-space:nowrap}.neiki-drop-overlay-text{font-size:18px;font-weight:600;color:var(--neiki-accent-color)}.neiki-img-resizable{display:inline-block;position:relative;outline:2px solid var(--neiki-accent-color);outline-offset:2px;border-radius:4px;line-height:0}.neiki-img-resizable img{display:block;max-width:100%}.neiki-img-resize-handle{position:absolute;width:12px;height:12px;background:var(--neiki-accent-color);border:2px solid #fff;border-radius:2px;z-index:10;box-shadow:0 1px 3px rgba(0,0,0,.3)}.neiki-img-resize-handle.nw{top:-6px;left:-6px;cursor:nw-resize}.neiki-img-resize-handle.ne{top:-6px;right:-6px;cursor:ne-resize}.neiki-img-resize-handle.sw{bottom:-6px;left:-6px;cursor:sw-resize}.neiki-img-resize-handle.se{bottom:-6px;right:-6px;cursor:se-resize}.neiki-img-size-label{position:absolute;bottom:-32px;background:var(--neiki-text-primary);color:var(--neiki-bg-primary);font-size:13px;line-height:1.4;font-weight:600;padding:4px 12px;border-radius:6px;pointer-events:none;z-index:10;opacity:.9}@media (pointer:coarse){.neiki-img-resize-handle{width:20px;height:20px}.neiki-img-resize-handle.nw{top:-10px;left:-10px}.neiki-img-resize-handle.ne{top:-10px;right:-10px}.neiki-img-resize-handle.sw{bottom:-10px;left:-10px}.neiki-img-resize-handle.se{bottom:-10px;right:-10px}}.neiki-img-toolbar{position:absolute;display:flex;align-items:center;gap:2px;padding:4px;background:var(--neiki-bg-primary);border:1px solid var(--neiki-border-color);border-radius:6px;box-shadow:var(--neiki-shadow-md);z-index:20}.neiki-img-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:4px;background:0 0;color:var(--neiki-text-secondary);cursor:pointer;transition:.15s}.neiki-img-toolbar-btn-danger:hover{background:#fee2e2;color:#dc2626}.neiki-editor.neiki-dark .neiki-img-toolbar-btn-danger:hover{background:#451a1a;color:#f87171}.neiki-img-drag-handle{cursor:grab}.neiki-block-grip:active,.neiki-img-drag-handle:active{cursor:grabbing}.neiki-table-col-resize-handle{position:absolute;width:6px;cursor:col-resize;z-index:10;background:0 0;transition:background .1s}.neiki-table-col-resize-handle:active,.neiki-table-col-resize-handle:hover{background:var(--neiki-accent-color);opacity:.6;border-radius:3px}.neiki-block-grip{position:absolute;width:22px;height:22px;display:flex;align-items:center;justify-content:center;cursor:grab;color:var(--neiki-text-muted);opacity:0;transition:opacity .15s,color .15s;border-radius:4px;z-index:5;user-select:none}.neiki-content:hover .neiki-block-grip{opacity:.5}.neiki-block-grip:hover{opacity:1!important;color:var(--neiki-text-primary);background:var(--neiki-bg-hover)}.neiki-block-grip svg{width:14px;height:14px;fill:currentColor;pointer-events:none}.neiki-block-ghost{position:fixed;z-index:100000;pointer-events:none;opacity:.7;background:var(--neiki-bg-primary);border:2px solid var(--neiki-accent-color);border-radius:6px;padding:8px 12px;box-shadow:var(--neiki-shadow-lg);max-height:120px;overflow:hidden}.neiki-block-placeholder{border:2px dashed var(--neiki-accent-color);border-radius:6px;background:rgba(13,110,253,.05);margin:2px 0;transition:height .15s}@media print{.neiki-content,.neiki-editor-wrapper{overflow:visible!important}.neiki-editor{border:none!important;box-shadow:none!important}.neiki-block-grip,.neiki-code-view-header,.neiki-find-replace,.neiki-floating-toolbar,.neiki-img-resize-handle,.neiki-img-size-label,.neiki-img-toolbar,.neiki-statusbar,.neiki-table-col-resize-handle,.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,.neiki-modal-footer,.neiki-modal-header{padding:12px 16px}.neiki-statusbar{padding:4px 8px;font-size:11px}.neiki-modal{width:calc(100% - 20px);max-width:none;margin:10px;max-height:calc(100vh - 40px);border-radius:10px}.neiki-modal-overlay{padding:10px}.neiki-modal-body{padding:16px;max-height:calc(100vh - 160px);overflow-y:auto;-webkit-overflow-scrolling:touch}.neiki-modal-footer .neiki-btn{height:36px;padding:0 14px;font-size:13px}.neiki-form-row{flex-direction:column;gap:12px}.neiki-form-input,.neiki-input{height:38px;font-size:16px}.neiki-image-upload-zone{grid-template-columns:32px 1fr;justify-items:start;gap:4px 10px;padding:14px;text-align:left}.neiki-image-upload-icon{grid-row:span 3;width:30px;height:30px}.neiki-image-upload-title{font-size:13px}.neiki-image-upload-files,.neiki-image-upload-hint{font-size:11px}.neiki-find-replace{width:100%;border-radius:0}.neiki-checkbox-wrapper{padding:0 4px;font-size:11px}.neiki-color-picker{left:auto;right:0}}@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}.neiki-img-toolbar{padding:3px;gap:1px;border-radius:5px;left:0;transform:none;max-width:calc(100vw - 20px)}.neiki-img-toolbar-btn{width:26px;height:26px}.neiki-img-toolbar-btn svg{width:14px;height:14px}.neiki-img-toolbar-separator{height:16px;margin:0 1px}}@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;max-width:calc(100vw - 16px);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}
|