better-react-email-editor 0.1.4 → 0.1.6

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
@@ -1,1643 +1,1724 @@
1
- /*
2
- * better-react-email-editor
3
- *
4
- * Every class is prefixed with `bree-`. Theme the editor by overriding the
5
- * custom properties below on `.bree` (or on your own class passed through
6
- * `className`), and restyle any part through its class or `className` prop.
7
- */
8
-
9
- .bree {
10
- --bree-bg: #ffffff;
11
- --bree-bg-subtle: #f8fafc;
12
- --bree-border: #e5e7eb;
13
- --bree-border-strong: #d1d5db;
14
- --bree-text: #111827;
15
- --bree-text-secondary: #334155;
16
- --bree-muted: #6b7280;
17
- --bree-accent: #2563eb;
18
- --bree-accent-hover: #1d4ed8;
19
- --bree-accent-soft: #eff6ff;
20
- --bree-danger: #dc2626;
21
- --bree-radius: 8px;
22
- --bree-frame-gap: 4px;
23
- --bree-canvas-bg: #eef1f5;
24
- --bree-topbar-height: 56px;
25
- --bree-sidebar-width: 360px;
26
- --bree-layers-width: 270px;
27
- --bree-font: Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
28
- font-family: var(--bree-font);
29
- color: var(--bree-text);
30
- -webkit-font-smoothing: antialiased;
31
- }
32
-
33
- .bree-root {
34
- height: 100%;
35
- min-height: 0;
36
- }
37
-
38
- /* Zero-specificity resets: any class of the editor (or yours) wins over them. */
39
- :where(.bree),
40
- :where(.bree) *,
41
- :where(.bree) *::before,
42
- :where(.bree) *::after {
43
- box-sizing: border-box;
44
- }
45
-
46
- :where(.bree) button {
47
- font: inherit;
48
- color: inherit;
49
- }
50
-
51
- /* ---------------------------------------------------------------------------
52
- * App layout
53
- * ------------------------------------------------------------------------- */
54
-
55
- /* Default layout of <BetterEmailEditor>. With <EditorRoot>, lay the parts out yourself. */
56
- .bree-layout {
57
- display: grid;
58
- grid-template-columns: minmax(0, 1fr);
59
- grid-template-rows: minmax(0, 1fr);
60
- grid-template-areas: 'canvas';
61
- height: 100%;
62
- overflow: hidden;
63
- }
64
-
65
- .bree-layout.bree-with-topbar {
66
- grid-template-rows: var(--bree-topbar-height) minmax(0, 1fr);
67
- grid-template-areas:
68
- 'top'
69
- 'canvas';
70
- }
71
-
72
- .bree-layout.bree-with-sidebar {
73
- grid-template-columns: minmax(0, 1fr) var(--bree-sidebar-width);
74
- grid-template-areas: 'canvas side';
75
- }
76
-
77
- .bree-layout.bree-with-topbar.bree-with-sidebar {
78
- grid-template-areas:
79
- 'top top'
80
- 'canvas side';
81
- }
82
-
83
- .bree-layout.bree-with-layers {
84
- grid-template-columns: var(--bree-layers-width) minmax(0, 1fr);
85
- grid-template-areas: 'layers canvas';
86
- }
87
-
88
- .bree-layout.bree-with-topbar.bree-with-layers {
89
- grid-template-areas:
90
- 'top top'
91
- 'layers canvas';
92
- }
93
-
94
- .bree-layout.bree-with-layers.bree-with-sidebar {
95
- grid-template-columns: var(--bree-layers-width) minmax(0, 1fr) var(--bree-sidebar-width);
96
- grid-template-areas: 'layers canvas side';
97
- }
98
-
99
- .bree-layout.bree-with-topbar.bree-with-layers.bree-with-sidebar {
100
- grid-template-areas:
101
- 'top top top'
102
- 'layers canvas side';
103
- }
104
-
105
- .bree-layout > .bree-topbar {
106
- grid-area: top;
107
- }
108
-
109
- .bree-layout > .bree-layers {
110
- grid-area: layers;
111
- }
112
-
113
- .bree-layout > .bree-canvas {
114
- grid-area: canvas;
115
- }
116
-
117
- .bree-layout > .bree-sidebar {
118
- grid-area: side;
119
- }
120
-
121
-
122
- .bree-topbar {
123
- display: flex;
124
- height: var(--bree-topbar-height);
125
- align-items: center;
126
- gap: 16px;
127
- padding: 0 16px;
128
- border-bottom: 1px solid var(--bree-border);
129
- background: var(--bree-bg);
130
- z-index: 5;
131
- }
132
-
133
- .bree-topbar-start,
134
- .bree-topbar-actions {
135
- flex: 1;
136
- display: flex;
137
- align-items: center;
138
- gap: 8px;
139
- min-width: 0;
140
- }
141
-
142
- .bree-topbar-actions {
143
- justify-content: flex-end;
144
- }
145
-
146
- .bree-topbar-center {
147
- display: flex;
148
- justify-content: center;
149
- align-items: center;
150
- gap: 12px;
151
- }
152
-
153
- .bree-btn-group {
154
- display: flex;
155
- gap: 2px;
156
- }
157
-
158
- .bree-btn {
159
- display: inline-flex;
160
- align-items: center;
161
- gap: 6px;
162
- height: 34px;
163
- padding: 0 14px;
164
- border-radius: var(--bree-radius);
165
- border: 1px solid var(--bree-border-strong);
166
- background: var(--bree-bg);
167
- font-size: 13px;
168
- font-weight: 550;
169
- cursor: pointer;
170
- white-space: nowrap;
171
- }
172
-
173
- .bree-btn:hover {
174
- background: var(--bree-bg-subtle);
175
- }
176
-
177
- .bree-btn.bree-primary {
178
- background: var(--bree-accent);
179
- border-color: var(--bree-accent);
180
- color: #fff;
181
- }
182
-
183
- .bree-btn.bree-primary:hover {
184
- background: var(--bree-accent-hover);
185
- }
186
-
187
- .bree-btn.bree-ghost {
188
- border-color: transparent;
189
- }
190
-
191
- .bree-icon-button {
192
- display: inline-grid;
193
- place-items: center;
194
- width: 32px;
195
- height: 32px;
196
- border: 0;
197
- border-radius: var(--bree-radius);
198
- background: transparent;
199
- cursor: pointer;
200
- color: var(--bree-muted);
201
- }
202
-
203
- .bree-icon-button:hover:not(:disabled) {
204
- background: var(--bree-bg-subtle);
205
- color: var(--bree-text);
206
- }
207
-
208
- .bree-icon-button:disabled {
209
- opacity: 0.35;
210
- cursor: default;
211
- }
212
-
213
- /* ---------------------------------------------------------------------------
214
- * Canvas (the real editor)
215
- * ------------------------------------------------------------------------- */
216
-
217
- .bree-canvas {
218
- position: relative;
219
- overflow: auto;
220
- min-height: 0;
221
- background: var(--bree-canvas-bg);
222
- }
223
-
224
- .bree-canvas-content {
225
- min-height: 100%;
226
- }
227
-
228
- .bree-canvas-content > .tiptap {
229
- min-height: 100%;
230
- padding-bottom: 160px !important;
231
- }
232
-
233
- .bree-canvas .tiptap .node-container {
234
- margin-left: auto;
235
- margin-right: auto;
236
- max-width: 100%;
237
- transition: width 0.2s ease, max-width 0.2s ease;
238
- box-shadow: 0 1px 2px rgb(15 23 42 / 0.06), 0 8px 24px rgb(15 23 42 / 0.06);
239
- }
240
-
241
- .bree-canvas[data-device='mobile'] .tiptap .node-container {
242
- width: 375px !important;
243
- max-width: 375px !important;
244
- }
245
-
246
- .bree-canvas[data-device='mobile'] .tiptap .node-columns {
247
- flex-direction: column;
248
- }
249
-
250
- .bree-canvas .tiptap .ProseMirror-selectednode {
251
- outline: none;
252
- }
253
-
254
- .bree-canvas .tiptap img {
255
- max-width: 100%;
256
- height: auto;
257
- display: block;
258
- }
259
-
260
- .bree-canvas .tiptap img[alignment='center'] {
261
- margin-left: auto;
262
- margin-right: auto;
263
- }
264
-
265
- .bree-canvas .tiptap img[alignment='right'] {
266
- margin-left: auto;
267
- }
268
-
269
- .bree-canvas .tiptap .align-center {
270
- text-align: center;
271
- }
272
-
273
- .bree-canvas .tiptap .align-right {
274
- text-align: right;
275
- }
276
-
277
- .bree-canvas .tiptap a.node-button {
278
- display: inline-block;
279
- cursor: text;
280
- }
281
-
282
- .bree-canvas .tiptap .node-column {
283
- position: relative;
284
- }
285
-
286
- .bree-canvas .tiptap .node-column[style*='width'] {
287
- flex: none;
288
- }
289
-
290
- /* Empty drop zones, like Unlayer's "No content here". */
291
- .bree-canvas .tiptap .node-column:has(> p:only-child > br.ProseMirror-trailingBreak:only-child),
292
- .bree-canvas .tiptap .node-section:has(> p:only-child > br.ProseMirror-trailingBreak:only-child) {
293
- min-height: 72px;
294
- outline: 1px dashed #93c5fd;
295
- outline-offset: -1px;
296
- background: #f8fbff;
297
- border-radius: 6px;
298
- }
299
-
300
- .bree-canvas .tiptap .node-column:has(> p:only-child > br.ProseMirror-trailingBreak:only-child)::after,
301
- .bree-canvas .tiptap .node-section:has(> p:only-child > br.ProseMirror-trailingBreak:only-child)::after {
302
- content: var(--bree-empty-zone-label, 'Drag content here');
303
- position: absolute;
304
- inset: 0;
305
- display: grid;
306
- place-items: center;
307
- color: #60a5fa;
308
- font: 500 12px/1.2 Inter, system-ui, sans-serif;
309
- pointer-events: none;
310
- }
311
-
312
- .bree-canvas .tiptap .node-section {
313
- position: relative;
314
- display: block;
315
- }
316
-
317
- .bree-canvas .tiptap .node-spacer {
318
- border-radius: 4px;
319
- }
320
-
321
- .bree-canvas .tiptap .node-spacer:hover,
322
- .bree-canvas .tiptap .node-spacer.ProseMirror-selectednode {
323
- background-image: repeating-linear-gradient(-45deg, rgb(37 99 235 / 0.1) 0 6px, transparent 6px 12px);
324
- }
325
-
326
- .bree-canvas .tiptap .node-socialLinks {
327
- padding: 8px 0;
328
- line-height: 0;
329
- }
330
-
331
- .bree-canvas .tiptap .node-socialLinks img {
332
- display: inline-block;
333
- vertical-align: middle;
334
- }
335
-
336
- .bree-canvas .tiptap .node-socialLinks-item {
337
- display: inline-block;
338
- }
339
-
340
- .bree-canvas .tiptap .node-htmlBlock {
341
- cursor: default;
342
- }
343
-
344
- /* ---------------------------------------------------------------------------
345
- * Canvas overlay: hover / selection frames, toolbar, drop indicator
346
- * ------------------------------------------------------------------------- */
347
-
348
- .bree-ov-layer {
349
- position: absolute;
350
- top: 0;
351
- left: 0;
352
- width: 0;
353
- height: 0;
354
- z-index: 20;
355
- pointer-events: none;
356
- }
357
-
358
- .bree-ov-frame {
359
- position: absolute;
360
- pointer-events: none;
361
- border-radius: 2px;
362
- }
363
-
364
- /* Hover and selection frames sit a few pixels off the block, not on its content. */
365
- .bree-ov-hover,
366
- .bree-ov-selected {
367
- box-sizing: content-box;
368
- padding: var(--bree-frame-gap);
369
- margin: calc(var(--bree-frame-gap) * -1);
370
- }
371
-
372
- .bree-ov-hover {
373
- box-shadow: 0 0 0 1px #60a5fa;
374
- }
375
-
376
- .bree-ov-selected {
377
- box-shadow: 0 0 0 2px var(--bree-accent);
378
- }
379
-
380
- .bree-ov-ghost,
381
- .bree-ov-ghost * {
382
- opacity: 0;
383
- pointer-events: none !important;
384
- }
385
-
386
- .bree-ov-source {
387
- background: repeating-linear-gradient(45deg, rgb(37 99 235 / 0.1) 0 6px, rgb(37 99 235 / 0.03) 6px 12px);
388
- box-shadow: 0 0 0 1px #93c5fd;
389
- }
390
-
391
- .bree-ov-tag {
392
- position: absolute;
393
- top: -21px;
394
- left: -2px;
395
- height: 21px;
396
- padding: 0 8px;
397
- border: 0;
398
- border-radius: 4px 4px 0 0;
399
- background: #60a5fa;
400
- color: #fff;
401
- font: 600 11px/21px Inter, system-ui, sans-serif;
402
- white-space: nowrap;
403
- pointer-events: auto;
404
- cursor: pointer;
405
- }
406
-
407
- .bree-ov-tag-selected {
408
- background: var(--bree-accent);
409
- cursor: default;
410
- left: -2px;
411
- }
412
-
413
- .bree-ov-handle {
414
- position: absolute;
415
- top: 50%;
416
- left: -30px;
417
- transform: translateY(-50%);
418
- display: grid;
419
- place-items: center;
420
- width: 22px;
421
- height: 30px;
422
- border-radius: 6px;
423
- background: #fff;
424
- border: 1px solid #bfdbfe;
425
- color: var(--bree-accent);
426
- box-shadow: 0 1px 3px rgb(15 23 42 / 0.12);
427
- cursor: grab;
428
- pointer-events: auto;
429
- }
430
-
431
- .bree-ov-toolbar {
432
- position: absolute;
433
- top: -2px;
434
- left: calc(100% + 8px);
435
- display: flex;
436
- flex-direction: column;
437
- gap: 2px;
438
- padding: 3px;
439
- border-radius: 8px;
440
- background: var(--bree-accent);
441
- box-shadow: 0 4px 12px rgb(37 99 235 / 0.25);
442
- pointer-events: auto;
443
- }
444
-
445
- .bree-ov-tool {
446
- display: grid;
447
- place-items: center;
448
- width: 28px;
449
- height: 28px;
450
- border: 0;
451
- border-radius: 4px;
452
- background: transparent;
453
- color: #fff;
454
- cursor: pointer;
455
- }
456
-
457
- .bree-ov-tool:hover {
458
- background: rgb(255 255 255 / 0.2);
459
- }
460
-
461
- .bree-ov-tool.bree-ov-danger:hover {
462
- background: var(--bree-danger);
463
- }
464
-
465
- .bree-ov-handle:hover {
466
- background: var(--bree-accent-soft);
467
- }
468
-
469
- .bree-ov-handle:active {
470
- cursor: grabbing;
471
- }
472
-
473
- .bree-ov-handle:focus {
474
- outline: none;
475
- }
476
-
477
- .bree-ov-dropline {
478
- position: absolute;
479
- height: 0;
480
- border-top: 3px solid var(--bree-accent);
481
- margin-top: -1.5px;
482
- border-radius: 3px;
483
- box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
484
- }
485
-
486
- .bree-ov-dropline-label {
487
- position: absolute;
488
- top: -12px;
489
- left: 50%;
490
- transform: translateX(-50%);
491
- padding: 3px 10px;
492
- border-radius: 999px;
493
- background: var(--bree-accent);
494
- color: #fff;
495
- font: 600 11px/1.3 Inter, system-ui, sans-serif;
496
- white-space: nowrap;
497
- }
498
-
499
- .bree-ov-dropzone {
500
- position: absolute;
501
- display: grid;
502
- place-items: center;
503
- border: 2px dashed var(--bree-accent);
504
- border-radius: 6px;
505
- background: #eff6ff;
506
- color: var(--bree-accent);
507
- font: 600 12px/1.3 Inter, system-ui, sans-serif;
508
- }
509
-
510
- .bree-ov-dropzone span {
511
- display: inline-flex;
512
- align-items: center;
513
- gap: 4px;
514
- }
515
-
516
- /* ---------------------------------------------------------------------------
517
- * Sidebar
518
- * ------------------------------------------------------------------------- */
519
-
520
- .bree-sidebar {
521
- display: flex;
522
- flex-direction: column;
523
- min-height: 0;
524
- border-left: 1px solid var(--bree-border);
525
- background: var(--bree-bg);
526
- outline: none;
527
- font-size: 13px;
528
- }
529
-
530
- .bree-content-panel,
531
- .bree-properties {
532
- display: flex;
533
- flex-direction: column;
534
- min-height: 0;
535
- flex: 1;
536
- }
537
-
538
- .bree-panel-scroll {
539
- flex: 1;
540
- overflow: auto;
541
- padding: 4px 16px 24px;
542
- }
543
-
544
- .bree-tabs {
545
- display: flex;
546
- border-bottom: 1px solid var(--bree-border);
547
- padding: 0 8px;
548
- }
549
-
550
- .bree-tabs button {
551
- flex: 1;
552
- height: 46px;
553
- border: 0;
554
- background: none;
555
- color: var(--bree-muted);
556
- font-weight: 600;
557
- font-size: 13px;
558
- border-bottom: 2px solid transparent;
559
- cursor: pointer;
560
- }
561
-
562
- .bree-tabs button.bree-active {
563
- color: var(--bree-accent);
564
- border-bottom-color: var(--bree-accent);
565
- }
566
-
567
- .bree-tabs.bree-compact {
568
- border: 0;
569
- padding: 0;
570
- gap: 4px;
571
- }
572
-
573
- .bree-tabs.bree-compact button {
574
- flex: none;
575
- height: 34px;
576
- padding: 0 12px;
577
- border-radius: var(--bree-radius);
578
- border: 0;
579
- }
580
-
581
- .bree-tabs.bree-compact button.bree-active {
582
- background: var(--bree-accent-soft);
583
- }
584
-
585
- .bree-panel-title {
586
- margin: 18px 0 10px;
587
- font-size: 11px;
588
- font-weight: 700;
589
- letter-spacing: 0.06em;
590
- text-transform: uppercase;
591
- color: var(--bree-muted);
592
- }
593
-
594
- .bree-tiles {
595
- display: grid;
596
- grid-template-columns: repeat(3, 1fr);
597
- gap: 8px;
598
- }
599
-
600
- .bree-tile {
601
- display: flex;
602
- flex-direction: column;
603
- align-items: center;
604
- justify-content: center;
605
- gap: 8px;
606
- height: 84px;
607
- border: 1px solid var(--bree-border);
608
- border-radius: 10px;
609
- background: var(--bree-bg);
610
- cursor: grab;
611
- transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s;
612
- }
613
-
614
- .bree-tile:hover {
615
- border-color: #93c5fd;
616
- box-shadow: 0 4px 14px rgb(37 99 235 / 0.12);
617
- transform: translateY(-1px);
618
- }
619
-
620
- .bree-tile:active {
621
- cursor: grabbing;
622
- }
623
-
624
- .bree-tile-icon {
625
- color: var(--bree-text-secondary);
626
- display: grid;
627
- place-items: center;
628
- }
629
-
630
- .bree-tile:hover .bree-tile-icon {
631
- color: var(--bree-accent);
632
- }
633
-
634
- .bree-tile-label {
635
- font-size: 12px;
636
- font-weight: 550;
637
- color: var(--bree-text-secondary);
638
- }
639
-
640
- .bree-hint {
641
- margin: 14px 0 0;
642
- color: var(--bree-muted);
643
- font-size: 12px;
644
- line-height: 1.5;
645
- }
646
-
647
- .bree-block-list {
648
- display: flex;
649
- flex-direction: column;
650
- gap: 10px;
651
- padding-top: 12px;
652
- }
653
-
654
- .bree-block-card {
655
- display: flex;
656
- gap: 12px;
657
- align-items: center;
658
- padding: 10px;
659
- border: 1px solid var(--bree-border);
660
- border-radius: 10px;
661
- background: var(--bree-bg);
662
- text-align: left;
663
- cursor: grab;
664
- }
665
-
666
- .bree-block-card:hover {
667
- border-color: #93c5fd;
668
- box-shadow: 0 4px 14px rgb(37 99 235 / 0.12);
669
- }
670
-
671
- .bree-block-text {
672
- display: flex;
673
- flex-direction: column;
674
- gap: 2px;
675
- }
676
-
677
- .bree-block-text span {
678
- color: var(--bree-muted);
679
- font-size: 12px;
680
- }
681
-
682
- .bree-block-thumb {
683
- flex: none;
684
- width: 92px;
685
- height: 58px;
686
- border-radius: 6px;
687
- background: #f1f5f9;
688
- display: grid;
689
- gap: 4px;
690
- padding: 7px;
691
- }
692
-
693
- .bree-block-thumb i {
694
- display: block;
695
- border-radius: 3px;
696
- background: #cbd5e1;
697
- }
698
-
699
- .bree-thumb-header {
700
- grid-template-columns: 1fr 1.4fr;
701
- grid-template-rows: 1fr;
702
- }
703
-
704
- .bree-thumb-header i:nth-child(1) {
705
- background: #94a3b8;
706
- }
707
-
708
- .bree-thumb-header i:nth-child(3) {
709
- display: none;
710
- }
711
-
712
- .bree-thumb-hero {
713
- background: #e0e7ff;
714
- grid-template-rows: 1.2fr 0.6fr 0.8fr;
715
- justify-items: center;
716
- }
717
-
718
- .bree-thumb-hero i:nth-child(1) {
719
- width: 80%;
720
- background: #818cf8;
721
- }
722
-
723
- .bree-thumb-hero i:nth-child(2) {
724
- width: 60%;
725
- }
726
-
727
- .bree-thumb-hero i:nth-child(3) {
728
- width: 36%;
729
- background: #4f46e5;
730
- }
731
-
732
- .bree-thumb-products,
733
- .bree-thumb-features {
734
- grid-template-columns: 1fr 1fr;
735
- }
736
-
737
- .bree-thumb-products i:nth-child(3) {
738
- display: none;
739
- }
740
-
741
- .bree-thumb-features {
742
- grid-template-columns: 1fr 1fr 1fr;
743
- }
744
-
745
- .bree-thumb-testimonial {
746
- grid-template-rows: 1fr 0.4fr;
747
- }
748
-
749
- .bree-thumb-testimonial i:nth-child(1) {
750
- border-left: 3px solid #94a3b8;
751
- background: #e2e8f0;
752
- }
753
-
754
- .bree-thumb-testimonial i:nth-child(2) {
755
- width: 50%;
756
- justify-self: end;
757
- }
758
-
759
- .bree-thumb-testimonial i:nth-child(3) {
760
- display: none;
761
- }
762
-
763
- .bree-thumb-footer {
764
- grid-template-rows: 0.15fr 0.6fr 0.4fr;
765
- justify-items: center;
766
- }
767
-
768
- .bree-thumb-footer i:nth-child(1) {
769
- width: 100%;
770
- }
771
-
772
- .bree-thumb-footer i:nth-child(2) {
773
- width: 50%;
774
- background: #94a3b8;
775
- }
776
-
777
- .bree-thumb-footer i:nth-child(3) {
778
- width: 70%;
779
- }
780
-
781
- /* Properties */
782
-
783
- .bree-properties-header {
784
- display: flex;
785
- align-items: center;
786
- justify-content: space-between;
787
- padding: 14px 12px 10px 16px;
788
- border-bottom: 1px solid var(--bree-border);
789
- }
790
-
791
- .bree-properties-header h2 {
792
- margin: 2px 0 0;
793
- font-size: 16px;
794
- }
795
-
796
- .bree-eyebrow {
797
- font-size: 11px;
798
- font-weight: 700;
799
- letter-spacing: 0.06em;
800
- text-transform: uppercase;
801
- color: var(--bree-accent);
802
- }
803
-
804
- .bree-breadcrumb {
805
- display: flex;
806
- flex-wrap: wrap;
807
- gap: 2px;
808
- padding: 8px 16px;
809
- border-bottom: 1px solid var(--bree-border);
810
- background: var(--bree-bg-subtle);
811
- font-size: 12px;
812
- }
813
-
814
- .bree-crumb {
815
- display: inline-flex;
816
- align-items: center;
817
- gap: 2px;
818
- }
819
-
820
- .bree-crumb button {
821
- border: 0;
822
- background: none;
823
- padding: 2px 4px;
824
- border-radius: 4px;
825
- color: var(--bree-accent);
826
- cursor: pointer;
827
- }
828
-
829
- .bree-crumb button:hover:not(:disabled) {
830
- background: var(--bree-accent-soft);
831
- }
832
-
833
- .bree-crumb button:disabled {
834
- color: var(--bree-text);
835
- font-weight: 600;
836
- cursor: default;
837
- }
838
-
839
- .bree-crumb-sep {
840
- color: var(--bree-border-strong);
841
- }
842
-
843
- .bree-group {
844
- border-bottom: 1px solid var(--bree-border);
845
- }
846
-
847
- .bree-group:last-child {
848
- border-bottom: 0;
849
- }
850
-
851
- .bree-group-header {
852
- display: flex;
853
- align-items: center;
854
- justify-content: space-between;
855
- width: 100%;
856
- padding: 14px 0;
857
- border: 0;
858
- background: none;
859
- font-size: 12px;
860
- font-weight: 700;
861
- letter-spacing: 0.04em;
862
- text-transform: uppercase;
863
- color: var(--bree-text-secondary);
864
- cursor: pointer;
865
- }
866
-
867
- .bree-chevron {
868
- font-size: 16px;
869
- color: var(--bree-muted);
870
- transition: transform 0.15s;
871
- }
872
-
873
- .bree-chevron.bree-open {
874
- transform: rotate(90deg);
875
- }
876
-
877
- .bree-group-body {
878
- display: flex;
879
- flex-direction: column;
880
- gap: 12px;
881
- padding-bottom: 16px;
882
- }
883
-
884
- .bree-field {
885
- display: flex;
886
- align-items: center;
887
- justify-content: space-between;
888
- gap: 12px;
889
- }
890
-
891
- .bree-field.bree-stacked {
892
- flex-direction: column;
893
- align-items: stretch;
894
- gap: 6px;
895
- }
896
-
897
- .bree-field-label {
898
- color: var(--bree-text-secondary);
899
- font-size: 12.5px;
900
- }
901
-
902
- .bree-field-control {
903
- display: flex;
904
- justify-content: flex-end;
905
- min-width: 0;
906
- }
907
-
908
- .bree-field.bree-stacked .bree-field-control {
909
- justify-content: stretch;
910
- }
911
-
912
- .bree-field.bree-stacked .bree-field-control > * {
913
- flex: 1;
914
- }
915
-
916
- .bree-input {
917
- width: 100%;
918
- height: 32px;
919
- padding: 0 10px;
920
- border: 1px solid var(--bree-border-strong);
921
- border-radius: 6px;
922
- background: #fff;
923
- font: inherit;
924
- font-size: 13px;
925
- outline: none;
926
- }
927
-
928
- .bree-input:focus {
929
- border-color: var(--bree-accent);
930
- box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
931
- }
932
-
933
- .bree-textarea {
934
- height: auto;
935
- padding: 8px 10px;
936
- font-family: ui-monospace, 'Cascadia Code', Menlo, monospace;
937
- font-size: 12px;
938
- resize: vertical;
939
- }
940
-
941
- .bree-select {
942
- width: 150px;
943
- padding-right: 4px;
944
- }
945
-
946
- .bree-number {
947
- display: inline-flex;
948
- align-items: center;
949
- width: 110px;
950
- border: 1px solid var(--bree-border-strong);
951
- border-radius: 6px;
952
- background: #fff;
953
- overflow: hidden;
954
- }
955
-
956
- .bree-number:focus-within {
957
- border-color: var(--bree-accent);
958
- box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
959
- }
960
-
961
- .bree-number .bree-input {
962
- border: 0;
963
- box-shadow: none !important;
964
- height: 30px;
965
- }
966
-
967
- .bree-unit {
968
- padding: 0 8px;
969
- color: var(--bree-muted);
970
- font-size: 12px;
971
- border-left: 1px solid var(--bree-border);
972
- background: var(--bree-bg-subtle);
973
- line-height: 30px;
974
- }
975
-
976
- .bree-range {
977
- display: flex;
978
- align-items: center;
979
- gap: 8px;
980
- width: 190px;
981
- }
982
-
983
- .bree-range input {
984
- flex: 1;
985
- accent-color: var(--bree-accent);
986
- }
987
-
988
- .bree-range-value {
989
- min-width: 46px;
990
- text-align: right;
991
- color: var(--bree-text-secondary);
992
- font-variant-numeric: tabular-nums;
993
- }
994
-
995
- .bree-color-field {
996
- display: flex;
997
- gap: 6px;
998
- width: 100%;
999
- }
1000
-
1001
- .bree-color-trigger {
1002
- flex: none;
1003
- width: 32px;
1004
- height: 32px;
1005
- padding: 0;
1006
- border: 1px solid var(--bree-border-strong);
1007
- border-radius: 6px;
1008
- box-shadow: inset 0 0 0 2px #fff;
1009
- cursor: pointer;
1010
- }
1011
-
1012
- .bree-color-trigger.bree-empty {
1013
- background: repeating-conic-gradient(#e2e8f0 0 25%, #fff 0 50%) 0 0 / 10px 10px;
1014
- }
1015
-
1016
- .bree-color-trigger:hover,
1017
- .bree-color-trigger[data-state='open'] {
1018
- border-color: var(--bree-accent);
1019
- }
1020
-
1021
- .bree-color-popover {
1022
- z-index: 200;
1023
- width: 252px;
1024
- padding: 12px;
1025
- border: 1px solid var(--bree-border);
1026
- border-radius: 12px;
1027
- background: #fff;
1028
- box-shadow: 0 12px 32px rgb(15 23 42 / 0.18);
1029
- display: flex;
1030
- flex-direction: column;
1031
- gap: 10px;
1032
- font-size: 12px;
1033
- outline: none;
1034
- }
1035
-
1036
- .bree-color-popover .react-colorful {
1037
- width: 100%;
1038
- height: 170px;
1039
- }
1040
-
1041
- .bree-color-popover .react-colorful__saturation {
1042
- border-radius: 8px 8px 0 0;
1043
- border-bottom: 0;
1044
- }
1045
-
1046
- .bree-color-popover .react-colorful__hue {
1047
- height: 14px;
1048
- border-radius: 0 0 8px 8px;
1049
- }
1050
-
1051
- .bree-color-popover .react-colorful__pointer {
1052
- width: 18px;
1053
- height: 18px;
1054
- border-width: 3px;
1055
- }
1056
-
1057
- .bree-color-popover-row {
1058
- display: flex;
1059
- align-items: center;
1060
- gap: 8px;
1061
- }
1062
-
1063
- .bree-color-preview {
1064
- flex: none;
1065
- width: 30px;
1066
- height: 30px;
1067
- border-radius: 6px;
1068
- border: 1px solid rgb(15 23 42 / 0.12);
1069
- }
1070
-
1071
- .bree-hex-field {
1072
- flex: 1;
1073
- display: flex;
1074
- align-items: center;
1075
- gap: 2px;
1076
- height: 30px;
1077
- padding: 0 8px;
1078
- border: 1px solid var(--bree-border-strong);
1079
- border-radius: 6px;
1080
- color: var(--bree-muted);
1081
- font-family: ui-monospace, 'Cascadia Code', Menlo, monospace;
1082
- }
1083
-
1084
- .bree-hex-field:focus-within {
1085
- border-color: var(--bree-accent);
1086
- box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
1087
- }
1088
-
1089
- .bree-hex-field input {
1090
- width: 100%;
1091
- border: 0;
1092
- outline: none;
1093
- font: inherit;
1094
- color: var(--bree-text);
1095
- text-transform: uppercase;
1096
- background: transparent;
1097
- }
1098
-
1099
- .bree-color-popover-title {
1100
- font-size: 10.5px;
1101
- font-weight: 700;
1102
- letter-spacing: 0.06em;
1103
- text-transform: uppercase;
1104
- color: var(--bree-muted);
1105
- }
1106
-
1107
- .bree-swatches {
1108
- display: grid;
1109
- grid-template-columns: repeat(9, 1fr);
1110
- gap: 5px;
1111
- }
1112
-
1113
- .bree-swatch {
1114
- aspect-ratio: 1;
1115
- width: 100%;
1116
- border-radius: 6px;
1117
- border: 1px solid rgb(15 23 42 / 0.12);
1118
- cursor: pointer;
1119
- padding: 0;
1120
- }
1121
-
1122
- .bree-swatch:hover {
1123
- transform: scale(1.12);
1124
- }
1125
-
1126
- .bree-swatch.bree-active {
1127
- box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--bree-accent);
1128
- }
1129
-
1130
- .bree-color-reset {
1131
- height: 30px;
1132
- border: 1px dashed var(--bree-border-strong);
1133
- border-radius: 6px;
1134
- background: var(--bree-bg-subtle);
1135
- color: var(--bree-text-secondary);
1136
- font-size: 12px;
1137
- cursor: pointer;
1138
- }
1139
-
1140
- .bree-color-reset:hover {
1141
- border-color: var(--bree-accent);
1142
- color: var(--bree-accent);
1143
- }
1144
-
1145
- .bree-segmented {
1146
- display: inline-flex;
1147
- padding: 2px;
1148
- border-radius: 8px;
1149
- background: #f1f5f9;
1150
- gap: 2px;
1151
- }
1152
-
1153
- .bree-segmented button {
1154
- display: grid;
1155
- place-items: center;
1156
- min-width: 34px;
1157
- height: 28px;
1158
- padding: 0 8px;
1159
- border: 0;
1160
- border-radius: 6px;
1161
- background: transparent;
1162
- color: var(--bree-text-secondary);
1163
- font-size: 12px;
1164
- cursor: pointer;
1165
- }
1166
-
1167
- .bree-segmented button.bree-active {
1168
- background: #fff;
1169
- color: var(--bree-accent);
1170
- box-shadow: 0 1px 2px rgb(15 23 42 / 0.12);
1171
- }
1172
-
1173
- .bree-device-toggle button {
1174
- min-width: 38px;
1175
- }
1176
-
1177
- .bree-padding {
1178
- display: flex;
1179
- flex-direction: column;
1180
- gap: 8px;
1181
- }
1182
-
1183
- .bree-padding-grid {
1184
- display: grid;
1185
- grid-template-columns: 1fr 1fr;
1186
- gap: 8px;
1187
- }
1188
-
1189
- .bree-padding-side {
1190
- display: flex;
1191
- flex-direction: column;
1192
- gap: 4px;
1193
- font-size: 11.5px;
1194
- color: var(--bree-muted);
1195
- }
1196
-
1197
- .bree-padding-side .bree-number {
1198
- width: 100%;
1199
- }
1200
-
1201
- .bree-checkbox {
1202
- display: flex;
1203
- align-items: center;
1204
- gap: 6px;
1205
- font-size: 12px;
1206
- color: var(--bree-muted);
1207
- cursor: pointer;
1208
- }
1209
-
1210
- .bree-button-like {
1211
- display: inline-flex;
1212
- align-items: center;
1213
- justify-content: center;
1214
- height: 32px;
1215
- border: 1px dashed var(--bree-border-strong);
1216
- border-radius: 6px;
1217
- background: var(--bree-bg-subtle);
1218
- font-size: 12.5px;
1219
- font-weight: 550;
1220
- cursor: pointer;
1221
- }
1222
-
1223
- .bree-button-like:hover {
1224
- border-color: var(--bree-accent);
1225
- color: var(--bree-accent);
1226
- }
1227
-
1228
- .bree-image-preview {
1229
- display: grid;
1230
- place-items: center;
1231
- height: 120px;
1232
- border-radius: 8px;
1233
- background: repeating-conic-gradient(#f1f5f9 0 25%, #fff 0 50%) 0 0 / 16px 16px;
1234
- overflow: hidden;
1235
- border: 1px solid var(--bree-border);
1236
- }
1237
-
1238
- .bree-image-preview img {
1239
- max-width: 100%;
1240
- max-height: 100%;
1241
- object-fit: contain;
1242
- }
1243
-
1244
- .bree-social-list {
1245
- display: flex;
1246
- flex-direction: column;
1247
- gap: 6px;
1248
- }
1249
-
1250
- .bree-social-row {
1251
- display: grid;
1252
- grid-template-columns: 110px 1fr 28px;
1253
- gap: 6px;
1254
- align-items: center;
1255
- }
1256
-
1257
- .bree-social-row .bree-select {
1258
- width: 100%;
1259
- }
1260
-
1261
- .bree-social-row .bree-icon-button {
1262
- width: 28px;
1263
- height: 28px;
1264
- }
1265
-
1266
- .bree-ratio-grid {
1267
- display: grid;
1268
- grid-template-columns: 1fr 1fr;
1269
- gap: 6px;
1270
- }
1271
-
1272
- .bree-ratio {
1273
- display: flex;
1274
- flex-direction: column;
1275
- gap: 6px;
1276
- align-items: stretch;
1277
- padding: 8px;
1278
- border: 1px solid var(--bree-border);
1279
- border-radius: 8px;
1280
- background: #fff;
1281
- font-size: 11.5px;
1282
- color: var(--bree-text-secondary);
1283
- cursor: pointer;
1284
- }
1285
-
1286
- .bree-ratio:hover {
1287
- border-color: var(--bree-accent);
1288
- color: var(--bree-accent);
1289
- }
1290
-
1291
- .bree-ratio-bars {
1292
- display: flex;
1293
- gap: 3px;
1294
- height: 14px;
1295
- }
1296
-
1297
- .bree-ratio-bars i {
1298
- border-radius: 3px;
1299
- background: #cbd5e1;
1300
- }
1301
-
1302
- .bree-ratio:hover .bree-ratio-bars i {
1303
- background: #93c5fd;
1304
- }
1305
-
1306
- .bree-mark-row {
1307
- display: flex;
1308
- gap: 6px;
1309
- }
1310
-
1311
- .bree-mark {
1312
- display: grid;
1313
- place-items: center;
1314
- width: 36px;
1315
- height: 32px;
1316
- border: 1px solid var(--bree-border-strong);
1317
- border-radius: 6px;
1318
- background: #fff;
1319
- cursor: pointer;
1320
- }
1321
-
1322
- .bree-mark.bree-active {
1323
- background: var(--bree-accent-soft);
1324
- border-color: var(--bree-accent);
1325
- color: var(--bree-accent);
1326
- }
1327
-
1328
- .bree-readonly {
1329
- color: var(--bree-muted);
1330
- word-break: break-all;
1331
- }
1332
-
1333
- /* ---------------------------------------------------------------------------
1334
- * Preview modal
1335
- * ------------------------------------------------------------------------- */
1336
-
1337
- .bree-modal-backdrop {
1338
- position: fixed;
1339
- inset: 0;
1340
- z-index: 100;
1341
- display: grid;
1342
- place-items: center;
1343
- padding: 32px;
1344
- background: rgb(15 23 42 / 0.45);
1345
- }
1346
-
1347
- .bree-modal {
1348
- display: flex;
1349
- flex-direction: column;
1350
- width: min(1100px, 100%);
1351
- height: min(860px, 100%);
1352
- border-radius: 14px;
1353
- background: var(--bree-bg);
1354
- box-shadow: 0 24px 64px rgb(15 23 42 / 0.3);
1355
- overflow: hidden;
1356
- }
1357
-
1358
- .bree-modal-header {
1359
- display: flex;
1360
- align-items: center;
1361
- justify-content: space-between;
1362
- gap: 12px;
1363
- padding: 10px 12px 10px 16px;
1364
- border-bottom: 1px solid var(--bree-border);
1365
- }
1366
-
1367
- .bree-modal-actions {
1368
- display: flex;
1369
- align-items: center;
1370
- gap: 8px;
1371
- }
1372
-
1373
- .bree-modal-body {
1374
- flex: 1;
1375
- min-height: 0;
1376
- overflow: auto;
1377
- background: #e2e8f0;
1378
- }
1379
-
1380
- .bree-preview-frame {
1381
- height: 100%;
1382
- margin: 0 auto;
1383
- background: #fff;
1384
- }
1385
-
1386
- .bree-preview-frame iframe {
1387
- display: block;
1388
- width: 100%;
1389
- height: 100%;
1390
- border: 0;
1391
- }
1392
-
1393
- .bree-preview-mobile {
1394
- width: 390px;
1395
- height: calc(100% - 48px);
1396
- margin-top: 24px;
1397
- border-radius: 28px;
1398
- border: 10px solid #0f172a;
1399
- overflow: hidden;
1400
- }
1401
-
1402
- .bree-code {
1403
- margin: 0;
1404
- min-height: 100%;
1405
- padding: 16px 20px;
1406
- background: #0f172a;
1407
- color: #e2e8f0;
1408
- font: 12px/1.6 ui-monospace, 'Cascadia Code', Menlo, monospace;
1409
- white-space: pre-wrap;
1410
- word-break: break-word;
1411
- }
1412
-
1413
- .bree-loading,
1414
- .bree-error {
1415
- padding: 24px;
1416
- text-align: center;
1417
- color: var(--bree-muted);
1418
- }
1419
-
1420
- .bree-error {
1421
- color: var(--bree-danger);
1422
- }
1423
-
1424
- /* Slash command / bubble menus come from the package theme; keep them above the overlay. */
1425
- [data-re-bubble-menu],
1426
- [data-re-slash-command] {
1427
- z-index: 50;
1428
- }
1429
-
1430
- /* The package's bubble menus follow the selection even when the editor is
1431
- * blurred (selection resets to the doc start, often inside a link). Only show
1432
- * them while the canvas has focus. */
1433
- .bree-canvas-content:not(:focus-within) > div[style*='position: absolute'] {
1434
- visibility: hidden !important;
1435
- }
1436
-
1437
- /* Button & image links are edited from the properties panel; their bubble
1438
- * menus would collide with the block toolbar. */
1439
- .bree-canvas-content > div:has([data-re-btn-bm-toolbar], [data-re-img-bm-toolbar]) {
1440
- display: none !important;
1441
- }
1442
-
1443
- /* The text bubble menu is meant for text ranges, not for selected blocks. */
1444
- .bree-canvas-content:has(.ProseMirror-selectednode) > [data-re-bubble-menu] {
1445
- display: none !important;
1446
- }
1447
-
1448
- /* TrailingNode keeps an empty paragraph after non-text blocks so the caret can
1449
- * always land somewhere. The export drops it; collapse it in the canvas too
1450
- * until the caret actually enters it (Placeholder then flags it .is-empty). */
1451
- .bree-canvas .tiptap :is(.node-container, .node-column, .node-section)
1452
- > p:last-child:not(:only-child):not(.is-empty):has(> br.ProseMirror-trailingBreak:only-child) {
1453
- height: 0;
1454
- min-height: 0;
1455
- margin: 0;
1456
- padding: 0;
1457
- overflow: hidden;
1458
- }
1459
-
1460
- /* ---------------------------------------------------------------------------
1461
- * Layers panel (Elementor's navigator / Photoshop layers)
1462
- * ------------------------------------------------------------------------- */
1463
-
1464
- .bree-layers-toggle.bree-active {
1465
- background: var(--bree-accent-soft);
1466
- color: var(--bree-accent);
1467
- }
1468
-
1469
- .bree-layers {
1470
- display: flex;
1471
- flex-direction: column;
1472
- min-height: 0;
1473
- border-right: 1px solid var(--bree-border);
1474
- background: var(--bree-bg);
1475
- font-size: 12.5px;
1476
- outline: none;
1477
- }
1478
-
1479
- .bree-layers-header {
1480
- display: flex;
1481
- align-items: center;
1482
- justify-content: space-between;
1483
- height: 47px;
1484
- padding: 0 8px 0 14px;
1485
- border-bottom: 1px solid var(--bree-border);
1486
- }
1487
-
1488
- .bree-layers-header h2 {
1489
- margin: 0;
1490
- font-size: 13px;
1491
- font-weight: 700;
1492
- }
1493
-
1494
- .bree-layers-actions {
1495
- display: flex;
1496
- gap: 2px;
1497
- }
1498
-
1499
- .bree-icon-button.bree-small {
1500
- width: 26px;
1501
- height: 26px;
1502
- font-size: 15px;
1503
- }
1504
-
1505
- .bree-layers-list {
1506
- flex: 1;
1507
- overflow: auto;
1508
- padding: 6px 6px 40px;
1509
- }
1510
-
1511
- .bree-layer {
1512
- position: relative;
1513
- display: flex;
1514
- align-items: center;
1515
- gap: 4px;
1516
- height: 30px;
1517
- padding-right: 8px;
1518
- border-radius: 6px;
1519
- color: var(--bree-text-secondary);
1520
- cursor: pointer;
1521
- user-select: none;
1522
- outline: none;
1523
- }
1524
-
1525
- .bree-layer:hover,
1526
- .bree-layer.bree-hovered {
1527
- background: #f1f5f9;
1528
- }
1529
-
1530
- .bree-layer:focus-visible {
1531
- box-shadow: inset 0 0 0 2px #93c5fd;
1532
- }
1533
-
1534
- .bree-layer.bree-selected {
1535
- background: var(--bree-accent-soft);
1536
- color: var(--bree-accent);
1537
- }
1538
-
1539
- .bree-layer.bree-selected .bree-layer-label {
1540
- font-weight: 650;
1541
- }
1542
-
1543
- .bree-layer[draggable='true']:active {
1544
- cursor: grabbing;
1545
- }
1546
-
1547
- .bree-layer.bree-fixed .bree-layer-icon {
1548
- opacity: 0.7;
1549
- }
1550
-
1551
- .bree-layer-caret,
1552
- .bree-layer-caret-spacer {
1553
- flex: none;
1554
- width: 18px;
1555
- height: 18px;
1556
- }
1557
-
1558
- .bree-layer-caret {
1559
- display: grid;
1560
- place-items: center;
1561
- padding: 0;
1562
- border: 0;
1563
- border-radius: 4px;
1564
- background: none;
1565
- color: var(--bree-muted);
1566
- font-size: 14px;
1567
- line-height: 1;
1568
- cursor: pointer;
1569
- transition: transform 0.12s;
1570
- }
1571
-
1572
- .bree-layer-caret.bree-open {
1573
- transform: rotate(90deg);
1574
- }
1575
-
1576
- .bree-layer-caret:hover {
1577
- background: rgb(15 23 42 / 0.06);
1578
- }
1579
-
1580
- .bree-layer-icon {
1581
- flex: none;
1582
- display: grid;
1583
- place-items: center;
1584
- width: 20px;
1585
- color: var(--bree-muted);
1586
- }
1587
-
1588
- .bree-layer.bree-selected .bree-layer-icon {
1589
- color: var(--bree-accent);
1590
- }
1591
-
1592
- .bree-layer-label {
1593
- flex: none;
1594
- white-space: nowrap;
1595
- }
1596
-
1597
- .bree-layer-preview {
1598
- flex: 1;
1599
- min-width: 0;
1600
- overflow: hidden;
1601
- text-overflow: ellipsis;
1602
- white-space: nowrap;
1603
- color: #94a3b8;
1604
- }
1605
-
1606
- .bree-layer-preview::before {
1607
- content: '· ';
1608
- }
1609
-
1610
- .bree-layer-empty {
1611
- height: 26px;
1612
- display: flex;
1613
- align-items: center;
1614
- color: #93c5fd;
1615
- font-size: 11.5px;
1616
- font-style: italic;
1617
- }
1618
-
1619
- /* Drop indicators */
1620
- .bree-layer.bree-drop-before::before,
1621
- .bree-layer.bree-drop-after::after {
1622
- content: '';
1623
- position: absolute;
1624
- left: var(--bree-drop-indent, 0);
1625
- right: 4px;
1626
- height: 2px;
1627
- border-radius: 2px;
1628
- background: var(--bree-accent);
1629
- pointer-events: none;
1630
- }
1631
-
1632
- .bree-layer.bree-drop-before::before {
1633
- top: -1px;
1634
- }
1635
-
1636
- .bree-layer.bree-drop-after::after {
1637
- bottom: -1px;
1638
- }
1639
-
1640
- .bree-layer.bree-drop-inside {
1641
- background: var(--bree-accent-soft);
1642
- box-shadow: inset 0 0 0 2px var(--bree-accent);
1643
- }
1
+ /*
2
+ * better-react-email-editor
3
+ *
4
+ * Every class is prefixed with `bree-`. Theme the editor by overriding the
5
+ * custom properties below on `.bree` (or on your own class passed through
6
+ * `className`), and restyle any part through its class or `className` prop.
7
+ */
8
+
9
+ .bree {
10
+ --bree-bg: #ffffff;
11
+ --bree-bg-subtle: #f8fafc;
12
+ --bree-border: #e5e7eb;
13
+ --bree-border-strong: #d1d5db;
14
+ --bree-text: #111827;
15
+ --bree-text-secondary: #334155;
16
+ --bree-muted: #6b7280;
17
+ --bree-accent: #2563eb;
18
+ --bree-accent-hover: #1d4ed8;
19
+ --bree-accent-soft: #eff6ff;
20
+ --bree-danger: #dc2626;
21
+ --bree-radius: 8px;
22
+ --bree-frame-gap: 4px;
23
+ --bree-canvas-bg: #eef1f5;
24
+ --bree-topbar-height: 56px;
25
+ --bree-sidebar-width: 360px;
26
+ --bree-layers-width: 270px;
27
+ --bree-font: Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
28
+ font-family: var(--bree-font);
29
+ color: var(--bree-text);
30
+ -webkit-font-smoothing: antialiased;
31
+ }
32
+
33
+ .bree-root {
34
+ height: 100%;
35
+ min-height: 0;
36
+ }
37
+
38
+ /* Zero-specificity resets: any class of the editor (or yours) wins over them. */
39
+ :where(.bree),
40
+ :where(.bree) *,
41
+ :where(.bree) *::before,
42
+ :where(.bree) *::after {
43
+ box-sizing: border-box;
44
+ }
45
+
46
+ :where(.bree) button {
47
+ font: inherit;
48
+ color: inherit;
49
+ }
50
+
51
+ /* ---------------------------------------------------------------------------
52
+ * App layout
53
+ * ------------------------------------------------------------------------- */
54
+
55
+ /* Default layout of <BetterEmailEditor>. With <EditorRoot>, lay the parts out yourself. */
56
+ .bree-layout {
57
+ display: grid;
58
+ grid-template-columns: minmax(0, 1fr);
59
+ grid-template-rows: minmax(0, 1fr);
60
+ grid-template-areas: 'canvas';
61
+ height: 100%;
62
+ overflow: hidden;
63
+ }
64
+
65
+ .bree-layout.bree-with-topbar {
66
+ grid-template-rows: var(--bree-topbar-height) minmax(0, 1fr);
67
+ grid-template-areas:
68
+ 'top'
69
+ 'canvas';
70
+ }
71
+
72
+ .bree-layout.bree-with-sidebar {
73
+ grid-template-columns: minmax(0, 1fr) var(--bree-sidebar-width);
74
+ grid-template-areas: 'canvas side';
75
+ }
76
+
77
+ .bree-layout.bree-with-topbar.bree-with-sidebar {
78
+ grid-template-areas:
79
+ 'top top'
80
+ 'canvas side';
81
+ }
82
+
83
+ .bree-layout.bree-with-layers {
84
+ grid-template-columns: var(--bree-layers-width) minmax(0, 1fr);
85
+ grid-template-areas: 'layers canvas';
86
+ }
87
+
88
+ .bree-layout.bree-with-topbar.bree-with-layers {
89
+ grid-template-areas:
90
+ 'top top'
91
+ 'layers canvas';
92
+ }
93
+
94
+ .bree-layout.bree-with-layers.bree-with-sidebar {
95
+ grid-template-columns: var(--bree-layers-width) minmax(0, 1fr) var(--bree-sidebar-width);
96
+ grid-template-areas: 'layers canvas side';
97
+ }
98
+
99
+ .bree-layout.bree-with-topbar.bree-with-layers.bree-with-sidebar {
100
+ grid-template-areas:
101
+ 'top top top'
102
+ 'layers canvas side';
103
+ }
104
+
105
+ .bree-layout > .bree-topbar {
106
+ grid-area: top;
107
+ }
108
+
109
+ .bree-layout > .bree-layers {
110
+ grid-area: layers;
111
+ }
112
+
113
+ .bree-layout > .bree-canvas {
114
+ grid-area: canvas;
115
+ }
116
+
117
+ .bree-layout > .bree-sidebar {
118
+ grid-area: side;
119
+ }
120
+
121
+
122
+ .bree-topbar {
123
+ display: flex;
124
+ height: var(--bree-topbar-height);
125
+ align-items: center;
126
+ gap: 16px;
127
+ padding: 0 16px;
128
+ border-bottom: 1px solid var(--bree-border);
129
+ background: var(--bree-bg);
130
+ z-index: 5;
131
+ }
132
+
133
+ .bree-topbar-start,
134
+ .bree-topbar-actions {
135
+ flex: 1;
136
+ display: flex;
137
+ align-items: center;
138
+ gap: 8px;
139
+ min-width: 0;
140
+ }
141
+
142
+ .bree-topbar-actions {
143
+ justify-content: flex-end;
144
+ }
145
+
146
+ .bree-topbar-center {
147
+ display: flex;
148
+ justify-content: center;
149
+ align-items: center;
150
+ gap: 12px;
151
+ }
152
+
153
+ .bree-btn-group {
154
+ display: flex;
155
+ gap: 2px;
156
+ }
157
+
158
+ .bree-btn {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ gap: 6px;
162
+ height: 34px;
163
+ padding: 0 14px;
164
+ border-radius: var(--bree-radius);
165
+ border: 1px solid var(--bree-border-strong);
166
+ background: var(--bree-bg);
167
+ font-size: 13px;
168
+ font-weight: 550;
169
+ cursor: pointer;
170
+ white-space: nowrap;
171
+ }
172
+
173
+ .bree-btn:hover {
174
+ background: var(--bree-bg-subtle);
175
+ }
176
+
177
+ .bree-btn.bree-primary {
178
+ background: var(--bree-accent);
179
+ border-color: var(--bree-accent);
180
+ color: #fff;
181
+ }
182
+
183
+ .bree-btn.bree-primary:hover {
184
+ background: var(--bree-accent-hover);
185
+ }
186
+
187
+ .bree-btn.bree-ghost {
188
+ border-color: transparent;
189
+ }
190
+
191
+ .bree-icon-button {
192
+ display: inline-grid;
193
+ place-items: center;
194
+ width: 32px;
195
+ height: 32px;
196
+ border: 0;
197
+ border-radius: var(--bree-radius);
198
+ background: transparent;
199
+ cursor: pointer;
200
+ color: var(--bree-muted);
201
+ }
202
+
203
+ .bree-icon-button:hover:not(:disabled) {
204
+ background: var(--bree-bg-subtle);
205
+ color: var(--bree-text);
206
+ }
207
+
208
+ .bree-icon-button:disabled {
209
+ opacity: 0.35;
210
+ cursor: default;
211
+ }
212
+
213
+ /* ---------------------------------------------------------------------------
214
+ * Canvas (the real editor)
215
+ * ------------------------------------------------------------------------- */
216
+
217
+ .bree-canvas {
218
+ position: relative;
219
+ overflow: auto;
220
+ min-height: 0;
221
+ background: var(--bree-canvas-bg);
222
+ }
223
+
224
+ .bree-canvas-content {
225
+ min-height: 100%;
226
+ }
227
+
228
+ .bree-canvas-content > .tiptap {
229
+ min-height: 100%;
230
+ padding-bottom: 160px !important;
231
+ }
232
+
233
+ /* Subject / preview card joined to the top of the email (`<Canvas header>`).
234
+ * Canvas positions it over the container, which makes room with a top margin. */
235
+ .bree-canvas[data-email-header] .tiptap > .node-container {
236
+ margin-top: var(--bree-email-header-height, 0px) !important;
237
+ border-top-left-radius: 0 !important;
238
+ border-top-right-radius: 0 !important;
239
+ }
240
+
241
+ .bree-canvas-header {
242
+ width: 600px;
243
+ max-width: 100%;
244
+ margin: 32px auto 0;
245
+ }
246
+
247
+ .bree-canvas-header[data-placed] {
248
+ z-index: 1; /* over the editor, under the overlay (20) */
249
+ margin: 0;
250
+ max-width: none;
251
+ }
252
+
253
+ .bree-canvas-header > .bree-email-header {
254
+ border-bottom: 1px solid var(--bree-border);
255
+ border-radius: var(--bree-email-header-radius, 12px) var(--bree-email-header-radius, 12px) 0 0;
256
+ /* Keep the shadow off the email below. */
257
+ clip-path: inset(-32px -32px 0 -32px);
258
+ }
259
+
260
+ .bree-email-header {
261
+ overflow: hidden;
262
+ border-radius: 12px;
263
+ background: var(--bree-bg);
264
+ box-shadow: 0 1px 2px rgb(15 23 42 / 0.06), 0 8px 24px rgb(15 23 42 / 0.06);
265
+ }
266
+
267
+ .bree-email-header-row {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 12px;
271
+ min-height: 44px;
272
+ padding: 0 20px;
273
+ }
274
+
275
+ .bree-email-header-row + .bree-email-header-row {
276
+ border-top: 1px solid var(--bree-border);
277
+ }
278
+
279
+ .bree-email-header-row > label {
280
+ flex: none;
281
+ width: 72px;
282
+ font-size: 13px;
283
+ color: var(--bree-muted);
284
+ }
285
+
286
+ .bree-email-header-row > input {
287
+ flex: 1;
288
+ min-width: 0;
289
+ height: 44px;
290
+ padding: 0;
291
+ border: 0;
292
+ outline: none;
293
+ background: transparent;
294
+ font: inherit;
295
+ font-size: 14px;
296
+ color: var(--bree-text-secondary);
297
+ }
298
+
299
+ .bree-email-header-row > input.bree-email-header-subject {
300
+ font-weight: 600;
301
+ color: var(--bree-text);
302
+ }
303
+
304
+ .bree-email-header-row > input::placeholder {
305
+ font-weight: 400;
306
+ color: var(--bree-muted);
307
+ opacity: 0.7;
308
+ }
309
+
310
+ .bree-email-header-row:focus-within > label {
311
+ color: var(--bree-accent);
312
+ }
313
+
314
+ .bree-canvas .tiptap .node-container {
315
+ margin-left: auto;
316
+ margin-right: auto;
317
+ max-width: 100%;
318
+ transition: width 0.2s ease, max-width 0.2s ease;
319
+ box-shadow: 0 1px 2px rgb(15 23 42 / 0.06), 0 8px 24px rgb(15 23 42 / 0.06);
320
+ }
321
+
322
+ .bree-canvas[data-device='mobile'] .tiptap .node-container {
323
+ width: 375px !important;
324
+ max-width: 375px !important;
325
+ }
326
+
327
+ .bree-canvas[data-device='mobile'] .tiptap .node-columns {
328
+ flex-direction: column;
329
+ }
330
+
331
+ .bree-canvas .tiptap .ProseMirror-selectednode {
332
+ outline: none;
333
+ }
334
+
335
+ .bree-canvas .tiptap img {
336
+ max-width: 100%;
337
+ height: auto;
338
+ display: block;
339
+ }
340
+
341
+ .bree-canvas .tiptap img[alignment='center'] {
342
+ margin-left: auto;
343
+ margin-right: auto;
344
+ }
345
+
346
+ .bree-canvas .tiptap img[alignment='right'] {
347
+ margin-left: auto;
348
+ }
349
+
350
+ .bree-canvas .tiptap .align-center {
351
+ text-align: center;
352
+ }
353
+
354
+ .bree-canvas .tiptap .align-right {
355
+ text-align: right;
356
+ }
357
+
358
+ .bree-canvas .tiptap a.node-button {
359
+ display: inline-block;
360
+ cursor: text;
361
+ }
362
+
363
+ .bree-canvas .tiptap .node-column {
364
+ position: relative;
365
+ }
366
+
367
+ .bree-canvas .tiptap .node-column[style*='width'] {
368
+ flex: none;
369
+ }
370
+
371
+ /* Empty drop zones, like Unlayer's "No content here". */
372
+ .bree-canvas .tiptap .node-column:has(> p:only-child > br.ProseMirror-trailingBreak:only-child),
373
+ .bree-canvas .tiptap .node-section:has(> p:only-child > br.ProseMirror-trailingBreak:only-child) {
374
+ min-height: 72px;
375
+ outline: 1px dashed #93c5fd;
376
+ outline-offset: -1px;
377
+ background: #f8fbff;
378
+ border-radius: 6px;
379
+ }
380
+
381
+ .bree-canvas .tiptap .node-column:has(> p:only-child > br.ProseMirror-trailingBreak:only-child)::after,
382
+ .bree-canvas .tiptap .node-section:has(> p:only-child > br.ProseMirror-trailingBreak:only-child)::after {
383
+ content: var(--bree-empty-zone-label, 'Drag content here');
384
+ position: absolute;
385
+ inset: 0;
386
+ display: grid;
387
+ place-items: center;
388
+ color: #60a5fa;
389
+ font: 500 12px/1.2 Inter, system-ui, sans-serif;
390
+ pointer-events: none;
391
+ }
392
+
393
+ .bree-canvas .tiptap .node-section {
394
+ position: relative;
395
+ display: block;
396
+ }
397
+
398
+ .bree-canvas .tiptap .node-spacer {
399
+ border-radius: 4px;
400
+ }
401
+
402
+ .bree-canvas .tiptap .node-spacer:hover,
403
+ .bree-canvas .tiptap .node-spacer.ProseMirror-selectednode {
404
+ background-image: repeating-linear-gradient(-45deg, rgb(37 99 235 / 0.1) 0 6px, transparent 6px 12px);
405
+ }
406
+
407
+ .bree-canvas .tiptap .node-socialLinks {
408
+ padding: 8px 0;
409
+ line-height: 0;
410
+ }
411
+
412
+ .bree-canvas .tiptap .node-socialLinks img {
413
+ display: inline-block;
414
+ vertical-align: middle;
415
+ }
416
+
417
+ .bree-canvas .tiptap .node-socialLinks-item {
418
+ display: inline-block;
419
+ }
420
+
421
+ .bree-canvas .tiptap .node-htmlBlock {
422
+ cursor: default;
423
+ }
424
+
425
+ /* ---------------------------------------------------------------------------
426
+ * Canvas overlay: hover / selection frames, toolbar, drop indicator
427
+ * ------------------------------------------------------------------------- */
428
+
429
+ .bree-ov-layer {
430
+ position: absolute;
431
+ top: 0;
432
+ left: 0;
433
+ width: 0;
434
+ height: 0;
435
+ z-index: 20;
436
+ pointer-events: none;
437
+ }
438
+
439
+ .bree-ov-frame {
440
+ position: absolute;
441
+ pointer-events: none;
442
+ border-radius: 2px;
443
+ }
444
+
445
+ /* Hover and selection frames sit a few pixels off the block, not on its content. */
446
+ .bree-ov-hover,
447
+ .bree-ov-selected {
448
+ box-sizing: content-box;
449
+ padding: var(--bree-frame-gap);
450
+ margin: calc(var(--bree-frame-gap) * -1);
451
+ }
452
+
453
+ .bree-ov-hover {
454
+ box-shadow: 0 0 0 1px #60a5fa;
455
+ }
456
+
457
+ .bree-ov-selected {
458
+ box-shadow: 0 0 0 2px var(--bree-accent);
459
+ }
460
+
461
+ .bree-ov-ghost,
462
+ .bree-ov-ghost * {
463
+ opacity: 0;
464
+ pointer-events: none !important;
465
+ }
466
+
467
+ .bree-ov-source {
468
+ background: repeating-linear-gradient(45deg, rgb(37 99 235 / 0.1) 0 6px, rgb(37 99 235 / 0.03) 6px 12px);
469
+ box-shadow: 0 0 0 1px #93c5fd;
470
+ }
471
+
472
+ .bree-ov-tag {
473
+ position: absolute;
474
+ top: -21px;
475
+ left: -2px;
476
+ height: 21px;
477
+ padding: 0 8px;
478
+ border: 0;
479
+ border-radius: 4px 4px 0 0;
480
+ background: #60a5fa;
481
+ color: #fff;
482
+ font: 600 11px/21px Inter, system-ui, sans-serif;
483
+ white-space: nowrap;
484
+ pointer-events: auto;
485
+ cursor: pointer;
486
+ }
487
+
488
+ .bree-ov-tag-selected {
489
+ background: var(--bree-accent);
490
+ cursor: default;
491
+ left: -2px;
492
+ }
493
+
494
+ .bree-ov-handle {
495
+ position: absolute;
496
+ top: 50%;
497
+ left: -30px;
498
+ transform: translateY(-50%);
499
+ display: grid;
500
+ place-items: center;
501
+ width: 22px;
502
+ height: 30px;
503
+ border-radius: 6px;
504
+ background: #fff;
505
+ border: 1px solid #bfdbfe;
506
+ color: var(--bree-accent);
507
+ box-shadow: 0 1px 3px rgb(15 23 42 / 0.12);
508
+ cursor: grab;
509
+ pointer-events: auto;
510
+ }
511
+
512
+ .bree-ov-toolbar {
513
+ position: absolute;
514
+ top: -2px;
515
+ left: calc(100% + 8px);
516
+ display: flex;
517
+ flex-direction: column;
518
+ gap: 2px;
519
+ padding: 3px;
520
+ border-radius: 8px;
521
+ background: var(--bree-accent);
522
+ box-shadow: 0 4px 12px rgb(37 99 235 / 0.25);
523
+ pointer-events: auto;
524
+ }
525
+
526
+ .bree-ov-tool {
527
+ display: grid;
528
+ place-items: center;
529
+ width: 28px;
530
+ height: 28px;
531
+ border: 0;
532
+ border-radius: 4px;
533
+ background: transparent;
534
+ color: #fff;
535
+ cursor: pointer;
536
+ }
537
+
538
+ .bree-ov-tool:hover {
539
+ background: rgb(255 255 255 / 0.2);
540
+ }
541
+
542
+ .bree-ov-tool.bree-ov-danger:hover {
543
+ background: var(--bree-danger);
544
+ }
545
+
546
+ .bree-ov-handle:hover {
547
+ background: var(--bree-accent-soft);
548
+ }
549
+
550
+ .bree-ov-handle:active {
551
+ cursor: grabbing;
552
+ }
553
+
554
+ .bree-ov-handle:focus {
555
+ outline: none;
556
+ }
557
+
558
+ .bree-ov-dropline {
559
+ position: absolute;
560
+ height: 0;
561
+ border-top: 3px solid var(--bree-accent);
562
+ margin-top: -1.5px;
563
+ border-radius: 3px;
564
+ box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
565
+ }
566
+
567
+ .bree-ov-dropline-label {
568
+ position: absolute;
569
+ top: -12px;
570
+ left: 50%;
571
+ transform: translateX(-50%);
572
+ padding: 3px 10px;
573
+ border-radius: 999px;
574
+ background: var(--bree-accent);
575
+ color: #fff;
576
+ font: 600 11px/1.3 Inter, system-ui, sans-serif;
577
+ white-space: nowrap;
578
+ }
579
+
580
+ .bree-ov-dropzone {
581
+ position: absolute;
582
+ display: grid;
583
+ place-items: center;
584
+ border: 2px dashed var(--bree-accent);
585
+ border-radius: 6px;
586
+ background: #eff6ff;
587
+ color: var(--bree-accent);
588
+ font: 600 12px/1.3 Inter, system-ui, sans-serif;
589
+ }
590
+
591
+ .bree-ov-dropzone span {
592
+ display: inline-flex;
593
+ align-items: center;
594
+ gap: 4px;
595
+ }
596
+
597
+ /* ---------------------------------------------------------------------------
598
+ * Sidebar
599
+ * ------------------------------------------------------------------------- */
600
+
601
+ .bree-sidebar {
602
+ display: flex;
603
+ flex-direction: column;
604
+ min-height: 0;
605
+ border-left: 1px solid var(--bree-border);
606
+ background: var(--bree-bg);
607
+ outline: none;
608
+ font-size: 13px;
609
+ }
610
+
611
+ .bree-content-panel,
612
+ .bree-properties {
613
+ display: flex;
614
+ flex-direction: column;
615
+ min-height: 0;
616
+ flex: 1;
617
+ }
618
+
619
+ .bree-panel-scroll {
620
+ flex: 1;
621
+ overflow: auto;
622
+ padding: 4px 16px 24px;
623
+ }
624
+
625
+ .bree-tabs {
626
+ display: flex;
627
+ border-bottom: 1px solid var(--bree-border);
628
+ padding: 0 8px;
629
+ }
630
+
631
+ .bree-tabs button {
632
+ flex: 1;
633
+ height: 46px;
634
+ border: 0;
635
+ background: none;
636
+ color: var(--bree-muted);
637
+ font-weight: 600;
638
+ font-size: 13px;
639
+ border-bottom: 2px solid transparent;
640
+ cursor: pointer;
641
+ }
642
+
643
+ .bree-tabs button.bree-active {
644
+ color: var(--bree-accent);
645
+ border-bottom-color: var(--bree-accent);
646
+ }
647
+
648
+ .bree-tabs.bree-compact {
649
+ border: 0;
650
+ padding: 0;
651
+ gap: 4px;
652
+ }
653
+
654
+ .bree-tabs.bree-compact button {
655
+ flex: none;
656
+ height: 34px;
657
+ padding: 0 12px;
658
+ border-radius: var(--bree-radius);
659
+ border: 0;
660
+ }
661
+
662
+ .bree-tabs.bree-compact button.bree-active {
663
+ background: var(--bree-accent-soft);
664
+ }
665
+
666
+ .bree-panel-title {
667
+ margin: 18px 0 10px;
668
+ font-size: 11px;
669
+ font-weight: 700;
670
+ letter-spacing: 0.06em;
671
+ text-transform: uppercase;
672
+ color: var(--bree-muted);
673
+ }
674
+
675
+ .bree-tiles {
676
+ display: grid;
677
+ grid-template-columns: repeat(3, 1fr);
678
+ gap: 8px;
679
+ }
680
+
681
+ .bree-tile {
682
+ display: flex;
683
+ flex-direction: column;
684
+ align-items: center;
685
+ justify-content: center;
686
+ gap: 8px;
687
+ height: 84px;
688
+ border: 1px solid var(--bree-border);
689
+ border-radius: 10px;
690
+ background: var(--bree-bg);
691
+ cursor: grab;
692
+ transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s;
693
+ }
694
+
695
+ .bree-tile:hover {
696
+ border-color: #93c5fd;
697
+ box-shadow: 0 4px 14px rgb(37 99 235 / 0.12);
698
+ transform: translateY(-1px);
699
+ }
700
+
701
+ .bree-tile:active {
702
+ cursor: grabbing;
703
+ }
704
+
705
+ .bree-tile-icon {
706
+ color: var(--bree-text-secondary);
707
+ display: grid;
708
+ place-items: center;
709
+ }
710
+
711
+ .bree-tile:hover .bree-tile-icon {
712
+ color: var(--bree-accent);
713
+ }
714
+
715
+ .bree-tile-label {
716
+ font-size: 12px;
717
+ font-weight: 550;
718
+ color: var(--bree-text-secondary);
719
+ }
720
+
721
+ .bree-hint {
722
+ margin: 14px 0 0;
723
+ color: var(--bree-muted);
724
+ font-size: 12px;
725
+ line-height: 1.5;
726
+ }
727
+
728
+ .bree-block-list {
729
+ display: flex;
730
+ flex-direction: column;
731
+ gap: 10px;
732
+ padding-top: 12px;
733
+ }
734
+
735
+ .bree-block-card {
736
+ display: flex;
737
+ gap: 12px;
738
+ align-items: center;
739
+ padding: 10px;
740
+ border: 1px solid var(--bree-border);
741
+ border-radius: 10px;
742
+ background: var(--bree-bg);
743
+ text-align: left;
744
+ cursor: grab;
745
+ }
746
+
747
+ .bree-block-card:hover {
748
+ border-color: #93c5fd;
749
+ box-shadow: 0 4px 14px rgb(37 99 235 / 0.12);
750
+ }
751
+
752
+ .bree-block-text {
753
+ display: flex;
754
+ flex-direction: column;
755
+ gap: 2px;
756
+ }
757
+
758
+ .bree-block-text span {
759
+ color: var(--bree-muted);
760
+ font-size: 12px;
761
+ }
762
+
763
+ .bree-block-thumb {
764
+ flex: none;
765
+ width: 92px;
766
+ height: 58px;
767
+ border-radius: 6px;
768
+ background: #f1f5f9;
769
+ display: grid;
770
+ gap: 4px;
771
+ padding: 7px;
772
+ }
773
+
774
+ .bree-block-thumb i {
775
+ display: block;
776
+ border-radius: 3px;
777
+ background: #cbd5e1;
778
+ }
779
+
780
+ .bree-thumb-header {
781
+ grid-template-columns: 1fr 1.4fr;
782
+ grid-template-rows: 1fr;
783
+ }
784
+
785
+ .bree-thumb-header i:nth-child(1) {
786
+ background: #94a3b8;
787
+ }
788
+
789
+ .bree-thumb-header i:nth-child(3) {
790
+ display: none;
791
+ }
792
+
793
+ .bree-thumb-hero {
794
+ background: #e0e7ff;
795
+ grid-template-rows: 1.2fr 0.6fr 0.8fr;
796
+ justify-items: center;
797
+ }
798
+
799
+ .bree-thumb-hero i:nth-child(1) {
800
+ width: 80%;
801
+ background: #818cf8;
802
+ }
803
+
804
+ .bree-thumb-hero i:nth-child(2) {
805
+ width: 60%;
806
+ }
807
+
808
+ .bree-thumb-hero i:nth-child(3) {
809
+ width: 36%;
810
+ background: #4f46e5;
811
+ }
812
+
813
+ .bree-thumb-products,
814
+ .bree-thumb-features {
815
+ grid-template-columns: 1fr 1fr;
816
+ }
817
+
818
+ .bree-thumb-products i:nth-child(3) {
819
+ display: none;
820
+ }
821
+
822
+ .bree-thumb-features {
823
+ grid-template-columns: 1fr 1fr 1fr;
824
+ }
825
+
826
+ .bree-thumb-testimonial {
827
+ grid-template-rows: 1fr 0.4fr;
828
+ }
829
+
830
+ .bree-thumb-testimonial i:nth-child(1) {
831
+ border-left: 3px solid #94a3b8;
832
+ background: #e2e8f0;
833
+ }
834
+
835
+ .bree-thumb-testimonial i:nth-child(2) {
836
+ width: 50%;
837
+ justify-self: end;
838
+ }
839
+
840
+ .bree-thumb-testimonial i:nth-child(3) {
841
+ display: none;
842
+ }
843
+
844
+ .bree-thumb-footer {
845
+ grid-template-rows: 0.15fr 0.6fr 0.4fr;
846
+ justify-items: center;
847
+ }
848
+
849
+ .bree-thumb-footer i:nth-child(1) {
850
+ width: 100%;
851
+ }
852
+
853
+ .bree-thumb-footer i:nth-child(2) {
854
+ width: 50%;
855
+ background: #94a3b8;
856
+ }
857
+
858
+ .bree-thumb-footer i:nth-child(3) {
859
+ width: 70%;
860
+ }
861
+
862
+ /* Properties */
863
+
864
+ .bree-properties-header {
865
+ display: flex;
866
+ align-items: center;
867
+ justify-content: space-between;
868
+ padding: 14px 12px 10px 16px;
869
+ border-bottom: 1px solid var(--bree-border);
870
+ }
871
+
872
+ .bree-properties-header h2 {
873
+ margin: 2px 0 0;
874
+ font-size: 16px;
875
+ }
876
+
877
+ .bree-eyebrow {
878
+ font-size: 11px;
879
+ font-weight: 700;
880
+ letter-spacing: 0.06em;
881
+ text-transform: uppercase;
882
+ color: var(--bree-accent);
883
+ }
884
+
885
+ .bree-breadcrumb {
886
+ display: flex;
887
+ flex-wrap: wrap;
888
+ gap: 2px;
889
+ padding: 8px 16px;
890
+ border-bottom: 1px solid var(--bree-border);
891
+ background: var(--bree-bg-subtle);
892
+ font-size: 12px;
893
+ }
894
+
895
+ .bree-crumb {
896
+ display: inline-flex;
897
+ align-items: center;
898
+ gap: 2px;
899
+ }
900
+
901
+ .bree-crumb button {
902
+ border: 0;
903
+ background: none;
904
+ padding: 2px 4px;
905
+ border-radius: 4px;
906
+ color: var(--bree-accent);
907
+ cursor: pointer;
908
+ }
909
+
910
+ .bree-crumb button:hover:not(:disabled) {
911
+ background: var(--bree-accent-soft);
912
+ }
913
+
914
+ .bree-crumb button:disabled {
915
+ color: var(--bree-text);
916
+ font-weight: 600;
917
+ cursor: default;
918
+ }
919
+
920
+ .bree-crumb-sep {
921
+ color: var(--bree-border-strong);
922
+ }
923
+
924
+ .bree-group {
925
+ border-bottom: 1px solid var(--bree-border);
926
+ }
927
+
928
+ .bree-group:last-child {
929
+ border-bottom: 0;
930
+ }
931
+
932
+ .bree-group-header {
933
+ display: flex;
934
+ align-items: center;
935
+ justify-content: space-between;
936
+ width: 100%;
937
+ padding: 14px 0;
938
+ border: 0;
939
+ background: none;
940
+ font-size: 12px;
941
+ font-weight: 700;
942
+ letter-spacing: 0.04em;
943
+ text-transform: uppercase;
944
+ color: var(--bree-text-secondary);
945
+ cursor: pointer;
946
+ }
947
+
948
+ .bree-chevron {
949
+ font-size: 16px;
950
+ color: var(--bree-muted);
951
+ transition: transform 0.15s;
952
+ }
953
+
954
+ .bree-chevron.bree-open {
955
+ transform: rotate(90deg);
956
+ }
957
+
958
+ .bree-group-body {
959
+ display: flex;
960
+ flex-direction: column;
961
+ gap: 12px;
962
+ padding-bottom: 16px;
963
+ }
964
+
965
+ .bree-field {
966
+ display: flex;
967
+ align-items: center;
968
+ justify-content: space-between;
969
+ gap: 12px;
970
+ }
971
+
972
+ .bree-field.bree-stacked {
973
+ flex-direction: column;
974
+ align-items: stretch;
975
+ gap: 6px;
976
+ }
977
+
978
+ .bree-field-label {
979
+ color: var(--bree-text-secondary);
980
+ font-size: 12.5px;
981
+ }
982
+
983
+ .bree-field-control {
984
+ display: flex;
985
+ justify-content: flex-end;
986
+ min-width: 0;
987
+ }
988
+
989
+ .bree-field.bree-stacked .bree-field-control {
990
+ justify-content: stretch;
991
+ }
992
+
993
+ .bree-field.bree-stacked .bree-field-control > * {
994
+ flex: 1;
995
+ }
996
+
997
+ .bree-input {
998
+ width: 100%;
999
+ height: 32px;
1000
+ padding: 0 10px;
1001
+ border: 1px solid var(--bree-border-strong);
1002
+ border-radius: 6px;
1003
+ background: #fff;
1004
+ font: inherit;
1005
+ font-size: 13px;
1006
+ outline: none;
1007
+ }
1008
+
1009
+ .bree-input:focus {
1010
+ border-color: var(--bree-accent);
1011
+ box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
1012
+ }
1013
+
1014
+ .bree-textarea {
1015
+ height: auto;
1016
+ padding: 8px 10px;
1017
+ font-family: ui-monospace, 'Cascadia Code', Menlo, monospace;
1018
+ font-size: 12px;
1019
+ resize: vertical;
1020
+ }
1021
+
1022
+ .bree-select {
1023
+ width: 150px;
1024
+ padding-right: 4px;
1025
+ }
1026
+
1027
+ .bree-number {
1028
+ display: inline-flex;
1029
+ align-items: center;
1030
+ width: 110px;
1031
+ border: 1px solid var(--bree-border-strong);
1032
+ border-radius: 6px;
1033
+ background: #fff;
1034
+ overflow: hidden;
1035
+ }
1036
+
1037
+ .bree-number:focus-within {
1038
+ border-color: var(--bree-accent);
1039
+ box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
1040
+ }
1041
+
1042
+ .bree-number .bree-input {
1043
+ border: 0;
1044
+ box-shadow: none !important;
1045
+ height: 30px;
1046
+ }
1047
+
1048
+ .bree-unit {
1049
+ padding: 0 8px;
1050
+ color: var(--bree-muted);
1051
+ font-size: 12px;
1052
+ border-left: 1px solid var(--bree-border);
1053
+ background: var(--bree-bg-subtle);
1054
+ line-height: 30px;
1055
+ }
1056
+
1057
+ .bree-range {
1058
+ display: flex;
1059
+ align-items: center;
1060
+ gap: 8px;
1061
+ width: 190px;
1062
+ }
1063
+
1064
+ .bree-range input {
1065
+ flex: 1;
1066
+ accent-color: var(--bree-accent);
1067
+ }
1068
+
1069
+ .bree-range-value {
1070
+ min-width: 46px;
1071
+ text-align: right;
1072
+ color: var(--bree-text-secondary);
1073
+ font-variant-numeric: tabular-nums;
1074
+ }
1075
+
1076
+ .bree-color-field {
1077
+ display: flex;
1078
+ gap: 6px;
1079
+ width: 100%;
1080
+ }
1081
+
1082
+ .bree-color-trigger {
1083
+ flex: none;
1084
+ width: 32px;
1085
+ height: 32px;
1086
+ padding: 0;
1087
+ border: 1px solid var(--bree-border-strong);
1088
+ border-radius: 6px;
1089
+ box-shadow: inset 0 0 0 2px #fff;
1090
+ cursor: pointer;
1091
+ }
1092
+
1093
+ .bree-color-trigger.bree-empty {
1094
+ background: repeating-conic-gradient(#e2e8f0 0 25%, #fff 0 50%) 0 0 / 10px 10px;
1095
+ }
1096
+
1097
+ .bree-color-trigger:hover,
1098
+ .bree-color-trigger[data-state='open'] {
1099
+ border-color: var(--bree-accent);
1100
+ }
1101
+
1102
+ .bree-color-popover {
1103
+ z-index: 200;
1104
+ width: 252px;
1105
+ padding: 12px;
1106
+ border: 1px solid var(--bree-border);
1107
+ border-radius: 12px;
1108
+ background: #fff;
1109
+ box-shadow: 0 12px 32px rgb(15 23 42 / 0.18);
1110
+ display: flex;
1111
+ flex-direction: column;
1112
+ gap: 10px;
1113
+ font-size: 12px;
1114
+ outline: none;
1115
+ }
1116
+
1117
+ .bree-color-popover .react-colorful {
1118
+ width: 100%;
1119
+ height: 170px;
1120
+ }
1121
+
1122
+ .bree-color-popover .react-colorful__saturation {
1123
+ border-radius: 8px 8px 0 0;
1124
+ border-bottom: 0;
1125
+ }
1126
+
1127
+ .bree-color-popover .react-colorful__hue {
1128
+ height: 14px;
1129
+ border-radius: 0 0 8px 8px;
1130
+ }
1131
+
1132
+ .bree-color-popover .react-colorful__pointer {
1133
+ width: 18px;
1134
+ height: 18px;
1135
+ border-width: 3px;
1136
+ }
1137
+
1138
+ .bree-color-popover-row {
1139
+ display: flex;
1140
+ align-items: center;
1141
+ gap: 8px;
1142
+ }
1143
+
1144
+ .bree-color-preview {
1145
+ flex: none;
1146
+ width: 30px;
1147
+ height: 30px;
1148
+ border-radius: 6px;
1149
+ border: 1px solid rgb(15 23 42 / 0.12);
1150
+ }
1151
+
1152
+ .bree-hex-field {
1153
+ flex: 1;
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: 2px;
1157
+ height: 30px;
1158
+ padding: 0 8px;
1159
+ border: 1px solid var(--bree-border-strong);
1160
+ border-radius: 6px;
1161
+ color: var(--bree-muted);
1162
+ font-family: ui-monospace, 'Cascadia Code', Menlo, monospace;
1163
+ }
1164
+
1165
+ .bree-hex-field:focus-within {
1166
+ border-color: var(--bree-accent);
1167
+ box-shadow: 0 0 0 3px rgb(37 99 235 / 0.15);
1168
+ }
1169
+
1170
+ .bree-hex-field input {
1171
+ width: 100%;
1172
+ border: 0;
1173
+ outline: none;
1174
+ font: inherit;
1175
+ color: var(--bree-text);
1176
+ text-transform: uppercase;
1177
+ background: transparent;
1178
+ }
1179
+
1180
+ .bree-color-popover-title {
1181
+ font-size: 10.5px;
1182
+ font-weight: 700;
1183
+ letter-spacing: 0.06em;
1184
+ text-transform: uppercase;
1185
+ color: var(--bree-muted);
1186
+ }
1187
+
1188
+ .bree-swatches {
1189
+ display: grid;
1190
+ grid-template-columns: repeat(9, 1fr);
1191
+ gap: 5px;
1192
+ }
1193
+
1194
+ .bree-swatch {
1195
+ aspect-ratio: 1;
1196
+ width: 100%;
1197
+ border-radius: 6px;
1198
+ border: 1px solid rgb(15 23 42 / 0.12);
1199
+ cursor: pointer;
1200
+ padding: 0;
1201
+ }
1202
+
1203
+ .bree-swatch:hover {
1204
+ transform: scale(1.12);
1205
+ }
1206
+
1207
+ .bree-swatch.bree-active {
1208
+ box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--bree-accent);
1209
+ }
1210
+
1211
+ .bree-color-reset {
1212
+ height: 30px;
1213
+ border: 1px dashed var(--bree-border-strong);
1214
+ border-radius: 6px;
1215
+ background: var(--bree-bg-subtle);
1216
+ color: var(--bree-text-secondary);
1217
+ font-size: 12px;
1218
+ cursor: pointer;
1219
+ }
1220
+
1221
+ .bree-color-reset:hover {
1222
+ border-color: var(--bree-accent);
1223
+ color: var(--bree-accent);
1224
+ }
1225
+
1226
+ .bree-segmented {
1227
+ display: inline-flex;
1228
+ padding: 2px;
1229
+ border-radius: 8px;
1230
+ background: #f1f5f9;
1231
+ gap: 2px;
1232
+ }
1233
+
1234
+ .bree-segmented button {
1235
+ display: grid;
1236
+ place-items: center;
1237
+ min-width: 34px;
1238
+ height: 28px;
1239
+ padding: 0 8px;
1240
+ border: 0;
1241
+ border-radius: 6px;
1242
+ background: transparent;
1243
+ color: var(--bree-text-secondary);
1244
+ font-size: 12px;
1245
+ cursor: pointer;
1246
+ }
1247
+
1248
+ .bree-segmented button.bree-active {
1249
+ background: #fff;
1250
+ color: var(--bree-accent);
1251
+ box-shadow: 0 1px 2px rgb(15 23 42 / 0.12);
1252
+ }
1253
+
1254
+ .bree-device-toggle button {
1255
+ min-width: 38px;
1256
+ }
1257
+
1258
+ .bree-padding {
1259
+ display: flex;
1260
+ flex-direction: column;
1261
+ gap: 8px;
1262
+ }
1263
+
1264
+ .bree-padding-grid {
1265
+ display: grid;
1266
+ grid-template-columns: 1fr 1fr;
1267
+ gap: 8px;
1268
+ }
1269
+
1270
+ .bree-padding-side {
1271
+ display: flex;
1272
+ flex-direction: column;
1273
+ gap: 4px;
1274
+ font-size: 11.5px;
1275
+ color: var(--bree-muted);
1276
+ }
1277
+
1278
+ .bree-padding-side .bree-number {
1279
+ width: 100%;
1280
+ }
1281
+
1282
+ .bree-checkbox {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ gap: 6px;
1286
+ font-size: 12px;
1287
+ color: var(--bree-muted);
1288
+ cursor: pointer;
1289
+ }
1290
+
1291
+ .bree-button-like {
1292
+ display: inline-flex;
1293
+ align-items: center;
1294
+ justify-content: center;
1295
+ height: 32px;
1296
+ border: 1px dashed var(--bree-border-strong);
1297
+ border-radius: 6px;
1298
+ background: var(--bree-bg-subtle);
1299
+ font-size: 12.5px;
1300
+ font-weight: 550;
1301
+ cursor: pointer;
1302
+ }
1303
+
1304
+ .bree-button-like:hover {
1305
+ border-color: var(--bree-accent);
1306
+ color: var(--bree-accent);
1307
+ }
1308
+
1309
+ .bree-image-preview {
1310
+ display: grid;
1311
+ place-items: center;
1312
+ height: 120px;
1313
+ border-radius: 8px;
1314
+ background: repeating-conic-gradient(#f1f5f9 0 25%, #fff 0 50%) 0 0 / 16px 16px;
1315
+ overflow: hidden;
1316
+ border: 1px solid var(--bree-border);
1317
+ }
1318
+
1319
+ .bree-image-preview img {
1320
+ max-width: 100%;
1321
+ max-height: 100%;
1322
+ object-fit: contain;
1323
+ }
1324
+
1325
+ .bree-social-list {
1326
+ display: flex;
1327
+ flex-direction: column;
1328
+ gap: 6px;
1329
+ }
1330
+
1331
+ .bree-social-row {
1332
+ display: grid;
1333
+ grid-template-columns: 110px 1fr 28px;
1334
+ gap: 6px;
1335
+ align-items: center;
1336
+ }
1337
+
1338
+ .bree-social-row .bree-select {
1339
+ width: 100%;
1340
+ }
1341
+
1342
+ .bree-social-row .bree-icon-button {
1343
+ width: 28px;
1344
+ height: 28px;
1345
+ }
1346
+
1347
+ .bree-ratio-grid {
1348
+ display: grid;
1349
+ grid-template-columns: 1fr 1fr;
1350
+ gap: 6px;
1351
+ }
1352
+
1353
+ .bree-ratio {
1354
+ display: flex;
1355
+ flex-direction: column;
1356
+ gap: 6px;
1357
+ align-items: stretch;
1358
+ padding: 8px;
1359
+ border: 1px solid var(--bree-border);
1360
+ border-radius: 8px;
1361
+ background: #fff;
1362
+ font-size: 11.5px;
1363
+ color: var(--bree-text-secondary);
1364
+ cursor: pointer;
1365
+ }
1366
+
1367
+ .bree-ratio:hover {
1368
+ border-color: var(--bree-accent);
1369
+ color: var(--bree-accent);
1370
+ }
1371
+
1372
+ .bree-ratio-bars {
1373
+ display: flex;
1374
+ gap: 3px;
1375
+ height: 14px;
1376
+ }
1377
+
1378
+ .bree-ratio-bars i {
1379
+ border-radius: 3px;
1380
+ background: #cbd5e1;
1381
+ }
1382
+
1383
+ .bree-ratio:hover .bree-ratio-bars i {
1384
+ background: #93c5fd;
1385
+ }
1386
+
1387
+ .bree-mark-row {
1388
+ display: flex;
1389
+ gap: 6px;
1390
+ }
1391
+
1392
+ .bree-mark {
1393
+ display: grid;
1394
+ place-items: center;
1395
+ width: 36px;
1396
+ height: 32px;
1397
+ border: 1px solid var(--bree-border-strong);
1398
+ border-radius: 6px;
1399
+ background: #fff;
1400
+ cursor: pointer;
1401
+ }
1402
+
1403
+ .bree-mark.bree-active {
1404
+ background: var(--bree-accent-soft);
1405
+ border-color: var(--bree-accent);
1406
+ color: var(--bree-accent);
1407
+ }
1408
+
1409
+ .bree-readonly {
1410
+ color: var(--bree-muted);
1411
+ word-break: break-all;
1412
+ }
1413
+
1414
+ /* ---------------------------------------------------------------------------
1415
+ * Preview modal
1416
+ * ------------------------------------------------------------------------- */
1417
+
1418
+ .bree-modal-backdrop {
1419
+ position: fixed;
1420
+ inset: 0;
1421
+ z-index: 100;
1422
+ display: grid;
1423
+ place-items: center;
1424
+ padding: 32px;
1425
+ background: rgb(15 23 42 / 0.45);
1426
+ }
1427
+
1428
+ .bree-modal {
1429
+ display: flex;
1430
+ flex-direction: column;
1431
+ width: min(1100px, 100%);
1432
+ height: min(860px, 100%);
1433
+ border-radius: 14px;
1434
+ background: var(--bree-bg);
1435
+ box-shadow: 0 24px 64px rgb(15 23 42 / 0.3);
1436
+ overflow: hidden;
1437
+ }
1438
+
1439
+ .bree-modal-header {
1440
+ display: flex;
1441
+ align-items: center;
1442
+ justify-content: space-between;
1443
+ gap: 12px;
1444
+ padding: 10px 12px 10px 16px;
1445
+ border-bottom: 1px solid var(--bree-border);
1446
+ }
1447
+
1448
+ .bree-modal-actions {
1449
+ display: flex;
1450
+ align-items: center;
1451
+ gap: 8px;
1452
+ }
1453
+
1454
+ .bree-modal-body {
1455
+ flex: 1;
1456
+ min-height: 0;
1457
+ overflow: auto;
1458
+ background: #e2e8f0;
1459
+ }
1460
+
1461
+ .bree-preview-frame {
1462
+ height: 100%;
1463
+ margin: 0 auto;
1464
+ background: #fff;
1465
+ }
1466
+
1467
+ .bree-preview-frame iframe {
1468
+ display: block;
1469
+ width: 100%;
1470
+ height: 100%;
1471
+ border: 0;
1472
+ }
1473
+
1474
+ .bree-preview-mobile {
1475
+ width: 390px;
1476
+ height: calc(100% - 48px);
1477
+ margin-top: 24px;
1478
+ border-radius: 28px;
1479
+ border: 10px solid #0f172a;
1480
+ overflow: hidden;
1481
+ }
1482
+
1483
+ .bree-code {
1484
+ margin: 0;
1485
+ min-height: 100%;
1486
+ padding: 16px 20px;
1487
+ background: #0f172a;
1488
+ color: #e2e8f0;
1489
+ font: 12px/1.6 ui-monospace, 'Cascadia Code', Menlo, monospace;
1490
+ white-space: pre-wrap;
1491
+ word-break: break-word;
1492
+ }
1493
+
1494
+ .bree-loading,
1495
+ .bree-error {
1496
+ padding: 24px;
1497
+ text-align: center;
1498
+ color: var(--bree-muted);
1499
+ }
1500
+
1501
+ .bree-error {
1502
+ color: var(--bree-danger);
1503
+ }
1504
+
1505
+ /* Slash command / bubble menus come from the package theme; keep them above the overlay. */
1506
+ [data-re-bubble-menu],
1507
+ [data-re-slash-command] {
1508
+ z-index: 50;
1509
+ }
1510
+
1511
+ /* The package's bubble menus follow the selection even when the editor is
1512
+ * blurred (selection resets to the doc start, often inside a link). Only show
1513
+ * them while the canvas has focus. */
1514
+ .bree-canvas-content:not(:focus-within) > div[style*='position: absolute'] {
1515
+ visibility: hidden !important;
1516
+ }
1517
+
1518
+ /* Button & image links are edited from the properties panel; their bubble
1519
+ * menus would collide with the block toolbar. */
1520
+ .bree-canvas-content > div:has([data-re-btn-bm-toolbar], [data-re-img-bm-toolbar]) {
1521
+ display: none !important;
1522
+ }
1523
+
1524
+ /* The text bubble menu is meant for text ranges, not for selected blocks. */
1525
+ .bree-canvas-content:has(.ProseMirror-selectednode) > [data-re-bubble-menu] {
1526
+ display: none !important;
1527
+ }
1528
+
1529
+ /* TrailingNode keeps an empty paragraph after non-text blocks so the caret can
1530
+ * always land somewhere. The export drops it; collapse it in the canvas too
1531
+ * until the caret actually enters it (Placeholder then flags it .is-empty). */
1532
+ .bree-canvas .tiptap :is(.node-container, .node-column, .node-section)
1533
+ > p:last-child:not(:only-child):not(.is-empty):has(> br.ProseMirror-trailingBreak:only-child) {
1534
+ height: 0;
1535
+ min-height: 0;
1536
+ margin: 0;
1537
+ padding: 0;
1538
+ overflow: hidden;
1539
+ }
1540
+
1541
+ /* ---------------------------------------------------------------------------
1542
+ * Layers panel (Elementor's navigator / Photoshop layers)
1543
+ * ------------------------------------------------------------------------- */
1544
+
1545
+ .bree-layers-toggle.bree-active {
1546
+ background: var(--bree-accent-soft);
1547
+ color: var(--bree-accent);
1548
+ }
1549
+
1550
+ .bree-layers {
1551
+ display: flex;
1552
+ flex-direction: column;
1553
+ min-height: 0;
1554
+ border-right: 1px solid var(--bree-border);
1555
+ background: var(--bree-bg);
1556
+ font-size: 12.5px;
1557
+ outline: none;
1558
+ }
1559
+
1560
+ .bree-layers-header {
1561
+ display: flex;
1562
+ align-items: center;
1563
+ justify-content: space-between;
1564
+ height: 47px;
1565
+ padding: 0 8px 0 14px;
1566
+ border-bottom: 1px solid var(--bree-border);
1567
+ }
1568
+
1569
+ .bree-layers-header h2 {
1570
+ margin: 0;
1571
+ font-size: 13px;
1572
+ font-weight: 700;
1573
+ }
1574
+
1575
+ .bree-layers-actions {
1576
+ display: flex;
1577
+ gap: 2px;
1578
+ }
1579
+
1580
+ .bree-icon-button.bree-small {
1581
+ width: 26px;
1582
+ height: 26px;
1583
+ font-size: 15px;
1584
+ }
1585
+
1586
+ .bree-layers-list {
1587
+ flex: 1;
1588
+ overflow: auto;
1589
+ padding: 6px 6px 40px;
1590
+ }
1591
+
1592
+ .bree-layer {
1593
+ position: relative;
1594
+ display: flex;
1595
+ align-items: center;
1596
+ gap: 4px;
1597
+ height: 30px;
1598
+ padding-right: 8px;
1599
+ border-radius: 6px;
1600
+ color: var(--bree-text-secondary);
1601
+ cursor: pointer;
1602
+ user-select: none;
1603
+ outline: none;
1604
+ }
1605
+
1606
+ .bree-layer:hover,
1607
+ .bree-layer.bree-hovered {
1608
+ background: #f1f5f9;
1609
+ }
1610
+
1611
+ .bree-layer:focus-visible {
1612
+ box-shadow: inset 0 0 0 2px #93c5fd;
1613
+ }
1614
+
1615
+ .bree-layer.bree-selected {
1616
+ background: var(--bree-accent-soft);
1617
+ color: var(--bree-accent);
1618
+ }
1619
+
1620
+ .bree-layer.bree-selected .bree-layer-label {
1621
+ font-weight: 650;
1622
+ }
1623
+
1624
+ .bree-layer[draggable='true']:active {
1625
+ cursor: grabbing;
1626
+ }
1627
+
1628
+ .bree-layer.bree-fixed .bree-layer-icon {
1629
+ opacity: 0.7;
1630
+ }
1631
+
1632
+ .bree-layer-caret,
1633
+ .bree-layer-caret-spacer {
1634
+ flex: none;
1635
+ width: 18px;
1636
+ height: 18px;
1637
+ }
1638
+
1639
+ .bree-layer-caret {
1640
+ display: grid;
1641
+ place-items: center;
1642
+ padding: 0;
1643
+ border: 0;
1644
+ border-radius: 4px;
1645
+ background: none;
1646
+ color: var(--bree-muted);
1647
+ font-size: 14px;
1648
+ line-height: 1;
1649
+ cursor: pointer;
1650
+ transition: transform 0.12s;
1651
+ }
1652
+
1653
+ .bree-layer-caret.bree-open {
1654
+ transform: rotate(90deg);
1655
+ }
1656
+
1657
+ .bree-layer-caret:hover {
1658
+ background: rgb(15 23 42 / 0.06);
1659
+ }
1660
+
1661
+ .bree-layer-icon {
1662
+ flex: none;
1663
+ display: grid;
1664
+ place-items: center;
1665
+ width: 20px;
1666
+ color: var(--bree-muted);
1667
+ }
1668
+
1669
+ .bree-layer.bree-selected .bree-layer-icon {
1670
+ color: var(--bree-accent);
1671
+ }
1672
+
1673
+ .bree-layer-label {
1674
+ flex: none;
1675
+ white-space: nowrap;
1676
+ }
1677
+
1678
+ .bree-layer-preview {
1679
+ flex: 1;
1680
+ min-width: 0;
1681
+ overflow: hidden;
1682
+ text-overflow: ellipsis;
1683
+ white-space: nowrap;
1684
+ color: #94a3b8;
1685
+ }
1686
+
1687
+ .bree-layer-preview::before {
1688
+ content: '· ';
1689
+ }
1690
+
1691
+ .bree-layer-empty {
1692
+ height: 26px;
1693
+ display: flex;
1694
+ align-items: center;
1695
+ color: #93c5fd;
1696
+ font-size: 11.5px;
1697
+ font-style: italic;
1698
+ }
1699
+
1700
+ /* Drop indicators */
1701
+ .bree-layer.bree-drop-before::before,
1702
+ .bree-layer.bree-drop-after::after {
1703
+ content: '';
1704
+ position: absolute;
1705
+ left: var(--bree-drop-indent, 0);
1706
+ right: 4px;
1707
+ height: 2px;
1708
+ border-radius: 2px;
1709
+ background: var(--bree-accent);
1710
+ pointer-events: none;
1711
+ }
1712
+
1713
+ .bree-layer.bree-drop-before::before {
1714
+ top: -1px;
1715
+ }
1716
+
1717
+ .bree-layer.bree-drop-after::after {
1718
+ bottom: -1px;
1719
+ }
1720
+
1721
+ .bree-layer.bree-drop-inside {
1722
+ background: var(--bree-accent-soft);
1723
+ box-shadow: inset 0 0 0 2px var(--bree-accent);
1724
+ }