@tldraw/editor 3.14.0-canary.e0ab6f4c80f9 → 3.14.0-canary.e34e46232a4e

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 (233) hide show
  1. package/dist-cjs/index.d.ts +129 -107
  2. package/dist-cjs/index.js +8 -8
  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 +76 -78
  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/derivations/bindingsIndex.js +22 -22
  10. package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
  11. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -20
  12. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  13. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +16 -16
  14. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  15. package/dist-cjs/lib/editor/managers/{ClickManager.js → ClickManager/ClickManager.js} +1 -1
  16. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +7 -0
  17. package/dist-cjs/lib/editor/managers/{EdgeScrollManager.js → EdgeScrollManager/EdgeScrollManager.js} +2 -2
  18. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +7 -0
  19. package/dist-cjs/lib/editor/managers/{FocusManager.js → FocusManager/FocusManager.js} +2 -0
  20. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +7 -0
  21. package/dist-cjs/lib/editor/managers/{FontManager.js → FontManager/FontManager.js} +4 -1
  22. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +7 -0
  23. package/dist-cjs/lib/editor/managers/{HistoryManager.js → HistoryManager/HistoryManager.js} +64 -6
  24. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +7 -0
  25. package/dist-cjs/lib/editor/managers/{ScribbleManager.js → ScribbleManager/ScribbleManager.js} +1 -1
  26. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +7 -0
  27. package/dist-cjs/lib/editor/managers/{TextManager.js → TextManager/TextManager.js} +73 -42
  28. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +7 -0
  29. package/dist-cjs/lib/editor/managers/{TickManager.js → TickManager/TickManager.js} +1 -1
  30. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +7 -0
  31. package/dist-cjs/lib/editor/managers/{UserPreferencesManager.js → UserPreferencesManager/UserPreferencesManager.js} +1 -1
  32. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +7 -0
  33. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +8 -0
  34. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +6 -0
  36. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  37. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  38. package/dist-cjs/lib/editor/tools/StateNode.js +3 -3
  39. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  40. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  41. package/dist-cjs/lib/exports/getSvgJsx.js.map +1 -1
  42. package/dist-cjs/lib/hooks/useCanvasEvents.js +1 -2
  43. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  44. package/dist-cjs/lib/primitives/Box.js +33 -33
  45. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  46. package/dist-cjs/lib/primitives/Vec.js +18 -13
  47. package/dist-cjs/lib/primitives/Vec.js.map +3 -3
  48. package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
  49. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  50. package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
  51. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  52. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
  53. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  54. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
  55. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  56. package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -21
  57. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  58. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
  59. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  60. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +5 -0
  61. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  62. package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
  63. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  64. package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
  65. package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
  66. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
  67. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  68. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
  69. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
  70. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
  71. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  72. package/dist-cjs/lib/utils/reorderShapes.js +11 -10
  73. package/dist-cjs/lib/utils/reorderShapes.js.map +2 -2
  74. package/dist-cjs/lib/utils/richText.js +7 -2
  75. package/dist-cjs/lib/utils/richText.js.map +2 -2
  76. package/dist-cjs/version.js +3 -3
  77. package/dist-cjs/version.js.map +1 -1
  78. package/dist-esm/index.d.mts +129 -107
  79. package/dist-esm/index.mjs +15 -9
  80. package/dist-esm/index.mjs.map +2 -2
  81. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +1 -1
  82. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
  83. package/dist-esm/lib/editor/Editor.mjs +76 -78
  84. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  85. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
  86. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs +22 -22
  87. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
  88. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
  89. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  90. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +16 -16
  91. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  92. package/dist-esm/lib/editor/managers/{ClickManager.mjs → ClickManager/ClickManager.mjs} +1 -1
  93. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +7 -0
  94. package/dist-esm/lib/editor/managers/{EdgeScrollManager.mjs → EdgeScrollManager/EdgeScrollManager.mjs} +2 -2
  95. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +7 -0
  96. package/dist-esm/lib/editor/managers/{FocusManager.mjs → FocusManager/FocusManager.mjs} +2 -0
  97. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +7 -0
  98. package/dist-esm/lib/editor/managers/{FontManager.mjs → FontManager/FontManager.mjs} +4 -1
  99. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +7 -0
  100. package/dist-esm/lib/editor/managers/{HistoryManager.mjs → HistoryManager/HistoryManager.mjs} +60 -2
  101. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +7 -0
  102. package/dist-esm/lib/editor/managers/{ScribbleManager.mjs → ScribbleManager/ScribbleManager.mjs} +1 -1
  103. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +7 -0
  104. package/dist-esm/lib/editor/managers/{TextManager.mjs → TextManager/TextManager.mjs} +73 -42
  105. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +7 -0
  106. package/dist-esm/lib/editor/managers/{TickManager.mjs → TickManager/TickManager.mjs} +1 -1
  107. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +7 -0
  108. package/dist-esm/lib/editor/managers/{UserPreferencesManager.mjs → UserPreferencesManager/UserPreferencesManager.mjs} +1 -1
  109. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +7 -0
  110. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +8 -0
  111. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  112. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +6 -0
  113. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  114. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  115. package/dist-esm/lib/editor/tools/StateNode.mjs +3 -3
  116. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  117. package/dist-esm/lib/exports/getSvgJsx.mjs.map +1 -1
  118. package/dist-esm/lib/hooks/useCanvasEvents.mjs +1 -2
  119. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  120. package/dist-esm/lib/primitives/Box.mjs +33 -33
  121. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  122. package/dist-esm/lib/primitives/Vec.mjs +19 -14
  123. package/dist-esm/lib/primitives/Vec.mjs.map +3 -3
  124. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
  125. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  126. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
  127. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  128. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
  129. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  130. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
  131. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  132. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -21
  133. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  134. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
  135. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  136. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +7 -1
  137. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  138. package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
  139. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  140. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
  141. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
  142. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
  143. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  144. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
  145. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
  146. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
  147. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  148. package/dist-esm/lib/utils/reorderShapes.mjs +11 -10
  149. package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
  150. package/dist-esm/lib/utils/richText.mjs +8 -3
  151. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  152. package/dist-esm/version.mjs +3 -3
  153. package/dist-esm/version.mjs.map +1 -1
  154. package/editor.css +433 -482
  155. package/package.json +8 -9
  156. package/src/index.ts +19 -8
  157. package/src/lib/config/TLSessionStateSnapshot.ts +1 -1
  158. package/src/lib/editor/Editor.test.ts +252 -3
  159. package/src/lib/editor/Editor.ts +77 -76
  160. package/src/lib/editor/bindings/BindingUtil.ts +6 -0
  161. package/src/lib/editor/derivations/bindingsIndex.ts +27 -26
  162. package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
  163. package/src/lib/editor/derivations/parentsToChildren.ts +28 -25
  164. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +442 -0
  165. package/src/lib/editor/managers/{ClickManager.ts → ClickManager/ClickManager.ts} +3 -3
  166. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +374 -0
  167. package/src/lib/editor/managers/{EdgeScrollManager.ts → EdgeScrollManager/EdgeScrollManager.ts} +3 -3
  168. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +455 -0
  169. package/src/lib/editor/managers/{FocusManager.ts → FocusManager/FocusManager.ts} +3 -1
  170. package/src/lib/editor/managers/FontManager/FontManager.test.ts +263 -0
  171. package/src/lib/editor/managers/{FontManager.ts → FontManager/FontManager.ts} +5 -2
  172. package/src/lib/editor/managers/{HistoryManager.test.ts → HistoryManager/HistoryManager.test.ts} +388 -1
  173. package/src/lib/editor/managers/{HistoryManager.ts → HistoryManager/HistoryManager.ts} +73 -2
  174. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +624 -0
  175. package/src/lib/editor/managers/{ScribbleManager.ts → ScribbleManager/ScribbleManager.ts} +2 -2
  176. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +485 -0
  177. package/src/lib/editor/managers/TextManager/TextManager.test.ts +407 -0
  178. package/src/lib/editor/managers/{TextManager.ts → TextManager/TextManager.ts} +119 -87
  179. package/src/lib/editor/managers/TickManager/TickManager.test.ts +314 -0
  180. package/src/lib/editor/managers/{TickManager.ts → TickManager/TickManager.ts} +2 -2
  181. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +591 -0
  182. package/src/lib/editor/managers/{UserPreferencesManager.ts → UserPreferencesManager/UserPreferencesManager.ts} +2 -2
  183. package/src/lib/editor/shapes/ShapeUtil.ts +11 -1
  184. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +8 -0
  185. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +5 -2
  186. package/src/lib/editor/tools/StateNode.ts +3 -3
  187. package/src/lib/editor/types/external-content.ts +11 -2
  188. package/src/lib/exports/getSvgJsx.tsx +1 -1
  189. package/src/lib/hooks/useCanvasEvents.ts +0 -1
  190. package/src/lib/primitives/Box.test.ts +588 -7
  191. package/src/lib/primitives/Box.ts +33 -33
  192. package/src/lib/primitives/Vec.test.ts +2 -2
  193. package/src/lib/primitives/Vec.ts +15 -10
  194. package/src/lib/primitives/geometry/Arc2d.ts +42 -23
  195. package/src/lib/primitives/geometry/Circle2d.ts +12 -12
  196. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
  197. package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
  198. package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
  199. package/src/lib/primitives/geometry/Edge2d.ts +14 -25
  200. package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
  201. package/src/lib/primitives/geometry/Geometry2d.ts +6 -0
  202. package/src/lib/primitives/geometry/Point2d.ts +6 -6
  203. package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
  204. package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
  205. package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
  206. package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
  207. package/src/lib/utils/reorderShapes.ts +10 -13
  208. package/src/lib/utils/richText.ts +10 -4
  209. package/src/version.ts +3 -3
  210. package/dist-cjs/lib/editor/managers/ClickManager.js.map +0 -7
  211. package/dist-cjs/lib/editor/managers/EdgeScrollManager.js.map +0 -7
  212. package/dist-cjs/lib/editor/managers/FocusManager.js.map +0 -7
  213. package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
  214. package/dist-cjs/lib/editor/managers/HistoryManager.js.map +0 -7
  215. package/dist-cjs/lib/editor/managers/ScribbleManager.js.map +0 -7
  216. package/dist-cjs/lib/editor/managers/Stack.js +0 -82
  217. package/dist-cjs/lib/editor/managers/Stack.js.map +0 -7
  218. package/dist-cjs/lib/editor/managers/TextManager.js.map +0 -7
  219. package/dist-cjs/lib/editor/managers/TickManager.js.map +0 -7
  220. package/dist-cjs/lib/editor/managers/UserPreferencesManager.js.map +0 -7
  221. package/dist-esm/lib/editor/managers/ClickManager.mjs.map +0 -7
  222. package/dist-esm/lib/editor/managers/EdgeScrollManager.mjs.map +0 -7
  223. package/dist-esm/lib/editor/managers/FocusManager.mjs.map +0 -7
  224. package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
  225. package/dist-esm/lib/editor/managers/HistoryManager.mjs.map +0 -7
  226. package/dist-esm/lib/editor/managers/ScribbleManager.mjs.map +0 -7
  227. package/dist-esm/lib/editor/managers/Stack.mjs +0 -62
  228. package/dist-esm/lib/editor/managers/Stack.mjs.map +0 -7
  229. package/dist-esm/lib/editor/managers/TextManager.mjs.map +0 -7
  230. package/dist-esm/lib/editor/managers/TickManager.mjs.map +0 -7
  231. package/dist-esm/lib/editor/managers/UserPreferencesManager.mjs.map +0 -7
  232. package/src/lib/editor/managers/ScribbleManager.test.ts +0 -32
  233. package/src/lib/editor/managers/Stack.ts +0 -71
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,28 @@
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
179
  --color-error: hsl(0, 65%, 51%);
177
180
  --color-warn: hsl(0, 90%, 43%);
178
- --color-text: hsl(0, 0%, 0%);
179
181
  --color-laser: hsl(0, 100%, 50%);
180
182
  /* Shadows */
181
183
  --shadow-1: 0px 1px 2px hsl(0, 0%, 0%, 25%), 0px 1px 3px hsl(0, 0%, 0%, 9%);
@@ -191,11 +193,15 @@
191
193
  }
192
194
 
193
195
  .tl-theme__dark {
194
- --color-accent: hsl(0, 76%, 60%);
196
+ /* Canvas */
197
+ --color-snap: hsl(0, 76%, 60%);
198
+ --color-selection-fill: hsl(209, 100%, 57%, 20%);
199
+ --color-selection-stroke: hsl(214, 84%, 56%);
195
200
  --color-background: hsl(240, 5%, 6.5%);
196
201
  --color-brush-fill: hsl(0, 0%, 71%, 5.1%);
197
202
  --color-brush-stroke: hsl(0, 0%, 71%, 25.1%);
198
203
  --color-grid: hsl(0, 0%, 40%);
204
+ /* UI */
199
205
  --color-low: hsl(260, 4.5%, 10.5%);
200
206
  --color-low-border: hsl(207, 10%, 10%);
201
207
  --color-culled: hsl(210, 11%, 19%);
@@ -206,28 +212,28 @@
206
212
  --color-hint: hsl(0, 0%, 100%, 7%);
207
213
  --color-overlay: hsl(0, 0%, 0%, 50%);
208
214
  --color-divider: hsl(240, 9%, 22%);
209
- --color-panel-contrast: hsl(245, 12%, 23%);
210
215
  --color-panel: hsl(235, 6.8%, 13.5%);
216
+ --color-panel-contrast: hsl(245, 12%, 23%);
211
217
  --color-panel-overlay: hsl(210, 10%, 24%, 82%);
212
218
  --color-panel-transparent: hsla(235, 6.8%, 13.5%, 0%);
213
- --color-focus: hsl(217, 76%, 80%);
214
219
  --color-selected: hsl(217, 89%, 61%);
215
220
  --color-selected-contrast: hsl(0, 0%, 100%);
216
- --color-selection-fill: hsl(209, 100%, 57%, 20%);
217
- --color-selection-stroke: hsl(214, 84%, 56%);
221
+ --color-focus: hsl(217, 76%, 80%);
222
+ /* Text */
223
+ --color-text: hsl(210, 17%, 98%);
218
224
  --color-text-0: hsl(0, 9%, 94%);
219
225
  --color-text-1: hsl(0, 0%, 85%);
220
226
  --color-text-3: hsl(210, 6%, 45%);
221
227
  --color-text-shadow: hsl(210, 13%, 18%);
222
228
  --color-text-highlight: hsl(52, 100%, 41%);
223
229
  --color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
230
+ /* Named */
224
231
  --color-primary: hsl(214, 84%, 56%);
225
232
  --color-success: hsl(123, 38%, 57%);
226
233
  --color-info: hsl(199, 92%, 56%);
227
234
  --color-warning: hsl(36, 100%, 57%);
228
235
  --color-error: hsl(4, 90%, 58%);
229
236
  --color-warn: hsl(0, 81%, 66%);
230
- --color-text: hsl(210, 17%, 98%);
231
237
  --color-laser: hsl(0, 100%, 50%);
232
238
  /* Shadows */
233
239
  --shadow-1:
@@ -241,13 +247,6 @@
241
247
  inset 0px 0px 0px 1px var(--color-panel-contrast);
242
248
  }
243
249
 
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
250
  .tl-container,
252
251
  .tl-container * {
253
252
  -webkit-touch-callout: none;
@@ -273,9 +272,7 @@ input,
273
272
  user-select: text;
274
273
  }
275
274
 
276
- /* -------------------------------------------------- */
277
- /* Canvas */
278
- /* -------------------------------------------------- */
275
+ /* --------------------- Canvas --------------------- */
279
276
 
280
277
  .tl-canvas {
281
278
  position: absolute;
@@ -368,64 +365,6 @@ input,
368
365
  contain: layout style size;
369
366
  }
370
367
 
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
368
  /* --------------- Overlay Stack --------------- */
430
369
 
431
370
  /* back of the stack, behind user's stuff */
@@ -449,14 +388,6 @@ input,
449
388
  z-index: var(--layer-overlays-user-brush);
450
389
  }
451
390
 
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
391
  .tl-user-handles {
461
392
  z-index: var(--layer-overlays-user-handles);
462
393
  }
@@ -492,16 +423,7 @@ input,
492
423
  overflow: visible;
493
424
  }
494
425
 
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 ------------------ */
426
+ /* -------------- Selection foreground -------------- */
505
427
 
506
428
  .tl-selection__bg {
507
429
  position: absolute;
@@ -560,132 +482,12 @@ input,
560
482
  stroke: transparent;
561
483
  }
562
484
 
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 {
485
+ .tl-hidden {
583
486
  opacity: 0;
487
+ pointer-events: none;
584
488
  }
585
489
 
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
- }
490
+ /* -------------- Nametag / cursor chat ------------- */
689
491
 
690
492
  .tl-nametag {
691
493
  position: absolute;
@@ -766,25 +568,11 @@ input,
766
568
  text-shadow: none;
767
569
  }
768
570
 
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
571
  .tl-cursor-chat::placeholder {
777
572
  color: var(--color-selected-contrast);
778
573
  opacity: 0.7;
779
574
  }
780
575
 
781
- /* --------------------- Spinner -------------------- */
782
- @keyframes spinner {
783
- to {
784
- transform: rotate(360deg);
785
- }
786
- }
787
-
788
576
  /* ---------------------- Text ---------------------- */
789
577
 
790
578
  .tl-text-shape-label {
@@ -898,6 +686,9 @@ input,
898
686
  border: none;
899
687
  user-select: none;
900
688
  contain: style paint;
689
+ visibility: hidden;
690
+ /* 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. */
691
+ unicode-bidi: plaintext;
901
692
  -webkit-user-select: none;
902
693
  }
903
694
 
@@ -943,6 +734,41 @@ input,
943
734
  overflow: hidden;
944
735
  }
945
736
 
737
+ .tl-text-input::selection {
738
+ background: var(--color-selected);
739
+ color: var(--color-selected-contrast);
740
+ text-shadow: none;
741
+ }
742
+
743
+ /* Text label */
744
+
745
+ .tl-text-label {
746
+ display: flex;
747
+ justify-content: center;
748
+ align-items: center;
749
+ color: var(--color-text);
750
+ text-shadow: var(--tl-text-outline);
751
+ line-height: inherit;
752
+ position: absolute;
753
+ inset: 0px;
754
+ height: 100%;
755
+ width: 100%;
756
+ }
757
+
758
+ .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner {
759
+ width: 40px;
760
+ height: 40px;
761
+ }
762
+
763
+ .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content {
764
+ pointer-events: all;
765
+ }
766
+
767
+ .tl-text-label__inner > .tl-text-input.tl-rich-text {
768
+ display: none;
769
+ position: static;
770
+ }
771
+
946
772
  .tl-text-wrapper[data-isediting='false'] .tl-text-input,
947
773
  .tl-arrow-label[data-isediting='false'] .tl-text-input {
948
774
  opacity: 0;
@@ -954,15 +780,65 @@ input,
954
780
  cursor: var(--tl-cursor-text);
955
781
  }
956
782
 
957
- .tl-text-input::selection {
958
- background: var(--color-selected);
959
- color: var(--color-selected-contrast);
960
- text-shadow: none;
783
+ .tl-text-label[data-textwrap='true'] > .tl-text-label__inner {
784
+ max-width: 100%;
961
785
  }
962
786
 
963
- .tl-rich-text .ProseMirror {
964
- word-wrap: break-word;
965
- overflow-wrap: break-word;
787
+ .tl-text-label[data-isediting='true'] {
788
+ background-color: transparent;
789
+ min-height: auto;
790
+ }
791
+
792
+ .tl-text-wrapper .tl-text-content {
793
+ pointer-events: all;
794
+ z-index: var(--layer-text-content);
795
+ }
796
+
797
+ .tl-text-label__inner > .tl-text-content {
798
+ position: relative;
799
+ top: 0px;
800
+ left: 0px;
801
+ padding: inherit;
802
+ height: fit-content;
803
+ width: fit-content;
804
+ border-radius: var(--radius-1);
805
+ max-width: 100%;
806
+ }
807
+
808
+ .tl-text-label__inner > .tl-text-input {
809
+ position: absolute;
810
+ inset: 0px;
811
+ height: 100%;
812
+ width: 100%;
813
+ padding: inherit;
814
+ }
815
+
816
+ .tl-text-wrapper[data-isselected='true'] .tl-text-input {
817
+ z-index: var(--layer-text-editor);
818
+ pointer-events: all;
819
+ }
820
+
821
+ /* This part of the rule helps preserve the occlusion rules for the shapes so we
822
+ * don't click on shapes that are behind other shapes.
823
+ * One extra nuance is we don't use this behavior for:
824
+ * - arrows which have weird geometry and just gets in the way.
825
+ * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield
826
+ * - shapes that are not filled
827
+ */
828
+ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true'])
829
+ .tl-shape:not(
830
+ [data-shape-type='arrow'],
831
+ [data-shape-type='draw'],
832
+ [data-shape-type='line'],
833
+ [data-shape-type='highlight'],
834
+ [data-shape-is-filled='false']
835
+ ) {
836
+ pointer-events: all;
837
+ }
838
+
839
+ .tl-rich-text .ProseMirror {
840
+ word-wrap: break-word;
841
+ overflow-wrap: break-word;
966
842
  white-space: pre-wrap;
967
843
 
968
844
  /**
@@ -1068,38 +944,307 @@ input,
1068
944
  }
1069
945
  }
1070
946
 
1071
- .tl-text-label__inner > .tl-text-input.tl-rich-text {
1072
- display: none;
1073
- position: static;
947
+ .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
948
+ display: block;
1074
949
  }
1075
950
 
1076
- .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
951
+ /* --------------------- Loading -------------------- */
952
+
953
+ .tl-loading {
954
+ background-color: var(--color-background);
955
+ color: var(--color-text-1);
956
+ height: 100%;
957
+ width: 100%;
958
+ display: flex;
959
+ flex-direction: column;
960
+ justify-content: center;
961
+ align-items: center;
962
+ gap: var(--space-2);
963
+ font-size: 14px;
964
+ font-weight: 500;
965
+ opacity: 0;
966
+ animation: fade-in 0.2s ease-in-out forwards;
967
+ animation-delay: 0.2s;
968
+ position: absolute;
969
+ inset: 0px;
970
+ z-index: var(--layer-canvas-blocker);
971
+ }
972
+
973
+ @keyframes fade-in {
974
+ 0% {
975
+ opacity: 0;
976
+ }
977
+ 100% {
978
+ opacity: 1;
979
+ }
980
+ }
981
+
982
+ /* ---------------------- Brush --------------------- */
983
+
984
+ .tl-brush {
985
+ stroke-width: calc(var(--tl-scale) * 1px);
986
+ contain: size layout;
987
+ }
988
+
989
+ .tl-brush__default {
990
+ stroke: var(--color-brush-stroke);
991
+ fill: var(--color-brush-fill);
992
+ }
993
+
994
+ /* -------------------- Scribble -------------------- */
995
+
996
+ .tl-scribble {
997
+ stroke-linejoin: round;
998
+ stroke-linecap: round;
999
+ pointer-events: none;
1000
+ contain: size layout;
1001
+ }
1002
+
1003
+ /* ---------------------- Snaps --------------------- */
1004
+
1005
+ .tl-snap-indicator {
1006
+ stroke: var(--color-snap);
1007
+ stroke-width: calc(1px * var(--tl-scale));
1008
+ fill: none;
1009
+ }
1010
+
1011
+ .tl-snap-point {
1012
+ stroke: var(--color-snap);
1013
+ stroke-width: calc(1px * var(--tl-scale));
1014
+ fill: none;
1015
+ }
1016
+
1017
+ /* ---------------- Hyperlink Button ---------------- */
1018
+
1019
+ .tl-hyperlink-button {
1020
+ background: none;
1021
+ margin: 0px;
1022
+ position: absolute;
1023
+ top: 0px;
1024
+ right: 0px;
1025
+ height: 44px;
1026
+ width: 44px;
1027
+ display: flex;
1028
+ align-items: center;
1029
+ justify-content: center;
1030
+ font-size: 12px;
1031
+ font-weight: 400;
1032
+ color: var(--color-text-1);
1033
+ padding: 13px;
1034
+ cursor: var(--tl-cursor-pointer);
1035
+ border: none;
1036
+ outline: none;
1037
+ pointer-events: all;
1038
+ z-index: 1;
1039
+ }
1040
+
1041
+ .tl-hyperlink-button::after {
1042
+ content: '';
1043
+ z-index: -1;
1044
+ position: absolute;
1045
+ right: 6px;
1046
+ bottom: 6px;
1077
1047
  display: block;
1048
+ width: calc(100% - 12px);
1049
+ height: calc(100% - 12px);
1050
+ border-radius: var(--radius-1);
1051
+ background-color: var(--color-background);
1052
+ pointer-events: none;
1053
+ }
1054
+
1055
+ .tl-hyperlink-button:focus-visible {
1056
+ color: var(--color-selected);
1057
+ }
1058
+
1059
+ .tl-hyperlink__icon {
1060
+ width: 16px;
1061
+ height: 16px;
1062
+ background-color: currentColor;
1063
+ pointer-events: none;
1064
+ }
1065
+
1066
+ .tl-hyperlink-button__hidden {
1067
+ display: none;
1068
+ }
1069
+
1070
+ /* --------------------- Handles -------------------- */
1071
+
1072
+ .tl-handle {
1073
+ pointer-events: all;
1074
+ }
1075
+
1076
+ .tl-handle__bg {
1077
+ fill: transparent;
1078
+ stroke: transparent;
1079
+ pointer-events: all;
1080
+ }
1081
+
1082
+ .tl-handle__fg {
1083
+ fill: var(--color-selected-contrast);
1084
+ stroke: var(--color-selection-stroke);
1085
+ stroke-width: calc(1.5px * var(--tl-scale));
1086
+ pointer-events: none;
1087
+ }
1088
+
1089
+ .tl-handle__create {
1090
+ opacity: 0;
1091
+ }
1092
+
1093
+ .tl-handle__clone > .tl-handle__fg {
1094
+ fill: var(--color-selection-stroke);
1095
+ stroke: none;
1096
+ }
1097
+
1098
+ .tl-handle__bg:active {
1099
+ fill: none;
1100
+ }
1101
+
1102
+ @media (pointer: coarse) {
1103
+ .tl-handle__bg:active {
1104
+ fill: var(--color-selection-fill);
1105
+ }
1106
+
1107
+ .tl-handle__create {
1108
+ opacity: 1;
1109
+ }
1110
+ }
1111
+
1112
+ .tl-rotate-corner:not(:hover),
1113
+ .tl-resize-handle:not(:hover) {
1114
+ cursor: none;
1115
+ }
1116
+
1117
+ /* ----------------- Shape indicator ---------------- */
1118
+
1119
+ .tl-shape-indicator {
1120
+ transform-origin: top left;
1121
+ fill: none;
1122
+ stroke-width: calc(1.5px * var(--tl-scale));
1123
+ contain: size layout;
1124
+ }
1125
+
1126
+ /* ---------------------- Shape --------------------- */
1127
+
1128
+ .tl-shape {
1129
+ position: absolute;
1130
+ pointer-events: none;
1131
+ overflow: visible;
1132
+ transform-origin: top left;
1133
+ contain: size layout;
1134
+ }
1135
+
1136
+ /* ---------------- Shape Containers ---------------- */
1137
+
1138
+ .tl-svg-container {
1139
+ position: absolute;
1140
+ inset: 0px;
1141
+ height: 100%;
1142
+ width: 100%;
1143
+ pointer-events: none;
1144
+ stroke-linecap: round;
1145
+ stroke-linejoin: round;
1146
+ transform-origin: top left;
1147
+ overflow: visible;
1148
+ }
1149
+
1150
+ .tl-html-container {
1151
+ position: absolute;
1152
+ inset: 0px;
1153
+ height: 100%;
1154
+ width: 100%;
1155
+ pointer-events: none;
1156
+ stroke-linecap: round;
1157
+ stroke-linejoin: round;
1158
+ /* content-visibility: auto; */
1159
+ transform-origin: top left;
1160
+ color: inherit;
1161
+ }
1162
+
1163
+ /* -------------------- Group shape ------------------ */
1164
+
1165
+ .tl-group {
1166
+ stroke: var(--color-text);
1167
+ stroke-width: calc(1px * var(--tl-scale));
1168
+ opacity: 0.5;
1169
+ }
1170
+
1171
+ /* --------------------- Arrow shape -------------------- */
1172
+
1173
+ .tl-arrow-label {
1174
+ position: absolute;
1175
+ top: -1px;
1176
+ left: -1px;
1177
+ width: 2px;
1178
+ height: 2px;
1179
+ padding: 0px;
1180
+ display: flex;
1181
+ justify-content: center;
1182
+ align-items: center;
1183
+ text-align: center;
1184
+ color: var(--color-text);
1185
+ text-shadow: var(--tl-text-outline);
1186
+ }
1187
+
1188
+ .tl-arrow-label[data-isediting='true'] p {
1189
+ opacity: 0;
1190
+ }
1191
+
1192
+ .tl-arrow-label__inner {
1193
+ border-radius: var(--radius-1);
1194
+ box-sizing: content-box;
1195
+ position: relative;
1196
+ height: max-content;
1197
+ width: max-content;
1198
+ pointer-events: none;
1199
+ display: flex;
1200
+ justify-content: center;
1201
+ align-items: center;
1202
+ }
1203
+
1204
+ .tl-arrow-label .tl-arrow {
1205
+ position: relative;
1206
+ height: max-content;
1207
+ padding: inherit;
1208
+ overflow: visible;
1209
+ }
1210
+
1211
+ .tl-arrow-label textarea {
1212
+ padding: inherit;
1213
+ /* Don't allow textarea to be zero width */
1214
+ min-width: 4px;
1078
1215
  }
1079
1216
 
1080
- /* ------------------- Snap Lines ------------------- */
1081
-
1082
- .tl-snap-indicator {
1083
- stroke: var(--color-accent);
1084
- stroke-width: calc(1px * var(--tl-scale));
1217
+ .tl-arrow-hint {
1218
+ stroke: var(--color-text-1);
1085
1219
  fill: none;
1220
+ stroke-linecap: round;
1221
+ overflow: visible;
1086
1222
  }
1087
1223
 
1088
- .tl-snap-point {
1089
- stroke: var(--color-accent);
1090
- stroke-width: calc(1px * var(--tl-scale));
1091
- fill: none;
1224
+ .tl-arrow-hint-handle {
1225
+ fill: var(--color-selected-contrast);
1226
+ stroke: var(--color-selection-stroke);
1227
+ stroke-width: calc(1.5px * var(--tl-scale));
1228
+ r: calc(4px * var(--tl-scale));
1229
+ }
1230
+
1231
+ .tl-arrow-hint-snap {
1232
+ stroke: transparent;
1233
+ fill: var(--color-selection-fill);
1234
+ r: calc(12px * var(--tl-scale));
1092
1235
  }
1093
1236
 
1094
- /* -------------------- Groups ------------------ */
1237
+ .tl-arrow-hint-snap__none,
1238
+ .tl-arrow-hint-snap__center,
1239
+ .tl-arrow-hint-snap__axis {
1240
+ display: none;
1241
+ }
1095
1242
 
1096
- .tl-group {
1097
- stroke: var(--color-text);
1098
- stroke-width: calc(1px * var(--tl-scale));
1099
- opacity: 0.5;
1243
+ .tl-arrow-hint-snap__edge {
1244
+ r: calc(8px * var(--tl-scale));
1100
1245
  }
1101
1246
 
1102
- /* ------------------- Bookmark Shape ------------------- */
1247
+ /* ------------------- Bookmark shape ------------------- */
1103
1248
 
1104
1249
  .tl-bookmark__container {
1105
1250
  width: 100%;
@@ -1228,193 +1373,44 @@ input,
1228
1373
  flex-shrink: 0;
1229
1374
  }
1230
1375
 
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 ---------------- */
1376
+ /* -------------- Image and video shape ------------- */
1285
1377
 
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%;
1378
+ .tl-image,
1379
+ .tl-video {
1380
+ object-fit: cover;
1381
+ background-size: cover;
1296
1382
  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
1383
  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
1384
  }
1336
1385
 
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
- ) {
1386
+ .tl-video-container,
1387
+ .tl-image-container,
1388
+ .tl-embed-container {
1389
+ width: 100%;
1390
+ height: 100%;
1352
1391
  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 ------------------ */
1392
+ /* background-color: var(--color-background); */
1372
1393
 
1373
- .tl-arrow-label {
1374
- position: absolute;
1375
- top: -1px;
1376
- left: -1px;
1377
- width: 2px;
1378
- height: 2px;
1379
- padding: 0px;
1380
1394
  display: flex;
1381
1395
  justify-content: center;
1382
1396
  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
1397
  }
1391
1398
 
1392
- .tl-arrow-label__inner {
1393
- border-radius: var(--radius-1);
1394
- box-sizing: content-box;
1399
+ .tl-image-container {
1395
1400
  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
1401
  }
1403
1402
 
1404
- .tl-arrow-label .tl-arrow {
1405
- position: relative;
1406
- height: max-content;
1407
- padding: inherit;
1408
- overflow: visible;
1403
+ .tl-image {
1404
+ position: absolute;
1405
+ inset: 0;
1409
1406
  }
1410
1407
 
1411
- .tl-arrow-label textarea {
1412
- padding: inherit;
1413
- /* Don't allow textarea to be zero width */
1414
- min-width: 4px;
1408
+ .tl-video.tl-video-is-fullscreen {
1409
+ object-fit: contain;
1410
+ background-size: contain;
1415
1411
  }
1416
1412
 
1417
- /* -------------------- NoteShape ------------------- */
1413
+ /* -------------------- Note shape ------------------- */
1418
1414
 
1419
1415
  .tl-note__container {
1420
1416
  position: relative;
@@ -1431,38 +1427,7 @@ input,
1431
1427
  color: currentColor;
1432
1428
  }
1433
1429
 
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 ------------------- */
1430
+ /* ------------------- Frame shape ------------------- */
1466
1431
 
1467
1432
  .tl-frame__body {
1468
1433
  stroke-width: calc(1px * var(--tl-scale));
@@ -1555,14 +1520,14 @@ input,
1555
1520
  }
1556
1521
  }
1557
1522
 
1558
- /* ------------------ iFrames Detail ----------------- */
1523
+ /* ------------------- Embed Shape ------------------ */
1559
1524
 
1560
1525
  .tl-embed {
1561
1526
  border: none;
1562
1527
  border-radius: var(--radius-2);
1563
1528
  }
1564
1529
 
1565
- /* -------------- Shape Error Boundary -------------- */
1530
+ /* -------------- Shape error boundary -------------- */
1566
1531
 
1567
1532
  .tl-shape-error-boundary {
1568
1533
  width: 100%;
@@ -1591,7 +1556,7 @@ input,
1591
1556
  color: var(--color-text-0);
1592
1557
  }
1593
1558
 
1594
- /* ----------------- Error Boundary ----------------- */
1559
+ /* ----------------- Error boundary ----------------- */
1595
1560
 
1596
1561
  .tl-error-boundary {
1597
1562
  width: 100%;
@@ -1753,22 +1718,6 @@ it from receiving any pointer events or affecting the cursor. */
1753
1718
  outline-offset: 0;
1754
1719
  }
1755
1720
 
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
1721
  /* ---------------- Hit test blocker ---------------- */
1773
1722
 
1774
1723
  .tl-hit-test-blocker {
@@ -1784,6 +1733,8 @@ it from receiving any pointer events or affecting the cursor. */
1784
1733
  display: none;
1785
1734
  }
1786
1735
 
1736
+ /* --------------------- Hovers --------------------- */
1737
+
1787
1738
  @media (hover: hover) {
1788
1739
  .tl-handle__create:hover {
1789
1740
  opacity: 1;