@tldraw/editor 3.15.3 → 3.16.0-canary.016d4c2889b7

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 (147) hide show
  1. package/dist-cjs/index.d.ts +180 -9
  2. package/dist-cjs/index.js +5 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +8 -2
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/MenuClickCapture.js +0 -5
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/Shape.js +11 -36
  9. package/dist-cjs/lib/components/Shape.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +4 -23
  11. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +1 -1
  13. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +1 -1
  14. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  16. package/dist-cjs/lib/components/default-components/DefaultScribble.js +1 -1
  17. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +2 -2
  18. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +9 -1
  19. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  20. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js +53 -0
  21. package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js.map +7 -0
  22. package/dist-cjs/lib/config/TLUserPreferences.js +9 -3
  23. package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
  24. package/dist-cjs/lib/editor/Editor.js +138 -69
  25. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  26. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +9 -4
  27. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  28. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +13 -0
  29. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
  31. package/dist-cjs/lib/exports/getSvgJsx.js +35 -16
  32. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  33. package/dist-cjs/lib/hooks/useCanvasEvents.js +31 -25
  34. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  35. package/dist-cjs/lib/hooks/useEditorComponents.js +2 -0
  36. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  37. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js +4 -1
  38. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  39. package/dist-cjs/lib/{utils/nearestMultiple.js → hooks/useStateAttribute.js} +15 -14
  40. package/dist-cjs/lib/hooks/useStateAttribute.js.map +7 -0
  41. package/dist-cjs/lib/license/Watermark.js +6 -6
  42. package/dist-cjs/lib/license/Watermark.js.map +1 -1
  43. package/dist-cjs/lib/options.js +7 -0
  44. package/dist-cjs/lib/options.js.map +2 -2
  45. package/dist-cjs/lib/primitives/Box.js +3 -0
  46. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  47. package/dist-cjs/lib/utils/EditorAtom.js +45 -0
  48. package/dist-cjs/lib/utils/EditorAtom.js.map +7 -0
  49. package/dist-cjs/version.js +3 -3
  50. package/dist-cjs/version.js.map +1 -1
  51. package/dist-esm/index.d.mts +180 -9
  52. package/dist-esm/index.mjs +7 -1
  53. package/dist-esm/index.mjs.map +2 -2
  54. package/dist-esm/lib/TldrawEditor.mjs +8 -2
  55. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  56. package/dist-esm/lib/components/MenuClickCapture.mjs +0 -5
  57. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  58. package/dist-esm/lib/components/Shape.mjs +11 -36
  59. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  60. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +4 -23
  61. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  62. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +1 -1
  63. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +1 -1
  64. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +1 -1
  65. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  66. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +1 -1
  67. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +2 -2
  68. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +9 -1
  69. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  70. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs +23 -0
  71. package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs.map +7 -0
  72. package/dist-esm/lib/config/TLUserPreferences.mjs +9 -3
  73. package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
  74. package/dist-esm/lib/editor/Editor.mjs +138 -69
  75. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  76. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +9 -4
  77. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  78. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +13 -0
  79. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  80. package/dist-esm/lib/exports/getSvgJsx.mjs +36 -16
  81. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  82. package/dist-esm/lib/hooks/useCanvasEvents.mjs +32 -26
  83. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  84. package/dist-esm/lib/hooks/useEditorComponents.mjs +4 -0
  85. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  86. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs +4 -1
  87. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  88. package/dist-esm/lib/hooks/useStateAttribute.mjs +15 -0
  89. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +7 -0
  90. package/dist-esm/lib/license/Watermark.mjs +6 -6
  91. package/dist-esm/lib/license/Watermark.mjs.map +1 -1
  92. package/dist-esm/lib/options.mjs +7 -0
  93. package/dist-esm/lib/options.mjs.map +2 -2
  94. package/dist-esm/lib/primitives/Box.mjs +4 -1
  95. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  96. package/dist-esm/lib/utils/EditorAtom.mjs +25 -0
  97. package/dist-esm/lib/utils/EditorAtom.mjs.map +7 -0
  98. package/dist-esm/version.mjs +3 -3
  99. package/dist-esm/version.mjs.map +1 -1
  100. package/editor.css +305 -311
  101. package/package.json +14 -37
  102. package/src/index.ts +7 -0
  103. package/src/lib/TldrawEditor.tsx +13 -6
  104. package/src/lib/components/MenuClickCapture.tsx +0 -8
  105. package/src/lib/components/Shape.tsx +12 -33
  106. package/src/lib/components/default-components/DefaultCanvas.tsx +5 -22
  107. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -1
  108. package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -1
  109. package/src/lib/components/default-components/DefaultScribble.tsx +1 -1
  110. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +5 -1
  111. package/src/lib/components/default-components/DefaultShapeWrapper.tsx +35 -0
  112. package/src/lib/config/TLUserPreferences.ts +8 -1
  113. package/src/lib/editor/Editor.test.ts +12 -11
  114. package/src/lib/editor/Editor.ts +178 -103
  115. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +15 -14
  116. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +16 -15
  117. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +49 -48
  118. package/src/lib/editor/managers/FontManager/FontManager.test.ts +24 -23
  119. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +7 -6
  120. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +12 -11
  121. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +57 -50
  122. package/src/lib/editor/managers/TextManager/TextManager.test.ts +51 -26
  123. package/src/lib/editor/managers/TickManager/TickManager.test.ts +14 -13
  124. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +34 -26
  125. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +6 -1
  126. package/src/lib/editor/shapes/ShapeUtil.ts +36 -0
  127. package/src/lib/editor/types/misc-types.ts +73 -1
  128. package/src/lib/exports/getSvgJsx.test.ts +868 -0
  129. package/src/lib/exports/getSvgJsx.tsx +78 -21
  130. package/src/lib/hooks/useCanvasEvents.ts +45 -38
  131. package/src/lib/hooks/useEditorComponents.tsx +7 -1
  132. package/src/lib/hooks/usePassThroughWheelEvents.ts +6 -1
  133. package/src/lib/hooks/useStateAttribute.ts +15 -0
  134. package/src/lib/license/LicenseManager.test.ts +3 -1
  135. package/src/lib/license/Watermark.test.tsx +2 -1
  136. package/src/lib/license/Watermark.tsx +6 -6
  137. package/src/lib/options.ts +8 -0
  138. package/src/lib/primitives/Box.test.ts +126 -0
  139. package/src/lib/primitives/Box.ts +10 -1
  140. package/src/lib/utils/EditorAtom.ts +37 -0
  141. package/src/lib/utils/sync/LocalIndexedDb.test.ts +2 -1
  142. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +15 -15
  143. package/src/version.ts +3 -3
  144. package/dist-cjs/lib/utils/nearestMultiple.js.map +0 -7
  145. package/dist-esm/lib/utils/nearestMultiple.mjs +0 -14
  146. package/dist-esm/lib/utils/nearestMultiple.mjs.map +0 -7
  147. package/src/lib/utils/nearestMultiple.ts +0 -13
package/editor.css CHANGED
@@ -5,57 +5,58 @@
5
5
  height: 100%;
6
6
  font-size: 12px;
7
7
  /* Spacing */
8
- --space-1: 2px;
9
- --space-2: 4px;
10
- --space-3: 8px;
11
- --space-4: 12px;
12
- --space-5: 16px;
13
- --space-6: 20px;
14
- --space-7: 28px;
15
- --space-8: 32px;
16
- --space-9: 64px;
17
- --space-10: 72px;
8
+ --tl-space-1: 2px;
9
+ --tl-space-2: 4px;
10
+ --tl-space-3: 8px;
11
+ --tl-space-4: 12px;
12
+ --tl-space-5: 16px;
13
+ --tl-space-6: 20px;
14
+ --tl-space-7: 28px;
15
+ --tl-space-8: 32px;
16
+ --tl-space-9: 64px;
17
+ --tl-space-10: 72px;
18
18
  /* Radius */
19
- --radius-0: 2px;
20
- --radius-1: 4px;
21
- --radius-2: 6px;
22
- --radius-3: 9px;
23
- --radius-4: 11px;
19
+ --tl-radius-0: 2px;
20
+ --tl-radius-1: 4px;
21
+ --tl-radius-2: 6px;
22
+ --tl-radius-3: 9px;
23
+ --tl-radius-4: 11px;
24
24
 
25
25
  /* Canvas z-index */
26
- --layer-canvas-hidden: -999999;
27
- --layer-canvas-background: 100;
28
- --layer-canvas-grid: 150;
29
- --layer-watermark: 200;
30
- --layer-canvas-shapes: 300;
31
- --layer-canvas-overlays: 500;
32
- --layer-canvas-blocker: 10000;
26
+ --tl-layer-canvas-hidden: -999999;
27
+ --tl-layer-canvas-background: 100;
28
+ --tl-layer-canvas-grid: 150;
29
+ --tl-layer-watermark: 200;
30
+ --tl-layer-canvas-shapes: 300;
31
+ --tl-layer-canvas-overlays: 500;
32
+ --tl-layer-canvas-in-front: 600;
33
+ --tl-layer-canvas-blocker: 10000;
33
34
 
34
35
  /* Canvas overlays z-index */
35
- --layer-overlays-collaborator-scribble: 10;
36
- --layer-overlays-collaborator-brush: 20;
37
- --layer-overlays-collaborator-shape-indicator: 30;
38
- --layer-overlays-user-scribble: 40;
39
- --layer-overlays-user-brush: 50;
40
- --layer-overlays-user-snapline: 90;
41
- --layer-overlays-selection-fg: 100;
36
+ --tl-layer-overlays-collaborator-scribble: 10;
37
+ --tl-layer-overlays-collaborator-brush: 20;
38
+ --tl-layer-overlays-collaborator-shape-indicator: 30;
39
+ --tl-layer-overlays-user-scribble: 40;
40
+ --tl-layer-overlays-user-brush: 50;
41
+ --tl-layer-overlays-user-snapline: 90;
42
+ --tl-layer-overlays-selection-fg: 100;
42
43
  /* User handles need to be above selection edges / corners, matters for sticky note clone handles */
43
- --layer-overlays-user-handles: 105;
44
- --layer-overlays-user-indicator-hint: 110;
45
- --layer-overlays-custom: 115;
46
- --layer-overlays-collaborator-cursor-hint: 120;
47
- --layer-overlays-collaborator-cursor: 130;
44
+ --tl-layer-overlays-user-handles: 105;
45
+ --tl-layer-overlays-user-indicator-hint: 110;
46
+ --tl-layer-overlays-custom: 115;
47
+ --tl-layer-overlays-collaborator-cursor-hint: 120;
48
+ --tl-layer-overlays-collaborator-cursor: 130;
48
49
 
49
50
  /* Text editor z-index */
50
- --layer-text-container: 1;
51
- --layer-text-content: 3;
52
- --layer-text-editor: 4;
51
+ --tl-layer-text-container: 1;
52
+ --tl-layer-text-content: 3;
53
+ --tl-layer-text-editor: 4;
53
54
 
54
55
  /* Error fallback z-index */
55
- --layer-error-overlay: 1;
56
- --layer-error-canvas: 2;
57
- --layer-error-canvas-after: 3;
58
- --layer-error-content: 4;
56
+ --tl-layer-error-overlay: 1;
57
+ --tl-layer-error-canvas: 2;
58
+ --tl-layer-error-canvas-after: 3;
59
+ --tl-layer-error-content: 4;
59
60
 
60
61
  /* Misc */
61
62
  --tl-zoom: 1;
@@ -120,12 +121,15 @@
120
121
  --tl-font-serif: 'tldraw_serif', serif;
121
122
  --tl-font-mono: 'tldraw_mono', monospace;
122
123
  /* text outline */
123
- --a: calc(min(0.5, 1 / var(--tl-zoom)) * 2px);
124
- --b: calc(min(0.5, 1 / var(--tl-zoom)) * -2px);
124
+ --tl-text-outline-a: calc(min(0.5, 1 / var(--tl-zoom)) * 2px);
125
+ --tl-text-outline-b: calc(min(0.5, 1 / var(--tl-zoom)) * -2px);
125
126
  --tl-text-outline-reference:
126
- 0 var(--b) 0 var(--color-background), 0 var(--a) 0 var(--color-background),
127
- var(--b) var(--b) 0 var(--color-background), var(--a) var(--b) 0 var(--color-background),
128
- var(--a) var(--a) 0 var(--color-background), var(--b) var(--a) 0 var(--color-background);
127
+ 0 var(--tl-text-outline-b) 0 var(--tl-color-background),
128
+ 0 var(--tl-text-outline-a) 0 var(--tl-color-background),
129
+ var(--tl-text-outline-b) var(--tl-text-outline-b) 0 var(--tl-color-background),
130
+ var(--tl-text-outline-a) var(--tl-text-outline-b) 0 var(--tl-color-background),
131
+ var(--tl-text-outline-a) var(--tl-text-outline-a) 0 var(--tl-color-background),
132
+ var(--tl-text-outline-b) var(--tl-text-outline-a) 0 var(--tl-color-background);
129
133
  --tl-text-outline: var(--tl-text-outline-reference);
130
134
  /* own properties */
131
135
  position: relative;
@@ -133,116 +137,118 @@
133
137
  height: 100%;
134
138
  width: 100%;
135
139
  overflow: clip;
136
- color: var(--color-text);
140
+ color: var(--tl-color-text);
137
141
  }
138
142
 
139
143
  .tl-theme__light {
140
144
  /* 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%);
144
- --color-background: hsl(210, 20%, 98%);
145
- --color-brush-fill: hsl(0, 0%, 56%, 10.2%);
146
- --color-brush-stroke: hsl(0, 0%, 56%, 25.1%);
147
- --color-grid: hsl(0, 0%, 43%);
145
+ --tl-color-snap: hsl(0, 76%, 60%);
146
+ --tl-color-selection-fill: hsl(210, 100%, 56%, 24%);
147
+ --tl-color-selection-stroke: hsl(214, 84%, 56%);
148
+ --tl-color-background: hsl(210, 20%, 98%);
149
+ --tl-color-brush-fill: hsl(0, 0%, 56%, 10.2%);
150
+ --tl-color-brush-stroke: hsl(0, 0%, 56%, 25.1%);
151
+ --tl-color-grid: hsl(0, 0%, 43%);
148
152
  /* UI */
149
- --color-low: hsl(204, 16%, 94%);
150
- --color-low-border: hsl(204, 16%, 92%);
151
- --color-culled: hsl(204, 14%, 93%);
152
- --color-muted-none: hsl(0, 0%, 0%, 0%);
153
- --color-muted-0: hsl(0, 0%, 0%, 2%);
154
- --color-muted-1: hsl(0, 0%, 0%, 10%);
155
- --color-muted-2: hsl(0, 0%, 0%, 4.3%);
156
- --color-hint: hsl(0, 0%, 0%, 5.5%);
157
- --color-overlay: hsl(0, 0%, 0%, 20%);
158
- --color-divider: hsl(0, 0%, 91%);
159
- --color-panel: hsl(0, 0%, 99%);
160
- --color-panel-contrast: hsl(0, 0%, 100%);
161
- --color-panel-overlay: hsl(0, 0%, 100%, 82%);
162
- --color-panel-transparent: hsla(0, 0%, 99%, 0%);
163
- --color-selected: hsl(214, 84%, 56%);
164
- --color-selected-contrast: hsl(0, 0%, 100%);
165
- --color-focus: hsl(219, 65%, 50%);
153
+ --tl-color-low: hsl(204, 16%, 94%);
154
+ --tl-color-low-border: hsl(204, 16%, 92%);
155
+ --tl-color-culled: hsl(204, 14%, 93%);
156
+ --tl-color-muted-none: hsl(0, 0%, 0%, 0%);
157
+ --tl-color-muted-0: hsl(0, 0%, 0%, 2%);
158
+ --tl-color-muted-1: hsl(0, 0%, 0%, 10%);
159
+ --tl-color-muted-2: hsl(0, 0%, 0%, 4.3%);
160
+ --tl-color-hint: hsl(0, 0%, 0%, 5.5%);
161
+ --tl-color-overlay: hsl(0, 0%, 0%, 20%);
162
+ --tl-color-divider: hsl(0, 0%, 91%);
163
+ --tl-color-panel: hsl(0, 0%, 99%);
164
+ --tl-color-panel-contrast: hsl(0, 0%, 100%);
165
+ --tl-color-panel-overlay: hsl(0, 0%, 100%, 82%);
166
+ --tl-color-panel-transparent: hsla(0, 0%, 99%, 0%);
167
+ --tl-color-selected: hsl(214, 84%, 56%);
168
+ --tl-color-selected-contrast: hsl(0, 0%, 100%);
169
+ --tl-color-focus: hsl(219, 65%, 50%);
170
+ --tl-color-tooltip: hsla(200, 14%, 4%, 1);
166
171
  /* Text */
167
- --color-text: hsl(0, 0%, 0%);
168
- --color-text-0: hsl(0, 0%, 11%);
169
- --color-text-1: hsl(0, 0%, 18%);
170
- --color-text-3: hsl(204, 4%, 45%);
171
- --color-text-shadow: hsl(0, 0%, 100%);
172
- --color-text-highlight: hsl(52, 100%, 50%);
173
- --color-text-highlight-p3: color(display-p3 0.972 0.8205 0.05);
172
+ --tl-color-text: hsl(0, 0%, 0%);
173
+ --tl-color-text-0: hsl(0, 0%, 11%);
174
+ --tl-color-text-1: hsl(0, 0%, 18%);
175
+ --tl-color-text-3: hsl(204, 4%, 45%);
176
+ --tl-color-text-shadow: hsl(0, 0%, 100%);
177
+ --tl-color-text-highlight: hsl(52, 100%, 50%);
178
+ --tl-color-text-highlight-p3: color(display-p3 0.972 0.8205 0.05);
174
179
  /* Named */
175
- --color-primary: hsl(214, 84%, 56%);
176
- --color-success: hsl(123, 46%, 34%);
177
- --color-info: hsl(201, 98%, 41%);
178
- --color-warning: hsl(27, 98%, 47%);
179
- --color-danger: hsl(0, 90%, 43%);
180
- --color-laser: hsl(0, 100%, 50%);
180
+ --tl-color-primary: hsl(214, 84%, 56%);
181
+ --tl-color-success: hsl(123, 46%, 34%);
182
+ --tl-color-info: hsl(201, 98%, 41%);
183
+ --tl-color-warning: hsl(27, 98%, 47%);
184
+ --tl-color-danger: hsl(0, 90%, 43%);
185
+ --tl-color-laser: hsl(0, 100%, 50%);
181
186
  /* Shadows */
182
- --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%);
183
- --shadow-2:
187
+ --tl-shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%);
188
+ --tl-shadow-2:
184
189
  0px 0px 2px hsl(0, 0%, 0%, 16%), 0px 2px 3px hsl(0, 0%, 0%, 24%),
185
- 0px 2px 6px hsl(0, 0%, 0%, 0.1), inset 0px 0px 0px 1px var(--color-panel-contrast);
186
- --shadow-3:
190
+ 0px 2px 6px hsl(0, 0%, 0%, 0.1), inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
191
+ --tl-shadow-3:
187
192
  0px 1px 2px hsl(0, 0%, 0%, 28%), 0px 2px 6px hsl(0, 0%, 0%, 14%),
188
- inset 0px 0px 0px 1px var(--color-panel-contrast);
189
- --shadow-4:
193
+ inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
194
+ --tl-shadow-4:
190
195
  0px 0px 3px hsl(0, 0%, 0%, 19%), 0px 5px 4px hsl(0, 0%, 0%, 16%),
191
- 0px 2px 16px hsl(0, 0%, 0%, 6%), inset 0px 0px 0px 1px var(--color-panel-contrast);
196
+ 0px 2px 16px hsl(0, 0%, 0%, 6%), inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
192
197
  }
193
198
 
194
199
  .tl-theme__dark {
195
200
  /* 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%);
199
- --color-background: hsl(240, 5%, 6.5%);
200
- --color-brush-fill: hsl(0, 0%, 71%, 5.1%);
201
- --color-brush-stroke: hsl(0, 0%, 71%, 25.1%);
202
- --color-grid: hsl(0, 0%, 40%);
201
+ --tl-color-snap: hsl(0, 76%, 60%);
202
+ --tl-color-selection-fill: hsl(209, 100%, 57%, 20%);
203
+ --tl-color-selection-stroke: hsl(214, 84%, 56%);
204
+ --tl-color-background: hsl(240, 5%, 6.5%);
205
+ --tl-color-brush-fill: hsl(0, 0%, 71%, 5.1%);
206
+ --tl-color-brush-stroke: hsl(0, 0%, 71%, 25.1%);
207
+ --tl-color-grid: hsl(0, 0%, 40%);
203
208
  /* UI */
204
- --color-low: hsl(260, 4.5%, 10.5%);
205
- --color-low-border: hsl(207, 10%, 10%);
206
- --color-culled: hsl(210, 11%, 19%);
207
- --color-muted-none: hsl(0, 0%, 100%, 0%);
208
- --color-muted-0: hsl(0, 0%, 100%, 2%);
209
- --color-muted-1: hsl(0, 0%, 100%, 10%);
210
- --color-muted-2: hsl(0, 0%, 100%, 5%);
211
- --color-hint: hsl(0, 0%, 100%, 7%);
212
- --color-overlay: hsl(0, 0%, 0%, 50%);
213
- --color-divider: hsl(240, 9%, 22%);
214
- --color-panel: hsl(235, 6.8%, 13.5%);
215
- --color-panel-contrast: hsl(245, 12%, 23%);
216
- --color-panel-overlay: hsl(210, 10%, 24%, 82%);
217
- --color-panel-transparent: hsla(235, 6.8%, 13.5%, 0%);
218
- --color-selected: hsl(217, 89%, 61%);
219
- --color-selected-contrast: hsl(0, 0%, 100%);
220
- --color-focus: hsl(217, 76%, 80%);
209
+ --tl-color-low: hsl(260, 4.5%, 10.5%);
210
+ --tl-color-low-border: hsl(207, 10%, 10%);
211
+ --tl-color-culled: hsl(210, 11%, 19%);
212
+ --tl-color-muted-none: hsl(0, 0%, 100%, 0%);
213
+ --tl-color-muted-0: hsl(0, 0%, 100%, 2%);
214
+ --tl-color-muted-1: hsl(0, 0%, 100%, 10%);
215
+ --tl-color-muted-2: hsl(0, 0%, 100%, 5%);
216
+ --tl-color-hint: hsl(0, 0%, 100%, 7%);
217
+ --tl-color-overlay: hsl(0, 0%, 0%, 50%);
218
+ --tl-color-divider: hsl(240, 9%, 22%);
219
+ --tl-color-panel: hsl(235, 6.8%, 13.5%);
220
+ --tl-color-panel-contrast: hsl(245, 12%, 23%);
221
+ --tl-color-panel-overlay: hsl(210, 10%, 24%, 82%);
222
+ --tl-color-panel-transparent: hsla(235, 6.8%, 13.5%, 0%);
223
+ --tl-color-selected: hsl(217, 89%, 61%);
224
+ --tl-color-selected-contrast: hsl(0, 0%, 100%);
225
+ --tl-color-focus: hsl(217, 76%, 80%);
226
+ --tl-color-tooltip: hsla(0, 0%, 100%, 1);
221
227
  /* Text */
222
- --color-text: hsl(210, 17%, 98%);
223
- --color-text-0: hsl(0, 9%, 94%);
224
- --color-text-1: hsl(0, 0%, 85%);
225
- --color-text-3: hsl(204, 4%, 75%);
226
- --color-text-shadow: hsl(210, 13%, 18%);
227
- --color-text-highlight: hsl(52, 100%, 41%);
228
- --color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
228
+ --tl-color-text: hsl(210, 17%, 98%);
229
+ --tl-color-text-0: hsl(0, 9%, 94%);
230
+ --tl-color-text-1: hsl(0, 0%, 85%);
231
+ --tl-color-text-3: hsl(204, 4%, 75%);
232
+ --tl-color-text-shadow: hsl(210, 13%, 18%);
233
+ --tl-color-text-highlight: hsl(52, 100%, 41%);
234
+ --tl-color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
229
235
  /* Named */
230
- --color-primary: hsl(214, 84%, 56%);
231
- --color-success: hsl(123, 38%, 57%);
232
- --color-info: hsl(199, 92%, 56%);
233
- --color-warning: hsl(36, 100%, 57%);
234
- --color-danger: hsl(0, 82%, 66%);
235
- --color-laser: hsl(0, 100%, 50%);
236
+ --tl-color-primary: hsl(214, 84%, 56%);
237
+ --tl-color-success: hsl(123, 38%, 57%);
238
+ --tl-color-info: hsl(199, 92%, 56%);
239
+ --tl-color-warning: hsl(36, 100%, 57%);
240
+ --tl-color-danger: hsl(0, 82%, 66%);
241
+ --tl-color-laser: hsl(0, 100%, 50%);
236
242
  /* Shadows */
237
- --shadow-1:
243
+ --tl-shadow-1:
238
244
  0px 1px 2px hsl(0, 0%, 0%, 16.1%), 0px 1px 3px hsl(0, 0%, 0%, 22%),
239
- inset 0px 0px 0px 1px var(--color-panel-contrast);
240
- --shadow-2:
245
+ inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
246
+ --tl-shadow-2:
241
247
  0px 1px 3px hsl(0, 0%, 0%, 66.6%), 0px 2px 6px hsl(0, 0%, 0%, 33%),
242
- inset 0px 0px 0px 1px var(--color-panel-contrast);
243
- --shadow-3:
248
+ inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
249
+ --tl-shadow-3:
244
250
  0px 1px 3px hsl(0, 0%, 0%, 50%), 0px 2px 12px hsl(0, 0%, 0%, 50%),
245
- inset 0px 0px 0px 1px var(--color-panel-contrast);
251
+ inset 0px 0px 0px 1px var(--tl-color-panel-contrast);
246
252
  }
247
253
 
248
254
  .tl-counter-scaled {
@@ -268,7 +274,7 @@
268
274
  }
269
275
 
270
276
  .tl-container__focused {
271
- outline: 1px solid var(--color-low);
277
+ outline: 1px solid var(--tl-color-low);
272
278
  }
273
279
 
274
280
  input,
@@ -284,7 +290,7 @@ input,
284
290
  inset: 0px;
285
291
  height: 100%;
286
292
  width: 100%;
287
- color: var(--color-text);
293
+ color: var(--tl-color-text);
288
294
  cursor: var(--tl-cursor);
289
295
  overflow: clip;
290
296
  content-visibility: auto;
@@ -292,9 +298,16 @@ input,
292
298
  contain: strict;
293
299
  }
294
300
 
301
+ .tl-canvas__in-front {
302
+ position: absolute;
303
+ inset: 0;
304
+ pointer-events: none;
305
+ z-index: var(--tl-layer-canvas-in-front);
306
+ }
307
+
295
308
  .tl-shapes {
296
309
  position: relative;
297
- z-index: var(--layer-canvas-shapes);
310
+ z-index: var(--tl-layer-canvas-shapes);
298
311
  }
299
312
 
300
313
  .tl-overlays {
@@ -305,7 +318,7 @@ input,
305
318
  width: 100%;
306
319
  contain: strict;
307
320
  pointer-events: none;
308
- z-index: var(--layer-canvas-overlays);
321
+ z-index: var(--tl-layer-canvas-overlays);
309
322
  }
310
323
 
311
324
  .tl-overlays__item {
@@ -329,7 +342,7 @@ input,
329
342
  /* ------------------- Background ------------------- */
330
343
 
331
344
  .tl-background__wrapper {
332
- z-index: var(--layer-canvas-background);
345
+ z-index: var(--tl-layer-canvas-background);
333
346
  position: absolute;
334
347
  inset: 0px;
335
348
  height: 100%;
@@ -337,7 +350,7 @@ input,
337
350
  }
338
351
 
339
352
  .tl-background {
340
- background-color: var(--color-background);
353
+ background-color: var(--tl-color-background);
341
354
  width: 100%;
342
355
  height: 100%;
343
356
  }
@@ -351,12 +364,12 @@ input,
351
364
  height: 100%;
352
365
  touch-action: none;
353
366
  pointer-events: none;
354
- z-index: var(--layer-canvas-grid);
367
+ z-index: var(--tl-layer-canvas-grid);
355
368
  contain: strict;
356
369
  }
357
370
 
358
371
  .tl-grid-dot {
359
- fill: var(--color-grid);
372
+ fill: var(--tl-color-grid);
360
373
  }
361
374
 
362
375
  /* --------------------- Layers --------------------- */
@@ -374,54 +387,54 @@ input,
374
387
 
375
388
  /* back of the stack, behind user's stuff */
376
389
  .tl-collaborator__scribble {
377
- z-index: var(--layer-overlays-collaborator-scribble);
390
+ z-index: var(--tl-layer-overlays-collaborator-scribble);
378
391
  }
379
392
 
380
393
  .tl-collaborator__brush {
381
- z-index: var(--layer-overlays-collaborator-brush);
394
+ z-index: var(--tl-layer-overlays-collaborator-brush);
382
395
  }
383
396
 
384
397
  .tl-collaborator__shape-indicator {
385
- z-index: var(--layer-overlays-collaborator-shape-indicator);
398
+ z-index: var(--tl-layer-overlays-collaborator-shape-indicator);
386
399
  }
387
400
 
388
401
  .tl-user-scribble {
389
- z-index: var(--layer-overlays-user-scribble);
402
+ z-index: var(--tl-layer-overlays-user-scribble);
390
403
  }
391
404
 
392
405
  .tl-user-brush {
393
- z-index: var(--layer-overlays-user-brush);
406
+ z-index: var(--tl-layer-overlays-user-brush);
394
407
  }
395
408
 
396
409
  .tl-user-handles {
397
- z-index: var(--layer-overlays-user-handles);
410
+ z-index: var(--tl-layer-overlays-user-handles);
398
411
  }
399
412
 
400
413
  .tl-user-snapline {
401
- z-index: var(--layer-overlays-user-snapline);
414
+ z-index: var(--tl-layer-overlays-user-snapline);
402
415
  }
403
416
 
404
417
  .tl-selection__fg {
405
418
  pointer-events: none;
406
- z-index: var(--layer-overlays-selection-fg);
419
+ z-index: var(--tl-layer-overlays-selection-fg);
407
420
  }
408
421
 
409
422
  .tl-user-indicator__hint {
410
- z-index: var(--layer-overlays-user-indicator-hint);
423
+ z-index: var(--tl-layer-overlays-user-indicator-hint);
411
424
  stroke-width: calc(2.5px * var(--tl-scale));
412
425
  }
413
426
 
414
427
  .tl-custom-overlays {
415
- z-index: var(--layer-overlays-custom);
428
+ z-index: var(--tl-layer-overlays-custom);
416
429
  }
417
430
 
418
431
  /* behind collaborator cursor */
419
432
  .tl-collaborator__cursor-hint {
420
- z-index: var(--layer-overlays-collaborator-cursor-hint);
433
+ z-index: var(--tl-layer-overlays-collaborator-cursor-hint);
421
434
  }
422
435
 
423
436
  .tl-collaborator__cursor {
424
- z-index: var(--layer-overlays-collaborator-cursor);
437
+ z-index: var(--tl-layer-overlays-collaborator-cursor);
425
438
  }
426
439
 
427
440
  .tl-cursor {
@@ -442,32 +455,32 @@ input,
442
455
  .tl-selection__fg__outline {
443
456
  fill: none;
444
457
  pointer-events: none;
445
- stroke: var(--color-selection-stroke);
458
+ stroke: var(--tl-color-selection-stroke);
446
459
  stroke-width: calc(1.5px * var(--tl-scale));
447
460
  }
448
461
 
449
462
  .tl-corner-handle {
450
463
  pointer-events: none;
451
- stroke: var(--color-selection-stroke);
452
- fill: var(--color-background);
464
+ stroke: var(--tl-color-selection-stroke);
465
+ fill: var(--tl-color-background);
453
466
  stroke-width: calc(1.5px * var(--tl-scale));
454
467
  }
455
468
 
456
469
  .tl-text-handle {
457
470
  pointer-events: none;
458
- fill: var(--color-selection-stroke);
471
+ fill: var(--tl-color-selection-stroke);
459
472
  }
460
473
 
461
474
  .tl-corner-crop-handle {
462
475
  pointer-events: none;
463
476
  fill: none;
464
- stroke: var(--color-selection-stroke);
477
+ stroke: var(--tl-color-selection-stroke);
465
478
  }
466
479
 
467
480
  .tl-corner-crop-edge-handle {
468
481
  pointer-events: none;
469
482
  fill: none;
470
- stroke: var(--color-selection-stroke);
483
+ stroke: var(--tl-color-selection-stroke);
471
484
  }
472
485
 
473
486
  .tl-mobile-rotate__bg {
@@ -477,8 +490,8 @@ input,
477
490
 
478
491
  .tl-mobile-rotate__fg {
479
492
  pointer-events: none;
480
- stroke: var(--color-selection-stroke);
481
- fill: var(--color-background);
493
+ stroke: var(--tl-color-selection-stroke);
494
+ fill: var(--tl-color-background);
482
495
  stroke-width: calc(1.5px * var(--tl-scale));
483
496
  }
484
497
 
@@ -508,8 +521,8 @@ input,
508
521
  text-overflow: ellipsis;
509
522
  font-size: 12px;
510
523
  font-family: var(--font-body);
511
- border-radius: var(--radius-2);
512
- color: var(--color-selected-contrast);
524
+ border-radius: var(--tl-radius-2);
525
+ color: var(--tl-color-selected-contrast);
513
526
  }
514
527
 
515
528
  .tl-nametag-title {
@@ -527,7 +540,7 @@ input,
527
540
  font-size: 12px;
528
541
  font-family: var(--font-body);
529
542
  text-shadow: var(--tl-text-outline);
530
- color: var(--color-selected-contrast);
543
+ color: var(--tl-color-selected-contrast);
531
544
  }
532
545
 
533
546
  .tl-nametag-chat {
@@ -536,31 +549,31 @@ input,
536
549
  left: 13px;
537
550
  width: fit-content;
538
551
  height: fit-content;
539
- color: var(--color-selected-contrast);
552
+ color: var(--tl-color-selected-contrast);
540
553
  white-space: nowrap;
541
554
  position: absolute;
542
555
  padding: 3px 6px;
543
556
  font-size: 12px;
544
557
  font-family: var(--font-body);
545
558
  opacity: 1;
546
- border-radius: var(--radius-2);
559
+ border-radius: var(--tl-radius-2);
547
560
  }
548
561
 
549
562
  .tl-cursor-chat {
550
563
  position: absolute;
551
- color: var(--color-selected-contrast);
564
+ color: var(--tl-color-selected-contrast);
552
565
  white-space: nowrap;
553
566
  padding: 3px 6px;
554
567
  font-size: 12px;
555
568
  font-family: var(--font-body);
556
569
  pointer-events: none;
557
- z-index: var(--layer-cursor);
570
+ z-index: var(--tl-layer-cursor);
558
571
  margin-top: 16px;
559
572
  margin-left: 13px;
560
573
  opacity: 1;
561
574
  border: none;
562
575
  user-select: text;
563
- border-radius: var(--radius-2);
576
+ border-radius: var(--tl-radius-2);
564
577
  }
565
578
 
566
579
  .tl-cursor-chat .tl-cursor-chat__bubble {
@@ -568,13 +581,13 @@ input,
568
581
  }
569
582
 
570
583
  .tl-cursor-chat::selection {
571
- background: var(--color-selected);
572
- color: var(--color-selected-contrast);
584
+ background: var(--tl-color-selected);
585
+ color: var(--tl-color-selected-contrast);
573
586
  text-shadow: none;
574
587
  }
575
588
 
576
589
  .tl-cursor-chat::placeholder {
577
- color: var(--color-selected-contrast);
590
+ color: var(--tl-color-selected-contrast);
578
591
  opacity: 0.7;
579
592
  }
580
593
 
@@ -645,7 +658,7 @@ input,
645
658
  background: none;
646
659
  border-image: none;
647
660
  border: 0px;
648
- caret-color: var(--color-text);
661
+ caret-color: var(--tl-color-text);
649
662
  color: inherit;
650
663
  column-count: initial !important;
651
664
  display: inline-block;
@@ -677,7 +690,7 @@ input,
677
690
 
678
691
  .tl-text-measure {
679
692
  position: absolute;
680
- z-index: var(--layer-canvas-hidden);
693
+ z-index: var(--tl-layer-canvas-hidden);
681
694
  top: 0px;
682
695
  left: 0px;
683
696
  opacity: 0;
@@ -740,8 +753,8 @@ input,
740
753
  }
741
754
 
742
755
  .tl-text-input::selection {
743
- background: var(--color-selected);
744
- color: var(--color-selected-contrast);
756
+ background: var(--tl-color-selected);
757
+ color: var(--tl-color-selected-contrast);
745
758
  text-shadow: none;
746
759
  }
747
760
 
@@ -751,7 +764,7 @@ input,
751
764
  display: flex;
752
765
  justify-content: center;
753
766
  align-items: center;
754
- color: var(--color-text);
767
+ color: var(--tl-color-text);
755
768
  text-shadow: var(--tl-text-outline);
756
769
  line-height: inherit;
757
770
  position: absolute;
@@ -774,8 +787,7 @@ input,
774
787
  position: static;
775
788
  }
776
789
 
777
- .tl-text-wrapper[data-isediting='false'] .tl-text-input,
778
- .tl-arrow-label[data-isediting='false'] .tl-text-input {
790
+ .tl-text-wrapper[data-isediting='false'] .tl-text-input {
779
791
  opacity: 0;
780
792
  cursor: var(--tl-cursor-default);
781
793
  }
@@ -796,7 +808,7 @@ input,
796
808
 
797
809
  .tl-text-wrapper .tl-text-content {
798
810
  pointer-events: all;
799
- z-index: var(--layer-text-content);
811
+ z-index: var(--tl-layer-text-content);
800
812
  }
801
813
 
802
814
  .tl-text-label__inner > .tl-text-content {
@@ -806,7 +818,7 @@ input,
806
818
  padding: inherit;
807
819
  height: fit-content;
808
820
  width: fit-content;
809
- border-radius: var(--radius-1);
821
+ border-radius: var(--tl-radius-1);
810
822
  max-width: 100%;
811
823
  }
812
824
 
@@ -819,7 +831,7 @@ input,
819
831
  }
820
832
 
821
833
  .tl-text-wrapper[data-isselected='true'] .tl-text-input {
822
- z-index: var(--layer-text-editor);
834
+ z-index: var(--tl-layer-text-editor);
823
835
  pointer-events: all;
824
836
  }
825
837
 
@@ -914,7 +926,7 @@ input,
914
926
  }
915
927
 
916
928
  .tl-rich-text a {
917
- color: var(--color-primary);
929
+ color: var(--tl-color-primary);
918
930
  text-decoration: underline;
919
931
  }
920
932
 
@@ -937,14 +949,14 @@ input,
937
949
  }
938
950
 
939
951
  .tl-theme__dark .tl-rich-text mark {
940
- background-color: var(--color-text-highlight);
952
+ background-color: var(--tl-color-text-highlight);
941
953
  color: currentColor;
942
954
  }
943
955
 
944
956
  @supports (color: color(display-p3 1 1 1)) {
945
957
  @media (color-gamut: p3) {
946
958
  .tl-container:not(.tl-theme__force-sRGB) .tl-rich-text mark {
947
- background-color: var(--color-text-highlight-p3);
959
+ background-color: var(--tl-color-text-highlight-p3);
948
960
  }
949
961
  }
950
962
  }
@@ -956,15 +968,15 @@ input,
956
968
  /* --------------------- Loading -------------------- */
957
969
 
958
970
  .tl-loading {
959
- background-color: var(--color-background);
960
- color: var(--color-text-1);
971
+ background-color: var(--tl-color-background);
972
+ color: var(--tl-color-text-1);
961
973
  height: 100%;
962
974
  width: 100%;
963
975
  display: flex;
964
976
  flex-direction: column;
965
977
  justify-content: center;
966
978
  align-items: center;
967
- gap: var(--space-2);
979
+ gap: var(--tl-space-2);
968
980
  font-size: 14px;
969
981
  font-weight: 500;
970
982
  opacity: 0;
@@ -972,7 +984,7 @@ input,
972
984
  animation-delay: 0.2s;
973
985
  position: absolute;
974
986
  inset: 0px;
975
- z-index: var(--layer-canvas-blocker);
987
+ z-index: var(--tl-layer-canvas-blocker);
976
988
  }
977
989
 
978
990
  @keyframes tl-fade-in {
@@ -1005,8 +1017,8 @@ input,
1005
1017
  }
1006
1018
 
1007
1019
  .tl-brush__default {
1008
- stroke: var(--color-brush-stroke);
1009
- fill: var(--color-brush-fill);
1020
+ stroke: var(--tl-color-brush-stroke);
1021
+ fill: var(--tl-color-brush-fill);
1010
1022
  }
1011
1023
 
1012
1024
  /* -------------------- Scribble -------------------- */
@@ -1021,13 +1033,13 @@ input,
1021
1033
  /* ---------------------- Snaps --------------------- */
1022
1034
 
1023
1035
  .tl-snap-indicator {
1024
- stroke: var(--color-snap);
1036
+ stroke: var(--tl-color-snap);
1025
1037
  stroke-width: calc(1px * var(--tl-scale));
1026
1038
  fill: none;
1027
1039
  }
1028
1040
 
1029
1041
  .tl-snap-point {
1030
- stroke: var(--color-snap);
1042
+ stroke: var(--tl-color-snap);
1031
1043
  stroke-width: calc(1px * var(--tl-scale));
1032
1044
  fill: none;
1033
1045
  }
@@ -1047,7 +1059,7 @@ input,
1047
1059
  justify-content: center;
1048
1060
  font-size: 12px;
1049
1061
  font-weight: 400;
1050
- color: var(--color-text-1);
1062
+ color: var(--tl-color-text-1);
1051
1063
  padding: 13px;
1052
1064
  cursor: var(--tl-cursor-pointer);
1053
1065
  border: none;
@@ -1065,13 +1077,13 @@ input,
1065
1077
  display: block;
1066
1078
  width: calc(100% - 12px);
1067
1079
  height: calc(100% - 12px);
1068
- border-radius: var(--radius-1);
1069
- background-color: var(--color-background);
1080
+ border-radius: var(--tl-radius-1);
1081
+ background-color: var(--tl-color-background);
1070
1082
  pointer-events: none;
1071
1083
  }
1072
1084
 
1073
1085
  .tl-hyperlink-button:focus-visible {
1074
- color: var(--color-selected);
1086
+ color: var(--tl-color-selected);
1075
1087
  }
1076
1088
 
1077
1089
  .tl-hyperlink__icon {
@@ -1098,8 +1110,8 @@ input,
1098
1110
  }
1099
1111
 
1100
1112
  .tl-handle__fg {
1101
- fill: var(--color-selected-contrast);
1102
- stroke: var(--color-selection-stroke);
1113
+ fill: var(--tl-color-selected-contrast);
1114
+ stroke: var(--tl-color-selection-stroke);
1103
1115
  stroke-width: calc(1.5px * var(--tl-scale));
1104
1116
  pointer-events: none;
1105
1117
  }
@@ -1109,7 +1121,7 @@ input,
1109
1121
  }
1110
1122
 
1111
1123
  .tl-handle__clone > .tl-handle__fg {
1112
- fill: var(--color-selection-stroke);
1124
+ fill: var(--tl-color-selection-stroke);
1113
1125
  stroke: none;
1114
1126
  }
1115
1127
 
@@ -1119,7 +1131,7 @@ input,
1119
1131
 
1120
1132
  @media (pointer: coarse) {
1121
1133
  .tl-handle__bg:active {
1122
- fill: var(--color-selection-fill);
1134
+ fill: var(--tl-color-selection-fill);
1123
1135
  }
1124
1136
 
1125
1137
  .tl-handle__create {
@@ -1175,20 +1187,20 @@ input,
1175
1187
  stroke-linejoin: round;
1176
1188
  /* content-visibility: auto; */
1177
1189
  transform-origin: top left;
1178
- color: var(--color-text-1);
1190
+ color: var(--tl-color-text-1);
1179
1191
  }
1180
1192
 
1181
1193
  /* -------------------- Group shape ------------------ */
1182
1194
 
1183
1195
  .tl-group {
1184
- stroke: var(--color-text);
1196
+ stroke: var(--tl-color-text);
1185
1197
  stroke-width: calc(1px * var(--tl-scale));
1186
1198
  opacity: 0.5;
1187
1199
  }
1188
1200
 
1189
1201
  /* --------------------- Arrow shape -------------------- */
1190
1202
 
1191
- .tl-arrow-label {
1203
+ .tl-shape[data-shape-type='arrow'] .tl-text-label {
1192
1204
  position: absolute;
1193
1205
  top: -1px;
1194
1206
  left: -1px;
@@ -1199,56 +1211,38 @@ input,
1199
1211
  justify-content: center;
1200
1212
  align-items: center;
1201
1213
  text-align: center;
1202
- color: var(--color-text);
1214
+ color: var(--tl-color-text);
1203
1215
  text-shadow: var(--tl-text-outline);
1204
1216
  }
1205
1217
 
1206
- .tl-arrow-label[data-isediting='true'] p {
1207
- opacity: 0;
1208
- }
1209
-
1210
- .tl-arrow-label__inner {
1211
- border-radius: var(--radius-1);
1218
+ .tl-shape[data-shape-type='arrow'] .tl-text-label__inner {
1219
+ border-radius: var(--tl-radius-1);
1212
1220
  box-sizing: content-box;
1213
- position: relative;
1214
1221
  height: max-content;
1215
1222
  width: max-content;
1216
- pointer-events: none;
1217
- display: flex;
1218
- justify-content: center;
1219
- align-items: center;
1220
1223
  }
1221
1224
 
1222
- .tl-arrow-label .tl-arrow {
1223
- position: relative;
1225
+ .tl-shape[data-shape-type='arrow'] .tl-text {
1224
1226
  height: max-content;
1225
- padding: inherit;
1226
- overflow: visible;
1227
- }
1228
-
1229
- .tl-arrow-label textarea {
1230
- padding: inherit;
1231
- /* Don't allow textarea to be zero width */
1232
- min-width: 4px;
1233
1227
  }
1234
1228
 
1235
1229
  .tl-arrow-hint {
1236
- stroke: var(--color-text-1);
1230
+ stroke: var(--tl-color-text-1);
1237
1231
  fill: none;
1238
1232
  stroke-linecap: round;
1239
1233
  overflow: visible;
1240
1234
  }
1241
1235
 
1242
1236
  .tl-arrow-hint-handle {
1243
- fill: var(--color-selected-contrast);
1244
- stroke: var(--color-selection-stroke);
1237
+ fill: var(--tl-color-selected-contrast);
1238
+ stroke: var(--tl-color-selection-stroke);
1245
1239
  stroke-width: calc(1.5px * var(--tl-scale));
1246
1240
  r: calc(4px * var(--tl-scale));
1247
1241
  }
1248
1242
 
1249
1243
  .tl-arrow-hint-snap {
1250
1244
  stroke: transparent;
1251
- fill: var(--color-selection-fill);
1245
+ fill: var(--tl-color-selection-fill);
1252
1246
  r: calc(12px * var(--tl-scale));
1253
1247
  }
1254
1248
 
@@ -1268,40 +1262,40 @@ input,
1268
1262
  width: 100%;
1269
1263
  height: 100%;
1270
1264
  position: relative;
1271
- border: 1px solid var(--color-panel-contrast);
1272
- background-color: var(--color-panel);
1273
- border-radius: var(--radius-2);
1265
+ border: 1px solid var(--tl-color-panel-contrast);
1266
+ background-color: var(--tl-color-panel);
1267
+ border-radius: var(--tl-radius-2);
1274
1268
  display: flex;
1275
1269
  flex-direction: column;
1276
1270
  overflow: hidden;
1277
1271
  }
1278
1272
 
1279
1273
  .tl-bookmark__container--safariExport {
1280
- border: 1px solid var(--color-divider);
1274
+ border: 1px solid var(--tl-color-divider);
1281
1275
  }
1282
1276
 
1283
1277
  .tl-bookmark__image_container {
1284
1278
  flex: 1 1 100%;
1285
1279
  overflow: hidden;
1286
- border-top-left-radius: var(--radius-1);
1287
- border-top-right-radius: var(--radius-1);
1280
+ border-top-left-radius: var(--tl-radius-1);
1281
+ border-top-right-radius: var(--tl-radius-1);
1288
1282
  width: 100%;
1289
1283
  height: 100%;
1290
1284
  display: flex;
1291
1285
  justify-content: flex-end;
1292
1286
  align-items: flex-start;
1293
- box-shadow: inset 0px 0px 0px 1px var(--color-divider);
1287
+ box-shadow: inset 0px 0px 0px 1px var(--tl-color-divider);
1294
1288
  }
1295
1289
 
1296
1290
  .tl-bookmark__image_container > .tl-hyperlink-button::after {
1297
- background-color: var(--color-panel);
1291
+ background-color: var(--tl-color-panel);
1298
1292
  }
1299
1293
 
1300
1294
  .tl-bookmark__placeholder {
1301
1295
  width: 100%;
1302
1296
  height: 100%;
1303
- background-color: var(--color-muted-2);
1304
- border-bottom: 1px solid var(--color-muted-2);
1297
+ background-color: var(--tl-color-muted-2);
1298
+ border-bottom: 1px solid var(--tl-color-muted-2);
1305
1299
  }
1306
1300
 
1307
1301
  .tl-bookmark__image {
@@ -1309,12 +1303,12 @@ input,
1309
1303
  height: 100%;
1310
1304
  object-fit: cover;
1311
1305
  object-position: center;
1312
- border-bottom: 1px solid var(--color-muted-2);
1306
+ border-bottom: 1px solid var(--tl-color-muted-2);
1313
1307
  }
1314
1308
 
1315
1309
  .tl-bookmark__copy_container {
1316
- background-color: var(--color-muted-0);
1317
- padding: var(--space-4);
1310
+ background-color: var(--tl-color-muted-0);
1311
+ padding: var(--tl-space-4);
1318
1312
  pointer-events: all;
1319
1313
  display: flex;
1320
1314
  flex-direction: column;
@@ -1334,7 +1328,7 @@ input,
1334
1328
  font-size: 16px;
1335
1329
  line-height: 1.6;
1336
1330
  font-weight: bold;
1337
- padding-bottom: var(--space-2);
1331
+ padding-bottom: var(--tl-space-2);
1338
1332
  overflow: hidden;
1339
1333
  max-height: calc((16px * 1.6) * 2);
1340
1334
  -webkit-box-orient: vertical;
@@ -1354,19 +1348,19 @@ input,
1354
1348
  line-clamp: 3;
1355
1349
  text-overflow: ellipsis;
1356
1350
  display: -webkit-box;
1357
- color: var(--color-text-2);
1358
- margin: var(--space-2) 0px;
1351
+ color: var(--tl-color-text-2);
1352
+ margin: var(--tl-space-2) 0px;
1359
1353
  }
1360
1354
 
1361
1355
  .tl-bookmark__heading + .tl-bookmark__link,
1362
1356
  .tl-bookmark__description + .tl-bookmark__link {
1363
- margin-top: var(--space-3);
1357
+ margin-top: var(--tl-space-3);
1364
1358
  }
1365
1359
  .tl-bookmark__link {
1366
1360
  font-size: 12px;
1367
1361
  pointer-events: all;
1368
1362
  display: flex;
1369
- color: var(--color-text-2);
1363
+ color: var(--tl-color-text-2);
1370
1364
  align-items: center;
1371
1365
  cursor: var(--tl-cursor-pointer);
1372
1366
  width: fit-content;
@@ -1408,7 +1402,7 @@ input,
1408
1402
  width: 100%;
1409
1403
  height: 100%;
1410
1404
  pointer-events: all;
1411
- /* background-color: var(--color-background); */
1405
+ /* background-color: var(--tl-color-background); */
1412
1406
 
1413
1407
  display: flex;
1414
1408
  justify-content: center;
@@ -1437,7 +1431,7 @@ input,
1437
1431
  height: 100%;
1438
1432
  pointer-events: all;
1439
1433
  opacity: 1;
1440
- z-index: var(--layer-text-container);
1434
+ z-index: var(--tl-layer-text-container);
1441
1435
  border-radius: 1px;
1442
1436
  }
1443
1437
 
@@ -1453,22 +1447,22 @@ input,
1453
1447
  }
1454
1448
 
1455
1449
  .tl-frame__creating {
1456
- stroke: var(--color-selected);
1450
+ stroke: var(--tl-color-selected);
1457
1451
  fill: none;
1458
1452
  }
1459
1453
 
1460
1454
  .tl-frame-heading {
1461
- --frame-padding-x: 6px;
1462
- --frame-height: 24px;
1463
- --frame-minimum-width: 32px;
1464
- --frame-offset-width: 16px;
1455
+ --tl-frame-padding-x: 6px;
1456
+ --tl-frame-height: 24px;
1457
+ --tl-frame-minimum-width: 32px;
1458
+ --tl-frame-offset-width: 16px;
1465
1459
  display: flex;
1466
1460
  align-items: center;
1467
1461
  position: absolute;
1468
1462
  transform-origin: 0% 100%;
1469
1463
  overflow: hidden;
1470
1464
  max-width: 100%;
1471
- min-width: var(--frame-minimum-width);
1465
+ min-width: var(--tl-frame-minimum-width);
1472
1466
  height: auto;
1473
1467
  font-size: 12px;
1474
1468
  padding-bottom: 4px;
@@ -1480,18 +1474,18 @@ input,
1480
1474
  /* scale from bottom left corner so we can pin it to the top left corner of the frame */
1481
1475
  transform-origin: 0% 100%;
1482
1476
  display: flex;
1483
- height: var(--frame-height);
1477
+ height: var(--tl-frame-height);
1484
1478
  width: 100%;
1485
1479
  align-items: center;
1486
- border-radius: var(--radius-1);
1480
+ border-radius: var(--tl-radius-1);
1487
1481
  }
1488
1482
 
1489
1483
  .tl-frame-label {
1490
1484
  pointer-events: all;
1491
1485
  overflow: hidden;
1492
1486
  text-overflow: ellipsis;
1493
- padding: 0px var(--frame-padding-x);
1494
- border-radius: var(--radius-1);
1487
+ padding: 0px var(--tl-frame-padding-x);
1488
+ border-radius: var(--tl-radius-1);
1495
1489
  position: relative;
1496
1490
  font-size: inherit;
1497
1491
  white-space: pre;
@@ -1501,12 +1495,12 @@ input,
1501
1495
  color: transparent;
1502
1496
  white-space: pre;
1503
1497
  width: auto;
1504
- min-width: var(--frame-minimum-width);
1498
+ min-width: var(--tl-frame-minimum-width);
1505
1499
  height: 100%;
1506
1500
  overflow: visible;
1507
- background-color: var(--color-panel);
1508
- border-color: var(--color-selected);
1509
- box-shadow: inset 0px 0px 0px 1.5px var(--color-selected);
1501
+ background-color: var(--tl-color-panel);
1502
+ border-color: var(--tl-color-selected);
1503
+ box-shadow: inset 0px 0px 0px 1.5px var(--tl-color-selected);
1510
1504
  }
1511
1505
 
1512
1506
  .tl-frame-name-input {
@@ -1514,7 +1508,7 @@ input,
1514
1508
  border: none;
1515
1509
  background: none;
1516
1510
  outline: none;
1517
- padding: 0px var(--frame-padding-x);
1511
+ padding: 0px var(--tl-frame-padding-x);
1518
1512
  inset: 0px;
1519
1513
  height: 100%;
1520
1514
  width: 100%;
@@ -1522,8 +1516,8 @@ input,
1522
1516
  font-family: inherit;
1523
1517
  font-weight: inherit;
1524
1518
  width: 100%;
1525
- color: var(--color-text-1);
1526
- border-radius: var(--radius-1);
1519
+ color: var(--tl-color-text-1);
1520
+ border-radius: var(--tl-radius-1);
1527
1521
  user-select: all;
1528
1522
  -webkit-user-select: text;
1529
1523
  white-space: pre;
@@ -1543,7 +1537,7 @@ input,
1543
1537
 
1544
1538
  .tl-embed {
1545
1539
  border: none;
1546
- border-radius: var(--radius-2);
1540
+ border-radius: var(--tl-radius-2);
1547
1541
  }
1548
1542
 
1549
1543
  /* -------------- Shape error boundary -------------- */
@@ -1551,11 +1545,11 @@ input,
1551
1545
  .tl-shape-error-boundary {
1552
1546
  width: 100%;
1553
1547
  height: 100%;
1554
- background-color: var(--color-muted-1);
1548
+ background-color: var(--tl-color-muted-1);
1555
1549
  border-width: calc(1px * var(--tl-scale));
1556
- border-color: var(--color-muted-1);
1550
+ border-color: var(--tl-color-muted-1);
1557
1551
  border-style: solid;
1558
- border-radius: calc(var(--radius-1) * var(--tl-scale));
1552
+ border-radius: calc(var(--tl-radius-1) * var(--tl-scale));
1559
1553
  display: flex;
1560
1554
  flex-direction: column;
1561
1555
  align-items: center;
@@ -1564,7 +1558,7 @@ input,
1564
1558
  position: relative;
1565
1559
  pointer-events: all;
1566
1560
  overflow: hidden;
1567
- padding: var(--space-2);
1561
+ padding: var(--tl-space-2);
1568
1562
  }
1569
1563
 
1570
1564
  .tl-shape-error-boundary::before {
@@ -1572,7 +1566,7 @@ input,
1572
1566
  content: 'Error';
1573
1567
  font-size: 12px;
1574
1568
  font-family: inherit;
1575
- color: var(--color-text-0);
1569
+ color: var(--tl-color-text-0);
1576
1570
  }
1577
1571
 
1578
1572
  /* ----------------- Error boundary ----------------- */
@@ -1583,9 +1577,9 @@ input,
1583
1577
  display: flex;
1584
1578
  align-items: center;
1585
1579
  justify-content: center;
1586
- padding: var(--space-4);
1587
- background-color: var(--color-background);
1588
- color: var(--color-text-1);
1580
+ padding: var(--tl-space-4);
1581
+ background-color: var(--tl-color-background);
1582
+ color: var(--tl-color-text-1);
1589
1583
  position: absolute;
1590
1584
  }
1591
1585
 
@@ -1594,8 +1588,8 @@ input,
1594
1588
  inset: 0px;
1595
1589
  height: 100%;
1596
1590
  width: 100%;
1597
- z-index: var(--layer-error-overlay);
1598
- background-color: var(--color-overlay);
1591
+ z-index: var(--tl-layer-error-overlay);
1592
+ background-color: var(--tl-color-overlay);
1599
1593
  }
1600
1594
 
1601
1595
  .tl-error-boundary__content * {
@@ -1610,7 +1604,7 @@ input,
1610
1604
  inset: 0px;
1611
1605
  height: 100%;
1612
1606
  width: 100%;
1613
- z-index: var(--layer-error-canvas);
1607
+ z-index: var(--tl-layer-error-canvas);
1614
1608
  }
1615
1609
 
1616
1610
  /* some browsers seem to have some weird interactions between stacking contexts
@@ -1623,7 +1617,7 @@ it from receiving any pointer events or affecting the cursor. */
1623
1617
  inset: 0px;
1624
1618
  height: 100%;
1625
1619
  width: 100%;
1626
- z-index: var(--layer-error-canvas-after);
1620
+ z-index: var(--tl-layer-error-canvas-after);
1627
1621
  pointer-events: all;
1628
1622
  }
1629
1623
 
@@ -1633,16 +1627,16 @@ it from receiving any pointer events or affecting the cursor. */
1633
1627
  max-width: 100%;
1634
1628
  width: 400px;
1635
1629
  max-height: 100%;
1636
- background-color: var(--color-panel);
1630
+ background-color: var(--tl-color-panel);
1637
1631
  padding: 16px;
1638
1632
  border-radius: 16px;
1639
- box-shadow: var(--shadow-2);
1633
+ box-shadow: var(--tl-shadow-2);
1640
1634
  font-size: 14px;
1641
1635
  font-weight: 400;
1642
1636
  display: flex;
1643
1637
  flex-direction: column;
1644
1638
  overflow: auto;
1645
- z-index: var(--layer-error-content);
1639
+ z-index: var(--tl-layer-error-content);
1646
1640
  gap: 12px;
1647
1641
  }
1648
1642
 
@@ -1657,10 +1651,10 @@ it from receiving any pointer events or affecting the cursor. */
1657
1651
  }
1658
1652
 
1659
1653
  .tl-error-boundary__content h4 {
1660
- border: 1px solid var(--color-low-border);
1654
+ border: 1px solid var(--tl-color-low-border);
1661
1655
  margin: -6px 0 0 0;
1662
- padding: var(--space-5);
1663
- border-radius: var(--radius-2);
1656
+ padding: var(--tl-space-5);
1657
+ border-radius: var(--tl-radius-2);
1664
1658
  font-weight: normal;
1665
1659
  }
1666
1660
 
@@ -1670,10 +1664,10 @@ it from receiving any pointer events or affecting the cursor. */
1670
1664
  }
1671
1665
 
1672
1666
  .tl-error-boundary__content pre {
1673
- background-color: var(--color-muted-2);
1667
+ background-color: var(--tl-color-muted-2);
1674
1668
  margin-top: 0;
1675
- padding: var(--space-5);
1676
- border-radius: var(--radius-2);
1669
+ padding: var(--tl-space-5);
1670
+ border-radius: var(--tl-radius-2);
1677
1671
  overflow: auto;
1678
1672
  font-size: 12px;
1679
1673
  max-height: 320px;
@@ -1685,15 +1679,15 @@ it from receiving any pointer events or affecting the cursor. */
1685
1679
  font-family: inherit;
1686
1680
  font-size: 14px;
1687
1681
  font-weight: 500;
1688
- padding: var(--space-4);
1689
- border-radius: var(--radius-3);
1682
+ padding: var(--tl-space-4);
1683
+ border-radius: var(--tl-radius-3);
1690
1684
  cursor: var(--tl-cursor-pointer);
1691
1685
  color: inherit;
1692
1686
  background-color: transparent;
1693
1687
  }
1694
1688
 
1695
1689
  .tl-error-boundary__content a {
1696
- color: var(--color-selected);
1690
+ color: var(--tl-color-selected);
1697
1691
  font-weight: 500;
1698
1692
  text-decoration: none;
1699
1693
  }
@@ -1705,31 +1699,31 @@ it from receiving any pointer events or affecting the cursor. */
1705
1699
 
1706
1700
  .tl-error-boundary__content__error button {
1707
1701
  position: absolute;
1708
- top: var(--space-2);
1709
- right: var(--space-2);
1702
+ top: var(--tl-space-2);
1703
+ right: var(--tl-space-2);
1710
1704
  font-size: 12px;
1711
- padding: var(--space-2) var(--space-3);
1712
- background-color: var(--color-panel);
1713
- border-radius: var(--radius-1);
1705
+ padding: var(--tl-space-2) var(--tl-space-3);
1706
+ background-color: var(--tl-color-panel);
1707
+ border-radius: var(--tl-radius-1);
1714
1708
  }
1715
1709
 
1716
1710
  .tl-error-boundary__content__actions {
1717
1711
  display: flex;
1718
1712
  justify-content: space-between;
1719
- gap: var(--space-4);
1713
+ gap: var(--tl-space-4);
1720
1714
  margin: 0px;
1721
1715
  margin-left: -4px;
1722
1716
  }
1723
1717
  .tl-error-boundary__content__actions__group {
1724
1718
  display: flex;
1725
- gap: var(--space-4);
1719
+ gap: var(--tl-space-4);
1726
1720
  }
1727
1721
  .tl-error-boundary__content .tl-error-boundary__reset {
1728
- color: var(--color-danger);
1722
+ color: var(--tl-color-danger);
1729
1723
  }
1730
1724
  .tl-error-boundary__content .tl-error-boundary__refresh {
1731
- background-color: var(--color-primary);
1732
- color: var(--color-selected-contrast);
1725
+ background-color: var(--tl-color-primary);
1726
+ color: var(--tl-color-selected-contrast);
1733
1727
  }
1734
1728
  .tl-container__focused:not(.tl-container__no-focus-ring)
1735
1729
  .tlui-button.tl-error-boundary__refresh:focus-visible {
@@ -1741,7 +1735,7 @@ it from receiving any pointer events or affecting the cursor. */
1741
1735
 
1742
1736
  .tl-hit-test-blocker {
1743
1737
  position: absolute;
1744
- z-index: var(--layer-canvas-blocker);
1738
+ z-index: var(--tl-layer-canvas-blocker);
1745
1739
  inset: 0px;
1746
1740
  width: 100%;
1747
1741
  height: 100%;
@@ -1761,32 +1755,32 @@ it from receiving any pointer events or affecting the cursor. */
1761
1755
 
1762
1756
  .tl-handle__bg:hover {
1763
1757
  cursor: var(--tl-cursor-grab);
1764
- fill: var(--color-selection-fill);
1758
+ fill: var(--tl-color-selection-fill);
1765
1759
  }
1766
1760
 
1767
1761
  .tl-bookmark__link:hover {
1768
- color: var(--color-selected);
1762
+ color: var(--tl-color-selected);
1769
1763
  }
1770
1764
 
1771
1765
  .tl-hyperlink-button:hover {
1772
- color: var(--color-selected);
1766
+ color: var(--tl-color-selected);
1773
1767
  }
1774
1768
 
1775
1769
  .tl-error-boundary__content button:hover {
1776
- background-color: var(--color-low);
1770
+ background-color: var(--tl-color-low);
1777
1771
  }
1778
1772
  .tl-error-boundary__content a:hover {
1779
- color: var(--color-text-1);
1773
+ color: var(--tl-color-text-1);
1780
1774
  }
1781
1775
  .tl-error-boundary__content .tl-error-boundary__refresh:hover {
1782
- background-color: var(--color-primary);
1776
+ background-color: var(--tl-color-primary);
1783
1777
  opacity: 0.9;
1784
1778
  }
1785
1779
 
1786
1780
  /* These three rules help preserve clicking into specific points in text areas *while*
1787
1781
  * already in edit mode when jumping from shape to shape. */
1788
1782
  .tl-canvas[data-iseditinganything='true'] .tl-text-wrapper:hover .tl-text-input {
1789
- z-index: var(--layer-text-editor);
1783
+ z-index: var(--tl-layer-text-editor);
1790
1784
  pointer-events: all;
1791
1785
  }
1792
1786
  }