tldraw 3.16.0-next.34fddf633325 → 3.16.0-next.6611943ca24a

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 (320) hide show
  1. package/dist-cjs/index.d.ts +173 -5
  2. package/dist-cjs/index.js +12 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  9. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  10. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  13. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  14. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
  15. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  17. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  18. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  19. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  21. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  22. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  23. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
  25. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
  26. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  27. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  29. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  31. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  32. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  33. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  34. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  36. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  37. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  38. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  39. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  40. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  41. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  42. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  43. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  44. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  45. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  46. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  47. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  48. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  49. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  50. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +1 -1
  51. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  52. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  53. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  54. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  55. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  57. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  58. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  59. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  61. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  63. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +14 -14
  65. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  67. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  69. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  70. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  71. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  72. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  73. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  74. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  75. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  76. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +2 -2
  77. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  79. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  80. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  81. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  83. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  84. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +19 -4
  85. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  86. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +153 -152
  87. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  89. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  90. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  92. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  93. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  94. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  95. package/dist-cjs/lib/ui/context/actions.js +16 -2
  96. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  97. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  98. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  99. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  100. package/dist-cjs/lib/ui/version.js +3 -3
  101. package/dist-cjs/lib/ui/version.js.map +1 -1
  102. package/dist-esm/index.d.mts +173 -5
  103. package/dist-esm/index.mjs +19 -1
  104. package/dist-esm/index.mjs.map +2 -2
  105. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  106. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  107. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  108. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  109. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  110. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  111. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  112. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  113. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  114. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  115. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  116. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  117. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  118. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  119. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  120. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  121. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  122. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  123. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  124. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  125. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  126. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  127. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  128. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  129. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  130. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  131. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  132. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  133. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  134. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  135. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  136. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  137. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  138. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  139. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  140. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  141. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  142. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  143. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  144. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  145. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  146. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  147. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  148. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  149. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  150. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  151. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +1 -1
  152. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  153. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  154. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  155. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  156. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  157. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  158. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  159. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  160. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  161. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  162. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  163. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  164. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  165. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +14 -14
  166. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  167. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  168. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  169. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  170. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  171. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  172. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  173. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  174. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  175. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  176. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  177. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +2 -2
  178. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  179. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  180. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  181. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  182. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  183. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  184. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  185. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +19 -4
  186. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  187. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +162 -154
  188. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  189. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  190. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  191. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  192. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  193. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  194. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  195. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  196. package/dist-esm/lib/ui/context/actions.mjs +16 -2
  197. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  198. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  199. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  200. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  201. package/dist-esm/lib/ui/version.mjs +3 -3
  202. package/dist-esm/lib/ui/version.mjs.map +1 -1
  203. package/package.json +11 -34
  204. package/src/index.ts +15 -0
  205. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  206. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  207. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  208. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  209. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  210. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  211. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  212. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  213. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  214. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  215. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  216. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  217. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  218. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  219. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  220. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  221. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  222. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  223. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  224. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  225. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  226. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  227. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  228. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  229. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  230. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  231. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  232. package/src/lib/ui/TldrawUi.tsx +17 -2
  233. package/src/lib/ui/assetUrls.ts +13 -10
  234. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  235. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  236. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +1 -1
  237. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  238. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  239. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  240. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  241. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  242. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  243. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +39 -43
  244. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  245. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  246. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  247. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  248. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  249. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +2 -2
  250. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  251. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  252. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  253. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +32 -9
  254. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +186 -172
  255. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  256. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  257. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  258. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  259. package/src/lib/ui/context/actions.tsx +16 -2
  260. package/src/lib/ui/context/events.tsx +1 -0
  261. package/src/lib/ui/hooks/useTools.tsx +140 -10
  262. package/src/lib/ui/version.ts +3 -3
  263. package/src/lib/ui.css +366 -305
  264. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  265. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  266. package/src/test/A11y.test.tsx +3 -2
  267. package/src/test/ClickManager.test.ts +7 -6
  268. package/src/test/Editor.test.tsx +20 -19
  269. package/src/test/EraserTool.test.ts +184 -13
  270. package/src/test/HandTool.test.ts +10 -9
  271. package/src/test/HighlightShape.test.ts +2 -1
  272. package/src/test/SelectTool.test.ts +3 -2
  273. package/src/test/TLUserPreferences.test.ts +4 -3
  274. package/src/test/TestEditor.ts +13 -15
  275. package/src/test/TldrawEditor.test.tsx +11 -10
  276. package/src/test/ZoomTool.test.ts +7 -6
  277. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  278. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  279. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  280. package/src/test/arrows-megabus.test.tsx +5 -4
  281. package/src/test/bindings.test.tsx +24 -37
  282. package/src/test/bookmark-shapes.test.ts +1 -8
  283. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  284. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  285. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  286. package/src/test/commands/alignShapes.test.tsx +25 -24
  287. package/src/test/commands/animationSpeed.test.ts +2 -1
  288. package/src/test/commands/centerOnPoint.test.ts +3 -2
  289. package/src/test/commands/clipboard.test.ts +3 -2
  290. package/src/test/commands/createShapes.test.ts +2 -1
  291. package/src/test/commands/deleteShapes.test.ts +2 -1
  292. package/src/test/commands/distributeShapes.test.tsx +11 -10
  293. package/src/test/commands/getSvgString.test.ts +2 -1
  294. package/src/test/commands/packShapes.test.ts +5 -4
  295. package/src/test/commands/resizeShape.test.ts +2 -1
  296. package/src/test/commands/rotateShapes.test.ts +7 -6
  297. package/src/test/commands/setCamera.test.ts +4 -3
  298. package/src/test/commands/setCurrentPage.test.ts +3 -2
  299. package/src/test/commands/stackShapes.test.ts +11 -10
  300. package/src/test/commands/stretch.test.tsx +13 -12
  301. package/src/test/createDeepLink.test.tsx +2 -1
  302. package/src/test/cropping.test.ts +3 -2
  303. package/src/test/drawing.test.ts +2 -1
  304. package/src/test/flipShapes.test.ts +4 -3
  305. package/src/test/frames.test.ts +25 -24
  306. package/src/test/getCulledShapes.test.tsx +3 -2
  307. package/src/test/groups.test.tsx +1 -1
  308. package/src/test/handleDeepLink.test.tsx +2 -1
  309. package/src/test/maxShapes.test.ts +3 -2
  310. package/src/test/modifiers.test.ts +5 -4
  311. package/src/test/navigation.test.ts +12 -11
  312. package/src/test/panning.test.ts +2 -1
  313. package/src/test/perf/perf.test.ts +2 -1
  314. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  315. package/src/test/resizing.test.ts +39 -38
  316. package/src/test/select.test.tsx +4 -3
  317. package/src/test/selection-omnibus.test.ts +11 -10
  318. package/src/test/shapeutils.test.ts +4 -3
  319. package/src/test/translating.test.ts +9 -8
  320. package/tldraw.css +659 -595
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/arrow/ArrowShapeUtil.tsx"],
4
- "sourcesContent": ["import {\n\tArc2d,\n\tBox,\n\tEMPTY_ARRAY,\n\tEdge2d,\n\tEditor,\n\tGeometry2d,\n\tGroup2d,\n\tIndexKey,\n\tPI2,\n\tPolyline2d,\n\tRectangle2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLArrowBinding,\n\tTLArrowBindingProps,\n\tTLArrowShape,\n\tTLArrowShapeProps,\n\tTLHandle,\n\tTLHandleDragInfo,\n\tTLResizeInfo,\n\tTLShapePartial,\n\tTLShapeUtilCanBeLaidOutOpts,\n\tTLShapeUtilCanBindOpts,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\tWeakCache,\n\tarrowShapeMigrations,\n\tarrowShapeProps,\n\tclamp,\n\tdebugFlags,\n\texhaustiveSwitchError,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tinvLerp,\n\tlerp,\n\tmapObjectMapValues,\n\tmaybeSnapToGrid,\n\tstructuredClone,\n\ttoDomPrecision,\n\ttoRichText,\n\ttrack,\n\tuseEditor,\n\tuseIsEditing,\n\tuseSharedSafeId,\n\tuseValue,\n} from '@tldraw/editor'\nimport React, { useMemo } from 'react'\nimport { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'\nimport { isEmptyRichText, renderPlaintextFromRichText } from '../../utils/text/richText'\nimport { PathBuilder } from '../shared/PathBuilder'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'\nimport { ArrowShapeOptions } from './arrow-types'\nimport {\n\tgetArrowLabelDefaultPosition,\n\tgetArrowLabelFontSize,\n\tgetArrowLabelPosition,\n} from './arrowLabel'\nimport { updateArrowTargetState } from './arrowTargetState'\nimport { getArrowheadPathForType } from './arrowheads'\nimport { ElbowArrowDebug } from './elbow/ElbowArrowDebug'\nimport { ElbowArrowAxes } from './elbow/definitions'\nimport { getElbowArrowSnapLines, perpDistanceToLineAngle } from './elbow/elbowArrowSnapLines'\nimport {\n\tTLArrowBindings,\n\tcreateOrUpdateArrowBinding,\n\tgetArrowBindings,\n\tgetArrowInfo,\n\tgetArrowTerminalsInArrowSpace,\n\tremoveArrowBinding,\n} from './shared'\n\nenum ArrowHandles {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n}\n\n/** @public */\nexport class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {\n\tstatic override type = 'arrow' as const\n\tstatic override props = arrowShapeProps\n\tstatic override migrations = arrowShapeMigrations\n\n\toverride options: ArrowShapeOptions = {\n\t\texpandElbowLegLength: {\n\t\t\ts: 28,\n\t\t\tm: 36,\n\t\t\tl: 44,\n\t\t\txl: 66,\n\t\t},\n\t\tminElbowLegLength: {\n\t\t\ts: STROKE_SIZES.s * 3,\n\t\t\tm: STROKE_SIZES.m * 3,\n\t\t\tl: STROKE_SIZES.l * 3,\n\t\t\txl: STROKE_SIZES.xl * 3,\n\t\t},\n\t\tminElbowHandleDistance: 16,\n\n\t\tarcArrowCenterSnapDistance: 16,\n\t\telbowArrowCenterSnapDistance: 24,\n\t\telbowArrowEdgeSnapDistance: 20,\n\t\telbowArrowPointSnapDistance: 24,\n\t\telbowArrowAxisSnapDistance: 16,\n\n\t\tlabelCenterSnapDistance: 10,\n\n\t\telbowMidpointSnapDistance: 10,\n\t\telbowMinSegmentLengthToShowMidpointHandle: 20,\n\n\t\thoverPreciseTimeout: 600,\n\t\tpointingPreciseTimeout: 320,\n\n\t\tshouldBeExact: (editor: Editor) => editor.inputs.altKey,\n\t\tshouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,\n\t}\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canBind({ toShapeType }: TLShapeUtilCanBindOpts<TLArrowShape>): boolean {\n\t\t// bindings can go from arrows to shapes, but not from shapes to arrows\n\t\treturn toShapeType !== 'arrow'\n\t}\n\toverride canSnap() {\n\t\treturn false\n\t}\n\toverride hideResizeHandles() {\n\t\treturn true\n\t}\n\toverride hideRotateHandle() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsBg() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsFg() {\n\t\treturn true\n\t}\n\n\toverride canBeLaidOut(shape: TLArrowShape, info: TLShapeUtilCanBeLaidOutOpts) {\n\t\tif (info.type === 'flip') {\n\t\t\t// If we don't have this then the flip will be non-idempotent; that is, the flip will be multipotent, varipotent, or perhaps even omni-potent... and we can't have that\n\t\t\tconst bindings = getArrowBindings(this.editor, shape)\n\t\t\tconst { start, end } = bindings\n\t\t\tconst { shapes = [] } = info\n\t\t\tif (start && !shapes.find((s) => s.id === start.toId)) return false\n\t\t\tif (end && !shapes.find((s) => s.id === end.toId)) return false\n\t\t}\n\t\treturn true\n\t}\n\n\toverride getFontFaces(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) return EMPTY_ARRAY\n\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\toverride getDefaultProps(): TLArrowShape['props'] {\n\t\treturn {\n\t\t\tkind: 'arc',\n\t\t\telbowMidPoint: 0.5,\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfill: 'none',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tbend: 0,\n\t\t\tstart: { x: 0, y: 0 },\n\t\t\tend: { x: 2, y: 0 },\n\t\t\tarrowheadStart: 'none',\n\t\t\tarrowheadEnd: 'arrow',\n\t\t\trichText: toRichText(''),\n\t\t\tlabelPosition: 0.5,\n\t\t\tfont: 'draw',\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLArrowShape) {\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst debugGeom: Geometry2d[] = []\n\n\t\tconst bodyGeom =\n\t\t\tinfo.type === 'straight'\n\t\t\t\t? new Edge2d({\n\t\t\t\t\t\tstart: Vec.From(info.start.point),\n\t\t\t\t\t\tend: Vec.From(info.end.point),\n\t\t\t\t\t})\n\t\t\t\t: info.type === 'arc'\n\t\t\t\t\t? new Arc2d({\n\t\t\t\t\t\t\tcenter: Vec.Cast(info.handleArc.center),\n\t\t\t\t\t\t\tstart: Vec.Cast(info.start.point),\n\t\t\t\t\t\t\tend: Vec.Cast(info.end.point),\n\t\t\t\t\t\t\tsweepFlag: info.bodyArc.sweepFlag,\n\t\t\t\t\t\t\tlargeArcFlag: info.bodyArc.largeArcFlag,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Polyline2d({ points: info.route.points })\n\n\t\tlet labelGeom\n\t\tif (isEditing || !isEmptyRichText(shape.props.richText)) {\n\t\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\t\tif (debugFlags.debugGeometry.get()) {\n\t\t\t\tdebugGeom.push(...labelPosition.debugGeom)\n\t\t\t}\n\t\t\tlabelGeom = new Rectangle2d({\n\t\t\t\tx: labelPosition.box.x,\n\t\t\t\ty: labelPosition.box.y,\n\t\t\t\twidth: labelPosition.box.w,\n\t\t\t\theight: labelPosition.box.h,\n\t\t\t\tisFilled: true,\n\t\t\t\tisLabel: true,\n\t\t\t})\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: [...(labelGeom ? [bodyGeom, labelGeom] : [bodyGeom]), ...debugGeom],\n\t\t})\n\t}\n\n\toverride getHandles(shape: TLArrowShape): TLHandle[] {\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst handles: TLHandle[] = [\n\t\t\t{\n\t\t\t\tid: ArrowHandles.Start,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a1' as IndexKey,\n\t\t\t\tx: info.start.handle.x,\n\t\t\t\ty: info.start.handle.y,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ArrowHandles.End,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a3' as IndexKey,\n\t\t\t\tx: info.end.handle.x,\n\t\t\t\ty: info.end.handle.y,\n\t\t\t},\n\t\t]\n\n\t\tif (shape.props.kind === 'arc' && (info.type === 'straight' || info.type === 'arc')) {\n\t\t\thandles.push({\n\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\ttype: 'virtual',\n\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\tx: info.middle.x,\n\t\t\t\ty: info.middle.y,\n\t\t\t})\n\t\t}\n\n\t\tif (shape.props.kind === 'elbow' && info.type === 'elbow' && info.route.midpointHandle) {\n\t\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t\tconst segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)\n\t\t\tconst segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)\n\t\t\tconst segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()\n\n\t\t\tif (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {\n\t\t\t\thandles.push({\n\t\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\t\tx: info.route.midpointHandle.point.x,\n\t\t\t\t\ty: info.route.midpointHandle.point.y,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn handles\n\t}\n\n\toverride getText(shape: TLArrowShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride onHandleDrag(shape: TLArrowShape, info: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst handleId = info.handle.id as ArrowHandles\n\t\tswitch (handleId) {\n\t\t\tcase ArrowHandles.Middle:\n\t\t\t\tswitch (shape.props.kind) {\n\t\t\t\t\tcase 'arc':\n\t\t\t\t\t\treturn this.onArcMidpointHandleDrag(shape, info)\n\t\t\t\t\tcase 'elbow':\n\t\t\t\t\t\treturn this.onElbowMidpointHandleDrag(shape, info)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\texhaustiveSwitchError(shape.props.kind)\n\t\t\t\t}\n\t\t\tcase ArrowHandles.Start:\n\t\t\tcase ArrowHandles.End:\n\t\t\t\treturn this.onTerminalHandleDrag(shape, info, handleId)\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(handleId)\n\t\t}\n\t}\n\n\tprivate onArcMidpointHandleDrag(shape: TLArrowShape, { handle }: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// Bending the arrow...\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst delta = Vec.Sub(end, start)\n\t\tconst v = Vec.Per(delta)\n\n\t\tconst med = Vec.Med(end, start)\n\t\tconst A = Vec.Sub(med, v)\n\t\tconst B = Vec.Add(med, v)\n\n\t\tconst point = Vec.NearestPointOnLineSegment(A, B, handle, false)\n\t\tlet bend = Vec.Dist(point, med)\n\t\tif (Vec.Clockwise(point, end, med)) bend *= -1\n\t\treturn { id: shape.id, type: shape.type, props: { bend } }\n\t}\n\n\tprivate onElbowMidpointHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle }: TLHandleDragInfo<TLArrowShape>\n\t) {\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (info?.type !== 'elbow') return\n\n\t\tconst shapeToPageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst handlePagePoint = shapeToPageTransform.applyToPoint(handle)\n\t\tconst axisName = info.route.midpointHandle?.axis\n\t\tif (!axisName) return\n\t\tconst axis = ElbowArrowAxes[axisName]\n\n\t\tconst midRange = info.elbow[axis.midRange]\n\t\tif (!midRange) return\n\n\t\t// We're snapping against a list of parallel lines. The way we do this is to calculate the\n\t\t// angle of the line we're snapping to...\n\t\tlet angle = Vec.Angle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 0)),\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 1))\n\t\t)\n\t\tif (angle < 0) angle += Math.PI\n\n\t\t// ...then calculate the perpendicular distance from the origin to the (infinite) line in\n\t\t// question. This returns a signed distance - lines \"behind\" the origin are negative.\n\t\tconst handlePoint = perpDistanceToLineAngle(handlePagePoint, angle)\n\n\t\t// As we're only ever moving along one dimension, we can use this perpendicular distance for\n\t\t// all of our snapping calculations.\n\t\tconst loPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.lo, 0)),\n\t\t\tangle\n\t\t)\n\t\tconst hiPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.hi, 0)),\n\t\t\tangle\n\t\t)\n\n\t\t// we want to snap to certain points. the maximum distance at which a snap will occur is\n\t\t// relative to the zoom level:\n\t\tconst maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()\n\n\t\t// we snap to the midpoint of the range by default\n\t\tconst midPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(lerp(midRange.lo, midRange.hi, 0.5), 0)),\n\t\t\tangle\n\t\t)\n\n\t\tlet snapPoint = midPoint\n\t\tlet snapDistance = Math.abs(midPoint - handlePoint)\n\n\t\t// then we check all the other arrows that are on-screen.\n\t\tfor (const [snapAngle, snapLines] of getElbowArrowSnapLines(this.editor)) {\n\t\t\tconst { isParallel, isFlippedParallel } = anglesAreApproximatelyParallel(angle, snapAngle)\n\t\t\tif (isParallel || isFlippedParallel) {\n\t\t\t\tfor (const snapLine of snapLines) {\n\t\t\t\t\tconst doesShareStartIntersection =\n\t\t\t\t\t\tsnapLine.startBoundShapeId &&\n\t\t\t\t\t\t(snapLine.startBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.startBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tconst doesShareEndIntersection =\n\t\t\t\t\t\tsnapLine.endBoundShapeId &&\n\t\t\t\t\t\t(snapLine.endBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.endBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tif (!doesShareStartIntersection && !doesShareEndIntersection) continue\n\n\t\t\t\t\tconst point = isFlippedParallel ? -snapLine.perpDistance : snapLine.perpDistance\n\t\t\t\t\tconst distance = Math.abs(point - handlePoint)\n\t\t\t\t\tif (distance < snapDistance) {\n\t\t\t\t\t\tsnapPoint = point\n\t\t\t\t\t\tsnapDistance = distance\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (snapDistance > maxSnapDistance) {\n\t\t\tsnapPoint = handlePoint\n\t\t}\n\n\t\tconst newMid = clamp(invLerp(loPoint, hiPoint, snapPoint), 0, 1)\n\n\t\treturn {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tprops: {\n\t\t\t\telbowMidPoint: newMid,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate onTerminalHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle, isPrecise }: TLHandleDragInfo<TLArrowShape>,\n\t\thandleId: ArrowHandles.Start | ArrowHandles.End\n\t) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\n\t\tconst currentBinding = bindings[handleId]\n\n\t\tconst oppositeHandleId = handleId === ArrowHandles.Start ? ArrowHandles.End : ArrowHandles.Start\n\t\tconst oppositeBinding = bindings[oppositeHandleId]\n\n\t\tconst targetInfo = updateArrowTargetState({\n\t\t\teditor: this.editor,\n\t\t\tpointInPageSpace: this.editor.getShapePageTransform(shape.id)!.applyToPoint(handle),\n\t\t\tarrow: shape,\n\t\t\tisPrecise: isPrecise,\n\t\t\tcurrentBinding,\n\t\t\toppositeBinding,\n\t\t})\n\n\t\tif (!targetInfo) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\tremoveArrowBinding(this.editor, shape, handleId)\n\t\t\tconst newPoint = maybeSnapToGrid(new Vec(handle.x, handle.y), this.editor)\n\t\t\tupdate.props![handleId] = {\n\t\t\t\tx: newPoint.x,\n\t\t\t\ty: newPoint.y,\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\t// we've got a target! the handle is being dragged over a shape, bind to it\n\t\tconst bindingProps: TLArrowBindingProps = {\n\t\t\tterminal: handleId,\n\t\t\tnormalizedAnchor: targetInfo.normalizedAnchor,\n\t\t\tisPrecise: targetInfo.isPrecise,\n\t\t\tisExact: targetInfo.isExact,\n\t\t\tsnap: targetInfo.snap,\n\t\t}\n\n\t\tcreateOrUpdateArrowBinding(this.editor, shape, targetInfo.target.id, bindingProps)\n\n\t\tconst newBindings = getArrowBindings(this.editor, shape)\n\t\tif (newBindings.start && newBindings.end && newBindings.start.toId === newBindings.end.toId) {\n\t\t\tif (\n\t\t\t\tVec.Equals(newBindings.start.props.normalizedAnchor, newBindings.end.props.normalizedAnchor)\n\t\t\t) {\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newBindings.end.toId, {\n\t\t\t\t\t...newBindings.end.props,\n\t\t\t\t\tnormalizedAnchor: {\n\t\t\t\t\t\tx: newBindings.end.props.normalizedAnchor.x + 0.05,\n\t\t\t\t\t\ty: newBindings.end.props.normalizedAnchor.y,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn update\n\t}\n\n\toverride onTranslateStart(shape: TLArrowShape) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// ...if the user is dragging ONLY this arrow, for elbow shapes, we can't maintain the bindings well just yet so we remove them entirely\n\t\tif (shape.props.kind === 'elbow' && this.editor.getOnlySelectedShapeId() === shape.id) {\n\t\t\tconst info = getArrowInfo(this.editor, shape)\n\t\t\tif (!info) return\n\t\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\t\t\tif (bindings.start) {\n\t\t\t\tupdate.props!.start = { x: info.start.point.x, y: info.start.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'start')\n\t\t\t}\n\t\t\tif (bindings.end) {\n\t\t\t\tupdate.props!.end = { x: info.end.point.x, y: info.end.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'end')\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\tconst terminalsInArrowSpace = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t// If at least one bound shape is in the selection, do nothing;\n\t\t// If no bound shapes are in the selection, unbind any bound shapes\n\n\t\tconst selectedShapeIds = this.editor.getSelectedShapeIds()\n\n\t\tif (\n\t\t\t(bindings.start &&\n\t\t\t\t(selectedShapeIds.includes(bindings.start.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.start.toId))) ||\n\t\t\t(bindings.end &&\n\t\t\t\t(selectedShapeIds.includes(bindings.end.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.end.toId)))\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// When we start translating shapes, record where their bindings were in page space so we\n\t\t// can maintain them as we translate the arrow\n\t\tshapeAtTranslationStart.set(shape, {\n\t\t\tpagePosition: shapePageTransform.applyToPoint(shape),\n\t\t\tterminalBindings: mapObjectMapValues(terminalsInArrowSpace, (terminalName, point) => {\n\t\t\t\tconst binding = bindings[terminalName]\n\t\t\t\tif (!binding) return null\n\t\t\t\treturn {\n\t\t\t\t\tbinding,\n\t\t\t\t\tshapePosition: point,\n\t\t\t\t\tpagePosition: shapePageTransform.applyToPoint(point),\n\t\t\t\t}\n\t\t\t}),\n\t\t})\n\n\t\t// update arrow terminal bindings eagerly to make sure the arrows unbind nicely when translating\n\t\tif (bindings.start) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'start',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t\tshape = this.editor.getShape(shape.id) as TLArrowShape\n\t\t}\n\t\tif (bindings.end) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'end',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t}\n\n\t\tfor (const handleName of [ArrowHandles.Start, ArrowHandles.End] as const) {\n\t\t\tconst binding = bindings[handleName]\n\t\t\tif (!binding) continue\n\n\t\t\tthis.editor.updateBinding({\n\t\t\t\t...binding,\n\t\t\t\tprops: { ...binding.props, isPrecise: true },\n\t\t\t})\n\t\t}\n\n\t\treturn\n\t}\n\n\toverride onTranslate(initialShape: TLArrowShape, shape: TLArrowShape) {\n\t\tconst atTranslationStart = shapeAtTranslationStart.get(initialShape)\n\t\tif (!atTranslationStart) return\n\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst pageDelta = Vec.Sub(\n\t\t\tshapePageTransform.applyToPoint(shape),\n\t\t\tatTranslationStart.pagePosition\n\t\t)\n\n\t\tfor (const terminalBinding of Object.values(atTranslationStart.terminalBindings)) {\n\t\t\tif (!terminalBinding) continue\n\n\t\t\tconst newPagePoint = Vec.Add(terminalBinding.pagePosition, Vec.Mul(pageDelta, 0.5))\n\t\t\tconst newTarget = this.editor.getShapeAtPoint(newPagePoint, {\n\t\t\t\thitInside: true,\n\t\t\t\thitFrameInside: true,\n\t\t\t\tmargin: 0,\n\t\t\t\tfilter: (targetShape) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!targetShape.isLocked &&\n\t\t\t\t\t\tthis.editor.canBindShapes({ fromShape: shape, toShape: targetShape, binding: 'arrow' })\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (newTarget?.id === terminalBinding.binding.toId) {\n\t\t\t\tconst targetBounds = Box.ZeroFix(this.editor.getShapeGeometry(newTarget).bounds)\n\t\t\t\tconst pointInTargetSpace = this.editor.getPointInShapeSpace(newTarget, newPagePoint)\n\t\t\t\tconst normalizedAnchor = {\n\t\t\t\t\tx: (pointInTargetSpace.x - targetBounds.minX) / targetBounds.width,\n\t\t\t\t\ty: (pointInTargetSpace.y - targetBounds.minY) / targetBounds.height,\n\t\t\t\t}\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newTarget.id, {\n\t\t\t\t\t...terminalBinding.binding.props,\n\t\t\t\t\tnormalizedAnchor,\n\t\t\t\t\tisPrecise: true,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tremoveArrowBinding(this.editor, shape, terminalBinding.binding.props.terminal)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly _resizeInitialBindings = new WeakCache<TLArrowShape, TLArrowBindings>()\n\n\toverride onResize(shape: TLArrowShape, info: TLResizeInfo<TLArrowShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst bindings = this._resizeInitialBindings.get(shape, () =>\n\t\t\tgetArrowBindings(this.editor, shape)\n\t\t)\n\t\tconst terminals = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst { start, end } = structuredClone<TLArrowShape['props']>(shape.props)\n\t\tlet { bend } = shape.props\n\n\t\t// Rescale start handle if it's not bound to a shape\n\t\tif (!bindings.start) {\n\t\t\tstart.x = terminals.start.x * scaleX\n\t\t\tstart.y = terminals.start.y * scaleY\n\t\t}\n\n\t\t// Rescale end handle if it's not bound to a shape\n\t\tif (!bindings.end) {\n\t\t\tend.x = terminals.end.x * scaleX\n\t\t\tend.y = terminals.end.y * scaleY\n\t\t}\n\n\t\t// todo: we should only change the normalized anchor positions\n\t\t// of the shape's handles if the bound shape is also being resized\n\n\t\tconst mx = Math.abs(scaleX)\n\t\tconst my = Math.abs(scaleY)\n\n\t\tconst startNormalizedAnchor = bindings?.start\n\t\t\t? Vec.From(bindings.start.props.normalizedAnchor)\n\t\t\t: null\n\t\tconst endNormalizedAnchor = bindings?.end ? Vec.From(bindings.end.props.normalizedAnchor) : null\n\n\t\tif (scaleX < 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\t\t} else if (scaleX < 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t}\n\n\t\tif (bindings.start && startNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.start.toId, {\n\t\t\t\t...bindings.start.props,\n\t\t\t\tnormalizedAnchor: startNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\t\tif (bindings.end && endNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.end.toId, {\n\t\t\t\t...bindings.end.props,\n\t\t\t\tnormalizedAnchor: endNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\n\t\tconst next = {\n\t\t\tprops: {\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tbend,\n\t\t\t},\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onDoubleClickHandle(\n\t\tshape: TLArrowShape,\n\t\thandle: TLHandle\n\t): TLShapePartial<TLArrowShape> | void {\n\t\tswitch (handle.id) {\n\t\t\tcase ArrowHandles.Start: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadStart: shape.props.arrowheadStart === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ArrowHandles.End: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadEnd: shape.props.arrowheadEnd === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponent(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\tconst shouldDisplayHandles =\n\t\t\tthis.editor.isInAny(\n\t\t\t\t'select.idle',\n\t\t\t\t'select.pointing_handle',\n\t\t\t\t'select.dragging_handle',\n\t\t\t\t'select.translating',\n\t\t\t\t'arrow.dragging'\n\t\t\t) && !this.editor.getIsReadonly()\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info?.isValid) return null\n\n\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\tconst isSelected = shape.id === this.editor.getOnlySelectedShapeId()\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst showArrowLabel = isEditing || !isEmptyRichText(shape.props.richText)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer style={{ minWidth: 50, minHeight: 50 }}>\n\t\t\t\t\t<ArrowSvg\n\t\t\t\t\t\tshape={shape}\n\t\t\t\t\t\tshouldDisplayHandles={shouldDisplayHandles && onlySelectedShape?.id === shape.id}\n\t\t\t\t\t/>\n\t\t\t\t\t{shape.props.kind === 'elbow' && debugFlags.debugElbowArrows.get() && (\n\t\t\t\t\t\t<ElbowArrowDebug arrow={shape} />\n\t\t\t\t\t)}\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showArrowLabel && (\n\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\tshapeId={shape.id}\n\t\t\t\t\t\ttype=\"arrow\"\n\t\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\talign=\"middle\"\n\t\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\t\tlabelColor={theme[shape.props.labelColor].solid}\n\t\t\t\t\t\ttextWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\tpadding={0}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isEditing = useIsEditing(shape.id)\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info) return null\n\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, info?.bindings)\n\t\tconst geometry = this.editor.getShapeGeometry<Group2d>(shape)\n\t\tconst bounds = geometry.bounds\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\t\tconst labelGeometry = isEditing || !isEmpty ? (geometry.children[1] as Rectangle2d) : null\n\n\t\tif (Vec.Equals(start, end)) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst includeClipPath =\n\t\t\t(as && info.start.arrowhead !== 'arrow') ||\n\t\t\t(ae && info.end.arrowhead !== 'arrow') ||\n\t\t\t!!labelGeometry\n\n\t\tconst labelBounds = labelGeometry ? labelGeometry.getBounds() : new Box(0, 0, 0, 0)\n\n\t\tif (isEditing && labelGeometry) {\n\t\t\treturn (\n\t\t\t\t<rect\n\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\trx={3.5 * shape.props.scale}\n\t\t\t\t\try={3.5 * shape.props.scale}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tconst clipStartArrowhead = !(\n\t\t\tinfo.start.arrowhead === 'none' || info.start.arrowhead === 'arrow'\n\t\t)\n\t\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\t\treturn (\n\t\t\t<g>\n\t\t\t\t{includeClipPath && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\t\thasText={!isEmpty}\n\t\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\t\tlabelBounds={labelBounds}\n\t\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t\tWebkitClipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* This rect needs to be here if we're creating a mask due to an svg quirk on Chrome */}\n\t\t\t\t\t{includeClipPath && (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx={bounds.minX - 100}\n\t\t\t\t\t\t\ty={bounds.minY - 100}\n\t\t\t\t\t\t\twidth={bounds.width + 200}\n\t\t\t\t\t\t\theight={bounds.height + 200}\n\t\t\t\t\t\t\topacity={0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{getArrowBodyPath(\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\tinfo,\n\t\t\t\t\t\tshape.props.dash === 'draw'\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tstyle: 'draw',\n\t\t\t\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tpasses: 1,\n\t\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\t\troundness: strokeWidth * 2,\n\t\t\t\t\t\t\t\t\tprops: { strokeWidth: undefined },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: { style: 'solid', strokeWidth: 1, props: { strokeWidth: undefined } }\n\t\t\t\t\t)}\n\t\t\t\t</g>\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t\t{labelGeometry && (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\t\trx={3.5}\n\t\t\t\t\t\try={3.5}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride onEditStart(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\t// editing text for the first time, so set the position to the default:\n\t\t\tconst labelPosition = getArrowLabelDefaultPosition(this.editor, shape)\n\t\t\tthis.editor.updateShape<TLArrowShape>({\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { labelPosition },\n\t\t\t})\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLArrowShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst theme = getDefaultColorTheme(ctx)\n\t\tconst scaleFactor = 1 / shape.props.scale\n\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<ArrowSvg shape={shape} shouldDisplayHandles={false} />\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\talign=\"middle\"\n\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\tlabelColor={theme[shape.props.labelColor].solid}\n\t\t\t\t\tbounds={getArrowLabelPosition(this.editor, shape)\n\t\t\t\t\t\t.box.clone()\n\t\t\t\t\t\t.expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}\n\t\t\t\t\tpadding={0}\n\t\t\t\t\tshowTextOutline={true}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [\n\t\t\tgetFillDefForCanvas(),\n\t\t\t{\n\t\t\t\tkey: `arrow:dot`,\n\t\t\t\tcomponent: ArrowheadDotDef,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: `arrow:cross`,\n\t\t\t\tcomponent: ArrowheadCrossDef,\n\t\t\t},\n\t\t]\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLArrowShape,\n\t\tendShape: TLArrowShape,\n\t\tprogress: number\n\t): TLArrowShapeProps {\n\t\treturn {\n\t\t\t...(progress > 0.5 ? endShape.props : startShape.props),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, progress),\n\t\t\tstart: {\n\t\t\t\tx: lerp(startShape.props.start.x, endShape.props.start.x, progress),\n\t\t\t\ty: lerp(startShape.props.start.y, endShape.props.start.y, progress),\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tx: lerp(startShape.props.end.x, endShape.props.end.x, progress),\n\t\t\t\ty: lerp(startShape.props.end.y, endShape.props.end.y, progress),\n\t\t\t},\n\t\t\tbend: lerp(startShape.props.bend, endShape.props.bend, progress),\n\t\t\tlabelPosition: lerp(startShape.props.labelPosition, endShape.props.labelPosition, progress),\n\t\t}\n\t}\n}\n\nexport function getArrowLength(editor: Editor, shape: TLArrowShape): number {\n\tconst info = getArrowInfo(editor, shape)!\n\n\treturn info.type === 'straight'\n\t\t? Vec.Dist(info.start.handle, info.end.handle)\n\t\t: info.type === 'arc'\n\t\t\t? Math.abs(info.handleArc.length)\n\t\t\t: info.route.distance\n}\n\nconst ArrowSvg = track(function ArrowSvg({\n\tshape,\n\tshouldDisplayHandles,\n}: {\n\tshape: TLArrowShape\n\tshouldDisplayHandles: boolean\n}) {\n\tconst editor = useEditor()\n\tconst theme = useDefaultColorTheme()\n\tconst info = getArrowInfo(editor, shape)\n\tconst isForceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\treturn editor.getZoomLevel() < 0.2\n\t\t},\n\t\t[editor]\n\t)\n\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\tconst arrowheadDotId = useSharedSafeId('arrowhead-dot')\n\tconst arrowheadCrossId = useSharedSafeId('arrowhead-cross')\n\tconst isEditing = useIsEditing(shape.id)\n\tconst geometry = editor.getShapeGeometry(shape)\n\tif (!geometry) return null\n\tconst bounds = Box.ZeroFix(geometry.bounds)\n\tconst bindings = getArrowBindings(editor, shape)\n\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\tif (!info?.isValid) return null\n\n\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\tlet handlePath: null | React.JSX.Element = null\n\n\tif (shouldDisplayHandles && (bindings.start || bindings.end)) {\n\t\thandlePath = getArrowHandlePath(info, {\n\t\t\tstyle: 'dashed',\n\t\t\tstart: 'skip',\n\t\t\tend: 'skip',\n\t\t\tlengthRatio: 2.5,\n\t\t\tstrokeWidth: 2 / editor.getZoomLevel(),\n\t\t\tprops: {\n\t\t\t\tclassName: 'tl-arrow-hint',\n\t\t\t\tmarkerStart: bindings.start\n\t\t\t\t\t? bindings.start.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.start.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\tmarkerEnd: bindings.end\n\t\t\t\t\t? bindings.end.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.end.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\topacity: 0.16,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst labelPosition = getArrowLabelPosition(editor, shape)\n\n\tconst clipStartArrowhead = !(info.start.arrowhead === 'none' || info.start.arrowhead === 'arrow')\n\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\treturn (\n\t\t<>\n\t\t\t{/* Yep */}\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipPathId}>\n\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\thasText={isEditing || !isEmpty}\n\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\tlabelBounds={labelPosition.box}\n\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t/>\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\t\t\t<g\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={theme[shape.props.color].solid}\n\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tpointerEvents=\"none\"\n\t\t\t>\n\t\t\t\t{handlePath}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: `url(#${clipPathId})`,\n\t\t\t\t\t\tWebkitClipPath: `url(#${clipPathId})`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(bounds.minX - 100)}\n\t\t\t\t\t\ty={toDomPrecision(bounds.minY - 100)}\n\t\t\t\t\t\twidth={toDomPrecision(bounds.width + 200)}\n\t\t\t\t\t\theight={toDomPrecision(bounds.height + 200)}\n\t\t\t\t\t\topacity={0}\n\t\t\t\t\t/>\n\t\t\t\t\t{getArrowBodyPath(shape, info, {\n\t\t\t\t\t\tstyle: shape.props.dash,\n\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\tforceSolid: isForceSolid,\n\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t})}\n\t\t\t\t</g>\n\t\t\t\t{as && clipStartArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={as}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{ae && clipEndArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={ae}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t</g>\n\t\t</>\n\t)\n})\n\nfunction ArrowClipPath({\n\tradius,\n\thasText,\n\tbounds,\n\tlabelBounds,\n\tas,\n\tae,\n}: {\n\tradius: number\n\thasText: boolean\n\tbounds: Box\n\tlabelBounds: Box\n\tas: string\n\tae: string\n}) {\n\tconst path = useMemo(() => {\n\t\t// The direction in which we create the different path parts is important, as it determines what gets clipped.\n\t\t// See the description on the directions in the non-zero fill rule example:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule#nonzero\n\t\tconst path = new PathBuilder()\n\n\t\t// We create this one in the clockwise direction\n\t\tpath\n\t\t\t.moveTo(bounds.left - 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.bottom + 100)\n\t\t\t.lineTo(bounds.left - 100, bounds.bottom + 100)\n\t\t\t.close()\n\n\t\tif (hasText) {\n\t\t\t// We create this one in the counter-clockwise direction, which cuts out the label box\n\t\t\tpath\n\t\t\t\t.moveTo(labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.lineTo(labelBounds.left, labelBounds.bottom - radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left + radius, labelBounds.bottom)\n\t\t\t\t.lineTo(labelBounds.right - radius, labelBounds.bottom)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right, labelBounds.bottom - radius)\n\t\t\t\t.lineTo(labelBounds.right, labelBounds.top + radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right - radius, labelBounds.top)\n\t\t\t\t.lineTo(labelBounds.left + radius, labelBounds.top)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.close()\n\t\t}\n\n\t\treturn path.toD()\n\t}, [\n\t\tradius,\n\t\thasText,\n\t\tbounds.bottom,\n\t\tbounds.left,\n\t\tbounds.right,\n\t\tbounds.top,\n\t\tlabelBounds.bottom,\n\t\tlabelBounds.left,\n\t\tlabelBounds.right,\n\t\tlabelBounds.top,\n\t])\n\n\t// We also append the arrowhead paths to the clip path, so that we also clip the arrowheads\n\treturn <path d={`${path}${as}${ae}`} />\n}\n\nconst shapeAtTranslationStart = new WeakMap<\n\tTLArrowShape,\n\t{\n\t\tpagePosition: Vec\n\t\tterminalBindings: Record<\n\t\t\t'start' | 'end',\n\t\t\t{\n\t\t\t\tpagePosition: Vec\n\t\t\t\tshapePosition: Vec\n\t\t\t\tbinding: TLArrowBinding\n\t\t\t} | null\n\t\t>\n\t}\n>()\n\nfunction ArrowheadDotDef() {\n\tconst id = useSharedSafeId('arrowhead-dot')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"0\">\n\t\t\t<circle cx=\"3\" cy=\"3\" r=\"2\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\nfunction ArrowheadCrossDef() {\n\tconst id = useSharedSafeId('arrowhead-cross')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"auto\">\n\t\t\t<line x1=\"1.5\" y1=\"1.5\" x2=\"4.5\" y2=\"4.5\" strokeDasharray=\"100%\" />\n\t\t\t<line x1=\"1.5\" y1=\"4.5\" x2=\"4.5\" y2=\"1.5\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\n/**\n * Take 2 angles and return true if they are approximately parallel. Angle that point in the same\n * (or opposite) directions are considered parallel. This also handles wrap around - e.g. 0, \u03C0, and\n * 2\u03C0 are all considered parallel.\n */\nfunction anglesAreApproximatelyParallel(a: number, b: number, tolerance = 0.0001) {\n\tconst diff = Math.abs(a - b)\n\n\tconst isParallel = diff < tolerance\n\tconst isFlippedParallel = Math.abs(diff - Math.PI) < tolerance\n\tconst is360Parallel = Math.abs(diff - PI2) < tolerance\n\n\treturn { isParallel: isParallel || is360Parallel, isFlippedParallel }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tArc2d,\n\tBox,\n\tEMPTY_ARRAY,\n\tEdge2d,\n\tEditor,\n\tGeometry2d,\n\tGroup2d,\n\tIndexKey,\n\tPI2,\n\tPolyline2d,\n\tRectangle2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLArrowBinding,\n\tTLArrowBindingProps,\n\tTLArrowShape,\n\tTLArrowShapeProps,\n\tTLHandle,\n\tTLHandleDragInfo,\n\tTLResizeInfo,\n\tTLShapePartial,\n\tTLShapeUtilCanBeLaidOutOpts,\n\tTLShapeUtilCanBindOpts,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\tWeakCache,\n\tarrowShapeMigrations,\n\tarrowShapeProps,\n\tclamp,\n\tdebugFlags,\n\texhaustiveSwitchError,\n\tgetColorValue,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tinvLerp,\n\tlerp,\n\tmapObjectMapValues,\n\tmaybeSnapToGrid,\n\tstructuredClone,\n\ttoDomPrecision,\n\ttoRichText,\n\ttrack,\n\tuseEditor,\n\tuseIsEditing,\n\tuseSharedSafeId,\n\tuseValue,\n} from '@tldraw/editor'\nimport React, { useMemo } from 'react'\nimport { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'\nimport { isEmptyRichText, renderPlaintextFromRichText } from '../../utils/text/richText'\nimport { PathBuilder } from '../shared/PathBuilder'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'\nimport { ArrowShapeOptions } from './arrow-types'\nimport {\n\tgetArrowLabelDefaultPosition,\n\tgetArrowLabelFontSize,\n\tgetArrowLabelPosition,\n} from './arrowLabel'\nimport { updateArrowTargetState } from './arrowTargetState'\nimport { getArrowheadPathForType } from './arrowheads'\nimport { ElbowArrowDebug } from './elbow/ElbowArrowDebug'\nimport { ElbowArrowAxes } from './elbow/definitions'\nimport { getElbowArrowSnapLines, perpDistanceToLineAngle } from './elbow/elbowArrowSnapLines'\nimport {\n\tTLArrowBindings,\n\tcreateOrUpdateArrowBinding,\n\tgetArrowBindings,\n\tgetArrowInfo,\n\tgetArrowTerminalsInArrowSpace,\n\tremoveArrowBinding,\n} from './shared'\n\nenum ArrowHandles {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n}\n\n/** @public */\nexport class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {\n\tstatic override type = 'arrow' as const\n\tstatic override props = arrowShapeProps\n\tstatic override migrations = arrowShapeMigrations\n\n\toverride options: ArrowShapeOptions = {\n\t\texpandElbowLegLength: {\n\t\t\ts: 28,\n\t\t\tm: 36,\n\t\t\tl: 44,\n\t\t\txl: 66,\n\t\t},\n\t\tminElbowLegLength: {\n\t\t\ts: STROKE_SIZES.s * 3,\n\t\t\tm: STROKE_SIZES.m * 3,\n\t\t\tl: STROKE_SIZES.l * 3,\n\t\t\txl: STROKE_SIZES.xl * 3,\n\t\t},\n\t\tminElbowHandleDistance: 16,\n\n\t\tarcArrowCenterSnapDistance: 16,\n\t\telbowArrowCenterSnapDistance: 24,\n\t\telbowArrowEdgeSnapDistance: 20,\n\t\telbowArrowPointSnapDistance: 24,\n\t\telbowArrowAxisSnapDistance: 16,\n\n\t\tlabelCenterSnapDistance: 10,\n\n\t\telbowMidpointSnapDistance: 10,\n\t\telbowMinSegmentLengthToShowMidpointHandle: 20,\n\n\t\thoverPreciseTimeout: 600,\n\t\tpointingPreciseTimeout: 320,\n\n\t\tshouldBeExact: (editor: Editor) => editor.inputs.altKey,\n\t\tshouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,\n\t}\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canBind({ toShapeType }: TLShapeUtilCanBindOpts<TLArrowShape>): boolean {\n\t\t// bindings can go from arrows to shapes, but not from shapes to arrows\n\t\treturn toShapeType !== 'arrow'\n\t}\n\toverride canSnap() {\n\t\treturn false\n\t}\n\toverride hideResizeHandles() {\n\t\treturn true\n\t}\n\toverride hideRotateHandle() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsBg() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsFg() {\n\t\treturn true\n\t}\n\n\toverride canBeLaidOut(shape: TLArrowShape, info: TLShapeUtilCanBeLaidOutOpts) {\n\t\tif (info.type === 'flip') {\n\t\t\t// If we don't have this then the flip will be non-idempotent; that is, the flip will be multipotent, varipotent, or perhaps even omni-potent... and we can't have that\n\t\t\tconst bindings = getArrowBindings(this.editor, shape)\n\t\t\tconst { start, end } = bindings\n\t\t\tconst { shapes = [] } = info\n\t\t\tif (start && !shapes.find((s) => s.id === start.toId)) return false\n\t\t\tif (end && !shapes.find((s) => s.id === end.toId)) return false\n\t\t}\n\t\treturn true\n\t}\n\n\toverride getFontFaces(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) return EMPTY_ARRAY\n\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\toverride getDefaultProps(): TLArrowShape['props'] {\n\t\treturn {\n\t\t\tkind: 'arc',\n\t\t\telbowMidPoint: 0.5,\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfill: 'none',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tbend: 0,\n\t\t\tstart: { x: 0, y: 0 },\n\t\t\tend: { x: 2, y: 0 },\n\t\t\tarrowheadStart: 'none',\n\t\t\tarrowheadEnd: 'arrow',\n\t\t\trichText: toRichText(''),\n\t\t\tlabelPosition: 0.5,\n\t\t\tfont: 'draw',\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLArrowShape) {\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst debugGeom: Geometry2d[] = []\n\n\t\tconst bodyGeom =\n\t\t\tinfo.type === 'straight'\n\t\t\t\t? new Edge2d({\n\t\t\t\t\t\tstart: Vec.From(info.start.point),\n\t\t\t\t\t\tend: Vec.From(info.end.point),\n\t\t\t\t\t})\n\t\t\t\t: info.type === 'arc'\n\t\t\t\t\t? new Arc2d({\n\t\t\t\t\t\t\tcenter: Vec.Cast(info.handleArc.center),\n\t\t\t\t\t\t\tstart: Vec.Cast(info.start.point),\n\t\t\t\t\t\t\tend: Vec.Cast(info.end.point),\n\t\t\t\t\t\t\tsweepFlag: info.bodyArc.sweepFlag,\n\t\t\t\t\t\t\tlargeArcFlag: info.bodyArc.largeArcFlag,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Polyline2d({ points: info.route.points })\n\n\t\tlet labelGeom\n\t\tif (isEditing || !isEmptyRichText(shape.props.richText)) {\n\t\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\t\tif (debugFlags.debugGeometry.get()) {\n\t\t\t\tdebugGeom.push(...labelPosition.debugGeom)\n\t\t\t}\n\t\t\tlabelGeom = new Rectangle2d({\n\t\t\t\tx: labelPosition.box.x,\n\t\t\t\ty: labelPosition.box.y,\n\t\t\t\twidth: labelPosition.box.w,\n\t\t\t\theight: labelPosition.box.h,\n\t\t\t\tisFilled: true,\n\t\t\t\tisLabel: true,\n\t\t\t})\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: [...(labelGeom ? [bodyGeom, labelGeom] : [bodyGeom]), ...debugGeom],\n\t\t})\n\t}\n\n\toverride getHandles(shape: TLArrowShape): TLHandle[] {\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst handles: TLHandle[] = [\n\t\t\t{\n\t\t\t\tid: ArrowHandles.Start,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a1' as IndexKey,\n\t\t\t\tx: info.start.handle.x,\n\t\t\t\ty: info.start.handle.y,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ArrowHandles.End,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a3' as IndexKey,\n\t\t\t\tx: info.end.handle.x,\n\t\t\t\ty: info.end.handle.y,\n\t\t\t},\n\t\t]\n\n\t\tif (shape.props.kind === 'arc' && (info.type === 'straight' || info.type === 'arc')) {\n\t\t\thandles.push({\n\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\ttype: 'virtual',\n\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\tx: info.middle.x,\n\t\t\t\ty: info.middle.y,\n\t\t\t})\n\t\t}\n\n\t\tif (shape.props.kind === 'elbow' && info.type === 'elbow' && info.route.midpointHandle) {\n\t\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t\tconst segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)\n\t\t\tconst segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)\n\t\t\tconst segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()\n\n\t\t\tif (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {\n\t\t\t\thandles.push({\n\t\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\t\tx: info.route.midpointHandle.point.x,\n\t\t\t\t\ty: info.route.midpointHandle.point.y,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn handles\n\t}\n\n\toverride getText(shape: TLArrowShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride onHandleDrag(shape: TLArrowShape, info: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst handleId = info.handle.id as ArrowHandles\n\t\tswitch (handleId) {\n\t\t\tcase ArrowHandles.Middle:\n\t\t\t\tswitch (shape.props.kind) {\n\t\t\t\t\tcase 'arc':\n\t\t\t\t\t\treturn this.onArcMidpointHandleDrag(shape, info)\n\t\t\t\t\tcase 'elbow':\n\t\t\t\t\t\treturn this.onElbowMidpointHandleDrag(shape, info)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\texhaustiveSwitchError(shape.props.kind)\n\t\t\t\t}\n\t\t\tcase ArrowHandles.Start:\n\t\t\tcase ArrowHandles.End:\n\t\t\t\treturn this.onTerminalHandleDrag(shape, info, handleId)\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(handleId)\n\t\t}\n\t}\n\n\tprivate onArcMidpointHandleDrag(shape: TLArrowShape, { handle }: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// Bending the arrow...\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst delta = Vec.Sub(end, start)\n\t\tconst v = Vec.Per(delta)\n\n\t\tconst med = Vec.Med(end, start)\n\t\tconst A = Vec.Sub(med, v)\n\t\tconst B = Vec.Add(med, v)\n\n\t\tconst point = Vec.NearestPointOnLineSegment(A, B, handle, false)\n\t\tlet bend = Vec.Dist(point, med)\n\t\tif (Vec.Clockwise(point, end, med)) bend *= -1\n\t\treturn { id: shape.id, type: shape.type, props: { bend } }\n\t}\n\n\tprivate onElbowMidpointHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle }: TLHandleDragInfo<TLArrowShape>\n\t) {\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (info?.type !== 'elbow') return\n\n\t\tconst shapeToPageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst handlePagePoint = shapeToPageTransform.applyToPoint(handle)\n\t\tconst axisName = info.route.midpointHandle?.axis\n\t\tif (!axisName) return\n\t\tconst axis = ElbowArrowAxes[axisName]\n\n\t\tconst midRange = info.elbow[axis.midRange]\n\t\tif (!midRange) return\n\n\t\t// We're snapping against a list of parallel lines. The way we do this is to calculate the\n\t\t// angle of the line we're snapping to...\n\t\tlet angle = Vec.Angle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 0)),\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 1))\n\t\t)\n\t\tif (angle < 0) angle += Math.PI\n\n\t\t// ...then calculate the perpendicular distance from the origin to the (infinite) line in\n\t\t// question. This returns a signed distance - lines \"behind\" the origin are negative.\n\t\tconst handlePoint = perpDistanceToLineAngle(handlePagePoint, angle)\n\n\t\t// As we're only ever moving along one dimension, we can use this perpendicular distance for\n\t\t// all of our snapping calculations.\n\t\tconst loPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.lo, 0)),\n\t\t\tangle\n\t\t)\n\t\tconst hiPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.hi, 0)),\n\t\t\tangle\n\t\t)\n\n\t\t// we want to snap to certain points. the maximum distance at which a snap will occur is\n\t\t// relative to the zoom level:\n\t\tconst maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()\n\n\t\t// we snap to the midpoint of the range by default\n\t\tconst midPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(lerp(midRange.lo, midRange.hi, 0.5), 0)),\n\t\t\tangle\n\t\t)\n\n\t\tlet snapPoint = midPoint\n\t\tlet snapDistance = Math.abs(midPoint - handlePoint)\n\n\t\t// then we check all the other arrows that are on-screen.\n\t\tfor (const [snapAngle, snapLines] of getElbowArrowSnapLines(this.editor)) {\n\t\t\tconst { isParallel, isFlippedParallel } = anglesAreApproximatelyParallel(angle, snapAngle)\n\t\t\tif (isParallel || isFlippedParallel) {\n\t\t\t\tfor (const snapLine of snapLines) {\n\t\t\t\t\tconst doesShareStartIntersection =\n\t\t\t\t\t\tsnapLine.startBoundShapeId &&\n\t\t\t\t\t\t(snapLine.startBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.startBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tconst doesShareEndIntersection =\n\t\t\t\t\t\tsnapLine.endBoundShapeId &&\n\t\t\t\t\t\t(snapLine.endBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.endBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tif (!doesShareStartIntersection && !doesShareEndIntersection) continue\n\n\t\t\t\t\tconst point = isFlippedParallel ? -snapLine.perpDistance : snapLine.perpDistance\n\t\t\t\t\tconst distance = Math.abs(point - handlePoint)\n\t\t\t\t\tif (distance < snapDistance) {\n\t\t\t\t\t\tsnapPoint = point\n\t\t\t\t\t\tsnapDistance = distance\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (snapDistance > maxSnapDistance) {\n\t\t\tsnapPoint = handlePoint\n\t\t}\n\n\t\tconst newMid = clamp(invLerp(loPoint, hiPoint, snapPoint), 0, 1)\n\n\t\treturn {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tprops: {\n\t\t\t\telbowMidPoint: newMid,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate onTerminalHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle, isPrecise }: TLHandleDragInfo<TLArrowShape>,\n\t\thandleId: ArrowHandles.Start | ArrowHandles.End\n\t) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\n\t\tconst currentBinding = bindings[handleId]\n\n\t\tconst oppositeHandleId = handleId === ArrowHandles.Start ? ArrowHandles.End : ArrowHandles.Start\n\t\tconst oppositeBinding = bindings[oppositeHandleId]\n\n\t\tconst targetInfo = updateArrowTargetState({\n\t\t\teditor: this.editor,\n\t\t\tpointInPageSpace: this.editor.getShapePageTransform(shape.id)!.applyToPoint(handle),\n\t\t\tarrow: shape,\n\t\t\tisPrecise: isPrecise,\n\t\t\tcurrentBinding,\n\t\t\toppositeBinding,\n\t\t})\n\n\t\tif (!targetInfo) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\tremoveArrowBinding(this.editor, shape, handleId)\n\t\t\tconst newPoint = maybeSnapToGrid(new Vec(handle.x, handle.y), this.editor)\n\t\t\tupdate.props![handleId] = {\n\t\t\t\tx: newPoint.x,\n\t\t\t\ty: newPoint.y,\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\t// we've got a target! the handle is being dragged over a shape, bind to it\n\t\tconst bindingProps: TLArrowBindingProps = {\n\t\t\tterminal: handleId,\n\t\t\tnormalizedAnchor: targetInfo.normalizedAnchor,\n\t\t\tisPrecise: targetInfo.isPrecise,\n\t\t\tisExact: targetInfo.isExact,\n\t\t\tsnap: targetInfo.snap,\n\t\t}\n\n\t\tcreateOrUpdateArrowBinding(this.editor, shape, targetInfo.target.id, bindingProps)\n\n\t\tconst newBindings = getArrowBindings(this.editor, shape)\n\t\tif (newBindings.start && newBindings.end && newBindings.start.toId === newBindings.end.toId) {\n\t\t\tif (\n\t\t\t\tVec.Equals(newBindings.start.props.normalizedAnchor, newBindings.end.props.normalizedAnchor)\n\t\t\t) {\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newBindings.end.toId, {\n\t\t\t\t\t...newBindings.end.props,\n\t\t\t\t\tnormalizedAnchor: {\n\t\t\t\t\t\tx: newBindings.end.props.normalizedAnchor.x + 0.05,\n\t\t\t\t\t\ty: newBindings.end.props.normalizedAnchor.y,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn update\n\t}\n\n\toverride onTranslateStart(shape: TLArrowShape) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// ...if the user is dragging ONLY this arrow, for elbow shapes, we can't maintain the bindings well just yet so we remove them entirely\n\t\tif (shape.props.kind === 'elbow' && this.editor.getOnlySelectedShapeId() === shape.id) {\n\t\t\tconst info = getArrowInfo(this.editor, shape)\n\t\t\tif (!info) return\n\t\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\t\t\tif (bindings.start) {\n\t\t\t\tupdate.props!.start = { x: info.start.point.x, y: info.start.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'start')\n\t\t\t}\n\t\t\tif (bindings.end) {\n\t\t\t\tupdate.props!.end = { x: info.end.point.x, y: info.end.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'end')\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\tconst terminalsInArrowSpace = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t// If at least one bound shape is in the selection, do nothing;\n\t\t// If no bound shapes are in the selection, unbind any bound shapes\n\n\t\tconst selectedShapeIds = this.editor.getSelectedShapeIds()\n\n\t\tif (\n\t\t\t(bindings.start &&\n\t\t\t\t(selectedShapeIds.includes(bindings.start.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.start.toId))) ||\n\t\t\t(bindings.end &&\n\t\t\t\t(selectedShapeIds.includes(bindings.end.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.end.toId)))\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// When we start translating shapes, record where their bindings were in page space so we\n\t\t// can maintain them as we translate the arrow\n\t\tshapeAtTranslationStart.set(shape, {\n\t\t\tpagePosition: shapePageTransform.applyToPoint(shape),\n\t\t\tterminalBindings: mapObjectMapValues(terminalsInArrowSpace, (terminalName, point) => {\n\t\t\t\tconst binding = bindings[terminalName]\n\t\t\t\tif (!binding) return null\n\t\t\t\treturn {\n\t\t\t\t\tbinding,\n\t\t\t\t\tshapePosition: point,\n\t\t\t\t\tpagePosition: shapePageTransform.applyToPoint(point),\n\t\t\t\t}\n\t\t\t}),\n\t\t})\n\n\t\t// update arrow terminal bindings eagerly to make sure the arrows unbind nicely when translating\n\t\tif (bindings.start) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'start',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t\tshape = this.editor.getShape(shape.id) as TLArrowShape\n\t\t}\n\t\tif (bindings.end) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'end',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t}\n\n\t\tfor (const handleName of [ArrowHandles.Start, ArrowHandles.End] as const) {\n\t\t\tconst binding = bindings[handleName]\n\t\t\tif (!binding) continue\n\n\t\t\tthis.editor.updateBinding({\n\t\t\t\t...binding,\n\t\t\t\tprops: { ...binding.props, isPrecise: true },\n\t\t\t})\n\t\t}\n\n\t\treturn\n\t}\n\n\toverride onTranslate(initialShape: TLArrowShape, shape: TLArrowShape) {\n\t\tconst atTranslationStart = shapeAtTranslationStart.get(initialShape)\n\t\tif (!atTranslationStart) return\n\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst pageDelta = Vec.Sub(\n\t\t\tshapePageTransform.applyToPoint(shape),\n\t\t\tatTranslationStart.pagePosition\n\t\t)\n\n\t\tfor (const terminalBinding of Object.values(atTranslationStart.terminalBindings)) {\n\t\t\tif (!terminalBinding) continue\n\n\t\t\tconst newPagePoint = Vec.Add(terminalBinding.pagePosition, Vec.Mul(pageDelta, 0.5))\n\t\t\tconst newTarget = this.editor.getShapeAtPoint(newPagePoint, {\n\t\t\t\thitInside: true,\n\t\t\t\thitFrameInside: true,\n\t\t\t\tmargin: 0,\n\t\t\t\tfilter: (targetShape) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!targetShape.isLocked &&\n\t\t\t\t\t\tthis.editor.canBindShapes({ fromShape: shape, toShape: targetShape, binding: 'arrow' })\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (newTarget?.id === terminalBinding.binding.toId) {\n\t\t\t\tconst targetBounds = Box.ZeroFix(this.editor.getShapeGeometry(newTarget).bounds)\n\t\t\t\tconst pointInTargetSpace = this.editor.getPointInShapeSpace(newTarget, newPagePoint)\n\t\t\t\tconst normalizedAnchor = {\n\t\t\t\t\tx: (pointInTargetSpace.x - targetBounds.minX) / targetBounds.width,\n\t\t\t\t\ty: (pointInTargetSpace.y - targetBounds.minY) / targetBounds.height,\n\t\t\t\t}\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newTarget.id, {\n\t\t\t\t\t...terminalBinding.binding.props,\n\t\t\t\t\tnormalizedAnchor,\n\t\t\t\t\tisPrecise: true,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tremoveArrowBinding(this.editor, shape, terminalBinding.binding.props.terminal)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly _resizeInitialBindings = new WeakCache<TLArrowShape, TLArrowBindings>()\n\n\toverride onResize(shape: TLArrowShape, info: TLResizeInfo<TLArrowShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst bindings = this._resizeInitialBindings.get(shape, () =>\n\t\t\tgetArrowBindings(this.editor, shape)\n\t\t)\n\t\tconst terminals = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst { start, end } = structuredClone<TLArrowShape['props']>(shape.props)\n\t\tlet { bend } = shape.props\n\n\t\t// Rescale start handle if it's not bound to a shape\n\t\tif (!bindings.start) {\n\t\t\tstart.x = terminals.start.x * scaleX\n\t\t\tstart.y = terminals.start.y * scaleY\n\t\t}\n\n\t\t// Rescale end handle if it's not bound to a shape\n\t\tif (!bindings.end) {\n\t\t\tend.x = terminals.end.x * scaleX\n\t\t\tend.y = terminals.end.y * scaleY\n\t\t}\n\n\t\t// todo: we should only change the normalized anchor positions\n\t\t// of the shape's handles if the bound shape is also being resized\n\n\t\tconst mx = Math.abs(scaleX)\n\t\tconst my = Math.abs(scaleY)\n\n\t\tconst startNormalizedAnchor = bindings?.start\n\t\t\t? Vec.From(bindings.start.props.normalizedAnchor)\n\t\t\t: null\n\t\tconst endNormalizedAnchor = bindings?.end ? Vec.From(bindings.end.props.normalizedAnchor) : null\n\n\t\tif (scaleX < 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\t\t} else if (scaleX < 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t}\n\n\t\tif (bindings.start && startNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.start.toId, {\n\t\t\t\t...bindings.start.props,\n\t\t\t\tnormalizedAnchor: startNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\t\tif (bindings.end && endNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.end.toId, {\n\t\t\t\t...bindings.end.props,\n\t\t\t\tnormalizedAnchor: endNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\n\t\tconst next = {\n\t\t\tprops: {\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tbend,\n\t\t\t},\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onDoubleClickHandle(\n\t\tshape: TLArrowShape,\n\t\thandle: TLHandle\n\t): TLShapePartial<TLArrowShape> | void {\n\t\tswitch (handle.id) {\n\t\t\tcase ArrowHandles.Start: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadStart: shape.props.arrowheadStart === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ArrowHandles.End: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadEnd: shape.props.arrowheadEnd === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponent(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\tconst shouldDisplayHandles =\n\t\t\tthis.editor.isInAny(\n\t\t\t\t'select.idle',\n\t\t\t\t'select.pointing_handle',\n\t\t\t\t'select.dragging_handle',\n\t\t\t\t'select.translating',\n\t\t\t\t'arrow.dragging'\n\t\t\t) && !this.editor.getIsReadonly()\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info?.isValid) return null\n\n\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\tconst isSelected = shape.id === this.editor.getOnlySelectedShapeId()\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst showArrowLabel = isEditing || !isEmptyRichText(shape.props.richText)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer style={{ minWidth: 50, minHeight: 50 }}>\n\t\t\t\t\t<ArrowSvg\n\t\t\t\t\t\tshape={shape}\n\t\t\t\t\t\tshouldDisplayHandles={shouldDisplayHandles && onlySelectedShape?.id === shape.id}\n\t\t\t\t\t/>\n\t\t\t\t\t{shape.props.kind === 'elbow' && debugFlags.debugElbowArrows.get() && (\n\t\t\t\t\t\t<ElbowArrowDebug arrow={shape} />\n\t\t\t\t\t)}\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showArrowLabel && (\n\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\tshapeId={shape.id}\n\t\t\t\t\t\ttype=\"arrow\"\n\t\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\talign=\"middle\"\n\t\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\t\tlabelColor={getColorValue(theme, shape.props.labelColor, 'solid')}\n\t\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\t\ttextWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\tpadding={0}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isEditing = useIsEditing(shape.id)\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info) return null\n\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, info?.bindings)\n\t\tconst geometry = this.editor.getShapeGeometry<Group2d>(shape)\n\t\tconst bounds = geometry.bounds\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\t\tconst labelGeometry = isEditing || !isEmpty ? (geometry.children[1] as Rectangle2d) : null\n\n\t\tif (Vec.Equals(start, end)) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst includeClipPath =\n\t\t\t(as && info.start.arrowhead !== 'arrow') ||\n\t\t\t(ae && info.end.arrowhead !== 'arrow') ||\n\t\t\t!!labelGeometry\n\n\t\tconst labelBounds = labelGeometry ? labelGeometry.getBounds() : new Box(0, 0, 0, 0)\n\n\t\tif (isEditing && labelGeometry) {\n\t\t\treturn (\n\t\t\t\t<rect\n\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\trx={3.5 * shape.props.scale}\n\t\t\t\t\try={3.5 * shape.props.scale}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tconst clipStartArrowhead = !(\n\t\t\tinfo.start.arrowhead === 'none' || info.start.arrowhead === 'arrow'\n\t\t)\n\t\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\t\treturn (\n\t\t\t<g>\n\t\t\t\t{includeClipPath && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\t\thasText={!isEmpty}\n\t\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\t\tlabelBounds={labelBounds}\n\t\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t\tWebkitClipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* This rect needs to be here if we're creating a mask due to an svg quirk on Chrome */}\n\t\t\t\t\t{includeClipPath && (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx={bounds.minX - 100}\n\t\t\t\t\t\t\ty={bounds.minY - 100}\n\t\t\t\t\t\t\twidth={bounds.width + 200}\n\t\t\t\t\t\t\theight={bounds.height + 200}\n\t\t\t\t\t\t\topacity={0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{getArrowBodyPath(\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\tinfo,\n\t\t\t\t\t\tshape.props.dash === 'draw'\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tstyle: 'draw',\n\t\t\t\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tpasses: 1,\n\t\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\t\troundness: strokeWidth * 2,\n\t\t\t\t\t\t\t\t\tprops: { strokeWidth: undefined },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: { style: 'solid', strokeWidth: 1, props: { strokeWidth: undefined } }\n\t\t\t\t\t)}\n\t\t\t\t</g>\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t\t{labelGeometry && (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\t\trx={3.5}\n\t\t\t\t\t\try={3.5}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride onEditStart(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\t// editing text for the first time, so set the position to the default:\n\t\t\tconst labelPosition = getArrowLabelDefaultPosition(this.editor, shape)\n\t\t\tthis.editor.updateShape<TLArrowShape>({\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { labelPosition },\n\t\t\t})\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLArrowShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst theme = getDefaultColorTheme(ctx)\n\t\tconst scaleFactor = 1 / shape.props.scale\n\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<ArrowSvg shape={shape} shouldDisplayHandles={false} />\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\talign=\"middle\"\n\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\tlabelColor={getColorValue(theme, shape.props.labelColor, 'solid')}\n\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\tbounds={getArrowLabelPosition(this.editor, shape)\n\t\t\t\t\t\t.box.clone()\n\t\t\t\t\t\t.expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}\n\t\t\t\t\tpadding={0}\n\t\t\t\t\tshowTextOutline={true}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [\n\t\t\tgetFillDefForCanvas(),\n\t\t\t{\n\t\t\t\tkey: `arrow:dot`,\n\t\t\t\tcomponent: ArrowheadDotDef,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: `arrow:cross`,\n\t\t\t\tcomponent: ArrowheadCrossDef,\n\t\t\t},\n\t\t]\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLArrowShape,\n\t\tendShape: TLArrowShape,\n\t\tprogress: number\n\t): TLArrowShapeProps {\n\t\treturn {\n\t\t\t...(progress > 0.5 ? endShape.props : startShape.props),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, progress),\n\t\t\tstart: {\n\t\t\t\tx: lerp(startShape.props.start.x, endShape.props.start.x, progress),\n\t\t\t\ty: lerp(startShape.props.start.y, endShape.props.start.y, progress),\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tx: lerp(startShape.props.end.x, endShape.props.end.x, progress),\n\t\t\t\ty: lerp(startShape.props.end.y, endShape.props.end.y, progress),\n\t\t\t},\n\t\t\tbend: lerp(startShape.props.bend, endShape.props.bend, progress),\n\t\t\tlabelPosition: lerp(startShape.props.labelPosition, endShape.props.labelPosition, progress),\n\t\t}\n\t}\n}\n\nexport function getArrowLength(editor: Editor, shape: TLArrowShape): number {\n\tconst info = getArrowInfo(editor, shape)!\n\n\treturn info.type === 'straight'\n\t\t? Vec.Dist(info.start.handle, info.end.handle)\n\t\t: info.type === 'arc'\n\t\t\t? Math.abs(info.handleArc.length)\n\t\t\t: info.route.distance\n}\n\nconst ArrowSvg = track(function ArrowSvg({\n\tshape,\n\tshouldDisplayHandles,\n}: {\n\tshape: TLArrowShape\n\tshouldDisplayHandles: boolean\n}) {\n\tconst editor = useEditor()\n\tconst theme = useDefaultColorTheme()\n\tconst info = getArrowInfo(editor, shape)\n\tconst isForceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\treturn editor.getZoomLevel() < 0.2\n\t\t},\n\t\t[editor]\n\t)\n\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\tconst arrowheadDotId = useSharedSafeId('arrowhead-dot')\n\tconst arrowheadCrossId = useSharedSafeId('arrowhead-cross')\n\tconst isEditing = useIsEditing(shape.id)\n\tconst geometry = editor.getShapeGeometry(shape)\n\tif (!geometry) return null\n\tconst bounds = Box.ZeroFix(geometry.bounds)\n\tconst bindings = getArrowBindings(editor, shape)\n\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\tif (!info?.isValid) return null\n\n\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\tlet handlePath: null | React.JSX.Element = null\n\n\tif (shouldDisplayHandles && (bindings.start || bindings.end)) {\n\t\thandlePath = getArrowHandlePath(info, {\n\t\t\tstyle: 'dashed',\n\t\t\tstart: 'skip',\n\t\t\tend: 'skip',\n\t\t\tlengthRatio: 2.5,\n\t\t\tstrokeWidth: 2 / editor.getZoomLevel(),\n\t\t\tprops: {\n\t\t\t\tclassName: 'tl-arrow-hint',\n\t\t\t\tmarkerStart: bindings.start\n\t\t\t\t\t? bindings.start.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.start.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\tmarkerEnd: bindings.end\n\t\t\t\t\t? bindings.end.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.end.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\topacity: 0.16,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst labelPosition = getArrowLabelPosition(editor, shape)\n\n\tconst clipStartArrowhead = !(info.start.arrowhead === 'none' || info.start.arrowhead === 'arrow')\n\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\treturn (\n\t\t<>\n\t\t\t{/* Yep */}\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipPathId}>\n\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\thasText={isEditing || !isEmpty}\n\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\tlabelBounds={labelPosition.box}\n\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t/>\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\t\t\t<g\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tpointerEvents=\"none\"\n\t\t\t>\n\t\t\t\t{handlePath}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: `url(#${clipPathId})`,\n\t\t\t\t\t\tWebkitClipPath: `url(#${clipPathId})`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(bounds.minX - 100)}\n\t\t\t\t\t\ty={toDomPrecision(bounds.minY - 100)}\n\t\t\t\t\t\twidth={toDomPrecision(bounds.width + 200)}\n\t\t\t\t\t\theight={toDomPrecision(bounds.height + 200)}\n\t\t\t\t\t\topacity={0}\n\t\t\t\t\t/>\n\t\t\t\t\t{getArrowBodyPath(shape, info, {\n\t\t\t\t\t\tstyle: shape.props.dash,\n\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\tforceSolid: isForceSolid,\n\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t})}\n\t\t\t\t</g>\n\t\t\t\t{as && clipStartArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={as}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{ae && clipEndArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={ae}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t</g>\n\t\t</>\n\t)\n})\n\nfunction ArrowClipPath({\n\tradius,\n\thasText,\n\tbounds,\n\tlabelBounds,\n\tas,\n\tae,\n}: {\n\tradius: number\n\thasText: boolean\n\tbounds: Box\n\tlabelBounds: Box\n\tas: string\n\tae: string\n}) {\n\tconst path = useMemo(() => {\n\t\t// The direction in which we create the different path parts is important, as it determines what gets clipped.\n\t\t// See the description on the directions in the non-zero fill rule example:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule#nonzero\n\t\tconst path = new PathBuilder()\n\n\t\t// We create this one in the clockwise direction\n\t\tpath\n\t\t\t.moveTo(bounds.left - 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.bottom + 100)\n\t\t\t.lineTo(bounds.left - 100, bounds.bottom + 100)\n\t\t\t.close()\n\n\t\tif (hasText) {\n\t\t\t// We create this one in the counter-clockwise direction, which cuts out the label box\n\t\t\tpath\n\t\t\t\t.moveTo(labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.lineTo(labelBounds.left, labelBounds.bottom - radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left + radius, labelBounds.bottom)\n\t\t\t\t.lineTo(labelBounds.right - radius, labelBounds.bottom)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right, labelBounds.bottom - radius)\n\t\t\t\t.lineTo(labelBounds.right, labelBounds.top + radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right - radius, labelBounds.top)\n\t\t\t\t.lineTo(labelBounds.left + radius, labelBounds.top)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.close()\n\t\t}\n\n\t\treturn path.toD()\n\t}, [\n\t\tradius,\n\t\thasText,\n\t\tbounds.bottom,\n\t\tbounds.left,\n\t\tbounds.right,\n\t\tbounds.top,\n\t\tlabelBounds.bottom,\n\t\tlabelBounds.left,\n\t\tlabelBounds.right,\n\t\tlabelBounds.top,\n\t])\n\n\t// We also append the arrowhead paths to the clip path, so that we also clip the arrowheads\n\treturn <path d={`${path}${as}${ae}`} />\n}\n\nconst shapeAtTranslationStart = new WeakMap<\n\tTLArrowShape,\n\t{\n\t\tpagePosition: Vec\n\t\tterminalBindings: Record<\n\t\t\t'start' | 'end',\n\t\t\t{\n\t\t\t\tpagePosition: Vec\n\t\t\t\tshapePosition: Vec\n\t\t\t\tbinding: TLArrowBinding\n\t\t\t} | null\n\t\t>\n\t}\n>()\n\nfunction ArrowheadDotDef() {\n\tconst id = useSharedSafeId('arrowhead-dot')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"0\">\n\t\t\t<circle cx=\"3\" cy=\"3\" r=\"2\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\nfunction ArrowheadCrossDef() {\n\tconst id = useSharedSafeId('arrowhead-cross')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"auto\">\n\t\t\t<line x1=\"1.5\" y1=\"1.5\" x2=\"4.5\" y2=\"4.5\" strokeDasharray=\"100%\" />\n\t\t\t<line x1=\"1.5\" y1=\"4.5\" x2=\"4.5\" y2=\"1.5\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\n/**\n * Take 2 angles and return true if they are approximately parallel. Angle that point in the same\n * (or opposite) directions are considered parallel. This also handles wrap around - e.g. 0, \u03C0, and\n * 2\u03C0 are all considered parallel.\n */\nfunction anglesAreApproximatelyParallel(a: number, b: number, tolerance = 0.0001) {\n\tconst diff = Math.abs(a - b)\n\n\tconst isParallel = diff < tolerance\n\tconst isFlippedParallel = Math.abs(diff - Math.PI) < tolerance\n\tconst is360Parallel = Math.abs(diff - PI2) < tolerance\n\n\treturn { isParallel: isParallel || is360Parallel, isFlippedParallel }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ArrowHandles", "ArrowSvg", "path"]
7
7
  }
@@ -119,7 +119,7 @@ function ElbowArrowDebug({ arrow }) {
119
119
  y: fullBox.minY - 3,
120
120
  fontSize: 10,
121
121
  fill: "black",
122
- stroke: "var(--color-background)",
122
+ stroke: "var(--tl-color-background)",
123
123
  strokeWidth: 2,
124
124
  paintOrder: "stroke",
125
125
  children: label
@@ -132,7 +132,7 @@ function ElbowArrowDebug({ arrow }) {
132
132
  y: info.A.expanded.y,
133
133
  fontSize: 10,
134
134
  fill: "black",
135
- stroke: "var(--color-background)",
135
+ stroke: "var(--tl-color-background)",
136
136
  strokeWidth: 2,
137
137
  paintOrder: "stroke",
138
138
  children: [
@@ -149,7 +149,7 @@ function ElbowArrowDebug({ arrow }) {
149
149
  y: info.B.expanded.y,
150
150
  fontSize: 10,
151
151
  fill: "black",
152
- stroke: "var(--color-background)",
152
+ stroke: "var(--tl-color-background)",
153
153
  strokeWidth: 2,
154
154
  paintOrder: "stroke",
155
155
  children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx"],
4
- "sourcesContent": ["import { Box, TLArrowShape, useEditor, useValue, VecLike } from '@tldraw/editor'\nimport { SVGProps } from 'react'\nimport { getArrowBindings } from '../shared'\nimport { ElbowArrowEdge } from './definitions'\nimport { getElbowArrowInfo } from './getElbowArrowInfo'\n\nexport function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {\n\tconst editor = useEditor()\n\tconst info = useValue(\n\t\t'elbow arrow grid',\n\t\t() => {\n\t\t\ttry {\n\t\t\t\tconst info = getElbowArrowInfo(\n\t\t\t\t\teditor,\n\t\t\t\t\teditor.getShape(arrow.id)!,\n\t\t\t\t\tgetArrowBindings(editor, arrow)\n\t\t\t\t)\n\t\t\t\treturn info\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\t[editor, arrow.id]\n\t)\n\n\tif (!info) return null\n\n\tconst fullBox = Box.Common([info.A.original, info.B.original]).expandBy(50)\n\n\tconst label = info.route?.name ?? ''\n\n\tconst midPoint = info.route?.midpointHandle\n\n\treturn (\n\t\t<>\n\t\t\t{info.midX !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midX, y: fullBox.minY }}\n\t\t\t\t\tb={{ x: info.midX, y: fullBox.maxY }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{info.midY !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: fullBox.minX, y: info.midY }}\n\t\t\t\t\tb={{ x: fullBox.maxX, y: info.midY }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'x' && info.midXRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midXRange.lo, y: midPoint.point.y }}\n\t\t\t\t\tb={{ x: info.midXRange.hi, y: midPoint.point.y }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'y' && info.midYRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: midPoint.point.x, y: info.midYRange.lo }}\n\t\t\t\t\tb={{ x: midPoint.point.x, y: info.midYRange.hi }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<DebugBox box={info.A.original} stroke=\"orange\" />\n\t\t\t<DebugBox box={info.A.expanded} stroke=\"orange\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.A.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"orange\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\t\t\t<DebugBox box={info.B.original} stroke=\"lightskyblue\" />\n\t\t\t<DebugBox box={info.B.expanded} stroke=\"lightskyblue\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.B.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"lightskyblue\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\n\t\t\t<DebugEdge edge={info.A.edges.top} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.top} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.right} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.right} axis=\"y\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.bottom} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.bottom} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.left} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.left} axis=\"y\" stroke=\"lightskyblue\" />\n\n\t\t\t{info.route && <DebugRoute route={info.route.points} strokeWidth={10} />}\n\n\t\t\t<text\n\t\t\t\tx={fullBox.minX + 5}\n\t\t\t\ty={fullBox.minY - 3}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.A.expanded.x}\n\t\t\t\ty={info.A.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tA{info.route && `, ${info.route.aEdgePicking}`}\n\t\t\t\t{info.A.isPoint && `, point`}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.B.expanded.x}\n\t\t\t\ty={info.B.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tB{info.route && `, ${info.route.bEdgePicking}`}\n\t\t\t\t{info.B.isPoint && `, point`}\n\t\t\t</text>\n\t\t</>\n\t)\n}\n\nfunction DebugLine({ a, b, ...props }: { a: VecLike; b: VecLike } & SVGProps<SVGLineElement>) {\n\treturn (\n\t\t<line\n\t\t\tfill=\"none\"\n\t\t\tstrokeWidth={1}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstroke=\"green\"\n\t\t\tx1={a.x}\n\t\t\ty1={a.y}\n\t\t\tx2={b.x}\n\t\t\ty2={b.y}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugRoute({ route, ...props }: { route: VecLike[] } & SVGProps<SVGPolylineElement>) {\n\treturn (\n\t\t<polyline\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"darkorchid\"\n\t\t\tstrokeWidth={3}\n\t\t\topacity={0.5}\n\t\t\tpoints={route.map((r) => `${r.x},${r.y}`).join(' ')}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugEdge({\n\tedge,\n\taxis,\n\t...props\n}: {\n\tedge: ElbowArrowEdge | null\n\taxis: 'x' | 'y'\n} & Omit<SVGProps<SVGLineElement>, 'scale'>) {\n\tif (!edge || edge.expanded === null) return null\n\tconst vec = (vec: VecLike) => (axis === 'x' ? { x: vec.y, y: vec.x } : vec)\n\n\treturn (\n\t\t<g>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.min })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.max })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</g>\n\t)\n}\n\nfunction DebugBox({ box, ...props }: { box: Box } & SVGProps<SVGRectElement>) {\n\treturn (\n\t\t<rect\n\t\t\tx={box.minX}\n\t\t\ty={box.minY}\n\t\t\twidth={box.width}\n\t\t\theight={box.height}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstrokeWidth={1}\n\t\t\tfill=\"none\"\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n"],
4
+ "sourcesContent": ["import { Box, TLArrowShape, useEditor, useValue, VecLike } from '@tldraw/editor'\nimport { SVGProps } from 'react'\nimport { getArrowBindings } from '../shared'\nimport { ElbowArrowEdge } from './definitions'\nimport { getElbowArrowInfo } from './getElbowArrowInfo'\n\nexport function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {\n\tconst editor = useEditor()\n\tconst info = useValue(\n\t\t'elbow arrow grid',\n\t\t() => {\n\t\t\ttry {\n\t\t\t\tconst info = getElbowArrowInfo(\n\t\t\t\t\teditor,\n\t\t\t\t\teditor.getShape(arrow.id)!,\n\t\t\t\t\tgetArrowBindings(editor, arrow)\n\t\t\t\t)\n\t\t\t\treturn info\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\t[editor, arrow.id]\n\t)\n\n\tif (!info) return null\n\n\tconst fullBox = Box.Common([info.A.original, info.B.original]).expandBy(50)\n\n\tconst label = info.route?.name ?? ''\n\n\tconst midPoint = info.route?.midpointHandle\n\n\treturn (\n\t\t<>\n\t\t\t{info.midX !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midX, y: fullBox.minY }}\n\t\t\t\t\tb={{ x: info.midX, y: fullBox.maxY }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{info.midY !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: fullBox.minX, y: info.midY }}\n\t\t\t\t\tb={{ x: fullBox.maxX, y: info.midY }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'x' && info.midXRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midXRange.lo, y: midPoint.point.y }}\n\t\t\t\t\tb={{ x: info.midXRange.hi, y: midPoint.point.y }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'y' && info.midYRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: midPoint.point.x, y: info.midYRange.lo }}\n\t\t\t\t\tb={{ x: midPoint.point.x, y: info.midYRange.hi }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<DebugBox box={info.A.original} stroke=\"orange\" />\n\t\t\t<DebugBox box={info.A.expanded} stroke=\"orange\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.A.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"orange\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\t\t\t<DebugBox box={info.B.original} stroke=\"lightskyblue\" />\n\t\t\t<DebugBox box={info.B.expanded} stroke=\"lightskyblue\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.B.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"lightskyblue\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\n\t\t\t<DebugEdge edge={info.A.edges.top} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.top} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.right} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.right} axis=\"y\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.bottom} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.bottom} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.left} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.left} axis=\"y\" stroke=\"lightskyblue\" />\n\n\t\t\t{info.route && <DebugRoute route={info.route.points} strokeWidth={10} />}\n\n\t\t\t<text\n\t\t\t\tx={fullBox.minX + 5}\n\t\t\t\ty={fullBox.minY - 3}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.A.expanded.x}\n\t\t\t\ty={info.A.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tA{info.route && `, ${info.route.aEdgePicking}`}\n\t\t\t\t{info.A.isPoint && `, point`}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.B.expanded.x}\n\t\t\t\ty={info.B.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tB{info.route && `, ${info.route.bEdgePicking}`}\n\t\t\t\t{info.B.isPoint && `, point`}\n\t\t\t</text>\n\t\t</>\n\t)\n}\n\nfunction DebugLine({ a, b, ...props }: { a: VecLike; b: VecLike } & SVGProps<SVGLineElement>) {\n\treturn (\n\t\t<line\n\t\t\tfill=\"none\"\n\t\t\tstrokeWidth={1}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstroke=\"green\"\n\t\t\tx1={a.x}\n\t\t\ty1={a.y}\n\t\t\tx2={b.x}\n\t\t\ty2={b.y}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugRoute({ route, ...props }: { route: VecLike[] } & SVGProps<SVGPolylineElement>) {\n\treturn (\n\t\t<polyline\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"darkorchid\"\n\t\t\tstrokeWidth={3}\n\t\t\topacity={0.5}\n\t\t\tpoints={route.map((r) => `${r.x},${r.y}`).join(' ')}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugEdge({\n\tedge,\n\taxis,\n\t...props\n}: {\n\tedge: ElbowArrowEdge | null\n\taxis: 'x' | 'y'\n} & Omit<SVGProps<SVGLineElement>, 'scale'>) {\n\tif (!edge || edge.expanded === null) return null\n\tconst vec = (vec: VecLike) => (axis === 'x' ? { x: vec.y, y: vec.x } : vec)\n\n\treturn (\n\t\t<g>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.min })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.max })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</g>\n\t)\n}\n\nfunction DebugBox({ box, ...props }: { box: Box } & SVGProps<SVGRectElement>) {\n\treturn (\n\t\t<rect\n\t\t\tx={box.minX}\n\t\t\ty={box.minY}\n\t\t\twidth={box.width}\n\t\t\theight={box.height}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstrokeWidth={1}\n\t\t\tfill=\"none\"\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["info", "vec"]
7
7
  }
@@ -214,7 +214,7 @@ function DrawShapeSvg({ shape, zoomOverride }) {
214
214
  {
215
215
  d: (0, import_svgInk.svgInk)(allPointsFromSegments, options),
216
216
  strokeLinecap: "round",
217
- fill: theme[shape.props.color].solid
217
+ fill: (0, import_editor.getColorValue)(theme, shape.props.color, "solid")
218
218
  }
219
219
  )
220
220
  ] });
@@ -238,8 +238,8 @@ function DrawShapeSvg({ shape, zoomOverride }) {
238
238
  {
239
239
  d: solidStrokePath,
240
240
  strokeLinecap: "round",
241
- fill: isDot ? theme[shape.props.color].solid : "none",
242
- stroke: theme[shape.props.color].solid,
241
+ fill: isDot ? (0, import_editor.getColorValue)(theme, shape.props.color, "solid") : "none",
242
+ stroke: (0, import_editor.getColorValue)(theme, shape.props.color, "solid"),
243
243
  strokeWidth: sw,
244
244
  strokeDasharray: isDot ? "none" : (0, import_getPath.getDrawShapeStrokeDashArray)(shape, sw, dotAdjustment),
245
245
  strokeDashoffset: "0"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/draw/DrawShapeUtil.tsx"],
4
- "sourcesContent": ["import {\n\tBox,\n\tCircle2d,\n\tPolygon2d,\n\tPolyline2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLDrawShape,\n\tTLDrawShapeProps,\n\tTLDrawShapeSegment,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVecLike,\n\tdrawShapeMigrations,\n\tdrawShapeProps,\n\tlast,\n\tlerp,\n\trng,\n\ttoFixed,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { STROKE_SIZES } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { getStrokePoints } from '../shared/freehand/getStrokePoints'\nimport { getSvgPathFromStrokePoints } from '../shared/freehand/svg'\nimport { svgInk } from '../shared/freehand/svgInk'\nimport { interpolateSegments } from '../shared/interpolate-props'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getDrawShapeStrokeDashArray, getFreehandOptions, getPointsFromSegments } from './getPath'\n\n/** @public */\nexport interface DrawShapeOptions {\n\t/**\n\t * The maximum number of points in a line before the draw tool will begin a new shape.\n\t * A higher number will lead to poor performance while drawing very long lines.\n\t */\n\treadonly maxPointsPerShape: number\n}\n\n/** @public */\nexport class DrawShapeUtil extends ShapeUtil<TLDrawShape> {\n\tstatic override type = 'draw' as const\n\tstatic override props = drawShapeProps\n\tstatic override migrations = drawShapeMigrations\n\n\toverride options: DrawShapeOptions = {\n\t\tmaxPointsPerShape: 600,\n\t}\n\n\toverride hideResizeHandles(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideRotateHandle(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideSelectionBoundsFg(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\n\toverride getDefaultProps(): TLDrawShape['props'] {\n\t\treturn {\n\t\t\tsegments: [],\n\t\t\tcolor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tisComplete: false,\n\t\t\tisClosed: false,\n\t\t\tisPen: false,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLDrawShape) {\n\t\tconst points = getPointsFromSegments(shape.props.segments)\n\n\t\tconst sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// A dot\n\t\tif (shape.props.segments.length === 1) {\n\t\t\tconst box = Box.FromPoints(points)\n\t\t\tif (box.width < sw * 2 && box.height < sw * 2) {\n\t\t\t\treturn new Circle2d({\n\t\t\t\t\tx: -sw,\n\t\t\t\t\ty: -sw,\n\t\t\t\t\tradius: sw,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst strokePoints = getStrokePoints(\n\t\t\tpoints,\n\t\t\tgetFreehandOptions(shape.props, sw, shape.props.isPen, true)\n\t\t).map((p) => p.point)\n\n\t\t// A closed draw stroke\n\t\tif (shape.props.isClosed && strokePoints.length > 2) {\n\t\t\treturn new Polygon2d({\n\t\t\t\tpoints: strokePoints,\n\t\t\t\tisFilled: shape.props.fill !== 'none',\n\t\t\t})\n\t\t}\n\n\t\tif (strokePoints.length === 1) {\n\t\t\treturn new Circle2d({\n\t\t\t\tx: -sw,\n\t\t\t\ty: -sw,\n\t\t\t\tradius: sw,\n\t\t\t\tisFilled: true,\n\t\t\t})\n\t\t}\n\n\t\t// An open draw stroke\n\t\treturn new Polyline2d({\n\t\t\tpoints: strokePoints,\n\t\t})\n\t}\n\n\tcomponent(shape: TLDrawShape) {\n\t\treturn (\n\t\t\t<SVGContainer>\n\t\t\t\t<DrawShapeSvg shape={shape} />\n\t\t\t</SVGContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLDrawShape) {\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst forceSolid = useValue(\n\t\t\t'force solid',\n\t\t\t() => {\n\t\t\t\tconst zoomLevel = this.editor.getZoomLevel()\n\t\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t\t},\n\t\t\t[this.editor, sw]\n\t\t)\n\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (sw / 6)\n\t\t}\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, true)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\treturn <path d={solidStrokePath} />\n\t}\n\n\toverride toSvg(shape: TLDrawShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst scaleFactor = 1 / shape.props.scale\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<DrawShapeSvg shape={shape} zoomOverride={1} />\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(shape: TLDrawShape, info: TLResizeInfo<TLDrawShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst newSegments: TLDrawShapeSegment[] = []\n\n\t\tfor (const segment of shape.props.segments) {\n\t\t\tnewSegments.push({\n\t\t\t\t...segment,\n\t\t\t\tpoints: segment.points.map(({ x, y, z }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: toFixed(scaleX * x),\n\t\t\t\t\t\ty: toFixed(scaleY * y),\n\t\t\t\t\t\tz,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\tprops: {\n\t\t\t\tsegments: newSegments,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride expandSelectionOutlinePx(shape: TLDrawShape): number {\n\t\tconst multiplier = shape.props.dash === 'draw' ? 1.6 : 1\n\t\treturn ((STROKE_SIZES[shape.props.size] * multiplier) / 2) * shape.props.scale\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLDrawShape,\n\t\tendShape: TLDrawShape,\n\t\tt: number\n\t): TLDrawShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tsegments: interpolateSegments(startShape.props.segments, endShape.props.segments, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\nfunction getDot(point: VecLike, sw: number) {\n\tconst r = (sw + 1) * 0.5\n\treturn `M ${point.x} ${point.y} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${\n\t\tr * 2\n\t},0`\n}\n\nfunction getIsDot(shape: TLDrawShape) {\n\treturn shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2\n}\n\nfunction DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverride?: number }) {\n\tconst theme = useDefaultColorTheme()\n\tconst editor = useEditor()\n\n\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\tconst forceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t},\n\t\t[editor, sw, zoomOverride]\n\t)\n\n\tconst dotAdjustment = useValue(\n\t\t'dot adjustment',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\t// If we're zoomed way out (10%), then we need to make the dotted line go to 9 instead 0.1\n\t\t\t// Chrome doesn't render anything otherwise.\n\t\t\treturn zoomLevel < 0.2 ? 0 : 0.1\n\t\t},\n\t\t[editor, zoomOverride]\n\t)\n\n\tif (\n\t\t!forceSolid &&\n\t\t!shape.props.isPen &&\n\t\tshape.props.dash === 'draw' &&\n\t\tallPointsFromSegments.length === 1\n\t) {\n\t\tsw += rng(shape.id)() * (sw / 6)\n\t}\n\n\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, forceSolid)\n\n\tif (!forceSolid && shape.props.dash === 'draw') {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{shape.props.isClosed && shape.props.fill && allPointsFromSegments.length > 1 ? (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\td={getSvgPathFromStrokePoints(\n\t\t\t\t\t\t\tgetStrokePoints(allPointsFromSegments, options),\n\t\t\t\t\t\t\tshape.props.isClosed\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<path\n\t\t\t\t\td={svgInk(allPointsFromSegments, options)}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tfill={theme[shape.props.color].solid}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\tconst isDot = strokePoints.length < 2\n\tconst solidStrokePath = isDot\n\t\t? getDot(allPointsFromSegments[0], 0)\n\t\t: getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\n\treturn (\n\t\t<>\n\t\t\t<ShapeFill\n\t\t\t\td={solidStrokePath}\n\t\t\t\ttheme={theme}\n\t\t\t\tcolor={shape.props.color}\n\t\t\t\tfill={isDot || shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\tscale={shape.props.scale}\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td={solidStrokePath}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tfill={isDot ? theme[shape.props.color].solid : 'none'}\n\t\t\t\tstroke={theme[shape.props.color].solid}\n\t\t\t\tstrokeWidth={sw}\n\t\t\t\tstrokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}\n\t\t\t\tstrokeDashoffset=\"0\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tBox,\n\tCircle2d,\n\tPolygon2d,\n\tPolyline2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLDrawShape,\n\tTLDrawShapeProps,\n\tTLDrawShapeSegment,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVecLike,\n\tdrawShapeMigrations,\n\tdrawShapeProps,\n\tgetColorValue,\n\tlast,\n\tlerp,\n\trng,\n\ttoFixed,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { STROKE_SIZES } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { getStrokePoints } from '../shared/freehand/getStrokePoints'\nimport { getSvgPathFromStrokePoints } from '../shared/freehand/svg'\nimport { svgInk } from '../shared/freehand/svgInk'\nimport { interpolateSegments } from '../shared/interpolate-props'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getDrawShapeStrokeDashArray, getFreehandOptions, getPointsFromSegments } from './getPath'\n\n/** @public */\nexport interface DrawShapeOptions {\n\t/**\n\t * The maximum number of points in a line before the draw tool will begin a new shape.\n\t * A higher number will lead to poor performance while drawing very long lines.\n\t */\n\treadonly maxPointsPerShape: number\n}\n\n/** @public */\nexport class DrawShapeUtil extends ShapeUtil<TLDrawShape> {\n\tstatic override type = 'draw' as const\n\tstatic override props = drawShapeProps\n\tstatic override migrations = drawShapeMigrations\n\n\toverride options: DrawShapeOptions = {\n\t\tmaxPointsPerShape: 600,\n\t}\n\n\toverride hideResizeHandles(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideRotateHandle(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideSelectionBoundsFg(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\n\toverride getDefaultProps(): TLDrawShape['props'] {\n\t\treturn {\n\t\t\tsegments: [],\n\t\t\tcolor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tisComplete: false,\n\t\t\tisClosed: false,\n\t\t\tisPen: false,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLDrawShape) {\n\t\tconst points = getPointsFromSegments(shape.props.segments)\n\n\t\tconst sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// A dot\n\t\tif (shape.props.segments.length === 1) {\n\t\t\tconst box = Box.FromPoints(points)\n\t\t\tif (box.width < sw * 2 && box.height < sw * 2) {\n\t\t\t\treturn new Circle2d({\n\t\t\t\t\tx: -sw,\n\t\t\t\t\ty: -sw,\n\t\t\t\t\tradius: sw,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst strokePoints = getStrokePoints(\n\t\t\tpoints,\n\t\t\tgetFreehandOptions(shape.props, sw, shape.props.isPen, true)\n\t\t).map((p) => p.point)\n\n\t\t// A closed draw stroke\n\t\tif (shape.props.isClosed && strokePoints.length > 2) {\n\t\t\treturn new Polygon2d({\n\t\t\t\tpoints: strokePoints,\n\t\t\t\tisFilled: shape.props.fill !== 'none',\n\t\t\t})\n\t\t}\n\n\t\tif (strokePoints.length === 1) {\n\t\t\treturn new Circle2d({\n\t\t\t\tx: -sw,\n\t\t\t\ty: -sw,\n\t\t\t\tradius: sw,\n\t\t\t\tisFilled: true,\n\t\t\t})\n\t\t}\n\n\t\t// An open draw stroke\n\t\treturn new Polyline2d({\n\t\t\tpoints: strokePoints,\n\t\t})\n\t}\n\n\tcomponent(shape: TLDrawShape) {\n\t\treturn (\n\t\t\t<SVGContainer>\n\t\t\t\t<DrawShapeSvg shape={shape} />\n\t\t\t</SVGContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLDrawShape) {\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst forceSolid = useValue(\n\t\t\t'force solid',\n\t\t\t() => {\n\t\t\t\tconst zoomLevel = this.editor.getZoomLevel()\n\t\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t\t},\n\t\t\t[this.editor, sw]\n\t\t)\n\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (sw / 6)\n\t\t}\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, true)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\treturn <path d={solidStrokePath} />\n\t}\n\n\toverride toSvg(shape: TLDrawShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst scaleFactor = 1 / shape.props.scale\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<DrawShapeSvg shape={shape} zoomOverride={1} />\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(shape: TLDrawShape, info: TLResizeInfo<TLDrawShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst newSegments: TLDrawShapeSegment[] = []\n\n\t\tfor (const segment of shape.props.segments) {\n\t\t\tnewSegments.push({\n\t\t\t\t...segment,\n\t\t\t\tpoints: segment.points.map(({ x, y, z }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: toFixed(scaleX * x),\n\t\t\t\t\t\ty: toFixed(scaleY * y),\n\t\t\t\t\t\tz,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\tprops: {\n\t\t\t\tsegments: newSegments,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride expandSelectionOutlinePx(shape: TLDrawShape): number {\n\t\tconst multiplier = shape.props.dash === 'draw' ? 1.6 : 1\n\t\treturn ((STROKE_SIZES[shape.props.size] * multiplier) / 2) * shape.props.scale\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLDrawShape,\n\t\tendShape: TLDrawShape,\n\t\tt: number\n\t): TLDrawShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tsegments: interpolateSegments(startShape.props.segments, endShape.props.segments, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\nfunction getDot(point: VecLike, sw: number) {\n\tconst r = (sw + 1) * 0.5\n\treturn `M ${point.x} ${point.y} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${\n\t\tr * 2\n\t},0`\n}\n\nfunction getIsDot(shape: TLDrawShape) {\n\treturn shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2\n}\n\nfunction DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverride?: number }) {\n\tconst theme = useDefaultColorTheme()\n\tconst editor = useEditor()\n\n\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\tconst forceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t},\n\t\t[editor, sw, zoomOverride]\n\t)\n\n\tconst dotAdjustment = useValue(\n\t\t'dot adjustment',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\t// If we're zoomed way out (10%), then we need to make the dotted line go to 9 instead 0.1\n\t\t\t// Chrome doesn't render anything otherwise.\n\t\t\treturn zoomLevel < 0.2 ? 0 : 0.1\n\t\t},\n\t\t[editor, zoomOverride]\n\t)\n\n\tif (\n\t\t!forceSolid &&\n\t\t!shape.props.isPen &&\n\t\tshape.props.dash === 'draw' &&\n\t\tallPointsFromSegments.length === 1\n\t) {\n\t\tsw += rng(shape.id)() * (sw / 6)\n\t}\n\n\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, forceSolid)\n\n\tif (!forceSolid && shape.props.dash === 'draw') {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{shape.props.isClosed && shape.props.fill && allPointsFromSegments.length > 1 ? (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\td={getSvgPathFromStrokePoints(\n\t\t\t\t\t\t\tgetStrokePoints(allPointsFromSegments, options),\n\t\t\t\t\t\t\tshape.props.isClosed\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<path\n\t\t\t\t\td={svgInk(allPointsFromSegments, options)}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tfill={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\tconst isDot = strokePoints.length < 2\n\tconst solidStrokePath = isDot\n\t\t? getDot(allPointsFromSegments[0], 0)\n\t\t: getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\n\treturn (\n\t\t<>\n\t\t\t<ShapeFill\n\t\t\t\td={solidStrokePath}\n\t\t\t\ttheme={theme}\n\t\t\t\tcolor={shape.props.color}\n\t\t\t\tfill={isDot || shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\tscale={shape.props.scale}\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td={solidStrokePath}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tfill={isDot ? getColorValue(theme, shape.props.color, 'solid') : 'none'}\n\t\t\t\tstroke={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\tstrokeWidth={sw}\n\t\t\t\tstrokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}\n\t\t\t\tstrokeDashoffset=\"0\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -117,7 +117,7 @@ class EmbedShapeUtil extends import_editor.BaseBoxShapeUtil {
117
117
  border: 0,
118
118
  boxShadow: (0, import_rotated_box_shadow.getRotatedBoxShadow)(pageRotation),
119
119
  borderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,
120
- background: embedInfo?.definition.backgroundColor ?? "var(--color-background)",
120
+ background: embedInfo?.definition.backgroundColor ?? "var(--tl-color-background)",
121
121
  width: w,
122
122
  height: h
123
123
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/embed/EmbedShapeUtil.tsx"],
4
- "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n\tBaseBoxShapeUtil,\n\tHTMLContainer,\n\tTLEmbedShape,\n\tTLEmbedShapeProps,\n\tTLResizeInfo,\n\tembedShapeMigrations,\n\tembedShapeProps,\n\tlerp,\n\tresizeBox,\n\ttoDomPrecision,\n\tuseIsEditing,\n\tuseSvgExportContext,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport {\n\tDEFAULT_EMBED_DEFINITIONS,\n\tEmbedDefinition,\n\tTLEmbedDefinition,\n\tTLEmbedShapePermissions,\n\tembedShapePermissionDefaults,\n} from '../../defaultEmbedDefinitions'\nimport { TLEmbedResult, getEmbedInfo } from '../../utils/embeds/embeds'\nimport { getRotatedBoxShadow } from '../shared/rotated-box-shadow'\n\nconst getSandboxPermissions = (permissions: TLEmbedShapePermissions) => {\n\treturn Object.entries(permissions)\n\t\t.filter(([_perm, isEnabled]) => isEnabled)\n\t\t.map(([perm]) => perm)\n\t\t.join(' ')\n}\n\n/** @public */\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {\n\tstatic override type = 'embed' as const\n\tstatic override props = embedShapeProps\n\tstatic override migrations = embedShapeMigrations\n\tprivate static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS\n\n\tstatic setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {\n\t\tEmbedShapeUtil.embedDefinitions = embedDefinitions\n\t}\n\n\tgetEmbedDefinitions(): readonly TLEmbedDefinition[] {\n\t\treturn EmbedShapeUtil.embedDefinitions\n\t}\n\n\tgetEmbedDefinition(url: string): TLEmbedResult {\n\t\treturn getEmbedInfo(EmbedShapeUtil.embedDefinitions, url)\n\t}\n\n\toverride getText(shape: TLEmbedShape) {\n\t\treturn shape.props.url\n\t}\n\n\toverride getAriaDescriptor(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.title\n\t}\n\n\toverride hideSelectionBoundsFg(shape: TLEmbedShape) {\n\t\treturn !this.canResize(shape)\n\t}\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canResize(shape: TLEmbedShape) {\n\t\treturn !!this.getEmbedDefinition(shape.props.url)?.definition?.doesResize\n\t}\n\toverride canEditInReadonly() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLEmbedShape['props'] {\n\t\treturn {\n\t\t\tw: 300,\n\t\t\th: 300,\n\t\t\turl: '',\n\t\t}\n\t}\n\n\toverride isAspectRatioLocked(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.isAspectRatioLocked ?? false\n\t}\n\n\toverride onResize(shape: TLEmbedShape, info: TLResizeInfo<TLEmbedShape>) {\n\t\tconst isAspectRatioLocked = this.isAspectRatioLocked(shape)\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\tlet minWidth = embedInfo?.definition.minWidth ?? 200\n\t\tlet minHeight = embedInfo?.definition.minHeight ?? 200\n\t\tif (isAspectRatioLocked) {\n\t\t\t// Enforce aspect ratio\n\t\t\t// Neither the width or height can be less than 200\n\t\t\tconst aspectRatio = shape.props.w / shape.props.h\n\t\t\tif (aspectRatio > 1) {\n\t\t\t\t// Landscape\n\t\t\t\tminWidth *= aspectRatio\n\t\t\t} else {\n\t\t\t\t// Portrait\n\t\t\t\tminHeight /= aspectRatio\n\t\t\t}\n\t\t}\n\n\t\treturn resizeBox(shape, info, { minWidth, minHeight })\n\t}\n\n\toverride component(shape: TLEmbedShape) {\n\t\tconst svgExport = useSvgExportContext()\n\t\tconst { w, h, url } = shape.props\n\t\tconst isEditing = useIsEditing(shape.id)\n\n\t\tconst embedInfo = this.getEmbedDefinition(url)\n\n\t\tconst isHoveringWhileEditingSameShape = useValue(\n\t\t\t'is hovering',\n\t\t\t() => {\n\t\t\t\tconst { editingShapeId, hoveredShapeId } = this.editor.getCurrentPageState()\n\n\t\t\t\tif (editingShapeId && hoveredShapeId !== editingShapeId) {\n\t\t\t\t\tconst editingShape = this.editor.getShape(editingShapeId)\n\t\t\t\t\tif (editingShape && this.editor.isShapeOfType<TLEmbedShape>(editingShape, 'embed')) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t\t[]\n\t\t)\n\n\t\tconst pageRotation = this.editor.getShapePageTransform(shape)!.rotation()\n\n\t\tif (svgExport) {\n\t\t\t// for SVG exports, we show a blank embed\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor ?? 'var(--color-background)',\n\t\t\t\t\t\t\twidth: w,\n\t\t\t\t\t\t\theight: h,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst isInteractive = isEditing || isHoveringWhileEditingSameShape\n\n\t\t// Prevent nested embedding of tldraw\n\t\tconst isIframe =\n\t\t\ttypeof window !== 'undefined' && (window !== window.top || window.self !== window.parent)\n\t\tif (isIframe && embedInfo?.definition.type === 'tldraw') return null\n\n\t\tif (embedInfo?.definition.type === 'github_gist') {\n\t\t\tconst idFromGistUrl = embedInfo.url.split('/').pop()\n\t\t\tif (!idFromGistUrl) throw Error('No gist id!')\n\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<Gist\n\t\t\t\t\t\tid={idFromGistUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)!}\n\t\t\t\t\t\theight={toDomPrecision(h)!}\n\t\t\t\t\t\tisInteractive={isInteractive}\n\t\t\t\t\t\tpageRotation={pageRotation}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst sandbox = getSandboxPermissions({\n\t\t\t...embedShapePermissionDefaults,\n\t\t\t...(embedInfo?.definition.overridePermissions ?? {}),\n\t\t})\n\n\t\treturn (\n\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t{embedInfo?.definition ? (\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tsandbox={sandbox}\n\t\t\t\t\t\tsrc={embedInfo.embedUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)}\n\t\t\t\t\t\theight={toDomPrecision(h)}\n\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t\t\t\tframeBorder=\"0\"\n\t\t\t\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\t\t\t\ttabIndex={isEditing ? 0 : -1}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tpointerEvents: isInteractive ? 'auto' : 'none',\n\t\t\t\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</HTMLContainer>\n\t\t)\n\t}\n\n\toverride indicator(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn (\n\t\t\t<rect\n\t\t\t\twidth={toDomPrecision(shape.props.w)}\n\t\t\t\theight={toDomPrecision(shape.props.h)}\n\t\t\t\trx={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t\try={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t/>\n\t\t)\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLEmbedShape,\n\t\tendShape: TLEmbedShape,\n\t\tt: number\n\t): TLEmbedShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t}\n\t}\n}\n\nfunction Gist({\n\tid,\n\tisInteractive,\n\twidth,\n\theight,\n\tstyle,\n\tpageRotation,\n}: {\n\tid: string\n\tisInteractive: boolean\n\twidth: number\n\theight: number\n\tpageRotation: number\n\tstyle?: React.CSSProperties\n}) {\n\t// Security warning:\n\t// Gists allow adding .json extensions to the URL which return JSONP.\n\t// Furthermore, the JSONP can include callbacks that execute arbitrary JavaScript.\n\t// It _is_ sandboxed by the iframe but we still want to disable it nonetheless.\n\t// We restrict the id to only allow hexdecimal characters to prevent this.\n\t// Read more:\n\t// https://github.com/bhaveshk90/Content-Security-Policy-CSP-Bypass-Techniques\n\t// https://github.com/renniepak/CSPBypass\n\tif (!id.match(/^[0-9a-f]+$/)) throw Error('No gist id!')\n\n\treturn (\n\t\t<iframe\n\t\t\tclassName=\"tl-embed\"\n\t\t\tdraggable={false}\n\t\t\twidth={toDomPrecision(width)}\n\t\t\theight={toDomPrecision(height)}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tframeBorder=\"0\"\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tscrolling=\"no\"\n\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\ttabIndex={isInteractive ? 0 : -1}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\tpointerEvents: isInteractive ? 'all' : 'none',\n\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t}}\n\t\t\tsrcDoc={`\n\t\t\t<html>\n\t\t\t\t<head>\n\t\t\t\t\t<base target=\"_blank\">\n\t\t\t\t</head>\n\t\t\t\t<body>\n\t\t\t\t\t<script src=${`https://gist.github.com/${id}.js`}></script>\n\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t* { margin: 0px; }\n\t\t\t\t\t\ttable { height: 100%; background-color: red; }\n\t\t\t\t\t\t.gist { background-color: none; height: 100%; }\n\t\t\t\t\t\t.gist .gist-file { height: calc(100vh - 2px); padding: 0px; display: grid; grid-template-rows: 1fr auto; }\n\t\t\t\t\t</style>\n\t\t\t\t</body>\n\t\t\t</html>`}\n\t\t/>\n\t)\n}\n"],
4
+ "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n\tBaseBoxShapeUtil,\n\tHTMLContainer,\n\tTLEmbedShape,\n\tTLEmbedShapeProps,\n\tTLResizeInfo,\n\tembedShapeMigrations,\n\tembedShapeProps,\n\tlerp,\n\tresizeBox,\n\ttoDomPrecision,\n\tuseIsEditing,\n\tuseSvgExportContext,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport {\n\tDEFAULT_EMBED_DEFINITIONS,\n\tEmbedDefinition,\n\tTLEmbedDefinition,\n\tTLEmbedShapePermissions,\n\tembedShapePermissionDefaults,\n} from '../../defaultEmbedDefinitions'\nimport { TLEmbedResult, getEmbedInfo } from '../../utils/embeds/embeds'\nimport { getRotatedBoxShadow } from '../shared/rotated-box-shadow'\n\nconst getSandboxPermissions = (permissions: TLEmbedShapePermissions) => {\n\treturn Object.entries(permissions)\n\t\t.filter(([_perm, isEnabled]) => isEnabled)\n\t\t.map(([perm]) => perm)\n\t\t.join(' ')\n}\n\n/** @public */\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {\n\tstatic override type = 'embed' as const\n\tstatic override props = embedShapeProps\n\tstatic override migrations = embedShapeMigrations\n\tprivate static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS\n\n\tstatic setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {\n\t\tEmbedShapeUtil.embedDefinitions = embedDefinitions\n\t}\n\n\tgetEmbedDefinitions(): readonly TLEmbedDefinition[] {\n\t\treturn EmbedShapeUtil.embedDefinitions\n\t}\n\n\tgetEmbedDefinition(url: string): TLEmbedResult {\n\t\treturn getEmbedInfo(EmbedShapeUtil.embedDefinitions, url)\n\t}\n\n\toverride getText(shape: TLEmbedShape) {\n\t\treturn shape.props.url\n\t}\n\n\toverride getAriaDescriptor(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.title\n\t}\n\n\toverride hideSelectionBoundsFg(shape: TLEmbedShape) {\n\t\treturn !this.canResize(shape)\n\t}\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canResize(shape: TLEmbedShape) {\n\t\treturn !!this.getEmbedDefinition(shape.props.url)?.definition?.doesResize\n\t}\n\toverride canEditInReadonly() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLEmbedShape['props'] {\n\t\treturn {\n\t\t\tw: 300,\n\t\t\th: 300,\n\t\t\turl: '',\n\t\t}\n\t}\n\n\toverride isAspectRatioLocked(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.isAspectRatioLocked ?? false\n\t}\n\n\toverride onResize(shape: TLEmbedShape, info: TLResizeInfo<TLEmbedShape>) {\n\t\tconst isAspectRatioLocked = this.isAspectRatioLocked(shape)\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\tlet minWidth = embedInfo?.definition.minWidth ?? 200\n\t\tlet minHeight = embedInfo?.definition.minHeight ?? 200\n\t\tif (isAspectRatioLocked) {\n\t\t\t// Enforce aspect ratio\n\t\t\t// Neither the width or height can be less than 200\n\t\t\tconst aspectRatio = shape.props.w / shape.props.h\n\t\t\tif (aspectRatio > 1) {\n\t\t\t\t// Landscape\n\t\t\t\tminWidth *= aspectRatio\n\t\t\t} else {\n\t\t\t\t// Portrait\n\t\t\t\tminHeight /= aspectRatio\n\t\t\t}\n\t\t}\n\n\t\treturn resizeBox(shape, info, { minWidth, minHeight })\n\t}\n\n\toverride component(shape: TLEmbedShape) {\n\t\tconst svgExport = useSvgExportContext()\n\t\tconst { w, h, url } = shape.props\n\t\tconst isEditing = useIsEditing(shape.id)\n\n\t\tconst embedInfo = this.getEmbedDefinition(url)\n\n\t\tconst isHoveringWhileEditingSameShape = useValue(\n\t\t\t'is hovering',\n\t\t\t() => {\n\t\t\t\tconst { editingShapeId, hoveredShapeId } = this.editor.getCurrentPageState()\n\n\t\t\t\tif (editingShapeId && hoveredShapeId !== editingShapeId) {\n\t\t\t\t\tconst editingShape = this.editor.getShape(editingShapeId)\n\t\t\t\t\tif (editingShape && this.editor.isShapeOfType<TLEmbedShape>(editingShape, 'embed')) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t\t[]\n\t\t)\n\n\t\tconst pageRotation = this.editor.getShapePageTransform(shape)!.rotation()\n\n\t\tif (svgExport) {\n\t\t\t// for SVG exports, we show a blank embed\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor ?? 'var(--tl-color-background)',\n\t\t\t\t\t\t\twidth: w,\n\t\t\t\t\t\t\theight: h,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst isInteractive = isEditing || isHoveringWhileEditingSameShape\n\n\t\t// Prevent nested embedding of tldraw\n\t\tconst isIframe =\n\t\t\ttypeof window !== 'undefined' && (window !== window.top || window.self !== window.parent)\n\t\tif (isIframe && embedInfo?.definition.type === 'tldraw') return null\n\n\t\tif (embedInfo?.definition.type === 'github_gist') {\n\t\t\tconst idFromGistUrl = embedInfo.url.split('/').pop()\n\t\t\tif (!idFromGistUrl) throw Error('No gist id!')\n\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<Gist\n\t\t\t\t\t\tid={idFromGistUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)!}\n\t\t\t\t\t\theight={toDomPrecision(h)!}\n\t\t\t\t\t\tisInteractive={isInteractive}\n\t\t\t\t\t\tpageRotation={pageRotation}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst sandbox = getSandboxPermissions({\n\t\t\t...embedShapePermissionDefaults,\n\t\t\t...(embedInfo?.definition.overridePermissions ?? {}),\n\t\t})\n\n\t\treturn (\n\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t{embedInfo?.definition ? (\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tsandbox={sandbox}\n\t\t\t\t\t\tsrc={embedInfo.embedUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)}\n\t\t\t\t\t\theight={toDomPrecision(h)}\n\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t\t\t\tframeBorder=\"0\"\n\t\t\t\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\t\t\t\ttabIndex={isEditing ? 0 : -1}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tpointerEvents: isInteractive ? 'auto' : 'none',\n\t\t\t\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</HTMLContainer>\n\t\t)\n\t}\n\n\toverride indicator(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn (\n\t\t\t<rect\n\t\t\t\twidth={toDomPrecision(shape.props.w)}\n\t\t\t\theight={toDomPrecision(shape.props.h)}\n\t\t\t\trx={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t\try={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t/>\n\t\t)\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLEmbedShape,\n\t\tendShape: TLEmbedShape,\n\t\tt: number\n\t): TLEmbedShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t}\n\t}\n}\n\nfunction Gist({\n\tid,\n\tisInteractive,\n\twidth,\n\theight,\n\tstyle,\n\tpageRotation,\n}: {\n\tid: string\n\tisInteractive: boolean\n\twidth: number\n\theight: number\n\tpageRotation: number\n\tstyle?: React.CSSProperties\n}) {\n\t// Security warning:\n\t// Gists allow adding .json extensions to the URL which return JSONP.\n\t// Furthermore, the JSONP can include callbacks that execute arbitrary JavaScript.\n\t// It _is_ sandboxed by the iframe but we still want to disable it nonetheless.\n\t// We restrict the id to only allow hexdecimal characters to prevent this.\n\t// Read more:\n\t// https://github.com/bhaveshk90/Content-Security-Policy-CSP-Bypass-Techniques\n\t// https://github.com/renniepak/CSPBypass\n\tif (!id.match(/^[0-9a-f]+$/)) throw Error('No gist id!')\n\n\treturn (\n\t\t<iframe\n\t\t\tclassName=\"tl-embed\"\n\t\t\tdraggable={false}\n\t\t\twidth={toDomPrecision(width)}\n\t\t\theight={toDomPrecision(height)}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tframeBorder=\"0\"\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tscrolling=\"no\"\n\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\ttabIndex={isInteractive ? 0 : -1}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\tpointerEvents: isInteractive ? 'all' : 'none',\n\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t}}\n\t\t\tsrcDoc={`\n\t\t\t<html>\n\t\t\t\t<head>\n\t\t\t\t\t<base target=\"_blank\">\n\t\t\t\t</head>\n\t\t\t\t<body>\n\t\t\t\t\t<script src=${`https://gist.github.com/${id}.js`}></script>\n\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t* { margin: 0px; }\n\t\t\t\t\t\ttable { height: 100%; background-color: red; }\n\t\t\t\t\t\t.gist { background-color: none; height: 100%; }\n\t\t\t\t\t\t.gist .gist-file { height: calc(100vh - 2px); padding: 0px; display: grid; grid-template-rows: 1fr auto; }\n\t\t\t\t\t</style>\n\t\t\t\t</body>\n\t\t\t</html>`}\n\t\t/>\n\t)\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4IK;AA1IL,oBAcO;AAEP,qCAMO;AACP,oBAA4C;AAC5C,gCAAoC;AAEpC,MAAM,wBAAwB,CAAC,gBAAyC;AACvE,SAAO,OAAO,QAAQ,WAAW,EAC/B,OAAO,CAAC,CAAC,OAAO,SAAS,MAAM,SAAS,EACxC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,EACpB,KAAK,GAAG;AACX;AAGO,MAAM,uBAAuB,+BAA+B;AAAA,EAClE,OAAgB,OAAO;AAAA,EACvB,OAAgB,QAAQ;AAAA,EACxB,OAAgB,aAAa;AAAA,EAC7B,OAAe,mBAA+C;AAAA,EAE9D,OAAO,oBAAoB,kBAAgD;AAC1E,mBAAe,mBAAmB;AAAA,EACnC;AAAA,EAEA,sBAAoD;AACnD,WAAO,eAAe;AAAA,EACvB;AAAA,EAEA,mBAAmB,KAA4B;AAC9C,eAAO,4BAAa,eAAe,kBAAkB,GAAG;AAAA,EACzD;AAAA,EAES,QAAQ,OAAqB;AACrC,WAAO,MAAM,MAAM;AAAA,EACpB;AAAA,EAES,kBAAkB,OAAqB;AAC/C,UAAM,YAAY,KAAK,mBAAmB,MAAM,MAAM,GAAG;AACzD,WAAO,WAAW,WAAW;AAAA,EAC9B;AAAA,EAES,sBAAsB,OAAqB;AACnD,WAAO,CAAC,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EACS,UAAU;AAClB,WAAO;AAAA,EACR;AAAA,EACS,UAAU,OAAqB;AACvC,WAAO,CAAC,CAAC,KAAK,mBAAmB,MAAM,MAAM,GAAG,GAAG,YAAY;AAAA,EAChE;AAAA,EACS,oBAAoB;AAC5B,WAAO;AAAA,EACR;AAAA,EAES,kBAAyC;AACjD,WAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,IACN;AAAA,EACD;AAAA,EAES,oBAAoB,OAAqB;AACjD,UAAM,YAAY,KAAK,mBAAmB,MAAM,MAAM,GAAG;AACzD,WAAO,WAAW,WAAW,uBAAuB;AAAA,EACrD;AAAA,EAES,SAAS,OAAqB,MAAkC;AACxE,UAAM,sBAAsB,KAAK,oBAAoB,KAAK;AAC1D,UAAM,YAAY,KAAK,mBAAmB,MAAM,MAAM,GAAG;AACzD,QAAI,WAAW,WAAW,WAAW,YAAY;AACjD,QAAI,YAAY,WAAW,WAAW,aAAa;AACnD,QAAI,qBAAqB;AAGxB,YAAM,cAAc,MAAM,MAAM,IAAI,MAAM,MAAM;AAChD,UAAI,cAAc,GAAG;AAEpB,oBAAY;AAAA,MACb,OAAO;AAEN,qBAAa;AAAA,MACd;AAAA,IACD;AAEA,eAAO,yBAAU,OAAO,MAAM,EAAE,UAAU,UAAU,CAAC;AAAA,EACtD;AAAA,EAES,UAAU,OAAqB;AACvC,UAAM,gBAAY,mCAAoB;AACtC,UAAM,EAAE,GAAG,GAAG,IAAI,IAAI,MAAM;AAC5B,UAAM,gBAAY,4BAAa,MAAM,EAAE;AAEvC,UAAM,YAAY,KAAK,mBAAmB,GAAG;AAE7C,UAAM,sCAAkC;AAAA,MACvC;AAAA,MACA,MAAM;AACL,cAAM,EAAE,gBAAgB,eAAe,IAAI,KAAK,OAAO,oBAAoB;AAE3E,YAAI,kBAAkB,mBAAmB,gBAAgB;AACxD,gBAAM,eAAe,KAAK,OAAO,SAAS,cAAc;AACxD,cAAI,gBAAgB,KAAK,OAAO,cAA4B,cAAc,OAAO,GAAG;AACnF,mBAAO;AAAA,UACR;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,OAAO,sBAAsB,KAAK,EAAG,SAAS;AAExE,QAAI,WAAW;AAEd,aACC,4CAAC,+BAAc,WAAU,sBAAqB,IAAI,MAAM,IACvD;AAAA,QAAC;AAAA;AAAA,UACA,WAAU;AAAA,UACV,OAAO;AAAA,YACN,QAAQ;AAAA,YACR,eAAW,+CAAoB,YAAY;AAAA,YAC3C,cAAc,WAAW,WAAW,yBAAyB;AAAA,YAC7D,YAAY,WAAW,WAAW,mBAAmB;AAAA,YACrD,OAAO;AAAA,YACP,QAAQ;AAAA,UACT;AAAA;AAAA,MACD,GACD;AAAA,IAEF;AAEA,UAAM,gBAAgB,aAAa;AAGnC,UAAM,WACL,OAAO,WAAW,gBAAgB,WAAW,OAAO,OAAO,OAAO,SAAS,OAAO;AACnF,QAAI,YAAY,WAAW,WAAW,SAAS,SAAU,QAAO;AAEhE,QAAI,WAAW,WAAW,SAAS,eAAe;AACjD,YAAM,gBAAgB,UAAU,IAAI,MAAM,GAAG,EAAE,IAAI;AACnD,UAAI,CAAC,cAAe,OAAM,MAAM,aAAa;AAE7C,aACC,4CAAC,+BAAc,WAAU,sBAAqB,IAAI,MAAM,IACvD;AAAA,QAAC;AAAA;AAAA,UACA,IAAI;AAAA,UACJ,WAAO,8BAAe,CAAC;AAAA,UACvB,YAAQ,8BAAe,CAAC;AAAA,UACxB;AAAA,UACA;AAAA;AAAA,MACD,GACD;AAAA,IAEF;AAEA,UAAM,UAAU,sBAAsB;AAAA,MACrC,GAAG;AAAA,MACH,GAAI,WAAW,WAAW,uBAAuB,CAAC;AAAA,IACnD,CAAC;AAED,WACC,4CAAC,+BAAc,WAAU,sBAAqB,IAAI,MAAM,IACtD,qBAAW,aACX;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV;AAAA,QACA,KAAK,UAAU;AAAA,QACf,WAAO,8BAAe,CAAC;AAAA,QACvB,YAAQ,8BAAe,CAAC;AAAA,QACxB,WAAW;AAAA,QAEX,aAAY;AAAA,QACZ,gBAAe;AAAA,QACf,UAAU,YAAY,IAAI;AAAA,QAC1B,OAAO;AAAA,UACN,QAAQ;AAAA,UACR,eAAe,gBAAgB,SAAS;AAAA;AAAA,UAExC,QAAQ,gBAAgB,KAAK;AAAA,UAC7B,eAAW,+CAAoB,YAAY;AAAA,UAC3C,cAAc,WAAW,WAAW,yBAAyB;AAAA,UAC7D,YAAY,WAAW,WAAW;AAAA,QACnC;AAAA;AAAA,IACD,IACG,MACL;AAAA,EAEF;AAAA,EAES,UAAU,OAAqB;AACvC,UAAM,YAAY,KAAK,mBAAmB,MAAM,MAAM,GAAG;AACzD,WACC;AAAA,MAAC;AAAA;AAAA,QACA,WAAO,8BAAe,MAAM,MAAM,CAAC;AAAA,QACnC,YAAQ,8BAAe,MAAM,MAAM,CAAC;AAAA,QACpC,IAAI,WAAW,WAAW,yBAAyB;AAAA,QACnD,IAAI,WAAW,WAAW,yBAAyB;AAAA;AAAA,IACpD;AAAA,EAEF;AAAA,EACS,qBACR,YACA,UACA,GACoB;AACpB,WAAO;AAAA,MACN,GAAI,IAAI,MAAM,SAAS,QAAQ,WAAW;AAAA,MAC1C,OAAG,oBAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MAC/C,OAAG,oBAAK,WAAW,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,IAChD;AAAA,EACD;AACD;AAEA,SAAS,KAAK;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAOG;AASF,MAAI,CAAC,GAAG,MAAM,aAAa,EAAG,OAAM,MAAM,aAAa;AAEvD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAO,8BAAe,KAAK;AAAA,MAC3B,YAAQ,8BAAe,MAAM;AAAA,MAE7B,aAAY;AAAA,MAEZ,WAAU;AAAA,MACV,gBAAe;AAAA,MACf,UAAU,gBAAgB,IAAI;AAAA,MAC9B,OAAO;AAAA,QACN,GAAG;AAAA,QACH,eAAe,gBAAgB,QAAQ;AAAA;AAAA,QAEvC,QAAQ,gBAAgB,KAAK;AAAA,QAC7B,eAAW,+CAAoB,YAAY;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMQ,2BAA2B,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD;AAEF;",
6
6
  "names": []
7
7
  }