tldraw 3.16.0-canary.7cd3b8a5bfd6 → 3.16.0-canary.7facbd2d2b7f
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 +315 -110
- package/dist-cjs/index.js +37 -14
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/Tldraw.js +12 -2
- package/dist-cjs/lib/Tldraw.js.map +2 -2
- package/dist-cjs/lib/defaultExternalContentHandlers.js +15 -4
- 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/freehand/svg.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/EraserTool/childStates/Erasing.js +25 -1
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
- package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +3 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +13 -12
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/assetUrls.js +13 -10
- package/dist-cjs/lib/ui/assetUrls.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/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
- package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
- 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} +24 -21
- 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 +75 -37
- 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 +10 -9
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +29 -10
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/components.js +2 -0
- package/dist-cjs/lib/ui/context/components.js.map +2 -2
- package/dist-cjs/lib/ui/context/events.js.map +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 +315 -110
- package/dist-esm/index.mjs +69 -29
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/Tldraw.mjs +14 -4
- package/dist-esm/lib/Tldraw.mjs.map +2 -2
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +15 -4
- 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/freehand/svg.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/EraserTool/childStates/Erasing.mjs +26 -1
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
- package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +3 -1
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +13 -12
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/assetUrls.mjs +13 -10
- package/dist-esm/lib/ui/assetUrls.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/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
- package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
- 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} +21 -18
- 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 +76 -37
- 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 +10 -9
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +29 -10
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/components.mjs +2 -0
- package/dist-esm/lib/ui/context/components.mjs.map +2 -2
- package/dist-esm/lib/ui/context/events.mjs.map +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 +11 -34
- package/src/index.ts +51 -22
- package/src/lib/Tldraw.tsx +15 -2
- package/src/lib/defaultExternalContentHandlers.ts +26 -4
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +85 -14
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +103 -8
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +48 -6
- 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/draw/DrawShapeTool.test.ts +0 -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/line/LineShapeUtil.test.tsx +4 -3
- package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
- 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/freehand/svg.ts +2 -0
- 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/shapes/text/TextShapeTool.test.ts +6 -5
- package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
- package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +6 -2
- package/src/lib/ui/TldrawUi.tsx +16 -10
- package/src/lib/ui/assetUrls.ts +13 -10
- package/src/lib/ui/components/A11y.tsx +1 -2
- package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
- 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 +82 -30
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +12 -11
- package/src/lib/ui/context/actions.tsx +36 -10
- package/src/lib/ui/context/components.tsx +3 -0
- 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 +43 -3
- package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
- package/src/lib/utils/export/copyAs.ts +1 -24
- package/src/lib/utils/export/export.ts +0 -36
- package/src/lib/utils/export/exportAs.ts +1 -32
- package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
- package/src/test/A11y.test.tsx +3 -2
- package/src/test/ClickManager.test.ts +7 -6
- package/src/test/Editor.test.tsx +20 -19
- package/src/test/EraserTool.test.ts +184 -13
- package/src/test/HandTool.test.ts +10 -9
- package/src/test/HighlightShape.test.ts +2 -1
- package/src/test/SelectTool.test.ts +3 -2
- package/src/test/TLUserPreferences.test.ts +4 -3
- package/src/test/TestEditor.ts +21 -17
- package/src/test/TldrawEditor.test.tsx +11 -10
- package/src/test/ZoomTool.test.ts +7 -6
- package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
- package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
- package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
- package/src/test/arrows-megabus.test.tsx +5 -4
- package/src/test/bindings.test.tsx +24 -37
- package/src/test/bookmark-shapes.test.ts +1 -8
- package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
- package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
- package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
- package/src/test/commands/alignShapes.test.tsx +25 -24
- package/src/test/commands/animationSpeed.test.ts +2 -1
- package/src/test/commands/centerOnPoint.test.ts +3 -2
- package/src/test/commands/clipboard.test.ts +3 -2
- package/src/test/commands/createShapes.test.ts +2 -1
- package/src/test/commands/deleteShapes.test.ts +2 -1
- package/src/test/commands/distributeShapes.test.tsx +11 -10
- package/src/test/commands/getSvgString.test.ts +2 -1
- package/src/test/commands/packShapes.test.ts +5 -4
- package/src/test/commands/resizeShape.test.ts +2 -1
- package/src/test/commands/rotateShapes.test.ts +7 -6
- package/src/test/commands/setCamera.test.ts +4 -3
- package/src/test/commands/setCurrentPage.test.ts +3 -2
- package/src/test/commands/stackShapes.test.ts +11 -10
- package/src/test/commands/stretch.test.tsx +13 -12
- package/src/test/createDeepLink.test.tsx +2 -1
- package/src/test/cropping.test.ts +3 -2
- package/src/test/custom-clipping.test.ts +436 -0
- package/src/test/drawing.test.ts +2 -1
- package/src/test/flipShapes.test.ts +4 -3
- package/src/test/frames.test.ts +25 -24
- package/src/test/getCulledShapes.test.tsx +74 -4
- package/src/test/groups.test.tsx +1 -1
- package/src/test/handleDeepLink.test.tsx +2 -1
- package/src/test/maxShapes.test.ts +3 -2
- package/src/test/modifiers.test.ts +5 -4
- package/src/test/navigation.test.ts +12 -11
- package/src/test/panning.test.ts +2 -1
- package/src/test/perf/perf.test.ts +2 -1
- package/src/test/registerDeepLinkListener.test.tsx +10 -9
- package/src/test/resizing.test.ts +39 -38
- package/src/test/select.test.tsx +4 -3
- package/src/test/selection-omnibus.test.ts +11 -10
- package/src/test/shapeutils.test.ts +4 -3
- package/src/test/translating.test.ts +9 -8
- package/tldraw.css +59 -6
- package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -131
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
- package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { CursorChatBubble } from '../components/CursorChatBubble'
|
|
13
13
|
import { DefaultDebugMenu } from '../components/DebugMenu/DefaultDebugMenu'
|
|
14
14
|
import { DefaultDebugPanel } from '../components/DefaultDebugPanel'
|
|
15
|
+
import { DefaultFollowingIndicator } from '../components/DefaultFollowingIndicator'
|
|
15
16
|
import { DefaultMenuPanel } from '../components/DefaultMenuPanel'
|
|
16
17
|
import { DefaultDialogs } from '../components/Dialogs'
|
|
17
18
|
import { TLUiHelpMenuProps } from '../components/HelpMenu/DefaultHelpMenu'
|
|
@@ -72,6 +73,7 @@ export interface TLUiComponents {
|
|
|
72
73
|
Dialogs?: ComponentType | null
|
|
73
74
|
Toasts?: ComponentType | null
|
|
74
75
|
A11y?: ComponentType | null
|
|
76
|
+
FollowingIndicator?: ComponentType | null
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
const TldrawUiComponentsContext = createContext<TLUiComponents | null>(null)
|
|
@@ -119,6 +121,7 @@ export function TldrawUiComponentsProvider({
|
|
|
119
121
|
Dialogs: DefaultDialogs,
|
|
120
122
|
Toasts: DefaultToasts,
|
|
121
123
|
A11y: DefaultA11yAnnouncer,
|
|
124
|
+
FollowingIndicator: DefaultFollowingIndicator,
|
|
122
125
|
..._overrides,
|
|
123
126
|
}),
|
|
124
127
|
[_overrides, showCollaborationUi]
|
|
@@ -123,7 +123,7 @@ export interface TLUiEventMap {
|
|
|
123
123
|
'shrink-shapes': null
|
|
124
124
|
'flatten-to-image': null
|
|
125
125
|
'a11y-repeat-shape-announce': null
|
|
126
|
-
'open-url': {
|
|
126
|
+
'open-url': { destinationUrl: string }
|
|
127
127
|
'open-context-menu': null
|
|
128
128
|
'adjust-shape-styles': null
|
|
129
129
|
'copy-link': null
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
compact,
|
|
9
9
|
isDefined,
|
|
10
10
|
preventDefault,
|
|
11
|
-
stopEventPropagation,
|
|
12
11
|
uniq,
|
|
13
12
|
useEditor,
|
|
14
13
|
useMaybeEditor,
|
|
@@ -763,7 +762,7 @@ export function useNativeClipboardEvents() {
|
|
|
763
762
|
|
|
764
763
|
const paste = (e: ClipboardEvent) => {
|
|
765
764
|
if (disablingMiddleClickPaste) {
|
|
766
|
-
|
|
765
|
+
editor.markEventAsHandled(e)
|
|
767
766
|
return
|
|
768
767
|
}
|
|
769
768
|
|
|
@@ -11,12 +11,13 @@ export function useExportAs() {
|
|
|
11
11
|
const msg = useTranslation()
|
|
12
12
|
|
|
13
13
|
return useCallback(
|
|
14
|
-
(ids: TLShapeId[],
|
|
14
|
+
(ids: TLShapeId[], opts: { format?: TLExportType; name?: string; scale?: number } = {}) => {
|
|
15
15
|
assert(editor, 'useExportAs: editor is required')
|
|
16
|
+
const { format = 'png', name, scale = 1 } = opts
|
|
16
17
|
exportAs(editor, ids, {
|
|
17
18
|
format,
|
|
18
19
|
name,
|
|
19
|
-
scale
|
|
20
|
+
scale,
|
|
20
21
|
}).catch((e) => {
|
|
21
22
|
console.error(e.message)
|
|
22
23
|
addToast({
|
|
@@ -176,7 +176,7 @@ export function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {
|
|
|
176
176
|
editor.createShape({
|
|
177
177
|
id,
|
|
178
178
|
type: 'arrow',
|
|
179
|
-
props: { start: { x: 0, y:
|
|
179
|
+
props: { start: { x: 0, y: 200 }, end: { x: 200, y: 0 } },
|
|
180
180
|
}),
|
|
181
181
|
})
|
|
182
182
|
trackEvent('drag-tool', { source, id: 'arrow' })
|
|
@@ -122,6 +122,7 @@ export type TLUiTranslationKey =
|
|
|
122
122
|
| 'action.zoom-to-fit'
|
|
123
123
|
| 'action.zoom-to-selection'
|
|
124
124
|
| 'assets.files.size-too-big'
|
|
125
|
+
| 'assets.files.maximum-size'
|
|
125
126
|
| 'assets.files.type-not-allowed'
|
|
126
127
|
| 'assets.files.upload-failed'
|
|
127
128
|
| 'assets.files.amount-too-many'
|
|
@@ -186,6 +187,7 @@ export type TLUiTranslationKey =
|
|
|
186
187
|
| 'geo-style.pentagon'
|
|
187
188
|
| 'geo-style.rectangle'
|
|
188
189
|
| 'geo-style.rhombus'
|
|
190
|
+
| 'geo-style.rhombus-2'
|
|
189
191
|
| 'geo-style.star'
|
|
190
192
|
| 'geo-style.trapezoid'
|
|
191
193
|
| 'geo-style.triangle'
|
|
@@ -260,6 +262,7 @@ export type TLUiTranslationKey =
|
|
|
260
262
|
| 'tool.aspect-ratio.wide'
|
|
261
263
|
| 'tool.image-toolbar-title'
|
|
262
264
|
| 'tool.image-crop'
|
|
265
|
+
| 'tool.image-crop-confirm'
|
|
263
266
|
| 'tool.media-alt-text'
|
|
264
267
|
| 'tool.media-alt-text-desc'
|
|
265
268
|
| 'tool.media-alt-text-confirm'
|
|
@@ -409,6 +412,7 @@ export type TLUiTranslationKey =
|
|
|
409
412
|
| 'style-panel.opacity'
|
|
410
413
|
| 'style-panel.size'
|
|
411
414
|
| 'style-panel.spline'
|
|
415
|
+
| 'style-panel.selected'
|
|
412
416
|
| 'tool-panel.title'
|
|
413
417
|
| 'tool-panel.more'
|
|
414
418
|
| 'navigation-zone.title'
|
|
@@ -92,9 +92,9 @@ export const DEFAULT_TRANSLATION = {
|
|
|
92
92
|
'action.toggle-wrap-mode': 'Toggle Select on wrap',
|
|
93
93
|
'action.toggle-reduce-motion.menu': 'Reduce motion',
|
|
94
94
|
'action.toggle-reduce-motion': 'Toggle reduce motion',
|
|
95
|
-
'action.toggle-keyboard-shortcuts.menu': '
|
|
95
|
+
'action.toggle-keyboard-shortcuts.menu': 'Enable keyboard shortcuts',
|
|
96
96
|
'action.toggle-keyboard-shortcuts': 'Toggle keyboard shortcuts',
|
|
97
|
-
'action.toggle-ui-labels.menu': 'UI labels',
|
|
97
|
+
'action.toggle-ui-labels.menu': 'Enable UI labels',
|
|
98
98
|
'action.toggle-ui-labels': 'Toggle UI labels',
|
|
99
99
|
'action.toggle-edge-scrolling.menu': 'Edge scrolling',
|
|
100
100
|
'action.toggle-edge-scrolling': 'Toggle edge scrolling',
|
|
@@ -123,6 +123,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
123
123
|
'action.zoom-to-fit': 'Zoom to fit',
|
|
124
124
|
'action.zoom-to-selection': 'Zoom to selection',
|
|
125
125
|
'assets.files.size-too-big': 'File size is too big',
|
|
126
|
+
'assets.files.maximum-size': 'Maximum file size is {size}',
|
|
126
127
|
'assets.files.type-not-allowed': 'File type is not allowed',
|
|
127
128
|
'assets.files.upload-failed': 'Upload failed',
|
|
128
129
|
'assets.files.amount-too-many': 'Too many files',
|
|
@@ -187,6 +188,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
187
188
|
'geo-style.pentagon': 'Pentagon',
|
|
188
189
|
'geo-style.rectangle': 'Rectangle',
|
|
189
190
|
'geo-style.rhombus': 'Rhombus',
|
|
191
|
+
'geo-style.rhombus-2': 'Rhombus left',
|
|
190
192
|
'geo-style.star': 'Star',
|
|
191
193
|
'geo-style.trapezoid': 'Trapezoid',
|
|
192
194
|
'geo-style.triangle': 'Triangle',
|
|
@@ -261,6 +263,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
261
263
|
'tool.aspect-ratio.wide': 'Wide (16:9)',
|
|
262
264
|
'tool.image-toolbar-title': 'Image tools',
|
|
263
265
|
'tool.image-crop': 'Crop image',
|
|
266
|
+
'tool.image-crop-confirm': 'Confirm',
|
|
264
267
|
'tool.media-alt-text': 'Alternative text',
|
|
265
268
|
'tool.media-alt-text-desc': 'Give a description…',
|
|
266
269
|
'tool.media-alt-text-confirm': 'Confirm',
|
|
@@ -412,6 +415,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
412
415
|
'style-panel.opacity': 'Opacity',
|
|
413
416
|
'style-panel.size': 'Size',
|
|
414
417
|
'style-panel.spline': 'Spline',
|
|
418
|
+
'style-panel.selected': 'selected',
|
|
415
419
|
'tool-panel.title': 'Tools',
|
|
416
420
|
'tool-panel.more': 'More',
|
|
417
421
|
'navigation-zone.title': 'Navigation',
|
package/src/lib/ui/kbd-utils.ts
CHANGED
|
@@ -31,9 +31,16 @@ export function kbd(str: string) {
|
|
|
31
31
|
)
|
|
32
32
|
.flat()
|
|
33
33
|
.map((sub, index) => {
|
|
34
|
-
if (sub === '
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
if (sub[0] === '+') return []
|
|
35
|
+
|
|
36
|
+
let modifiedKey
|
|
37
|
+
if (sub === '__CTRL__') {
|
|
38
|
+
modifiedKey = 'Ctrl'
|
|
39
|
+
} else if (sub === '__ALT__') {
|
|
40
|
+
modifiedKey = 'Alt'
|
|
41
|
+
} else {
|
|
42
|
+
modifiedKey = sub[0].toUpperCase() + sub.slice(1)
|
|
43
|
+
}
|
|
37
44
|
return tlenv.isDarwin || !index ? modifiedKey : ['+', modifiedKey]
|
|
38
45
|
})
|
|
39
46
|
.flat()
|
package/src/lib/ui/version.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// This file is automatically generated by internal/scripts/refresh-assets.ts.
|
|
2
2
|
// Do not edit manually. Or do, I'm a comment, not a cop.
|
|
3
3
|
|
|
4
|
-
export const version = '3.16.0-canary.
|
|
4
|
+
export const version = '3.16.0-canary.7facbd2d2b7f'
|
|
5
5
|
export const publishDates = {
|
|
6
6
|
major: '2024-09-13T14:36:29.063Z',
|
|
7
|
-
minor: '2025-
|
|
8
|
-
patch: '2025-
|
|
7
|
+
minor: '2025-09-18T12:50:07.641Z',
|
|
8
|
+
patch: '2025-09-18T12:50:07.641Z',
|
|
9
9
|
}
|
package/src/lib/ui.css
CHANGED
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
min-height: 40px;
|
|
169
169
|
width: 100%;
|
|
170
170
|
gap: 8px;
|
|
171
|
-
margin: -4px
|
|
171
|
+
margin-top: -4px;
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
.tlui-button__menu::after {
|
|
@@ -494,6 +494,10 @@
|
|
|
494
494
|
-webkit-user-select: auto !important;
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
+
.tlui-input::placeholder {
|
|
498
|
+
color: var(--tl-color-text-3);
|
|
499
|
+
}
|
|
500
|
+
|
|
497
501
|
.tlui-input__wrapper {
|
|
498
502
|
width: 100%;
|
|
499
503
|
height: 44px;
|
|
@@ -578,6 +582,12 @@
|
|
|
578
582
|
box-shadow: var(--tl-shadow-3);
|
|
579
583
|
}
|
|
580
584
|
|
|
585
|
+
@media (max-height: 600px) {
|
|
586
|
+
.tlui-menu {
|
|
587
|
+
max-height: 70vh;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
581
591
|
.tlui-menu::-webkit-scrollbar {
|
|
582
592
|
display: none;
|
|
583
593
|
}
|
|
@@ -1007,21 +1017,48 @@
|
|
|
1007
1017
|
flex-direction: column;
|
|
1008
1018
|
}
|
|
1009
1019
|
|
|
1010
|
-
|
|
1020
|
+
/*
|
|
1021
|
+
add a border to the bottom of all but the last section. we have to handle empty sections too, which
|
|
1022
|
+
are hidden and shouldn't be counted
|
|
1023
|
+
*/
|
|
1024
|
+
.tlui-style-panel__section:not(:nth-last-child(-n + 1 of .tlui-style-panel__section:not(:empty))) {
|
|
1011
1025
|
border-bottom: 1px solid var(--tl-color-divider);
|
|
1012
1026
|
}
|
|
1027
|
+
/*
|
|
1028
|
+
if a section ends with a slider and we're adding a border, we need some extra space for visual
|
|
1029
|
+
balance. we need to handle empty sections as above. is this the most complex css selector in all of
|
|
1030
|
+
tldraw? probably.
|
|
1031
|
+
*/
|
|
1032
|
+
.tlui-style-panel__section:has(.tlui-slider__container:last-child):not(
|
|
1033
|
+
:nth-last-child(-n + 1 of .tlui-style-panel__section:not(:empty))
|
|
1034
|
+
) {
|
|
1035
|
+
margin-bottom: 7px;
|
|
1036
|
+
}
|
|
1013
1037
|
|
|
1014
1038
|
.tlui-style-panel__section:empty {
|
|
1015
1039
|
display: none;
|
|
1016
1040
|
}
|
|
1017
1041
|
|
|
1042
|
+
/*
|
|
1043
|
+
* This is used in a couple places, like Align and Vertical Align.
|
|
1044
|
+
* It's because we have a toolbar with a Toggle Group but then an adjacent button
|
|
1045
|
+
* next to it that opens a popup.
|
|
1046
|
+
*/
|
|
1047
|
+
.tlui-style-panel__section .tlui-toolbar:has(.tlui-toolbar) {
|
|
1048
|
+
flex-wrap: wrap;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
.tlui-style-panel__section .tlui-toolbar:has(.tlui-toolbar) .tlui-style-panel__subheading {
|
|
1052
|
+
margin-left: -2px;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1018
1055
|
.tlui-style-panel__section__common:not(:only-child) {
|
|
1019
1056
|
margin-bottom: 7px;
|
|
1020
1057
|
border-bottom: 1px solid var(--tl-color-divider);
|
|
1021
1058
|
}
|
|
1022
1059
|
|
|
1023
1060
|
.tlui-style-panel__dropdown-picker:only-child {
|
|
1024
|
-
|
|
1061
|
+
flex: 1;
|
|
1025
1062
|
}
|
|
1026
1063
|
|
|
1027
1064
|
.tlui-style-panel__double-select-picker {
|
|
@@ -1047,6 +1084,9 @@
|
|
|
1047
1084
|
}
|
|
1048
1085
|
|
|
1049
1086
|
@media (hover: hover) {
|
|
1087
|
+
.tlui-style-panel .tlui-button[aria-expanded='true'] {
|
|
1088
|
+
background: none;
|
|
1089
|
+
}
|
|
1050
1090
|
.tlui-style-panel .tlui-button[data-state='open']:not(:hover)::after {
|
|
1051
1091
|
opacity: 1;
|
|
1052
1092
|
background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`putExcalidrawContent test fixtures bound-arrows.json 1`] = `
|
|
3
|
+
exports[`putExcalidrawContent test fixtures > bound-arrows.json 1`] = `
|
|
4
4
|
{
|
|
5
5
|
"binding:8": {
|
|
6
6
|
"fromId": "shape:7",
|
|
@@ -173,7 +173,7 @@ exports[`putExcalidrawContent test fixtures bound-arrows.json 1`] = `
|
|
|
173
173
|
}
|
|
174
174
|
`;
|
|
175
175
|
|
|
176
|
-
exports[`putExcalidrawContent test fixtures bound-elbow-arrows.json 1`] = `
|
|
176
|
+
exports[`putExcalidrawContent test fixtures > bound-elbow-arrows.json 1`] = `
|
|
177
177
|
{
|
|
178
178
|
"binding:7": {
|
|
179
179
|
"fromId": "shape:6",
|
|
@@ -346,7 +346,7 @@ exports[`putExcalidrawContent test fixtures bound-elbow-arrows.json 1`] = `
|
|
|
346
346
|
}
|
|
347
347
|
`;
|
|
348
348
|
|
|
349
|
-
exports[`putExcalidrawContent test fixtures image.json 1`] = `
|
|
349
|
+
exports[`putExcalidrawContent test fixtures > image.json 1`] = `
|
|
350
350
|
{
|
|
351
351
|
"asset:5": {
|
|
352
352
|
"id": "asset:5",
|
|
@@ -404,7 +404,7 @@ exports[`putExcalidrawContent test fixtures image.json 1`] = `
|
|
|
404
404
|
}
|
|
405
405
|
`;
|
|
406
406
|
|
|
407
|
-
exports[`putExcalidrawContent test fixtures line-drawing.json 1`] = `
|
|
407
|
+
exports[`putExcalidrawContent test fixtures > line-drawing.json 1`] = `
|
|
408
408
|
{
|
|
409
409
|
"document:document": {
|
|
410
410
|
"gridSize": 10,
|
|
@@ -31,30 +31,7 @@ export interface CopyAsOptions extends TLImageExportOptions {
|
|
|
31
31
|
*
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
|
-
export function copyAs(editor: Editor, ids: TLShapeId[], opts: CopyAsOptions): Promise<void>
|
|
35
|
-
/**
|
|
36
|
-
* @deprecated The format parameter is now part of the opts object.
|
|
37
|
-
* @public
|
|
38
|
-
*/
|
|
39
|
-
export function copyAs(
|
|
40
|
-
editor: Editor,
|
|
41
|
-
ids: TLShapeId[],
|
|
42
|
-
format: TLCopyType,
|
|
43
|
-
opts?: TLImageExportOptions & { format?: undefined }
|
|
44
|
-
): Promise<void>
|
|
45
|
-
export function copyAs(
|
|
46
|
-
...args:
|
|
47
|
-
| [editor: Editor, ids: TLShapeId[], opts: TLImageExportOptions & { format: TLCopyType }]
|
|
48
|
-
| [
|
|
49
|
-
editor: Editor,
|
|
50
|
-
ids: TLShapeId[],
|
|
51
|
-
format: TLCopyType,
|
|
52
|
-
opts?: TLImageExportOptions & { format?: undefined },
|
|
53
|
-
]
|
|
54
|
-
) {
|
|
55
|
-
const [editor, ids, opts] =
|
|
56
|
-
typeof args[2] === 'string' ? [args[0], args[1], { ...args[3], format: args[2] }] : args
|
|
57
|
-
|
|
34
|
+
export function copyAs(editor: Editor, ids: TLShapeId[], opts: CopyAsOptions): Promise<void> {
|
|
58
35
|
// Note: it's important that this function itself isn't async and doesn't really use promises -
|
|
59
36
|
// we need to create the relevant `ClipboardItem`s and call navigator.clipboard.write
|
|
60
37
|
// synchronously to make sure safari knows that the user _wants_ to copy See
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Editor,
|
|
3
3
|
FileHelpers,
|
|
4
|
-
TLExportType,
|
|
5
4
|
TLImageExportOptions,
|
|
6
5
|
TLShapeId,
|
|
7
6
|
exhaustiveSwitchError,
|
|
@@ -35,41 +34,6 @@ export async function exportToString(
|
|
|
35
34
|
}
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
/**
|
|
39
|
-
* Export the given shapes as a blob.
|
|
40
|
-
* @param editor - The editor instance.
|
|
41
|
-
* @param ids - The ids of the shapes to export.
|
|
42
|
-
* @param format - The format to export as.
|
|
43
|
-
* @param opts - Rendering options.
|
|
44
|
-
* @returns A promise that resolves to a blob.
|
|
45
|
-
* @deprecated Use {@link @tldraw/editor#Editor.toImage} instead.
|
|
46
|
-
* @public
|
|
47
|
-
*/
|
|
48
|
-
export async function exportToBlob({
|
|
49
|
-
editor,
|
|
50
|
-
ids,
|
|
51
|
-
format,
|
|
52
|
-
opts = {},
|
|
53
|
-
}: {
|
|
54
|
-
editor: Editor
|
|
55
|
-
ids: TLShapeId[]
|
|
56
|
-
format: TLExportType
|
|
57
|
-
opts?: TLImageExportOptions
|
|
58
|
-
}): Promise<Blob> {
|
|
59
|
-
const idsToUse = ids?.length ? ids : [...editor.getCurrentPageShapeIds()]
|
|
60
|
-
switch (format) {
|
|
61
|
-
case 'jpeg':
|
|
62
|
-
case 'png':
|
|
63
|
-
case 'webp':
|
|
64
|
-
case 'svg': {
|
|
65
|
-
return (await editor.toImage(idsToUse, { ...opts, format })).blob
|
|
66
|
-
}
|
|
67
|
-
default: {
|
|
68
|
-
exhaustiveSwitchError(format)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
37
|
const clipboardMimeTypesByFormat = {
|
|
74
38
|
jpeg: 'image/jpeg',
|
|
75
39
|
png: 'image/png',
|
|
@@ -28,38 +28,7 @@ export async function exportAs(
|
|
|
28
28
|
editor: Editor,
|
|
29
29
|
ids: TLShapeId[],
|
|
30
30
|
opts: ExportAsOptions
|
|
31
|
-
): Promise<void>
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated The format & name parameters are now part of the opts object.
|
|
34
|
-
* @public
|
|
35
|
-
*/
|
|
36
|
-
export async function exportAs(
|
|
37
|
-
editor: Editor,
|
|
38
|
-
ids: TLShapeId[],
|
|
39
|
-
format?: TLExportType,
|
|
40
|
-
name?: string,
|
|
41
|
-
opts?: TLImageExportOptions
|
|
42
|
-
): Promise<void>
|
|
43
|
-
export async function exportAs(
|
|
44
|
-
...args:
|
|
45
|
-
| [
|
|
46
|
-
editor: Editor,
|
|
47
|
-
ids: TLShapeId[],
|
|
48
|
-
opts: TLImageExportOptions & { format: TLExportType; name?: string },
|
|
49
|
-
]
|
|
50
|
-
| [
|
|
51
|
-
editor: Editor,
|
|
52
|
-
ids: TLShapeId[],
|
|
53
|
-
format?: TLExportType,
|
|
54
|
-
name?: string,
|
|
55
|
-
opts?: TLImageExportOptions,
|
|
56
|
-
]
|
|
57
|
-
) {
|
|
58
|
-
const [editor, ids, opts] =
|
|
59
|
-
typeof args[2] === 'object'
|
|
60
|
-
? args
|
|
61
|
-
: [args[0], args[1], { ...args[4], format: args[2] ?? 'png', name: args[3] }]
|
|
62
|
-
|
|
31
|
+
): Promise<void> {
|
|
63
32
|
// If we don't get name then use a predefined one
|
|
64
33
|
let name = opts.name
|
|
65
34
|
if (!name) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`buildFromV1Document test fixtures arrow-binding.tldr 1`] = `
|
|
3
|
+
exports[`buildFromV1Document test fixtures > arrow-binding.tldr 1`] = `
|
|
4
4
|
{
|
|
5
5
|
"binding:12": {
|
|
6
6
|
"fromId": "shape:11",
|
|
@@ -173,7 +173,7 @@ exports[`buildFromV1Document test fixtures arrow-binding.tldr 1`] = `
|
|
|
173
173
|
}
|
|
174
174
|
`;
|
|
175
175
|
|
|
176
|
-
exports[`buildFromV1Document test fixtures exact-arrow-binding.tldr 1`] = `
|
|
176
|
+
exports[`buildFromV1Document test fixtures > exact-arrow-binding.tldr 1`] = `
|
|
177
177
|
{
|
|
178
178
|
"binding:11": {
|
|
179
179
|
"fromId": "shape:10",
|
|
@@ -346,7 +346,7 @@ exports[`buildFromV1Document test fixtures exact-arrow-binding.tldr 1`] = `
|
|
|
346
346
|
}
|
|
347
347
|
`;
|
|
348
348
|
|
|
349
|
-
exports[`buildFromV1Document test fixtures incorrect-arrow-binding.tldr 1`] = `
|
|
349
|
+
exports[`buildFromV1Document test fixtures > incorrect-arrow-binding.tldr 1`] = `
|
|
350
350
|
{
|
|
351
351
|
"binding:11": {
|
|
352
352
|
"fromId": "shape:10",
|
package/src/test/A11y.test.tsx
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { createShapeId, toRichText } from '@tldraw/editor'
|
|
2
|
+
import { Mock, vi } from 'vitest'
|
|
2
3
|
import { generateShapeAnnouncementMessage } from '../lib/ui/components/A11y'
|
|
3
4
|
import { TestEditor } from './TestEditor'
|
|
4
5
|
|
|
5
6
|
describe('A11y Shape Announcements', () => {
|
|
6
7
|
let editor: TestEditor
|
|
7
|
-
let mockTranslate:
|
|
8
|
+
let mockTranslate: Mock
|
|
8
9
|
|
|
9
10
|
beforeEach(() => {
|
|
10
11
|
editor = new TestEditor()
|
|
11
12
|
|
|
12
13
|
// Create a simple translation mock
|
|
13
|
-
mockTranslate =
|
|
14
|
+
mockTranslate = vi.fn((key) => {
|
|
14
15
|
if (key === 'a11y.multiple-shapes') return '{num} shapes selected'
|
|
15
16
|
if (key === 'a11y.shape') return 'Shape'
|
|
16
17
|
if (key === 'a11y.text') return 'Text'
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { vi } from 'vitest'
|
|
1
2
|
import { TestEditor } from './TestEditor'
|
|
2
3
|
|
|
3
4
|
let editor: TestEditor
|
|
@@ -10,7 +11,7 @@ beforeEach(() => {
|
|
|
10
11
|
editor._transformPointerUpSpy.mockRestore()
|
|
11
12
|
})
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
vi.useFakeTimers()
|
|
14
15
|
|
|
15
16
|
describe('Handles events', () => {
|
|
16
17
|
it('Emits single click events', () => {
|
|
@@ -23,7 +24,7 @@ describe('Handles events', () => {
|
|
|
23
24
|
const eventsBeforeSettle = [{ name: 'pointer_down' }, { name: 'pointer_up' }]
|
|
24
25
|
|
|
25
26
|
// allow time for settle
|
|
26
|
-
|
|
27
|
+
vi.advanceTimersByTime(500)
|
|
27
28
|
|
|
28
29
|
// nothing should have settled
|
|
29
30
|
expect(events).toMatchObject(eventsBeforeSettle)
|
|
@@ -64,7 +65,7 @@ describe('Handles events', () => {
|
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
// allow double click to settle
|
|
67
|
-
|
|
68
|
+
vi.advanceTimersByTime(500)
|
|
68
69
|
|
|
69
70
|
expect(events).toMatchObject([
|
|
70
71
|
...eventsBeforeSettle,
|
|
@@ -110,7 +111,7 @@ describe('Handles events', () => {
|
|
|
110
111
|
expect(eventsBeforeSettle).toMatchObject(eventsBeforeSettle)
|
|
111
112
|
|
|
112
113
|
// allow double click to settle
|
|
113
|
-
|
|
114
|
+
vi.advanceTimersByTime(500)
|
|
114
115
|
|
|
115
116
|
expect(events).toMatchObject([
|
|
116
117
|
...eventsBeforeSettle,
|
|
@@ -162,7 +163,7 @@ describe('Handles events', () => {
|
|
|
162
163
|
expect(events).toMatchObject(eventsBeforeSettle)
|
|
163
164
|
|
|
164
165
|
// allow double click to settle
|
|
165
|
-
|
|
166
|
+
vi.advanceTimersByTime(500)
|
|
166
167
|
|
|
167
168
|
expect(events).toMatchObject([
|
|
168
169
|
...eventsBeforeSettle,
|
|
@@ -218,7 +219,7 @@ describe('Handles events', () => {
|
|
|
218
219
|
expect(events).toMatchObject(eventsBeforeSettle)
|
|
219
220
|
|
|
220
221
|
// allow double click to settle
|
|
221
|
-
|
|
222
|
+
vi.advanceTimersByTime(500)
|
|
222
223
|
|
|
223
224
|
expect(events).toMatchObject(eventsBeforeSettle)
|
|
224
225
|
|
package/src/test/Editor.test.tsx
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
loadSnapshot,
|
|
15
15
|
react,
|
|
16
16
|
} from '@tldraw/editor'
|
|
17
|
+
import { vi } from 'vitest'
|
|
17
18
|
import { TestEditor } from './TestEditor'
|
|
18
19
|
import { TL } from './test-jsx'
|
|
19
20
|
|
|
@@ -415,24 +416,24 @@ describe('isFocused', () => {
|
|
|
415
416
|
})
|
|
416
417
|
|
|
417
418
|
it('becomes true when the container div receives a focus event', () => {
|
|
418
|
-
|
|
419
|
+
vi.advanceTimersByTime(100)
|
|
419
420
|
expect(editor.getInstanceState().isFocused).toBe(false)
|
|
420
421
|
|
|
421
422
|
editor.elm.focus()
|
|
422
423
|
|
|
423
|
-
|
|
424
|
+
vi.advanceTimersByTime(100)
|
|
424
425
|
expect(editor.getInstanceState().isFocused).toBe(true)
|
|
425
426
|
})
|
|
426
427
|
|
|
427
428
|
it('becomes false when the container div receives a blur event', () => {
|
|
428
429
|
editor.elm.focus()
|
|
429
430
|
|
|
430
|
-
|
|
431
|
+
vi.advanceTimersByTime(100)
|
|
431
432
|
expect(editor.getInstanceState().isFocused).toBe(true)
|
|
432
433
|
|
|
433
434
|
editor.elm.blur()
|
|
434
435
|
|
|
435
|
-
|
|
436
|
+
vi.advanceTimersByTime(100)
|
|
436
437
|
expect(editor.getInstanceState().isFocused).toBe(false)
|
|
437
438
|
})
|
|
438
439
|
|
|
@@ -444,13 +445,13 @@ describe('isFocused', () => {
|
|
|
444
445
|
editor.elm.blur()
|
|
445
446
|
const child = document.createElement('div')
|
|
446
447
|
editor.elm.appendChild(child)
|
|
447
|
-
|
|
448
|
+
vi.advanceTimersByTime(100)
|
|
448
449
|
expect(editor.getInstanceState().isFocused).toBe(false)
|
|
449
450
|
child.dispatchEvent(new FocusEvent('focusin', { bubbles: true }))
|
|
450
|
-
|
|
451
|
+
vi.advanceTimersByTime(100)
|
|
451
452
|
expect(editor.getInstanceState().isFocused).toBe(true)
|
|
452
453
|
child.dispatchEvent(new FocusEvent('focusout', { bubbles: true }))
|
|
453
|
-
|
|
454
|
+
vi.advanceTimersByTime(100)
|
|
454
455
|
expect(editor.getInstanceState().isFocused).toBe(false)
|
|
455
456
|
})
|
|
456
457
|
|
|
@@ -466,7 +467,7 @@ describe('isFocused', () => {
|
|
|
466
467
|
|
|
467
468
|
child.dispatchEvent(new FocusEvent('focusout', { bubbles: true }))
|
|
468
469
|
|
|
469
|
-
|
|
470
|
+
vi.advanceTimersByTime(100)
|
|
470
471
|
expect(editor.getInstanceState().isFocused).toBe(false)
|
|
471
472
|
})
|
|
472
473
|
})
|
|
@@ -520,13 +521,13 @@ describe('getShapeUtil', () => {
|
|
|
520
521
|
it('throws if that shape type isnt registered', () => {
|
|
521
522
|
const myMissingShape = { type: 'missing' } as TLShape
|
|
522
523
|
expect(() => editor.getShapeUtil(myMissingShape)).toThrowErrorMatchingInlineSnapshot(
|
|
523
|
-
`
|
|
524
|
+
`[Error: No shape util found for type "missing"]`
|
|
524
525
|
)
|
|
525
526
|
})
|
|
526
527
|
|
|
527
528
|
it('throws if that type isnt registered', () => {
|
|
528
529
|
expect(() => editor.getShapeUtil('missing')).toThrowErrorMatchingInlineSnapshot(
|
|
529
|
-
`
|
|
530
|
+
`[Error: No shape util found for type "missing"]`
|
|
530
531
|
)
|
|
531
532
|
})
|
|
532
533
|
})
|
|
@@ -603,14 +604,14 @@ describe('snapshots', () => {
|
|
|
603
604
|
|
|
604
605
|
describe('when the user prefers dark UI', () => {
|
|
605
606
|
beforeEach(() => {
|
|
606
|
-
window.matchMedia =
|
|
607
|
+
window.matchMedia = vi.fn().mockImplementation((query) => {
|
|
607
608
|
return {
|
|
608
609
|
matches: query === '(prefers-color-scheme: dark)',
|
|
609
610
|
media: query,
|
|
610
611
|
onchange: null,
|
|
611
|
-
addEventListener:
|
|
612
|
-
removeEventListener:
|
|
613
|
-
dispatchEvent:
|
|
612
|
+
addEventListener: vi.fn(),
|
|
613
|
+
removeEventListener: vi.fn(),
|
|
614
|
+
dispatchEvent: vi.fn(),
|
|
614
615
|
}
|
|
615
616
|
})
|
|
616
617
|
})
|
|
@@ -630,14 +631,14 @@ describe('when the user prefers dark UI', () => {
|
|
|
630
631
|
|
|
631
632
|
describe('when the user prefers light UI', () => {
|
|
632
633
|
beforeEach(() => {
|
|
633
|
-
window.matchMedia =
|
|
634
|
+
window.matchMedia = vi.fn().mockImplementation((query) => {
|
|
634
635
|
return {
|
|
635
636
|
matches: false,
|
|
636
637
|
media: query,
|
|
637
638
|
onchange: null,
|
|
638
|
-
addEventListener:
|
|
639
|
-
removeEventListener:
|
|
640
|
-
dispatchEvent:
|
|
639
|
+
addEventListener: vi.fn(),
|
|
640
|
+
removeEventListener: vi.fn(),
|
|
641
|
+
dispatchEvent: vi.fn(),
|
|
641
642
|
}
|
|
642
643
|
})
|
|
643
644
|
})
|
|
@@ -722,7 +723,7 @@ describe('dragging', () => {
|
|
|
722
723
|
})
|
|
723
724
|
|
|
724
725
|
describe('getShapeVisibility', () => {
|
|
725
|
-
const getShapeVisibility =
|
|
726
|
+
const getShapeVisibility = vi.fn(((shape: TLShape) => {
|
|
726
727
|
return shape.meta.visibility as any
|
|
727
728
|
}) satisfies TldrawEditorProps['getShapeVisibility'])
|
|
728
729
|
|