tldraw 4.3.0-canary.d8da2a99f394 → 4.3.0-canary.da3162650c27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/dist-cjs/index.d.ts +311 -242
- package/dist-cjs/index.js +13 -5
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
- package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
- package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/defaultSideEffects.js +6 -1
- package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
- package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
- package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/crop.js +1 -0
- package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
- package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
- package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
- package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
- package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
- package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
- package/dist-cjs/lib/ui/components/menu-items.js +3 -1
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +7 -8
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +1 -2
- package/dist-cjs/lib/ui/context/components.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
- package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
- package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
- package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
- package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
- package/dist-cjs/lib/utils/text/richText.js +11 -19
- package/dist-cjs/lib/utils/text/richText.js.map +3 -3
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +311 -242
- package/dist-esm/index.mjs +14 -5
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
- package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/defaultSideEffects.mjs +6 -1
- package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
- package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
- package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
- package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
- package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +7 -8
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +1 -2
- package/dist-esm/lib/ui/context/components.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
- package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
- package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
- package/dist-esm/lib/utils/test-helpers.mjs +21 -0
- package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
- package/dist-esm/lib/utils/text/richText.mjs +8 -5
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +18 -16
- package/src/index.ts +6 -2
- package/src/lib/Tldraw.test.tsx +46 -1
- package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
- package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
- package/src/lib/defaultEmbedDefinitions.ts +2 -1
- package/src/lib/defaultExternalContentHandlers.ts +13 -14
- package/src/lib/defaultSideEffects.ts +6 -1
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
- package/src/lib/shapes/arrow/arrow-types.ts +2 -0
- package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
- package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
- package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
- package/src/lib/shapes/arrow/shared.ts +4 -4
- package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
- package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
- package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
- package/src/lib/shapes/draw/getPath.ts +31 -10
- package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
- package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
- package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
- package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
- package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
- package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
- package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
- package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
- package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
- package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
- package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
- package/src/lib/shapes/note/noteCloning.test.ts +3 -1
- package/src/lib/shapes/note/noteHelpers.ts +2 -2
- package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
- package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
- package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
- package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
- package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
- package/src/lib/shapes/shared/crop.ts +1 -0
- package/src/lib/shapes/shared/interpolate-props.ts +4 -4
- package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
- package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
- package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
- package/src/lib/shapes/text/RichTextArea.tsx +5 -0
- package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
- package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
- package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
- package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
- package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
- package/src/lib/tools/HandTool/HandTool.ts +3 -5
- package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
- package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
- package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
- package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
- package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
- package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
- package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
- package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
- package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
- package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
- package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
- package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
- package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
- package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
- package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
- package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
- package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
- package/src/lib/ui/TldrawUi.tsx +5 -2
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
- package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
- package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
- package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
- package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
- package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
- package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
- package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
- package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
- package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
- package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
- package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
- package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
- package/src/lib/ui/components/menu-items.tsx +9 -15
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
- package/src/lib/ui/context/actions.tsx +15 -19
- package/src/lib/ui/context/components.tsx +1 -2
- package/src/lib/ui/hooks/menu-hooks.ts +9 -19
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useFlatten.ts +1 -2
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
- package/src/lib/ui/hooks/useTools.tsx +5 -7
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +27 -23
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
- package/src/lib/utils/export/exportAs.ts +2 -9
- package/src/lib/utils/frames/frames.ts +1 -1
- package/src/lib/utils/test-helpers.ts +60 -0
- package/src/lib/utils/text/richText.ts +9 -8
- package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
- package/src/test/Editor.test.tsx +78 -41
- package/src/test/EraserTool.test.ts +10 -12
- package/src/test/SelectTool.test.ts +11 -19
- package/src/test/TestEditor.ts +49 -51
- package/src/test/TldrawEditor.test.tsx +24 -20
- package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
- package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
- package/src/test/arrows-megabus.test.tsx +1 -1
- package/src/test/bindings.test.tsx +29 -25
- package/src/test/bindingsIndex.test.tsx +4 -4
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
- package/src/test/commands/cameraState.test.ts +299 -0
- package/src/test/commands/createShape.test.ts +64 -0
- package/src/test/commands/createShapes.test.ts +15 -1
- package/src/test/commands/getSvgString.test.ts +2 -2
- package/src/test/commands/isShapeOfType.test.ts +44 -0
- package/src/test/commands/putContent.test.ts +80 -1
- package/src/test/commands/setCamera.test.ts +13 -11
- package/src/test/commands/stackShapes.test.ts +34 -8
- package/src/test/commands/updateShape.test.ts +67 -0
- package/src/test/commands/updateShapes.test.ts +21 -5
- package/src/test/commands/zoomToBounds.test.ts +19 -3
- package/src/test/commands/zoomToSelection.test.ts +14 -3
- package/src/test/custom-clipping.test.ts +52 -44
- package/src/test/customSnapping.test.tsx +77 -62
- package/src/test/drawing.test.ts +17 -10
- package/src/test/duplicate.test.ts +1 -1
- package/src/test/flipShapes.test.ts +33 -0
- package/src/test/frames.test.ts +94 -2
- package/src/test/getCulledShapes.test.tsx +11 -3
- package/src/test/getShapeAtPoint.test.ts +2 -2
- package/src/test/groups.test.tsx +7 -4
- package/src/test/modifiers.test.ts +6 -6
- package/src/test/resizing.test.ts +16 -22
- package/src/test/selection-omnibus.test.ts +13 -13
- package/src/test/shapeutils.test.ts +1 -1
- package/src/test/spacebarPanning.test.ts +28 -10
- package/src/test/styles2.test.tsx +1 -1
- package/src/test/styles3.test.ts +5 -5
- package/src/test/test-jsx.tsx +72 -57
- package/src/test/text.test.ts +15 -17
- package/src/test/translating.test.ts +6 -8
- package/src/test/ui/BackToContent.test.tsx +111 -0
- package/tldraw.css +41 -35
- package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
- package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
- package/dist-cjs/lib/utils/text/textDirection.js +0 -51
- package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
- package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
- package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
- package/src/lib/shapes/shared/useForceSolid.ts +0 -6
- package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
- package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
- package/src/lib/utils/text/textDirection.ts +0 -32
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
TLShapePartial,
|
|
11
11
|
Vec,
|
|
12
12
|
VecModel,
|
|
13
|
+
b64Vecs,
|
|
13
14
|
createShapeId,
|
|
14
15
|
last,
|
|
15
16
|
snapAngle,
|
|
@@ -49,19 +50,23 @@ export class Drawing extends StateNode {
|
|
|
49
50
|
mergeNextPoint = false
|
|
50
51
|
currentLineLength = 0
|
|
51
52
|
|
|
53
|
+
// Cache for current segment's points to avoid repeated b64 decode/encode
|
|
54
|
+
currentSegmentPoints: Vec[] = []
|
|
55
|
+
|
|
52
56
|
markId = null as null | string
|
|
53
57
|
|
|
54
58
|
override onEnter(info: TLPointerEventInfo) {
|
|
55
59
|
this.markId = null
|
|
56
60
|
this.info = info
|
|
57
|
-
this.lastRecordedPoint = this.editor.inputs.
|
|
61
|
+
this.lastRecordedPoint = this.editor.inputs.getCurrentPagePoint().clone()
|
|
58
62
|
this.startShape()
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
override onPointerMove() {
|
|
62
66
|
const { inputs } = this.editor
|
|
67
|
+
const isPen = inputs.getIsPen()
|
|
63
68
|
|
|
64
|
-
if (this.isPen && !
|
|
69
|
+
if (this.isPen && !isPen) {
|
|
65
70
|
// The user made a palm gesture before starting a pen gesture;
|
|
66
71
|
// ideally we'd start the new shape here but we could also just bail
|
|
67
72
|
// as the next interaction will work correctly
|
|
@@ -74,11 +79,9 @@ export class Drawing extends StateNode {
|
|
|
74
79
|
|
|
75
80
|
if (this.isPenOrStylus) {
|
|
76
81
|
// Don't update the shape if we haven't moved far enough from the last time we recorded a point
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
) {
|
|
81
|
-
this.lastRecordedPoint = inputs.currentPagePoint.clone()
|
|
82
|
+
const currentPagePoint = inputs.getCurrentPagePoint()
|
|
83
|
+
if (Vec.Dist(currentPagePoint, this.lastRecordedPoint) >= 1 / this.editor.getZoomLevel()) {
|
|
84
|
+
this.lastRecordedPoint = currentPagePoint.clone()
|
|
82
85
|
this.mergeNextPoint = false
|
|
83
86
|
} else {
|
|
84
87
|
this.mergeNextPoint = true
|
|
@@ -96,7 +99,7 @@ export class Drawing extends StateNode {
|
|
|
96
99
|
case 'free': {
|
|
97
100
|
// We've just entered straight mode, go to straight mode
|
|
98
101
|
this.segmentMode = 'starting_straight'
|
|
99
|
-
this.pagePointWhereNextSegmentChanged = this.editor.inputs.
|
|
102
|
+
this.pagePointWhereNextSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
|
|
100
103
|
break
|
|
101
104
|
}
|
|
102
105
|
case 'starting_free': {
|
|
@@ -115,7 +118,7 @@ export class Drawing extends StateNode {
|
|
|
115
118
|
case 'straight': {
|
|
116
119
|
// We've just exited straight mode, go back to free mode
|
|
117
120
|
this.segmentMode = 'starting_free'
|
|
118
|
-
this.pagePointWhereNextSegmentChanged = this.editor.inputs.
|
|
121
|
+
this.pagePointWhereNextSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
|
|
119
122
|
break
|
|
120
123
|
}
|
|
121
124
|
case 'starting_straight': {
|
|
@@ -131,7 +134,7 @@ export class Drawing extends StateNode {
|
|
|
131
134
|
|
|
132
135
|
override onExit() {
|
|
133
136
|
this.editor.snaps.clearIndicators()
|
|
134
|
-
this.pagePointWhereCurrentSegmentChanged = this.editor.inputs.
|
|
137
|
+
this.pagePointWhereCurrentSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
|
|
135
138
|
}
|
|
136
139
|
|
|
137
140
|
canClose() {
|
|
@@ -142,11 +145,13 @@ export class Drawing extends StateNode {
|
|
|
142
145
|
if (!this.canClose()) return false
|
|
143
146
|
|
|
144
147
|
const strokeWidth = STROKE_SIZES[size]
|
|
145
|
-
const firstPoint = segments[0].points
|
|
148
|
+
const firstPoint = b64Vecs.decodeFirstPoint(segments[0].points)
|
|
146
149
|
const lastSegment = segments[segments.length - 1]
|
|
147
|
-
const lastPoint =
|
|
150
|
+
const lastPoint = b64Vecs.decodeLastPoint(lastSegment.points)
|
|
148
151
|
|
|
149
152
|
return (
|
|
153
|
+
firstPoint !== null &&
|
|
154
|
+
lastPoint !== null &&
|
|
150
155
|
firstPoint !== lastPoint &&
|
|
151
156
|
this.currentLineLength > strokeWidth * 4 * scale &&
|
|
152
157
|
Vec.DistMin(firstPoint, lastPoint, strokeWidth * 2 * scale)
|
|
@@ -154,9 +159,9 @@ export class Drawing extends StateNode {
|
|
|
154
159
|
}
|
|
155
160
|
|
|
156
161
|
private startShape() {
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
const inputs = this.editor.inputs
|
|
163
|
+
const originPagePoint = inputs.getOriginPagePoint()
|
|
164
|
+
const isPen = inputs.getIsPen()
|
|
160
165
|
|
|
161
166
|
this.markId = this.editor.markHistoryStoppingPoint('draw start')
|
|
162
167
|
|
|
@@ -172,7 +177,7 @@ export class Drawing extends StateNode {
|
|
|
172
177
|
|
|
173
178
|
const pressure = this.isPenOrStylus ? z * 1.25 : 0.5
|
|
174
179
|
|
|
175
|
-
this.segmentMode = this.editor.inputs.
|
|
180
|
+
this.segmentMode = this.editor.inputs.getShiftKey() ? 'straight' : 'free'
|
|
176
181
|
|
|
177
182
|
this.didJustShiftClickToExtendPreviousShapeLine = false
|
|
178
183
|
|
|
@@ -188,25 +193,17 @@ export class Drawing extends StateNode {
|
|
|
188
193
|
|
|
189
194
|
const prevSegment = last(shape.props.segments)
|
|
190
195
|
if (!prevSegment) throw Error('Expected a previous segment!')
|
|
191
|
-
const prevPoint =
|
|
196
|
+
const prevPoint = b64Vecs.decodeLastPoint(prevSegment.points)
|
|
192
197
|
if (!prevPoint) throw Error('Expected a previous point!')
|
|
193
198
|
|
|
194
199
|
const { x, y } = this.editor.getPointInShapeSpace(shape, originPagePoint).toFixed()
|
|
195
200
|
|
|
196
201
|
const newSegment: TLDrawShapeSegment = {
|
|
197
202
|
type: this.segmentMode,
|
|
198
|
-
points: [
|
|
199
|
-
{
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
z: +pressure.toFixed(2),
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
x,
|
|
206
|
-
y,
|
|
207
|
-
z: +pressure.toFixed(2),
|
|
208
|
-
},
|
|
209
|
-
],
|
|
203
|
+
points: b64Vecs.encodePoints([
|
|
204
|
+
{ x: prevPoint.x, y: prevPoint.y, z: +pressure.toFixed(2) },
|
|
205
|
+
{ x, y, z: +pressure.toFixed(2) },
|
|
206
|
+
]),
|
|
210
207
|
}
|
|
211
208
|
|
|
212
209
|
// Convert prevPoint to page space
|
|
@@ -238,7 +235,7 @@ export class Drawing extends StateNode {
|
|
|
238
235
|
)
|
|
239
236
|
}
|
|
240
237
|
|
|
241
|
-
this.editor.updateShapes
|
|
238
|
+
this.editor.updateShapes([shapePartial])
|
|
242
239
|
|
|
243
240
|
return
|
|
244
241
|
}
|
|
@@ -249,8 +246,12 @@ export class Drawing extends StateNode {
|
|
|
249
246
|
this.pagePointWhereCurrentSegmentChanged = originPagePoint.clone()
|
|
250
247
|
const id = createShapeId()
|
|
251
248
|
|
|
249
|
+
// Initialize the segment points cache
|
|
250
|
+
const initialPoint = new Vec(0, 0, +pressure.toFixed(2))
|
|
251
|
+
this.currentSegmentPoints = [initialPoint]
|
|
252
|
+
|
|
252
253
|
// Allow this to trigger the max shapes reached alert
|
|
253
|
-
this.editor.createShape
|
|
254
|
+
this.editor.createShape({
|
|
254
255
|
id,
|
|
255
256
|
type: this.shapeType,
|
|
256
257
|
x: originPagePoint.x,
|
|
@@ -261,13 +262,7 @@ export class Drawing extends StateNode {
|
|
|
261
262
|
segments: [
|
|
262
263
|
{
|
|
263
264
|
type: this.segmentMode,
|
|
264
|
-
points: [
|
|
265
|
-
{
|
|
266
|
-
x: 0,
|
|
267
|
-
y: 0,
|
|
268
|
-
z: +pressure.toFixed(2),
|
|
269
|
-
},
|
|
270
|
-
],
|
|
265
|
+
points: b64Vecs.encodePoints([initialPoint]),
|
|
271
266
|
},
|
|
272
267
|
],
|
|
273
268
|
},
|
|
@@ -298,8 +293,9 @@ export class Drawing extends StateNode {
|
|
|
298
293
|
|
|
299
294
|
const { segments } = shape.props
|
|
300
295
|
|
|
301
|
-
const
|
|
302
|
-
const
|
|
296
|
+
const currentPagePoint = inputs.getCurrentPagePoint()
|
|
297
|
+
const { x, y, z } = this.editor.getPointInShapeSpace(shape, currentPagePoint).toFixed()
|
|
298
|
+
const pressure = this.isPenOrStylus ? +(currentPagePoint.z! * 1.25).toFixed(2) : 0.5
|
|
303
299
|
const newPoint = { x, y, z: pressure }
|
|
304
300
|
|
|
305
301
|
switch (this.segmentMode) {
|
|
@@ -311,7 +307,7 @@ export class Drawing extends StateNode {
|
|
|
311
307
|
}
|
|
312
308
|
|
|
313
309
|
const hasMovedFarEnough =
|
|
314
|
-
Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.
|
|
310
|
+
Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.getCurrentPagePoint()) >
|
|
315
311
|
this.editor.options.dragDistanceSquared
|
|
316
312
|
|
|
317
313
|
// Find the distance from where the pointer was when shift was released and
|
|
@@ -328,7 +324,7 @@ export class Drawing extends StateNode {
|
|
|
328
324
|
const prevSegment = last(segments)
|
|
329
325
|
if (!prevSegment) throw Error('Expected a previous segment!')
|
|
330
326
|
|
|
331
|
-
const prevLastPoint =
|
|
327
|
+
const prevLastPoint = b64Vecs.decodeLastPoint(prevSegment.points)
|
|
332
328
|
if (!prevLastPoint) throw Error('Expected a previous last point!')
|
|
333
329
|
|
|
334
330
|
let newSegment: TLDrawShapeSegment
|
|
@@ -343,7 +339,7 @@ export class Drawing extends StateNode {
|
|
|
343
339
|
|
|
344
340
|
newSegment = {
|
|
345
341
|
type: 'straight',
|
|
346
|
-
points: [
|
|
342
|
+
points: b64Vecs.encodePoints([prevLastPoint, newLastPoint]),
|
|
347
343
|
}
|
|
348
344
|
|
|
349
345
|
const transform = this.editor.getShapePageTransform(shape)!
|
|
@@ -352,7 +348,7 @@ export class Drawing extends StateNode {
|
|
|
352
348
|
} else {
|
|
353
349
|
newSegment = {
|
|
354
350
|
type: 'straight',
|
|
355
|
-
points: [newLastPoint, newPoint],
|
|
351
|
+
points: b64Vecs.encodePoints([newLastPoint, newPoint]),
|
|
356
352
|
}
|
|
357
353
|
}
|
|
358
354
|
|
|
@@ -372,7 +368,7 @@ export class Drawing extends StateNode {
|
|
|
372
368
|
)
|
|
373
369
|
}
|
|
374
370
|
|
|
375
|
-
this.editor.updateShapes
|
|
371
|
+
this.editor.updateShapes([shapePartial])
|
|
376
372
|
}
|
|
377
373
|
break
|
|
378
374
|
}
|
|
@@ -384,7 +380,7 @@ export class Drawing extends StateNode {
|
|
|
384
380
|
}
|
|
385
381
|
|
|
386
382
|
const hasMovedFarEnough =
|
|
387
|
-
Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.
|
|
383
|
+
Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.getCurrentPagePoint()) >
|
|
388
384
|
this.editor.options.dragDistanceSquared
|
|
389
385
|
|
|
390
386
|
// Find the distance from where the pointer was when shift was released and
|
|
@@ -400,7 +396,7 @@ export class Drawing extends StateNode {
|
|
|
400
396
|
|
|
401
397
|
const newSegments = segments.slice()
|
|
402
398
|
const prevStraightSegment = newSegments[newSegments.length - 1]
|
|
403
|
-
const prevPoint =
|
|
399
|
+
const prevPoint = b64Vecs.decodeLastPoint(prevStraightSegment.points)
|
|
404
400
|
|
|
405
401
|
if (!prevPoint) {
|
|
406
402
|
throw Error('No previous point!')
|
|
@@ -408,15 +404,15 @@ export class Drawing extends StateNode {
|
|
|
408
404
|
|
|
409
405
|
// Create the new free segment and interpolate the points between where the last line
|
|
410
406
|
// ended and where the pointer is now
|
|
407
|
+
const interpolatedPoints = Vec.PointsBetween(prevPoint, newPoint, 6).map(
|
|
408
|
+
(p) => new Vec(toFixed(p.x), toFixed(p.y), toFixed(p.z))
|
|
409
|
+
)
|
|
410
|
+
// Initialize cache for the new free segment
|
|
411
|
+
this.currentSegmentPoints = interpolatedPoints
|
|
412
|
+
|
|
411
413
|
const newFreeSegment: TLDrawShapeSegment = {
|
|
412
414
|
type: 'free',
|
|
413
|
-
points:
|
|
414
|
-
...Vec.PointsBetween(prevPoint, newPoint, 6).map((p) => ({
|
|
415
|
-
x: toFixed(p.x),
|
|
416
|
-
y: toFixed(p.y),
|
|
417
|
-
z: toFixed(p.z),
|
|
418
|
-
})),
|
|
419
|
-
],
|
|
415
|
+
points: b64Vecs.encodePoints(interpolatedPoints),
|
|
420
416
|
}
|
|
421
417
|
|
|
422
418
|
const finalSegments = [...newSegments, newFreeSegment]
|
|
@@ -451,7 +447,9 @@ export class Drawing extends StateNode {
|
|
|
451
447
|
const newSegment = newSegments[newSegments.length - 1]
|
|
452
448
|
|
|
453
449
|
const { pagePointWhereCurrentSegmentChanged } = this
|
|
454
|
-
const
|
|
450
|
+
const inputs = this.editor.inputs
|
|
451
|
+
const ctrlKey = inputs.getCtrlKey()
|
|
452
|
+
const currentPagePoint = inputs.getCurrentPagePoint()
|
|
455
453
|
|
|
456
454
|
if (!pagePointWhereCurrentSegmentChanged)
|
|
457
455
|
throw Error('We should have a point where the segment changed')
|
|
@@ -460,7 +458,7 @@ export class Drawing extends StateNode {
|
|
|
460
458
|
let shouldSnapToAngle = false
|
|
461
459
|
|
|
462
460
|
if (this.didJustShiftClickToExtendPreviousShapeLine) {
|
|
463
|
-
if (this.editor.inputs.
|
|
461
|
+
if (this.editor.inputs.getIsDragging()) {
|
|
464
462
|
// If we've just shift clicked to extend a line, only snap once we've started dragging
|
|
465
463
|
shouldSnapToAngle = !ctrlKey
|
|
466
464
|
this.didJustShiftClickToExtendPreviousShapeLine = false
|
|
@@ -489,8 +487,8 @@ export class Drawing extends StateNode {
|
|
|
489
487
|
if (!segment) break
|
|
490
488
|
if (segment.type === 'free') continue
|
|
491
489
|
|
|
492
|
-
const first = segment.points
|
|
493
|
-
const lastPoint =
|
|
490
|
+
const first = b64Vecs.decodeFirstPoint(segment.points)
|
|
491
|
+
const lastPoint = b64Vecs.decodeLastPoint(segment.points)
|
|
494
492
|
if (!(first && lastPoint)) continue
|
|
495
493
|
|
|
496
494
|
// Snap to the nearest point on the segment, if it's closer than the previous snapped point
|
|
@@ -517,9 +515,9 @@ export class Drawing extends StateNode {
|
|
|
517
515
|
|
|
518
516
|
if (didSnap && snapSegment) {
|
|
519
517
|
const transform = this.editor.getShapePageTransform(shape)!
|
|
520
|
-
const first = snapSegment.points
|
|
521
|
-
const lastPoint =
|
|
522
|
-
if (!lastPoint) throw Error('Expected a last point!')
|
|
518
|
+
const first = b64Vecs.decodeFirstPoint(snapSegment.points)
|
|
519
|
+
const lastPoint = b64Vecs.decodeLastPoint(snapSegment.points)
|
|
520
|
+
if (!first || !lastPoint) throw Error('Expected a last point!')
|
|
523
521
|
|
|
524
522
|
const A = Mat.applyToPoint(transform, first)
|
|
525
523
|
|
|
@@ -549,7 +547,7 @@ export class Drawing extends StateNode {
|
|
|
549
547
|
angleDiff
|
|
550
548
|
)
|
|
551
549
|
} else {
|
|
552
|
-
pagePoint = currentPagePoint
|
|
550
|
+
pagePoint = currentPagePoint.clone()
|
|
553
551
|
}
|
|
554
552
|
|
|
555
553
|
newPoint = this.editor.getPointInShapeSpace(shape, pagePoint).toFixed().toJson()
|
|
@@ -559,12 +557,18 @@ export class Drawing extends StateNode {
|
|
|
559
557
|
// then the user just did a click-and-immediately-press-shift to create a new straight line
|
|
560
558
|
// without continuing the previous line. In this case, we want to remove the previous segment.
|
|
561
559
|
|
|
562
|
-
this.currentLineLength +=
|
|
560
|
+
this.currentLineLength +=
|
|
561
|
+
newSegments.length && b64Vecs.decodeFirstPoint(newSegment.points)
|
|
562
|
+
? Vec.Dist(b64Vecs.decodeFirstPoint(newSegment.points)!, Vec.From(newPoint))
|
|
563
|
+
: 0
|
|
563
564
|
|
|
564
565
|
newSegments[newSegments.length - 1] = {
|
|
565
566
|
...newSegment,
|
|
566
567
|
type: 'straight',
|
|
567
|
-
points:
|
|
568
|
+
points: b64Vecs.encodePoints([
|
|
569
|
+
b64Vecs.decodeFirstPoint(newSegment.points)!,
|
|
570
|
+
Vec.From(newPoint),
|
|
571
|
+
]),
|
|
568
572
|
}
|
|
569
573
|
|
|
570
574
|
const shapePartial: TLShapePartial<DrawableShape> = {
|
|
@@ -588,27 +592,28 @@ export class Drawing extends StateNode {
|
|
|
588
592
|
break
|
|
589
593
|
}
|
|
590
594
|
case 'free': {
|
|
591
|
-
|
|
592
|
-
const
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
y: newPoint.y,
|
|
600
|
-
z: z ? Math.max(z, newPoint.z) : newPoint.z,
|
|
601
|
-
}
|
|
595
|
+
// Use cached points instead of decoding from b64 on every update
|
|
596
|
+
const cachedPoints = this.currentSegmentPoints
|
|
597
|
+
|
|
598
|
+
if (cachedPoints.length && this.mergeNextPoint) {
|
|
599
|
+
const lastPoint = cachedPoints[cachedPoints.length - 1]
|
|
600
|
+
lastPoint.x = newPoint.x
|
|
601
|
+
lastPoint.y = newPoint.y
|
|
602
|
+
lastPoint.z = lastPoint.z ? Math.max(lastPoint.z, newPoint.z) : newPoint.z
|
|
602
603
|
// Note: we could recompute the line length here, but it's not really necessary
|
|
603
604
|
// this.currentLineLength = this.getLineLength(newSegments)
|
|
604
605
|
} else {
|
|
605
|
-
this.currentLineLength +=
|
|
606
|
-
|
|
606
|
+
this.currentLineLength += cachedPoints.length
|
|
607
|
+
? Vec.Dist(cachedPoints[cachedPoints.length - 1], newPoint)
|
|
608
|
+
: 0
|
|
609
|
+
cachedPoints.push(new Vec(newPoint.x, newPoint.y, newPoint.z))
|
|
607
610
|
}
|
|
608
611
|
|
|
612
|
+
const newSegments = segments.slice()
|
|
613
|
+
const newSegment = newSegments[newSegments.length - 1]
|
|
609
614
|
newSegments[newSegments.length - 1] = {
|
|
610
615
|
...newSegment,
|
|
611
|
-
points:
|
|
616
|
+
points: b64Vecs.encodePoints(cachedPoints),
|
|
612
617
|
}
|
|
613
618
|
|
|
614
619
|
if (this.currentLineLength < STROKE_SIZES[shape.props.size] * 4) {
|
|
@@ -634,7 +639,7 @@ export class Drawing extends StateNode {
|
|
|
634
639
|
this.editor.updateShapes([shapePartial])
|
|
635
640
|
|
|
636
641
|
// Set a maximum length for the lines array; after 200 points, complete the line.
|
|
637
|
-
if (
|
|
642
|
+
if (cachedPoints.length > this.util.options.maxPointsPerShape) {
|
|
638
643
|
this.editor.updateShapes([{ id, type: this.shapeType, props: { isComplete: true } }])
|
|
639
644
|
|
|
640
645
|
const newShapeId = createShapeId()
|
|
@@ -642,18 +647,24 @@ export class Drawing extends StateNode {
|
|
|
642
647
|
const props = this.editor.getShape<DrawableShape>(id)!.props
|
|
643
648
|
|
|
644
649
|
if (!this.editor.canCreateShapes([newShapeId])) return this.cancel()
|
|
645
|
-
|
|
650
|
+
const currentPagePoint = inputs.getCurrentPagePoint()
|
|
651
|
+
|
|
652
|
+
// Reset cache for the new shape's segment
|
|
653
|
+
const initialPoint = new Vec(0, 0, this.isPenOrStylus ? +(z! * 1.25).toFixed() : 0.5)
|
|
654
|
+
this.currentSegmentPoints = [initialPoint]
|
|
655
|
+
|
|
656
|
+
this.editor.createShape({
|
|
646
657
|
id: newShapeId,
|
|
647
658
|
type: this.shapeType,
|
|
648
|
-
x: toFixed(
|
|
649
|
-
y: toFixed(
|
|
659
|
+
x: toFixed(currentPagePoint.x),
|
|
660
|
+
y: toFixed(currentPagePoint.y),
|
|
650
661
|
props: {
|
|
651
662
|
isPen: this.isPenOrStylus,
|
|
652
663
|
scale: props.scale,
|
|
653
664
|
segments: [
|
|
654
665
|
{
|
|
655
666
|
type: 'free',
|
|
656
|
-
points:
|
|
667
|
+
points: b64Vecs.encodePoints([initialPoint]),
|
|
657
668
|
},
|
|
658
669
|
],
|
|
659
670
|
},
|
|
@@ -669,7 +680,7 @@ export class Drawing extends StateNode {
|
|
|
669
680
|
|
|
670
681
|
this.initialShape = structuredClone(shape)
|
|
671
682
|
this.mergeNextPoint = false
|
|
672
|
-
this.lastRecordedPoint =
|
|
683
|
+
this.lastRecordedPoint = currentPagePoint.clone()
|
|
673
684
|
this.currentLineLength = 0
|
|
674
685
|
}
|
|
675
686
|
|
|
@@ -681,11 +692,10 @@ export class Drawing extends StateNode {
|
|
|
681
692
|
private getLineLength(segments: TLDrawShapeSegment[]) {
|
|
682
693
|
let length = 0
|
|
683
694
|
|
|
684
|
-
for (
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
length += Vec.Dist2(B, A)
|
|
695
|
+
for (let j = 0; j < segments.length; j++) {
|
|
696
|
+
const points = b64Vecs.decodePoints(segments[j].points)
|
|
697
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
698
|
+
length += Vec.Dist2(points[i], points[i + 1])
|
|
689
699
|
}
|
|
690
700
|
}
|
|
691
701
|
|
|
@@ -705,7 +715,7 @@ export class Drawing extends StateNode {
|
|
|
705
715
|
}
|
|
706
716
|
|
|
707
717
|
override onInterrupt() {
|
|
708
|
-
if (this.editor.inputs.
|
|
718
|
+
if (this.editor.inputs.getIsDragging()) {
|
|
709
719
|
return
|
|
710
720
|
}
|
|
711
721
|
|
|
@@ -43,6 +43,12 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
|
|
|
43
43
|
static override migrations = embedShapeMigrations
|
|
44
44
|
private static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS
|
|
45
45
|
|
|
46
|
+
override canEditWhileLocked(shape: TLEmbedShape) {
|
|
47
|
+
const result = this.getEmbedDefinition(shape.props.url)
|
|
48
|
+
if (!result) return true
|
|
49
|
+
return result.definition.canEditWhileLocked ?? true
|
|
50
|
+
}
|
|
51
|
+
|
|
46
52
|
static setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {
|
|
47
53
|
EmbedShapeUtil.embedDefinitions = embedDefinitions
|
|
48
54
|
}
|
|
@@ -137,7 +143,7 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
|
|
|
137
143
|
|
|
138
144
|
if (editingShapeId && hoveredShapeId !== editingShapeId) {
|
|
139
145
|
const editingShape = this.editor.getShape(editingShapeId)
|
|
140
|
-
if (editingShape && this.editor.isShapeOfType
|
|
146
|
+
if (editingShape && this.editor.isShapeOfType(editingShape, 'embed')) {
|
|
141
147
|
return true
|
|
142
148
|
}
|
|
143
149
|
}
|
|
@@ -211,6 +217,7 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
|
|
|
211
217
|
frameBorder="0"
|
|
212
218
|
referrerPolicy="no-referrer-when-downgrade"
|
|
213
219
|
tabIndex={isEditing ? 0 : -1}
|
|
220
|
+
allowFullScreen
|
|
214
221
|
style={{
|
|
215
222
|
border: 0,
|
|
216
223
|
pointerEvents: isInteractive ? 'auto' : 'none',
|
|
@@ -4,7 +4,7 @@ import { BaseBoxShapeTool, TLShape, TLShapeId } from '@tldraw/editor'
|
|
|
4
4
|
export class FrameShapeTool extends BaseBoxShapeTool {
|
|
5
5
|
static override id = 'frame'
|
|
6
6
|
static override initial = 'idle'
|
|
7
|
-
override shapeType = 'frame'
|
|
7
|
+
override shapeType = 'frame' as const
|
|
8
8
|
|
|
9
9
|
override onCreate(shape: TLShape | null): void {
|
|
10
10
|
if (!shape) return
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
TLClickEventInfo,
|
|
10
10
|
TLDragShapesOutInfo,
|
|
11
11
|
TLDragShapesOverInfo,
|
|
12
|
+
TLEditStartInfo,
|
|
12
13
|
TLFrameShape,
|
|
13
14
|
TLFrameShapeProps,
|
|
14
15
|
TLResizeInfo,
|
|
@@ -53,6 +54,10 @@ export interface FrameShapeOptions {
|
|
|
53
54
|
* When true, the frame will display colors for the shape's headings and background.
|
|
54
55
|
*/
|
|
55
56
|
showColors: boolean
|
|
57
|
+
/**
|
|
58
|
+
* When true, the frame will resize its children when the frame itself is resized.
|
|
59
|
+
*/
|
|
60
|
+
resizeChildren: boolean
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
export function defaultEmptyAs(str: string, dflt: string) {
|
|
@@ -70,6 +75,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
70
75
|
|
|
71
76
|
override options: FrameShapeOptions = {
|
|
72
77
|
showColors: false,
|
|
78
|
+
resizeChildren: false,
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
// evil crimes :)
|
|
@@ -88,8 +94,8 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
88
94
|
return withOptions
|
|
89
95
|
}
|
|
90
96
|
|
|
91
|
-
override canEdit() {
|
|
92
|
-
return
|
|
97
|
+
override canEdit(shape: TLFrameShape, info: TLEditStartInfo) {
|
|
98
|
+
return info.type === 'click-header' || info.type === 'unknown'
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
override canResize() {
|
|
@@ -97,7 +103,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
97
103
|
}
|
|
98
104
|
|
|
99
105
|
override canResizeChildren() {
|
|
100
|
-
return
|
|
106
|
+
return this.options.resizeChildren
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
override isExportBoundsContainer(): boolean {
|
|
@@ -115,7 +121,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
115
121
|
override getGeometry(shape: TLFrameShape): Geometry2d {
|
|
116
122
|
const { editor } = this
|
|
117
123
|
|
|
118
|
-
const z = editor.
|
|
124
|
+
const z = editor.getEfficientZoomLevel()
|
|
119
125
|
|
|
120
126
|
// Which dimension measures the top edge after rotation?
|
|
121
127
|
const labelSide = getFrameHeadingSide(editor, shape)
|
|
@@ -27,8 +27,16 @@ describe('Handle snapping', () => {
|
|
|
27
27
|
)
|
|
28
28
|
})
|
|
29
29
|
|
|
30
|
-
const geoShape = () =>
|
|
31
|
-
|
|
30
|
+
const geoShape = () => {
|
|
31
|
+
const shape = editor.getShape(ids.geo)!
|
|
32
|
+
assert(editor.isShapeOfType(shape, 'geo'))
|
|
33
|
+
return shape
|
|
34
|
+
}
|
|
35
|
+
const lineShape = () => {
|
|
36
|
+
const shape = editor.getShape(ids.line)!
|
|
37
|
+
assert(editor.isShapeOfType(shape, 'line'))
|
|
38
|
+
return shape
|
|
39
|
+
}
|
|
32
40
|
const lineHandles = () => editor.getShapeUtil('line').getHandles!(lineShape())!
|
|
33
41
|
|
|
34
42
|
function startDraggingHandle() {
|