tldraw 3.16.0-internal.a478398270c6 → 3.16.0-internal.f8b97f0c414f
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 +471 -130
- package/dist-cjs/index.js +58 -15
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/Tldraw.js +12 -2
- package/dist-cjs/lib/Tldraw.js.map +2 -2
- package/dist-cjs/lib/TldrawImage.js +5 -2
- package/dist-cjs/lib/TldrawImage.js.map +3 -3
- package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
- package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawHandles.js +1 -1
- package/dist-cjs/lib/canvas/TldrawHandles.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawOverlays.js +1 -1
- package/dist-cjs/lib/canvas/TldrawOverlays.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/canvas/TldrawSelectionForeground.js +279 -271
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +6 -4
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +27 -44
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +22 -4
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
- 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/elbow/elbowArrowSnapLines.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/bookmark/BookmarkShapeUtil.js +4 -4
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -6
- 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/FrameShapeTool.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +25 -18
- 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/frame/components/FrameLabelInput.js +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +3 -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 -4
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js +20 -5
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +8 -6
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PathBuilder.js +21 -3
- package/dist-cjs/lib/shapes/shared/PathBuilder.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +2 -3
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +5 -2
- package/dist-cjs/lib/shapes/shared/RichTextLabel.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/SvgTextLabel.js +4 -3
- package/dist-cjs/lib/shapes/shared/SvgTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/crop.js +1 -0
- package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -4
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.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/PlainTextArea.js +2 -2
- package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +7 -13
- 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/styles.js.map +2 -2
- 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/Crop/children/PointingCrop.js +7 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.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 +27 -12
- package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
- package/dist-cjs/lib/ui/components/A11y.js +15 -13
- package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
- 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/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
- package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
- 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/EditLinkDialog.js +11 -1
- package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +57 -7
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -2
- 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 +4 -5
- package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +3 -2
- 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/Spinner.js +2 -25
- package/dist-cjs/lib/ui/components/Spinner.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +11 -4
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +249 -278
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -54
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +21 -7
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
- 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/DefaultVideoToolbarContent.js +15 -3
- package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
- 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 +22 -0
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButtonIcon.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +35 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.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 +23 -6
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +33 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +294 -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/TldrawUiMenuCheckboxItem.js.map +2 -2
- 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 +154 -22
- 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 +79 -17
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +2 -0
- package/dist-cjs/lib/ui/context/components.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/useClipboardEvents.js +1 -1
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
- package/dist-cjs/lib/ui/hooks/useExportAs.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 +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 +13 -0
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
- package/dist-cjs/lib/ui/kbd-utils.js +11 -4
- 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/export/copyAs.js +1 -2
- package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
- package/dist-cjs/lib/utils/export/export.js +0 -20
- package/dist-cjs/lib/utils/export/export.js.map +2 -2
- package/dist-cjs/lib/utils/export/exportAs.js +1 -2
- package/dist-cjs/lib/utils/export/exportAs.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 +471 -130
- package/dist-esm/index.mjs +107 -32
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/Tldraw.mjs +14 -4
- package/dist-esm/lib/Tldraw.mjs.map +2 -2
- package/dist-esm/lib/TldrawImage.mjs +5 -2
- package/dist-esm/lib/TldrawImage.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawCropHandles.mjs +1 -1
- package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawHandles.mjs +1 -1
- package/dist-esm/lib/canvas/TldrawHandles.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawOverlays.mjs +1 -1
- package/dist-esm/lib/canvas/TldrawOverlays.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/canvas/TldrawSelectionForeground.mjs +279 -271
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +6 -4
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +30 -44
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +25 -5
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
- 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/elbow/elbowArrowSnapLines.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/bookmark/BookmarkShapeUtil.mjs +5 -5
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -6
- 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/FrameShapeTool.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +26 -18
- 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/frame/components/FrameLabelInput.mjs +3 -3
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +4 -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 -4
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +21 -5
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +9 -6
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PathBuilder.mjs +22 -3
- package/dist-esm/lib/shapes/shared/PathBuilder.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +2 -3
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +5 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.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/SvgTextLabel.mjs +4 -3
- package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
- package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +4 -5
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.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/PlainTextArea.mjs +3 -3
- package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +8 -13
- 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/styles.mjs.map +2 -2
- 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/Crop/children/PointingCrop.mjs +7 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.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 +29 -14
- package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
- package/dist-esm/lib/ui/components/A11y.mjs +16 -14
- package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
- 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/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
- package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
- 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/EditLinkDialog.mjs +11 -1
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +57 -7
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -3
- 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 +4 -5
- package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +4 -3
- 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/Spinner.mjs +3 -26
- package/dist-esm/lib/ui/components/Spinner.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +16 -5
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +251 -282
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +126 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +23 -9
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +3 -3
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
- 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/DefaultVideoToolbarContent.mjs +15 -3
- package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.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 +22 -0
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButtonIcon.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +12 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs +1 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +36 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +3 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.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 +23 -6
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +33 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +272 -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/TldrawUiMenuCheckboxItem.mjs.map +2 -2
- 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 +162 -24
- 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 +79 -17
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +2 -0
- package/dist-esm/lib/ui/context/components.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/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
- package/dist-esm/lib/ui/hooks/useExportAs.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 +102 -10
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +13 -0
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
- package/dist-esm/lib/ui/kbd-utils.mjs +11 -4
- 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/export/copyAs.mjs +1 -2
- package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
- package/dist-esm/lib/utils/export/export.mjs +0 -20
- package/dist-esm/lib/utils/export/export.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
- package/dist-esm/lib/utils/export/exportAs.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 +12 -34
- package/src/index.ts +80 -24
- package/src/lib/Tldraw.tsx +15 -2
- package/src/lib/TldrawImage.tsx +6 -2
- package/src/lib/canvas/TldrawCropHandles.tsx +3 -1
- package/src/lib/canvas/TldrawHandles.tsx +5 -1
- package/src/lib/canvas/TldrawOverlays.tsx +1 -1
- package/src/lib/canvas/TldrawScribble.tsx +1 -1
- package/src/lib/canvas/TldrawSelectionForeground.tsx +5 -1
- package/src/lib/defaultExternalContentHandlers.ts +14 -5
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +6 -5
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +53 -11
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +30 -46
- package/src/lib/shapes/arrow/arrowLabel.ts +31 -3
- package/src/lib/shapes/arrow/arrowTargetState.ts +3 -2
- package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
- package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +2 -2
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +5 -5
- package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -7
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
- package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +35 -21
- package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
- package/src/lib/shapes/frame/components/FrameLabelInput.tsx +3 -3
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +4 -2
- package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -4
- package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
- package/src/lib/shapes/line/LineShapeUtil.test.tsx +8 -7
- package/src/lib/shapes/line/LineShapeUtil.tsx +25 -6
- package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
- package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
- package/src/lib/shapes/note/NoteShapeUtil.tsx +11 -4
- package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
- package/src/lib/shapes/shared/PathBuilder.test.tsx +1 -1
- package/src/lib/shapes/shared/PathBuilder.tsx +35 -1
- package/src/lib/shapes/shared/PlainTextLabel.tsx +3 -7
- package/src/lib/shapes/shared/RichTextLabel.tsx +6 -1
- package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
- package/src/lib/shapes/shared/SvgTextLabel.tsx +4 -2
- package/src/lib/shapes/shared/crop.ts +1 -0
- package/src/lib/shapes/shared/freehand/svg.ts +2 -0
- package/src/lib/shapes/shared/useEditablePlainText.ts +12 -12
- package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
- package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
- package/src/lib/shapes/text/PlainTextArea.tsx +3 -3
- package/src/lib/shapes/text/RichTextArea.tsx +3 -4
- package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
- package/src/lib/shapes/text/TextShapeUtil.tsx +8 -14
- package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
- package/src/lib/styles.tsx +3 -1
- 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/Crop/children/PointingCrop.ts +8 -1
- 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 +33 -12
- package/src/lib/ui/components/A11y.tsx +17 -15
- package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
- package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
- package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
- package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +46 -6
- package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -2
- 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 +4 -5
- package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +5 -4
- 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/Spinner.tsx +2 -24
- package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +28 -12
- package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +261 -342
- package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +66 -48
- package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
- package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
- package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
- package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
- package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +5 -4
- package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +25 -9
- package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
- package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
- package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
- package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
- 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 +25 -0
- package/src/lib/ui/components/primitives/Button/TldrawUiButtonIcon.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +8 -3
- package/src/lib/ui/components/primitives/TldrawUiDialog.tsx +1 -1
- package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +41 -3
- package/src/lib/ui/components/primitives/TldrawUiInput.tsx +3 -3
- package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +54 -29
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +59 -12
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +365 -0
- package/src/lib/ui/components/primitives/layout.tsx +107 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +2 -2
- 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 +224 -23
- package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
- package/src/lib/ui/context/actions.tsx +81 -18
- package/src/lib/ui/context/components.tsx +3 -0
- package/src/lib/ui/context/events.tsx +7 -3
- package/src/lib/ui/hooks/menu-hooks.ts +1 -0
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useExportAs.ts +3 -2
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +3 -2
- package/src/lib/ui/hooks/useTools.tsx +142 -11
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +13 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +13 -0
- package/src/lib/ui/kbd-utils.ts +12 -4
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +432 -315
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +21 -7
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +7 -7
- package/src/lib/utils/export/copyAs.ts +1 -24
- package/src/lib/utils/export/export.ts +0 -36
- package/src/lib/utils/export/exportAs.ts +1 -32
- package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +28 -7
- package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
- package/src/test/A11y.test.tsx +3 -2
- package/src/test/ClickManager.test.ts +7 -6
- package/src/test/Editor.test.tsx +56 -28
- package/src/test/EraserTool.test.ts +184 -13
- package/src/test/HandTool.test.ts +10 -9
- package/src/test/HighlightShape.test.ts +2 -1
- package/src/test/SelectTool.test.ts +40 -13
- package/src/test/TLUserPreferences.test.ts +4 -3
- package/src/test/TestEditor.ts +13 -15
- package/src/test/TldrawEditor.test.tsx +26 -19
- package/src/test/ZoomTool.test.ts +7 -6
- package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
- package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
- package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
- package/src/test/arrows-megabus.test.tsx +17 -10
- package/src/test/bindings.test.tsx +24 -37
- package/src/test/bookmark-shapes.test.ts +1 -8
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
- package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
- package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
- package/src/test/commands/alignShapes.test.tsx +25 -24
- package/src/test/commands/animationSpeed.test.ts +2 -1
- package/src/test/commands/centerOnPoint.test.ts +3 -2
- package/src/test/commands/clipboard.test.ts +3 -2
- package/src/test/commands/createShapes.test.ts +2 -1
- package/src/test/commands/deletePage.test.ts +84 -1
- package/src/test/commands/deleteShapes.test.ts +2 -1
- package/src/test/commands/distributeShapes.test.tsx +11 -10
- package/src/test/commands/getSvgString.test.ts +2 -1
- package/src/test/commands/packShapes.test.ts +5 -4
- package/src/test/commands/putContent.test.ts +1 -0
- package/src/test/commands/resizeShape.test.ts +2 -1
- package/src/test/commands/rotateShapes.test.ts +7 -6
- package/src/test/commands/setCamera.test.ts +4 -3
- package/src/test/commands/setCurrentPage.test.ts +3 -2
- package/src/test/commands/stackShapes.test.ts +11 -10
- package/src/test/commands/stretch.test.tsx +13 -12
- package/src/test/commands/updateShapes.test.ts +9 -5
- package/src/test/createDeepLink.test.tsx +2 -1
- package/src/test/cropping.test.ts +3 -2
- package/src/test/custom-clipping.test.ts +442 -0
- package/src/test/customSnapping.test.tsx +55 -41
- package/src/test/drawing.test.ts +2 -1
- package/src/test/flipShapes.test.ts +4 -3
- package/src/test/frames.test.ts +25 -24
- package/src/test/getCulledShapes.test.tsx +80 -4
- package/src/test/groups.test.tsx +6 -4
- package/src/test/handleDeepLink.test.tsx +2 -1
- package/src/test/inner-outer-margin.test.ts +315 -0
- package/src/test/maxShapes.test.ts +3 -2
- package/src/test/modifiers.test.ts +5 -4
- package/src/test/navigation.test.ts +264 -9
- package/src/test/panning.test.ts +2 -1
- package/src/test/perf/perf.test.ts +2 -1
- package/src/test/registerDeepLinkListener.test.tsx +10 -9
- package/src/test/resizing.test.ts +39 -38
- package/src/test/select.test.tsx +4 -3
- package/src/test/selection-omnibus.test.ts +11 -10
- package/src/test/shapeutils.test.ts +398 -48
- package/src/test/translating.test.ts +12 -11
- package/tldraw.css +759 -630
- package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
- package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -113
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createShapeId } from '@tldraw/editor'
|
|
2
|
+
import { vi } from 'vitest'
|
|
2
3
|
import { TestEditor } from './TestEditor'
|
|
3
4
|
|
|
4
5
|
let editor: TestEditor
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
vi.useFakeTimers()
|
|
7
8
|
|
|
8
9
|
const ids = {
|
|
9
10
|
box1: createShapeId('box1'),
|
|
@@ -304,7 +305,7 @@ describe('When clicking and dragging', () => {
|
|
|
304
305
|
|
|
305
306
|
editor.expectToBeIn('eraser.erasing')
|
|
306
307
|
|
|
307
|
-
|
|
308
|
+
vi.advanceTimersByTime(16)
|
|
308
309
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
309
310
|
|
|
310
311
|
expect(editor.getErasingShapeIds()).toEqual([ids.box1])
|
|
@@ -330,7 +331,7 @@ describe('When clicking and dragging', () => {
|
|
|
330
331
|
editor.expectToBeIn('eraser.idle')
|
|
331
332
|
editor.pointerDown(-100, -100) // outside of any shapes
|
|
332
333
|
editor.pointerMove(50, 50) // inside of box1
|
|
333
|
-
|
|
334
|
+
vi.advanceTimersByTime(16)
|
|
334
335
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
335
336
|
expect(editor.getErasingShapeIds()).toEqual([ids.box1])
|
|
336
337
|
editor.cancel()
|
|
@@ -345,7 +346,7 @@ describe('When clicking and dragging', () => {
|
|
|
345
346
|
editor.expectToBeIn('eraser.idle')
|
|
346
347
|
editor.pointerDown(275, 275) // in between box2 AND box3, so over of the new group
|
|
347
348
|
editor.pointerMove(280, 280) // still outside of the new group
|
|
348
|
-
|
|
349
|
+
vi.advanceTimersByTime(16)
|
|
349
350
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
350
351
|
expect(editor.getErasingShapeIds()).toEqual([])
|
|
351
352
|
editor.pointerMove(0, 0)
|
|
@@ -360,7 +361,7 @@ describe('When clicking and dragging', () => {
|
|
|
360
361
|
editor.setCurrentTool('eraser')
|
|
361
362
|
editor.pointerDown(325, 25) // directly on frame1, not its children
|
|
362
363
|
editor.pointerMove(350, 375) // still in the frame, passing through box3
|
|
363
|
-
|
|
364
|
+
vi.advanceTimersByTime(16)
|
|
364
365
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
365
366
|
expect(editor.getErasingShapeIds()).toEqual([ids.box3])
|
|
366
367
|
editor.pointerUp()
|
|
@@ -374,7 +375,7 @@ describe('When clicking and dragging', () => {
|
|
|
374
375
|
editor.pointerDown() // Above the masked part of box3
|
|
375
376
|
expect(editor.getErasingShapeIds()).toEqual([])
|
|
376
377
|
editor.pointerMove(425, 500) // Through the masked part of box3
|
|
377
|
-
|
|
378
|
+
vi.advanceTimersByTime(16)
|
|
378
379
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
379
380
|
expect(editor.getErasingShapeIds()).toEqual([])
|
|
380
381
|
editor.pointerUp()
|
|
@@ -402,7 +403,7 @@ describe('When clicking and dragging', () => {
|
|
|
402
403
|
editor.pointerDown(-100, -100)
|
|
403
404
|
expect(editor.getInstanceState().scribbles.length).toBe(0)
|
|
404
405
|
editor.pointerMove(50, 50)
|
|
405
|
-
|
|
406
|
+
vi.advanceTimersByTime(16)
|
|
406
407
|
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
407
408
|
editor.pointerMove(50, 50)
|
|
408
409
|
editor.pointerMove(51, 50)
|
|
@@ -436,11 +437,181 @@ describe('When shift clicking', () => {
|
|
|
436
437
|
it.todo('Clears the previous clicked point when leaving / re-entering the eraser tool')
|
|
437
438
|
})
|
|
438
439
|
|
|
439
|
-
describe('When
|
|
440
|
-
it('
|
|
441
|
-
editor.setCurrentTool('
|
|
442
|
-
editor.expectToBeIn('
|
|
443
|
-
|
|
444
|
-
editor.
|
|
440
|
+
describe('When holding meta/ctrl key (accel key)', () => {
|
|
441
|
+
it('Only erases the first shape hit when clicking with accel key held', () => {
|
|
442
|
+
editor.setCurrentTool('eraser')
|
|
443
|
+
editor.expectToBeIn('eraser.idle')
|
|
444
|
+
|
|
445
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
446
|
+
|
|
447
|
+
// Simulate holding meta key (accel key)
|
|
448
|
+
editor.keyDown('Meta')
|
|
449
|
+
editor.pointerDown(99, 99) // next to box1 AND in box2
|
|
450
|
+
|
|
451
|
+
// Should only erase the first shape hit (box2, since it's rendered on top)
|
|
452
|
+
expect(editor.getErasingShapeIds()).toEqual([ids.box2])
|
|
453
|
+
|
|
454
|
+
editor.pointerUp()
|
|
455
|
+
|
|
456
|
+
// Should only delete the first shape
|
|
457
|
+
expect(editor.getShape(ids.box1)).toBeDefined()
|
|
458
|
+
expect(editor.getShape(ids.box2)).toBeUndefined()
|
|
459
|
+
|
|
460
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
461
|
+
expect(shapesAfterCount).toBe(shapesBeforeCount - 1)
|
|
462
|
+
|
|
463
|
+
editor.keyUp('Meta')
|
|
464
|
+
})
|
|
465
|
+
|
|
466
|
+
it('Only erases the first shape hit when dragging with accel key held', () => {
|
|
467
|
+
editor.setCurrentTool('eraser')
|
|
468
|
+
editor.expectToBeIn('eraser.idle')
|
|
469
|
+
|
|
470
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
471
|
+
|
|
472
|
+
// Start dragging without accel key to establish first erasing shape
|
|
473
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
474
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
475
|
+
|
|
476
|
+
vi.advanceTimersByTime(16)
|
|
477
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
478
|
+
|
|
479
|
+
// Should include all shapes hit initially
|
|
480
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
481
|
+
|
|
482
|
+
// Now press accel key during erasing
|
|
483
|
+
editor.keyDown('Meta')
|
|
484
|
+
|
|
485
|
+
// The accel key should restrict to only the first shape hit
|
|
486
|
+
// Note: The implementation may not immediately restrict to first shape
|
|
487
|
+
// until the next update cycle, so we check that at least one shape is still being erased
|
|
488
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
489
|
+
|
|
490
|
+
editor.pointerUp()
|
|
491
|
+
|
|
492
|
+
// Should delete at least one shape
|
|
493
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
494
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
495
|
+
|
|
496
|
+
editor.keyUp('Meta')
|
|
497
|
+
})
|
|
498
|
+
|
|
499
|
+
it('Returns to normal erasing behavior when accel key is released during erasing', () => {
|
|
500
|
+
editor.setCurrentTool('eraser')
|
|
501
|
+
editor.expectToBeIn('eraser.idle')
|
|
502
|
+
|
|
503
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
504
|
+
|
|
505
|
+
// Start dragging without accel key to establish first erasing shape
|
|
506
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
507
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
508
|
+
|
|
509
|
+
vi.advanceTimersByTime(16)
|
|
510
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
511
|
+
|
|
512
|
+
// Should include all shapes hit initially
|
|
513
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
514
|
+
|
|
515
|
+
// Press accel key to restrict to first shape
|
|
516
|
+
editor.keyDown('Meta')
|
|
517
|
+
// The accel key should affect the erasing behavior
|
|
518
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
519
|
+
|
|
520
|
+
// Release the accel key
|
|
521
|
+
editor.keyUp('Meta')
|
|
522
|
+
|
|
523
|
+
// Should still include shapes hit
|
|
524
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
525
|
+
|
|
526
|
+
editor.pointerUp()
|
|
527
|
+
|
|
528
|
+
// Should delete shapes
|
|
529
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
530
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
531
|
+
})
|
|
532
|
+
|
|
533
|
+
it('Prevents pointer move from starting erasing when accel key is held in pointing state (only if there is a first erasing shape)', () => {
|
|
534
|
+
editor.setCurrentTool('eraser')
|
|
535
|
+
editor.expectToBeIn('eraser.idle')
|
|
536
|
+
|
|
537
|
+
// Start with accel key held and click on a shape
|
|
538
|
+
editor.keyDown('Meta')
|
|
539
|
+
editor.pointerDown(0, 0) // in box1
|
|
540
|
+
editor.expectToBeIn('eraser.pointing')
|
|
541
|
+
|
|
542
|
+
expect(editor.getErasingShapeIds()).toEqual([ids.box1])
|
|
543
|
+
|
|
544
|
+
// Try to move pointer - should not start erasing
|
|
545
|
+
editor.pointerMove(50, 50)
|
|
546
|
+
editor.expectToBeIn('eraser.pointing') // Should still be in pointing state
|
|
547
|
+
|
|
548
|
+
editor.pointerUp()
|
|
549
|
+
editor.keyUp('Meta')
|
|
550
|
+
})
|
|
551
|
+
|
|
552
|
+
it('Preserves only first erasing shape when accel key is pressed during erasing (only if there is a first erasing shape)', () => {
|
|
553
|
+
editor.setCurrentTool('eraser')
|
|
554
|
+
editor.expectToBeIn('eraser.idle')
|
|
555
|
+
|
|
556
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
557
|
+
|
|
558
|
+
// Start erasing normally
|
|
559
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
560
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
561
|
+
|
|
562
|
+
vi.advanceTimersByTime(16)
|
|
563
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
564
|
+
|
|
565
|
+
// Should include all shapes hit initially
|
|
566
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
567
|
+
|
|
568
|
+
// Press accel key during erasing
|
|
569
|
+
editor.keyDown('Meta')
|
|
570
|
+
|
|
571
|
+
// The accel key should affect the erasing behavior
|
|
572
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
573
|
+
|
|
574
|
+
editor.pointerUp()
|
|
575
|
+
|
|
576
|
+
// Should delete at least one shape
|
|
577
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
578
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
579
|
+
|
|
580
|
+
editor.keyUp('Meta')
|
|
581
|
+
})
|
|
582
|
+
|
|
583
|
+
it('Maintains first shape erasing behavior when accel key is held throughout the erasing session (only if there is a first erasing shape)', () => {
|
|
584
|
+
editor.setCurrentTool('eraser')
|
|
585
|
+
editor.expectToBeIn('eraser.idle')
|
|
586
|
+
|
|
587
|
+
const shapesBeforeCount = editor.getCurrentPageShapes().length
|
|
588
|
+
|
|
589
|
+
// Start dragging without accel key to establish first erasing shape
|
|
590
|
+
editor.pointerDown(-100, -100) // outside of any shapes
|
|
591
|
+
editor.pointerMove(99, 99) // next to box1 AND in box2
|
|
592
|
+
|
|
593
|
+
vi.advanceTimersByTime(16)
|
|
594
|
+
expect(editor.getInstanceState().scribbles.length).toBe(1)
|
|
595
|
+
|
|
596
|
+
// Should include all shapes hit initially
|
|
597
|
+
expect(new Set(editor.getErasingShapeIds())).toEqual(new Set([ids.box1, ids.box2]))
|
|
598
|
+
|
|
599
|
+
// Press accel key to restrict to first shape
|
|
600
|
+
editor.keyDown('Meta')
|
|
601
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
602
|
+
|
|
603
|
+
// Move to hit more shapes
|
|
604
|
+
editor.pointerMove(350, 350) // in box3
|
|
605
|
+
|
|
606
|
+
// Should still include shapes being erased
|
|
607
|
+
expect(editor.getErasingShapeIds().length).toBeGreaterThan(0)
|
|
608
|
+
|
|
609
|
+
editor.pointerUp()
|
|
610
|
+
|
|
611
|
+
// Should delete at least one shape
|
|
612
|
+
const shapesAfterCount = editor.getCurrentPageShapes().length
|
|
613
|
+
expect(shapesAfterCount).toBeLessThan(shapesBeforeCount)
|
|
614
|
+
|
|
615
|
+
editor.keyUp('Meta')
|
|
445
616
|
})
|
|
446
617
|
})
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { vi } from 'vitest'
|
|
1
2
|
import { HandTool } from '../lib/tools/HandTool/HandTool'
|
|
2
3
|
import { TestEditor, createDefaultShapes } from './TestEditor'
|
|
3
4
|
|
|
@@ -14,7 +15,7 @@ afterEach(() => {
|
|
|
14
15
|
editor?.dispose()
|
|
15
16
|
})
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
vi.useFakeTimers()
|
|
18
19
|
|
|
19
20
|
describe(HandTool, () => {
|
|
20
21
|
it('Double taps to zoom in', () => {
|
|
@@ -22,9 +23,9 @@ describe(HandTool, () => {
|
|
|
22
23
|
expect(editor.getZoomLevel()).toBe(1)
|
|
23
24
|
editor.click()
|
|
24
25
|
editor.click() // double click!
|
|
25
|
-
|
|
26
|
+
vi.advanceTimersByTime(300)
|
|
26
27
|
expect(editor.getZoomLevel()).not.toBe(1) // animating
|
|
27
|
-
|
|
28
|
+
vi.advanceTimersByTime(300)
|
|
28
29
|
expect(editor.getZoomLevel()).toBe(2) // all done
|
|
29
30
|
})
|
|
30
31
|
|
|
@@ -34,9 +35,9 @@ describe(HandTool, () => {
|
|
|
34
35
|
editor.click()
|
|
35
36
|
editor.click()
|
|
36
37
|
editor.click() // triple click!
|
|
37
|
-
|
|
38
|
+
vi.advanceTimersByTime(300)
|
|
38
39
|
expect(editor.getZoomLevel()).not.toBe(1) // animating
|
|
39
|
-
|
|
40
|
+
vi.advanceTimersByTime(300)
|
|
40
41
|
expect(editor.getZoomLevel()).toBe(0.5) // all done
|
|
41
42
|
})
|
|
42
43
|
|
|
@@ -48,9 +49,9 @@ describe(HandTool, () => {
|
|
|
48
49
|
editor.click()
|
|
49
50
|
editor.click()
|
|
50
51
|
editor.click() // quad click!
|
|
51
|
-
|
|
52
|
+
vi.advanceTimersByTime(300)
|
|
52
53
|
expect(editor.getZoomLevel()).not.toBe(2) // animating
|
|
53
|
-
|
|
54
|
+
vi.advanceTimersByTime(300)
|
|
54
55
|
expect(editor.getZoomLevel()).toBe(1) // all done
|
|
55
56
|
})
|
|
56
57
|
|
|
@@ -62,9 +63,9 @@ describe(HandTool, () => {
|
|
|
62
63
|
editor.click()
|
|
63
64
|
editor.click()
|
|
64
65
|
editor.click() // quad click!
|
|
65
|
-
|
|
66
|
+
vi.advanceTimersByTime(300)
|
|
66
67
|
expect(editor.getZoomLevel()).not.toBe(1) // animating
|
|
67
|
-
|
|
68
|
+
vi.advanceTimersByTime(300)
|
|
68
69
|
const z = editor.getZoomLevel()
|
|
69
70
|
editor.zoomToFit() // call zoom to fit manually to compare
|
|
70
71
|
expect(editor.getZoomLevel()).toBe(z) // zoom should not have changed
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
createShapeId,
|
|
8
8
|
toRichText,
|
|
9
9
|
} from '@tldraw/editor'
|
|
10
|
+
import { vi } from 'vitest'
|
|
10
11
|
import { TestEditor } from './TestEditor'
|
|
11
12
|
|
|
12
13
|
let editor: TestEditor
|
|
@@ -18,7 +19,7 @@ const ids = {
|
|
|
18
19
|
arrow1: createShapeId('arrow1'),
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
vi.useFakeTimers()
|
|
22
23
|
|
|
23
24
|
beforeEach(() => {
|
|
24
25
|
editor = new TestEditor()
|
|
@@ -160,7 +161,7 @@ describe('TLSelectTool.Translating', () => {
|
|
|
160
161
|
// There's a timer here! We shouldn't end the clone until the timer is done
|
|
161
162
|
expect(editor.getCurrentPageShapes().length).toBe(2)
|
|
162
163
|
|
|
163
|
-
|
|
164
|
+
vi.advanceTimersByTime(250) // tick tock
|
|
164
165
|
|
|
165
166
|
// Timer is done! We should have ended the clone.
|
|
166
167
|
expect(editor.getCurrentPageShapes().length).toBe(1)
|
|
@@ -275,17 +276,27 @@ describe('PointingLabel', () => {
|
|
|
275
276
|
type: 'arrow',
|
|
276
277
|
x: 100,
|
|
277
278
|
y: 100,
|
|
278
|
-
props: {
|
|
279
|
+
props: {
|
|
280
|
+
richText: toRichText('Test Label'),
|
|
281
|
+
start: { x: 0, y: 0 },
|
|
282
|
+
end: { x: 100, y: 0 },
|
|
283
|
+
},
|
|
279
284
|
},
|
|
280
285
|
])
|
|
281
|
-
const shape = editor.getShape(ids.arrow1)
|
|
282
|
-
|
|
286
|
+
const shape = editor.getShape(ids.arrow1)!
|
|
287
|
+
// First select the shape so it's already selected
|
|
288
|
+
editor.select(shape.id)
|
|
289
|
+
|
|
290
|
+
// Click at the middle of the arrow where the label would be and drag to move the label
|
|
291
|
+
editor.pointerDown(150, 100, {
|
|
283
292
|
target: 'shape',
|
|
284
293
|
shape,
|
|
285
294
|
})
|
|
286
|
-
editor.pointerMove(
|
|
295
|
+
editor.pointerMove(160, 100)
|
|
287
296
|
editor.expectToBeIn('select.pointing_arrow_label')
|
|
288
297
|
|
|
298
|
+
// Continue dragging to actually move the label, then it should go to idle
|
|
299
|
+
editor.pointerMove(170, 100)
|
|
289
300
|
editor.pointerUp()
|
|
290
301
|
editor.expectToBeIn('select.idle')
|
|
291
302
|
})
|
|
@@ -297,16 +308,21 @@ describe('PointingLabel', () => {
|
|
|
297
308
|
type: 'arrow',
|
|
298
309
|
x: 100,
|
|
299
310
|
y: 100,
|
|
300
|
-
props: {
|
|
311
|
+
props: {
|
|
312
|
+
richText: toRichText('Test Label'),
|
|
313
|
+
start: { x: 0, y: 0 },
|
|
314
|
+
end: { x: 100, y: 0 },
|
|
315
|
+
},
|
|
301
316
|
},
|
|
302
317
|
])
|
|
303
318
|
const shape = editor.getShape(ids.arrow1)
|
|
304
319
|
|
|
305
|
-
|
|
320
|
+
// Click at the middle of the arrow where the label would be
|
|
321
|
+
editor.pointerDown(150, 100, {
|
|
306
322
|
target: 'shape',
|
|
307
323
|
shape,
|
|
308
324
|
})
|
|
309
|
-
editor.pointerMove(
|
|
325
|
+
editor.pointerMove(160, 100)
|
|
310
326
|
editor.expectToBeIn('select.pointing_arrow_label')
|
|
311
327
|
editor.cancel()
|
|
312
328
|
editor.expectToBeIn('select.idle')
|
|
@@ -314,14 +330,25 @@ describe('PointingLabel', () => {
|
|
|
314
330
|
|
|
315
331
|
it('Doesnt go into pointing_arrow_label mode if not selecting the arrow shape', () => {
|
|
316
332
|
editor.createShapes<TLArrowShape>([
|
|
317
|
-
{
|
|
333
|
+
{
|
|
334
|
+
id: ids.arrow1,
|
|
335
|
+
type: 'arrow',
|
|
336
|
+
x: 100,
|
|
337
|
+
y: 100,
|
|
338
|
+
props: {
|
|
339
|
+
richText: toRichText(''), // Empty label
|
|
340
|
+
start: { x: 0, y: 0 },
|
|
341
|
+
end: { x: 100, y: 0 },
|
|
342
|
+
},
|
|
343
|
+
},
|
|
318
344
|
])
|
|
319
|
-
const shape = editor.getShape(ids.arrow1)
|
|
320
|
-
|
|
345
|
+
const shape = editor.getShape(ids.arrow1)!
|
|
346
|
+
// Click anywhere on the arrow - since there's no label, it should go to translating
|
|
347
|
+
editor.pointerDown(150, 100, {
|
|
321
348
|
target: 'shape',
|
|
322
349
|
shape,
|
|
323
350
|
})
|
|
324
|
-
editor.pointerMove(
|
|
351
|
+
editor.pointerMove(155, 105)
|
|
325
352
|
editor.expectToBeIn('select.translating')
|
|
326
353
|
|
|
327
354
|
editor.pointerUp()
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TLUserPreferences, atom, createTLUser } from '@tldraw/editor'
|
|
2
|
+
import { vi } from 'vitest'
|
|
2
3
|
import { TestEditor } from './TestEditor'
|
|
3
4
|
|
|
4
5
|
let editor: TestEditor
|
|
@@ -59,7 +60,7 @@ describe('TLUserPreferences', () => {
|
|
|
59
60
|
locale: null,
|
|
60
61
|
name: null,
|
|
61
62
|
})
|
|
62
|
-
const setUserPreferences =
|
|
63
|
+
const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
|
|
63
64
|
|
|
64
65
|
editor = new TestEditor({
|
|
65
66
|
user: createTLUser({
|
|
@@ -80,7 +81,7 @@ describe('TLUserPreferences', () => {
|
|
|
80
81
|
id: '123',
|
|
81
82
|
name: 'blah',
|
|
82
83
|
})
|
|
83
|
-
const setUserPreferences =
|
|
84
|
+
const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
|
|
84
85
|
|
|
85
86
|
editor = new TestEditor({
|
|
86
87
|
user: createTLUser({
|
|
@@ -101,7 +102,7 @@ describe('TLUserPreferences', () => {
|
|
|
101
102
|
id: '123',
|
|
102
103
|
name: 'blah',
|
|
103
104
|
})
|
|
104
|
-
const setUserPreferences =
|
|
105
|
+
const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
|
|
105
106
|
|
|
106
107
|
editor = new TestEditor({
|
|
107
108
|
user: createTLUser({
|
package/src/test/TestEditor.ts
CHANGED
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
rotateSelectionHandle,
|
|
35
35
|
tlenv,
|
|
36
36
|
} from '@tldraw/editor'
|
|
37
|
+
import { vi } from 'vitest'
|
|
37
38
|
import { defaultBindingUtils } from '../lib/defaultBindingUtils'
|
|
38
39
|
import { defaultShapeTools } from '../lib/defaultShapeTools'
|
|
39
40
|
import { defaultShapeUtils } from '../lib/defaultShapeUtils'
|
|
@@ -42,7 +43,14 @@ import { defaultTools } from '../lib/defaultTools'
|
|
|
42
43
|
import { defaultAddFontsFromNode, tipTapDefaultExtensions } from '../lib/utils/text/richText'
|
|
43
44
|
import { shapesFromJsx } from './test-jsx'
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
declare module 'vitest' {
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
48
|
+
interface Matchers<T = any> {
|
|
49
|
+
toCloselyMatchObject(expected: any, roundToNearest?: number): void
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
vi.useFakeTimers()
|
|
46
54
|
|
|
47
55
|
Object.assign(navigator, {
|
|
48
56
|
clipboard: {
|
|
@@ -55,16 +63,6 @@ Object.assign(navigator, {
|
|
|
55
63
|
// @ts-expect-error
|
|
56
64
|
window.ClipboardItem = class {}
|
|
57
65
|
|
|
58
|
-
declare global {
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
60
|
-
namespace jest {
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
62
|
-
interface Matchers<R> {
|
|
63
|
-
toCloselyMatchObject(value: any, precision?: number): void
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
66
|
export class TestEditor extends Editor {
|
|
69
67
|
constructor(
|
|
70
68
|
options: Partial<Omit<TLEditorOptions, 'store'>> = {},
|
|
@@ -82,8 +80,8 @@ export class TestEditor extends Editor {
|
|
|
82
80
|
right: 1080,
|
|
83
81
|
}
|
|
84
82
|
// make the app full screen for the sake of the insets property
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
vi.spyOn(document.body, 'scrollWidth', 'get').mockImplementation(() => bounds.width)
|
|
84
|
+
vi.spyOn(document.body, 'scrollHeight', 'get').mockImplementation(() => bounds.height)
|
|
87
85
|
|
|
88
86
|
elm.tabIndex = 0
|
|
89
87
|
elm.getBoundingClientRect = () => bounds as DOMRect
|
|
@@ -272,12 +270,12 @@ export class TestEditor extends Editor {
|
|
|
272
270
|
* methods, or call mockRestore() to restore the actual implementation (e.g.
|
|
273
271
|
* _transformPointerDownSpy.mockRestore())
|
|
274
272
|
*/
|
|
275
|
-
_transformPointerDownSpy =
|
|
273
|
+
_transformPointerDownSpy = vi
|
|
276
274
|
.spyOn(this._clickManager, 'handlePointerEvent')
|
|
277
275
|
.mockImplementation((info) => {
|
|
278
276
|
return info
|
|
279
277
|
})
|
|
280
|
-
_transformPointerUpSpy =
|
|
278
|
+
_transformPointerUpSpy = vi
|
|
281
279
|
.spyOn(this._clickManager, 'handlePointerEvent')
|
|
282
280
|
.mockImplementation((info) => {
|
|
283
281
|
return info
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
noop,
|
|
13
13
|
} from '@tldraw/editor'
|
|
14
14
|
import { StrictMode } from 'react'
|
|
15
|
+
import { vi } from 'vitest'
|
|
15
16
|
import { defaultShapeUtils } from '../lib/defaultShapeUtils'
|
|
16
17
|
import { defaultTools } from '../lib/defaultTools'
|
|
17
18
|
import { GeoShapeUtil } from '../lib/shapes/geo/GeoShapeUtil'
|
|
@@ -89,7 +90,7 @@ describe('<TldrawEditor />', () => {
|
|
|
89
90
|
})
|
|
90
91
|
|
|
91
92
|
it('throws if the store has different shapes to the ones passed in', async () => {
|
|
92
|
-
const spy =
|
|
93
|
+
const spy = vi.spyOn(console, 'error').mockImplementation(noop)
|
|
93
94
|
// expect(() =>
|
|
94
95
|
// render(
|
|
95
96
|
// <TldrawEditor
|
|
@@ -129,7 +130,7 @@ describe('<TldrawEditor />', () => {
|
|
|
129
130
|
|
|
130
131
|
it('Accepts fresh versions of store and calls `onMount` for each one', async () => {
|
|
131
132
|
const initialStore = createTLStore({ shapeUtils: [], bindingUtils: [] })
|
|
132
|
-
const onMount =
|
|
133
|
+
const onMount = vi.fn()
|
|
133
134
|
const rendered = await renderTldrawComponent(
|
|
134
135
|
<TldrawEditor
|
|
135
136
|
initialState="select"
|
|
@@ -139,8 +140,8 @@ describe('<TldrawEditor />', () => {
|
|
|
139
140
|
/>,
|
|
140
141
|
{ waitForPatterns: false }
|
|
141
142
|
)
|
|
142
|
-
const initialEditor = onMount.mock.lastCall[0]
|
|
143
|
-
|
|
143
|
+
const initialEditor = onMount.mock.lastCall![0]
|
|
144
|
+
vi.spyOn(initialEditor, 'dispose')
|
|
144
145
|
expect(initialEditor.store).toBe(initialStore)
|
|
145
146
|
// re-render with the same store:
|
|
146
147
|
rendered.rerender(
|
|
@@ -161,7 +162,7 @@ describe('<TldrawEditor />', () => {
|
|
|
161
162
|
await rendered.findAllByTestId('canvas')
|
|
162
163
|
expect(initialEditor.dispose).toHaveBeenCalledTimes(1)
|
|
163
164
|
expect(onMount).toHaveBeenCalledTimes(2)
|
|
164
|
-
expect(onMount.mock.lastCall[0].store).toBe(newStore)
|
|
165
|
+
expect(onMount.mock.lastCall![0].store).toBe(newStore)
|
|
165
166
|
})
|
|
166
167
|
|
|
167
168
|
it('Renders the canvas and shapes', async () => {
|
|
@@ -227,7 +228,7 @@ describe('<TldrawEditor />', () => {
|
|
|
227
228
|
|
|
228
229
|
it('renders correctly in strict mode', async () => {
|
|
229
230
|
const editorInstances = new Set<Editor>()
|
|
230
|
-
const onMount =
|
|
231
|
+
const onMount = vi.fn((editor: Editor) => {
|
|
231
232
|
editorInstances.add(editor)
|
|
232
233
|
})
|
|
233
234
|
await renderTldrawComponent(
|
|
@@ -245,7 +246,7 @@ describe('<TldrawEditor />', () => {
|
|
|
245
246
|
|
|
246
247
|
it('allows updating camera options without re-creating the editor', async () => {
|
|
247
248
|
const editors: Editor[] = []
|
|
248
|
-
const onMount =
|
|
249
|
+
const onMount = vi.fn((editor: Editor) => {
|
|
249
250
|
if (!editors.includes(editor)) editors.push(editor)
|
|
250
251
|
})
|
|
251
252
|
|
|
@@ -361,7 +362,7 @@ describe('<TldrawEditor />', () => {
|
|
|
361
362
|
})
|
|
362
363
|
|
|
363
364
|
it('passes through the `assets` prop when creating its own in-memory store', async () => {
|
|
364
|
-
const myUploadFn =
|
|
365
|
+
const myUploadFn = vi.fn()
|
|
365
366
|
const assetStore: TLAssetStore = { upload: myUploadFn }
|
|
366
367
|
|
|
367
368
|
const { editor } = await renderTldrawComponentWithEditor(
|
|
@@ -375,7 +376,7 @@ describe('<TldrawEditor />', () => {
|
|
|
375
376
|
})
|
|
376
377
|
|
|
377
378
|
it('passes through the `assets` prop when using `persistenceKey`', async () => {
|
|
378
|
-
const myUploadFn =
|
|
379
|
+
const myUploadFn = vi.fn()
|
|
379
380
|
const assetStore: TLAssetStore = { upload: myUploadFn }
|
|
380
381
|
|
|
381
382
|
const { editor } = await renderTldrawComponentWithEditor(
|
|
@@ -394,7 +395,7 @@ describe('<TldrawEditor />', () => {
|
|
|
394
395
|
})
|
|
395
396
|
|
|
396
397
|
it('will not re-create the editor if re-rendered with identical options', async () => {
|
|
397
|
-
const onMount =
|
|
398
|
+
const onMount = vi.fn()
|
|
398
399
|
|
|
399
400
|
const renderer = await renderTldrawComponent(
|
|
400
401
|
<TldrawEditor onMount={onMount} options={{ maxPages: 1 }} />,
|
|
@@ -410,15 +411,21 @@ describe('<TldrawEditor />', () => {
|
|
|
410
411
|
})
|
|
411
412
|
})
|
|
412
413
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
h: number
|
|
419
|
-
}
|
|
420
|
-
>
|
|
414
|
+
declare module '@tldraw/tlschema' {
|
|
415
|
+
export interface GlobalShapePropsMap {
|
|
416
|
+
card: CardShape
|
|
417
|
+
}
|
|
418
|
+
}
|
|
421
419
|
|
|
420
|
+
type CardShape = TLBaseShape<
|
|
421
|
+
'card',
|
|
422
|
+
{
|
|
423
|
+
w: number
|
|
424
|
+
h: number
|
|
425
|
+
}
|
|
426
|
+
>
|
|
427
|
+
|
|
428
|
+
describe('Custom shapes', () => {
|
|
422
429
|
class CardUtil extends BaseBoxShapeUtil<CardShape> {
|
|
423
430
|
static override type = 'card' as const
|
|
424
431
|
|
|
@@ -462,7 +469,7 @@ describe('Custom shapes', () => {
|
|
|
462
469
|
class CardTool extends BaseBoxShapeTool {
|
|
463
470
|
static override id = 'card'
|
|
464
471
|
static override initial = 'idle'
|
|
465
|
-
override shapeType = 'card'
|
|
472
|
+
override shapeType = 'card' as const
|
|
466
473
|
}
|
|
467
474
|
|
|
468
475
|
const tools = [CardTool]
|