@standhigher/react-email-editor 0.0.0-stage → 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,1619 @@
1
+ /* ==========================================================================
2
+ @standhigher/react-email-editor
3
+ Polaris 风格主题(浅色),CSS 变量 + ree- 前缀。间距刻意放大,营造大气留白。
4
+ ========================================================================== */
5
+
6
+ /* 富文本工具栏会 portal 到 .ree-root 之外(例如 document.body)。
7
+ 主题变量必须同时挂在工具栏上,否则下拉、输入框和按钮的 var() 会失效。 */
8
+ .ree-root,
9
+ .ree-rte-toolbar {
10
+ --ree-bg: #f1f1f1; /* --p-color-bg-app */
11
+ --ree-panel: #ffffff; /* --p-color-bg */
12
+ --ree-panel-secondary: #f6f6f7; /* --p-color-bg-surface-secondary */
13
+ --ree-border: #e3e3e5; /* --p-color-border */
14
+ --ree-border-subdued: #ececec;
15
+ --ree-text: #202223; /* --p-color-text */
16
+ --ree-muted: #6d7175; /* --p-color-text-subdued */
17
+ --ree-primary: #005bd3; /* --p-color-bg-fill-brand */
18
+ --ree-primary-hover: #084eb3;
19
+ --ree-primary-fg: #ffffff;
20
+ --ree-primary-soft: #eef4ff;
21
+ --ree-accent-border: #a9c8f4; /* 区块 hover 浅蓝边框 */
22
+ --ree-accent-bg: #f1f6ff; /* 区块 hover 浅蓝背景 */
23
+ --ree-accent-bg-strong: #e8f1ff; /* 区块选中背景 */
24
+ --ree-danger: #d72c0d;
25
+ --ree-danger-soft: #fbeae5;
26
+
27
+ --ree-radius-sm: 6px;
28
+ --ree-radius: 8px;
29
+ --ree-radius-lg: 12px;
30
+
31
+ --ree-shadow-sm: 0 1px 0 rgba(0, 0, 0, 0.05);
32
+ --ree-shadow-md: 0 2px 16px rgba(31, 33, 36, 0.08);
33
+ --ree-shadow-lg: 0 6px 32px rgba(31, 33, 36, 0.16);
34
+
35
+ --ree-font: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
36
+ "Helvetica Neue", Arial, "PingFang SC", "Microsoft YaHei", sans-serif;
37
+ }
38
+
39
+ .ree-root {
40
+ display: flex;
41
+ flex-direction: column;
42
+ width: 100%;
43
+ height: 100%;
44
+ min-height: 0;
45
+ background: var(--ree-bg);
46
+ color: var(--ree-text);
47
+ font-family: var(--ree-font);
48
+ font-size: 14px;
49
+ overflow: hidden;
50
+ box-sizing: border-box;
51
+ }
52
+
53
+ .ree-root *,
54
+ .ree-root *::before,
55
+ .ree-root *::after,
56
+ .ree-rte-toolbar,
57
+ .ree-rte-toolbar *,
58
+ .ree-rte-toolbar *::before,
59
+ .ree-rte-toolbar *::after {
60
+ box-sizing: border-box;
61
+ }
62
+
63
+
64
+ /* ---------- 邮件主题 ---------- */
65
+
66
+ .ree-subject-bar {
67
+ display: flex;
68
+ align-items: center;
69
+ flex-wrap: wrap;
70
+ gap: 10px 12px;
71
+ padding: 10px 16px;
72
+ background: var(--ree-panel);
73
+ border-bottom: 1px solid var(--ree-border);
74
+ min-height: 56px;
75
+ }
76
+
77
+ .ree-subject-label {
78
+ flex-shrink: 0;
79
+ font-size: 13px;
80
+ font-weight: 500;
81
+ color: var(--ree-text);
82
+ }
83
+
84
+ .ree-subject-input {
85
+ 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;
95
+ }
96
+
97
+ .ree-subject-input:focus {
98
+ outline: none;
99
+ border-color: var(--ree-primary);
100
+ box-shadow: 0 0 0 1px var(--ree-primary);
101
+ }
102
+
103
+ .ree-subject-count {
104
+ flex-shrink: 0;
105
+ color: var(--ree-muted);
106
+ font-size: 13px;
107
+ font-variant-numeric: tabular-nums;
108
+ }
109
+
110
+ .ree-personalization {
111
+ position: relative;
112
+ flex-shrink: 0;
113
+ }
114
+
115
+ .ree-personalization-btn {
116
+ appearance: none;
117
+ display: inline-flex;
118
+ align-items: center;
119
+ gap: 6px;
120
+ border: 1px solid var(--ree-border);
121
+ background: var(--ree-panel);
122
+ color: var(--ree-text);
123
+ border-radius: var(--ree-radius);
124
+ padding: 7px 10px 7px 12px;
125
+ font: inherit;
126
+ font-size: 13px;
127
+ font-weight: 500;
128
+ line-height: 1.2;
129
+ cursor: pointer;
130
+ }
131
+
132
+ .ree-personalization-btn:hover {
133
+ background: var(--ree-panel-secondary);
134
+ }
135
+
136
+ .ree-personalization-menu {
137
+ left: 0;
138
+ min-width: 240px;
139
+ }
140
+
141
+ .ree-personalization-empty {
142
+ padding: 8px 10px;
143
+ color: var(--ree-muted);
144
+ font-size: 13px;
145
+ }
146
+
147
+ .ree-subject-hint {
148
+ flex: 0 1 auto;
149
+ margin: 0;
150
+ color: var(--ree-muted);
151
+ font-size: 13px;
152
+ line-height: 1.4;
153
+ white-space: nowrap;
154
+ }
155
+
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
+
207
+ /* ---------- 三栏布局 ---------- */
208
+
209
+ .ree-body {
210
+ display: flex;
211
+ flex: 1;
212
+ min-height: 0;
213
+ }
214
+
215
+ .ree-col {
216
+ display: flex;
217
+ flex-direction: column;
218
+ min-height: 0;
219
+ background: var(--ree-panel);
220
+ }
221
+
222
+ .ree-col-head {
223
+ display: flex;
224
+ align-items: center;
225
+ flex-shrink: 0;
226
+ min-height: 52px;
227
+ padding: 8px 16px;
228
+ font-weight: 600;
229
+ font-size: 12px;
230
+ color: var(--ree-muted);
231
+ text-transform: uppercase;
232
+ letter-spacing: 0.05em;
233
+ border-bottom: 1px solid var(--ree-border);
234
+ background: var(--ree-panel);
235
+ }
236
+
237
+ .ree-stage-head {
238
+ justify-content: center;
239
+ gap: 12px;
240
+ text-transform: none;
241
+ letter-spacing: normal;
242
+ font-weight: 500;
243
+ color: var(--ree-text);
244
+ }
245
+
246
+ .ree-segment {
247
+ display: inline-flex;
248
+ align-items: stretch;
249
+ border: 1px solid #c9cccf;
250
+ border-radius: 8px;
251
+ overflow: hidden;
252
+ background: #ffffff;
253
+ }
254
+
255
+ .ree-segment-btn {
256
+ appearance: none;
257
+ border: none;
258
+ background: #ffffff;
259
+ color: #303030;
260
+ min-width: 46px;
261
+ height: 34px;
262
+ padding: 0 10px;
263
+ display: inline-flex;
264
+ align-items: center;
265
+ justify-content: center;
266
+ cursor: pointer;
267
+ font: inherit;
268
+ font-size: 13px;
269
+ font-weight: 550;
270
+ transition: background-color 0.16s ease, color 0.16s ease,
271
+ box-shadow 0.16s ease;
272
+ }
273
+
274
+ .ree-segment-divider {
275
+ flex-shrink: 0;
276
+ align-self: stretch;
277
+ width: 1px;
278
+ background: #c9cccf;
279
+ }
280
+
281
+ .ree-segment-btn.is-active {
282
+ background: #e3e3e3;
283
+ }
284
+
285
+ .ree-segment-btn:hover {
286
+ background: #f3f3f3;
287
+ color: #1f1f1f;
288
+ }
289
+
290
+ .ree-segment-btn.is-active:hover {
291
+ background: #d9d9d9;
292
+ }
293
+
294
+ .ree-segment-btn:active,
295
+ .ree-segment-btn.is-active:active {
296
+ background: #d4d4d4;
297
+ }
298
+
299
+ .ree-segment-btn:focus-visible {
300
+ outline: none;
301
+ box-shadow: inset 0 0 0 2px var(--ree-primary);
302
+ }
303
+
304
+ .ree-segment-btn:disabled {
305
+ opacity: 0.4;
306
+ cursor: default;
307
+ }
308
+
309
+ .ree-segment-btn:disabled:hover {
310
+ background: #ffffff;
311
+ color: #303030;
312
+ }
313
+
314
+ .ree-segment-btn-label {
315
+ padding: 0 10px;
316
+ }
317
+
318
+ .ree-inspector-tabs {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 16px;
322
+ }
323
+
324
+ .ree-inspector-tab {
325
+ appearance: none;
326
+ border: 0;
327
+ padding: 0;
328
+ background: transparent;
329
+ color: var(--ree-muted);
330
+ font: inherit;
331
+ font-size: 12px;
332
+ font-weight: 600;
333
+ letter-spacing: 0.05em;
334
+ cursor: pointer;
335
+ }
336
+
337
+ .ree-inspector-tab:hover,
338
+ .ree-inspector-tab.is-active {
339
+ color: var(--ree-text);
340
+ }
341
+
342
+ .ree-inspector-tab:focus-visible {
343
+ outline: 2px solid var(--ree-primary);
344
+ outline-offset: 3px;
345
+ border-radius: 2px;
346
+ }
347
+
348
+ .ree-inspector-tab:disabled {
349
+ color: var(--ree-muted);
350
+ opacity: 0.4;
351
+ cursor: default;
352
+ }
353
+
354
+ .ree-col-left {
355
+ width: 320px;
356
+ border-right: 1px solid var(--ree-border);
357
+ flex-shrink: 0;
358
+ }
359
+
360
+ .ree-col-center {
361
+ flex: 1;
362
+ min-width: 0;
363
+ background: var(--ree-bg);
364
+ }
365
+
366
+ .ree-col-right {
367
+ width: 400px;
368
+ border-left: 1px solid var(--ree-border);
369
+ flex-shrink: 0;
370
+ overflow: hidden;
371
+ }
372
+
373
+ .ree-inspector-bar {
374
+ text-transform: none;
375
+ letter-spacing: normal;
376
+ font-weight: 500;
377
+ color: var(--ree-text);
378
+ }
379
+
380
+ .ree-inspector-tab {
381
+ max-width: 180px;
382
+ overflow: hidden;
383
+ text-overflow: ellipsis;
384
+ white-space: nowrap;
385
+ }
386
+
387
+
388
+ /* ---------- 区块库 ---------- */
389
+
390
+ .ree-lib {
391
+ padding: 16px;
392
+ display: grid;
393
+ grid-template-columns: 1fr 1fr;
394
+ gap: 12px;
395
+ overflow-y: auto;
396
+ }
397
+
398
+ .ree-lib-item {
399
+ display: flex;
400
+ align-items: center;
401
+ gap: 10px;
402
+ padding: 12px 14px;
403
+ border: 1px solid var(--ree-border);
404
+ border-radius: var(--ree-radius);
405
+ cursor: grab;
406
+ user-select: none;
407
+ background: var(--ree-panel);
408
+ transition: box-shadow 0.12s ease, border-color 0.12s ease;
409
+ }
410
+
411
+ .ree-lib-item:hover {
412
+ border-color: var(--ree-primary);
413
+ box-shadow: var(--ree-shadow-sm);
414
+ }
415
+
416
+ .ree-lib-item.is-dragging {
417
+ opacity: 0.4;
418
+ }
419
+
420
+ .ree-lib-icon {
421
+ display: inline-flex;
422
+ color: var(--ree-muted);
423
+ flex-shrink: 0;
424
+ }
425
+
426
+ .ree-lib-title {
427
+ font-size: 14px;
428
+ font-weight: 500;
429
+ }
430
+
431
+
432
+ /* ---------- 画布 ---------- */
433
+
434
+ .ree-stage-view {
435
+ display: flex;
436
+ flex: 1;
437
+ min-height: 0;
438
+ min-width: 0;
439
+ }
440
+
441
+ .ree-stage-view[hidden] {
442
+ display: none;
443
+ }
444
+
445
+ .ree-canvas,
446
+ .ree-preview-stage {
447
+ flex: 1;
448
+ min-height: 0;
449
+ min-width: 0;
450
+ overflow: auto;
451
+ }
452
+
453
+ .ree-canvas {
454
+ padding: 64px 24px 40px;
455
+ }
456
+
457
+ .ree-canvas.is-over {
458
+ outline: 2px dashed var(--ree-primary);
459
+ outline-offset: -12px;
460
+ }
461
+
462
+ .ree-email-surface {
463
+ box-sizing: border-box;
464
+ margin: 0 auto;
465
+ box-shadow: var(--ree-shadow-md);
466
+ }
467
+
468
+ .ree-root .ree-canvas-inner {
469
+ width: 100%;
470
+ box-sizing: border-box;
471
+ margin: 0 auto;
472
+ background: transparent;
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: var(--ree-block-gap, 0px);
476
+ }
477
+
478
+ .ree-preview-stage {
479
+ display: flex;
480
+ justify-content: center;
481
+ padding: 24px 16px;
482
+ }
483
+
484
+ .ree-inspector-scroll {
485
+ flex: 1;
486
+ min-height: 0;
487
+ overflow-y: auto;
488
+ }
489
+
490
+ .ree-canvas-empty {
491
+ padding: 72px 24px;
492
+ text-align: center;
493
+ color: var(--ree-muted);
494
+ border: 2px dashed var(--ree-border);
495
+ }
496
+
497
+
498
+ .ree-email-viewport { box-sizing: border-box; }
499
+
500
+ /* ---------- 区块 ---------- */
501
+
502
+ .ree-block {
503
+ position: relative;
504
+ border: 0;
505
+ border-radius: var(--ree-radius-sm);
506
+ outline: 1px solid transparent;
507
+ outline-offset: -1px;
508
+ background: transparent;
509
+ cursor: pointer;
510
+ transition: background 0.12s ease, outline-color 0.12s ease,
511
+ box-shadow 0.12s ease;
512
+ width: 100%;
513
+ display: flow-root;
514
+ }
515
+
516
+ /* hover:区块背景 + 边框均为浅蓝(参照 unlayer) */
517
+ .ree-block:hover {
518
+ background: var(--ree-accent-bg);
519
+ outline-color: var(--ree-accent-border);
520
+ }
521
+
522
+ .ree-block.is-selected {
523
+ z-index: 8;
524
+ background: var(--ree-accent-bg-strong);
525
+ outline-color: var(--ree-primary);
526
+ box-shadow: 0 0 0 1px var(--ree-primary);
527
+ }
528
+
529
+ .ree-block.is-dragging {
530
+ opacity: 0.5;
531
+ }
532
+
533
+ .ree-block.is-drop-before::before,
534
+ .ree-block.is-drop-after::after {
535
+ content: "";
536
+ position: absolute;
537
+ left: 0;
538
+ right: 0;
539
+ height: 2px;
540
+ background: var(--ree-primary);
541
+ pointer-events: none;
542
+ z-index: 9;
543
+ }
544
+
545
+ .ree-block.is-drop-before::before {
546
+ top: -1px;
547
+ }
548
+
549
+ .ree-block.is-drop-after::after {
550
+ bottom: -1px;
551
+ }
552
+
553
+ /* 左侧拖拽把手(hover / 选中时出现,可拖动排序) */
554
+ .ree-block-grip {
555
+ position: absolute;
556
+ left: -12px;
557
+ top: 50%;
558
+ transform: translateY(-50%);
559
+ z-index: 6;
560
+ appearance: none;
561
+ display: flex;
562
+ align-items: center;
563
+ justify-content: center;
564
+ width: 24px;
565
+ height: 34px;
566
+ padding: 0;
567
+ background: var(--ree-panel);
568
+ border: 1px solid var(--ree-border);
569
+ border-radius: var(--ree-radius-sm);
570
+ color: var(--ree-muted);
571
+ box-shadow: var(--ree-shadow-sm);
572
+ cursor: grab;
573
+ opacity: 0;
574
+ visibility: hidden;
575
+ pointer-events: none;
576
+ transition: opacity 0.12s ease, visibility 0.12s ease, border-color 0.12s ease,
577
+ color 0.12s ease;
578
+ }
579
+
580
+ .ree-block-grip:active {
581
+ cursor: grabbing;
582
+ }
583
+
584
+ .ree-block-grip:focus-visible {
585
+ outline: none;
586
+ box-shadow: 0 0 0 2px var(--ree-panel), 0 0 0 4px var(--ree-primary);
587
+ }
588
+
589
+ .ree-block:hover .ree-block-grip,
590
+ .ree-block.is-selected .ree-block-grip {
591
+ opacity: 1;
592
+ visibility: visible;
593
+ pointer-events: auto;
594
+ }
595
+
596
+ .ree-block:hover .ree-block-grip {
597
+ border-color: var(--ree-accent-border);
598
+ color: var(--ree-primary);
599
+ }
600
+
601
+ /* 右下角当前区块类型标签 */
602
+ .ree-block-badge {
603
+ position: absolute;
604
+ right: 8px;
605
+ bottom: -11px;
606
+ z-index: 6;
607
+ padding: 2px 9px;
608
+ font-size: 11px;
609
+ font-weight: 600;
610
+ letter-spacing: 0.02em;
611
+ line-height: 1.5;
612
+ color: var(--ree-primary);
613
+ background: var(--ree-panel);
614
+ border: 1px solid var(--ree-accent-border);
615
+ border-radius: 999px;
616
+ box-shadow: var(--ree-shadow-sm);
617
+ opacity: 0;
618
+ pointer-events: none;
619
+ transition: opacity 0.12s ease;
620
+ }
621
+
622
+ .ree-block:hover .ree-block-badge,
623
+ .ree-block.is-selected .ree-block-badge {
624
+ opacity: 1;
625
+ }
626
+
627
+ .ree-block-toolbar {
628
+ position: absolute;
629
+ top: calc(100% + 4px);
630
+ left: 8px;
631
+ z-index: 7;
632
+ display: flex;
633
+ gap: 2px;
634
+ background: var(--ree-panel, #ffffff);
635
+ border: 1px solid var(--ree-border);
636
+ border-radius: var(--ree-radius);
637
+ padding: 3px;
638
+ box-shadow: var(--ree-shadow-md);
639
+ }
640
+
641
+ .ree-block-btn {
642
+ appearance: none;
643
+ border: none;
644
+ background: transparent;
645
+ width: 26px;
646
+ height: 26px;
647
+ border-radius: var(--ree-radius-sm);
648
+ cursor: pointer;
649
+ color: var(--ree-text);
650
+ display: inline-flex;
651
+ align-items: center;
652
+ justify-content: center;
653
+ transition: background 0.12s ease, color 0.12s ease;
654
+ }
655
+
656
+ .ree-block-btn:hover {
657
+ background: var(--ree-panel-secondary);
658
+ color: var(--ree-primary);
659
+ }
660
+
661
+ .ree-block-btn.ree-danger:hover {
662
+ background: var(--ree-danger-soft);
663
+ color: var(--ree-danger);
664
+ }
665
+
666
+ .ree-block-content {
667
+ width: 100%;
668
+ overflow: hidden;
669
+ /* 预览 iframe 使用浏览器默认渲染。宿主页面的抗锯齿和连字设置不要渗进邮件正文。 */
670
+ font-feature-settings: normal;
671
+ -webkit-font-smoothing: auto;
672
+ -moz-osx-font-smoothing: auto;
673
+ }
674
+
675
+ /* 宿主样式会直接写到 p 和标题上,例如 Polaris 把它们的字重设为 450。
676
+ 这些规则压过容器上的继承,画布就会和预览不一致。正文改回继承区块排版。
677
+ strong、em、a、span 除外,行内加粗、斜体和链接色仍然有效。 */
678
+ .ree-block-content :is(p, h1, h2, h3, h4, h5, h6, li) {
679
+ font-family: inherit;
680
+ font-size: inherit;
681
+ font-weight: inherit;
682
+ font-style: inherit;
683
+ line-height: inherit;
684
+ letter-spacing: inherit;
685
+ color: inherit;
686
+ text-align: inherit;
687
+ }
688
+
689
+ /* 文案在框内编辑。工具栏和下拉要画出内容盒,不能被选中框裁掉。 */
690
+ .ree-block-content.is-inline {
691
+ overflow: visible;
692
+ }
693
+
694
+ .ree-block-static {
695
+ min-height: 0;
696
+ }
697
+
698
+ .ree-html-canvas {
699
+ position: relative;
700
+ width: 100%;
701
+ min-height: 0;
702
+ overflow: hidden;
703
+ }
704
+
705
+ .ree-html-canvas-text {
706
+ white-space: pre-wrap;
707
+ overflow-wrap: anywhere;
708
+ }
709
+
710
+ .ree-html-canvas-hitbox {
711
+ position: absolute;
712
+ inset: 0;
713
+ z-index: 2;
714
+ display: block;
715
+ width: 100%;
716
+ height: 100%;
717
+ padding: 0;
718
+ border: 0;
719
+ background: transparent;
720
+ cursor: pointer;
721
+ }
722
+
723
+ .ree-html-canvas-hitbox:focus {
724
+ outline: none;
725
+ }
726
+
727
+ .ree-html-canvas-frame {
728
+ position: absolute;
729
+ top: 0;
730
+ left: 0;
731
+ display: block;
732
+ border: 0;
733
+ transform-origin: top left;
734
+ pointer-events: none;
735
+ }
736
+
737
+ .ree-block-content a {
738
+ pointer-events: none;
739
+ }
740
+
741
+
742
+ /* ---------- 富文本 ---------- */
743
+
744
+ .ree-rte-loading {
745
+ color: var(--ree-muted);
746
+ font-size: 14px;
747
+ padding: 8px 0;
748
+ }
749
+
750
+ /* 挂到 .ree-root,避开画布 overflow,同时继承主题变量。位置按区块视口计算。 */
751
+ .ree-rte-toolbar {
752
+ position: fixed;
753
+ z-index: 80;
754
+ top: 0;
755
+ left: 0;
756
+ visibility: hidden;
757
+ display: flex;
758
+ flex-direction: column;
759
+ gap: 2px;
760
+ width: auto;
761
+ margin: 0;
762
+ padding: 4px;
763
+ background: var(--ree-panel, #ffffff);
764
+ border: 1px solid var(--ree-border, #e3e3e5);
765
+ border-radius: var(--ree-radius, 8px);
766
+ box-shadow: var(--ree-shadow-md, 0 2px 16px rgba(31, 33, 36, 0.08));
767
+ color: var(--ree-text, #202223);
768
+ font-family: var(--ree-font, Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
769
+ font-weight: 500;
770
+ }
771
+
772
+ .ree-rte-toolbar.is-placed {
773
+ visibility: visible;
774
+ }
775
+
776
+ .ree-rte-row {
777
+ display: flex;
778
+ align-items: center;
779
+ flex-wrap: wrap;
780
+ gap: 2px;
781
+ }
782
+
783
+ .ree-rte-sep {
784
+ flex-shrink: 0;
785
+ align-self: stretch;
786
+ width: 1px;
787
+ margin: 4px 4px;
788
+ background: var(--ree-border);
789
+ }
790
+
791
+ .ree-tool-btn,
792
+ .ree-rte-select {
793
+ appearance: none;
794
+ border: none;
795
+ background: transparent;
796
+ height: 28px;
797
+ border-radius: var(--ree-radius-sm);
798
+ cursor: pointer;
799
+ color: var(--ree-text);
800
+ font: inherit;
801
+ font-size: 13px;
802
+ line-height: 1;
803
+ transition: background 0.12s ease, color 0.12s ease;
804
+ }
805
+
806
+ .ree-tool-btn {
807
+ display: inline-flex;
808
+ align-items: center;
809
+ justify-content: center;
810
+ min-width: 28px;
811
+ padding: 0 4px;
812
+ }
813
+
814
+ .ree-rte-select {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ gap: 4px;
818
+ max-width: 168px;
819
+ padding: 0 6px 0 8px;
820
+ }
821
+
822
+ .ree-rte-select-label {
823
+ overflow: hidden;
824
+ text-overflow: ellipsis;
825
+ white-space: nowrap;
826
+ }
827
+
828
+ .ree-tool-btn:hover,
829
+ .ree-tool-btn.is-open,
830
+ .ree-rte-select:hover,
831
+ .ree-rte-select.is-open {
832
+ background: var(--ree-panel-secondary);
833
+ }
834
+
835
+ .ree-tool-btn.is-active {
836
+ background: #202223;
837
+ color: #ffffff;
838
+ }
839
+
840
+ .ree-tool-btn:disabled {
841
+ opacity: 0.35;
842
+ cursor: default;
843
+ }
844
+
845
+ .ree-tool-btn:disabled:hover {
846
+ background: transparent;
847
+ color: var(--ree-text);
848
+ }
849
+
850
+ .ree-tool-bold {
851
+ font-weight: 700;
852
+ }
853
+
854
+ .ree-tool-italic {
855
+ font-family: Georgia, "Times New Roman", serif;
856
+ font-style: italic;
857
+ }
858
+
859
+ .ree-tool-underline {
860
+ text-decoration: underline;
861
+ text-underline-offset: 2px;
862
+ }
863
+
864
+ .ree-tool-strike {
865
+ text-decoration: line-through;
866
+ }
867
+
868
+ .ree-tool-color {
869
+ font-weight: 700;
870
+ font-size: 14px;
871
+ line-height: 1;
872
+ border-bottom: 3px solid currentColor;
873
+ padding-bottom: 1px;
874
+ }
875
+
876
+ .ree-rte-pop {
877
+ position: relative;
878
+ }
879
+
880
+ .ree-rte-menu {
881
+ position: absolute;
882
+ top: calc(100% + 6px);
883
+ left: 0;
884
+ z-index: 30;
885
+ min-width: 180px;
886
+ max-height: 280px;
887
+ overflow: auto;
888
+ padding: 6px;
889
+ background: var(--ree-panel, #ffffff);
890
+ border: 1px solid var(--ree-border, #e3e3e5);
891
+ border-radius: var(--ree-radius, 8px);
892
+ box-shadow: var(--ree-shadow-lg, 0 6px 32px rgba(31, 33, 36, 0.16));
893
+ color: var(--ree-text, #202223);
894
+ font-size: 14px;
895
+ }
896
+
897
+ .ree-rte-menu.is-end {
898
+ left: auto;
899
+ right: 0;
900
+ }
901
+
902
+ .ree-rte-menu.is-link {
903
+ min-width: 0;
904
+ padding: 0;
905
+ overflow: visible;
906
+ }
907
+
908
+ .ree-rte-pop.is-up .ree-rte-menu {
909
+ top: auto;
910
+ bottom: calc(100% + 6px);
911
+ }
912
+
913
+ .ree-rte-option {
914
+ display: flex;
915
+ width: 100%;
916
+ border: none;
917
+ background: transparent;
918
+ padding: 7px 8px;
919
+ border-radius: var(--ree-radius-sm);
920
+ cursor: pointer;
921
+ color: var(--ree-text);
922
+ font: inherit;
923
+ font-size: 13px;
924
+ text-align: left;
925
+ }
926
+
927
+ .ree-rte-option:hover,
928
+ .ree-rte-option.is-active {
929
+ background: var(--ree-panel-secondary);
930
+ }
931
+
932
+ .ree-rte-option.is-active {
933
+ font-weight: 600;
934
+ }
935
+
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
+ .ree-rte-emoji-grid {
977
+ display: grid;
978
+ grid-template-columns: repeat(8, 28px);
979
+ gap: 2px;
980
+ }
981
+
982
+ .ree-rte-emoji {
983
+ width: 28px;
984
+ height: 28px;
985
+ padding: 0;
986
+ border: none;
987
+ border-radius: var(--ree-radius-sm);
988
+ background: transparent;
989
+ cursor: pointer;
990
+ 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;
1010
+ }
1011
+
1012
+ .ree-rte-link-actions .ree-btn {
1013
+ padding: 6px 12px;
1014
+ }
1015
+
1016
+ .ree-rte-variables {
1017
+ min-width: 220px;
1018
+ }
1019
+
1020
+ .ree-rte .ProseMirror {
1021
+ outline: none;
1022
+ display: flow-root;
1023
+ line-height: inherit;
1024
+ }
1025
+
1026
+ .ree-rte .ProseMirror p {
1027
+ margin: 0;
1028
+ margin-top: var(--ree-paragraph-gap, 0px);
1029
+ }
1030
+
1031
+ .ree-rte .ProseMirror p + p {
1032
+ margin-top: var(--ree-paragraph-gap, var(--ree-paragraph-spacing, 0px));
1033
+ }
1034
+
1035
+ .ree-rte-metric {
1036
+ display: grid;
1037
+ gap: 8px;
1038
+ width: 220px;
1039
+ padding: 4px;
1040
+ }
1041
+
1042
+ .ree-rte-metric-label {
1043
+ display: flex;
1044
+ justify-content: space-between;
1045
+ gap: 8px;
1046
+ color: var(--ree-muted);
1047
+ font-size: 12px;
1048
+ }
1049
+
1050
+ .ree-rte-option:disabled {
1051
+ opacity: 0.35;
1052
+ cursor: default;
1053
+ }
1054
+
1055
+ .ree-rte .ProseMirror li p {
1056
+ margin: 0;
1057
+ }
1058
+
1059
+ .ree-rte .ProseMirror p.is-editor-empty:first-child::before {
1060
+ content: attr(data-placeholder);
1061
+ color: var(--ree-muted);
1062
+ float: left;
1063
+ height: 0;
1064
+ pointer-events: none;
1065
+ }
1066
+
1067
+ .ree-rte .ProseMirror a {
1068
+ color: var(--ree-link-color, #005bd3);
1069
+ text-decoration: var(--ree-link-decoration, underline);
1070
+ }
1071
+
1072
+ .ree-rte .ProseMirror ul,
1073
+ .ree-rte .ProseMirror ol {
1074
+ margin: var(--ree-list-spacing, 0.25em) 0;
1075
+ padding-left: var(--ree-list-indent, 1.4em);
1076
+ }
1077
+
1078
+ .ree-rte .ProseMirror sup,
1079
+ .ree-rte .ProseMirror sub {
1080
+ font-size: 0.75em;
1081
+ }
1082
+
1083
+
1084
+ /* ---------- 变量 ---------- */
1085
+
1086
+ .ree-var-wrap {
1087
+ position: relative;
1088
+ }
1089
+
1090
+ .ree-var-btn {
1091
+ appearance: none;
1092
+ border: none;
1093
+ background: transparent;
1094
+ min-width: 30px;
1095
+ height: 24px;
1096
+ padding: 0 6px;
1097
+ border-radius: var(--ree-radius-sm);
1098
+ cursor: pointer;
1099
+ color: var(--ree-muted);
1100
+ font-size: 12px;
1101
+ }
1102
+
1103
+ .ree-var-btn:hover {
1104
+ background: var(--ree-panel-secondary);
1105
+ }
1106
+
1107
+ .ree-var-menu {
1108
+ position: absolute;
1109
+ top: 100%;
1110
+ left: 0;
1111
+ z-index: 20;
1112
+ min-width: 200px;
1113
+ background: var(--ree-panel, #ffffff);
1114
+ border: 1px solid var(--ree-border, #e3e3e5);
1115
+ border-radius: var(--ree-radius, 8px);
1116
+ box-shadow: var(--ree-shadow-lg, 0 6px 32px rgba(31, 33, 36, 0.16));
1117
+ padding: 6px;
1118
+ max-height: 240px;
1119
+ overflow-y: auto;
1120
+ color: var(--ree-text, #202223);
1121
+ }
1122
+
1123
+ .ree-var-item {
1124
+ display: flex;
1125
+ flex-direction: column;
1126
+ align-items: flex-start;
1127
+ width: 100%;
1128
+ border: none;
1129
+ background: transparent;
1130
+ padding: 8px 10px;
1131
+ border-radius: var(--ree-radius-sm);
1132
+ cursor: pointer;
1133
+ text-align: left;
1134
+ }
1135
+
1136
+ .ree-var-item:hover {
1137
+ background: var(--ree-panel-secondary);
1138
+ }
1139
+
1140
+ .ree-var-name {
1141
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1142
+ font-size: 12px;
1143
+ color: var(--ree-primary);
1144
+ }
1145
+
1146
+ .ree-var-label {
1147
+ font-size: 12px;
1148
+ color: var(--ree-muted);
1149
+ }
1150
+
1151
+
1152
+ /* ---------- 配置区 ---------- */
1153
+
1154
+ .ree-inspector {
1155
+ --ree-inspector-section-space: 16px;
1156
+ padding: 20px 16px;
1157
+ display: flex;
1158
+ flex-direction: column;
1159
+ }
1160
+
1161
+ .ree-inspector-empty {
1162
+ padding: 40px 16px;
1163
+ text-align: center;
1164
+ color: var(--ree-muted);
1165
+ font-size: 14px;
1166
+ }
1167
+
1168
+ .ree-inspector-head {
1169
+ display: flex;
1170
+ align-items: center;
1171
+ gap: 10px;
1172
+ padding-bottom: var(--ree-inspector-section-space);
1173
+ font-weight: 600;
1174
+ }
1175
+
1176
+ .ree-inspector-icon {
1177
+ display: inline-flex;
1178
+ color: var(--ree-muted);
1179
+ }
1180
+
1181
+ .ree-inspector-title {
1182
+ font-size: 15px;
1183
+ }
1184
+
1185
+ .ree-inspector-section {
1186
+ border-top: 1px solid var(--ree-border-subdued);
1187
+ display: flex;
1188
+ flex-direction: column;
1189
+ }
1190
+
1191
+ .ree-inspector-section-toggle {
1192
+ display: flex;
1193
+ align-items: center;
1194
+ justify-content: space-between;
1195
+ width: 100%;
1196
+ margin: 0;
1197
+ padding: var(--ree-inspector-section-space) 0;
1198
+ border: 0;
1199
+ background: transparent;
1200
+ cursor: pointer;
1201
+ font: inherit;
1202
+ font-size: 13px;
1203
+ font-weight: 600;
1204
+ color: var(--ree-text);
1205
+ text-align: left;
1206
+ }
1207
+
1208
+ .ree-inspector-section-toggle svg {
1209
+ flex-shrink: 0;
1210
+ color: var(--ree-muted);
1211
+ transition: transform 0.15s ease;
1212
+ }
1213
+
1214
+ .ree-inspector-section-toggle[aria-expanded="false"] svg {
1215
+ transform: rotate(-90deg);
1216
+ }
1217
+
1218
+ .ree-inspector-section-body {
1219
+ display: flex;
1220
+ flex-direction: column;
1221
+ gap: 14px;
1222
+ padding-bottom: var(--ree-inspector-section-space);
1223
+ }
1224
+
1225
+ /* Global 没有标题区,容器顶部留白会叠到第一个类目上。 */
1226
+ .ree-inspector-global {
1227
+ padding-top: 0;
1228
+ padding-bottom: 0;
1229
+ }
1230
+
1231
+ .ree-inspector-global > .ree-inspector-section:first-child {
1232
+ border-top: 0;
1233
+ }
1234
+
1235
+ .ree-inspector-hint {
1236
+ font-size: 13px;
1237
+ color: var(--ree-muted);
1238
+ }
1239
+
1240
+ .ree-field {
1241
+ display: flex;
1242
+ flex-direction: column;
1243
+ gap: 6px;
1244
+ }
1245
+
1246
+ .ree-field-label {
1247
+ display: flex;
1248
+ align-items: center;
1249
+ justify-content: space-between;
1250
+ gap: 8px;
1251
+ font-size: 13px;
1252
+ color: var(--ree-muted, #6d7175);
1253
+ }
1254
+
1255
+ .ree-field-meta {
1256
+ display: inline-flex;
1257
+ align-items: center;
1258
+ gap: 6px;
1259
+ margin-left: auto;
1260
+ }
1261
+
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;
1273
+ }
1274
+
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);
1279
+ }
1280
+
1281
+ .ree-select {
1282
+ position: relative;
1283
+ }
1284
+
1285
+ .ree-select .ree-input {
1286
+ appearance: none;
1287
+ -webkit-appearance: none;
1288
+ padding-right: 36px;
1289
+ background-color: var(--ree-panel);
1290
+ }
1291
+
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);
1301
+ }
1302
+
1303
+ .ree-textarea {
1304
+ resize: vertical;
1305
+ min-height: 60px;
1306
+ line-height: 1.5;
1307
+ }
1308
+
1309
+ .ree-html-editor {
1310
+ --ree-html-editor-min: 220px;
1311
+ border: 1px solid var(--ree-border);
1312
+ border-radius: var(--ree-radius);
1313
+ overflow: hidden;
1314
+ background: #f6f8fa;
1315
+ }
1316
+
1317
+ .ree-html-editor:focus-within {
1318
+ border-color: var(--ree-primary);
1319
+ box-shadow: 0 0 0 1px var(--ree-primary);
1320
+ }
1321
+
1322
+ .ree-html-editor .cm-editor {
1323
+ width: 100%;
1324
+ max-height: 440px;
1325
+ background: #f6f8fa;
1326
+ }
1327
+
1328
+ .ree-html-editor .cm-scroller {
1329
+ min-height: var(--ree-html-editor-min);
1330
+ max-height: 440px;
1331
+ overflow: auto;
1332
+ }
1333
+
1334
+ .ree-html-editor .ree-cm-template {
1335
+ color: #9a6700;
1336
+ background: #fff8c5;
1337
+ border-radius: 2px;
1338
+ }
1339
+
1340
+ .ree-color-grid {
1341
+ display: grid;
1342
+ grid-template-columns: 1fr 1fr;
1343
+ gap: 12px 16px;
1344
+ }
1345
+
1346
+ .ree-color-chip-row {
1347
+ display: flex;
1348
+ align-items: center;
1349
+ gap: 2px;
1350
+ min-width: 0;
1351
+ }
1352
+
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
+ .ree-field-value {
1431
+ font-size: 12px;
1432
+ color: var(--ree-muted);
1433
+ font-variant-numeric: tabular-nums;
1434
+ }
1435
+
1436
+ .ree-input-group {
1437
+ display: flex;
1438
+ align-items: center;
1439
+ gap: 8px;
1440
+ }
1441
+
1442
+ .ree-input-group .ree-input {
1443
+ flex: 1;
1444
+ }
1445
+
1446
+ .ree-input-unit {
1447
+ font-size: 13px;
1448
+ color: var(--ree-muted);
1449
+ flex-shrink: 0;
1450
+ }
1451
+
1452
+ .ree-range-row {
1453
+ display: flex;
1454
+ align-items: center;
1455
+ gap: 8px;
1456
+ width: 100%;
1457
+ }
1458
+
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
+ .ree-align-row {
1536
+ display: flex;
1537
+ gap: 4px;
1538
+ }
1539
+
1540
+ .ree-align-btn {
1541
+ flex: 1;
1542
+ appearance: none;
1543
+ border: 1px solid var(--ree-border);
1544
+ background: var(--ree-panel);
1545
+ border-radius: var(--ree-radius-sm);
1546
+ padding: 7px 0;
1547
+ cursor: pointer;
1548
+ color: var(--ree-muted);
1549
+ font-size: 14px;
1550
+ transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;
1551
+ }
1552
+
1553
+ .ree-align-btn:hover {
1554
+ background: var(--ree-panel-secondary);
1555
+ }
1556
+
1557
+ .ree-align-btn.is-active {
1558
+ border-color: var(--ree-primary);
1559
+ color: var(--ree-primary);
1560
+ background: var(--ree-primary-soft);
1561
+ }
1562
+
1563
+
1564
+ .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;
1571
+ margin: 0;
1572
+ border: 1px solid #1a1a1a;
1573
+ border-radius: 3px;
1574
+ background: #ffffff;
1575
+ display: grid;
1576
+ place-content: center;
1577
+ cursor: pointer;
1578
+ flex-shrink: 0;
1579
+ }
1580
+ .ree-spacing-link input[type="checkbox"]:checked {
1581
+ background: #1a1a1a;
1582
+ border-color: #1a1a1a;
1583
+ }
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);
1591
+ }
1592
+ .ree-spacing-link input[type="checkbox"]:focus-visible {
1593
+ outline: 2px solid #1a1a1a;
1594
+ outline-offset: 2px;
1595
+ }
1596
+ .ree-spacing-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
1597
+
1598
+ /* ---------- 拖拽浮层 ---------- */
1599
+
1600
+ .ree-drag-overlay {
1601
+ display: flex;
1602
+ align-items: center;
1603
+ gap: 10px;
1604
+ padding: 12px 16px;
1605
+ background: var(--ree-panel);
1606
+ border: 1px solid var(--ree-primary);
1607
+ box-shadow: var(--ree-shadow-lg);
1608
+ cursor: grabbing;
1609
+ font-weight: 500;
1610
+ }
1611
+
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
+ }