@tldraw/editor 3.12.0-canary.423f9b4f2a86 → 3.12.0-canary.4ecb34d3434d
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 +113 -12
- package/dist-cjs/index.js +3 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/components/GeometryDebuggingView.js +2 -2
- package/dist-cjs/lib/components/GeometryDebuggingView.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +184 -10
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +12 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +4 -13
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/types/selection-types.js.map +1 -1
- package/dist-cjs/lib/hooks/useDocumentEvents.js +16 -0
- package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
- package/dist-cjs/lib/license/Watermark.js +9 -20
- package/dist-cjs/lib/license/Watermark.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +133 -16
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +3 -3
- package/dist-cjs/lib/primitives/geometry/Group2d.js +54 -11
- package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
- package/dist-cjs/lib/primitives/intersect.js +20 -0
- package/dist-cjs/lib/primitives/intersect.js.map +2 -2
- package/dist-cjs/lib/utils/reorderShapes.js +2 -8
- package/dist-cjs/lib/utils/reorderShapes.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 +113 -12
- package/dist-esm/index.mjs +8 -2
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/components/GeometryDebuggingView.mjs +3 -3
- package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +185 -10
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +12 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +4 -13
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs +16 -0
- package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
- package/dist-esm/lib/license/Watermark.mjs +9 -20
- package/dist-esm/lib/license/Watermark.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +137 -14
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -12
- package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/intersect.mjs +20 -0
- package/dist-esm/lib/primitives/intersect.mjs.map +2 -2
- package/dist-esm/lib/utils/reorderShapes.mjs +2 -8
- package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +11 -2
- package/src/lib/components/GeometryDebuggingView.tsx +3 -3
- package/src/lib/editor/Editor.ts +263 -16
- package/src/lib/editor/shapes/ShapeUtil.ts +14 -0
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +7 -15
- package/src/lib/editor/types/selection-types.ts +3 -0
- package/src/lib/hooks/useDocumentEvents.ts +18 -0
- package/src/lib/license/Watermark.tsx +17 -29
- package/src/lib/primitives/geometry/Geometry2d.ts +196 -16
- package/src/lib/primitives/geometry/Group2d.ts +76 -13
- package/src/lib/primitives/intersect.ts +41 -0
- package/src/lib/utils/reorderShapes.ts +2 -9
- package/src/version.ts +3 -3
|
@@ -122,8 +122,8 @@ var import_TextManager = require("./managers/TextManager");
|
|
|
122
122
|
var import_TickManager = require("./managers/TickManager");
|
|
123
123
|
var import_UserPreferencesManager = require("./managers/UserPreferencesManager");
|
|
124
124
|
var import_RootState = require("./tools/RootState");
|
|
125
|
-
var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, __notVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getIsMenuOpen_dec, _getOpenMenus_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _getCanRedo_dec, _getCanUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
|
|
126
|
-
class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _getCanUndo_dec = [import_state.computed], _getCanRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getOpenMenus_dec = [import_state.computed], _getIsMenuOpen_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], __notVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
|
|
125
|
+
var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, __notVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getIsMenuOpen_dec, _getOpenMenus_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _getCanRedo_dec, _getCanUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
|
|
126
|
+
class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _getCanUndo_dec = [import_state.computed], _getCanRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getOpenMenus_dec = [import_state.computed], _getIsMenuOpen_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], __notVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
|
|
127
127
|
constructor({
|
|
128
128
|
store,
|
|
129
129
|
user,
|
|
@@ -301,6 +301,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
301
301
|
__publicField(this, "_currentPageShapeIds");
|
|
302
302
|
/* --------------------- Shapes --------------------- */
|
|
303
303
|
__publicField(this, "_shapeGeometryCaches", {});
|
|
304
|
+
__publicField(this, "_shapePageGeometryCaches", {});
|
|
304
305
|
// Parents and children
|
|
305
306
|
/**
|
|
306
307
|
* A cache of parents to children.
|
|
@@ -1440,6 +1441,131 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
1440
1441
|
this.setSelectedShapes(this._getUnlockedShapeIds(ids));
|
|
1441
1442
|
return this;
|
|
1442
1443
|
}
|
|
1444
|
+
selectAdjacentShape(direction) {
|
|
1445
|
+
const readingOrderShapes = this.getCurrentPageShapesInReadingOrder();
|
|
1446
|
+
const selectedShapeIds = this.getSelectedShapeIds();
|
|
1447
|
+
const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
|
|
1448
|
+
let adjacentShapeId;
|
|
1449
|
+
if (direction === "next" || direction === "prev") {
|
|
1450
|
+
const shapeIds = readingOrderShapes.map((shape2) => shape2.id);
|
|
1451
|
+
const currentIndex = currentShapeId ? shapeIds.indexOf(currentShapeId) : -1;
|
|
1452
|
+
const adjacentIndex = (currentIndex + (direction === "next" ? 1 : -1) + shapeIds.length) % shapeIds.length;
|
|
1453
|
+
adjacentShapeId = shapeIds[adjacentIndex];
|
|
1454
|
+
} else {
|
|
1455
|
+
if (!currentShapeId) return;
|
|
1456
|
+
adjacentShapeId = this.getNearestAdjacentShape(currentShapeId, direction);
|
|
1457
|
+
}
|
|
1458
|
+
const shape = this.getShape(adjacentShapeId);
|
|
1459
|
+
if (!shape) return;
|
|
1460
|
+
this.setSelectedShapes([shape.id]);
|
|
1461
|
+
this.zoomToSelectionIfOffscreen(256, {
|
|
1462
|
+
animation: {
|
|
1463
|
+
duration: this.options.animationMediumMs
|
|
1464
|
+
},
|
|
1465
|
+
inset: 0
|
|
1466
|
+
});
|
|
1467
|
+
}
|
|
1468
|
+
getCurrentPageShapesInReadingOrder() {
|
|
1469
|
+
const SHALLOW_ANGLE = 20;
|
|
1470
|
+
const ROW_THRESHOLD = 100;
|
|
1471
|
+
const shapes = this.getCurrentPageShapes();
|
|
1472
|
+
const tabbableShapes = shapes.filter((shape) => this.getShapeUtil(shape).canTabTo(shape));
|
|
1473
|
+
if (tabbableShapes.length <= 1) return tabbableShapes;
|
|
1474
|
+
const shapesWithCenters = tabbableShapes.map((shape) => ({
|
|
1475
|
+
shape,
|
|
1476
|
+
center: this.getShapePageBounds(shape).center
|
|
1477
|
+
}));
|
|
1478
|
+
shapesWithCenters.sort((a, b) => a.center.y - b.center.y);
|
|
1479
|
+
const rows = [];
|
|
1480
|
+
for (const shapeWithCenter of shapesWithCenters) {
|
|
1481
|
+
let rowIndex = -1;
|
|
1482
|
+
for (let i = rows.length - 1; i >= 0; i--) {
|
|
1483
|
+
const row = rows[i];
|
|
1484
|
+
const lastShapeInRow = row[row.length - 1];
|
|
1485
|
+
if (Math.abs(shapeWithCenter.center.y - lastShapeInRow.center.y) < ROW_THRESHOLD) {
|
|
1486
|
+
rowIndex = i;
|
|
1487
|
+
break;
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
if (rowIndex === -1) {
|
|
1491
|
+
rows.push([shapeWithCenter]);
|
|
1492
|
+
} else {
|
|
1493
|
+
rows[rowIndex].push(shapeWithCenter);
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
for (const row of rows) {
|
|
1497
|
+
row.sort((a, b) => a.center.x - b.center.x);
|
|
1498
|
+
}
|
|
1499
|
+
for (const row of rows) {
|
|
1500
|
+
if (row.length <= 2) continue;
|
|
1501
|
+
for (let i = 0; i < row.length - 2; i++) {
|
|
1502
|
+
const currentShape = row[i];
|
|
1503
|
+
const nextShape = row[i + 1];
|
|
1504
|
+
const nextNextShape = row[i + 2];
|
|
1505
|
+
const dist1 = import_Vec.Vec.Dist2(currentShape.center, nextShape.center);
|
|
1506
|
+
const dist2 = import_Vec.Vec.Dist2(currentShape.center, nextNextShape.center);
|
|
1507
|
+
if (dist2 < dist1 * 0.9) {
|
|
1508
|
+
const angle = Math.abs(
|
|
1509
|
+
import_Vec.Vec.Angle(currentShape.center, nextNextShape.center) * (180 / Math.PI)
|
|
1510
|
+
);
|
|
1511
|
+
if (angle <= SHALLOW_ANGLE) {
|
|
1512
|
+
;
|
|
1513
|
+
[row[i + 1], row[i + 2]] = [row[i + 2], row[i + 1]];
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
return rows.flat().map((item) => item.shape);
|
|
1519
|
+
}
|
|
1520
|
+
/**
|
|
1521
|
+
* Find the nearest adjacent shape in a specific direction.
|
|
1522
|
+
*
|
|
1523
|
+
* @public
|
|
1524
|
+
*/
|
|
1525
|
+
getNearestAdjacentShape(currentShapeId, direction) {
|
|
1526
|
+
const directionToAngle = { right: 0, left: 180, down: 90, up: 270 };
|
|
1527
|
+
const currentShape = this.getShape(currentShapeId);
|
|
1528
|
+
if (!currentShape) return currentShapeId;
|
|
1529
|
+
const shapes = this.getCurrentPageShapes();
|
|
1530
|
+
const tabbableShapes = shapes.filter(
|
|
1531
|
+
(shape) => this.getShapeUtil(shape).canTabTo(shape) && shape.id !== currentShapeId
|
|
1532
|
+
);
|
|
1533
|
+
if (!tabbableShapes.length) return currentShapeId;
|
|
1534
|
+
const currentCenter = this.getShapePageBounds(currentShape).center;
|
|
1535
|
+
const shapesWithCenters = tabbableShapes.map((shape) => ({
|
|
1536
|
+
shape,
|
|
1537
|
+
center: this.getShapePageBounds(shape).center
|
|
1538
|
+
}));
|
|
1539
|
+
const shapesInDirection = shapesWithCenters.filter(({ center }) => {
|
|
1540
|
+
const isRight = center.x > currentCenter.x;
|
|
1541
|
+
const isDown = center.y > currentCenter.y;
|
|
1542
|
+
const xDist = center.x - currentCenter.x;
|
|
1543
|
+
const yDist = center.y - currentCenter.y;
|
|
1544
|
+
const isInXDirection = Math.abs(yDist) < Math.abs(xDist) * 2;
|
|
1545
|
+
const isInYDirection = Math.abs(xDist) < Math.abs(yDist) * 2;
|
|
1546
|
+
if (direction === "left" || direction === "right") {
|
|
1547
|
+
return isInXDirection && (direction === "right" ? isRight : !isRight);
|
|
1548
|
+
}
|
|
1549
|
+
if (direction === "up" || direction === "down") {
|
|
1550
|
+
return isInYDirection && (direction === "down" ? isDown : !isDown);
|
|
1551
|
+
}
|
|
1552
|
+
});
|
|
1553
|
+
if (shapesInDirection.length === 0) return currentShapeId;
|
|
1554
|
+
const lowestScoringShape = (0, import_utils.minBy)(shapesInDirection, ({ center }) => {
|
|
1555
|
+
const distance = import_Vec.Vec.Dist2(currentCenter, center);
|
|
1556
|
+
const dirProp = ["left", "right"].includes(direction) ? "x" : "y";
|
|
1557
|
+
const directionalDistance = Math.abs(center[dirProp] - currentCenter[dirProp]);
|
|
1558
|
+
const offProp = ["left", "right"].includes(direction) ? "y" : "x";
|
|
1559
|
+
const offAxisDeviation = Math.abs(center[offProp] - currentCenter[offProp]);
|
|
1560
|
+
const angle = Math.abs(import_Vec.Vec.Angle(currentCenter, center) * (180 / Math.PI));
|
|
1561
|
+
const angleDeviation = Math.abs(angle - directionToAngle[direction]);
|
|
1562
|
+
return distance * 1 + // Base distance
|
|
1563
|
+
offAxisDeviation * 2 + // Heavy penalty for off-axis deviation
|
|
1564
|
+
(distance - directionalDistance) * 1.5 + // Penalty for diagonal distance
|
|
1565
|
+
angleDeviation * 0.5;
|
|
1566
|
+
});
|
|
1567
|
+
return lowestScoringShape.shape.id;
|
|
1568
|
+
}
|
|
1443
1569
|
/**
|
|
1444
1570
|
* Clear the selection.
|
|
1445
1571
|
*
|
|
@@ -2353,6 +2479,23 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
2353
2479
|
}
|
|
2354
2480
|
return this;
|
|
2355
2481
|
}
|
|
2482
|
+
/**
|
|
2483
|
+
* Zoom the camera to the current selection if offscreen.
|
|
2484
|
+
*
|
|
2485
|
+
* @public
|
|
2486
|
+
*/
|
|
2487
|
+
zoomToSelectionIfOffscreen(padding = 16, opts) {
|
|
2488
|
+
const selectionPageBounds = this.getSelectionPageBounds();
|
|
2489
|
+
const viewportPageBounds = this.getViewportPageBounds();
|
|
2490
|
+
if (selectionPageBounds && !viewportPageBounds.contains(selectionPageBounds)) {
|
|
2491
|
+
const eb = selectionPageBounds.clone().expandBy(padding / this.getZoomLevel()).expand(viewportPageBounds);
|
|
2492
|
+
const nextBounds = viewportPageBounds.clone().translate({
|
|
2493
|
+
x: (eb.center.x - viewportPageBounds.center.x) * 2,
|
|
2494
|
+
y: (eb.center.y - viewportPageBounds.center.y) * 2
|
|
2495
|
+
});
|
|
2496
|
+
this.zoomToBounds(nextBounds, opts);
|
|
2497
|
+
}
|
|
2498
|
+
}
|
|
2356
2499
|
/**
|
|
2357
2500
|
* Zoom the camera to fit a bounding box (in the current page space).
|
|
2358
2501
|
*
|
|
@@ -3268,7 +3411,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3268
3411
|
return await this.store.props.assets.upload(asset, file, abortSignal);
|
|
3269
3412
|
}
|
|
3270
3413
|
/**
|
|
3271
|
-
* Get the geometry of a shape.
|
|
3414
|
+
* Get the geometry of a shape in shape-space.
|
|
3272
3415
|
*
|
|
3273
3416
|
* @example
|
|
3274
3417
|
* ```ts
|
|
@@ -3298,6 +3441,41 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3298
3441
|
typeof shape === "string" ? shape : shape.id
|
|
3299
3442
|
);
|
|
3300
3443
|
}
|
|
3444
|
+
/**
|
|
3445
|
+
* Get the geometry of a shape in page-space.
|
|
3446
|
+
*
|
|
3447
|
+
* @example
|
|
3448
|
+
* ```ts
|
|
3449
|
+
* editor.getShapePageGeometry(myShape)
|
|
3450
|
+
* editor.getShapePageGeometry(myShapeId)
|
|
3451
|
+
* editor.getShapePageGeometry(myShapeId, { context: "arrow" })
|
|
3452
|
+
* ```
|
|
3453
|
+
*
|
|
3454
|
+
* @param shape - The shape (or shape id) to get the geometry for.
|
|
3455
|
+
* @param opts - Additional options about the request for geometry. Passed to {@link ShapeUtil.getGeometry}.
|
|
3456
|
+
*
|
|
3457
|
+
* @public
|
|
3458
|
+
*/
|
|
3459
|
+
getShapePageGeometry(shape, opts) {
|
|
3460
|
+
const context = opts?.context ?? "none";
|
|
3461
|
+
if (!this._shapePageGeometryCaches[context]) {
|
|
3462
|
+
this._shapePageGeometryCaches[context] = this.store.createComputedCache(
|
|
3463
|
+
"bounds",
|
|
3464
|
+
(shape2) => {
|
|
3465
|
+
const geometry = this.getShapeGeometry(shape2.id, opts);
|
|
3466
|
+
const pageTransform = this.getShapePageTransform(shape2.id);
|
|
3467
|
+
return geometry.transform(pageTransform);
|
|
3468
|
+
},
|
|
3469
|
+
{
|
|
3470
|
+
// we only depend directly on the shape id, and changing geometry/transform will update us anyway
|
|
3471
|
+
areRecordsEqual: () => true
|
|
3472
|
+
}
|
|
3473
|
+
);
|
|
3474
|
+
}
|
|
3475
|
+
return this._shapePageGeometryCaches[context].get(
|
|
3476
|
+
typeof shape === "string" ? shape : shape.id
|
|
3477
|
+
);
|
|
3478
|
+
}
|
|
3301
3479
|
_getShapeHandlesCache() {
|
|
3302
3480
|
return this.store.createComputedCache("handles", (shape) => {
|
|
3303
3481
|
return this.getShapeUtil(shape).getHandles?.(shape);
|
|
@@ -3385,12 +3563,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3385
3563
|
}
|
|
3386
3564
|
_getShapePageBoundsCache() {
|
|
3387
3565
|
return this.store.createComputedCache("pageBoundsCache", (shape) => {
|
|
3388
|
-
|
|
3389
|
-
if (!pageTransform) return new import_Box.Box();
|
|
3390
|
-
const result = import_Box.Box.FromPoints(
|
|
3391
|
-
import_Mat.Mat.applyToPoints(pageTransform, this.getShapeGeometry(shape).vertices)
|
|
3392
|
-
);
|
|
3393
|
-
return result;
|
|
3566
|
+
return this.getShapePageGeometry(shape).bounds;
|
|
3394
3567
|
});
|
|
3395
3568
|
}
|
|
3396
3569
|
/**
|
|
@@ -3450,7 +3623,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
|
|
|
3450
3623
|
const pageMask = frameAncestors.map(
|
|
3451
3624
|
(s) => (
|
|
3452
3625
|
// Apply the frame transform to the frame outline to get the frame outline in the current page space
|
|
3453
|
-
this.
|
|
3626
|
+
this.getShapePageGeometry(s.id).vertices
|
|
3454
3627
|
)
|
|
3455
3628
|
).reduce((acc, b) => {
|
|
3456
3629
|
if (!(b && acc)) return void 0;
|
|
@@ -7527,6 +7700,7 @@ __decorateElement(_init, 1, "getCurrentPageState", _getCurrentPageState_dec, Edi
|
|
|
7527
7700
|
__decorateElement(_init, 1, "_getCurrentPageStateId", __getCurrentPageStateId_dec, Editor);
|
|
7528
7701
|
__decorateElement(_init, 1, "getSelectedShapeIds", _getSelectedShapeIds_dec, Editor);
|
|
7529
7702
|
__decorateElement(_init, 1, "getSelectedShapes", _getSelectedShapes_dec, Editor);
|
|
7703
|
+
__decorateElement(_init, 1, "getCurrentPageShapesInReadingOrder", _getCurrentPageShapesInReadingOrder_dec, Editor);
|
|
7530
7704
|
__decorateElement(_init, 1, "getOnlySelectedShapeId", _getOnlySelectedShapeId_dec, Editor);
|
|
7531
7705
|
__decorateElement(_init, 1, "getOnlySelectedShape", _getOnlySelectedShape_dec, Editor);
|
|
7532
7706
|
__decorateElement(_init, 1, "getSelectionPageBounds", _getSelectionPageBounds_dec, Editor);
|