tldraw 4.3.0-canary.fd6b7f2a8adc → 4.3.0-next.085293d79c32
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 +297 -237
- package/dist-cjs/index.js +13 -5
- package/dist-cjs/index.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/getElbowArrowInfo.js +1 -1
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.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/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/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/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/interpolate-props.js +3 -3
- package/dist-cjs/lib/shapes/shared/interpolate-props.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 +9 -7
- 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 +7 -5
- 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/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/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 +6 -6
- 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/useClipboardEvents.js +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.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 +8 -6
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.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 +15 -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 +297 -237
- package/dist-esm/index.mjs +14 -5
- package/dist-esm/index.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/getElbowArrowInfo.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.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/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/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/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/interpolate-props.mjs +4 -4
- package/dist-esm/lib/shapes/shared/interpolate-props.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 +2 -4
- 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 +9 -7
- 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 +7 -5
- 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 +5 -15
- 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/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/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 +3 -1
- 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 +6 -6
- 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/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.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 +9 -6
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.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 +12 -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/canvas/TldrawSelectionForeground.tsx +2 -2
- package/src/lib/defaultEmbedDefinitions.ts +2 -1
- package/src/lib/defaultExternalContentHandlers.ts +10 -10
- 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.tsx +15 -15
- package/src/lib/shapes/arrow/arrow-types.ts +2 -0
- package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
- package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
- 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/toolStates/Idle.tsx +4 -14
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
- package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +33 -27
- package/src/lib/shapes/draw/getPath.ts +31 -10
- package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
- 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 +3 -3
- package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +27 -24
- package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
- package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
- package/src/lib/shapes/note/noteCloning.test.ts +3 -1
- 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 +10 -1
- package/src/lib/shapes/shared/RichTextLabel.tsx +12 -3
- package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
- package/src/lib/shapes/shared/interpolate-props.ts +4 -4
- 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/TextShapeUtil.tsx +5 -0
- package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
- package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
- package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
- 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 +12 -7
- package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
- 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 +7 -5
- package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
- package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
- 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 +2 -2
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
- package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
- 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/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/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 +3 -1
- 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 +6 -6
- package/src/lib/ui/context/components.tsx +1 -2
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
- package/src/lib/ui/hooks/useTools.tsx +4 -5
- 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 +11 -6
- package/src/lib/utils/test-helpers.ts +62 -0
- package/src/lib/utils/text/richText.ts +13 -8
- package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
- package/src/test/Editor.test.tsx +40 -29
- package/src/test/EraserTool.test.ts +10 -12
- package/src/test/TestEditor.ts +48 -47
- package/src/test/TldrawEditor.test.tsx +6 -4
- 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/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
- package/src/test/commands/cameraState.test.ts +299 -0
- package/src/test/commands/putContent.test.ts +79 -1
- package/src/test/commands/setCamera.test.ts +13 -11
- package/src/test/commands/stackShapes.test.ts +34 -8
- 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 +16 -9
- package/src/test/drawing.test.ts +17 -10
- package/src/test/flipShapes.test.ts +33 -0
- package/src/test/frames.test.ts +92 -0
- package/src/test/groups.test.tsx +1 -1
- package/src/test/modifiers.test.ts +6 -6
- package/src/test/resizing.test.ts +7 -9
- package/src/test/selection-omnibus.test.ts +2 -2
- package/src/test/spacebarPanning.test.ts +28 -10
- package/src/test/test-jsx.tsx +3 -0
- 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
|
@@ -31,6 +31,9 @@ export type CircleClipShape = TLShape<typeof CIRCLE_CLIP_TYPE>
|
|
|
31
31
|
|
|
32
32
|
export const isClippingEnabled$ = atom('isClippingEnabled', true)
|
|
33
33
|
|
|
34
|
+
// The stroke width used when rendering the circle
|
|
35
|
+
const STROKE_WIDTH = 2
|
|
36
|
+
|
|
34
37
|
export class CircleClipShapeUtil extends BaseBoxShapeUtil<CircleClipShape> {
|
|
35
38
|
static override type = CIRCLE_CLIP_TYPE
|
|
36
39
|
static override props: RecordProps<CircleClipShape> = {
|
|
@@ -64,17 +67,20 @@ export class CircleClipShapeUtil extends BaseBoxShapeUtil<CircleClipShape> {
|
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
override getClipPath(shape: CircleClipShape): Vec[] | undefined {
|
|
67
|
-
// Generate a polygon approximation of the circle
|
|
70
|
+
// Generate a polygon approximation of the circle.
|
|
71
|
+
// We inset the clip path by half the stroke width so that children are
|
|
72
|
+
// clipped to the inner edge of the stroke, not the center line.
|
|
68
73
|
const centerX = shape.props.w / 2
|
|
69
74
|
const centerY = shape.props.h / 2
|
|
70
|
-
const
|
|
75
|
+
const outerRadius = Math.min(shape.props.w, shape.props.h) / 2
|
|
76
|
+
const clipRadius = outerRadius - STROKE_WIDTH / 2
|
|
71
77
|
const segments = 48 // More segments = smoother circle
|
|
72
78
|
|
|
73
79
|
const points: Vec[] = []
|
|
74
80
|
for (let i = 0; i < segments; i++) {
|
|
75
81
|
const angle = (i / segments) * Math.PI * 2
|
|
76
|
-
const x = centerX + Math.cos(angle) *
|
|
77
|
-
const y = centerY + Math.sin(angle) *
|
|
82
|
+
const x = centerX + Math.cos(angle) * clipRadius
|
|
83
|
+
const y = centerY + Math.sin(angle) * clipRadius
|
|
78
84
|
points.push(new Vec(x, y))
|
|
79
85
|
}
|
|
80
86
|
|
|
@@ -112,7 +118,7 @@ export class CircleClipShapeTool extends StateNode {
|
|
|
112
118
|
|
|
113
119
|
override onPointerDown(info: Parameters<TLEventHandlers['onPointerDown']>[0]) {
|
|
114
120
|
if (info.target === 'canvas') {
|
|
115
|
-
const
|
|
121
|
+
const originPagePoint = this.editor.inputs.getOriginPagePoint()
|
|
116
122
|
|
|
117
123
|
this.editor.createShape({
|
|
118
124
|
type: CIRCLE_CLIP_TYPE,
|
|
@@ -233,13 +239,14 @@ describe('CircleClipShapeUtil', () => {
|
|
|
233
239
|
|
|
234
240
|
// Should be a polygon approximation of a circle
|
|
235
241
|
// Check that points are roughly in a circle pattern
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
const
|
|
242
|
+
// The clip path is inset by half the stroke width (STROKE_WIDTH / 2 = 1)
|
|
243
|
+
const centerX = 100 // shape.props.w / 2
|
|
244
|
+
const centerY = 100 // shape.props.h / 2
|
|
245
|
+
const clipRadius = 99 // min(w, h) / 2 - STROKE_WIDTH / 2 = 100 - 1
|
|
239
246
|
|
|
240
247
|
clipPath.forEach((point) => {
|
|
241
248
|
const distance = Math.sqrt(Math.pow(point.x - centerX, 2) + Math.pow(point.y - centerY, 2))
|
|
242
|
-
expect(distance).toBeCloseTo(
|
|
249
|
+
expect(distance).toBeCloseTo(clipRadius, 0)
|
|
243
250
|
})
|
|
244
251
|
})
|
|
245
252
|
})
|
package/src/test/drawing.test.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { TLDrawShape, TLHighlightShape, last } from '@tldraw/editor'
|
|
2
2
|
import { vi } from 'vitest'
|
|
3
|
-
import { TestEditor } from './TestEditor'
|
|
4
3
|
import { TEST_DRAW_SHAPE_SCREEN_POINTS } from './drawing.data'
|
|
4
|
+
import { base64ToPoints } from './test-jsx'
|
|
5
|
+
import { TestEditor } from './TestEditor'
|
|
5
6
|
|
|
6
7
|
vi.useFakeTimers()
|
|
7
8
|
|
|
@@ -77,7 +78,7 @@ for (const toolType of ['draw', 'highlight'] as const) {
|
|
|
77
78
|
const segment = shape.props.segments[0]
|
|
78
79
|
expect(segment.type).toBe('straight')
|
|
79
80
|
|
|
80
|
-
const points = segment.
|
|
81
|
+
const points = base64ToPoints(segment.path)
|
|
81
82
|
expect(points.length).toBe(2)
|
|
82
83
|
})
|
|
83
84
|
|
|
@@ -176,8 +177,9 @@ for (const toolType of ['draw', 'highlight'] as const) {
|
|
|
176
177
|
|
|
177
178
|
const shape = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
178
179
|
const segment = shape.props.segments[0]
|
|
179
|
-
|
|
180
|
-
expect(
|
|
180
|
+
const points = base64ToPoints(segment.path)
|
|
181
|
+
expect(points[1].x).toBeCloseTo(snappedX)
|
|
182
|
+
expect(points[1].y).toBeCloseTo(snappedY)
|
|
181
183
|
})
|
|
182
184
|
|
|
183
185
|
it('Doesnt snap to 15 degree angle when cmd is held', () => {
|
|
@@ -190,8 +192,9 @@ for (const toolType of ['draw', 'highlight'] as const) {
|
|
|
190
192
|
|
|
191
193
|
const shape = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
192
194
|
const segment = shape.props.segments[0]
|
|
193
|
-
|
|
194
|
-
expect(
|
|
195
|
+
const points = base64ToPoints(segment.path)
|
|
196
|
+
expect(points[1].x).toBeCloseTo(x)
|
|
197
|
+
expect(points[1].y).toBeCloseTo(y)
|
|
195
198
|
})
|
|
196
199
|
|
|
197
200
|
it('Snaps to start or end of straight segments in self when shift + cmd is held', () => {
|
|
@@ -209,13 +212,15 @@ for (const toolType of ['draw', 'highlight'] as const) {
|
|
|
209
212
|
|
|
210
213
|
const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
211
214
|
const segment1 = last(shape1.props.segments)!
|
|
212
|
-
const
|
|
215
|
+
const points1 = base64ToPoints(segment1.path)
|
|
216
|
+
const point1 = last(points1)!
|
|
213
217
|
expect(point1.x).toBe(1)
|
|
214
218
|
|
|
215
219
|
editor.keyDown('Meta')
|
|
216
220
|
const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
217
221
|
const segment2 = last(shape2.props.segments)!
|
|
218
|
-
const
|
|
222
|
+
const points2 = base64ToPoints(segment2.path)
|
|
223
|
+
const point2 = last(points2)!
|
|
219
224
|
expect(point2.x).toBe(0)
|
|
220
225
|
})
|
|
221
226
|
|
|
@@ -234,13 +239,15 @@ for (const toolType of ['draw', 'highlight'] as const) {
|
|
|
234
239
|
|
|
235
240
|
const shape1 = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
236
241
|
const segment1 = last(shape1.props.segments)!
|
|
237
|
-
const
|
|
242
|
+
const points1 = base64ToPoints(segment1.path)
|
|
243
|
+
const point1 = last(points1)!
|
|
238
244
|
expect(point1.x).toBe(1)
|
|
239
245
|
|
|
240
246
|
editor.keyDown('Meta')
|
|
241
247
|
const shape2 = editor.getCurrentPageShapes()[0] as DrawableShape
|
|
242
248
|
const segment2 = last(shape2.props.segments)!
|
|
243
|
-
const
|
|
249
|
+
const points2 = base64ToPoints(segment2.path)
|
|
250
|
+
const point2 = last(points2)!
|
|
244
251
|
expect(point2.x).toBe(0)
|
|
245
252
|
})
|
|
246
253
|
|
|
@@ -637,3 +637,36 @@ it('Updates the image shape flip properties when flipped', () => {
|
|
|
637
637
|
editor.flipShapes(editor.getSelectedShapeIds(), 'vertical')
|
|
638
638
|
expect(editor.getLastCreatedShape<TLImageShape>().props.flipY).toBe(true)
|
|
639
639
|
})
|
|
640
|
+
|
|
641
|
+
it('Restores flipped shape positions when shape is rotated', () => {
|
|
642
|
+
editor.selectAll().rotateSelection(PI / 2.5)
|
|
643
|
+
const before = editor.getSelectedShapes()
|
|
644
|
+
editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
|
|
645
|
+
editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
|
|
646
|
+
const after = editor.getSelectedShapes()
|
|
647
|
+
expect(after.length).toBe(before.length)
|
|
648
|
+
for (let i = 0; i < before.length; i++) {
|
|
649
|
+
expect(after[i]).toCloselyMatchObject(before[i])
|
|
650
|
+
}
|
|
651
|
+
})
|
|
652
|
+
|
|
653
|
+
it('Restores flipped shape positions with draw shapes when shape is rotated', () => {
|
|
654
|
+
editor
|
|
655
|
+
.cancel()
|
|
656
|
+
.setCurrentTool('draw')
|
|
657
|
+
.pointerDown(0, 0)
|
|
658
|
+
.pointerMove(-100, -100)
|
|
659
|
+
.pointerMove(0, -100)
|
|
660
|
+
.pointerMove(100, 100)
|
|
661
|
+
.pointerUp()
|
|
662
|
+
|
|
663
|
+
editor.selectAll().rotateSelection(PI / 2.5)
|
|
664
|
+
const before = editor.getSelectedShapes()
|
|
665
|
+
editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
|
|
666
|
+
editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
|
|
667
|
+
const after = editor.getSelectedShapes()
|
|
668
|
+
expect(after.length).toBe(before.length)
|
|
669
|
+
for (let i = 0; i < before.length; i++) {
|
|
670
|
+
expect(after[i]).toCloselyMatchObject(before[i])
|
|
671
|
+
}
|
|
672
|
+
})
|
package/src/test/frames.test.ts
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from '@tldraw/editor'
|
|
11
11
|
import { vi } from 'vitest'
|
|
12
12
|
import { getArrowBindings } from '../lib/shapes/arrow/shared'
|
|
13
|
+
import { FrameShapeUtil } from '../lib/shapes/frame/FrameShapeUtil'
|
|
13
14
|
import { DEFAULT_FRAME_PADDING, fitFrameToContent, removeFrame } from '../lib/utils/frames/frames'
|
|
14
15
|
import { TestEditor } from './TestEditor'
|
|
15
16
|
|
|
@@ -639,9 +640,13 @@ describe('frame shapes', () => {
|
|
|
639
640
|
|
|
640
641
|
editor.setCurrentTool('select')
|
|
641
642
|
|
|
643
|
+
// Not with enter key
|
|
642
644
|
editor.keyDown('Enter')
|
|
643
645
|
editor.keyUp('Enter')
|
|
646
|
+
expect(editor.getCurrentPageState().editingShapeId).toBe(null)
|
|
644
647
|
|
|
648
|
+
// Just with header click (tests against header's geometry)
|
|
649
|
+
editor.click(105, 95)
|
|
645
650
|
expect(editor.getCurrentPageState().editingShapeId).toBe(frameId)
|
|
646
651
|
})
|
|
647
652
|
|
|
@@ -850,6 +855,93 @@ describe('frame shapes', () => {
|
|
|
850
855
|
expect(editor.getSortedChildIdsForParent(insideFrameId)).toStrictEqual([rectAId, rectBId])
|
|
851
856
|
expect(editor.getSortedChildIdsForParent(outsideFrameId)).toStrictEqual([insideFrameId])
|
|
852
857
|
})
|
|
858
|
+
|
|
859
|
+
describe('resizeChildren configuration option', () => {
|
|
860
|
+
it('has default canResizeChildren behavior as false', () => {
|
|
861
|
+
const frameUtil = editor.getShapeUtil<TLFrameShape>('frame') as FrameShapeUtil
|
|
862
|
+
expect(frameUtil.options.resizeChildren).toBe(false)
|
|
863
|
+
expect(frameUtil.canResizeChildren()).toBe(false)
|
|
864
|
+
})
|
|
865
|
+
|
|
866
|
+
it('can be configured to allow resizing children', () => {
|
|
867
|
+
const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: true })
|
|
868
|
+
const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
|
|
869
|
+
expect(configuredFrameUtil.options.resizeChildren).toBe(true)
|
|
870
|
+
expect(configuredFrameUtil.canResizeChildren()).toBe(true)
|
|
871
|
+
})
|
|
872
|
+
|
|
873
|
+
it('can be configured to disallow resizing children', () => {
|
|
874
|
+
const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: false })
|
|
875
|
+
const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
|
|
876
|
+
expect(configuredFrameUtil.options.resizeChildren).toBe(false)
|
|
877
|
+
expect(configuredFrameUtil.canResizeChildren()).toBe(false)
|
|
878
|
+
})
|
|
879
|
+
|
|
880
|
+
it('maintains other options when configuring resizeChildren', () => {
|
|
881
|
+
const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({
|
|
882
|
+
resizeChildren: true,
|
|
883
|
+
showColors: true,
|
|
884
|
+
})
|
|
885
|
+
const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
|
|
886
|
+
expect(configuredFrameUtil.options.resizeChildren).toBe(true)
|
|
887
|
+
expect(configuredFrameUtil.options.showColors).toBe(true)
|
|
888
|
+
})
|
|
889
|
+
|
|
890
|
+
it('resizes children when configured with resizeChildren: true', () => {
|
|
891
|
+
// Create a frame with a child shape using a configured frame util
|
|
892
|
+
editor.setCurrentTool('frame')
|
|
893
|
+
editor.pointerDown(100, 100).pointerMove(200, 200).pointerUp(200, 200)
|
|
894
|
+
|
|
895
|
+
const frameId = editor.getOnlySelectedShape()!.id
|
|
896
|
+
|
|
897
|
+
// Add a child shape
|
|
898
|
+
editor.setCurrentTool('geo')
|
|
899
|
+
editor.pointerDown(125, 125).pointerMove(175, 175).pointerUp(175, 175)
|
|
900
|
+
|
|
901
|
+
const childId = editor.getOnlySelectedShape()!.id
|
|
902
|
+
|
|
903
|
+
// Get initial bounds
|
|
904
|
+
const initialChildBounds = editor.getShapePageBounds(childId)!
|
|
905
|
+
|
|
906
|
+
// Create a new editor with configured frame util that allows resizing children
|
|
907
|
+
const configuredEditor = new TestEditor({
|
|
908
|
+
shapeUtils: [FrameShapeUtil.configure({ resizeChildren: true })],
|
|
909
|
+
})
|
|
910
|
+
|
|
911
|
+
// Create the same frame and child in the new editor
|
|
912
|
+
configuredEditor.createShapes([
|
|
913
|
+
{ id: frameId, type: 'frame', x: 100, y: 100, props: { w: 100, h: 100 } },
|
|
914
|
+
{
|
|
915
|
+
id: childId,
|
|
916
|
+
type: 'geo',
|
|
917
|
+
parentId: frameId,
|
|
918
|
+
x: 125,
|
|
919
|
+
y: 125,
|
|
920
|
+
props: { w: 50, h: 50 },
|
|
921
|
+
},
|
|
922
|
+
])
|
|
923
|
+
|
|
924
|
+
// Resize the frame to half size
|
|
925
|
+
configuredEditor.select(frameId)
|
|
926
|
+
configuredEditor.resizeSelection({ scaleX: 0.5, scaleY: 0.5 }, 'bottom_right')
|
|
927
|
+
|
|
928
|
+
// Verify the frame was resized
|
|
929
|
+
const resizedFrameBounds = configuredEditor.getShapePageBounds(frameId)!
|
|
930
|
+
expect(resizedFrameBounds).toCloselyMatchObject({
|
|
931
|
+
x: 100,
|
|
932
|
+
y: 100,
|
|
933
|
+
w: 50,
|
|
934
|
+
h: 50,
|
|
935
|
+
})
|
|
936
|
+
|
|
937
|
+
// Verify the child was also resized
|
|
938
|
+
const resizedChildBounds = configuredEditor.getShapePageBounds(childId)!
|
|
939
|
+
expect(resizedChildBounds.w).toBeCloseTo(initialChildBounds.w * 0.5)
|
|
940
|
+
expect(resizedChildBounds.h).toBeCloseTo(initialChildBounds.h * 0.5)
|
|
941
|
+
|
|
942
|
+
configuredEditor.dispose()
|
|
943
|
+
})
|
|
944
|
+
})
|
|
853
945
|
})
|
|
854
946
|
|
|
855
947
|
test('arrows bound to a shape within a group within a frame are reparented if the group is moved outside of the frame', () => {
|
package/src/test/groups.test.tsx
CHANGED
|
@@ -13,25 +13,25 @@ it('Shift Key', () => {
|
|
|
13
13
|
editor.pointerDown(0, 0)
|
|
14
14
|
editor.pointerMove(100, 100, { shiftKey: true })
|
|
15
15
|
editor.pointerMove(100, 100, { shiftKey: false })
|
|
16
|
-
expect(editor.inputs.
|
|
16
|
+
expect(editor.inputs.getShiftKey()).toBe(true)
|
|
17
17
|
vi.advanceTimersByTime(200)
|
|
18
|
-
expect(editor.inputs.
|
|
18
|
+
expect(editor.inputs.getShiftKey()).toBe(false)
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
it('Alt Key', () => {
|
|
22
22
|
editor.pointerDown(0, 0)
|
|
23
23
|
editor.pointerMove(100, 100, { altKey: true })
|
|
24
24
|
editor.pointerMove(100, 100, { altKey: false })
|
|
25
|
-
expect(editor.inputs.
|
|
25
|
+
expect(editor.inputs.getAltKey()).toBe(true)
|
|
26
26
|
vi.advanceTimersByTime(200)
|
|
27
|
-
expect(editor.inputs.
|
|
27
|
+
expect(editor.inputs.getAltKey()).toBe(false)
|
|
28
28
|
})
|
|
29
29
|
|
|
30
30
|
it('Ctrl Key', () => {
|
|
31
31
|
editor.pointerDown(0, 0)
|
|
32
32
|
editor.pointerMove(100, 100, { ctrlKey: true })
|
|
33
33
|
editor.pointerMove(100, 100, { ctrlKey: false })
|
|
34
|
-
expect(editor.inputs.
|
|
34
|
+
expect(editor.inputs.getCtrlKey()).toBe(true)
|
|
35
35
|
vi.advanceTimersByTime(200)
|
|
36
|
-
expect(editor.inputs.
|
|
36
|
+
expect(editor.inputs.getCtrlKey()).toBe(false)
|
|
37
37
|
})
|
|
@@ -20,6 +20,7 @@ import { NoteShapeUtil } from '../lib/shapes/note/NoteShapeUtil'
|
|
|
20
20
|
import { TestEditor } from './TestEditor'
|
|
21
21
|
import { getSnapLines } from './getSnapLines'
|
|
22
22
|
import { roundedBox } from './roundedBox'
|
|
23
|
+
import { createDrawSegments } from './test-jsx'
|
|
23
24
|
|
|
24
25
|
vi.useFakeTimers()
|
|
25
26
|
|
|
@@ -904,15 +905,12 @@ describe('When resizing a shape with children', () => {
|
|
|
904
905
|
x: 100,
|
|
905
906
|
y: 100,
|
|
906
907
|
props: {
|
|
907
|
-
segments: [
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
],
|
|
914
|
-
},
|
|
915
|
-
],
|
|
908
|
+
segments: createDrawSegments([
|
|
909
|
+
[
|
|
910
|
+
{ x: 0, y: 0, z: 0.5 },
|
|
911
|
+
{ x: 100, y: 100, z: 0.5 },
|
|
912
|
+
],
|
|
913
|
+
]),
|
|
916
914
|
},
|
|
917
915
|
},
|
|
918
916
|
])
|
|
@@ -2194,7 +2194,7 @@ describe('long press', () => {
|
|
|
2194
2194
|
it('works correctly with screenbounds offset', () => {
|
|
2195
2195
|
editor.updateViewportScreenBounds(new Box(100, 100, 800, 600))
|
|
2196
2196
|
editor.pointerDown(201, 202)
|
|
2197
|
-
expect(editor.inputs.
|
|
2197
|
+
expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
|
|
2198
2198
|
})
|
|
2199
2199
|
|
|
2200
2200
|
it('works correctly with screenbounds offset', () => {
|
|
@@ -2202,7 +2202,7 @@ describe('long press', () => {
|
|
|
2202
2202
|
editor.pointerDown(201, 202)
|
|
2203
2203
|
vi.advanceTimersByTime(1000)
|
|
2204
2204
|
// without the fix added in this PR, it would have been 1, 2
|
|
2205
|
-
expect(editor.inputs.
|
|
2205
|
+
expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
|
|
2206
2206
|
})
|
|
2207
2207
|
})
|
|
2208
2208
|
|
|
@@ -16,16 +16,16 @@ beforeEach(() => {
|
|
|
16
16
|
|
|
17
17
|
it('Sets cursor and state correctly', () => {
|
|
18
18
|
expect(editor.getInstanceState().cursor.type).toBe('default')
|
|
19
|
-
expect(editor.inputs.
|
|
19
|
+
expect(editor.inputs.getIsPanning()).toBe(false)
|
|
20
20
|
editor.keyDown(' ')
|
|
21
|
-
expect(editor.inputs.
|
|
21
|
+
expect(editor.inputs.getIsPanning()).toBe(true)
|
|
22
22
|
expect(editor.getInstanceState().cursor.type).toBe('grab')
|
|
23
23
|
editor.pointerDown(0, 0)
|
|
24
24
|
expect(editor.getInstanceState().cursor.type).toBe('grabbing')
|
|
25
25
|
editor.pointerUp(0, 0)
|
|
26
26
|
expect(editor.getInstanceState().cursor.type).toBe('grab')
|
|
27
27
|
editor.keyUp(' ')
|
|
28
|
-
expect(editor.inputs.
|
|
28
|
+
expect(editor.inputs.getIsPanning()).toBe(false)
|
|
29
29
|
expect(editor.getInstanceState().cursor.type).toBe('default')
|
|
30
30
|
})
|
|
31
31
|
|
|
@@ -37,16 +37,34 @@ it('When holding spacebar and clicking and dragging, it pans the camera', () =>
|
|
|
37
37
|
editor.keyUp(' ')
|
|
38
38
|
})
|
|
39
39
|
|
|
40
|
-
it('When
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
editor.
|
|
40
|
+
it('When spacebar is held during pointer interaction, it activates panning', () => {
|
|
41
|
+
// This test verifies that holding spacebar prevents pointer events from
|
|
42
|
+
// being sent to the state chart, and instead activates panning mode.
|
|
43
|
+
editor.select(ids.box1)
|
|
44
|
+
|
|
45
|
+
// Start with pointer down on the shape
|
|
46
|
+
editor.pointerDown(150, 150, ids.box1)
|
|
44
47
|
|
|
48
|
+
// Hold spacebar before moving - should activate panning
|
|
45
49
|
editor.keyDown(' ')
|
|
46
|
-
editor.
|
|
47
|
-
editor.
|
|
48
|
-
|
|
50
|
+
expect(editor.inputs.getIsPanning()).toBe(true)
|
|
51
|
+
expect(editor.getInstanceState().cursor.type).toBe('grabbing') // 'grabbing' because pointer is down
|
|
52
|
+
|
|
53
|
+
// Moving the pointer should pan the camera, not translate the shape
|
|
54
|
+
const initialCamera = editor.getCamera()
|
|
55
|
+
editor.pointerMove(100, 100)
|
|
56
|
+
|
|
57
|
+
// Camera should have moved (panning)
|
|
58
|
+
const newCamera = editor.getCamera()
|
|
59
|
+
expect(newCamera.x).not.toBe(initialCamera.x)
|
|
60
|
+
expect(newCamera.y).not.toBe(initialCamera.y)
|
|
61
|
+
|
|
62
|
+
// Shape should not have moved (not translating)
|
|
63
|
+
editor.expectShapeToMatch({ id: ids.box1, x: 100, y: 100 })
|
|
64
|
+
|
|
65
|
+
editor.pointerUp()
|
|
49
66
|
editor.keyUp(' ')
|
|
67
|
+
expect(editor.inputs.getIsPanning()).toBe(false)
|
|
50
68
|
})
|
|
51
69
|
|
|
52
70
|
it('When holding spacebar, pressing the arrow keys moves over by one viewport', () => {
|
package/src/test/test-jsx.tsx
CHANGED
|
@@ -19,6 +19,9 @@ import {
|
|
|
19
19
|
} from '@tldraw/editor'
|
|
20
20
|
import React, { Fragment } from 'react'
|
|
21
21
|
|
|
22
|
+
// Re-export test helpers from their new location
|
|
23
|
+
export { base64ToPoints, createDrawSegments, pointsToBase64 } from '../lib/utils/test-helpers'
|
|
24
|
+
|
|
22
25
|
const shapeTypeSymbol = Symbol('shapeJsx')
|
|
23
26
|
const assetTypeSymbol = Symbol('assetJsx')
|
|
24
27
|
const bindingTypeSymbol = Symbol('bindingJsx')
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { act, screen, waitFor } from '@testing-library/react'
|
|
2
|
+
import { Box, Editor, Vec } from '@tldraw/editor'
|
|
3
|
+
import { Tldraw } from '../../lib/Tldraw'
|
|
4
|
+
import { renderTldrawComponentWithEditor } from '../testutils/renderTldrawComponent'
|
|
5
|
+
|
|
6
|
+
let editor: Editor
|
|
7
|
+
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
const result = await renderTldrawComponentWithEditor((onMount) => <Tldraw onMount={onMount} />, {
|
|
10
|
+
waitForPatterns: false,
|
|
11
|
+
})
|
|
12
|
+
editor = result.editor
|
|
13
|
+
|
|
14
|
+
// Set up a proper viewport so shapes can be on/off screen
|
|
15
|
+
act(() => {
|
|
16
|
+
editor.updateViewportScreenBounds(new Box(0, 0, 1000, 800))
|
|
17
|
+
})
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
function createShapeInViewport() {
|
|
21
|
+
act(() => {
|
|
22
|
+
editor.createShape({
|
|
23
|
+
type: 'geo',
|
|
24
|
+
x: 100,
|
|
25
|
+
y: 100,
|
|
26
|
+
props: { w: 100, h: 100 },
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function panAllShapesOffScreen() {
|
|
32
|
+
// Move camera so all shapes are off-screen
|
|
33
|
+
act(() => {
|
|
34
|
+
const camera = editor.getCamera()
|
|
35
|
+
editor.setCamera(new Vec(camera.x - 2000, camera.y - 2000, camera.z), { immediate: true })
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe('BackToContent button', () => {
|
|
40
|
+
it('shows when all shapes are off-screen', async () => {
|
|
41
|
+
createShapeInViewport()
|
|
42
|
+
|
|
43
|
+
// Initially, button should not be visible (shapes are on screen)
|
|
44
|
+
await waitFor(() => {
|
|
45
|
+
expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
panAllShapesOffScreen()
|
|
49
|
+
|
|
50
|
+
// Now the button should appear
|
|
51
|
+
await waitFor(() => {
|
|
52
|
+
expect(screen.queryByTestId('helper-buttons.back-to-content')).not.toBeNull()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('shows when selected shapes are off-screen', async () => {
|
|
57
|
+
createShapeInViewport()
|
|
58
|
+
|
|
59
|
+
await waitFor(() => {
|
|
60
|
+
expect(editor.getCurrentPageShapeIds().size).toBe(1)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const shapeId = editor.getCurrentPageShapeIds().values().next().value!
|
|
64
|
+
|
|
65
|
+
// Select the shape
|
|
66
|
+
act(() => {
|
|
67
|
+
editor.select(shapeId)
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Initially, button should not be visible
|
|
71
|
+
await waitFor(() => {
|
|
72
|
+
expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
panAllShapesOffScreen()
|
|
76
|
+
|
|
77
|
+
// Button should still appear even though selected shapes aren't culled
|
|
78
|
+
await waitFor(() => {
|
|
79
|
+
expect(screen.queryByTestId('helper-buttons.back-to-content')).not.toBeNull()
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('does not show when some shapes are still on-screen', async () => {
|
|
84
|
+
// Create two shapes
|
|
85
|
+
act(() => {
|
|
86
|
+
editor.createShape({
|
|
87
|
+
type: 'geo',
|
|
88
|
+
x: 100,
|
|
89
|
+
y: 100,
|
|
90
|
+
props: { w: 100, h: 100 },
|
|
91
|
+
})
|
|
92
|
+
editor.createShape({
|
|
93
|
+
type: 'geo',
|
|
94
|
+
x: 500,
|
|
95
|
+
y: 500,
|
|
96
|
+
props: { w: 100, h: 100 },
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
// Pan so only the first shape is off-screen
|
|
101
|
+
act(() => {
|
|
102
|
+
const camera = editor.getCamera()
|
|
103
|
+
editor.setCamera(new Vec(camera.x - 300, camera.y - 300, camera.z), { immediate: true })
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
// Button should not appear since one shape is still visible
|
|
107
|
+
await waitFor(() => {
|
|
108
|
+
expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
})
|