@tldraw/editor 3.14.0-canary.95353287a2be → 3.14.0-canary.9635d3157d9b

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 (221) hide show
  1. package/dist-cjs/index.d.ts +103 -104
  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 +52 -77
  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} +72 -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/exports/getSvgJsx.js.map +1 -1
  39. package/dist-cjs/lib/primitives/Box.js +33 -33
  40. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  41. package/dist-cjs/lib/primitives/Vec.js +18 -13
  42. package/dist-cjs/lib/primitives/Vec.js.map +3 -3
  43. package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
  44. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  45. package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
  46. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  47. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
  48. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  49. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
  50. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  51. package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -21
  52. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  53. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
  54. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  55. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +5 -0
  56. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  57. package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
  58. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  59. package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
  60. package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
  61. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
  62. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  63. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
  64. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
  65. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
  66. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  67. package/dist-cjs/lib/utils/reorderShapes.js +11 -10
  68. package/dist-cjs/lib/utils/reorderShapes.js.map +2 -2
  69. package/dist-cjs/lib/utils/richText.js +7 -2
  70. package/dist-cjs/lib/utils/richText.js.map +2 -2
  71. package/dist-cjs/version.js +3 -3
  72. package/dist-cjs/version.js.map +1 -1
  73. package/dist-esm/index.d.mts +103 -104
  74. package/dist-esm/index.mjs +15 -9
  75. package/dist-esm/index.mjs.map +2 -2
  76. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +1 -1
  77. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
  78. package/dist-esm/lib/editor/Editor.mjs +52 -77
  79. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  80. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
  81. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs +22 -22
  82. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
  83. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
  84. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  85. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +16 -16
  86. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  87. package/dist-esm/lib/editor/managers/{ClickManager.mjs → ClickManager/ClickManager.mjs} +1 -1
  88. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +7 -0
  89. package/dist-esm/lib/editor/managers/{EdgeScrollManager.mjs → EdgeScrollManager/EdgeScrollManager.mjs} +2 -2
  90. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +7 -0
  91. package/dist-esm/lib/editor/managers/{FocusManager.mjs → FocusManager/FocusManager.mjs} +2 -0
  92. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +7 -0
  93. package/dist-esm/lib/editor/managers/{FontManager.mjs → FontManager/FontManager.mjs} +4 -1
  94. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +7 -0
  95. package/dist-esm/lib/editor/managers/{HistoryManager.mjs → HistoryManager/HistoryManager.mjs} +60 -2
  96. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +7 -0
  97. package/dist-esm/lib/editor/managers/{ScribbleManager.mjs → ScribbleManager/ScribbleManager.mjs} +1 -1
  98. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +7 -0
  99. package/dist-esm/lib/editor/managers/{TextManager.mjs → TextManager/TextManager.mjs} +72 -42
  100. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +7 -0
  101. package/dist-esm/lib/editor/managers/{TickManager.mjs → TickManager/TickManager.mjs} +1 -1
  102. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +7 -0
  103. package/dist-esm/lib/editor/managers/{UserPreferencesManager.mjs → UserPreferencesManager/UserPreferencesManager.mjs} +1 -1
  104. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +7 -0
  105. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +8 -0
  106. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  107. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +6 -0
  108. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  109. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  110. package/dist-esm/lib/exports/getSvgJsx.mjs.map +1 -1
  111. package/dist-esm/lib/primitives/Box.mjs +33 -33
  112. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  113. package/dist-esm/lib/primitives/Vec.mjs +19 -14
  114. package/dist-esm/lib/primitives/Vec.mjs.map +3 -3
  115. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
  116. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  117. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
  118. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  119. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
  120. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  121. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
  122. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  123. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -21
  124. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  125. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
  126. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  127. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +7 -1
  128. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  129. package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
  130. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  131. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
  132. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
  133. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
  134. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  135. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
  136. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
  137. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
  138. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  139. package/dist-esm/lib/utils/reorderShapes.mjs +11 -10
  140. package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
  141. package/dist-esm/lib/utils/richText.mjs +8 -3
  142. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  143. package/dist-esm/version.mjs +3 -3
  144. package/dist-esm/version.mjs.map +1 -1
  145. package/editor.css +458 -523
  146. package/package.json +8 -9
  147. package/src/index.ts +18 -8
  148. package/src/lib/config/TLSessionStateSnapshot.ts +1 -1
  149. package/src/lib/editor/Editor.test.ts +252 -3
  150. package/src/lib/editor/Editor.ts +51 -75
  151. package/src/lib/editor/bindings/BindingUtil.ts +6 -0
  152. package/src/lib/editor/derivations/bindingsIndex.ts +27 -26
  153. package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
  154. package/src/lib/editor/derivations/parentsToChildren.ts +28 -25
  155. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +442 -0
  156. package/src/lib/editor/managers/{ClickManager.ts → ClickManager/ClickManager.ts} +3 -3
  157. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +374 -0
  158. package/src/lib/editor/managers/{EdgeScrollManager.ts → EdgeScrollManager/EdgeScrollManager.ts} +3 -3
  159. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +455 -0
  160. package/src/lib/editor/managers/{FocusManager.ts → FocusManager/FocusManager.ts} +3 -1
  161. package/src/lib/editor/managers/FontManager/FontManager.test.ts +263 -0
  162. package/src/lib/editor/managers/{FontManager.ts → FontManager/FontManager.ts} +5 -2
  163. package/src/lib/editor/managers/{HistoryManager.test.ts → HistoryManager/HistoryManager.test.ts} +388 -1
  164. package/src/lib/editor/managers/{HistoryManager.ts → HistoryManager/HistoryManager.ts} +73 -2
  165. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +624 -0
  166. package/src/lib/editor/managers/{ScribbleManager.ts → ScribbleManager/ScribbleManager.ts} +2 -2
  167. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +485 -0
  168. package/src/lib/editor/managers/TextManager/TextManager.test.ts +407 -0
  169. package/src/lib/editor/managers/{TextManager.ts → TextManager/TextManager.ts} +117 -87
  170. package/src/lib/editor/managers/TickManager/TickManager.test.ts +314 -0
  171. package/src/lib/editor/managers/{TickManager.ts → TickManager/TickManager.ts} +2 -2
  172. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +591 -0
  173. package/src/lib/editor/managers/{UserPreferencesManager.ts → UserPreferencesManager/UserPreferencesManager.ts} +2 -2
  174. package/src/lib/editor/shapes/ShapeUtil.ts +10 -1
  175. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +8 -0
  176. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +5 -2
  177. package/src/lib/exports/getSvgJsx.tsx +1 -1
  178. package/src/lib/primitives/Box.test.ts +588 -7
  179. package/src/lib/primitives/Box.ts +33 -33
  180. package/src/lib/primitives/Vec.test.ts +2 -2
  181. package/src/lib/primitives/Vec.ts +15 -10
  182. package/src/lib/primitives/geometry/Arc2d.ts +42 -23
  183. package/src/lib/primitives/geometry/Circle2d.ts +12 -12
  184. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
  185. package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
  186. package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
  187. package/src/lib/primitives/geometry/Edge2d.ts +14 -25
  188. package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
  189. package/src/lib/primitives/geometry/Geometry2d.ts +6 -0
  190. package/src/lib/primitives/geometry/Point2d.ts +6 -6
  191. package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
  192. package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
  193. package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
  194. package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
  195. package/src/lib/utils/reorderShapes.ts +10 -13
  196. package/src/lib/utils/richText.ts +10 -4
  197. package/src/version.ts +3 -3
  198. package/dist-cjs/lib/editor/managers/ClickManager.js.map +0 -7
  199. package/dist-cjs/lib/editor/managers/EdgeScrollManager.js.map +0 -7
  200. package/dist-cjs/lib/editor/managers/FocusManager.js.map +0 -7
  201. package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
  202. package/dist-cjs/lib/editor/managers/HistoryManager.js.map +0 -7
  203. package/dist-cjs/lib/editor/managers/ScribbleManager.js.map +0 -7
  204. package/dist-cjs/lib/editor/managers/Stack.js +0 -82
  205. package/dist-cjs/lib/editor/managers/Stack.js.map +0 -7
  206. package/dist-cjs/lib/editor/managers/TextManager.js.map +0 -7
  207. package/dist-cjs/lib/editor/managers/TickManager.js.map +0 -7
  208. package/dist-cjs/lib/editor/managers/UserPreferencesManager.js.map +0 -7
  209. package/dist-esm/lib/editor/managers/ClickManager.mjs.map +0 -7
  210. package/dist-esm/lib/editor/managers/EdgeScrollManager.mjs.map +0 -7
  211. package/dist-esm/lib/editor/managers/FocusManager.mjs.map +0 -7
  212. package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
  213. package/dist-esm/lib/editor/managers/HistoryManager.mjs.map +0 -7
  214. package/dist-esm/lib/editor/managers/ScribbleManager.mjs.map +0 -7
  215. package/dist-esm/lib/editor/managers/Stack.mjs +0 -62
  216. package/dist-esm/lib/editor/managers/Stack.mjs.map +0 -7
  217. package/dist-esm/lib/editor/managers/TextManager.mjs.map +0 -7
  218. package/dist-esm/lib/editor/managers/TickManager.mjs.map +0 -7
  219. package/dist-esm/lib/editor/managers/UserPreferencesManager.mjs.map +0 -7
  220. package/src/lib/editor/managers/ScribbleManager.test.ts +0 -32
  221. 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,44 +568,13 @@ 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
- .tl-text-shape-label {
791
- position: relative;
792
- font-weight: normal;
793
- min-width: 1px;
794
- padding: 0px;
795
- margin: 0px;
796
- border: none;
797
- width: fit-content;
798
- height: fit-content;
799
- font-variant: normal;
800
- font-style: normal;
801
- pointer-events: all;
802
- white-space: pre-wrap;
803
- overflow-wrap: break-word;
804
- text-shadow: var(--tl-text-outline);
805
- }
806
-
807
578
  .tl-text-wrapper[data-font='draw'] {
808
579
  font-family: var(--tl-font-draw);
809
580
  }
@@ -898,6 +669,9 @@ input,
898
669
  border: none;
899
670
  user-select: none;
900
671
  contain: style paint;
672
+ visibility: hidden;
673
+ /* 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. */
674
+ unicode-bidi: plaintext;
901
675
  -webkit-user-select: none;
902
676
  }
903
677
 
@@ -943,42 +717,127 @@ input,
943
717
  overflow: hidden;
944
718
  }
945
719
 
946
- .tl-text-wrapper[data-isediting='false'] .tl-text-input,
947
- .tl-arrow-label[data-isediting='false'] .tl-text-input {
948
- opacity: 0;
949
- cursor: var(--tl-cursor-default);
950
- }
951
-
952
- .tl-rich-text[data-is-ready-for-editing='true'],
953
- .tl-text-wrapper[data-is-ready-for-editing='true'] .tl-text-input {
954
- cursor: var(--tl-cursor-text);
955
- }
956
-
957
720
  .tl-text-input::selection {
958
721
  background: var(--color-selected);
959
722
  color: var(--color-selected-contrast);
960
723
  text-shadow: none;
961
724
  }
962
725
 
963
- .tl-rich-text .ProseMirror {
964
- word-wrap: break-word;
965
- overflow-wrap: break-word;
966
- white-space: pre-wrap;
967
-
968
- /**
969
- * Note: ProseMirror disables this in https://github.com/ProseMirror/prosemirror-view/commit/6b3b2205e2f3029cb8e8e86c55a190a22491df31
970
- * However, that was from 8 years ago and the browser caret issue
971
- * it mentions seems to be fixed. So, we're re-enabling it.
972
- * We'll tell ProseMirror maybe to get rid of this on their end.
973
- *
974
- */
975
- -webkit-font-variant-ligatures: inherit;
976
- font-variant-ligatures: inherit;
977
- font-feature-settings: inherit;
726
+ /* Text label */
978
727
 
979
- /**
980
- * N.B. This following CSS Rule comes standard with the tiptap editor.
981
- * Combined with the above rule that it supersedes, it allows for
728
+ .tl-text-label {
729
+ display: flex;
730
+ justify-content: center;
731
+ align-items: center;
732
+ color: var(--color-text);
733
+ text-shadow: var(--tl-text-outline);
734
+ line-height: inherit;
735
+ position: absolute;
736
+ inset: 0px;
737
+ height: 100%;
738
+ width: 100%;
739
+ }
740
+
741
+ .tl-text-label[data-hastext='false'][data-isediting='false'] > .tl-text-label__inner {
742
+ width: 40px;
743
+ height: 40px;
744
+ }
745
+
746
+ .tl-text-label[data-hastext='true'][data-isediting='false'] .tl-text-content {
747
+ pointer-events: all;
748
+ }
749
+
750
+ .tl-text-label__inner > .tl-text-input.tl-rich-text {
751
+ display: none;
752
+ position: static;
753
+ }
754
+
755
+ .tl-text-wrapper[data-isediting='false'] .tl-text-input,
756
+ .tl-arrow-label[data-isediting='false'] .tl-text-input {
757
+ opacity: 0;
758
+ cursor: var(--tl-cursor-default);
759
+ }
760
+
761
+ .tl-rich-text[data-is-ready-for-editing='true'],
762
+ .tl-text-wrapper[data-is-ready-for-editing='true'] .tl-text-input {
763
+ cursor: var(--tl-cursor-text);
764
+ }
765
+
766
+ .tl-text-label[data-textwrap='true'] > .tl-text-label__inner {
767
+ max-width: 100%;
768
+ }
769
+
770
+ .tl-text-label[data-isediting='true'] {
771
+ background-color: transparent;
772
+ min-height: auto;
773
+ }
774
+
775
+ .tl-text-wrapper .tl-text-content {
776
+ pointer-events: all;
777
+ z-index: var(--layer-text-content);
778
+ }
779
+
780
+ .tl-text-label__inner > .tl-text-content {
781
+ position: relative;
782
+ top: 0px;
783
+ left: 0px;
784
+ padding: inherit;
785
+ height: fit-content;
786
+ width: fit-content;
787
+ border-radius: var(--radius-1);
788
+ max-width: 100%;
789
+ }
790
+
791
+ .tl-text-label__inner > .tl-text-input {
792
+ position: absolute;
793
+ inset: 0px;
794
+ height: 100%;
795
+ width: 100%;
796
+ padding: inherit;
797
+ }
798
+
799
+ .tl-text-wrapper[data-isselected='true'] .tl-text-input {
800
+ z-index: var(--layer-text-editor);
801
+ pointer-events: all;
802
+ }
803
+
804
+ /* This part of the rule helps preserve the occlusion rules for the shapes so we
805
+ * don't click on shapes that are behind other shapes.
806
+ * One extra nuance is we don't use this behavior for:
807
+ * - arrows which have weird geometry and just gets in the way.
808
+ * - draw/line shapes, because it feels restrictive to have them be 'in the way' of clicking on a textfield
809
+ * - shapes that are not filled
810
+ */
811
+ .tl-canvas:is([data-iseditinganything='true'], [data-isselectinganything='true'])
812
+ .tl-shape:not(
813
+ [data-shape-type='arrow'],
814
+ [data-shape-type='draw'],
815
+ [data-shape-type='line'],
816
+ [data-shape-type='highlight'],
817
+ [data-shape-is-filled='false']
818
+ ) {
819
+ pointer-events: all;
820
+ }
821
+
822
+ .tl-rich-text .ProseMirror {
823
+ word-wrap: break-word;
824
+ overflow-wrap: break-word;
825
+ white-space: pre-wrap;
826
+
827
+ /**
828
+ * Note: ProseMirror disables this in https://github.com/ProseMirror/prosemirror-view/commit/6b3b2205e2f3029cb8e8e86c55a190a22491df31
829
+ * However, that was from 8 years ago and the browser caret issue
830
+ * it mentions seems to be fixed. So, we're re-enabling it.
831
+ * We'll tell ProseMirror maybe to get rid of this on their end.
832
+ *
833
+ */
834
+ -webkit-font-variant-ligatures: inherit;
835
+ font-variant-ligatures: inherit;
836
+ font-feature-settings: inherit;
837
+
838
+ /**
839
+ * N.B. This following CSS Rule comes standard with the tiptap editor.
840
+ * Combined with the above rule that it supersedes, it allows for
982
841
  * the auto-linking to work in text. Say, when typing example.com
983
842
  * this helps it automatically turn that bit of text into a link.
984
843
  *
@@ -1068,38 +927,307 @@ input,
1068
927
  }
1069
928
  }
1070
929
 
1071
- .tl-text-label__inner > .tl-text-input.tl-rich-text {
930
+ .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
931
+ display: block;
932
+ }
933
+
934
+ /* --------------------- Loading -------------------- */
935
+
936
+ .tl-loading {
937
+ background-color: var(--color-background);
938
+ color: var(--color-text-1);
939
+ height: 100%;
940
+ width: 100%;
941
+ display: flex;
942
+ flex-direction: column;
943
+ justify-content: center;
944
+ align-items: center;
945
+ gap: var(--space-2);
946
+ font-size: 14px;
947
+ font-weight: 500;
948
+ opacity: 0;
949
+ animation: fade-in 0.2s ease-in-out forwards;
950
+ animation-delay: 0.2s;
951
+ position: absolute;
952
+ inset: 0px;
953
+ z-index: var(--layer-canvas-blocker);
954
+ }
955
+
956
+ @keyframes fade-in {
957
+ 0% {
958
+ opacity: 0;
959
+ }
960
+ 100% {
961
+ opacity: 1;
962
+ }
963
+ }
964
+
965
+ /* ---------------------- Brush --------------------- */
966
+
967
+ .tl-brush {
968
+ stroke-width: calc(var(--tl-scale) * 1px);
969
+ contain: size layout;
970
+ }
971
+
972
+ .tl-brush__default {
973
+ stroke: var(--color-brush-stroke);
974
+ fill: var(--color-brush-fill);
975
+ }
976
+
977
+ /* -------------------- Scribble -------------------- */
978
+
979
+ .tl-scribble {
980
+ stroke-linejoin: round;
981
+ stroke-linecap: round;
982
+ pointer-events: none;
983
+ contain: size layout;
984
+ }
985
+
986
+ /* ---------------------- Snaps --------------------- */
987
+
988
+ .tl-snap-indicator {
989
+ stroke: var(--color-snap);
990
+ stroke-width: calc(1px * var(--tl-scale));
991
+ fill: none;
992
+ }
993
+
994
+ .tl-snap-point {
995
+ stroke: var(--color-snap);
996
+ stroke-width: calc(1px * var(--tl-scale));
997
+ fill: none;
998
+ }
999
+
1000
+ /* ---------------- Hyperlink Button ---------------- */
1001
+
1002
+ .tl-hyperlink-button {
1003
+ background: none;
1004
+ margin: 0px;
1005
+ position: absolute;
1006
+ top: 0px;
1007
+ right: 0px;
1008
+ height: 44px;
1009
+ width: 44px;
1010
+ display: flex;
1011
+ align-items: center;
1012
+ justify-content: center;
1013
+ font-size: 12px;
1014
+ font-weight: 400;
1015
+ color: var(--color-text-1);
1016
+ padding: 13px;
1017
+ cursor: var(--tl-cursor-pointer);
1018
+ border: none;
1019
+ outline: none;
1020
+ pointer-events: all;
1021
+ z-index: 1;
1022
+ }
1023
+
1024
+ .tl-hyperlink-button::after {
1025
+ content: '';
1026
+ z-index: -1;
1027
+ position: absolute;
1028
+ right: 6px;
1029
+ bottom: 6px;
1030
+ display: block;
1031
+ width: calc(100% - 12px);
1032
+ height: calc(100% - 12px);
1033
+ border-radius: var(--radius-1);
1034
+ background-color: var(--color-background);
1035
+ pointer-events: none;
1036
+ }
1037
+
1038
+ .tl-hyperlink-button:focus-visible {
1039
+ color: var(--color-selected);
1040
+ }
1041
+
1042
+ .tl-hyperlink__icon {
1043
+ width: 16px;
1044
+ height: 16px;
1045
+ background-color: currentColor;
1046
+ pointer-events: none;
1047
+ }
1048
+
1049
+ .tl-hyperlink-button__hidden {
1072
1050
  display: none;
1073
- position: static;
1074
1051
  }
1075
1052
 
1076
- .tl-text-wrapper[data-isediting='true'] .tl-rich-text {
1077
- display: block;
1053
+ /* --------------------- Handles -------------------- */
1054
+
1055
+ .tl-handle {
1056
+ pointer-events: all;
1057
+ }
1058
+
1059
+ .tl-handle__bg {
1060
+ fill: transparent;
1061
+ stroke: transparent;
1062
+ pointer-events: all;
1063
+ }
1064
+
1065
+ .tl-handle__fg {
1066
+ fill: var(--color-selected-contrast);
1067
+ stroke: var(--color-selection-stroke);
1068
+ stroke-width: calc(1.5px * var(--tl-scale));
1069
+ pointer-events: none;
1070
+ }
1071
+
1072
+ .tl-handle__create {
1073
+ opacity: 0;
1074
+ }
1075
+
1076
+ .tl-handle__clone > .tl-handle__fg {
1077
+ fill: var(--color-selection-stroke);
1078
+ stroke: none;
1079
+ }
1080
+
1081
+ .tl-handle__bg:active {
1082
+ fill: none;
1083
+ }
1084
+
1085
+ @media (pointer: coarse) {
1086
+ .tl-handle__bg:active {
1087
+ fill: var(--color-selection-fill);
1088
+ }
1089
+
1090
+ .tl-handle__create {
1091
+ opacity: 1;
1092
+ }
1093
+ }
1094
+
1095
+ .tl-rotate-corner:not(:hover),
1096
+ .tl-resize-handle:not(:hover) {
1097
+ cursor: none;
1098
+ }
1099
+
1100
+ /* ----------------- Shape indicator ---------------- */
1101
+
1102
+ .tl-shape-indicator {
1103
+ transform-origin: top left;
1104
+ fill: none;
1105
+ stroke-width: calc(1.5px * var(--tl-scale));
1106
+ contain: size layout;
1107
+ }
1108
+
1109
+ /* ---------------------- Shape --------------------- */
1110
+
1111
+ .tl-shape {
1112
+ position: absolute;
1113
+ pointer-events: none;
1114
+ overflow: visible;
1115
+ transform-origin: top left;
1116
+ contain: size layout;
1117
+ }
1118
+
1119
+ /* ---------------- Shape Containers ---------------- */
1120
+
1121
+ .tl-svg-container {
1122
+ position: absolute;
1123
+ inset: 0px;
1124
+ height: 100%;
1125
+ width: 100%;
1126
+ pointer-events: none;
1127
+ stroke-linecap: round;
1128
+ stroke-linejoin: round;
1129
+ transform-origin: top left;
1130
+ overflow: visible;
1131
+ }
1132
+
1133
+ .tl-html-container {
1134
+ position: absolute;
1135
+ inset: 0px;
1136
+ height: 100%;
1137
+ width: 100%;
1138
+ pointer-events: none;
1139
+ stroke-linecap: round;
1140
+ stroke-linejoin: round;
1141
+ /* content-visibility: auto; */
1142
+ transform-origin: top left;
1143
+ color: inherit;
1144
+ }
1145
+
1146
+ /* -------------------- Group shape ------------------ */
1147
+
1148
+ .tl-group {
1149
+ stroke: var(--color-text);
1150
+ stroke-width: calc(1px * var(--tl-scale));
1151
+ opacity: 0.5;
1152
+ }
1153
+
1154
+ /* --------------------- Arrow shape -------------------- */
1155
+
1156
+ .tl-arrow-label {
1157
+ position: absolute;
1158
+ top: -1px;
1159
+ left: -1px;
1160
+ width: 2px;
1161
+ height: 2px;
1162
+ padding: 0px;
1163
+ display: flex;
1164
+ justify-content: center;
1165
+ align-items: center;
1166
+ text-align: center;
1167
+ color: var(--color-text);
1168
+ text-shadow: var(--tl-text-outline);
1169
+ }
1170
+
1171
+ .tl-arrow-label[data-isediting='true'] p {
1172
+ opacity: 0;
1173
+ }
1174
+
1175
+ .tl-arrow-label__inner {
1176
+ border-radius: var(--radius-1);
1177
+ box-sizing: content-box;
1178
+ position: relative;
1179
+ height: max-content;
1180
+ width: max-content;
1181
+ pointer-events: none;
1182
+ display: flex;
1183
+ justify-content: center;
1184
+ align-items: center;
1185
+ }
1186
+
1187
+ .tl-arrow-label .tl-arrow {
1188
+ position: relative;
1189
+ height: max-content;
1190
+ padding: inherit;
1191
+ overflow: visible;
1192
+ }
1193
+
1194
+ .tl-arrow-label textarea {
1195
+ padding: inherit;
1196
+ /* Don't allow textarea to be zero width */
1197
+ min-width: 4px;
1198
+ }
1199
+
1200
+ .tl-arrow-hint {
1201
+ stroke: var(--color-text-1);
1202
+ fill: none;
1203
+ stroke-linecap: round;
1204
+ overflow: visible;
1205
+ }
1206
+
1207
+ .tl-arrow-hint-handle {
1208
+ fill: var(--color-selected-contrast);
1209
+ stroke: var(--color-selection-stroke);
1210
+ stroke-width: calc(1.5px * var(--tl-scale));
1211
+ r: calc(4px * var(--tl-scale));
1078
1212
  }
1079
1213
 
1080
- /* ------------------- Snap Lines ------------------- */
1081
-
1082
- .tl-snap-indicator {
1083
- stroke: var(--color-accent);
1084
- stroke-width: calc(1px * var(--tl-scale));
1085
- fill: none;
1214
+ .tl-arrow-hint-snap {
1215
+ stroke: transparent;
1216
+ fill: var(--color-selection-fill);
1217
+ r: calc(12px * var(--tl-scale));
1086
1218
  }
1087
1219
 
1088
- .tl-snap-point {
1089
- stroke: var(--color-accent);
1090
- stroke-width: calc(1px * var(--tl-scale));
1091
- fill: none;
1220
+ .tl-arrow-hint-snap__none,
1221
+ .tl-arrow-hint-snap__center,
1222
+ .tl-arrow-hint-snap__axis {
1223
+ display: none;
1092
1224
  }
1093
1225
 
1094
- /* -------------------- Groups ------------------ */
1095
-
1096
- .tl-group {
1097
- stroke: var(--color-text);
1098
- stroke-width: calc(1px * var(--tl-scale));
1099
- opacity: 0.5;
1226
+ .tl-arrow-hint-snap__edge {
1227
+ r: calc(8px * var(--tl-scale));
1100
1228
  }
1101
1229
 
1102
- /* ------------------- Bookmark Shape ------------------- */
1230
+ /* ------------------- Bookmark shape ------------------- */
1103
1231
 
1104
1232
  .tl-bookmark__container {
1105
1233
  width: 100%;
@@ -1228,193 +1356,45 @@ input,
1228
1356
  flex-shrink: 0;
1229
1357
  }
1230
1358
 
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 ---------------- */
1359
+ /* -------------- Image and video shape ------------- */
1285
1360
 
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%;
1361
+ .tl-image,
1362
+ .tl-video {
1363
+ object-fit: cover;
1364
+ background-size: cover;
1296
1365
  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
1366
  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
1367
  }
1336
1368
 
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
- ) {
1369
+ .tl-video-container,
1370
+ .tl-image-container,
1371
+ .tl-embed-container {
1372
+ width: 100%;
1373
+ height: 100%;
1352
1374
  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 ------------------ */
1375
+ /* background-color: var(--color-background); */
1372
1376
 
1373
- .tl-arrow-label {
1374
- position: absolute;
1375
- top: -1px;
1376
- left: -1px;
1377
- width: 2px;
1378
- height: 2px;
1379
- padding: 0px;
1380
1377
  display: flex;
1381
1378
  justify-content: center;
1382
1379
  align-items: center;
1383
- text-align: center;
1384
- color: var(--color-text);
1385
- text-shadow: var(--tl-text-outline);
1386
1380
  }
1387
1381
 
1388
- .tl-arrow-label[data-isediting='true'] p {
1389
- opacity: 0;
1390
- }
1391
-
1392
- .tl-arrow-label__inner {
1393
- border-radius: var(--radius-1);
1394
- box-sizing: content-box;
1382
+ .tl-image-container {
1395
1383
  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;
1384
+ overflow: hidden;
1402
1385
  }
1403
1386
 
1404
- .tl-arrow-label .tl-arrow {
1405
- position: relative;
1406
- height: max-content;
1407
- padding: inherit;
1408
- overflow: visible;
1387
+ .tl-image {
1388
+ position: absolute;
1389
+ inset: 0;
1409
1390
  }
1410
1391
 
1411
- .tl-arrow-label textarea {
1412
- padding: inherit;
1413
- /* Don't allow textarea to be zero width */
1414
- min-width: 4px;
1392
+ .tl-video.tl-video-is-fullscreen {
1393
+ object-fit: contain;
1394
+ background-size: contain;
1415
1395
  }
1416
1396
 
1417
- /* -------------------- NoteShape ------------------- */
1397
+ /* -------------------- Note shape ------------------- */
1418
1398
 
1419
1399
  .tl-note__container {
1420
1400
  position: relative;
@@ -1431,38 +1411,7 @@ input,
1431
1411
  color: currentColor;
1432
1412
  }
1433
1413
 
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 ------------------- */
1414
+ /* ------------------- Frame shape ------------------- */
1466
1415
 
1467
1416
  .tl-frame__body {
1468
1417
  stroke-width: calc(1px * var(--tl-scale));
@@ -1555,14 +1504,14 @@ input,
1555
1504
  }
1556
1505
  }
1557
1506
 
1558
- /* ------------------ iFrames Detail ----------------- */
1507
+ /* ------------------- Embed Shape ------------------ */
1559
1508
 
1560
1509
  .tl-embed {
1561
1510
  border: none;
1562
1511
  border-radius: var(--radius-2);
1563
1512
  }
1564
1513
 
1565
- /* -------------- Shape Error Boundary -------------- */
1514
+ /* -------------- Shape error boundary -------------- */
1566
1515
 
1567
1516
  .tl-shape-error-boundary {
1568
1517
  width: 100%;
@@ -1591,7 +1540,7 @@ input,
1591
1540
  color: var(--color-text-0);
1592
1541
  }
1593
1542
 
1594
- /* ----------------- Error Boundary ----------------- */
1543
+ /* ----------------- Error boundary ----------------- */
1595
1544
 
1596
1545
  .tl-error-boundary {
1597
1546
  width: 100%;
@@ -1753,22 +1702,6 @@ it from receiving any pointer events or affecting the cursor. */
1753
1702
  outline-offset: 0;
1754
1703
  }
1755
1704
 
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
1705
  /* ---------------- Hit test blocker ---------------- */
1773
1706
 
1774
1707
  .tl-hit-test-blocker {
@@ -1784,6 +1717,8 @@ it from receiving any pointer events or affecting the cursor. */
1784
1717
  display: none;
1785
1718
  }
1786
1719
 
1720
+ /* --------------------- Hovers --------------------- */
1721
+
1787
1722
  @media (hover: hover) {
1788
1723
  .tl-handle__create:hover {
1789
1724
  opacity: 1;