neiki-page-editor 0.1.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.
@@ -0,0 +1,1580 @@
1
+ /**
2
+ * Neiki's Page Editor — editor chrome CSS
3
+ * All classes use the npe- prefix to avoid conflicts with page content.
4
+ * Theme CSS (dark, blue, etc.) comes at the end of this file.
5
+ */
6
+
7
+ /* ─── CSS Custom Properties (light theme defaults) ─────────────────────────── */
8
+ :root,
9
+ .npe-editor {
10
+ --npe-font: system-ui, -apple-system, sans-serif;
11
+ --npe-font-size: 13px;
12
+
13
+ /* Chrome colors */
14
+ --npe-chrome-bg: #f5f5f5;
15
+ --npe-chrome-border: #d0d0d0;
16
+ --npe-chrome-text: #222;
17
+ --npe-chrome-text-muted: #666;
18
+
19
+ /* Toolbar */
20
+ --npe-toolbar-bg: #ffffff;
21
+ --npe-toolbar-border: #d0d0d0;
22
+ --npe-toolbar-btn-hover-bg: #e8e8e8;
23
+ --npe-toolbar-btn-active-bg: #d0e4ff;
24
+ --npe-toolbar-btn-active-text: #0057cc;
25
+ --npe-toolbar-separator: #d0d0d0;
26
+
27
+ /* Canvas */
28
+ --npe-canvas-bg: #fff;
29
+ --npe-canvas-border: #d0d0d0;
30
+
31
+ /* Status bar */
32
+ --npe-statusbar-bg: #f0f0f0;
33
+ --npe-statusbar-border: #d0d0d0;
34
+ --npe-statusbar-text: #555;
35
+
36
+ /* Focus ring */
37
+ --npe-focus-ring: 0 0 0 2px #0057cc66;
38
+
39
+ /* Z-index layers */
40
+ --npe-z-overlay: 10;
41
+ --npe-z-toolbar: 20;
42
+ --npe-z-modal: 1000;
43
+ --npe-z-toast: 1100;
44
+ }
45
+
46
+ /* ─── Editor Shell ──────────────────────────────────────────────────────────── */
47
+ .npe-editor {
48
+ display: flex;
49
+ flex-direction: column;
50
+ font-family: var(--npe-font);
51
+ font-size: var(--npe-font-size);
52
+ color: var(--npe-chrome-text);
53
+ background: var(--npe-chrome-bg);
54
+ border: 1px solid var(--npe-chrome-border);
55
+ border-radius: 4px;
56
+ box-sizing: border-box;
57
+ position: relative;
58
+ width: 100%;
59
+ height: 100%;
60
+ }
61
+
62
+ .npe-editor *,
63
+ .npe-editor *::before,
64
+ .npe-editor *::after {
65
+ box-sizing: border-box;
66
+ }
67
+
68
+ /* ─── Toolbar ───────────────────────────────────────────────────────────────── */
69
+ .npe-toolbar {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ align-items: center;
73
+ gap: 2px;
74
+ padding: 3px 6px;
75
+ background: var(--npe-toolbar-bg);
76
+ border-bottom: 1px solid var(--npe-toolbar-border);
77
+ position: relative;
78
+ z-index: var(--npe-z-toolbar);
79
+ min-height: 40px;
80
+ }
81
+
82
+ .npe-toolbar-group {
83
+ display: flex;
84
+ align-items: center;
85
+ flex-wrap: nowrap;
86
+ gap: 1px;
87
+ padding: 0 2px;
88
+ }
89
+
90
+ /* Toolbar separator */
91
+ .npe-toolbar-sep {
92
+ display: inline-block;
93
+ width: 1px;
94
+ height: 20px;
95
+ background: var(--npe-toolbar-separator);
96
+ margin: 0 4px;
97
+ flex-shrink: 0;
98
+ }
99
+
100
+ /* Toolbar buttons */
101
+ .npe-btn {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ min-width: 26px;
106
+ height: 26px;
107
+ padding: 0 4px;
108
+ background: transparent;
109
+ border: 1px solid transparent;
110
+ border-radius: 3px;
111
+ color: var(--npe-chrome-text);
112
+ cursor: pointer;
113
+ font-family: var(--npe-font);
114
+ font-size: var(--npe-font-size);
115
+ line-height: 1;
116
+ transition: background 0.1s, border-color 0.1s;
117
+ white-space: nowrap;
118
+ user-select: none;
119
+ }
120
+
121
+ .npe-btn:hover {
122
+ background: var(--npe-toolbar-btn-hover-bg);
123
+ border-color: var(--npe-chrome-border);
124
+ }
125
+
126
+ .npe-btn:focus-visible {
127
+ outline: none;
128
+ box-shadow: var(--npe-focus-ring);
129
+ }
130
+
131
+ .npe-btn[aria-pressed="true"],
132
+ .npe-btn.npe-active {
133
+ background: var(--npe-toolbar-btn-active-bg);
134
+ color: var(--npe-toolbar-btn-active-text);
135
+ border-color: var(--npe-toolbar-btn-active-bg);
136
+ }
137
+
138
+ .npe-btn[aria-disabled="true"],
139
+ .npe-btn:disabled {
140
+ opacity: 0.4;
141
+ cursor: default;
142
+ pointer-events: none;
143
+ }
144
+
145
+ /* SVG icons inside toolbar buttons */
146
+ .npe-btn svg {
147
+ width: 16px;
148
+ height: 16px;
149
+ fill: currentColor;
150
+ display: block;
151
+ pointer-events: none;
152
+ }
153
+
154
+ /* Visible text label inside a button (used by Insert dropdown) */
155
+ .npe-btn-label {
156
+ font-family: var(--npe-font);
157
+ font-size: var(--npe-font-size);
158
+ line-height: 1;
159
+ pointer-events: none;
160
+ white-space: nowrap;
161
+ margin-left: 2px;
162
+ }
163
+
164
+ /* ─── Canvas Wrapper ────────────────────────────────────────────────────────── */
165
+ .npe-canvas-wrapper {
166
+ position: relative;
167
+ background: var(--npe-canvas-bg);
168
+ flex: 1 1 auto;
169
+ overflow: hidden;
170
+ /* Ensure the wrapper has an intrinsic height so the iframe fills it */
171
+ display: flex;
172
+ flex-direction: column;
173
+ }
174
+
175
+ .npe-canvas-wrapper iframe {
176
+ display: block;
177
+ width: 100%;
178
+ flex: 1 1 auto;
179
+ /* iframe height falls back to min-height when no explicit height is set */
180
+ min-height: inherit;
181
+ border: 0;
182
+ }
183
+
184
+ /* ─── Overlay Layer ─────────────────────────────────────────────────────────── */
185
+ .npe-overlay-layer {
186
+ position: absolute;
187
+ top: 0;
188
+ left: 0;
189
+ width: 100%;
190
+ height: 100%;
191
+ pointer-events: none;
192
+ z-index: var(--npe-z-overlay);
193
+ }
194
+
195
+ /* ─── Status Bar ────────────────────────────────────────────────────────────── */
196
+ .npe-statusbar {
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 16px;
200
+ padding: 3px 10px;
201
+ background: var(--npe-statusbar-bg);
202
+ border-top: 1px solid var(--npe-statusbar-border);
203
+ color: var(--npe-statusbar-text);
204
+ font-size: 11px;
205
+ min-height: 24px;
206
+ flex-shrink: 0;
207
+ }
208
+
209
+ .npe-statusbar-item {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 4px;
213
+ white-space: nowrap;
214
+ }
215
+
216
+ /* ─── Dropdowns ─────────────────────────────────────────────────────────────── */
217
+ .npe-dropdown {
218
+ position: absolute;
219
+ top: 100%;
220
+ left: 0;
221
+ min-width: 160px;
222
+ background: var(--npe-toolbar-bg);
223
+ border: 1px solid var(--npe-chrome-border);
224
+ border-radius: 4px;
225
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
226
+ z-index: var(--npe-z-modal);
227
+ padding: 4px 0;
228
+ list-style: none;
229
+ margin: 2px 0 0;
230
+ }
231
+
232
+ .npe-dropdown-item {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 8px;
236
+ padding: 6px 12px;
237
+ cursor: pointer;
238
+ color: var(--npe-chrome-text);
239
+ font-size: var(--npe-font-size);
240
+ white-space: nowrap;
241
+ }
242
+
243
+ .npe-dropdown-item:hover {
244
+ background: var(--npe-toolbar-btn-hover-bg);
245
+ }
246
+
247
+ .npe-dropdown-item-icon {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ justify-content: center;
251
+ width: 16px;
252
+ height: 16px;
253
+ flex-shrink: 0;
254
+ color: var(--npe-chrome-text);
255
+ }
256
+
257
+ .npe-dropdown-item-icon svg {
258
+ width: 16px;
259
+ height: 16px;
260
+ fill: currentColor;
261
+ display: block;
262
+ }
263
+
264
+ /* ─── Modals ────────────────────────────────────────────────────────────────── */
265
+ .npe-modal-backdrop {
266
+ position: fixed;
267
+ inset: 0;
268
+ background: rgba(0, 0, 0, 0.4);
269
+ z-index: calc(var(--npe-z-modal) - 1);
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ }
274
+
275
+ .npe-modal {
276
+ background: var(--npe-toolbar-bg);
277
+ border: 1px solid var(--npe-chrome-border);
278
+ border-radius: 6px;
279
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
280
+ min-width: 320px;
281
+ max-width: min(600px, calc(100vw - 32px));
282
+ max-height: calc(100vh - 48px);
283
+ overflow: auto;
284
+ padding: 20px 24px;
285
+ position: relative;
286
+ z-index: var(--npe-z-modal);
287
+ }
288
+
289
+ .npe-modal-header {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: space-between;
293
+ margin-bottom: 16px;
294
+ flex-shrink: 0;
295
+ }
296
+
297
+ .npe-modal-title {
298
+ font-size: 16px;
299
+ font-weight: 600;
300
+ margin: 0;
301
+ color: var(--npe-chrome-text);
302
+ }
303
+
304
+ .npe-modal-close {
305
+ background: none;
306
+ border: none;
307
+ font-size: 20px;
308
+ line-height: 1;
309
+ cursor: pointer;
310
+ color: var(--npe-chrome-text-muted);
311
+ padding: 0 4px;
312
+ border-radius: 3px;
313
+ }
314
+
315
+ .npe-modal-close:hover {
316
+ background: var(--npe-toolbar-btn-hover-bg);
317
+ color: var(--npe-chrome-text);
318
+ }
319
+
320
+ .npe-modal-tabs {
321
+ display: flex;
322
+ gap: 2px;
323
+ border-bottom: 1px solid var(--npe-chrome-border);
324
+ margin-bottom: 12px;
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ .npe-tab {
329
+ background: none;
330
+ border: none;
331
+ border-bottom: 2px solid transparent;
332
+ padding: 6px 12px;
333
+ font-family: var(--npe-font);
334
+ font-size: var(--npe-font-size);
335
+ color: var(--npe-chrome-text-muted);
336
+ cursor: pointer;
337
+ margin-bottom: -1px;
338
+ }
339
+
340
+ .npe-tab:hover {
341
+ color: var(--npe-chrome-text);
342
+ }
343
+
344
+ .npe-tab.npe-tab-active {
345
+ color: var(--npe-chrome-text);
346
+ border-bottom-color: var(--npe-toolbar-btn-active-text, #0057cc);
347
+ font-weight: 600;
348
+ }
349
+
350
+ .npe-modal-panel {
351
+ flex: 1;
352
+ display: flex;
353
+ flex-direction: column;
354
+ min-height: 0;
355
+ }
356
+
357
+ .npe-modal-footer {
358
+ display: flex;
359
+ justify-content: flex-end;
360
+ gap: 8px;
361
+ margin-top: 16px;
362
+ padding-top: 12px;
363
+ border-top: 1px solid var(--npe-chrome-border);
364
+ flex-shrink: 0;
365
+ }
366
+
367
+ .npe-modal-actions {
368
+ display: flex;
369
+ justify-content: flex-end;
370
+ gap: 8px;
371
+ margin-top: 16px;
372
+ }
373
+
374
+ /* ─── Source View Modal ──────────────────────────────────────────────────────── */
375
+ .npe-source-modal {
376
+ width: min(1100px, calc(100vw - 32px));
377
+ max-width: min(1100px, calc(100vw - 32px));
378
+ max-height: calc(100vh - 48px);
379
+ display: flex;
380
+ flex-direction: column;
381
+ overflow: hidden;
382
+ padding: 20px 24px 0;
383
+ }
384
+
385
+ /* Ensure [hidden] attribute hides panels even when display:flex is set */
386
+ .npe-source-panel[hidden] {
387
+ display: none !important;
388
+ }
389
+
390
+ .npe-source-panel {
391
+ flex: 1;
392
+ display: flex;
393
+ flex-direction: column;
394
+ min-height: 0;
395
+ overflow: hidden;
396
+ }
397
+
398
+ .npe-source-textarea {
399
+ flex: 1;
400
+ width: 100%;
401
+ min-height: 300px;
402
+ max-height: calc(100vh - 280px);
403
+ padding: 10px 12px;
404
+ font-family: 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace;
405
+ font-size: 12px;
406
+ line-height: 1.5;
407
+ background: var(--npe-canvas-bg);
408
+ color: var(--npe-chrome-text);
409
+ border: 1px solid var(--npe-chrome-border);
410
+ border-radius: 4px;
411
+ resize: vertical;
412
+ box-sizing: border-box;
413
+ outline: none;
414
+ }
415
+
416
+ .npe-source-textarea:focus {
417
+ box-shadow: var(--npe-focus-ring);
418
+ }
419
+
420
+ .npe-source-modal .npe-modal-footer {
421
+ padding-bottom: 16px;
422
+ }
423
+
424
+ /* ─── Select controls ───────────────────────────────────────────────────────── */
425
+ .npe-select {
426
+ height: 26px;
427
+ padding: 0 4px;
428
+ background: var(--npe-toolbar-bg);
429
+ border: 1px solid var(--npe-chrome-border);
430
+ border-radius: 3px;
431
+ color: var(--npe-chrome-text);
432
+ font-family: var(--npe-font);
433
+ font-size: var(--npe-font-size);
434
+ cursor: pointer;
435
+ }
436
+
437
+ .npe-select:focus-visible {
438
+ outline: none;
439
+ box-shadow: var(--npe-focus-ring);
440
+ }
441
+
442
+ /* ─── Font Size Widget ──────────────────────────────────────────────────────── */
443
+ .npe-font-size-widget {
444
+ display: inline-flex;
445
+ align-items: center;
446
+ gap: 0;
447
+ border: 1px solid var(--npe-chrome-border);
448
+ border-radius: 3px;
449
+ overflow: visible;
450
+ background: var(--npe-toolbar-bg);
451
+ height: 26px;
452
+ }
453
+
454
+ .npe-font-size-widget input[type="number"] {
455
+ width: 36px;
456
+ height: 24px;
457
+ text-align: center;
458
+ border: none;
459
+ border-left: 1px solid var(--npe-chrome-border);
460
+ border-right: 1px solid var(--npe-chrome-border);
461
+ background: var(--npe-toolbar-bg);
462
+ color: var(--npe-chrome-text);
463
+ font-family: var(--npe-font);
464
+ font-size: var(--npe-font-size);
465
+ padding: 0 2px;
466
+ /* Hide spin buttons */
467
+ -moz-appearance: textfield;
468
+ }
469
+
470
+ .npe-font-size-widget input[type="number"]::-webkit-inner-spin-button,
471
+ .npe-font-size-widget input[type="number"]::-webkit-outer-spin-button {
472
+ -webkit-appearance: none;
473
+ }
474
+
475
+ /* ─── Color Picker ──────────────────────────────────────────────────────────── */
476
+ .npe-color-swatch {
477
+ display: inline-block;
478
+ width: 12px;
479
+ height: 12px;
480
+ border-radius: 2px;
481
+ margin-top: 1px;
482
+ margin-left: 2px;
483
+ flex-shrink: 0;
484
+ /* Default: no color selected — show border outline */
485
+ border: 1px solid var(--npe-chrome-border);
486
+ background-color: transparent;
487
+ }
488
+
489
+ .npe-color-panel {
490
+ position: absolute;
491
+ top: 100%;
492
+ left: 0;
493
+ background: var(--npe-toolbar-bg);
494
+ border: 1px solid var(--npe-chrome-border);
495
+ border-radius: 4px;
496
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
497
+ padding: 10px;
498
+ z-index: var(--npe-z-modal);
499
+ min-width: 220px;
500
+ }
501
+
502
+ .npe-color-swatches {
503
+ display: grid;
504
+ grid-template-columns: repeat(10, 20px);
505
+ gap: 3px;
506
+ margin-bottom: 8px;
507
+ }
508
+
509
+ .npe-color-swatch-btn {
510
+ width: 20px;
511
+ height: 20px;
512
+ border: 1px solid rgba(0, 0, 0, 0.15);
513
+ border-radius: 2px;
514
+ cursor: pointer;
515
+ padding: 0;
516
+ }
517
+
518
+ .npe-color-swatch-btn:hover {
519
+ transform: scale(1.2);
520
+ z-index: 1;
521
+ }
522
+
523
+ /* ─── Toast / Non-blocking notifications ────────────────────────────────────── */
524
+ .npe-toast-container {
525
+ position: absolute;
526
+ bottom: 40px;
527
+ left: 50%;
528
+ transform: translateX(-50%);
529
+ z-index: var(--npe-z-toast);
530
+ display: flex;
531
+ flex-direction: column;
532
+ align-items: center;
533
+ gap: 6px;
534
+ pointer-events: none;
535
+ }
536
+
537
+ .npe-toast {
538
+ background: #333;
539
+ color: #fff;
540
+ padding: 8px 14px;
541
+ border-radius: 4px;
542
+ font-size: 12px;
543
+ opacity: 1;
544
+ transition: opacity 0.3s;
545
+ pointer-events: auto;
546
+ }
547
+
548
+ .npe-toast.npe-toast-error {
549
+ background: #cc3333;
550
+ }
551
+
552
+ /* ─── Fullscreen mode ───────────────────────────────────────────────────────── */
553
+ .npe-editor.npe-fullscreen {
554
+ position: fixed;
555
+ inset: 0;
556
+ z-index: calc(var(--npe-z-modal) + 100);
557
+ border-radius: 0;
558
+ }
559
+
560
+ /* ─── Dark Theme ────────────────────────────────────────────────────────────── */
561
+ .npe-editor.npe-dark {
562
+ --npe-chrome-bg: #1e1e1e;
563
+ --npe-chrome-border: #3a3a3a;
564
+ --npe-chrome-text: #d4d4d4;
565
+ --npe-chrome-text-muted: #888;
566
+ --npe-toolbar-bg: #252526;
567
+ --npe-toolbar-border: #3a3a3a;
568
+ --npe-toolbar-btn-hover-bg: #3a3a3a;
569
+ --npe-toolbar-btn-active-bg: #094771;
570
+ --npe-toolbar-btn-active-text: #4fc3f7;
571
+ --npe-toolbar-separator: #3a3a3a;
572
+ --npe-canvas-bg: #1e1e1e;
573
+ --npe-canvas-border: #3a3a3a;
574
+ --npe-statusbar-bg: #1b1b1b;
575
+ --npe-statusbar-border: #3a3a3a;
576
+ --npe-statusbar-text: #888;
577
+ --npe-focus-ring: 0 0 0 2px #4fc3f766;
578
+ }
579
+
580
+ /* ─── Blue Theme ────────────────────────────────────────────────────────────── */
581
+ .npe-editor.npe-theme-blue {
582
+ --npe-chrome-bg: #e8f0fe;
583
+ --npe-chrome-border: #aac4f6;
584
+ --npe-chrome-text: #0d2663;
585
+ --npe-chrome-text-muted: #3a5aa8;
586
+ --npe-toolbar-bg: #f0f6ff;
587
+ --npe-toolbar-border: #aac4f6;
588
+ --npe-toolbar-btn-hover-bg: #d0e4ff;
589
+ --npe-toolbar-btn-active-bg: #0057cc;
590
+ --npe-toolbar-btn-active-text: #fff;
591
+ --npe-toolbar-separator: #aac4f6;
592
+ --npe-canvas-bg: #fff;
593
+ --npe-canvas-border: #aac4f6;
594
+ --npe-statusbar-bg: #dce9ff;
595
+ --npe-statusbar-border: #aac4f6;
596
+ --npe-statusbar-text: #3a5aa8;
597
+ }
598
+
599
+ /* ─── Dark Blue Theme ───────────────────────────────────────────────────────── */
600
+ .npe-editor.npe-theme-dark-blue {
601
+ --npe-chrome-bg: #0a1628;
602
+ --npe-chrome-border: #1e3a5f;
603
+ --npe-chrome-text: #c8d8f0;
604
+ --npe-chrome-text-muted: #6a8cba;
605
+ --npe-toolbar-bg: #0d1f3c;
606
+ --npe-toolbar-border: #1e3a5f;
607
+ --npe-toolbar-btn-hover-bg: #1e3a5f;
608
+ --npe-toolbar-btn-active-bg: #1a5cc7;
609
+ --npe-toolbar-btn-active-text: #fff;
610
+ --npe-toolbar-separator: #1e3a5f;
611
+ --npe-canvas-bg: #0d1f3c;
612
+ --npe-canvas-border: #1e3a5f;
613
+ --npe-statusbar-bg: #091526;
614
+ --npe-statusbar-border: #1e3a5f;
615
+ --npe-statusbar-text: #6a8cba;
616
+ --npe-focus-ring: 0 0 0 2px #4d9fff66;
617
+ }
618
+
619
+ /* ─── Midnight Theme ────────────────────────────────────────────────────────── */
620
+ .npe-editor.npe-theme-midnight {
621
+ --npe-chrome-bg: #0c0c18;
622
+ --npe-chrome-border: #2a2a40;
623
+ --npe-chrome-text: #c0c0e0;
624
+ --npe-chrome-text-muted: #6060a0;
625
+ --npe-toolbar-bg: #111128;
626
+ --npe-toolbar-border: #2a2a40;
627
+ --npe-toolbar-btn-hover-bg: #2a2a40;
628
+ --npe-toolbar-btn-active-bg: #3a3a7a;
629
+ --npe-toolbar-btn-active-text: #c0c0ff;
630
+ --npe-toolbar-separator: #2a2a40;
631
+ --npe-canvas-bg: #111128;
632
+ --npe-canvas-border: #2a2a40;
633
+ --npe-statusbar-bg: #090914;
634
+ --npe-statusbar-border: #2a2a40;
635
+ --npe-statusbar-text: #6060a0;
636
+ --npe-focus-ring: 0 0 0 2px #7070ff66;
637
+ }
638
+
639
+ /* ─── Toolbar Group Responsive Wrapping ────────────────────────────────────── */
640
+ .npe-toolbar-group {
641
+ display: inline-flex;
642
+ align-items: center;
643
+ flex-wrap: nowrap;
644
+ gap: 1px;
645
+ padding: 0 2px;
646
+ /* Groups never split across lines — they wrap as units */
647
+ }
648
+
649
+ /* ─── Dropdown Arrow ────────────────────────────────────────────────────────── */
650
+ .npe-dropdown-arrow {
651
+ display: inline-flex;
652
+ align-items: center;
653
+ opacity: 0.7;
654
+ pointer-events: none;
655
+ flex-shrink: 0;
656
+ }
657
+
658
+ .npe-dropdown-arrow svg {
659
+ width: 16px;
660
+ height: 16px;
661
+ fill: currentColor;
662
+ display: block;
663
+ }
664
+
665
+ /* ─── More Menu — pushed to far right of toolbar ────────────────────────────── */
666
+ .npe-toolbar-group:has(.npe-more-menu-btn),
667
+ .npe-more-menu-group {
668
+ margin-left: auto;
669
+ }
670
+
671
+ /* ─── Heading Select ────────────────────────────────────────────────────────── */
672
+ .npe-heading-select {
673
+ max-width: 110px;
674
+ }
675
+
676
+ /* ─── Font Family Select ────────────────────────────────────────────────────── */
677
+ .npe-font-family-select {
678
+ max-width: 120px;
679
+ }
680
+
681
+ /* ─── Font Size Widget ──────────────────────────────────────────────────────── */
682
+
683
+ /* Replace the <select> with a custom dropdown trigger button */
684
+ .npe-font-size-dropdown-btn {
685
+ width: 22px;
686
+ height: 24px;
687
+ padding: 0;
688
+ border: none;
689
+ border-left: 1px solid var(--npe-chrome-border);
690
+ border-radius: 0 2px 2px 0;
691
+ background: var(--npe-toolbar-bg);
692
+ cursor: pointer;
693
+ display: inline-flex;
694
+ align-items: center;
695
+ justify-content: center;
696
+ color: var(--npe-chrome-text);
697
+ opacity: 0.7;
698
+ }
699
+
700
+ .npe-font-size-dropdown-btn:hover {
701
+ background: var(--npe-toolbar-btn-hover-bg);
702
+ opacity: 1;
703
+ }
704
+
705
+ .npe-font-size-dropdown-btn svg {
706
+ width: 16px;
707
+ height: 16px;
708
+ fill: currentColor;
709
+ pointer-events: none;
710
+ }
711
+
712
+ /* The popup list */
713
+ .npe-font-size-popup {
714
+ position: absolute;
715
+ top: 100%;
716
+ left: 0;
717
+ background: var(--npe-toolbar-bg);
718
+ border: 1px solid var(--npe-chrome-border);
719
+ border-radius: 4px;
720
+ box-shadow: 0 4px 12px rgba(0,0,0,0.12);
721
+ z-index: var(--npe-z-modal);
722
+ padding: 4px 0;
723
+ min-width: 64px;
724
+ max-height: 220px;
725
+ overflow-y: auto;
726
+ }
727
+
728
+ .npe-font-size-popup-item {
729
+ display: block;
730
+ width: 100%;
731
+ padding: 4px 12px;
732
+ background: none;
733
+ border: none;
734
+ text-align: left;
735
+ font-family: var(--npe-font);
736
+ font-size: var(--npe-font-size);
737
+ color: var(--npe-chrome-text);
738
+ cursor: pointer;
739
+ white-space: nowrap;
740
+ }
741
+
742
+ .npe-font-size-popup-item:hover,
743
+ .npe-font-size-popup-item.npe-active {
744
+ background: var(--npe-toolbar-btn-hover-bg);
745
+ }
746
+
747
+ .npe-font-size-dec,
748
+ .npe-font-size-inc {
749
+ min-width: 22px;
750
+ height: 24px;
751
+ padding: 0 3px;
752
+ border: none;
753
+ border-radius: 0;
754
+ }
755
+
756
+ .npe-font-size-dec {
757
+ border-radius: 2px 0 0 2px;
758
+ }
759
+
760
+ .npe-font-size-inc {
761
+ border-radius: 0;
762
+ }
763
+
764
+ /* Hide the old <select>-based preset */
765
+ .npe-font-size-preset {
766
+ display: none;
767
+ }
768
+
769
+ /* ─── Color Picker Panel Layout ─────────────────────────────────────────────── */
770
+ .npe-color-picker-row {
771
+ display: flex;
772
+ align-items: center;
773
+ gap: 6px;
774
+ margin-bottom: 6px;
775
+ }
776
+
777
+ .npe-color-hex-input {
778
+ flex: 1;
779
+ height: 28px;
780
+ padding: 0 6px;
781
+ border: 1px solid var(--npe-chrome-border);
782
+ border-radius: 3px;
783
+ font-family: monospace;
784
+ font-size: 12px;
785
+ background: var(--npe-toolbar-bg);
786
+ color: var(--npe-chrome-text);
787
+ }
788
+
789
+ .npe-color-hex-input:focus-visible {
790
+ outline: none;
791
+ box-shadow: var(--npe-focus-ring);
792
+ }
793
+
794
+ .npe-color-native {
795
+ width: 32px;
796
+ height: 28px;
797
+ border: none;
798
+ padding: 0;
799
+ cursor: pointer;
800
+ border-radius: 3px;
801
+ }
802
+
803
+ /* ─── Toolbar Button Primary Variant ───────────────────────────────────────── */
804
+ .npe-btn.npe-btn-primary {
805
+ background: var(--npe-toolbar-btn-active-bg);
806
+ color: var(--npe-toolbar-btn-active-text);
807
+ border-color: transparent;
808
+ }
809
+
810
+ .npe-btn.npe-btn-primary:hover {
811
+ opacity: 0.9;
812
+ }
813
+
814
+ /* ─── Disabled toolbar controls ────────────────────────────────────────────── */
815
+ .npe-btn.npe-disabled {
816
+ opacity: 0.4;
817
+ cursor: default;
818
+ pointer-events: none;
819
+ }
820
+
821
+ .npe-select:disabled {
822
+ opacity: 0.4;
823
+ cursor: default;
824
+ }
825
+
826
+ /* ═══════════════════════════════════════════════════════════════════════════
827
+ TASK 6 — Insert Features: Modals, Table Context Menu, Table Resize,
828
+ Emoji / Special Characters Pickers
829
+ ═══════════════════════════════════════════════════════════════════════════ */
830
+
831
+ /* ─── Modal Header / Footer / Body ─────────────────────────────────────────── */
832
+ .npe-modal-header {
833
+ display: flex;
834
+ align-items: center;
835
+ justify-content: space-between;
836
+ margin-bottom: 16px;
837
+ }
838
+
839
+ .npe-modal-body {
840
+ display: flex;
841
+ flex-direction: column;
842
+ gap: 10px;
843
+ }
844
+
845
+ .npe-modal-footer {
846
+ display: flex;
847
+ justify-content: flex-end;
848
+ gap: 8px;
849
+ margin-top: 16px;
850
+ }
851
+
852
+ .npe-modal-close {
853
+ background: none;
854
+ border: none;
855
+ font-size: 20px;
856
+ line-height: 1;
857
+ cursor: pointer;
858
+ color: var(--npe-chrome-text-muted);
859
+ padding: 2px 6px;
860
+ border-radius: 3px;
861
+ }
862
+
863
+ .npe-modal-close:hover {
864
+ color: var(--npe-chrome-text);
865
+ background: var(--npe-toolbar-btn-hover-bg);
866
+ }
867
+
868
+ .npe-modal-close:focus-visible {
869
+ outline: none;
870
+ box-shadow: var(--npe-focus-ring);
871
+ }
872
+
873
+ /* ─── Modal Tabs ────────────────────────────────────────────────────────────── */
874
+ .npe-modal-tabs {
875
+ display: flex;
876
+ gap: 0;
877
+ border-bottom: 2px solid var(--npe-chrome-border);
878
+ margin-bottom: 16px;
879
+ }
880
+
881
+ .npe-tab {
882
+ background: none;
883
+ border: none;
884
+ border-bottom: 2px solid transparent;
885
+ margin-bottom: -2px;
886
+ padding: 6px 14px;
887
+ cursor: pointer;
888
+ color: var(--npe-chrome-text-muted);
889
+ font-family: var(--npe-font);
890
+ font-size: var(--npe-font-size);
891
+ font-weight: 500;
892
+ transition: color 0.15s, border-color 0.15s;
893
+ }
894
+
895
+ .npe-tab:hover {
896
+ color: var(--npe-chrome-text);
897
+ }
898
+
899
+ .npe-tab.npe-tab-active {
900
+ color: var(--npe-toolbar-btn-active-text);
901
+ border-bottom-color: var(--npe-toolbar-btn-active-text);
902
+ }
903
+
904
+ .npe-tab:focus-visible {
905
+ outline: none;
906
+ box-shadow: var(--npe-focus-ring);
907
+ }
908
+
909
+ /* ─── Modal Panel ───────────────────────────────────────────────────────────── */
910
+ .npe-modal-panel {
911
+ display: flex;
912
+ flex-direction: column;
913
+ gap: 10px;
914
+ }
915
+
916
+ /* ─── Form controls inside modals ──────────────────────────────────────────── */
917
+ .npe-form-label {
918
+ font-size: var(--npe-font-size);
919
+ color: var(--npe-chrome-text);
920
+ font-weight: 500;
921
+ margin-bottom: 2px;
922
+ }
923
+
924
+ .npe-form-input {
925
+ width: 100%;
926
+ height: 32px;
927
+ padding: 0 8px;
928
+ border: 1px solid var(--npe-chrome-border);
929
+ border-radius: 4px;
930
+ background: var(--npe-toolbar-bg);
931
+ color: var(--npe-chrome-text);
932
+ font-family: var(--npe-font);
933
+ font-size: var(--npe-font-size);
934
+ box-sizing: border-box;
935
+ }
936
+
937
+ .npe-form-input:focus-visible {
938
+ outline: none;
939
+ box-shadow: var(--npe-focus-ring);
940
+ border-color: var(--npe-toolbar-btn-active-text);
941
+ }
942
+
943
+ .npe-form-check-label {
944
+ display: flex;
945
+ align-items: center;
946
+ gap: 6px;
947
+ cursor: pointer;
948
+ color: var(--npe-chrome-text);
949
+ font-size: var(--npe-font-size);
950
+ user-select: none;
951
+ }
952
+
953
+ .npe-form-checkbox {
954
+ width: 14px;
955
+ height: 14px;
956
+ cursor: pointer;
957
+ flex-shrink: 0;
958
+ }
959
+
960
+ /* Number inputs in table modal */
961
+ .npe-table-number-input {
962
+ width: 80px;
963
+ }
964
+
965
+ /* ─── Link Modal ────────────────────────────────────────────────────────────── */
966
+ .npe-link-modal {
967
+ min-width: 340px;
968
+ }
969
+
970
+ /* ─── Image / Video Modals ──────────────────────────────────────────────────── */
971
+ .npe-image-modal,
972
+ .npe-video-modal {
973
+ min-width: 380px;
974
+ }
975
+
976
+ /* ─── Form group spacing ────────────────────────────────────────────────────── */
977
+ .npe-form-group {
978
+ display: flex;
979
+ flex-direction: column;
980
+ gap: 4px;
981
+ }
982
+
983
+ /* ─── Upload zone (image modal) ─────────────────────────────────────────────── */
984
+ .npe-image-upload-zone {
985
+ position: relative;
986
+ display: grid;
987
+ justify-items: center;
988
+ gap: 6px;
989
+ padding: 24px 18px;
990
+ border: 2px dashed var(--npe-chrome-border);
991
+ border-radius: 8px;
992
+ background: var(--npe-chrome-bg);
993
+ color: var(--npe-chrome-text-muted);
994
+ text-align: center;
995
+ cursor: pointer;
996
+ transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
997
+ user-select: none;
998
+ }
999
+
1000
+ .npe-image-upload-zone:hover,
1001
+ .npe-image-upload-zone:focus-visible {
1002
+ border-color: var(--npe-toolbar-btn-active-text, #0057cc);
1003
+ background: var(--npe-toolbar-btn-active-bg);
1004
+ box-shadow: 0 0 0 3px rgba(0, 87, 204, 0.1);
1005
+ outline: none;
1006
+ }
1007
+
1008
+ .npe-image-upload-zone.drag-over {
1009
+ border-color: var(--npe-toolbar-btn-active-text, #0057cc);
1010
+ background: var(--npe-toolbar-btn-active-bg);
1011
+ }
1012
+
1013
+ .npe-image-upload-zone.has-files {
1014
+ border-style: solid;
1015
+ border-color: var(--npe-toolbar-btn-active-text, #0057cc);
1016
+ }
1017
+
1018
+ .npe-image-upload-icon {
1019
+ width: 38px;
1020
+ height: 38px;
1021
+ display: flex;
1022
+ align-items: center;
1023
+ justify-content: center;
1024
+ }
1025
+
1026
+ .npe-image-upload-icon svg {
1027
+ width: 38px;
1028
+ height: 38px;
1029
+ display: block;
1030
+ border-radius: 6px;
1031
+ overflow: hidden;
1032
+ }
1033
+
1034
+ .npe-image-upload-title {
1035
+ font-size: 14px;
1036
+ font-weight: 600;
1037
+ color: var(--npe-chrome-text);
1038
+ }
1039
+
1040
+ .npe-image-upload-hint {
1041
+ font-size: 12px;
1042
+ color: var(--npe-chrome-text-muted);
1043
+ line-height: 1.4;
1044
+ }
1045
+
1046
+ .npe-image-upload-files {
1047
+ font-size: 12px;
1048
+ color: var(--npe-chrome-text-muted);
1049
+ max-width: 100%;
1050
+ overflow: hidden;
1051
+ text-overflow: ellipsis;
1052
+ white-space: nowrap;
1053
+ line-height: 1.4;
1054
+ min-height: 1em;
1055
+ }
1056
+
1057
+ .npe-image-upload-zone.has-files .npe-image-upload-files {
1058
+ color: var(--npe-toolbar-btn-active-text, #0057cc);
1059
+ font-weight: 500;
1060
+ }
1061
+
1062
+ /* ─── OR divider ────────────────────────────────────────────────────────────── */
1063
+ .npe-form-divider {
1064
+ display: flex;
1065
+ align-items: center;
1066
+ margin: 4px 0;
1067
+ text-align: center;
1068
+ }
1069
+
1070
+ .npe-form-divider::before,
1071
+ .npe-form-divider::after {
1072
+ content: '';
1073
+ flex: 1;
1074
+ height: 1px;
1075
+ background: var(--npe-chrome-border);
1076
+ }
1077
+
1078
+ .npe-form-divider::before { margin-right: 12px; }
1079
+ .npe-form-divider::after { margin-left: 12px; }
1080
+
1081
+ .npe-form-divider span {
1082
+ color: var(--npe-chrome-text-muted);
1083
+ font-size: 12px;
1084
+ font-weight: 500;
1085
+ white-space: nowrap;
1086
+ }
1087
+
1088
+ /* Dropzone */
1089
+ .npe-dropzone {
1090
+ border: 2px dashed var(--npe-chrome-border);
1091
+ border-radius: 6px;
1092
+ padding: 24px 16px;
1093
+ text-align: center;
1094
+ cursor: pointer;
1095
+ color: var(--npe-chrome-text-muted);
1096
+ font-size: var(--npe-font-size);
1097
+ transition: border-color 0.15s, background 0.15s;
1098
+ user-select: none;
1099
+ }
1100
+
1101
+ .npe-dropzone:hover,
1102
+ .npe-dropzone-active {
1103
+ border-color: var(--npe-toolbar-btn-active-text);
1104
+ background: var(--npe-toolbar-btn-active-bg);
1105
+ color: var(--npe-toolbar-btn-active-text);
1106
+ }
1107
+
1108
+ /* Hidden file input */
1109
+ .npe-file-input {
1110
+ position: absolute;
1111
+ left: -9999px;
1112
+ opacity: 0;
1113
+ pointer-events: none;
1114
+ }
1115
+
1116
+ /* Upload progress */
1117
+ .npe-upload-progress {
1118
+ font-size: 12px;
1119
+ color: var(--npe-chrome-text-muted);
1120
+ padding: 4px 0;
1121
+ }
1122
+
1123
+ .npe-upload-progress::before {
1124
+ content: '⟳ ';
1125
+ }
1126
+
1127
+ /* Upload error */
1128
+ .npe-upload-error {
1129
+ font-size: 12px;
1130
+ color: #cc3333;
1131
+ padding: 4px 0;
1132
+ }
1133
+
1134
+ /* ─── Table Modal ───────────────────────────────────────────────────────────── */
1135
+ .npe-table-modal {
1136
+ min-width: 300px;
1137
+ }
1138
+
1139
+ /* ─── Emoji Picker / Special Characters Picker ─────────────────────────────── */
1140
+ .npe-emoji-picker,
1141
+ .npe-special-chars-picker {
1142
+ min-width: 360px;
1143
+ max-width: 520px;
1144
+ }
1145
+
1146
+ .npe-emoji-search {
1147
+ margin-bottom: 10px;
1148
+ }
1149
+
1150
+ .npe-emoji-grid,
1151
+ .npe-special-chars-grid {
1152
+ max-height: 320px;
1153
+ overflow-y: auto;
1154
+ padding-right: 4px;
1155
+ }
1156
+
1157
+ .npe-emoji-category-label {
1158
+ font-size: 11px;
1159
+ font-weight: 600;
1160
+ color: var(--npe-chrome-text-muted);
1161
+ text-transform: uppercase;
1162
+ letter-spacing: 0.05em;
1163
+ padding: 8px 2px 4px;
1164
+ }
1165
+
1166
+ .npe-emoji-row {
1167
+ display: flex;
1168
+ flex-wrap: wrap;
1169
+ gap: 2px;
1170
+ margin-bottom: 4px;
1171
+ }
1172
+
1173
+ .npe-emoji-btn {
1174
+ background: none;
1175
+ border: 1px solid transparent;
1176
+ border-radius: 4px;
1177
+ width: 32px;
1178
+ height: 32px;
1179
+ font-size: 18px;
1180
+ line-height: 1;
1181
+ cursor: pointer;
1182
+ display: flex;
1183
+ align-items: center;
1184
+ justify-content: center;
1185
+ padding: 0;
1186
+ transition: background 0.1s;
1187
+ }
1188
+
1189
+ .npe-emoji-btn:hover {
1190
+ background: var(--npe-toolbar-btn-hover-bg);
1191
+ border-color: var(--npe-chrome-border);
1192
+ }
1193
+
1194
+ .npe-emoji-btn:focus-visible {
1195
+ outline: none;
1196
+ box-shadow: var(--npe-focus-ring);
1197
+ }
1198
+
1199
+ .npe-special-char-btn {
1200
+ background: none;
1201
+ border: 1px solid var(--npe-chrome-border);
1202
+ border-radius: 3px;
1203
+ width: 34px;
1204
+ height: 30px;
1205
+ font-size: 14px;
1206
+ line-height: 1;
1207
+ cursor: pointer;
1208
+ display: flex;
1209
+ align-items: center;
1210
+ justify-content: center;
1211
+ padding: 0;
1212
+ color: var(--npe-chrome-text);
1213
+ font-family: serif;
1214
+ transition: background 0.1s, border-color 0.1s;
1215
+ }
1216
+
1217
+ .npe-special-char-btn:hover {
1218
+ background: var(--npe-toolbar-btn-hover-bg);
1219
+ border-color: var(--npe-toolbar-btn-active-text);
1220
+ }
1221
+
1222
+ .npe-special-char-btn:focus-visible {
1223
+ outline: none;
1224
+ box-shadow: var(--npe-focus-ring);
1225
+ }
1226
+
1227
+ .npe-emoji-empty {
1228
+ color: var(--npe-chrome-text-muted);
1229
+ text-align: center;
1230
+ padding: 12px 0;
1231
+ font-size: var(--npe-font-size);
1232
+ }
1233
+
1234
+ /* ─── Table Context Menu ────────────────────────────────────────────────────── */
1235
+ .npe-context-menu {
1236
+ background: var(--npe-toolbar-bg);
1237
+ border: 1px solid var(--npe-chrome-border);
1238
+ border-radius: 4px;
1239
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);
1240
+ min-width: 180px;
1241
+ padding: 4px 0;
1242
+ font-family: var(--npe-font);
1243
+ font-size: var(--npe-font-size);
1244
+ }
1245
+
1246
+ .npe-context-menu-item {
1247
+ display: block;
1248
+ width: 100%;
1249
+ padding: 7px 14px;
1250
+ text-align: left;
1251
+ background: none;
1252
+ border: none;
1253
+ color: var(--npe-chrome-text);
1254
+ cursor: pointer;
1255
+ font-family: var(--npe-font);
1256
+ font-size: var(--npe-font-size);
1257
+ white-space: nowrap;
1258
+ }
1259
+
1260
+ .npe-context-menu-item:hover,
1261
+ .npe-context-menu-item:focus {
1262
+ background: var(--npe-toolbar-btn-hover-bg);
1263
+ outline: none;
1264
+ }
1265
+
1266
+ .npe-context-menu-item:focus-visible {
1267
+ box-shadow: inset var(--npe-focus-ring);
1268
+ }
1269
+
1270
+ .npe-context-menu-sep {
1271
+ height: 1px;
1272
+ background: var(--npe-chrome-border);
1273
+ margin: 4px 0;
1274
+ }
1275
+
1276
+ /* ─── Table Column Resize Handle ────────────────────────────────────────────── */
1277
+ .npe-col-resize-handle {
1278
+ background: var(--npe-toolbar-btn-active-text);
1279
+ opacity: 0.5;
1280
+ pointer-events: all;
1281
+ transition: opacity 0.15s;
1282
+ }
1283
+
1284
+ .npe-col-resize-handle:hover {
1285
+ opacity: 0.9;
1286
+ }
1287
+
1288
+ /* ─── Find & Replace Modal (additional layout) ──────────────────────────────── */
1289
+ .npe-find-replace-modal {
1290
+ min-width: 380px;
1291
+ }
1292
+
1293
+ .npe-fr-options {
1294
+ display: flex;
1295
+ gap: 16px;
1296
+ flex-wrap: wrap;
1297
+ }
1298
+
1299
+ /* ─── Source Modal (additional layout) ──────────────────────────────────────── */
1300
+ .npe-source-modal {
1301
+ min-width: 520px;
1302
+ max-width: 80vw;
1303
+ width: 600px;
1304
+ }
1305
+
1306
+ .npe-source-panel {
1307
+ display: flex;
1308
+ flex-direction: column;
1309
+ }
1310
+
1311
+ .npe-source-textarea {
1312
+ width: 100%;
1313
+ min-height: 280px;
1314
+ resize: vertical;
1315
+ padding: 10px 12px;
1316
+ border: 1px solid var(--npe-chrome-border);
1317
+ border-radius: 4px;
1318
+ background: var(--npe-canvas-bg);
1319
+ color: var(--npe-chrome-text);
1320
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
1321
+ font-size: 12px;
1322
+ line-height: 1.5;
1323
+ tab-size: 2;
1324
+ box-sizing: border-box;
1325
+ }
1326
+
1327
+ .npe-source-textarea:focus-visible {
1328
+ outline: none;
1329
+ box-shadow: var(--npe-focus-ring);
1330
+ border-color: var(--npe-toolbar-btn-active-text);
1331
+ }
1332
+
1333
+
1334
+ /* ═══════════════════════════════════════════════════════════════════════════
1335
+ TASK 7 — Overlays: Image/Video Resize, Floating Toolbar, Block Drag-Drop
1336
+ ═══════════════════════════════════════════════════════════════════════════ */
1337
+
1338
+ /* ─── Image / Video Selection Border ───────────────────────────────────────── */
1339
+ .npe-img-select-border {
1340
+ position: fixed;
1341
+ box-sizing: border-box;
1342
+ border: 2px solid var(--npe-toolbar-btn-active-text, #0057cc);
1343
+ border-radius: 2px;
1344
+ pointer-events: none;
1345
+ z-index: 10100;
1346
+ }
1347
+
1348
+ /* ─── Image / Video Resize Handles ─────────────────────────────────────────── */
1349
+ .npe-img-resize-handle {
1350
+ position: fixed;
1351
+ width: 8px;
1352
+ height: 8px;
1353
+ background: var(--npe-toolbar-bg, #fff);
1354
+ border: 2px solid var(--npe-toolbar-btn-active-text, #0057cc);
1355
+ border-radius: 2px;
1356
+ box-sizing: border-box;
1357
+ z-index: 10101;
1358
+ pointer-events: all;
1359
+ }
1360
+
1361
+ /* Cursor per handle position */
1362
+ .npe-img-handle-nw { cursor: nw-resize; }
1363
+ .npe-img-handle-n { cursor: n-resize; }
1364
+ .npe-img-handle-ne { cursor: ne-resize; }
1365
+ .npe-img-handle-e { cursor: e-resize; }
1366
+ .npe-img-handle-se { cursor: se-resize; }
1367
+ .npe-img-handle-s { cursor: s-resize; }
1368
+ .npe-img-handle-sw { cursor: sw-resize; }
1369
+ .npe-img-handle-w { cursor: w-resize; }
1370
+
1371
+ /* ─── Image / Video Live Size Label ────────────────────────────────────────── */
1372
+ .npe-img-size-label {
1373
+ position: fixed;
1374
+ background: rgba(0, 0, 0, 0.72);
1375
+ color: #fff;
1376
+ font-size: 11px;
1377
+ font-family: var(--npe-font, system-ui, sans-serif);
1378
+ padding: 2px 7px;
1379
+ border-radius: 3px;
1380
+ pointer-events: none;
1381
+ z-index: 10102;
1382
+ white-space: nowrap;
1383
+ user-select: none;
1384
+ }
1385
+
1386
+ /* ─── Image / Video Contextual Mini-Toolbar ─────────────────────────────────── */
1387
+ .npe-img-toolbar {
1388
+ position: fixed;
1389
+ display: flex;
1390
+ align-items: center;
1391
+ gap: 2px;
1392
+ background: var(--npe-toolbar-bg, #fff);
1393
+ border: 1px solid var(--npe-chrome-border, #d0d0d0);
1394
+ border-radius: 4px;
1395
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.18);
1396
+ padding: 3px 5px;
1397
+ z-index: 10103;
1398
+ pointer-events: all;
1399
+ user-select: none;
1400
+ }
1401
+
1402
+ .npe-img-toolbar-btn {
1403
+ display: inline-flex;
1404
+ align-items: center;
1405
+ justify-content: center;
1406
+ width: 26px;
1407
+ height: 26px;
1408
+ background: transparent;
1409
+ border: 1px solid transparent;
1410
+ border-radius: 3px;
1411
+ cursor: pointer;
1412
+ font-size: 14px;
1413
+ line-height: 1;
1414
+ color: var(--npe-chrome-text, #222);
1415
+ padding: 0;
1416
+ font-family: var(--npe-font, system-ui, sans-serif);
1417
+ transition: background 0.1s;
1418
+ }
1419
+
1420
+ .npe-img-toolbar-btn:hover {
1421
+ background: var(--npe-toolbar-btn-hover-bg, #e8e8e8);
1422
+ border-color: var(--npe-chrome-border, #d0d0d0);
1423
+ }
1424
+
1425
+ .npe-img-toolbar-btn:focus-visible {
1426
+ outline: none;
1427
+ box-shadow: var(--npe-focus-ring, 0 0 0 2px #0057cc66);
1428
+ }
1429
+
1430
+ .npe-img-drag-handle {
1431
+ cursor: grab;
1432
+ font-size: 16px;
1433
+ letter-spacing: -1px;
1434
+ color: var(--npe-chrome-text-muted, #666);
1435
+ }
1436
+
1437
+ .npe-img-drag-handle:active {
1438
+ cursor: grabbing;
1439
+ }
1440
+
1441
+ .npe-img-delete-btn:hover {
1442
+ background: #fde0e0;
1443
+ border-color: #cc3333;
1444
+ color: #cc3333;
1445
+ }
1446
+
1447
+ /* ─── Floating Selection Toolbar ────────────────────────────────────────────── */
1448
+ .npe-floating-toolbar {
1449
+ position: fixed;
1450
+ display: flex;
1451
+ align-items: center;
1452
+ gap: 2px;
1453
+ background: var(--npe-toolbar-bg, #fff);
1454
+ border: 1px solid var(--npe-chrome-border, #d0d0d0);
1455
+ border-radius: 5px;
1456
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.2);
1457
+ padding: 3px 5px;
1458
+ z-index: 10200;
1459
+ pointer-events: all;
1460
+ user-select: none;
1461
+ /* Subtle entrance animation */
1462
+ animation: npe-ftb-appear 0.12s ease-out both;
1463
+ }
1464
+
1465
+ @keyframes npe-ftb-appear {
1466
+ from { opacity: 0; transform: translateY(4px); }
1467
+ to { opacity: 1; transform: translateY(0); }
1468
+ }
1469
+
1470
+ .npe-floating-toolbar-btn {
1471
+ display: inline-flex;
1472
+ align-items: center;
1473
+ justify-content: center;
1474
+ min-width: 26px;
1475
+ height: 26px;
1476
+ background: transparent;
1477
+ border: 1px solid transparent;
1478
+ border-radius: 3px;
1479
+ cursor: pointer;
1480
+ font-size: 13px;
1481
+ line-height: 1;
1482
+ color: var(--npe-chrome-text, #222);
1483
+ padding: 0 4px;
1484
+ font-family: var(--npe-font, system-ui, sans-serif);
1485
+ transition: background 0.1s;
1486
+ }
1487
+
1488
+ .npe-floating-toolbar-btn:hover {
1489
+ background: var(--npe-toolbar-btn-hover-bg, #e8e8e8);
1490
+ border-color: var(--npe-chrome-border, #d0d0d0);
1491
+ }
1492
+
1493
+ .npe-floating-toolbar-btn:focus-visible {
1494
+ outline: none;
1495
+ box-shadow: var(--npe-focus-ring, 0 0 0 2px #0057cc66);
1496
+ }
1497
+
1498
+ .npe-floating-toolbar-sep {
1499
+ display: inline-block;
1500
+ width: 1px;
1501
+ height: 18px;
1502
+ background: var(--npe-toolbar-separator, #d0d0d0);
1503
+ margin: 0 3px;
1504
+ flex-shrink: 0;
1505
+ }
1506
+
1507
+ /* ─── Block Drag Ghost ──────────────────────────────────────────────────────── */
1508
+ .npe-block-drag-ghost {
1509
+ background: var(--npe-toolbar-btn-active-bg, #d0e4ff);
1510
+ border: 2px dashed var(--npe-toolbar-btn-active-text, #0057cc);
1511
+ border-radius: 3px;
1512
+ opacity: 0.7;
1513
+ pointer-events: none;
1514
+ z-index: 20000;
1515
+ }
1516
+
1517
+ /* ─── Drop Placeholder (rendered inside iframe via injected style) ───────────
1518
+ The placeholder itself is a <div> injected into the iframe document.
1519
+ Its styles must be applied inline (since we can't inject host CSS into iframe).
1520
+ The .npe-drop-placeholder class is kept here for documentation purposes only —
1521
+ styles are set inline in BlockDragDrop._showPlaceholder().
1522
+ ────────────────────────────────────────────────────────────────────────────── */
1523
+
1524
+
1525
+ /* ═══════════════════════════════════════════════════════════════════════════
1526
+ TASK 9 — Help Panel / Keyboard Shortcuts
1527
+ ═══════════════════════════════════════════════════════════════════════════ */
1528
+
1529
+ .npe-help-panel {
1530
+ min-width: 360px;
1531
+ max-width: 520px;
1532
+ }
1533
+
1534
+ .npe-help-body {
1535
+ padding: 0;
1536
+ }
1537
+
1538
+ .npe-help-table {
1539
+ width: 100%;
1540
+ border-collapse: collapse;
1541
+ font-size: var(--npe-font-size);
1542
+ }
1543
+
1544
+ .npe-help-table tr:not(:last-child) td {
1545
+ border-bottom: 1px solid var(--npe-chrome-border);
1546
+ }
1547
+
1548
+ .npe-help-key,
1549
+ .npe-help-action {
1550
+ padding: 7px 8px;
1551
+ color: var(--npe-chrome-text);
1552
+ }
1553
+
1554
+ .npe-help-key {
1555
+ white-space: nowrap;
1556
+ width: 1%;
1557
+ }
1558
+
1559
+ .npe-help-key kbd {
1560
+ display: inline-block;
1561
+ background: var(--npe-chrome-bg);
1562
+ border: 1px solid var(--npe-chrome-border);
1563
+ border-radius: 3px;
1564
+ padding: 1px 6px;
1565
+ font-family: var(--npe-font);
1566
+ font-size: 12px;
1567
+ color: var(--npe-chrome-text);
1568
+ box-shadow: 0 1px 0 var(--npe-chrome-border);
1569
+ }
1570
+
1571
+ /* ─── Statusbar label/value spacing ────────────────────────────────────────── */
1572
+ .npe-statusbar-label {
1573
+ color: var(--npe-statusbar-text);
1574
+ margin-right: 4px;
1575
+ }
1576
+
1577
+ .npe-statusbar-value {
1578
+ color: var(--npe-chrome-text);
1579
+ font-weight: 500;
1580
+ }