better-react-email-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +381 -0
  3. package/dist/index.cjs +2 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.js +4190 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/styles.css +1634 -0
  8. package/dist/types/components/BetterEmailEditor.d.ts +34 -0
  9. package/dist/types/components/BlockProperties.d.ts +7 -0
  10. package/dist/types/components/BlocksTab.d.ts +13 -0
  11. package/dist/types/components/BodyTab.d.ts +9 -0
  12. package/dist/types/components/Canvas.d.ts +15 -0
  13. package/dist/types/components/CanvasOverlay.d.ts +10 -0
  14. package/dist/types/components/ContentPanel.d.ts +19 -0
  15. package/dist/types/components/ContentTab.d.ts +17 -0
  16. package/dist/types/components/LayersPanel.d.ts +9 -0
  17. package/dist/types/components/PreviewDialog.d.ts +15 -0
  18. package/dist/types/components/PropertiesPanel.d.ts +12 -0
  19. package/dist/types/components/Sidebar.d.ts +14 -0
  20. package/dist/types/components/TextProperties.d.ts +7 -0
  21. package/dist/types/components/TopBar.d.ts +37 -0
  22. package/dist/types/components/fields.d.ts +103 -0
  23. package/dist/types/components/icons.d.ts +21 -0
  24. package/dist/types/components/inspectors/ButtonInspector.d.ts +2 -0
  25. package/dist/types/components/inspectors/ColumnsInspector.d.ts +3 -0
  26. package/dist/types/components/inspectors/DefaultInspector.d.ts +3 -0
  27. package/dist/types/components/inspectors/HeadingInspector.d.ts +2 -0
  28. package/dist/types/components/inspectors/ImageInspector.d.ts +2 -0
  29. package/dist/types/components/inspectors/SimpleInspectors.d.ts +6 -0
  30. package/dist/types/components/inspectors/SocialLinksInspector.d.ts +2 -0
  31. package/dist/types/components/inspectors/groups.d.ts +22 -0
  32. package/dist/types/components/useDraggableBlock.d.ts +17 -0
  33. package/dist/types/context.d.ts +115 -0
  34. package/dist/types/core/content.d.ts +28 -0
  35. package/dist/types/core/cx.d.ts +8 -0
  36. package/dist/types/core/dnd.d.ts +73 -0
  37. package/dist/types/core/layers.d.ts +27 -0
  38. package/dist/types/core/paste-handler.d.ts +9 -0
  39. package/dist/types/core/paste.d.ts +22 -0
  40. package/dist/types/core/stores.d.ts +19 -0
  41. package/dist/types/core/style-utils.d.ts +3 -0
  42. package/dist/types/i18n/en.d.ts +247 -0
  43. package/dist/types/i18n/fr.d.ts +3 -0
  44. package/dist/types/i18n/index.d.ts +509 -0
  45. package/dist/types/index.d.ts +37 -0
  46. package/dist/types/nodes/custom-nodes.d.ts +19 -0
  47. package/dist/types/registry/default-nodes.d.ts +7 -0
  48. package/dist/types/registry/default-palette.d.ts +7 -0
  49. package/dist/types/registry/default-templates.d.ts +10 -0
  50. package/dist/types/registry/types.d.ts +56 -0
  51. package/package.json +89 -0
@@ -0,0 +1,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-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
+ }