tldraw 3.16.0-canary.f55016ece635 → 3.16.0-canary.f5bf2b535ea7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.d.ts +227 -110
- package/dist-cjs/index.js +29 -14
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +10 -0
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +6 -0
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +3 -2
- package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +1 -1
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +4 -4
- package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +8 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +8 -2
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -0
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +2 -1
- package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
- package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -5
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
- package/dist-cjs/lib/shapes/text/PlainTextArea.js +3 -2
- package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +3 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/ui/components/A11y.js +1 -1
- package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +5 -5
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
- package/dist-cjs/lib/ui/components/LanguageMenu.js +1 -0
- package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +2 -1
- package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
- package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +1 -1
- package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +147 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +23 -22
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +23 -20
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +2 -0
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +38 -9
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
- package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +2 -1
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +6 -2
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +5 -3
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +18 -5
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +3 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +47 -3
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +3 -0
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +8 -8
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +13 -8
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/events.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
- package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/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 +6 -2
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
- package/dist-cjs/lib/ui/kbd-utils.js +9 -3
- package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/export/copyAs.js +1 -2
- package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
- package/dist-cjs/lib/utils/export/export.js +0 -20
- package/dist-cjs/lib/utils/export/export.js.map +2 -2
- package/dist-cjs/lib/utils/export/exportAs.js +1 -2
- package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
- package/dist-esm/index.d.mts +227 -110
- package/dist-esm/index.mjs +59 -28
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +10 -0
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +3 -2
- package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +1 -1
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +4 -5
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +8 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +9 -3
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +1 -0
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +2 -1
- package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
- package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +3 -6
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/PlainTextArea.mjs +4 -3
- package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +3 -1
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/ui/components/A11y.mjs +1 -2
- package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +5 -5
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
- package/dist-esm/lib/ui/components/LanguageMenu.mjs +1 -0
- package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +2 -1
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +1 -2
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +135 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +20 -19
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +20 -17
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +2 -0
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +38 -9
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
- package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +2 -1
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +1 -1
- package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +6 -2
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +11 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +6 -4
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +18 -5
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +3 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +48 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +3 -0
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +8 -8
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +13 -8
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/events.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +1 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +1 -1
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +6 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
- package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
- package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
- package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
- package/dist-esm/lib/utils/export/export.mjs +0 -20
- package/dist-esm/lib/utils/export/export.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
- package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
- package/package.json +3 -3
- package/src/index.ts +45 -21
- package/src/lib/defaultExternalContentHandlers.ts +14 -0
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +83 -13
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +99 -5
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +41 -0
- package/src/lib/shapes/arrow/arrow-types.ts +3 -5
- package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
- package/src/lib/shapes/arrow/arrowTargetState.ts +34 -3
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +1 -1
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +4 -5
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +9 -0
- package/src/lib/shapes/frame/components/FrameLabelInput.tsx +10 -3
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +1 -0
- package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -0
- package/src/lib/shapes/note/NoteShapeUtil.tsx +1 -0
- package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
- package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
- package/src/lib/shapes/shared/useEditablePlainText.ts +3 -10
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
- package/src/lib/shapes/text/PlainTextArea.tsx +4 -3
- package/src/lib/shapes/text/RichTextArea.tsx +3 -4
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +6 -2
- package/src/lib/ui/components/A11y.tsx +1 -2
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +5 -5
- package/src/lib/ui/components/LanguageMenu.tsx +1 -0
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +2 -1
- package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +1 -2
- package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
- package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -381
- package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +70 -50
- package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
- package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +28 -19
- package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
- package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
- package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -0
- package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +32 -15
- package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
- package/src/lib/ui/components/Toolbar/LinkEditor.tsx +1 -0
- package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +1 -1
- package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +9 -2
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +7 -3
- package/src/lib/ui/components/primitives/TldrawUiInput.tsx +6 -3
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +52 -32
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +5 -1
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +67 -13
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +9 -9
- package/src/lib/ui/context/actions.tsx +20 -8
- package/src/lib/ui/context/events.tsx +1 -1
- package/src/lib/ui/hooks/useClipboardEvents.ts +1 -2
- package/src/lib/ui/hooks/useExportAs.ts +3 -2
- package/src/lib/ui/hooks/useTools.tsx +1 -1
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +4 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +6 -2
- package/src/lib/ui/kbd-utils.ts +10 -3
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +40 -3
- package/src/lib/utils/export/copyAs.ts +1 -24
- package/src/lib/utils/export/export.ts +0 -36
- package/src/lib/utils/export/exportAs.ts +1 -32
- package/src/test/TestEditor.ts +8 -2
- package/src/test/custom-clipping.test.ts +436 -0
- package/src/test/frames.test.ts +15 -0
- package/src/test/getCulledShapes.test.tsx +71 -2
- package/tldraw.css +48 -6
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -131
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
|
@@ -579,3 +579,44 @@ describe("an arrow's parents", () => {
|
|
|
579
579
|
})
|
|
580
580
|
})
|
|
581
581
|
})
|
|
582
|
+
|
|
583
|
+
describe('Arrow export bounds', () => {
|
|
584
|
+
it('excludes labels from shape bounds for export', () => {
|
|
585
|
+
editor.selectAll().deleteShapes(editor.getSelectedShapeIds())
|
|
586
|
+
|
|
587
|
+
// Create shapes for the arrow to bind to
|
|
588
|
+
editor.createShapes([
|
|
589
|
+
{ id: ids.box1, type: 'geo', x: 100, y: 100, props: { w: 100, h: 100 } },
|
|
590
|
+
{ id: ids.box2, type: 'geo', x: 300, y: 100, props: { w: 100, h: 100 } },
|
|
591
|
+
])
|
|
592
|
+
|
|
593
|
+
// Create an arrow with a label
|
|
594
|
+
editor.createShapes([
|
|
595
|
+
{
|
|
596
|
+
id: ids.arrow1,
|
|
597
|
+
type: 'arrow',
|
|
598
|
+
x: 0,
|
|
599
|
+
y: 0,
|
|
600
|
+
props: {
|
|
601
|
+
start: { x: 0, y: 0 },
|
|
602
|
+
end: { x: 0, y: 100 },
|
|
603
|
+
richText: toRichText('Test Label'),
|
|
604
|
+
},
|
|
605
|
+
},
|
|
606
|
+
])
|
|
607
|
+
|
|
608
|
+
// Get the page bounds (should exclude labels due to excludeFromShapeBounds flag)
|
|
609
|
+
const pageBounds = editor.getShapePageBounds(ids.arrow1)
|
|
610
|
+
expect(pageBounds).toBeDefined()
|
|
611
|
+
|
|
612
|
+
// The bounds should be smaller than if labels were included
|
|
613
|
+
// Since the arrow has a label that's excluded, the bounds should be minimal
|
|
614
|
+
expect(pageBounds!.width).toBeLessThan(200) // Should not include label width
|
|
615
|
+
expect(pageBounds!.height).toBeLessThan(200) // Should not include label height
|
|
616
|
+
|
|
617
|
+
// Verify that the arrow has a label (which should be excluded from shape bounds)
|
|
618
|
+
const arrow = editor.getShape(ids.arrow1) as TLArrowShape
|
|
619
|
+
expect(arrow.props.richText).toBeDefined()
|
|
620
|
+
expect(arrow.props.richText).not.toBeNull()
|
|
621
|
+
})
|
|
622
|
+
})
|
|
@@ -81,7 +81,7 @@ export interface ArrowShapeOptions {
|
|
|
81
81
|
*/
|
|
82
82
|
readonly hoverPreciseTimeout: number
|
|
83
83
|
/**
|
|
84
|
-
* When pointing at a shape using the arrow tool or
|
|
84
|
+
* When pointing at a shape using the arrow tool or dragging an arrow terminal handle, how long
|
|
85
85
|
* should we wait before we assume the user is targeting precisely instead of imprecisely.
|
|
86
86
|
*/
|
|
87
87
|
readonly pointingPreciseTimeout: number
|
|
@@ -90,13 +90,11 @@ export interface ArrowShapeOptions {
|
|
|
90
90
|
* When creating an arrow, should it stop exactly at the pointer, or should
|
|
91
91
|
* it stop at the edge of the target shape.
|
|
92
92
|
*/
|
|
93
|
-
|
|
94
|
-
readonly shouldBeExact: (editor: Editor) => boolean
|
|
93
|
+
shouldBeExact(editor: Editor, isPrecise: boolean): boolean
|
|
95
94
|
/**
|
|
96
95
|
* When creating an arrow, should it bind to the target shape.
|
|
97
96
|
*/
|
|
98
|
-
|
|
99
|
-
readonly shouldIgnoreTargets: (editor: Editor) => boolean
|
|
97
|
+
shouldIgnoreTargets(editor: Editor): boolean
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
/** @public */
|
|
@@ -227,6 +227,14 @@ interface ArrowheadInfo {
|
|
|
227
227
|
hasEndArrowhead: boolean
|
|
228
228
|
}
|
|
229
229
|
export function getArrowLabelPosition(editor: Editor, shape: TLArrowShape) {
|
|
230
|
+
const isEditing = editor.getEditingShapeId() === shape.id
|
|
231
|
+
if (!isEditing && isEmptyRichText(shape.props.richText)) {
|
|
232
|
+
// Short-circuit for empty labels.
|
|
233
|
+
const bodyGeom = getArrowBodyGeometry(editor, shape)
|
|
234
|
+
const labelCenter = bodyGeom.interpolateAlongEdge(0.5)
|
|
235
|
+
return { box: Box.FromCenter(labelCenter, new Vec(0, 0)), debugGeom: [] }
|
|
236
|
+
}
|
|
237
|
+
|
|
230
238
|
const debugGeom: Geometry2d[] = []
|
|
231
239
|
const info = getArrowInfo(editor, shape)!
|
|
232
240
|
|
|
@@ -27,6 +27,11 @@ import {
|
|
|
27
27
|
ElbowArrowSideDeltas,
|
|
28
28
|
} from './elbow/definitions'
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Options passed to {@link updateArrowTargetState}.
|
|
32
|
+
*
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
30
35
|
export interface UpdateArrowTargetStateOpts {
|
|
31
36
|
editor: Editor
|
|
32
37
|
pointInPageSpace: VecLike
|
|
@@ -37,6 +42,13 @@ export interface UpdateArrowTargetStateOpts {
|
|
|
37
42
|
oppositeBinding: TLArrowBinding | undefined
|
|
38
43
|
}
|
|
39
44
|
|
|
45
|
+
/**
|
|
46
|
+
* State representing what we're pointing to when drawing or updating an arrow. You can get this
|
|
47
|
+
* state using {@link getArrowTargetState}, and update it as part of an arrow interaction with
|
|
48
|
+
* {@link updateArrowTargetState} or {@link clearArrowTargetState}.
|
|
49
|
+
*
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
40
52
|
export interface ArrowTargetState {
|
|
41
53
|
target: TLShape
|
|
42
54
|
arrowKind: TLArrowShapeKind
|
|
@@ -63,14 +75,32 @@ function getArrowTargetAtom(editor: Editor) {
|
|
|
63
75
|
return arrowTargetStore.get(editor, () => atom('arrowTarget', null))
|
|
64
76
|
}
|
|
65
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Get the current arrow target state for an editor. See {@link ArrowTargetState} for more
|
|
80
|
+
* information.
|
|
81
|
+
*
|
|
82
|
+
* @public
|
|
83
|
+
*/
|
|
66
84
|
export function getArrowTargetState(editor: Editor) {
|
|
67
85
|
return getArrowTargetAtom(editor).get()
|
|
68
86
|
}
|
|
69
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Clear the current arrow target state for an editor. See {@link ArrowTargetState} for more
|
|
90
|
+
* information.
|
|
91
|
+
*
|
|
92
|
+
* @public
|
|
93
|
+
*/
|
|
70
94
|
export function clearArrowTargetState(editor: Editor) {
|
|
71
95
|
getArrowTargetAtom(editor).set(null)
|
|
72
96
|
}
|
|
73
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Update the current arrow target state for an editor. See {@link ArrowTargetState} for more
|
|
100
|
+
* information.
|
|
101
|
+
*
|
|
102
|
+
* @public
|
|
103
|
+
*/
|
|
74
104
|
export function updateArrowTargetState({
|
|
75
105
|
editor,
|
|
76
106
|
pointInPageSpace,
|
|
@@ -87,8 +117,6 @@ export function updateArrowTargetState({
|
|
|
87
117
|
return null
|
|
88
118
|
}
|
|
89
119
|
|
|
90
|
-
const isExact = util.options.shouldBeExact(editor)
|
|
91
|
-
|
|
92
120
|
const arrowKind = arrow ? arrow.props.kind : editor.getStyleForNextShape(ArrowShapeKindStyle)
|
|
93
121
|
|
|
94
122
|
const target = editor.getShapeAtPoint(pointInPageSpace, {
|
|
@@ -165,7 +193,7 @@ export function updateArrowTargetState({
|
|
|
165
193
|
}
|
|
166
194
|
}
|
|
167
195
|
|
|
168
|
-
let precise = isPrecise
|
|
196
|
+
let precise = isPrecise
|
|
169
197
|
|
|
170
198
|
if (!precise) {
|
|
171
199
|
// If we're switching to a new bound shape, then precise only if moving slowly
|
|
@@ -186,6 +214,9 @@ export function updateArrowTargetState({
|
|
|
186
214
|
}
|
|
187
215
|
}
|
|
188
216
|
|
|
217
|
+
const isExact = util.options.shouldBeExact(editor, precise)
|
|
218
|
+
if (isExact) precise = true
|
|
219
|
+
|
|
189
220
|
const shouldSnapCenter = !isExact && precise && targetGeometryInTargetSpace.isClosed
|
|
190
221
|
// const shouldSnapEdges = !isExact && (precise || !targetGeometryInTargetSpace.isClosed)
|
|
191
222
|
const shouldSnapEdges =
|
|
@@ -163,7 +163,7 @@ export class Pointing extends StateNode {
|
|
|
163
163
|
const endHandle = handles.find((h) => h.id === 'end')!
|
|
164
164
|
const change = util.onHandleDrag?.(this.editor.getShape(shape)!, {
|
|
165
165
|
handle: { ...endHandle, x: point.x, y: point.y },
|
|
166
|
-
isPrecise:
|
|
166
|
+
isPrecise: this.isPrecise,
|
|
167
167
|
isCreatingShape: true,
|
|
168
168
|
initial: initial,
|
|
169
169
|
})
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
debounce,
|
|
14
14
|
getHashForString,
|
|
15
15
|
lerp,
|
|
16
|
-
stopEventPropagation,
|
|
17
16
|
tlenv,
|
|
18
17
|
toDomPrecision,
|
|
19
18
|
useEditor,
|
|
@@ -132,9 +131,9 @@ function BookmarkShapeComponent({ shape }: { shape: TLBookmarkShape }) {
|
|
|
132
131
|
const [isFaviconValid, setIsFaviconValid] = useState(true)
|
|
133
132
|
const onFaviconError = () => setIsFaviconValid(false)
|
|
134
133
|
|
|
135
|
-
const
|
|
134
|
+
const markAsHandledOnShiftKey = useCallback<PointerEventHandler>(
|
|
136
135
|
(e) => {
|
|
137
|
-
if (!editor.inputs.shiftKey)
|
|
136
|
+
if (!editor.inputs.shiftKey) editor.markEventAsHandled(e)
|
|
138
137
|
},
|
|
139
138
|
[editor]
|
|
140
139
|
)
|
|
@@ -182,8 +181,8 @@ function BookmarkShapeComponent({ shape }: { shape: TLBookmarkShape }) {
|
|
|
182
181
|
target="_blank"
|
|
183
182
|
rel="noopener noreferrer"
|
|
184
183
|
draggable={false}
|
|
185
|
-
onPointerDown={
|
|
186
|
-
onPointerUp={
|
|
184
|
+
onPointerDown={markAsHandledOnShiftKey}
|
|
185
|
+
onPointerUp={markAsHandledOnShiftKey}
|
|
187
186
|
>
|
|
188
187
|
{isFaviconValid && asset?.props.favicon ? (
|
|
189
188
|
<img
|
|
@@ -100,6 +100,10 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
100
100
|
return false
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
override isExportBoundsContainer(): boolean {
|
|
104
|
+
return true
|
|
105
|
+
}
|
|
106
|
+
|
|
103
107
|
override getDefaultProps(): TLFrameShape['props'] {
|
|
104
108
|
return { w: 160 * 2, h: 90 * 2, name: '', color: 'black' }
|
|
105
109
|
}
|
|
@@ -192,6 +196,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
192
196
|
height,
|
|
193
197
|
isFilled: true,
|
|
194
198
|
isLabel: true,
|
|
199
|
+
excludeFromShapeBounds: true,
|
|
195
200
|
}),
|
|
196
201
|
],
|
|
197
202
|
})
|
|
@@ -335,6 +340,10 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
|
|
|
335
340
|
return true
|
|
336
341
|
}
|
|
337
342
|
|
|
343
|
+
override getClipPath(shape: TLFrameShape) {
|
|
344
|
+
return this.editor.getShapeGeometry(shape.id).vertices
|
|
345
|
+
}
|
|
346
|
+
|
|
338
347
|
override canReceiveNewChildrenOfType(shape: TLShape) {
|
|
339
348
|
return !shape.isLocked
|
|
340
349
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TLFrameShape, TLShapeId,
|
|
1
|
+
import { TLFrameShape, TLShapeId, useEditor } from '@tldraw/editor'
|
|
2
2
|
import { forwardRef, useCallback } from 'react'
|
|
3
3
|
import { defaultEmptyAs } from '../FrameShapeUtil'
|
|
4
4
|
|
|
@@ -8,12 +8,19 @@ export const FrameLabelInput = forwardRef<
|
|
|
8
8
|
>(({ id, name, isEditing }, ref) => {
|
|
9
9
|
const editor = useEditor()
|
|
10
10
|
|
|
11
|
+
const handlePointerDown = useCallback(
|
|
12
|
+
(e: React.PointerEvent) => {
|
|
13
|
+
if (isEditing) editor.markEventAsHandled(e)
|
|
14
|
+
},
|
|
15
|
+
[editor, isEditing]
|
|
16
|
+
)
|
|
17
|
+
|
|
11
18
|
const handleKeyDown = useCallback(
|
|
12
19
|
(e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
13
20
|
if (e.key === 'Enter' && !e.nativeEvent.isComposing) {
|
|
14
21
|
// need to prevent the enter keydown making it's way up to the Idle state
|
|
15
22
|
// and sending us back into edit mode
|
|
16
|
-
|
|
23
|
+
editor.markEventAsHandled(e)
|
|
17
24
|
e.currentTarget.blur()
|
|
18
25
|
editor.setEditingShape(null)
|
|
19
26
|
}
|
|
@@ -74,7 +81,7 @@ export const FrameLabelInput = forwardRef<
|
|
|
74
81
|
onKeyDown={handleKeyDown}
|
|
75
82
|
onBlur={handleBlur}
|
|
76
83
|
onChange={handleChange}
|
|
77
|
-
onPointerDown={
|
|
84
|
+
onPointerDown={handlePointerDown}
|
|
78
85
|
draggable={false}
|
|
79
86
|
/>
|
|
80
87
|
{defaultEmptyAs(name, 'Frame') + String.fromCharCode(8203)}
|
|
@@ -126,6 +126,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
126
126
|
height: unscaledLabelHeight * shape.props.scale,
|
|
127
127
|
isFilled: true,
|
|
128
128
|
isLabel: true,
|
|
129
|
+
excludeFromShapeBounds: true,
|
|
129
130
|
isEmptyLabel: isEmptyRichText(shape.props.richText),
|
|
130
131
|
}),
|
|
131
132
|
],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEditor, useValue } from '@tldraw/editor'
|
|
2
2
|
import classNames from 'classnames'
|
|
3
3
|
import { PointerEventHandler, useCallback } from 'react'
|
|
4
4
|
|
|
@@ -8,9 +8,9 @@ const LINK_ICON =
|
|
|
8
8
|
export function HyperlinkButton({ url }: { url: string }) {
|
|
9
9
|
const editor = useEditor()
|
|
10
10
|
const hideButton = useValue('zoomLevel', () => editor.getZoomLevel() < 0.32, [editor])
|
|
11
|
-
const
|
|
11
|
+
const markAsHandledOnShiftKey = useCallback<PointerEventHandler>(
|
|
12
12
|
(e) => {
|
|
13
|
-
if (!editor.inputs.shiftKey)
|
|
13
|
+
if (!editor.inputs.shiftKey) editor.markEventAsHandled(e)
|
|
14
14
|
},
|
|
15
15
|
[editor]
|
|
16
16
|
)
|
|
@@ -22,8 +22,8 @@ export function HyperlinkButton({ url }: { url: string }) {
|
|
|
22
22
|
href={url}
|
|
23
23
|
target="_blank"
|
|
24
24
|
rel="noopener noreferrer"
|
|
25
|
-
onPointerDown={
|
|
26
|
-
onPointerUp={
|
|
25
|
+
onPointerDown={markAsHandledOnShiftKey}
|
|
26
|
+
onPointerUp={markAsHandledOnShiftKey}
|
|
27
27
|
title={url}
|
|
28
28
|
draggable={false}
|
|
29
29
|
>
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
getPointerInfo,
|
|
6
6
|
noop,
|
|
7
7
|
preventDefault,
|
|
8
|
-
stopEventPropagation,
|
|
9
8
|
tlenv,
|
|
10
9
|
useEditor,
|
|
11
10
|
useValue,
|
|
@@ -129,14 +128,14 @@ export function useEditableTextCommon(shapeId: TLShapeId) {
|
|
|
129
128
|
// partially if we didn't dispatch/stop below.
|
|
130
129
|
|
|
131
130
|
editor.dispatch({
|
|
132
|
-
...getPointerInfo(e),
|
|
131
|
+
...getPointerInfo(editor, e),
|
|
133
132
|
type: 'pointer',
|
|
134
133
|
name: 'pointer_down',
|
|
135
134
|
target: 'shape',
|
|
136
135
|
shape: editor.getShape(shapeId)!,
|
|
137
136
|
})
|
|
138
137
|
|
|
139
|
-
|
|
138
|
+
e.stopPropagation() // we need to prevent blurring the input
|
|
140
139
|
},
|
|
141
140
|
[editor, shapeId]
|
|
142
141
|
)
|
|
@@ -161,15 +160,9 @@ export function useEditableTextCommon(shapeId: TLShapeId) {
|
|
|
161
160
|
handleFocus: noop,
|
|
162
161
|
handleBlur: noop,
|
|
163
162
|
handleInputPointerDown,
|
|
164
|
-
handleDoubleClick:
|
|
163
|
+
handleDoubleClick: editor.markEventAsHandled,
|
|
165
164
|
handlePaste,
|
|
166
165
|
isEditing,
|
|
167
166
|
isReadyForEditing,
|
|
168
167
|
}
|
|
169
168
|
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* @deprecated Use `useEditablePlainText` instead.
|
|
173
|
-
* @public
|
|
174
|
-
*/
|
|
175
|
-
export const useEditableText = useEditablePlainText
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { preventDefault,
|
|
1
|
+
import { preventDefault, useEditor } from '@tldraw/editor'
|
|
2
2
|
import React from 'react'
|
|
3
3
|
import { TextAreaProps } from './RichTextArea'
|
|
4
4
|
|
|
@@ -21,6 +21,7 @@ export const PlainTextArea = React.forwardRef<HTMLTextAreaElement, TextAreaProps
|
|
|
21
21
|
},
|
|
22
22
|
ref
|
|
23
23
|
) {
|
|
24
|
+
const editor = useEditor()
|
|
24
25
|
const onChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
25
26
|
handleChange({ plaintext: e.target.value })
|
|
26
27
|
}
|
|
@@ -46,8 +47,8 @@ export const PlainTextArea = React.forwardRef<HTMLTextAreaElement, TextAreaProps
|
|
|
46
47
|
onChange={onChange}
|
|
47
48
|
onKeyDown={(e) => handleKeyDown(e.nativeEvent)}
|
|
48
49
|
onBlur={handleBlur}
|
|
49
|
-
onTouchEnd={
|
|
50
|
-
onContextMenu={isEditing ?
|
|
50
|
+
onTouchEnd={editor.markEventAsHandled}
|
|
51
|
+
onContextMenu={isEditing ? (e) => e.stopPropagation() : undefined}
|
|
51
52
|
onPointerDown={handleInputPointerDown}
|
|
52
53
|
onPaste={handlePaste}
|
|
53
54
|
onDoubleClick={handleDoubleClick}
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
TLRichText,
|
|
11
11
|
TLShapeId,
|
|
12
12
|
preventDefault,
|
|
13
|
-
stopEventPropagation,
|
|
14
13
|
useEditor,
|
|
15
14
|
useEvent,
|
|
16
15
|
useUniqueSafeId,
|
|
@@ -233,13 +232,13 @@ export const RichTextArea = React.forwardRef<HTMLDivElement, TextAreaProps>(func
|
|
|
233
232
|
tabIndex={-1}
|
|
234
233
|
data-testid="rich-text-area"
|
|
235
234
|
className="tl-rich-text tl-text tl-text-input"
|
|
236
|
-
onContextMenu={isEditing ?
|
|
235
|
+
onContextMenu={isEditing ? (e) => e.stopPropagation() : undefined}
|
|
237
236
|
// N.B. When PointerStateExtension was introduced, this was moved there.
|
|
238
237
|
// However, that caused selecting over list items to break.
|
|
239
238
|
// The handleDOMEvents in TipTap don't seem to support the pointerDownCapture event.
|
|
240
|
-
onPointerDownCapture={
|
|
239
|
+
onPointerDownCapture={(e) => e.stopPropagation()}
|
|
241
240
|
// This onTouchEnd is important for Android to be able to change selection on text.
|
|
242
|
-
onTouchEnd={
|
|
241
|
+
onTouchEnd={(e) => e.stopPropagation()}
|
|
243
242
|
// On FF, there's a behavior where dragging a selection will grab that selection into
|
|
244
243
|
// the drag event. However, once the drag is over, and you select away from the textarea,
|
|
245
244
|
// starting a drag over the textarea will restart a selection drag instead of a shape drag.
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
sortByIndex,
|
|
14
14
|
structuredClone,
|
|
15
15
|
} from '@tldraw/editor'
|
|
16
|
+
import { ArrowShapeUtil } from '../../../shapes/arrow/ArrowShapeUtil'
|
|
16
17
|
import { clearArrowTargetState } from '../../../shapes/arrow/arrowTargetState'
|
|
17
18
|
import { getArrowBindings } from '../../../shapes/arrow/shared'
|
|
18
19
|
|
|
@@ -135,10 +136,13 @@ export class DraggingHandle extends StateNode {
|
|
|
135
136
|
}
|
|
136
137
|
|
|
137
138
|
// Only relevant to arrows
|
|
138
|
-
private exactTimeout = -1
|
|
139
|
+
private exactTimeout = -1
|
|
139
140
|
|
|
140
141
|
// Only relevant to arrows
|
|
141
142
|
private resetExactTimeout() {
|
|
143
|
+
const arrowUtil = this.editor.getShapeUtil<ArrowShapeUtil>('arrow')
|
|
144
|
+
const timeoutValue = arrowUtil.options.pointingPreciseTimeout
|
|
145
|
+
|
|
142
146
|
if (this.exactTimeout !== -1) {
|
|
143
147
|
this.clearExactTimeout()
|
|
144
148
|
}
|
|
@@ -150,7 +154,7 @@ export class DraggingHandle extends StateNode {
|
|
|
150
154
|
this.update()
|
|
151
155
|
}
|
|
152
156
|
this.exactTimeout = -1
|
|
153
|
-
},
|
|
157
|
+
}, timeoutValue)
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
// Only relevant to arrows
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
debugFlags,
|
|
3
3
|
Editor,
|
|
4
|
-
stopEventPropagation,
|
|
5
4
|
TLGeoShape,
|
|
6
5
|
TLShapeId,
|
|
7
6
|
unsafe__withoutCapture,
|
|
@@ -23,7 +22,7 @@ export function SkipToMainContent() {
|
|
|
23
22
|
|
|
24
23
|
const handleNavigateToFirstShape = useCallback(
|
|
25
24
|
(e: MouseEvent | KeyboardEvent) => {
|
|
26
|
-
|
|
25
|
+
editor.markEventAsHandled(e)
|
|
27
26
|
button.current?.blur()
|
|
28
27
|
const shapes = editor.getCurrentPageShapesInReadingOrder()
|
|
29
28
|
if (!shapes.length) return
|
package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx
CHANGED
|
@@ -157,7 +157,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
|
|
|
157
157
|
<TldrawUiMenuItem
|
|
158
158
|
id="a11y-select-next-shape-direction"
|
|
159
159
|
label="a11y.select-shape-direction"
|
|
160
|
-
kbd="cmd
|
|
160
|
+
kbd="cmd+[[↑→↓←]]"
|
|
161
161
|
onSelect={() => {
|
|
162
162
|
/* do nothing */
|
|
163
163
|
}}
|
|
@@ -165,7 +165,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
|
|
|
165
165
|
<TldrawUiMenuItem
|
|
166
166
|
id="a11y-select-next-shape-container"
|
|
167
167
|
label="a11y.enter-leave-container"
|
|
168
|
-
kbd="cmd+shift
|
|
168
|
+
kbd="cmd+shift+[[↑→]]"
|
|
169
169
|
onSelect={() => {
|
|
170
170
|
/* do nothing */
|
|
171
171
|
}}
|
|
@@ -173,7 +173,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
|
|
|
173
173
|
<TldrawUiMenuItem
|
|
174
174
|
id="a11y-pan-camera"
|
|
175
175
|
label="a11y.pan-camera"
|
|
176
|
-
kbd="[[Space]]
|
|
176
|
+
kbd="[[Space]]+[[↑→↓←]]"
|
|
177
177
|
onSelect={() => {
|
|
178
178
|
/* do nothing */
|
|
179
179
|
}}
|
|
@@ -197,7 +197,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
|
|
|
197
197
|
<TldrawUiMenuItem
|
|
198
198
|
id="a11y-move-shape"
|
|
199
199
|
label="a11y.move-shape"
|
|
200
|
-
kbd="↑→↓←"
|
|
200
|
+
kbd="[[↑→↓←]]"
|
|
201
201
|
onSelect={() => {
|
|
202
202
|
/* do nothing */
|
|
203
203
|
}}
|
|
@@ -205,7 +205,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
|
|
|
205
205
|
<TldrawUiMenuItem
|
|
206
206
|
id="a11y-move-shape-faster"
|
|
207
207
|
label="a11y.move-shape-faster"
|
|
208
|
-
kbd="shift
|
|
208
|
+
kbd="shift+[[↑→↓←]]"
|
|
209
209
|
onSelect={() => {
|
|
210
210
|
/* do nothing */
|
|
211
211
|
}}
|
|
@@ -159,7 +159,7 @@ export function DefaultMinimap() {
|
|
|
159
159
|
type: 'pointer',
|
|
160
160
|
target: 'canvas',
|
|
161
161
|
name: 'pointer_move',
|
|
162
|
-
...getPointerInfo(e),
|
|
162
|
+
...getPointerInfo(editor, e),
|
|
163
163
|
point: screenPoint,
|
|
164
164
|
isPen: editor.getInstanceState().isPenMode,
|
|
165
165
|
}
|
|
@@ -204,6 +204,7 @@ export function DefaultMinimap() {
|
|
|
204
204
|
<canvas
|
|
205
205
|
role="img"
|
|
206
206
|
aria-label={msg('navigation-zone.minimap')}
|
|
207
|
+
data-testid="minimap.canvas"
|
|
207
208
|
ref={rCanvas}
|
|
208
209
|
className="tlui-minimap__canvas"
|
|
209
210
|
onDoubleClick={onDoubleClick}
|
|
@@ -3,7 +3,6 @@ import {
|
|
|
3
3
|
TLPageId,
|
|
4
4
|
releasePointerCapture,
|
|
5
5
|
setPointerCapture,
|
|
6
|
-
stopEventPropagation,
|
|
7
6
|
tlenv,
|
|
8
7
|
useEditor,
|
|
9
8
|
useValue,
|
|
@@ -451,7 +450,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
|
|
|
451
450
|
if (e.key === 'Enter') {
|
|
452
451
|
if (page.id === currentPage.id) {
|
|
453
452
|
toggleEditing()
|
|
454
|
-
|
|
453
|
+
editor.markEventAsHandled(e)
|
|
455
454
|
}
|
|
456
455
|
}
|
|
457
456
|
}}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ReadonlySharedStyleMap,
|
|
3
|
+
useEditor,
|
|
4
|
+
usePassThroughWheelEvents,
|
|
5
|
+
useValue,
|
|
6
|
+
} from '@tldraw/editor'
|
|
2
7
|
import classNames from 'classnames'
|
|
3
8
|
import { ReactNode, memo, useCallback, useEffect, useRef } from 'react'
|
|
4
9
|
import { useRelevantStyles } from '../../hooks/useRelevantStyles'
|
|
5
10
|
import { DefaultStylePanelContent } from './DefaultStylePanelContent'
|
|
11
|
+
import { StylePanelContextProvider } from './StylePanelContext'
|
|
6
12
|
|
|
7
13
|
/** @public */
|
|
8
14
|
export interface TLUiStylePanelProps {
|
|
9
15
|
isMobile?: boolean
|
|
16
|
+
styles?: ReadonlySharedStyleMap | null
|
|
10
17
|
children?: ReactNode
|
|
11
18
|
}
|
|
12
19
|
|
|
13
20
|
/** @public @react */
|
|
14
21
|
export const DefaultStylePanel = memo(function DefaultStylePanel({
|
|
15
22
|
isMobile,
|
|
23
|
+
styles,
|
|
16
24
|
children,
|
|
17
25
|
}: TLUiStylePanelProps) {
|
|
18
26
|
const editor = useEditor()
|
|
@@ -21,15 +29,16 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
|
|
|
21
29
|
const ref = useRef<HTMLDivElement>(null)
|
|
22
30
|
usePassThroughWheelEvents(ref)
|
|
23
31
|
|
|
24
|
-
const styles = useRelevantStyles()
|
|
25
|
-
|
|
26
32
|
const handlePointerOut = useCallback(() => {
|
|
27
33
|
if (!isMobile) {
|
|
28
34
|
editor.updateInstanceState({ isChangingStyle: false })
|
|
29
35
|
}
|
|
30
36
|
}, [editor, isMobile])
|
|
31
37
|
|
|
32
|
-
const
|
|
38
|
+
const defaultStyles = useRelevantStyles()
|
|
39
|
+
if (styles === undefined) {
|
|
40
|
+
styles = defaultStyles
|
|
41
|
+
}
|
|
33
42
|
|
|
34
43
|
useEffect(() => {
|
|
35
44
|
function handleKeyDown(event: KeyboardEvent) {
|
|
@@ -47,14 +56,19 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
|
|
|
47
56
|
}, [editor])
|
|
48
57
|
|
|
49
58
|
return (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
styles && (
|
|
60
|
+
<div
|
|
61
|
+
ref={ref}
|
|
62
|
+
data-testid="style.panel"
|
|
63
|
+
className={classNames('tlui-style-panel', { 'tlui-style-panel__wrapper': !isMobile })}
|
|
64
|
+
data-ismobile={isMobile}
|
|
65
|
+
data-show-ui-labels={showUiLabels}
|
|
66
|
+
onPointerLeave={handlePointerOut}
|
|
67
|
+
>
|
|
68
|
+
<StylePanelContextProvider styles={styles}>
|
|
69
|
+
{children ?? <DefaultStylePanelContent />}
|
|
70
|
+
</StylePanelContextProvider>
|
|
71
|
+
</div>
|
|
72
|
+
)
|
|
59
73
|
)
|
|
60
74
|
})
|