@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,7 +1,7 @@
|
|
|
1
1
|
import { react } from '@tldraw/state'
|
|
2
2
|
import { useQuickReactor, useValue } from '@tldraw/state-react'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { TLShapeId } from '@tldraw/tlschema'
|
|
4
|
+
import { modulate, objectMapValues } from '@tldraw/utils'
|
|
5
5
|
import classNames from 'classnames'
|
|
6
6
|
import { Fragment, JSX, useEffect, useRef, useState } from 'react'
|
|
7
7
|
import { tlenv } from '../../globals/environment'
|
|
@@ -13,21 +13,15 @@ import { useDocumentEvents } from '../../hooks/useDocumentEvents'
|
|
|
13
13
|
import { useEditor } from '../../hooks/useEditor'
|
|
14
14
|
import { useFixSafariDoubleTapZoomPencilEvents } from '../../hooks/useFixSafariDoubleTapZoomPencilEvents'
|
|
15
15
|
import { useGestureEvents } from '../../hooks/useGestureEvents'
|
|
16
|
-
import { useHandleEvents } from '../../hooks/useHandleEvents'
|
|
17
|
-
import { useSharedSafeId } from '../../hooks/useSafeId'
|
|
18
16
|
import { useScreenBounds } from '../../hooks/useScreenBounds'
|
|
19
17
|
import { ShapeCullingProvider, useShapeCulling } from '../../hooks/useShapeCulling'
|
|
20
18
|
import { Box } from '../../primitives/Box'
|
|
21
|
-
import { Mat } from '../../primitives/Mat'
|
|
22
19
|
import { toDomPrecision } from '../../primitives/utils'
|
|
23
|
-
import { Vec } from '../../primitives/Vec'
|
|
24
20
|
import { debugFlags } from '../../utils/debug-flags'
|
|
25
21
|
import { setStyleProperty } from '../../utils/dom'
|
|
26
|
-
import { GeometryDebuggingView } from '../GeometryDebuggingView'
|
|
27
|
-
import { LiveCollaborators } from '../LiveCollaborators'
|
|
28
22
|
import { MenuClickCapture } from '../MenuClickCapture'
|
|
29
23
|
import { Shape } from '../Shape'
|
|
30
|
-
import {
|
|
24
|
+
import { CanvasOverlays } from './CanvasOverlays'
|
|
31
25
|
|
|
32
26
|
/** @public */
|
|
33
27
|
export interface TLCanvasComponentProps {
|
|
@@ -38,11 +32,10 @@ export interface TLCanvasComponentProps {
|
|
|
38
32
|
export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
39
33
|
const editor = useEditor()
|
|
40
34
|
|
|
41
|
-
const { SelectionBackground, Background, SvgDefs
|
|
35
|
+
const { SelectionBackground, Background, SvgDefs } = useEditorComponents()
|
|
42
36
|
|
|
43
37
|
const rCanvas = useRef<HTMLDivElement>(null)
|
|
44
38
|
const rHtmlLayer = useRef<HTMLDivElement>(null)
|
|
45
|
-
const rHtmlLayer2 = useRef<HTMLDivElement>(null)
|
|
46
39
|
const container = useContainer()
|
|
47
40
|
|
|
48
41
|
useScreenBounds(rCanvas)
|
|
@@ -52,6 +45,24 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
52
45
|
useGestureEvents(rCanvas)
|
|
53
46
|
useFixSafariDoubleTapZoomPencilEvents(rCanvas)
|
|
54
47
|
|
|
48
|
+
useQuickReactor(
|
|
49
|
+
'update canvas state data attributes',
|
|
50
|
+
() => {
|
|
51
|
+
const canvas = rCanvas.current
|
|
52
|
+
if (!canvas) return
|
|
53
|
+
|
|
54
|
+
canvas.setAttribute(
|
|
55
|
+
'data-iseditinganything',
|
|
56
|
+
editor.getEditingShapeId() === null ? 'false' : 'true'
|
|
57
|
+
)
|
|
58
|
+
canvas.setAttribute(
|
|
59
|
+
'data-isselectinganything',
|
|
60
|
+
editor.getSelectedShapeIds().length === 0 ? 'false' : 'true'
|
|
61
|
+
)
|
|
62
|
+
},
|
|
63
|
+
[editor]
|
|
64
|
+
)
|
|
65
|
+
|
|
55
66
|
const rMemoizedStuff = useRef({ lodDisableTextOutline: false, allowTextOutline: true })
|
|
56
67
|
|
|
57
68
|
useQuickReactor(
|
|
@@ -90,7 +101,6 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
90
101
|
)}px,${toDomPrecision(y + offset)}px)`
|
|
91
102
|
|
|
92
103
|
setStyleProperty(rHtmlLayer.current, 'transform', transform)
|
|
93
|
-
setStyleProperty(rHtmlLayer2.current, 'transform', transform)
|
|
94
104
|
},
|
|
95
105
|
[editor, container]
|
|
96
106
|
)
|
|
@@ -115,27 +125,15 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
115
125
|
)
|
|
116
126
|
|
|
117
127
|
const hideShapes = useValue('debug_shapes', () => debugFlags.hideShapes.get(), [debugFlags])
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const isEditingAnything = useValue(
|
|
122
|
-
'isEditingAnything',
|
|
123
|
-
() => editor.getEditingShapeId() !== null,
|
|
124
|
-
[editor]
|
|
125
|
-
)
|
|
126
|
-
const isSelectingAnything = useValue(
|
|
127
|
-
'isSelectingAnything',
|
|
128
|
-
() => !!editor.getSelectedShapeIds().length,
|
|
129
|
-
[editor]
|
|
130
|
-
)
|
|
128
|
+
|
|
129
|
+
const isGridMode = useValue('isGridMode', () => editor.getInstanceState().isGridMode, [editor])
|
|
130
|
+
const { Grid } = useEditorComponents()
|
|
131
131
|
|
|
132
132
|
return (
|
|
133
133
|
<>
|
|
134
134
|
<div
|
|
135
135
|
ref={rCanvas}
|
|
136
136
|
draggable={false}
|
|
137
|
-
data-iseditinganything={isEditingAnything}
|
|
138
|
-
data-isselectinganything={isSelectingAnything}
|
|
139
137
|
className={classNames('tl-canvas', className)}
|
|
140
138
|
data-testid="canvas"
|
|
141
139
|
{...events}
|
|
@@ -143,8 +141,6 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
143
141
|
<svg className="tl-svg-context" aria-hidden="true">
|
|
144
142
|
<defs>
|
|
145
143
|
{shapeSvgDefs}
|
|
146
|
-
<CursorDef />
|
|
147
|
-
<CollaboratorHintDef />
|
|
148
144
|
{SvgDefs && <SvgDefs />}
|
|
149
145
|
</defs>
|
|
150
146
|
</svg>
|
|
@@ -153,249 +149,50 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
153
149
|
<Background />
|
|
154
150
|
</div>
|
|
155
151
|
)}
|
|
156
|
-
<GridWrapper />
|
|
152
|
+
{isGridMode && Grid && <GridWrapper />}
|
|
157
153
|
<div ref={rHtmlLayer} className="tl-html-layer tl-shapes" draggable={false}>
|
|
158
154
|
<OnTheCanvasWrapper />
|
|
159
155
|
{SelectionBackground && <SelectionBackgroundWrapper />}
|
|
160
|
-
{hideShapes ? null : <ShapesLayer />}
|
|
161
|
-
</div>
|
|
162
|
-
<div className="tl-overlays">
|
|
163
|
-
<CanvasShapeIndicators />
|
|
164
|
-
<div ref={rHtmlLayer2} className="tl-html-layer">
|
|
165
|
-
{debugGeometry ? <GeometryDebuggingView /> : null}
|
|
166
|
-
<BrushWrapper />
|
|
167
|
-
<ScribbleWrapper />
|
|
168
|
-
<ZoomBrushWrapper />
|
|
169
|
-
{ShapeIndicators && <ShapeIndicators />}
|
|
170
|
-
<HintedShapeIndicator />
|
|
171
|
-
<SnapIndicatorWrapper />
|
|
172
|
-
<SelectionForegroundWrapper />
|
|
173
|
-
<HandlesWrapper />
|
|
174
|
-
<OverlaysWrapper />
|
|
175
|
-
<LiveCollaborators />
|
|
176
|
-
</div>
|
|
156
|
+
{hideShapes ? null : <ShapesLayer canvasRef={rCanvas} />}
|
|
177
157
|
</div>
|
|
158
|
+
<CanvasOverlays />
|
|
178
159
|
<MovingCameraHitTestBlocker />
|
|
179
160
|
</div>
|
|
180
|
-
<
|
|
181
|
-
className="tl-canvas__in-front"
|
|
182
|
-
onPointerDown={editor.markEventAsHandled}
|
|
183
|
-
onPointerUp={editor.markEventAsHandled}
|
|
184
|
-
onTouchStart={editor.markEventAsHandled}
|
|
185
|
-
onTouchEnd={editor.markEventAsHandled}
|
|
186
|
-
>
|
|
187
|
-
<InFrontOfTheCanvasWrapper />
|
|
188
|
-
</div>
|
|
161
|
+
<InFrontOfTheCanvasWrapper />
|
|
189
162
|
<MenuClickCapture />
|
|
190
163
|
</>
|
|
191
164
|
)
|
|
192
165
|
}
|
|
193
166
|
|
|
194
167
|
function InFrontOfTheCanvasWrapper() {
|
|
168
|
+
const editor = useEditor()
|
|
195
169
|
const { InFrontOfTheCanvas } = useEditorComponents()
|
|
196
170
|
if (!InFrontOfTheCanvas) return null
|
|
197
|
-
return
|
|
171
|
+
return (
|
|
172
|
+
<div
|
|
173
|
+
className="tl-canvas__in-front"
|
|
174
|
+
onPointerDown={editor.markEventAsHandled}
|
|
175
|
+
onPointerUp={editor.markEventAsHandled}
|
|
176
|
+
onTouchStart={editor.markEventAsHandled}
|
|
177
|
+
onTouchEnd={editor.markEventAsHandled}
|
|
178
|
+
>
|
|
179
|
+
<InFrontOfTheCanvas />
|
|
180
|
+
</div>
|
|
181
|
+
)
|
|
198
182
|
}
|
|
199
183
|
|
|
200
184
|
function GridWrapper() {
|
|
201
185
|
const editor = useEditor()
|
|
202
186
|
const gridSize = useValue('gridSize', () => editor.getDocumentSettings().gridSize, [editor])
|
|
203
187
|
const { x, y, z } = useValue('camera', () => editor.getCamera(), [editor])
|
|
204
|
-
const isGridMode = useValue('isGridMode', () => editor.getInstanceState().isGridMode, [editor])
|
|
205
188
|
const { Grid } = useEditorComponents()
|
|
206
189
|
|
|
207
|
-
if (!
|
|
190
|
+
if (!Grid) return null
|
|
208
191
|
|
|
209
192
|
return <Grid x={x} y={y} z={z} size={gridSize} />
|
|
210
193
|
}
|
|
211
194
|
|
|
212
|
-
function
|
|
213
|
-
const editor = useEditor()
|
|
214
|
-
const scribbles = useValue('scribbles', () => editor.getInstanceState().scribbles, [editor])
|
|
215
|
-
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
216
|
-
const { Scribble } = useEditorComponents()
|
|
217
|
-
|
|
218
|
-
if (!(Scribble && scribbles.length)) return null
|
|
219
|
-
|
|
220
|
-
return scribbles.map((scribble) => (
|
|
221
|
-
<Scribble key={scribble.id} className="tl-user-scribble" scribble={scribble} zoom={zoomLevel} />
|
|
222
|
-
))
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function BrushWrapper() {
|
|
226
|
-
const editor = useEditor()
|
|
227
|
-
const brush = useValue('brush', () => editor.getInstanceState().brush, [editor])
|
|
228
|
-
const { Brush } = useEditorComponents()
|
|
229
|
-
|
|
230
|
-
if (!(Brush && brush)) return null
|
|
231
|
-
|
|
232
|
-
return <Brush className="tl-user-brush" brush={brush} />
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function ZoomBrushWrapper() {
|
|
236
|
-
const editor = useEditor()
|
|
237
|
-
const zoomBrush = useValue('zoomBrush', () => editor.getInstanceState().zoomBrush, [editor])
|
|
238
|
-
const { ZoomBrush } = useEditorComponents()
|
|
239
|
-
|
|
240
|
-
if (!(ZoomBrush && zoomBrush)) return null
|
|
241
|
-
|
|
242
|
-
return <ZoomBrush className="tl-user-brush tl-zoom-brush" brush={zoomBrush} />
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function SnapIndicatorWrapper() {
|
|
246
|
-
const editor = useEditor()
|
|
247
|
-
const lines = useValue('snapLines', () => editor.snaps.getIndicators(), [editor])
|
|
248
|
-
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
249
|
-
const { SnapIndicator } = useEditorComponents()
|
|
250
|
-
|
|
251
|
-
if (!(SnapIndicator && lines.length > 0)) return null
|
|
252
|
-
|
|
253
|
-
return lines.map((line) => (
|
|
254
|
-
<SnapIndicator key={line.id} className="tl-user-snapline" line={line} zoom={zoomLevel} />
|
|
255
|
-
))
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function HandlesWrapper() {
|
|
259
|
-
const editor = useEditor()
|
|
260
|
-
|
|
261
|
-
// We don't want this to update every time the shape changes
|
|
262
|
-
const shapeIdWithHandles = useValue(
|
|
263
|
-
'handles shapeIdWithHandles',
|
|
264
|
-
() => {
|
|
265
|
-
const { isReadonly, isChangingStyle } = editor.getInstanceState()
|
|
266
|
-
if (isReadonly || isChangingStyle) return false
|
|
267
|
-
|
|
268
|
-
const onlySelectedShape = editor.getOnlySelectedShape()
|
|
269
|
-
if (!onlySelectedShape) return false
|
|
270
|
-
|
|
271
|
-
// slightly redundant but saves us from updating the handles every time the shape changes
|
|
272
|
-
const handles = editor.getShapeHandles(onlySelectedShape)
|
|
273
|
-
if (!handles) return false
|
|
274
|
-
|
|
275
|
-
return onlySelectedShape.id
|
|
276
|
-
},
|
|
277
|
-
[editor]
|
|
278
|
-
)
|
|
279
|
-
|
|
280
|
-
if (!shapeIdWithHandles) return null
|
|
281
|
-
|
|
282
|
-
return <HandlesWrapperInner shapeId={shapeIdWithHandles} />
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
function HandlesWrapperInner({ shapeId }: { shapeId: TLShapeId }) {
|
|
286
|
-
const editor = useEditor()
|
|
287
|
-
const { Handles } = useEditorComponents()
|
|
288
|
-
|
|
289
|
-
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
290
|
-
|
|
291
|
-
const isCoarse = useValue('coarse pointer', () => editor.getInstanceState().isCoarsePointer, [
|
|
292
|
-
editor,
|
|
293
|
-
])
|
|
294
|
-
|
|
295
|
-
const transform = useValue('handles transform', () => editor.getShapePageTransform(shapeId), [
|
|
296
|
-
editor,
|
|
297
|
-
shapeId,
|
|
298
|
-
])
|
|
299
|
-
|
|
300
|
-
const handles = useValue(
|
|
301
|
-
'handles',
|
|
302
|
-
() => {
|
|
303
|
-
const handles = editor.getShapeHandles(shapeId)
|
|
304
|
-
if (!handles) return null
|
|
305
|
-
|
|
306
|
-
const minDistBetweenVirtualHandlesAndRegularHandles =
|
|
307
|
-
((isCoarse ? editor.options.coarseHandleRadius : editor.options.handleRadius) / zoomLevel) *
|
|
308
|
-
2
|
|
309
|
-
|
|
310
|
-
return (
|
|
311
|
-
handles
|
|
312
|
-
.filter(
|
|
313
|
-
(handle) =>
|
|
314
|
-
// if the handle isn't a virtual handle, we'll display it
|
|
315
|
-
handle.type !== 'virtual' ||
|
|
316
|
-
// but for virtual handles, we'll only display them if they're far enough away from vertex handles
|
|
317
|
-
!handles.some(
|
|
318
|
-
(h) =>
|
|
319
|
-
// skip the handle we're checking against
|
|
320
|
-
h !== handle &&
|
|
321
|
-
// only check against vertex handles
|
|
322
|
-
h.type === 'vertex' &&
|
|
323
|
-
// and check that their distance isn't below the minimum distance
|
|
324
|
-
Vec.Dist(handle, h) < minDistBetweenVirtualHandlesAndRegularHandles
|
|
325
|
-
)
|
|
326
|
-
)
|
|
327
|
-
// We want vertex handles in front of all other handles
|
|
328
|
-
.sort((a) => (a.type === 'vertex' ? 1 : -1))
|
|
329
|
-
)
|
|
330
|
-
},
|
|
331
|
-
[editor, zoomLevel, isCoarse, shapeId]
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
const isHidden = useValue('isHidden', () => editor.isShapeHidden(shapeId), [editor, shapeId])
|
|
335
|
-
|
|
336
|
-
if (!Handles || !handles || !transform || isHidden) {
|
|
337
|
-
return null
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return (
|
|
341
|
-
<Handles>
|
|
342
|
-
<g transform={Mat.toCssString(transform)}>
|
|
343
|
-
{handles.map((handle) => {
|
|
344
|
-
return (
|
|
345
|
-
<HandleWrapper
|
|
346
|
-
key={handle.id}
|
|
347
|
-
shapeId={shapeId}
|
|
348
|
-
handle={handle}
|
|
349
|
-
zoom={zoomLevel}
|
|
350
|
-
isCoarse={isCoarse}
|
|
351
|
-
/>
|
|
352
|
-
)
|
|
353
|
-
})}
|
|
354
|
-
</g>
|
|
355
|
-
</Handles>
|
|
356
|
-
)
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
function HandleWrapper({
|
|
360
|
-
shapeId,
|
|
361
|
-
handle,
|
|
362
|
-
zoom,
|
|
363
|
-
isCoarse,
|
|
364
|
-
}: {
|
|
365
|
-
shapeId: TLShapeId
|
|
366
|
-
handle: TLHandle
|
|
367
|
-
zoom: number
|
|
368
|
-
isCoarse: boolean
|
|
369
|
-
}) {
|
|
370
|
-
const events = useHandleEvents(shapeId, handle.id)
|
|
371
|
-
const { Handle } = useEditorComponents()
|
|
372
|
-
|
|
373
|
-
if (!Handle) return null
|
|
374
|
-
|
|
375
|
-
return (
|
|
376
|
-
<g
|
|
377
|
-
role="button"
|
|
378
|
-
// TODO(mime): handle.label needs to be required in the future.
|
|
379
|
-
aria-label={handle.label || 'handle'}
|
|
380
|
-
transform={`translate(${handle.x}, ${handle.y})`}
|
|
381
|
-
{...events}
|
|
382
|
-
>
|
|
383
|
-
<Handle shapeId={shapeId} handle={handle} zoom={zoom} isCoarse={isCoarse} />
|
|
384
|
-
</g>
|
|
385
|
-
)
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
function OverlaysWrapper() {
|
|
389
|
-
const { Overlays } = useEditorComponents()
|
|
390
|
-
if (!Overlays) return null
|
|
391
|
-
return (
|
|
392
|
-
<div className="tl-custom-overlays tl-overlays__item">
|
|
393
|
-
<Overlays />
|
|
394
|
-
</div>
|
|
395
|
-
)
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function ShapesLayer() {
|
|
195
|
+
function ShapesLayer({ canvasRef }: { canvasRef: { readonly current: HTMLDivElement | null } }) {
|
|
399
196
|
const editor = useEditor()
|
|
400
197
|
const debugSvg = useValue('debug svg', () => debugFlags.debugSvg.get(), [debugFlags])
|
|
401
198
|
const renderingShapes = useValue('rendering shapes', () => editor.getRenderingShapes(), [editor])
|
|
@@ -413,11 +210,11 @@ function ShapesLayer() {
|
|
|
413
210
|
)
|
|
414
211
|
)}
|
|
415
212
|
<CullingController />
|
|
416
|
-
{tlenv.isSafari && <ReflowIfNeeded />}
|
|
213
|
+
{tlenv.isSafari && <ReflowIfNeeded canvasRef={canvasRef} />}
|
|
417
214
|
</ShapeCullingProvider>
|
|
418
215
|
)
|
|
419
216
|
}
|
|
420
|
-
function ReflowIfNeeded() {
|
|
217
|
+
function ReflowIfNeeded({ canvasRef }: { canvasRef: { readonly current: HTMLDivElement | null } }) {
|
|
421
218
|
const editor = useEditor()
|
|
422
219
|
const culledShapesRef = useRef<Set<TLShapeId>>(new Set())
|
|
423
220
|
useQuickReactor(
|
|
@@ -427,13 +224,13 @@ function ReflowIfNeeded() {
|
|
|
427
224
|
if (culledShapesRef.current === culledShapes) return
|
|
428
225
|
|
|
429
226
|
culledShapesRef.current = culledShapes
|
|
430
|
-
const canvas =
|
|
431
|
-
if (canvas
|
|
227
|
+
const canvas = canvasRef.current
|
|
228
|
+
if (!canvas) return
|
|
432
229
|
// This causes a reflow
|
|
433
230
|
// https://gist.github.com/paulirish/5d52fb081b3570c81e3a
|
|
434
|
-
const _height =
|
|
231
|
+
const _height = canvas.offsetHeight
|
|
435
232
|
},
|
|
436
|
-
[editor]
|
|
233
|
+
[editor, canvasRef]
|
|
437
234
|
)
|
|
438
235
|
return null
|
|
439
236
|
}
|
|
@@ -458,56 +255,6 @@ function CullingController() {
|
|
|
458
255
|
return null
|
|
459
256
|
}
|
|
460
257
|
|
|
461
|
-
function HintedShapeIndicator() {
|
|
462
|
-
const editor = useEditor()
|
|
463
|
-
const { ShapeIndicator } = useEditorComponents()
|
|
464
|
-
|
|
465
|
-
const ids = useValue(
|
|
466
|
-
'hinting shape ids without canvas indicator',
|
|
467
|
-
() => {
|
|
468
|
-
// Filter to only shapes that use legacy SVG indicators
|
|
469
|
-
return dedupe(editor.getHintingShapeIds()).filter((id) => {
|
|
470
|
-
const shape = editor.getShape(id)
|
|
471
|
-
if (!shape) return false
|
|
472
|
-
const util = editor.getShapeUtil(shape)
|
|
473
|
-
return util.useLegacyIndicator()
|
|
474
|
-
})
|
|
475
|
-
},
|
|
476
|
-
[editor]
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
if (!ids.length) return null
|
|
480
|
-
if (!ShapeIndicator) return null
|
|
481
|
-
|
|
482
|
-
return ids.map((id) => (
|
|
483
|
-
<ShapeIndicator className="tl-user-indicator__hint" shapeId={id} key={id + '_hinting'} />
|
|
484
|
-
))
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
function CursorDef() {
|
|
488
|
-
return (
|
|
489
|
-
<g id={useSharedSafeId('cursor')}>
|
|
490
|
-
<g fill="rgba(0,0,0,.2)" transform="translate(-11,-11)">
|
|
491
|
-
<path d="m12 24.4219v-16.015l11.591 11.619h-6.781l-.411.124z" />
|
|
492
|
-
<path d="m21.0845 25.0962-3.605 1.535-4.682-11.089 3.686-1.553z" />
|
|
493
|
-
</g>
|
|
494
|
-
<g fill="white" transform="translate(-12,-12)">
|
|
495
|
-
<path d="m12 24.4219v-16.015l11.591 11.619h-6.781l-.411.124z" />
|
|
496
|
-
<path d="m21.0845 25.0962-3.605 1.535-4.682-11.089 3.686-1.553z" />
|
|
497
|
-
</g>
|
|
498
|
-
<g fill="currentColor" transform="translate(-12,-12)">
|
|
499
|
-
<path d="m19.751 24.4155-1.844.774-3.1-7.374 1.841-.775z" />
|
|
500
|
-
<path d="m13 10.814v11.188l2.969-2.866.428-.139h4.768z" />
|
|
501
|
-
</g>
|
|
502
|
-
</g>
|
|
503
|
-
)
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
function CollaboratorHintDef() {
|
|
507
|
-
const cursorHintId = useSharedSafeId('cursor_hint')
|
|
508
|
-
return <path id={cursorHintId} fill="currentColor" d="M -2,-5 2,0 -2,5 Z" />
|
|
509
|
-
}
|
|
510
|
-
|
|
511
258
|
function DebugSvgCopy({ id, mode }: { id: TLShapeId; mode: 'img' | 'iframe' }) {
|
|
512
259
|
const editor = useEditor()
|
|
513
260
|
|
|
@@ -530,7 +277,8 @@ function DebugSvgCopy({ id, mode }: { id: TLShapeId; mode: 'img' | 'iframe' }) {
|
|
|
530
277
|
const renderId = Math.random()
|
|
531
278
|
latest = renderId
|
|
532
279
|
|
|
533
|
-
const
|
|
280
|
+
const shape = editor.getShape(id)
|
|
281
|
+
const isSingleFrame = !!shape && editor.isShapeFrameLike(shape)
|
|
534
282
|
const padding = isSingleFrame ? 0 : 10
|
|
535
283
|
let bounds = editor.getShapePageBounds(id)
|
|
536
284
|
if (!bounds) return
|
|
@@ -589,25 +337,6 @@ function DebugSvgCopy({ id, mode }: { id: TLShapeId; mode: 'img' | 'iframe' }) {
|
|
|
589
337
|
)
|
|
590
338
|
}
|
|
591
339
|
|
|
592
|
-
function SelectionForegroundWrapper() {
|
|
593
|
-
const editor = useEditor()
|
|
594
|
-
const selectionRotation = useValue(
|
|
595
|
-
'selection rotation',
|
|
596
|
-
function getSelectionRotation() {
|
|
597
|
-
return editor.getSelectionRotation()
|
|
598
|
-
},
|
|
599
|
-
[editor]
|
|
600
|
-
)
|
|
601
|
-
const selectionBounds = useValue(
|
|
602
|
-
'selection bounds',
|
|
603
|
-
() => editor.getSelectionRotatedPageBounds(),
|
|
604
|
-
[editor]
|
|
605
|
-
)
|
|
606
|
-
const { SelectionForeground } = useEditorComponents()
|
|
607
|
-
if (!selectionBounds || !SelectionForeground) return null
|
|
608
|
-
return <SelectionForeground bounds={selectionBounds} rotation={selectionRotation} />
|
|
609
|
-
}
|
|
610
|
-
|
|
611
340
|
function SelectionBackgroundWrapper() {
|
|
612
341
|
const editor = useEditor()
|
|
613
342
|
const selectionRotation = useValue('selection rotation', () => editor.getSelectionRotation(), [
|