@tldraw/editor 4.6.0-next.5a871ec02ff3 → 4.6.0-next.6594d48ace27
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 +1316 -285
- package/dist-cjs/index.js +31 -26
- package/dist-cjs/index.js.map +3 -3
- package/dist-cjs/lib/TldrawEditor.js +62 -14
- package/dist-cjs/lib/TldrawEditor.js.map +3 -3
- package/dist-cjs/lib/components/MenuClickCapture.js +99 -38
- package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
- package/dist-cjs/lib/components/default-components/CanvasOverlays.js +180 -0
- package/dist-cjs/lib/components/default-components/CanvasOverlays.js.map +7 -0
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +33 -236
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +3 -3
- package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
- package/dist-cjs/lib/config/{createTLUser.js → createTLCurrentUser.js} +9 -9
- package/dist-cjs/lib/config/createTLCurrentUser.js.map +7 -0
- package/dist-cjs/lib/config/createTLStore.js +31 -1
- package/dist-cjs/lib/config/createTLStore.js.map +2 -2
- package/dist-cjs/lib/{components/default-components/DefaultShapeIndicatorErrorFallback.js → config/defaultAssets.js} +17 -9
- package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
- package/dist-cjs/lib/config/defaultShapes.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +921 -386
- package/dist-cjs/lib/editor/Editor.js.map +3 -3
- package/dist-cjs/lib/editor/assets/AssetUtil.js +67 -0
- package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
- package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
- package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +26 -64
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +98 -0
- package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +2 -1
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +15 -53
- package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
- package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +83 -112
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js +80 -0
- package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js.map +7 -0
- package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +466 -0
- package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +7 -0
- package/dist-cjs/lib/{components/default-components/DefaultHandles.js → editor/managers/PerformanceManager/perf-types.js} +3 -14
- package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js.map +7 -0
- package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
- package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +22 -56
- package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +12 -52
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +21 -57
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +5 -4
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +103 -30
- package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +107 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +600 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +17 -55
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +65 -72
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
- package/dist-cjs/lib/editor/overlays/OverlayManager.js +154 -0
- package/dist-cjs/lib/editor/overlays/OverlayManager.js.map +7 -0
- package/dist-cjs/lib/editor/overlays/OverlayUtil.js +92 -0
- package/dist-cjs/lib/editor/overlays/OverlayUtil.js.map +7 -0
- package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +161 -0
- package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +76 -0
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +35 -20
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +33 -3
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
- package/dist-cjs/lib/editor/tools/StateNode.js +15 -17
- package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
- package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
- package/dist-cjs/lib/editor/types/clipboard-types.js.map +1 -1
- package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
- package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
- package/dist-cjs/lib/exports/ExportDelay.js +13 -53
- package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
- package/dist-cjs/lib/exports/FontEmbedder.js +14 -57
- package/dist-cjs/lib/exports/FontEmbedder.js.map +1 -1
- package/dist-cjs/lib/exports/StyleEmbedder.js +2 -1
- package/dist-cjs/lib/exports/StyleEmbedder.js.map +2 -2
- package/dist-cjs/lib/exports/fetchCache.js +1 -1
- package/dist-cjs/lib/exports/fetchCache.js.map +2 -2
- package/dist-cjs/lib/exports/getSvgJsx.js +14 -8
- package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
- package/dist-cjs/lib/globals/environment.js +18 -1
- package/dist-cjs/lib/globals/environment.js.map +2 -2
- package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
- package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
- package/dist-cjs/lib/hooks/useCursor.js +3 -7
- package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
- package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
- package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js +0 -28
- package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
- package/dist-cjs/lib/hooks/useGestureEvents.js +171 -127
- package/dist-cjs/lib/hooks/useGestureEvents.js.map +3 -3
- package/dist-cjs/lib/hooks/useLocalStore.js.map +2 -2
- package/dist-cjs/lib/hooks/usePeerIds.js +1 -36
- package/dist-cjs/lib/hooks/usePeerIds.js.map +2 -2
- package/dist-cjs/lib/hooks/useShapeCulling.js +2 -1
- package/dist-cjs/lib/hooks/useShapeCulling.js.map +2 -2
- package/dist-cjs/lib/options.js +4 -0
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +26 -26
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +4 -1
- package/dist-cjs/lib/primitives/Vec.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
- package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Circle2d.js +3 -2
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +1 -1
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +4 -3
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +12 -9
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js +2 -2
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js +2 -1
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
- package/dist-cjs/lib/utils/EditorAtom.js +2 -0
- package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
- package/dist-cjs/lib/utils/SharedStylesMap.js +1 -1
- package/dist-cjs/lib/utils/SharedStylesMap.js.map +1 -1
- package/dist-cjs/lib/utils/getSvgPathFromPoints.js.map +2 -2
- package/dist-cjs/lib/utils/reparenting.js +2 -1
- package/dist-cjs/lib/utils/reparenting.js.map +2 -2
- package/dist-cjs/lib/utils/richText.js.map +2 -2
- package/dist-cjs/lib/utils/runtime.js +2 -1
- package/dist-cjs/lib/utils/runtime.js.map +2 -2
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +8 -2
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
- package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
- package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +1316 -285
- package/dist-esm/index.mjs +44 -48
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +65 -14
- package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
- package/dist-esm/lib/components/MenuClickCapture.mjs +100 -39
- package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/CanvasOverlays.mjs +160 -0
- package/dist-esm/lib/components/default-components/CanvasOverlays.mjs.map +7 -0
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +34 -237
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +3 -3
- package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
- package/dist-esm/lib/config/{createTLUser.mjs → createTLCurrentUser.mjs} +6 -6
- package/dist-esm/lib/config/createTLCurrentUser.mjs.map +7 -0
- package/dist-esm/lib/config/createTLStore.mjs +37 -2
- package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
- package/dist-esm/lib/config/defaultAssets.mjs +16 -0
- package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
- package/dist-esm/lib/config/defaultShapes.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +924 -389
- package/dist-esm/lib/editor/Editor.mjs.map +3 -3
- package/dist-esm/lib/editor/assets/AssetUtil.mjs +47 -0
- package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
- package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +26 -64
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +83 -0
- package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +2 -1
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +15 -53
- package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
- package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +83 -112
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
- package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
- package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
- package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +22 -56
- package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +12 -52
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +21 -57
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +5 -4
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +103 -30
- package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +89 -0
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +582 -0
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +17 -55
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +65 -72
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
- package/dist-esm/lib/editor/overlays/OverlayManager.mjs +136 -0
- package/dist-esm/lib/editor/overlays/OverlayManager.mjs.map +7 -0
- package/dist-esm/lib/editor/overlays/OverlayUtil.mjs +72 -0
- package/dist-esm/lib/editor/overlays/OverlayUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +141 -0
- package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +56 -0
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +35 -20
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +33 -3
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/StateNode.mjs +15 -17
- package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
- package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
- package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
- package/dist-esm/lib/exports/ExportDelay.mjs +13 -53
- package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
- package/dist-esm/lib/exports/FontEmbedder.mjs +14 -57
- package/dist-esm/lib/exports/FontEmbedder.mjs.map +1 -1
- package/dist-esm/lib/exports/StyleEmbedder.mjs +2 -1
- package/dist-esm/lib/exports/StyleEmbedder.mjs.map +2 -2
- package/dist-esm/lib/exports/fetchCache.mjs +2 -2
- package/dist-esm/lib/exports/fetchCache.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs +14 -11
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
- package/dist-esm/lib/globals/environment.mjs +18 -1
- package/dist-esm/lib/globals/environment.mjs.map +2 -2
- package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
- package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
- package/dist-esm/lib/hooks/useCursor.mjs +3 -7
- package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
- package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -28
- package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useGestureEvents.mjs +171 -127
- package/dist-esm/lib/hooks/useGestureEvents.mjs.map +3 -3
- package/dist-esm/lib/hooks/useLocalStore.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePeerIds.mjs +2 -40
- package/dist-esm/lib/hooks/usePeerIds.mjs.map +2 -2
- package/dist-esm/lib/hooks/useShapeCulling.mjs +2 -1
- package/dist-esm/lib/hooks/useShapeCulling.mjs.map +2 -2
- package/dist-esm/lib/options.mjs +4 -0
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +26 -26
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +4 -1
- package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs +3 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +1 -1
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +4 -3
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +12 -9
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +2 -1
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
- package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
- package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
- package/dist-esm/lib/utils/SharedStylesMap.mjs +1 -1
- package/dist-esm/lib/utils/SharedStylesMap.mjs.map +1 -1
- package/dist-esm/lib/utils/getSvgPathFromPoints.mjs.map +2 -2
- package/dist-esm/lib/utils/reparenting.mjs +2 -1
- package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
- package/dist-esm/lib/utils/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/runtime.mjs +2 -1
- package/dist-esm/lib/utils/runtime.mjs.map +2 -2
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +8 -2
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
- package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
- package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +16 -256
- package/package.json +7 -8
- package/src/index.ts +58 -52
- package/src/lib/TldrawEditor.tsx +108 -20
- package/src/lib/components/MenuClickCapture.tsx +129 -49
- package/src/lib/components/default-components/CanvasOverlays.tsx +208 -0
- package/src/lib/components/default-components/DefaultCanvas.tsx +38 -310
- package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -0
- package/src/lib/config/TLEditorSnapshot.test.ts +1 -1
- package/src/lib/config/{createTLUser.ts → createTLCurrentUser.ts} +9 -9
- package/src/lib/config/createTLStore.ts +58 -3
- package/src/lib/config/defaultAssets.ts +19 -0
- package/src/lib/config/defaultShapes.ts +1 -1
- package/src/lib/editor/Editor.test.ts +3 -1
- package/src/lib/editor/Editor.ts +610 -69
- package/src/lib/editor/assets/AssetUtil.ts +85 -0
- package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
- package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +98 -0
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +1 -1
- package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
- package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
- package/src/lib/editor/managers/InputsManager/InputsManager.ts +42 -30
- package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
- package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
- package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
- package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
- package/src/lib/editor/managers/SnapManager/BoundsSnaps.ts +1 -1
- package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +1 -1
- package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
- package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
- package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +5 -5
- package/src/lib/editor/managers/TextManager/TextManager.test.ts +18 -4
- package/src/lib/editor/managers/TextManager/TextManager.ts +140 -34
- package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
- package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +619 -0
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +25 -31
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +7 -5
- package/src/lib/editor/overlays/OverlayManager.ts +183 -0
- package/src/lib/editor/overlays/OverlayUtil.ts +143 -0
- package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +216 -0
- package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +123 -0
- package/src/lib/editor/shapes/ShapeUtil.ts +67 -30
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +41 -4
- package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
- package/src/lib/editor/tools/StateNode.ts +16 -18
- package/src/lib/editor/types/SvgExportContext.tsx +5 -0
- package/src/lib/editor/types/clipboard-types.ts +2 -1
- package/src/lib/editor/types/event-types.ts +2 -0
- package/src/lib/editor/types/external-content.ts +1 -0
- package/src/lib/exports/StyleEmbedder.ts +1 -1
- package/src/lib/exports/fetchCache.ts +2 -4
- package/src/lib/exports/getSvgJsx.test.ts +3 -1
- package/src/lib/exports/getSvgJsx.tsx +24 -17
- package/src/lib/globals/environment.ts +18 -0
- package/src/lib/hooks/EditorComponentsContext.tsx +0 -27
- package/src/lib/hooks/useCanvasEvents.ts +40 -3
- package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
- package/src/lib/hooks/useCursor.ts +3 -7
- package/src/lib/hooks/useDarkMode.ts +4 -4
- package/src/lib/hooks/useEditorComponents.tsx +1 -29
- package/src/lib/hooks/useGestureEvents.ts +240 -168
- package/src/lib/hooks/useLocalStore.ts +1 -1
- package/src/lib/hooks/usePeerIds.ts +6 -55
- package/src/lib/hooks/useShapeCulling.tsx +3 -1
- package/src/lib/options.ts +115 -0
- package/src/lib/primitives/Box.test.ts +30 -0
- package/src/lib/primitives/Box.ts +26 -26
- package/src/lib/primitives/Vec.ts +1 -1
- package/src/lib/primitives/geometry/Arc2d.ts +2 -2
- package/src/lib/primitives/geometry/Circle2d.ts +2 -2
- package/src/lib/primitives/geometry/CubicSpline2d.ts +1 -1
- package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
- package/src/lib/primitives/geometry/Geometry2d.test.ts +21 -0
- package/src/lib/primitives/geometry/Geometry2d.ts +10 -9
- package/src/lib/primitives/geometry/Polyline2d.ts +2 -2
- package/src/lib/primitives/geometry/Stadium2d.ts +1 -1
- package/src/lib/utils/SharedStylesMap.ts +1 -1
- package/src/lib/utils/getSvgPathFromPoints.ts +1 -1
- package/src/lib/utils/reparenting.ts +6 -2
- package/src/lib/utils/richText.ts +1 -1
- package/src/lib/utils/runtime.ts +3 -1
- package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
- package/src/lib/utils/sync/TLLocalSyncClient.ts +5 -1
- package/src/lib/utils/sync/hardReset.ts +0 -8
- package/src/version.ts +3 -3
- package/dist-cjs/lib/components/LiveCollaborators.js +0 -151
- package/dist-cjs/lib/components/LiveCollaborators.js.map +0 -7
- package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +0 -227
- package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultBrush.js +0 -38
- package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +0 -71
- package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultHandle.js +0 -56
- package/dist-cjs/lib/components/default-components/DefaultHandle.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultScribble.js +0 -51
- package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js +0 -69
- package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +0 -107
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +0 -101
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +0 -7
- package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +0 -170
- package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +0 -7
- package/dist-cjs/lib/config/createTLUser.js.map +0 -7
- package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
- package/dist-esm/lib/components/LiveCollaborators.mjs +0 -134
- package/dist-esm/lib/components/LiveCollaborators.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +0 -207
- package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultBrush.mjs +0 -18
- package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +0 -41
- package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultHandle.mjs +0 -26
- package/dist-esm/lib/components/default-components/DefaultHandle.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultHandles.mjs +0 -8
- package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultScribble.mjs +0 -21
- package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs +0 -39
- package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +0 -77
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs +0 -8
- package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +0 -81
- package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +0 -142
- package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +0 -7
- package/dist-esm/lib/config/createTLUser.mjs.map +0 -7
- package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
- package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
- package/src/lib/components/LiveCollaborators.tsx +0 -174
- package/src/lib/components/default-components/CanvasShapeIndicators.tsx +0 -289
- package/src/lib/components/default-components/DefaultBrush.tsx +0 -35
- package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +0 -52
- package/src/lib/components/default-components/DefaultHandle.tsx +0 -42
- package/src/lib/components/default-components/DefaultHandles.tsx +0 -15
- package/src/lib/components/default-components/DefaultScribble.tsx +0 -31
- package/src/lib/components/default-components/DefaultSelectionForeground.tsx +0 -50
- package/src/lib/components/default-components/DefaultShapeIndicator.tsx +0 -104
- package/src/lib/components/default-components/DefaultShapeIndicatorErrorFallback.tsx +0 -9
- package/src/lib/components/default-components/DefaultShapeIndicators.tsx +0 -116
- package/src/lib/components/default-components/DefaultSnapIndictor.tsx +0 -174
package/src/lib/TldrawEditor.tsx
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { MigrationSequence, Store } from '@tldraw/store'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
TLShape,
|
|
4
|
+
TLStore,
|
|
5
|
+
TLStoreSnapshot,
|
|
6
|
+
TLTheme,
|
|
7
|
+
TLThemeId,
|
|
8
|
+
TLThemes,
|
|
9
|
+
registerColorsFromThemes,
|
|
10
|
+
registerFontsFromThemes,
|
|
11
|
+
} from '@tldraw/tlschema'
|
|
3
12
|
import { annotateError, Required } from '@tldraw/utils'
|
|
4
13
|
import classNames from 'classnames'
|
|
5
14
|
import React, {
|
|
@@ -16,16 +25,19 @@ import React, {
|
|
|
16
25
|
import { version } from '../version'
|
|
17
26
|
import { DefaultErrorFallback } from './components/default-components/DefaultErrorFallback'
|
|
18
27
|
import { OptionalErrorBoundary } from './components/ErrorBoundary'
|
|
28
|
+
import { createTLCurrentUser, TLCurrentUser } from './config/createTLCurrentUser'
|
|
19
29
|
import { TLStoreBaseOptions } from './config/createTLStore'
|
|
20
|
-
import {
|
|
30
|
+
import { TLAnyAssetUtilConstructor } from './config/defaultAssets'
|
|
21
31
|
import { TLAnyBindingUtilConstructor } from './config/defaultBindings'
|
|
22
32
|
import { TLAnyShapeUtilConstructor } from './config/defaultShapes'
|
|
23
33
|
import { TLEditorSnapshot } from './config/TLEditorSnapshot'
|
|
24
34
|
import { Editor } from './editor/Editor'
|
|
35
|
+
import { resolveThemes } from './editor/managers/ThemeManager/ThemeManager'
|
|
36
|
+
import { TLAnyOverlayUtilConstructor } from './editor/overlays/OverlayUtil'
|
|
25
37
|
import { TLStateNodeConstructor } from './editor/tools/StateNode'
|
|
26
38
|
import { TLCameraOptions } from './editor/types/misc-types'
|
|
27
|
-
import type { TLEditorComponents } from './hooks/EditorComponentsContext'
|
|
28
39
|
import { useEditorComponents } from './hooks/EditorComponentsContext'
|
|
40
|
+
import type { TLEditorComponents } from './hooks/EditorComponentsContext'
|
|
29
41
|
import { ContainerProvider, useContainer } from './hooks/useContainer'
|
|
30
42
|
import { useCursor } from './hooks/useCursor'
|
|
31
43
|
import { useDarkMode } from './hooks/useDarkMode'
|
|
@@ -121,6 +133,16 @@ export interface TldrawEditorBaseProps {
|
|
|
121
133
|
*/
|
|
122
134
|
bindingUtils?: readonly TLAnyBindingUtilConstructor[]
|
|
123
135
|
|
|
136
|
+
/**
|
|
137
|
+
* An array of asset utils to use in the editor.
|
|
138
|
+
*/
|
|
139
|
+
assetUtils?: readonly TLAnyAssetUtilConstructor[]
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* An array of overlay utils to use in the editor for canvas overlay UI elements.
|
|
143
|
+
*/
|
|
144
|
+
overlayUtils?: readonly TLAnyOverlayUtilConstructor[]
|
|
145
|
+
|
|
124
146
|
/**
|
|
125
147
|
* An array of tools to add to the editor's state chart.
|
|
126
148
|
*/
|
|
@@ -154,12 +176,26 @@ export interface TldrawEditorBaseProps {
|
|
|
154
176
|
/**
|
|
155
177
|
* The user interacting with the editor.
|
|
156
178
|
*/
|
|
157
|
-
user?:
|
|
179
|
+
user?: TLCurrentUser
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* The editor's color scheme. Defaults to `'light'`.
|
|
183
|
+
*
|
|
184
|
+
* - `'light'` - Always use light mode.
|
|
185
|
+
* - `'dark'` - Always use dark mode.
|
|
186
|
+
* - `'system'` - Follow the OS color scheme preference.
|
|
187
|
+
*/
|
|
188
|
+
colorScheme?: 'light' | 'dark' | 'system'
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Named themes for the editor.
|
|
192
|
+
*/
|
|
193
|
+
themes?: Partial<TLThemes>
|
|
158
194
|
|
|
159
195
|
/**
|
|
160
|
-
*
|
|
196
|
+
* The id of the initially active theme. Defaults to `'default'`.
|
|
161
197
|
*/
|
|
162
|
-
|
|
198
|
+
initialTheme?: TLThemeId
|
|
163
199
|
|
|
164
200
|
/**
|
|
165
201
|
* Camera options for the editor.
|
|
@@ -242,6 +278,7 @@ declare global {
|
|
|
242
278
|
|
|
243
279
|
const EMPTY_SHAPE_UTILS_ARRAY = [] as const
|
|
244
280
|
const EMPTY_BINDING_UTILS_ARRAY = [] as const
|
|
281
|
+
const EMPTY_ASSET_UTILS_ARRAY = [] as const
|
|
245
282
|
const EMPTY_TOOLS_ARRAY = [] as const
|
|
246
283
|
/** @internal */
|
|
247
284
|
export const TL_CONTAINER_CLASS = 'tl-container'
|
|
@@ -259,8 +296,15 @@ export const TldrawEditor = memo(function TldrawEditor({
|
|
|
259
296
|
deepLinks: _deepLinks,
|
|
260
297
|
...rest
|
|
261
298
|
}: TldrawEditorProps) {
|
|
299
|
+
// Register custom colors and fonts before effects run. For external stores,
|
|
300
|
+
// users should also pass themes to createTLStore so they are
|
|
301
|
+
// registered before data is loaded into the store.
|
|
302
|
+
const resolvedThemes = resolveThemes(rest.themes)
|
|
303
|
+
registerColorsFromThemes(resolvedThemes)
|
|
304
|
+
registerFontsFromThemes(resolvedThemes)
|
|
305
|
+
|
|
262
306
|
const [container, setContainer] = useState<HTMLElement | null>(null)
|
|
263
|
-
const user = useMemo(() => _user ??
|
|
307
|
+
const user = useMemo(() => _user ?? createTLCurrentUser(), [_user])
|
|
264
308
|
|
|
265
309
|
const ErrorFallback =
|
|
266
310
|
components?.ErrorFallback === undefined ? DefaultErrorFallback : components?.ErrorFallback
|
|
@@ -285,6 +329,7 @@ export const TldrawEditor = memo(function TldrawEditor({
|
|
|
285
329
|
...rest,
|
|
286
330
|
shapeUtils: rest.shapeUtils ?? EMPTY_SHAPE_UTILS_ARRAY,
|
|
287
331
|
bindingUtils: rest.bindingUtils ?? EMPTY_BINDING_UTILS_ARRAY,
|
|
332
|
+
assetUtils: rest.assetUtils ?? EMPTY_ASSET_UTILS_ARRAY,
|
|
288
333
|
tools: rest.tools ?? EMPTY_TOOLS_ARRAY,
|
|
289
334
|
components,
|
|
290
335
|
options: useShallowObjectIdentity(mergedOptions),
|
|
@@ -331,8 +376,8 @@ export const TldrawEditor = memo(function TldrawEditor({
|
|
|
331
376
|
|
|
332
377
|
function TldrawEditorWithOwnStore(
|
|
333
378
|
props: Required<
|
|
334
|
-
TldrawEditorProps & { store: undefined; user:
|
|
335
|
-
'shapeUtils' | 'bindingUtils' | 'tools'
|
|
379
|
+
TldrawEditorProps & { store: undefined; user: TLCurrentUser },
|
|
380
|
+
'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
|
|
336
381
|
>
|
|
337
382
|
) {
|
|
338
383
|
const {
|
|
@@ -341,23 +386,29 @@ function TldrawEditorWithOwnStore(
|
|
|
341
386
|
initialData,
|
|
342
387
|
shapeUtils,
|
|
343
388
|
bindingUtils,
|
|
389
|
+
assetUtils,
|
|
344
390
|
persistenceKey,
|
|
345
391
|
sessionId,
|
|
346
392
|
user,
|
|
347
393
|
assets,
|
|
394
|
+
users,
|
|
348
395
|
migrations,
|
|
396
|
+
themes,
|
|
349
397
|
} = props
|
|
350
398
|
|
|
351
399
|
const syncedStore = useLocalStore({
|
|
352
400
|
shapeUtils,
|
|
353
401
|
bindingUtils,
|
|
402
|
+
assetUtils,
|
|
354
403
|
initialData,
|
|
355
404
|
persistenceKey,
|
|
356
405
|
sessionId,
|
|
357
406
|
defaultName,
|
|
358
407
|
snapshot,
|
|
359
408
|
assets,
|
|
409
|
+
users,
|
|
360
410
|
migrations,
|
|
411
|
+
themes,
|
|
361
412
|
})
|
|
362
413
|
|
|
363
414
|
return <TldrawEditorWithLoadingStore {...props} store={syncedStore} user={user} />
|
|
@@ -368,8 +419,8 @@ const TldrawEditorWithLoadingStore = memo(function TldrawEditorBeforeLoading({
|
|
|
368
419
|
user,
|
|
369
420
|
...rest
|
|
370
421
|
}: Required<
|
|
371
|
-
TldrawEditorProps & { store: TLStoreWithStatus; user:
|
|
372
|
-
'shapeUtils' | 'bindingUtils' | 'tools'
|
|
422
|
+
TldrawEditorProps & { store: TLStoreWithStatus; user: TLCurrentUser },
|
|
423
|
+
'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
|
|
373
424
|
>) {
|
|
374
425
|
const container = useContainer()
|
|
375
426
|
|
|
@@ -415,22 +466,26 @@ function TldrawEditorWithReadyStore({
|
|
|
415
466
|
tools,
|
|
416
467
|
shapeUtils,
|
|
417
468
|
bindingUtils,
|
|
469
|
+
assetUtils,
|
|
470
|
+
overlayUtils,
|
|
418
471
|
user,
|
|
419
472
|
initialState,
|
|
420
473
|
autoFocus = true,
|
|
421
|
-
inferDarkMode,
|
|
422
474
|
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
423
475
|
cameraOptions,
|
|
424
476
|
options,
|
|
425
477
|
licenseKey,
|
|
426
478
|
getShapeVisibility,
|
|
479
|
+
colorScheme,
|
|
427
480
|
assetUrls,
|
|
481
|
+
themes,
|
|
482
|
+
initialTheme,
|
|
428
483
|
}: Required<
|
|
429
484
|
TldrawEditorProps & {
|
|
430
485
|
store: TLStore
|
|
431
|
-
user:
|
|
486
|
+
user: TLCurrentUser
|
|
432
487
|
},
|
|
433
|
-
'shapeUtils' | 'bindingUtils' | 'tools'
|
|
488
|
+
'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
|
|
434
489
|
>) {
|
|
435
490
|
const { ErrorFallback } = useEditorComponents()
|
|
436
491
|
const container = useContainer()
|
|
@@ -446,44 +501,59 @@ function TldrawEditorWithReadyStore({
|
|
|
446
501
|
const editorOptionsRef = useRef({
|
|
447
502
|
// for these, it's because they're only used when the editor first mounts:
|
|
448
503
|
autoFocus: autoFocus && !noAutoFocus(),
|
|
449
|
-
inferDarkMode,
|
|
450
504
|
initialState,
|
|
505
|
+
colorScheme,
|
|
451
506
|
|
|
452
507
|
// for these, it's because we keep them up to date in a separate effect:
|
|
453
508
|
cameraOptions,
|
|
454
509
|
deepLinks,
|
|
510
|
+
themes,
|
|
511
|
+
initialTheme,
|
|
455
512
|
})
|
|
456
513
|
|
|
457
514
|
useLayoutEffect(() => {
|
|
458
515
|
editorOptionsRef.current = {
|
|
459
516
|
autoFocus: autoFocus && !noAutoFocus(),
|
|
460
|
-
inferDarkMode,
|
|
461
517
|
initialState,
|
|
518
|
+
colorScheme,
|
|
462
519
|
cameraOptions,
|
|
463
520
|
deepLinks,
|
|
521
|
+
themes,
|
|
522
|
+
initialTheme,
|
|
464
523
|
}
|
|
465
|
-
}, [autoFocus,
|
|
524
|
+
}, [autoFocus, initialState, colorScheme, cameraOptions, deepLinks, themes, initialTheme])
|
|
466
525
|
|
|
467
526
|
useLayoutEffect(
|
|
468
527
|
() => {
|
|
469
|
-
const {
|
|
470
|
-
|
|
528
|
+
const {
|
|
529
|
+
autoFocus,
|
|
530
|
+
initialState,
|
|
531
|
+
colorScheme: initColorScheme,
|
|
532
|
+
cameraOptions,
|
|
533
|
+
deepLinks,
|
|
534
|
+
themes,
|
|
535
|
+
initialTheme,
|
|
536
|
+
} = editorOptionsRef.current
|
|
471
537
|
const editor = new Editor({
|
|
472
538
|
store,
|
|
473
539
|
shapeUtils,
|
|
474
540
|
bindingUtils,
|
|
541
|
+
assetUtils,
|
|
542
|
+
overlayUtils,
|
|
475
543
|
tools,
|
|
476
544
|
getContainer: () => container,
|
|
477
545
|
user,
|
|
478
546
|
initialState,
|
|
479
547
|
// we should check for some kind of query parameter that turns off autofocus
|
|
480
548
|
autoFocus,
|
|
481
|
-
inferDarkMode,
|
|
482
549
|
cameraOptions,
|
|
483
550
|
options,
|
|
484
551
|
licenseKey,
|
|
485
552
|
getShapeVisibility,
|
|
553
|
+
colorScheme: initColorScheme,
|
|
486
554
|
fontAssetUrls: assetUrls?.fonts,
|
|
555
|
+
themes: themes,
|
|
556
|
+
initialTheme: initialTheme,
|
|
487
557
|
})
|
|
488
558
|
|
|
489
559
|
editor.updateViewportScreenBounds(canvasRef.current ?? container)
|
|
@@ -508,9 +578,12 @@ function TldrawEditorWithReadyStore({
|
|
|
508
578
|
},
|
|
509
579
|
// if any of these change, we need to recreate the editor.
|
|
510
580
|
[
|
|
581
|
+
assetUtils,
|
|
511
582
|
bindingUtils,
|
|
583
|
+
colorScheme,
|
|
512
584
|
container,
|
|
513
585
|
options,
|
|
586
|
+
overlayUtils,
|
|
514
587
|
shapeUtils,
|
|
515
588
|
store,
|
|
516
589
|
tools,
|
|
@@ -537,6 +610,21 @@ function TldrawEditorWithReadyStore({
|
|
|
537
610
|
}
|
|
538
611
|
}, [editor, cameraOptions, options?.camera])
|
|
539
612
|
|
|
613
|
+
// keep the editor up to date with the latest theme definitions
|
|
614
|
+
useLayoutEffect(() => {
|
|
615
|
+
if (editor && themes) {
|
|
616
|
+
for (const def of Object.values(themes) as TLTheme[]) {
|
|
617
|
+
editor.updateTheme(def)
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}, [editor, themes])
|
|
621
|
+
|
|
622
|
+
useLayoutEffect(() => {
|
|
623
|
+
if (editor && initialTheme) {
|
|
624
|
+
editor.setCurrentTheme(initialTheme)
|
|
625
|
+
}
|
|
626
|
+
}, [editor, initialTheme])
|
|
627
|
+
|
|
540
628
|
const crashingError = useSyncExternalStore(
|
|
541
629
|
useCallback(
|
|
542
630
|
(onStoreChange) => {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { useValue } from '@tldraw/state-react'
|
|
2
|
-
import { PointerEvent, useCallback, useRef, useState } from 'react'
|
|
2
|
+
import { type PointerEvent, useCallback, useEffect, useRef, useState } from 'react'
|
|
3
|
+
import { flushSync } from 'react-dom'
|
|
3
4
|
import { useCanvasEvents } from '../hooks/useCanvasEvents'
|
|
4
5
|
import { useEditor } from '../hooks/useEditor'
|
|
5
6
|
import { Vec } from '../primitives/Vec'
|
|
7
|
+
import { releasePointerCapture, setPointerCapture } from '../utils/dom'
|
|
6
8
|
import { getPointerInfo } from '../utils/getPointerInfo'
|
|
7
9
|
|
|
8
10
|
/**
|
|
@@ -13,99 +15,173 @@ import { getPointerInfo } from '../utils/getPointerInfo'
|
|
|
13
15
|
export function MenuClickCapture() {
|
|
14
16
|
const editor = useEditor()
|
|
15
17
|
|
|
16
|
-
// Whether any menus are open
|
|
17
18
|
const isMenuOpen = useValue('is menu open', () => editor.menus.hasAnyOpenMenus(), [editor])
|
|
18
19
|
|
|
19
|
-
//
|
|
20
|
+
// Keep this component mounted while the pointer is down so pointerup/move still
|
|
21
|
+
// land here after a synchronous clearOpenMenus() flips isMenuOpen to false.
|
|
20
22
|
const [isPointing, setIsPointing] = useState(false)
|
|
21
|
-
|
|
22
23
|
const showElement = isMenuOpen || isPointing
|
|
23
24
|
|
|
24
|
-
// Get the same events that we use on the canvas
|
|
25
25
|
const canvasEvents = useCanvasEvents()
|
|
26
26
|
|
|
27
|
-
// Keep track of the pointer state
|
|
28
27
|
const rPointerState = useRef({
|
|
29
28
|
isDown: false,
|
|
30
29
|
isDragging: false,
|
|
30
|
+
button: 0,
|
|
31
31
|
start: new Vec(),
|
|
32
32
|
})
|
|
33
33
|
|
|
34
|
+
// Swallow the native contextmenu that follows a right-click pointerdown. Without
|
|
35
|
+
// this, Radix's trigger catches the native event and opens a menu at the pointer-
|
|
36
|
+
// DOWN position — then our own synthetic contextmenu (fired on pointerup) opens it
|
|
37
|
+
// again at the release position, producing a visible flash.
|
|
38
|
+
const rCancelContextMenuSwallow = useRef<null | (() => void)>(null)
|
|
39
|
+
useEffect(
|
|
40
|
+
() => () => {
|
|
41
|
+
rCancelContextMenuSwallow.current?.()
|
|
42
|
+
rCancelContextMenuSwallow.current = null
|
|
43
|
+
},
|
|
44
|
+
[]
|
|
45
|
+
)
|
|
46
|
+
const swallowNextNativeContextMenu = useCallback(() => {
|
|
47
|
+
rCancelContextMenuSwallow.current?.()
|
|
48
|
+
const doc = editor.getContainerDocument()
|
|
49
|
+
const onContextMenu = (event: MouseEvent) => {
|
|
50
|
+
// Skip our own synthetic contextmenu — only swallow the real browser one
|
|
51
|
+
if (!event.isTrusted) return
|
|
52
|
+
rCancelContextMenuSwallow.current?.()
|
|
53
|
+
rCancelContextMenuSwallow.current = null
|
|
54
|
+
event.preventDefault()
|
|
55
|
+
event.stopImmediatePropagation()
|
|
56
|
+
}
|
|
57
|
+
const cancel = () => doc.removeEventListener('contextmenu', onContextMenu, true)
|
|
58
|
+
rCancelContextMenuSwallow.current = cancel
|
|
59
|
+
doc.addEventListener('contextmenu', onContextMenu, true)
|
|
60
|
+
// Drop the listener on the next tick if it never fires (e.g. pointer moved off-screen)
|
|
61
|
+
doc.defaultView?.setTimeout(() => {
|
|
62
|
+
if (rCancelContextMenuSwallow.current === cancel) {
|
|
63
|
+
cancel()
|
|
64
|
+
rCancelContextMenuSwallow.current = null
|
|
65
|
+
}
|
|
66
|
+
}, 0)
|
|
67
|
+
}, [editor])
|
|
68
|
+
|
|
34
69
|
const handlePointerDown = useCallback(
|
|
35
70
|
(e: PointerEvent) => {
|
|
36
|
-
if (e.button
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
71
|
+
if (e.button !== 0 && e.button !== 2) return
|
|
72
|
+
|
|
73
|
+
flushSync(() => setIsPointing(true))
|
|
74
|
+
setPointerCapture(e.currentTarget, e)
|
|
75
|
+
rPointerState.current = {
|
|
76
|
+
isDown: true,
|
|
77
|
+
isDragging: false,
|
|
78
|
+
button: e.button,
|
|
79
|
+
start: new Vec(e.clientX, e.clientY),
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (e.button === 2) {
|
|
83
|
+
if (!editor.options.rightClickPanning) {
|
|
84
|
+
// Right-click panning off: close the open menu and swallow the native
|
|
85
|
+
// contextmenu that would otherwise briefly open a new one (causing a flash).
|
|
86
|
+
swallowNextNativeContextMenu()
|
|
87
|
+
editor.menus.clearOpenMenus()
|
|
88
|
+
return
|
|
42
89
|
}
|
|
43
|
-
|
|
90
|
+
// Forward right-click pointerdown through the canvas's own handler so
|
|
91
|
+
// pointer capture is also set on the canvas (load-bearing: without this
|
|
92
|
+
// the context menu briefly flashes closed during consecutive right-clicks).
|
|
93
|
+
// We don't clearOpenMenus() — Radix's DismissableLayer closes the menu
|
|
94
|
+
// via outside-click detection, keeping its internal state in sync.
|
|
95
|
+
const canvas =
|
|
96
|
+
editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas') ?? e.currentTarget
|
|
97
|
+
canvasEvents.onPointerDown?.({ ...e, currentTarget: canvas })
|
|
98
|
+
swallowNextNativeContextMenu()
|
|
99
|
+
return
|
|
44
100
|
}
|
|
101
|
+
|
|
45
102
|
editor.menus.clearOpenMenus()
|
|
46
103
|
},
|
|
47
|
-
[editor]
|
|
104
|
+
[canvasEvents, editor, swallowNextNativeContextMenu]
|
|
48
105
|
)
|
|
49
106
|
|
|
50
|
-
const rDidAPointerDownAndDragWhileMenuWasOpen = useRef(false)
|
|
51
|
-
|
|
52
107
|
const handlePointerMove = useCallback(
|
|
53
108
|
(e: PointerEvent) => {
|
|
54
|
-
|
|
55
|
-
if (!
|
|
56
|
-
|
|
57
|
-
// call the onPointerDown with the original pointer position
|
|
58
|
-
const { x, y } = rPointerState.current.start
|
|
109
|
+
const state = rPointerState.current
|
|
110
|
+
if (!state.isDown) return
|
|
59
111
|
|
|
60
|
-
|
|
112
|
+
// Left-click: wait for the drag threshold before forwarding anything, then
|
|
113
|
+
// replay pointerdown at the original start so the editor records the
|
|
114
|
+
// correct drag origin. Right-click forwards moves immediately (pointerdown
|
|
115
|
+
// was already dispatched in handlePointerDown).
|
|
116
|
+
if (state.button !== 2 && !state.isDragging) {
|
|
61
117
|
if (
|
|
62
|
-
|
|
63
|
-
Vec.Dist2(rPointerState.current.start, new Vec(e.clientX, e.clientY)) >
|
|
118
|
+
Vec.Dist2(state.start, new Vec(e.clientX, e.clientY)) <=
|
|
64
119
|
editor.options.dragDistanceSquared
|
|
65
120
|
) {
|
|
66
|
-
|
|
67
|
-
// Wehaddaeventitsadrag
|
|
68
|
-
rPointerState.current = {
|
|
69
|
-
...rPointerState.current,
|
|
70
|
-
isDown: true,
|
|
71
|
-
isDragging: true,
|
|
72
|
-
}
|
|
73
|
-
canvasEvents.onPointerDown?.({
|
|
74
|
-
...e,
|
|
75
|
-
clientX: x,
|
|
76
|
-
clientY: y,
|
|
77
|
-
button: 0,
|
|
78
|
-
})
|
|
121
|
+
return
|
|
79
122
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (rDidAPointerDownAndDragWhileMenuWasOpen.current) {
|
|
123
|
+
state.isDragging = true
|
|
83
124
|
editor.dispatch({
|
|
84
125
|
type: 'pointer',
|
|
85
126
|
target: 'canvas',
|
|
86
|
-
name: '
|
|
87
|
-
...getPointerInfo(editor, e),
|
|
127
|
+
name: 'pointer_down',
|
|
128
|
+
...getPointerInfo(editor, { ...e, clientX: state.start.x, clientY: state.start.y }),
|
|
88
129
|
})
|
|
89
130
|
}
|
|
131
|
+
|
|
132
|
+
editor.dispatch({
|
|
133
|
+
type: 'pointer',
|
|
134
|
+
target: 'canvas',
|
|
135
|
+
name: 'pointer_move',
|
|
136
|
+
...getPointerInfo(editor, e),
|
|
137
|
+
})
|
|
90
138
|
},
|
|
91
|
-
[
|
|
139
|
+
[editor]
|
|
92
140
|
)
|
|
93
141
|
|
|
94
142
|
const handlePointerUp = useCallback(
|
|
95
143
|
(e: PointerEvent) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
144
|
+
const isStaticRightClick = e.button === 2 && !rPointerState.current.isDragging
|
|
145
|
+
|
|
146
|
+
editor.dispatch({
|
|
147
|
+
type: 'pointer',
|
|
148
|
+
target: 'canvas',
|
|
149
|
+
name: 'pointer_up',
|
|
150
|
+
...getPointerInfo(editor, e),
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
if (isStaticRightClick && editor.options.rightClickPanning) {
|
|
154
|
+
// Dispatch contextmenu on the canvas's parent (Radix's trigger) so the
|
|
155
|
+
// menu opens at the release position. Bypassing the canvas avoids its
|
|
156
|
+
// own onContextMenu handler, which preventDefaults non-synthesized events.
|
|
157
|
+
const canvas = editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas')
|
|
158
|
+
const trigger = canvas?.parentElement ?? e.currentTarget
|
|
159
|
+
editor.timers.requestAnimationFrame(() => {
|
|
160
|
+
trigger.dispatchEvent(
|
|
161
|
+
new PointerEvent('contextmenu', {
|
|
162
|
+
bubbles: true,
|
|
163
|
+
clientX: e.clientX,
|
|
164
|
+
clientY: e.clientY,
|
|
165
|
+
button: 2,
|
|
166
|
+
buttons: 0,
|
|
167
|
+
pointerId: e.pointerId,
|
|
168
|
+
pointerType: e.pointerType,
|
|
169
|
+
isPrimary: e.isPrimary,
|
|
170
|
+
})
|
|
171
|
+
)
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
releasePointerCapture(e.currentTarget, e)
|
|
99
176
|
setIsPointing(false)
|
|
100
|
-
// Reset the pointer state
|
|
101
177
|
rPointerState.current = {
|
|
102
178
|
isDown: false,
|
|
103
179
|
isDragging: false,
|
|
180
|
+
button: 0,
|
|
104
181
|
start: new Vec(e.clientX, e.clientY),
|
|
105
182
|
}
|
|
106
|
-
rDidAPointerDownAndDragWhileMenuWasOpen.current = false
|
|
107
183
|
},
|
|
108
|
-
[
|
|
184
|
+
[editor]
|
|
109
185
|
)
|
|
110
186
|
|
|
111
187
|
return (
|
|
@@ -117,6 +193,10 @@ export function MenuClickCapture() {
|
|
|
117
193
|
onPointerDown={handlePointerDown}
|
|
118
194
|
onPointerMove={handlePointerMove}
|
|
119
195
|
onPointerUp={handlePointerUp}
|
|
196
|
+
onContextMenu={(e) => {
|
|
197
|
+
e.preventDefault()
|
|
198
|
+
e.stopPropagation()
|
|
199
|
+
}}
|
|
120
200
|
/>
|
|
121
201
|
)
|
|
122
202
|
)
|