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
|
@@ -4,7 +4,7 @@ import { CursorTypeMap } from '../../PointingResizeHandle'
|
|
|
4
4
|
type TLPointingCropHandleInfo = TLPointerEventInfo & {
|
|
5
5
|
target: 'selection'
|
|
6
6
|
} & {
|
|
7
|
-
onInteractionEnd?: string
|
|
7
|
+
onInteractionEnd?: string | (() => void)
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export class PointingCropHandle extends StateNode {
|
|
@@ -14,7 +14,9 @@ export class PointingCropHandle extends StateNode {
|
|
|
14
14
|
|
|
15
15
|
override onEnter(info: TLPointingCropHandleInfo) {
|
|
16
16
|
this.info = info
|
|
17
|
-
|
|
17
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
18
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
19
|
+
}
|
|
18
20
|
const selectedShape = this.editor.getSelectedShapes()[0]
|
|
19
21
|
if (!selectedShape) return
|
|
20
22
|
|
|
@@ -47,12 +49,17 @@ export class PointingCropHandle extends StateNode {
|
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
override onPointerUp() {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
const { onInteractionEnd } = this.info
|
|
53
|
+
if (onInteractionEnd) {
|
|
54
|
+
if (typeof onInteractionEnd === 'string') {
|
|
55
|
+
this.editor.setCurrentTool(onInteractionEnd, this.info)
|
|
56
|
+
} else {
|
|
57
|
+
onInteractionEnd()
|
|
58
|
+
}
|
|
59
|
+
return
|
|
55
60
|
}
|
|
61
|
+
this.editor.setCroppingShape(null)
|
|
62
|
+
this.editor.setCurrentTool('select.idle')
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
override onCancel() {
|
|
@@ -68,11 +75,16 @@ export class PointingCropHandle extends StateNode {
|
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
private cancel() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
const { onInteractionEnd } = this.info
|
|
79
|
+
if (onInteractionEnd) {
|
|
80
|
+
if (typeof onInteractionEnd === 'string') {
|
|
81
|
+
this.editor.setCurrentTool(onInteractionEnd, this.info)
|
|
82
|
+
} else {
|
|
83
|
+
onInteractionEnd()
|
|
84
|
+
}
|
|
85
|
+
return
|
|
76
86
|
}
|
|
87
|
+
this.editor.setCroppingShape(null)
|
|
88
|
+
this.editor.setCurrentTool('select.idle')
|
|
77
89
|
}
|
|
78
90
|
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
snapAngle,
|
|
13
13
|
sortByIndex,
|
|
14
14
|
structuredClone,
|
|
15
|
+
warnOnce,
|
|
15
16
|
} from '@tldraw/editor'
|
|
16
17
|
import { ArrowShapeUtil } from '../../../shapes/arrow/ArrowShapeUtil'
|
|
17
18
|
import { clearArrowTargetState } from '../../../shapes/arrow/arrowTargetState'
|
|
@@ -20,7 +21,7 @@ import { getArrowBindings } from '../../../shapes/arrow/shared'
|
|
|
20
21
|
export type DraggingHandleInfo = TLPointerEventInfo & {
|
|
21
22
|
shape: TLArrowShape | TLLineShape
|
|
22
23
|
target: 'handle'
|
|
23
|
-
onInteractionEnd?: string
|
|
24
|
+
onInteractionEnd?: string | (() => void)
|
|
24
25
|
isCreating?: boolean
|
|
25
26
|
creatingMarkId?: string
|
|
26
27
|
}
|
|
@@ -46,7 +47,9 @@ export class DraggingHandle extends StateNode {
|
|
|
46
47
|
override onEnter(info: DraggingHandleInfo) {
|
|
47
48
|
const { shape, isCreating, creatingMarkId, handle } = info
|
|
48
49
|
this.info = info
|
|
49
|
-
|
|
50
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
51
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
52
|
+
}
|
|
50
53
|
this.shapeId = shape.id
|
|
51
54
|
this.markId = ''
|
|
52
55
|
|
|
@@ -219,11 +222,17 @@ export class DraggingHandle extends StateNode {
|
|
|
219
222
|
}
|
|
220
223
|
|
|
221
224
|
const { onInteractionEnd } = this.info
|
|
222
|
-
if (
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
225
|
+
if (onInteractionEnd) {
|
|
226
|
+
if (typeof onInteractionEnd === 'string') {
|
|
227
|
+
if (this.editor.getInstanceState().isToolLocked && onInteractionEnd) {
|
|
228
|
+
// Return to the tool that was active before this one but only if tool lock is turned on!
|
|
229
|
+
this.editor.setCurrentTool(onInteractionEnd, { shapeId: this.shapeId })
|
|
230
|
+
return
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
onInteractionEnd?.()
|
|
234
|
+
return
|
|
235
|
+
}
|
|
227
236
|
}
|
|
228
237
|
|
|
229
238
|
this.parent.transition('idle')
|
|
@@ -248,9 +257,12 @@ export class DraggingHandle extends StateNode {
|
|
|
248
257
|
|
|
249
258
|
const { onInteractionEnd } = this.info
|
|
250
259
|
if (onInteractionEnd) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
260
|
+
if (typeof onInteractionEnd === 'string') {
|
|
261
|
+
// Return to the tool that was active before this one, whether tool lock is turned on or not!
|
|
262
|
+
this.editor.setCurrentTool(onInteractionEnd, { shapeId: this.shapeId })
|
|
263
|
+
} else {
|
|
264
|
+
onInteractionEnd?.()
|
|
265
|
+
}
|
|
254
266
|
return
|
|
255
267
|
}
|
|
256
268
|
|
|
@@ -294,7 +306,18 @@ export class DraggingHandle extends StateNode {
|
|
|
294
306
|
|
|
295
307
|
let nextHandle = { ...initialHandle, x: point.x, y: point.y }
|
|
296
308
|
|
|
297
|
-
|
|
309
|
+
let canSnap = false
|
|
310
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
311
|
+
if (initialHandle.canSnap && initialHandle.snapType) {
|
|
312
|
+
warnOnce(
|
|
313
|
+
'canSnap is deprecated. Cannot use both canSnap and snapType together - snapping disabled. Please use only snapType.'
|
|
314
|
+
)
|
|
315
|
+
} else {
|
|
316
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
317
|
+
canSnap = initialHandle.canSnap || initialHandle.snapType !== undefined
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (canSnap && (isSnapMode ? !ctrlKey : ctrlKey)) {
|
|
298
321
|
// We're snapping
|
|
299
322
|
const pageTransform = editor.getShapePageTransform(shape.id)
|
|
300
323
|
if (!pageTransform) throw Error('Expected a page transform')
|
|
@@ -516,7 +516,7 @@ export class Idle extends StateNode {
|
|
|
516
516
|
}
|
|
517
517
|
|
|
518
518
|
override onKeyUp(info: TLKeyboardEventInfo) {
|
|
519
|
-
switch (info.
|
|
519
|
+
switch (info.key) {
|
|
520
520
|
case 'Enter': {
|
|
521
521
|
// Because Enter onKeyDown can happen outside the canvas (but then focus the canvas potentially),
|
|
522
522
|
// we need to check if the canvas was initially selecting something before continuing.
|
|
@@ -23,7 +23,7 @@ export class PointingArrowLabel extends StateNode {
|
|
|
23
23
|
|
|
24
24
|
private info = {} as TLPointerEventInfo & {
|
|
25
25
|
shape: TLArrowShape
|
|
26
|
-
onInteractionEnd?: string
|
|
26
|
+
onInteractionEnd?: string | (() => void)
|
|
27
27
|
isCreating: boolean
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -34,12 +34,14 @@ export class PointingArrowLabel extends StateNode {
|
|
|
34
34
|
override onEnter(
|
|
35
35
|
info: TLPointerEventInfo & {
|
|
36
36
|
shape: TLArrowShape
|
|
37
|
-
onInteractionEnd?: string
|
|
37
|
+
onInteractionEnd?: string | (() => void)
|
|
38
38
|
isCreating: boolean
|
|
39
39
|
}
|
|
40
40
|
) {
|
|
41
41
|
const { shape } = info
|
|
42
|
-
|
|
42
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
43
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
44
|
+
}
|
|
43
45
|
this.info = info
|
|
44
46
|
this.shapeId = shape.id
|
|
45
47
|
this.didDrag = false
|
|
@@ -155,20 +157,30 @@ export class PointingArrowLabel extends StateNode {
|
|
|
155
157
|
}
|
|
156
158
|
|
|
157
159
|
private complete() {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
const { onInteractionEnd } = this.info
|
|
161
|
+
if (onInteractionEnd) {
|
|
162
|
+
if (typeof onInteractionEnd === 'string') {
|
|
163
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
164
|
+
} else {
|
|
165
|
+
onInteractionEnd()
|
|
166
|
+
}
|
|
167
|
+
return
|
|
162
168
|
}
|
|
169
|
+
this.parent.transition('idle')
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
private cancel() {
|
|
166
173
|
this.editor.bailToMark(this.markId)
|
|
167
174
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
175
|
+
const { onInteractionEnd } = this.info
|
|
176
|
+
if (onInteractionEnd) {
|
|
177
|
+
if (typeof onInteractionEnd === 'string') {
|
|
178
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
179
|
+
} else {
|
|
180
|
+
onInteractionEnd()
|
|
181
|
+
}
|
|
182
|
+
return
|
|
172
183
|
}
|
|
184
|
+
this.parent.transition('idle')
|
|
173
185
|
}
|
|
174
186
|
}
|
|
@@ -17,7 +17,7 @@ export const CursorTypeMap: Record<TLSelectionHandle, TLCursorType> = {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
type PointingResizeHandleInfo = Extract<TLPointerEventInfo, { target: 'selection' }> & {
|
|
20
|
-
onInteractionEnd?: string
|
|
20
|
+
onInteractionEnd?: string | (() => void)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export class PointingResizeHandle extends StateNode {
|
|
@@ -36,9 +36,16 @@ export class PointingResizeHandle extends StateNode {
|
|
|
36
36
|
|
|
37
37
|
override onEnter(info: PointingResizeHandleInfo) {
|
|
38
38
|
this.info = info
|
|
39
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
40
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
41
|
+
}
|
|
39
42
|
this.updateCursor()
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
override onExit() {
|
|
46
|
+
this.parent.setCurrentToolIdMask(undefined)
|
|
47
|
+
}
|
|
48
|
+
|
|
42
49
|
override onPointerMove() {
|
|
43
50
|
if (this.editor.inputs.isDragging) {
|
|
44
51
|
this.startResizing()
|
|
@@ -71,18 +78,28 @@ export class PointingResizeHandle extends StateNode {
|
|
|
71
78
|
}
|
|
72
79
|
|
|
73
80
|
private complete() {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
const { onInteractionEnd } = this.info
|
|
82
|
+
if (onInteractionEnd) {
|
|
83
|
+
if (typeof onInteractionEnd === 'string') {
|
|
84
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
85
|
+
} else {
|
|
86
|
+
onInteractionEnd()
|
|
87
|
+
}
|
|
88
|
+
return
|
|
78
89
|
}
|
|
90
|
+
this.parent.transition('idle')
|
|
79
91
|
}
|
|
80
92
|
|
|
81
93
|
private cancel() {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
94
|
+
const { onInteractionEnd } = this.info
|
|
95
|
+
if (onInteractionEnd) {
|
|
96
|
+
if (typeof onInteractionEnd === 'string') {
|
|
97
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
98
|
+
} else {
|
|
99
|
+
onInteractionEnd()
|
|
100
|
+
}
|
|
101
|
+
return
|
|
86
102
|
}
|
|
103
|
+
this.parent.transition('idle')
|
|
87
104
|
}
|
|
88
105
|
}
|
|
@@ -2,7 +2,7 @@ import { RotateCorner, StateNode, TLPointerEventInfo } from '@tldraw/editor'
|
|
|
2
2
|
import { CursorTypeMap } from './PointingResizeHandle'
|
|
3
3
|
|
|
4
4
|
type PointingRotateHandleInfo = Extract<TLPointerEventInfo, { target: 'selection' }> & {
|
|
5
|
-
onInteractionEnd?: string
|
|
5
|
+
onInteractionEnd?: string | (() => void)
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export class PointingRotateHandle extends StateNode {
|
|
@@ -18,8 +18,10 @@ export class PointingRotateHandle extends StateNode {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
override onEnter(info: PointingRotateHandleInfo) {
|
|
21
|
-
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
22
21
|
this.info = info
|
|
22
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
23
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
24
|
+
}
|
|
23
25
|
this.updateCursor()
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -60,18 +62,29 @@ export class PointingRotateHandle extends StateNode {
|
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
private complete() {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const { onInteractionEnd } = this.info
|
|
66
|
+
if (onInteractionEnd) {
|
|
67
|
+
if (typeof onInteractionEnd === 'string') {
|
|
68
|
+
// Return to the tool that was active before this one, whether tool lock is turned on or not!
|
|
69
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
70
|
+
} else {
|
|
71
|
+
onInteractionEnd?.()
|
|
72
|
+
}
|
|
73
|
+
return
|
|
67
74
|
}
|
|
75
|
+
this.parent.transition('idle')
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
private cancel() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
79
|
+
const { onInteractionEnd } = this.info
|
|
80
|
+
if (onInteractionEnd) {
|
|
81
|
+
if (typeof onInteractionEnd === 'string') {
|
|
82
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
83
|
+
} else {
|
|
84
|
+
onInteractionEnd()
|
|
85
|
+
}
|
|
86
|
+
return
|
|
75
87
|
}
|
|
88
|
+
this.parent.transition('idle')
|
|
76
89
|
}
|
|
77
90
|
}
|
|
@@ -29,7 +29,7 @@ export type ResizingInfo = TLPointerEventInfo & {
|
|
|
29
29
|
creatingMarkId?: string
|
|
30
30
|
onCreate?(shape: TLShape | null): void
|
|
31
31
|
creationCursorOffset?: VecLike
|
|
32
|
-
onInteractionEnd?: string
|
|
32
|
+
onInteractionEnd?: string | (() => void)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export class Resizing extends StateNode {
|
|
@@ -55,7 +55,9 @@ export class Resizing extends StateNode {
|
|
|
55
55
|
this.info = info
|
|
56
56
|
this.didHoldCommand = false
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
59
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
60
|
+
}
|
|
59
61
|
this.creationCursorOffset = creationCursorOffset
|
|
60
62
|
|
|
61
63
|
try {
|
|
@@ -135,11 +137,16 @@ export class Resizing extends StateNode {
|
|
|
135
137
|
|
|
136
138
|
this.editor.bailToMark(this.markId)
|
|
137
139
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
const { onInteractionEnd } = this.info
|
|
141
|
+
if (onInteractionEnd) {
|
|
142
|
+
if (typeof onInteractionEnd === 'string') {
|
|
143
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
144
|
+
} else {
|
|
145
|
+
onInteractionEnd()
|
|
146
|
+
}
|
|
147
|
+
return
|
|
142
148
|
}
|
|
149
|
+
this.parent.transition('idle')
|
|
143
150
|
}
|
|
144
151
|
|
|
145
152
|
private complete() {
|
|
@@ -152,9 +159,17 @@ export class Resizing extends StateNode {
|
|
|
152
159
|
return
|
|
153
160
|
}
|
|
154
161
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
162
|
+
const { onInteractionEnd } = this.info
|
|
163
|
+
if (onInteractionEnd) {
|
|
164
|
+
if (typeof onInteractionEnd === 'string') {
|
|
165
|
+
if (this.editor.getInstanceState().isToolLocked) {
|
|
166
|
+
this.editor.setCurrentTool(onInteractionEnd, {})
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
onInteractionEnd()
|
|
171
|
+
return
|
|
172
|
+
}
|
|
158
173
|
}
|
|
159
174
|
|
|
160
175
|
this.parent.transition('idle')
|
|
@@ -19,14 +19,20 @@ export class Rotating extends StateNode {
|
|
|
19
19
|
|
|
20
20
|
snapshot = {} as TLRotationSnapshot
|
|
21
21
|
|
|
22
|
-
info = {} as Extract<TLPointerEventInfo, { target: 'selection' }> & {
|
|
22
|
+
info = {} as Extract<TLPointerEventInfo, { target: 'selection' }> & {
|
|
23
|
+
onInteractionEnd?: string | (() => void)
|
|
24
|
+
}
|
|
23
25
|
|
|
24
26
|
markId = ''
|
|
25
27
|
|
|
26
|
-
override onEnter(
|
|
28
|
+
override onEnter(
|
|
29
|
+
info: TLPointerEventInfo & { target: 'selection'; onInteractionEnd?: string | (() => void) }
|
|
30
|
+
) {
|
|
27
31
|
// Store the event information
|
|
28
32
|
this.info = info
|
|
29
|
-
|
|
33
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
34
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
35
|
+
}
|
|
30
36
|
|
|
31
37
|
this.markId = this.editor.markHistoryStoppingPoint('rotate start')
|
|
32
38
|
|
|
@@ -121,11 +127,16 @@ export class Rotating extends StateNode {
|
|
|
121
127
|
})
|
|
122
128
|
|
|
123
129
|
this.editor.bailToMark(this.markId)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
const { onInteractionEnd } = this.info
|
|
131
|
+
if (onInteractionEnd) {
|
|
132
|
+
if (typeof onInteractionEnd === 'string') {
|
|
133
|
+
this.editor.setCurrentTool(onInteractionEnd, this.info)
|
|
134
|
+
} else {
|
|
135
|
+
onInteractionEnd()
|
|
136
|
+
}
|
|
137
|
+
return
|
|
128
138
|
}
|
|
139
|
+
this.parent.transition('idle', this.info)
|
|
129
140
|
}
|
|
130
141
|
|
|
131
142
|
private complete() {
|
|
@@ -139,11 +150,16 @@ export class Rotating extends StateNode {
|
|
|
139
150
|
this.editor,
|
|
140
151
|
this.snapshot.shapeSnapshots.map((s) => s.shape.id)
|
|
141
152
|
)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
const { onInteractionEnd } = this.info
|
|
154
|
+
if (onInteractionEnd) {
|
|
155
|
+
if (typeof onInteractionEnd === 'string') {
|
|
156
|
+
this.editor.setCurrentTool(onInteractionEnd, this.info)
|
|
157
|
+
} else {
|
|
158
|
+
onInteractionEnd()
|
|
159
|
+
}
|
|
160
|
+
return
|
|
146
161
|
}
|
|
162
|
+
this.parent.transition('idle', this.info)
|
|
147
163
|
}
|
|
148
164
|
|
|
149
165
|
_getRotationFromPointerPosition({ snapToNearestDegree }: { snapToNearestDegree: boolean }) {
|
|
@@ -28,7 +28,7 @@ export type TranslatingInfo = TLPointerEventInfo & {
|
|
|
28
28
|
isCreating?: boolean
|
|
29
29
|
creatingMarkId?: string
|
|
30
30
|
onCreate?(): void
|
|
31
|
-
onInteractionEnd?: string
|
|
31
|
+
onInteractionEnd?: string | (() => void)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export class Translating extends StateNode {
|
|
@@ -59,7 +59,9 @@ export class Translating extends StateNode {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
this.info = info
|
|
62
|
-
|
|
62
|
+
if (typeof info.onInteractionEnd === 'string') {
|
|
63
|
+
this.parent.setCurrentToolIdMask(info.onInteractionEnd)
|
|
64
|
+
}
|
|
63
65
|
this.isCreating = isCreating
|
|
64
66
|
|
|
65
67
|
this.markId = ''
|
|
@@ -190,15 +192,24 @@ export class Translating extends StateNode {
|
|
|
190
192
|
this.snapshot.movingShapes.map((s) => s.id)
|
|
191
193
|
)
|
|
192
194
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
const { onInteractionEnd } = this.info
|
|
196
|
+
if (onInteractionEnd) {
|
|
197
|
+
if (typeof onInteractionEnd === 'string') {
|
|
198
|
+
if (this.editor.getInstanceState().isToolLocked) {
|
|
199
|
+
this.editor.setCurrentTool(onInteractionEnd)
|
|
200
|
+
return
|
|
201
|
+
}
|
|
198
202
|
} else {
|
|
199
|
-
|
|
203
|
+
onInteractionEnd()
|
|
204
|
+
return
|
|
200
205
|
}
|
|
201
206
|
}
|
|
207
|
+
|
|
208
|
+
if (this.isCreating) {
|
|
209
|
+
this.onCreate?.(this.editor.getOnlySelectedShape())
|
|
210
|
+
} else {
|
|
211
|
+
this.parent.transition('idle')
|
|
212
|
+
}
|
|
202
213
|
}
|
|
203
214
|
|
|
204
215
|
private cancel() {
|
|
@@ -214,11 +225,16 @@ export class Translating extends StateNode {
|
|
|
214
225
|
})
|
|
215
226
|
|
|
216
227
|
this.reset()
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
228
|
+
const { onInteractionEnd } = this.info
|
|
229
|
+
if (onInteractionEnd) {
|
|
230
|
+
if (typeof onInteractionEnd === 'string') {
|
|
231
|
+
this.editor.setCurrentTool(onInteractionEnd)
|
|
232
|
+
} else {
|
|
233
|
+
onInteractionEnd()
|
|
234
|
+
}
|
|
235
|
+
return
|
|
221
236
|
}
|
|
237
|
+
this.parent.transition('idle', this.info)
|
|
222
238
|
}
|
|
223
239
|
|
|
224
240
|
protected handleStart() {
|
|
@@ -249,6 +249,12 @@ export class MinimapManager {
|
|
|
249
249
|
|
|
250
250
|
const len = geometry.length
|
|
251
251
|
|
|
252
|
+
const shape = this.editor.getShape(shapeId)
|
|
253
|
+
if (shape) {
|
|
254
|
+
const shapeUtil = this.editor.getShapeUtil(shape.type)
|
|
255
|
+
if (shapeUtil.hideInMinimap?.(shape)) continue
|
|
256
|
+
}
|
|
257
|
+
|
|
252
258
|
if (selectedShapes.has(shapeId)) {
|
|
253
259
|
appendVertices(this.gl.selectedShapes, selectedShapeOffset, geometry)
|
|
254
260
|
selectedShapeOffset += len
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { useContainer, useEditor, usePeerIds, useValue } from '@tldraw/editor'
|
|
2
2
|
import { Popover as _Popover } from 'radix-ui'
|
|
3
3
|
import { ReactNode } from 'react'
|
|
4
|
+
import { PORTRAIT_BREAKPOINT } from '../../constants'
|
|
5
|
+
import { useBreakpoint } from '../../context/breakpoints'
|
|
4
6
|
import { useMenuIsOpen } from '../../hooks/useMenuIsOpen'
|
|
5
7
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
6
8
|
import { PeopleMenuAvatar } from './PeopleMenuAvatar'
|
|
@@ -25,6 +27,8 @@ export function PeopleMenu({ children }: PeopleMenuProps) {
|
|
|
25
27
|
const userName = useValue('user', () => editor.user.getName(), [editor])
|
|
26
28
|
|
|
27
29
|
const [isOpen, onOpenChange] = useMenuIsOpen('people menu')
|
|
30
|
+
const breakpoint = useBreakpoint()
|
|
31
|
+
const maxAvatars = breakpoint <= PORTRAIT_BREAKPOINT.MOBILE_XS ? 1 : 5
|
|
28
32
|
|
|
29
33
|
if (!userIds.length) return null
|
|
30
34
|
|
|
@@ -33,7 +37,7 @@ export function PeopleMenu({ children }: PeopleMenuProps) {
|
|
|
33
37
|
<_Popover.Trigger dir="ltr" asChild>
|
|
34
38
|
<button className="tlui-people-menu__avatars-button" title={msg('people-menu.title')}>
|
|
35
39
|
<div className="tlui-people-menu__avatars">
|
|
36
|
-
{userIds.slice(-
|
|
40
|
+
{userIds.slice(-maxAvatars).map((userId) => (
|
|
37
41
|
<PeopleMenuAvatar key={userId} userId={userId} />
|
|
38
42
|
))}
|
|
39
43
|
{userIds.length > 0 && (
|
|
@@ -46,7 +50,7 @@ export function PeopleMenu({ children }: PeopleMenuProps) {
|
|
|
46
50
|
{userName?.[0] ?? ''}
|
|
47
51
|
</div>
|
|
48
52
|
)}
|
|
49
|
-
{userIds.length >
|
|
53
|
+
{userIds.length > maxAvatars && <PeopleMenuMore count={userIds.length - maxAvatars} />}
|
|
50
54
|
</div>
|
|
51
55
|
</button>
|
|
52
56
|
</_Popover.Trigger>
|