tldraw 3.15.0 → 3.16.0-canary.03deb7f8fe34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.d.ts +271 -9
- package/dist-cjs/index.js +28 -2
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
- package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +1 -0
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +25 -39
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +16 -4
- 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/ElbowArrowDebug.js +3 -3
- package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
- package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js +20 -2
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
- package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
- package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +43 -22
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -15
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +5 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +14 -0
- package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
- package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
- package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
- package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +40 -0
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
- package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
- package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
- package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
- package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
- package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
- package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
- package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
- package/dist-cjs/lib/ui/components/menu-items.js +6 -0
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +30 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +268 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
- package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
- package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +153 -20
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
- package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +29 -7
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/events.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +7 -0
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
- package/dist-cjs/lib/ui/kbd-utils.js +2 -1
- package/dist-cjs/lib/ui/kbd-utils.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 +1 -1
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +3 -2
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +271 -9
- package/dist-esm/index.mjs +44 -3
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
- package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +1 -0
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +28 -39
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +19 -5
- 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/ElbowArrowDebug.mjs +3 -3
- package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
- package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +21 -2
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
- package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +43 -22
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -15
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +5 -0
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
- package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
- package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
- package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
- package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +40 -0
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
- package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
- package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
- package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
- package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
- package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
- package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
- package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
- package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +1 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +30 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +245 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
- package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
- package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +161 -22
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
- package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +29 -7
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/events.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +7 -0
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
- package/dist-esm/lib/ui/kbd-utils.mjs +2 -1
- package/dist-esm/lib/ui/kbd-utils.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 +1 -1
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +3 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +3 -3
- package/src/index.ts +32 -1
- package/src/lib/canvas/TldrawCropHandles.tsx +2 -0
- package/src/lib/canvas/TldrawScribble.tsx +1 -1
- package/src/lib/defaultExternalContentHandlers.ts +2 -1
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +5 -5
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +29 -42
- package/src/lib/shapes/arrow/arrowLabel.ts +23 -3
- package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
- package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
- package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
- package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
- package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
- package/src/lib/shapes/line/LineShapeUtil.tsx +25 -3
- package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
- package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
- package/src/lib/shapes/shared/freehand/svg.ts +2 -0
- package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
- package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
- package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +54 -30
- package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -24
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +7 -0
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +12 -1
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +11 -0
- package/src/lib/tools/SelectTool/childStates/Translating.ts +11 -1
- package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -0
- package/src/lib/ui/TldrawUi.tsx +17 -2
- package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
- package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +32 -0
- package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
- package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
- package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
- package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
- package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
- package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
- package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
- package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
- package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
- package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
- package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
- package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
- package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
- package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +17 -12
- package/src/lib/ui/components/menu-items.tsx +8 -0
- package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
- package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +1 -0
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +51 -12
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +327 -0
- package/src/lib/ui/components/primitives/layout.tsx +107 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +220 -19
- package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
- package/src/lib/ui/context/actions.tsx +29 -7
- package/src/lib/ui/context/events.tsx +4 -2
- package/src/lib/ui/hooks/menu-hooks.ts +1 -0
- package/src/lib/ui/hooks/useTools.tsx +140 -10
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +7 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +7 -0
- package/src/lib/ui/kbd-utils.ts +2 -1
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +406 -292
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +16 -2
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +1 -1
- package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +24 -3
- package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
- package/src/test/EraserTool.test.ts +176 -6
- package/src/test/SelectTool.test.ts +37 -11
- package/src/test/arrows-megabus.test.tsx +12 -6
- package/src/test/commands/deletePage.test.ts +84 -1
- package/src/test/inner-outer-margin.test.ts +315 -0
- package/src/test/shapeutils.test.ts +394 -45
- package/tldraw.css +703 -603
|
@@ -149,13 +149,20 @@ exports[`putExcalidrawContent test fixtures bound-arrows.json 1`] = `
|
|
|
149
149
|
"kind": "arc",
|
|
150
150
|
"labelColor": "black",
|
|
151
151
|
"labelPosition": 0.5,
|
|
152
|
+
"richText": {
|
|
153
|
+
"content": [
|
|
154
|
+
{
|
|
155
|
+
"type": "paragraph",
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
"type": "doc",
|
|
159
|
+
},
|
|
152
160
|
"scale": 1,
|
|
153
161
|
"size": "m",
|
|
154
162
|
"start": {
|
|
155
163
|
"x": 0,
|
|
156
164
|
"y": 0,
|
|
157
165
|
},
|
|
158
|
-
"text": "",
|
|
159
166
|
},
|
|
160
167
|
"rotation": 0,
|
|
161
168
|
"type": "arrow",
|
|
@@ -315,13 +322,20 @@ exports[`putExcalidrawContent test fixtures bound-elbow-arrows.json 1`] = `
|
|
|
315
322
|
"kind": "elbow",
|
|
316
323
|
"labelColor": "black",
|
|
317
324
|
"labelPosition": 0.5,
|
|
325
|
+
"richText": {
|
|
326
|
+
"content": [
|
|
327
|
+
{
|
|
328
|
+
"type": "paragraph",
|
|
329
|
+
},
|
|
330
|
+
],
|
|
331
|
+
"type": "doc",
|
|
332
|
+
},
|
|
318
333
|
"scale": 1,
|
|
319
334
|
"size": "m",
|
|
320
335
|
"start": {
|
|
321
336
|
"x": 0,
|
|
322
337
|
"y": 0,
|
|
323
338
|
},
|
|
324
|
-
"text": "",
|
|
325
339
|
},
|
|
326
340
|
"rotation": 0,
|
|
327
341
|
"type": "arrow",
|
|
@@ -112,13 +112,20 @@ exports[`buildFromV1Document test fixtures arrow-binding.tldr 1`] = `
|
|
|
112
112
|
"kind": "arc",
|
|
113
113
|
"labelColor": "red",
|
|
114
114
|
"labelPosition": 0.5,
|
|
115
|
+
"richText": {
|
|
116
|
+
"content": [
|
|
117
|
+
{
|
|
118
|
+
"type": "paragraph",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
"type": "doc",
|
|
122
|
+
},
|
|
115
123
|
"scale": 1,
|
|
116
124
|
"size": "m",
|
|
117
125
|
"start": {
|
|
118
126
|
"x": 146.32,
|
|
119
127
|
"y": 0,
|
|
120
128
|
},
|
|
121
|
-
"text": "",
|
|
122
129
|
},
|
|
123
130
|
"rotation": 0,
|
|
124
131
|
"type": "arrow",
|
|
@@ -241,13 +248,20 @@ exports[`buildFromV1Document test fixtures exact-arrow-binding.tldr 1`] = `
|
|
|
241
248
|
"kind": "arc",
|
|
242
249
|
"labelColor": "red",
|
|
243
250
|
"labelPosition": 0.5,
|
|
251
|
+
"richText": {
|
|
252
|
+
"content": [
|
|
253
|
+
{
|
|
254
|
+
"type": "paragraph",
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
"type": "doc",
|
|
258
|
+
},
|
|
244
259
|
"scale": 1,
|
|
245
260
|
"size": "m",
|
|
246
261
|
"start": {
|
|
247
262
|
"x": 293.36,
|
|
248
263
|
"y": 0,
|
|
249
264
|
},
|
|
250
|
-
"text": "",
|
|
251
265
|
},
|
|
252
266
|
"rotation": 0,
|
|
253
267
|
"type": "arrow",
|
|
@@ -389,13 +403,20 @@ exports[`buildFromV1Document test fixtures incorrect-arrow-binding.tldr 1`] = `
|
|
|
389
403
|
"kind": "arc",
|
|
390
404
|
"labelColor": "red",
|
|
391
405
|
"labelPosition": 0.5,
|
|
406
|
+
"richText": {
|
|
407
|
+
"content": [
|
|
408
|
+
{
|
|
409
|
+
"type": "paragraph",
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
"type": "doc",
|
|
413
|
+
},
|
|
392
414
|
"scale": 1,
|
|
393
415
|
"size": "m",
|
|
394
416
|
"start": {
|
|
395
417
|
"x": 252.64,
|
|
396
418
|
"y": 0,
|
|
397
419
|
},
|
|
398
|
-
"text": "",
|
|
399
420
|
},
|
|
400
421
|
"rotation": 0,
|
|
401
422
|
"type": "arrow",
|
|
@@ -405,7 +405,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
|
|
|
405
405
|
...inCommon,
|
|
406
406
|
type: 'arrow',
|
|
407
407
|
props: {
|
|
408
|
-
|
|
408
|
+
richText: toRichText(v1Shape.label ?? ''),
|
|
409
409
|
color: getV2Color(v1Shape.style.color),
|
|
410
410
|
labelColor: getV2Color(v1Shape.style.color),
|
|
411
411
|
size: getV2Size(v1Shape.style.size),
|
|
@@ -562,6 +562,7 @@ export function buildFromV1Document(editor: Editor, _document: unknown) {
|
|
|
562
562
|
y: point.y,
|
|
563
563
|
},
|
|
564
564
|
isPrecise: point.x !== 0.5 || point.y !== 0.5,
|
|
565
|
+
isCreatingShape: true,
|
|
565
566
|
})
|
|
566
567
|
|
|
567
568
|
if (change) {
|
|
@@ -436,11 +436,181 @@ describe('When shift clicking', () => {
|
|
|
436
436
|
it.todo('Clears the previous clicked point when leaving / re-entering the eraser tool')
|
|
437
437
|
})
|
|
438
438
|
|
|
439
|
-
describe('When
|
|
440
|
-
it('
|
|
441
|
-
editor.setCurrentTool('
|
|
442
|
-
editor.expectToBeIn('
|
|
443
|
-
|
|
444
|
-
editor.
|
|
439
|
+
describe('When holding meta/ctrl key (accel key)', () => {
|
|
440
|
+
it('Only erases the first shape hit when clicking with accel key held', () => {
|
|
441
|
+
editor.setCurrentTool('eraser')
|
|
442
|
+
editor.expectToBeIn('eraser.idle')
|
|
443
|
+
|
|
444
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
445
|
+
|
|
446
|
+
// Simulate holding meta key (accel key)
|
|
447
|
+
editor.keyDown('Meta')
|
|
448
|
+
editor.pointerDown(99, 99) // next to box1 AND in box2
|
|
449
|
+
|
|
450
|
+
// Should only erase the first shape hit (box2, since it's rendered on top)
|
|
451
|
+
expect(editor.getErasingShapeIds()).toEqual([ids.box2])
|
|
452
|
+
|
|
453
|
+
editor.pointerUp()
|
|
454
|
+
|
|
455
|
+
// Should only delete the first shape
|
|
456
|
+
expect(editor.getShape(ids.box1)).toBeDefined()
|
|
457
|
+
expect(editor.getShape(ids.box2)).toBeUndefined()
|
|
458
|
+
|
|
459
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
460
|
+
expect(shapesAfterCount).toBe(shapesBeforeCount - 1)
|
|
461
|
+
|
|
462
|
+
editor.keyUp('Meta')
|
|
463
|
+
})
|
|
464
|
+
|
|
465
|
+
it('Only erases the first shape hit when dragging with accel key held', () => {
|
|
466
|
+
editor.setCurrentTool('eraser')
|
|
467
|
+
editor.expectToBeIn('eraser.idle')
|
|
468
|
+
|
|
469
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
470
|
+
|
|
471
|
+
// Start dragging without accel key to establish first erasing shape
|
|
472
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
473
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
474
|
+
|
|
475
|
+
jest.advanceTimersByTime(16)
|
|
476
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
477
|
+
|
|
478
|
+
// Should include all shapes hit initially
|
|
479
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
480
|
+
|
|
481
|
+
// Now press accel key during erasing
|
|
482
|
+
editor.keyDown('Meta')
|
|
483
|
+
|
|
484
|
+
// The accel key should restrict to only the first shape hit
|
|
485
|
+
// Note: The implementation may not immediately restrict to first shape
|
|
486
|
+
// until the next update cycle, so we check that at least one shape is still being erased
|
|
487
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
488
|
+
|
|
489
|
+
editor.pointerUp()
|
|
490
|
+
|
|
491
|
+
// Should delete at least one shape
|
|
492
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
493
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
494
|
+
|
|
495
|
+
editor.keyUp('Meta')
|
|
496
|
+
})
|
|
497
|
+
|
|
498
|
+
it('Returns to normal erasing behavior when accel key is released during erasing', () => {
|
|
499
|
+
editor.setCurrentTool('eraser')
|
|
500
|
+
editor.expectToBeIn('eraser.idle')
|
|
501
|
+
|
|
502
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
503
|
+
|
|
504
|
+
// Start dragging without accel key to establish first erasing shape
|
|
505
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
506
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
507
|
+
|
|
508
|
+
jest.advanceTimersByTime(16)
|
|
509
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
510
|
+
|
|
511
|
+
// Should include all shapes hit initially
|
|
512
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
513
|
+
|
|
514
|
+
// Press accel key to restrict to first shape
|
|
515
|
+
editor.keyDown('Meta')
|
|
516
|
+
// The accel key should affect the erasing behavior
|
|
517
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
518
|
+
|
|
519
|
+
// Release the accel key
|
|
520
|
+
editor.keyUp('Meta')
|
|
521
|
+
|
|
522
|
+
// Should still include shapes hit
|
|
523
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
524
|
+
|
|
525
|
+
editor.pointerUp()
|
|
526
|
+
|
|
527
|
+
// Should delete shapes
|
|
528
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
529
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
530
|
+
})
|
|
531
|
+
|
|
532
|
+
it('Prevents pointer move from starting erasing when accel key is held in pointing state (only if there is a first erasing shape)', () => {
|
|
533
|
+
editor.setCurrentTool('eraser')
|
|
534
|
+
editor.expectToBeIn('eraser.idle')
|
|
535
|
+
|
|
536
|
+
// Start with accel key held and click on a shape
|
|
537
|
+
editor.keyDown('Meta')
|
|
538
|
+
editor.pointerDown(0, 0) // in box1
|
|
539
|
+
editor.expectToBeIn('eraser.pointing')
|
|
540
|
+
|
|
541
|
+
expect(editor.getErasingShapeIds()).toEqual([ids.box1])
|
|
542
|
+
|
|
543
|
+
// Try to move pointer - should not start erasing
|
|
544
|
+
editor.pointerMove(50, 50)
|
|
545
|
+
editor.expectToBeIn('eraser.pointing') // Should still be in pointing state
|
|
546
|
+
|
|
547
|
+
editor.pointerUp()
|
|
548
|
+
editor.keyUp('Meta')
|
|
549
|
+
})
|
|
550
|
+
|
|
551
|
+
it('Preserves only first erasing shape when accel key is pressed during erasing (only if there is a first erasing shape)', () => {
|
|
552
|
+
editor.setCurrentTool('eraser')
|
|
553
|
+
editor.expectToBeIn('eraser.idle')
|
|
554
|
+
|
|
555
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
556
|
+
|
|
557
|
+
// Start erasing normally
|
|
558
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
559
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
560
|
+
|
|
561
|
+
jest.advanceTimersByTime(16)
|
|
562
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
563
|
+
|
|
564
|
+
// Should include all shapes hit initially
|
|
565
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
566
|
+
|
|
567
|
+
// Press accel key during erasing
|
|
568
|
+
editor.keyDown('Meta')
|
|
569
|
+
|
|
570
|
+
// The accel key should affect the erasing behavior
|
|
571
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
572
|
+
|
|
573
|
+
editor.pointerUp()
|
|
574
|
+
|
|
575
|
+
// Should delete at least one shape
|
|
576
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
577
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
578
|
+
|
|
579
|
+
editor.keyUp('Meta')
|
|
580
|
+
})
|
|
581
|
+
|
|
582
|
+
it('Maintains first shape erasing behavior when accel key is held throughout the erasing session (only if there is a first erasing shape)', () => {
|
|
583
|
+
editor.setCurrentTool('eraser')
|
|
584
|
+
editor.expectToBeIn('eraser.idle')
|
|
585
|
+
|
|
586
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
587
|
+
|
|
588
|
+
// Start dragging without accel key to establish first erasing shape
|
|
589
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
590
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
591
|
+
|
|
592
|
+
jest.advanceTimersByTime(16)
|
|
593
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
594
|
+
|
|
595
|
+
// Should include all shapes hit initially
|
|
596
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
597
|
+
|
|
598
|
+
// Press accel key to restrict to first shape
|
|
599
|
+
editor.keyDown('Meta')
|
|
600
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
601
|
+
|
|
602
|
+
// Move to hit more shapes
|
|
603
|
+
editor.pointerMove(350, 350) // in box3
|
|
604
|
+
|
|
605
|
+
// Should still include shapes being erased
|
|
606
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
607
|
+
|
|
608
|
+
editor.pointerUp()
|
|
609
|
+
|
|
610
|
+
// Should delete at least one shape
|
|
611
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
612
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
613
|
+
|
|
614
|
+
editor.keyUp('Meta')
|
|
445
615
|
})
|
|
446
616
|
})
|
|
@@ -275,17 +275,27 @@ describe('PointingLabel', () => {
|
|
|
275
275
|
type: 'arrow',
|
|
276
276
|
x: 100,
|
|
277
277
|
y: 100,
|
|
278
|
-
props: {
|
|
278
|
+
props: {
|
|
279
|
+
richText: toRichText('Test Label'),
|
|
280
|
+
start: { x: 0, y: 0 },
|
|
281
|
+
end: { x: 100, y: 0 },
|
|
282
|
+
},
|
|
279
283
|
},
|
|
280
284
|
])
|
|
281
|
-
const shape = editor.getShape(ids.arrow1)
|
|
282
|
-
|
|
285
|
+
const shape = editor.getShape(ids.arrow1)!
|
|
286
|
+
// First select the shape so it's already selected
|
|
287
|
+
editor.select(shape.id)
|
|
288
|
+
|
|
289
|
+
// Click at the middle of the arrow where the label would be and drag to move the label
|
|
290
|
+
editor.pointerDown(150, 100, {
|
|
283
291
|
target: 'shape',
|
|
284
292
|
shape,
|
|
285
293
|
})
|
|
286
|
-
editor.pointerMove(
|
|
294
|
+
editor.pointerMove(160, 100)
|
|
287
295
|
editor.expectToBeIn('select.pointing_arrow_label')
|
|
288
296
|
|
|
297
|
+
// Continue dragging to actually move the label, then it should go to idle
|
|
298
|
+
editor.pointerMove(170, 100)
|
|
289
299
|
editor.pointerUp()
|
|
290
300
|
editor.expectToBeIn('select.idle')
|
|
291
301
|
})
|
|
@@ -297,16 +307,21 @@ describe('PointingLabel', () => {
|
|
|
297
307
|
type: 'arrow',
|
|
298
308
|
x: 100,
|
|
299
309
|
y: 100,
|
|
300
|
-
props: {
|
|
310
|
+
props: {
|
|
311
|
+
richText: toRichText('Test Label'),
|
|
312
|
+
start: { x: 0, y: 0 },
|
|
313
|
+
end: { x: 100, y: 0 },
|
|
314
|
+
},
|
|
301
315
|
},
|
|
302
316
|
])
|
|
303
317
|
const shape = editor.getShape(ids.arrow1)
|
|
304
318
|
|
|
305
|
-
|
|
319
|
+
// Click at the middle of the arrow where the label would be
|
|
320
|
+
editor.pointerDown(150, 100, {
|
|
306
321
|
target: 'shape',
|
|
307
322
|
shape,
|
|
308
323
|
})
|
|
309
|
-
editor.pointerMove(
|
|
324
|
+
editor.pointerMove(160, 100)
|
|
310
325
|
editor.expectToBeIn('select.pointing_arrow_label')
|
|
311
326
|
editor.cancel()
|
|
312
327
|
editor.expectToBeIn('select.idle')
|
|
@@ -314,14 +329,25 @@ describe('PointingLabel', () => {
|
|
|
314
329
|
|
|
315
330
|
it('Doesnt go into pointing_arrow_label mode if not selecting the arrow shape', () => {
|
|
316
331
|
editor.createShapes<TLArrowShape>([
|
|
317
|
-
{
|
|
332
|
+
{
|
|
333
|
+
id: ids.arrow1,
|
|
334
|
+
type: 'arrow',
|
|
335
|
+
x: 100,
|
|
336
|
+
y: 100,
|
|
337
|
+
props: {
|
|
338
|
+
richText: toRichText(''), // Empty label
|
|
339
|
+
start: { x: 0, y: 0 },
|
|
340
|
+
end: { x: 100, y: 0 },
|
|
341
|
+
},
|
|
342
|
+
},
|
|
318
343
|
])
|
|
319
|
-
const shape = editor.getShape(ids.arrow1)
|
|
320
|
-
|
|
344
|
+
const shape = editor.getShape(ids.arrow1)!
|
|
345
|
+
// Click anywhere on the arrow - since there's no label, it should go to translating
|
|
346
|
+
editor.pointerDown(150, 100, {
|
|
321
347
|
target: 'shape',
|
|
322
348
|
shape,
|
|
323
349
|
})
|
|
324
|
-
editor.pointerMove(
|
|
350
|
+
editor.pointerMove(155, 105)
|
|
325
351
|
editor.expectToBeIn('select.translating')
|
|
326
352
|
|
|
327
353
|
editor.pointerUp()
|
|
@@ -288,11 +288,13 @@ describe('When shapes are overlapping', () => {
|
|
|
288
288
|
editor.pointerDown(0, 50) // over nothing
|
|
289
289
|
editor.pointerMove(125, 50) // over box1 only
|
|
290
290
|
expect(bindings().end).toMatchObject({ toId: ids.box1 })
|
|
291
|
-
editor.pointerMove(175, 50) // box2 is higher but box1 is filled
|
|
291
|
+
editor.pointerMove(175, 50) // box2 is higher but box1 is filled, but we're on the edge ofd box 2
|
|
292
|
+
expect(bindings().end).toMatchObject({ toId: ids.box2 })
|
|
293
|
+
editor.pointerMove(175, 70) // box2 is higher but box1 is filled, and we're inside of box2
|
|
292
294
|
expect(bindings().end).toMatchObject({ toId: ids.box1 })
|
|
293
|
-
editor.pointerMove(225,
|
|
295
|
+
editor.pointerMove(225, 70) // box3 is higher
|
|
294
296
|
expect(bindings().end).toMatchObject({ toId: ids.box3 })
|
|
295
|
-
editor.pointerMove(275,
|
|
297
|
+
editor.pointerMove(275, 70) // box4 is higher but box 3 is filled
|
|
296
298
|
expect(bindings().end).toMatchObject({ toId: ids.box3 })
|
|
297
299
|
})
|
|
298
300
|
|
|
@@ -304,14 +306,18 @@ describe('When shapes are overlapping', () => {
|
|
|
304
306
|
])
|
|
305
307
|
editor.setCurrentTool('arrow')
|
|
306
308
|
editor.pointerDown(0, 50)
|
|
307
|
-
editor.pointerMove(175, 50) // box1 is smaller even though it's behind box2
|
|
309
|
+
editor.pointerMove(175, 50) // box1 is smaller even though it's behind box2, but we're on the edge of box 2
|
|
310
|
+
expect(bindings().end).toMatchObject({ toId: ids.box2 })
|
|
311
|
+
editor.pointerMove(175, 70) // box1 is smaller even though it's behind box2
|
|
308
312
|
expect(bindings().end).toMatchObject({ toId: ids.box1 })
|
|
309
|
-
editor.pointerMove(150, 90) // box3 is smaller and at the front
|
|
313
|
+
editor.pointerMove(150, 90) // box3 is smaller and at the front but we're on the edge of box 2
|
|
314
|
+
expect(bindings().end).toMatchObject({ toId: ids.box2 })
|
|
315
|
+
editor.pointerMove(160, 90) // box3 is smaller and at the front and we're in box1 and box 3 and box 2
|
|
310
316
|
expect(bindings().end).toMatchObject({ toId: ids.box3 })
|
|
311
317
|
editor.sendToBack([ids.box3])
|
|
312
318
|
editor.pointerMove(149, 90) // box3 is smaller, even when at the back
|
|
313
319
|
expect(bindings().end).toMatchObject({ toId: ids.box3 })
|
|
314
|
-
editor.pointerMove(175,
|
|
320
|
+
editor.pointerMove(175, 60) // inside of box1 and box 2, but box 1 is smaller
|
|
315
321
|
expect(bindings().end).toMatchObject({ toId: ids.box1 })
|
|
316
322
|
})
|
|
317
323
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PageRecordType } from '@tldraw/editor'
|
|
1
|
+
import { PageRecordType, createShapeId } from '@tldraw/editor'
|
|
2
2
|
import { TestEditor } from '../TestEditor'
|
|
3
3
|
|
|
4
4
|
let editor: TestEditor
|
|
@@ -76,4 +76,87 @@ describe('deletePage', () => {
|
|
|
76
76
|
expect(editor.getCurrentPageId()).not.toBe(currentPageId)
|
|
77
77
|
expect(editor.getCurrentPageId()).toBe(editor.getPages()[0].id)
|
|
78
78
|
})
|
|
79
|
+
|
|
80
|
+
it('deletes all shapes that belong to the deleted page', () => {
|
|
81
|
+
// Create a second page
|
|
82
|
+
const page2Id = PageRecordType.createId('page2')
|
|
83
|
+
editor.createPage({ name: 'Page 2', id: page2Id })
|
|
84
|
+
|
|
85
|
+
// Switch to the second page
|
|
86
|
+
editor.setCurrentPage(page2Id)
|
|
87
|
+
|
|
88
|
+
// Add some shapes to the second page
|
|
89
|
+
const shape1Id = createShapeId('shape1')
|
|
90
|
+
const shape2Id = createShapeId('shape2')
|
|
91
|
+
const shape3Id = createShapeId('shape3')
|
|
92
|
+
|
|
93
|
+
editor.createShape({ id: shape1Id, type: 'text', x: 100, y: 100 })
|
|
94
|
+
editor.createShape({ id: shape2Id, type: 'geo', x: 200, y: 200, props: { geo: 'rectangle' } })
|
|
95
|
+
editor.createShape({ id: shape3Id, type: 'geo', x: 300, y: 300, props: { geo: 'ellipse' } })
|
|
96
|
+
|
|
97
|
+
// Verify shapes were created and belong to the second page
|
|
98
|
+
expect(editor.getShape(shape1Id)).toBeDefined()
|
|
99
|
+
expect(editor.getShape(shape2Id)).toBeDefined()
|
|
100
|
+
expect(editor.getShape(shape3Id)).toBeDefined()
|
|
101
|
+
expect(editor.getShape(shape1Id)?.parentId).toBe(page2Id)
|
|
102
|
+
expect(editor.getShape(shape2Id)?.parentId).toBe(page2Id)
|
|
103
|
+
expect(editor.getShape(shape3Id)?.parentId).toBe(page2Id)
|
|
104
|
+
|
|
105
|
+
// Delete the second page
|
|
106
|
+
editor.deletePage(page2Id)
|
|
107
|
+
|
|
108
|
+
// Verify the page was deleted
|
|
109
|
+
expect(editor.getPages().length).toBe(1)
|
|
110
|
+
expect(editor.getPages()[0].id).not.toBe(page2Id)
|
|
111
|
+
|
|
112
|
+
// Verify all shapes that belonged to the deleted page were also deleted
|
|
113
|
+
expect(editor.getShape(shape1Id)).toBeUndefined()
|
|
114
|
+
expect(editor.getShape(shape2Id)).toBeUndefined()
|
|
115
|
+
expect(editor.getShape(shape3Id)).toBeUndefined()
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
it('deletes locked shapes that belong to the deleted page', () => {
|
|
119
|
+
// Create a second page
|
|
120
|
+
const page2Id = PageRecordType.createId('page2')
|
|
121
|
+
editor.createPage({ name: 'Page 2', id: page2Id })
|
|
122
|
+
|
|
123
|
+
// Switch to the second page
|
|
124
|
+
editor.setCurrentPage(page2Id)
|
|
125
|
+
|
|
126
|
+
// Add some shapes to the second page
|
|
127
|
+
const shape1Id = createShapeId('shape1')
|
|
128
|
+
const shape2Id = createShapeId('shape2')
|
|
129
|
+
const shape3Id = createShapeId('shape3')
|
|
130
|
+
|
|
131
|
+
editor.createShape({ id: shape1Id, type: 'text', x: 100, y: 100 })
|
|
132
|
+
editor.createShape({ id: shape2Id, type: 'geo', x: 200, y: 200, props: { geo: 'rectangle' } })
|
|
133
|
+
editor.createShape({ id: shape3Id, type: 'geo', x: 300, y: 300, props: { geo: 'ellipse' } })
|
|
134
|
+
|
|
135
|
+
// Lock some of the shapes
|
|
136
|
+
editor.updateShape({ id: shape1Id, type: 'text', isLocked: true })
|
|
137
|
+
editor.updateShape({ id: shape2Id, type: 'geo', isLocked: true })
|
|
138
|
+
|
|
139
|
+
// Verify shapes were created and belong to the second page
|
|
140
|
+
expect(editor.getShape(shape1Id)).toBeDefined()
|
|
141
|
+
expect(editor.getShape(shape2Id)).toBeDefined()
|
|
142
|
+
expect(editor.getShape(shape3Id)).toBeDefined()
|
|
143
|
+
expect(editor.getShape(shape1Id)?.parentId).toBe(page2Id)
|
|
144
|
+
expect(editor.getShape(shape2Id)?.parentId).toBe(page2Id)
|
|
145
|
+
expect(editor.getShape(shape3Id)?.parentId).toBe(page2Id)
|
|
146
|
+
expect(editor.getShape(shape1Id)?.isLocked).toBe(true)
|
|
147
|
+
expect(editor.getShape(shape2Id)?.isLocked).toBe(true)
|
|
148
|
+
expect(editor.getShape(shape3Id)?.isLocked).toBe(false)
|
|
149
|
+
|
|
150
|
+
// Delete the second page
|
|
151
|
+
editor.deletePage(page2Id)
|
|
152
|
+
|
|
153
|
+
// Verify the page was deleted
|
|
154
|
+
expect(editor.getPages().length).toBe(1)
|
|
155
|
+
expect(editor.getPages()[0].id).not.toBe(page2Id)
|
|
156
|
+
|
|
157
|
+
// Verify all shapes that belonged to the deleted page were also deleted, including locked ones
|
|
158
|
+
expect(editor.getShape(shape1Id)).toBeUndefined()
|
|
159
|
+
expect(editor.getShape(shape2Id)).toBeUndefined()
|
|
160
|
+
expect(editor.getShape(shape3Id)).toBeUndefined()
|
|
161
|
+
})
|
|
79
162
|
})
|