@tldraw/editor 3.14.0-canary.ff61ab6deaa2 → 3.14.0-internal.eada756f6aa0

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 (103) hide show
  1. package/dist-cjs/index.d.ts +166 -59
  2. package/dist-cjs/index.js +4 -3
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/config/TLSessionStateSnapshot.js +1 -12
  5. package/dist-cjs/lib/config/TLSessionStateSnapshot.js.map +3 -3
  6. package/dist-cjs/lib/editor/Editor.js +113 -45
  7. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  8. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +2 -2
  9. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +1 -2
  10. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  11. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +3 -1
  12. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +2 -2
  13. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +73 -42
  14. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  15. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +0 -10
  16. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  17. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
  18. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +1 -1
  19. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +10 -6
  20. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +3 -3
  21. package/dist-cjs/lib/editor/tools/StateNode.js +3 -3
  22. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  23. package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
  24. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  25. package/dist-cjs/lib/hooks/useCanvasEvents.js +1 -2
  26. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  27. package/dist-cjs/lib/primitives/Box.js +0 -6
  28. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  29. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +6 -2
  30. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  31. package/dist-cjs/lib/utils/areShapesContentEqual.js +1 -1
  32. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +2 -2
  33. package/dist-cjs/lib/utils/dom.js +1 -1
  34. package/dist-cjs/lib/utils/dom.js.map +2 -2
  35. package/dist-cjs/lib/utils/reparenting.js +232 -0
  36. package/dist-cjs/lib/utils/reparenting.js.map +7 -0
  37. package/dist-cjs/lib/utils/richText.js +7 -2
  38. package/dist-cjs/lib/utils/richText.js.map +2 -2
  39. package/dist-cjs/version.js +3 -3
  40. package/dist-cjs/version.js.map +1 -1
  41. package/dist-esm/index.d.mts +166 -59
  42. package/dist-esm/index.mjs +4 -3
  43. package/dist-esm/index.mjs.map +2 -2
  44. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +1 -1
  45. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
  46. package/dist-esm/lib/editor/Editor.mjs +113 -45
  47. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  48. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
  49. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +1 -2
  50. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  51. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +3 -1
  52. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +2 -2
  53. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +73 -42
  54. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  55. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +0 -10
  56. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  57. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
  58. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +1 -1
  59. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +10 -6
  60. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +3 -3
  61. package/dist-esm/lib/editor/tools/StateNode.mjs +3 -3
  62. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  63. package/dist-esm/lib/hooks/useCanvasEvents.mjs +1 -2
  64. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  65. package/dist-esm/lib/primitives/Box.mjs +0 -6
  66. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  67. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +6 -2
  68. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  69. package/dist-esm/lib/utils/areShapesContentEqual.mjs +1 -1
  70. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +2 -2
  71. package/dist-esm/lib/utils/dom.mjs +1 -1
  72. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  73. package/dist-esm/lib/utils/reparenting.mjs +216 -0
  74. package/dist-esm/lib/utils/reparenting.mjs.map +7 -0
  75. package/dist-esm/lib/utils/richText.mjs +8 -3
  76. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  77. package/dist-esm/version.mjs +3 -3
  78. package/dist-esm/version.mjs.map +1 -1
  79. package/editor.css +442 -492
  80. package/package.json +8 -9
  81. package/src/index.ts +7 -1
  82. package/src/lib/config/TLSessionStateSnapshot.ts +1 -1
  83. package/src/lib/editor/Editor.test.ts +252 -3
  84. package/src/lib/editor/Editor.ts +129 -52
  85. package/src/lib/editor/bindings/BindingUtil.ts +6 -0
  86. package/src/lib/editor/managers/FontManager/FontManager.ts +1 -2
  87. package/src/lib/editor/managers/HistoryManager/HistoryManager.ts +3 -1
  88. package/src/lib/editor/managers/TextManager/TextManager.test.ts +1 -5
  89. package/src/lib/editor/managers/TextManager/TextManager.ts +118 -86
  90. package/src/lib/editor/shapes/ShapeUtil.ts +47 -15
  91. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
  92. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +22 -17
  93. package/src/lib/editor/tools/StateNode.ts +3 -3
  94. package/src/lib/editor/types/emit-types.ts +4 -0
  95. package/src/lib/editor/types/external-content.ts +11 -2
  96. package/src/lib/hooks/useCanvasEvents.ts +0 -1
  97. package/src/lib/primitives/Box.ts +0 -8
  98. package/src/lib/primitives/geometry/Geometry2d.ts +7 -2
  99. package/src/lib/utils/areShapesContentEqual.ts +1 -2
  100. package/src/lib/utils/dom.ts +1 -1
  101. package/src/lib/utils/reparenting.ts +383 -0
  102. package/src/lib/utils/richText.ts +9 -3
  103. package/src/version.ts +3 -3
package/editor.css CHANGED
@@ -37,8 +37,6 @@
37
37
  --layer-overlays-collaborator-shape-indicator: 30;
38
38
  --layer-overlays-user-scribble: 40;
39
39
  --layer-overlays-user-brush: 50;
40
- --layer-overlays-user-indicator-selected: 60;
41
- --layer-overlays-user-indicator-hovered: 70;
42
40
  --layer-overlays-user-snapline: 90;
43
41
  --layer-overlays-selection-fg: 100;
44
42
  /* User handles need to be above selection edges / corners, matters for sticky note clone handles */
@@ -139,11 +137,15 @@
139
137
  }
140
138
 
141
139
  .tl-theme__light {
142
- --color-accent: hsl(0, 76%, 60%);
140
+ /* Canvas */
141
+ --color-snap: hsl(0, 76%, 60%);
142
+ --color-selection-fill: hsl(210, 100%, 56%, 24%);
143
+ --color-selection-stroke: hsl(214, 84%, 56%);
143
144
  --color-background: hsl(210, 20%, 98%);
144
145
  --color-brush-fill: hsl(0, 0%, 56%, 10.2%);
145
146
  --color-brush-stroke: hsl(0, 0%, 56%, 25.1%);
146
147
  --color-grid: hsl(0, 0%, 43%);
148
+ /* UI */
147
149
  --color-low: hsl(204, 16%, 94%);
148
150
  --color-low-border: hsl(204, 16%, 92%);
149
151
  --color-culled: hsl(204, 14%, 93%);
@@ -154,28 +156,27 @@
154
156
  --color-hint: hsl(0, 0%, 0%, 5.5%);
155
157
  --color-overlay: hsl(0, 0%, 0%, 20%);
156
158
  --color-divider: hsl(0, 0%, 91%);
159
+ --color-panel: hsl(0, 0%, 99%);
157
160
  --color-panel-contrast: hsl(0, 0%, 100%);
158
161
  --color-panel-overlay: hsl(0, 0%, 100%, 82%);
159
- --color-panel: hsl(0, 0%, 99%);
160
162
  --color-panel-transparent: hsla(0, 0%, 99%, 0%);
161
- --color-focus: hsl(219, 65%, 50%);
162
163
  --color-selected: hsl(214, 84%, 56%);
163
164
  --color-selected-contrast: hsl(0, 0%, 100%);
164
- --color-selection-fill: hsl(210, 100%, 56%, 24%);
165
- --color-selection-stroke: hsl(214, 84%, 56%);
165
+ --color-focus: hsl(219, 65%, 50%);
166
+ /* Text */
167
+ --color-text: hsl(0, 0%, 0%);
166
168
  --color-text-0: hsl(0, 0%, 11%);
167
169
  --color-text-1: hsl(0, 0%, 18%);
168
170
  --color-text-3: hsl(220, 2%, 65%);
169
171
  --color-text-shadow: hsl(0, 0%, 100%);
170
172
  --color-text-highlight: hsl(52, 100%, 50%);
171
173
  --color-text-highlight-p3: color(display-p3 0.972 0.8205 0.05);
174
+ /* Named */
172
175
  --color-primary: hsl(214, 84%, 56%);
173
176
  --color-success: hsl(123, 46%, 34%);
174
177
  --color-info: hsl(201, 98%, 41%);
175
178
  --color-warning: hsl(27, 98%, 47%);
176
- --color-error: hsl(0, 65%, 51%);
177
- --color-warn: hsl(0, 90%, 43%);
178
- --color-text: hsl(0, 0%, 0%);
179
+ --color-danger: hsl(0, 90%, 43%);
179
180
  --color-laser: hsl(0, 100%, 50%);
180
181
  /* Shadows */
181
182
  --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%);
@@ -191,11 +192,15 @@
191
192
  }
192
193
 
193
194
  .tl-theme__dark {
194
- --color-accent: hsl(0, 76%, 60%);
195
+ /* Canvas */
196
+ --color-snap: hsl(0, 76%, 60%);
197
+ --color-selection-fill: hsl(209, 100%, 57%, 20%);
198
+ --color-selection-stroke: hsl(214, 84%, 56%);
195
199
  --color-background: hsl(240, 5%, 6.5%);
196
200
  --color-brush-fill: hsl(0, 0%, 71%, 5.1%);
197
201
  --color-brush-stroke: hsl(0, 0%, 71%, 25.1%);
198
202
  --color-grid: hsl(0, 0%, 40%);
203
+ /* UI */
199
204
  --color-low: hsl(260, 4.5%, 10.5%);
200
205
  --color-low-border: hsl(207, 10%, 10%);
201
206
  --color-culled: hsl(210, 11%, 19%);
@@ -206,28 +211,27 @@
206
211
  --color-hint: hsl(0, 0%, 100%, 7%);
207
212
  --color-overlay: hsl(0, 0%, 0%, 50%);
208
213
  --color-divider: hsl(240, 9%, 22%);
209
- --color-panel-contrast: hsl(245, 12%, 23%);
210
214
  --color-panel: hsl(235, 6.8%, 13.5%);
215
+ --color-panel-contrast: hsl(245, 12%, 23%);
211
216
  --color-panel-overlay: hsl(210, 10%, 24%, 82%);
212
217
  --color-panel-transparent: hsla(235, 6.8%, 13.5%, 0%);
213
- --color-focus: hsl(217, 76%, 80%);
214
218
  --color-selected: hsl(217, 89%, 61%);
215
219
  --color-selected-contrast: hsl(0, 0%, 100%);
216
- --color-selection-fill: hsl(209, 100%, 57%, 20%);
217
- --color-selection-stroke: hsl(214, 84%, 56%);
220
+ --color-focus: hsl(217, 76%, 80%);
221
+ /* Text */
222
+ --color-text: hsl(210, 17%, 98%);
218
223
  --color-text-0: hsl(0, 9%, 94%);
219
224
  --color-text-1: hsl(0, 0%, 85%);
220
225
  --color-text-3: hsl(210, 6%, 45%);
221
226
  --color-text-shadow: hsl(210, 13%, 18%);
222
227
  --color-text-highlight: hsl(52, 100%, 41%);
223
228
  --color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
229
+ /* Named */
224
230
  --color-primary: hsl(214, 84%, 56%);
225
231
  --color-success: hsl(123, 38%, 57%);
226
232
  --color-info: hsl(199, 92%, 56%);
227
233
  --color-warning: hsl(36, 100%, 57%);
228
- --color-error: hsl(4, 90%, 58%);
229
- --color-warn: hsl(0, 81%, 66%);
230
- --color-text: hsl(210, 17%, 98%);
234
+ --color-danger: hsl(0, 82%, 66%);
231
235
  --color-laser: hsl(0, 100%, 50%);
232
236
  /* Shadows */
233
237
  --shadow-1:
@@ -241,13 +245,6 @@
241
245
  inset 0px 0px 0px 1px var(--color-panel-contrast);
242
246
  }
243
247
 
244
- .tl-counter-scaled {
245
- transform: scale(var(--tl-scale));
246
- transform-origin: top left;
247
- width: calc(100% * var(--tl-zoom));
248
- height: calc(100% * var(--tl-zoom));
249
- }
250
-
251
248
  .tl-container,
252
249
  .tl-container * {
253
250
  -webkit-touch-callout: none;
@@ -273,9 +270,7 @@ input,
273
270
  user-select: text;
274
271
  }
275
272
 
276
- /* -------------------------------------------------- */
277
- /* Canvas */
278
- /* -------------------------------------------------- */
273
+ /* --------------------- Canvas --------------------- */
279
274
 
280
275
  .tl-canvas {
281
276
  position: absolute;
@@ -368,64 +363,6 @@ input,
368
363
  contain: layout style size;
369
364
  }
370
365
 
371
- /* ---------------------- Brush --------------------- */
372
-
373
- .tl-brush {
374
- stroke-width: calc(var(--tl-scale) * 1px);
375
- contain: size layout;
376
- }
377
-
378
- .tl-brush__default {
379
- stroke: var(--color-brush-stroke);
380
- fill: var(--color-brush-fill);
381
- }
382
-
383
- /* -------------------- Scribble -------------------- */
384
-
385
- .tl-scribble {
386
- stroke-linejoin: round;
387
- stroke-linecap: round;
388
- pointer-events: none;
389
- contain: size layout;
390
- }
391
-
392
- /* ---------------------- Shape --------------------- */
393
-
394
- .tl-shape {
395
- position: absolute;
396
- pointer-events: none;
397
- overflow: visible;
398
- transform-origin: top left;
399
- contain: size layout;
400
- }
401
-
402
- /* ---------------- Shape Containers ---------------- */
403
-
404
- .tl-svg-container {
405
- position: absolute;
406
- inset: 0px;
407
- height: 100%;
408
- width: 100%;
409
- pointer-events: none;
410
- stroke-linecap: round;
411
- stroke-linejoin: round;
412
- transform-origin: top left;
413
- overflow: visible;
414
- }
415
-
416
- .tl-html-container {
417
- position: absolute;
418
- inset: 0px;
419
- height: 100%;
420
- width: 100%;
421
- pointer-events: none;
422
- stroke-linecap: round;
423
- stroke-linejoin: round;
424
- /* content-visibility: auto; */
425
- transform-origin: top left;
426
- color: inherit;
427
- }
428
-
429
366
  /* --------------- Overlay Stack --------------- */
430
367
 
431
368
  /* back of the stack, behind user's stuff */
@@ -449,14 +386,6 @@ input,
449
386
  z-index: var(--layer-overlays-user-brush);
450
387
  }
451
388
 
452
- .tl-user-indicator__selected {
453
- z-index: var(--layer-overlays-user-indicator-selected);
454
- }
455
-
456
- .tl-user-indicator__hovered {
457
- z-index: var(--layer-overlays-user-indicator-hovered);
458
- }
459
-
460
389
  .tl-user-handles {
461
390
  z-index: var(--layer-overlays-user-handles);
462
391
  }
@@ -492,16 +421,7 @@ input,
492
421
  overflow: visible;
493
422
  }
494
423
 
495
- /* -------------------- Indicator ------------------- */
496
-
497
- .tl-shape-indicator {
498
- transform-origin: top left;
499
- fill: none;
500
- stroke-width: calc(1.5px * var(--tl-scale));
501
- contain: size layout;
502
- }
503
-
504
- /* ------------------ SelectionBox ------------------ */
424
+ /* -------------- Selection foreground -------------- */
505
425
 
506
426
  .tl-selection__bg {
507
427
  position: absolute;
@@ -560,132 +480,12 @@ input,
560
480
  stroke: transparent;
561
481
  }
562
482
 
563
- /* --------------------- Handles -------------------- */
564
-
565
- .tl-handle {
566
- pointer-events: all;
567
- }
568
-
569
- .tl-handle__bg {
570
- fill: transparent;
571
- stroke: transparent;
572
- pointer-events: all;
573
- }
574
-
575
- .tl-handle__fg {
576
- fill: var(--color-selected-contrast);
577
- stroke: var(--color-selection-stroke);
578
- stroke-width: calc(1.5px * var(--tl-scale));
579
- pointer-events: none;
580
- }
581
-
582
- .tl-handle__create {
483
+ .tl-hidden {
583
484
  opacity: 0;
485
+ pointer-events: none;
584
486
  }
585
487
 
586
- .tl-handle__clone > .tl-handle__fg {
587
- fill: var(--color-selection-stroke);
588
- stroke: none;
589
- }
590
-
591
- .tl-handle__bg:active {
592
- fill: none;
593
- }
594
-
595
- @media (pointer: coarse) {
596
- .tl-handle__bg:active {
597
- fill: var(--color-selection-fill);
598
- }
599
-
600
- .tl-handle__create {
601
- opacity: 1;
602
- }
603
- }
604
-
605
- .tl-rotate-corner:not(:hover),
606
- .tl-resize-handle:not(:hover) {
607
- cursor: none;
608
- }
609
-
610
- /* --------------------- Arrow Hints -------------------- */
611
-
612
- .tl-arrow-hint-handle {
613
- fill: var(--color-selected-contrast);
614
- stroke: var(--color-selection-stroke);
615
- stroke-width: calc(1.5px * var(--tl-scale));
616
- r: calc(4px * var(--tl-scale));
617
- }
618
-
619
- .tl-arrow-hint-snap {
620
- stroke: transparent;
621
- fill: var(--color-selection-fill);
622
- r: calc(12px * var(--tl-scale));
623
- }
624
-
625
- .tl-arrow-hint-snap__none,
626
- .tl-arrow-hint-snap__center,
627
- .tl-arrow-hint-snap__axis {
628
- display: none;
629
- }
630
-
631
- .tl-arrow-hint-snap__edge {
632
- r: calc(8px * var(--tl-scale));
633
- }
634
-
635
- /* ------------------ Bounds Detail ----------------- */
636
-
637
- .tl-image,
638
- .tl-video {
639
- object-fit: cover;
640
- background-size: cover;
641
- width: 100%;
642
- height: 100%;
643
- }
644
-
645
- .tl-video.tl-video-is-fullscreen {
646
- object-fit: contain;
647
- background-size: contain;
648
- }
649
-
650
- .tl-video-container,
651
- .tl-image-container,
652
- .tl-embed-container {
653
- width: 100%;
654
- height: 100%;
655
- pointer-events: all;
656
- /* background-color: var(--color-background); */
657
-
658
- display: flex;
659
- justify-content: center;
660
- align-items: center;
661
- }
662
-
663
- .tl-image-container {
664
- position: relative;
665
- overflow: hidden;
666
- }
667
- .tl-image {
668
- position: absolute;
669
- inset: 0;
670
- }
671
-
672
- .tl-image__tg {
673
- --scale: calc(min(2, var(--tl-scale)));
674
- position: absolute;
675
- top: calc(var(--scale) * 8px);
676
- right: calc(var(--scale) * 8px);
677
- font-size: 10px;
678
- transform-origin: top right;
679
- background-color: var(--color-background);
680
- padding: 2px 4px;
681
- border-radius: var(--radius-1);
682
- }
683
-
684
- /* --------------------- Nametag -------------------- */
685
-
686
- .tl-collaborator-cursor {
687
- position: absolute;
688
- }
488
+ /* -------------- Nametag / cursor chat ------------- */
689
489
 
690
490
  .tl-nametag {
691
491
  position: absolute;
@@ -766,25 +566,11 @@ input,
766
566
  text-shadow: none;
767
567
  }
768
568
 
769
- .tl-cursor-chat-fade {
770
- /* Setting to zero causes it to immediately disappear */
771
- /* Setting to near-zero causes it to fade out gradually */
772
- opacity: 0.0001;
773
- transition: opacity 5s ease-in-out;
774
- }
775
-
776
569
  .tl-cursor-chat::placeholder {
777
570
  color: var(--color-selected-contrast);
778
571
  opacity: 0.7;
779
572
  }
780
573
 
781
- /* --------------------- Spinner -------------------- */
782
- @keyframes spinner {
783
- to {
784
- transform: rotate(360deg);
785
- }
786
- }
787
-
788
574
  /* ---------------------- Text ---------------------- */
789
575
 
790
576
  .tl-text-shape-label {
@@ -898,6 +684,9 @@ input,
898
684
  border: none;
899
685
  user-select: none;
900
686
  contain: style paint;
687
+ visibility: hidden;
688
+ /* N.B. This property, while discouraged ("intended for Document Type Definition (DTD) designers") is necessary for ensuring correct mixed RTL/LTR behavior when exporting SVGs. */
689
+ unicode-bidi: plaintext;
901
690
  -webkit-user-select: none;
902
691
  }
903
692
 
@@ -943,6 +732,41 @@ input,
943
732
  overflow: hidden;
944
733
  }
945
734
 
735
+ .tl-text-input::selection {
736
+ background: var(--color-selected);
737
+ color: var(--color-selected-contrast);
738
+ text-shadow: none;
739
+ }
740
+
741
+ /* Text label */
742
+
743
+ .tl-text-label {
744
+ display: flex;
745
+ justify-content: center;
746
+ align-items: center;
747
+ color: var(--color-text);
748
+ text-shadow: var(--tl-text-outline);
749
+ line-height: inherit;
750
+ position: absolute;
751
+ inset: 0px;
752
+ height: 100%;
753
+ width: 100%;
754
+ }
755
+
756
+ .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner {
757
+ width: 40px;
758
+ height: 40px;
759
+ }
760
+
761
+ .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content {
762
+ pointer-events: all;
763
+ }
764
+
765
+ .tl-text-label__inner > .tl-text-input.tl-rich-text {
766
+ display: none;
767
+ position: static;
768
+ }
769
+
946
770
  .tl-text-wrapper[data-isediting='false'] .tl-text-input,
947
771
  .tl-arrow-label[data-isediting='false'] .tl-text-input {
948
772
  opacity: 0;
@@ -954,15 +778,65 @@ input,
954
778
  cursor: var(--tl-cursor-text);
955
779
  }
956
780
 
957
- .tl-text-input::selection {
958
- background: var(--color-selected);
959
- color: var(--color-selected-contrast);
960
- text-shadow: none;
781
+ .tl-text-label[data-textwrap='true'] > .tl-text-label__inner {
782
+ max-width: 100%;
961
783
  }
962
784
 
963
- .tl-rich-text .ProseMirror {
964
- word-wrap: break-word;
965
- overflow-wrap: break-word;
785
+ .tl-text-label[data-isediting='true'] {
786
+ background-color: transparent;
787
+ min-height: auto;
788
+ }
789
+
790
+ .tl-text-wrapper .tl-text-content {
791
+ pointer-events: all;
792
+ z-index: var(--layer-text-content);
793
+ }
794
+
795
+ .tl-text-label__inner > .tl-text-content {
796
+ position: relative;
797
+ top: 0px;
798
+ left: 0px;
799
+ padding: inherit;
800
+ height: fit-content;
801
+ width: fit-content;
802
+ border-radius: var(--radius-1);
803
+ max-width: 100%;
804
+ }
805
+
806
+ .tl-text-label__inner > .tl-text-input {
807
+ position: absolute;
808
+ inset: 0px;
809
+ height: 100%;
810
+ width: 100%;
811
+ padding: inherit;
812
+ }
813
+
814
+ .tl-text-wrapper[data-isselected='true'] .tl-text-input {
815
+ z-index: var(--layer-text-editor);
816
+ pointer-events: all;
817
+ }
818
+
819
+ /* This part of the rule helps preserve the occlusion rules for the shapes so we
820
+ * don't click on shapes that are behind other shapes.
821
+ * One extra nuance is we don't use this behavior for:
822
+ * - arrows which have weird geometry and just gets in the way.
823
+ * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield
824
+ * - shapes that are not filled
825
+ */
826
+ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true'])
827
+ .tl-shape:not(
828
+ [data-shape-type='arrow'],
829
+ [data-shape-type='draw'],
830
+ [data-shape-type='line'],
831
+ [data-shape-type='highlight'],
832
+ [data-shape-is-filled='false']
833
+ ) {
834
+ pointer-events: all;
835
+ }
836
+
837
+ .tl-rich-text .ProseMirror {
838
+ word-wrap: break-word;
839
+ overflow-wrap: break-word;
966
840
  white-space: pre-wrap;
967
841
 
968
842
  /**
@@ -1068,38 +942,307 @@ input,
1068
942
  }
1069
943
  }
1070
944
 
1071
- .tl-text-label__inner > .tl-text-input.tl-rich-text {
945
+ .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
946
+ display: block;
947
+ }
948
+
949
+ /* --------------------- Loading -------------------- */
950
+
951
+ .tl-loading {
952
+ background-color: var(--color-background);
953
+ color: var(--color-text-1);
954
+ height: 100%;
955
+ width: 100%;
956
+ display: flex;
957
+ flex-direction: column;
958
+ justify-content: center;
959
+ align-items: center;
960
+ gap: var(--space-2);
961
+ font-size: 14px;
962
+ font-weight: 500;
963
+ opacity: 0;
964
+ animation: fade-in 0.2s ease-in-out forwards;
965
+ animation-delay: 0.2s;
966
+ position: absolute;
967
+ inset: 0px;
968
+ z-index: var(--layer-canvas-blocker);
969
+ }
970
+
971
+ @keyframes fade-in {
972
+ 0% {
973
+ opacity: 0;
974
+ }
975
+ 100% {
976
+ opacity: 1;
977
+ }
978
+ }
979
+
980
+ /* ---------------------- Brush --------------------- */
981
+
982
+ .tl-brush {
983
+ stroke-width: calc(var(--tl-scale) * 1px);
984
+ contain: size layout;
985
+ }
986
+
987
+ .tl-brush__default {
988
+ stroke: var(--color-brush-stroke);
989
+ fill: var(--color-brush-fill);
990
+ }
991
+
992
+ /* -------------------- Scribble -------------------- */
993
+
994
+ .tl-scribble {
995
+ stroke-linejoin: round;
996
+ stroke-linecap: round;
997
+ pointer-events: none;
998
+ contain: size layout;
999
+ }
1000
+
1001
+ /* ---------------------- Snaps --------------------- */
1002
+
1003
+ .tl-snap-indicator {
1004
+ stroke: var(--color-snap);
1005
+ stroke-width: calc(1px * var(--tl-scale));
1006
+ fill: none;
1007
+ }
1008
+
1009
+ .tl-snap-point {
1010
+ stroke: var(--color-snap);
1011
+ stroke-width: calc(1px * var(--tl-scale));
1012
+ fill: none;
1013
+ }
1014
+
1015
+ /* ---------------- Hyperlink Button ---------------- */
1016
+
1017
+ .tl-hyperlink-button {
1018
+ background: none;
1019
+ margin: 0px;
1020
+ position: absolute;
1021
+ top: 0px;
1022
+ right: 0px;
1023
+ height: 44px;
1024
+ width: 44px;
1025
+ display: flex;
1026
+ align-items: center;
1027
+ justify-content: center;
1028
+ font-size: 12px;
1029
+ font-weight: 400;
1030
+ color: var(--color-text-1);
1031
+ padding: 13px;
1032
+ cursor: var(--tl-cursor-pointer);
1033
+ border: none;
1034
+ outline: none;
1035
+ pointer-events: all;
1036
+ z-index: 1;
1037
+ }
1038
+
1039
+ .tl-hyperlink-button::after {
1040
+ content: '';
1041
+ z-index: -1;
1042
+ position: absolute;
1043
+ right: 6px;
1044
+ bottom: 6px;
1045
+ display: block;
1046
+ width: calc(100% - 12px);
1047
+ height: calc(100% - 12px);
1048
+ border-radius: var(--radius-1);
1049
+ background-color: var(--color-background);
1050
+ pointer-events: none;
1051
+ }
1052
+
1053
+ .tl-hyperlink-button:focus-visible {
1054
+ color: var(--color-selected);
1055
+ }
1056
+
1057
+ .tl-hyperlink__icon {
1058
+ width: 15px;
1059
+ height: 15px;
1060
+ background-color: currentColor;
1061
+ pointer-events: none;
1062
+ }
1063
+
1064
+ .tl-hyperlink-button__hidden {
1072
1065
  display: none;
1073
- position: static;
1074
1066
  }
1075
1067
 
1076
- .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
1077
- display: block;
1068
+ /* --------------------- Handles -------------------- */
1069
+
1070
+ .tl-handle {
1071
+ pointer-events: all;
1072
+ }
1073
+
1074
+ .tl-handle__bg {
1075
+ fill: transparent;
1076
+ stroke: transparent;
1077
+ pointer-events: all;
1078
+ }
1079
+
1080
+ .tl-handle__fg {
1081
+ fill: var(--color-selected-contrast);
1082
+ stroke: var(--color-selection-stroke);
1083
+ stroke-width: calc(1.5px * var(--tl-scale));
1084
+ pointer-events: none;
1085
+ }
1086
+
1087
+ .tl-handle__create {
1088
+ opacity: 0;
1089
+ }
1090
+
1091
+ .tl-handle__clone > .tl-handle__fg {
1092
+ fill: var(--color-selection-stroke);
1093
+ stroke: none;
1094
+ }
1095
+
1096
+ .tl-handle__bg:active {
1097
+ fill: none;
1098
+ }
1099
+
1100
+ @media (pointer: coarse) {
1101
+ .tl-handle__bg:active {
1102
+ fill: var(--color-selection-fill);
1103
+ }
1104
+
1105
+ .tl-handle__create {
1106
+ opacity: 1;
1107
+ }
1108
+ }
1109
+
1110
+ .tl-rotate-corner:not(:hover),
1111
+ .tl-resize-handle:not(:hover) {
1112
+ cursor: none;
1113
+ }
1114
+
1115
+ /* ----------------- Shape indicator ---------------- */
1116
+
1117
+ .tl-shape-indicator {
1118
+ transform-origin: top left;
1119
+ fill: none;
1120
+ stroke-width: calc(1.5px * var(--tl-scale));
1121
+ contain: size layout;
1122
+ }
1123
+
1124
+ /* ---------------------- Shape --------------------- */
1125
+
1126
+ .tl-shape {
1127
+ position: absolute;
1128
+ pointer-events: none;
1129
+ overflow: visible;
1130
+ transform-origin: top left;
1131
+ contain: size layout;
1132
+ }
1133
+
1134
+ /* ---------------- Shape Containers ---------------- */
1135
+
1136
+ .tl-svg-container {
1137
+ position: absolute;
1138
+ inset: 0px;
1139
+ height: 100%;
1140
+ width: 100%;
1141
+ pointer-events: none;
1142
+ stroke-linecap: round;
1143
+ stroke-linejoin: round;
1144
+ transform-origin: top left;
1145
+ overflow: visible;
1146
+ }
1147
+
1148
+ .tl-html-container {
1149
+ position: absolute;
1150
+ inset: 0px;
1151
+ height: 100%;
1152
+ width: 100%;
1153
+ pointer-events: none;
1154
+ stroke-linecap: round;
1155
+ stroke-linejoin: round;
1156
+ /* content-visibility: auto; */
1157
+ transform-origin: top left;
1158
+ color: var(--color-text-1);
1159
+ }
1160
+
1161
+ /* -------------------- Group shape ------------------ */
1162
+
1163
+ .tl-group {
1164
+ stroke: var(--color-text);
1165
+ stroke-width: calc(1px * var(--tl-scale));
1166
+ opacity: 0.5;
1167
+ }
1168
+
1169
+ /* --------------------- Arrow shape -------------------- */
1170
+
1171
+ .tl-arrow-label {
1172
+ position: absolute;
1173
+ top: -1px;
1174
+ left: -1px;
1175
+ width: 2px;
1176
+ height: 2px;
1177
+ padding: 0px;
1178
+ display: flex;
1179
+ justify-content: center;
1180
+ align-items: center;
1181
+ text-align: center;
1182
+ color: var(--color-text);
1183
+ text-shadow: var(--tl-text-outline);
1184
+ }
1185
+
1186
+ .tl-arrow-label[data-isediting='true'] p {
1187
+ opacity: 0;
1188
+ }
1189
+
1190
+ .tl-arrow-label__inner {
1191
+ border-radius: var(--radius-1);
1192
+ box-sizing: content-box;
1193
+ position: relative;
1194
+ height: max-content;
1195
+ width: max-content;
1196
+ pointer-events: none;
1197
+ display: flex;
1198
+ justify-content: center;
1199
+ align-items: center;
1200
+ }
1201
+
1202
+ .tl-arrow-label .tl-arrow {
1203
+ position: relative;
1204
+ height: max-content;
1205
+ padding: inherit;
1206
+ overflow: visible;
1207
+ }
1208
+
1209
+ .tl-arrow-label textarea {
1210
+ padding: inherit;
1211
+ /* Don't allow textarea to be zero width */
1212
+ min-width: 4px;
1213
+ }
1214
+
1215
+ .tl-arrow-hint {
1216
+ stroke: var(--color-text-1);
1217
+ fill: none;
1218
+ stroke-linecap: round;
1219
+ overflow: visible;
1220
+ }
1221
+
1222
+ .tl-arrow-hint-handle {
1223
+ fill: var(--color-selected-contrast);
1224
+ stroke: var(--color-selection-stroke);
1225
+ stroke-width: calc(1.5px * var(--tl-scale));
1226
+ r: calc(4px * var(--tl-scale));
1078
1227
  }
1079
1228
 
1080
- /* ------------------- Snap Lines ------------------- */
1081
-
1082
- .tl-snap-indicator {
1083
- stroke: var(--color-accent);
1084
- stroke-width: calc(1px * var(--tl-scale));
1085
- fill: none;
1229
+ .tl-arrow-hint-snap {
1230
+ stroke: transparent;
1231
+ fill: var(--color-selection-fill);
1232
+ r: calc(12px * var(--tl-scale));
1086
1233
  }
1087
1234
 
1088
- .tl-snap-point {
1089
- stroke: var(--color-accent);
1090
- stroke-width: calc(1px * var(--tl-scale));
1091
- fill: none;
1235
+ .tl-arrow-hint-snap__none,
1236
+ .tl-arrow-hint-snap__center,
1237
+ .tl-arrow-hint-snap__axis {
1238
+ display: none;
1092
1239
  }
1093
1240
 
1094
- /* -------------------- Groups ------------------ */
1095
-
1096
- .tl-group {
1097
- stroke: var(--color-text);
1098
- stroke-width: calc(1px * var(--tl-scale));
1099
- opacity: 0.5;
1241
+ .tl-arrow-hint-snap__edge {
1242
+ r: calc(8px * var(--tl-scale));
1100
1243
  }
1101
1244
 
1102
- /* ------------------- Bookmark Shape ------------------- */
1245
+ /* ------------------- Bookmark shape ------------------- */
1103
1246
 
1104
1247
  .tl-bookmark__container {
1105
1248
  width: 100%;
@@ -1127,6 +1270,7 @@ input,
1127
1270
  display: flex;
1128
1271
  justify-content: flex-end;
1129
1272
  align-items: flex-start;
1273
+ box-shadow: inset 0px 0px 0px 1px var(--color-divider);
1130
1274
  }
1131
1275
 
1132
1276
  .tl-bookmark__image_container > .tl-hyperlink-button::after {
@@ -1149,7 +1293,7 @@ input,
1149
1293
  }
1150
1294
 
1151
1295
  .tl-bookmark__copy_container {
1152
- background-color: var(--color-muted);
1296
+ background-color: var(--color-muted-0);
1153
1297
  padding: var(--space-4);
1154
1298
  pointer-events: all;
1155
1299
  display: flex;
@@ -1168,11 +1312,11 @@ input,
1168
1312
 
1169
1313
  .tl-bookmark__heading {
1170
1314
  font-size: 16px;
1171
- line-height: 1.5;
1315
+ line-height: 1.6;
1172
1316
  font-weight: bold;
1173
1317
  padding-bottom: var(--space-2);
1174
1318
  overflow: hidden;
1175
- max-height: calc((16px * 1.5) * 2);
1319
+ max-height: calc((16px * 1.6) * 2);
1176
1320
  -webkit-box-orient: vertical;
1177
1321
  -webkit-line-clamp: 2;
1178
1322
  line-clamp: 2;
@@ -1228,193 +1372,44 @@ input,
1228
1372
  flex-shrink: 0;
1229
1373
  }
1230
1374
 
1231
- /* ---------------- Hyperlink Button ---------------- */
1232
-
1233
- .tl-hyperlink-button {
1234
- background: none;
1235
- margin: 0px;
1236
- position: absolute;
1237
- top: 0px;
1238
- right: 0px;
1239
- height: 44px;
1240
- width: 44px;
1241
- display: flex;
1242
- align-items: center;
1243
- justify-content: center;
1244
- font-size: 12px;
1245
- font-weight: 400;
1246
- color: var(--color-text-1);
1247
- padding: 13px;
1248
- cursor: var(--tl-cursor-pointer);
1249
- border: none;
1250
- outline: none;
1251
- pointer-events: all;
1252
- z-index: 1;
1253
- }
1254
-
1255
- .tl-hyperlink-button::after {
1256
- content: '';
1257
- z-index: -1;
1258
- position: absolute;
1259
- right: 6px;
1260
- bottom: 6px;
1261
- display: block;
1262
- width: calc(100% - 12px);
1263
- height: calc(100% - 12px);
1264
- border-radius: var(--radius-1);
1265
- background-color: var(--color-background);
1266
- pointer-events: none;
1267
- }
1268
-
1269
- .tl-hyperlink-button:focus-visible {
1270
- color: var(--color-selected);
1271
- }
1272
-
1273
- .tl-hyperlink__icon {
1274
- width: 16px;
1275
- height: 16px;
1276
- background-color: currentColor;
1277
- pointer-events: none;
1278
- }
1279
-
1280
- .tl-hyperlink-button__hidden {
1281
- display: none;
1282
- }
1283
-
1284
- /* ---------------- Geo shape ---------------- */
1375
+ /* -------------- Image and video shape ------------- */
1285
1376
 
1286
- .tl-text-label {
1287
- display: flex;
1288
- justify-content: center;
1289
- align-items: center;
1290
- color: var(--color-text);
1291
- text-shadow: var(--tl-text-outline);
1292
- line-height: inherit;
1293
- position: absolute;
1294
- inset: 0px;
1295
- height: 100%;
1377
+ .tl-image,
1378
+ .tl-video {
1379
+ object-fit: cover;
1380
+ background-size: cover;
1296
1381
  width: 100%;
1297
- }
1298
-
1299
- .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner {
1300
- width: 40px;
1301
- height: 40px;
1302
- }
1303
-
1304
- .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content {
1305
- pointer-events: all;
1306
- }
1307
-
1308
- .tl-text-wrapper .tl-text-content {
1309
- pointer-events: all;
1310
- z-index: var(--layer-text-content);
1311
- }
1312
-
1313
- .tl-text-label__inner > .tl-text-content {
1314
- position: relative;
1315
- top: 0px;
1316
- left: 0px;
1317
- padding: inherit;
1318
- height: fit-content;
1319
- width: fit-content;
1320
- border-radius: var(--radius-1);
1321
- max-width: 100%;
1322
- }
1323
-
1324
- .tl-text-label__inner > .tl-text-input {
1325
- position: absolute;
1326
- inset: 0px;
1327
1382
  height: 100%;
1328
- width: 100%;
1329
- padding: inherit;
1330
- }
1331
-
1332
- .tl-text-wrapper[data-isselected='true'] .tl-text-input {
1333
- z-index: var(--layer-text-editor);
1334
- pointer-events: all;
1335
1383
  }
1336
1384
 
1337
- /* This part of the rule helps preserve the occlusion rules for the shapes so we
1338
- * don't click on shapes that are behind other shapes.
1339
- * One extra nuance is we don't use this behavior for:
1340
- * - arrows which have weird geometry and just gets in the way.
1341
- * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield
1342
- * - shapes that are not filled
1343
- */
1344
- .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true'])
1345
- .tl-shape:not(
1346
- [data-shape-type='arrow'],
1347
- [data-shape-type='draw'],
1348
- [data-shape-type='line'],
1349
- [data-shape-type='highlight'],
1350
- [data-shape-is-filled='false']
1351
- ) {
1385
+ .tl-video-container,
1386
+ .tl-image-container,
1387
+ .tl-embed-container {
1388
+ width: 100%;
1389
+ height: 100%;
1352
1390
  pointer-events: all;
1353
- }
1354
-
1355
- .tl-text-label[data-textwrap='true'] > .tl-text-label__inner {
1356
- max-width: 100%;
1357
- }
1358
-
1359
- .tl-text-label[data-isediting='true'] {
1360
- background-color: transparent;
1361
- min-height: auto;
1362
- }
1363
-
1364
- .tl-arrow-hint {
1365
- stroke: var(--color-text-1);
1366
- fill: none;
1367
- stroke-linecap: round;
1368
- overflow: visible;
1369
- }
1370
-
1371
- /* ------------------- Arrow Shape ------------------ */
1391
+ /* background-color: var(--color-background); */
1372
1392
 
1373
- .tl-arrow-label {
1374
- position: absolute;
1375
- top: -1px;
1376
- left: -1px;
1377
- width: 2px;
1378
- height: 2px;
1379
- padding: 0px;
1380
1393
  display: flex;
1381
1394
  justify-content: center;
1382
1395
  align-items: center;
1383
- text-align: center;
1384
- color: var(--color-text);
1385
- text-shadow: var(--tl-text-outline);
1386
- }
1387
-
1388
- .tl-arrow-label[data-isediting='true'] p {
1389
- opacity: 0;
1390
1396
  }
1391
1397
 
1392
- .tl-arrow-label__inner {
1393
- border-radius: var(--radius-1);
1394
- box-sizing: content-box;
1398
+ .tl-image-container {
1395
1399
  position: relative;
1396
- height: max-content;
1397
- width: max-content;
1398
- pointer-events: none;
1399
- display: flex;
1400
- justify-content: center;
1401
- align-items: center;
1402
1400
  }
1403
1401
 
1404
- .tl-arrow-label .tl-arrow {
1405
- position: relative;
1406
- height: max-content;
1407
- padding: inherit;
1408
- overflow: visible;
1402
+ .tl-image {
1403
+ position: absolute;
1404
+ inset: 0;
1409
1405
  }
1410
1406
 
1411
- .tl-arrow-label textarea {
1412
- padding: inherit;
1413
- /* Don't allow textarea to be zero width */
1414
- min-width: 4px;
1407
+ .tl-video.tl-video-is-fullscreen {
1408
+ object-fit: contain;
1409
+ background-size: contain;
1415
1410
  }
1416
1411
 
1417
- /* -------------------- NoteShape ------------------- */
1412
+ /* -------------------- Note shape ------------------- */
1418
1413
 
1419
1414
  .tl-note__container {
1420
1415
  position: relative;
@@ -1431,38 +1426,7 @@ input,
1431
1426
  color: currentColor;
1432
1427
  }
1433
1428
 
1434
- /* --------------------- Loading -------------------- */
1435
-
1436
- .tl-loading {
1437
- background-color: var(--color-background);
1438
- color: var(--color-text-1);
1439
- height: 100%;
1440
- width: 100%;
1441
- display: flex;
1442
- flex-direction: column;
1443
- justify-content: center;
1444
- align-items: center;
1445
- gap: var(--space-2);
1446
- font-size: 14px;
1447
- font-weight: 500;
1448
- opacity: 0;
1449
- animation: fade-in 0.2s ease-in-out forwards;
1450
- animation-delay: 0.2s;
1451
- position: absolute;
1452
- inset: 0px;
1453
- z-index: var(--layer-canvas-blocker);
1454
- }
1455
-
1456
- @keyframes fade-in {
1457
- 0% {
1458
- opacity: 0;
1459
- }
1460
- 100% {
1461
- opacity: 1;
1462
- }
1463
- }
1464
-
1465
- /* -------------------- FrameShape ------------------- */
1429
+ /* ------------------- Frame shape ------------------- */
1466
1430
 
1467
1431
  .tl-frame__body {
1468
1432
  stroke-width: calc(1px * var(--tl-scale));
@@ -1555,14 +1519,14 @@ input,
1555
1519
  }
1556
1520
  }
1557
1521
 
1558
- /* ------------------ iFrames Detail ----------------- */
1522
+ /* ------------------- Embed Shape ------------------ */
1559
1523
 
1560
1524
  .tl-embed {
1561
1525
  border: none;
1562
1526
  border-radius: var(--radius-2);
1563
1527
  }
1564
1528
 
1565
- /* -------------- Shape Error Boundary -------------- */
1529
+ /* -------------- Shape error boundary -------------- */
1566
1530
 
1567
1531
  .tl-shape-error-boundary {
1568
1532
  width: 100%;
@@ -1591,7 +1555,7 @@ input,
1591
1555
  color: var(--color-text-0);
1592
1556
  }
1593
1557
 
1594
- /* ----------------- Error Boundary ----------------- */
1558
+ /* ----------------- Error boundary ----------------- */
1595
1559
 
1596
1560
  .tl-error-boundary {
1597
1561
  width: 100%;
@@ -1741,7 +1705,7 @@ it from receiving any pointer events or affecting the cursor. */
1741
1705
  gap: var(--space-4);
1742
1706
  }
1743
1707
  .tl-error-boundary__content .tl-error-boundary__reset {
1744
- color: var(--color-warn);
1708
+ color: var(--color-danger);
1745
1709
  }
1746
1710
  .tl-error-boundary__content .tl-error-boundary__refresh {
1747
1711
  background-color: var(--color-primary);
@@ -1753,22 +1717,6 @@ it from receiving any pointer events or affecting the cursor. */
1753
1717
  outline-offset: 0;
1754
1718
  }
1755
1719
 
1756
- /* --------------------- Coarse --------------------- */
1757
-
1758
- .tl-hidden {
1759
- opacity: 0;
1760
- pointer-events: none;
1761
- }
1762
-
1763
- .debug__ui-logger {
1764
- position: absolute;
1765
- top: 62px;
1766
- left: 16px;
1767
- color: #555;
1768
- font-size: 12px;
1769
- font-family: monospace;
1770
- }
1771
-
1772
1720
  /* ---------------- Hit test blocker ---------------- */
1773
1721
 
1774
1722
  .tl-hit-test-blocker {
@@ -1784,6 +1732,8 @@ it from receiving any pointer events or affecting the cursor. */
1784
1732
  display: none;
1785
1733
  }
1786
1734
 
1735
+ /* --------------------- Hovers --------------------- */
1736
+
1787
1737
  @media (hover: hover) {
1788
1738
  .tl-handle__create:hover {
1789
1739
  opacity: 1;