tldraw 5.2.0-next.e2b8d10bf10e → 5.2.0
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/DOCS.md +20294 -0
- package/README.md +13 -1
- package/RELEASE_NOTES.md +2908 -0
- package/dist-cjs/index.d.ts +110 -23
- package/dist-cjs/index.js +3 -3
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawImage.js +0 -1
- package/dist-cjs/lib/TldrawImage.js.map +2 -2
- package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js +2 -1
- package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
- package/dist-cjs/lib/defaultEmbedDefinitions.js +3 -2
- package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
- package/dist-cjs/lib/defaultOverlayUtils.js +11 -11
- package/dist-cjs/lib/defaultOverlayUtils.js.map +2 -2
- package/dist-cjs/lib/overlays/SelectionForegroundOverlayUtil.js +76 -64
- package/dist-cjs/lib/overlays/SelectionForegroundOverlayUtil.js.map +2 -2
- package/dist-cjs/lib/overlays/ShapeHandleOverlayUtil.js +1 -1
- package/dist-cjs/lib/overlays/ShapeHandleOverlayUtil.js.map +2 -2
- package/dist-cjs/lib/overlays/ShapeIndicatorOverlayUtil.js +107 -0
- package/dist-cjs/lib/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
- 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 +12 -3
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js +54 -6
- package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +2 -1
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/getPath.js +1 -1
- package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +45 -47
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +2 -2
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +2 -1
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js +23 -18
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -1
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -0
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +11 -7
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -11
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +5 -1
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +31 -41
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/noteHelpers.js +1 -1
- package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +28 -6
- package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +3 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +3 -3
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js +17 -3
- package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/freehand/core.js +424 -0
- package/dist-cjs/lib/shapes/shared/freehand/core.js.map +7 -0
- package/dist-cjs/lib/shapes/shared/freehand/fmt.js +106 -0
- package/dist-cjs/lib/shapes/shared/freehand/fmt.js.map +7 -0
- package/dist-cjs/lib/shapes/shared/freehand/getStroke.js +6 -6
- package/dist-cjs/lib/shapes/shared/freehand/getStroke.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js +320 -86
- package/dist-cjs/lib/shapes/shared/freehand/getStrokeOutlinePoints.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js +20 -96
- package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/freehand/svg.js +55 -19
- package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/freehand/svgInk.js +189 -97
- package/dist-cjs/lib/shapes/shared/freehand/svgInk.js.map +3 -3
- package/dist-cjs/lib/shapes/shared/freehand/types.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/interpolate-props.js +6 -2
- package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +3 -0
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/HandTool.js +16 -6
- package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +10 -1
- package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
- package/dist-cjs/lib/tools/HandTool/childStates/OneFingerZooming.js +84 -0
- package/dist-cjs/lib/tools/HandTool/childStates/OneFingerZooming.js.map +7 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +12 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +107 -46
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +4 -3
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/components/A11y.js +2 -0
- package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +14 -1
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenuContent.js +0 -6
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +2 -2
- package/dist-cjs/lib/ui/components/Dialogs.js +17 -37
- package/dist-cjs/lib/ui/components/Dialogs.js.map +2 -2
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +19 -4
- package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +12 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +47 -70
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +25 -46
- package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js +1 -1
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +1 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +2 -2
- package/dist-cjs/lib/ui/components/menu-items.js +7 -0
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js +2 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +14 -3
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +2 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +0 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.js +1 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +70 -1
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/asset-urls.js +5 -8
- package/dist-cjs/lib/ui/context/asset-urls.js.map +2 -2
- package/dist-cjs/lib/ui/context/events.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +13 -0
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +1 -1
- 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 +2 -0
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.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/embeds/embeds.js +4 -4
- package/dist-cjs/lib/utils/embeds/embeds.js.map +2 -2
- package/dist-cjs/lib/utils/test-helpers.js +2 -2
- package/dist-cjs/lib/utils/test-helpers.js.map +2 -2
- package/dist-cjs/lib/utils/text/richText.js +3 -1
- package/dist-cjs/lib/utils/text/richText.js.map +2 -2
- package/dist-esm/index.d.mts +110 -23
- package/dist-esm/index.mjs +5 -3
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawImage.mjs +0 -1
- package/dist-esm/lib/TldrawImage.mjs.map +2 -2
- package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs +2 -1
- package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs +3 -2
- package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
- package/dist-esm/lib/defaultOverlayUtils.mjs +11 -11
- package/dist-esm/lib/defaultOverlayUtils.mjs.map +2 -2
- package/dist-esm/lib/overlays/SelectionForegroundOverlayUtil.mjs +77 -65
- package/dist-esm/lib/overlays/SelectionForegroundOverlayUtil.mjs.map +2 -2
- package/dist-esm/lib/overlays/ShapeHandleOverlayUtil.mjs +1 -1
- package/dist-esm/lib/overlays/ShapeHandleOverlayUtil.mjs.map +2 -2
- package/dist-esm/lib/overlays/ShapeIndicatorOverlayUtil.mjs +87 -0
- package/dist-esm/lib/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +9 -1
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +15 -3
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs +54 -6
- package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +3 -1
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/getPath.mjs +1 -1
- package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +46 -47
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +2 -2
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +2 -1
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs +23 -18
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +2 -1
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +4 -0
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +12 -7
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -11
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +6 -1
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +32 -42
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/noteHelpers.mjs +1 -1
- package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +29 -6
- package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +3 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +4 -3
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs +17 -3
- package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/freehand/core.mjs +404 -0
- package/dist-esm/lib/shapes/shared/freehand/core.mjs.map +7 -0
- package/dist-esm/lib/shapes/shared/freehand/fmt.mjs +86 -0
- package/dist-esm/lib/shapes/shared/freehand/fmt.mjs.map +7 -0
- package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs +7 -7
- package/dist-esm/lib/shapes/shared/freehand/getStroke.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs +332 -86
- package/dist-esm/lib/shapes/shared/freehand/getStrokeOutlinePoints.mjs.map +3 -3
- package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs +31 -96
- package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs.map +3 -3
- package/dist-esm/lib/shapes/shared/freehand/svg.mjs +55 -19
- package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs +214 -99
- package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs.map +3 -3
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs +6 -2
- package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +4 -0
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/HandTool.mjs +16 -6
- package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +10 -1
- package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
- package/dist-esm/lib/tools/HandTool/childStates/OneFingerZooming.mjs +64 -0
- package/dist-esm/lib/tools/HandTool/childStates/OneFingerZooming.mjs.map +7 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +12 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -0
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +108 -46
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +4 -3
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/components/A11y.mjs +2 -0
- package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +21 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenuContent.mjs +0 -6
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Dialogs.mjs +19 -39
- package/dist-esm/lib/ui/components/Dialogs.mjs.map +2 -2
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +20 -5
- package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +12 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +47 -70
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +25 -46
- package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs +1 -1
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +1 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +2 -2
- package/dist-esm/lib/ui/components/menu-items.mjs +7 -0
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiDropdownMenu.mjs +2 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiDropdownMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +14 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +2 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +2 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +0 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.mjs +1 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +71 -1
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/asset-urls.mjs +5 -8
- package/dist-esm/lib/ui/context/asset-urls.mjs.map +2 -2
- package/dist-esm/lib/ui/context/events.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +13 -0
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +1 -1
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.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/embeds/embeds.mjs +4 -4
- package/dist-esm/lib/utils/embeds/embeds.mjs.map +2 -2
- package/dist-esm/lib/utils/test-helpers.mjs +2 -2
- package/dist-esm/lib/utils/test-helpers.mjs.map +2 -2
- package/dist-esm/lib/utils/text/richText.mjs +3 -1
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/package.json +11 -6
- package/src/index.ts +6 -1
- package/src/lib/TldrawImage.tsx +2 -2
- package/src/lib/bindings/arrow/ArrowBindingUtil.ts +5 -1
- package/src/lib/defaultEmbedDefinitions.ts +28 -6
- package/src/lib/defaultOverlayUtils.ts +11 -11
- package/src/lib/overlays/SelectionForegroundOverlayUtil.ts +91 -72
- package/src/lib/overlays/ShapeHandleOverlayUtil.ts +3 -1
- package/src/lib/overlays/ShapeIndicatorOverlayUtil.ts +133 -0
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +11 -1
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +16 -3
- package/src/lib/shapes/bookmark/bookmarks.ts +105 -15
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +7 -5
- package/src/lib/shapes/draw/getPath.ts +1 -1
- package/src/lib/shapes/draw/toolStates/Drawing.ts +55 -48
- package/src/lib/shapes/embed/EmbedShapeUtil.tsx +14 -4
- package/src/lib/shapes/frame/FrameShapeTool.ts +35 -24
- package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +46 -0
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +2 -1
- package/src/lib/shapes/geo/toolStates/Pointing.ts +5 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +14 -11
- package/src/lib/shapes/image/ImageShapeUtil.tsx +7 -11
- package/src/lib/shapes/line/LineShapeTool.test.ts +41 -0
- package/src/lib/shapes/line/toolStates/Pointing.ts +12 -2
- package/src/lib/shapes/note/NoteShapeUtil.tsx +36 -51
- package/src/lib/shapes/note/noteCloning.test.ts +5 -5
- package/src/lib/shapes/note/noteHelpers.ts +1 -1
- package/src/lib/shapes/note/toolStates/Pointing.ts +40 -7
- package/src/lib/shapes/shared/PlainTextLabel.tsx +3 -3
- package/src/lib/shapes/shared/RichTextLabel.tsx +4 -3
- package/src/lib/shapes/shared/defaultStyleDefs.tsx +25 -3
- package/src/lib/shapes/shared/freehand/core.ts +547 -0
- package/src/lib/shapes/shared/freehand/fmt.ts +106 -0
- package/src/lib/shapes/shared/freehand/getStroke.ts +7 -7
- package/src/lib/shapes/shared/freehand/getStrokeOutlinePoints.ts +451 -139
- package/src/lib/shapes/shared/freehand/getStrokePoints.ts +33 -153
- package/src/lib/shapes/shared/freehand/svg.ts +72 -23
- package/src/lib/shapes/shared/freehand/svgInk.ts +281 -136
- package/src/lib/shapes/shared/freehand/types.ts +0 -1
- package/src/lib/shapes/shared/interpolate-props.ts +6 -2
- package/src/lib/shapes/text/toolStates/Pointing.ts +5 -0
- package/src/lib/tools/HandTool/HandTool.ts +19 -6
- package/src/lib/tools/HandTool/childStates/Dragging.ts +17 -1
- package/src/lib/tools/HandTool/childStates/OneFingerZooming.ts +79 -0
- package/src/lib/tools/SelectTool/childStates/Idle.ts +16 -2
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +8 -0
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +137 -49
- package/src/lib/ui/TldrawUi.tsx +3 -3
- package/src/lib/ui/components/A11y.tsx +2 -0
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +32 -2
- package/src/lib/ui/components/ContextMenu/DefaultContextMenuContent.tsx +5 -6
- package/src/lib/ui/components/DefaultFollowingIndicator.tsx +2 -2
- package/src/lib/ui/components/Dialogs.tsx +20 -23
- package/src/lib/ui/components/HelperButtons/BackToContent.tsx +32 -4
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +10 -0
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +60 -74
- package/src/lib/ui/components/Minimap/MinimapManager.ts +35 -57
- package/src/lib/ui/components/SharePanel/DefaultPeopleMenuAvatar.tsx +2 -2
- package/src/lib/ui/components/SharePanel/DefaultPeopleMenuContent.tsx +2 -1
- package/src/lib/ui/components/SharePanel/DefaultPeopleMenuFacePile.tsx +2 -1
- package/src/lib/ui/components/SharePanel/DefaultPeopleMenuItem.tsx +3 -3
- package/src/lib/ui/components/StylePanel/StylePanelButtonPicker.tsx +5 -0
- package/src/lib/ui/components/menu-items.tsx +9 -0
- package/src/lib/ui/components/primitives/TldrawUiDropdownMenu.tsx +3 -1
- package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +15 -3
- package/src/lib/ui/components/primitives/TldrawUiInput.tsx +4 -0
- package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +7 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +0 -2
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuSubmenu.tsx +0 -1
- package/src/lib/ui/context/actions.tsx +88 -1
- package/src/lib/ui/context/asset-urls.tsx +9 -8
- package/src/lib/ui/context/events.tsx +2 -0
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +45 -7
- package/src/lib/ui/hooks/useTools.tsx +7 -1
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +20 -9
- package/src/lib/utils/embeds/embeds.test.ts +14 -12
- package/src/lib/utils/embeds/embeds.ts +10 -4
- package/src/lib/utils/test-helpers.ts +3 -3
- package/src/lib/utils/text/richText.test.ts +36 -0
- package/src/lib/utils/text/richText.ts +9 -1
- package/src/test/HandTool.test.ts +93 -0
- package/src/test/ImageShapeUtil.test.ts +88 -0
- package/src/test/SelectTool.test.ts +102 -1
- package/src/test/__snapshots__/drawing.test.ts.snap +2 -1
- package/src/test/attribution.test.ts +40 -29
- package/src/test/bookmark-shapes.test.ts +256 -28
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +2 -2
- package/src/test/commands/clipboardCallbacks.test.ts +3 -1
- package/src/test/commands/getSvgString.test.ts +30 -0
- package/src/test/commands/penmode.test.ts +97 -1
- package/src/test/commands/setCamera.test.ts +12 -0
- package/src/test/dragFromToolbar.test.ts +67 -0
- package/src/test/drawing.test.ts +48 -7
- package/src/test/frames.test.ts +72 -0
- package/src/test/freehand/corpus/presets.ts +71 -0
- package/src/test/freehand/corpus/real.ts +370 -0
- package/src/test/freehand/corpus/strokes.ts +50 -0
- package/src/test/freehand/svg.test.ts +20 -0
- package/src/test/freehand/wellformed.test.ts +30 -0
- package/src/test/long-press-create.test.ts +102 -0
- package/src/test/overlays/CollaboratorBrushOverlayUtil.test.ts +4 -4
- package/src/test/overlays/CollaboratorCursorOverlayUtil.test.ts +18 -18
- package/src/test/overlays/CollaboratorHintOverlayUtil.test.ts +7 -7
- package/src/test/overlays/CollaboratorScribbleOverlayUtil.test.ts +3 -3
- package/src/test/overlays/OverlayManager.test.ts +1 -1
- package/src/test/overlays/SelectionForegroundOverlayUtil.test.ts +58 -0
- package/src/test/overlays/ShapeHandleOverlayUtil.test.ts +2 -2
- package/src/test/overlays/ShapeIndicatorOverlayUtil.test.ts +36 -0
- package/src/test/resizing.test.ts +250 -0
- package/src/test/right-click-context-menu.test.ts +90 -0
- package/src/test/rightClickPanning.test.ts +11 -0
- package/src/test/selection-omnibus.test.ts +15 -2
- package/src/test/spatialIndex.test.ts +132 -0
- package/src/test/translating.test.ts +0 -6
- package/src/test/ui/ContextMenu.test.tsx +146 -3
- package/src/test/ui/Dialogs.test.tsx +256 -0
- package/src/test/ui/copyHoveredStyles.test.tsx +154 -0
- package/src/test/ui/keyboardShortcuts.test.tsx +266 -0
- package/tldraw.css +35 -12
- package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js +0 -100
- package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js.map +0 -7
- package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs +0 -80
- package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs.map +0 -7
- package/src/lib/shapes/shared/freehand/setStrokePointRadii.ts +0 -127
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/ui/context/events.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react'\n\n/** @public */\nexport type TLUiEventSource =\n\t| 'menu'\n\t| 'main-menu'\n\t| 'context-menu'\n\t| 'zoom-menu'\n\t| 'document-name'\n\t| 'navigation-zone'\n\t| 'quick-actions'\n\t| 'actions-menu'\n\t| 'kbd'\n\t| 'debug-panel'\n\t| 'page-menu'\n\t| 'share-menu'\n\t| 'export-menu'\n\t| 'toolbar'\n\t| 'people-menu'\n\t| 'dialog'\n\t| 'help-menu'\n\t| 'helper-buttons'\n\t| 'style-panel'\n\t| 'rich-text-menu'\n\t| 'image-toolbar'\n\t| 'video-toolbar'\n\t| 'unknown'\n\n/** @public */\nexport interface TLUiEventMap {\n\t// Actions\n\tundo: null\n\tredo: null\n\t'change-language': { locale: string }\n\t'change-page': { direction?: 'prev' | 'next' }\n\t'select-adjacent-shape': { direction: 'prev' | 'next' | 'left' | 'right' | 'up' | 'down' }\n\t'delete-page': null\n\t'duplicate-page': null\n\t'move-page': null\n\t'new-page': null\n\t'rename-page': null\n\t'move-to-page': null\n\t'move-to-new-page': null\n\t'rename-document': null\n\t'group-shapes': null\n\t'ungroup-shapes': null\n\t'remove-frame': null\n\t'fit-frame-to-content': null\n\t'convert-to-embed': null\n\t'convert-to-bookmark': null\n\t'open-embed-link': null\n\t'toggle-auto-size': null\n\t'copy-as': { format: 'svg' | 'png' | 'json' }\n\t'export-as': { format: 'svg' | 'png' | 'json' }\n\t'export-all-as': { format: 'svg' | 'png' | 'json' }\n\t'download-original': null\n\t'edit-link': null\n\t'insert-embed': null\n\t'insert-media': null\n\t'replace-media': null\n\t'image-manipulate': null\n\t'alt-text-start': null\n\t'set-alt-text': null\n\t'align-shapes': {\n\t\toperation: 'left' | 'center-horizontal' | 'right' | 'top' | 'center-vertical' | 'bottom'\n\t}\n\t'duplicate-shapes': null\n\t'pack-shapes': null\n\t'stack-shapes': { operation: 'horizontal' | 'vertical' }\n\t'flip-shapes': { operation: 'horizontal' | 'vertical' }\n\t'distribute-shapes': { operation: 'horizontal' | 'vertical' }\n\t'stretch-shapes': { operation: 'horizontal' | 'vertical' }\n\t'reorder-shapes': {\n\t\toperation: 'toBack' | 'toFront' | 'forward' | 'backward'\n\t}\n\t'delete-shapes': null\n\t'select-all-shapes': null\n\t'select-none-shapes': null\n\t'rotate-ccw': { fine: boolean }\n\t'rotate-cw': { fine: boolean }\n\t'zoom-in': { towardsCursor: boolean }\n\t'zoom-out': { towardsCursor: boolean }\n\t'zoom-to-fit': null\n\t'zoom-to-selection': null\n\t'reset-zoom': null\n\t'zoom-into-view': null\n\t'zoom-to-content': null\n\t'open-menu': { id: string }\n\t'close-menu': { id: string }\n\t'create-new-project': null\n\t'save-project-to-file': null\n\t'open-file': null\n\t'select-tool': { id: string }\n\tprint: null\n\tcopy: null\n\tpaste: null\n\tcut: null\n\t'set-style': { id: string; value: string | number }\n\t'toggle-transparent': null\n\t'toggle-snap-mode': null\n\t'toggle-tool-lock': null\n\t'toggle-grid-mode': null\n\t'toggle-wrap-mode': null\n\t'toggle-focus-mode': null\n\t'input-mode': { value: string }\n\t'toggle-invert-zoom': null\n\t'toggle-debug-mode': null\n\t'toggle-dynamic-size-mode': null\n\t'toggle-paste-at-cursor': null\n\t'toggle-lock': null\n\t'toggle-reduce-motion': null\n\t'toggle-keyboard-shortcuts': null\n\t'enhanced-a11y-mode': null\n\t'toggle-edge-scrolling': null\n\t'color-scheme': { value: string }\n\t'exit-pen-mode': null\n\t'start-following': null\n\t'stop-following': null\n\t'set-color': null\n\t'change-user-name': null\n\t'open-cursor-chat': null\n\t'zoom-tool': null\n\t'unlock-all': null\n\t'enlarge-shapes': null\n\t'shrink-shapes': null\n\t'flatten-to-image': null\n\t'a11y-repeat-shape-announce': null\n\t'open-url': { destinationUrl: string }\n\t'open-context-menu': null\n\t'adjust-shape-styles': null\n\t'copy-link': null\n\t'drag-tool': { id: string }\n\t'image-replace': null\n\t'video-replace': null\n\t'open-kbd-shortcuts': null\n\t'rich-text': {\n\t\toperation:\n\t\t\t| 'bold'\n\t\t\t| 'strike'\n\t\t\t| 'link'\n\t\t\t| 'link-edit'\n\t\t\t| 'link-visit'\n\t\t\t| 'link-remove'\n\t\t\t| 'heading'\n\t\t\t| 'bulletList'\n\t}\n\tedit: null\n}\n\n/** @public */\nexport type TLUiEventData<K> = K extends null\n\t? { source: TLUiEventSource }\n\t: { source: TLUiEventSource } & K\n\n/** @public */\nexport type TLUiEventHandler = <T extends keyof TLUiEventMap>(\n\tname: T,\n\tdata: TLUiEventData<TLUiEventMap[T]>\n) => void\n\n/** @public */\nexport type TLUiEventContextType = TLUiEventHandler\n\n/** @internal */\nconst defaultEventHandler: TLUiEventContextType = () => void null\n\n/** @internal */\nexport const EventsContext = React.createContext<TLUiEventContextType | null>(null)\n\n/** @public */\nexport interface EventsProviderProps {\n\tonEvent?: TLUiEventHandler\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiEventsProvider({ onEvent, children }: EventsProviderProps) {\n\treturn (\n\t\t<EventsContext.Provider value={onEvent ?? defaultEventHandler}>\n\t\t\t{children}\n\t\t</EventsContext.Provider>\n\t)\n}\n\n/** @public */\nexport function useUiEvents(): TLUiEventContextType {\n\tconst eventHandler = React.useContext(EventsContext)\n\treturn eventHandler ?? defaultEventHandler\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\n\n/** @public */\nexport type TLUiEventSource =\n\t| 'menu'\n\t| 'main-menu'\n\t| 'context-menu'\n\t| 'zoom-menu'\n\t| 'document-name'\n\t| 'navigation-zone'\n\t| 'quick-actions'\n\t| 'actions-menu'\n\t| 'kbd'\n\t| 'debug-panel'\n\t| 'page-menu'\n\t| 'share-menu'\n\t| 'export-menu'\n\t| 'toolbar'\n\t| 'people-menu'\n\t| 'dialog'\n\t| 'help-menu'\n\t| 'helper-buttons'\n\t| 'style-panel'\n\t| 'rich-text-menu'\n\t| 'image-toolbar'\n\t| 'video-toolbar'\n\t| 'unknown'\n\n/** @public */\nexport interface TLUiEventMap {\n\t// Actions\n\tundo: null\n\tredo: null\n\t'change-language': { locale: string }\n\t'change-page': { direction?: 'prev' | 'next' }\n\t'select-adjacent-shape': { direction: 'prev' | 'next' | 'left' | 'right' | 'up' | 'down' }\n\t'delete-page': null\n\t'duplicate-page': null\n\t'move-page': null\n\t'new-page': null\n\t'rename-page': null\n\t'move-to-page': null\n\t'move-to-new-page': null\n\t'rename-document': null\n\t'group-shapes': null\n\t'ungroup-shapes': null\n\t'frame-selection': null\n\t'remove-frame': null\n\t'fit-frame-to-content': null\n\t'convert-to-embed': null\n\t'convert-to-bookmark': null\n\t'open-embed-link': null\n\t'toggle-auto-size': null\n\t'copy-as': { format: 'svg' | 'png' | 'json' }\n\t'export-as': { format: 'svg' | 'png' | 'json' }\n\t'export-all-as': { format: 'svg' | 'png' | 'json' }\n\t'download-original': null\n\t'edit-link': null\n\t'insert-embed': null\n\t'insert-media': null\n\t'replace-media': null\n\t'image-manipulate': null\n\t'alt-text-start': null\n\t'set-alt-text': null\n\t'align-shapes': {\n\t\toperation: 'left' | 'center-horizontal' | 'right' | 'top' | 'center-vertical' | 'bottom'\n\t}\n\t'duplicate-shapes': null\n\t'pack-shapes': null\n\t'stack-shapes': { operation: 'horizontal' | 'vertical' }\n\t'flip-shapes': { operation: 'horizontal' | 'vertical' }\n\t'distribute-shapes': { operation: 'horizontal' | 'vertical' }\n\t'stretch-shapes': { operation: 'horizontal' | 'vertical' }\n\t'reorder-shapes': {\n\t\toperation: 'toBack' | 'toFront' | 'forward' | 'backward'\n\t}\n\t'delete-shapes': null\n\t'select-all-shapes': null\n\t'select-none-shapes': null\n\t'rotate-ccw': { fine: boolean }\n\t'rotate-cw': { fine: boolean }\n\t'zoom-in': { towardsCursor: boolean }\n\t'zoom-out': { towardsCursor: boolean }\n\t'zoom-to-fit': null\n\t'zoom-to-selection': null\n\t'reset-zoom': null\n\t'zoom-into-view': null\n\t'zoom-to-content': null\n\t'open-menu': { id: string }\n\t'close-menu': { id: string }\n\t'create-new-project': null\n\t'save-project-to-file': null\n\t'open-file': null\n\t'select-tool': { id: string }\n\tprint: null\n\tcopy: null\n\tpaste: null\n\tcut: null\n\t'set-style': { id: string; value: string | number }\n\t'toggle-transparent': null\n\t'toggle-snap-mode': null\n\t'toggle-tool-lock': null\n\t'toggle-grid-mode': null\n\t'toggle-wrap-mode': null\n\t'toggle-focus-mode': null\n\t'input-mode': { value: string }\n\t'toggle-invert-zoom': null\n\t'toggle-debug-mode': null\n\t'toggle-dynamic-size-mode': null\n\t'toggle-paste-at-cursor': null\n\t'toggle-lock': null\n\t'toggle-reduce-motion': null\n\t'toggle-keyboard-shortcuts': null\n\t'enhanced-a11y-mode': null\n\t'toggle-edge-scrolling': null\n\t'color-scheme': { value: string }\n\t'exit-pen-mode': null\n\t'start-following': null\n\t'stop-following': null\n\t'set-color': null\n\t'change-user-name': null\n\t'open-cursor-chat': null\n\t'zoom-tool': null\n\t'unlock-all': null\n\t'enlarge-shapes': null\n\t'shrink-shapes': null\n\t'flatten-to-image': null\n\t'a11y-repeat-shape-announce': null\n\t'open-url': { destinationUrl: string }\n\t'open-context-menu': null\n\t'adjust-shape-styles': null\n\t'copy-link': null\n\t'drag-tool': { id: string }\n\t'image-replace': null\n\t'video-replace': null\n\t'open-kbd-shortcuts': null\n\t'rich-text': {\n\t\toperation:\n\t\t\t| 'bold'\n\t\t\t| 'strike'\n\t\t\t| 'link'\n\t\t\t| 'link-edit'\n\t\t\t| 'link-visit'\n\t\t\t| 'link-remove'\n\t\t\t| 'heading'\n\t\t\t| 'bulletList'\n\t}\n\tedit: null\n\t'copy-hovered-styles': null\n}\n\n/** @public */\nexport type TLUiEventData<K> = K extends null\n\t? { source: TLUiEventSource }\n\t: { source: TLUiEventSource } & K\n\n/** @public */\nexport type TLUiEventHandler = <T extends keyof TLUiEventMap>(\n\tname: T,\n\tdata: TLUiEventData<TLUiEventMap[T]>\n) => void\n\n/** @public */\nexport type TLUiEventContextType = TLUiEventHandler\n\n/** @internal */\nconst defaultEventHandler: TLUiEventContextType = () => void null\n\n/** @internal */\nexport const EventsContext = React.createContext<TLUiEventContextType | null>(null)\n\n/** @public */\nexport interface EventsProviderProps {\n\tonEvent?: TLUiEventHandler\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiEventsProvider({ onEvent, children }: EventsProviderProps) {\n\treturn (\n\t\t<EventsContext.Provider value={onEvent ?? defaultEventHandler}>\n\t\t\t{children}\n\t\t</EventsContext.Provider>\n\t)\n}\n\n/** @public */\nexport function useUiEvents(): TLUiEventContextType {\n\tconst eventHandler = React.useContext(EventsContext)\n\treturn eventHandler ?? defaultEventHandler\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoLE;AApLF,YAAuB;AAsKvB,MAAM,sBAA4C,MAAM;AAGjD,MAAM,gBAAgB,MAAM,cAA2C,IAAI;AAS3E,SAAS,uBAAuB,EAAE,SAAS,SAAS,GAAwB;AAClF,SACC,4CAAC,cAAc,UAAd,EAAuB,OAAO,WAAW,qBACxC,UACF;AAEF;AAGO,SAAS,cAAoC;AACnD,QAAM,eAAe,MAAM,WAAW,aAAa;AACnD,SAAO,gBAAgB;AACxB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -19,6 +19,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var useKeyboardShortcuts_exports = {};
|
|
20
20
|
__export(useKeyboardShortcuts_exports, {
|
|
21
21
|
areShortcutsDisabled: () => areShortcutsDisabled,
|
|
22
|
+
getHotkeysStringFromKbd: () => getHotkeysStringFromKbd,
|
|
23
|
+
parseKbd: () => parseKbd,
|
|
22
24
|
useKeyboardShortcuts: () => useKeyboardShortcuts
|
|
23
25
|
});
|
|
24
26
|
module.exports = __toCommonJS(useKeyboardShortcuts_exports);
|
|
@@ -130,12 +132,22 @@ function useKeyboardShortcuts() {
|
|
|
130
132
|
}
|
|
131
133
|
);
|
|
132
134
|
const body = editor.getContainerDocument().body;
|
|
135
|
+
const heldKeyRegistrations = /* @__PURE__ */ new Map();
|
|
133
136
|
const handleKeyDown = (e) => {
|
|
134
137
|
if (shouldSkipEvent(e)) return;
|
|
138
|
+
const code = e.code;
|
|
135
139
|
for (const reg of registry) {
|
|
136
140
|
if (!reg.onKeyDown) continue;
|
|
137
141
|
for (const p of reg.parsed) {
|
|
138
142
|
if (matchesEvent(e, p)) {
|
|
143
|
+
if (code) {
|
|
144
|
+
if (e.repeat) {
|
|
145
|
+
const prev = heldKeyRegistrations.get(code);
|
|
146
|
+
if (prev && prev !== reg) return;
|
|
147
|
+
} else {
|
|
148
|
+
heldKeyRegistrations.set(code, reg);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
139
151
|
reg.onKeyDown(e);
|
|
140
152
|
break;
|
|
141
153
|
}
|
|
@@ -143,6 +155,7 @@ function useKeyboardShortcuts() {
|
|
|
143
155
|
}
|
|
144
156
|
};
|
|
145
157
|
const handleKeyUp = (e) => {
|
|
158
|
+
if (e.code) heldKeyRegistrations.delete(e.code);
|
|
146
159
|
if (shouldSkipEvent(e)) return;
|
|
147
160
|
for (const reg of registry) {
|
|
148
161
|
if (!reg.onKeyUp) continue;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/ui/hooks/useKeyboardShortcuts.ts"],
|
|
4
|
-
"sourcesContent": ["/*!\n * The kbd-string splitter (`getKeys`) and the form-input filter pattern in `shouldSkipEvent`\n * (including its list of non-text INPUT types) are adapted from hotkeys-js, which this hook\n * previously depended on.\n *\n * MIT License: https://github.com/jaywcjlove/hotkeys-js/blob/master/LICENSE\n * Copyright (c) 2015-present, Kenny Wong\n * Copyright (c) 2011-2013 Thomas Fuchs (https://github.com/madrobby/keymaster)\n * Source: https://github.com/jaywcjlove/hotkeys-js\n */\n\nimport {\n\tEditor,\n\tTLPointerEventInfo,\n\tisAccelKey,\n\tpreventDefault,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\nimport { useEffect } from 'react'\nimport { useActions } from '../context/actions'\nimport { useReadonly } from './useReadonly'\nimport { useTools } from './useTools'\n\nconst SKIP_KBDS = [\n\t// we set these in useNativeClipboardEvents instead\n\t'copy',\n\t'cut',\n\t'paste',\n\t// There's also an upload asset action, so we don't want to set the kbd twice\n\t'asset',\n]\n\n/** @public */\nexport function useKeyboardShortcuts() {\n\tconst editor = useEditor()\n\n\tconst isReadonlyMode = useReadonly()\n\tconst actions = useActions()\n\tconst tools = useTools()\n\tconst isFocused = useValue('is focused', () => editor.getInstanceState().isFocused, [editor])\n\tuseEffect(() => {\n\t\tif (!isFocused) return\n\n\t\tconst registry: Registration[] = []\n\n\t\tconst register = (kbd: string, onKeyDown?: KbdHandler, onKeyUp?: KbdHandler) => {\n\t\t\tconst parsed = parseKbd(kbd)\n\t\t\tif (parsed.length === 0) return\n\t\t\tregistry.push({ parsed, onKeyDown, onKeyUp })\n\t\t}\n\n\t\t// Add hotkeys for actions and tools.\n\t\t// Except those that in SKIP_KBDS!\n\t\tfor (const action of Object.values(actions)) {\n\t\t\tif (!action.kbd) continue\n\t\t\tif (isReadonlyMode && !action.readonlyOk) continue\n\t\t\tif (SKIP_KBDS.includes(action.id)) continue\n\n\t\t\tregister(getHotkeysStringFromKbd(action.kbd), (event) => {\n\t\t\t\tif (areShortcutsDisabled(editor) && !action.isRequiredA11yAction) return\n\t\t\t\tpreventDefault(event)\n\t\t\t\taction.onSelect('kbd')\n\t\t\t})\n\t\t}\n\n\t\tfor (const tool of Object.values(tools)) {\n\t\t\tif (!tool.kbd || (!tool.readonlyOk && editor.getIsReadonly())) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (SKIP_KBDS.includes(tool.id)) continue\n\n\t\t\tregister(getHotkeysStringFromKbd(tool.kbd), (event) => {\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\t\t\t\tpreventDefault(event)\n\t\t\t\ttool.onSelect('kbd')\n\t\t\t})\n\t\t}\n\n\t\tregister(\n\t\t\t',',\n\t\t\t(e) => {\n\t\t\t\t// Skip if shortcuts are disabled\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\n\t\t\t\t// Don't press again if already pressed\n\t\t\t\tif (editor.inputs.keys.has('Comma')) return\n\n\t\t\t\tpreventDefault(e) // prevent whatever would normally happen\n\t\t\t\teditor.focus() // Focus if not already focused\n\n\t\t\t\teditor.inputs.keys.add('Comma')\n\n\t\t\t\tconst { x, y, z } = editor.inputs.getCurrentPagePoint()\n\t\t\t\tconst screenpoints = editor.pageToScreen({ x, y })\n\n\t\t\t\tconst info: TLPointerEventInfo = {\n\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\tname: 'pointer_down',\n\t\t\t\t\tpoint: { x: screenpoints.x, y: screenpoints.y, z },\n\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\taltKey: e.altKey,\n\t\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\t\taccelKey: isAccelKey(e),\n\t\t\t\t\tpointerId: 0,\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tisPen: editor.getInstanceState().isPenMode,\n\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t}\n\n\t\t\t\teditor.dispatch(info)\n\t\t\t},\n\t\t\t(e) => {\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\t\t\t\tif (!editor.inputs.keys.has('Comma')) return\n\n\t\t\t\teditor.inputs.keys.delete('Comma')\n\n\t\t\t\tconst { x, y, z } = editor.inputs.getCurrentPagePoint()\n\t\t\t\tconst screenPoint = editor.pageToScreen({ x, y })\n\t\t\t\tconst info: TLPointerEventInfo = {\n\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\tname: 'pointer_up',\n\t\t\t\t\tpoint: { x: screenPoint.x, y: screenPoint.y, z },\n\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\taltKey: e.altKey,\n\t\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\t\taccelKey: isAccelKey(e),\n\t\t\t\t\tpointerId: 0,\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tisPen: editor.getInstanceState().isPenMode,\n\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t}\n\n\t\t\t\teditor.dispatch(info)\n\t\t\t}\n\t\t)\n\n\t\tconst body = editor.getContainerDocument().body\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (shouldSkipEvent(e)) return\n\t\t\tfor (const reg of registry) {\n\t\t\t\tif (!reg.onKeyDown) continue\n\t\t\t\tfor (const p of reg.parsed) {\n\t\t\t\t\tif (matchesEvent(e, p)) {\n\t\t\t\t\t\treg.onKeyDown(e)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handleKeyUp = (e: KeyboardEvent) => {\n\t\t\tif (shouldSkipEvent(e)) return\n\t\t\tfor (const reg of registry) {\n\t\t\t\tif (!reg.onKeyUp) continue\n\t\t\t\tfor (const p of reg.parsed) {\n\t\t\t\t\tif (matchesEvent(e, p)) {\n\t\t\t\t\t\treg.onKeyUp(e)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbody.addEventListener('keydown', handleKeyDown)\n\t\tbody.addEventListener('keyup', handleKeyUp)\n\n\t\treturn () => {\n\t\t\tbody.removeEventListener('keydown', handleKeyDown)\n\t\t\tbody.removeEventListener('keyup', handleKeyUp)\n\t\t}\n\t}, [actions, tools, isReadonlyMode, editor, isFocused])\n}\n\nexport function areShortcutsDisabled(editor: Editor) {\n\treturn (\n\t\teditor.menus.hasAnyOpenMenus() ||\n\t\teditor.getEditingShapeId() !== null ||\n\t\teditor.getCrashingError() ||\n\t\t!editor.user.getAreKeyboardShortcutsEnabled()\n\t)\n}\n\n// kbd parsing & native event matching\n// -----------------------------------\n// We deliberately do NOT use `event.code` (physical key position) for primary matching.\n// Doing so breaks alternative Latin keyboard layouts (Dvorak, Colemak, AZERTY) because\n// `event.code` always reflects the US-QWERTY position regardless of what the user typed.\n// Instead we match the typed character (`event.key`) and only fall back to `event.code` for\n// non-Latin layouts (Cyrillic, Greek, etc.) and macOS Option-letter dead-key combinations,\n// where `event.key` is a non-ASCII glyph.\n\ninterface ParsedKbd {\n\tkey: string\n\tshift: boolean\n\talt: boolean\n\tctrl: boolean\n\tmeta: boolean\n}\n\ntype KbdHandler = (event: KeyboardEvent) => void\n\ninterface Registration {\n\tparsed: ParsedKbd[]\n\tonKeyDown?: KbdHandler\n\tonKeyUp?: KbdHandler\n}\n\nconst MODIFIER_ALIASES: Record<string, 'shift' | 'alt' | 'ctrl' | 'meta'> = {\n\tshift: 'shift',\n\t'\u21E7': 'shift',\n\talt: 'alt',\n\toption: 'alt',\n\t'\u2325': 'alt',\n\tctrl: 'ctrl',\n\tcontrol: 'ctrl',\n\t'\u2303': 'ctrl',\n\tcmd: 'meta',\n\tcommand: 'meta',\n\tmeta: 'meta',\n\t'\u2318': 'meta',\n}\n\n// Aliases for named keys. Values match the lowercased `event.key` for that key.\nconst KEY_ALIASES: Record<string, string> = {\n\t'\u232B': 'backspace',\n\t'\u21A9': 'enter',\n\treturn: 'enter',\n\tesc: 'escape',\n\tdel: 'delete',\n\tins: 'insert',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tspace: ' ',\n}\n\n// When shift is held, `event.key` reports the shifted character (e.g. '<' for shift+,).\n// Map those back so a `shift+,` shortcut definition matches.\nconst SHIFT_KEY_TO_BASE: Record<string, string> = {\n\t'<': ',',\n\t'>': '.',\n\t'?': '/',\n\t':': ';',\n\t'\"': \"'\",\n\t'{': '[',\n\t'}': ']',\n\t'|': '\\\\',\n\t_: '-',\n\t'+': '=',\n\t'~': '`',\n\t'!': '1',\n\t'@': '2',\n\t'#': '3',\n\t$: '4',\n\t'%': '5',\n\t'^': '6',\n\t'&': '7',\n\t'*': '8',\n\t'(': '9',\n\t')': '0',\n}\n\n// Physical key code -> US-QWERTY-equivalent character. Used as a fallback when `event.key`\n// is non-ASCII (Cyrillic, Greek, macOS Option dead-keys, etc.).\nconst PHYSICAL_KEY_MAP: Record<string, string> = {\n\tKeyA: 'a',\n\tKeyB: 'b',\n\tKeyC: 'c',\n\tKeyD: 'd',\n\tKeyE: 'e',\n\tKeyF: 'f',\n\tKeyG: 'g',\n\tKeyH: 'h',\n\tKeyI: 'i',\n\tKeyJ: 'j',\n\tKeyK: 'k',\n\tKeyL: 'l',\n\tKeyM: 'm',\n\tKeyN: 'n',\n\tKeyO: 'o',\n\tKeyP: 'p',\n\tKeyQ: 'q',\n\tKeyR: 'r',\n\tKeyS: 's',\n\tKeyT: 't',\n\tKeyU: 'u',\n\tKeyV: 'v',\n\tKeyW: 'w',\n\tKeyX: 'x',\n\tKeyY: 'y',\n\tKeyZ: 'z',\n\tDigit0: '0',\n\tDigit1: '1',\n\tDigit2: '2',\n\tDigit3: '3',\n\tDigit4: '4',\n\tDigit5: '5',\n\tDigit6: '6',\n\tDigit7: '7',\n\tDigit8: '8',\n\tDigit9: '9',\n\tComma: ',',\n\tPeriod: '.',\n\tSlash: '/',\n\tSemicolon: ';',\n\tQuote: \"'\",\n\tBracketLeft: '[',\n\tBracketRight: ']',\n\tBackslash: '\\\\',\n\tMinus: '-',\n\tEqual: '=',\n\tBackquote: '`',\n}\n\nfunction parseKbd(kbd: string): ParsedKbd[] {\n\tconst out: ParsedKbd[] = []\n\tfor (const shortcut of getKeys(kbd)) {\n\t\tconst parsed = parseShortcut(shortcut)\n\t\tif (parsed) out.push(parsed)\n\t}\n\treturn out\n}\n\nfunction parseShortcut(shortcut: string): ParsedKbd | null {\n\tconst parts = shortcut.split('+')\n\tconst result: ParsedKbd = {\n\t\tkey: '',\n\t\tshift: false,\n\t\talt: false,\n\t\tctrl: false,\n\t\tmeta: false,\n\t}\n\n\tlet keyPart = ''\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tconst isLast = i === parts.length - 1\n\t\tif (!isLast) {\n\t\t\tconst modAlias = MODIFIER_ALIASES[part.toLowerCase()]\n\t\t\tif (modAlias) result[modAlias] = true\n\t\t\t// silently drop unknown leading parts\n\t\t} else {\n\t\t\tkeyPart = part\n\t\t}\n\t}\n\n\tif (!keyPart) return null\n\n\tlet key = keyPart.toLowerCase()\n\tif (KEY_ALIASES[key]) key = KEY_ALIASES[key]\n\tresult.key = key\n\treturn result\n}\n\nfunction getEventKey(e: KeyboardEvent): string {\n\tlet key = e.key.toLowerCase()\n\tif (e.shiftKey && SHIFT_KEY_TO_BASE[key]) {\n\t\tkey = SHIFT_KEY_TO_BASE[key]\n\t}\n\treturn key\n}\n\nfunction matchesEvent(e: KeyboardEvent, parsed: ParsedKbd): boolean {\n\tif (e.shiftKey !== parsed.shift) return false\n\tif (e.altKey !== parsed.alt) return false\n\tif (e.ctrlKey !== parsed.ctrl) return false\n\tif (e.metaKey !== parsed.meta) return false\n\n\tconst eventKey = getEventKey(e)\n\tif (eventKey === parsed.key) return true\n\n\t// Fallback for non-Latin layouts (Cyrillic, Greek, etc.) and macOS Option dead-keys,\n\t// where event.key is a non-ASCII glyph that wouldn't match any of our shortcut keys.\n\t// We re-derive the intended key from event.code's US-QWERTY equivalent. Importantly,\n\t// we only use this fallback when event.key is non-ASCII so that Dvorak/Colemak/AZERTY\n\t// users \u2014 whose event.key IS the Latin character they typed \u2014 keep getting the right match.\n\tif (eventKey.length === 1 && /^[\\x20-\\x7e]$/.test(eventKey)) return false\n\tconst codeKey = PHYSICAL_KEY_MAP[e.code]\n\treturn codeKey === parsed.key\n}\n\nfunction shouldSkipEvent(e: KeyboardEvent): boolean {\n\tif (e.isComposing) return true\n\tconst target = e.target as HTMLElement | null\n\tif (!target) return false\n\tif (target.isContentEditable) return true\n\tconst tagName = target.tagName\n\tif (tagName === 'SELECT') return true\n\tif (tagName === 'TEXTAREA') {\n\t\treturn !(target as HTMLTextAreaElement).readOnly\n\t}\n\tif (tagName === 'INPUT') {\n\t\tconst input = target as HTMLInputElement\n\t\t// Form inputs that don't accept text input should not block shortcuts.\n\t\tif (\n\t\t\t['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(\n\t\t\t\tinput.type\n\t\t\t)\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t\treturn !input.readOnly\n\t}\n\treturn false\n}\n\n// The \"raw\" kbd here will look something like \"a\" or a combination of keys \"del,backspace\".\n// We need to first split them up by comma, then parse each key to ensure backwards compatibility\n// with the old kbd format. We used to have symbols to denote cmd/alt/shift,\n// using ! for shift, $ for cmd, and ? for alt.\nfunction getHotkeysStringFromKbd(kbd: string) {\n\treturn getKeys(kbd)\n\t\t.map((kbd) => {\n\t\t\tlet str = ''\n\n\t\t\tconst shift = kbd.includes('!')\n\t\t\tconst alt = kbd.includes('?')\n\t\t\tconst cmd = kbd.includes('$')\n\n\t\t\t// remove the modifiers; the remaining string are the actual key\n\t\t\tconst k = kbd.replace(/[!?$]/g, '')\n\n\t\t\tif (shift && alt && cmd) {\n\t\t\t\tstr = `cmd+shift+alt+${k},ctrl+shift+alt+${k}`\n\t\t\t} else if (shift && cmd) {\n\t\t\t\tstr = `cmd+shift+${k},ctrl+shift+${k}`\n\t\t\t} else if (alt && cmd) {\n\t\t\t\tstr = `cmd+alt+${k},ctrl+alt+${k}`\n\t\t\t} else if (alt && shift) {\n\t\t\t\tstr = `shift+alt+${k}`\n\t\t\t} else if (shift) {\n\t\t\t\tstr = `shift+${k}`\n\t\t\t} else if (alt) {\n\t\t\t\tstr = `alt+${k}`\n\t\t\t} else if (cmd) {\n\t\t\t\tstr = `cmd+${k},ctrl+${k}`\n\t\t\t} else {\n\t\t\t\tstr = k\n\t\t\t}\n\n\t\t\treturn str\n\t\t})\n\t\t.join(',')\n}\n\n// Split a kbd string on commas, treating an empty entry produced by \"x,,\" as a literal\n// trailing comma on the previous entry. Verbatim port of the splitter from hotkeys-js\n// (MIT, see top-of-file attribution).\nfunction getKeys(key: string) {\n\tif (typeof key !== 'string') key = ''\n\tkey = key.replace(/\\s/g, '')\n\tconst keys = key.split(',')\n\tlet index = keys.lastIndexOf('')\n\n\tfor (; index >= 0; ) {\n\t\tkeys[index - 1] += ','\n\t\tkeys.splice(index, 1)\n\t\tindex = keys.lastIndexOf('')\n\t}\n\n\treturn keys\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/*!\n * The kbd-string splitter (`getKeys`) and the form-input filter pattern in `shouldSkipEvent`\n * (including its list of non-text INPUT types) are adapted from hotkeys-js, which this hook\n * previously depended on.\n *\n * MIT License: https://github.com/jaywcjlove/hotkeys-js/blob/master/LICENSE\n * Copyright (c) 2015-present, Kenny Wong\n * Copyright (c) 2011-2013 Thomas Fuchs (https://github.com/madrobby/keymaster)\n * Source: https://github.com/jaywcjlove/hotkeys-js\n */\n\nimport {\n\tEditor,\n\tTLPointerEventInfo,\n\tisAccelKey,\n\tpreventDefault,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\nimport { useEffect } from 'react'\nimport { useActions } from '../context/actions'\nimport { useReadonly } from './useReadonly'\nimport { useTools } from './useTools'\n\nconst SKIP_KBDS = [\n\t// we set these in useNativeClipboardEvents instead\n\t'copy',\n\t'cut',\n\t'paste',\n\t// There's also an upload asset action, so we don't want to set the kbd twice\n\t'asset',\n]\n\n/** @public */\nexport function useKeyboardShortcuts() {\n\tconst editor = useEditor()\n\n\tconst isReadonlyMode = useReadonly()\n\tconst actions = useActions()\n\tconst tools = useTools()\n\tconst isFocused = useValue('is focused', () => editor.getInstanceState().isFocused, [editor])\n\tuseEffect(() => {\n\t\tif (!isFocused) return\n\n\t\tconst registry: Registration[] = []\n\n\t\tconst register = (kbd: string, onKeyDown?: KbdHandler, onKeyUp?: KbdHandler) => {\n\t\t\tconst parsed = parseKbd(kbd)\n\t\t\tif (parsed.length === 0) return\n\t\t\tregistry.push({ parsed, onKeyDown, onKeyUp })\n\t\t}\n\n\t\t// Add hotkeys for actions and tools.\n\t\t// Except those that in SKIP_KBDS!\n\t\tfor (const action of Object.values(actions)) {\n\t\t\tif (!action.kbd) continue\n\t\t\tif (isReadonlyMode && !action.readonlyOk) continue\n\t\t\tif (SKIP_KBDS.includes(action.id)) continue\n\n\t\t\tregister(getHotkeysStringFromKbd(action.kbd), (event) => {\n\t\t\t\tif (areShortcutsDisabled(editor) && !action.isRequiredA11yAction) return\n\t\t\t\tpreventDefault(event)\n\t\t\t\taction.onSelect('kbd')\n\t\t\t})\n\t\t}\n\n\t\tfor (const tool of Object.values(tools)) {\n\t\t\tif (!tool.kbd || (!tool.readonlyOk && editor.getIsReadonly())) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (SKIP_KBDS.includes(tool.id)) continue\n\n\t\t\tregister(getHotkeysStringFromKbd(tool.kbd), (event) => {\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\t\t\t\tpreventDefault(event)\n\t\t\t\ttool.onSelect('kbd')\n\t\t\t})\n\t\t}\n\n\t\tregister(\n\t\t\t',',\n\t\t\t(e) => {\n\t\t\t\t// Skip if shortcuts are disabled\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\n\t\t\t\t// Don't press again if already pressed\n\t\t\t\tif (editor.inputs.keys.has('Comma')) return\n\n\t\t\t\tpreventDefault(e) // prevent whatever would normally happen\n\t\t\t\teditor.focus() // Focus if not already focused\n\n\t\t\t\teditor.inputs.keys.add('Comma')\n\n\t\t\t\tconst { x, y, z } = editor.inputs.getCurrentPagePoint()\n\t\t\t\tconst screenpoints = editor.pageToScreen({ x, y })\n\n\t\t\t\tconst info: TLPointerEventInfo = {\n\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\tname: 'pointer_down',\n\t\t\t\t\tpoint: { x: screenpoints.x, y: screenpoints.y, z },\n\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\taltKey: e.altKey,\n\t\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\t\taccelKey: isAccelKey(e),\n\t\t\t\t\tpointerId: 0,\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tisPen: editor.getInstanceState().isPenMode,\n\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t}\n\n\t\t\t\teditor.dispatch(info)\n\t\t\t},\n\t\t\t(e) => {\n\t\t\t\tif (areShortcutsDisabled(editor)) return\n\t\t\t\tif (!editor.inputs.keys.has('Comma')) return\n\n\t\t\t\teditor.inputs.keys.delete('Comma')\n\n\t\t\t\tconst { x, y, z } = editor.inputs.getCurrentPagePoint()\n\t\t\t\tconst screenPoint = editor.pageToScreen({ x, y })\n\t\t\t\tconst info: TLPointerEventInfo = {\n\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\tname: 'pointer_up',\n\t\t\t\t\tpoint: { x: screenPoint.x, y: screenPoint.y, z },\n\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\taltKey: e.altKey,\n\t\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\t\taccelKey: isAccelKey(e),\n\t\t\t\t\tpointerId: 0,\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tisPen: editor.getInstanceState().isPenMode,\n\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t}\n\n\t\t\t\teditor.dispatch(info)\n\t\t\t}\n\t\t)\n\n\t\tconst body = editor.getContainerDocument().body\n\n\t\t// Track which registration each physically-held key first triggered, keyed by\n\t\t// `event.code`. While a key is held down, releasing a modifier should not let the\n\t\t// auto-repeat keydown events trigger an adjacent shortcut (e.g. releasing shift while\n\t\t// still holding shift+q shouldn't start firing the plain `q` shortcut). The same\n\t\t// registration is still allowed to repeat (e.g. holding `=` to keep zooming).\n\t\tconst heldKeyRegistrations = new Map<string, Registration>()\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (shouldSkipEvent(e)) return\n\t\t\tconst code = e.code\n\t\t\tfor (const reg of registry) {\n\t\t\t\tif (!reg.onKeyDown) continue\n\t\t\t\tfor (const p of reg.parsed) {\n\t\t\t\t\tif (matchesEvent(e, p)) {\n\t\t\t\t\t\tif (code) {\n\t\t\t\t\t\t\t// We only guard auto-repeat events. A fresh keypress (`e.repeat` is\n\t\t\t\t\t\t\t// false) is always free to trigger whatever it matches, even on the same\n\t\t\t\t\t\t\t// physical key \u2014 e.g. cmd+z (undo) then cmd+shift+z (redo), where macOS\n\t\t\t\t\t\t\t// swallows the `z` keyup while cmd stays held, so we can't rely on keyup\n\t\t\t\t\t\t\t// to clear the previous registration.\n\t\t\t\t\t\t\tif (e.repeat) {\n\t\t\t\t\t\t\t\tconst prev = heldKeyRegistrations.get(code)\n\t\t\t\t\t\t\t\t// The held key already triggered a different shortcut; don't fall back\n\t\t\t\t\t\t\t\t// to this one (or anything else) just because a modifier was released.\n\t\t\t\t\t\t\t\tif (prev && prev !== reg) return\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\theldKeyRegistrations.set(code, reg)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treg.onKeyDown(e)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handleKeyUp = (e: KeyboardEvent) => {\n\t\t\t// Always release the held-key tracking, even for events we'd otherwise skip (e.g. the\n\t\t\t// key was released after focus moved into a text input), so a stale entry can't block\n\t\t\t// later shortcuts.\n\t\t\tif (e.code) heldKeyRegistrations.delete(e.code)\n\t\t\tif (shouldSkipEvent(e)) return\n\t\t\tfor (const reg of registry) {\n\t\t\t\tif (!reg.onKeyUp) continue\n\t\t\t\tfor (const p of reg.parsed) {\n\t\t\t\t\tif (matchesEvent(e, p)) {\n\t\t\t\t\t\treg.onKeyUp(e)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbody.addEventListener('keydown', handleKeyDown)\n\t\tbody.addEventListener('keyup', handleKeyUp)\n\n\t\treturn () => {\n\t\t\tbody.removeEventListener('keydown', handleKeyDown)\n\t\t\tbody.removeEventListener('keyup', handleKeyUp)\n\t\t}\n\t}, [actions, tools, isReadonlyMode, editor, isFocused])\n}\n\nexport function areShortcutsDisabled(editor: Editor) {\n\treturn (\n\t\teditor.menus.hasAnyOpenMenus() ||\n\t\teditor.getEditingShapeId() !== null ||\n\t\teditor.getCrashingError() ||\n\t\t!editor.user.getAreKeyboardShortcutsEnabled()\n\t)\n}\n\n// kbd parsing & native event matching\n// -----------------------------------\n// We deliberately do NOT use `event.code` (physical key position) for primary matching.\n// Doing so breaks alternative Latin keyboard layouts (Dvorak, Colemak, AZERTY) because\n// `event.code` always reflects the US-QWERTY position regardless of what the user typed.\n// Instead we match the typed character (`event.key`) and only fall back to `event.code` for\n// non-Latin layouts (Cyrillic, Greek, etc.) and macOS Option-letter dead-key combinations,\n// where `event.key` is a non-ASCII glyph.\n\n/**\n * @internal\n */\nexport interface ParsedKbd {\n\tkey: string\n\tshift: boolean\n\talt: boolean\n\tctrl: boolean\n\tmeta: boolean\n}\n\ntype KbdHandler = (event: KeyboardEvent) => void\n\ninterface Registration {\n\tparsed: ParsedKbd[]\n\tonKeyDown?: KbdHandler\n\tonKeyUp?: KbdHandler\n}\n\nconst MODIFIER_ALIASES: Record<string, 'shift' | 'alt' | 'ctrl' | 'meta'> = {\n\tshift: 'shift',\n\t'\u21E7': 'shift',\n\talt: 'alt',\n\toption: 'alt',\n\t'\u2325': 'alt',\n\tctrl: 'ctrl',\n\tcontrol: 'ctrl',\n\t'\u2303': 'ctrl',\n\tcmd: 'meta',\n\tcommand: 'meta',\n\tmeta: 'meta',\n\t'\u2318': 'meta',\n}\n\n// Aliases for named keys. Values match the lowercased `event.key` for that key.\nconst KEY_ALIASES: Record<string, string> = {\n\t'\u232B': 'backspace',\n\t'\u21A9': 'enter',\n\treturn: 'enter',\n\tesc: 'escape',\n\tdel: 'delete',\n\tins: 'insert',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tspace: ' ',\n}\n\n// When shift is held, `event.key` reports the shifted character (e.g. '<' for shift+,).\n// Map those back so a `shift+,` shortcut definition matches.\nconst SHIFT_KEY_TO_BASE: Record<string, string> = {\n\t'<': ',',\n\t'>': '.',\n\t'?': '/',\n\t':': ';',\n\t'\"': \"'\",\n\t'{': '[',\n\t'}': ']',\n\t'|': '\\\\',\n\t_: '-',\n\t'+': '=',\n\t'~': '`',\n\t'!': '1',\n\t'@': '2',\n\t'#': '3',\n\t$: '4',\n\t'%': '5',\n\t'^': '6',\n\t'&': '7',\n\t'*': '8',\n\t'(': '9',\n\t')': '0',\n}\n\n// Physical key code -> US-QWERTY-equivalent character. Used as a fallback when `event.key`\n// is non-ASCII (Cyrillic, Greek, macOS Option dead-keys, etc.).\nconst PHYSICAL_KEY_MAP: Record<string, string> = {\n\tKeyA: 'a',\n\tKeyB: 'b',\n\tKeyC: 'c',\n\tKeyD: 'd',\n\tKeyE: 'e',\n\tKeyF: 'f',\n\tKeyG: 'g',\n\tKeyH: 'h',\n\tKeyI: 'i',\n\tKeyJ: 'j',\n\tKeyK: 'k',\n\tKeyL: 'l',\n\tKeyM: 'm',\n\tKeyN: 'n',\n\tKeyO: 'o',\n\tKeyP: 'p',\n\tKeyQ: 'q',\n\tKeyR: 'r',\n\tKeyS: 's',\n\tKeyT: 't',\n\tKeyU: 'u',\n\tKeyV: 'v',\n\tKeyW: 'w',\n\tKeyX: 'x',\n\tKeyY: 'y',\n\tKeyZ: 'z',\n\tDigit0: '0',\n\tDigit1: '1',\n\tDigit2: '2',\n\tDigit3: '3',\n\tDigit4: '4',\n\tDigit5: '5',\n\tDigit6: '6',\n\tDigit7: '7',\n\tDigit8: '8',\n\tDigit9: '9',\n\tComma: ',',\n\tPeriod: '.',\n\tSlash: '/',\n\tSemicolon: ';',\n\tQuote: \"'\",\n\tBracketLeft: '[',\n\tBracketRight: ']',\n\tBackslash: '\\\\',\n\tMinus: '-',\n\tEqual: '=',\n\tBackquote: '`',\n}\n\n/**\n * @internal\n */\nexport function parseKbd(kbd: string): ParsedKbd[] {\n\tconst out: ParsedKbd[] = []\n\tfor (const shortcut of getKeys(kbd)) {\n\t\tconst parsed = parseShortcut(shortcut)\n\t\tif (parsed) out.push(parsed)\n\t}\n\treturn out\n}\n\nfunction parseShortcut(shortcut: string): ParsedKbd | null {\n\tconst parts = shortcut.split('+')\n\tconst result: ParsedKbd = {\n\t\tkey: '',\n\t\tshift: false,\n\t\talt: false,\n\t\tctrl: false,\n\t\tmeta: false,\n\t}\n\n\tlet keyPart = ''\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tconst isLast = i === parts.length - 1\n\t\tif (!isLast) {\n\t\t\tconst modAlias = MODIFIER_ALIASES[part.toLowerCase()]\n\t\t\tif (modAlias) result[modAlias] = true\n\t\t\t// silently drop unknown leading parts\n\t\t} else {\n\t\t\tkeyPart = part\n\t\t}\n\t}\n\n\tif (!keyPart) return null\n\n\tlet key = keyPart.toLowerCase()\n\tif (KEY_ALIASES[key]) key = KEY_ALIASES[key]\n\tresult.key = key\n\treturn result\n}\n\nfunction getEventKey(e: KeyboardEvent): string {\n\tlet key = e.key.toLowerCase()\n\tif (e.shiftKey && SHIFT_KEY_TO_BASE[key]) {\n\t\tkey = SHIFT_KEY_TO_BASE[key]\n\t}\n\treturn key\n}\n\nfunction matchesEvent(e: KeyboardEvent, parsed: ParsedKbd): boolean {\n\tif (e.shiftKey !== parsed.shift) return false\n\tif (e.altKey !== parsed.alt) return false\n\tif (e.ctrlKey !== parsed.ctrl) return false\n\tif (e.metaKey !== parsed.meta) return false\n\n\tconst eventKey = getEventKey(e)\n\tif (eventKey === parsed.key) return true\n\n\t// Fallback for non-Latin layouts (Cyrillic, Greek, etc.) and macOS Option dead-keys,\n\t// where event.key is a non-ASCII glyph that wouldn't match any of our shortcut keys.\n\t// We re-derive the intended key from event.code's US-QWERTY equivalent. Importantly,\n\t// we only use this fallback when event.key is non-ASCII so that Dvorak/Colemak/AZERTY\n\t// users \u2014 whose event.key IS the Latin character they typed \u2014 keep getting the right match.\n\tif (eventKey.length === 1 && /^[\\x20-\\x7e]$/.test(eventKey)) return false\n\tconst codeKey = PHYSICAL_KEY_MAP[e.code]\n\treturn codeKey === parsed.key\n}\n\nfunction shouldSkipEvent(e: KeyboardEvent): boolean {\n\tif (e.isComposing) return true\n\tconst target = e.target as HTMLElement | null\n\tif (!target) return false\n\tif (target.isContentEditable) return true\n\tconst tagName = target.tagName\n\tif (tagName === 'SELECT') return true\n\tif (tagName === 'TEXTAREA') {\n\t\treturn !(target as HTMLTextAreaElement).readOnly\n\t}\n\tif (tagName === 'INPUT') {\n\t\tconst input = target as HTMLInputElement\n\t\t// Form inputs that don't accept text input should not block shortcuts.\n\t\tif (\n\t\t\t['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(\n\t\t\t\tinput.type\n\t\t\t)\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t\treturn !input.readOnly\n\t}\n\treturn false\n}\n\n/**\n * The \"raw\" kbd here will look something like \"a\" or a combination of keys\n * \"del,backspace\". We need to first split them up by comma, then parse each\n * key to ensure backwards compatibility with the old kbd format. We used to\n * have symbols to denote cmd/alt/shift, using ! for shift, $ for cmd, and ?\n * for alt.\n *\n * @internal\n */\nexport function getHotkeysStringFromKbd(kbd: string) {\n\treturn getKeys(kbd)\n\t\t.map((kbd) => {\n\t\t\tlet str = ''\n\n\t\t\tconst shift = kbd.includes('!')\n\t\t\tconst alt = kbd.includes('?')\n\t\t\tconst cmd = kbd.includes('$')\n\n\t\t\t// remove the modifiers; the remaining string are the actual key\n\t\t\tconst k = kbd.replace(/[!?$]/g, '')\n\n\t\t\tif (shift && alt && cmd) {\n\t\t\t\tstr = `cmd+shift+alt+${k},ctrl+shift+alt+${k}`\n\t\t\t} else if (shift && cmd) {\n\t\t\t\tstr = `cmd+shift+${k},ctrl+shift+${k}`\n\t\t\t} else if (alt && cmd) {\n\t\t\t\tstr = `cmd+alt+${k},ctrl+alt+${k}`\n\t\t\t} else if (alt && shift) {\n\t\t\t\tstr = `shift+alt+${k}`\n\t\t\t} else if (shift) {\n\t\t\t\tstr = `shift+${k}`\n\t\t\t} else if (alt) {\n\t\t\t\tstr = `alt+${k}`\n\t\t\t} else if (cmd) {\n\t\t\t\tstr = `cmd+${k},ctrl+${k}`\n\t\t\t} else {\n\t\t\t\tstr = k\n\t\t\t}\n\n\t\t\treturn str\n\t\t})\n\t\t.join(',')\n}\n\n// Split a kbd string on commas, treating an empty entry produced by \"x,,\" as a literal\n// trailing comma on the previous entry. Verbatim port of the splitter from hotkeys-js\n// (MIT, see top-of-file attribution).\nfunction getKeys(key: string) {\n\tif (typeof key !== 'string') key = ''\n\tkey = key.replace(/\\s/g, '')\n\tconst keys = key.split(',')\n\tlet index = keys.lastIndexOf('')\n\n\tfor (; index >= 0; ) {\n\t\tkeys[index - 1] += ','\n\t\tkeys.splice(index, 1)\n\t\tindex = keys.lastIndexOf('')\n\t}\n\n\treturn keys\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,oBAOO;AACP,mBAA0B;AAC1B,qBAA2B;AAC3B,yBAA4B;AAC5B,sBAAyB;AAtBzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBA,MAAM,YAAY;AAAA;AAAA,EAEjB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AACD;AAGO,SAAS,uBAAuB;AACtC,QAAM,aAAS,yBAAU;AAEzB,QAAM,qBAAiB,gCAAY;AACnC,QAAM,cAAU,2BAAW;AAC3B,QAAM,YAAQ,0BAAS;AACvB,QAAM,gBAAY,wBAAS,cAAc,MAAM,OAAO,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC;AAC5F,8BAAU,MAAM;AACf,QAAI,CAAC,UAAW;AAEhB,UAAM,WAA2B,CAAC;AAElC,UAAM,WAAW,CAAC,KAAa,WAAwB,YAAyB;AAC/E,YAAM,SAAS,SAAS,GAAG;AAC3B,UAAI,OAAO,WAAW,EAAG;AACzB,eAAS,KAAK,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAAA,IAC7C;AAIA,eAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC5C,UAAI,CAAC,OAAO,IAAK;AACjB,UAAI,kBAAkB,CAAC,OAAO,WAAY;AAC1C,UAAI,UAAU,SAAS,OAAO,EAAE,EAAG;AAEnC,eAAS,wBAAwB,OAAO,GAAG,GAAG,CAAC,UAAU;AACxD,YAAI,qBAAqB,MAAM,KAAK,CAAC,OAAO,qBAAsB;AAClE,0CAAe,KAAK;AACpB,eAAO,SAAS,KAAK;AAAA,MACtB,CAAC;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACxC,UAAI,CAAC,KAAK,OAAQ,CAAC,KAAK,cAAc,OAAO,cAAc,GAAI;AAC9D;AAAA,MACD;AAEA,UAAI,UAAU,SAAS,KAAK,EAAE,EAAG;AAEjC,eAAS,wBAAwB,KAAK,GAAG,GAAG,CAAC,UAAU;AACtD,YAAI,qBAAqB,MAAM,EAAG;AAClC,0CAAe,KAAK;AACpB,aAAK,SAAS,KAAK;AAAA,MACpB,CAAC;AAAA,IACF;AAEA;AAAA,MACC;AAAA,MACA,CAAC,MAAM;AAEN,YAAI,qBAAqB,MAAM,EAAG;AAGlC,YAAI,OAAO,OAAO,KAAK,IAAI,OAAO,EAAG;AAErC,0CAAe,CAAC;AAChB,eAAO,MAAM;AAEb,eAAO,OAAO,KAAK,IAAI,OAAO;AAE9B,cAAM,EAAE,GAAG,GAAG,EAAE,IAAI,OAAO,OAAO,oBAAoB;AACtD,cAAM,eAAe,OAAO,aAAa,EAAE,GAAG,EAAE,CAAC;AAEjD,cAAM,OAA2B;AAAA,UAChC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,GAAG,aAAa,GAAG,GAAG,aAAa,GAAG,EAAE;AAAA,UACjD,UAAU,EAAE;AAAA,UACZ,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,WAAW,EAAE;AAAA,UACxB,SAAS,EAAE;AAAA,UACX,cAAU,0BAAW,CAAC;AAAA,UACtB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,OAAO,OAAO,iBAAiB,EAAE;AAAA,UACjC,QAAQ;AAAA,QACT;AAEA,eAAO,SAAS,IAAI;AAAA,MACrB;AAAA,MACA,CAAC,MAAM;AACN,YAAI,qBAAqB,MAAM,EAAG;AAClC,YAAI,CAAC,OAAO,OAAO,KAAK,IAAI,OAAO,EAAG;AAEtC,eAAO,OAAO,KAAK,OAAO,OAAO;AAEjC,cAAM,EAAE,GAAG,GAAG,EAAE,IAAI,OAAO,OAAO,oBAAoB;AACtD,cAAM,cAAc,OAAO,aAAa,EAAE,GAAG,EAAE,CAAC;AAChD,cAAM,OAA2B;AAAA,UAChC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO,EAAE,GAAG,YAAY,GAAG,GAAG,YAAY,GAAG,EAAE;AAAA,UAC/C,UAAU,EAAE;AAAA,UACZ,QAAQ,EAAE;AAAA,UACV,SAAS,EAAE,WAAW,EAAE;AAAA,UACxB,SAAS,EAAE;AAAA,UACX,cAAU,0BAAW,CAAC;AAAA,UACtB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,OAAO,OAAO,iBAAiB,EAAE;AAAA,UACjC,QAAQ;AAAA,QACT;AAEA,eAAO,SAAS,IAAI;AAAA,MACrB;AAAA,IACD;AAEA,UAAM,OAAO,OAAO,qBAAqB,EAAE;AAO3C,UAAM,uBAAuB,oBAAI,IAA0B;AAE3D,UAAM,gBAAgB,CAAC,MAAqB;AAC3C,UAAI,gBAAgB,CAAC,EAAG;AACxB,YAAM,OAAO,EAAE;AACf,iBAAW,OAAO,UAAU;AAC3B,YAAI,CAAC,IAAI,UAAW;AACpB,mBAAW,KAAK,IAAI,QAAQ;AAC3B,cAAI,aAAa,GAAG,CAAC,GAAG;AACvB,gBAAI,MAAM;AAMT,kBAAI,EAAE,QAAQ;AACb,sBAAM,OAAO,qBAAqB,IAAI,IAAI;AAG1C,oBAAI,QAAQ,SAAS,IAAK;AAAA,cAC3B,OAAO;AACN,qCAAqB,IAAI,MAAM,GAAG;AAAA,cACnC;AAAA,YACD;AACA,gBAAI,UAAU,CAAC;AACf;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,cAAc,CAAC,MAAqB;AAIzC,UAAI,EAAE,KAAM,sBAAqB,OAAO,EAAE,IAAI;AAC9C,UAAI,gBAAgB,CAAC,EAAG;AACxB,iBAAW,OAAO,UAAU;AAC3B,YAAI,CAAC,IAAI,QAAS;AAClB,mBAAW,KAAK,IAAI,QAAQ;AAC3B,cAAI,aAAa,GAAG,CAAC,GAAG;AACvB,gBAAI,QAAQ,CAAC;AACb;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,SAAK,iBAAiB,WAAW,aAAa;AAC9C,SAAK,iBAAiB,SAAS,WAAW;AAE1C,WAAO,MAAM;AACZ,WAAK,oBAAoB,WAAW,aAAa;AACjD,WAAK,oBAAoB,SAAS,WAAW;AAAA,IAC9C;AAAA,EACD,GAAG,CAAC,SAAS,OAAO,gBAAgB,QAAQ,SAAS,CAAC;AACvD;AAEO,SAAS,qBAAqB,QAAgB;AACpD,SACC,OAAO,MAAM,gBAAgB,KAC7B,OAAO,kBAAkB,MAAM,QAC/B,OAAO,iBAAiB,KACxB,CAAC,OAAO,KAAK,+BAA+B;AAE9C;AA8BA,MAAM,mBAAsE;AAAA,EAC3E,OAAO;AAAA,EACP,UAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAK;AACN;AAGA,MAAM,cAAsC;AAAA,EAC3C,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AACR;AAIA,MAAM,oBAA4C;AAAA,EACjD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,GAAG;AAAA,EACH,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,GAAG;AAAA,EACH,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACN;AAIA,MAAM,mBAA2C;AAAA,EAChD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AACZ;AAKO,SAAS,SAAS,KAA0B;AAClD,QAAM,MAAmB,CAAC;AAC1B,aAAW,YAAY,QAAQ,GAAG,GAAG;AACpC,UAAM,SAAS,cAAc,QAAQ;AACrC,QAAI,OAAQ,KAAI,KAAK,MAAM;AAAA,EAC5B;AACA,SAAO;AACR;AAEA,SAAS,cAAc,UAAoC;AAC1D,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,SAAoB;AAAA,IACzB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,EACP;AAEA,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,SAAS,MAAM,MAAM,SAAS;AACpC,QAAI,CAAC,QAAQ;AACZ,YAAM,WAAW,iBAAiB,KAAK,YAAY,CAAC;AACpD,UAAI,SAAU,QAAO,QAAQ,IAAI;AAAA,IAElC,OAAO;AACN,gBAAU;AAAA,IACX;AAAA,EACD;AAEA,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,MAAM,QAAQ,YAAY;AAC9B,MAAI,YAAY,GAAG,EAAG,OAAM,YAAY,GAAG;AAC3C,SAAO,MAAM;AACb,SAAO;AACR;AAEA,SAAS,YAAY,GAA0B;AAC9C,MAAI,MAAM,EAAE,IAAI,YAAY;AAC5B,MAAI,EAAE,YAAY,kBAAkB,GAAG,GAAG;AACzC,UAAM,kBAAkB,GAAG;AAAA,EAC5B;AACA,SAAO;AACR;AAEA,SAAS,aAAa,GAAkB,QAA4B;AACnE,MAAI,EAAE,aAAa,OAAO,MAAO,QAAO;AACxC,MAAI,EAAE,WAAW,OAAO,IAAK,QAAO;AACpC,MAAI,EAAE,YAAY,OAAO,KAAM,QAAO;AACtC,MAAI,EAAE,YAAY,OAAO,KAAM,QAAO;AAEtC,QAAM,WAAW,YAAY,CAAC;AAC9B,MAAI,aAAa,OAAO,IAAK,QAAO;AAOpC,MAAI,SAAS,WAAW,KAAK,gBAAgB,KAAK,QAAQ,EAAG,QAAO;AACpE,QAAM,UAAU,iBAAiB,EAAE,IAAI;AACvC,SAAO,YAAY,OAAO;AAC3B;AAEA,SAAS,gBAAgB,GAA2B;AACnD,MAAI,EAAE,YAAa,QAAO;AAC1B,QAAM,SAAS,EAAE;AACjB,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,kBAAmB,QAAO;AACrC,QAAM,UAAU,OAAO;AACvB,MAAI,YAAY,SAAU,QAAO;AACjC,MAAI,YAAY,YAAY;AAC3B,WAAO,CAAE,OAA+B;AAAA,EACzC;AACA,MAAI,YAAY,SAAS;AACxB,UAAM,QAAQ;AAEd,QACC,CAAC,YAAY,SAAS,SAAS,UAAU,QAAQ,SAAS,UAAU,OAAO,EAAE;AAAA,MAC5E,MAAM;AAAA,IACP,GACC;AACD,aAAO;AAAA,IACR;AACA,WAAO,CAAC,MAAM;AAAA,EACf;AACA,SAAO;AACR;AAWO,SAAS,wBAAwB,KAAa;AACpD,SAAO,QAAQ,GAAG,EAChB,IAAI,CAACA,SAAQ;AACb,QAAI,MAAM;AAEV,UAAM,QAAQA,KAAI,SAAS,GAAG;AAC9B,UAAM,MAAMA,KAAI,SAAS,GAAG;AAC5B,UAAM,MAAMA,KAAI,SAAS,GAAG;AAG5B,UAAM,IAAIA,KAAI,QAAQ,UAAU,EAAE;AAElC,QAAI,SAAS,OAAO,KAAK;AACxB,YAAM,iBAAiB,CAAC,mBAAmB,CAAC;AAAA,IAC7C,WAAW,SAAS,KAAK;AACxB,YAAM,aAAa,CAAC,eAAe,CAAC;AAAA,IACrC,WAAW,OAAO,KAAK;AACtB,YAAM,WAAW,CAAC,aAAa,CAAC;AAAA,IACjC,WAAW,OAAO,OAAO;AACxB,YAAM,aAAa,CAAC;AAAA,IACrB,WAAW,OAAO;AACjB,YAAM,SAAS,CAAC;AAAA,IACjB,WAAW,KAAK;AACf,YAAM,OAAO,CAAC;AAAA,IACf,WAAW,KAAK;AACf,YAAM,OAAO,CAAC,SAAS,CAAC;AAAA,IACzB,OAAO;AACN,YAAM;AAAA,IACP;AAEA,WAAO;AAAA,EACR,CAAC,EACA,KAAK,GAAG;AACX;AAKA,SAAS,QAAQ,KAAa;AAC7B,MAAI,OAAO,QAAQ,SAAU,OAAM;AACnC,QAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,MAAI,QAAQ,KAAK,YAAY,EAAE;AAE/B,SAAO,SAAS,KAAK;AACpB,SAAK,QAAQ,CAAC,KAAK;AACnB,SAAK,OAAO,OAAO,CAAC;AACpB,YAAQ,KAAK,YAAY,EAAE;AAAA,EAC5B;AAEA,SAAO;AACR;",
|
|
6
6
|
"names": ["kbd"]
|
|
7
7
|
}
|
|
@@ -330,6 +330,6 @@ function onDragFromToolbarToCreateShape(editor, info, opts) {
|
|
|
330
330
|
opts.onDragEnd?.(id);
|
|
331
331
|
}
|
|
332
332
|
});
|
|
333
|
-
editor.getCurrentTool().setCurrentToolIdMask(shape.type);
|
|
333
|
+
editor.getCurrentTool().setCurrentToolIdMask(opts.maskedToolId ?? shape.type);
|
|
334
334
|
}
|
|
335
335
|
//# sourceMappingURL=useTools.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/ui/hooks/useTools.tsx"],
|
|
4
|
-
"sourcesContent": ["import {\n\tassertExists,\n\tcreateShapeId,\n\tEditor,\n\tGeoShapeGeoStyle,\n\tgetIndicesBetween,\n\tTLPointerEventInfo,\n\tTLShapeId,\n\ttoRichText,\n\tuseMaybeEditor,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { startEditingShapeWithRichText } from '../../tools/SelectTool/selectHelpers'\nimport { EmbedDialog } from '../components/EmbedDialog'\nimport { TLUiIconJsx } from '../components/primitives/TldrawUiIcon'\nimport { useA11y } from '../context/a11y'\nimport { TLUiEventSource, useUiEvents } from '../context/events'\nimport { TLUiIconType } from '../icon-types'\nimport { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'\nimport { TLUiTranslationKey } from './useTranslation/TLUiTranslationKey'\nimport { useTranslation } from './useTranslation/useTranslation'\n\n/** @public */\nexport interface TLUiToolItem<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n> {\n\tid: string\n\tlabel: TranslationKey\n\tshortcutsLabel?: TranslationKey\n\ticon: IconType | TLUiIconJsx\n\tonSelect(source: TLUiEventSource): void\n\tonDragStart?(source: TLUiEventSource, info: TLPointerEventInfo): void\n\t/**\n\t * The keyboard shortcut for this tool. This is a string that can be a single key,\n\t * or a combination of keys.\n\t * For example, `cmd+z` or `cmd+shift+z` or `cmd+u,ctrl+u`, or just `v` or `a`.\n\t * We have backwards compatibility with the old system, where we used to use\n\t * symbols to denote cmd/alt/shift, using `!` for shift, `$` for cmd, and `?` for alt.\n\t */\n\tkbd?: string\n\treadonlyOk?: boolean\n\tmeta?: {\n\t\t[key: string]: any\n\t}\n}\n\n/** @public */\nexport type TLUiToolsContextType = Record<string, TLUiToolItem>\n\n/** @internal */\nexport const ToolsContext = React.createContext<null | TLUiToolsContextType>(null)\n\n/** @public */\nexport interface TLUiToolsProviderProps {\n\toverrides?(\n\t\teditor: Editor,\n\t\ttools: TLUiToolsContextType,\n\t\thelpers: Partial<TLUiOverrideHelpers>\n\t): TLUiToolsContextType\n\tchildren: React.ReactNode\n}\n\n/** @internal */\nexport function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {\n\tconst editor = useMaybeEditor()\n\tconst trackEvent = useUiEvents()\n\n\tconst a11y = useA11y()\n\tconst msg = useTranslation()\n\tconst helpers = useDefaultHelpers()\n\n\tconst onToolSelect = React.useCallback(\n\t\t(\n\t\t\tsource: TLUiEventSource,\n\t\t\ttool: TLUiToolItem<TLUiTranslationKey, TLUiIconType>,\n\t\t\tid?: string\n\t\t) => {\n\t\t\ta11y.announce({ msg: msg(tool.label) })\n\t\t\ttrackEvent('select-tool', { source, id: id ?? tool.id })\n\t\t},\n\t\t[a11y, msg, trackEvent]\n\t)\n\n\tconst tools = React.useMemo<TLUiToolsContextType>(() => {\n\t\tif (!editor) return {}\n\t\tconst toolsArray: TLUiToolItem<TLUiTranslationKey, TLUiIconType>[] = [\n\t\t\t{\n\t\t\t\tid: 'select',\n\t\t\t\tlabel: 'tool.select',\n\t\t\t\ticon: 'tool-pointer',\n\t\t\t\tkbd: 'v',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t// There's a quirk of select mode, where editing a shape is a sub-state of select.\n\t\t\t\t\t\t// Because the text tool can be locked/sticky, we need to make sure we exit the\n\t\t\t\t\t\t// text tool.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// psst, if you're changing this code, also change the code\n\t\t\t\t\t\t// in strange-tools.test.ts! Sadly it's duplicated there.\n\t\t\t\t\t\tconst currentNode = editor.root.getCurrent()!\n\t\t\t\t\t\tcurrentNode.exit({}, currentNode.id)\n\t\t\t\t\t\tcurrentNode.enter({}, currentNode.id)\n\t\t\t\t\t}\n\t\t\t\t\teditor.setCurrentTool('select')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'hand',\n\t\t\t\tlabel: 'tool.hand',\n\t\t\t\ticon: 'tool-hand',\n\t\t\t\tkbd: 'h',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('hand')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'eraser',\n\t\t\t\tlabel: 'tool.eraser',\n\t\t\t\ticon: 'tool-eraser',\n\t\t\t\tkbd: 'e',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('eraser')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'draw',\n\t\t\t\tlabel: 'tool.draw',\n\t\t\t\ticon: 'tool-pencil',\n\t\t\t\tkbd: 'd,b,x',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('draw')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t...[...GeoShapeGeoStyle.values].map((geo) => ({\n\t\t\t\tid: geo,\n\t\t\t\tlabel: `tool.${geo}` as TLUiTranslationKey,\n\t\t\t\tmeta: {\n\t\t\t\t\tgeo,\n\t\t\t\t},\n\t\t\t\tkbd: geo === 'rectangle' ? 'r' : geo === 'ellipse' ? 'o' : undefined,\n\t\t\t\ticon: ('geo-' + geo) as TLUiIconType,\n\t\t\t\tonSelect(source: TLUiEventSource) {\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.setStyleForNextShapes(GeoShapeGeoStyle, geo)\n\t\t\t\t\t\teditor.setCurrentTool('geo')\n\t\t\t\t\t\tonToolSelect(source, this, `geo-${geo}`)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tonDragStart(source: TLUiEventSource, info: TLPointerEventInfo) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\tprops: { w: 200 * scale, h: 200 * scale, geo, scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'geo' })\n\t\t\t\t},\n\t\t\t})),\n\t\t\t{\n\t\t\t\tid: 'arrow',\n\t\t\t\tlabel: 'tool.arrow',\n\t\t\t\ticon: 'tool-arrow',\n\t\t\t\tkbd: 'a',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('arrow')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source: TLUiEventSource, info: TLPointerEventInfo) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'arrow',\n\t\t\t\t\t\t\t\tprops: { start: { x: 0, y: 200 * scale }, end: { x: 200 * scale, y: 0 }, scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'arrow' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'line',\n\t\t\t\tlabel: 'tool.line',\n\t\t\t\ticon: 'tool-line',\n\t\t\t\tkbd: 'l',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('line')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) => {\n\t\t\t\t\t\t\tconst [start, end] = getIndicesBetween(null, null, 2)\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'line',\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\tpoints: {\n\t\t\t\t\t\t\t\t\t\t[start]: { id: start, index: start, x: 0, y: 200 * scale },\n\t\t\t\t\t\t\t\t\t\t[end]: { id: end, index: end, x: 200 * scale, y: 0 },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'line' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'frame',\n\t\t\t\tlabel: 'tool.frame',\n\t\t\t\ticon: 'tool-frame',\n\t\t\t\tkbd: 'f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('frame')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'frame',\n\t\t\t\t\t\t\t\tprops: { w: 160 * 2 * scale, h: 90 * 2 * scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'frame' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'text',\n\t\t\t\tlabel: 'tool.text',\n\t\t\t\ticon: 'tool-text',\n\t\t\t\tkbd: 't',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('text')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\tprops: { richText: toRichText('Text'), scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tonDragEnd: (id) => {\n\t\t\t\t\t\t\tstartEditingShapeWithRichText(editor, id, { selectAll: true })\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'text' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'asset',\n\t\t\t\tlabel: 'tool.media',\n\t\t\t\ticon: 'tool-media',\n\t\t\t\tkbd: 'cmd+u,ctrl+u',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\thelpers.insertMedia()\n\t\t\t\t\tonToolSelect(source, this, 'media')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'note',\n\t\t\t\tlabel: 'tool.note',\n\t\t\t\ticon: 'tool-note',\n\t\t\t\tkbd: 'n',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('note')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) => editor.createShape({ id, type: 'note', props: { scale } }),\n\t\t\t\t\t\tonDragEnd: (id) => {\n\t\t\t\t\t\t\tstartEditingShapeWithRichText(editor, id, { selectAll: true })\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'note' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'laser',\n\t\t\t\tlabel: 'tool.laser',\n\t\t\t\treadonlyOk: true,\n\t\t\t\ticon: 'tool-laser',\n\t\t\t\tkbd: 'k',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('laser')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'embed',\n\t\t\t\tlabel: 'tool.embed',\n\t\t\t\ticon: 'dot',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\thelpers.addDialog({ component: EmbedDialog })\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'highlight',\n\t\t\t\tlabel: 'tool.highlight',\n\t\t\t\ticon: 'tool-highlight',\n\t\t\t\t// TODO: pick a better shortcut\n\t\t\t\tkbd: 'shift+d',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('highlight')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\ttoolsArray.forEach((t) => (t.onSelect = t.onSelect.bind(t)))\n\n\t\tconst tools = Object.fromEntries(toolsArray.map((t) => [t.id, t]))\n\n\t\tif (overrides) {\n\t\t\treturn overrides(editor, tools, helpers)\n\t\t}\n\n\t\treturn tools\n\t}, [overrides, editor, helpers, onToolSelect, trackEvent])\n\n\treturn <ToolsContext.Provider value={tools}>{children}</ToolsContext.Provider>\n}\n\n/** @public */\nexport function useTools() {\n\tconst ctx = React.useContext(ToolsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useTools must be used within a ToolProvider')\n\t}\n\n\treturn ctx\n}\n\n/**\n * Options for {@link onDragFromToolbarToCreateShape}.\n * @public\n */\nexport interface OnDragFromToolbarToCreateShapesOpts {\n\t/**\n\t * Create the shape being dragged. You don't need to worry about positioning it, as it'll be\n\t * immediately updated with the correct position.\n\t */\n\tcreateShape(id: TLShapeId): void\n\t/**\n\t * Called once the drag interaction has finished.\n\t */\n\tonDragEnd?(id: TLShapeId): void\n}\n\n/**\n * A helper method to use in {@link tldraw#TLUiToolItem.onDragStart} to create a shape by dragging it from\n * the toolbar.\n * @public\n */\nexport function onDragFromToolbarToCreateShape(\n\teditor: Editor,\n\tinfo: TLPointerEventInfo,\n\topts: OnDragFromToolbarToCreateShapesOpts\n) {\n\tconst { x, y } = editor.inputs.getCurrentPagePoint()\n\n\tconst stoppingPoint = editor.markHistoryStoppingPoint('drag shape tool')\n\teditor.setCurrentTool('select.translating')\n\n\tconst id = createShapeId()\n\topts.createShape(id)\n\tconst shape = assertExists(editor.getShape(id), 'Shape not found')\n\n\tconst { w, h } = editor.getShapePageBounds(id)!\n\teditor.updateShape({ id, type: shape.type, x: x - w / 2, y: y - h / 2 })\n\teditor.select(id)\n\n\teditor.setCurrentTool('select.translating', {\n\t\t...info,\n\t\ttarget: 'shape',\n\t\tshape: editor.getShape(id),\n\t\tisCreating: true,\n\t\tcreatingMarkId: stoppingPoint,\n\t\tonCreate() {\n\t\t\teditor.setCurrentTool('select.idle')\n\t\t\teditor.select(id)\n\t\t\topts.onDragEnd?.(id)\n\t\t},\n\t})\n\n\teditor.getCurrentTool().setCurrentToolIdMask(shape.type)\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import {\n\tassertExists,\n\tcreateShapeId,\n\tEditor,\n\tGeoShapeGeoStyle,\n\tgetIndicesBetween,\n\tTLPointerEventInfo,\n\tTLShapeId,\n\ttoRichText,\n\tuseMaybeEditor,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { startEditingShapeWithRichText } from '../../tools/SelectTool/selectHelpers'\nimport { EmbedDialog } from '../components/EmbedDialog'\nimport { TLUiIconJsx } from '../components/primitives/TldrawUiIcon'\nimport { useA11y } from '../context/a11y'\nimport { TLUiEventSource, useUiEvents } from '../context/events'\nimport { TLUiIconType } from '../icon-types'\nimport { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'\nimport { TLUiTranslationKey } from './useTranslation/TLUiTranslationKey'\nimport { useTranslation } from './useTranslation/useTranslation'\n\n/** @public */\nexport interface TLUiToolItem<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n> {\n\tid: string\n\tlabel: TranslationKey\n\tshortcutsLabel?: TranslationKey\n\ticon: IconType | TLUiIconJsx\n\tonSelect(source: TLUiEventSource): void\n\tonDragStart?(source: TLUiEventSource, info: TLPointerEventInfo): void\n\t/**\n\t * The keyboard shortcut for this tool. This is a string that can be a single key,\n\t * or a combination of keys.\n\t * For example, `cmd+z` or `cmd+shift+z` or `cmd+u,ctrl+u`, or just `v` or `a`.\n\t * We have backwards compatibility with the old system, where we used to use\n\t * symbols to denote cmd/alt/shift, using `!` for shift, `$` for cmd, and `?` for alt.\n\t */\n\tkbd?: string\n\treadonlyOk?: boolean\n\tmeta?: {\n\t\t[key: string]: any\n\t}\n}\n\n/** @public */\nexport type TLUiToolsContextType = Record<string, TLUiToolItem>\n\n/** @internal */\nexport const ToolsContext = React.createContext<null | TLUiToolsContextType>(null)\n\n/** @public */\nexport interface TLUiToolsProviderProps {\n\toverrides?(\n\t\teditor: Editor,\n\t\ttools: TLUiToolsContextType,\n\t\thelpers: Partial<TLUiOverrideHelpers>\n\t): TLUiToolsContextType\n\tchildren: React.ReactNode\n}\n\n/** @internal */\nexport function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {\n\tconst editor = useMaybeEditor()\n\tconst trackEvent = useUiEvents()\n\n\tconst a11y = useA11y()\n\tconst msg = useTranslation()\n\tconst helpers = useDefaultHelpers()\n\n\tconst onToolSelect = React.useCallback(\n\t\t(\n\t\t\tsource: TLUiEventSource,\n\t\t\ttool: TLUiToolItem<TLUiTranslationKey, TLUiIconType>,\n\t\t\tid?: string\n\t\t) => {\n\t\t\ta11y.announce({ msg: msg(tool.label) })\n\t\t\ttrackEvent('select-tool', { source, id: id ?? tool.id })\n\t\t},\n\t\t[a11y, msg, trackEvent]\n\t)\n\n\tconst tools = React.useMemo<TLUiToolsContextType>(() => {\n\t\tif (!editor) return {}\n\t\tconst toolsArray: TLUiToolItem<TLUiTranslationKey, TLUiIconType>[] = [\n\t\t\t{\n\t\t\t\tid: 'select',\n\t\t\t\tlabel: 'tool.select',\n\t\t\t\ticon: 'tool-pointer',\n\t\t\t\tkbd: 'v',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t// There's a quirk of select mode, where editing a shape is a sub-state of select.\n\t\t\t\t\t\t// Because the text tool can be locked/sticky, we need to make sure we exit the\n\t\t\t\t\t\t// text tool.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// psst, if you're changing this code, also change the code\n\t\t\t\t\t\t// in strange-tools.test.ts! Sadly it's duplicated there.\n\t\t\t\t\t\tconst currentNode = editor.root.getCurrent()!\n\t\t\t\t\t\tcurrentNode.exit({}, currentNode.id)\n\t\t\t\t\t\tcurrentNode.enter({}, currentNode.id)\n\t\t\t\t\t}\n\t\t\t\t\teditor.setCurrentTool('select')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'hand',\n\t\t\t\tlabel: 'tool.hand',\n\t\t\t\ticon: 'tool-hand',\n\t\t\t\tkbd: 'h',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('hand')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'eraser',\n\t\t\t\tlabel: 'tool.eraser',\n\t\t\t\ticon: 'tool-eraser',\n\t\t\t\tkbd: 'e',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('eraser')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'draw',\n\t\t\t\tlabel: 'tool.draw',\n\t\t\t\ticon: 'tool-pencil',\n\t\t\t\tkbd: 'd,b,x',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('draw')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t...[...GeoShapeGeoStyle.values].map((geo) => ({\n\t\t\t\tid: geo,\n\t\t\t\tlabel: `tool.${geo}` as TLUiTranslationKey,\n\t\t\t\tmeta: {\n\t\t\t\t\tgeo,\n\t\t\t\t},\n\t\t\t\tkbd: geo === 'rectangle' ? 'r' : geo === 'ellipse' ? 'o' : undefined,\n\t\t\t\ticon: ('geo-' + geo) as TLUiIconType,\n\t\t\t\tonSelect(source: TLUiEventSource) {\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.setStyleForNextShapes(GeoShapeGeoStyle, geo)\n\t\t\t\t\t\teditor.setCurrentTool('geo')\n\t\t\t\t\t\tonToolSelect(source, this, `geo-${geo}`)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tonDragStart(source: TLUiEventSource, info: TLPointerEventInfo) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\tprops: { w: 200 * scale, h: 200 * scale, geo, scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'geo' })\n\t\t\t\t},\n\t\t\t})),\n\t\t\t{\n\t\t\t\tid: 'arrow',\n\t\t\t\tlabel: 'tool.arrow',\n\t\t\t\ticon: 'tool-arrow',\n\t\t\t\tkbd: 'a',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('arrow')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source: TLUiEventSource, info: TLPointerEventInfo) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'arrow',\n\t\t\t\t\t\t\t\tprops: { start: { x: 0, y: 200 * scale }, end: { x: 200 * scale, y: 0 }, scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'arrow' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'line',\n\t\t\t\tlabel: 'tool.line',\n\t\t\t\ticon: 'tool-line',\n\t\t\t\tkbd: 'l',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('line')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) => {\n\t\t\t\t\t\t\tconst [start, end] = getIndicesBetween(null, null, 2)\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'line',\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\tpoints: {\n\t\t\t\t\t\t\t\t\t\t[start]: { id: start, index: start, x: 0, y: 200 * scale },\n\t\t\t\t\t\t\t\t\t\t[end]: { id: end, index: end, x: 200 * scale, y: 0 },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'line' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'frame',\n\t\t\t\tlabel: 'tool.frame',\n\t\t\t\ticon: 'tool-frame',\n\t\t\t\tkbd: 'f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('frame')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'frame',\n\t\t\t\t\t\t\t\tprops: { w: 160 * 2 * scale, h: 90 * 2 * scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'frame' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'text',\n\t\t\t\tlabel: 'tool.text',\n\t\t\t\ticon: 'tool-text',\n\t\t\t\tkbd: 't',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('text')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) =>\n\t\t\t\t\t\t\teditor.createShape({\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\tprops: { richText: toRichText('Text'), scale },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tonDragEnd: (id) => {\n\t\t\t\t\t\t\tstartEditingShapeWithRichText(editor, id, { selectAll: true })\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'text' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'asset',\n\t\t\t\tlabel: 'tool.media',\n\t\t\t\ticon: 'tool-media',\n\t\t\t\tkbd: 'cmd+u,ctrl+u',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\thelpers.insertMedia()\n\t\t\t\t\tonToolSelect(source, this, 'media')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'note',\n\t\t\t\tlabel: 'tool.note',\n\t\t\t\ticon: 'tool-note',\n\t\t\t\tkbd: 'n',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('note')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t\tonDragStart(source, info) {\n\t\t\t\t\tconst scale = editor.getResizeScaleFactor()\n\t\t\t\t\tonDragFromToolbarToCreateShape(editor, info, {\n\t\t\t\t\t\tcreateShape: (id) => editor.createShape({ id, type: 'note', props: { scale } }),\n\t\t\t\t\t\tonDragEnd: (id) => {\n\t\t\t\t\t\t\tstartEditingShapeWithRichText(editor, id, { selectAll: true })\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('drag-tool', { source, id: 'note' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'laser',\n\t\t\t\tlabel: 'tool.laser',\n\t\t\t\treadonlyOk: true,\n\t\t\t\ticon: 'tool-laser',\n\t\t\t\tkbd: 'k',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('laser')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'embed',\n\t\t\t\tlabel: 'tool.embed',\n\t\t\t\ticon: 'dot',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\thelpers.addDialog({ component: EmbedDialog })\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'highlight',\n\t\t\t\tlabel: 'tool.highlight',\n\t\t\t\ticon: 'tool-highlight',\n\t\t\t\t// TODO: pick a better shortcut\n\t\t\t\tkbd: 'shift+d',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.setCurrentTool('highlight')\n\t\t\t\t\tonToolSelect(source, this)\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\ttoolsArray.forEach((t) => (t.onSelect = t.onSelect.bind(t)))\n\n\t\tconst tools = Object.fromEntries(toolsArray.map((t) => [t.id, t]))\n\n\t\tif (overrides) {\n\t\t\treturn overrides(editor, tools, helpers)\n\t\t}\n\n\t\treturn tools\n\t}, [overrides, editor, helpers, onToolSelect, trackEvent])\n\n\treturn <ToolsContext.Provider value={tools}>{children}</ToolsContext.Provider>\n}\n\n/** @public */\nexport function useTools() {\n\tconst ctx = React.useContext(ToolsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useTools must be used within a ToolProvider')\n\t}\n\n\treturn ctx\n}\n\n/**\n * Options for {@link onDragFromToolbarToCreateShape}.\n * @public\n */\nexport interface OnDragFromToolbarToCreateShapesOpts {\n\t/**\n\t * Create the shape being dragged. You don't need to worry about positioning it, as it'll be\n\t * immediately updated with the correct position.\n\t */\n\tcreateShape(id: TLShapeId): void\n\t/**\n\t * Called once the drag interaction has finished.\n\t */\n\tonDragEnd?(id: TLShapeId): void\n\t/**\n\t * The id of the toolbar tool to keep highlighted while dragging. Defaults to the created shape's\n\t * type. Set this when the dragged shape's type differs from the tool it's dragged from \u2014 for\n\t * example, dragging a `draw` shape out from the select tool.\n\t */\n\tmaskedToolId?: string\n}\n\n/**\n * A helper method to use in {@link tldraw#TLUiToolItem.onDragStart} to create a shape by dragging it from\n * the toolbar.\n * @public\n */\nexport function onDragFromToolbarToCreateShape(\n\teditor: Editor,\n\tinfo: TLPointerEventInfo,\n\topts: OnDragFromToolbarToCreateShapesOpts\n) {\n\tconst { x, y } = editor.inputs.getCurrentPagePoint()\n\n\tconst stoppingPoint = editor.markHistoryStoppingPoint('drag shape tool')\n\teditor.setCurrentTool('select.translating')\n\n\tconst id = createShapeId()\n\topts.createShape(id)\n\tconst shape = assertExists(editor.getShape(id), 'Shape not found')\n\n\tconst { w, h } = editor.getShapePageBounds(id)!\n\teditor.updateShape({ id, type: shape.type, x: x - w / 2, y: y - h / 2 })\n\teditor.select(id)\n\n\teditor.setCurrentTool('select.translating', {\n\t\t...info,\n\t\ttarget: 'shape',\n\t\tshape: editor.getShape(id),\n\t\tisCreating: true,\n\t\tcreatingMarkId: stoppingPoint,\n\t\tonCreate() {\n\t\t\teditor.setCurrentTool('select.idle')\n\t\t\teditor.select(id)\n\t\t\topts.onDragEnd?.(id)\n\t\t},\n\t})\n\n\teditor.getCurrentTool().setCurrentToolIdMask(opts.maskedToolId ?? shape.type)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["tools"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts"],
|
|
4
|
-
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\n/** @public */\nexport type TLUiTranslationKey =\n\t| 'action.toggle-auto-pan'\n\t| 'action.toggle-auto-zoom'\n\t| 'action.toggle-auto-none'\n\t| 'action.toggle-mouse'\n\t| 'action.toggle-trackpad'\n\t| 'action.convert-to-bookmark'\n\t| 'action.convert-to-embed'\n\t| 'action.open-embed-link'\n\t| 'action.align-bottom'\n\t| 'action.align-center-horizontal'\n\t| 'action.align-center-vertical'\n\t| 'action.align-center-horizontal.short'\n\t| 'action.align-center-vertical.short'\n\t| 'action.align-left'\n\t| 'action.align-right'\n\t| 'action.align-top'\n\t| 'action.back-to-content'\n\t| 'action.bring-forward'\n\t| 'action.bring-to-front'\n\t| 'action.copy-as-json.short'\n\t| 'action.copy-as-json'\n\t| 'action.copy-as-png.short'\n\t| 'action.copy-as-png'\n\t| 'action.copy-as-svg.short'\n\t| 'action.copy-as-svg'\n\t| 'action.copy'\n\t| 'action.cut'\n\t| 'action.delete'\n\t| 'action.unlock-all'\n\t| 'action.distribute-horizontal'\n\t| 'action.distribute-vertical'\n\t| 'action.distribute-horizontal.short'\n\t| 'action.distribute-vertical.short'\n\t| 'action.download-original'\n\t| 'action.duplicate'\n\t| 'action.edit-link'\n\t| 'action.exit-pen-mode'\n\t| 'action.export-as-png.short'\n\t| 'action.export-as-png'\n\t| 'action.export-as-svg.short'\n\t| 'action.export-as-svg'\n\t| 'action.export-all-as-png.short'\n\t| 'action.export-all-as-png'\n\t| 'action.export-all-as-svg.short'\n\t| 'action.export-all-as-svg'\n\t| 'action.fit-frame-to-content'\n\t| 'action.flip-horizontal'\n\t| 'action.flip-vertical'\n\t| 'action.flip-horizontal.short'\n\t| 'action.flip-vertical.short'\n\t| 'action.fork-project'\n\t| 'action.fork-project-on-tldraw'\n\t| 'action.group'\n\t| 'action.insert-embed'\n\t| 'action.insert-media'\n\t| 'action.leave-shared-project'\n\t| 'action.new-project'\n\t| 'action.new-shared-project'\n\t| 'action.open-cursor-chat'\n\t| 'action.open-kbd-shortcuts'\n\t| 'action.open-file'\n\t| 'action.pack'\n\t| 'action.paste'\n\t| 'action.paste-error-title'\n\t| 'action.paste-error-description'\n\t| 'action.print'\n\t| 'action.redo'\n\t| 'action.remove-frame'\n\t| 'action.rename'\n\t| 'action.rotate-ccw'\n\t| 'action.rotate-cw'\n\t| 'action.save-copy'\n\t| 'action.select-all'\n\t| 'action.select-none'\n\t| 'action.send-backward'\n\t| 'action.send-to-back'\n\t| 'action.share-project'\n\t| 'action.stack-horizontal'\n\t| 'action.stack-vertical'\n\t| 'action.stack-horizontal.short'\n\t| 'action.stack-vertical.short'\n\t| 'action.stop-following'\n\t| 'action.stretch-horizontal'\n\t| 'action.stretch-vertical'\n\t| 'action.stretch-horizontal.short'\n\t| 'action.stretch-vertical.short'\n\t| 'action.toggle-auto-size'\n\t| 'action.toggle-dark-mode.menu'\n\t| 'action.toggle-dark-mode'\n\t| 'action.toggle-paste-at-cursor.menu'\n\t| 'action.toggle-paste-at-cursor'\n\t| 'action.toggle-wrap-mode.menu'\n\t| 'action.toggle-wrap-mode'\n\t| 'action.toggle-reduce-motion.menu'\n\t| 'action.toggle-reduce-motion'\n\t| 'action.toggle-keyboard-shortcuts.menu'\n\t| 'action.toggle-keyboard-shortcuts'\n\t| 'action.enhanced-a11y-mode.menu'\n\t| 'action.enhanced-a11y-mode'\n\t| 'action.toggle-edge-scrolling.menu'\n\t| 'action.toggle-edge-scrolling'\n\t| 'action.toggle-invert-zoom.menu'\n\t| 'action.toggle-invert-zoom'\n\t| 'action.toggle-debug-mode.menu'\n\t| 'action.toggle-debug-mode'\n\t| 'action.toggle-focus-mode.menu'\n\t| 'action.toggle-focus-mode'\n\t| 'action.toggle-dynamic-size-mode.menu'\n\t| 'action.toggle-dynamic-size-mode'\n\t| 'action.toggle-grid.menu'\n\t| 'action.toggle-grid'\n\t| 'action.toggle-lock'\n\t| 'action.flatten-to-image'\n\t| 'action.toggle-snap-mode.menu'\n\t| 'action.toggle-snap-mode'\n\t| 'action.toggle-tool-lock.menu'\n\t| 'action.toggle-tool-lock'\n\t| 'action.toggle-transparent.context-menu'\n\t| 'action.toggle-transparent.menu'\n\t| 'action.toggle-transparent'\n\t| 'action.undo'\n\t| 'action.ungroup'\n\t| 'action.zoom-in'\n\t| 'action.zoom-out'\n\t| 'action.zoom-to-100'\n\t| 'action.zoom-to-fit'\n\t| 'action.zoom-to-selection'\n\t| 'action.zoom-quick'\n\t| 'action.select-zoom-tool'\n\t| 'assets.files.size-too-big'\n\t| 'assets.files.maximum-size'\n\t| 'assets.files.type-not-allowed'\n\t| 'assets.files.upload-failed'\n\t| 'assets.files.amount-too-many'\n\t| 'assets.url.failed'\n\t| 'theme.dark'\n\t| 'theme.light'\n\t| 'theme.system'\n\t| 'color-style.white'\n\t| 'color-style.black'\n\t| 'color-style.blue'\n\t| 'color-style.green'\n\t| 'color-style.grey'\n\t| 'color-style.light-blue'\n\t| 'color-style.light-green'\n\t| 'color-style.light-red'\n\t| 'color-style.light-violet'\n\t| 'color-style.orange'\n\t| 'color-style.red'\n\t| 'color-style.violet'\n\t| 'color-style.yellow'\n\t| 'fill-style.none'\n\t| 'document.default-name'\n\t| 'fill-style.semi'\n\t| 'fill-style.solid'\n\t| 'fill-style.pattern'\n\t| 'fill-style.fill'\n\t| 'fill-style.lined-fill'\n\t| 'dash-style.dashed'\n\t| 'dash-style.dotted'\n\t| 'dash-style.draw'\n\t| 'dash-style.solid'\n\t| 'size-style.s'\n\t| 'size-style.m'\n\t| 'size-style.l'\n\t| 'size-style.xl'\n\t| 'opacity-style.0.1'\n\t| 'opacity-style.0.25'\n\t| 'opacity-style.0.5'\n\t| 'opacity-style.0.75'\n\t| 'opacity-style.1'\n\t| 'font-style.draw'\n\t| 'font-style.sans'\n\t| 'font-style.serif'\n\t| 'font-style.mono'\n\t| 'align-style.start'\n\t| 'align-style.middle'\n\t| 'align-style.end'\n\t| 'align-style.justify'\n\t| 'verticalAlign-style.start'\n\t| 'verticalAlign-style.middle'\n\t| 'verticalAlign-style.end'\n\t| 'geo-style.arrow-down'\n\t| 'geo-style.arrow-left'\n\t| 'geo-style.arrow-right'\n\t| 'geo-style.arrow-up'\n\t| 'geo-style.cloud'\n\t| 'geo-style.diamond'\n\t| 'geo-style.ellipse'\n\t| 'geo-style.heart'\n\t| 'geo-style.hexagon'\n\t| 'geo-style.octagon'\n\t| 'geo-style.oval'\n\t| 'geo-style.pentagon'\n\t| 'geo-style.rectangle'\n\t| 'geo-style.rhombus'\n\t| 'geo-style.rhombus-2'\n\t| 'geo-style.star'\n\t| 'geo-style.trapezoid'\n\t| 'geo-style.triangle'\n\t| 'geo-style.x-box'\n\t| 'geo-style.check-box'\n\t| 'arrowheadStart-style.none'\n\t| 'arrowheadStart-style.arrow'\n\t| 'arrowheadStart-style.bar'\n\t| 'arrowheadStart-style.diamond'\n\t| 'arrowheadStart-style.dot'\n\t| 'arrowheadStart-style.inverted'\n\t| 'arrowheadStart-style.pipe'\n\t| 'arrowheadStart-style.square'\n\t| 'arrowheadStart-style.triangle'\n\t| 'arrowheadEnd-style.none'\n\t| 'arrowheadEnd-style.arrow'\n\t| 'arrowheadEnd-style.bar'\n\t| 'arrowheadEnd-style.diamond'\n\t| 'arrowheadEnd-style.dot'\n\t| 'arrowheadEnd-style.inverted'\n\t| 'arrowheadEnd-style.pipe'\n\t| 'arrowheadEnd-style.square'\n\t| 'arrowheadEnd-style.triangle'\n\t| 'spline-style.line'\n\t| 'spline-style.cubic'\n\t| 'arrow-kind-style.arc'\n\t| 'arrow-kind-style.elbow'\n\t| 'tool.select'\n\t| 'tool.hand'\n\t| 'tool.draw'\n\t| 'tool.eraser'\n\t| 'tool.arrow-down'\n\t| 'tool.arrow-left'\n\t| 'tool.arrow-right'\n\t| 'tool.arrow-up'\n\t| 'tool.arrow'\n\t| 'tool.cloud'\n\t| 'tool.diamond'\n\t| 'tool.ellipse'\n\t| 'tool.heart'\n\t| 'tool.hexagon'\n\t| 'tool.highlight'\n\t| 'tool.line'\n\t| 'tool.octagon'\n\t| 'tool.oval'\n\t| 'tool.pentagon'\n\t| 'tool.rectangle'\n\t| 'tool.rhombus'\n\t| 'tool.star'\n\t| 'tool.trapezoid'\n\t| 'tool.triangle'\n\t| 'tool.x-box'\n\t| 'tool.check-box'\n\t| 'tool.media'\n\t| 'tool.frame'\n\t| 'tool.note'\n\t| 'tool.laser'\n\t| 'tool.embed'\n\t| 'tool.text'\n\t| 'tool.pointer-down'\n\t| 'tool.image-zoom'\n\t| 'tool.replace-media'\n\t| 'tool.flip-horz'\n\t| 'tool.flip-vert'\n\t| 'tool.rotate-cw'\n\t| 'tool.aspect-ratio'\n\t| 'tool.aspect-ratio.original'\n\t| 'tool.aspect-ratio.square'\n\t| 'tool.aspect-ratio.circle'\n\t| 'tool.aspect-ratio.landscape'\n\t| 'tool.aspect-ratio.portrait'\n\t| 'tool.aspect-ratio.wide'\n\t| 'tool.image-toolbar-title'\n\t| 'tool.image-crop'\n\t| 'tool.image-crop-confirm'\n\t| 'tool.media-alt-text'\n\t| 'tool.media-alt-text-desc'\n\t| 'tool.media-alt-text-confirm'\n\t| 'tool.rich-text-bold'\n\t| 'tool.rich-text-italic'\n\t| 'tool.rich-text-code'\n\t| 'tool.rich-text-highlight'\n\t| 'tool.rich-text-strikethrough'\n\t| 'tool.rich-text-link'\n\t| 'tool.rich-text-link-visit'\n\t| 'tool.rich-text-link-remove'\n\t| 'tool.rich-text-header'\n\t| 'tool.rich-text-bulletList'\n\t| 'tool.rich-text-toolbar-title'\n\t| 'tool.rich-text-orderedList'\n\t| 'tool.bookmark'\n\t| 'a11y.status'\n\t| 'a11y.skip-to-main-content'\n\t| 'a11y.shape-index'\n\t| 'a11y.shape-image'\n\t| 'a11y.shape-video'\n\t| 'a11y.multiple-shapes'\n\t| 'a11y.select-shape'\n\t| 'a11y.select-shape-direction'\n\t| 'a11y.enter-leave-container'\n\t| 'a11y.repeat-shape'\n\t| 'a11y.move-shape'\n\t| 'a11y.move-shape-faster'\n\t| 'a11y.rotate-shape-cw'\n\t| 'a11y.rotate-shape-ccw'\n\t| 'a11y.rotate-shape-cw-fine'\n\t| 'a11y.rotate-shape-ccw-fine'\n\t| 'a11y.enlarge-shape'\n\t| 'a11y.shrink-shape'\n\t| 'a11y.pan-camera'\n\t| 'a11y.adjust-shape-styles'\n\t| 'a11y.open-context-menu'\n\t| 'a11y.open-keyboard-shortcuts'\n\t| 'menu.title'\n\t| 'menu.theme'\n\t| 'menu.color-theme'\n\t| 'menu.accessibility'\n\t| 'menu.copy-as'\n\t| 'menu.edit'\n\t| 'menu.export-as'\n\t| 'menu.file'\n\t| 'menu.language'\n\t| 'menu.preferences'\n\t| 'menu.view'\n\t| 'menu.input-device'\n\t| 'context-menu.title'\n\t| 'context-menu.edit'\n\t| 'context-menu.arrange'\n\t| 'context-menu.copy-as'\n\t| 'context-menu.export-as'\n\t| 'context-menu.export-all-as'\n\t| 'context-menu.move-to-page'\n\t| 'context-menu.reorder'\n\t| 'page-menu.title'\n\t| 'page-menu.create-new-page'\n\t| 'page-menu.max-pages-reached'\n\t| 'page-menu.new-page-initial-name'\n\t| 'page-menu.edit-start'\n\t| 'page-menu.edit-done'\n\t| 'page-menu.go-to-page'\n\t| 'page-menu.resize'\n\t| 'page-menu.submenu.rename'\n\t| 'page-menu.submenu.duplicate-page'\n\t| 'page-menu.submenu.title'\n\t| 'page-menu.submenu.move-down'\n\t| 'page-menu.submenu.move-up'\n\t| 'page-menu.submenu.delete'\n\t| 'share-menu.title'\n\t| 'share-menu.save-note'\n\t| 'share-menu.fork-note'\n\t| 'share-menu.share-project'\n\t| 'share-menu.copy-link'\n\t| 'share-menu.create-snapshot-link'\n\t| 'share-menu.snapshot-link-note'\n\t| 'share-menu.copy-readonly-link'\n\t| 'share-menu.offline-note'\n\t| 'share-menu.copy-link-note'\n\t| 'share-menu.copy-readonly-link-note'\n\t| 'share-menu.project-too-large'\n\t| 'share-menu.upload-failed'\n\t| 'share-menu.creating-project'\n\t| 'share-menu.copied'\n\t| 'document-name-menu.copy-link'\n\t| 'status.offline'\n\t| 'people-menu.title'\n\t| 'people-menu.change-name'\n\t| 'people-menu.avatar-color'\n\t| 'people-menu.change-color'\n\t| 'people-menu.follow'\n\t| 'people-menu.following'\n\t| 'people-menu.leading'\n\t| 'people-menu.user'\n\t| 'people-menu.invite'\n\t| 'people-menu.anonymous-user'\n\t| 'help-menu.import-tldr-file'\n\t| 'help-menu.title'\n\t| 'help-menu.about'\n\t| 'help-menu.discord'\n\t| 'help-menu.github'\n\t| 'help-menu.keyboard-shortcuts'\n\t| 'help-menu.twitter'\n\t| 'help-menu.terms'\n\t| 'help-menu.privacy'\n\t| 'actions-menu.title'\n\t| 'edit-link-dialog.title'\n\t| 'edit-link-dialog.invalid-url'\n\t| 'edit-link-dialog.detail'\n\t| 'edit-link-dialog.url'\n\t| 'edit-link-dialog.clear'\n\t| 'edit-link-dialog.save'\n\t| 'edit-link-dialog.cancel'\n\t| 'edit-link-dialog.external-link'\n\t| 'embed-dialog.title'\n\t| 'embed-dialog.back'\n\t| 'embed-dialog.create'\n\t| 'embed-dialog.cancel'\n\t| 'embed-dialog.url'\n\t| 'embed-dialog.instruction'\n\t| 'embed-dialog.invalid-url'\n\t| 'shortcuts-dialog.title'\n\t| 'shortcuts-dialog.edit'\n\t| 'shortcuts-dialog.file'\n\t| 'shortcuts-dialog.preferences'\n\t| 'shortcuts-dialog.tools'\n\t| 'shortcuts-dialog.transform'\n\t| 'shortcuts-dialog.view'\n\t| 'shortcuts-dialog.collaboration'\n\t| 'shortcuts-dialog.a11y'\n\t| 'shortcuts-dialog.text-formatting'\n\t| 'style-panel.title'\n\t| 'style-panel.align'\n\t| 'style-panel.label-align'\n\t| 'style-panel.vertical-align'\n\t| 'style-panel.position'\n\t| 'style-panel.arrowheads'\n\t| 'style-panel.arrowhead-start'\n\t| 'style-panel.arrowhead-end'\n\t| 'style-panel.arrow-kind'\n\t| 'style-panel.color'\n\t| 'style-panel.dash'\n\t| 'style-panel.fill'\n\t| 'style-panel.font'\n\t| 'style-panel.geo'\n\t| 'style-panel.mixed'\n\t| 'style-panel.opacity'\n\t| 'style-panel.size'\n\t| 'style-panel.spline'\n\t| 'style-panel.selected'\n\t| 'tool-panel.title'\n\t| 'tool-panel.more'\n\t| 'navigation-zone.title'\n\t| 'navigation-zone.minimap'\n\t| 'navigation-zone.toggle-minimap'\n\t| 'navigation-zone.zoom'\n\t| 'focus-mode.toggle-focus-mode'\n\t| 'toast.close'\n\t| 'toast.success'\n\t| 'toast.error'\n\t| 'toast.info'\n\t| 'toast.warning'\n\t| 'file-system.file-open-error.title'\n\t| 'file-system.file-open-error.not-a-tldraw-file'\n\t| 'file-system.file-open-error.file-format-version-too-new'\n\t| 'file-system.file-open-error.generic-corrupted-file'\n\t| 'file-system.confirm-open.title'\n\t| 'file-system.confirm-open.description'\n\t| 'file-system.confirm-open.cancel'\n\t| 'file-system.confirm-open.open'\n\t| 'file-system.confirm-open.dont-show-again'\n\t| 'file-system.confirm-clear.title'\n\t| 'file-system.confirm-clear.description'\n\t| 'file-system.confirm-clear.cancel'\n\t| 'file-system.confirm-clear.continue'\n\t| 'file-system.confirm-clear.dont-show-again'\n\t| 'file-system.shared-document-file-open-error.title'\n\t| 'file-system.shared-document-file-open-error.description'\n\t| 'sharing.confirm-leave.title'\n\t| 'sharing.confirm-leave.description'\n\t| 'sharing.confirm-leave.cancel'\n\t| 'sharing.confirm-leave.leave'\n\t| 'sharing.confirm-leave.dont-show-again'\n\t| 'toast.error.export-fail.title'\n\t| 'toast.error.export-fail.desc'\n\t| 'toast.error.copy-fail.title'\n\t| 'toast.error.copy-fail.desc'\n\t| 'context.pages.new-page'\n\t| 'vscode.file-open.desc'\n\t| 'vscode.file-open.open'\n\t| 'vscode.file-open.backup'\n\t| 'vscode.file-open.backup-saved'\n\t| 'vscode.file-open.backup-failed'\n\t| 'vscode.file-open.dont-show-again'\n\t| 'cursor-chat.type-to-chat'\n\t| 'app.loading'\n\t| 'handle.resize-top'\n\t| 'handle.resize-bottom'\n\t| 'handle.resize-left'\n\t| 'handle.resize-right'\n\t| 'handle.resize-top-left'\n\t| 'handle.resize-top-right'\n\t| 'handle.resize-bottom-left'\n\t| 'handle.resize-bottom-right'\n\t| 'handle.rotate.top_left_rotate'\n\t| 'handle.rotate.top_right_rotate'\n\t| 'handle.rotate.bottom_left_rotate'\n\t| 'handle.rotate.bottom_right_rotate'\n\t| 'handle.rotate.mobile_rotate'\n\t| 'handle.crop.top'\n\t| 'handle.crop.bottom'\n\t| 'handle.crop.left'\n\t| 'handle.crop.right'\n\t| 'handle.crop.top-left'\n\t| 'handle.crop.top-right'\n\t| 'handle.crop.bottom-left'\n\t| 'handle.crop.bottom-right'\n\t| 'ui.close'\n\t| 'ui.checked'\n\t| 'ui.unchecked'\n"],
|
|
4
|
+
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\n/** @public */\nexport type TLUiTranslationKey =\n\t| 'action.toggle-auto-pan'\n\t| 'action.toggle-auto-zoom'\n\t| 'action.toggle-auto-none'\n\t| 'action.toggle-mouse'\n\t| 'action.toggle-trackpad'\n\t| 'action.convert-to-bookmark'\n\t| 'action.convert-to-embed'\n\t| 'action.open-embed-link'\n\t| 'action.align-bottom'\n\t| 'action.align-center-horizontal'\n\t| 'action.align-center-vertical'\n\t| 'action.align-center-horizontal.short'\n\t| 'action.align-center-vertical.short'\n\t| 'action.align-left'\n\t| 'action.align-right'\n\t| 'action.align-top'\n\t| 'action.back-to-content'\n\t| 'action.bring-forward'\n\t| 'action.bring-to-front'\n\t| 'action.copy-as-json.short'\n\t| 'action.copy-as-json'\n\t| 'action.copy-as-png.short'\n\t| 'action.copy-as-png'\n\t| 'action.copy-as-svg.short'\n\t| 'action.copy-as-svg'\n\t| 'action.copy'\n\t| 'action.copy-hovered-styles'\n\t| 'action.cut'\n\t| 'action.delete'\n\t| 'action.unlock-all'\n\t| 'action.distribute-horizontal'\n\t| 'action.distribute-vertical'\n\t| 'action.distribute-horizontal.short'\n\t| 'action.distribute-vertical.short'\n\t| 'action.download-original'\n\t| 'action.duplicate'\n\t| 'action.edit-link'\n\t| 'action.exit-pen-mode'\n\t| 'action.export-as-png.short'\n\t| 'action.export-as-png'\n\t| 'action.export-as-svg.short'\n\t| 'action.export-as-svg'\n\t| 'action.export-all-as-png.short'\n\t| 'action.export-all-as-png'\n\t| 'action.export-all-as-svg.short'\n\t| 'action.export-all-as-svg'\n\t| 'action.fit-frame-to-content'\n\t| 'action.flip-horizontal'\n\t| 'action.flip-vertical'\n\t| 'action.flip-horizontal.short'\n\t| 'action.flip-vertical.short'\n\t| 'action.fork-project'\n\t| 'action.fork-project-on-tldraw'\n\t| 'action.frame-selection'\n\t| 'action.group'\n\t| 'action.insert-embed'\n\t| 'action.insert-media'\n\t| 'action.leave-shared-project'\n\t| 'action.new-project'\n\t| 'action.new-shared-project'\n\t| 'action.open-cursor-chat'\n\t| 'action.open-kbd-shortcuts'\n\t| 'action.open-file'\n\t| 'action.pack'\n\t| 'action.paste'\n\t| 'action.paste-error-title'\n\t| 'action.paste-error-description'\n\t| 'action.print'\n\t| 'action.redo'\n\t| 'action.remove-frame'\n\t| 'action.rename'\n\t| 'action.rotate-ccw'\n\t| 'action.rotate-cw'\n\t| 'action.save-copy'\n\t| 'action.select-all'\n\t| 'action.select-none'\n\t| 'action.send-backward'\n\t| 'action.send-to-back'\n\t| 'action.share-project'\n\t| 'action.stack-horizontal'\n\t| 'action.stack-vertical'\n\t| 'action.stack-horizontal.short'\n\t| 'action.stack-vertical.short'\n\t| 'action.stop-following'\n\t| 'action.stretch-horizontal'\n\t| 'action.stretch-vertical'\n\t| 'action.stretch-horizontal.short'\n\t| 'action.stretch-vertical.short'\n\t| 'action.toggle-auto-size'\n\t| 'action.toggle-dark-mode.menu'\n\t| 'action.toggle-dark-mode'\n\t| 'action.toggle-paste-at-cursor.menu'\n\t| 'action.toggle-paste-at-cursor'\n\t| 'action.toggle-wrap-mode.menu'\n\t| 'action.toggle-wrap-mode'\n\t| 'action.toggle-reduce-motion.menu'\n\t| 'action.toggle-reduce-motion'\n\t| 'action.toggle-keyboard-shortcuts.menu'\n\t| 'action.toggle-keyboard-shortcuts'\n\t| 'action.enhanced-a11y-mode.menu'\n\t| 'action.enhanced-a11y-mode'\n\t| 'action.toggle-edge-scrolling.menu'\n\t| 'action.toggle-edge-scrolling'\n\t| 'action.toggle-invert-zoom.menu'\n\t| 'action.toggle-invert-zoom'\n\t| 'action.toggle-debug-mode.menu'\n\t| 'action.toggle-debug-mode'\n\t| 'action.toggle-focus-mode.menu'\n\t| 'action.toggle-focus-mode'\n\t| 'action.toggle-dynamic-size-mode.menu'\n\t| 'action.toggle-dynamic-size-mode'\n\t| 'action.toggle-grid.menu'\n\t| 'action.toggle-grid'\n\t| 'action.toggle-lock'\n\t| 'action.flatten-to-image'\n\t| 'action.toggle-snap-mode.menu'\n\t| 'action.toggle-snap-mode'\n\t| 'action.toggle-tool-lock.menu'\n\t| 'action.toggle-tool-lock'\n\t| 'action.toggle-transparent.context-menu'\n\t| 'action.toggle-transparent.menu'\n\t| 'action.toggle-transparent'\n\t| 'action.undo'\n\t| 'action.ungroup'\n\t| 'action.zoom-in'\n\t| 'action.zoom-out'\n\t| 'action.zoom-to-100'\n\t| 'action.zoom-to-fit'\n\t| 'action.zoom-to-selection'\n\t| 'action.zoom-quick'\n\t| 'action.select-zoom-tool'\n\t| 'assets.files.size-too-big'\n\t| 'assets.files.maximum-size'\n\t| 'assets.files.type-not-allowed'\n\t| 'assets.files.upload-failed'\n\t| 'assets.files.amount-too-many'\n\t| 'assets.url.failed'\n\t| 'theme.dark'\n\t| 'theme.light'\n\t| 'theme.system'\n\t| 'color-style.white'\n\t| 'color-style.black'\n\t| 'color-style.blue'\n\t| 'color-style.green'\n\t| 'color-style.grey'\n\t| 'color-style.light-blue'\n\t| 'color-style.light-green'\n\t| 'color-style.light-red'\n\t| 'color-style.light-violet'\n\t| 'color-style.orange'\n\t| 'color-style.red'\n\t| 'color-style.violet'\n\t| 'color-style.yellow'\n\t| 'fill-style.none'\n\t| 'document.default-name'\n\t| 'fill-style.semi'\n\t| 'fill-style.solid'\n\t| 'fill-style.pattern'\n\t| 'fill-style.fill'\n\t| 'fill-style.lined-fill'\n\t| 'dash-style.dashed'\n\t| 'dash-style.dotted'\n\t| 'dash-style.draw'\n\t| 'dash-style.solid'\n\t| 'size-style.s'\n\t| 'size-style.m'\n\t| 'size-style.l'\n\t| 'size-style.xl'\n\t| 'opacity-style.0.1'\n\t| 'opacity-style.0.25'\n\t| 'opacity-style.0.5'\n\t| 'opacity-style.0.75'\n\t| 'opacity-style.1'\n\t| 'font-style.draw'\n\t| 'font-style.sans'\n\t| 'font-style.serif'\n\t| 'font-style.mono'\n\t| 'align-style.start'\n\t| 'align-style.middle'\n\t| 'align-style.end'\n\t| 'align-style.justify'\n\t| 'verticalAlign-style.start'\n\t| 'verticalAlign-style.middle'\n\t| 'verticalAlign-style.end'\n\t| 'geo-style.arrow-down'\n\t| 'geo-style.arrow-left'\n\t| 'geo-style.arrow-right'\n\t| 'geo-style.arrow-up'\n\t| 'geo-style.cloud'\n\t| 'geo-style.diamond'\n\t| 'geo-style.ellipse'\n\t| 'geo-style.heart'\n\t| 'geo-style.hexagon'\n\t| 'geo-style.octagon'\n\t| 'geo-style.oval'\n\t| 'geo-style.pentagon'\n\t| 'geo-style.rectangle'\n\t| 'geo-style.rhombus'\n\t| 'geo-style.rhombus-2'\n\t| 'geo-style.star'\n\t| 'geo-style.trapezoid'\n\t| 'geo-style.triangle'\n\t| 'geo-style.x-box'\n\t| 'geo-style.check-box'\n\t| 'arrowheadStart-style.none'\n\t| 'arrowheadStart-style.arrow'\n\t| 'arrowheadStart-style.bar'\n\t| 'arrowheadStart-style.diamond'\n\t| 'arrowheadStart-style.dot'\n\t| 'arrowheadStart-style.inverted'\n\t| 'arrowheadStart-style.pipe'\n\t| 'arrowheadStart-style.square'\n\t| 'arrowheadStart-style.triangle'\n\t| 'arrowheadEnd-style.none'\n\t| 'arrowheadEnd-style.arrow'\n\t| 'arrowheadEnd-style.bar'\n\t| 'arrowheadEnd-style.diamond'\n\t| 'arrowheadEnd-style.dot'\n\t| 'arrowheadEnd-style.inverted'\n\t| 'arrowheadEnd-style.pipe'\n\t| 'arrowheadEnd-style.square'\n\t| 'arrowheadEnd-style.triangle'\n\t| 'spline-style.line'\n\t| 'spline-style.cubic'\n\t| 'arrow-kind-style.arc'\n\t| 'arrow-kind-style.elbow'\n\t| 'tool.select'\n\t| 'tool.hand'\n\t| 'tool.draw'\n\t| 'tool.eraser'\n\t| 'tool.arrow-down'\n\t| 'tool.arrow-left'\n\t| 'tool.arrow-right'\n\t| 'tool.arrow-up'\n\t| 'tool.arrow'\n\t| 'tool.cloud'\n\t| 'tool.diamond'\n\t| 'tool.ellipse'\n\t| 'tool.heart'\n\t| 'tool.hexagon'\n\t| 'tool.highlight'\n\t| 'tool.line'\n\t| 'tool.octagon'\n\t| 'tool.oval'\n\t| 'tool.pentagon'\n\t| 'tool.rectangle'\n\t| 'tool.rhombus'\n\t| 'tool.star'\n\t| 'tool.trapezoid'\n\t| 'tool.triangle'\n\t| 'tool.x-box'\n\t| 'tool.check-box'\n\t| 'tool.media'\n\t| 'tool.frame'\n\t| 'tool.note'\n\t| 'tool.laser'\n\t| 'tool.embed'\n\t| 'tool.text'\n\t| 'tool.pointer-down'\n\t| 'tool.image-zoom'\n\t| 'tool.replace-media'\n\t| 'tool.flip-horz'\n\t| 'tool.flip-vert'\n\t| 'tool.rotate-cw'\n\t| 'tool.aspect-ratio'\n\t| 'tool.aspect-ratio.original'\n\t| 'tool.aspect-ratio.square'\n\t| 'tool.aspect-ratio.circle'\n\t| 'tool.aspect-ratio.landscape'\n\t| 'tool.aspect-ratio.portrait'\n\t| 'tool.aspect-ratio.wide'\n\t| 'tool.image-toolbar-title'\n\t| 'tool.image-crop'\n\t| 'tool.image-crop-confirm'\n\t| 'tool.media-alt-text'\n\t| 'tool.media-alt-text-desc'\n\t| 'tool.media-alt-text-confirm'\n\t| 'tool.rich-text-bold'\n\t| 'tool.rich-text-italic'\n\t| 'tool.rich-text-code'\n\t| 'tool.rich-text-highlight'\n\t| 'tool.rich-text-strikethrough'\n\t| 'tool.rich-text-link'\n\t| 'tool.rich-text-link-visit'\n\t| 'tool.rich-text-link-remove'\n\t| 'tool.rich-text-header'\n\t| 'tool.rich-text-bulletList'\n\t| 'tool.rich-text-toolbar-title'\n\t| 'tool.rich-text-orderedList'\n\t| 'tool.bookmark'\n\t| 'a11y.status'\n\t| 'a11y.skip-to-main-content'\n\t| 'a11y.shape-index'\n\t| 'a11y.shape-image'\n\t| 'a11y.shape-video'\n\t| 'a11y.multiple-shapes'\n\t| 'a11y.select-shape'\n\t| 'a11y.select-shape-direction'\n\t| 'a11y.enter-leave-container'\n\t| 'a11y.repeat-shape'\n\t| 'a11y.move-shape'\n\t| 'a11y.move-shape-faster'\n\t| 'a11y.rotate-shape-cw'\n\t| 'a11y.rotate-shape-ccw'\n\t| 'a11y.rotate-shape-cw-fine'\n\t| 'a11y.rotate-shape-ccw-fine'\n\t| 'a11y.enlarge-shape'\n\t| 'a11y.shrink-shape'\n\t| 'a11y.pan-camera'\n\t| 'a11y.adjust-shape-styles'\n\t| 'a11y.open-context-menu'\n\t| 'a11y.open-keyboard-shortcuts'\n\t| 'menu.title'\n\t| 'menu.theme'\n\t| 'menu.color-theme'\n\t| 'menu.accessibility'\n\t| 'menu.copy-as'\n\t| 'menu.edit'\n\t| 'menu.export-as'\n\t| 'menu.file'\n\t| 'menu.language'\n\t| 'menu.preferences'\n\t| 'menu.view'\n\t| 'menu.input-device'\n\t| 'context-menu.title'\n\t| 'context-menu.edit'\n\t| 'context-menu.arrange'\n\t| 'context-menu.copy-as'\n\t| 'context-menu.export-as'\n\t| 'context-menu.export-all-as'\n\t| 'context-menu.move-to-page'\n\t| 'context-menu.reorder'\n\t| 'page-menu.title'\n\t| 'page-menu.create-new-page'\n\t| 'page-menu.max-pages-reached'\n\t| 'page-menu.new-page-initial-name'\n\t| 'page-menu.edit-start'\n\t| 'page-menu.edit-done'\n\t| 'page-menu.go-to-page'\n\t| 'page-menu.resize'\n\t| 'page-menu.submenu.rename'\n\t| 'page-menu.submenu.duplicate-page'\n\t| 'page-menu.submenu.title'\n\t| 'page-menu.submenu.move-down'\n\t| 'page-menu.submenu.move-up'\n\t| 'page-menu.submenu.delete'\n\t| 'share-menu.title'\n\t| 'share-menu.save-note'\n\t| 'share-menu.fork-note'\n\t| 'share-menu.share-project'\n\t| 'share-menu.copy-link'\n\t| 'share-menu.create-snapshot-link'\n\t| 'share-menu.snapshot-link-note'\n\t| 'share-menu.copy-readonly-link'\n\t| 'share-menu.offline-note'\n\t| 'share-menu.copy-link-note'\n\t| 'share-menu.copy-readonly-link-note'\n\t| 'share-menu.project-too-large'\n\t| 'share-menu.upload-failed'\n\t| 'share-menu.creating-project'\n\t| 'share-menu.copied'\n\t| 'document-name-menu.copy-link'\n\t| 'status.offline'\n\t| 'people-menu.title'\n\t| 'people-menu.change-name'\n\t| 'people-menu.avatar-color'\n\t| 'people-menu.change-color'\n\t| 'people-menu.follow'\n\t| 'people-menu.following'\n\t| 'people-menu.leading'\n\t| 'people-menu.user'\n\t| 'people-menu.invite'\n\t| 'people-menu.anonymous-user'\n\t| 'help-menu.import-tldr-file'\n\t| 'help-menu.title'\n\t| 'help-menu.about'\n\t| 'help-menu.discord'\n\t| 'help-menu.github'\n\t| 'help-menu.keyboard-shortcuts'\n\t| 'help-menu.twitter'\n\t| 'help-menu.terms'\n\t| 'help-menu.privacy'\n\t| 'actions-menu.title'\n\t| 'edit-link-dialog.title'\n\t| 'edit-link-dialog.invalid-url'\n\t| 'edit-link-dialog.detail'\n\t| 'edit-link-dialog.url'\n\t| 'edit-link-dialog.clear'\n\t| 'edit-link-dialog.save'\n\t| 'edit-link-dialog.cancel'\n\t| 'edit-link-dialog.external-link'\n\t| 'embed-dialog.title'\n\t| 'embed-dialog.back'\n\t| 'embed-dialog.create'\n\t| 'embed-dialog.cancel'\n\t| 'embed-dialog.url'\n\t| 'embed-dialog.instruction'\n\t| 'embed-dialog.invalid-url'\n\t| 'shortcuts-dialog.title'\n\t| 'shortcuts-dialog.edit'\n\t| 'shortcuts-dialog.file'\n\t| 'shortcuts-dialog.preferences'\n\t| 'shortcuts-dialog.tools'\n\t| 'shortcuts-dialog.transform'\n\t| 'shortcuts-dialog.view'\n\t| 'shortcuts-dialog.collaboration'\n\t| 'shortcuts-dialog.a11y'\n\t| 'shortcuts-dialog.text-formatting'\n\t| 'style-panel.title'\n\t| 'style-panel.align'\n\t| 'style-panel.label-align'\n\t| 'style-panel.vertical-align'\n\t| 'style-panel.position'\n\t| 'style-panel.arrowheads'\n\t| 'style-panel.arrowhead-start'\n\t| 'style-panel.arrowhead-end'\n\t| 'style-panel.arrow-kind'\n\t| 'style-panel.color'\n\t| 'style-panel.dash'\n\t| 'style-panel.fill'\n\t| 'style-panel.font'\n\t| 'style-panel.geo'\n\t| 'style-panel.mixed'\n\t| 'style-panel.opacity'\n\t| 'style-panel.size'\n\t| 'style-panel.spline'\n\t| 'style-panel.selected'\n\t| 'tool-panel.title'\n\t| 'tool-panel.more'\n\t| 'navigation-zone.title'\n\t| 'navigation-zone.minimap'\n\t| 'navigation-zone.toggle-minimap'\n\t| 'navigation-zone.zoom'\n\t| 'focus-mode.toggle-focus-mode'\n\t| 'toast.close'\n\t| 'toast.success'\n\t| 'toast.error'\n\t| 'toast.info'\n\t| 'toast.warning'\n\t| 'file-system.file-open-error.title'\n\t| 'file-system.file-open-error.not-a-tldraw-file'\n\t| 'file-system.file-open-error.file-format-version-too-new'\n\t| 'file-system.file-open-error.generic-corrupted-file'\n\t| 'file-system.confirm-open.title'\n\t| 'file-system.confirm-open.description'\n\t| 'file-system.confirm-open.cancel'\n\t| 'file-system.confirm-open.open'\n\t| 'file-system.confirm-open.dont-show-again'\n\t| 'file-system.confirm-clear.title'\n\t| 'file-system.confirm-clear.description'\n\t| 'file-system.confirm-clear.cancel'\n\t| 'file-system.confirm-clear.continue'\n\t| 'file-system.confirm-clear.dont-show-again'\n\t| 'file-system.shared-document-file-open-error.title'\n\t| 'file-system.shared-document-file-open-error.description'\n\t| 'sharing.confirm-leave.title'\n\t| 'sharing.confirm-leave.description'\n\t| 'sharing.confirm-leave.cancel'\n\t| 'sharing.confirm-leave.leave'\n\t| 'sharing.confirm-leave.dont-show-again'\n\t| 'toast.error.export-fail.title'\n\t| 'toast.error.export-fail.desc'\n\t| 'toast.error.copy-fail.title'\n\t| 'toast.error.copy-fail.desc'\n\t| 'context.pages.new-page'\n\t| 'vscode.file-open.desc'\n\t| 'vscode.file-open.open'\n\t| 'vscode.file-open.backup'\n\t| 'vscode.file-open.backup-saved'\n\t| 'vscode.file-open.backup-failed'\n\t| 'vscode.file-open.dont-show-again'\n\t| 'cursor-chat.type-to-chat'\n\t| 'app.loading'\n\t| 'handle.resize-top'\n\t| 'handle.resize-bottom'\n\t| 'handle.resize-left'\n\t| 'handle.resize-right'\n\t| 'handle.resize-top-left'\n\t| 'handle.resize-top-right'\n\t| 'handle.resize-bottom-left'\n\t| 'handle.resize-bottom-right'\n\t| 'handle.rotate.top_left_rotate'\n\t| 'handle.rotate.top_right_rotate'\n\t| 'handle.rotate.bottom_left_rotate'\n\t| 'handle.rotate.bottom_right_rotate'\n\t| 'handle.rotate.mobile_rotate'\n\t| 'handle.crop.top'\n\t| 'handle.crop.bottom'\n\t| 'handle.crop.left'\n\t| 'handle.crop.right'\n\t| 'handle.crop.top-left'\n\t| 'handle.crop.top-right'\n\t| 'handle.crop.bottom-left'\n\t| 'handle.crop.bottom-right'\n\t| 'ui.close'\n\t| 'ui.checked'\n\t| 'ui.unchecked'\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -48,6 +48,7 @@ const DEFAULT_TRANSLATION = {
|
|
|
48
48
|
"action.copy-as-svg.short": "SVG",
|
|
49
49
|
"action.copy-as-svg": "Copy as SVG",
|
|
50
50
|
"action.copy": "Copy",
|
|
51
|
+
"action.copy-hovered-styles": "Copy hovered styles",
|
|
51
52
|
"action.cut": "Cut",
|
|
52
53
|
"action.delete": "Delete",
|
|
53
54
|
"action.unlock-all": "Unlock all",
|
|
@@ -74,6 +75,7 @@ const DEFAULT_TRANSLATION = {
|
|
|
74
75
|
"action.flip-vertical.short": "Flip V",
|
|
75
76
|
"action.fork-project": "Fork this project",
|
|
76
77
|
"action.fork-project-on-tldraw": "Fork project on tldraw",
|
|
78
|
+
"action.frame-selection": "Frame selection",
|
|
77
79
|
"action.group": "Group",
|
|
78
80
|
"action.insert-embed": "Insert embed\u2026",
|
|
79
81
|
"action.insert-media": "Upload media\u2026",
|