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