tldraw 3.16.0-canary.e9c30b532b82 → 3.16.0-canary.eb9a487b3293
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 +226 -102
- package/dist-cjs/index.js +33 -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 +5 -4
- 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/frame/FrameShapeUtil.js +6 -0
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.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/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 +0 -2
- 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/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/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/{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/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/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -45
- 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 +3 -2
- 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 +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +2 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +58 -42
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +2 -1
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +23 -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/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 +2 -0
- 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 +226 -102
- package/dist-esm/index.mjs +61 -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 +5 -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/frame/FrameShapeUtil.mjs +6 -0
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.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/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 +0 -2
- 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/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/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/{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/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/{primitives/TldrawUiButtonPicker.mjs → StylePanel/StylePanelButtonPicker.mjs} +54 -43
- 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 +3 -2
- 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 +3 -3
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +2 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +58 -42
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +2 -1
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +23 -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/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 +2 -0
- 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 +44 -22
- package/src/lib/Tldraw.tsx +15 -2
- package/src/lib/defaultExternalContentHandlers.ts +12 -4
- package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
- package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
- package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
- package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
- package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +8 -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/shared/PlainTextLabel.tsx +0 -6
- package/src/lib/shapes/shared/freehand/svg.ts +2 -0
- package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
- 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/ui/TldrawUi.tsx +16 -10
- package/src/lib/ui/assetUrls.ts +13 -10
- 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/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} +63 -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 +4 -3
- 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 +5 -5
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +3 -0
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +57 -23
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +3 -2
- package/src/lib/ui/context/actions.tsx +23 -10
- package/src/lib/ui/context/components.tsx +3 -0
- package/src/lib/ui/context/events.tsx +1 -1
- 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 +2 -0
- package/src/lib/ui/kbd-utils.ts +10 -3
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +19 -2
- 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 +13 -15
- 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 +3 -2
- 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 +27 -2
- 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.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.map +0 -7
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { tltime } from '@tldraw/editor'
|
|
1
2
|
import { Slider as _Slider } from 'radix-ui'
|
|
2
3
|
import React, { useCallback, useEffect, useState } from 'react'
|
|
3
4
|
import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
|
|
4
5
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
6
|
+
import { TldrawUiTooltip, tooltipManager } from './TldrawUiTooltip'
|
|
5
7
|
|
|
6
8
|
/** @public */
|
|
7
9
|
export interface TLUiSliderProps {
|
|
@@ -32,6 +34,7 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
|
|
|
32
34
|
ref
|
|
33
35
|
) {
|
|
34
36
|
const msg = useTranslation()
|
|
37
|
+
const [titleAndLabel, setTitleAndLabel] = useState('')
|
|
35
38
|
|
|
36
39
|
// XXX: Radix starts out our slider with a tabIndex of 0
|
|
37
40
|
// This causes some tab focusing issues, most prevelant in MobileStylePanel,
|
|
@@ -49,9 +52,25 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
|
|
|
49
52
|
)
|
|
50
53
|
|
|
51
54
|
const handlePointerDown = useCallback(() => {
|
|
55
|
+
tooltipManager.hideAllTooltips()
|
|
52
56
|
onHistoryMark('click slider')
|
|
53
57
|
}, [onHistoryMark])
|
|
54
58
|
|
|
59
|
+
// N.B. This is a bit silly. The Radix slider auto-focuses which
|
|
60
|
+
// triggers TldrawUiTooltip handleFocus when we dbl-click to edit an image,
|
|
61
|
+
// which in turn makes the tooltip display prematurely.
|
|
62
|
+
// This makes it wait until we've focused to show the tooltip.
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const timeout = tltime.setTimeout(
|
|
65
|
+
'set title and label',
|
|
66
|
+
() => {
|
|
67
|
+
setTitleAndLabel(title + ' — ' + msg(label as TLUiTranslationKey))
|
|
68
|
+
},
|
|
69
|
+
0
|
|
70
|
+
)
|
|
71
|
+
return () => clearTimeout(timeout)
|
|
72
|
+
}, [label, msg, title])
|
|
73
|
+
|
|
55
74
|
// N.B. Annoying. For a11y purposes, we need Tab to work.
|
|
56
75
|
// For some reason, Radix has some custom behavior here
|
|
57
76
|
// that interferes with tabbing past the slider and then
|
|
@@ -64,36 +83,37 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
|
|
|
64
83
|
|
|
65
84
|
return (
|
|
66
85
|
<div className="tlui-slider__container">
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
<TldrawUiTooltip content={titleAndLabel}>
|
|
87
|
+
<_Slider.Root
|
|
88
|
+
data-testid={testId}
|
|
89
|
+
className="tlui-slider"
|
|
90
|
+
dir="ltr"
|
|
91
|
+
min={min ?? 0}
|
|
92
|
+
max={steps}
|
|
93
|
+
step={1}
|
|
94
|
+
value={value !== null ? [value] : undefined}
|
|
95
|
+
onPointerDown={handlePointerDown}
|
|
96
|
+
onValueChange={handleValueChange}
|
|
97
|
+
onKeyDownCapture={handleKeyEvent}
|
|
98
|
+
onKeyUpCapture={handleKeyEvent}
|
|
99
|
+
>
|
|
100
|
+
<_Slider.Track className="tlui-slider__track" dir="ltr">
|
|
101
|
+
{value !== null && <_Slider.Range className="tlui-slider__range" dir="ltr" />}
|
|
102
|
+
</_Slider.Track>
|
|
103
|
+
{value !== null && (
|
|
104
|
+
<_Slider.Thumb
|
|
105
|
+
aria-valuemin={(min ?? 0) * ariaValueModifier}
|
|
106
|
+
aria-valuenow={value * ariaValueModifier}
|
|
107
|
+
aria-valuemax={steps * ariaValueModifier}
|
|
108
|
+
aria-label={titleAndLabel}
|
|
109
|
+
className="tlui-slider__thumb"
|
|
110
|
+
dir="ltr"
|
|
111
|
+
ref={ref}
|
|
112
|
+
tabIndex={tabIndex}
|
|
113
|
+
/>
|
|
114
|
+
)}
|
|
115
|
+
</_Slider.Root>
|
|
116
|
+
</TldrawUiTooltip>
|
|
97
117
|
</div>
|
|
98
118
|
)
|
|
99
119
|
})
|
|
@@ -94,6 +94,7 @@ export interface TLUiToolbarToggleGroupProps extends React.HTMLAttributes<HTMLDi
|
|
|
94
94
|
// TODO: fix up this type later
|
|
95
95
|
defaultValue?: any
|
|
96
96
|
type: 'single' | 'multiple'
|
|
97
|
+
asChild?: boolean
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
/** @public @react */
|
|
@@ -101,10 +102,12 @@ export const TldrawUiToolbarToggleGroup = ({
|
|
|
101
102
|
children,
|
|
102
103
|
className,
|
|
103
104
|
type,
|
|
105
|
+
asChild,
|
|
104
106
|
...props
|
|
105
107
|
}: TLUiToolbarToggleGroupProps) => {
|
|
106
108
|
return (
|
|
107
109
|
<_Toolbar.ToggleGroup
|
|
110
|
+
asChild={asChild}
|
|
108
111
|
type={type}
|
|
109
112
|
{...props}
|
|
110
113
|
// TODO: this fixes a bug in Radix until they fix it.
|
|
@@ -20,6 +20,8 @@ export interface TldrawUiTooltipProps {
|
|
|
20
20
|
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
21
21
|
sideOffset?: number
|
|
22
22
|
disabled?: boolean
|
|
23
|
+
showOnMobile?: boolean
|
|
24
|
+
delayDuration?: number
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
// Singleton tooltip manager
|
|
@@ -30,10 +32,11 @@ class TooltipManager {
|
|
|
30
32
|
content: ReactNode
|
|
31
33
|
side: 'top' | 'right' | 'bottom' | 'left'
|
|
32
34
|
sideOffset: number
|
|
35
|
+
showOnMobile: boolean
|
|
33
36
|
targetElement: HTMLElement
|
|
37
|
+
delayDuration: number
|
|
34
38
|
} | null>('current tooltip', null)
|
|
35
39
|
private destroyTimeoutId: number | null = null
|
|
36
|
-
private subscribers: Set<() => void> = new Set()
|
|
37
40
|
|
|
38
41
|
static getInstance(): TooltipManager {
|
|
39
42
|
if (!TooltipManager.instance) {
|
|
@@ -46,8 +49,10 @@ class TooltipManager {
|
|
|
46
49
|
tooltipId: string,
|
|
47
50
|
content: string | React.ReactNode,
|
|
48
51
|
targetElement: HTMLElement,
|
|
49
|
-
side: 'top' | 'right' | 'bottom' | 'left'
|
|
50
|
-
sideOffset: number
|
|
52
|
+
side: 'top' | 'right' | 'bottom' | 'left',
|
|
53
|
+
sideOffset: number,
|
|
54
|
+
showOnMobile: boolean,
|
|
55
|
+
delayDuration: number
|
|
51
56
|
) {
|
|
52
57
|
// Clear any existing destroy timeout
|
|
53
58
|
if (this.destroyTimeoutId) {
|
|
@@ -61,7 +66,9 @@ class TooltipManager {
|
|
|
61
66
|
content,
|
|
62
67
|
side,
|
|
63
68
|
sideOffset,
|
|
69
|
+
showOnMobile,
|
|
64
70
|
targetElement,
|
|
71
|
+
delayDuration,
|
|
65
72
|
})
|
|
66
73
|
}
|
|
67
74
|
|
|
@@ -88,8 +95,10 @@ class TooltipManager {
|
|
|
88
95
|
}
|
|
89
96
|
|
|
90
97
|
getCurrentTooltipData() {
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
const currentTooltip = this.currentTooltip.get()
|
|
99
|
+
if (!currentTooltip) return null
|
|
100
|
+
if (!this.supportsHover() && !currentTooltip.showOnMobile) return null
|
|
101
|
+
return currentTooltip
|
|
93
102
|
}
|
|
94
103
|
|
|
95
104
|
private supportsHoverAtom: Atom<boolean> | null = null
|
|
@@ -130,11 +139,10 @@ export function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderPro
|
|
|
130
139
|
|
|
131
140
|
// The singleton tooltip component that renders once
|
|
132
141
|
function TooltipSingleton() {
|
|
133
|
-
const editor = useMaybeEditor()
|
|
134
142
|
const [isOpen, setIsOpen] = useState(false)
|
|
135
143
|
const triggerRef = useRef<HTMLDivElement>(null)
|
|
136
144
|
const isFirstShowRef = useRef(true)
|
|
137
|
-
const
|
|
145
|
+
const editor = useMaybeEditor()
|
|
138
146
|
|
|
139
147
|
const currentTooltip = useValue(
|
|
140
148
|
'current tooltip',
|
|
@@ -142,14 +150,18 @@ function TooltipSingleton() {
|
|
|
142
150
|
[]
|
|
143
151
|
)
|
|
144
152
|
|
|
145
|
-
|
|
153
|
+
const cameraState = useValue('camera state', () => editor?.getCameraState(), [editor])
|
|
154
|
+
|
|
155
|
+
// Hide tooltip when camera is moving (panning/zooming)
|
|
146
156
|
useEffect(() => {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
clearTimeout(showTimeoutRef.current)
|
|
150
|
-
showTimeoutRef.current = null
|
|
157
|
+
if (cameraState === 'moving' && isOpen && currentTooltip) {
|
|
158
|
+
tooltipManager.hideTooltip(editor, currentTooltip.id, true)
|
|
151
159
|
}
|
|
160
|
+
}, [cameraState, isOpen, currentTooltip, editor])
|
|
152
161
|
|
|
162
|
+
// Update open state and trigger position
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
let timer: ReturnType<typeof setTimeout> | null = null
|
|
153
165
|
if (currentTooltip && triggerRef.current) {
|
|
154
166
|
// Position the invisible trigger element over the active element
|
|
155
167
|
const activeRect = currentTooltip.targetElement.getBoundingClientRect()
|
|
@@ -164,11 +176,12 @@ function TooltipSingleton() {
|
|
|
164
176
|
trigger.style.zIndex = '9999'
|
|
165
177
|
|
|
166
178
|
// Handle delay for first show
|
|
167
|
-
if (isFirstShowRef.current
|
|
168
|
-
|
|
179
|
+
if (isFirstShowRef.current) {
|
|
180
|
+
// eslint-disable-next-line no-restricted-globals
|
|
181
|
+
timer = setTimeout(() => {
|
|
169
182
|
setIsOpen(true)
|
|
170
183
|
isFirstShowRef.current = false
|
|
171
|
-
},
|
|
184
|
+
}, currentTooltip.delayDuration)
|
|
172
185
|
} else {
|
|
173
186
|
// Subsequent tooltips show immediately
|
|
174
187
|
setIsOpen(true)
|
|
@@ -179,7 +192,13 @@ function TooltipSingleton() {
|
|
|
179
192
|
// Reset first show state after tooltip is hidden
|
|
180
193
|
isFirstShowRef.current = true
|
|
181
194
|
}
|
|
182
|
-
|
|
195
|
+
|
|
196
|
+
return () => {
|
|
197
|
+
if (timer !== null) {
|
|
198
|
+
clearTimeout(timer)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}, [currentTooltip])
|
|
183
202
|
|
|
184
203
|
if (!currentTooltip) {
|
|
185
204
|
return null
|
|
@@ -207,7 +226,18 @@ function TooltipSingleton() {
|
|
|
207
226
|
|
|
208
227
|
/** @public @react */
|
|
209
228
|
export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProps>(
|
|
210
|
-
(
|
|
229
|
+
(
|
|
230
|
+
{
|
|
231
|
+
children,
|
|
232
|
+
content,
|
|
233
|
+
side,
|
|
234
|
+
sideOffset = 5,
|
|
235
|
+
disabled = false,
|
|
236
|
+
showOnMobile = false,
|
|
237
|
+
delayDuration,
|
|
238
|
+
},
|
|
239
|
+
ref
|
|
240
|
+
) => {
|
|
211
241
|
const editor = useMaybeEditor()
|
|
212
242
|
const tooltipId = useRef<string>(uniqueId())
|
|
213
243
|
const hasProvider = useContext(TooltipSingletonContext)
|
|
@@ -229,13 +259,13 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
|
|
|
229
259
|
return <>{children}</>
|
|
230
260
|
}
|
|
231
261
|
|
|
262
|
+
const delayDurationToUse =
|
|
263
|
+
delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS)
|
|
264
|
+
|
|
232
265
|
// Fallback to old behavior if no provider
|
|
233
266
|
if (!hasProvider) {
|
|
234
267
|
return (
|
|
235
|
-
<_Tooltip.Root
|
|
236
|
-
delayDuration={editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS}
|
|
237
|
-
disableHoverableContent
|
|
238
|
-
>
|
|
268
|
+
<_Tooltip.Root delayDuration={delayDurationToUse} disableHoverableContent>
|
|
239
269
|
<_Tooltip.Trigger asChild ref={ref}>
|
|
240
270
|
{children}
|
|
241
271
|
</_Tooltip.Trigger>
|
|
@@ -264,7 +294,9 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
|
|
|
264
294
|
content,
|
|
265
295
|
event.currentTarget as HTMLElement,
|
|
266
296
|
sideToUse,
|
|
267
|
-
sideOffset
|
|
297
|
+
sideOffset,
|
|
298
|
+
showOnMobile,
|
|
299
|
+
delayDurationToUse
|
|
268
300
|
)
|
|
269
301
|
}
|
|
270
302
|
|
|
@@ -280,7 +312,9 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
|
|
|
280
312
|
content,
|
|
281
313
|
event.currentTarget as HTMLElement,
|
|
282
314
|
sideToUse,
|
|
283
|
-
sideOffset
|
|
315
|
+
sideOffset,
|
|
316
|
+
showOnMobile,
|
|
317
|
+
delayDurationToUse
|
|
284
318
|
)
|
|
285
319
|
}
|
|
286
320
|
|
|
@@ -316,8 +316,8 @@ function useDraggableEvents(
|
|
|
316
316
|
if (
|
|
317
317
|
distanceSq >
|
|
318
318
|
(editor.getInstanceState().isCoarsePointer
|
|
319
|
-
? editor.options.
|
|
320
|
-
: editor.options.
|
|
319
|
+
? editor.options.uiCoarseDragDistanceSquared
|
|
320
|
+
: editor.options.uiDragDistanceSquared)
|
|
321
321
|
) {
|
|
322
322
|
const screenSpaceStart = state.screenSpaceStart
|
|
323
323
|
state = {
|
|
@@ -350,6 +350,7 @@ function useDraggableEvents(
|
|
|
350
350
|
})
|
|
351
351
|
|
|
352
352
|
tooltipManager.hideAllTooltips()
|
|
353
|
+
editor.getContainer().focus()
|
|
353
354
|
})
|
|
354
355
|
}
|
|
355
356
|
}
|
|
@@ -36,6 +36,7 @@ import { useTranslation } from '../hooks/useTranslation/useTranslation'
|
|
|
36
36
|
import { TLUiIconType } from '../icon-types'
|
|
37
37
|
import { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'
|
|
38
38
|
import { useA11y } from './a11y'
|
|
39
|
+
import { useTldrawUiComponents } from './components'
|
|
39
40
|
import { TLUiEventSource, useUiEvents } from './events'
|
|
40
41
|
|
|
41
42
|
/** @public */
|
|
@@ -98,6 +99,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
98
99
|
const _editor = useMaybeEditor()
|
|
99
100
|
const showCollaborationUi = useShowCollaborationUi()
|
|
100
101
|
const helpers = useDefaultHelpers()
|
|
102
|
+
const components = useTldrawUiComponents()
|
|
101
103
|
const trackEvent = useUiEvents()
|
|
102
104
|
const a11y = useA11y()
|
|
103
105
|
const msg = useTranslation()
|
|
@@ -176,7 +178,9 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
176
178
|
kbd: 'cmd+alt+/,ctrl+alt+/',
|
|
177
179
|
onSelect(source) {
|
|
178
180
|
trackEvent('open-kbd-shortcuts', { source })
|
|
179
|
-
helpers.addDialog({
|
|
181
|
+
helpers.addDialog({
|
|
182
|
+
component: components.KeyboardShortcutsDialog ?? DefaultKeyboardShortcutsDialog,
|
|
183
|
+
})
|
|
180
184
|
},
|
|
181
185
|
},
|
|
182
186
|
{
|
|
@@ -221,7 +225,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
221
225
|
if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
|
|
222
226
|
if (ids.length === 0) return
|
|
223
227
|
trackEvent('export-as', { format: 'svg', source })
|
|
224
|
-
helpers.exportAs(ids, 'svg', getExportName(editor, defaultDocumentName))
|
|
228
|
+
helpers.exportAs(ids, { format: 'svg', name: getExportName(editor, defaultDocumentName) })
|
|
225
229
|
},
|
|
226
230
|
},
|
|
227
231
|
{
|
|
@@ -237,7 +241,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
237
241
|
if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
|
|
238
242
|
if (ids.length === 0) return
|
|
239
243
|
trackEvent('export-as', { format: 'png', source })
|
|
240
|
-
helpers.exportAs(ids, 'png', getExportName(editor, defaultDocumentName))
|
|
244
|
+
helpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })
|
|
241
245
|
},
|
|
242
246
|
},
|
|
243
247
|
{
|
|
@@ -253,11 +257,10 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
253
257
|
if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
|
|
254
258
|
if (ids.length === 0) return
|
|
255
259
|
trackEvent('export-all-as', { format: 'svg', source })
|
|
256
|
-
helpers.exportAs(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
)
|
|
260
|
+
helpers.exportAs(Array.from(editor.getCurrentPageShapeIds()), {
|
|
261
|
+
format: 'svg',
|
|
262
|
+
name: getExportName(editor, defaultDocumentName),
|
|
263
|
+
})
|
|
261
264
|
},
|
|
262
265
|
},
|
|
263
266
|
{
|
|
@@ -272,7 +275,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
272
275
|
const ids = Array.from(editor.getCurrentPageShapeIds().values())
|
|
273
276
|
if (ids.length === 0) return
|
|
274
277
|
trackEvent('export-all-as', { format: 'png', source })
|
|
275
|
-
helpers.exportAs(ids, 'png', getExportName(editor, defaultDocumentName))
|
|
278
|
+
helpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })
|
|
276
279
|
},
|
|
277
280
|
},
|
|
278
281
|
{
|
|
@@ -1755,7 +1758,17 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
|
|
|
1755
1758
|
}
|
|
1756
1759
|
|
|
1757
1760
|
return actions
|
|
1758
|
-
}, [
|
|
1761
|
+
}, [
|
|
1762
|
+
helpers,
|
|
1763
|
+
_editor,
|
|
1764
|
+
trackEvent,
|
|
1765
|
+
overrides,
|
|
1766
|
+
defaultDocumentName,
|
|
1767
|
+
showCollaborationUi,
|
|
1768
|
+
msg,
|
|
1769
|
+
a11y,
|
|
1770
|
+
components,
|
|
1771
|
+
])
|
|
1759
1772
|
|
|
1760
1773
|
return <ActionsContext.Provider value={asActions(actions)}>{children}</ActionsContext.Provider>
|
|
1761
1774
|
}
|
|
@@ -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
|
|
@@ -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' })
|
|
@@ -186,6 +186,7 @@ export type TLUiTranslationKey =
|
|
|
186
186
|
| 'geo-style.pentagon'
|
|
187
187
|
| 'geo-style.rectangle'
|
|
188
188
|
| 'geo-style.rhombus'
|
|
189
|
+
| 'geo-style.rhombus-2'
|
|
189
190
|
| 'geo-style.star'
|
|
190
191
|
| 'geo-style.trapezoid'
|
|
191
192
|
| 'geo-style.triangle'
|
|
@@ -260,6 +261,7 @@ export type TLUiTranslationKey =
|
|
|
260
261
|
| 'tool.aspect-ratio.wide'
|
|
261
262
|
| 'tool.image-toolbar-title'
|
|
262
263
|
| 'tool.image-crop'
|
|
264
|
+
| 'tool.image-crop-confirm'
|
|
263
265
|
| 'tool.media-alt-text'
|
|
264
266
|
| 'tool.media-alt-text-desc'
|
|
265
267
|
| 'tool.media-alt-text-confirm'
|
|
@@ -187,6 +187,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
187
187
|
'geo-style.pentagon': 'Pentagon',
|
|
188
188
|
'geo-style.rectangle': 'Rectangle',
|
|
189
189
|
'geo-style.rhombus': 'Rhombus',
|
|
190
|
+
'geo-style.rhombus-2': 'Rhombus left',
|
|
190
191
|
'geo-style.star': 'Star',
|
|
191
192
|
'geo-style.trapezoid': 'Trapezoid',
|
|
192
193
|
'geo-style.triangle': 'Triangle',
|
|
@@ -261,6 +262,7 @@ export const DEFAULT_TRANSLATION = {
|
|
|
261
262
|
'tool.aspect-ratio.wide': 'Wide (16:9)',
|
|
262
263
|
'tool.image-toolbar-title': 'Image tools',
|
|
263
264
|
'tool.image-crop': 'Crop image',
|
|
265
|
+
'tool.image-crop-confirm': 'Confirm',
|
|
264
266
|
'tool.media-alt-text': 'Alternative text',
|
|
265
267
|
'tool.media-alt-text-desc': 'Give a description…',
|
|
266
268
|
'tool.media-alt-text-confirm': 'Confirm',
|
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.eb9a487b3293'
|
|
5
5
|
export const publishDates = {
|
|
6
6
|
major: '2024-09-13T14:36:29.063Z',
|
|
7
|
-
minor: '2025-
|
|
8
|
-
patch: '2025-
|
|
7
|
+
minor: '2025-09-03T14:13:53.399Z',
|
|
8
|
+
patch: '2025-09-03T14:13:53.399Z',
|
|
9
9
|
}
|
package/src/lib/ui.css
CHANGED
|
@@ -1007,9 +1007,23 @@
|
|
|
1007
1007
|
flex-direction: column;
|
|
1008
1008
|
}
|
|
1009
1009
|
|
|
1010
|
-
|
|
1010
|
+
/*
|
|
1011
|
+
add a border to the bottom of all but the last section. we have to handle empty sections too, which
|
|
1012
|
+
are hidden and shouldn't be counted
|
|
1013
|
+
*/
|
|
1014
|
+
.tlui-style-panel__section:not(:nth-last-child(-n + 1 of .tlui-style-panel__section:not(:empty))) {
|
|
1011
1015
|
border-bottom: 1px solid var(--tl-color-divider);
|
|
1012
1016
|
}
|
|
1017
|
+
/*
|
|
1018
|
+
if a section ends with a slider and we're adding a border, we need some extra space for visual
|
|
1019
|
+
balance. we need to handle empty sections as above. is this the most complex css selector in all of
|
|
1020
|
+
tldraw? probably.
|
|
1021
|
+
*/
|
|
1022
|
+
.tlui-style-panel__section:has(.tlui-slider__container:last-child):not(
|
|
1023
|
+
:nth-last-child(-n + 1 of .tlui-style-panel__section:not(:empty))
|
|
1024
|
+
) {
|
|
1025
|
+
margin-bottom: 7px;
|
|
1026
|
+
}
|
|
1013
1027
|
|
|
1014
1028
|
.tlui-style-panel__section:empty {
|
|
1015
1029
|
display: none;
|
|
@@ -1021,7 +1035,7 @@
|
|
|
1021
1035
|
}
|
|
1022
1036
|
|
|
1023
1037
|
.tlui-style-panel__dropdown-picker:only-child {
|
|
1024
|
-
|
|
1038
|
+
flex: 1;
|
|
1025
1039
|
}
|
|
1026
1040
|
|
|
1027
1041
|
.tlui-style-panel__double-select-picker {
|
|
@@ -1047,6 +1061,9 @@
|
|
|
1047
1061
|
}
|
|
1048
1062
|
|
|
1049
1063
|
@media (hover: hover) {
|
|
1064
|
+
.tlui-style-panel .tlui-button[aria-expanded='true'] {
|
|
1065
|
+
background: none;
|
|
1066
|
+
}
|
|
1050
1067
|
.tlui-style-panel .tlui-button[data-state='open']:not(:hover)::after {
|
|
1051
1068
|
opacity: 1;
|
|
1052
1069
|
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
|