@tldraw/editor 3.13.0-canary.52e2314962c1 → 3.13.0-canary.62d76a25592d
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 +114 -111
- package/dist-cjs/index.js +7 -22
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +2 -1
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/Shape.js +12 -8
- package/dist-cjs/lib/components/Shape.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +36 -7
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +14 -12
- package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +17 -11
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultSpinner.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +65 -35
- package/dist-cjs/lib/editor/Editor.js.map +3 -3
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
- package/dist-cjs/lib/editor/managers/TextManager.js +10 -0
- package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
- package/dist-cjs/lib/exports/getSvgJsx.js +12 -3
- package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
- package/dist-cjs/lib/hooks/useDocumentEvents.js +3 -2
- package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js +16 -16
- package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
- package/dist-cjs/lib/license/LicenseManager.js +8 -1
- package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +16 -0
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/Mat.js +1 -1
- package/dist-cjs/lib/primitives/Mat.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +20 -0
- 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 +1 -1
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +91 -20
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Group2d.js +55 -2
- package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
- package/dist-cjs/lib/utils/areShapesContentEqual.js +25 -0
- package/dist-cjs/lib/utils/areShapesContentEqual.js.map +7 -0
- package/dist-cjs/lib/utils/debug-flags.js +5 -2
- package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
- package/dist-cjs/lib/utils/dom.js +3 -3
- package/dist-cjs/lib/utils/dom.js.map +2 -2
- package/dist-cjs/lib/utils/nearestMultiple.js +34 -0
- package/dist-cjs/lib/utils/nearestMultiple.js.map +7 -0
- package/dist-cjs/lib/utils/rotation.js +5 -5
- package/dist-cjs/lib/utils/rotation.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 +114 -111
- package/dist-esm/index.mjs +9 -41
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +2 -1
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/Shape.mjs +12 -8
- package/dist-esm/lib/components/Shape.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +36 -7
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +14 -12
- package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +17 -11
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +65 -35
- package/dist-esm/lib/editor/Editor.mjs.map +3 -3
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/TextManager.mjs +10 -0
- package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs +12 -3
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs +3 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEditorComponents.mjs +16 -18
- package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
- package/dist-esm/lib/license/LicenseManager.mjs +8 -1
- package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +16 -0
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/Mat.mjs +1 -1
- package/dist-esm/lib/primitives/Mat.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +20 -0
- 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 +1 -1
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +92 -21
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
- package/dist-esm/lib/utils/areShapesContentEqual.mjs +5 -0
- package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +7 -0
- package/dist-esm/lib/utils/debug-flags.mjs +5 -2
- package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
- package/dist-esm/lib/utils/dom.mjs +3 -3
- package/dist-esm/lib/utils/dom.mjs.map +2 -2
- package/dist-esm/lib/utils/nearestMultiple.mjs +14 -0
- package/dist-esm/lib/utils/nearestMultiple.mjs.map +7 -0
- package/dist-esm/lib/utils/rotation.mjs +5 -5
- package/dist-esm/lib/utils/rotation.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +42 -4
- package/package.json +7 -7
- package/src/index.ts +16 -31
- package/src/lib/TldrawEditor.tsx +6 -1
- package/src/lib/components/Shape.tsx +14 -10
- package/src/lib/components/default-components/DefaultCanvas.tsx +41 -7
- package/src/lib/components/default-components/DefaultErrorFallback.tsx +25 -14
- package/src/lib/components/default-components/DefaultShapeIndicator.tsx +17 -8
- package/src/lib/components/default-components/DefaultSpinner.tsx +1 -1
- package/src/lib/editor/Editor.test.ts +1 -1
- package/src/lib/editor/Editor.ts +62 -34
- package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +0 -1
- package/src/lib/editor/managers/TextManager.ts +12 -0
- package/src/lib/editor/shapes/ShapeUtil.ts +22 -2
- package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +9 -9
- package/src/lib/exports/getSvgJsx.tsx +16 -7
- package/src/lib/hooks/useDocumentEvents.ts +7 -2
- package/src/lib/hooks/useEditorComponents.tsx +33 -32
- package/src/lib/license/LicenseManager.test.ts +40 -0
- package/src/lib/license/LicenseManager.ts +13 -1
- package/src/lib/options.ts +4 -0
- package/src/lib/primitives/Box.ts +20 -0
- package/src/lib/primitives/Mat.ts +5 -4
- package/src/lib/primitives/Vec.ts +23 -0
- package/src/lib/primitives/geometry/Arc2d.ts +5 -5
- package/src/lib/primitives/geometry/Circle2d.ts +4 -4
- package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -4
- package/src/lib/primitives/geometry/CubicSpline2d.ts +3 -3
- package/src/lib/primitives/geometry/Edge2d.ts +3 -3
- package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
- package/src/lib/primitives/geometry/Geometry2d.test.ts +42 -0
- package/src/lib/primitives/geometry/Geometry2d.ts +123 -35
- package/src/lib/primitives/geometry/Group2d.ts +70 -7
- package/src/lib/primitives/geometry/Point2d.ts +2 -2
- package/src/lib/primitives/geometry/Polyline2d.ts +3 -3
- package/src/lib/primitives/geometry/Stadium2d.ts +3 -3
- package/src/lib/test/currentToolIdMask.test.ts +1 -1
- package/src/lib/test/user.test.ts +1 -1
- package/src/lib/utils/areShapesContentEqual.ts +4 -0
- package/src/lib/utils/debug-flags.ts +7 -2
- package/src/lib/utils/dom.ts +4 -4
- package/src/lib/utils/nearestMultiple.ts +13 -0
- package/src/lib/utils/rotation.ts +8 -6
- package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -1
- package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
- package/src/version.ts +3 -3
|
@@ -132,6 +132,7 @@ import { Group2d } from "../primitives/geometry/Group2d.mjs";
|
|
|
132
132
|
import { intersectPolygonPolygon } from "../primitives/intersect.mjs";
|
|
133
133
|
import { PI, approximately, areAnglesCompatible, clamp, pointInPolygon } from "../primitives/utils.mjs";
|
|
134
134
|
import { SharedStyleMap } from "../utils/SharedStylesMap.mjs";
|
|
135
|
+
import { areShapesContentEqual } from "../utils/areShapesContentEqual.mjs";
|
|
135
136
|
import { dataUrlToFile } from "../utils/assets.mjs";
|
|
136
137
|
import { debugFlags } from "../utils/debug-flags.mjs";
|
|
137
138
|
import {
|
|
@@ -457,7 +458,6 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
457
458
|
) : getShapeVisibility;
|
|
458
459
|
this.options = { ...defaultTldrawOptions, ...options };
|
|
459
460
|
this.store = store;
|
|
460
|
-
this.disposables.add(this.store.dispose.bind(this.store));
|
|
461
461
|
this.history = new HistoryManager({
|
|
462
462
|
store,
|
|
463
463
|
annotateError: (error) => {
|
|
@@ -869,6 +869,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
869
869
|
dispose() {
|
|
870
870
|
this.disposables.forEach((dispose) => dispose());
|
|
871
871
|
this.disposables.clear();
|
|
872
|
+
this.store.dispose();
|
|
872
873
|
this.isDisposed = true;
|
|
873
874
|
}
|
|
874
875
|
getShapeUtil(arg) {
|
|
@@ -1381,8 +1382,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1381
1382
|
return this.getCurrentPageState().selectedShapeIds;
|
|
1382
1383
|
}
|
|
1383
1384
|
getSelectedShapes() {
|
|
1384
|
-
|
|
1385
|
-
return compact(selectedShapeIds.map((id) => this.store.get(id)));
|
|
1385
|
+
return compact(this.getSelectedShapeIds().map((id) => this.store.get(id)));
|
|
1386
1386
|
}
|
|
1387
1387
|
/**
|
|
1388
1388
|
* Select one or more shapes.
|
|
@@ -1772,13 +1772,21 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1772
1772
|
setEditingShape(shape) {
|
|
1773
1773
|
const id = typeof shape === "string" ? shape : shape?.id ?? null;
|
|
1774
1774
|
this.setRichTextEditor(null);
|
|
1775
|
-
|
|
1775
|
+
const prevEditingShapeId = this.getEditingShapeId();
|
|
1776
|
+
if (id !== prevEditingShapeId) {
|
|
1776
1777
|
if (id) {
|
|
1777
1778
|
const shape2 = this.getShape(id);
|
|
1778
1779
|
if (shape2 && this.getShapeUtil(shape2).canEdit(shape2)) {
|
|
1779
1780
|
this.run(
|
|
1780
1781
|
() => {
|
|
1781
1782
|
this._updateCurrentPageState({ editingShapeId: id });
|
|
1783
|
+
if (prevEditingShapeId) {
|
|
1784
|
+
const prevEditingShape = this.getShape(prevEditingShapeId);
|
|
1785
|
+
if (prevEditingShape) {
|
|
1786
|
+
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
this.getShapeUtil(shape2).onEditStart?.(shape2);
|
|
1782
1790
|
},
|
|
1783
1791
|
{ history: "ignore" }
|
|
1784
1792
|
);
|
|
@@ -1789,6 +1797,12 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1789
1797
|
() => {
|
|
1790
1798
|
this._updateCurrentPageState({ editingShapeId: null });
|
|
1791
1799
|
this._currentRichTextEditor.set(null);
|
|
1800
|
+
if (prevEditingShapeId) {
|
|
1801
|
+
const prevEditingShape = this.getShape(prevEditingShapeId);
|
|
1802
|
+
if (prevEditingShape) {
|
|
1803
|
+
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1792
1806
|
},
|
|
1793
1807
|
{ history: "ignore" }
|
|
1794
1808
|
);
|
|
@@ -1984,12 +1998,22 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1984
1998
|
}
|
|
1985
1999
|
return baseCamera;
|
|
1986
2000
|
}
|
|
2001
|
+
_getFollowingPresence(targetUserId) {
|
|
2002
|
+
const visited = [this.user.getId()];
|
|
2003
|
+
const collaborators = this.getCollaborators();
|
|
2004
|
+
let leaderPresence = null;
|
|
2005
|
+
while (targetUserId && !visited.includes(targetUserId)) {
|
|
2006
|
+
leaderPresence = collaborators.find((c) => c.userId === targetUserId) ?? null;
|
|
2007
|
+
targetUserId = leaderPresence?.followingUserId ?? null;
|
|
2008
|
+
if (leaderPresence) {
|
|
2009
|
+
visited.push(leaderPresence.userId);
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
return leaderPresence;
|
|
2013
|
+
}
|
|
1987
2014
|
getViewportPageBoundsForFollowing() {
|
|
1988
|
-
const
|
|
1989
|
-
if (!
|
|
1990
|
-
const leaderPresence = this.getCollaborators().find((c) => c.userId === followingUserId);
|
|
1991
|
-
if (!leaderPresence) return null;
|
|
1992
|
-
if (!leaderPresence.camera || !leaderPresence.screenBounds) return null;
|
|
2015
|
+
const leaderPresence = this._getFollowingPresence(this.getInstanceState().followingUserId);
|
|
2016
|
+
if (!leaderPresence?.camera || !leaderPresence?.screenBounds) return null;
|
|
1993
2017
|
const { w: lw, h: lh } = leaderPresence.screenBounds;
|
|
1994
2018
|
const { x: lx, y: ly, z: lz } = leaderPresence.camera;
|
|
1995
2019
|
const theirViewport = new Box(-lx, -ly, lw / lz, lh / lz);
|
|
@@ -2896,34 +2920,30 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
2896
2920
|
*/
|
|
2897
2921
|
startFollowingUser(userId) {
|
|
2898
2922
|
this.stopFollowingUser();
|
|
2899
|
-
const leaderPresences = this._getCollaboratorsQuery().get().filter((p) => p.userId === userId);
|
|
2900
|
-
if (!leaderPresences.length) {
|
|
2901
|
-
console.warn("User not found");
|
|
2902
|
-
return this;
|
|
2903
|
-
}
|
|
2904
2923
|
const thisUserId = this.user.getId();
|
|
2905
2924
|
if (!thisUserId) {
|
|
2906
2925
|
console.warn("You should set the userId for the current instance before following a user");
|
|
2907
2926
|
}
|
|
2908
|
-
|
|
2927
|
+
const leaderPresence = this._getFollowingPresence(userId);
|
|
2928
|
+
if (!leaderPresence) {
|
|
2909
2929
|
return this;
|
|
2910
2930
|
}
|
|
2911
2931
|
const latestLeaderPresence = computed("latestLeaderPresence", () => {
|
|
2912
|
-
return this.
|
|
2932
|
+
return this._getFollowingPresence(userId);
|
|
2913
2933
|
});
|
|
2914
2934
|
transact(() => {
|
|
2915
2935
|
this.updateInstanceState({ followingUserId: userId }, { history: "ignore" });
|
|
2916
2936
|
const dispose = react("update current page", () => {
|
|
2917
|
-
const
|
|
2918
|
-
if (!
|
|
2937
|
+
const leaderPresence2 = latestLeaderPresence.get();
|
|
2938
|
+
if (!leaderPresence2) {
|
|
2919
2939
|
this.stopFollowingUser();
|
|
2920
2940
|
return;
|
|
2921
2941
|
}
|
|
2922
|
-
if (
|
|
2942
|
+
if (leaderPresence2.currentPageId !== this.getCurrentPageId() && this.getPage(leaderPresence2.currentPageId)) {
|
|
2923
2943
|
this.run(
|
|
2924
2944
|
() => {
|
|
2925
2945
|
this.store.put([
|
|
2926
|
-
{ ...this.getInstanceState(), currentPageId:
|
|
2946
|
+
{ ...this.getInstanceState(), currentPageId: leaderPresence2.currentPageId }
|
|
2927
2947
|
]);
|
|
2928
2948
|
this._isLockedOnFollowingUser.set(true);
|
|
2929
2949
|
},
|
|
@@ -2938,8 +2958,8 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
2938
2958
|
this.off("stop-following", cancel);
|
|
2939
2959
|
};
|
|
2940
2960
|
const moveTowardsUser = () => {
|
|
2941
|
-
const
|
|
2942
|
-
if (!
|
|
2961
|
+
const leaderPresence2 = latestLeaderPresence.get();
|
|
2962
|
+
if (!leaderPresence2) {
|
|
2943
2963
|
this.stopFollowingUser();
|
|
2944
2964
|
return;
|
|
2945
2965
|
}
|
|
@@ -3468,7 +3488,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
3468
3488
|
this.fonts.trackFontsForShape(shape2);
|
|
3469
3489
|
return this.getShapeUtil(shape2).getGeometry(shape2, opts);
|
|
3470
3490
|
},
|
|
3471
|
-
{ areRecordsEqual:
|
|
3491
|
+
{ areRecordsEqual: areShapesContentEqual }
|
|
3472
3492
|
);
|
|
3473
3493
|
}
|
|
3474
3494
|
return this._shapeGeometryCaches[context].get(
|
|
@@ -3511,9 +3531,15 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
3511
3531
|
);
|
|
3512
3532
|
}
|
|
3513
3533
|
_getShapeHandlesCache() {
|
|
3514
|
-
return this.store.createComputedCache(
|
|
3515
|
-
|
|
3516
|
-
|
|
3534
|
+
return this.store.createComputedCache(
|
|
3535
|
+
"handles",
|
|
3536
|
+
(shape) => {
|
|
3537
|
+
return this.getShapeUtil(shape).getHandles?.(shape);
|
|
3538
|
+
},
|
|
3539
|
+
{
|
|
3540
|
+
areRecordsEqual: areShapesContentEqual
|
|
3541
|
+
}
|
|
3542
|
+
);
|
|
3517
3543
|
}
|
|
3518
3544
|
/**
|
|
3519
3545
|
* Get the handles (if any) for a shape.
|
|
@@ -4397,9 +4423,15 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
4397
4423
|
}
|
|
4398
4424
|
_getBindingsIndexCache() {
|
|
4399
4425
|
const index = bindingsIndex(this);
|
|
4400
|
-
return this.store.createComputedCache(
|
|
4401
|
-
|
|
4402
|
-
|
|
4426
|
+
return this.store.createComputedCache(
|
|
4427
|
+
"bindingsIndex",
|
|
4428
|
+
(shape) => {
|
|
4429
|
+
return index.get().get(shape.id);
|
|
4430
|
+
},
|
|
4431
|
+
// we can ignore the shape equality check here because the index is
|
|
4432
|
+
// computed incrementally based on what bindings are in the store
|
|
4433
|
+
{ areRecordsEqual: () => true }
|
|
4434
|
+
);
|
|
4403
4435
|
}
|
|
4404
4436
|
/**
|
|
4405
4437
|
* Get a binding from the store by its ID if it exists.
|
|
@@ -7474,7 +7506,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
7474
7506
|
const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera());
|
|
7475
7507
|
const { x: dx, y: dy, z: dz = 0 } = info.delta;
|
|
7476
7508
|
let behavior = wheelBehavior;
|
|
7477
|
-
if (
|
|
7509
|
+
if (info.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
|
|
7478
7510
|
switch (behavior) {
|
|
7479
7511
|
case "zoom": {
|
|
7480
7512
|
const { x, y } = this.inputs.currentScreenPoint;
|
|
@@ -7555,12 +7587,10 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
7555
7587
|
const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera());
|
|
7556
7588
|
if (this.inputs.isPanning && this.inputs.isPointing) {
|
|
7557
7589
|
const { currentScreenPoint, previousScreenPoint } = this.inputs;
|
|
7558
|
-
const { panSpeed } = cameraOptions;
|
|
7559
7590
|
const offset = Vec.Sub(currentScreenPoint, previousScreenPoint);
|
|
7560
|
-
this.setCamera(
|
|
7561
|
-
|
|
7562
|
-
|
|
7563
|
-
);
|
|
7591
|
+
this.setCamera(new Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
|
|
7592
|
+
immediate: true
|
|
7593
|
+
});
|
|
7564
7594
|
this.maybeTrackPerformance("Panning");
|
|
7565
7595
|
return;
|
|
7566
7596
|
}
|