@standhigher/react-email-editor 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -61,6 +61,568 @@
61
61
  }
62
62
 
63
63
 
64
+ /* ---------- 共享表单控件 ---------- */
65
+
66
+ .ree-input {
67
+ width: 100%;
68
+ border: 1px solid var(--ree-border, #e3e3e5);
69
+ border-radius: var(--ree-radius, 8px);
70
+ --ree-control-padding-x: 12px;
71
+ --ree-control-padding-y: 8px;
72
+ --ree-control-padding-end: var(--ree-control-padding-x);
73
+ padding: var(--ree-control-padding-y) var(--ree-control-padding-end) var(--ree-control-padding-y) var(--ree-control-padding-x);
74
+ font-size: 14px;
75
+ line-height: 1.4;
76
+ font-family: inherit;
77
+ color: var(--ree-text, #202223);
78
+ background: var(--ree-panel, #ffffff);
79
+ transition: border-color 0.12s ease, box-shadow 0.12s ease;
80
+ }
81
+
82
+ .ree-input:focus {
83
+ outline: none;
84
+ border: 2px solid #202223;
85
+ padding: max(0px, calc(var(--ree-control-padding-y) - 1px)) calc(var(--ree-control-padding-end) - 1px) max(0px, calc(var(--ree-control-padding-y) - 1px)) calc(var(--ree-control-padding-x) - 1px);
86
+ box-shadow: none;
87
+ }
88
+
89
+ .ree-select {
90
+ display: block;
91
+ min-width: 0;
92
+ width: 100%;
93
+ position: relative;
94
+ }
95
+
96
+ .ree-select .ree-input {
97
+ appearance: none;
98
+ -webkit-appearance: none;
99
+ --ree-control-padding-end: 40px;
100
+ cursor: pointer;
101
+ background-color: var(--ree-panel);
102
+ }
103
+
104
+ .ree-select-icon {
105
+ position: absolute;
106
+ top: 0;
107
+ right: 12px;
108
+ bottom: 0;
109
+ display: flex;
110
+ align-items: center;
111
+ pointer-events: none;
112
+ color: var(--ree-muted);
113
+ }
114
+
115
+ .ree-select.is-compact {
116
+ width: auto;
117
+ flex-shrink: 0;
118
+ }
119
+
120
+ .ree-select.is-compact .ree-input {
121
+ --ree-control-padding-x: 8px;
122
+ --ree-control-padding-y: 0px;
123
+ --ree-control-padding-end: 32px;
124
+ height: 28px;
125
+ font-size: 12px;
126
+ line-height: 1;
127
+ border-radius: 6px;
128
+ }
129
+
130
+ .ree-select.is-compact .ree-select-icon svg {
131
+ width: 12px;
132
+ height: 12px;
133
+ }
134
+
135
+ .ree-color-control {
136
+ display: inline-flex;
137
+ min-width: 0;
138
+ }
139
+
140
+ .ree-color-chip {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ gap: 8px;
144
+ min-width: 0;
145
+ width: fit-content;
146
+ max-width: 100%;
147
+ justify-self: start;
148
+ cursor: pointer;
149
+ appearance: none;
150
+ border: 0;
151
+ padding: 0;
152
+ background: transparent;
153
+ font: inherit;
154
+ }
155
+
156
+ .ree-color-swatch {
157
+ position: relative;
158
+ width: 36px;
159
+ height: 22px;
160
+ flex-shrink: 0;
161
+ }
162
+
163
+ .ree-color-swatch-face {
164
+ display: block;
165
+ width: 100%;
166
+ height: 100%;
167
+ border: 1px solid #d2d5d8;
168
+ border-radius: 999px;
169
+ background: #ffffff;
170
+ }
171
+
172
+ .ree-color-swatch-face.is-empty {
173
+ background:
174
+ linear-gradient(45deg, #e3e3e5 25%, transparent 25%),
175
+ linear-gradient(-45deg, #e3e3e5 25%, transparent 25%),
176
+ linear-gradient(45deg, transparent 75%, #e3e3e5 75%),
177
+ linear-gradient(-45deg, transparent 75%, #e3e3e5 75%);
178
+ background-size: 8px 8px;
179
+ background-position: 0 0, 0 4px, 4px -4px, -4px 0;
180
+ background-color: #ffffff;
181
+ }
182
+
183
+ .ree-color-chip-label {
184
+ min-width: 0;
185
+ overflow-wrap: anywhere;
186
+ color: var(--ree-text);
187
+ font-size: 13px;
188
+ line-height: 1.3;
189
+ }
190
+
191
+ .ree-checkbox-control {
192
+ display: inline-flex;
193
+ align-items: center;
194
+ justify-self: start;
195
+ gap: 8px;
196
+ width: fit-content;
197
+ max-width: 100%;
198
+ cursor: pointer;
199
+ }
200
+
201
+ .ree-checkbox-control input {
202
+ appearance: none;
203
+ display: grid;
204
+ place-items: center;
205
+ flex-shrink: 0;
206
+ width: 16px;
207
+ height: 16px;
208
+ margin: 0;
209
+ border: 1px solid #b5b5b5;
210
+ border-radius: 3px;
211
+ background: #ffffff;
212
+ cursor: pointer;
213
+ }
214
+
215
+ .ree-checkbox-control input:checked {
216
+ border-color: #202223;
217
+ background: #202223;
218
+ }
219
+
220
+ .ree-checkbox-control input:checked::before {
221
+ content: "";
222
+ width: 5px;
223
+ height: 9px;
224
+ margin-top: -2px;
225
+ border: solid #ffffff;
226
+ border-width: 0 2px 2px 0;
227
+ transform: rotate(45deg);
228
+ }
229
+
230
+ .ree-checkbox-control input:focus-visible,
231
+ .ree-color-chip:focus-visible .ree-color-swatch-face {
232
+ border: 2px solid #202223;
233
+ }
234
+
235
+ .ree-checkbox-control input:focus,
236
+ .ree-color-chip:focus {
237
+ outline: none;
238
+ box-shadow: none;
239
+ }
240
+
241
+ .ree-checkbox-control:has(input:disabled) {
242
+ opacity: 0.4;
243
+ cursor: default;
244
+ }
245
+
246
+ .ree-checkbox-control input:disabled,
247
+ .ree-select .ree-input:disabled {
248
+ cursor: default;
249
+ }
250
+
251
+ .ree-switch-control {
252
+ width: 100%;
253
+ justify-content: space-between;
254
+ flex-direction: row-reverse;
255
+ font-size: 13px;
256
+ color: var(--ree-muted, #6d7175);
257
+ }
258
+
259
+ .ree-switch-control input {
260
+ display: flex;
261
+ align-items: center;
262
+ width: 32px;
263
+ height: 20px;
264
+ padding: 2px;
265
+ border: 0;
266
+ border-radius: 999px;
267
+ background: #b5b5b5;
268
+ }
269
+
270
+ .ree-switch-control input::before,
271
+ .ree-switch-control input:checked::before {
272
+ content: "";
273
+ width: 16px;
274
+ height: 16px;
275
+ margin: 0;
276
+ border: 0;
277
+ border-radius: 50%;
278
+ background: #ffffff;
279
+ transform: none;
280
+ }
281
+
282
+ .ree-switch-control input:checked::before {
283
+ transform: translateX(12px);
284
+ }
285
+
286
+ .ree-switch-control input:focus-visible {
287
+ border: 2px solid #202223;
288
+ padding: 0;
289
+ }
290
+
291
+ .ree-range {
292
+ -webkit-appearance: none;
293
+ appearance: none;
294
+ display: block;
295
+ flex: 1 1 auto;
296
+ width: 100%;
297
+ min-width: 0;
298
+ height: 20px;
299
+ margin: 0;
300
+ background: transparent;
301
+ cursor: pointer;
302
+ }
303
+
304
+ .ree-range::-webkit-slider-container {
305
+ width: 100%;
306
+ }
307
+
308
+ .ree-range::-webkit-slider-runnable-track {
309
+ width: 100%;
310
+ height: 4px;
311
+ border: 0;
312
+ border-radius: 999px;
313
+ background: linear-gradient(to right, #303030 0%, #303030 var(--ree-range-progress), #e3e3e5 var(--ree-range-progress), #e3e3e5 100%);
314
+ }
315
+
316
+ .ree-range::-webkit-slider-thumb {
317
+ appearance: none;
318
+ width: 14px;
319
+ height: 14px;
320
+ margin-top: -5px;
321
+ border: 0;
322
+ border-radius: 50%;
323
+ background: #303030;
324
+ }
325
+
326
+ .ree-range::-moz-range-track {
327
+ height: 4px;
328
+ border: 0;
329
+ border-radius: 999px;
330
+ background: #e3e3e5;
331
+ }
332
+
333
+ .ree-range::-moz-range-progress {
334
+ height: 4px;
335
+ border: 0;
336
+ border-radius: 999px;
337
+ background: #303030;
338
+ }
339
+
340
+ .ree-range::-moz-range-thumb {
341
+ width: 14px;
342
+ height: 14px;
343
+ border: 0;
344
+ border-radius: 50%;
345
+ background: #303030;
346
+ }
347
+
348
+ /* ---------- 共享普通按钮 ---------- */
349
+
350
+ .ree-btn {
351
+ appearance: none;
352
+ border: 1px solid #b5b5b5;
353
+ background: var(--ree-panel, #ffffff);
354
+ color: var(--ree-text, #202223);
355
+ border-radius: var(--ree-radius, 8px);
356
+ --ree-button-padding-y: 8px;
357
+ --ree-button-padding-x: 16px;
358
+ padding: var(--ree-button-padding-y) var(--ree-button-padding-x);
359
+ font-size: 14px;
360
+ font-weight: 500;
361
+ line-height: 1.4;
362
+ cursor: pointer;
363
+ font-family: inherit;
364
+ transition: background 0.12s ease, border-color 0.12s ease,
365
+ box-shadow 0.12s ease;
366
+ }
367
+
368
+ .ree-btn:hover {
369
+ background: var(--ree-panel-secondary);
370
+ border-color: var(--ree-border);
371
+ }
372
+
373
+ .ree-btn:active {
374
+ background: #f0f0f1;
375
+ }
376
+
377
+ .ree-btn-primary {
378
+ background: var(--ree-primary, #005bd3);
379
+ border-color: var(--ree-primary, #005bd3);
380
+ color: var(--ree-primary-fg, #ffffff);
381
+ }
382
+
383
+ .ree-btn-primary:hover {
384
+ background: var(--ree-primary-hover);
385
+ border-color: var(--ree-primary-hover);
386
+ }
387
+
388
+ .ree-btn-primary:active {
389
+ background: var(--ree-primary-hover);
390
+ }
391
+
392
+
393
+ .ree-btn:disabled {
394
+ opacity: 0.4;
395
+ cursor: default;
396
+ }
397
+
398
+ .ree-btn-solid {
399
+ background: #202223;
400
+ border-color: #202223;
401
+ color: #ffffff;
402
+ }
403
+
404
+ .ree-btn-solid:hover,
405
+ .ree-btn-solid:active {
406
+ background: #000000;
407
+ border-color: #000000;
408
+ }
409
+
410
+ .ree-btn:focus-visible {
411
+ outline: none;
412
+ box-shadow: none;
413
+ border-width: 2px;
414
+ border-color: #202223;
415
+ padding: calc(var(--ree-button-padding-y) - 1px) calc(var(--ree-button-padding-x) - 1px);
416
+ }
417
+
418
+ .ree-btn-icon {
419
+ display: inline-flex;
420
+ align-items: center;
421
+ justify-content: center;
422
+ flex-shrink: 0;
423
+ width: 30px;
424
+ height: 30px;
425
+ --ree-button-padding-y: 0px;
426
+ --ree-button-padding-x: 0px;
427
+ border-color: transparent;
428
+ border-radius: 6px;
429
+ background: transparent;
430
+ color: var(--ree-muted);
431
+ }
432
+
433
+ .ree-btn-icon:hover {
434
+ border-color: transparent;
435
+ color: var(--ree-text);
436
+ }
437
+
438
+ .ree-btn-icon:focus-visible {
439
+ padding: 0;
440
+ }
441
+
442
+ .ree-btn-has-tooltip {
443
+ position: relative;
444
+ }
445
+
446
+ .ree-block-tooltip,
447
+ .ree-btn-tooltip {
448
+ position: absolute;
449
+ top: calc(100% + 8px);
450
+ left: 0;
451
+ z-index: 10;
452
+ display: none;
453
+ padding: 6px 9px;
454
+ border-radius: var(--ree-radius-sm);
455
+ background: var(--ree-text);
456
+ color: var(--ree-panel);
457
+ box-shadow: var(--ree-shadow-md);
458
+ font-size: 12px;
459
+ font-weight: 500;
460
+ line-height: 1.4;
461
+ white-space: nowrap;
462
+ cursor: default;
463
+ }
464
+
465
+ .ree-block-tooltip::before,
466
+ .ree-btn-tooltip::before {
467
+ content: "";
468
+ position: absolute;
469
+ top: -8px;
470
+ left: 0;
471
+ width: 100%;
472
+ height: 8px;
473
+ }
474
+
475
+ .ree-btn-tooltip {
476
+ text-transform: none;
477
+ letter-spacing: normal;
478
+ }
479
+
480
+ .ree-block-btn:hover .ree-block-tooltip,
481
+ .ree-block-btn:focus-visible .ree-block-tooltip,
482
+ .ree-btn-has-tooltip:hover .ree-btn-tooltip,
483
+ .ree-btn-has-tooltip:focus-visible .ree-btn-tooltip {
484
+ display: block;
485
+ }
486
+
487
+ .ree-reset {
488
+ appearance: none;
489
+ display: inline-flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ width: 22px;
493
+ height: 22px;
494
+ flex-shrink: 0;
495
+ padding: 0;
496
+ border: 0;
497
+ border-radius: 6px;
498
+ background: transparent;
499
+ color: var(--ree-muted);
500
+ cursor: pointer;
501
+ }
502
+
503
+ .ree-reset:hover {
504
+ background: var(--ree-panel-secondary);
505
+ color: var(--ree-text);
506
+ }
507
+
508
+ .ree-reset:disabled {
509
+ opacity: 0.35;
510
+ cursor: default;
511
+ }
512
+
513
+ .ree-reset:disabled:hover {
514
+ background: transparent;
515
+ color: var(--ree-muted);
516
+ }
517
+
518
+ .ree-reset:focus-visible {
519
+ outline: 1px solid #202223;
520
+ outline-offset: -1px;
521
+ }
522
+
523
+ .ree-color-picker {
524
+ position: fixed;
525
+ inset: auto;
526
+ width: min(256px, calc(100vw - 16px));
527
+ max-height: calc(100dvh - 16px);
528
+ margin: 0;
529
+ padding: 12px;
530
+ overflow: auto;
531
+ border: 1px solid var(--ree-border, #e3e3e5);
532
+ border-radius: 10px;
533
+ background: var(--ree-panel, #ffffff);
534
+ box-shadow: var(--ree-shadow-lg, 0 6px 32px rgba(31, 33, 36, 0.16));
535
+ color: var(--ree-text, #202223);
536
+ font: 400 13px/1.4 var(--ree-font, Arial, sans-serif);
537
+ }
538
+
539
+ .ree-color-picker:popover-open {
540
+ display: grid;
541
+ gap: 12px;
542
+ }
543
+
544
+ .ree-color-saturation {
545
+ position: relative;
546
+ height: 144px;
547
+ border-radius: 6px;
548
+ background: linear-gradient(to top, #000000, transparent), linear-gradient(to right, #ffffff, transparent), var(--ree-color-hue);
549
+ cursor: crosshair;
550
+ touch-action: none;
551
+ }
552
+
553
+ .ree-color-saturation:focus-visible {
554
+ outline: 2px solid #202223;
555
+ outline-offset: 2px;
556
+ }
557
+
558
+ .ree-color-cursor {
559
+ position: absolute;
560
+ width: 12px;
561
+ height: 12px;
562
+ border: 2px solid #ffffff;
563
+ border-radius: 50%;
564
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5);
565
+ transform: translate(-50%, -50%);
566
+ pointer-events: none;
567
+ }
568
+
569
+ .ree-color-hue .ree-range::-webkit-slider-runnable-track {
570
+ height: 10px;
571
+ background: linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000);
572
+ }
573
+
574
+ .ree-color-hue .ree-range::-moz-range-track {
575
+ height: 10px;
576
+ background: linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000);
577
+ }
578
+
579
+ .ree-color-hue .ree-range::-moz-range-progress {
580
+ background: transparent;
581
+ }
582
+
583
+ .ree-color-hue .ree-range::-webkit-slider-thumb {
584
+ margin-top: -2px;
585
+ border: 2px solid #ffffff;
586
+ box-shadow: 0 0 0 1px #6d7175;
587
+ }
588
+
589
+ .ree-color-hue .ree-range::-moz-range-thumb {
590
+ border: 2px solid #ffffff;
591
+ box-shadow: 0 0 0 1px #6d7175;
592
+ }
593
+
594
+ .ree-color-hex-row {
595
+ display: flex;
596
+ align-items: center;
597
+ gap: 10px;
598
+ }
599
+
600
+ .ree-color-preview {
601
+ flex: 0 0 28px;
602
+ height: 28px;
603
+ border: 1px solid var(--ree-border);
604
+ border-radius: 6px;
605
+ }
606
+
607
+ .ree-color-hex-field {
608
+ display: flex;
609
+ flex: 1;
610
+ align-items: center;
611
+ gap: 8px;
612
+ min-width: 0;
613
+ }
614
+
615
+ .ree-color-hex-field .ree-input {
616
+ min-width: 0;
617
+ font-variant-numeric: tabular-nums;
618
+ }
619
+
620
+ .ree-color-error {
621
+ margin: 0;
622
+ color: var(--ree-danger, #d72c0d);
623
+ font-size: 12px;
624
+ }
625
+
64
626
  /* ---------- 邮件主题 ---------- */
65
627
 
66
628
  .ree-subject-bar {
@@ -81,30 +643,28 @@
81
643
  color: var(--ree-text);
82
644
  }
83
645
 
84
- .ree-subject-input {
646
+ .ree-subject-field {
647
+ position: relative;
85
648
  flex: 1 1 360px;
86
- min-width: 240px;
87
- border: 1px solid var(--ree-border);
88
- border-radius: var(--ree-radius);
89
- background: var(--ree-panel);
90
- color: var(--ree-text);
91
- font: inherit;
92
- font-size: 14px;
93
- line-height: 1.4;
94
- padding: 8px 12px;
649
+ min-width: min(240px, 100%);
95
650
  }
96
651
 
97
- .ree-subject-input:focus {
98
- outline: none;
99
- border-color: var(--ree-primary);
100
- box-shadow: 0 0 0 1px var(--ree-primary);
652
+ .ree-subject-input {
653
+ --ree-control-padding-end: 76px;
101
654
  }
102
655
 
103
656
  .ree-subject-count {
104
- flex-shrink: 0;
657
+ position: absolute;
658
+ top: 0;
659
+ right: 12px;
660
+ bottom: 0;
661
+ display: flex;
662
+ align-items: center;
105
663
  color: var(--ree-muted);
106
664
  font-size: 13px;
107
665
  font-variant-numeric: tabular-nums;
666
+ white-space: nowrap;
667
+ pointer-events: none;
108
668
  }
109
669
 
110
670
  .ree-personalization {
@@ -138,12 +698,6 @@
138
698
  min-width: 240px;
139
699
  }
140
700
 
141
- .ree-personalization-empty {
142
- padding: 8px 10px;
143
- color: var(--ree-muted);
144
- font-size: 13px;
145
- }
146
-
147
701
  .ree-subject-hint {
148
702
  flex: 0 1 auto;
149
703
  margin: 0;
@@ -153,56 +707,6 @@
153
707
  white-space: nowrap;
154
708
  }
155
709
 
156
- .ree-subject-reset {
157
- flex-shrink: 0;
158
- margin-left: auto;
159
- }
160
-
161
- .ree-btn {
162
- appearance: none;
163
- border: 1px solid var(--ree-border, #e3e3e5);
164
- background: var(--ree-panel, #ffffff);
165
- color: var(--ree-text, #202223);
166
- border-radius: var(--ree-radius, 8px);
167
- padding: 8px 16px;
168
- font-size: 14px;
169
- font-weight: 500;
170
- line-height: 1.4;
171
- cursor: pointer;
172
- font-family: inherit;
173
- transition: background 0.12s ease, border-color 0.12s ease,
174
- box-shadow 0.12s ease;
175
- }
176
-
177
- .ree-btn:hover {
178
- background: var(--ree-panel-secondary);
179
- border-color: var(--ree-border);
180
- }
181
-
182
- .ree-btn:active {
183
- background: #f0f0f1;
184
- }
185
-
186
- .ree-btn:focus-visible {
187
- outline: none;
188
- box-shadow: 0 0 0 2px var(--ree-panel), 0 0 0 4px var(--ree-primary);
189
- }
190
-
191
- .ree-btn-primary {
192
- background: var(--ree-primary, #005bd3);
193
- border-color: var(--ree-primary, #005bd3);
194
- color: var(--ree-primary-fg, #ffffff);
195
- }
196
-
197
- .ree-btn-primary:hover {
198
- background: var(--ree-primary-hover);
199
- border-color: var(--ree-primary-hover);
200
- }
201
-
202
- .ree-btn-primary:active {
203
- background: var(--ree-primary-hover);
204
- }
205
-
206
710
 
207
711
  /* ---------- 三栏布局 ---------- */
208
712
 
@@ -223,8 +727,8 @@
223
727
  display: flex;
224
728
  align-items: center;
225
729
  flex-shrink: 0;
226
- min-height: 52px;
227
- padding: 8px 16px;
730
+ height: 52px;
731
+ padding: 7px 16px;
228
732
  font-weight: 600;
229
733
  font-size: 12px;
230
734
  color: var(--ree-muted);
@@ -357,6 +861,47 @@
357
861
  flex-shrink: 0;
358
862
  }
359
863
 
864
+ .ree-library-head {
865
+ justify-content: space-between;
866
+ }
867
+
868
+ .ree-col-left.is-collapsed {
869
+ width: 52px;
870
+ }
871
+
872
+ .ree-col-left.is-collapsed .ree-library-head {
873
+ justify-content: center;
874
+ padding-left: 7px;
875
+ padding-right: 7px;
876
+ }
877
+
878
+ .ree-col-left:not(.is-collapsed) .ree-library-expand,
879
+ .ree-col-left.is-collapsed .ree-library-collapse,
880
+ .ree-col-left.is-collapsed .ree-library-label {
881
+ display: none;
882
+ }
883
+
884
+ @media (width < 1375px) {
885
+ .ree-col-left:not(.is-expanded) {
886
+ width: 52px;
887
+ }
888
+
889
+ .ree-col-left:not(.is-expanded) .ree-library-head {
890
+ justify-content: center;
891
+ padding-left: 7px;
892
+ padding-right: 7px;
893
+ }
894
+
895
+ .ree-col-left:not(.is-expanded) .ree-library-label,
896
+ .ree-col-left:not(.is-expanded) .ree-library-collapse {
897
+ display: none;
898
+ }
899
+
900
+ .ree-col-left:not(.is-expanded) .ree-library-expand {
901
+ display: inline-flex;
902
+ }
903
+ }
904
+
360
905
  .ree-col-center {
361
906
  flex: 1;
362
907
  min-width: 0;
@@ -428,6 +973,42 @@
428
973
  font-weight: 500;
429
974
  }
430
975
 
976
+ .ree-col-left.is-collapsed .ree-lib {
977
+ grid-template-columns: 1fr;
978
+ gap: 8px;
979
+ padding: 12px 7px;
980
+ }
981
+
982
+ .ree-col-left.is-collapsed .ree-lib-item {
983
+ justify-content: center;
984
+ min-height: 38px;
985
+ gap: 0;
986
+ padding: 8px;
987
+ }
988
+
989
+ .ree-col-left.is-collapsed .ree-lib-title {
990
+ display: none;
991
+ }
992
+
993
+ @media (width < 1375px) {
994
+ .ree-col-left:not(.is-expanded) .ree-lib {
995
+ grid-template-columns: 1fr;
996
+ gap: 8px;
997
+ padding: 12px 7px;
998
+ }
999
+
1000
+ .ree-col-left:not(.is-expanded) .ree-lib-item {
1001
+ justify-content: center;
1002
+ min-height: 38px;
1003
+ gap: 0;
1004
+ padding: 8px;
1005
+ }
1006
+
1007
+ .ree-col-left:not(.is-expanded) .ree-lib-title {
1008
+ display: none;
1009
+ }
1010
+ }
1011
+
431
1012
 
432
1013
  /* ---------- 画布 ---------- */
433
1014
 
@@ -436,6 +1017,14 @@
436
1017
  flex: 1;
437
1018
  min-height: 0;
438
1019
  min-width: 0;
1020
+ background-color: var(--ree-panel);
1021
+ background-image:
1022
+ linear-gradient(45deg, rgba(0, 0, 0, 0.02) 25%, transparent 25%),
1023
+ linear-gradient(-45deg, rgba(0, 0, 0, 0.02) 25%, transparent 25%),
1024
+ linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.02) 75%),
1025
+ linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.02) 75%);
1026
+ background-size: 20px 20px;
1027
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0;
439
1028
  }
440
1029
 
441
1030
  .ree-stage-view[hidden] {
@@ -444,14 +1033,13 @@
444
1033
 
445
1034
  .ree-canvas,
446
1035
  .ree-preview-stage {
1036
+ display: flex;
1037
+ flex-direction: column;
447
1038
  flex: 1;
448
1039
  min-height: 0;
449
1040
  min-width: 0;
450
1041
  overflow: auto;
451
- }
452
-
453
- .ree-canvas {
454
- padding: 64px 24px 40px;
1042
+ padding: 64px 24px;
455
1043
  }
456
1044
 
457
1045
  .ree-canvas.is-over {
@@ -462,7 +1050,6 @@
462
1050
  .ree-email-surface {
463
1051
  box-sizing: border-box;
464
1052
  margin: 0 auto;
465
- box-shadow: var(--ree-shadow-md);
466
1053
  }
467
1054
 
468
1055
  .ree-root .ree-canvas-inner {
@@ -475,10 +1062,13 @@
475
1062
  gap: var(--ree-block-gap, 0px);
476
1063
  }
477
1064
 
478
- .ree-preview-stage {
479
- display: flex;
480
- justify-content: center;
481
- padding: 24px 16px;
1065
+ .ree-preview-frame {
1066
+ display: block;
1067
+ width: 100%;
1068
+ height: 1px;
1069
+ flex-shrink: 0;
1070
+ border: none;
1071
+ background: #ffffff;
482
1072
  }
483
1073
 
484
1074
  .ree-inspector-scroll {
@@ -495,35 +1085,55 @@
495
1085
  }
496
1086
 
497
1087
 
498
- .ree-email-viewport { box-sizing: border-box; }
1088
+ .ree-email-viewport {
1089
+ box-sizing: border-box;
1090
+ flex: 1 0 auto;
1091
+ }
1092
+
1093
+ .ree-canvas .ree-email-viewport {
1094
+ background: rgb(246, 246, 247);
1095
+ box-shadow: var(--ree-shadow-md);
1096
+ }
499
1097
 
500
1098
  /* ---------- 区块 ---------- */
501
1099
 
502
1100
  .ree-block {
503
1101
  position: relative;
504
1102
  border: 0;
505
- border-radius: var(--ree-radius-sm);
506
- outline: 1px solid transparent;
507
- outline-offset: -1px;
1103
+ border-radius: 0;
508
1104
  background: transparent;
509
1105
  cursor: pointer;
510
- transition: background 0.12s ease, outline-color 0.12s ease,
511
- box-shadow 0.12s ease;
1106
+ transition: background 0.12s ease;
512
1107
  width: 100%;
513
1108
  display: flow-root;
514
1109
  }
515
1110
 
516
- /* hover:区块背景 + 边框均为浅蓝(参照 unlayer) */
1111
+ /* hover 和选中共用外侧辅助框,内沿贴住区块,不覆盖真实边框或占用布局空间。 */
1112
+ .ree-block-highlight {
1113
+ position: absolute;
1114
+ inset: -1px;
1115
+ z-index: 5;
1116
+ border: 1px solid transparent;
1117
+ pointer-events: none;
1118
+ transition: border-color 0.12s ease;
1119
+ }
1120
+
517
1121
  .ree-block:hover {
1122
+ z-index: 1;
518
1123
  background: var(--ree-accent-bg);
519
- outline-color: var(--ree-accent-border);
1124
+ }
1125
+
1126
+ .ree-block:hover > .ree-block-highlight {
1127
+ border-color: var(--ree-accent-border);
520
1128
  }
521
1129
 
522
1130
  .ree-block.is-selected {
523
1131
  z-index: 8;
524
1132
  background: var(--ree-accent-bg-strong);
525
- outline-color: var(--ree-primary);
526
- box-shadow: 0 0 0 1px var(--ree-primary);
1133
+ }
1134
+
1135
+ .ree-block.is-selected > .ree-block-highlight {
1136
+ border-color: var(--ree-primary);
527
1137
  }
528
1138
 
529
1139
  .ree-block.is-dragging {
@@ -627,7 +1237,7 @@
627
1237
  .ree-block-toolbar {
628
1238
  position: absolute;
629
1239
  top: calc(100% + 4px);
630
- left: 8px;
1240
+ left: 0;
631
1241
  z-index: 7;
632
1242
  display: flex;
633
1243
  gap: 2px;
@@ -636,9 +1246,11 @@
636
1246
  border-radius: var(--ree-radius);
637
1247
  padding: 3px;
638
1248
  box-shadow: var(--ree-shadow-md);
1249
+ font-family: var(--ree-font);
639
1250
  }
640
1251
 
641
1252
  .ree-block-btn {
1253
+ position: relative;
642
1254
  appearance: none;
643
1255
  border: none;
644
1256
  background: transparent;
@@ -658,11 +1270,26 @@
658
1270
  color: var(--ree-primary);
659
1271
  }
660
1272
 
1273
+ .ree-block-btn:active {
1274
+ background: var(--ree-accent-bg-strong);
1275
+ color: var(--ree-primary);
1276
+ }
1277
+
1278
+ .ree-block-btn:focus-visible {
1279
+ outline: 2px solid var(--ree-primary);
1280
+ outline-offset: 1px;
1281
+ }
1282
+
661
1283
  .ree-block-btn.ree-danger:hover {
662
1284
  background: var(--ree-danger-soft);
663
1285
  color: var(--ree-danger);
664
1286
  }
665
1287
 
1288
+ .ree-block-btn.ree-danger:active {
1289
+ background: var(--ree-danger-soft);
1290
+ color: var(--ree-danger);
1291
+ }
1292
+
666
1293
  .ree-block-content {
667
1294
  width: 100%;
668
1295
  overflow: hidden;
@@ -738,6 +1365,10 @@
738
1365
  pointer-events: none;
739
1366
  }
740
1367
 
1368
+ .ree-button-canvas-row {
1369
+ width: 100%;
1370
+ border: 0;
1371
+ }
741
1372
 
742
1373
  /* ---------- 富文本 ---------- */
743
1374
 
@@ -755,8 +1386,9 @@
755
1386
  left: 0;
756
1387
  visibility: hidden;
757
1388
  display: flex;
758
- flex-direction: column;
759
- gap: 2px;
1389
+ flex-wrap: wrap;
1390
+ align-items: center;
1391
+ gap: 4px 0;
760
1392
  width: auto;
761
1393
  margin: 0;
762
1394
  padding: 4px;
@@ -773,19 +1405,27 @@
773
1405
  visibility: visible;
774
1406
  }
775
1407
 
776
- .ree-rte-row {
1408
+ .ree-rte-group {
777
1409
  display: flex;
778
- align-items: center;
1410
+ flex: 0 0 auto;
779
1411
  flex-wrap: wrap;
1412
+ align-items: center;
780
1413
  gap: 2px;
1414
+ max-width: 100%;
1415
+ box-sizing: border-box;
1416
+ padding: 0 4px;
1417
+ }
1418
+
1419
+ .ree-rte-group + .ree-rte-group {
1420
+ border-inline-start: 1px solid var(--ree-border);
1421
+ }
1422
+
1423
+ .ree-rte-group.is-row-start {
1424
+ border-inline-start-color: transparent;
781
1425
  }
782
1426
 
783
- .ree-rte-sep {
1427
+ .ree-rte-group > * {
784
1428
  flex-shrink: 0;
785
- align-self: stretch;
786
- width: 1px;
787
- margin: 4px 4px;
788
- background: var(--ree-border);
789
1429
  }
790
1430
 
791
1431
  .ree-tool-btn,
@@ -899,12 +1539,6 @@
899
1539
  right: 0;
900
1540
  }
901
1541
 
902
- .ree-rte-menu.is-link {
903
- min-width: 0;
904
- padding: 0;
905
- overflow: visible;
906
- }
907
-
908
1542
  .ree-rte-pop.is-up .ree-rte-menu {
909
1543
  top: auto;
910
1544
  bottom: calc(100% + 6px);
@@ -933,46 +1567,6 @@
933
1567
  font-weight: 600;
934
1568
  }
935
1569
 
936
- .ree-rte-swatches {
937
- display: grid;
938
- grid-template-columns: repeat(6, 22px);
939
- gap: 6px;
940
- padding: 4px;
941
- }
942
-
943
- .ree-rte-swatch {
944
- width: 22px;
945
- height: 22px;
946
- padding: 0;
947
- border: 1px solid rgba(32, 34, 35, 0.16);
948
- border-radius: 4px;
949
- cursor: pointer;
950
- }
951
-
952
- .ree-rte-swatch.is-active {
953
- outline: 2px solid #202223;
954
- outline-offset: 1px;
955
- }
956
-
957
- .ree-rte-color-actions {
958
- display: flex;
959
- gap: 6px;
960
- padding: 4px;
961
- }
962
-
963
- .ree-rte-color-actions .ree-btn {
964
- padding: 6px 10px;
965
- font-size: 13px;
966
- }
967
-
968
- .ree-rte-color-input {
969
- position: absolute;
970
- width: 1px;
971
- height: 1px;
972
- opacity: 0;
973
- pointer-events: none;
974
- }
975
-
976
1570
  .ree-rte-emoji-grid {
977
1571
  display: grid;
978
1572
  grid-template-columns: repeat(8, 28px);
@@ -988,29 +1582,11 @@
988
1582
  background: transparent;
989
1583
  cursor: pointer;
990
1584
  font-size: 16px;
991
- line-height: 1;
992
- }
993
-
994
- .ree-rte-emoji:hover {
995
- background: var(--ree-panel-secondary);
996
- }
997
-
998
- .ree-rte-link {
999
- display: flex;
1000
- flex-direction: column;
1001
- gap: 10px;
1002
- width: 280px;
1003
- padding: 6px;
1004
- }
1005
-
1006
- .ree-rte-link-actions {
1007
- display: flex;
1008
- justify-content: flex-end;
1009
- gap: 8px;
1585
+ line-height: 1;
1010
1586
  }
1011
1587
 
1012
- .ree-rte-link-actions .ree-btn {
1013
- padding: 6px 12px;
1588
+ .ree-rte-emoji:hover {
1589
+ background: var(--ree-panel-secondary);
1014
1590
  }
1015
1591
 
1016
1592
  .ree-rte-variables {
@@ -1041,12 +1617,19 @@
1041
1617
 
1042
1618
  .ree-rte-metric-label {
1043
1619
  display: flex;
1620
+ align-items: center;
1044
1621
  justify-content: space-between;
1045
1622
  gap: 8px;
1046
1623
  color: var(--ree-muted);
1047
1624
  font-size: 12px;
1048
1625
  }
1049
1626
 
1627
+ .ree-rte-metric-meta {
1628
+ display: inline-flex;
1629
+ align-items: center;
1630
+ gap: 6px;
1631
+ }
1632
+
1050
1633
  .ree-rte-option:disabled {
1051
1634
  opacity: 0.35;
1052
1635
  cursor: default;
@@ -1080,6 +1663,10 @@
1080
1663
  font-size: 0.75em;
1081
1664
  }
1082
1665
 
1666
+ .ree-rte-button .ProseMirror p {
1667
+ margin: 0;
1668
+ text-align: center;
1669
+ }
1083
1670
 
1084
1671
  /* ---------- 变量 ---------- */
1085
1672
 
@@ -1151,6 +1738,12 @@
1151
1738
 
1152
1739
  /* ---------- 配置区 ---------- */
1153
1740
 
1741
+ .ree-col-right {
1742
+ --ree-primary: #202223;
1743
+ --ree-primary-hover: #303030;
1744
+ --ree-primary-soft: #f6f6f7;
1745
+ }
1746
+
1154
1747
  .ree-inspector {
1155
1748
  --ree-inspector-section-space: 16px;
1156
1749
  padding: 20px 16px;
@@ -1222,13 +1815,13 @@
1222
1815
  padding-bottom: var(--ree-inspector-section-space);
1223
1816
  }
1224
1817
 
1225
- /* Global 没有标题区,容器顶部留白会叠到第一个类目上。 */
1226
- .ree-inspector-global {
1818
+ /* Body 没有标题区,容器顶部留白会叠到第一个类目上。 */
1819
+ .ree-inspector-body {
1227
1820
  padding-top: 0;
1228
1821
  padding-bottom: 0;
1229
1822
  }
1230
1823
 
1231
- .ree-inspector-global > .ree-inspector-section:first-child {
1824
+ .ree-inspector-body > .ree-inspector-section:first-child {
1232
1825
  border-top: 0;
1233
1826
  }
1234
1827
 
@@ -1259,47 +1852,40 @@
1259
1852
  margin-left: auto;
1260
1853
  }
1261
1854
 
1262
- .ree-input {
1263
- width: 100%;
1264
- border: 1px solid var(--ree-border, #e3e3e5);
1265
- border-radius: var(--ree-radius, 8px);
1266
- padding: 8px 12px;
1267
- font-size: 14px;
1268
- line-height: 1.4;
1269
- font-family: inherit;
1270
- color: var(--ree-text, #202223);
1271
- background: var(--ree-panel, #ffffff);
1272
- transition: border-color 0.12s ease, box-shadow 0.12s ease;
1855
+ .ree-inspector-advanced summary {
1856
+ cursor: pointer;
1857
+ color: var(--ree-muted);
1858
+ font-size: 12px;
1273
1859
  }
1274
1860
 
1275
- .ree-input:focus {
1276
- outline: none;
1277
- border-color: var(--ree-primary, #005bd3);
1278
- box-shadow: 0 0 0 1px var(--ree-primary, #005bd3);
1861
+ .ree-inspector-advanced[open] summary {
1862
+ margin-bottom: 14px;
1279
1863
  }
1280
1864
 
1281
- .ree-select {
1865
+ .ree-field-label:has(> .ree-var-wrap) {
1282
1866
  position: relative;
1867
+ justify-content: flex-start;
1283
1868
  }
1284
1869
 
1285
- .ree-select .ree-input {
1286
- appearance: none;
1287
- -webkit-appearance: none;
1288
- padding-right: 36px;
1289
- background-color: var(--ree-panel);
1870
+ .ree-field-label > .ree-var-wrap {
1871
+ position: static;
1290
1872
  }
1291
1873
 
1292
- .ree-select-icon {
1293
- position: absolute;
1294
- top: 0;
1295
- right: 10px;
1296
- bottom: 0;
1297
- display: flex;
1298
- align-items: center;
1299
- pointer-events: none;
1300
- color: var(--ree-muted);
1874
+ .ree-field-label .ree-var-menu {
1875
+ left: 0;
1876
+ width: min(280px, 100%);
1877
+ min-width: 0;
1878
+ }
1879
+
1880
+ .ree-field-label .ree-var-name,
1881
+ .ree-field-label .ree-var-label {
1882
+ max-width: 100%;
1883
+ overflow-wrap: anywhere;
1884
+ white-space: pre-wrap;
1301
1885
  }
1302
1886
 
1887
+ /* ---------- 配置控件 ---------- */
1888
+
1303
1889
  .ree-textarea {
1304
1890
  resize: vertical;
1305
1891
  min-height: 60px;
@@ -1338,8 +1924,8 @@
1338
1924
  }
1339
1925
 
1340
1926
  .ree-color-grid {
1341
- display: grid;
1342
- grid-template-columns: 1fr 1fr;
1927
+ display: flex;
1928
+ flex-wrap: wrap;
1343
1929
  gap: 12px 16px;
1344
1930
  }
1345
1931
 
@@ -1350,83 +1936,6 @@
1350
1936
  min-width: 0;
1351
1937
  }
1352
1938
 
1353
- .ree-color-chip {
1354
- display: flex;
1355
- align-items: center;
1356
- gap: 8px;
1357
- min-width: 0;
1358
- cursor: pointer;
1359
- }
1360
-
1361
- .ree-color-swatch {
1362
- position: relative;
1363
- width: 36px;
1364
- height: 22px;
1365
- flex-shrink: 0;
1366
- }
1367
-
1368
- .ree-color-swatch-face {
1369
- display: block;
1370
- width: 100%;
1371
- height: 100%;
1372
- border: 1px solid #d2d5d8;
1373
- border-radius: 999px;
1374
- background: #ffffff;
1375
- }
1376
-
1377
- .ree-color-swatch-face.is-empty {
1378
- background:
1379
- linear-gradient(45deg, #e3e3e5 25%, transparent 25%),
1380
- linear-gradient(-45deg, #e3e3e5 25%, transparent 25%),
1381
- linear-gradient(45deg, transparent 75%, #e3e3e5 75%),
1382
- linear-gradient(-45deg, transparent 75%, #e3e3e5 75%);
1383
- background-size: 8px 8px;
1384
- background-position: 0 0, 0 4px, 4px -4px, -4px 0;
1385
- background-color: #ffffff;
1386
- }
1387
-
1388
- .ree-color-native {
1389
- position: absolute;
1390
- inset: 0;
1391
- width: 100%;
1392
- height: 100%;
1393
- opacity: 0;
1394
- cursor: pointer;
1395
- border: 0;
1396
- padding: 0;
1397
- }
1398
-
1399
- .ree-color-chip-label {
1400
- min-width: 0;
1401
- overflow: hidden;
1402
- color: var(--ree-text);
1403
- font-size: 13px;
1404
- line-height: 1.3;
1405
- text-overflow: ellipsis;
1406
- white-space: nowrap;
1407
- }
1408
-
1409
- .ree-reset {
1410
- appearance: none;
1411
- display: inline-flex;
1412
- align-items: center;
1413
- justify-content: center;
1414
- width: 22px;
1415
- height: 22px;
1416
- flex-shrink: 0;
1417
- padding: 0;
1418
- border: 0;
1419
- border-radius: 6px;
1420
- background: transparent;
1421
- color: var(--ree-muted);
1422
- cursor: pointer;
1423
- }
1424
-
1425
- .ree-reset:hover {
1426
- background: var(--ree-panel-secondary);
1427
- color: var(--ree-text);
1428
- }
1429
-
1430
1939
  .ree-field-value {
1431
1940
  font-size: 12px;
1432
1941
  color: var(--ree-muted);
@@ -1456,82 +1965,6 @@
1456
1965
  width: 100%;
1457
1966
  }
1458
1967
 
1459
- .ree-range {
1460
- -webkit-appearance: none;
1461
- appearance: none;
1462
- display: block;
1463
- flex: 1 1 auto;
1464
- width: 100%;
1465
- min-width: 0;
1466
- height: 20px;
1467
- margin: 0;
1468
- background: transparent;
1469
- cursor: pointer;
1470
- }
1471
-
1472
- .ree-range::-webkit-slider-container {
1473
- width: 100%;
1474
- }
1475
-
1476
- .ree-range::-webkit-slider-runnable-track {
1477
- width: 100%;
1478
- height: 4px;
1479
- border: 0;
1480
- border-radius: 999px;
1481
- background: linear-gradient(to right, #303030 0%, #303030 var(--ree-range-progress), #e3e3e5 var(--ree-range-progress), #e3e3e5 100%);
1482
- }
1483
-
1484
- .ree-range::-webkit-slider-thumb {
1485
- appearance: none;
1486
- width: 14px;
1487
- height: 14px;
1488
- margin-top: -5px;
1489
- border: 0;
1490
- border-radius: 50%;
1491
- background: #303030;
1492
- }
1493
-
1494
- .ree-range::-moz-range-track {
1495
- height: 4px;
1496
- border: 0;
1497
- border-radius: 999px;
1498
- background: #e3e3e5;
1499
- }
1500
-
1501
- .ree-range::-moz-range-progress {
1502
- height: 4px;
1503
- border: 0;
1504
- border-radius: 999px;
1505
- background: #303030;
1506
- }
1507
-
1508
- .ree-range::-moz-range-thumb {
1509
- width: 14px;
1510
- height: 14px;
1511
- border: 0;
1512
- border-radius: 50%;
1513
- background: #303030;
1514
- }
1515
-
1516
- .ree-unit-select {
1517
- appearance: none;
1518
- flex-shrink: 0;
1519
- height: 28px;
1520
- border: 1px solid var(--ree-border);
1521
- border-radius: 6px;
1522
- background-color: var(--ree-panel);
1523
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M4 6.25 8 10.25 12 6.25' stroke='%236d7175' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
1524
- background-repeat: no-repeat;
1525
- background-position: right 4px center;
1526
- background-size: 12px;
1527
- color: var(--ree-text);
1528
- font: inherit;
1529
- font-size: 12px;
1530
- line-height: 1;
1531
- padding: 0 20px 0 8px;
1532
- cursor: pointer;
1533
- }
1534
-
1535
1968
  .ree-align-row {
1536
1969
  display: flex;
1537
1970
  gap: 4px;
@@ -1555,45 +1988,73 @@
1555
1988
  }
1556
1989
 
1557
1990
  .ree-align-btn.is-active {
1558
- border-color: var(--ree-primary);
1559
- color: var(--ree-primary);
1560
- background: var(--ree-primary-soft);
1991
+ border-color: var(--ree-text);
1992
+ color: var(--ree-text);
1993
+ background: var(--ree-panel-secondary);
1561
1994
  }
1562
1995
 
1563
1996
 
1564
1997
  .ree-spacing-control { display: grid; gap: 10px; }
1565
- .ree-spacing-link { display: flex; gap: 6px; align-items: center; font-size: 12px; color: var(--ree-muted); }
1566
- .ree-spacing-link input[type="checkbox"] {
1567
- appearance: none;
1568
- -webkit-appearance: none;
1569
- width: 16px;
1570
- height: 16px;
1998
+ .ree-spacing-link { gap: 6px; font-size: 12px; color: var(--ree-muted); }
1999
+ .ree-spacing-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
2000
+
2001
+ /* 原生 modal dialog 进入 top layer,覆盖整个视口并隔离背景交互。 */
2002
+ .ree-rte-link {
2003
+ position: fixed;
2004
+ inset: 0;
2005
+ width: min(440px, calc(100vw - 32px));
2006
+ max-width: none;
2007
+ max-height: calc(100dvh - 32px);
2008
+ margin: auto;
2009
+ padding: 0;
2010
+ overflow: auto;
2011
+ background: var(--ree-panel, #ffffff);
2012
+ border: 1px solid var(--ree-border, #e3e3e5);
2013
+ border-radius: 12px;
2014
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);
2015
+ color: var(--ree-text, #202223);
2016
+ font: 400 14px/1.5 var(--ree-font, Arial, sans-serif);
2017
+ visibility: visible;
2018
+ }
2019
+
2020
+ .ree-rte-link::backdrop {
2021
+ background: rgba(0, 0, 0, 0.6);
2022
+ -webkit-backdrop-filter: blur(4px);
2023
+ backdrop-filter: blur(4px);
2024
+ }
2025
+
2026
+ .ree-rte-link-title {
1571
2027
  margin: 0;
1572
- border: 1px solid #1a1a1a;
1573
- border-radius: 3px;
1574
- background: #ffffff;
2028
+ padding: 20px 24px;
2029
+ border-bottom: 1px solid var(--ree-border);
2030
+ font-size: 18px;
2031
+ font-weight: 600;
2032
+ line-height: 1.4;
2033
+ }
2034
+
2035
+ .ree-rte-link-fields {
1575
2036
  display: grid;
1576
- place-content: center;
1577
- cursor: pointer;
1578
- flex-shrink: 0;
2037
+ gap: 20px;
2038
+ padding: 24px;
1579
2039
  }
1580
- .ree-spacing-link input[type="checkbox"]:checked {
1581
- background: #1a1a1a;
1582
- border-color: #1a1a1a;
2040
+
2041
+ .ree-rte-link-actions {
2042
+ display: flex;
2043
+ justify-content: flex-end;
2044
+ gap: 8px;
2045
+ padding: 16px 24px;
2046
+ border-top: 1px solid var(--ree-border);
1583
2047
  }
1584
- .ree-spacing-link input[type="checkbox"]:checked::after {
1585
- content: "";
1586
- width: 8px;
1587
- height: 4px;
1588
- border: solid #ffffff;
1589
- border-width: 0 0 1.5px 1.5px;
1590
- transform: rotate(-45deg) translateY(-1px);
2048
+
2049
+ .ree-rte-link-actions .ree-btn {
2050
+ min-width: 80px;
1591
2051
  }
1592
- .ree-spacing-link input[type="checkbox"]:focus-visible {
1593
- outline: 2px solid #1a1a1a;
1594
- outline-offset: 2px;
2052
+
2053
+ .ree-rte-link-error {
2054
+ margin: -12px 0 0;
2055
+ color: var(--ree-danger);
2056
+ font-size: 12px;
1595
2057
  }
1596
- .ree-spacing-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
1597
2058
 
1598
2059
  /* ---------- 拖拽浮层 ---------- */
1599
2060
 
@@ -1609,11 +2070,14 @@
1609
2070
  font-weight: 500;
1610
2071
  }
1611
2072
 
1612
- .ree-preview-frame {
1613
- height: 100%;
1614
- min-height: 520px;
1615
- flex-shrink: 0;
1616
- border: none;
1617
- background: #ffffff;
1618
- box-shadow: var(--ree-shadow-md);
1619
- }
2073
+ .ree-plugin-field { min-width: 0; }
2074
+ .ree-plugin-error { margin: 8px 0; padding: 8px; color: #b42318; font-size: 13px; overflow-wrap: anywhere; }
2075
+ .ree-plugin-empty { margin: 6px 0; color: #737373; font-size: 12px; }
2076
+ .ree-plugin-list { min-width: 0; margin: 0; padding: 10px; border: 1px solid #e3e3e5; border-radius: 6px; }
2077
+ .ree-plugin-list-item { display: grid; gap: 12px; padding: 12px 0; border-bottom: 1px solid #e3e3e5; }
2078
+ .ree-plugin-list-actions { display: flex; align-items: center; gap: 4px; }
2079
+ .ree-plugin-list-actions > span { margin-right: auto; }
2080
+ .ree-plugin-image { display: block; max-width: 100%; max-height: 120px; object-fit: contain; }
2081
+ .ree-plugin-richtext { min-height: 64px; padding: 8px; border: 1px solid #e3e3e5; border-radius: 4px; }
2082
+ .ree-plugin-richtext:focus-within { border-color: #000000; }
2083
+ .ree-plugin-richtext .ProseMirror { min-height: 48px; outline: none; }