neiki-editor 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1981 @@
1
+ /**
2
+ * NeikiEditor - Production-Ready WYSIWYG Rich Text Editor
3
+ * CSS Stylesheet
4
+ * Version: 1.0.0
5
+ */
6
+
7
+ /* ============================================
8
+ CSS Custom Properties (Light/Dark Themes)
9
+ ============================================ */
10
+ :root {
11
+ /* Light Theme (default) */
12
+ --neiki-bg-primary: #ffffff;
13
+ --neiki-bg-secondary: #f8f9fa;
14
+ --neiki-bg-tertiary: #e9ecef;
15
+ --neiki-bg-hover: #dee2e6;
16
+ --neiki-bg-active: #ced4da;
17
+ --neiki-border-color: #dee2e6;
18
+ --neiki-border-color-dark: #adb5bd;
19
+ --neiki-text-primary: #212529;
20
+ --neiki-text-secondary: #495057;
21
+ --neiki-text-muted: #6c757d;
22
+ --neiki-accent-color: #0d6efd;
23
+ --neiki-accent-hover: #0b5ed7;
24
+ --neiki-danger-color: #dc3545;
25
+ --neiki-success-color: #198754;
26
+ --neiki-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
27
+ --neiki-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
28
+ --neiki-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
29
+ --neiki-editor-bg: #ffffff;
30
+ --neiki-toolbar-bg: #f8f9fa;
31
+ --neiki-statusbar-bg: #f8f9fa;
32
+ --neiki-modal-overlay: rgba(0, 0, 0, 0.5);
33
+ --neiki-scrollbar-thumb: #ced4da;
34
+ --neiki-scrollbar-track: #f8f9fa;
35
+ --neiki-selection-bg: #b3d7ff;
36
+ --neiki-highlight-color: #fff3cd;
37
+ --neiki-table-border: #dee2e6;
38
+ }
39
+
40
+ /* Dark Theme */
41
+ .neiki-editor.neiki-dark {
42
+ --neiki-bg-primary: #1e1e1e;
43
+ --neiki-bg-secondary: #252526;
44
+ --neiki-bg-tertiary: #2d2d30;
45
+ --neiki-bg-hover: #3e3e42;
46
+ --neiki-bg-active: #505050;
47
+ --neiki-border-color: #3e3e42;
48
+ --neiki-border-color-dark: #505050;
49
+ --neiki-text-primary: #d4d4d4;
50
+ --neiki-text-secondary: #a0a0a0;
51
+ --neiki-text-muted: #808080;
52
+ --neiki-accent-color: #4fc3f7;
53
+ --neiki-accent-hover: #29b6f6;
54
+ --neiki-danger-color: #f44336;
55
+ --neiki-success-color: #4caf50;
56
+ --neiki-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
57
+ --neiki-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
58
+ --neiki-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.4);
59
+ --neiki-editor-bg: #1e1e1e;
60
+ --neiki-toolbar-bg: #252526;
61
+ --neiki-statusbar-bg: #252526;
62
+ --neiki-modal-overlay: rgba(0, 0, 0, 0.7);
63
+ --neiki-scrollbar-thumb: #505050;
64
+ --neiki-scrollbar-track: #2d2d30;
65
+ --neiki-selection-bg: #264f78;
66
+ --neiki-highlight-color: #5c4d00;
67
+ --neiki-table-border: #3e3e42;
68
+ }
69
+
70
+ /* ============================================
71
+ Base Editor Container
72
+ ============================================ */
73
+ .neiki-editor {
74
+ display: flex;
75
+ flex-direction: column;
76
+ width: 100%;
77
+ height: 100%;
78
+ min-height: 400px;
79
+ background: var(--neiki-bg-primary);
80
+ border: 1px solid var(--neiki-border-color);
81
+ border-radius: 8px;
82
+ overflow: hidden;
83
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
84
+ font-size: 14px;
85
+ color: var(--neiki-text-primary);
86
+ box-shadow: var(--neiki-shadow-md);
87
+ }
88
+
89
+ .neiki-editor * {
90
+ box-sizing: border-box;
91
+ }
92
+
93
+ /* Fullscreen Mode */
94
+ .neiki-editor.neiki-fullscreen {
95
+ position: fixed !important;
96
+ top: 0 !important;
97
+ left: 0 !important;
98
+ right: 0 !important;
99
+ bottom: 0 !important;
100
+ width: 100vw !important;
101
+ height: 100vh !important;
102
+ z-index: 999999 !important;
103
+ border-radius: 0 !important;
104
+ border: none !important;
105
+ }
106
+
107
+ /* ============================================
108
+ Toolbar
109
+ ============================================ */
110
+ .neiki-toolbar {
111
+ display: flex;
112
+ flex-wrap: wrap;
113
+ align-items: center;
114
+ gap: 2px;
115
+ padding: 6px 8px;
116
+ background: var(--neiki-toolbar-bg);
117
+ border-bottom: 1px solid var(--neiki-border-color);
118
+ min-height: 44px;
119
+ }
120
+
121
+ .neiki-toolbar-group {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ gap: 2px;
125
+ padding: 0 4px;
126
+ flex-wrap: nowrap;
127
+ }
128
+
129
+ .neiki-toolbar-group:not(:last-child) {
130
+ border-right: 1px solid var(--neiki-border-color);
131
+ padding-right: 8px;
132
+ margin-right: 4px;
133
+ }
134
+
135
+ .neiki-toolbar-divider {
136
+ width: 1px;
137
+ height: 24px;
138
+ background: var(--neiki-border-color);
139
+ margin: 0 4px;
140
+ }
141
+
142
+ /* Toolbar Buttons */
143
+ .neiki-btn,
144
+ .neiki-toolbar-btn {
145
+ position: relative;
146
+ display: inline-flex;
147
+ align-items: center;
148
+ justify-content: center;
149
+ width: 32px;
150
+ height: 32px;
151
+ padding: 0;
152
+ background: transparent;
153
+ border: 1px solid transparent;
154
+ border-radius: 4px;
155
+ cursor: pointer;
156
+ color: var(--neiki-text-secondary);
157
+ transition: all 0.15s ease;
158
+ position: relative;
159
+ }
160
+
161
+ .neiki-btn:hover,
162
+ .neiki-toolbar-btn:hover {
163
+ background: var(--neiki-bg-hover);
164
+ color: var(--neiki-text-primary);
165
+ }
166
+
167
+ .neiki-btn:active,
168
+ .neiki-toolbar-btn:active {
169
+ background: var(--neiki-bg-active);
170
+ }
171
+
172
+ .neiki-btn.active,
173
+ .neiki-toolbar-btn.active {
174
+ background: var(--neiki-bg-active);
175
+ color: var(--neiki-accent-color);
176
+ border-color: var(--neiki-accent-color);
177
+ }
178
+
179
+ .neiki-btn:disabled,
180
+ .neiki-toolbar-btn:disabled {
181
+ opacity: 0.4;
182
+ cursor: not-allowed;
183
+ }
184
+
185
+ .neiki-btn svg,
186
+ .neiki-toolbar-btn svg {
187
+ width: 18px;
188
+ height: 18px;
189
+ fill: currentColor;
190
+ pointer-events: none;
191
+ }
192
+
193
+ /* Toolbar Selects */
194
+ .neiki-select {
195
+ height: 32px;
196
+ padding: 0 28px 0 10px;
197
+ background: var(--neiki-bg-primary);
198
+ border: 1px solid var(--neiki-border-color);
199
+ border-radius: 4px;
200
+ color: var(--neiki-text-primary);
201
+ font-size: 13px;
202
+ cursor: pointer;
203
+ appearance: none;
204
+ 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");
205
+ background-repeat: no-repeat;
206
+ background-position: right 8px center;
207
+ min-width: 100px;
208
+ }
209
+
210
+ .neiki-select:hover {
211
+ border-color: var(--neiki-border-color-dark);
212
+ }
213
+
214
+ .neiki-select:focus {
215
+ outline: none;
216
+ border-color: var(--neiki-accent-color);
217
+ box-shadow: 0 0 0 2px rgba(13, 110, 253, 0.15);
218
+ }
219
+
220
+ /* Color Picker Button */
221
+ .neiki-color-btn {
222
+ position: relative;
223
+ width: 36px;
224
+ }
225
+
226
+ .neiki-color-btn .neiki-color-indicator {
227
+ position: absolute;
228
+ bottom: 4px;
229
+ left: 50%;
230
+ transform: translateX(-50%);
231
+ width: 16px;
232
+ height: 3px;
233
+ border-radius: 1px;
234
+ background: currentColor;
235
+ }
236
+
237
+ /* Checkbox Toggle */
238
+ .neiki-checkbox-wrapper {
239
+ display: flex;
240
+ align-items: center;
241
+ gap: 6px;
242
+ padding: 0 8px;
243
+ height: 32px;
244
+ font-size: 12px;
245
+ color: var(--neiki-text-secondary);
246
+ cursor: pointer;
247
+ user-select: none;
248
+ }
249
+
250
+ .neiki-checkbox {
251
+ width: 16px;
252
+ height: 16px;
253
+ accent-color: var(--neiki-accent-color);
254
+ cursor: pointer;
255
+ }
256
+
257
+ /* ============================================
258
+ Editor Content Area
259
+ ============================================ */
260
+ .neiki-editor-wrapper,
261
+ .neiki-content-wrapper {
262
+ flex: 1;
263
+ display: flex;
264
+ flex-direction: column;
265
+ overflow: hidden;
266
+ position: relative;
267
+ }
268
+
269
+ .neiki-content {
270
+ flex: 1;
271
+ padding: 20px 24px;
272
+ background: var(--neiki-editor-bg);
273
+ overflow-y: auto;
274
+ outline: none;
275
+ line-height: 1.6;
276
+ color: var(--neiki-text-primary);
277
+ min-height: 200px;
278
+ }
279
+
280
+ .neiki-content:focus {
281
+ outline: none;
282
+ }
283
+
284
+ /* Placeholder */
285
+ .neiki-content:empty::before {
286
+ content: attr(data-placeholder);
287
+ color: var(--neiki-text-muted);
288
+ font-style: italic;
289
+ pointer-events: none;
290
+ }
291
+
292
+ .neiki-content.neiki-drag-over {
293
+ border: 2px dashed var(--neiki-accent-color);
294
+ background: rgba(13, 110, 253, 0.05);
295
+ }
296
+
297
+ .neiki-content.neiki-drag-over::after {
298
+ content: 'Drop images here';
299
+ position: absolute;
300
+ top: 50%;
301
+ left: 50%;
302
+ transform: translate(-50%, -50%);
303
+ color: var(--neiki-accent-color);
304
+ font-weight: 600;
305
+ font-size: 16px;
306
+ pointer-events: none;
307
+ z-index: 10;
308
+ }
309
+
310
+ /* Focus state for editor container - disabled */
311
+ /* .neiki-editor.neiki-focused removed */
312
+
313
+ /* Disabled state */
314
+ .neiki-editor.neiki-disabled {
315
+ opacity: 0.6;
316
+ pointer-events: none;
317
+ }
318
+
319
+ /* Content Scrollbar */
320
+ .neiki-content::-webkit-scrollbar {
321
+ width: 10px;
322
+ }
323
+
324
+ .neiki-content::-webkit-scrollbar-track {
325
+ background: var(--neiki-scrollbar-track);
326
+ }
327
+
328
+ .neiki-content::-webkit-scrollbar-thumb {
329
+ background: var(--neiki-scrollbar-thumb);
330
+ border-radius: 5px;
331
+ }
332
+
333
+ .neiki-content::-webkit-scrollbar-thumb:hover {
334
+ background: var(--neiki-border-color-dark);
335
+ }
336
+
337
+ /* Content Typography */
338
+ .neiki-content p {
339
+ margin: 0 0 1em 0;
340
+ }
341
+
342
+ .neiki-content h1 {
343
+ font-size: 2em;
344
+ font-weight: 700;
345
+ margin: 0 0 0.5em 0;
346
+ }
347
+
348
+ .neiki-content h2 {
349
+ font-size: 1.5em;
350
+ font-weight: 600;
351
+ margin: 0 0 0.5em 0;
352
+ }
353
+
354
+ .neiki-content h3 {
355
+ font-size: 1.25em;
356
+ font-weight: 600;
357
+ margin: 0 0 0.5em 0;
358
+ }
359
+
360
+ .neiki-content h4 {
361
+ font-size: 1.1em;
362
+ font-weight: 600;
363
+ margin: 0 0 0.5em 0;
364
+ }
365
+
366
+ .neiki-content h5 {
367
+ font-size: 1em;
368
+ font-weight: 600;
369
+ margin: 0 0 0.5em 0;
370
+ }
371
+
372
+ .neiki-content h6 {
373
+ font-size: 0.9em;
374
+ font-weight: 600;
375
+ margin: 0 0 0.5em 0;
376
+ }
377
+
378
+ .neiki-content ul,
379
+ .neiki-content ol {
380
+ margin: 0 0 1em 0;
381
+ padding-left: 2em;
382
+ }
383
+
384
+ .neiki-content li {
385
+ margin-bottom: 0.25em;
386
+ }
387
+
388
+ .neiki-content blockquote {
389
+ margin: 0 0 1em 0;
390
+ padding: 10px 20px;
391
+ border-left: 4px solid var(--neiki-accent-color);
392
+ background: var(--neiki-bg-secondary);
393
+ font-style: italic;
394
+ }
395
+
396
+ .neiki-content pre {
397
+ margin: 0 0 1em 0;
398
+ padding: 16px;
399
+ background: var(--neiki-bg-tertiary);
400
+ border-radius: 4px;
401
+ overflow-x: auto;
402
+ font-family: 'Consolas', 'Monaco', monospace;
403
+ font-size: 13px;
404
+ }
405
+
406
+ .neiki-content code {
407
+ padding: 2px 6px;
408
+ background: var(--neiki-bg-tertiary);
409
+ border-radius: 3px;
410
+ font-family: 'Consolas', 'Monaco', monospace;
411
+ font-size: 0.9em;
412
+ }
413
+
414
+ .neiki-content a {
415
+ color: var(--neiki-accent-color);
416
+ text-decoration: underline;
417
+ }
418
+
419
+ .neiki-content a:hover {
420
+ color: var(--neiki-accent-hover);
421
+ }
422
+
423
+ .neiki-content img {
424
+ max-width: 100%;
425
+ height: auto;
426
+ border-radius: 4px;
427
+ cursor: pointer;
428
+ }
429
+
430
+ .neiki-content img.neiki-selected {
431
+ outline: 2px solid var(--neiki-accent-color);
432
+ outline-offset: 2px;
433
+ }
434
+
435
+ /* Search Highlight */
436
+ .neiki-highlight {
437
+ background: var(--neiki-highlight-color);
438
+ padding: 1px 0;
439
+ }
440
+
441
+ .neiki-highlight-current {
442
+ background: #ffc107;
443
+ outline: 2px solid #ff9800;
444
+ }
445
+
446
+ /* ============================================
447
+ Tables
448
+ ============================================ */
449
+ .neiki-content table,
450
+ .neiki-table {
451
+ width: 100%;
452
+ border-collapse: collapse;
453
+ margin: 1em 0;
454
+ table-layout: fixed;
455
+ }
456
+
457
+ .neiki-content table td,
458
+ .neiki-content table th {
459
+ border: 1px solid var(--neiki-table-border);
460
+ padding: 8px 12px;
461
+ min-width: 50px;
462
+ vertical-align: top;
463
+ position: relative;
464
+ }
465
+
466
+ .neiki-content table th {
467
+ background: var(--neiki-bg-secondary);
468
+ font-weight: 600;
469
+ }
470
+
471
+ .neiki-content table td:hover,
472
+ .neiki-content table th:hover {
473
+ background: var(--neiki-bg-hover);
474
+ }
475
+
476
+ .neiki-content table td.neiki-cell-selected,
477
+ .neiki-content table th.neiki-cell-selected {
478
+ background: var(--neiki-selection-bg);
479
+ }
480
+
481
+ /* Table Resize Handle */
482
+ .neiki-table-resize-handle {
483
+ position: absolute;
484
+ top: 0;
485
+ right: -3px;
486
+ width: 6px;
487
+ height: 100%;
488
+ cursor: col-resize;
489
+ z-index: 10;
490
+ }
491
+
492
+ .neiki-table-resize-handle:hover {
493
+ background: var(--neiki-accent-color);
494
+ }
495
+
496
+ /* ============================================
497
+ Status Bar
498
+ ============================================ */
499
+ .neiki-statusbar {
500
+ display: flex;
501
+ justify-content: space-between;
502
+ align-items: center;
503
+ padding: 6px 12px;
504
+ background: var(--neiki-statusbar-bg);
505
+ border-top: 1px solid var(--neiki-border-color);
506
+ font-size: 12px;
507
+ color: var(--neiki-text-muted);
508
+ }
509
+
510
+ .neiki-statusbar-left,
511
+ .neiki-statusbar-right {
512
+ display: flex;
513
+ align-items: center;
514
+ gap: 16px;
515
+ }
516
+
517
+ .neiki-statusbar-item {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: 4px;
521
+ }
522
+
523
+ .neiki-statusbar-block {
524
+ font-family: 'Consolas', 'Monaco', monospace;
525
+ font-size: 11px;
526
+ padding: 2px 6px;
527
+ background: var(--neiki-bg-tertiary);
528
+ border-radius: 3px;
529
+ color: var(--neiki-accent-color);
530
+ font-weight: 600;
531
+ border: 1px solid var(--neiki-border-color);
532
+ }
533
+
534
+ /* ============================================
535
+ Dropdowns & Popups
536
+ ============================================ */
537
+ .neiki-dropdown {
538
+ position: absolute;
539
+ top: 100%;
540
+ left: 0;
541
+ z-index: 1000;
542
+ min-width: 180px;
543
+ background: var(--neiki-bg-primary);
544
+ border: 1px solid var(--neiki-border-color);
545
+ border-radius: 6px;
546
+ box-shadow: var(--neiki-shadow-lg);
547
+ padding: 4px;
548
+ margin-top: 4px;
549
+ }
550
+
551
+ /* Remove the .show requirement - JS adds/removes element directly */
552
+
553
+ .neiki-dropdown-item {
554
+ display: flex;
555
+ align-items: center;
556
+ gap: 6px;
557
+ padding: 7px 10px;
558
+ border-radius: 4px;
559
+ cursor: pointer;
560
+ color: var(--neiki-text-primary);
561
+ font-size: 13px;
562
+ transition: background 0.1s;
563
+ }
564
+
565
+ .neiki-dropdown-item:hover {
566
+ background: var(--neiki-bg-hover);
567
+ }
568
+
569
+ .neiki-dropdown-item.active {
570
+ background: var(--neiki-bg-active);
571
+ color: var(--neiki-accent-color);
572
+ }
573
+
574
+ .neiki-dropdown-divider {
575
+ height: 1px;
576
+ background: var(--neiki-border-color);
577
+ margin: 4px 0;
578
+ }
579
+
580
+ /* ============================================
581
+ Color Picker
582
+ ============================================ */
583
+ .neiki-color-picker {
584
+ position: absolute;
585
+ top: 100%;
586
+ left: 0;
587
+ z-index: 1000;
588
+ width: 220px;
589
+ background: var(--neiki-bg-primary);
590
+ border: 1px solid var(--neiki-border-color);
591
+ border-radius: 8px;
592
+ box-shadow: var(--neiki-shadow-lg);
593
+ padding: 8px;
594
+ margin-top: 4px;
595
+ display: grid;
596
+ grid-template-columns: repeat(10, 1fr);
597
+ gap: 2px;
598
+ }
599
+
600
+ .neiki-color-swatch {
601
+ width: 20px;
602
+ height: 20px;
603
+ border-radius: 3px;
604
+ cursor: pointer;
605
+ border: 1px solid var(--neiki-border-color);
606
+ transition: transform 0.1s;
607
+ }
608
+
609
+ .neiki-color-swatch:hover {
610
+ transform: scale(1.2);
611
+ z-index: 1;
612
+ }
613
+
614
+ .neiki-color-swatch.neiki-color-reset {
615
+ background: white;
616
+ position: relative;
617
+ overflow: hidden;
618
+ border: 1px solid #ccc;
619
+ }
620
+
621
+ .neiki-color-swatch.neiki-color-reset::after {
622
+ content: '';
623
+ position: absolute;
624
+ top: 50%;
625
+ left: -2px;
626
+ right: -2px;
627
+ height: 2px;
628
+ background: #e53935;
629
+ transform: rotate(-45deg);
630
+ transform-origin: center;
631
+ pointer-events: none;
632
+ }
633
+
634
+ .neiki-color-picker-label {
635
+ font-size: 11px;
636
+ font-weight: 600;
637
+ color: var(--neiki-text-muted);
638
+ text-transform: uppercase;
639
+ margin-bottom: 8px;
640
+ }
641
+
642
+ /* Emoji Picker */
643
+ .neiki-emoji-picker {
644
+ position: absolute;
645
+ top: 100%;
646
+ left: 0;
647
+ z-index: 1000;
648
+ width: 280px;
649
+ max-height: 250px;
650
+ overflow-y: auto;
651
+ background: var(--neiki-bg-primary);
652
+ border: 1px solid var(--neiki-border-color);
653
+ border-radius: 8px;
654
+ box-shadow: var(--neiki-shadow-lg);
655
+ padding: 8px;
656
+ margin-top: 4px;
657
+ display: grid;
658
+ grid-template-columns: repeat(10, 1fr);
659
+ gap: 2px;
660
+ }
661
+
662
+ .neiki-emoji-item {
663
+ display: flex;
664
+ align-items: center;
665
+ justify-content: center;
666
+ width: 24px;
667
+ height: 24px;
668
+ font-size: 18px;
669
+ cursor: pointer;
670
+ border-radius: 4px;
671
+ transition: background 0.15s, transform 0.1s;
672
+ }
673
+
674
+ .neiki-emoji-item:hover {
675
+ background: var(--neiki-bg-hover);
676
+ transform: scale(1.2);
677
+ }
678
+
679
+ /* Special Characters Picker */
680
+ .neiki-special-picker {
681
+ position: absolute;
682
+ top: 100%;
683
+ left: 0;
684
+ z-index: 1000;
685
+ width: 320px;
686
+ max-height: 280px;
687
+ overflow-y: auto;
688
+ background: var(--neiki-bg-primary);
689
+ border: 1px solid var(--neiki-border-color);
690
+ border-radius: 8px;
691
+ box-shadow: var(--neiki-shadow-lg);
692
+ padding: 8px;
693
+ margin-top: 4px;
694
+ display: grid;
695
+ grid-template-columns: repeat(8, 1fr);
696
+ gap: 4px;
697
+ }
698
+
699
+ .neiki-special-item {
700
+ display: flex;
701
+ align-items: center;
702
+ justify-content: center;
703
+ width: 32px;
704
+ height: 32px;
705
+ font-size: 18px;
706
+ cursor: pointer;
707
+ border-radius: 4px;
708
+ border: 1px solid var(--neiki-border-color);
709
+ background: var(--neiki-bg-secondary);
710
+ transition: all 0.15s;
711
+ }
712
+
713
+ .neiki-special-item:hover {
714
+ background: var(--neiki-accent-color);
715
+ color: white;
716
+ border-color: var(--neiki-accent-color);
717
+ transform: scale(1.1);
718
+ }
719
+
720
+ /* Find & Replace Highlights */
721
+ .neiki-highlight-find {
722
+ background: #ffeb3b;
723
+ padding: 1px 0;
724
+ border-radius: 2px;
725
+ }
726
+
727
+ .neiki-highlight-current {
728
+ background: #ff9800;
729
+ outline: 2px solid #e65100;
730
+ }
731
+
732
+ .neiki-color-presets {
733
+ display: grid;
734
+ grid-template-columns: repeat(5, 1fr);
735
+ gap: 6px;
736
+ margin-bottom: 12px;
737
+ }
738
+
739
+ .neiki-color-preset {
740
+ width: 32px;
741
+ height: 32px;
742
+ border-radius: 4px;
743
+ border: 2px solid transparent;
744
+ cursor: pointer;
745
+ transition: transform 0.1s, border-color 0.1s;
746
+ }
747
+
748
+ .neiki-color-preset:hover {
749
+ transform: scale(1.1);
750
+ }
751
+
752
+ .neiki-color-preset.active {
753
+ border-color: var(--neiki-accent-color);
754
+ }
755
+
756
+ .neiki-color-preset.neiki-color-reset {
757
+ background: linear-gradient(45deg, #fff 45%, #ff0000 45%, #ff0000 55%, #fff 55%);
758
+ border: 1px solid var(--neiki-border-color);
759
+ }
760
+
761
+ .neiki-color-custom {
762
+ display: flex;
763
+ align-items: center;
764
+ gap: 8px;
765
+ padding-top: 8px;
766
+ border-top: 1px solid var(--neiki-border-color);
767
+ }
768
+
769
+ .neiki-color-custom input[type="color"] {
770
+ width: 40px;
771
+ height: 32px;
772
+ padding: 0;
773
+ border: 1px solid var(--neiki-border-color);
774
+ border-radius: 4px;
775
+ cursor: pointer;
776
+ }
777
+
778
+ .neiki-color-custom input[type="text"] {
779
+ flex: 1;
780
+ height: 32px;
781
+ padding: 0 8px;
782
+ border: 1px solid var(--neiki-border-color);
783
+ border-radius: 4px;
784
+ background: var(--neiki-bg-primary);
785
+ color: var(--neiki-text-primary);
786
+ font-size: 12px;
787
+ font-family: monospace;
788
+ }
789
+
790
+ /* ============================================
791
+ Table Picker
792
+ ============================================ */
793
+ .neiki-table-picker {
794
+ position: absolute;
795
+ top: 100%;
796
+ left: 0;
797
+ z-index: 1000;
798
+ background: var(--neiki-bg-primary);
799
+ border: 1px solid var(--neiki-border-color);
800
+ border-radius: 8px;
801
+ box-shadow: var(--neiki-shadow-lg);
802
+ padding: 12px;
803
+ display: none;
804
+ }
805
+
806
+ .neiki-table-picker.show {
807
+ display: block;
808
+ }
809
+
810
+ .neiki-table-picker-label {
811
+ font-size: 12px;
812
+ color: var(--neiki-text-secondary);
813
+ margin-bottom: 8px;
814
+ text-align: center;
815
+ }
816
+
817
+ .neiki-table-picker-grid {
818
+ display: grid;
819
+ grid-template-columns: repeat(10, 20px);
820
+ gap: 2px;
821
+ }
822
+
823
+ .neiki-table-picker-cell {
824
+ width: 20px;
825
+ height: 20px;
826
+ border: 1px solid var(--neiki-border-color);
827
+ border-radius: 2px;
828
+ background: var(--neiki-bg-primary);
829
+ cursor: pointer;
830
+ transition: background 0.1s;
831
+ }
832
+
833
+ .neiki-table-picker-cell:hover,
834
+ .neiki-table-picker-cell.active {
835
+ background: var(--neiki-accent-color);
836
+ border-color: var(--neiki-accent-color);
837
+ }
838
+
839
+ /* ============================================
840
+ Special Characters Picker (duplicate removed)
841
+ ============================================ */
842
+ .neiki-special-chars {
843
+ position: absolute;
844
+ top: 100%;
845
+ left: 0;
846
+ z-index: 1000;
847
+ width: 280px;
848
+ max-height: 300px;
849
+ background: var(--neiki-bg-primary);
850
+ border: 1px solid var(--neiki-border-color);
851
+ border-radius: 8px;
852
+ box-shadow: var(--neiki-shadow-lg);
853
+ display: none;
854
+ overflow: hidden;
855
+ }
856
+
857
+ .neiki-special-chars.show {
858
+ display: flex;
859
+ flex-direction: column;
860
+ }
861
+
862
+ .neiki-special-chars-grid {
863
+ display: grid;
864
+ grid-template-columns: repeat(10, 1fr);
865
+ gap: 2px;
866
+ padding: 8px;
867
+ overflow-y: auto;
868
+ }
869
+
870
+ .neiki-special-char-item {
871
+ display: flex;
872
+ align-items: center;
873
+ justify-content: center;
874
+ width: 24px;
875
+ height: 24px;
876
+ font-size: 16px;
877
+ border-radius: 4px;
878
+ cursor: pointer;
879
+ transition: background 0.1s;
880
+ }
881
+
882
+ .neiki-special-char-item:hover {
883
+ background: var(--neiki-bg-hover);
884
+ }
885
+
886
+ /* ============================================
887
+ Modals
888
+ ============================================ */
889
+ .neiki-modal-overlay {
890
+ position: fixed;
891
+ top: 0;
892
+ left: 0;
893
+ right: 0;
894
+ bottom: 0;
895
+ background: var(--neiki-modal-overlay);
896
+ z-index: 10000;
897
+ display: flex;
898
+ align-items: center;
899
+ justify-content: center;
900
+ opacity: 0;
901
+ visibility: hidden;
902
+ transition: opacity 0.2s, visibility 0.2s;
903
+ }
904
+
905
+ .neiki-modal-overlay.active {
906
+ opacity: 1;
907
+ visibility: visible;
908
+ }
909
+
910
+ .neiki-modal {
911
+ background: var(--neiki-bg-primary);
912
+ border-radius: 12px;
913
+ box-shadow: var(--neiki-shadow-lg);
914
+ width: 100%;
915
+ max-width: 440px;
916
+ max-height: 90vh;
917
+ overflow: hidden;
918
+ animation: neiki-modal-in 0.2s ease;
919
+ }
920
+
921
+ .neiki-modal-wide {
922
+ max-width: 520px;
923
+ }
924
+
925
+ .neiki-modal-header {
926
+ display: flex;
927
+ align-items: center;
928
+ justify-content: space-between;
929
+ padding: 16px 20px;
930
+ border-bottom: 1px solid var(--neiki-border-color);
931
+ }
932
+
933
+ .neiki-modal-title {
934
+ font-size: 16px;
935
+ font-weight: 600;
936
+ color: var(--neiki-text-primary);
937
+ margin: 0;
938
+ }
939
+
940
+ .neiki-modal-close {
941
+ width: 32px;
942
+ height: 32px;
943
+ display: flex;
944
+ align-items: center;
945
+ justify-content: center;
946
+ background: transparent;
947
+ border: none;
948
+ border-radius: 4px;
949
+ cursor: pointer;
950
+ color: var(--neiki-text-muted);
951
+ transition: background 0.15s;
952
+ }
953
+
954
+ .neiki-modal-close:hover {
955
+ background: var(--neiki-bg-hover);
956
+ color: var(--neiki-text-primary);
957
+ }
958
+
959
+ .neiki-modal-body {
960
+ padding: 20px;
961
+ overflow-y: auto;
962
+ }
963
+
964
+ .neiki-modal h3,
965
+ .neiki-modal-header h3 {
966
+ color: #000000;
967
+ margin: 0;
968
+ }
969
+
970
+ .neiki-dark .neiki-modal h3,
971
+ .neiki-dark .neiki-modal-header h3 {
972
+ color: var(--neiki-text-primary);
973
+ }
974
+
975
+ .neiki-modal-footer {
976
+ display: flex;
977
+ justify-content: flex-end;
978
+ gap: 10px;
979
+ padding: 16px 20px;
980
+ border-top: 1px solid var(--neiki-border-color);
981
+ }
982
+
983
+ /* Form Elements */
984
+ .neiki-form-group {
985
+ margin-bottom: 16px;
986
+ }
987
+
988
+ .neiki-form-group:last-child {
989
+ margin-bottom: 0;
990
+ }
991
+
992
+ .neiki-form-label {
993
+ display: block;
994
+ margin-bottom: 6px;
995
+ font-size: 13px;
996
+ font-weight: 500;
997
+ color: var(--neiki-text-secondary);
998
+ }
999
+
1000
+ .neiki-form-input,
1001
+ .neiki-input {
1002
+ width: 100%;
1003
+ height: 40px;
1004
+ padding: 0 12px;
1005
+ border: 1px solid var(--neiki-border-color);
1006
+ border-radius: 6px;
1007
+ background: var(--neiki-bg-primary);
1008
+ color: var(--neiki-text-primary);
1009
+ font-size: 14px;
1010
+ transition: border-color 0.15s;
1011
+ }
1012
+
1013
+ .neiki-form-input:focus,
1014
+ .neiki-input:focus {
1015
+ outline: none;
1016
+ border-color: var(--neiki-accent-color);
1017
+ box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.15);
1018
+ }
1019
+
1020
+ .neiki-form-input::placeholder,
1021
+ .neiki-input::placeholder {
1022
+ color: var(--neiki-text-muted);
1023
+ }
1024
+
1025
+ .neiki-form-row {
1026
+ display: flex;
1027
+ gap: 16px;
1028
+ }
1029
+
1030
+ .neiki-form-divider {
1031
+ display: flex;
1032
+ align-items: center;
1033
+ margin: 16px 0;
1034
+ text-align: center;
1035
+ position: relative;
1036
+ }
1037
+
1038
+ .neiki-form-divider::before {
1039
+ content: '';
1040
+ flex: 1;
1041
+ height: 1px;
1042
+ background: var(--neiki-border-color);
1043
+ margin-right: 12px;
1044
+ }
1045
+
1046
+ .neiki-form-divider::after {
1047
+ content: '';
1048
+ flex: 1;
1049
+ height: 1px;
1050
+ background: var(--neiki-border-color);
1051
+ margin-left: 12px;
1052
+ }
1053
+
1054
+ .neiki-form-divider span {
1055
+ color: var(--neiki-text-muted);
1056
+ font-size: 12px;
1057
+ font-weight: 500;
1058
+ text-transform: uppercase;
1059
+ }
1060
+
1061
+ .neiki-form-group label {
1062
+ display: block;
1063
+ margin-bottom: 6px;
1064
+ font-size: 13px;
1065
+ font-weight: 500;
1066
+ color: var(--neiki-text-secondary);
1067
+ }
1068
+
1069
+ .neiki-form-textarea {
1070
+ width: 100%;
1071
+ min-height: 120px;
1072
+ padding: 12px;
1073
+ border: 1px solid var(--neiki-border-color);
1074
+ border-radius: 6px;
1075
+ background: var(--neiki-bg-primary);
1076
+ color: var(--neiki-text-primary);
1077
+ font-size: 14px;
1078
+ font-family: inherit;
1079
+ resize: vertical;
1080
+ transition: border-color 0.15s;
1081
+ }
1082
+
1083
+ .neiki-form-textarea:focus {
1084
+ outline: none;
1085
+ border-color: var(--neiki-accent-color);
1086
+ box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.15);
1087
+ }
1088
+
1089
+ /* Buttons */
1090
+ .neiki-button {
1091
+ display: inline-flex;
1092
+ align-items: center;
1093
+ justify-content: center;
1094
+ gap: 6px;
1095
+ height: 38px;
1096
+ padding: 0 16px;
1097
+ border: 1px solid transparent;
1098
+ border-radius: 6px;
1099
+ font-size: 14px;
1100
+ font-weight: 500;
1101
+ cursor: pointer;
1102
+ transition: all 0.15s;
1103
+ }
1104
+
1105
+ .neiki-button-primary,
1106
+ .neiki-btn-primary {
1107
+ background: var(--neiki-accent-color);
1108
+ color: #fff;
1109
+ }
1110
+
1111
+ .neiki-button-primary:hover,
1112
+ .neiki-btn-primary:hover {
1113
+ background: var(--neiki-accent-hover);
1114
+ }
1115
+
1116
+ .neiki-button-secondary,
1117
+ .neiki-btn-secondary {
1118
+ background: var(--neiki-bg-secondary);
1119
+ color: var(--neiki-text-primary);
1120
+ border-color: var(--neiki-border-color);
1121
+ }
1122
+
1123
+ .neiki-btn-primary,
1124
+ .neiki-btn-secondary {
1125
+ display: inline-flex;
1126
+ align-items: center;
1127
+ justify-content: center;
1128
+ height: 38px;
1129
+ padding: 0 16px;
1130
+ border: 1px solid transparent;
1131
+ border-radius: 6px;
1132
+ font-size: 14px;
1133
+ font-weight: 500;
1134
+ cursor: pointer;
1135
+ transition: all 0.15s;
1136
+ }
1137
+
1138
+ .neiki-btn-secondary {
1139
+ border-color: var(--neiki-border-color);
1140
+ }
1141
+
1142
+ .neiki-btn-secondary:hover {
1143
+ background: var(--neiki-bg-hover);
1144
+ }
1145
+
1146
+ .neiki-button-secondary:hover {
1147
+ background: var(--neiki-bg-hover);
1148
+ }
1149
+
1150
+ .neiki-button-danger {
1151
+ background: var(--neiki-danger-color);
1152
+ color: #fff;
1153
+ }
1154
+
1155
+ .neiki-button-danger:hover {
1156
+ opacity: 0.9;
1157
+ }
1158
+
1159
+ /* ============================================
1160
+ Find & Replace Panel
1161
+ ============================================ */
1162
+ .neiki-find-replace {
1163
+ position: absolute;
1164
+ top: 0;
1165
+ right: 0;
1166
+ z-index: 100;
1167
+ width: 360px;
1168
+ background: var(--neiki-bg-primary);
1169
+ border: 1px solid var(--neiki-border-color);
1170
+ border-radius: 0 0 0 8px;
1171
+ box-shadow: var(--neiki-shadow-lg);
1172
+ display: none;
1173
+ }
1174
+
1175
+ .neiki-find-replace.show {
1176
+ display: block;
1177
+ }
1178
+
1179
+ .neiki-find-replace-header {
1180
+ display: flex;
1181
+ align-items: center;
1182
+ justify-content: space-between;
1183
+ padding: 10px 12px;
1184
+ border-bottom: 1px solid var(--neiki-border-color);
1185
+ }
1186
+
1187
+ .neiki-find-replace-title {
1188
+ font-size: 13px;
1189
+ font-weight: 600;
1190
+ color: var(--neiki-text-primary);
1191
+ }
1192
+
1193
+ .neiki-find-replace-body {
1194
+ padding: 12px;
1195
+ }
1196
+
1197
+ .neiki-find-replace-row {
1198
+ display: flex;
1199
+ gap: 8px;
1200
+ margin-bottom: 10px;
1201
+ }
1202
+
1203
+ .neiki-find-replace-row:last-child {
1204
+ margin-bottom: 0;
1205
+ }
1206
+
1207
+ .neiki-find-replace-input {
1208
+ flex: 1;
1209
+ height: 32px;
1210
+ padding: 0 10px;
1211
+ border: 1px solid var(--neiki-border-color);
1212
+ border-radius: 4px;
1213
+ background: var(--neiki-bg-primary);
1214
+ color: var(--neiki-text-primary);
1215
+ font-size: 13px;
1216
+ }
1217
+
1218
+ .neiki-find-replace-input:focus {
1219
+ outline: none;
1220
+ border-color: var(--neiki-accent-color);
1221
+ }
1222
+
1223
+ .neiki-find-replace-options {
1224
+ display: flex;
1225
+ align-items: center;
1226
+ gap: 12px;
1227
+ margin-bottom: 10px;
1228
+ }
1229
+
1230
+ .neiki-find-replace-option {
1231
+ display: flex;
1232
+ align-items: center;
1233
+ gap: 4px;
1234
+ font-size: 12px;
1235
+ color: var(--neiki-text-secondary);
1236
+ cursor: pointer;
1237
+ }
1238
+
1239
+ .neiki-find-replace-option input {
1240
+ accent-color: var(--neiki-accent-color);
1241
+ }
1242
+
1243
+ .neiki-find-replace-actions {
1244
+ display: flex;
1245
+ gap: 6px;
1246
+ flex-wrap: wrap;
1247
+ }
1248
+
1249
+ .neiki-find-replace-btn {
1250
+ height: 28px;
1251
+ padding: 0 10px;
1252
+ font-size: 12px;
1253
+ border-radius: 4px;
1254
+ }
1255
+
1256
+ .neiki-find-replace-count {
1257
+ font-size: 12px;
1258
+ color: var(--neiki-text-muted);
1259
+ margin-left: auto;
1260
+ }
1261
+
1262
+ /* ============================================
1263
+ HTML Code View
1264
+ ============================================ */
1265
+ .neiki-code-view {
1266
+ position: absolute;
1267
+ top: 0;
1268
+ left: 0;
1269
+ right: 0;
1270
+ bottom: 0;
1271
+ z-index: 50;
1272
+ background: var(--neiki-bg-primary);
1273
+ display: none;
1274
+ flex-direction: column;
1275
+ }
1276
+
1277
+ .neiki-code-view.show {
1278
+ display: flex;
1279
+ }
1280
+
1281
+ .neiki-code-view-header {
1282
+ display: flex;
1283
+ align-items: center;
1284
+ justify-content: space-between;
1285
+ padding: 8px 16px;
1286
+ background: var(--neiki-bg-secondary);
1287
+ border-bottom: 1px solid var(--neiki-border-color);
1288
+ flex-shrink: 0;
1289
+ }
1290
+
1291
+ .neiki-code-view-title {
1292
+ font-size: 13px;
1293
+ font-weight: 600;
1294
+ color: var(--neiki-text-primary);
1295
+ }
1296
+
1297
+ .neiki-code-view-textarea {
1298
+ flex: 1;
1299
+ width: 100%;
1300
+ padding: 16px;
1301
+ border: none;
1302
+ background: var(--neiki-bg-primary);
1303
+ color: var(--neiki-text-primary);
1304
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
1305
+ font-size: 13px;
1306
+ line-height: 1.5;
1307
+ resize: none;
1308
+ }
1309
+
1310
+ .neiki-code-view-textarea:focus {
1311
+ outline: none;
1312
+ }
1313
+
1314
+ .neiki-code-view-apply {
1315
+ width: auto !important;
1316
+ padding: 0 12px !important;
1317
+ display: inline-flex;
1318
+ align-items: center;
1319
+ gap: 4px;
1320
+ height: 30px;
1321
+ font-size: 12px;
1322
+ background: var(--neiki-accent-color) !important;
1323
+ color: white !important;
1324
+ border-radius: 5px;
1325
+ }
1326
+
1327
+ .neiki-code-view-apply:hover {
1328
+ background: var(--neiki-accent-hover) !important;
1329
+ color: white !important;
1330
+ }
1331
+
1332
+ .neiki-code-view-apply svg {
1333
+ width: 14px !important;
1334
+ height: 14px !important;
1335
+ }
1336
+
1337
+ /* ============================================
1338
+ Context Menu
1339
+ ============================================ */
1340
+ .neiki-context-menu {
1341
+ position: fixed;
1342
+ z-index: 10001;
1343
+ min-width: 180px;
1344
+ background: var(--neiki-bg-primary);
1345
+ border: 1px solid var(--neiki-border-color);
1346
+ border-radius: 8px;
1347
+ box-shadow: var(--neiki-shadow-lg);
1348
+ padding: 4px;
1349
+ display: none;
1350
+ }
1351
+
1352
+ .neiki-context-menu.show {
1353
+ display: block;
1354
+ }
1355
+
1356
+ .neiki-context-item,
1357
+ .neiki-context-menu-item {
1358
+ display: flex;
1359
+ align-items: center;
1360
+ gap: 10px;
1361
+ padding: 8px 12px;
1362
+ border-radius: 4px;
1363
+ cursor: pointer;
1364
+ color: var(--neiki-text-primary);
1365
+ font-size: 13px;
1366
+ transition: background 0.1s;
1367
+ }
1368
+
1369
+ .neiki-context-item:hover,
1370
+ .neiki-context-menu-item:hover {
1371
+ background: var(--neiki-bg-hover);
1372
+ }
1373
+
1374
+ .neiki-context-item.neiki-context-danger,
1375
+ .neiki-context-menu-item.danger {
1376
+ color: var(--neiki-danger-color);
1377
+ }
1378
+
1379
+ .neiki-context-item svg,
1380
+ .neiki-context-menu-item svg {
1381
+ width: 16px;
1382
+ height: 16px;
1383
+ fill: currentColor;
1384
+ }
1385
+
1386
+ .neiki-context-divider,
1387
+ .neiki-context-menu-divider {
1388
+ height: 1px;
1389
+ background: var(--neiki-border-color);
1390
+ margin: 4px 0;
1391
+ }
1392
+
1393
+ /* ============================================
1394
+ Floating Selection Toolbar
1395
+ ============================================ */
1396
+ .neiki-floating-toolbar {
1397
+ position: absolute;
1398
+ z-index: 1000;
1399
+ display: none;
1400
+ background: var(--neiki-bg-primary);
1401
+ border: 1px solid var(--neiki-border-color);
1402
+ border-radius: 8px;
1403
+ box-shadow: var(--neiki-shadow-lg);
1404
+ padding: 4px;
1405
+ }
1406
+
1407
+ .neiki-floating-toolbar.show {
1408
+ display: flex;
1409
+ align-items: center;
1410
+ gap: 2px;
1411
+ }
1412
+
1413
+ .neiki-floating-btn {
1414
+ width: 32px;
1415
+ height: 32px;
1416
+ border: none;
1417
+ background: var(--neiki-bg-primary);
1418
+ color: var(--neiki-text-primary);
1419
+ border-radius: 6px;
1420
+ cursor: pointer;
1421
+ display: flex;
1422
+ align-items: center;
1423
+ justify-content: center;
1424
+ transition: all 0.15s;
1425
+ }
1426
+
1427
+ .neiki-floating-btn:hover {
1428
+ background: var(--neiki-bg-hover);
1429
+ color: var(--neiki-accent-color);
1430
+ }
1431
+
1432
+ .neiki-floating-btn:active {
1433
+ background: var(--neiki-bg-active);
1434
+ }
1435
+
1436
+ .neiki-floating-btn svg {
1437
+ width: 16px;
1438
+ height: 16px;
1439
+ fill: currentColor;
1440
+ }
1441
+
1442
+ .neiki-floating-toolbar .neiki-btn {
1443
+ width: 28px;
1444
+ height: 28px;
1445
+ }
1446
+
1447
+ .neiki-floating-toolbar .neiki-btn svg {
1448
+ width: 14px;
1449
+ height: 14px;
1450
+ }
1451
+
1452
+ /* ============================================
1453
+ Tooltips
1454
+ ============================================ */
1455
+ [data-tooltip] {
1456
+ position: relative;
1457
+ }
1458
+
1459
+ [data-tooltip]::after {
1460
+ content: attr(data-tooltip);
1461
+ position: absolute;
1462
+ bottom: 100%;
1463
+ left: 50%;
1464
+ transform: translateX(-50%);
1465
+ padding: 6px 10px;
1466
+ background: var(--neiki-text-primary);
1467
+ color: var(--neiki-bg-primary);
1468
+ font-size: 11px;
1469
+ font-weight: 500;
1470
+ white-space: nowrap;
1471
+ border-radius: 4px;
1472
+ opacity: 0;
1473
+ visibility: hidden;
1474
+ transition: opacity 0.15s, visibility 0.15s;
1475
+ pointer-events: none;
1476
+ z-index: 10002;
1477
+ margin-bottom: 6px;
1478
+ }
1479
+
1480
+ [data-tooltip]:hover::after {
1481
+ opacity: 1;
1482
+ visibility: visible;
1483
+ }
1484
+
1485
+ /* ============================================
1486
+ Drag & Drop Overlay
1487
+ ============================================ */
1488
+ .neiki-drop-overlay {
1489
+ position: absolute;
1490
+ top: 0;
1491
+ left: 0;
1492
+ right: 0;
1493
+ bottom: 0;
1494
+ background: rgba(13, 110, 253, 0.1);
1495
+ border: 3px dashed var(--neiki-accent-color);
1496
+ border-radius: 8px;
1497
+ display: none;
1498
+ align-items: center;
1499
+ justify-content: center;
1500
+ z-index: 100;
1501
+ pointer-events: none;
1502
+ }
1503
+
1504
+ .neiki-drop-overlay.show {
1505
+ display: flex;
1506
+ }
1507
+
1508
+ .neiki-drop-overlay-text {
1509
+ font-size: 18px;
1510
+ font-weight: 600;
1511
+ color: var(--neiki-accent-color);
1512
+ }
1513
+
1514
+ /* ============================================
1515
+ Image Resize Handles
1516
+ ============================================ */
1517
+ .neiki-image-wrapper {
1518
+ display: inline-block;
1519
+ position: relative;
1520
+ }
1521
+
1522
+ .neiki-image-wrapper.selected {
1523
+ outline: 2px solid var(--neiki-accent-color);
1524
+ }
1525
+
1526
+ .neiki-resize-handle {
1527
+ position: absolute;
1528
+ width: 10px;
1529
+ height: 10px;
1530
+ background: var(--neiki-accent-color);
1531
+ border: 2px solid #fff;
1532
+ border-radius: 2px;
1533
+ }
1534
+
1535
+ .neiki-resize-handle.nw { top: -5px; left: -5px; cursor: nw-resize; }
1536
+ .neiki-resize-handle.ne { top: -5px; right: -5px; cursor: ne-resize; }
1537
+ .neiki-resize-handle.sw { bottom: -5px; left: -5px; cursor: sw-resize; }
1538
+ .neiki-resize-handle.se { bottom: -5px; right: -5px; cursor: se-resize; }
1539
+
1540
+ /* ============================================
1541
+ Print Styles
1542
+ ============================================ */
1543
+ @media print {
1544
+ .neiki-editor {
1545
+ border: none !important;
1546
+ box-shadow: none !important;
1547
+ }
1548
+
1549
+ .neiki-toolbar,
1550
+ .neiki-statusbar,
1551
+ .neiki-floating-toolbar,
1552
+ .neiki-find-replace,
1553
+ .neiki-code-view-header {
1554
+ display: none !important;
1555
+ }
1556
+
1557
+ .neiki-content {
1558
+ padding: 0 !important;
1559
+ overflow: visible !important;
1560
+ }
1561
+
1562
+ .neiki-editor-wrapper {
1563
+ overflow: visible !important;
1564
+ }
1565
+ }
1566
+
1567
+ /* ============================================
1568
+ Responsive Adjustments
1569
+ ============================================ */
1570
+ @media (max-width: 768px) {
1571
+ .neiki-toolbar {
1572
+ padding: 4px;
1573
+ gap: 1px;
1574
+ }
1575
+
1576
+ .neiki-toolbar-group {
1577
+ padding: 0 2px;
1578
+ }
1579
+
1580
+ .neiki-toolbar-group:not(:last-child) {
1581
+ padding-right: 4px;
1582
+ margin-right: 2px;
1583
+ }
1584
+
1585
+ .neiki-btn {
1586
+ width: 28px;
1587
+ height: 28px;
1588
+ }
1589
+
1590
+ .neiki-btn svg {
1591
+ width: 16px;
1592
+ height: 16px;
1593
+ }
1594
+
1595
+ .neiki-select {
1596
+ height: 28px;
1597
+ min-width: 80px;
1598
+ font-size: 12px;
1599
+ padding: 0 24px 0 8px;
1600
+ }
1601
+
1602
+ .neiki-content {
1603
+ padding: 12px 16px;
1604
+ }
1605
+
1606
+ .neiki-statusbar {
1607
+ padding: 4px 8px;
1608
+ font-size: 11px;
1609
+ }
1610
+
1611
+ .neiki-modal {
1612
+ width: 95%;
1613
+ max-width: none;
1614
+ margin: 10px;
1615
+ }
1616
+
1617
+ .neiki-find-replace {
1618
+ width: 100%;
1619
+ border-radius: 0;
1620
+ }
1621
+
1622
+ .neiki-checkbox-wrapper {
1623
+ padding: 0 4px;
1624
+ font-size: 11px;
1625
+ }
1626
+ }
1627
+
1628
+ @media (max-width: 480px) {
1629
+ .neiki-toolbar-group:not(:last-child) {
1630
+ border-right: none;
1631
+ padding-right: 2px;
1632
+ margin-right: 0;
1633
+ }
1634
+
1635
+ .neiki-select {
1636
+ min-width: 60px;
1637
+ }
1638
+
1639
+ .neiki-statusbar-left,
1640
+ .neiki-statusbar-right {
1641
+ gap: 8px;
1642
+ }
1643
+ }
1644
+
1645
+ /* ============================================
1646
+ Animations
1647
+ ============================================ */
1648
+ @keyframes neiki-fade-in {
1649
+ from {
1650
+ opacity: 0;
1651
+ transform: translateY(-10px);
1652
+ }
1653
+ to {
1654
+ opacity: 1;
1655
+ transform: translateY(0);
1656
+ }
1657
+ }
1658
+
1659
+ .neiki-dropdown.show,
1660
+ .neiki-color-picker.show,
1661
+ .neiki-table-picker.show,
1662
+ .neiki-emoji-picker.show,
1663
+ .neiki-special-chars.show {
1664
+ animation: neiki-fade-in 0.15s ease;
1665
+ }
1666
+
1667
+ @keyframes neiki-modal-in {
1668
+ from {
1669
+ opacity: 0;
1670
+ transform: scale(0.95);
1671
+ }
1672
+ to {
1673
+ opacity: 1;
1674
+ transform: scale(1);
1675
+ }
1676
+ }
1677
+
1678
+ .neiki-modal-overlay.show .neiki-modal {
1679
+ animation: neiki-modal-in 0.2s ease;
1680
+ }
1681
+
1682
+ /* ============================================
1683
+ Font Size Widget
1684
+ ============================================ */
1685
+ .neiki-fontsize-widget {
1686
+ display: inline-flex;
1687
+ align-items: center;
1688
+ position: relative;
1689
+ height: 32px;
1690
+ border: 1px solid var(--neiki-border-color);
1691
+ border-radius: 4px;
1692
+ overflow: visible;
1693
+ background: var(--neiki-bg-primary);
1694
+ }
1695
+
1696
+ .neiki-fontsize-btn {
1697
+ display: flex;
1698
+ align-items: center;
1699
+ justify-content: center;
1700
+ width: 26px;
1701
+ height: 30px;
1702
+ background: transparent;
1703
+ border: none;
1704
+ cursor: pointer;
1705
+ color: var(--neiki-text-secondary);
1706
+ transition: background 0.15s, color 0.15s;
1707
+ padding: 0;
1708
+ }
1709
+
1710
+ .neiki-fontsize-btn:hover {
1711
+ background: var(--neiki-bg-hover);
1712
+ color: var(--neiki-text-primary);
1713
+ }
1714
+
1715
+ .neiki-fontsize-input {
1716
+ width: 38px;
1717
+ height: 30px;
1718
+ text-align: center;
1719
+ border: none;
1720
+ border-left: 1px solid var(--neiki-border-color);
1721
+ border-right: 1px solid var(--neiki-border-color);
1722
+ background: var(--neiki-bg-primary);
1723
+ color: var(--neiki-text-primary);
1724
+ font-size: 13px;
1725
+ outline: none;
1726
+ -moz-appearance: textfield;
1727
+ appearance: textfield;
1728
+ padding: 0;
1729
+ }
1730
+
1731
+ .neiki-fontsize-input::-webkit-outer-spin-button,
1732
+ .neiki-fontsize-input::-webkit-inner-spin-button {
1733
+ -webkit-appearance: none;
1734
+ margin: 0;
1735
+ }
1736
+
1737
+ .neiki-fontsize-dropdown {
1738
+ display: none;
1739
+ position: absolute;
1740
+ top: 100%;
1741
+ left: 0;
1742
+ z-index: 1000;
1743
+ min-width: 70px;
1744
+ max-height: 240px;
1745
+ overflow-y: auto;
1746
+ background: var(--neiki-bg-primary);
1747
+ border: 1px solid var(--neiki-border-color);
1748
+ border-radius: 6px;
1749
+ box-shadow: var(--neiki-shadow-lg);
1750
+ padding: 4px;
1751
+ margin-top: 4px;
1752
+ }
1753
+
1754
+ .neiki-fontsize-dropdown.show {
1755
+ display: block;
1756
+ }
1757
+
1758
+ .neiki-fontsize-dropdown-item {
1759
+ padding: 6px 12px;
1760
+ font-size: 13px;
1761
+ cursor: pointer;
1762
+ border-radius: 4px;
1763
+ color: var(--neiki-text-primary);
1764
+ text-align: center;
1765
+ transition: background 0.1s;
1766
+ }
1767
+
1768
+ .neiki-fontsize-dropdown-item:hover {
1769
+ background: var(--neiki-bg-hover);
1770
+ }
1771
+
1772
+ /* ============================================
1773
+ Insert Dropdown Button
1774
+ ============================================ */
1775
+ .neiki-insert-dropdown-btn {
1776
+ width: auto !important;
1777
+ padding: 0 8px !important;
1778
+ gap: 4px;
1779
+ font-size: 13px;
1780
+ font-weight: 500;
1781
+ }
1782
+
1783
+ .neiki-insert-label {
1784
+ font-size: 13px;
1785
+ pointer-events: none;
1786
+ }
1787
+
1788
+ .neiki-chevron {
1789
+ display: inline-flex;
1790
+ pointer-events: none;
1791
+ }
1792
+
1793
+ .neiki-chevron svg {
1794
+ width: 14px;
1795
+ height: 14px;
1796
+ }
1797
+
1798
+ .neiki-insert-dropdown {
1799
+ display: none;
1800
+ position: absolute;
1801
+ top: 100%;
1802
+ left: 0;
1803
+ z-index: 1000;
1804
+ min-width: 160px;
1805
+ background: var(--neiki-bg-primary);
1806
+ border: 1px solid var(--neiki-border-color);
1807
+ border-radius: 6px;
1808
+ box-shadow: var(--neiki-shadow-lg);
1809
+ padding: 4px;
1810
+ margin-top: 4px;
1811
+ }
1812
+
1813
+ .neiki-insert-dropdown.show {
1814
+ display: block;
1815
+ animation: neiki-fade-in 0.15s ease;
1816
+ }
1817
+
1818
+ /* ============================================
1819
+ More Menu (⋯) Dropdown
1820
+ ============================================ */
1821
+ .neiki-more-btn {
1822
+ position: relative;
1823
+ }
1824
+
1825
+ .neiki-more-dropdown {
1826
+ display: none;
1827
+ position: absolute;
1828
+ top: 100%;
1829
+ right: 0;
1830
+ z-index: 1000;
1831
+ min-width: 140px;
1832
+ max-width: 170px;
1833
+ background: var(--neiki-bg-primary);
1834
+ border: 1px solid var(--neiki-border-color);
1835
+ border-radius: 6px;
1836
+ box-shadow: var(--neiki-shadow-lg);
1837
+ padding: 4px;
1838
+ margin-top: 4px;
1839
+ }
1840
+
1841
+ .neiki-more-dropdown.show {
1842
+ display: block;
1843
+ animation: neiki-fade-in 0.15s ease;
1844
+ }
1845
+
1846
+ /* Czech language - wider dropdown for longer labels */
1847
+ .neiki-lang-cs .neiki-more-dropdown {
1848
+ min-width: 165px;
1849
+ }
1850
+
1851
+ /* Dropdown item with icon */
1852
+ .neiki-dropdown-item-icon {
1853
+ display: inline-flex;
1854
+ align-items: center;
1855
+ justify-content: center;
1856
+ width: 18px;
1857
+ height: 18px;
1858
+ flex-shrink: 0;
1859
+ }
1860
+
1861
+ .neiki-dropdown-item-icon svg {
1862
+ width: 16px;
1863
+ height: 16px;
1864
+ fill: currentColor;
1865
+ }
1866
+
1867
+ .neiki-dropdown-item-danger {
1868
+ color: var(--neiki-danger-color) !important;
1869
+ }
1870
+
1871
+ .neiki-dropdown-item-danger:hover {
1872
+ background: rgba(220, 53, 69, 0.1);
1873
+ }
1874
+
1875
+ /* Autosave badge in More menu */
1876
+ .neiki-autosave-badge {
1877
+ font-size: 12px;
1878
+ font-weight: 600;
1879
+ color: var(--neiki-text-muted);
1880
+ padding: 0 4px;
1881
+ }
1882
+
1883
+ .neiki-autosave-badge.active {
1884
+ color: var(--neiki-success-color);
1885
+ }
1886
+
1887
+ /* ============================================
1888
+ Preview Modal
1889
+ ============================================ */
1890
+ .neiki-preview-overlay {
1891
+ position: fixed;
1892
+ inset: 0;
1893
+ background: rgba(0, 0, 0, 0.6);
1894
+ z-index: 100000;
1895
+ display: flex;
1896
+ align-items: center;
1897
+ justify-content: center;
1898
+ padding: 30px;
1899
+ animation: neiki-fade-in 0.2s ease;
1900
+ }
1901
+
1902
+ .neiki-preview-modal {
1903
+ background: var(--neiki-bg-primary);
1904
+ border-radius: 12px;
1905
+ width: 100%;
1906
+ max-width: 900px;
1907
+ max-height: 90vh;
1908
+ display: flex;
1909
+ flex-direction: column;
1910
+ overflow: hidden;
1911
+ box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);
1912
+ animation: neiki-modal-in 0.2s ease;
1913
+ }
1914
+
1915
+ .neiki-preview-header {
1916
+ display: flex;
1917
+ align-items: center;
1918
+ justify-content: space-between;
1919
+ padding: 14px 20px;
1920
+ background: var(--neiki-bg-secondary);
1921
+ border-bottom: 1px solid var(--neiki-border-color);
1922
+ font-weight: 600;
1923
+ font-size: 14px;
1924
+ color: var(--neiki-text-primary);
1925
+ }
1926
+
1927
+ .neiki-preview-close {
1928
+ width: 32px;
1929
+ height: 32px;
1930
+ display: flex;
1931
+ align-items: center;
1932
+ justify-content: center;
1933
+ background: transparent;
1934
+ border: none;
1935
+ border-radius: 4px;
1936
+ cursor: pointer;
1937
+ color: var(--neiki-text-muted);
1938
+ transition: background 0.15s;
1939
+ }
1940
+
1941
+ .neiki-preview-close:hover {
1942
+ background: var(--neiki-bg-hover);
1943
+ color: var(--neiki-text-primary);
1944
+ }
1945
+
1946
+ .neiki-preview-close svg {
1947
+ width: 18px;
1948
+ height: 18px;
1949
+ fill: currentColor;
1950
+ }
1951
+
1952
+ .neiki-preview-body {
1953
+ flex: 1;
1954
+ overflow: auto;
1955
+ padding: 30px;
1956
+ color: var(--neiki-text-primary);
1957
+ font-size: 15px;
1958
+ line-height: 1.7;
1959
+ }
1960
+
1961
+ .neiki-preview-body img {
1962
+ max-width: 100%;
1963
+ }
1964
+
1965
+ .neiki-preview-body table {
1966
+ border-collapse: collapse;
1967
+ width: 100%;
1968
+ }
1969
+
1970
+ .neiki-preview-body table td,
1971
+ .neiki-preview-body table th {
1972
+ border: 1px solid var(--neiki-border-color);
1973
+ padding: 8px 12px;
1974
+ }
1975
+
1976
+ /* Autosave status in statusbar */
1977
+ .neiki-statusbar-autosave {
1978
+ font-style: italic;
1979
+ color: var(--neiki-success-color);
1980
+ font-size: 11px;
1981
+ }