tldraw 4.3.0-canary.e5f56251a468 → 4.3.0-canary.ea88b223b83a
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 +297 -237
- package/dist-cjs/index.js +13 -5
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
- package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
- package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/defaultSideEffects.js +6 -1
- package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
- package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
- package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
- package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
- package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
- package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
- package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
- package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
- package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +9 -7
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +7 -5
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
- package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
- package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
- package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
- package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
- package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
- package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
- package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
- package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
- package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
- package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
- package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
- package/dist-cjs/lib/ui/components/menu-items.js +3 -1
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +2 -3
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +6 -6
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +1 -2
- package/dist-cjs/lib/ui/context/components.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -6
- package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
- package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
- package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
- package/dist-cjs/lib/utils/text/richText.js +11 -19
- package/dist-cjs/lib/utils/text/richText.js.map +3 -3
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +297 -237
- package/dist-esm/index.mjs +14 -5
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
- package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/defaultSideEffects.mjs +6 -1
- package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
- package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
- package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
- package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +2 -4
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
- package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
- package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
- package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +9 -7
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +7 -5
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
- package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -15
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
- package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
- package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
- package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
- package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
- package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
- package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
- package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
- package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
- package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
- package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
- package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
- package/dist-esm/lib/ui/components/menu-items.mjs +3 -1
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +3 -4
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +6 -6
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +1 -2
- package/dist-esm/lib/ui/context/components.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +9 -6
- package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
- package/dist-esm/lib/utils/test-helpers.mjs +21 -0
- package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
- package/dist-esm/lib/utils/text/richText.mjs +8 -5
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +18 -16
- package/src/index.ts +6 -2
- package/src/lib/Tldraw.test.tsx +46 -1
- package/src/lib/canvas/TldrawSelectionForeground.tsx +2 -2
- package/src/lib/defaultEmbedDefinitions.ts +2 -1
- package/src/lib/defaultExternalContentHandlers.ts +10 -10
- package/src/lib/defaultSideEffects.ts +6 -1
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +15 -15
- package/src/lib/shapes/arrow/arrow-types.ts +2 -0
- package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
- package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
- package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
- package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
- package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
- package/src/lib/shapes/draw/getPath.ts +31 -10
- package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
- package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
- package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
- package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
- package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
- package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
- package/src/lib/shapes/note/noteCloning.test.ts +3 -1
- package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
- package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
- package/src/lib/shapes/shared/PlainTextLabel.tsx +10 -1
- package/src/lib/shapes/shared/RichTextLabel.tsx +12 -3
- package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
- package/src/lib/shapes/shared/interpolate-props.ts +4 -4
- package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
- package/src/lib/shapes/text/RichTextArea.tsx +5 -0
- package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
- package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
- package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
- package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
- package/src/lib/tools/HandTool/HandTool.ts +3 -5
- package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
- package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
- package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
- package/src/lib/tools/SelectTool/DragAndDropManager.ts +12 -7
- package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
- package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
- package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +7 -5
- package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
- package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
- package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
- package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
- package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
- package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
- package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
- package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
- package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
- package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
- package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
- package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
- package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
- package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
- package/src/lib/ui/TldrawUi.tsx +5 -2
- package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
- package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
- package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
- package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
- package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
- package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
- package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
- package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
- package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
- package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
- package/src/lib/ui/components/menu-items.tsx +3 -1
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +2 -3
- package/src/lib/ui/context/actions.tsx +6 -6
- package/src/lib/ui/context/components.tsx +1 -2
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
- package/src/lib/ui/hooks/useTools.tsx +4 -5
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +27 -23
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
- package/src/lib/utils/excalidraw/putExcalidrawContent.ts +11 -6
- package/src/lib/utils/test-helpers.ts +60 -0
- package/src/lib/utils/text/richText.ts +9 -8
- package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
- package/src/test/Editor.test.tsx +40 -29
- package/src/test/EraserTool.test.ts +10 -12
- package/src/test/TestEditor.ts +48 -47
- package/src/test/TldrawEditor.test.tsx +6 -4
- package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
- package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
- package/src/test/arrows-megabus.test.tsx +1 -1
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
- package/src/test/commands/cameraState.test.ts +299 -0
- package/src/test/commands/putContent.test.ts +79 -1
- package/src/test/commands/setCamera.test.ts +13 -11
- package/src/test/commands/stackShapes.test.ts +34 -8
- package/src/test/commands/zoomToBounds.test.ts +19 -3
- package/src/test/commands/zoomToSelection.test.ts +14 -3
- package/src/test/custom-clipping.test.ts +16 -9
- package/src/test/drawing.test.ts +17 -10
- package/src/test/flipShapes.test.ts +33 -0
- package/src/test/frames.test.ts +92 -0
- package/src/test/groups.test.tsx +1 -1
- package/src/test/modifiers.test.ts +6 -6
- package/src/test/resizing.test.ts +7 -9
- package/src/test/selection-omnibus.test.ts +2 -2
- package/src/test/spacebarPanning.test.ts +28 -10
- package/src/test/test-jsx.tsx +3 -0
- package/tldraw.css +41 -35
- package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
- package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
- package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
- package/dist-cjs/lib/utils/text/textDirection.js +0 -51
- package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
- package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
- package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
- package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
- package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
- package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
- package/src/lib/shapes/shared/useForceSolid.ts +0 -6
- package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
- package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
- package/src/lib/utils/text/textDirection.ts +0 -32
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
TLResizeInfo,
|
|
16
16
|
TLShapeUtilCanvasSvgDef,
|
|
17
17
|
Vec,
|
|
18
|
+
WeakCache,
|
|
18
19
|
exhaustiveSwitchError,
|
|
19
20
|
geoShapeMigrations,
|
|
20
21
|
geoShapeProps,
|
|
@@ -43,6 +44,7 @@ import {
|
|
|
43
44
|
import { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'
|
|
44
45
|
import { useDefaultColorTheme } from '../shared/useDefaultColorTheme'
|
|
45
46
|
import { useIsReadyForEditing } from '../shared/useEditablePlainText'
|
|
47
|
+
import { useEfficientZoomThreshold } from '../shared/useEfficientZoomThreshold'
|
|
46
48
|
import { GeoShapeBody } from './components/GeoShapeBody'
|
|
47
49
|
import { getGeoShapePath } from './getGeoShapePath'
|
|
48
50
|
|
|
@@ -54,6 +56,10 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
54
56
|
static override props = geoShapeProps
|
|
55
57
|
static override migrations = geoShapeMigrations
|
|
56
58
|
|
|
59
|
+
override options = {
|
|
60
|
+
showTextOutline: true,
|
|
61
|
+
}
|
|
62
|
+
|
|
57
63
|
override canEdit() {
|
|
58
64
|
return true
|
|
59
65
|
}
|
|
@@ -81,53 +87,40 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
81
87
|
}
|
|
82
88
|
|
|
83
89
|
override getGeometry(shape: TLGeoShape) {
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
90
|
+
const { props } = shape
|
|
91
|
+
const { scale } = props
|
|
87
92
|
const path = getGeoShapePath(shape)
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
LABEL_FONT_SIZES[shape.props.size] * TEXT_PROPS.lineHeight + LABEL_PADDING * 2,
|
|
95
|
-
unscaledH / 2
|
|
96
|
-
)
|
|
93
|
+
const pathGeometry = path.toGeometry()
|
|
94
|
+
|
|
95
|
+
const scaledW = Math.max(1, props.w)
|
|
96
|
+
const scaledH = Math.max(1, props.h + props.growY)
|
|
97
|
+
const unscaledW = scaledW / scale
|
|
98
|
+
const unscaledH = scaledH / scale
|
|
97
99
|
|
|
98
|
-
const
|
|
100
|
+
const isEmptyLabel = isEmptyRichText(props.richText)
|
|
101
|
+
const unscaledLabelSize = isEmptyLabel
|
|
102
|
+
? EMPTY_LABEL_SIZE
|
|
103
|
+
: getUnscaledLabelSize(this.editor, shape)
|
|
104
|
+
|
|
105
|
+
const labelBounds = getLabelBounds(
|
|
99
106
|
unscaledW,
|
|
100
|
-
Math.max(unscaledlabelSize.w, Math.min(unscaledminWidth, Math.max(1, unscaledW - 8)))
|
|
101
|
-
)
|
|
102
|
-
const unscaledLabelHeight = Math.min(
|
|
103
107
|
unscaledH,
|
|
104
|
-
|
|
108
|
+
unscaledLabelSize,
|
|
109
|
+
props.size,
|
|
110
|
+
props.align,
|
|
111
|
+
props.verticalAlign,
|
|
112
|
+
scale
|
|
105
113
|
)
|
|
106
114
|
|
|
107
|
-
// todo: use centroid for label position
|
|
108
|
-
|
|
109
115
|
return new Group2d({
|
|
110
116
|
children: [
|
|
111
|
-
|
|
117
|
+
pathGeometry,
|
|
112
118
|
new Rectangle2d({
|
|
113
|
-
|
|
114
|
-
shape.props.align === 'start'
|
|
115
|
-
? 0
|
|
116
|
-
: shape.props.align === 'end'
|
|
117
|
-
? (unscaledW - unscaledLabelWidth) * shape.props.scale
|
|
118
|
-
: ((unscaledW - unscaledLabelWidth) / 2) * shape.props.scale,
|
|
119
|
-
y:
|
|
120
|
-
shape.props.verticalAlign === 'start'
|
|
121
|
-
? 0
|
|
122
|
-
: shape.props.verticalAlign === 'end'
|
|
123
|
-
? (unscaledH - unscaledLabelHeight) * shape.props.scale
|
|
124
|
-
: ((unscaledH - unscaledLabelHeight) / 2) * shape.props.scale,
|
|
125
|
-
width: unscaledLabelWidth * shape.props.scale,
|
|
126
|
-
height: unscaledLabelHeight * shape.props.scale,
|
|
119
|
+
...labelBounds,
|
|
127
120
|
isFilled: true,
|
|
128
121
|
isLabel: true,
|
|
129
122
|
excludeFromShapeBounds: true,
|
|
130
|
-
isEmptyLabel:
|
|
123
|
+
isEmptyLabel: isEmptyLabel,
|
|
131
124
|
}),
|
|
132
125
|
],
|
|
133
126
|
})
|
|
@@ -195,7 +188,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
195
188
|
const isReadyForEditing = useIsReadyForEditing(editor, shape.id)
|
|
196
189
|
const isEmpty = isEmptyRichText(shape.props.richText)
|
|
197
190
|
const showHtmlContainer = isReadyForEditing || !isEmpty
|
|
198
|
-
const isForceSolid =
|
|
191
|
+
const isForceSolid = useEfficientZoomThreshold(shape.props.scale * 0.25)
|
|
199
192
|
|
|
200
193
|
return (
|
|
201
194
|
<>
|
|
@@ -224,6 +217,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
224
217
|
isSelected={isOnlySelected}
|
|
225
218
|
labelColor={getColorValue(theme, props.labelColor, 'solid')}
|
|
226
219
|
wrap
|
|
220
|
+
showTextOutline={this.options.showTextOutline}
|
|
227
221
|
/>
|
|
228
222
|
</HTMLContainer>
|
|
229
223
|
)}
|
|
@@ -233,9 +227,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
233
227
|
}
|
|
234
228
|
|
|
235
229
|
indicator(shape: TLGeoShape) {
|
|
236
|
-
const isZoomedOut =
|
|
237
|
-
this.editor,
|
|
238
|
-
])
|
|
230
|
+
const isZoomedOut = useEfficientZoomThreshold(shape.props.scale * 0.25)
|
|
239
231
|
|
|
240
232
|
const { size, dash, scale } = shape.props
|
|
241
233
|
const strokeWidth = STROKE_SIZES[size]
|
|
@@ -283,6 +275,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
283
275
|
labelColor={getColorValue(theme, props.labelColor, 'solid')}
|
|
284
276
|
bounds={bounds}
|
|
285
277
|
padding={LABEL_PADDING}
|
|
278
|
+
showTextOutline={this.options.showTextOutline}
|
|
286
279
|
/>
|
|
287
280
|
)
|
|
288
281
|
}
|
|
@@ -303,41 +296,32 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
303
296
|
shape: TLGeoShape,
|
|
304
297
|
{ handle, newPoint, scaleX, scaleY, initialShape }: TLResizeInfo<TLGeoShape>
|
|
305
298
|
) {
|
|
306
|
-
const
|
|
307
|
-
const unscaledInitialH = initialShape.props.h / initialShape.props.scale
|
|
308
|
-
const unscaledGrowY = initialShape.props.growY / initialShape.props.scale
|
|
299
|
+
const unscaledInitial = getUnscaledGeoProps(initialShape.props)
|
|
309
300
|
// use the w/h from props here instead of the initialBounds here,
|
|
310
301
|
// since cloud shapes calculated bounds can differ from the props w/h.
|
|
311
|
-
let unscaledW =
|
|
312
|
-
let unscaledH = (
|
|
302
|
+
let unscaledW = unscaledInitial.w * scaleX
|
|
303
|
+
let unscaledH = (unscaledInitial.h + unscaledInitial.growY) * scaleY
|
|
313
304
|
let overShrinkX = 0
|
|
314
305
|
let overShrinkY = 0
|
|
315
306
|
|
|
316
|
-
const min = MIN_SIZE_WITH_LABEL
|
|
317
|
-
|
|
318
307
|
if (!isEmptyRichText(shape.props.richText)) {
|
|
319
|
-
|
|
320
|
-
|
|
308
|
+
// Use initialShape for label measurement to hit the cache.
|
|
309
|
+
// Creating a temp shape with new dimensions would break WeakCache and cause
|
|
310
|
+
// expensive measurements on every resize frame.
|
|
311
|
+
const unscaledLabelSize = getUnscaledLabelSize(this.editor, initialShape)
|
|
321
312
|
|
|
322
|
-
|
|
323
|
-
|
|
313
|
+
const absUnscaledW = Math.abs(unscaledW)
|
|
314
|
+
const absUnscaledH = Math.abs(unscaledH)
|
|
324
315
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
...shape.props,
|
|
329
|
-
w: newW * shape.props.scale,
|
|
330
|
-
h: newH * shape.props.scale,
|
|
331
|
-
},
|
|
332
|
-
})
|
|
316
|
+
// Constrain to label size (primary constraint) and min size with label (secondary)
|
|
317
|
+
const constrainedW = Math.max(absUnscaledW, unscaledLabelSize.w, MIN_SIZE_WITH_LABEL)
|
|
318
|
+
const constrainedH = Math.max(absUnscaledH, unscaledLabelSize.h, MIN_SIZE_WITH_LABEL)
|
|
333
319
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
overShrinkX = Math.abs(nextW) - Math.abs(unscaledW)
|
|
337
|
-
overShrinkY = Math.abs(nextH) - Math.abs(unscaledH)
|
|
320
|
+
overShrinkX = constrainedW - absUnscaledW
|
|
321
|
+
overShrinkY = constrainedH - absUnscaledH
|
|
338
322
|
|
|
339
|
-
unscaledW =
|
|
340
|
-
unscaledH =
|
|
323
|
+
unscaledW = constrainedW * Math.sign(unscaledW || 1)
|
|
324
|
+
unscaledH = constrainedH * Math.sign(unscaledH || 1)
|
|
341
325
|
}
|
|
342
326
|
|
|
343
327
|
const scaledW = unscaledW * shape.props.scale
|
|
@@ -379,147 +363,93 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
379
363
|
}
|
|
380
364
|
|
|
381
365
|
override onBeforeCreate(shape: TLGeoShape) {
|
|
382
|
-
|
|
383
|
-
if (shape.props.growY) {
|
|
384
|
-
// No text / some growY, set growY to 0
|
|
385
|
-
return {
|
|
386
|
-
...shape,
|
|
387
|
-
props: {
|
|
388
|
-
...shape.props,
|
|
389
|
-
growY: 0,
|
|
390
|
-
},
|
|
391
|
-
}
|
|
392
|
-
} else {
|
|
393
|
-
// No text / no growY, nothing to change
|
|
394
|
-
return
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const unscaledPrevHeight = shape.props.h / shape.props.scale
|
|
399
|
-
const unscaledNextHeight = getUnscaledLabelSize(this.editor, shape).h
|
|
400
|
-
|
|
401
|
-
let growY: number | null = null
|
|
366
|
+
const { props } = shape
|
|
402
367
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
if (shape.props.growY) {
|
|
407
|
-
growY = 0
|
|
408
|
-
}
|
|
368
|
+
// No text - ensure growY is 0
|
|
369
|
+
if (isEmptyRichText(props.richText)) {
|
|
370
|
+
return props.growY !== 0 ? { ...shape, props: { ...props, growY: 0 } } : undefined
|
|
409
371
|
}
|
|
410
372
|
|
|
411
|
-
|
|
373
|
+
// Has text - calculate growY needed to fit label
|
|
374
|
+
const unscaledShapeH = props.h / props.scale
|
|
375
|
+
const unscaledLabelH = getUnscaledLabelSize(this.editor, shape).h
|
|
376
|
+
const unscaledGrowY = calculateGrowY(unscaledShapeH, unscaledLabelH, props.growY / props.scale)
|
|
377
|
+
|
|
378
|
+
if (unscaledGrowY !== null) {
|
|
412
379
|
return {
|
|
413
380
|
...shape,
|
|
414
|
-
props: {
|
|
415
|
-
...shape.props,
|
|
416
|
-
// scale the growY
|
|
417
|
-
growY: growY * shape.props.scale,
|
|
418
|
-
},
|
|
381
|
+
props: { ...props, growY: unscaledGrowY * props.scale },
|
|
419
382
|
}
|
|
420
383
|
}
|
|
421
384
|
}
|
|
422
385
|
|
|
423
386
|
override onBeforeUpdate(prev: TLGeoShape, next: TLGeoShape) {
|
|
424
|
-
|
|
387
|
+
const { props: prevProps } = prev
|
|
388
|
+
const { props: nextProps } = next
|
|
389
|
+
|
|
390
|
+
// No change to text, font, or size - no update needed
|
|
425
391
|
if (
|
|
426
|
-
isEqual(
|
|
427
|
-
|
|
428
|
-
|
|
392
|
+
isEqual(prevProps.richText, nextProps.richText) &&
|
|
393
|
+
prevProps.font === nextProps.font &&
|
|
394
|
+
prevProps.size === nextProps.size
|
|
429
395
|
) {
|
|
430
396
|
return
|
|
431
397
|
}
|
|
432
398
|
|
|
433
|
-
|
|
434
|
-
const
|
|
435
|
-
const isEmpty = isEmptyRichText(next.props.richText)
|
|
436
|
-
if (!wasEmpty && isEmpty) {
|
|
437
|
-
return {
|
|
438
|
-
...next,
|
|
439
|
-
props: {
|
|
440
|
-
...next.props,
|
|
441
|
-
growY: 0,
|
|
442
|
-
},
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// Get the prev width and height in unscaled values
|
|
447
|
-
const unscaledPrevWidth = prev.props.w / prev.props.scale
|
|
448
|
-
const unscaledPrevHeight = prev.props.h / prev.props.scale
|
|
449
|
-
const unscaledPrevGrowY = prev.props.growY / prev.props.scale
|
|
450
|
-
|
|
451
|
-
// Get the next width and height in unscaled values
|
|
452
|
-
const unscaledNextLabelSize = getUnscaledLabelSize(this.editor, next)
|
|
399
|
+
const wasEmpty = isEmptyRichText(prevProps.richText)
|
|
400
|
+
const isEmpty = isEmptyRichText(nextProps.richText)
|
|
453
401
|
|
|
454
|
-
//
|
|
455
|
-
if (wasEmpty &&
|
|
456
|
-
|
|
457
|
-
|
|
402
|
+
// If label is empty and used to be empty, skip label measurement and dimension adjustment
|
|
403
|
+
if (wasEmpty && isEmpty) {
|
|
404
|
+
return
|
|
405
|
+
}
|
|
458
406
|
|
|
459
|
-
|
|
407
|
+
// Text was removed - reset growY
|
|
408
|
+
if (isEmpty) {
|
|
409
|
+
return nextProps.growY !== 0 ? { ...next, props: { ...nextProps, growY: 0 } } : undefined
|
|
410
|
+
}
|
|
460
411
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
unscaledH = Math.max(unscaledH, min)
|
|
465
|
-
unscaledW = Math.max(unscaledW, unscaledH)
|
|
466
|
-
unscaledH = Math.max(unscaledW, unscaledH)
|
|
467
|
-
}
|
|
412
|
+
const unscaledPrev = getUnscaledGeoProps(prevProps)
|
|
413
|
+
const unscaledLabelSize = getUnscaledLabelSize(this.editor, next)
|
|
414
|
+
const { scale } = nextProps
|
|
468
415
|
|
|
469
|
-
|
|
416
|
+
// Text was added for the first time - expand shape to fit (if wasEmpty and now there's text...
|
|
417
|
+
// It might be just whitespace but it is faster to assume that it is NOT just whitespace and expand
|
|
418
|
+
// the shape in either case (a label with just spaces text will be less performant but that's acceptable)
|
|
419
|
+
if (wasEmpty && !isEmpty) {
|
|
420
|
+
const expanded = expandShapeForFirstLabel(unscaledPrev.w, unscaledPrev.h, unscaledLabelSize)
|
|
470
421
|
return {
|
|
471
422
|
...next,
|
|
472
423
|
props: {
|
|
473
|
-
...
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
h: unscaledH * next.props.scale,
|
|
424
|
+
...nextProps,
|
|
425
|
+
w: expanded.w * scale,
|
|
426
|
+
h: expanded.h * scale,
|
|
477
427
|
growY: 0,
|
|
478
428
|
},
|
|
479
429
|
}
|
|
480
430
|
}
|
|
481
431
|
|
|
482
|
-
|
|
432
|
+
// Text was modified - adjust dimensions to fit new label
|
|
433
|
+
const unscaledNextW = next.props.w / scale
|
|
434
|
+
const needsWidthExpand = unscaledLabelSize.w > unscaledNextW
|
|
435
|
+
const unscaledGrowY = calculateGrowY(unscaledPrev.h, unscaledLabelSize.h, unscaledPrev.growY)
|
|
483
436
|
|
|
484
|
-
if (
|
|
485
|
-
growY = unscaledNextLabelSize.h - unscaledPrevHeight
|
|
486
|
-
} else {
|
|
487
|
-
if (unscaledPrevGrowY) {
|
|
488
|
-
growY = 0
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
if (growY !== null) {
|
|
493
|
-
const unscaledNextWidth = next.props.w / next.props.scale
|
|
494
|
-
return {
|
|
495
|
-
...next,
|
|
496
|
-
props: {
|
|
497
|
-
...next.props,
|
|
498
|
-
// Scale the results
|
|
499
|
-
growY: growY * next.props.scale,
|
|
500
|
-
w: Math.max(unscaledNextWidth, unscaledNextLabelSize.w) * next.props.scale,
|
|
501
|
-
},
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
if (unscaledNextLabelSize.w > unscaledPrevWidth) {
|
|
437
|
+
if (unscaledGrowY !== null || needsWidthExpand) {
|
|
506
438
|
return {
|
|
507
439
|
...next,
|
|
508
440
|
props: {
|
|
509
|
-
...
|
|
510
|
-
|
|
511
|
-
w:
|
|
441
|
+
...nextProps,
|
|
442
|
+
growY: (unscaledGrowY ?? unscaledPrev.growY) * scale,
|
|
443
|
+
w: Math.max(unscaledNextW, unscaledLabelSize.w) * scale,
|
|
512
444
|
},
|
|
513
445
|
}
|
|
514
446
|
}
|
|
515
|
-
|
|
516
|
-
// otherwise, no update needed
|
|
517
447
|
}
|
|
518
448
|
|
|
519
449
|
override onDoubleClick(shape: TLGeoShape) {
|
|
520
450
|
// Little easter egg: double-clicking a rectangle / checkbox while
|
|
521
451
|
// holding alt will toggle between check-box and rectangle
|
|
522
|
-
if (this.editor.inputs.
|
|
452
|
+
if (this.editor.inputs.getAltKey()) {
|
|
523
453
|
switch (shape.props.geo) {
|
|
524
454
|
case 'rectangle': {
|
|
525
455
|
return {
|
|
@@ -557,29 +487,151 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
557
487
|
}
|
|
558
488
|
|
|
559
489
|
// imperfect but good enough, should be the width of the W in the font / size combo
|
|
560
|
-
const
|
|
490
|
+
const MIN_WIDTHS = Object.freeze({
|
|
561
491
|
s: 12,
|
|
562
492
|
m: 14,
|
|
563
493
|
l: 16,
|
|
564
494
|
xl: 20,
|
|
565
|
-
}
|
|
495
|
+
})
|
|
566
496
|
|
|
567
|
-
const
|
|
497
|
+
const EXTRA_PADDINGS = Object.freeze({
|
|
568
498
|
s: 2,
|
|
569
499
|
m: 3.5,
|
|
570
500
|
l: 5,
|
|
571
501
|
xl: 10,
|
|
502
|
+
})
|
|
503
|
+
|
|
504
|
+
const EMPTY_LABEL_SIZE = Object.freeze({ w: 0, h: 0 })
|
|
505
|
+
|
|
506
|
+
// Margin between label edge and shape edge (in unscaled units)
|
|
507
|
+
const LABEL_EDGE_MARGIN = 8
|
|
508
|
+
|
|
509
|
+
/** Calculate label bounds for hit testing */
|
|
510
|
+
function getLabelBounds(
|
|
511
|
+
unscaledShapeW: number,
|
|
512
|
+
unscaledShapeH: number,
|
|
513
|
+
unscaledLabelSize: { w: number; h: number },
|
|
514
|
+
size: TLGeoShapeProps['size'],
|
|
515
|
+
align: TLGeoShapeProps['align'],
|
|
516
|
+
verticalAlign: TLGeoShapeProps['verticalAlign'],
|
|
517
|
+
scale: number
|
|
518
|
+
): { x: number; y: number; width: number; height: number } {
|
|
519
|
+
// Calculate minimum label dimensions based on font size and shape size
|
|
520
|
+
const unscaledMinWidth = Math.min(100, unscaledShapeW / 2)
|
|
521
|
+
const unscaledMinHeight = Math.min(
|
|
522
|
+
LABEL_FONT_SIZES[size] * TEXT_PROPS.lineHeight + LABEL_PADDING * 2,
|
|
523
|
+
unscaledShapeH / 2
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
// Label dimensions: at least the measured size, but constrained to shape bounds
|
|
527
|
+
const unscaledLabelW = Math.min(
|
|
528
|
+
unscaledShapeW,
|
|
529
|
+
Math.max(
|
|
530
|
+
unscaledLabelSize.w,
|
|
531
|
+
Math.min(unscaledMinWidth, Math.max(1, unscaledShapeW - LABEL_EDGE_MARGIN))
|
|
532
|
+
)
|
|
533
|
+
)
|
|
534
|
+
const unscaledLabelH = Math.min(
|
|
535
|
+
unscaledShapeH,
|
|
536
|
+
Math.max(
|
|
537
|
+
unscaledLabelSize.h,
|
|
538
|
+
Math.min(unscaledMinHeight, Math.max(1, unscaledShapeH - LABEL_EDGE_MARGIN))
|
|
539
|
+
)
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
// Calculate position based on alignment
|
|
543
|
+
const unscaledX =
|
|
544
|
+
align === 'start'
|
|
545
|
+
? 0
|
|
546
|
+
: align === 'end'
|
|
547
|
+
? unscaledShapeW - unscaledLabelW
|
|
548
|
+
: (unscaledShapeW - unscaledLabelW) / 2
|
|
549
|
+
|
|
550
|
+
const unscaledY =
|
|
551
|
+
verticalAlign === 'start'
|
|
552
|
+
? 0
|
|
553
|
+
: verticalAlign === 'end'
|
|
554
|
+
? unscaledShapeH - unscaledLabelH
|
|
555
|
+
: (unscaledShapeH - unscaledLabelH) / 2
|
|
556
|
+
|
|
557
|
+
return {
|
|
558
|
+
x: unscaledX * scale,
|
|
559
|
+
y: unscaledY * scale,
|
|
560
|
+
width: unscaledLabelW * scale,
|
|
561
|
+
height: unscaledLabelH * scale,
|
|
562
|
+
}
|
|
572
563
|
}
|
|
573
564
|
|
|
574
|
-
|
|
575
|
-
|
|
565
|
+
/** Get the unscaled dimensions from a geo shape's props */
|
|
566
|
+
function getUnscaledGeoProps(props: TLGeoShapeProps) {
|
|
567
|
+
const { w, h, growY, scale } = props
|
|
568
|
+
return {
|
|
569
|
+
w: w / scale,
|
|
570
|
+
h: h / scale,
|
|
571
|
+
growY: growY / scale,
|
|
572
|
+
}
|
|
573
|
+
}
|
|
576
574
|
|
|
577
|
-
|
|
578
|
-
|
|
575
|
+
/**
|
|
576
|
+
* Calculate the growY needed to fit a label within a shape.
|
|
577
|
+
* Returns null if no change is needed, otherwise returns the new unscaled growY value.
|
|
578
|
+
*/
|
|
579
|
+
function calculateGrowY(
|
|
580
|
+
unscaledShapeH: number,
|
|
581
|
+
unscaledLabelH: number,
|
|
582
|
+
unscaledCurrentGrowY: number
|
|
583
|
+
): number | null {
|
|
584
|
+
if (unscaledLabelH > unscaledShapeH) {
|
|
585
|
+
// Label is taller than shape - need to grow
|
|
586
|
+
return unscaledLabelH - unscaledShapeH
|
|
587
|
+
}
|
|
588
|
+
if (unscaledCurrentGrowY > 0) {
|
|
589
|
+
// Label fits and we have existing growY - reset it
|
|
590
|
+
return 0
|
|
579
591
|
}
|
|
592
|
+
// No change needed
|
|
593
|
+
return null
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Calculate expanded dimensions when adding a label to a shape for the first time.
|
|
598
|
+
* Ensures the shape meets minimum size requirements and is square if originally small.
|
|
599
|
+
*/
|
|
600
|
+
function expandShapeForFirstLabel(
|
|
601
|
+
unscaledW: number,
|
|
602
|
+
unscaledH: number,
|
|
603
|
+
unscaledLabelSize: { w: number; h: number }
|
|
604
|
+
): { w: number; h: number } {
|
|
605
|
+
let w = Math.max(unscaledW, unscaledLabelSize.w)
|
|
606
|
+
let h = Math.max(unscaledH, unscaledLabelSize.h)
|
|
607
|
+
|
|
608
|
+
// If shape was smaller than min size in both dimensions, make it square
|
|
609
|
+
if (unscaledW < MIN_SIZE_WITH_LABEL && unscaledH < MIN_SIZE_WITH_LABEL) {
|
|
610
|
+
w = Math.max(w, MIN_SIZE_WITH_LABEL)
|
|
611
|
+
h = Math.max(h, MIN_SIZE_WITH_LABEL)
|
|
612
|
+
// Make square by using the larger dimension
|
|
613
|
+
const maxDim = Math.max(w, h)
|
|
614
|
+
w = maxDim
|
|
615
|
+
h = maxDim
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return { w, h }
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
const labelSizesForGeo = new WeakCache<TLGeoShape, { w: number; h: number }>()
|
|
622
|
+
|
|
623
|
+
// Returns cached label size for the shape. Don't call with empty rich text.
|
|
624
|
+
function getUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {
|
|
625
|
+
return labelSizesForGeo.get(shape, () => {
|
|
626
|
+
return measureUnscaledLabelSize(editor, shape)
|
|
627
|
+
})
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// This is the expensive part of the code so we want to avoid calling it if we can
|
|
631
|
+
function measureUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {
|
|
632
|
+
const { richText, font, size, w } = shape.props
|
|
580
633
|
|
|
581
|
-
|
|
582
|
-
const minWidth = minWidths[size]
|
|
634
|
+
const minWidth = MIN_WIDTHS[size]
|
|
583
635
|
|
|
584
636
|
const html = renderHtmlFromRichTextForMeasurement(editor, richText)
|
|
585
637
|
const textSize = editor.textMeasure.measureHtml(html, {
|
|
@@ -591,7 +643,7 @@ function getUnscaledLabelSize(editor: Editor, shape: TLGeoShape) {
|
|
|
591
643
|
// Guard because a DOM nodes can't be less 0
|
|
592
644
|
0,
|
|
593
645
|
// A 'w' width that we're setting as the min-width
|
|
594
|
-
Math.ceil(minWidth +
|
|
646
|
+
Math.ceil(minWidth + EXTRA_PADDINGS[size]),
|
|
595
647
|
// The actual text size
|
|
596
648
|
Math.ceil(w / shape.props.scale - LABEL_PADDING * 2)
|
|
597
649
|
),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo } from '@tldraw/editor'
|
|
2
|
+
import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
|
|
2
3
|
|
|
3
4
|
export class Idle extends StateNode {
|
|
4
5
|
static override id = 'idle'
|
|
@@ -12,22 +13,11 @@ export class Idle extends StateNode {
|
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
override onKeyUp(info: TLKeyboardEventInfo) {
|
|
16
|
+
const { editor } = this
|
|
15
17
|
if (info.key === 'Enter') {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// If the only selected shape is editable, start editing it
|
|
20
|
-
if (
|
|
21
|
-
onlySelectedShape &&
|
|
22
|
-
this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)
|
|
23
|
-
) {
|
|
24
|
-
this.editor.setCurrentTool('select')
|
|
25
|
-
this.editor.setEditingShape(onlySelectedShape.id)
|
|
26
|
-
this.editor.root.getCurrent()?.transition('editing_shape', {
|
|
27
|
-
...info,
|
|
28
|
-
target: 'shape',
|
|
29
|
-
shape: onlySelectedShape,
|
|
30
|
-
})
|
|
18
|
+
const onlySelectedShape = editor.getOnlySelectedShape()
|
|
19
|
+
if (editor.canEditShape(onlySelectedShape)) {
|
|
20
|
+
startEditingShapeWithRichText(editor, onlySelectedShape, { selectAll: true })
|
|
31
21
|
}
|
|
32
22
|
}
|
|
33
23
|
}
|
|
@@ -16,8 +16,8 @@ export class Pointing extends StateNode {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
override onPointerMove(info: TLPointerEventInfo) {
|
|
19
|
-
if (this.editor.inputs.
|
|
20
|
-
const
|
|
19
|
+
if (this.editor.inputs.getIsDragging()) {
|
|
20
|
+
const originPagePoint = this.editor.inputs.getOriginPagePoint()
|
|
21
21
|
|
|
22
22
|
const id = createShapeId()
|
|
23
23
|
|
|
@@ -71,7 +71,7 @@ export class Pointing extends StateNode {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
private complete() {
|
|
74
|
-
const
|
|
74
|
+
const originPagePoint = this.editor.inputs.getOriginPagePoint()
|
|
75
75
|
|
|
76
76
|
const id = createShapeId()
|
|
77
77
|
|