@lumir-company/editor 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css CHANGED
@@ -39,6 +39,20 @@
39
39
  "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", sans-serif;
40
40
  }
41
41
 
42
+ /* 링크 스타일 - Tailwind Preflight 리셋 복원 */
43
+ .lumirEditor .bn-editor a,
44
+ .lumirEditor .bn-inline-content a {
45
+ color: #0b6e99;
46
+ text-decoration: underline;
47
+ text-underline-offset: 2px;
48
+ cursor: pointer;
49
+ }
50
+
51
+ .lumirEditor .bn-editor a:hover,
52
+ .lumirEditor .bn-inline-content a:hover {
53
+ color: #0b6e99;
54
+ }
55
+
42
56
  /* CSS 변수를 사용한 패딩 설정 */
43
57
  .lumirEditor .bn-editor {
44
58
  padding-left: 25px;
@@ -52,6 +66,23 @@
52
66
  font-size: 14px;
53
67
  }
54
68
 
69
+ .lumirEditor .bn-block-content {
70
+ max-width: 100%;
71
+ }
72
+
73
+ /* 정렬된 블록의 인라인 콘텐츠 - 빈 블록에서 스크롤 방지 */
74
+ .lumirEditor .bn-inline-content {
75
+ overflow: hidden;
76
+ max-width: 100%;
77
+ min-width: 0;
78
+ }
79
+
80
+ /* 우측 정렬 시 빈 블록 placeholder 위치 수정 */
81
+ .lumirEditor [data-text-alignment="right"] .bn-inline-content::before {
82
+ position: relative;
83
+ max-width: 100%;
84
+ }
85
+
55
86
  /* 이미지 업로드 로딩 스피너 */
56
87
  .lumirEditor-upload-overlay {
57
88
  position: absolute;
@@ -84,3 +115,850 @@
84
115
  transform: rotate(360deg);
85
116
  }
86
117
  }
118
+
119
+ /* ========================================
120
+ Floating Toolbar 스타일 (컴팩트 + 반응형)
121
+ ======================================== */
122
+
123
+ /* CSS 변수 정의 */
124
+ .lumir-floating-toolbar-wrapper {
125
+ --lumir-bg-light: #fafaf9;
126
+ --lumir-bg-dark: #1c1917;
127
+ --lumir-paper-light: #ffffff;
128
+ --lumir-paper-dark: #292524;
129
+ --lumir-border-light: #e7e5e4;
130
+ --lumir-border-dark: #44403c;
131
+ --lumir-text-light: #1c1917;
132
+ --lumir-text-dark: #fafaf9;
133
+ --lumir-text-muted-light: #78716c;
134
+ --lumir-text-muted-dark: #a8a29e;
135
+ --lumir-hover-light: #f5f5f4;
136
+ --lumir-hover-dark: #44403c;
137
+ --lumir-active-bg: rgba(59, 130, 246, 0.1);
138
+ --lumir-active-color: #3b82f6;
139
+ --lumir-radius-lg: 0.5rem;
140
+ --lumir-radius-md: 0.25rem;
141
+ --lumir-transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
142
+ --lumir-btn-size: 28px;
143
+ --lumir-btn-padding: 6px;
144
+ --lumir-icon-size: 16px;
145
+ }
146
+
147
+ /* Toolbar Wrapper */
148
+ .lumir-floating-toolbar-wrapper {
149
+ width: 100%;
150
+ display: flex;
151
+ justify-content: center;
152
+ padding: 8px 12px;
153
+ z-index: 40;
154
+ }
155
+
156
+ /* 최소화 모드일 때는 좌측 상단 배치 */
157
+ .lumir-floating-toolbar-wrapper.is-minimizable {
158
+ justify-content: flex-start;
159
+ padding: 0;
160
+ }
161
+
162
+ .lumir-floating-toolbar-wrapper[data-position="sticky"] {
163
+ position: sticky;
164
+ top: 0;
165
+ }
166
+
167
+ .lumir-floating-toolbar-wrapper[data-position="fixed"] {
168
+ position: fixed;
169
+ top: 64px;
170
+ left: 0;
171
+ right: 0;
172
+ }
173
+
174
+ /* Toolbar Container - 항상 밝은 배경 유지 */
175
+ .lumir-floating-toolbar {
176
+ display: flex;
177
+ flex-wrap: wrap;
178
+ align-items: center;
179
+ gap: 2px;
180
+ padding: 4px;
181
+ background-color: #ffffff !important;
182
+ border: 1px solid #e5e7eb !important;
183
+ border-radius: var(--lumir-radius-lg);
184
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
185
+ max-width: 100%;
186
+ font-family: ui-sans-serif, system-ui, sans-serif;
187
+ font-size: 13px;
188
+ }
189
+
190
+ /* 1단 레이아웃 (넓은 화면) */
191
+ .lumir-floating-toolbar {
192
+ flex-wrap: nowrap;
193
+ }
194
+
195
+ /* 2단 레이아웃 (좁은 화면) */
196
+ .lumir-floating-toolbar.is-compact {
197
+ flex-wrap: wrap;
198
+ justify-content: center;
199
+ }
200
+
201
+ .lumir-floating-toolbar.is-compact .lumir-toolbar-row {
202
+ display: flex;
203
+ align-items: center;
204
+ width: 100%;
205
+ justify-content: center;
206
+ gap: 2px;
207
+ }
208
+
209
+ .lumir-floating-toolbar.is-compact .lumir-toolbar-row:not(:last-child) {
210
+ padding-bottom: 4px;
211
+ border-bottom: 1px solid var(--lumir-border-light);
212
+ margin-bottom: 4px;
213
+ }
214
+
215
+ /* 최소화 가능 레이아웃 (400px 이하) */
216
+ .lumir-floating-toolbar.is-minimizable {
217
+ flex-wrap: wrap; /* 여러 줄로 확장 가능 */
218
+ justify-content: flex-start; /* 좌측 정렬 */
219
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
220
+ padding: 0; /* 내부 공백 제거 */
221
+ }
222
+
223
+ /* 토글 버튼 스타일 */
224
+ .lumir-floating-toolbar.is-minimizable .lumir-toggle-button {
225
+ order: -1; /* 항상 맨 앞에 배치 */
226
+ flex-shrink: 0;
227
+ width: 24px; /* 컴팩트한 크기 */
228
+ height: 24px;
229
+ padding: 0; /* 패딩 제거하여 정확한 정렬 */
230
+ margin: 0;
231
+ border-radius: 4px;
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ cursor: pointer;
236
+ transition: transform 0.2s ease;
237
+ }
238
+
239
+ .lumir-floating-toolbar.is-minimizable .lumir-toggle-button:hover {
240
+ transform: scale(1.1);
241
+ }
242
+
243
+ .lumir-floating-toolbar.is-minimizable .lumir-toggle-button svg {
244
+ width: 16px;
245
+ height: 16px;
246
+ display: block; /* inline 여백 제거 */
247
+ transition: transform 0.3s ease;
248
+ }
249
+
250
+ /* 메뉴 항목 애니메이션 */
251
+ .lumir-floating-toolbar.is-minimizable > *:not(.lumir-toggle-button) {
252
+ opacity: 1;
253
+ transform: translateX(0);
254
+ transition: opacity 0.3s ease, transform 0.3s ease;
255
+ }
256
+
257
+ /* 최소화 상태 - 토글 버튼만 표시 */
258
+ .lumir-floating-toolbar.is-minimizable.is-minimized {
259
+ width: auto;
260
+ min-width: 24px;
261
+ padding: 0;
262
+ border: none;
263
+ background: transparent !important;
264
+ box-shadow: none;
265
+ }
266
+
267
+ .lumir-floating-toolbar.is-minimizable.is-minimized > *:not(.lumir-toggle-button) {
268
+ opacity: 0;
269
+ transform: translateX(-10px);
270
+ pointer-events: none;
271
+ max-width: 0;
272
+ overflow: hidden;
273
+ margin: 0;
274
+ padding: 0;
275
+ }
276
+
277
+ /* Toolbar Group */
278
+ .lumir-toolbar-group {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 1px;
282
+ padding: 0 2px;
283
+ }
284
+
285
+ /* Divider */
286
+ .lumir-toolbar-divider {
287
+ width: 1px;
288
+ height: 18px;
289
+ background-color: var(--lumir-border-light);
290
+ margin: 0 2px;
291
+ flex-shrink: 0;
292
+ }
293
+
294
+ /* 2단에서 divider 숨기기 */
295
+ .lumir-floating-toolbar.is-compact .lumir-toolbar-divider.row-break {
296
+ display: none;
297
+ }
298
+
299
+ /* Toolbar Button (컴팩트) */
300
+ .lumir-toolbar-btn {
301
+ display: flex;
302
+ align-items: center;
303
+ justify-content: center;
304
+ width: var(--lumir-btn-size);
305
+ height: var(--lumir-btn-size);
306
+ padding: var(--lumir-btn-padding);
307
+ border: none;
308
+ background: transparent;
309
+ color: var(--lumir-text-muted-light);
310
+ cursor: pointer;
311
+ border-radius: var(--lumir-radius-md);
312
+ transition: all var(--lumir-transition);
313
+ position: relative;
314
+ flex-shrink: 0;
315
+ }
316
+
317
+ .lumir-toolbar-btn svg {
318
+ width: var(--lumir-icon-size);
319
+ height: var(--lumir-icon-size);
320
+ }
321
+
322
+ .lumir-toolbar-btn:hover {
323
+ background-color: var(--lumir-hover-light);
324
+ color: var(--lumir-text-light);
325
+ }
326
+
327
+ .lumir-toolbar-btn.is-active {
328
+ background-color: var(--lumir-active-bg);
329
+ color: var(--lumir-active-color);
330
+ }
331
+
332
+ .lumir-toolbar-btn:disabled {
333
+ opacity: 0.4;
334
+ cursor: not-allowed;
335
+ }
336
+
337
+ /* 색상 버튼 인디케이터 */
338
+ .lumir-color-btn {
339
+ flex-direction: column;
340
+ gap: 1px;
341
+ width: var(--lumir-btn-size);
342
+ height: var(--lumir-btn-size);
343
+ padding: 4px;
344
+ }
345
+
346
+ .lumir-color-btn svg {
347
+ width: 14px;
348
+ height: 14px;
349
+ }
350
+
351
+ .lumir-color-indicator {
352
+ width: 12px;
353
+ height: 2px;
354
+ border-radius: 1px;
355
+ border: 1px solid rgba(0, 0, 0, 0.1);
356
+ }
357
+
358
+ /* SVG 아이콘 스타일 */
359
+ .lumir-toolbar-btn svg,
360
+ .lumir-dropdown-btn svg {
361
+ flex-shrink: 0;
362
+ }
363
+
364
+ /* Dropdown Wrapper */
365
+ .lumir-dropdown-wrapper {
366
+ position: relative;
367
+ }
368
+
369
+ /* Dropdown Button (컴팩트) */
370
+ .lumir-dropdown-btn {
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: space-between;
374
+ min-width: 90px;
375
+ max-width: 110px;
376
+ height: var(--lumir-btn-size);
377
+ padding: 4px 8px;
378
+ border: none;
379
+ background: transparent;
380
+ color: inherit;
381
+ cursor: pointer;
382
+ border-radius: var(--lumir-radius-md);
383
+ font-size: 12px;
384
+ font-weight: 500;
385
+ transition: all var(--lumir-transition);
386
+ gap: 2px;
387
+ white-space: nowrap;
388
+ overflow: hidden;
389
+ }
390
+
391
+ .lumir-dropdown-btn span {
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ }
395
+
396
+ .lumir-dropdown-btn:hover {
397
+ background-color: var(--lumir-hover-light);
398
+ }
399
+
400
+ .lumir-dropdown-btn svg {
401
+ width: 14px;
402
+ height: 14px;
403
+ flex-shrink: 0;
404
+ color: var(--lumir-text-muted-light);
405
+ }
406
+
407
+ /* Dropdown Menu - 항상 밝은 배경 유지 */
408
+ .lumir-dropdown-menu {
409
+ position: absolute;
410
+ top: calc(100% + 4px);
411
+ left: 0;
412
+ min-width: 160px;
413
+ background-color: #ffffff !important;
414
+ border: 1px solid #e5e7eb !important;
415
+ border-radius: 10px;
416
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.04);
417
+ z-index: 9999;
418
+ padding: 6px;
419
+ animation: lumir-dropdown-appear 0.15s ease;
420
+ }
421
+
422
+ @keyframes lumir-dropdown-appear {
423
+ from {
424
+ opacity: 0;
425
+ transform: translateY(-4px);
426
+ }
427
+ to {
428
+ opacity: 1;
429
+ transform: translateY(0);
430
+ }
431
+ }
432
+
433
+ /* Dropdown Item - 항상 밝은 스타일 */
434
+ .lumir-dropdown-item {
435
+ display: flex;
436
+ align-items: center;
437
+ width: 100%;
438
+ padding: 8px 12px;
439
+ text-align: left;
440
+ border: none;
441
+ background: transparent;
442
+ color: #374151 !important;
443
+ cursor: pointer;
444
+ border-radius: 6px;
445
+ font-size: 14px;
446
+ transition: background-color 0.1s ease;
447
+ }
448
+
449
+ .lumir-dropdown-item:hover {
450
+ background-color: #f3f4f6 !important;
451
+ }
452
+
453
+ .lumir-dropdown-item.is-active {
454
+ background-color: rgba(59, 130, 246, 0.1) !important;
455
+ color: #3b82f6 !important;
456
+ }
457
+
458
+ /* Block Type Dropdown Button */
459
+ .lumir-block-type-btn {
460
+ min-width: 110px;
461
+ max-width: 130px;
462
+ gap: 4px;
463
+ padding: 4px 8px;
464
+ }
465
+
466
+ .lumir-block-icon {
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ width: 22px;
471
+ height: 22px;
472
+ flex-shrink: 0;
473
+ color: #6b7280;
474
+ }
475
+
476
+ .lumir-block-icon svg {
477
+ width: 18px;
478
+ height: 18px;
479
+ }
480
+
481
+ .lumir-block-icon-text {
482
+ font-size: 13px;
483
+ font-weight: 700;
484
+ color: #6b7280;
485
+ line-height: 1;
486
+ }
487
+
488
+ .lumir-block-label {
489
+ flex: 1;
490
+ text-align: left;
491
+ overflow: hidden;
492
+ text-overflow: ellipsis;
493
+ white-space: nowrap;
494
+ font-size: 13px;
495
+ }
496
+
497
+ /* Block Type Dropdown Menu - 최대 컴팩트 */
498
+ .lumir-block-menu {
499
+ min-width: 160px;
500
+ max-height: 320px;
501
+ overflow-y: auto;
502
+ padding: 3px;
503
+ }
504
+
505
+ /* 커스텀 스크롤바 - 더 얇게 */
506
+ .lumir-block-menu::-webkit-scrollbar {
507
+ width: 4px;
508
+ }
509
+
510
+ .lumir-block-menu::-webkit-scrollbar-track {
511
+ background: transparent;
512
+ }
513
+
514
+ .lumir-block-menu::-webkit-scrollbar-thumb {
515
+ background-color: #d1d5db;
516
+ border-radius: 2px;
517
+ }
518
+
519
+ .lumir-block-menu::-webkit-scrollbar-thumb:hover {
520
+ background-color: #9ca3af;
521
+ }
522
+
523
+ /* Block Type Menu Item - 최대 컴팩트 */
524
+ .lumir-block-item {
525
+ display: flex;
526
+ align-items: center;
527
+ gap: 6px;
528
+ padding: 4px 8px;
529
+ border-radius: 4px;
530
+ margin-bottom: 0;
531
+ transition: all 0.1s ease;
532
+ }
533
+
534
+ .lumir-block-item:last-child {
535
+ margin-bottom: 0;
536
+ }
537
+
538
+ .lumir-block-item .lumir-block-icon {
539
+ width: 20px;
540
+ height: 20px;
541
+ background-color: #f3f4f6;
542
+ border-radius: 3px;
543
+ display: flex;
544
+ align-items: center;
545
+ justify-content: center;
546
+ flex-shrink: 0;
547
+ }
548
+
549
+ .lumir-block-item .lumir-block-icon svg {
550
+ width: 14px;
551
+ height: 14px;
552
+ }
553
+
554
+ .lumir-block-item .lumir-block-icon-text {
555
+ font-size: 10px;
556
+ font-weight: 700;
557
+ }
558
+
559
+ .lumir-block-item-title {
560
+ font-size: 12px;
561
+ font-weight: 500;
562
+ color: #374151;
563
+ }
564
+
565
+ .lumir-block-item:hover {
566
+ background-color: #f3f4f6 !important;
567
+ }
568
+
569
+ .lumir-block-item:hover .lumir-block-icon {
570
+ background-color: #e5e7eb;
571
+ color: #374151;
572
+ }
573
+
574
+ .lumir-block-item:hover .lumir-block-icon-text {
575
+ color: #374151;
576
+ }
577
+
578
+ .lumir-block-item.is-active {
579
+ background-color: rgba(59, 130, 246, 0.08) !important;
580
+ }
581
+
582
+ .lumir-block-item.is-active .lumir-block-icon {
583
+ background-color: rgba(59, 130, 246, 0.15);
584
+ color: #3b82f6;
585
+ }
586
+
587
+ .lumir-block-item.is-active .lumir-block-icon-text {
588
+ color: #3b82f6;
589
+ }
590
+
591
+ /* Block Type Category - 최대 컴팩트 */
592
+ .lumir-block-category {
593
+ margin-bottom: 2px;
594
+ }
595
+
596
+ .lumir-block-category:last-child {
597
+ margin-bottom: 0;
598
+ }
599
+
600
+ .lumir-block-category-title {
601
+ font-size: 9px;
602
+ font-weight: 600;
603
+ color: #9ca3af;
604
+ text-transform: uppercase;
605
+ letter-spacing: 0.05em;
606
+ padding: 4px 8px 2px;
607
+ margin-bottom: 0;
608
+ }
609
+
610
+ /* Block Item Title */
611
+ .lumir-block-item:hover .lumir-block-item-title {
612
+ color: #1f2937;
613
+ }
614
+
615
+ .lumir-block-item.is-active .lumir-block-item-title {
616
+ color: #3b82f6;
617
+ font-weight: 600;
618
+ }
619
+
620
+ /* Toggle Heading 아이콘 - 컴팩트 */
621
+ .lumir-block-icon-toggle {
622
+ display: flex;
623
+ align-items: center;
624
+ gap: 2px;
625
+ font-size: 9px;
626
+ font-weight: 700;
627
+ color: #6b7280;
628
+ line-height: 1;
629
+ }
630
+
631
+ .lumir-block-icon-toggle svg {
632
+ width: 6px;
633
+ height: 6px;
634
+ flex-shrink: 0;
635
+ }
636
+
637
+ .lumir-block-icon-toggle span {
638
+ font-size: 9px;
639
+ font-weight: 700;
640
+ }
641
+
642
+ .lumir-block-item .lumir-block-icon-toggle {
643
+ font-size: 10px;
644
+ }
645
+
646
+ .lumir-block-item .lumir-block-icon-toggle svg {
647
+ width: 7px;
648
+ height: 7px;
649
+ }
650
+
651
+ .lumir-block-item .lumir-block-icon-toggle span {
652
+ font-size: 10px;
653
+ }
654
+
655
+ .lumir-block-item:hover .lumir-block-icon-toggle,
656
+ .lumir-block-item.is-active .lumir-block-icon-toggle {
657
+ color: inherit;
658
+ }
659
+
660
+ /* Color Picker Menu */
661
+ .lumir-color-menu {
662
+ min-width: 180px;
663
+ padding: 8px;
664
+ }
665
+
666
+ .lumir-color-grid {
667
+ display: grid;
668
+ grid-template-columns: repeat(5, 1fr);
669
+ gap: 6px;
670
+ }
671
+
672
+ .lumir-color-swatch {
673
+ width: 28px;
674
+ height: 28px;
675
+ border: 1px solid rgba(0, 0, 0, 0.15);
676
+ border-radius: 4px;
677
+ cursor: pointer;
678
+ transition: all 0.15s ease;
679
+ position: relative;
680
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
681
+ }
682
+
683
+ .lumir-color-swatch:hover {
684
+ transform: scale(1.15);
685
+ border-color: #3b82f6;
686
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
687
+ z-index: 1;
688
+ }
689
+
690
+ .lumir-color-swatch.is-active {
691
+ border-color: #3b82f6;
692
+ border-width: 2px;
693
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
694
+ }
695
+
696
+ .lumir-color-swatch.is-active::after {
697
+ content: '✓';
698
+ position: absolute;
699
+ top: 50%;
700
+ left: 50%;
701
+ transform: translate(-50%, -50%);
702
+ color: #ffffff;
703
+ font-size: 12px;
704
+ font-weight: bold;
705
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
706
+ }
707
+
708
+ .lumir-color-remove {
709
+ width: 100%;
710
+ padding: 6px 8px;
711
+ border: none;
712
+ background-color: #f3f4f6;
713
+ color: #6b7280;
714
+ font-size: 11px;
715
+ font-weight: 500;
716
+ border-radius: 4px;
717
+ cursor: pointer;
718
+ transition: all 0.15s ease;
719
+ }
720
+
721
+ .lumir-color-remove:hover {
722
+ background-color: #e5e7eb;
723
+ color: #374151;
724
+ }
725
+
726
+ /* Text Controls Group */
727
+ .lumir-text-controls {
728
+ gap: 8px;
729
+ }
730
+
731
+ /* Link Input Menu - Compact */
732
+ .lumir-link-menu {
733
+ min-width: 240px;
734
+ padding: 8px;
735
+ left: auto;
736
+ right: 0;
737
+ }
738
+
739
+ .lumir-link-form {
740
+ display: flex;
741
+ flex-direction: column;
742
+ gap: 6px;
743
+ }
744
+
745
+ .lumir-link-input {
746
+ width: 100%;
747
+ padding: 6px 8px;
748
+ border: 1px solid #d1d5db;
749
+ border-radius: 4px;
750
+ font-size: 12px;
751
+ font-family: inherit;
752
+ outline: none;
753
+ transition: all 0.15s ease;
754
+ }
755
+
756
+ .lumir-link-input:focus {
757
+ border-color: #3b82f6;
758
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
759
+ }
760
+
761
+ .lumir-link-input::placeholder {
762
+ color: #9ca3af;
763
+ font-size: 11px;
764
+ }
765
+
766
+ .lumir-link-actions {
767
+ display: flex;
768
+ gap: 4px;
769
+ justify-content: flex-end;
770
+ }
771
+
772
+ .lumir-link-btn {
773
+ padding: 4px 10px;
774
+ border: none;
775
+ border-radius: 4px;
776
+ font-size: 11px;
777
+ font-weight: 500;
778
+ cursor: pointer;
779
+ transition: all 0.15s ease;
780
+ }
781
+
782
+ .lumir-link-cancel {
783
+ background-color: #f3f4f6;
784
+ color: #6b7280;
785
+ }
786
+
787
+ .lumir-link-cancel:hover {
788
+ background-color: #e5e7eb;
789
+ color: #374151;
790
+ }
791
+
792
+ .lumir-link-submit {
793
+ background-color: #3b82f6;
794
+ color: #ffffff;
795
+ }
796
+
797
+ .lumir-link-submit:hover:not(:disabled) {
798
+ background-color: #2563eb;
799
+ }
800
+
801
+ .lumir-link-submit:disabled {
802
+ opacity: 0.5;
803
+ cursor: not-allowed;
804
+ }
805
+
806
+ /*
807
+ * 플로팅 툴바는 다크모드와 관계없이 항상 밝은 스타일 유지
808
+ * 다크모드 오버라이드를 적용하지 않음
809
+ */
810
+
811
+ /* ========================================
812
+ 에러 토스트 스타일
813
+ ======================================== */
814
+
815
+ .lumirEditor-error-toast {
816
+ position: absolute;
817
+ bottom: 16px;
818
+ left: 50%;
819
+ transform: translateX(-50%);
820
+ display: flex;
821
+ align-items: center;
822
+ gap: 8px;
823
+ padding: 12px 16px;
824
+ background-color: #fef2f2;
825
+ border: 1px solid #fecaca;
826
+ border-radius: 8px;
827
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
828
+ z-index: 1001;
829
+ animation: lumirEditor-toast-appear 0.3s ease;
830
+ max-width: 90%;
831
+ }
832
+
833
+ @keyframes lumirEditor-toast-appear {
834
+ from {
835
+ opacity: 0;
836
+ transform: translateX(-50%) translateY(10px);
837
+ }
838
+ to {
839
+ opacity: 1;
840
+ transform: translateX(-50%) translateY(0);
841
+ }
842
+ }
843
+
844
+ .lumirEditor-error-icon {
845
+ flex-shrink: 0;
846
+ font-size: 16px;
847
+ }
848
+
849
+ .lumirEditor-error-message {
850
+ font-size: 13px;
851
+ font-weight: 500;
852
+ color: #991b1b;
853
+ line-height: 1.4;
854
+ }
855
+
856
+ .lumirEditor-error-close {
857
+ flex-shrink: 0;
858
+ display: flex;
859
+ align-items: center;
860
+ justify-content: center;
861
+ width: 20px;
862
+ height: 20px;
863
+ padding: 0;
864
+ border: none;
865
+ background: transparent;
866
+ color: #991b1b;
867
+ font-size: 14px;
868
+ cursor: pointer;
869
+ border-radius: 4px;
870
+ transition: background-color 0.15s ease;
871
+ }
872
+
873
+ .lumirEditor-error-close:hover {
874
+ background-color: #fee2e2;
875
+ }
876
+
877
+ /* ========================================
878
+ Link Preview 카드 스타일
879
+ ======================================== */
880
+
881
+ @keyframes lumir-skeleton-pulse {
882
+ 0% {
883
+ opacity: 1;
884
+ }
885
+ 50% {
886
+ opacity: 0.4;
887
+ }
888
+ 100% {
889
+ opacity: 1;
890
+ }
891
+ }
892
+
893
+ .lumir-link-preview-card:hover .lumir-link-preview-delete {
894
+ opacity: 1 !important;
895
+ }
896
+
897
+ .lumir-link-preview-delete:hover {
898
+ background-color: rgba(0, 0, 0, 0.7) !important;
899
+ }
900
+
901
+ .lumir-resize-handle {
902
+ position: absolute;
903
+ width: 8px;
904
+ height: 30px;
905
+ background-color: black;
906
+ border: 1px solid white;
907
+ border-radius: 4px;
908
+ cursor: ew-resize;
909
+ top: 50%;
910
+ transform: translateY(-50%);
911
+ z-index: 3;
912
+ }
913
+
914
+ .lumir-resize-handle-bottom {
915
+ position: absolute;
916
+ bottom: 4px;
917
+ left: 50%;
918
+ transform: translateX(-50%);
919
+ width: 30px;
920
+ height: 8px;
921
+ background-color: black;
922
+ border: 1px solid white;
923
+ border-radius: 4px;
924
+ cursor: ns-resize;
925
+ z-index: 3;
926
+ }
927
+
928
+ .lumir-link-preview-card:hover {
929
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
930
+ }
931
+
932
+ .node-linkPreview.ProseMirror-selectednode .bn-block-content {
933
+ outline: 2px solid #3b82f6;
934
+ outline-offset: 2px;
935
+ border-radius: 8px;
936
+ }
937
+
938
+ .node-linkPreview .bn-block-content {
939
+ outline: none !important;
940
+ }
941
+
942
+ /* 다크 테마 대응 */
943
+ [data-color-scheme="dark"] .lumir-link-preview-card,
944
+ .bn-container[data-color-scheme="dark"] .lumir-link-preview-card {
945
+ background-color: #292524 !important;
946
+ border-color: #44403c !important;
947
+ }
948
+
949
+ [data-color-scheme="dark"] .lumir-link-preview-card:hover,
950
+ .bn-container[data-color-scheme="dark"] .lumir-link-preview-card:hover {
951
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) !important;
952
+ }
953
+
954
+ [data-color-scheme="dark"] .lumir-link-preview-skeleton,
955
+ .bn-container[data-color-scheme="dark"] .lumir-link-preview-skeleton {
956
+ background-color: #292524 !important;
957
+ border-color: #44403c !important;
958
+ }
959
+
960
+ [data-color-scheme="dark"] .lumir-link-preview-error,
961
+ .bn-container[data-color-scheme="dark"] .lumir-link-preview-error {
962
+ background-color: #292524 !important;
963
+ border-color: #44403c !important;
964
+ }