tldraw 4.1.0-canary.e4499a57ef5b → 4.1.0-canary.e87046ba1a0c
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.
- package/dist-cjs/index.d.ts +46 -12
- package/dist-cjs/index.js +6 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
- package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +1 -1
- package/dist-cjs/lib/defaultEmbedDefinitions.js +25 -30
- package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +10 -33
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/curved-arrow.js +8 -2
- package/dist-cjs/lib/shapes/arrow/curved-arrow.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/straight-arrow.js +4 -1
- package/dist-cjs/lib/shapes/arrow/straight-arrow.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +44 -102
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js +138 -0
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +7 -0
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +25 -3
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +1 -1
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -1
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +2 -2
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/ShapeFill.js +1 -1
- package/dist-cjs/lib/shapes/text/PlainTextArea.js +1 -1
- package/dist-cjs/lib/shapes/text/RichTextArea.js +1 -1
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +20 -4
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +23 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +27 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +21 -9
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +24 -8
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +21 -9
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +23 -8
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +21 -9
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +26 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +2 -2
- package/dist-cjs/lib/ui/components/DebugMenu/DefaultDebugMenuContent.js +1 -1
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialog.js +1 -1
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +5 -0
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +1 -1
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +1 -1
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +1 -1
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +64 -56
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +54 -47
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +3 -3
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js +63 -56
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js +13 -6
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButton.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/layout.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +1 -1
- package/dist-cjs/lib/ui/context/actions.js +24 -30
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/breakpoints.js +1 -1
- package/dist-cjs/lib/ui/context/events.js +1 -1
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +1 -1
- package/dist-cjs/lib/ui/hooks/useLocalStorageState.js +1 -1
- package/dist-cjs/lib/ui/hooks/useTools.js +1 -1
- package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js +1 -1
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/text/richText.js +4 -4
- package/dist-esm/index.d.mts +46 -12
- package/dist-esm/index.mjs +12 -4
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs +25 -30
- package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +10 -33
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/curved-arrow.mjs +8 -2
- package/dist-esm/lib/shapes/arrow/curved-arrow.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/straight-arrow.mjs +4 -1
- package/dist-esm/lib/shapes/arrow/straight-arrow.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +46 -101
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs +124 -0
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +7 -0
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +26 -3
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +1 -1
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +20 -4
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +23 -11
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +29 -7
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +21 -9
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +24 -8
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +21 -9
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +23 -8
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +21 -9
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +26 -11
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +5 -0
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +68 -57
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +54 -47
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +3 -3
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs +63 -56
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs +12 -5
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +23 -29
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/package.json +11 -11
- package/src/index.ts +4 -0
- package/src/lib/defaultEmbedDefinitions.ts +20 -24
- package/src/lib/defaultExternalContentHandlers.ts +12 -37
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +211 -1
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +3 -0
- package/src/lib/shapes/arrow/curved-arrow.ts +8 -2
- package/src/lib/shapes/arrow/straight-arrow.ts +5 -1
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +51 -135
- package/src/lib/shapes/bookmark/bookmarks.ts +170 -0
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +28 -2
- package/src/lib/shapes/line/LineShapeUtil.tsx +3 -0
- package/src/lib/shapes/shared/RichTextLabel.tsx +1 -1
- package/src/lib/shapes/text/TextShapeTool.test.ts +74 -0
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +23 -6
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +24 -12
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +34 -11
- package/src/lib/tools/SelectTool/childStates/Idle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +23 -11
- package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +26 -9
- package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +23 -10
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +24 -9
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +27 -11
- package/src/lib/tools/SelectTool/childStates/Translating.ts +28 -12
- package/src/lib/ui/components/Minimap/MinimapManager.ts +6 -0
- package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +6 -2
- package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +60 -49
- package/src/lib/ui/components/StylePanel/StylePanelButtonPicker.tsx +70 -53
- package/src/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.tsx +105 -90
- package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +72 -51
- package/src/lib/ui/context/actions.tsx +27 -31
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/utils/embeds/embeds.test.ts +16 -34
- package/src/test/SelectTool.test.ts +251 -0
- package/src/test/bookmark-shapes.test.ts +129 -7
- package/src/test/customSnapping.test.tsx +55 -11
- package/tldraw.css +7 -2
|
@@ -35,6 +35,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
35
35
|
}
|
|
36
36
|
return
|
|
37
37
|
},
|
|
38
|
+
embedOnPaste: false,
|
|
38
39
|
},
|
|
39
40
|
{
|
|
40
41
|
type: 'figma',
|
|
@@ -65,6 +66,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
65
66
|
}
|
|
66
67
|
return
|
|
67
68
|
},
|
|
69
|
+
embedOnPaste: true,
|
|
68
70
|
},
|
|
69
71
|
{
|
|
70
72
|
type: 'google_maps',
|
|
@@ -116,6 +118,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
116
118
|
}
|
|
117
119
|
return
|
|
118
120
|
},
|
|
121
|
+
embedOnPaste: true,
|
|
119
122
|
},
|
|
120
123
|
{
|
|
121
124
|
type: 'val_town',
|
|
@@ -144,6 +147,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
144
147
|
}
|
|
145
148
|
return
|
|
146
149
|
},
|
|
150
|
+
embedOnPaste: true,
|
|
147
151
|
},
|
|
148
152
|
{
|
|
149
153
|
type: 'codesandbox',
|
|
@@ -170,6 +174,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
170
174
|
}
|
|
171
175
|
return
|
|
172
176
|
},
|
|
177
|
+
embedOnPaste: true,
|
|
173
178
|
},
|
|
174
179
|
{
|
|
175
180
|
type: 'codepen',
|
|
@@ -198,6 +203,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
198
203
|
}
|
|
199
204
|
return
|
|
200
205
|
},
|
|
206
|
+
embedOnPaste: true,
|
|
201
207
|
},
|
|
202
208
|
{
|
|
203
209
|
type: 'scratch',
|
|
@@ -206,6 +212,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
206
212
|
width: 520,
|
|
207
213
|
height: 400,
|
|
208
214
|
doesResize: false,
|
|
215
|
+
embedOnPaste: true,
|
|
209
216
|
toEmbedUrl: (url) => {
|
|
210
217
|
const SCRATCH_URL_REGEXP = /https?:\/\/scratch.mit.edu\/projects\/([^/]+)/
|
|
211
218
|
const matches = url.match(SCRATCH_URL_REGEXP)
|
|
@@ -237,6 +244,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
237
244
|
'allow-popups-to-escape-sandbox': true,
|
|
238
245
|
},
|
|
239
246
|
isAspectRatioLocked: true,
|
|
247
|
+
embedOnPaste: true,
|
|
240
248
|
toEmbedUrl: (url) => {
|
|
241
249
|
const urlObj = safeParseUrl(url)
|
|
242
250
|
if (!urlObj) return
|
|
@@ -303,6 +311,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
303
311
|
overridePermissions: {
|
|
304
312
|
'allow-popups-to-escape-sandbox': true,
|
|
305
313
|
},
|
|
314
|
+
embedOnPaste: true,
|
|
306
315
|
toEmbedUrl: (url) => {
|
|
307
316
|
const urlObj = safeParseUrl(url)
|
|
308
317
|
const cidQs = urlObj?.searchParams.get('cid')
|
|
@@ -347,6 +356,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
347
356
|
overridePermissions: {
|
|
348
357
|
'allow-popups-to-escape-sandbox': true,
|
|
349
358
|
},
|
|
359
|
+
embedOnPaste: true,
|
|
350
360
|
toEmbedUrl: (url) => {
|
|
351
361
|
const urlObj = safeParseUrl(url)
|
|
352
362
|
|
|
@@ -381,6 +391,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
381
391
|
width: 720,
|
|
382
392
|
height: 500,
|
|
383
393
|
doesResize: true,
|
|
394
|
+
embedOnPaste: true,
|
|
384
395
|
// Security warning:
|
|
385
396
|
// Gists allow adding .json extensions to the URL which return JSONP.
|
|
386
397
|
// Furthermore, the JSONP can include callbacks that execute arbitrary JavaScript.
|
|
@@ -413,10 +424,12 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
413
424
|
width: 720,
|
|
414
425
|
height: 500,
|
|
415
426
|
doesResize: true,
|
|
427
|
+
embedOnPaste: true,
|
|
416
428
|
toEmbedUrl: (url) => {
|
|
417
429
|
const urlObj = safeParseUrl(url)
|
|
418
430
|
if (urlObj && urlObj.pathname.match(/\/@([^/]+)\/([^/]+)/)) {
|
|
419
|
-
|
|
431
|
+
urlObj.searchParams.append('embed', 'true')
|
|
432
|
+
return urlObj.href
|
|
420
433
|
}
|
|
421
434
|
return
|
|
422
435
|
},
|
|
@@ -440,6 +453,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
440
453
|
width: 720,
|
|
441
454
|
height: 500,
|
|
442
455
|
doesResize: true,
|
|
456
|
+
embedOnPaste: true,
|
|
443
457
|
toEmbedUrl: (url) => {
|
|
444
458
|
const urlObj = safeParseUrl(url)
|
|
445
459
|
if (urlObj && urlObj.pathname.match(/^\/map\//)) {
|
|
@@ -465,6 +479,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
465
479
|
minHeight: 500,
|
|
466
480
|
overrideOutlineRadius: 12,
|
|
467
481
|
doesResize: true,
|
|
482
|
+
embedOnPaste: true,
|
|
468
483
|
toEmbedUrl: (url) => {
|
|
469
484
|
const urlObj = safeParseUrl(url)
|
|
470
485
|
if (urlObj && urlObj.pathname.match(/^\/(artist|album)\//)) {
|
|
@@ -488,6 +503,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
488
503
|
height: 360,
|
|
489
504
|
doesResize: true,
|
|
490
505
|
isAspectRatioLocked: true,
|
|
506
|
+
embedOnPaste: true,
|
|
491
507
|
toEmbedUrl: (url) => {
|
|
492
508
|
const urlObj = safeParseUrl(url)
|
|
493
509
|
if (urlObj && urlObj.hostname === 'vimeo.com') {
|
|
@@ -510,29 +526,6 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
510
526
|
return
|
|
511
527
|
},
|
|
512
528
|
},
|
|
513
|
-
{
|
|
514
|
-
type: 'excalidraw',
|
|
515
|
-
title: 'Excalidraw',
|
|
516
|
-
hostnames: ['excalidraw.com'],
|
|
517
|
-
width: 720,
|
|
518
|
-
height: 500,
|
|
519
|
-
doesResize: true,
|
|
520
|
-
isAspectRatioLocked: true,
|
|
521
|
-
toEmbedUrl: (url) => {
|
|
522
|
-
const urlObj = safeParseUrl(url)
|
|
523
|
-
if (urlObj && urlObj.hash.match(/#room=/)) {
|
|
524
|
-
return url
|
|
525
|
-
}
|
|
526
|
-
return
|
|
527
|
-
},
|
|
528
|
-
fromEmbedUrl: (url) => {
|
|
529
|
-
const urlObj = safeParseUrl(url)
|
|
530
|
-
if (urlObj && urlObj.hash.match(/#room=/)) {
|
|
531
|
-
return url
|
|
532
|
-
}
|
|
533
|
-
return
|
|
534
|
-
},
|
|
535
|
-
},
|
|
536
529
|
{
|
|
537
530
|
type: 'observable',
|
|
538
531
|
title: 'Observable',
|
|
@@ -542,6 +535,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
542
535
|
doesResize: true,
|
|
543
536
|
isAspectRatioLocked: false,
|
|
544
537
|
backgroundColor: '#fff',
|
|
538
|
+
embedOnPaste: true,
|
|
545
539
|
toEmbedUrl: (url) => {
|
|
546
540
|
const urlObj = safeParseUrl(url)
|
|
547
541
|
if (urlObj && urlObj.pathname.match(/^\/@([^/]+)\/([^/]+)\/?$/)) {
|
|
@@ -573,6 +567,7 @@ export const DEFAULT_EMBED_DEFINITIONS = [
|
|
|
573
567
|
width: 700,
|
|
574
568
|
height: 450,
|
|
575
569
|
doesResize: true,
|
|
570
|
+
embedOnPaste: true,
|
|
576
571
|
toEmbedUrl: (url) => {
|
|
577
572
|
const urlObj = safeParseUrl(url)
|
|
578
573
|
if (
|
|
@@ -673,6 +668,7 @@ export interface EmbedDefinition {
|
|
|
673
668
|
readonly overridePermissions?: TLEmbedShapePermissions
|
|
674
669
|
readonly instructionLink?: string
|
|
675
670
|
readonly backgroundColor?: string
|
|
671
|
+
readonly embedOnPaste?: boolean
|
|
676
672
|
// TODO: FIXME this is ugly be required because some embeds have their own border radius for example spotify embeds
|
|
677
673
|
readonly overrideOutlineRadius?: number
|
|
678
674
|
// eslint-disable-next-line @typescript-eslint/method-signature-style
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
toRichText,
|
|
32
32
|
} from '@tldraw/editor'
|
|
33
33
|
import { EmbedDefinition } from './defaultEmbedDefinitions'
|
|
34
|
+
import { createBookmarkFromUrl } from './shapes/bookmark/bookmarks'
|
|
34
35
|
import { EmbedShapeUtil } from './shapes/embed/EmbedShapeUtil'
|
|
35
36
|
import { getCroppedImageDataForReplacedImage } from './shapes/shared/crop'
|
|
36
37
|
import { FONT_FAMILIES, FONT_SIZES, TEXT_PROPS } from './shapes/shared/default-shape-constants'
|
|
@@ -382,7 +383,7 @@ export async function defaultHandleExternalFileContent(
|
|
|
382
383
|
) {
|
|
383
384
|
const { acceptedImageMimeTypes = DEFAULT_SUPPORTED_IMAGE_TYPES, toasts, msg } = options
|
|
384
385
|
if (files.length > editor.options.maxFilesAtOnce) {
|
|
385
|
-
toasts.addToast({ title: msg('assets.files.amount-too-
|
|
386
|
+
toasts.addToast({ title: msg('assets.files.amount-too-many'), severity: 'error' })
|
|
386
387
|
return
|
|
387
388
|
}
|
|
388
389
|
|
|
@@ -557,7 +558,7 @@ export async function defaultHandleExternalUrlContent(
|
|
|
557
558
|
const embedUtil = editor.getShapeUtil('embed') as EmbedShapeUtil | undefined
|
|
558
559
|
const embedInfo = embedUtil?.getEmbedDefinition(url)
|
|
559
560
|
|
|
560
|
-
if (embedInfo) {
|
|
561
|
+
if (embedInfo && embedInfo.definition.embedOnPaste !== false) {
|
|
561
562
|
return editor.putExternalContent({
|
|
562
563
|
type: 'embed',
|
|
563
564
|
url: embedInfo.url,
|
|
@@ -572,42 +573,16 @@ export async function defaultHandleExternalUrlContent(
|
|
|
572
573
|
? editor.inputs.currentPagePoint
|
|
573
574
|
: editor.getViewportPageBounds().center)
|
|
574
575
|
|
|
575
|
-
|
|
576
|
-
const
|
|
577
|
-
|
|
578
|
-
// Use an existing asset if we have one, or else else create a new one
|
|
579
|
-
let asset = editor.getAsset(assetId) as TLAsset
|
|
580
|
-
let shouldAlsoCreateAsset = false
|
|
581
|
-
if (!asset) {
|
|
582
|
-
shouldAlsoCreateAsset = true
|
|
583
|
-
try {
|
|
584
|
-
const bookmarkAsset = await editor.getAssetForExternalContent({ type: 'url', url })
|
|
585
|
-
if (!bookmarkAsset) throw Error('Could not create an asset')
|
|
586
|
-
asset = bookmarkAsset
|
|
587
|
-
} catch {
|
|
588
|
-
toasts.addToast({
|
|
589
|
-
title: msg('assets.url.failed'),
|
|
590
|
-
severity: 'error',
|
|
591
|
-
})
|
|
592
|
-
return
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
editor.run(() => {
|
|
597
|
-
if (shouldAlsoCreateAsset) {
|
|
598
|
-
editor.createAssets([asset])
|
|
599
|
-
}
|
|
576
|
+
// Use the new function to create the bookmark
|
|
577
|
+
const result = await createBookmarkFromUrl(editor, { url, center: position })
|
|
600
578
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
},
|
|
609
|
-
])
|
|
610
|
-
})
|
|
579
|
+
if (!result.ok) {
|
|
580
|
+
toasts.addToast({
|
|
581
|
+
title: msg('assets.url.failed'),
|
|
582
|
+
severity: 'error',
|
|
583
|
+
})
|
|
584
|
+
return
|
|
585
|
+
}
|
|
611
586
|
}
|
|
612
587
|
|
|
613
588
|
/** @public */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HALF_PI, TLArrowShape, TLShapeId, createShapeId, toRichText } from '@tldraw/editor'
|
|
2
2
|
import { vi } from 'vitest'
|
|
3
3
|
import { TestEditor } from '../../../test/TestEditor'
|
|
4
|
-
import { createOrUpdateArrowBinding, getArrowBindings } from './shared'
|
|
4
|
+
import { createOrUpdateArrowBinding, getArrowBindings, getArrowInfo } from './shared'
|
|
5
5
|
|
|
6
6
|
let editor: TestEditor
|
|
7
7
|
|
|
@@ -620,3 +620,213 @@ describe('Arrow export bounds', () => {
|
|
|
620
620
|
expect(arrow.props.richText).not.toBeNull()
|
|
621
621
|
})
|
|
622
622
|
})
|
|
623
|
+
|
|
624
|
+
describe('Arrow terminal positioning bug fix', () => {
|
|
625
|
+
const data = {
|
|
626
|
+
document: {
|
|
627
|
+
store: {
|
|
628
|
+
'shape:1Hm61DGAsY0uqEO-kt75l': {
|
|
629
|
+
x: 637.2890625,
|
|
630
|
+
y: 383.9296875,
|
|
631
|
+
rotation: 0,
|
|
632
|
+
isLocked: false,
|
|
633
|
+
opacity: 1,
|
|
634
|
+
meta: {},
|
|
635
|
+
id: 'shape:1Hm61DGAsY0uqEO-kt75l',
|
|
636
|
+
type: 'geo',
|
|
637
|
+
props: {
|
|
638
|
+
w: 230.66796875,
|
|
639
|
+
h: 114.796875,
|
|
640
|
+
geo: 'rectangle',
|
|
641
|
+
dash: 'draw',
|
|
642
|
+
growY: 0,
|
|
643
|
+
url: '',
|
|
644
|
+
scale: 1,
|
|
645
|
+
color: 'black',
|
|
646
|
+
labelColor: 'black',
|
|
647
|
+
fill: 'none',
|
|
648
|
+
size: 'm',
|
|
649
|
+
font: 'draw',
|
|
650
|
+
align: 'middle',
|
|
651
|
+
verticalAlign: 'middle',
|
|
652
|
+
richText: {
|
|
653
|
+
type: 'doc',
|
|
654
|
+
content: [
|
|
655
|
+
{
|
|
656
|
+
type: 'paragraph',
|
|
657
|
+
},
|
|
658
|
+
],
|
|
659
|
+
},
|
|
660
|
+
},
|
|
661
|
+
parentId: 'page:page',
|
|
662
|
+
index: 'a1',
|
|
663
|
+
typeName: 'shape',
|
|
664
|
+
},
|
|
665
|
+
'binding:nekxhMCGaoEJO98DEqWgo': {
|
|
666
|
+
meta: {},
|
|
667
|
+
id: 'binding:nekxhMCGaoEJO98DEqWgo',
|
|
668
|
+
type: 'arrow',
|
|
669
|
+
fromId: 'shape:j0HKQihjBXqMqgVhfRhDS',
|
|
670
|
+
toId: 'shape:1Hm61DGAsY0uqEO-kt75l',
|
|
671
|
+
props: {
|
|
672
|
+
isPrecise: true,
|
|
673
|
+
isExact: false,
|
|
674
|
+
normalizedAnchor: {
|
|
675
|
+
x: 0.13182672605036325,
|
|
676
|
+
y: 0.8036953858717844,
|
|
677
|
+
},
|
|
678
|
+
snap: 'none',
|
|
679
|
+
terminal: 'start',
|
|
680
|
+
},
|
|
681
|
+
typeName: 'binding',
|
|
682
|
+
},
|
|
683
|
+
'binding:kWamalL_QSq_kFPZDgp7Z': {
|
|
684
|
+
meta: {},
|
|
685
|
+
id: 'binding:kWamalL_QSq_kFPZDgp7Z',
|
|
686
|
+
type: 'arrow',
|
|
687
|
+
fromId: 'shape:j0HKQihjBXqMqgVhfRhDS',
|
|
688
|
+
toId: 'shape:1Hm61DGAsY0uqEO-kt75l',
|
|
689
|
+
props: {
|
|
690
|
+
isPrecise: true,
|
|
691
|
+
isExact: false,
|
|
692
|
+
normalizedAnchor: {
|
|
693
|
+
x: 0.7138744475114731,
|
|
694
|
+
y: 0.45797604464407243,
|
|
695
|
+
},
|
|
696
|
+
snap: 'none',
|
|
697
|
+
terminal: 'end',
|
|
698
|
+
},
|
|
699
|
+
typeName: 'binding',
|
|
700
|
+
},
|
|
701
|
+
'shape:j0HKQihjBXqMqgVhfRhDS': {
|
|
702
|
+
x: 665.296875,
|
|
703
|
+
y: 477.59765625,
|
|
704
|
+
rotation: 0,
|
|
705
|
+
isLocked: false,
|
|
706
|
+
opacity: 1,
|
|
707
|
+
meta: {},
|
|
708
|
+
id: 'shape:j0HKQihjBXqMqgVhfRhDS',
|
|
709
|
+
type: 'arrow',
|
|
710
|
+
props: {
|
|
711
|
+
kind: 'arc',
|
|
712
|
+
elbowMidPoint: 0.5,
|
|
713
|
+
dash: 'draw',
|
|
714
|
+
size: 'm',
|
|
715
|
+
fill: 'none',
|
|
716
|
+
color: 'black',
|
|
717
|
+
labelColor: 'black',
|
|
718
|
+
bend: 0,
|
|
719
|
+
start: {
|
|
720
|
+
x: 0,
|
|
721
|
+
y: 0,
|
|
722
|
+
},
|
|
723
|
+
end: {
|
|
724
|
+
x: 2,
|
|
725
|
+
y: 0,
|
|
726
|
+
},
|
|
727
|
+
arrowheadStart: 'none',
|
|
728
|
+
arrowheadEnd: 'arrow',
|
|
729
|
+
richText: {
|
|
730
|
+
type: 'doc',
|
|
731
|
+
content: [
|
|
732
|
+
{
|
|
733
|
+
type: 'paragraph',
|
|
734
|
+
},
|
|
735
|
+
],
|
|
736
|
+
},
|
|
737
|
+
labelPosition: 0.5,
|
|
738
|
+
font: 'draw',
|
|
739
|
+
scale: 1,
|
|
740
|
+
},
|
|
741
|
+
parentId: 'page:page',
|
|
742
|
+
index: 'a2lbpzZG',
|
|
743
|
+
typeName: 'shape',
|
|
744
|
+
},
|
|
745
|
+
'page:page': {
|
|
746
|
+
meta: {},
|
|
747
|
+
id: 'page:page',
|
|
748
|
+
name: 'Page 1',
|
|
749
|
+
index: 'a1',
|
|
750
|
+
typeName: 'page',
|
|
751
|
+
},
|
|
752
|
+
'document:document': {
|
|
753
|
+
gridSize: 10,
|
|
754
|
+
name: '',
|
|
755
|
+
meta: {},
|
|
756
|
+
id: 'document:document',
|
|
757
|
+
typeName: 'document',
|
|
758
|
+
},
|
|
759
|
+
},
|
|
760
|
+
schema: {
|
|
761
|
+
schemaVersion: 2,
|
|
762
|
+
sequences: {
|
|
763
|
+
'com.tldraw.store': 5,
|
|
764
|
+
'com.tldraw.asset': 1,
|
|
765
|
+
'com.tldraw.camera': 1,
|
|
766
|
+
'com.tldraw.document': 2,
|
|
767
|
+
'com.tldraw.instance': 25,
|
|
768
|
+
'com.tldraw.instance_page_state': 5,
|
|
769
|
+
'com.tldraw.page': 1,
|
|
770
|
+
'com.tldraw.instance_presence': 6,
|
|
771
|
+
'com.tldraw.pointer': 1,
|
|
772
|
+
'com.tldraw.shape': 4,
|
|
773
|
+
'com.tldraw.asset.bookmark': 2,
|
|
774
|
+
'com.tldraw.asset.image': 5,
|
|
775
|
+
'com.tldraw.asset.video': 5,
|
|
776
|
+
'com.tldraw.shape.group': 0,
|
|
777
|
+
'com.tldraw.shape.text': 3,
|
|
778
|
+
'com.tldraw.shape.bookmark': 2,
|
|
779
|
+
'com.tldraw.shape.draw': 2,
|
|
780
|
+
'com.tldraw.shape.geo': 10,
|
|
781
|
+
'com.tldraw.shape.note': 9,
|
|
782
|
+
'com.tldraw.shape.line': 5,
|
|
783
|
+
'com.tldraw.shape.frame': 1,
|
|
784
|
+
'com.tldraw.shape.arrow': 7,
|
|
785
|
+
'com.tldraw.shape.highlight': 1,
|
|
786
|
+
'com.tldraw.shape.embed': 4,
|
|
787
|
+
'com.tldraw.shape.image': 5,
|
|
788
|
+
'com.tldraw.shape.video': 4,
|
|
789
|
+
'com.tldraw.binding.arrow': 1,
|
|
790
|
+
},
|
|
791
|
+
},
|
|
792
|
+
},
|
|
793
|
+
session: {
|
|
794
|
+
version: 0,
|
|
795
|
+
currentPageId: 'page:page',
|
|
796
|
+
exportBackground: true,
|
|
797
|
+
isFocusMode: false,
|
|
798
|
+
isDebugMode: false,
|
|
799
|
+
isToolLocked: false,
|
|
800
|
+
isGridMode: false,
|
|
801
|
+
pageStates: [
|
|
802
|
+
{
|
|
803
|
+
pageId: 'page:page',
|
|
804
|
+
camera: {
|
|
805
|
+
x: 0,
|
|
806
|
+
y: 0,
|
|
807
|
+
z: 1,
|
|
808
|
+
},
|
|
809
|
+
selectedShapeIds: ['shape:j0HKQihjBXqMqgVhfRhDS'],
|
|
810
|
+
focusedGroupId: null,
|
|
811
|
+
},
|
|
812
|
+
],
|
|
813
|
+
},
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
it('should position straight arrow terminals on shape boundary, not text label boundary', () => {
|
|
817
|
+
// Create a geo shape with text label
|
|
818
|
+
editor.loadSnapshot(data as any)
|
|
819
|
+
|
|
820
|
+
const arrow = editor.getShape('shape:j0HKQihjBXqMqgVhfRhDS' as TLShapeId) as TLArrowShape
|
|
821
|
+
expect(arrow).toBeDefined()
|
|
822
|
+
|
|
823
|
+
expect(getArrowBindings(editor, arrow)).toMatchObject({
|
|
824
|
+
end: { props: { isPrecise: true } },
|
|
825
|
+
start: { props: { isPrecise: true } },
|
|
826
|
+
})
|
|
827
|
+
|
|
828
|
+
const info = getArrowInfo(editor, arrow)
|
|
829
|
+
expect(info?.start.handle).toEqual(info?.start.point)
|
|
830
|
+
expect(info?.end.handle).toEqual(info?.end.point)
|
|
831
|
+
})
|
|
832
|
+
})
|
|
@@ -144,6 +144,9 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
144
144
|
override hideSelectionBoundsFg() {
|
|
145
145
|
return true
|
|
146
146
|
}
|
|
147
|
+
override hideInMinimap() {
|
|
148
|
+
return true
|
|
149
|
+
}
|
|
147
150
|
|
|
148
151
|
override canBeLaidOut(shape: TLArrowShape, info: TLShapeUtilCanBeLaidOutOpts) {
|
|
149
152
|
if (info.type === 'flip') {
|
|
@@ -154,7 +154,10 @@ export function getCurvedArrowInfo(
|
|
|
154
154
|
}
|
|
155
155
|
if (!point) {
|
|
156
156
|
if (isClosed) {
|
|
157
|
-
const nearestPoint = startShapeInfo.geometry.nearestPoint(startInStartShapeLocalSpace
|
|
157
|
+
const nearestPoint = startShapeInfo.geometry.nearestPoint(startInStartShapeLocalSpace, {
|
|
158
|
+
includeInternal: false,
|
|
159
|
+
includeLabels: false,
|
|
160
|
+
})
|
|
158
161
|
if (Vec.DistMin(nearestPoint, startInStartShapeLocalSpace, 1)) {
|
|
159
162
|
point = nearestPoint
|
|
160
163
|
}
|
|
@@ -233,7 +236,10 @@ export function getCurvedArrowInfo(
|
|
|
233
236
|
}
|
|
234
237
|
if (!point) {
|
|
235
238
|
if (isClosed) {
|
|
236
|
-
const nearestPoint = endShapeInfo.geometry.nearestPoint(endInEndShapeLocalSpace
|
|
239
|
+
const nearestPoint = endShapeInfo.geometry.nearestPoint(endInEndShapeLocalSpace, {
|
|
240
|
+
includeInternal: false,
|
|
241
|
+
includeLabels: false,
|
|
242
|
+
})
|
|
237
243
|
if (Vec.DistMin(nearestPoint, endInEndShapeLocalSpace, 1)) {
|
|
238
244
|
point = nearestPoint
|
|
239
245
|
}
|
|
@@ -248,7 +248,11 @@ function updateArrowheadPointWithBoundShape(
|
|
|
248
248
|
if (targetInt === undefined) {
|
|
249
249
|
// No intersection? The arrowhead point will be at the arrow terminal.
|
|
250
250
|
// if we _almost_ hit the target, just put the arrowhead at the target.
|
|
251
|
-
targetInt = targetShapeInfo.geometry.nearestPoint(targetTo
|
|
251
|
+
targetInt = targetShapeInfo.geometry.nearestPoint(targetTo, {
|
|
252
|
+
includeLabels: false,
|
|
253
|
+
includeInternal: false,
|
|
254
|
+
})
|
|
255
|
+
|
|
252
256
|
if (!Vec.DistMin(targetInt, targetTo, 1)) {
|
|
253
257
|
return
|
|
254
258
|
}
|