tldraw 3.16.0-canary.5170ef6b6e20 → 3.16.0-canary.5462c7eac75a
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 +138 -106
- package/dist-cjs/index.js +25 -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/arrowLabel.js +6 -0
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
- 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 +2 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -0
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.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 -4
- 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 +2 -2
- package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
- package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
- package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
- package/dist-cjs/lib/ui/components/A11y.js +1 -1
- package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
- 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 +1 -0
- 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 +1 -0
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.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/primitives/TldrawUiContextualToolbar.js +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +1 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
- 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 +44 -5
- 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 +5 -5
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +1 -1
- 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/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 +4 -2
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/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 +138 -106
- package/dist-esm/index.mjs +51 -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/bookmark/BookmarkShapeUtil.mjs +5 -5
- package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +2 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +3 -3
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +1 -0
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.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 +4 -5
- 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 +3 -3
- package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
- package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
- package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
- package/dist-esm/lib/ui/components/A11y.mjs +2 -2
- package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
- 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 +1 -0
- package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
- package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -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 +1 -0
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.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/primitives/TldrawUiContextualToolbar.mjs +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +1 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +3 -3
- package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +1 -1
- 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 +45 -5
- 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 +5 -5
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +1 -1
- 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/hooks/useClipboardEvents.mjs +2 -2
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +1 -1
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +4 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/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 +38 -21
- package/src/lib/defaultExternalContentHandlers.ts +14 -0
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +2 -2
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +41 -0
- package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
- package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +5 -5
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +1 -0
- package/src/lib/shapes/frame/components/FrameLabelInput.tsx +3 -3
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +1 -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 +5 -9
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
- package/src/lib/shapes/text/PlainTextArea.tsx +3 -3
- package/src/lib/shapes/text/RichTextArea.tsx +3 -4
- package/src/lib/ui/components/A11y.tsx +2 -2
- package/src/lib/ui/components/LanguageMenu.tsx +1 -0
- package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -0
- package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +2 -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 +1 -0
- package/src/lib/ui/components/Toolbar/LinkEditor.tsx +1 -0
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiInput.tsx +3 -3
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +5 -1
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +63 -16
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +6 -6
- package/src/lib/ui/context/actions.tsx +20 -8
- package/src/lib/ui/hooks/useClipboardEvents.ts +2 -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 +2 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +4 -2
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +26 -2
- 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/getCulledShapes.test.tsx +71 -2
- package/tldraw.css +34 -5
- 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
|
@@ -8,8 +8,7 @@ import {
|
|
|
8
8
|
getAdditionalClipboardWriteType
|
|
9
9
|
} from "../clipboard.mjs";
|
|
10
10
|
import { exportToImagePromiseForClipboard } from "./export.mjs";
|
|
11
|
-
function copyAs(
|
|
12
|
-
const [editor, ids, opts] = typeof args[2] === "string" ? [args[0], args[1], { ...args[3], format: args[2] }] : args;
|
|
11
|
+
function copyAs(editor, ids, opts) {
|
|
13
12
|
if (!navigator.clipboard) return Promise.reject(new Error("Copy not supported"));
|
|
14
13
|
if (navigator.clipboard.write) {
|
|
15
14
|
const { blobPromise, mimeType } = exportToImagePromiseForClipboard(editor, ids, opts);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/utils/export/copyAs.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tEditor,\n\tFileHelpers,\n\tTLImageExportOptions,\n\tTLShapeId,\n\texhaustiveSwitchError,\n} from '@tldraw/editor'\nimport {\n\tclipboardWrite,\n\tdoesClipboardSupportType,\n\tgetAdditionalClipboardWriteType,\n} from '../clipboard'\nimport { exportToImagePromiseForClipboard } from './export'\n\n/** @public */\nexport type TLCopyType = 'svg' | 'png'\n\n/** @public */\nexport interface CopyAsOptions extends TLImageExportOptions {\n\t/** The format to copy as. */\n\tformat: TLCopyType\n}\n\n/**\n * Copy the given shapes to the clipboard.\n *\n * @param editor - The editor instance.\n * @param ids - The ids of the shapes to copy.\n * @param format - The format to copy as. Defaults to png.\n * @param opts - Options for the copy.\n *\n * @public\n */\nexport function copyAs(editor: Editor, ids: TLShapeId[], opts: CopyAsOptions): Promise<void
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEC;AAAA,EAGA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,wCAAwC;
|
|
4
|
+
"sourcesContent": ["import {\n\tEditor,\n\tFileHelpers,\n\tTLImageExportOptions,\n\tTLShapeId,\n\texhaustiveSwitchError,\n} from '@tldraw/editor'\nimport {\n\tclipboardWrite,\n\tdoesClipboardSupportType,\n\tgetAdditionalClipboardWriteType,\n} from '../clipboard'\nimport { exportToImagePromiseForClipboard } from './export'\n\n/** @public */\nexport type TLCopyType = 'svg' | 'png'\n\n/** @public */\nexport interface CopyAsOptions extends TLImageExportOptions {\n\t/** The format to copy as. */\n\tformat: TLCopyType\n}\n\n/**\n * Copy the given shapes to the clipboard.\n *\n * @param editor - The editor instance.\n * @param ids - The ids of the shapes to copy.\n * @param format - The format to copy as. Defaults to png.\n * @param opts - Options for the copy.\n *\n * @public\n */\nexport function copyAs(editor: Editor, ids: TLShapeId[], opts: CopyAsOptions): Promise<void> {\n\t// Note: it's important that this function itself isn't async and doesn't really use promises -\n\t// we need to create the relevant `ClipboardItem`s and call navigator.clipboard.write\n\t// synchronously to make sure safari knows that the user _wants_ to copy See\n\t// https://bugs.webkit.org/show_bug.cgi?id=222262\n\n\tif (!navigator.clipboard) return Promise.reject(new Error('Copy not supported'))\n\tif (navigator.clipboard.write as any) {\n\t\tconst { blobPromise, mimeType } = exportToImagePromiseForClipboard(editor, ids, opts)\n\n\t\tconst types: Record<string, Promise<Blob>> = { [mimeType]: blobPromise }\n\t\tconst additionalMimeType = getAdditionalClipboardWriteType(opts.format)\n\t\tif (additionalMimeType && doesClipboardSupportType(additionalMimeType)) {\n\t\t\ttypes[additionalMimeType] = blobPromise.then((blob) =>\n\t\t\t\tFileHelpers.rewriteMimeType(blob, additionalMimeType)\n\t\t\t)\n\t\t}\n\n\t\treturn clipboardWrite(types)\n\t}\n\n\tswitch (opts.format) {\n\t\tcase 'svg': {\n\t\t\treturn fallbackWriteTextAsync(async () => {\n\t\t\t\tconst result = await editor.getSvgString(ids, opts)\n\n\t\t\t\tif (!result) throw new Error('Failed to copy')\n\t\t\t\treturn result.svg\n\t\t\t})\n\t\t}\n\n\t\tcase 'png':\n\t\t\tthrow new Error('Copy not supported')\n\t\tdefault:\n\t\t\texhaustiveSwitchError(opts.format)\n\t}\n}\n\nasync function fallbackWriteTextAsync(getText: () => Promise<string>) {\n\tawait navigator.clipboard?.writeText?.(await getText())\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEC;AAAA,EAGA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,wCAAwC;AAqB1C,SAAS,OAAO,QAAgB,KAAkB,MAAoC;AAM5F,MAAI,CAAC,UAAU,UAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAC/E,MAAI,UAAU,UAAU,OAAc;AACrC,UAAM,EAAE,aAAa,SAAS,IAAI,iCAAiC,QAAQ,KAAK,IAAI;AAEpF,UAAM,QAAuC,EAAE,CAAC,QAAQ,GAAG,YAAY;AACvE,UAAM,qBAAqB,gCAAgC,KAAK,MAAM;AACtE,QAAI,sBAAsB,yBAAyB,kBAAkB,GAAG;AACvE,YAAM,kBAAkB,IAAI,YAAY;AAAA,QAAK,CAAC,SAC7C,YAAY,gBAAgB,MAAM,kBAAkB;AAAA,MACrD;AAAA,IACD;AAEA,WAAO,eAAe,KAAK;AAAA,EAC5B;AAEA,UAAQ,KAAK,QAAQ;AAAA,IACpB,KAAK,OAAO;AACX,aAAO,uBAAuB,YAAY;AACzC,cAAM,SAAS,MAAM,OAAO,aAAa,KAAK,IAAI;AAElD,YAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gBAAgB;AAC7C,eAAO,OAAO;AAAA,MACf,CAAC;AAAA,IACF;AAAA,IAEA,KAAK;AACJ,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACrC;AACC,4BAAsB,KAAK,MAAM;AAAA,EACnC;AACD;AAEA,eAAe,uBAAuB,SAAgC;AACrE,QAAM,UAAU,WAAW,YAAY,MAAM,QAAQ,CAAC;AACvD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,25 +23,6 @@ async function exportToString(editor, ids, format, opts = {}) {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
async function exportToBlob({
|
|
27
|
-
editor,
|
|
28
|
-
ids,
|
|
29
|
-
format,
|
|
30
|
-
opts = {}
|
|
31
|
-
}) {
|
|
32
|
-
const idsToUse = ids?.length ? ids : [...editor.getCurrentPageShapeIds()];
|
|
33
|
-
switch (format) {
|
|
34
|
-
case "jpeg":
|
|
35
|
-
case "png":
|
|
36
|
-
case "webp":
|
|
37
|
-
case "svg": {
|
|
38
|
-
return (await editor.toImage(idsToUse, { ...opts, format })).blob;
|
|
39
|
-
}
|
|
40
|
-
default: {
|
|
41
|
-
exhaustiveSwitchError(format);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
26
|
const clipboardMimeTypesByFormat = {
|
|
46
27
|
jpeg: "image/jpeg",
|
|
47
28
|
png: "image/png",
|
|
@@ -59,7 +40,6 @@ function exportToImagePromiseForClipboard(editor, ids, opts = {}) {
|
|
|
59
40
|
};
|
|
60
41
|
}
|
|
61
42
|
export {
|
|
62
|
-
exportToBlob,
|
|
63
43
|
exportToImagePromiseForClipboard,
|
|
64
44
|
exportToString
|
|
65
45
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/utils/export/export.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tEditor,\n\tFileHelpers,\n\
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEC;AAAA,
|
|
4
|
+
"sourcesContent": ["import {\n\tEditor,\n\tFileHelpers,\n\tTLImageExportOptions,\n\tTLShapeId,\n\texhaustiveSwitchError,\n} from '@tldraw/editor'\n\nasync function getSvgString(editor: Editor, ids: TLShapeId[], opts: TLImageExportOptions) {\n\tconst svg = await editor.getSvgString(ids, opts)\n\tif (!svg) {\n\t\tthrow new Error('Could not construct SVG.')\n\t}\n\treturn svg\n}\n\nexport async function exportToString(\n\teditor: Editor,\n\tids: TLShapeId[],\n\tformat: 'svg' | 'json',\n\topts: TLImageExportOptions = {}\n) {\n\tswitch (format) {\n\t\tcase 'svg': {\n\t\t\treturn (await getSvgString(editor, ids, opts))?.svg\n\t\t}\n\t\tcase 'json': {\n\t\t\tconst data = await editor.resolveAssetsInContent(editor.getContentFromCurrentPage(ids))\n\t\t\treturn JSON.stringify(data)\n\t\t}\n\t\tdefault: {\n\t\t\texhaustiveSwitchError(format)\n\t\t}\n\t}\n}\n\nconst clipboardMimeTypesByFormat = {\n\tjpeg: 'image/jpeg',\n\tpng: 'image/png',\n\twebp: 'image/webp',\n\tsvg: 'text/plain',\n}\n\nexport function exportToImagePromiseForClipboard(\n\teditor: Editor,\n\tids: TLShapeId[],\n\topts: TLImageExportOptions = {}\n): { blobPromise: Promise<Blob>; mimeType: string } {\n\tconst idsToUse = ids?.length ? ids : [...editor.getCurrentPageShapeIds()]\n\tconst format = opts.format ?? 'png'\n\treturn {\n\t\tblobPromise: editor\n\t\t\t.toImage(idsToUse, opts)\n\t\t\t.then((result) =>\n\t\t\t\tFileHelpers.rewriteMimeType(result.blob, clipboardMimeTypesByFormat[format])\n\t\t\t),\n\t\tmimeType: clipboardMimeTypesByFormat[format],\n\t}\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEC;AAAA,EAGA;AAAA,OACM;AAEP,eAAe,aAAa,QAAgB,KAAkB,MAA4B;AACzF,QAAM,MAAM,MAAM,OAAO,aAAa,KAAK,IAAI;AAC/C,MAAI,CAAC,KAAK;AACT,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC3C;AACA,SAAO;AACR;AAEA,eAAsB,eACrB,QACA,KACA,QACA,OAA6B,CAAC,GAC7B;AACD,UAAQ,QAAQ;AAAA,IACf,KAAK,OAAO;AACX,cAAQ,MAAM,aAAa,QAAQ,KAAK,IAAI,IAAI;AAAA,IACjD;AAAA,IACA,KAAK,QAAQ;AACZ,YAAM,OAAO,MAAM,OAAO,uBAAuB,OAAO,0BAA0B,GAAG,CAAC;AACtF,aAAO,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,IACA,SAAS;AACR,4BAAsB,MAAM;AAAA,IAC7B;AAAA,EACD;AACD;AAEA,MAAM,6BAA6B;AAAA,EAClC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AACN;AAEO,SAAS,iCACf,QACA,KACA,OAA6B,CAAC,GACqB;AACnD,QAAM,WAAW,KAAK,SAAS,MAAM,CAAC,GAAG,OAAO,uBAAuB,CAAC;AACxE,QAAM,SAAS,KAAK,UAAU;AAC9B,SAAO;AAAA,IACN,aAAa,OACX,QAAQ,UAAU,IAAI,EACtB;AAAA,MAAK,CAAC,WACN,YAAY,gBAAgB,OAAO,MAAM,2BAA2B,MAAM,CAAC;AAAA,IAC5E;AAAA,IACD,UAAU,2BAA2B,MAAM;AAAA,EAC5C;AACD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sanitizeId
|
|
3
3
|
} from "@tldraw/editor";
|
|
4
|
-
async function exportAs(
|
|
5
|
-
const [editor, ids, opts] = typeof args[2] === "object" ? args : [args[0], args[1], { ...args[4], format: args[2] ?? "png", name: args[3] }];
|
|
4
|
+
async function exportAs(editor, ids, opts) {
|
|
6
5
|
let name = opts.name;
|
|
7
6
|
if (!name) {
|
|
8
7
|
name = `shapes at ${getTimestamp()}`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/utils/export/exportAs.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tEditor,\n\tsanitizeId,\n\tTLExportType,\n\tTLFrameShape,\n\tTLImageExportOptions,\n\tTLShapeId,\n} from '@tldraw/editor'\n\n/** @public */\nexport interface ExportAsOptions extends TLImageExportOptions {\n\t/** {@inheritdoc @tldraw/editor#TLImageExportOptions.format} */\n\tformat: TLExportType\n\t/** Name of the exported file. If undefined a predefined name, based on the selection, will be used. */\n\tname?: string\n}\n\n/**\n * Export the given shapes as files.\n *\n * @param editor - The editor instance.\n * @param ids - The ids of the shapes to export.\n * @param opts - Options for the export.\n *\n * @public\n */\nexport async function exportAs(\n\teditor: Editor,\n\tids: TLShapeId[],\n\topts: ExportAsOptions\n): Promise<void
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEC;AAAA,OAKM;
|
|
4
|
+
"sourcesContent": ["import {\n\tEditor,\n\tsanitizeId,\n\tTLExportType,\n\tTLFrameShape,\n\tTLImageExportOptions,\n\tTLShapeId,\n} from '@tldraw/editor'\n\n/** @public */\nexport interface ExportAsOptions extends TLImageExportOptions {\n\t/** {@inheritdoc @tldraw/editor#TLImageExportOptions.format} */\n\tformat: TLExportType\n\t/** Name of the exported file. If undefined a predefined name, based on the selection, will be used. */\n\tname?: string\n}\n\n/**\n * Export the given shapes as files.\n *\n * @param editor - The editor instance.\n * @param ids - The ids of the shapes to export.\n * @param opts - Options for the export.\n *\n * @public\n */\nexport async function exportAs(\n\teditor: Editor,\n\tids: TLShapeId[],\n\topts: ExportAsOptions\n): Promise<void> {\n\t// If we don't get name then use a predefined one\n\tlet name = opts.name\n\tif (!name) {\n\t\tname = `shapes at ${getTimestamp()}`\n\t\tif (ids.length === 1) {\n\t\t\tconst first = editor.getShape(ids[0])!\n\t\t\tif (editor.isShapeOfType<TLFrameShape>(first, 'frame')) {\n\t\t\t\tname = first.props.name || 'frame'\n\t\t\t} else {\n\t\t\t\tname = `${sanitizeId(first.id)} at ${getTimestamp()}`\n\t\t\t}\n\t\t}\n\t}\n\tname += `.${opts.format}`\n\n\tconst { blob } = await editor.toImage(ids, opts)\n\tconst file = new File([blob], name, { type: blob.type })\n\tdownloadFile(file)\n}\n\nfunction getTimestamp() {\n\tconst now = new Date()\n\n\tconst year = String(now.getFullYear()).slice(2)\n\tconst month = String(now.getMonth() + 1).padStart(2, '0')\n\tconst day = String(now.getDate()).padStart(2, '0')\n\tconst hours = String(now.getHours()).padStart(2, '0')\n\tconst minutes = String(now.getMinutes()).padStart(2, '0')\n\tconst seconds = String(now.getSeconds()).padStart(2, '0')\n\n\treturn `${year}-${month}-${day} ${hours}.${minutes}.${seconds}`\n}\n\n/** @internal */\nexport function downloadFile(file: File) {\n\tconst link = document.createElement('a')\n\tconst url = URL.createObjectURL(file)\n\tlink.href = url\n\tlink.download = file.name\n\tlink.click()\n\tURL.revokeObjectURL(url)\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEC;AAAA,OAKM;AAmBP,eAAsB,SACrB,QACA,KACA,MACgB;AAEhB,MAAI,OAAO,KAAK;AAChB,MAAI,CAAC,MAAM;AACV,WAAO,aAAa,aAAa,CAAC;AAClC,QAAI,IAAI,WAAW,GAAG;AACrB,YAAM,QAAQ,OAAO,SAAS,IAAI,CAAC,CAAC;AACpC,UAAI,OAAO,cAA4B,OAAO,OAAO,GAAG;AACvD,eAAO,MAAM,MAAM,QAAQ;AAAA,MAC5B,OAAO;AACN,eAAO,GAAG,WAAW,MAAM,EAAE,CAAC,OAAO,aAAa,CAAC;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AACA,UAAQ,IAAI,KAAK,MAAM;AAEvB,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,QAAQ,KAAK,IAAI;AAC/C,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;AACvD,eAAa,IAAI;AAClB;AAEA,SAAS,eAAe;AACvB,QAAM,MAAM,oBAAI,KAAK;AAErB,QAAM,OAAO,OAAO,IAAI,YAAY,CAAC,EAAE,MAAM,CAAC;AAC9C,QAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,MAAM,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,QAAM,QAAQ,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,QAAM,UAAU,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,UAAU,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAExD,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO;AAC9D;AAGO,SAAS,aAAa,MAAY;AACxC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,OAAK,OAAO;AACZ,OAAK,WAAW,KAAK;AACrB,OAAK,MAAM;AACX,MAAI,gBAAgB,GAAG;AACxB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tldraw",
|
|
3
3
|
"description": "A tiny little drawing editor.",
|
|
4
|
-
"version": "3.16.0-canary.
|
|
4
|
+
"version": "3.16.0-canary.5462c7eac75a",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "tldraw Inc.",
|
|
7
7
|
"email": "hello@tldraw.com"
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
"@tiptap/pm": "^2.9.1",
|
|
56
56
|
"@tiptap/react": "^2.9.1",
|
|
57
57
|
"@tiptap/starter-kit": "^2.9.1",
|
|
58
|
-
"@tldraw/editor": "3.16.0-canary.
|
|
59
|
-
"@tldraw/store": "3.16.0-canary.
|
|
58
|
+
"@tldraw/editor": "3.16.0-canary.5462c7eac75a",
|
|
59
|
+
"@tldraw/store": "3.16.0-canary.5462c7eac75a",
|
|
60
60
|
"classnames": "^2.5.1",
|
|
61
61
|
"hotkeys-js": "^3.13.9",
|
|
62
62
|
"idb": "^7.1.1",
|
package/src/index.ts
CHANGED
|
@@ -171,11 +171,7 @@ export {
|
|
|
171
171
|
export { getStrokePoints } from './lib/shapes/shared/freehand/getStrokePoints'
|
|
172
172
|
export { getSvgPathFromStrokePoints } from './lib/shapes/shared/freehand/svg'
|
|
173
173
|
export { type StrokeOptions, type StrokePoint } from './lib/shapes/shared/freehand/types'
|
|
174
|
-
export {
|
|
175
|
-
PlainTextLabel,
|
|
176
|
-
TextLabel,
|
|
177
|
-
type PlainTextLabelProps,
|
|
178
|
-
} from './lib/shapes/shared/PlainTextLabel'
|
|
174
|
+
export { PlainTextLabel, type PlainTextLabelProps } from './lib/shapes/shared/PlainTextLabel'
|
|
179
175
|
export {
|
|
180
176
|
RichTextLabel,
|
|
181
177
|
RichTextSVG,
|
|
@@ -183,10 +179,9 @@ export {
|
|
|
183
179
|
type RichTextSVGProps,
|
|
184
180
|
} from './lib/shapes/shared/RichTextLabel'
|
|
185
181
|
export { useDefaultColorTheme } from './lib/shapes/shared/useDefaultColorTheme'
|
|
186
|
-
export { useEditablePlainText
|
|
182
|
+
export { useEditablePlainText } from './lib/shapes/shared/useEditablePlainText'
|
|
187
183
|
export { useEditableRichText } from './lib/shapes/shared/useEditableRichText'
|
|
188
184
|
export {
|
|
189
|
-
useAsset,
|
|
190
185
|
useImageOrVideoAsset,
|
|
191
186
|
type UseImageOrVideoAssetOptions,
|
|
192
187
|
} from './lib/shapes/shared/useImageOrVideoAsset'
|
|
@@ -365,10 +360,6 @@ export {
|
|
|
365
360
|
TldrawUiMenuSubmenu,
|
|
366
361
|
type TLUiMenuSubmenuProps,
|
|
367
362
|
} from './lib/ui/components/primitives/menus/TldrawUiMenuSubmenu'
|
|
368
|
-
export {
|
|
369
|
-
TldrawUiButtonPicker,
|
|
370
|
-
type TLUiButtonPickerProps,
|
|
371
|
-
} from './lib/ui/components/primitives/TldrawUiButtonPicker'
|
|
372
363
|
export {
|
|
373
364
|
TldrawUiContextualToolbar,
|
|
374
365
|
type TLUiContextualToolbarProps,
|
|
@@ -448,17 +439,44 @@ export {
|
|
|
448
439
|
type TLUiStylePanelProps,
|
|
449
440
|
} from './lib/ui/components/StylePanel/DefaultStylePanel'
|
|
450
441
|
export {
|
|
451
|
-
ArrowheadStylePickerSet,
|
|
452
|
-
CommonStylePickerSet,
|
|
453
442
|
DefaultStylePanelContent,
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
443
|
+
StylePanelArrowheadPicker,
|
|
444
|
+
StylePanelArrowKindPicker,
|
|
445
|
+
StylePanelColorPicker,
|
|
446
|
+
StylePanelDashPicker,
|
|
447
|
+
StylePanelFillPicker,
|
|
448
|
+
StylePanelFontPicker,
|
|
449
|
+
StylePanelGeoShapePicker,
|
|
450
|
+
StylePanelLabelAlignPicker,
|
|
451
|
+
StylePanelOpacityPicker,
|
|
452
|
+
StylePanelSection,
|
|
453
|
+
StylePanelSizePicker,
|
|
454
|
+
StylePanelSplinePicker,
|
|
455
|
+
StylePanelTextAlignPicker,
|
|
456
|
+
type StylePanelSectionProps,
|
|
461
457
|
} from './lib/ui/components/StylePanel/DefaultStylePanelContent'
|
|
458
|
+
export {
|
|
459
|
+
StylePanelButtonPicker,
|
|
460
|
+
type StylePanelButtonPickerProps,
|
|
461
|
+
} from './lib/ui/components/StylePanel/StylePanelButtonPicker'
|
|
462
|
+
export {
|
|
463
|
+
StylePanelContextProvider,
|
|
464
|
+
useStylePanelContext,
|
|
465
|
+
type StylePanelContext,
|
|
466
|
+
type StylePanelContextProviderProps,
|
|
467
|
+
} from './lib/ui/components/StylePanel/StylePanelContext'
|
|
468
|
+
export {
|
|
469
|
+
StylePanelDoubleDropdownPicker,
|
|
470
|
+
type StylePanelDoubleDropdownPickerProps,
|
|
471
|
+
} from './lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker'
|
|
472
|
+
export {
|
|
473
|
+
StylePanelDropdownPicker,
|
|
474
|
+
type StylePanelDropdownPickerProps,
|
|
475
|
+
} from './lib/ui/components/StylePanel/StylePanelDropdownPicker'
|
|
476
|
+
export {
|
|
477
|
+
StylePanelSubheading,
|
|
478
|
+
type StylePanelSubheadingProps,
|
|
479
|
+
} from './lib/ui/components/StylePanel/StylePanelSubheading'
|
|
462
480
|
export {
|
|
463
481
|
DefaultImageToolbar,
|
|
464
482
|
type TLUiImageToolbarProps,
|
|
@@ -636,7 +654,6 @@ export { preloadFont, type TLTypeFace } from './lib/utils/assets/preload-font'
|
|
|
636
654
|
export { getEmbedInfo, type TLEmbedResult } from './lib/utils/embeds/embeds'
|
|
637
655
|
export { putExcalidrawContent } from './lib/utils/excalidraw/putExcalidrawContent'
|
|
638
656
|
export { copyAs, type CopyAsOptions, type TLCopyType } from './lib/utils/export/copyAs'
|
|
639
|
-
export { exportToBlob } from './lib/utils/export/export'
|
|
640
657
|
export { downloadFile, exportAs, type ExportAsOptions } from './lib/utils/export/exportAs'
|
|
641
658
|
export { fitFrameToContent, removeFrame } from './lib/utils/frames/frames'
|
|
642
659
|
export {
|
|
@@ -901,8 +901,22 @@ export function notifyIfFileNotAllowed(file: File, options: TLDefaultExternalCon
|
|
|
901
901
|
}
|
|
902
902
|
|
|
903
903
|
if (file.size > maxAssetSize) {
|
|
904
|
+
const formatBytes = (bytes: number): string => {
|
|
905
|
+
if (bytes === 0) return '0 bytes'
|
|
906
|
+
|
|
907
|
+
const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']
|
|
908
|
+
const base = 1024
|
|
909
|
+
const unitIndex = Math.floor(Math.log(bytes) / Math.log(base))
|
|
910
|
+
|
|
911
|
+
const value = bytes / Math.pow(base, unitIndex)
|
|
912
|
+
const formatted = value % 1 === 0 ? value.toString() : value.toFixed(1)
|
|
913
|
+
|
|
914
|
+
return `${formatted} ${units[unitIndex]}`
|
|
915
|
+
}
|
|
916
|
+
|
|
904
917
|
toasts.addToast({
|
|
905
918
|
title: msg('assets.files.size-too-big'),
|
|
919
|
+
description: msg('assets.files.maximum-size').replace('{size}', formatBytes(maxAssetSize)),
|
|
906
920
|
severity: 'error',
|
|
907
921
|
})
|
|
908
922
|
return false
|
|
@@ -569,12 +569,12 @@ describe('reparenting issue', () => {
|
|
|
569
569
|
const arrow1BoundIndex = editor.getShape(arrow1Id)!.index
|
|
570
570
|
const arrow2BoundIndex = editor.getShape(arrow2Id)!.index
|
|
571
571
|
expect(arrow1BoundIndex).toBe('a1V')
|
|
572
|
-
expect(arrow2BoundIndex).toBe('
|
|
572
|
+
expect(arrow2BoundIndex).toBe('a1G')
|
|
573
573
|
|
|
574
574
|
// nudge everything around and make sure we all stay in the right order
|
|
575
575
|
editor.selectAll().nudgeShapes(editor.getSelectedShapeIds(), { x: -1, y: 0 })
|
|
576
576
|
expect(editor.getShape(arrow1Id)!.index).toBe('a1V')
|
|
577
|
-
expect(editor.getShape(arrow2Id)!.index).toBe('
|
|
577
|
+
expect(editor.getShape(arrow2Id)!.index).toBe('a1G')
|
|
578
578
|
})
|
|
579
579
|
})
|
|
580
580
|
|
|
@@ -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
|
+
})
|
|
@@ -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
|
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
debounce,
|
|
14
14
|
getHashForString,
|
|
15
15
|
lerp,
|
|
16
|
-
|
|
16
|
+
markEventAsHandled,
|
|
17
17
|
tlenv,
|
|
18
18
|
toDomPrecision,
|
|
19
19
|
useEditor,
|
|
@@ -132,9 +132,9 @@ function BookmarkShapeComponent({ shape }: { shape: TLBookmarkShape }) {
|
|
|
132
132
|
const [isFaviconValid, setIsFaviconValid] = useState(true)
|
|
133
133
|
const onFaviconError = () => setIsFaviconValid(false)
|
|
134
134
|
|
|
135
|
-
const
|
|
135
|
+
const markAsHandledOnShiftKey = useCallback<PointerEventHandler>(
|
|
136
136
|
(e) => {
|
|
137
|
-
if (!editor.inputs.shiftKey)
|
|
137
|
+
if (!editor.inputs.shiftKey) markEventAsHandled(e)
|
|
138
138
|
},
|
|
139
139
|
[editor]
|
|
140
140
|
)
|
|
@@ -182,8 +182,8 @@ function BookmarkShapeComponent({ shape }: { shape: TLBookmarkShape }) {
|
|
|
182
182
|
target="_blank"
|
|
183
183
|
rel="noopener noreferrer"
|
|
184
184
|
draggable={false}
|
|
185
|
-
onPointerDown={
|
|
186
|
-
onPointerUp={
|
|
185
|
+
onPointerDown={markAsHandledOnShiftKey}
|
|
186
|
+
onPointerUp={markAsHandledOnShiftKey}
|
|
187
187
|
>
|
|
188
188
|
{isFaviconValid && asset?.props.favicon ? (
|
|
189
189
|
<img
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TLFrameShape, TLShapeId,
|
|
1
|
+
import { TLFrameShape, TLShapeId, markEventAsHandled, useEditor } from '@tldraw/editor'
|
|
2
2
|
import { forwardRef, useCallback } from 'react'
|
|
3
3
|
import { defaultEmptyAs } from '../FrameShapeUtil'
|
|
4
4
|
|
|
@@ -13,7 +13,7 @@ export const FrameLabelInput = forwardRef<
|
|
|
13
13
|
if (e.key === 'Enter' && !e.nativeEvent.isComposing) {
|
|
14
14
|
// need to prevent the enter keydown making it's way up to the Idle state
|
|
15
15
|
// and sending us back into edit mode
|
|
16
|
-
|
|
16
|
+
markEventAsHandled(e)
|
|
17
17
|
e.currentTarget.blur()
|
|
18
18
|
editor.setEditingShape(null)
|
|
19
19
|
}
|
|
@@ -74,7 +74,7 @@ export const FrameLabelInput = forwardRef<
|
|
|
74
74
|
onKeyDown={handleKeyDown}
|
|
75
75
|
onBlur={handleBlur}
|
|
76
76
|
onChange={handleChange}
|
|
77
|
-
onPointerDown={isEditing ?
|
|
77
|
+
onPointerDown={isEditing ? markEventAsHandled : undefined}
|
|
78
78
|
draggable={false}
|
|
79
79
|
/>
|
|
80
80
|
{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 { markEventAsHandled, 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) 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
|
>
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
TLShapeId,
|
|
4
4
|
TLUnknownShape,
|
|
5
5
|
getPointerInfo,
|
|
6
|
+
markEventAsHandled,
|
|
6
7
|
noop,
|
|
7
8
|
preventDefault,
|
|
8
|
-
stopEventPropagation,
|
|
9
9
|
tlenv,
|
|
10
10
|
useEditor,
|
|
11
11
|
useValue,
|
|
@@ -136,7 +136,7 @@ export function useEditableTextCommon(shapeId: TLShapeId) {
|
|
|
136
136
|
shape: editor.getShape(shapeId)!,
|
|
137
137
|
})
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
e.stopPropagation() // we need to prevent blurring the input
|
|
140
140
|
},
|
|
141
141
|
[editor, shapeId]
|
|
142
142
|
)
|
|
@@ -157,19 +157,15 @@ export function useEditableTextCommon(shapeId: TLShapeId) {
|
|
|
157
157
|
[editor, shapeId]
|
|
158
158
|
)
|
|
159
159
|
|
|
160
|
+
const handleDoubleClick: (e: React.MouseEvent) => void = markEventAsHandled
|
|
161
|
+
|
|
160
162
|
return {
|
|
161
163
|
handleFocus: noop,
|
|
162
164
|
handleBlur: noop,
|
|
163
165
|
handleInputPointerDown,
|
|
164
|
-
handleDoubleClick
|
|
166
|
+
handleDoubleClick,
|
|
165
167
|
handlePaste,
|
|
166
168
|
isEditing,
|
|
167
169
|
isReadyForEditing,
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* @deprecated Use `useEditablePlainText` instead.
|
|
173
|
-
* @public
|
|
174
|
-
*/
|
|
175
|
-
export const useEditableText = useEditablePlainText
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { markEventAsHandled, preventDefault } from '@tldraw/editor'
|
|
2
2
|
import React from 'react'
|
|
3
3
|
import { TextAreaProps } from './RichTextArea'
|
|
4
4
|
|
|
@@ -46,8 +46,8 @@ export const PlainTextArea = React.forwardRef<HTMLTextAreaElement, TextAreaProps
|
|
|
46
46
|
onChange={onChange}
|
|
47
47
|
onKeyDown={(e) => handleKeyDown(e.nativeEvent)}
|
|
48
48
|
onBlur={handleBlur}
|
|
49
|
-
onTouchEnd={
|
|
50
|
-
onContextMenu={isEditing ?
|
|
49
|
+
onTouchEnd={markEventAsHandled}
|
|
50
|
+
onContextMenu={isEditing ? (e) => e.stopPropagation() : undefined}
|
|
51
51
|
onPointerDown={handleInputPointerDown}
|
|
52
52
|
onPaste={handlePaste}
|
|
53
53
|
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.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
debugFlags,
|
|
3
3
|
Editor,
|
|
4
|
-
|
|
4
|
+
markEventAsHandled,
|
|
5
5
|
TLGeoShape,
|
|
6
6
|
TLShapeId,
|
|
7
7
|
unsafe__withoutCapture,
|
|
@@ -23,7 +23,7 @@ export function SkipToMainContent() {
|
|
|
23
23
|
|
|
24
24
|
const handleNavigateToFirstShape = useCallback(
|
|
25
25
|
(e: MouseEvent | KeyboardEvent) => {
|
|
26
|
-
|
|
26
|
+
markEventAsHandled(e)
|
|
27
27
|
button.current?.blur()
|
|
28
28
|
const shapes = editor.getCurrentPageShapesInReadingOrder()
|
|
29
29
|
if (!shapes.length) return
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PageRecordType,
|
|
3
3
|
TLPageId,
|
|
4
|
+
markEventAsHandled,
|
|
4
5
|
releasePointerCapture,
|
|
5
6
|
setPointerCapture,
|
|
6
|
-
stopEventPropagation,
|
|
7
7
|
tlenv,
|
|
8
8
|
useEditor,
|
|
9
9
|
useValue,
|
|
@@ -451,7 +451,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
|
|
|
451
451
|
if (e.key === 'Enter') {
|
|
452
452
|
if (page.id === currentPage.id) {
|
|
453
453
|
toggleEditing()
|
|
454
|
-
|
|
454
|
+
markEventAsHandled(e)
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
}}
|