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
|
@@ -16,7 +16,9 @@ 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
|
|
19
|
+
const {
|
|
20
|
+
inputs: { currentPagePoint },
|
|
21
|
+
} = this.editor
|
|
20
22
|
const { shiftKey, altKey, accelKey } = info
|
|
21
23
|
|
|
22
24
|
this.hitShape = info.shape
|
|
@@ -64,7 +66,9 @@ export class PointingShape extends StateNode {
|
|
|
64
66
|
const selectedShapeIds = this.editor.getSelectedShapeIds()
|
|
65
67
|
const focusedGroupId = this.editor.getFocusedGroupId()
|
|
66
68
|
const zoomLevel = this.editor.getZoomLevel()
|
|
67
|
-
const
|
|
69
|
+
const {
|
|
70
|
+
inputs: { currentPagePoint },
|
|
71
|
+
} = this.editor
|
|
68
72
|
|
|
69
73
|
const additiveSelectionKey = info.shiftKey || info.accelKey
|
|
70
74
|
|
|
@@ -149,7 +153,13 @@ export class PointingShape extends StateNode {
|
|
|
149
153
|
this.editor.markHistoryStoppingPoint('editing on pointer up')
|
|
150
154
|
this.editor.select(selectingShape.id)
|
|
151
155
|
|
|
152
|
-
|
|
156
|
+
const util = this.editor.getShapeUtil(selectingShape)
|
|
157
|
+
if (this.editor.getIsReadonly()) {
|
|
158
|
+
if (!util.canEditInReadonly(selectingShape)) {
|
|
159
|
+
return
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
153
163
|
this.editor.setEditingShape(selectingShape.id)
|
|
154
164
|
this.editor.setCurrentTool('select.editing_shape')
|
|
155
165
|
|
|
@@ -200,7 +210,7 @@ export class PointingShape extends StateNode {
|
|
|
200
210
|
}
|
|
201
211
|
|
|
202
212
|
override onPointerMove(info: TLPointerEventInfo) {
|
|
203
|
-
if (this.editor.inputs.
|
|
213
|
+
if (this.editor.inputs.isDragging) {
|
|
204
214
|
if (isOverArrowLabel(this.editor, this.hitShape)) {
|
|
205
215
|
// We're moving the label on a shape.
|
|
206
216
|
this.parent.transition('pointing_arrow_label', { ...info, shape: this.hitShape })
|
|
@@ -7,10 +7,12 @@ import {
|
|
|
7
7
|
SelectionCorner,
|
|
8
8
|
SelectionEdge,
|
|
9
9
|
StateNode,
|
|
10
|
+
TLFrameShape,
|
|
10
11
|
TLPointerEventInfo,
|
|
11
12
|
TLShape,
|
|
12
13
|
TLShapeId,
|
|
13
14
|
TLShapePartial,
|
|
15
|
+
TLTextShape,
|
|
14
16
|
TLTickEventInfo,
|
|
15
17
|
Vec,
|
|
16
18
|
VecLike,
|
|
@@ -211,8 +213,7 @@ export class Resizing extends StateNode {
|
|
|
211
213
|
}
|
|
212
214
|
|
|
213
215
|
private updateShapes() {
|
|
214
|
-
const altKey = this.editor.inputs
|
|
215
|
-
const shiftKey = this.editor.inputs.getShiftKey()
|
|
216
|
+
const { altKey, shiftKey } = this.editor.inputs
|
|
216
217
|
const {
|
|
217
218
|
frames,
|
|
218
219
|
shapeSnapshots,
|
|
@@ -227,7 +228,7 @@ export class Resizing extends StateNode {
|
|
|
227
228
|
|
|
228
229
|
if (shapeSnapshots.size === 1) {
|
|
229
230
|
const onlySnapshot = [...shapeSnapshots.values()][0]!
|
|
230
|
-
if (this.editor.isShapeOfType(onlySnapshot.shape, 'text')) {
|
|
231
|
+
if (this.editor.isShapeOfType<TLTextShape>(onlySnapshot.shape, 'text')) {
|
|
231
232
|
isAspectRatioLocked = !(this.info.handle === 'left' || this.info.handle === 'right')
|
|
232
233
|
}
|
|
233
234
|
}
|
|
@@ -267,13 +268,12 @@ export class Resizing extends StateNode {
|
|
|
267
268
|
|
|
268
269
|
const isHoldingAccel = isAccelKey(this.editor.inputs)
|
|
269
270
|
|
|
270
|
-
const currentPagePoint = this.editor.inputs
|
|
271
|
-
.getCurrentPagePoint()
|
|
271
|
+
const currentPagePoint = this.editor.inputs.currentPagePoint
|
|
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.originPagePoint.clone().sub(cursorHandleOffset)
|
|
277
277
|
|
|
278
278
|
if (this.editor.getInstanceState().isGridMode && !isHoldingAccel) {
|
|
279
279
|
const { gridSize } = this.editor.getDocumentSettings()
|
|
@@ -476,7 +476,9 @@ export class Resizing extends StateNode {
|
|
|
476
476
|
const { editor } = this
|
|
477
477
|
const selectedShapeIds = editor.getSelectedShapeIds()
|
|
478
478
|
const selectionRotation = editor.getSelectionRotation()
|
|
479
|
-
const
|
|
479
|
+
const {
|
|
480
|
+
inputs: { originPagePoint },
|
|
481
|
+
} = editor
|
|
480
482
|
|
|
481
483
|
const selectionBounds = editor.getSelectionRotatedPageBounds()
|
|
482
484
|
if (!selectionBounds) throw Error('Resizing but nothing is selected')
|
|
@@ -526,7 +528,7 @@ export class Resizing extends StateNode {
|
|
|
526
528
|
// descendants (easy) but also flagging with behavior like "resize" or "keep absolute position" or "reposition only with accel key",
|
|
527
529
|
// though I'm not sure where that would be defined; perhaps better handled with onResizeStart / onResize callbacks on the util, and
|
|
528
530
|
// pass `accelKeyIsPressed` as well as `accelKeyWasPressed`?
|
|
529
|
-
if (editor.isShapeOfType(shape, 'frame')) {
|
|
531
|
+
if (editor.isShapeOfType<TLFrameShape>(shape, 'frame')) {
|
|
530
532
|
frames.push({
|
|
531
533
|
id: shape.id,
|
|
532
534
|
children: compact(
|
|
@@ -163,8 +163,9 @@ export class Rotating extends StateNode {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
_getRotationFromPointerPosition({ snapToNearestDegree }: { snapToNearestDegree: boolean }) {
|
|
166
|
-
const
|
|
167
|
-
|
|
166
|
+
const {
|
|
167
|
+
inputs: { shiftKey, currentPagePoint },
|
|
168
|
+
} = this.editor
|
|
168
169
|
const { initialCursorAngle, initialShapesRotation, initialPageCenter } = this.snapshot
|
|
169
170
|
|
|
170
171
|
// The delta is the difference between the current angle and the initial angle
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Geometry2d,
|
|
3
3
|
StateNode,
|
|
4
|
+
TLFrameShape,
|
|
5
|
+
TLGroupShape,
|
|
4
6
|
TLShape,
|
|
5
7
|
TLShapeId,
|
|
6
8
|
Vec,
|
|
@@ -22,7 +24,7 @@ export class ScribbleBrushing extends StateNode {
|
|
|
22
24
|
|
|
23
25
|
override onEnter() {
|
|
24
26
|
this.initialSelectedShapeIds = new Set<TLShapeId>(
|
|
25
|
-
this.editor.inputs.
|
|
27
|
+
this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []
|
|
26
28
|
)
|
|
27
29
|
this.newlySelectedShapeIds = new Set<TLShapeId>()
|
|
28
30
|
this.size = 0
|
|
@@ -58,7 +60,7 @@ export class ScribbleBrushing extends StateNode {
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
override onKeyUp() {
|
|
61
|
-
if (!this.editor.inputs.
|
|
63
|
+
if (!this.editor.inputs.altKey) {
|
|
62
64
|
this.parent.transition('brushing')
|
|
63
65
|
} else {
|
|
64
66
|
this.updateScribbleSelection(false)
|
|
@@ -74,7 +76,7 @@ export class ScribbleBrushing extends StateNode {
|
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
private pushPointToScribble() {
|
|
77
|
-
const { x, y } = this.editor.inputs.
|
|
79
|
+
const { x, y } = this.editor.inputs.currentPagePoint
|
|
78
80
|
this.editor.scribbles.addPoint(this.scribbleId, x, y)
|
|
79
81
|
}
|
|
80
82
|
|
|
@@ -82,10 +84,9 @@ export class ScribbleBrushing extends StateNode {
|
|
|
82
84
|
const { editor } = this
|
|
83
85
|
// const zoomLevel = this.editor.getZoomLevel()
|
|
84
86
|
const currentPageShapes = this.editor.getCurrentPageRenderingShapesSorted()
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
|
|
87
|
+
const {
|
|
88
|
+
inputs: { shiftKey, originPagePoint, previousPagePoint, currentPagePoint },
|
|
89
|
+
} = this.editor
|
|
89
90
|
|
|
90
91
|
const { newlySelectedShapeIds, initialSelectedShapeIds } = this
|
|
91
92
|
|
|
@@ -103,7 +104,7 @@ export class ScribbleBrushing extends StateNode {
|
|
|
103
104
|
|
|
104
105
|
// If the shape is a group or is already selected or locked, don't select it
|
|
105
106
|
if (
|
|
106
|
-
editor.isShapeOfType(shape, 'group') ||
|
|
107
|
+
editor.isShapeOfType<TLGroupShape>(shape, 'group') ||
|
|
107
108
|
newlySelectedShapeIds.has(shape.id) ||
|
|
108
109
|
editor.isShapeOrAncestorLocked(shape)
|
|
109
110
|
) {
|
|
@@ -114,7 +115,7 @@ export class ScribbleBrushing extends StateNode {
|
|
|
114
115
|
|
|
115
116
|
// If the scribble started inside of the frame, don't select it
|
|
116
117
|
if (
|
|
117
|
-
editor.isShapeOfType(shape, 'frame') &&
|
|
118
|
+
editor.isShapeOfType<TLFrameShape>(shape, 'frame') &&
|
|
118
119
|
geometry.bounds.containsPoint(editor.getPointInShapeSpace(shape, originPagePoint))
|
|
119
120
|
) {
|
|
120
121
|
continue
|
|
@@ -92,7 +92,7 @@ export class Translating extends StateNode {
|
|
|
92
92
|
|
|
93
93
|
// Don't clone on create; otherwise clone on altKey
|
|
94
94
|
if (!this.isCreating) {
|
|
95
|
-
if (this.editor.inputs.
|
|
95
|
+
if (this.editor.inputs.altKey) {
|
|
96
96
|
this.startCloning()
|
|
97
97
|
if (this.isCloning) return
|
|
98
98
|
}
|
|
@@ -122,7 +122,7 @@ export class Translating extends StateNode {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
override onKeyDown() {
|
|
125
|
-
if (this.editor.inputs.
|
|
125
|
+
if (this.editor.inputs.altKey && !this.isCloning) {
|
|
126
126
|
this.startCloning()
|
|
127
127
|
if (this.isCloning) return
|
|
128
128
|
}
|
|
@@ -132,7 +132,7 @@ export class Translating extends StateNode {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
override onKeyUp() {
|
|
135
|
-
if (!this.editor.inputs.
|
|
135
|
+
if (!this.editor.inputs.altKey && this.isCloning) {
|
|
136
136
|
this.stopCloning()
|
|
137
137
|
return
|
|
138
138
|
}
|
|
@@ -258,7 +258,7 @@ export class Translating extends StateNode {
|
|
|
258
258
|
// Get fresh shapes from the snapshot, in case onTranslateStart mutates the shape
|
|
259
259
|
compact(this.snapshot.movingShapes.map((s) => this.editor.getShape(s.id))),
|
|
260
260
|
// Start from the place where the user started dragging
|
|
261
|
-
this.editor.inputs.
|
|
261
|
+
this.editor.inputs.originPagePoint,
|
|
262
262
|
this.updateParentTransforms
|
|
263
263
|
)
|
|
264
264
|
|
|
@@ -305,7 +305,7 @@ export class Translating extends StateNode {
|
|
|
305
305
|
// We should have started already, but hey
|
|
306
306
|
this.dragAndDropManager.startDraggingShapes(
|
|
307
307
|
snapshot.movingShapes,
|
|
308
|
-
this.editor.inputs.
|
|
308
|
+
this.editor.inputs.originPagePoint,
|
|
309
309
|
this.updateParentTransforms
|
|
310
310
|
)
|
|
311
311
|
|
|
@@ -404,10 +404,12 @@ function getTranslatingSnapshot(editor: Editor) {
|
|
|
404
404
|
let noteAdjacentPositions: Vec[] | undefined
|
|
405
405
|
let noteSnapshot: (MovingShapeSnapshot & { shape: TLNoteShape }) | undefined
|
|
406
406
|
|
|
407
|
-
const originPagePoint = editor.inputs
|
|
407
|
+
const { originPagePoint } = editor.inputs
|
|
408
408
|
|
|
409
409
|
const allHoveredNotes = shapeSnapshots.filter(
|
|
410
|
-
(s) =>
|
|
410
|
+
(s) =>
|
|
411
|
+
editor.isShapeOfType<TLNoteShape>(s.shape, 'note') &&
|
|
412
|
+
editor.isPointInShape(s.shape, originPagePoint)
|
|
411
413
|
) as (MovingShapeSnapshot & { shape: TLNoteShape })[]
|
|
412
414
|
|
|
413
415
|
if (allHoveredNotes.length === 0) {
|
|
@@ -473,16 +475,13 @@ export function moveShapesToPoint({
|
|
|
473
475
|
averagePagePoint,
|
|
474
476
|
} = snapshot
|
|
475
477
|
|
|
476
|
-
const shiftKey = editor.inputs.getShiftKey()
|
|
477
|
-
const accelKey = editor.inputs.getAccelKey()
|
|
478
|
-
|
|
479
478
|
const isGridMode = editor.getInstanceState().isGridMode
|
|
480
479
|
|
|
481
480
|
const gridSize = editor.getDocumentSettings().gridSize
|
|
482
481
|
|
|
483
|
-
const delta = Vec.Sub(inputs.
|
|
482
|
+
const delta = Vec.Sub(inputs.currentPagePoint, inputs.originPagePoint)
|
|
484
483
|
|
|
485
|
-
const flatten: 'x' | 'y' | null = shiftKey
|
|
484
|
+
const flatten: 'x' | 'y' | null = editor.inputs.shiftKey
|
|
486
485
|
? Math.abs(delta.x) < Math.abs(delta.y)
|
|
487
486
|
? 'x'
|
|
488
487
|
: 'y'
|
|
@@ -498,9 +497,9 @@ export function moveShapesToPoint({
|
|
|
498
497
|
editor.snaps.clearIndicators()
|
|
499
498
|
|
|
500
499
|
// If the user isn't moving super quick
|
|
501
|
-
const isSnapping = editor.user.getIsSnapMode() ? !
|
|
500
|
+
const isSnapping = editor.user.getIsSnapMode() ? !inputs.ctrlKey : inputs.ctrlKey
|
|
502
501
|
let snappedToPit = false
|
|
503
|
-
if (isSnapping && editor.inputs.
|
|
502
|
+
if (isSnapping && editor.inputs.pointerVelocity.len() < 0.5) {
|
|
504
503
|
// snapping
|
|
505
504
|
const { nudge } = editor.snaps.shapeBounds.snapTranslateShapes({
|
|
506
505
|
dragDelta: delta,
|
|
@@ -540,9 +539,9 @@ export function moveShapesToPoint({
|
|
|
540
539
|
|
|
541
540
|
const averageSnappedPoint = Vec.Add(averagePagePoint, delta)
|
|
542
541
|
|
|
543
|
-
// we don't want to snap to the grid if we're holding the
|
|
542
|
+
// we don't want to snap to the grid if we're holding the ctrl key, if we've already snapped into a pit, or if we're showing snapping indicators
|
|
544
543
|
const snapIndicators = editor.snaps.getIndicators()
|
|
545
|
-
if (isGridMode && !
|
|
544
|
+
if (isGridMode && !inputs.ctrlKey && !snappedToPit && snapIndicators.length === 0) {
|
|
546
545
|
averageSnappedPoint.snapToGrid(gridSize)
|
|
547
546
|
}
|
|
548
547
|
|
|
@@ -1,50 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Editor,
|
|
3
|
-
ExtractShapeByProps,
|
|
4
|
-
richTextValidator,
|
|
5
|
-
TLEventInfo,
|
|
6
|
-
TLRichText,
|
|
7
|
-
TLShape,
|
|
8
|
-
TLShapeId,
|
|
9
|
-
} from '@tldraw/editor'
|
|
1
|
+
import { Editor, TLShape } from '@tldraw/editor'
|
|
10
2
|
|
|
11
3
|
/** @internal */
|
|
12
|
-
export function
|
|
13
|
-
shape: TLShape
|
|
14
|
-
): shape is ExtractShapeByProps<{ richText: TLRichText }> {
|
|
15
|
-
return 'richText' in shape.props && richTextValidator.isValid(shape.props.richText)
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Start editing a shape that has rich text, such as text, note, geo, or arrow shapes.
|
|
19
|
-
* This will enter the editing state for the shape and optionally select all the text.
|
|
20
|
-
*
|
|
21
|
-
* @param editor - The editor instance.
|
|
22
|
-
* @param shapeOrId - The shape to start editing. This shape must have a richText property with a TLRichText value.
|
|
23
|
-
* @param options - Options: selectAll or info (TLEventInfo)
|
|
24
|
-
*
|
|
25
|
-
* @public
|
|
26
|
-
*/
|
|
27
|
-
export function startEditingShapeWithRichText(
|
|
28
|
-
editor: Editor,
|
|
29
|
-
shapeOrId: TLShape | TLShapeId,
|
|
30
|
-
options: { selectAll?: boolean; info?: TLEventInfo } = {}
|
|
31
|
-
) {
|
|
32
|
-
const shape = typeof shapeOrId === 'string' ? editor.getShape(shapeOrId) : shapeOrId
|
|
33
|
-
if (!shape) return
|
|
34
|
-
|
|
35
|
-
if (!editor.canEditShape(shape)) return
|
|
36
|
-
|
|
37
|
-
if (!hasRichText(shape)) {
|
|
38
|
-
throw new Error('Shape does not have rich text')
|
|
39
|
-
}
|
|
4
|
+
export function startEditingShapeWithLabel(editor: Editor, shape: TLShape, selectAll = false) {
|
|
40
5
|
// Finish this shape and start editing the next one
|
|
6
|
+
editor.select(shape)
|
|
41
7
|
editor.setEditingShape(shape)
|
|
42
8
|
editor.setCurrentTool('select.editing_shape', {
|
|
43
|
-
...options.info,
|
|
44
9
|
target: 'shape',
|
|
45
10
|
shape: shape,
|
|
46
11
|
})
|
|
47
|
-
if (
|
|
12
|
+
if (selectAll) {
|
|
48
13
|
editor.emit('select-all-text', { shapeId: shape.id })
|
|
49
14
|
}
|
|
50
15
|
}
|
|
@@ -57,7 +57,7 @@ export class ZoomTool extends StateNode {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
private updateCursor() {
|
|
60
|
-
if (this.editor.inputs.
|
|
60
|
+
if (this.editor.inputs.altKey) {
|
|
61
61
|
this.editor.setCursor({ type: 'zoom-out', rotation: 0 })
|
|
62
62
|
} else {
|
|
63
63
|
this.editor.setCursor({ type: 'zoom-in', rotation: 0 })
|
|
@@ -14,7 +14,7 @@ export class Pointing extends StateNode {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
override onPointerMove() {
|
|
17
|
-
if (this.editor.inputs.
|
|
17
|
+
if (this.editor.inputs.isDragging) {
|
|
18
18
|
this.parent.transition('zoom_brushing', this.info)
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -24,8 +24,8 @@ export class Pointing extends StateNode {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
private complete() {
|
|
27
|
-
const currentScreenPoint = this.editor.inputs
|
|
28
|
-
if (this.editor.inputs.
|
|
27
|
+
const { currentScreenPoint } = this.editor.inputs
|
|
28
|
+
if (this.editor.inputs.altKey) {
|
|
29
29
|
this.editor.zoomOut(currentScreenPoint, { animation: { duration: 220 } })
|
|
30
30
|
} else {
|
|
31
31
|
this.editor.zoomIn(currentScreenPoint, { animation: { duration: 220 } })
|
|
@@ -29,8 +29,9 @@ export class ZoomBrushing extends StateNode {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
private update() {
|
|
32
|
-
const
|
|
33
|
-
|
|
32
|
+
const {
|
|
33
|
+
inputs: { originPagePoint, currentPagePoint },
|
|
34
|
+
} = this.editor
|
|
34
35
|
|
|
35
36
|
this.zoomBrush.setTo(Box.FromPoints([originPagePoint, currentPagePoint]))
|
|
36
37
|
this.editor.updateInstanceState({ zoomBrush: this.zoomBrush.toJson() })
|
|
@@ -45,14 +46,14 @@ export class ZoomBrushing extends StateNode {
|
|
|
45
46
|
const threshold = 8 / this.editor.getZoomLevel()
|
|
46
47
|
// If the selected area is small then treat it as a click
|
|
47
48
|
if (zoomBrush.width < threshold && zoomBrush.height < threshold) {
|
|
48
|
-
const point = this.editor.inputs.
|
|
49
|
-
if (this.editor.inputs.
|
|
49
|
+
const point = this.editor.inputs.currentScreenPoint
|
|
50
|
+
if (this.editor.inputs.altKey) {
|
|
50
51
|
this.editor.zoomOut(point, { animation: { duration: 220 } })
|
|
51
52
|
} else {
|
|
52
53
|
this.editor.zoomIn(point, { animation: { duration: 220 } })
|
|
53
54
|
}
|
|
54
55
|
} else {
|
|
55
|
-
const targetZoom = this.editor.inputs.
|
|
56
|
+
const targetZoom = this.editor.inputs.altKey ? this.editor.getZoomLevel() / 2 : undefined
|
|
56
57
|
this.editor.zoomToBounds(zoomBrush, { targetZoom, animation: { duration: 220 } })
|
|
57
58
|
}
|
|
58
59
|
|
|
@@ -6,7 +6,9 @@ export function getHitShapeOnCanvasPointerDown(
|
|
|
6
6
|
hitLabels = false
|
|
7
7
|
): TLShape | undefined {
|
|
8
8
|
const zoomLevel = editor.getZoomLevel()
|
|
9
|
-
const
|
|
9
|
+
const {
|
|
10
|
+
inputs: { currentPagePoint },
|
|
11
|
+
} = editor
|
|
10
12
|
|
|
11
13
|
return (
|
|
12
14
|
// hovered shape at point
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Editor } from '@tldraw/editor'
|
|
2
|
+
|
|
3
|
+
export function getShouldEnterCropMode(editor: Editor): boolean {
|
|
4
|
+
const onlySelectedShape = editor.getOnlySelectedShape()
|
|
5
|
+
return !!(
|
|
6
|
+
onlySelectedShape &&
|
|
7
|
+
!editor.isShapeOrAncestorLocked(onlySelectedShape) &&
|
|
8
|
+
editor.getShapeUtil(onlySelectedShape).canCrop(onlySelectedShape)
|
|
9
|
+
)
|
|
10
|
+
}
|
|
@@ -5,7 +5,7 @@ export function selectOnCanvasPointerUp(
|
|
|
5
5
|
info: TLPointerEventInfo | TLClickEventInfo
|
|
6
6
|
) {
|
|
7
7
|
const selectedShapeIds = editor.getSelectedShapeIds()
|
|
8
|
-
const currentPagePoint = editor.inputs
|
|
8
|
+
const { currentPagePoint } = editor.inputs
|
|
9
9
|
const { shiftKey, altKey, accelKey } = info
|
|
10
10
|
const additiveSelectionKey = shiftKey || accelKey
|
|
11
11
|
|
|
@@ -2,7 +2,7 @@ import { Editor, TLShape, throttle } from '@tldraw/editor'
|
|
|
2
2
|
|
|
3
3
|
function _updateHoveredShapeId(editor: Editor) {
|
|
4
4
|
// todo: consider replacing `get hoveredShapeId` with this; it would mean keeping hoveredShapeId in memory rather than in the store and possibly re-computing it more often than necessary
|
|
5
|
-
const hitShape = editor.getShapeAtPoint(editor.inputs.
|
|
5
|
+
const hitShape = editor.getShapeAtPoint(editor.inputs.currentPagePoint, {
|
|
6
6
|
hitInside: false,
|
|
7
7
|
hitLabels: false,
|
|
8
8
|
margin: editor.options.hitTestMargin / editor.getZoomLevel(),
|
package/src/lib/ui/TldrawUi.tsx
CHANGED
|
@@ -81,11 +81,6 @@ const TldrawUiInner = React.memo(function TldrawUiInner({
|
|
|
81
81
|
// If we ever need want the UI to mount and preserve state, then
|
|
82
82
|
// we should change this behavior and hide the UI via CSS instead.
|
|
83
83
|
|
|
84
|
-
// Keyboard shortcuts and clipboard events should always be mounted,
|
|
85
|
-
// even when the UI is hidden.
|
|
86
|
-
useKeyboardShortcuts()
|
|
87
|
-
useNativeClipboardEvents()
|
|
88
|
-
|
|
89
84
|
return (
|
|
90
85
|
<>
|
|
91
86
|
{children}
|
|
@@ -117,6 +112,8 @@ const TldrawUiContent = React.memo(function TldrawUI() {
|
|
|
117
112
|
A11y,
|
|
118
113
|
} = useTldrawUiComponents()
|
|
119
114
|
|
|
115
|
+
useKeyboardShortcuts()
|
|
116
|
+
useNativeClipboardEvents()
|
|
120
117
|
useEditorEvents()
|
|
121
118
|
|
|
122
119
|
const rIsEditingAnything = useRef(false)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useEditor, useValue } from '@tldraw/editor'
|
|
1
2
|
import { PORTRAIT_BREAKPOINT } from '../../constants'
|
|
2
3
|
import { useBreakpoint } from '../../context/breakpoints'
|
|
3
4
|
import {
|
|
@@ -8,7 +9,6 @@ import {
|
|
|
8
9
|
useThreeStackableItems,
|
|
9
10
|
useUnlockedSelectedShapesCount,
|
|
10
11
|
} from '../../hooks/menu-hooks'
|
|
11
|
-
import { ZoomTo100MenuItem } from '../menu-items'
|
|
12
12
|
import { TldrawUiMenuActionItem } from '../primitives/menus/TldrawUiMenuActionItem'
|
|
13
13
|
|
|
14
14
|
/** @public @react */
|
|
@@ -99,6 +99,14 @@ export function ZoomOrRotateMenuItem() {
|
|
|
99
99
|
}
|
|
100
100
|
/** @public @react */
|
|
101
101
|
|
|
102
|
+
export function ZoomTo100MenuItem() {
|
|
103
|
+
const editor = useEditor()
|
|
104
|
+
const isZoomedTo100 = useValue('zoom is 1', () => editor.getZoomLevel() === 1, [editor])
|
|
105
|
+
|
|
106
|
+
return <TldrawUiMenuActionItem actionId="zoom-to-100" disabled={isZoomedTo100} />
|
|
107
|
+
}
|
|
108
|
+
/** @public @react */
|
|
109
|
+
|
|
102
110
|
export function RotateCCWMenuItem() {
|
|
103
111
|
const oneSelected = useUnlockedSelectedShapesCount(1)
|
|
104
112
|
const isInSelectState = useIsInSelectState()
|
|
@@ -66,7 +66,9 @@ export const DefaultContextMenu = memo(function DefaultContextMenu({
|
|
|
66
66
|
// Weird route: selecting locked shapes on long press
|
|
67
67
|
if (editor.getInstanceState().isCoarsePointer) {
|
|
68
68
|
const selectedShapes = editor.getSelectedShapes()
|
|
69
|
-
const
|
|
69
|
+
const {
|
|
70
|
+
inputs: { currentPagePoint },
|
|
71
|
+
} = editor
|
|
70
72
|
|
|
71
73
|
// get all of the shapes under the current pointer
|
|
72
74
|
const shapesAtPoint = editor.getShapesAtPoint(currentPagePoint)
|
|
@@ -46,14 +46,14 @@ export const CursorChatBubble = track(function CursorChatBubble() {
|
|
|
46
46
|
return chatMessage.trim() ? <NotEditingChatMessage chatMessage={chatMessage} /> : null
|
|
47
47
|
})
|
|
48
48
|
|
|
49
|
-
function usePositionBubble(ref: RefObject<HTMLInputElement
|
|
49
|
+
function usePositionBubble(ref: RefObject<HTMLInputElement>) {
|
|
50
50
|
const editor = useEditor()
|
|
51
51
|
|
|
52
52
|
useLayoutEffect(() => {
|
|
53
53
|
const elm = ref.current
|
|
54
54
|
if (!elm) return
|
|
55
55
|
|
|
56
|
-
const { x, y } = editor.inputs.
|
|
56
|
+
const { x, y } = editor.inputs.currentScreenPoint
|
|
57
57
|
ref.current?.style.setProperty('transform', `translate(${x}px, ${y}px)`)
|
|
58
58
|
|
|
59
59
|
// Positioning the chat bubble
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
debugFlags,
|
|
3
|
+
track,
|
|
4
|
+
useEditor,
|
|
5
|
+
usePassThroughWheelEvents,
|
|
6
|
+
useValue,
|
|
7
|
+
Vec,
|
|
8
|
+
} from '@tldraw/editor'
|
|
9
|
+
import { memo, useEffect, useRef, useState } from 'react'
|
|
3
10
|
import { useTldrawUiComponents } from '../context/components'
|
|
4
11
|
|
|
5
12
|
/** @internal */
|
|
@@ -18,10 +25,42 @@ export const DefaultDebugPanel = memo(function DefaultDebugPanel() {
|
|
|
18
25
|
)
|
|
19
26
|
})
|
|
20
27
|
|
|
28
|
+
function useTick(isEnabled = true) {
|
|
29
|
+
const [_, setTick] = useState(0)
|
|
30
|
+
const editor = useEditor()
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!isEnabled) return
|
|
33
|
+
const update = () => setTick((tick) => tick + 1)
|
|
34
|
+
editor.on('tick', update)
|
|
35
|
+
return () => {
|
|
36
|
+
editor.off('tick', update)
|
|
37
|
+
}
|
|
38
|
+
}, [editor, isEnabled])
|
|
39
|
+
}
|
|
40
|
+
|
|
21
41
|
const CurrentState = track(function CurrentState() {
|
|
42
|
+
useTick()
|
|
43
|
+
|
|
22
44
|
const editor = useEditor()
|
|
45
|
+
|
|
23
46
|
const path = editor.getPath()
|
|
24
|
-
|
|
47
|
+
const hoverShape = editor.getHoveredShape()
|
|
48
|
+
const selectedShape = editor.getOnlySelectedShape()
|
|
49
|
+
const shape = path === 'select.idle' || !path.includes('select.') ? hoverShape : selectedShape
|
|
50
|
+
const shapeInfo =
|
|
51
|
+
shape && path.includes('select.')
|
|
52
|
+
? ` / ${shape.type || ''}${
|
|
53
|
+
'geo' in shape.props ? ' / ' + shape.props.geo : ''
|
|
54
|
+
} / [${Vec.ToInt(editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint))}]`
|
|
55
|
+
: ''
|
|
56
|
+
const ruler =
|
|
57
|
+
path.startsWith('select.') && !path.includes('.idle')
|
|
58
|
+
? ` / [${Vec.ToInt(editor.inputs.originPagePoint)}] → [${Vec.ToInt(
|
|
59
|
+
editor.inputs.currentPagePoint
|
|
60
|
+
)}] = ${Vec.Dist(editor.inputs.originPagePoint, editor.inputs.currentPagePoint).toFixed(0)}`
|
|
61
|
+
: ''
|
|
62
|
+
|
|
63
|
+
return <div className="tlui-debug-panel__current-state">{`${path}${shapeInfo}${ruler}`}</div>
|
|
25
64
|
})
|
|
26
65
|
|
|
27
66
|
function FPS() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { T, TLBaseShape, track, useEditor } from '@tldraw/editor'
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
3
3
|
import { TLUiDialogProps } from '../context/dialogs'
|
|
4
4
|
import { useTranslation } from '../hooks/useTranslation/useTranslation'
|
|
@@ -25,28 +25,20 @@ function validateUrl(url: string) {
|
|
|
25
25
|
return { isValid: false, hasProtocol: false }
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
type ShapeWithUrl =
|
|
29
|
-
|
|
30
|
-
function isShapeWithUrl(shape: TLShape | null | undefined): shape is ShapeWithUrl {
|
|
31
|
-
return !!(shape && 'url' in shape.props && typeof shape.props.url === 'string')
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function assertShapeWithUrl(shape: TLShape | null | undefined): asserts shape is ShapeWithUrl {
|
|
35
|
-
if (!isShapeWithUrl(shape)) {
|
|
36
|
-
throw new Error('Shape is not a valid ShapeWithUrl')
|
|
37
|
-
}
|
|
38
|
-
}
|
|
28
|
+
type ShapeWithUrl = TLBaseShape<string, { url: string }>
|
|
39
29
|
|
|
40
30
|
export const EditLinkDialog = track(function EditLinkDialog({ onClose }: TLUiDialogProps) {
|
|
41
31
|
const editor = useEditor()
|
|
42
32
|
|
|
43
33
|
const selectedShape = editor.getOnlySelectedShape()
|
|
44
34
|
|
|
45
|
-
if (
|
|
35
|
+
if (
|
|
36
|
+
!(selectedShape && 'url' in selectedShape.props && typeof selectedShape.props.url === 'string')
|
|
37
|
+
) {
|
|
46
38
|
return null
|
|
47
39
|
}
|
|
48
40
|
|
|
49
|
-
return <EditLinkDialogInner onClose={onClose} selectedShape={selectedShape} />
|
|
41
|
+
return <EditLinkDialogInner onClose={onClose} selectedShape={selectedShape as ShapeWithUrl} />
|
|
50
42
|
})
|
|
51
43
|
|
|
52
44
|
export const EditLinkDialogInner = track(function EditLinkDialogInner({
|
|
@@ -106,7 +98,6 @@ export const EditLinkDialogInner = track(function EditLinkDialogInner({
|
|
|
106
98
|
const handleClear = useCallback(() => {
|
|
107
99
|
const onlySelectedShape = editor.getOnlySelectedShape()
|
|
108
100
|
if (!onlySelectedShape) return
|
|
109
|
-
assertShapeWithUrl(onlySelectedShape)
|
|
110
101
|
editor.updateShapes([
|
|
111
102
|
{ id: onlySelectedShape.id, type: onlySelectedShape.type, props: { url: '' } },
|
|
112
103
|
])
|
|
@@ -117,7 +108,6 @@ export const EditLinkDialogInner = track(function EditLinkDialogInner({
|
|
|
117
108
|
const onlySelectedShape = editor.getOnlySelectedShape()
|
|
118
109
|
|
|
119
110
|
if (!onlySelectedShape) return
|
|
120
|
-
assertShapeWithUrl(onlySelectedShape)
|
|
121
111
|
|
|
122
112
|
// ? URL is a magic value
|
|
123
113
|
if (onlySelectedShape && 'url' in onlySelectedShape.props) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEditor, useValue } from '@tldraw/editor'
|
|
2
2
|
import { useActions } from '../../context/actions'
|
|
3
|
-
import { TldrawUiMenuItem
|
|
3
|
+
import { TldrawUiMenuItem } from '../primitives/menus/TldrawUiMenuItem'
|
|
4
4
|
|
|
5
5
|
export function StopFollowing() {
|
|
6
6
|
const editor = useEditor()
|
|
@@ -13,5 +13,5 @@ export function StopFollowing() {
|
|
|
13
13
|
)
|
|
14
14
|
if (!followingUser) return null
|
|
15
15
|
|
|
16
|
-
return <TldrawUiMenuItem {...
|
|
16
|
+
return <TldrawUiMenuItem {...actions['stop-following']} />
|
|
17
17
|
}
|