@tldraw/editor 4.6.0-next.fecc64eee134 → 5.0.1
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 +493 -170
- package/dist-cjs/index.js +14 -23
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +3 -0
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/MenuClickCapture.js +93 -47
- 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 +46 -248
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +3 -3
- package/dist-cjs/lib/editor/Editor.js +142 -33
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/assets/AssetUtil.js +1 -0
- package/dist-cjs/lib/editor/assets/AssetUtil.js.map +1 -1
- 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 +1 -0
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
- 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 +1 -0
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
- 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 +1 -1
- 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 +12 -0
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
- 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 +1 -0
- package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
- package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +1 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +14 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +2 -2
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +2 -0
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +1 -1
- 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/overlays/getOverlayDisplayValues.js +39 -0
- package/dist-cjs/lib/editor/overlays/getOverlayDisplayValues.js.map +7 -0
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +79 -0
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +36 -23
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +32 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/tools/StateNode.js +1 -0
- package/dist-cjs/lib/editor/tools/StateNode.js.map +1 -1
- package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
- package/dist-cjs/lib/exports/ExportDelay.js +1 -0
- package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
- package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
- package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
- 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 +2 -1
- package/dist-cjs/lib/exports/getSvgJsx.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/useEditorComponents.js +0 -28
- package/dist-cjs/lib/hooks/useEditorComponents.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 +1 -0
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +3 -0
- package/dist-cjs/lib/primitives/Vec.js.map +1 -1
- package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
- package/dist-cjs/lib/utils/EditorAtom.js +2 -0
- package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
- package/dist-cjs/lib/utils/reparenting.js +20 -7
- package/dist-cjs/lib/utils/reparenting.js.map +2 -2
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +5 -0
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
- package/dist-cjs/version.js +4 -4
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +493 -170
- package/dist-esm/index.mjs +21 -41
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +3 -0
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/MenuClickCapture.mjs +94 -48
- 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 +47 -249
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +3 -3
- package/dist-esm/lib/editor/Editor.mjs +143 -35
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/assets/AssetUtil.mjs +1 -0
- package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +1 -1
- 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 +1 -0
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
- 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 +1 -0
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
- 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 +1 -1
- 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 +12 -0
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
- 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 +1 -0
- package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +1 -0
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +2 -1
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +14 -0
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +2 -0
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +1 -1
- 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/overlays/getOverlayDisplayValues.mjs +19 -0
- package/dist-esm/lib/editor/overlays/getOverlayDisplayValues.mjs.map +7 -0
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +59 -0
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +36 -23
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +32 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/StateNode.mjs +1 -0
- package/dist-esm/lib/editor/tools/StateNode.mjs.map +1 -1
- package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
- package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
- package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
- package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
- package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
- 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 +2 -1
- package/dist-esm/lib/exports/getSvgJsx.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/useEditorComponents.mjs +0 -28
- package/dist-esm/lib/hooks/useEditorComponents.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 +1 -0
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +3 -0
- package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
- package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
- package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
- package/dist-esm/lib/utils/reparenting.mjs +20 -7
- package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +5 -0
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
- package/dist-esm/version.mjs +4 -4
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +4 -243
- package/package.json +7 -7
- package/src/index.ts +18 -39
- package/src/lib/TldrawEditor.tsx +9 -0
- package/src/lib/components/MenuClickCapture.tsx +124 -64
- package/src/lib/components/default-components/CanvasOverlays.tsx +208 -0
- package/src/lib/components/default-components/DefaultCanvas.tsx +51 -322
- package/src/lib/editor/Editor.test.ts +3 -1
- package/src/lib/editor/Editor.ts +167 -38
- package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +98 -0
- package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
- 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/ThemeManager/defaultThemes.ts +14 -0
- 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/overlays/getOverlayDisplayValues.ts +51 -0
- package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +128 -0
- package/src/lib/editor/shapes/ShapeUtil.ts +45 -26
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +40 -3
- package/src/lib/editor/types/event-types.ts +2 -0
- package/src/lib/exports/fetchCache.ts +2 -4
- package/src/lib/exports/getSvgJsx.test.ts +3 -1
- package/src/lib/exports/getSvgJsx.tsx +2 -1
- package/src/lib/hooks/EditorComponentsContext.tsx +0 -27
- package/src/lib/hooks/useCanvasEvents.ts +45 -3
- package/src/lib/hooks/useEditorComponents.tsx +0 -28
- package/src/lib/hooks/usePeerIds.ts +6 -55
- package/src/lib/hooks/useShapeCulling.tsx +3 -1
- package/src/lib/options.ts +7 -0
- package/src/lib/utils/reparenting.ts +22 -9
- package/src/lib/utils/sync/TLLocalSyncClient.ts +3 -0
- package/src/version.ts +4 -4
- package/dist-cjs/lib/components/GeometryDebuggingView.js +0 -115
- package/dist-cjs/lib/components/GeometryDebuggingView.js.map +0 -7
- 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/DefaultCursor.js +0 -59
- package/dist-cjs/lib/components/default-components/DefaultCursor.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 +0 -28
- 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 +0 -28
- 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/hooks/useHandleEvents.js +0 -100
- package/dist-cjs/lib/hooks/useHandleEvents.js.map +0 -7
- package/dist-cjs/lib/hooks/useSelectionEvents.js +0 -98
- package/dist-cjs/lib/hooks/useSelectionEvents.js.map +0 -7
- package/dist-esm/lib/components/GeometryDebuggingView.mjs +0 -95
- package/dist-esm/lib/components/GeometryDebuggingView.mjs.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/DefaultCursor.mjs +0 -29
- package/dist-esm/lib/components/default-components/DefaultCursor.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/hooks/useHandleEvents.mjs +0 -70
- package/dist-esm/lib/hooks/useHandleEvents.mjs.map +0 -7
- package/dist-esm/lib/hooks/useSelectionEvents.mjs +0 -78
- package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +0 -7
- package/src/lib/components/GeometryDebuggingView.tsx +0 -108
- 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/DefaultCursor.tsx +0 -59
- 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/hooks/useHandleEvents.ts +0 -88
- package/src/lib/hooks/useSelectionEvents.ts +0 -97
|
@@ -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,115 +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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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),
|
|
44
80
|
}
|
|
81
|
+
|
|
45
82
|
if (e.button === 2) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
89
|
+
}
|
|
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
|
|
60
100
|
}
|
|
101
|
+
|
|
61
102
|
editor.menus.clearOpenMenus()
|
|
62
103
|
},
|
|
63
|
-
[editor]
|
|
104
|
+
[canvasEvents, editor, swallowNextNativeContextMenu]
|
|
64
105
|
)
|
|
65
106
|
|
|
66
|
-
const rDidAPointerDownAndDragWhileMenuWasOpen = useRef(false)
|
|
67
|
-
|
|
68
107
|
const handlePointerMove = useCallback(
|
|
69
108
|
(e: PointerEvent) => {
|
|
70
|
-
|
|
71
|
-
if (!
|
|
109
|
+
const state = rPointerState.current
|
|
110
|
+
if (!state.isDown) return
|
|
72
111
|
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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) {
|
|
77
117
|
if (
|
|
78
|
-
|
|
79
|
-
Vec.Dist2(rPointerState.current.start, new Vec(e.clientX, e.clientY)) >
|
|
118
|
+
Vec.Dist2(state.start, new Vec(e.clientX, e.clientY)) <=
|
|
80
119
|
editor.options.dragDistanceSquared
|
|
81
120
|
) {
|
|
82
|
-
|
|
83
|
-
// Wehaddaeventitsadrag
|
|
84
|
-
rPointerState.current = {
|
|
85
|
-
...rPointerState.current,
|
|
86
|
-
isDown: true,
|
|
87
|
-
isDragging: true,
|
|
88
|
-
}
|
|
89
|
-
canvasEvents.onPointerDown?.({
|
|
90
|
-
...e,
|
|
91
|
-
clientX: x,
|
|
92
|
-
clientY: y,
|
|
93
|
-
button: 0,
|
|
94
|
-
})
|
|
121
|
+
return
|
|
95
122
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (rDidAPointerDownAndDragWhileMenuWasOpen.current) {
|
|
123
|
+
state.isDragging = true
|
|
99
124
|
editor.dispatch({
|
|
100
125
|
type: 'pointer',
|
|
101
126
|
target: 'canvas',
|
|
102
|
-
name: '
|
|
103
|
-
...getPointerInfo(editor, e),
|
|
127
|
+
name: 'pointer_down',
|
|
128
|
+
...getPointerInfo(editor, { ...e, clientX: state.start.x, clientY: state.start.y }),
|
|
104
129
|
})
|
|
105
130
|
}
|
|
131
|
+
|
|
132
|
+
editor.dispatch({
|
|
133
|
+
type: 'pointer',
|
|
134
|
+
target: 'canvas',
|
|
135
|
+
name: 'pointer_move',
|
|
136
|
+
...getPointerInfo(editor, e),
|
|
137
|
+
})
|
|
106
138
|
},
|
|
107
|
-
[
|
|
139
|
+
[editor]
|
|
108
140
|
)
|
|
109
141
|
|
|
110
142
|
const handlePointerUp = useCallback(
|
|
111
143
|
(e: PointerEvent) => {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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)
|
|
115
176
|
setIsPointing(false)
|
|
116
|
-
// Reset the pointer state
|
|
117
177
|
rPointerState.current = {
|
|
118
178
|
isDown: false,
|
|
119
179
|
isDragging: false,
|
|
180
|
+
button: 0,
|
|
120
181
|
start: new Vec(e.clientX, e.clientY),
|
|
121
182
|
}
|
|
122
|
-
rDidAPointerDownAndDragWhileMenuWasOpen.current = false
|
|
123
183
|
},
|
|
124
|
-
[
|
|
184
|
+
[editor]
|
|
125
185
|
)
|
|
126
186
|
|
|
127
187
|
return (
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { EffectScheduler, computed } from '@tldraw/state'
|
|
2
|
+
import { memo, useEffect, useRef } from 'react'
|
|
3
|
+
import { useEditor } from '../../hooks/useEditor'
|
|
4
|
+
import { Geometry2d } from '../../primitives/geometry/Geometry2d'
|
|
5
|
+
import { Group2d } from '../../primitives/geometry/Group2d'
|
|
6
|
+
import { debugFlags } from '../../utils/debug-flags'
|
|
7
|
+
|
|
8
|
+
interface RenderInputs {
|
|
9
|
+
dpr: number
|
|
10
|
+
w: number
|
|
11
|
+
h: number
|
|
12
|
+
cx: number
|
|
13
|
+
cy: number
|
|
14
|
+
zoom: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** @internal @react */
|
|
18
|
+
export const CanvasOverlays = memo(function CanvasOverlays() {
|
|
19
|
+
const editor = useEditor()
|
|
20
|
+
const canvasRef = useRef<HTMLCanvasElement>(null)
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
// Bundle the primitive scalars the renderer needs into one computed so the
|
|
24
|
+
// effect only refires on actual visual change. Reading the whole instance
|
|
25
|
+
// state directly would otherwise wake the renderer on every cursor move,
|
|
26
|
+
// brush update, etc.
|
|
27
|
+
|
|
28
|
+
const renderInputs$ = computed<RenderInputs>(
|
|
29
|
+
'canvas overlays render inputs',
|
|
30
|
+
() => {
|
|
31
|
+
const instance = editor.getInstanceState()
|
|
32
|
+
const camera = editor.getCamera()
|
|
33
|
+
return {
|
|
34
|
+
dpr: instance.devicePixelRatio,
|
|
35
|
+
w: instance.screenBounds.w,
|
|
36
|
+
h: instance.screenBounds.h,
|
|
37
|
+
cx: camera.x,
|
|
38
|
+
cy: camera.y,
|
|
39
|
+
zoom: camera.z,
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
isEqual: (a, b) =>
|
|
44
|
+
a.dpr === b.dpr &&
|
|
45
|
+
a.w === b.w &&
|
|
46
|
+
a.h === b.h &&
|
|
47
|
+
a.cx === b.cx &&
|
|
48
|
+
a.cy === b.cy &&
|
|
49
|
+
a.zoom === b.zoom,
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
const scheduler = new EffectScheduler('canvas overlays render', () => {
|
|
54
|
+
const canvas = canvasRef.current
|
|
55
|
+
if (!canvas) return
|
|
56
|
+
|
|
57
|
+
const ctx = canvas.getContext('2d')
|
|
58
|
+
if (!ctx) return
|
|
59
|
+
|
|
60
|
+
const { dpr, w, h, cx, cy, zoom } = renderInputs$.get()
|
|
61
|
+
|
|
62
|
+
const canvasWidth = Math.ceil(w * dpr)
|
|
63
|
+
const canvasHeight = Math.ceil(h * dpr)
|
|
64
|
+
|
|
65
|
+
if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) {
|
|
66
|
+
canvas.width = canvasWidth
|
|
67
|
+
canvas.height = canvasHeight
|
|
68
|
+
canvas.style.width = `${w}px`
|
|
69
|
+
canvas.style.height = `${h}px`
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0)
|
|
73
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
|
74
|
+
|
|
75
|
+
// One setTransform = DPR scale * zoom scale * camera translate, into page space.
|
|
76
|
+
const s = dpr * zoom
|
|
77
|
+
ctx.setTransform(s, 0, 0, s, s * cx, s * cy)
|
|
78
|
+
|
|
79
|
+
// Render all active overlay utils in zIndex order (low to high).
|
|
80
|
+
for (const { util, overlays } of editor.overlays.getActiveOverlayEntries()) {
|
|
81
|
+
ctx.save()
|
|
82
|
+
util.render(ctx, overlays)
|
|
83
|
+
ctx.restore()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Debug: draw all geometry
|
|
87
|
+
if (debugFlags.debugGeometry.get()) {
|
|
88
|
+
const currentPagePoint = editor.inputs.getCurrentPagePoint()
|
|
89
|
+
|
|
90
|
+
// Shape geometries
|
|
91
|
+
const renderingShapes = editor.getRenderingShapes()
|
|
92
|
+
for (const result of renderingShapes) {
|
|
93
|
+
const shape = editor.getShape(result.id)
|
|
94
|
+
if (!shape || shape.type === 'group') continue
|
|
95
|
+
|
|
96
|
+
const geometry = editor.getShapeGeometry(shape)
|
|
97
|
+
const pageTransform = editor.getShapePageTransform(shape)
|
|
98
|
+
if (!pageTransform) continue
|
|
99
|
+
|
|
100
|
+
ctx.save()
|
|
101
|
+
const m = pageTransform
|
|
102
|
+
ctx.transform(m.a, m.b, m.c, m.d, m.e, m.f)
|
|
103
|
+
|
|
104
|
+
// Outline
|
|
105
|
+
ctx.strokeStyle = geometry.debugColor ?? 'red'
|
|
106
|
+
ctx.lineWidth = 2 / zoom
|
|
107
|
+
ctx.fillStyle = 'none'
|
|
108
|
+
drawGeometryStroke(ctx, geometry)
|
|
109
|
+
|
|
110
|
+
// Vertices
|
|
111
|
+
const { vertices } = geometry
|
|
112
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
113
|
+
const v = vertices[i]
|
|
114
|
+
const hue = vertices.length > 1 ? 120 + ((200 - 120) * i) / (vertices.length - 1) : 160
|
|
115
|
+
ctx.fillStyle = `hsl(${hue}, 100%, 50%)`
|
|
116
|
+
ctx.strokeStyle = 'black'
|
|
117
|
+
ctx.lineWidth = 1 / zoom
|
|
118
|
+
ctx.beginPath()
|
|
119
|
+
ctx.arc(v.x, v.y, 2 / zoom, 0, Math.PI * 2)
|
|
120
|
+
ctx.fill()
|
|
121
|
+
ctx.stroke()
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Nearest point line
|
|
125
|
+
const pointInShapeSpace = editor.getPointInShapeSpace(shape, currentPagePoint)
|
|
126
|
+
const dist = Math.abs(geometry.distanceToPoint(pointInShapeSpace, true)) * zoom
|
|
127
|
+
if (dist < 150) {
|
|
128
|
+
const nearestPoint = geometry.nearestPoint(pointInShapeSpace)
|
|
129
|
+
const hitInside = geometry.distanceToPoint(pointInShapeSpace, true) < 0
|
|
130
|
+
ctx.strokeStyle = hitInside ? 'goldenrod' : 'dodgerblue'
|
|
131
|
+
ctx.lineWidth = 2 / zoom
|
|
132
|
+
ctx.globalAlpha = 1 - dist / 150
|
|
133
|
+
ctx.beginPath()
|
|
134
|
+
ctx.moveTo(nearestPoint.x, nearestPoint.y)
|
|
135
|
+
ctx.lineTo(pointInShapeSpace.x, pointInShapeSpace.y)
|
|
136
|
+
ctx.stroke()
|
|
137
|
+
ctx.globalAlpha = 1
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
ctx.restore()
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Overlay hit-test geometries
|
|
144
|
+
ctx.save()
|
|
145
|
+
ctx.strokeStyle = 'magenta'
|
|
146
|
+
ctx.fillStyle = 'rgba(255, 0, 255, 0.1)'
|
|
147
|
+
ctx.lineWidth = 1 / zoom
|
|
148
|
+
for (const { overlays } of editor.overlays.getActiveOverlayEntries()) {
|
|
149
|
+
for (const overlay of overlays) {
|
|
150
|
+
const geometry = editor.overlays.getOverlayGeometry(overlay)
|
|
151
|
+
if (!geometry) continue
|
|
152
|
+
const vertices = geometry.vertices
|
|
153
|
+
if (vertices.length < 2) continue
|
|
154
|
+
ctx.beginPath()
|
|
155
|
+
ctx.moveTo(vertices[0].x, vertices[0].y)
|
|
156
|
+
for (let i = 1; i < vertices.length; i++) {
|
|
157
|
+
ctx.lineTo(vertices[i].x, vertices[i].y)
|
|
158
|
+
}
|
|
159
|
+
if (geometry.isClosed) {
|
|
160
|
+
ctx.closePath()
|
|
161
|
+
ctx.fill()
|
|
162
|
+
}
|
|
163
|
+
ctx.stroke()
|
|
164
|
+
for (const v of vertices) {
|
|
165
|
+
ctx.beginPath()
|
|
166
|
+
ctx.arc(v.x, v.y, 2 / zoom, 0, Math.PI * 2)
|
|
167
|
+
ctx.fill()
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
ctx.restore()
|
|
172
|
+
}
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
scheduler.attach()
|
|
176
|
+
scheduler.execute()
|
|
177
|
+
return () => scheduler.detach()
|
|
178
|
+
}, [editor])
|
|
179
|
+
|
|
180
|
+
return <canvas ref={canvasRef} className="tl-canvas-overlays" />
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
function drawGeometryStroke(ctx: CanvasRenderingContext2D, geometry: Geometry2d) {
|
|
184
|
+
if (geometry instanceof Group2d) {
|
|
185
|
+
const prevStroke = ctx.strokeStyle
|
|
186
|
+
for (const child of geometry.children) {
|
|
187
|
+
if (child.debugColor) ctx.strokeStyle = child.debugColor
|
|
188
|
+
drawGeometryStroke(ctx, child)
|
|
189
|
+
ctx.strokeStyle = prevStroke
|
|
190
|
+
}
|
|
191
|
+
for (const child of geometry.ignoredChildren) {
|
|
192
|
+
if (child.debugColor) ctx.strokeStyle = child.debugColor
|
|
193
|
+
drawGeometryStroke(ctx, child)
|
|
194
|
+
ctx.strokeStyle = prevStroke
|
|
195
|
+
}
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const vertices = geometry.vertices
|
|
200
|
+
if (vertices.length < 2) return
|
|
201
|
+
ctx.beginPath()
|
|
202
|
+
ctx.moveTo(vertices[0].x, vertices[0].y)
|
|
203
|
+
for (let i = 1; i < vertices.length; i++) {
|
|
204
|
+
ctx.lineTo(vertices[i].x, vertices[i].y)
|
|
205
|
+
}
|
|
206
|
+
if (geometry.isClosed) ctx.closePath()
|
|
207
|
+
ctx.stroke()
|
|
208
|
+
}
|