tldraw 4.3.0-canary.d8da2a99f394 → 4.3.0-canary.da3162650c27
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/README.md +0 -2
- package/dist-cjs/index.d.ts +311 -242
- package/dist-cjs/index.js +13 -5
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
- package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
- package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/defaultSideEffects.js +6 -1
- package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
- package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
- package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/crop.js +1 -0
- package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
- package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
- package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
- package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
- 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/PointingCrop.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
- package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
- package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
- package/dist-cjs/lib/ui/components/menu-items.js +3 -1
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +7 -8
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +1 -2
- package/dist-cjs/lib/ui/context/components.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
- package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
- package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
- package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
- package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
- package/dist-cjs/lib/utils/text/richText.js +11 -19
- package/dist-cjs/lib/utils/text/richText.js.map +3 -3
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +311 -242
- package/dist-esm/index.mjs +14 -5
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
- package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/defaultSideEffects.mjs +6 -1
- package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
- package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
- package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
- package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
- 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/PointingCrop.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
- package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +7 -8
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +1 -2
- package/dist-esm/lib/ui/context/components.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
- package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
- package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
- package/dist-esm/lib/utils/test-helpers.mjs +21 -0
- package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
- package/dist-esm/lib/utils/text/richText.mjs +8 -5
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +18 -16
- package/src/index.ts +6 -2
- package/src/lib/Tldraw.test.tsx +46 -1
- package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
- package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
- package/src/lib/defaultEmbedDefinitions.ts +2 -1
- package/src/lib/defaultExternalContentHandlers.ts +13 -14
- package/src/lib/defaultSideEffects.ts +6 -1
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
- package/src/lib/shapes/arrow/arrow-types.ts +2 -0
- package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
- package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
- package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
- package/src/lib/shapes/arrow/shared.ts +4 -4
- package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
- package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
- package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
- package/src/lib/shapes/draw/getPath.ts +31 -10
- package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
- package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
- package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
- package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
- package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
- package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
- package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
- package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
- package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
- package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
- package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
- package/src/lib/shapes/note/noteCloning.test.ts +3 -1
- package/src/lib/shapes/note/noteHelpers.ts +2 -2
- package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
- package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
- package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
- package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
- package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
- package/src/lib/shapes/shared/crop.ts +1 -0
- package/src/lib/shapes/shared/interpolate-props.ts +4 -4
- package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
- package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
- package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
- package/src/lib/shapes/text/RichTextArea.tsx +5 -0
- package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
- package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
- package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
- package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
- package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
- package/src/lib/tools/HandTool/HandTool.ts +3 -5
- package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
- package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
- package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
- package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
- package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
- package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
- package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
- package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
- package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
- package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
- package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
- package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
- package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
- package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
- package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
- package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
- package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
- package/src/lib/ui/TldrawUi.tsx +5 -2
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
- package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
- package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
- package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
- package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
- package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
- package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
- package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
- package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
- package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
- package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
- package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
- package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
- package/src/lib/ui/components/menu-items.tsx +9 -15
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
- package/src/lib/ui/context/actions.tsx +15 -19
- package/src/lib/ui/context/components.tsx +1 -2
- package/src/lib/ui/hooks/menu-hooks.ts +9 -19
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useFlatten.ts +1 -2
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
- package/src/lib/ui/hooks/useTools.tsx +5 -7
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +27 -23
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
- package/src/lib/utils/export/exportAs.ts +2 -9
- package/src/lib/utils/frames/frames.ts +1 -1
- package/src/lib/utils/test-helpers.ts +60 -0
- package/src/lib/utils/text/richText.ts +9 -8
- package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
- package/src/test/Editor.test.tsx +78 -41
- package/src/test/EraserTool.test.ts +10 -12
- package/src/test/SelectTool.test.ts +11 -19
- package/src/test/TestEditor.ts +49 -51
- package/src/test/TldrawEditor.test.tsx +24 -20
- package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
- package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
- package/src/test/arrows-megabus.test.tsx +1 -1
- package/src/test/bindings.test.tsx +29 -25
- package/src/test/bindingsIndex.test.tsx +4 -4
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
- package/src/test/commands/cameraState.test.ts +299 -0
- package/src/test/commands/createShape.test.ts +64 -0
- package/src/test/commands/createShapes.test.ts +15 -1
- package/src/test/commands/getSvgString.test.ts +2 -2
- package/src/test/commands/isShapeOfType.test.ts +44 -0
- package/src/test/commands/putContent.test.ts +80 -1
- package/src/test/commands/setCamera.test.ts +13 -11
- package/src/test/commands/stackShapes.test.ts +34 -8
- package/src/test/commands/updateShape.test.ts +67 -0
- package/src/test/commands/updateShapes.test.ts +21 -5
- package/src/test/commands/zoomToBounds.test.ts +19 -3
- package/src/test/commands/zoomToSelection.test.ts +14 -3
- package/src/test/custom-clipping.test.ts +52 -44
- package/src/test/customSnapping.test.tsx +77 -62
- package/src/test/drawing.test.ts +17 -10
- package/src/test/duplicate.test.ts +1 -1
- package/src/test/flipShapes.test.ts +33 -0
- package/src/test/frames.test.ts +94 -2
- package/src/test/getCulledShapes.test.tsx +11 -3
- package/src/test/getShapeAtPoint.test.ts +2 -2
- package/src/test/groups.test.tsx +7 -4
- package/src/test/modifiers.test.ts +6 -6
- package/src/test/resizing.test.ts +16 -22
- package/src/test/selection-omnibus.test.ts +13 -13
- package/src/test/shapeutils.test.ts +1 -1
- package/src/test/spacebarPanning.test.ts +28 -10
- package/src/test/styles2.test.tsx +1 -1
- package/src/test/styles3.test.ts +5 -5
- package/src/test/test-jsx.tsx +72 -57
- package/src/test/text.test.ts +15 -17
- package/src/test/translating.test.ts +6 -8
- package/src/test/ui/BackToContent.test.tsx +111 -0
- package/tldraw.css +41 -35
- package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
- package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
- package/dist-cjs/lib/utils/text/textDirection.js +0 -51
- package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
- package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
- package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
- package/src/lib/shapes/shared/useForceSolid.ts +0 -6
- package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
- package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
- package/src/lib/utils/text/textDirection.ts +0 -32
|
@@ -3,11 +3,9 @@ import {
|
|
|
3
3
|
StateNode,
|
|
4
4
|
TLAdjacentDirection,
|
|
5
5
|
TLClickEventInfo,
|
|
6
|
-
TLGroupShape,
|
|
7
6
|
TLKeyboardEventInfo,
|
|
8
7
|
TLPointerEventInfo,
|
|
9
8
|
TLShape,
|
|
10
|
-
TLTextShape,
|
|
11
9
|
Vec,
|
|
12
10
|
VecLike,
|
|
13
11
|
createShapeId,
|
|
@@ -18,10 +16,9 @@ import {
|
|
|
18
16
|
} from '@tldraw/editor'
|
|
19
17
|
import { isOverArrowLabel } from '../../../shapes/arrow/arrowLabel'
|
|
20
18
|
import { getHitShapeOnCanvasPointerDown } from '../../selection-logic/getHitShapeOnCanvasPointerDown'
|
|
21
|
-
import { getShouldEnterCropMode } from '../../selection-logic/getShouldEnterCropModeOnPointerDown'
|
|
22
19
|
import { selectOnCanvasPointerUp } from '../../selection-logic/selectOnCanvasPointerUp'
|
|
23
20
|
import { updateHoveredShapeId } from '../../selection-logic/updateHoveredShapeId'
|
|
24
|
-
import {
|
|
21
|
+
import { hasRichText, startEditingShapeWithRichText } from '../selectHelpers'
|
|
25
22
|
|
|
26
23
|
const SKIPPED_KEYS_FOR_AUTO_EDITING = [
|
|
27
24
|
'Delete',
|
|
@@ -55,8 +52,6 @@ export class Idle extends StateNode {
|
|
|
55
52
|
}
|
|
56
53
|
|
|
57
54
|
override onPointerDown(info: TLPointerEventInfo) {
|
|
58
|
-
const shouldEnterCropMode = info.ctrlKey && getShouldEnterCropMode(this.editor)
|
|
59
|
-
|
|
60
55
|
switch (info.target) {
|
|
61
56
|
case 'canvas': {
|
|
62
57
|
// Check to see if we hit any shape under the pointer; if so,
|
|
@@ -73,9 +68,7 @@ export class Idle extends StateNode {
|
|
|
73
68
|
|
|
74
69
|
const selectedShapeIds = this.editor.getSelectedShapeIds()
|
|
75
70
|
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
76
|
-
const
|
|
77
|
-
inputs: { currentPagePoint },
|
|
78
|
-
} = this.editor
|
|
71
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
79
72
|
|
|
80
73
|
if (
|
|
81
74
|
selectedShapeIds.length > 1 ||
|
|
@@ -108,7 +101,7 @@ export class Idle extends StateNode {
|
|
|
108
101
|
}
|
|
109
102
|
case 'handle': {
|
|
110
103
|
if (this.editor.getIsReadonly()) break
|
|
111
|
-
if (this.editor.inputs.
|
|
104
|
+
if (this.editor.inputs.getAltKey()) {
|
|
112
105
|
this.parent.transition('pointing_shape', info)
|
|
113
106
|
} else {
|
|
114
107
|
// If we're holding ctrl key, we might select it, or start brushing...
|
|
@@ -138,7 +131,8 @@ export class Idle extends StateNode {
|
|
|
138
131
|
case 'top_right':
|
|
139
132
|
case 'bottom_left':
|
|
140
133
|
case 'bottom_right': {
|
|
141
|
-
|
|
134
|
+
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
135
|
+
if (info.ctrlKey && this.editor.canCropShape(onlySelectedShape)) {
|
|
142
136
|
this.parent.transition('crop.pointing_crop_handle', info)
|
|
143
137
|
} else {
|
|
144
138
|
if (info.accelKey) {
|
|
@@ -173,7 +167,7 @@ export class Idle extends StateNode {
|
|
|
173
167
|
}
|
|
174
168
|
|
|
175
169
|
override onDoubleClick(info: TLClickEventInfo) {
|
|
176
|
-
if (this.editor.inputs.
|
|
170
|
+
if (this.editor.inputs.getShiftKey() || info.phase !== 'up') return
|
|
177
171
|
|
|
178
172
|
// We don't want to double click while toggling shapes
|
|
179
173
|
if (info.ctrlKey || info.shiftKey) return
|
|
@@ -189,11 +183,12 @@ export class Idle extends StateNode {
|
|
|
189
183
|
// of the shape yet because that also creates text shapes, and can produce
|
|
190
184
|
// unexpected results when working "inside of" a hollow shape.
|
|
191
185
|
|
|
186
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
192
187
|
const hitShape =
|
|
193
|
-
hoveredShape && !this.editor.isShapeOfType
|
|
188
|
+
hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
|
|
194
189
|
? hoveredShape
|
|
195
|
-
: (this.editor.getSelectedShapeAtPoint(
|
|
196
|
-
this.editor.getShapeAtPoint(
|
|
190
|
+
: (this.editor.getSelectedShapeAtPoint(currentPagePoint) ??
|
|
191
|
+
this.editor.getShapeAtPoint(currentPagePoint, {
|
|
197
192
|
margin: this.editor.options.hitTestMargin / this.editor.getZoomLevel(),
|
|
198
193
|
hitInside: false,
|
|
199
194
|
}))
|
|
@@ -201,13 +196,13 @@ export class Idle extends StateNode {
|
|
|
201
196
|
const focusedGroupId = this.editor.getFocusedGroupId()
|
|
202
197
|
|
|
203
198
|
if (hitShape) {
|
|
204
|
-
if (this.editor.isShapeOfType
|
|
199
|
+
if (this.editor.isShapeOfType(hitShape, 'group')) {
|
|
205
200
|
// Probably select the shape
|
|
206
201
|
selectOnCanvasPointerUp(this.editor, info)
|
|
207
202
|
return
|
|
208
203
|
} else {
|
|
209
204
|
const parent = this.editor.getShape(hitShape.parentId)
|
|
210
|
-
if (parent && this.editor.isShapeOfType
|
|
205
|
+
if (parent && this.editor.isShapeOfType(parent, 'group')) {
|
|
211
206
|
// The shape is the direct child of a group. If the group is
|
|
212
207
|
// selected, then we can select the shape. If the group is the
|
|
213
208
|
// focus layer id, then we can double click into it as usual.
|
|
@@ -234,30 +229,45 @@ export class Idle extends StateNode {
|
|
|
234
229
|
return
|
|
235
230
|
}
|
|
236
231
|
|
|
237
|
-
if (!this.editor.inputs.
|
|
232
|
+
if (!this.editor.inputs.getShiftKey()) {
|
|
238
233
|
this.handleDoubleClickOnCanvas(info)
|
|
239
234
|
}
|
|
240
235
|
break
|
|
241
236
|
}
|
|
242
237
|
case 'selection': {
|
|
243
|
-
if (this.editor.getIsReadonly()) break
|
|
244
|
-
|
|
245
238
|
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
246
239
|
|
|
247
240
|
if (onlySelectedShape) {
|
|
248
241
|
const util = this.editor.getShapeUtil(onlySelectedShape)
|
|
249
|
-
|
|
250
|
-
if (!this.canInteractWithShapeInReadOnly(onlySelectedShape)) {
|
|
251
|
-
return
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Test edges for an onDoubleClickEdge handler
|
|
255
|
-
if (
|
|
242
|
+
const isEdge =
|
|
256
243
|
info.handle === 'right' ||
|
|
257
244
|
info.handle === 'left' ||
|
|
258
245
|
info.handle === 'top' ||
|
|
259
246
|
info.handle === 'bottom'
|
|
260
|
-
|
|
247
|
+
const isCorner =
|
|
248
|
+
info.handle === 'top_left' ||
|
|
249
|
+
info.handle === 'top_right' ||
|
|
250
|
+
info.handle === 'bottom_right' ||
|
|
251
|
+
info.handle === 'bottom_left'
|
|
252
|
+
|
|
253
|
+
if (this.editor.getIsReadonly()) {
|
|
254
|
+
// includes readonly check
|
|
255
|
+
if (
|
|
256
|
+
this.editor.canEditShape(onlySelectedShape, {
|
|
257
|
+
type: isCorner
|
|
258
|
+
? 'double-click-corner'
|
|
259
|
+
: isEdge
|
|
260
|
+
? 'double-click-edge'
|
|
261
|
+
: 'double-click',
|
|
262
|
+
})
|
|
263
|
+
) {
|
|
264
|
+
this.startEditingShape(onlySelectedShape, info, true /* select all */)
|
|
265
|
+
}
|
|
266
|
+
break
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Test edges for an onDoubleClickEdge handler
|
|
270
|
+
if (isEdge) {
|
|
261
271
|
const change = util.onDoubleClickEdge?.(onlySelectedShape, info)
|
|
262
272
|
if (change) {
|
|
263
273
|
this.editor.markHistoryStoppingPoint('double click edge')
|
|
@@ -267,12 +277,7 @@ export class Idle extends StateNode {
|
|
|
267
277
|
}
|
|
268
278
|
}
|
|
269
279
|
|
|
270
|
-
if (
|
|
271
|
-
info.handle === 'top_left' ||
|
|
272
|
-
info.handle === 'top_right' ||
|
|
273
|
-
info.handle === 'bottom_right' ||
|
|
274
|
-
info.handle === 'bottom_left'
|
|
275
|
-
) {
|
|
280
|
+
if (isCorner) {
|
|
276
281
|
const change = util.onDoubleClickCorner?.(onlySelectedShape, info)
|
|
277
282
|
if (change) {
|
|
278
283
|
this.editor.markHistoryStoppingPoint('double click corner')
|
|
@@ -281,16 +286,14 @@ export class Idle extends StateNode {
|
|
|
281
286
|
return
|
|
282
287
|
}
|
|
283
288
|
}
|
|
289
|
+
|
|
284
290
|
// For corners OR edges but NOT rotation corners
|
|
285
|
-
if (
|
|
286
|
-
util.canCrop(onlySelectedShape) &&
|
|
287
|
-
!this.editor.isShapeOrAncestorLocked(onlySelectedShape)
|
|
288
|
-
) {
|
|
291
|
+
if (this.editor.canCropShape(onlySelectedShape)) {
|
|
289
292
|
this.parent.transition('crop', info)
|
|
290
293
|
return
|
|
291
294
|
}
|
|
292
295
|
|
|
293
|
-
if (this.
|
|
296
|
+
if (this.editor.canEditShape(onlySelectedShape)) {
|
|
294
297
|
this.startEditingShape(onlySelectedShape, info, true /* select all */)
|
|
295
298
|
}
|
|
296
299
|
}
|
|
@@ -321,7 +324,7 @@ export class Idle extends StateNode {
|
|
|
321
324
|
}
|
|
322
325
|
|
|
323
326
|
// If the shape can edit, then begin editing
|
|
324
|
-
if (this.
|
|
327
|
+
if (this.editor.canEditShape(shape)) {
|
|
325
328
|
this.startEditingShape(shape, info, true /* select all */)
|
|
326
329
|
} else {
|
|
327
330
|
// If the shape's double click handler has not created a change,
|
|
@@ -343,7 +346,7 @@ export class Idle extends StateNode {
|
|
|
343
346
|
} else {
|
|
344
347
|
// If the shape's double click handler has not created a change,
|
|
345
348
|
// and if the shape can edit, then begin editing the shape.
|
|
346
|
-
if (this.
|
|
349
|
+
if (this.editor.canEditShape(shape)) {
|
|
347
350
|
this.startEditingShape(shape, info, true /* select all */)
|
|
348
351
|
}
|
|
349
352
|
}
|
|
@@ -356,9 +359,9 @@ export class Idle extends StateNode {
|
|
|
356
359
|
case 'canvas': {
|
|
357
360
|
const hoveredShape = this.editor.getHoveredShape()
|
|
358
361
|
const hitShape =
|
|
359
|
-
hoveredShape && !this.editor.isShapeOfType
|
|
362
|
+
hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
|
|
360
363
|
? hoveredShape
|
|
361
|
-
: this.editor.getShapeAtPoint(this.editor.inputs.
|
|
364
|
+
: this.editor.getShapeAtPoint(this.editor.inputs.getCurrentPagePoint(), {
|
|
362
365
|
margin: this.editor.options.hitTestMargin / this.editor.getZoomLevel(),
|
|
363
366
|
hitInside: false,
|
|
364
367
|
hitLabels: true,
|
|
@@ -378,9 +381,7 @@ export class Idle extends StateNode {
|
|
|
378
381
|
|
|
379
382
|
const selectedShapeIds = this.editor.getSelectedShapeIds()
|
|
380
383
|
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
381
|
-
const
|
|
382
|
-
inputs: { currentPagePoint },
|
|
383
|
-
} = this.editor
|
|
384
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
384
385
|
|
|
385
386
|
if (
|
|
386
387
|
selectedShapeIds.length > 1 ||
|
|
@@ -473,7 +474,7 @@ export class Idle extends StateNode {
|
|
|
473
474
|
// If it's a note shape, then edit on type
|
|
474
475
|
this.editor.isShapeOfType(onlySelectedShape, 'note') &&
|
|
475
476
|
// If it's not locked or anything
|
|
476
|
-
this.
|
|
477
|
+
this.editor.canEditShape(onlySelectedShape)
|
|
477
478
|
) {
|
|
478
479
|
this.startEditingShape(
|
|
479
480
|
onlySelectedShape,
|
|
@@ -525,9 +526,7 @@ export class Idle extends StateNode {
|
|
|
525
526
|
const selectedShapes = this.editor.getSelectedShapes()
|
|
526
527
|
|
|
527
528
|
// On enter, if every selected shape is a group, then select all of the children of the groups
|
|
528
|
-
if (
|
|
529
|
-
selectedShapes.every((shape) => this.editor.isShapeOfType<TLGroupShape>(shape, 'group'))
|
|
530
|
-
) {
|
|
529
|
+
if (selectedShapes.every((shape) => this.editor.isShapeOfType(shape, 'group'))) {
|
|
531
530
|
this.editor.setSelectedShapes(
|
|
532
531
|
selectedShapes.flatMap((shape) => this.editor.getSortedChildIdsForParent(shape.id))
|
|
533
532
|
)
|
|
@@ -536,7 +535,10 @@ export class Idle extends StateNode {
|
|
|
536
535
|
|
|
537
536
|
// If the only selected shape is editable, then begin editing it
|
|
538
537
|
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
539
|
-
if (
|
|
538
|
+
if (
|
|
539
|
+
onlySelectedShape &&
|
|
540
|
+
this.editor.canEditShape(onlySelectedShape, { type: 'press_enter' })
|
|
541
|
+
) {
|
|
540
542
|
this.startEditingShape(
|
|
541
543
|
onlySelectedShape,
|
|
542
544
|
{
|
|
@@ -550,7 +552,7 @@ export class Idle extends StateNode {
|
|
|
550
552
|
}
|
|
551
553
|
|
|
552
554
|
// If the only selected shape is croppable, then begin cropping it
|
|
553
|
-
if (
|
|
555
|
+
if (this.editor.canCropShape(onlySelectedShape)) {
|
|
554
556
|
this.parent.transition('crop', info)
|
|
555
557
|
}
|
|
556
558
|
break
|
|
@@ -565,23 +567,18 @@ export class Idle extends StateNode {
|
|
|
565
567
|
}
|
|
566
568
|
}
|
|
567
569
|
|
|
568
|
-
private shouldStartEditingShape(
|
|
569
|
-
shape: TLShape | null = this.editor.getOnlySelectedShape()
|
|
570
|
-
): boolean {
|
|
571
|
-
if (!shape) return false
|
|
572
|
-
if (this.editor.isShapeOrAncestorLocked(shape) && shape.type !== 'embed') return false
|
|
573
|
-
if (!this.canInteractWithShapeInReadOnly(shape)) return false
|
|
574
|
-
return this.editor.getShapeUtil(shape).canEdit(shape)
|
|
575
|
-
}
|
|
576
|
-
|
|
577
570
|
private startEditingShape(
|
|
578
571
|
shape: TLShape,
|
|
579
572
|
info: TLClickEventInfo | TLKeyboardEventInfo,
|
|
580
573
|
shouldSelectAll?: boolean
|
|
581
574
|
) {
|
|
582
|
-
|
|
575
|
+
const { editor } = this
|
|
583
576
|
this.editor.markHistoryStoppingPoint('editing shape')
|
|
584
|
-
|
|
577
|
+
if (hasRichText(shape)) {
|
|
578
|
+
startEditingShapeWithRichText(editor, shape, { selectAll: shouldSelectAll })
|
|
579
|
+
} else {
|
|
580
|
+
editor.setEditingShape(shape)
|
|
581
|
+
}
|
|
585
582
|
this.parent.transition('editing_shape', info)
|
|
586
583
|
}
|
|
587
584
|
|
|
@@ -601,10 +598,10 @@ export class Idle extends StateNode {
|
|
|
601
598
|
|
|
602
599
|
const id = createShapeId()
|
|
603
600
|
|
|
604
|
-
const { x, y } = this.editor.inputs.
|
|
601
|
+
const { x, y } = this.editor.inputs.getCurrentPagePoint()
|
|
605
602
|
|
|
606
603
|
// Allow this to trigger the max shapes reached alert
|
|
607
|
-
this.editor.createShapes
|
|
604
|
+
this.editor.createShapes([
|
|
608
605
|
{
|
|
609
606
|
id,
|
|
610
607
|
type: 'text',
|
|
@@ -620,16 +617,9 @@ export class Idle extends StateNode {
|
|
|
620
617
|
const shape = this.editor.getShape(id)
|
|
621
618
|
if (!shape) return
|
|
622
619
|
|
|
623
|
-
|
|
624
|
-
if (this.editor.getIsReadonly()) {
|
|
625
|
-
if (!util.canEditInReadonly(shape)) {
|
|
626
|
-
return
|
|
627
|
-
}
|
|
628
|
-
}
|
|
620
|
+
if (!this.editor.canEditShape(shape)) return
|
|
629
621
|
|
|
630
|
-
this.editor
|
|
631
|
-
this.editor.select(id)
|
|
632
|
-
this.parent.transition('editing_shape', info)
|
|
622
|
+
startEditingShapeWithRichText(this.editor, id, { info })
|
|
633
623
|
}
|
|
634
624
|
|
|
635
625
|
private nudgeSelectedShapes(ephemeral = false) {
|
|
@@ -669,13 +659,6 @@ export class Idle extends StateNode {
|
|
|
669
659
|
this.editor.nudgeShapes(selectedShapeIds, delta.mul(step))
|
|
670
660
|
kickoutOccludedShapes(this.editor, selectedShapeIds)
|
|
671
661
|
}
|
|
672
|
-
|
|
673
|
-
private canInteractWithShapeInReadOnly(shape: TLShape) {
|
|
674
|
-
if (!this.editor.getIsReadonly()) return true
|
|
675
|
-
const util = this.editor.getShapeUtil(shape)
|
|
676
|
-
if (util.canEditInReadonly(shape)) return true
|
|
677
|
-
return false
|
|
678
|
-
}
|
|
679
662
|
}
|
|
680
663
|
|
|
681
664
|
export const MAJOR_NUDGE_FACTOR = 10
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
getArrowBodyGeometry,
|
|
12
12
|
getArrowLabelDefaultPosition,
|
|
13
13
|
} from '../../../shapes/arrow/arrowLabel'
|
|
14
|
+
import { startEditingShapeWithRichText } from '../selectHelpers'
|
|
14
15
|
|
|
15
16
|
export class PointingArrowLabel extends StateNode {
|
|
16
17
|
static override id = 'pointing_arrow_label'
|
|
@@ -54,7 +55,7 @@ export class PointingArrowLabel extends StateNode {
|
|
|
54
55
|
if (!labelGeometry) {
|
|
55
56
|
throw Error(`Expected to find an arrow label geometry for shape: ${shape.id}`)
|
|
56
57
|
}
|
|
57
|
-
const
|
|
58
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
58
59
|
const pointInShapeSpace = this.editor.getPointInShapeSpace(shape, currentPagePoint)
|
|
59
60
|
|
|
60
61
|
this._labelDragOffset = Vec.Sub(labelGeometry.center, pointInShapeSpace)
|
|
@@ -81,7 +82,7 @@ export class PointingArrowLabel extends StateNode {
|
|
|
81
82
|
private _labelDragOffset = new Vec(0, 0)
|
|
82
83
|
|
|
83
84
|
override onPointerMove() {
|
|
84
|
-
const
|
|
85
|
+
const isDragging = this.editor.inputs.getIsDragging()
|
|
85
86
|
if (!isDragging) return
|
|
86
87
|
|
|
87
88
|
if (this.didCtrlOnEnter) {
|
|
@@ -97,7 +98,7 @@ export class PointingArrowLabel extends StateNode {
|
|
|
97
98
|
const transform = this.editor.getShapePageTransform(shape.id)
|
|
98
99
|
|
|
99
100
|
const pointInShapeSpace = this.editor
|
|
100
|
-
.getPointInShapeSpace(shape, this.editor.inputs.
|
|
101
|
+
.getPointInShapeSpace(shape, this.editor.inputs.getCurrentPagePoint())
|
|
101
102
|
.add(this._labelDragOffset)
|
|
102
103
|
|
|
103
104
|
const defaultLabelPosition = getArrowLabelDefaultPosition(this.editor, shape)
|
|
@@ -124,7 +125,7 @@ export class PointingArrowLabel extends StateNode {
|
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
this.didDrag = true
|
|
127
|
-
this.editor.updateShape
|
|
128
|
+
this.editor.updateShape({
|
|
128
129
|
id: shape.id,
|
|
129
130
|
type: shape.type,
|
|
130
131
|
props: { labelPosition: nextLabelPosition },
|
|
@@ -137,10 +138,8 @@ export class PointingArrowLabel extends StateNode {
|
|
|
137
138
|
|
|
138
139
|
if (this.didDrag || !this.wasAlreadySelected) {
|
|
139
140
|
this.complete()
|
|
140
|
-
} else if (
|
|
141
|
-
|
|
142
|
-
this.editor.setEditingShape(shape.id)
|
|
143
|
-
this.editor.setCurrentTool('select.editing_shape')
|
|
141
|
+
} else if (this.editor.canEditShape(shape)) {
|
|
142
|
+
startEditingShapeWithRichText(this.editor, shape.id)
|
|
144
143
|
}
|
|
145
144
|
}
|
|
146
145
|
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Editor,
|
|
3
|
-
StateNode,
|
|
4
|
-
TLArrowShape,
|
|
5
|
-
TLHandle,
|
|
6
|
-
TLNoteShape,
|
|
7
|
-
TLPointerEventInfo,
|
|
8
|
-
Vec,
|
|
9
|
-
} from '@tldraw/editor'
|
|
1
|
+
import { Editor, StateNode, TLHandle, TLNoteShape, TLPointerEventInfo, Vec } from '@tldraw/editor'
|
|
10
2
|
import { updateArrowTargetState } from '../../../shapes/arrow/arrowTargetState'
|
|
11
3
|
import { getArrowBindings } from '../../../shapes/arrow/shared'
|
|
12
4
|
import {
|
|
@@ -14,7 +6,7 @@ import {
|
|
|
14
6
|
getNoteAdjacentPositions,
|
|
15
7
|
getNoteShapeForAdjacentPosition,
|
|
16
8
|
} from '../../../shapes/note/noteHelpers'
|
|
17
|
-
import {
|
|
9
|
+
import { startEditingShapeWithRichText } from '../selectHelpers'
|
|
18
10
|
|
|
19
11
|
export class PointingHandle extends StateNode {
|
|
20
12
|
static override id = 'pointing_handle'
|
|
@@ -29,7 +21,7 @@ export class PointingHandle extends StateNode {
|
|
|
29
21
|
this.didCtrlOnEnter = info.accelKey
|
|
30
22
|
|
|
31
23
|
const { shape } = info
|
|
32
|
-
if (this.editor.isShapeOfType
|
|
24
|
+
if (this.editor.isShapeOfType(shape, 'arrow')) {
|
|
33
25
|
const initialBindings = getArrowBindings(this.editor, shape)
|
|
34
26
|
const currentBinding = initialBindings[info.handle.id as 'start' | 'end']
|
|
35
27
|
const oppositeBinding = initialBindings[info.handle.id === 'start' ? 'end' : 'start']
|
|
@@ -58,11 +50,11 @@ export class PointingHandle extends StateNode {
|
|
|
58
50
|
override onPointerUp() {
|
|
59
51
|
const { shape, handle } = this.info
|
|
60
52
|
|
|
61
|
-
if (this.editor.isShapeOfType
|
|
53
|
+
if (this.editor.isShapeOfType(shape, 'note')) {
|
|
62
54
|
const { editor } = this
|
|
63
55
|
const nextNote = getNoteForAdjacentPosition(editor, shape, handle, false)
|
|
64
56
|
if (nextNote) {
|
|
65
|
-
|
|
57
|
+
startEditingShapeWithRichText(editor, nextNote, { selectAll: true })
|
|
66
58
|
return
|
|
67
59
|
}
|
|
68
60
|
}
|
|
@@ -72,7 +64,7 @@ export class PointingHandle extends StateNode {
|
|
|
72
64
|
|
|
73
65
|
override onPointerMove(info: TLPointerEventInfo) {
|
|
74
66
|
const { editor } = this
|
|
75
|
-
if (editor.inputs.
|
|
67
|
+
if (editor.inputs.getIsDragging()) {
|
|
76
68
|
if (this.didCtrlOnEnter) {
|
|
77
69
|
this.parent.transition('brushing', info)
|
|
78
70
|
} else {
|
|
@@ -90,12 +82,12 @@ export class PointingHandle extends StateNode {
|
|
|
90
82
|
if (editor.getIsReadonly()) return
|
|
91
83
|
const { shape, handle } = this.info
|
|
92
84
|
|
|
93
|
-
if (editor.isShapeOfType
|
|
85
|
+
if (editor.isShapeOfType(shape, 'note')) {
|
|
94
86
|
const nextNote = getNoteForAdjacentPosition(editor, shape, handle, true)
|
|
95
87
|
if (nextNote) {
|
|
96
88
|
// Center the shape on the current pointer
|
|
97
89
|
const centeredOnPointer = editor
|
|
98
|
-
.getPointInParentSpace(nextNote, editor.inputs.
|
|
90
|
+
.getPointInParentSpace(nextNote, editor.inputs.getOriginPagePoint())
|
|
99
91
|
.sub(Vec.Rot(NOTE_CENTER_OFFSET.clone().mul(shape.props.scale), nextNote.rotation))
|
|
100
92
|
editor.updateShape({ ...nextNote, x: centeredOnPointer.x, y: centeredOnPointer.y })
|
|
101
93
|
|
|
@@ -111,7 +103,7 @@ export class PointingHandle extends StateNode {
|
|
|
111
103
|
isCreating: true,
|
|
112
104
|
onCreate: () => {
|
|
113
105
|
// When we're done, start editing it
|
|
114
|
-
|
|
106
|
+
startEditingShapeWithRichText(editor, nextNote, { selectAll: true })
|
|
115
107
|
},
|
|
116
108
|
})
|
|
117
109
|
return
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { StateNode, TLClickEventInfo,
|
|
1
|
+
import { StateNode, TLClickEventInfo, TLPointerEventInfo } from '@tldraw/editor'
|
|
2
2
|
import { selectOnCanvasPointerUp } from '../../selection-logic/selectOnCanvasPointerUp'
|
|
3
3
|
|
|
4
4
|
export class PointingSelection extends StateNode {
|
|
@@ -18,7 +18,7 @@ export class PointingSelection extends StateNode {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
override onPointerMove(info: TLPointerEventInfo) {
|
|
21
|
-
if (this.editor.inputs.
|
|
21
|
+
if (this.editor.inputs.getIsDragging()) {
|
|
22
22
|
this.startTranslating(info)
|
|
23
23
|
}
|
|
24
24
|
}
|
|
@@ -35,9 +35,9 @@ export class PointingSelection extends StateNode {
|
|
|
35
35
|
override onDoubleClick?(info: TLClickEventInfo) {
|
|
36
36
|
const hoveredShape = this.editor.getHoveredShape()
|
|
37
37
|
const hitShape =
|
|
38
|
-
hoveredShape && !this.editor.isShapeOfType
|
|
38
|
+
hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
|
|
39
39
|
? hoveredShape
|
|
40
|
-
: this.editor.getShapeAtPoint(this.editor.inputs.
|
|
40
|
+
: this.editor.getShapeAtPoint(this.editor.inputs.getCurrentPagePoint(), {
|
|
41
41
|
hitInside: true,
|
|
42
42
|
margin: 0,
|
|
43
43
|
renderingOnly: true,
|
|
@@ -16,9 +16,7 @@ export class PointingShape extends StateNode {
|
|
|
16
16
|
const selectedShapeIds = this.editor.getSelectedShapeIds()
|
|
17
17
|
const selectionBounds = this.editor.getSelectionRotatedPageBounds()
|
|
18
18
|
const focusedGroupId = this.editor.getFocusedGroupId()
|
|
19
|
-
const
|
|
20
|
-
inputs: { currentPagePoint },
|
|
21
|
-
} = this.editor
|
|
19
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
22
20
|
const { shiftKey, altKey, accelKey } = info
|
|
23
21
|
|
|
24
22
|
this.hitShape = info.shape
|
|
@@ -66,9 +64,7 @@ export class PointingShape extends StateNode {
|
|
|
66
64
|
const selectedShapeIds = this.editor.getSelectedShapeIds()
|
|
67
65
|
const focusedGroupId = this.editor.getFocusedGroupId()
|
|
68
66
|
const zoomLevel = this.editor.getZoomLevel()
|
|
69
|
-
const
|
|
70
|
-
inputs: { currentPagePoint },
|
|
71
|
-
} = this.editor
|
|
67
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
72
68
|
|
|
73
69
|
const additiveSelectionKey = info.shiftKey || info.accelKey
|
|
74
70
|
|
|
@@ -153,13 +149,7 @@ export class PointingShape extends StateNode {
|
|
|
153
149
|
this.editor.markHistoryStoppingPoint('editing on pointer up')
|
|
154
150
|
this.editor.select(selectingShape.id)
|
|
155
151
|
|
|
156
|
-
|
|
157
|
-
if (this.editor.getIsReadonly()) {
|
|
158
|
-
if (!util.canEditInReadonly(selectingShape)) {
|
|
159
|
-
return
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
152
|
+
if (!this.editor.canEditShape(selectingShape)) return
|
|
163
153
|
this.editor.setEditingShape(selectingShape.id)
|
|
164
154
|
this.editor.setCurrentTool('select.editing_shape')
|
|
165
155
|
|
|
@@ -210,7 +200,7 @@ export class PointingShape extends StateNode {
|
|
|
210
200
|
}
|
|
211
201
|
|
|
212
202
|
override onPointerMove(info: TLPointerEventInfo) {
|
|
213
|
-
if (this.editor.inputs.
|
|
203
|
+
if (this.editor.inputs.getIsDragging()) {
|
|
214
204
|
if (isOverArrowLabel(this.editor, this.hitShape)) {
|
|
215
205
|
// We're moving the label on a shape.
|
|
216
206
|
this.parent.transition('pointing_arrow_label', { ...info, shape: this.hitShape })
|
|
@@ -7,12 +7,10 @@ import {
|
|
|
7
7
|
SelectionCorner,
|
|
8
8
|
SelectionEdge,
|
|
9
9
|
StateNode,
|
|
10
|
-
TLFrameShape,
|
|
11
10
|
TLPointerEventInfo,
|
|
12
11
|
TLShape,
|
|
13
12
|
TLShapeId,
|
|
14
13
|
TLShapePartial,
|
|
15
|
-
TLTextShape,
|
|
16
14
|
TLTickEventInfo,
|
|
17
15
|
Vec,
|
|
18
16
|
VecLike,
|
|
@@ -213,7 +211,8 @@ export class Resizing extends StateNode {
|
|
|
213
211
|
}
|
|
214
212
|
|
|
215
213
|
private updateShapes() {
|
|
216
|
-
const
|
|
214
|
+
const altKey = this.editor.inputs.getAltKey()
|
|
215
|
+
const shiftKey = this.editor.inputs.getShiftKey()
|
|
217
216
|
const {
|
|
218
217
|
frames,
|
|
219
218
|
shapeSnapshots,
|
|
@@ -228,7 +227,7 @@ export class Resizing extends StateNode {
|
|
|
228
227
|
|
|
229
228
|
if (shapeSnapshots.size === 1) {
|
|
230
229
|
const onlySnapshot = [...shapeSnapshots.values()][0]!
|
|
231
|
-
if (this.editor.isShapeOfType
|
|
230
|
+
if (this.editor.isShapeOfType(onlySnapshot.shape, 'text')) {
|
|
232
231
|
isAspectRatioLocked = !(this.info.handle === 'left' || this.info.handle === 'right')
|
|
233
232
|
}
|
|
234
233
|
}
|
|
@@ -268,12 +267,13 @@ export class Resizing extends StateNode {
|
|
|
268
267
|
|
|
269
268
|
const isHoldingAccel = isAccelKey(this.editor.inputs)
|
|
270
269
|
|
|
271
|
-
const currentPagePoint = this.editor.inputs
|
|
270
|
+
const currentPagePoint = this.editor.inputs
|
|
271
|
+
.getCurrentPagePoint()
|
|
272
272
|
.clone()
|
|
273
273
|
.sub(cursorHandleOffset)
|
|
274
274
|
.sub(this.creationCursorOffset)
|
|
275
275
|
|
|
276
|
-
const originPagePoint = this.editor.inputs.
|
|
276
|
+
const originPagePoint = this.editor.inputs.getOriginPagePoint().clone().sub(cursorHandleOffset)
|
|
277
277
|
|
|
278
278
|
if (this.editor.getInstanceState().isGridMode && !isHoldingAccel) {
|
|
279
279
|
const { gridSize } = this.editor.getDocumentSettings()
|
|
@@ -476,9 +476,7 @@ export class Resizing extends StateNode {
|
|
|
476
476
|
const { editor } = this
|
|
477
477
|
const selectedShapeIds = editor.getSelectedShapeIds()
|
|
478
478
|
const selectionRotation = editor.getSelectionRotation()
|
|
479
|
-
const
|
|
480
|
-
inputs: { originPagePoint },
|
|
481
|
-
} = editor
|
|
479
|
+
const originPagePoint = editor.inputs.getOriginPagePoint()
|
|
482
480
|
|
|
483
481
|
const selectionBounds = editor.getSelectionRotatedPageBounds()
|
|
484
482
|
if (!selectionBounds) throw Error('Resizing but nothing is selected')
|
|
@@ -528,7 +526,7 @@ export class Resizing extends StateNode {
|
|
|
528
526
|
// descendants (easy) but also flagging with behavior like "resize" or "keep absolute position" or "reposition only with accel key",
|
|
529
527
|
// though I'm not sure where that would be defined; perhaps better handled with onResizeStart / onResize callbacks on the util, and
|
|
530
528
|
// pass `accelKeyIsPressed` as well as `accelKeyWasPressed`?
|
|
531
|
-
if (editor.isShapeOfType
|
|
529
|
+
if (editor.isShapeOfType(shape, 'frame')) {
|
|
532
530
|
frames.push({
|
|
533
531
|
id: shape.id,
|
|
534
532
|
children: compact(
|
|
@@ -163,9 +163,8 @@ export class Rotating extends StateNode {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
_getRotationFromPointerPosition({ snapToNearestDegree }: { snapToNearestDegree: boolean }) {
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
} = this.editor
|
|
166
|
+
const shiftKey = this.editor.inputs.getShiftKey()
|
|
167
|
+
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
169
168
|
const { initialCursorAngle, initialShapesRotation, initialPageCenter } = this.snapshot
|
|
170
169
|
|
|
171
170
|
// The delta is the difference between the current angle and the initial angle
|