tldraw 4.2.2 → 4.2.3
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 +242 -311
- package/dist-cjs/index.js +5 -13
- 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 +4 -7
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
- 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 +1 -6
- package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +13 -14
- 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/shared.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +10 -4
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +4 -7
- 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 +22 -24
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/getPath.js +11 -20
- package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +86 -82
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +0 -6
- 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 +5 -6
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +142 -146
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +10 -5
- 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 +21 -23
- 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 +11 -6
- 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 +10 -5
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +2 -3
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +2 -14
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +4 -12
- 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 +0 -1
- 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/{useEfficientZoomThreshold.js → useForceSolid.js} +7 -10
- package/dist-cjs/lib/shapes/shared/useForceSolid.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 +0 -5
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -5
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js +10 -4
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +5 -7
- 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 +5 -4
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +4 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/HandTool.js +5 -3
- package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +2 -3
- 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 +11 -10
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +5 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +6 -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/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 +1 -2
- 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 +6 -8
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +11 -38
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +50 -42
- 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 +14 -4
- 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 +13 -4
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +6 -5
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +3 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +6 -7
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +11 -13
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +4 -15
- 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 +6 -5
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +3 -1
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
- package/dist-cjs/lib/{utils/test-helpers.js → tools/selection-logic/getShouldEnterCropModeOnPointerDown.js} +8 -21
- package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +7 -0
- 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 +9 -3
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +3 -1
- 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 +21 -1
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/EditLinkDialog.js +1 -11
- package/dist-cjs/lib/ui/components/EditLinkDialog.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 +15 -2
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +1 -3
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +0 -6
- 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/TopPanel/DefaultTopPanel.js +32 -0
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +7 -0
- package/dist-cjs/lib/ui/components/menu-items.js +1 -3
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -3
- 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 +93 -149
- 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 +1 -1
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +8 -7
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +2 -1
- 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 +5 -4
- 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 +6 -16
- 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/utils/text/richText.js +2 -4
- package/dist-cjs/lib/utils/text/richText.js.map +2 -2
- package/dist-cjs/lib/utils/text/textDirection.js +51 -0
- package/dist-cjs/lib/utils/text/textDirection.js.map +7 -0
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +2 -7
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +242 -311
- package/dist-esm/index.mjs +5 -14
- 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 +4 -8
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
- 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 +1 -6
- 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/shared.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +10 -4
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +4 -7
- 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 +24 -29
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/getPath.mjs +11 -21
- package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +86 -83
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +0 -6
- 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 +5 -6
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +142 -147
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +10 -5
- 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 +22 -24
- 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 +12 -7
- 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 +10 -5
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +3 -4
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +2 -14
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +4 -12
- 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 +0 -1
- 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/useForceSolid.mjs +9 -0
- package/dist-esm/lib/shapes/shared/useForceSolid.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 +0 -5
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +2 -5
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +10 -4
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +5 -7
- 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 +5 -4
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +8 -3
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/HandTool.mjs +5 -3
- package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +2 -3
- 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 +11 -10
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +5 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +6 -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/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 +1 -2
- 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 +6 -8
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +11 -38
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +51 -43
- 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 +19 -6
- 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 +13 -4
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +6 -5
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +3 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +6 -7
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +11 -13
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +4 -17
- 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 +6 -5
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +3 -1
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +8 -0
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +7 -0
- 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 +8 -2
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +3 -1
- 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 +30 -3
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs +1 -11
- package/dist-esm/lib/ui/components/EditLinkDialog.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 +6 -3
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +1 -3
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +0 -6
- 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/TopPanel/DefaultTopPanel.mjs +12 -0
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +7 -0
- package/dist-esm/lib/ui/components/menu-items.mjs +5 -4
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -3
- 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 +95 -157
- 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 +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +8 -7
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +2 -1
- package/dist-esm/lib/ui/context/components.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs +4 -1
- 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 +5 -4
- 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 +6 -17
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +3 -1
- 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/text/richText.mjs +2 -5
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/text/textDirection.mjs +31 -0
- package/dist-esm/lib/utils/text/textDirection.mjs.map +7 -0
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +2 -8
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +16 -18
- package/src/index.ts +2 -6
- package/src/lib/Tldraw.test.tsx +1 -46
- package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
- package/src/lib/canvas/TldrawSelectionForeground.tsx +9 -20
- package/src/lib/defaultEmbedDefinitions.ts +0 -1
- package/src/lib/defaultExternalContentHandlers.ts +14 -13
- package/src/lib/defaultSideEffects.ts +1 -6
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +133 -40
- 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 +0 -2
- 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/shared.ts +4 -4
- package/src/lib/shapes/arrow/toolStates/Idle.tsx +14 -4
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +5 -8
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
- package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +26 -30
- package/src/lib/shapes/draw/getPath.ts +10 -31
- package/src/lib/shapes/draw/toolStates/Drawing.ts +90 -100
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -8
- package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +4 -10
- package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +2 -10
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +176 -228
- package/src/lib/shapes/geo/toolStates/Idle.ts +15 -5
- package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +24 -25
- 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 +1 -2
- package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -9
- package/src/lib/shapes/note/noteCloning.test.ts +1 -3
- package/src/lib/shapes/note/noteHelpers.ts +2 -2
- package/src/lib/shapes/note/toolStates/Pointing.ts +10 -5
- package/src/lib/shapes/shared/HyperlinkButton.tsx +3 -4
- package/src/lib/shapes/shared/PlainTextLabel.tsx +2 -12
- package/src/lib/shapes/shared/RichTextLabel.tsx +4 -14
- package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
- package/src/lib/shapes/shared/crop.ts +0 -1
- package/src/lib/shapes/shared/interpolate-props.ts +4 -4
- package/src/lib/shapes/shared/useEditablePlainText.ts +3 -7
- package/src/lib/shapes/shared/useEditableRichText.ts +3 -7
- package/src/lib/shapes/shared/useForceSolid.ts +6 -0
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
- package/src/lib/shapes/text/RichTextArea.tsx +0 -5
- package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
- package/src/lib/shapes/text/TextShapeUtil.tsx +0 -5
- package/src/lib/shapes/text/toolStates/Idle.ts +14 -4
- package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
- package/src/lib/shapes/video/VideoShapeUtil.tsx +1 -2
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +10 -7
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -5
- package/src/lib/tools/HandTool/HandTool.ts +5 -3
- package/src/lib/tools/HandTool/childStates/Dragging.ts +2 -3
- 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 +11 -14
- package/src/lib/tools/SelectTool/childStates/Brushing.ts +11 -8
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +6 -7
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +4 -3
- 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 +1 -2
- package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +12 -11
- package/src/lib/tools/SelectTool/childStates/EditingShape.ts +16 -57
- package/src/lib/tools/SelectTool/childStates/Idle.ts +81 -64
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +8 -7
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +17 -9
- 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 +14 -4
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +10 -8
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +3 -2
- package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +10 -9
- package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -16
- package/src/lib/tools/SelectTool/selectHelpers.ts +4 -39
- 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 +6 -5
- package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +3 -1
- package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +10 -0
- 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 +2 -5
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +9 -1
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +3 -1
- package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
- package/src/lib/ui/components/DefaultDebugPanel.tsx +42 -3
- package/src/lib/ui/components/EditLinkDialog.tsx +6 -16
- 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 +5 -6
- package/src/lib/ui/components/PageMenu/PageItemInput.tsx +1 -3
- package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +0 -8
- 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/TopPanel/DefaultTopPanel.tsx +10 -0
- package/src/lib/ui/components/menu-items.tsx +15 -9
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +3 -5
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +113 -208
- 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 +2 -2
- package/src/lib/ui/context/actions.tsx +19 -15
- package/src/lib/ui/context/components.tsx +2 -1
- package/src/lib/ui/hooks/menu-hooks.ts +19 -9
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useFlatten.ts +2 -1
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
- package/src/lib/ui/hooks/useTools.tsx +7 -5
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +29 -31
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +48 -12
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +6 -19
- package/src/lib/utils/export/exportAs.ts +9 -2
- package/src/lib/utils/frames/frames.ts +1 -1
- package/src/lib/utils/text/richText.ts +5 -6
- package/src/lib/utils/text/textDirection.ts +32 -0
- package/src/lib/utils/tldr/buildFromV1Document.ts +19 -21
- package/src/test/Editor.test.tsx +41 -78
- package/src/test/EraserTool.test.ts +12 -10
- package/src/test/SelectTool.test.ts +19 -11
- package/src/test/TestEditor.ts +51 -49
- package/src/test/TldrawEditor.test.tsx +20 -24
- package/src/test/__snapshots__/drawing.test.ts.snap +1257 -3
- package/src/test/__snapshots__/resizing.test.ts.snap +12 -3
- package/src/test/arrows-megabus.test.tsx +1 -1
- package/src/test/bindings.test.tsx +25 -29
- package/src/test/bindingsIndex.test.tsx +4 -4
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
- package/src/test/commands/createShapes.test.ts +1 -15
- package/src/test/commands/getSvgString.test.ts +2 -2
- package/src/test/commands/putContent.test.ts +1 -80
- package/src/test/commands/setCamera.test.ts +11 -13
- package/src/test/commands/stackShapes.test.ts +8 -34
- package/src/test/commands/updateShapes.test.ts +5 -21
- package/src/test/commands/zoomToBounds.test.ts +3 -19
- package/src/test/commands/zoomToSelection.test.ts +3 -14
- package/src/test/custom-clipping.test.ts +44 -52
- package/src/test/customSnapping.test.tsx +62 -77
- package/src/test/drawing.test.ts +10 -17
- package/src/test/duplicate.test.ts +1 -1
- package/src/test/flipShapes.test.ts +0 -33
- package/src/test/frames.test.ts +2 -94
- package/src/test/getCulledShapes.test.tsx +3 -11
- package/src/test/getShapeAtPoint.test.ts +2 -2
- package/src/test/groups.test.tsx +4 -7
- package/src/test/modifiers.test.ts +6 -6
- package/src/test/resizing.test.ts +22 -16
- package/src/test/selection-omnibus.test.ts +13 -13
- package/src/test/shapeutils.test.ts +1 -1
- package/src/test/spacebarPanning.test.ts +10 -28
- package/src/test/styles2.test.tsx +1 -1
- package/src/test/styles3.test.ts +5 -5
- package/src/test/test-jsx.tsx +57 -72
- package/src/test/text.test.ts +17 -15
- package/src/test/translating.test.ts +8 -6
- package/tldraw.css +41 -45
- package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +0 -7
- package/dist-cjs/lib/utils/test-helpers.js.map +0 -7
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +0 -12
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +0 -7
- package/dist-esm/lib/utils/test-helpers.mjs +0 -21
- package/dist-esm/lib/utils/test-helpers.mjs.map +0 -7
- package/src/lib/shapes/draw/DrawShapeUtil.test.ts +0 -146
- package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +0 -146
- package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +0 -10
- package/src/lib/utils/test-helpers.ts +0 -60
- package/src/test/commands/cameraState.test.ts +0 -299
- package/src/test/commands/createShape.test.ts +0 -64
- package/src/test/commands/isShapeOfType.test.ts +0 -44
- package/src/test/commands/updateShape.test.ts +0 -67
|
@@ -34,15 +34,10 @@ export function registerDefaultSideEffects(editor: Editor) {
|
|
|
34
34
|
editor.getInstanceState().isToolLocked
|
|
35
35
|
) {
|
|
36
36
|
editor.setCurrentTool('select.editing_shape', {
|
|
37
|
-
target: 'shape',
|
|
38
|
-
shape: shape,
|
|
39
37
|
isCreatingTextWhileToolLocked: true,
|
|
40
38
|
})
|
|
41
39
|
} else {
|
|
42
|
-
editor.setCurrentTool('select.editing_shape'
|
|
43
|
-
target: 'shape',
|
|
44
|
-
shape: shape,
|
|
45
|
-
})
|
|
40
|
+
editor.setCurrentTool('select.editing_shape')
|
|
46
41
|
}
|
|
47
42
|
}
|
|
48
43
|
} else if (prev.editingShapeId && !next.editingShapeId) {
|
|
@@ -48,19 +48,19 @@ describe('ArrowShapeOptions', () => {
|
|
|
48
48
|
const util = editor.getShapeUtil<ArrowShapeUtil>('arrow')
|
|
49
49
|
|
|
50
50
|
// Test without alt key, not precise
|
|
51
|
-
editor.inputs.
|
|
51
|
+
editor.inputs.altKey = false
|
|
52
52
|
expect(util.options.shouldBeExact(editor, false)).toBe(false)
|
|
53
53
|
|
|
54
54
|
// Test without alt key, precise
|
|
55
|
-
editor.inputs.
|
|
55
|
+
editor.inputs.altKey = false
|
|
56
56
|
expect(util.options.shouldBeExact(editor, true)).toBe(false)
|
|
57
57
|
|
|
58
58
|
// Test with alt key, not precise
|
|
59
|
-
editor.inputs.
|
|
59
|
+
editor.inputs.altKey = true
|
|
60
60
|
expect(util.options.shouldBeExact(editor, false)).toBe(true)
|
|
61
61
|
|
|
62
62
|
// Test with alt key, precise
|
|
63
|
-
editor.inputs.
|
|
63
|
+
editor.inputs.altKey = true
|
|
64
64
|
expect(util.options.shouldBeExact(editor, true)).toBe(true)
|
|
65
65
|
})
|
|
66
66
|
|
|
@@ -68,19 +68,59 @@ describe('ArrowShapeOptions', () => {
|
|
|
68
68
|
const util = editor.getShapeUtil<ArrowShapeUtil>('arrow')
|
|
69
69
|
|
|
70
70
|
// Test without ctrl key
|
|
71
|
-
editor.inputs.
|
|
71
|
+
editor.inputs.ctrlKey = false
|
|
72
72
|
expect(util.options.shouldIgnoreTargets(editor)).toBe(false)
|
|
73
73
|
|
|
74
74
|
// Test with ctrl key
|
|
75
|
-
editor.inputs.
|
|
75
|
+
editor.inputs.ctrlKey = true
|
|
76
76
|
expect(util.options.shouldIgnoreTargets(editor)).toBe(true)
|
|
77
77
|
})
|
|
78
78
|
})
|
|
79
79
|
|
|
80
80
|
describe('shouldIgnoreTargets option', () => {
|
|
81
|
+
it('should not bind to shapes when shouldIgnoreTargets returns true', () => {
|
|
82
|
+
editor.setCurrentTool('arrow')
|
|
83
|
+
|
|
84
|
+
// Simulate ctrl key held (default shouldIgnoreTargets behavior)
|
|
85
|
+
editor.inputs.ctrlKey = true
|
|
86
|
+
|
|
87
|
+
editor.pointerDown(50, 50) // Start outside any shape
|
|
88
|
+
editor.pointerMove(150, 150) // Move to center of box1
|
|
89
|
+
editor.pointerUp()
|
|
90
|
+
|
|
91
|
+
const createdArrow = editor
|
|
92
|
+
.getCurrentPageShapes()
|
|
93
|
+
.find((s) => s.type === 'arrow') as TLArrowShape
|
|
94
|
+
expect(createdArrow).toBeDefined()
|
|
95
|
+
|
|
96
|
+
const arrowBindings = getArrowBindings(editor, createdArrow)
|
|
97
|
+
expect(arrowBindings.start).toBeUndefined()
|
|
98
|
+
expect(arrowBindings.end).toBeUndefined()
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('should bind to shapes when shouldIgnoreTargets returns false', () => {
|
|
102
|
+
editor.setCurrentTool('arrow')
|
|
103
|
+
|
|
104
|
+
// Simulate no ctrl key (default shouldIgnoreTargets behavior)
|
|
105
|
+
editor.inputs.ctrlKey = false
|
|
106
|
+
|
|
107
|
+
editor.pointerDown(50, 50) // Start outside any shape
|
|
108
|
+
editor.pointerMove(150, 150) // Move to center of box1
|
|
109
|
+
editor.pointerUp()
|
|
110
|
+
|
|
111
|
+
const createdArrow = editor
|
|
112
|
+
.getCurrentPageShapes()
|
|
113
|
+
.find((s) => s.type === 'arrow') as TLArrowShape
|
|
114
|
+
expect(createdArrow).toBeDefined()
|
|
115
|
+
|
|
116
|
+
const arrowBindings = getArrowBindings(editor, createdArrow)
|
|
117
|
+
expect(arrowBindings.end).toBeDefined()
|
|
118
|
+
expect(arrowBindings.end?.toId).toBe(ids.box1)
|
|
119
|
+
})
|
|
120
|
+
|
|
81
121
|
it('should work with updateArrowTargetState function', () => {
|
|
82
122
|
// Test that updateArrowTargetState returns null when shouldIgnoreTargets is true
|
|
83
|
-
editor.inputs.
|
|
123
|
+
editor.inputs.ctrlKey = true
|
|
84
124
|
|
|
85
125
|
const targetState = updateArrowTargetState({
|
|
86
126
|
editor,
|
|
@@ -95,7 +135,7 @@ describe('ArrowShapeOptions', () => {
|
|
|
95
135
|
})
|
|
96
136
|
|
|
97
137
|
it('should return valid target state when shouldIgnoreTargets is false', () => {
|
|
98
|
-
editor.inputs.
|
|
138
|
+
editor.inputs.ctrlKey = false
|
|
99
139
|
|
|
100
140
|
const targetState = updateArrowTargetState({
|
|
101
141
|
editor,
|
|
@@ -113,8 +153,8 @@ describe('ArrowShapeOptions', () => {
|
|
|
113
153
|
|
|
114
154
|
describe('shouldBeExact option', () => {
|
|
115
155
|
it('should affect arrow targeting behavior when true', () => {
|
|
116
|
-
editor.inputs.
|
|
117
|
-
editor.inputs.
|
|
156
|
+
editor.inputs.altKey = true // shouldBeExact = true
|
|
157
|
+
editor.inputs.ctrlKey = false // shouldIgnoreTargets = false
|
|
118
158
|
|
|
119
159
|
const targetState = updateArrowTargetState({
|
|
120
160
|
editor,
|
|
@@ -130,8 +170,8 @@ describe('ArrowShapeOptions', () => {
|
|
|
130
170
|
})
|
|
131
171
|
|
|
132
172
|
it('should affect arrow targeting behavior when false', () => {
|
|
133
|
-
editor.inputs.
|
|
134
|
-
editor.inputs.
|
|
173
|
+
editor.inputs.altKey = false // shouldBeExact = false
|
|
174
|
+
editor.inputs.ctrlKey = false // shouldIgnoreTargets = false
|
|
135
175
|
|
|
136
176
|
const targetState = updateArrowTargetState({
|
|
137
177
|
editor,
|
|
@@ -154,21 +194,21 @@ describe('ArrowShapeOptions', () => {
|
|
|
154
194
|
class CustomArrowShapeUtil extends ArrowShapeUtil {
|
|
155
195
|
override options = {
|
|
156
196
|
...baseUtil.options,
|
|
157
|
-
shouldBeExact: (editor: any, _isPrecise: boolean) => editor.inputs.
|
|
197
|
+
shouldBeExact: (editor: any, _isPrecise: boolean) => editor.inputs.shiftKey, // Use shift instead of alt
|
|
158
198
|
}
|
|
159
199
|
}
|
|
160
200
|
|
|
161
201
|
const customUtil = new CustomArrowShapeUtil(editor)
|
|
162
202
|
|
|
163
203
|
// Test with shift key
|
|
164
|
-
editor.inputs.
|
|
165
|
-
editor.inputs.
|
|
204
|
+
editor.inputs.shiftKey = true
|
|
205
|
+
editor.inputs.altKey = false
|
|
166
206
|
expect(customUtil.options.shouldBeExact(editor, false)).toBe(true)
|
|
167
207
|
expect(customUtil.options.shouldBeExact(editor, true)).toBe(true)
|
|
168
208
|
|
|
169
209
|
// Test without shift key
|
|
170
|
-
editor.inputs.
|
|
171
|
-
editor.inputs.
|
|
210
|
+
editor.inputs.shiftKey = false
|
|
211
|
+
editor.inputs.altKey = true // Alt key should not matter for custom implementation
|
|
172
212
|
expect(customUtil.options.shouldBeExact(editor, false)).toBe(false)
|
|
173
213
|
expect(customUtil.options.shouldBeExact(editor, true)).toBe(false)
|
|
174
214
|
})
|
|
@@ -179,20 +219,20 @@ describe('ArrowShapeOptions', () => {
|
|
|
179
219
|
class CustomArrowShapeUtil extends ArrowShapeUtil {
|
|
180
220
|
override options = {
|
|
181
221
|
...baseUtil.options,
|
|
182
|
-
shouldIgnoreTargets: (editor: any) => editor.inputs.
|
|
222
|
+
shouldIgnoreTargets: (editor: any) => editor.inputs.shiftKey, // Use shift instead of ctrl
|
|
183
223
|
}
|
|
184
224
|
}
|
|
185
225
|
|
|
186
226
|
const customUtil = new CustomArrowShapeUtil(editor)
|
|
187
227
|
|
|
188
228
|
// Test with shift key
|
|
189
|
-
editor.inputs.
|
|
190
|
-
editor.inputs.
|
|
229
|
+
editor.inputs.shiftKey = true
|
|
230
|
+
editor.inputs.ctrlKey = false
|
|
191
231
|
expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(true)
|
|
192
232
|
|
|
193
233
|
// Test without shift key
|
|
194
|
-
editor.inputs.
|
|
195
|
-
editor.inputs.
|
|
234
|
+
editor.inputs.shiftKey = false
|
|
235
|
+
editor.inputs.ctrlKey = true // Ctrl key should not matter for custom implementation
|
|
196
236
|
expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(false)
|
|
197
237
|
})
|
|
198
238
|
|
|
@@ -204,13 +244,11 @@ describe('ArrowShapeOptions', () => {
|
|
|
204
244
|
...baseUtil.options,
|
|
205
245
|
shouldBeExact: (editor: any, isPrecise: boolean) => {
|
|
206
246
|
// Custom logic: exact when both alt and shift are pressed, and only if precise
|
|
207
|
-
return editor.inputs.
|
|
247
|
+
return editor.inputs.altKey && editor.inputs.shiftKey && isPrecise
|
|
208
248
|
},
|
|
209
249
|
shouldIgnoreTargets: (editor: any) => {
|
|
210
250
|
// Custom logic: ignore targets when any modifier key is pressed
|
|
211
|
-
return
|
|
212
|
-
editor.inputs.getAltKey() || editor.inputs.getCtrlKey() || editor.inputs.getShiftKey()
|
|
213
|
-
)
|
|
251
|
+
return editor.inputs.altKey || editor.inputs.ctrlKey || editor.inputs.shiftKey
|
|
214
252
|
},
|
|
215
253
|
}
|
|
216
254
|
}
|
|
@@ -218,35 +256,48 @@ describe('ArrowShapeOptions', () => {
|
|
|
218
256
|
const customUtil = new CustomArrowShapeUtil(editor)
|
|
219
257
|
|
|
220
258
|
// Test shouldBeExact with both keys and precise
|
|
221
|
-
editor.inputs.
|
|
222
|
-
editor.inputs.
|
|
259
|
+
editor.inputs.altKey = true
|
|
260
|
+
editor.inputs.shiftKey = true
|
|
223
261
|
expect(customUtil.options.shouldBeExact(editor, true)).toBe(true)
|
|
224
262
|
|
|
225
263
|
// Test shouldBeExact with both keys but not precise
|
|
226
|
-
editor.inputs.
|
|
227
|
-
editor.inputs.
|
|
264
|
+
editor.inputs.altKey = true
|
|
265
|
+
editor.inputs.shiftKey = true
|
|
228
266
|
expect(customUtil.options.shouldBeExact(editor, false)).toBe(false)
|
|
229
267
|
|
|
230
268
|
// Test shouldBeExact with only one key
|
|
231
|
-
editor.inputs.
|
|
232
|
-
editor.inputs.
|
|
269
|
+
editor.inputs.altKey = true
|
|
270
|
+
editor.inputs.shiftKey = false
|
|
233
271
|
expect(customUtil.options.shouldBeExact(editor, true)).toBe(false)
|
|
234
272
|
|
|
235
273
|
// Test shouldIgnoreTargets with any key
|
|
236
|
-
editor.inputs.
|
|
237
|
-
editor.inputs.
|
|
238
|
-
editor.inputs.
|
|
274
|
+
editor.inputs.altKey = false
|
|
275
|
+
editor.inputs.ctrlKey = false
|
|
276
|
+
editor.inputs.shiftKey = true
|
|
239
277
|
expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(true)
|
|
240
278
|
|
|
241
279
|
// Test shouldIgnoreTargets with no keys
|
|
242
|
-
editor.inputs.
|
|
243
|
-
editor.inputs.
|
|
244
|
-
editor.inputs.
|
|
280
|
+
editor.inputs.altKey = false
|
|
281
|
+
editor.inputs.ctrlKey = false
|
|
282
|
+
editor.inputs.shiftKey = false
|
|
245
283
|
expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(false)
|
|
246
284
|
})
|
|
247
285
|
})
|
|
248
286
|
|
|
249
287
|
describe('Integration with arrow tool states', () => {
|
|
288
|
+
it('should respect shouldIgnoreTargets in idle state', () => {
|
|
289
|
+
editor.setCurrentTool('arrow')
|
|
290
|
+
editor.expectToBeIn('arrow.idle')
|
|
291
|
+
|
|
292
|
+
// Move to a position over box1
|
|
293
|
+
editor.inputs.ctrlKey = true // shouldIgnoreTargets = true
|
|
294
|
+
editor.pointerMove(150, 150)
|
|
295
|
+
|
|
296
|
+
// The arrow tool should not show any target highlighting
|
|
297
|
+
// (This is more of an integration test - exact assertions would depend on internal state)
|
|
298
|
+
expect(editor.getCurrentToolId()).toBe('arrow')
|
|
299
|
+
})
|
|
300
|
+
|
|
250
301
|
it('should allow custom shouldBeExact logic based on isPrecise - example from arrow precise-exact', () => {
|
|
251
302
|
// This replicates the logic from the arrows-precise-exact example
|
|
252
303
|
const baseUtil = editor.getShapeUtil<ArrowShapeUtil>('arrow')
|
|
@@ -264,10 +315,10 @@ describe('ArrowShapeOptions', () => {
|
|
|
264
315
|
|
|
265
316
|
try {
|
|
266
317
|
editor.setCurrentTool('arrow')
|
|
267
|
-
editor.inputs.
|
|
318
|
+
editor.inputs.ctrlKey = false // Allow binding
|
|
268
319
|
|
|
269
320
|
// Set up fast pointer velocity to ensure precise remains false
|
|
270
|
-
editor.inputs.
|
|
321
|
+
editor.inputs.pointerVelocity = { x: 2, y: 2, len: () => 2.8 } as any
|
|
271
322
|
|
|
272
323
|
const targetState = updateArrowTargetState({
|
|
273
324
|
editor,
|
|
@@ -301,5 +352,47 @@ describe('ArrowShapeOptions', () => {
|
|
|
301
352
|
baseUtil.options.shouldBeExact = originalShouldBeExact
|
|
302
353
|
}
|
|
303
354
|
})
|
|
355
|
+
|
|
356
|
+
it('should respect shouldIgnoreTargets when starting arrow creation', () => {
|
|
357
|
+
editor.setCurrentTool('arrow')
|
|
358
|
+
|
|
359
|
+
// Start creating arrow with ctrl held (shouldIgnoreTargets = true)
|
|
360
|
+
editor.inputs.ctrlKey = true
|
|
361
|
+
editor.pointerDown(150, 150) // Start in center of box1
|
|
362
|
+
|
|
363
|
+
// Even though we're starting in a shape, no binding should be created
|
|
364
|
+
editor.pointerMove(200, 200)
|
|
365
|
+
editor.pointerUp()
|
|
366
|
+
|
|
367
|
+
const createdArrow = editor
|
|
368
|
+
.getCurrentPageShapes()
|
|
369
|
+
.find((s) => s.type === 'arrow') as TLArrowShape
|
|
370
|
+
expect(createdArrow).toBeDefined()
|
|
371
|
+
|
|
372
|
+
const arrowBindings = getArrowBindings(editor, createdArrow)
|
|
373
|
+
expect(arrowBindings.start).toBeUndefined()
|
|
374
|
+
expect(arrowBindings.end).toBeUndefined()
|
|
375
|
+
})
|
|
376
|
+
|
|
377
|
+
it('should respect shouldBeExact during arrow creation', () => {
|
|
378
|
+
editor.setCurrentTool('arrow')
|
|
379
|
+
|
|
380
|
+
// Create arrow with alt held (shouldBeExact = true)
|
|
381
|
+
editor.inputs.altKey = true
|
|
382
|
+
editor.inputs.ctrlKey = false // Allow binding
|
|
383
|
+
|
|
384
|
+
editor.pointerDown(50, 50) // Start outside shapes
|
|
385
|
+
editor.pointerMove(150, 150) // Move to center of box1
|
|
386
|
+
editor.pointerUp()
|
|
387
|
+
|
|
388
|
+
const createdArrow = editor
|
|
389
|
+
.getCurrentPageShapes()
|
|
390
|
+
.find((s) => s.type === 'arrow') as TLArrowShape
|
|
391
|
+
expect(createdArrow).toBeDefined()
|
|
392
|
+
|
|
393
|
+
const arrowBindings = getArrowBindings(editor, createdArrow)
|
|
394
|
+
expect(arrowBindings.end).toBeDefined()
|
|
395
|
+
expect(arrowBindings.end?.props.isExact).toBe(true)
|
|
396
|
+
})
|
|
304
397
|
})
|
|
305
398
|
})
|
|
@@ -144,7 +144,7 @@ describe('When pointing a start shape', () => {
|
|
|
144
144
|
expect(getArrowTargetState(editor)).not.toBeNull()
|
|
145
145
|
|
|
146
146
|
// Fake some velocity
|
|
147
|
-
editor.inputs.
|
|
147
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
148
148
|
|
|
149
149
|
editor.pointerMove(375, 500)
|
|
150
150
|
|
|
@@ -189,7 +189,7 @@ describe('When pointing an end shape', () => {
|
|
|
189
189
|
expect(editor.getHintingShapeIds().length).toBe(0)
|
|
190
190
|
|
|
191
191
|
// Fake some velocity
|
|
192
|
-
editor.inputs.
|
|
192
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
193
193
|
|
|
194
194
|
// Move onto shape
|
|
195
195
|
editor.pointerMove(375, 375)
|
|
@@ -227,7 +227,7 @@ describe('When pointing an end shape', () => {
|
|
|
227
227
|
it('unbinds and rebinds', () => {
|
|
228
228
|
editor.setCurrentTool('arrow').pointerDown(0, 0)
|
|
229
229
|
|
|
230
|
-
editor.inputs.
|
|
230
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
231
231
|
|
|
232
232
|
editor.pointerMove(375, 375)
|
|
233
233
|
|
|
@@ -283,7 +283,7 @@ describe('When pointing an end shape', () => {
|
|
|
283
283
|
})
|
|
284
284
|
|
|
285
285
|
// Build up some velocity
|
|
286
|
-
editor.inputs.
|
|
286
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
287
287
|
editor.pointerMove(325, 325)
|
|
288
288
|
expect(getArrowTargetState(editor)).not.toBeNull()
|
|
289
289
|
|
|
@@ -403,7 +403,7 @@ describe('When pointing an end shape', () => {
|
|
|
403
403
|
|
|
404
404
|
it('begins imprecise when moving quickly', () => {
|
|
405
405
|
editor.setCurrentTool('arrow').pointerDown(0, 0)
|
|
406
|
-
editor.inputs.
|
|
406
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
407
407
|
editor.pointerMove(370, 370)
|
|
408
408
|
|
|
409
409
|
const arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
|
|
@@ -435,7 +435,7 @@ describe('When pointing an end shape', () => {
|
|
|
435
435
|
|
|
436
436
|
expect(getArrowTargetState(editor)).toBeNull()
|
|
437
437
|
|
|
438
|
-
editor.inputs.
|
|
438
|
+
editor.inputs.pointerVelocity = new Vec(0.001, 0.001)
|
|
439
439
|
editor.pointerMove(375, 375)
|
|
440
440
|
|
|
441
441
|
arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
|
|
@@ -588,7 +588,7 @@ describe('precision timeout configuration', () => {
|
|
|
588
588
|
|
|
589
589
|
editor.setCurrentTool('arrow').pointerDown(0, 0)
|
|
590
590
|
// Use high velocity to avoid precise mode immediately
|
|
591
|
-
editor.inputs.
|
|
591
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
592
592
|
editor.pointerMove(100, 100)
|
|
593
593
|
|
|
594
594
|
const arrow = editor.getCurrentPageShapes()[
|
|
@@ -630,7 +630,7 @@ describe('precision timeout configuration', () => {
|
|
|
630
630
|
|
|
631
631
|
editor.setCurrentTool('arrow').pointerDown(0, 0)
|
|
632
632
|
// Use high velocity to avoid precise mode immediately
|
|
633
|
-
editor.inputs.
|
|
633
|
+
editor.inputs.pointerVelocity = new Vec(1, 1)
|
|
634
634
|
editor.pointerMove(100, 100)
|
|
635
635
|
|
|
636
636
|
const arrow = editor.getCurrentPageShapes()[
|
|
@@ -333,7 +333,7 @@ describe('Arrow labels', () => {
|
|
|
333
333
|
// Create an arrow with a label
|
|
334
334
|
editor.setCurrentTool('arrow').pointerDown(10, 10).pointerMove(100, 100).pointerUp()
|
|
335
335
|
const arrowId = editor.getOnlySelectedShape()!.id
|
|
336
|
-
editor.updateShapes([
|
|
336
|
+
editor.updateShapes<TLArrowShape>([
|
|
337
337
|
{ id: arrowId, type: 'arrow', props: { richText: toRichText('Test Label') } },
|
|
338
338
|
])
|
|
339
339
|
})
|
|
@@ -349,7 +349,7 @@ describe('Arrow labels', () => {
|
|
|
349
349
|
|
|
350
350
|
it('should update the label of an arrow', () => {
|
|
351
351
|
const arrowId = editor.getOnlySelectedShape()!.id
|
|
352
|
-
editor.updateShapes([
|
|
352
|
+
editor.updateShapes<TLArrowShape>([
|
|
353
353
|
{ id: arrowId, type: 'arrow', props: { richText: toRichText('New Label') } },
|
|
354
354
|
])
|
|
355
355
|
expect(arrow(arrowId)).toMatchObject({
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
useEditor,
|
|
46
46
|
useIsEditing,
|
|
47
47
|
useSharedSafeId,
|
|
48
|
+
useValue,
|
|
48
49
|
} from '@tldraw/editor'
|
|
49
50
|
import React, { useMemo } from 'react'
|
|
50
51
|
import { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'
|
|
@@ -55,7 +56,6 @@ import { ShapeFill } from '../shared/ShapeFill'
|
|
|
55
56
|
import { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'
|
|
56
57
|
import { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'
|
|
57
58
|
import { useDefaultColorTheme } from '../shared/useDefaultColorTheme'
|
|
58
|
-
import { useEfficientZoomThreshold } from '../shared/useEfficientZoomThreshold'
|
|
59
59
|
import { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'
|
|
60
60
|
import { ArrowShapeOptions } from './arrow-types'
|
|
61
61
|
import {
|
|
@@ -117,13 +117,9 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
117
117
|
|
|
118
118
|
hoverPreciseTimeout: 600,
|
|
119
119
|
pointingPreciseTimeout: 320,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
shouldIgnoreTargets(editor: Editor) {
|
|
124
|
-
return editor.inputs.getCtrlKey()
|
|
125
|
-
},
|
|
126
|
-
showTextOutline: true,
|
|
120
|
+
|
|
121
|
+
shouldBeExact: (editor: Editor) => editor.inputs.altKey,
|
|
122
|
+
shouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,
|
|
127
123
|
}
|
|
128
124
|
|
|
129
125
|
override canEdit() {
|
|
@@ -273,7 +269,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
273
269
|
|
|
274
270
|
const segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)
|
|
275
271
|
const segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)
|
|
276
|
-
const segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.
|
|
272
|
+
const segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()
|
|
277
273
|
|
|
278
274
|
if (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {
|
|
279
275
|
handles.push({
|
|
@@ -373,8 +369,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
373
369
|
|
|
374
370
|
// we want to snap to certain points. the maximum distance at which a snap will occur is
|
|
375
371
|
// relative to the zoom level:
|
|
376
|
-
const maxSnapDistance =
|
|
377
|
-
this.options.elbowMidpointSnapDistance / this.editor.getEfficientZoomLevel()
|
|
372
|
+
const maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()
|
|
378
373
|
|
|
379
374
|
// we snap to the midpoint of the range by default
|
|
380
375
|
const midPoint = perpDistanceToLineAngle(
|
|
@@ -799,7 +794,6 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
799
794
|
textWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}
|
|
800
795
|
isSelected={isSelected}
|
|
801
796
|
padding={0}
|
|
802
|
-
showTextOutline={this.options.showTextOutline}
|
|
803
797
|
style={{
|
|
804
798
|
transform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,
|
|
805
799
|
}}
|
|
@@ -923,7 +917,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
923
917
|
if (isEmptyRichText(shape.props.richText)) {
|
|
924
918
|
// editing text for the first time, so set the position to the default:
|
|
925
919
|
const labelPosition = getArrowLabelDefaultPosition(this.editor, shape)
|
|
926
|
-
this.editor.updateShape({
|
|
920
|
+
this.editor.updateShape<TLArrowShape>({
|
|
927
921
|
id: shape.id,
|
|
928
922
|
type: shape.type,
|
|
929
923
|
props: { labelPosition },
|
|
@@ -950,7 +944,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
950
944
|
.box.clone()
|
|
951
945
|
.expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}
|
|
952
946
|
padding={0}
|
|
953
|
-
showTextOutline={
|
|
947
|
+
showTextOutline={true}
|
|
954
948
|
/>
|
|
955
949
|
</g>
|
|
956
950
|
)
|
|
@@ -1011,7 +1005,13 @@ const ArrowSvg = track(function ArrowSvg({
|
|
|
1011
1005
|
const editor = useEditor()
|
|
1012
1006
|
const theme = useDefaultColorTheme()
|
|
1013
1007
|
const info = getArrowInfo(editor, shape)
|
|
1014
|
-
const isForceSolid =
|
|
1008
|
+
const isForceSolid = useValue(
|
|
1009
|
+
'force solid',
|
|
1010
|
+
() => {
|
|
1011
|
+
return editor.getZoomLevel() < 0.2
|
|
1012
|
+
},
|
|
1013
|
+
[editor]
|
|
1014
|
+
)
|
|
1015
1015
|
const clipPathId = useSharedSafeId(shape.id + '_clip')
|
|
1016
1016
|
const arrowheadDotId = useSharedSafeId('arrowhead-dot')
|
|
1017
1017
|
const arrowheadCrossId = useSharedSafeId('arrowhead-cross')
|
|
@@ -1037,7 +1037,7 @@ const ArrowSvg = track(function ArrowSvg({
|
|
|
1037
1037
|
start: 'skip',
|
|
1038
1038
|
end: 'skip',
|
|
1039
1039
|
lengthRatio: 2.5,
|
|
1040
|
-
strokeWidth: 2 / editor.
|
|
1040
|
+
strokeWidth: 2 / editor.getZoomLevel(),
|
|
1041
1041
|
props: {
|
|
1042
1042
|
className: 'tl-arrow-hint',
|
|
1043
1043
|
markerStart: bindings.start
|
|
@@ -95,8 +95,6 @@ export interface ArrowShapeOptions {
|
|
|
95
95
|
* When creating an arrow, should it bind to the target shape.
|
|
96
96
|
*/
|
|
97
97
|
shouldIgnoreTargets(editor: Editor): boolean
|
|
98
|
-
/** Whether to show the outline of the arrow shape's label (using the same color as the canvas). This helps with overlapping shapes. It does not show up on Safari, where text outline is a performance issues. */
|
|
99
|
-
readonly showTextOutline: boolean
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
/** @public */
|
|
@@ -311,9 +311,9 @@ export function getArrowLabelDefaultPosition(editor: Editor, shape: TLArrowShape
|
|
|
311
311
|
|
|
312
312
|
/** @internal */
|
|
313
313
|
export function isOverArrowLabel(editor: Editor, shape: TLShape) {
|
|
314
|
-
if (!editor.isShapeOfType(shape, 'arrow')) return false
|
|
314
|
+
if (!editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) return false
|
|
315
315
|
|
|
316
|
-
const pointInShapeSpace = editor.getPointInShapeSpace(shape, editor.inputs.
|
|
316
|
+
const pointInShapeSpace = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)
|
|
317
317
|
// How should we handle multiple labels? Do shapes ever have multiple labels?
|
|
318
318
|
const labelGeometry = editor.getShapeGeometry<Group2d>(shape).children[1]
|
|
319
319
|
// Knowing what we know about arrows... if the shape has no text in its label,
|
|
@@ -198,7 +198,7 @@ export function updateArrowTargetState({
|
|
|
198
198
|
if (!precise) {
|
|
199
199
|
// If we're switching to a new bound shape, then precise only if moving slowly
|
|
200
200
|
if (!currentBinding || (currentBinding && target.id !== currentBinding.toId)) {
|
|
201
|
-
precise = editor.inputs.
|
|
201
|
+
precise = editor.inputs.pointerVelocity.len() < 0.5
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
|
|
@@ -377,7 +377,7 @@ export function updateArrowTargetState({
|
|
|
377
377
|
return result
|
|
378
378
|
}
|
|
379
379
|
|
|
380
|
-
const targetFilterFallback = { type: 'arrow'
|
|
380
|
+
const targetFilterFallback = { type: 'arrow' }
|
|
381
381
|
|
|
382
382
|
/**
|
|
383
383
|
* Funky math but we want the snap distance to be 4 at the minimum and either 16 or 15% of the
|
|
@@ -39,17 +39,17 @@ export function getElbowArrowSnapLines(editor: Editor) {
|
|
|
39
39
|
.get(editor, (editor) => {
|
|
40
40
|
const currentSelectedArrowShape = computed('current selected arrow shape', () => {
|
|
41
41
|
const shape = editor.getOnlySelectedShape()
|
|
42
|
-
if (!shape || !editor.isShapeOfType(shape, 'arrow')) return null
|
|
42
|
+
if (!shape || !editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) return null
|
|
43
43
|
return shape.id
|
|
44
44
|
})
|
|
45
45
|
|
|
46
46
|
const unselectedArrowShapeIds = editor.store.query.ids('shape', () => {
|
|
47
47
|
const activeArrowShapeId = currentSelectedArrowShape.get()
|
|
48
|
-
if (!activeArrowShapeId) return { type: { eq: 'arrow' } }
|
|
48
|
+
if (!activeArrowShapeId) return { type: { eq: 'arrow' } }
|
|
49
49
|
return {
|
|
50
50
|
type: { eq: 'arrow' },
|
|
51
51
|
id: { neq: activeArrowShapeId },
|
|
52
|
-
}
|
|
52
|
+
}
|
|
53
53
|
})
|
|
54
54
|
|
|
55
55
|
return computed('elbow arrow snap lines', () => {
|
|
@@ -38,7 +38,7 @@ export function getBoundShapeInfoForTerminal(
|
|
|
38
38
|
terminalName: 'start' | 'end'
|
|
39
39
|
): BoundShapeInfo | undefined {
|
|
40
40
|
const binding = editor
|
|
41
|
-
.getBindingsFromShape(arrow, 'arrow')
|
|
41
|
+
.getBindingsFromShape<TLArrowBinding>(arrow, 'arrow')
|
|
42
42
|
.find((b) => b.props.terminal === terminalName)
|
|
43
43
|
if (!binding) return
|
|
44
44
|
|
|
@@ -105,7 +105,7 @@ export interface TLArrowBindings {
|
|
|
105
105
|
const arrowBindingsCache = createComputedCache(
|
|
106
106
|
'arrow bindings',
|
|
107
107
|
(editor: Editor, arrow: TLArrowShape) => {
|
|
108
|
-
const bindings = editor.getBindingsFromShape(arrow.id, 'arrow')
|
|
108
|
+
const bindings = editor.getBindingsFromShape<TLArrowBinding>(arrow.id, 'arrow')
|
|
109
109
|
return {
|
|
110
110
|
start: bindings.find((b) => b.props.terminal === 'start'),
|
|
111
111
|
end: bindings.find((b) => b.props.terminal === 'end'),
|
|
@@ -223,7 +223,7 @@ export function createOrUpdateArrowBinding(
|
|
|
223
223
|
const targetId = typeof target === 'string' ? target : target.id
|
|
224
224
|
|
|
225
225
|
const existingMany = editor
|
|
226
|
-
.getBindingsFromShape(arrowId, 'arrow')
|
|
226
|
+
.getBindingsFromShape<TLArrowBinding>(arrowId, 'arrow')
|
|
227
227
|
.filter((b) => b.props.terminal === props.terminal)
|
|
228
228
|
|
|
229
229
|
// if we've somehow ended up with too many bindings, delete the extras
|
|
@@ -254,7 +254,7 @@ export function createOrUpdateArrowBinding(
|
|
|
254
254
|
*/
|
|
255
255
|
export function removeArrowBinding(editor: Editor, arrow: TLArrowShape, terminal: 'start' | 'end') {
|
|
256
256
|
const existing = editor
|
|
257
|
-
.getBindingsFromShape(arrow, 'arrow')
|
|
257
|
+
.getBindingsFromShape<TLArrowBinding>(arrow, 'arrow')
|
|
258
258
|
.filter((b) => b.props.terminal === terminal)
|
|
259
259
|
|
|
260
260
|
editor.deleteBindings(existing)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo, TLShapeId } from '@tldraw/editor'
|
|
2
|
-
import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
|
|
3
2
|
import { ArrowShapeUtil } from '../ArrowShapeUtil'
|
|
4
3
|
import { clearArrowTargetState, updateArrowTargetState } from '../arrowTargetState'
|
|
5
4
|
|
|
@@ -41,9 +40,20 @@ export class Idle extends StateNode {
|
|
|
41
40
|
override onKeyUp(info: TLKeyboardEventInfo) {
|
|
42
41
|
this.update()
|
|
43
42
|
if (info.key === 'Enter') {
|
|
43
|
+
if (this.editor.getIsReadonly()) return null
|
|
44
44
|
const onlySelectedShape = this.editor.getOnlySelectedShape()
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
// If the only selected shape is editable, start editing it
|
|
46
|
+
if (
|
|
47
|
+
onlySelectedShape &&
|
|
48
|
+
this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)
|
|
49
|
+
) {
|
|
50
|
+
this.editor.setCurrentTool('select')
|
|
51
|
+
this.editor.setEditingShape(onlySelectedShape.id)
|
|
52
|
+
this.editor.root.getCurrent()?.transition('editing_shape', {
|
|
53
|
+
...info,
|
|
54
|
+
target: 'shape',
|
|
55
|
+
shape: onlySelectedShape,
|
|
56
|
+
})
|
|
47
57
|
}
|
|
48
58
|
}
|
|
49
59
|
}
|
|
@@ -53,7 +63,7 @@ export class Idle extends StateNode {
|
|
|
53
63
|
|
|
54
64
|
const targetState = updateArrowTargetState({
|
|
55
65
|
editor: this.editor,
|
|
56
|
-
pointInPageSpace: this.editor.inputs.
|
|
66
|
+
pointInPageSpace: this.editor.inputs.currentPagePoint,
|
|
57
67
|
arrow: undefined,
|
|
58
68
|
isPrecise: this.isPrecise,
|
|
59
69
|
currentBinding: undefined,
|