@tldraw/editor 3.13.0-canary.6307ec7baefb → 3.13.0-canary.66687519f459
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 +14 -1
- package/dist-cjs/index.js +1 -1
- package/dist-cjs/lib/editor/Editor.js +45 -9
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +0 -3
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.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 +14 -1
- package/dist-esm/index.mjs +1 -1
- package/dist-esm/lib/editor/Editor.mjs +45 -9
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +0 -3
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.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/lib/editor/Editor.ts +56 -9
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +0 -4
- package/src/version.ts +3 -3
|
@@ -32,9 +32,6 @@ class GroupShapeUtil extends import_ShapeUtil.ShapeUtil {
|
|
|
32
32
|
static type = "group";
|
|
33
33
|
static props = import_tlschema.groupShapeProps;
|
|
34
34
|
static migrations = import_tlschema.groupShapeMigrations;
|
|
35
|
-
canTabTo() {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
35
|
hideSelectionBoundsFg() {
|
|
39
36
|
return true;
|
|
40
37
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/editor/shapes/group/GroupShapeUtil.tsx"],
|
|
4
|
-
"sourcesContent": ["import { TLGroupShape, groupShapeMigrations, groupShapeProps } from '@tldraw/tlschema'\nimport { SVGContainer } from '../../../components/SVGContainer'\nimport { Geometry2d } from '../../../primitives/geometry/Geometry2d'\nimport { Group2d } from '../../../primitives/geometry/Group2d'\nimport { Rectangle2d } from '../../../primitives/geometry/Rectangle2d'\nimport { ShapeUtil } from '../ShapeUtil'\nimport { DashedOutlineBox } from './DashedOutlineBox'\n\n/** @public */\nexport class GroupShapeUtil extends ShapeUtil<TLGroupShape> {\n\tstatic override type = 'group' as const\n\tstatic override props = groupShapeProps\n\tstatic override migrations = groupShapeMigrations\n\n\toverride
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { TLGroupShape, groupShapeMigrations, groupShapeProps } from '@tldraw/tlschema'\nimport { SVGContainer } from '../../../components/SVGContainer'\nimport { Geometry2d } from '../../../primitives/geometry/Geometry2d'\nimport { Group2d } from '../../../primitives/geometry/Group2d'\nimport { Rectangle2d } from '../../../primitives/geometry/Rectangle2d'\nimport { ShapeUtil } from '../ShapeUtil'\nimport { DashedOutlineBox } from './DashedOutlineBox'\n\n/** @public */\nexport class GroupShapeUtil extends ShapeUtil<TLGroupShape> {\n\tstatic override type = 'group' as const\n\tstatic override props = groupShapeProps\n\tstatic override migrations = groupShapeMigrations\n\n\toverride hideSelectionBoundsFg() {\n\t\treturn true\n\t}\n\n\toverride canBind() {\n\t\treturn false\n\t}\n\n\tgetDefaultProps(): TLGroupShape['props'] {\n\t\treturn {}\n\t}\n\n\tgetGeometry(shape: TLGroupShape): Geometry2d {\n\t\tconst children = this.editor.getSortedChildIdsForParent(shape.id)\n\t\tif (children.length === 0) {\n\t\t\treturn new Rectangle2d({ width: 1, height: 1, isFilled: false })\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: children.map((childId) => {\n\t\t\t\tconst shape = this.editor.getShape(childId)!\n\t\t\t\treturn this.editor\n\t\t\t\t\t.getShapeGeometry(childId)\n\t\t\t\t\t.transform(this.editor.getShapeLocalTransform(shape)!, { isLabel: false })\n\t\t\t}),\n\t\t})\n\t}\n\n\tcomponent(shape: TLGroupShape) {\n\t\tconst isErasing = this.editor.getErasingShapeIds().includes(shape.id)\n\n\t\tconst { hintingShapeIds } = this.editor.getCurrentPageState()\n\t\tconst isHintingOtherGroup =\n\t\t\thintingShapeIds.length > 0 &&\n\t\t\thintingShapeIds.some(\n\t\t\t\t(id) =>\n\t\t\t\t\tid !== shape.id &&\n\t\t\t\t\tthis.editor.isShapeOfType<TLGroupShape>(this.editor.getShape(id)!, 'group')\n\t\t\t)\n\n\t\tconst isFocused = this.editor.getCurrentPageState().focusedGroupId !== shape.id\n\n\t\tif (\n\t\t\t!isErasing && // always show the outline while we're erasing the group\n\t\t\t// show the outline while the group is focused unless something outside of the group is being hinted\n\t\t\t// this happens dropping shapes from a group onto some outside group\n\t\t\t(isFocused || isHintingOtherGroup)\n\t\t) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\n\t\treturn (\n\t\t\t<SVGContainer>\n\t\t\t\t<DashedOutlineBox className=\"tl-group\" bounds={bounds} />\n\t\t\t</SVGContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLGroupShape) {\n\t\t// Not a class component, but eslint can't tell that :(\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\treturn <DashedOutlineBox className=\"\" bounds={bounds} />\n\t}\n\n\toverride onChildrenChange(group: TLGroupShape) {\n\t\tconst children = this.editor.getSortedChildIdsForParent(group.id)\n\t\tif (children.length === 0) {\n\t\t\tif (this.editor.getCurrentPageState().focusedGroupId === group.id) {\n\t\t\t\tthis.editor.popFocusedGroupId()\n\t\t\t}\n\t\t\tthis.editor.deleteShapes([group.id])\n\t\t\treturn\n\t\t} else if (children.length === 1) {\n\t\t\tif (this.editor.getCurrentPageState().focusedGroupId === group.id) {\n\t\t\t\tthis.editor.popFocusedGroupId()\n\t\t\t}\n\t\t\tthis.editor.reparentShapes(children, group.parentId)\n\t\t\tthis.editor.deleteShapes([group.id])\n\t\t\treturn\n\t\t}\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqEI;AArEJ,sBAAoE;AACpE,0BAA6B;AAE7B,qBAAwB;AACxB,yBAA4B;AAC5B,uBAA0B;AAC1B,8BAAiC;AAG1B,MAAM,uBAAuB,2BAAwB;AAAA,EAC3D,OAAgB,OAAO;AAAA,EACvB,OAAgB,QAAQ;AAAA,EACxB,OAAgB,aAAa;AAAA,EAEpB,wBAAwB;AAChC,WAAO;AAAA,EACR;AAAA,EAES,UAAU;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,kBAAyC;AACxC,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,YAAY,OAAiC;AAC5C,UAAM,WAAW,KAAK,OAAO,2BAA2B,MAAM,EAAE;AAChE,QAAI,SAAS,WAAW,GAAG;AAC1B,aAAO,IAAI,+BAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,MAAM,CAAC;AAAA,IAChE;AAEA,WAAO,IAAI,uBAAQ;AAAA,MAClB,UAAU,SAAS,IAAI,CAAC,YAAY;AACnC,cAAMA,SAAQ,KAAK,OAAO,SAAS,OAAO;AAC1C,eAAO,KAAK,OACV,iBAAiB,OAAO,EACxB,UAAU,KAAK,OAAO,uBAAuBA,MAAK,GAAI,EAAE,SAAS,MAAM,CAAC;AAAA,MAC3E,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,OAAqB;AAC9B,UAAM,YAAY,KAAK,OAAO,mBAAmB,EAAE,SAAS,MAAM,EAAE;AAEpE,UAAM,EAAE,gBAAgB,IAAI,KAAK,OAAO,oBAAoB;AAC5D,UAAM,sBACL,gBAAgB,SAAS,KACzB,gBAAgB;AAAA,MACf,CAAC,OACA,OAAO,MAAM,MACb,KAAK,OAAO,cAA4B,KAAK,OAAO,SAAS,EAAE,GAAI,OAAO;AAAA,IAC5E;AAED,UAAM,YAAY,KAAK,OAAO,oBAAoB,EAAE,mBAAmB,MAAM;AAE7E,QACC,CAAC;AAAA;AAAA;AAAA,KAGA,aAAa,sBACb;AACD,aAAO;AAAA,IACR;AAEA,UAAM,SAAS,KAAK,OAAO,iBAAiB,KAAK,EAAE;AAEnD,WACC,4CAAC,oCACA,sDAAC,4CAAiB,WAAU,YAAW,QAAgB,GACxD;AAAA,EAEF;AAAA,EAEA,UAAU,OAAqB;AAE9B,UAAM,SAAS,KAAK,OAAO,iBAAiB,KAAK,EAAE;AACnD,WAAO,4CAAC,4CAAiB,WAAU,IAAG,QAAgB;AAAA,EACvD;AAAA,EAES,iBAAiB,OAAqB;AAC9C,UAAM,WAAW,KAAK,OAAO,2BAA2B,MAAM,EAAE;AAChE,QAAI,SAAS,WAAW,GAAG;AAC1B,UAAI,KAAK,OAAO,oBAAoB,EAAE,mBAAmB,MAAM,IAAI;AAClE,aAAK,OAAO,kBAAkB;AAAA,MAC/B;AACA,WAAK,OAAO,aAAa,CAAC,MAAM,EAAE,CAAC;AACnC;AAAA,IACD,WAAW,SAAS,WAAW,GAAG;AACjC,UAAI,KAAK,OAAO,oBAAoB,EAAE,mBAAmB,MAAM,IAAI;AAClE,aAAK,OAAO,kBAAkB;AAAA,MAC/B;AACA,WAAK,OAAO,eAAe,UAAU,MAAM,QAAQ;AACnD,WAAK,OAAO,aAAa,CAAC,MAAM,EAAE,CAAC;AACnC;AAAA,IACD;AAAA,EACD;AACD;",
|
|
6
6
|
"names": ["shape"]
|
|
7
7
|
}
|
package/dist-cjs/version.js
CHANGED
|
@@ -22,10 +22,10 @@ __export(version_exports, {
|
|
|
22
22
|
version: () => version
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(version_exports);
|
|
25
|
-
const version = "3.13.0-canary.
|
|
25
|
+
const version = "3.13.0-canary.66687519f459";
|
|
26
26
|
const publishDates = {
|
|
27
27
|
major: "2024-09-13T14:36:29.063Z",
|
|
28
|
-
minor: "2025-05-12T13:
|
|
29
|
-
patch: "2025-05-12T13:
|
|
28
|
+
minor: "2025-05-12T13:38:04.436Z",
|
|
29
|
+
patch: "2025-05-12T13:38:04.436Z"
|
|
30
30
|
};
|
|
31
31
|
//# sourceMappingURL=version.js.map
|
package/dist-cjs/version.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.13.0-canary.
|
|
4
|
+
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.13.0-canary.66687519f459'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-05-12T13:38:04.436Z',\n\tpatch: '2025-05-12T13:38:04.436Z',\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,UAAU;AAChB,MAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-esm/index.d.mts
CHANGED
|
@@ -1560,6 +1560,16 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
1560
1560
|
* @public
|
|
1561
1561
|
*/
|
|
1562
1562
|
selectAll(): this;
|
|
1563
|
+
/**
|
|
1564
|
+
* Select the next shape in the reading order or in cardinal order.
|
|
1565
|
+
*
|
|
1566
|
+
* @example
|
|
1567
|
+
* ```ts
|
|
1568
|
+
* editor.selectAdjacentShape('next')
|
|
1569
|
+
* ```
|
|
1570
|
+
*
|
|
1571
|
+
* @public
|
|
1572
|
+
*/
|
|
1563
1573
|
selectAdjacentShape(direction: TLAdjacentDirection): void;
|
|
1564
1574
|
/**
|
|
1565
1575
|
* Generates a reading order for shapes based on rows grouping.
|
|
@@ -1568,12 +1578,16 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
1568
1578
|
* @public
|
|
1569
1579
|
*/
|
|
1570
1580
|
getCurrentPageShapesInReadingOrder(): TLShape[];
|
|
1581
|
+
private _getShapesInReadingOrder;
|
|
1571
1582
|
/**
|
|
1572
1583
|
* Find the nearest adjacent shape in a specific direction.
|
|
1573
1584
|
*
|
|
1574
1585
|
* @public
|
|
1575
1586
|
*/
|
|
1576
1587
|
getNearestAdjacentShape(currentShapeId: TLShapeId, direction: 'down' | 'left' | 'right' | 'up'): TLShapeId;
|
|
1588
|
+
selectParentShape(): void;
|
|
1589
|
+
selectFirstChildShape(): void;
|
|
1590
|
+
private _selectShapesAndZoom;
|
|
1577
1591
|
/**
|
|
1578
1592
|
* Clear the selection.
|
|
1579
1593
|
*
|
|
@@ -4285,7 +4299,6 @@ export declare class GroupShapeUtil extends ShapeUtil<TLGroupShape> {
|
|
|
4285
4299
|
static type: "group";
|
|
4286
4300
|
static props: RecordProps<TLGroupShape>;
|
|
4287
4301
|
static migrations: TLPropsMigrations;
|
|
4288
|
-
canTabTo(): boolean;
|
|
4289
4302
|
hideSelectionBoundsFg(): boolean;
|
|
4290
4303
|
canBind(): boolean;
|
|
4291
4304
|
getDefaultProps(): TLGroupShape['props'];
|
package/dist-esm/index.mjs
CHANGED
|
@@ -1475,9 +1475,23 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1475
1475
|
this.setSelectedShapes(this._getUnlockedShapeIds(ids));
|
|
1476
1476
|
return this;
|
|
1477
1477
|
}
|
|
1478
|
+
/**
|
|
1479
|
+
* Select the next shape in the reading order or in cardinal order.
|
|
1480
|
+
*
|
|
1481
|
+
* @example
|
|
1482
|
+
* ```ts
|
|
1483
|
+
* editor.selectAdjacentShape('next')
|
|
1484
|
+
* ```
|
|
1485
|
+
*
|
|
1486
|
+
* @public
|
|
1487
|
+
*/
|
|
1478
1488
|
selectAdjacentShape(direction) {
|
|
1479
|
-
const readingOrderShapes = this.getCurrentPageShapesInReadingOrder();
|
|
1480
1489
|
const selectedShapeIds = this.getSelectedShapeIds();
|
|
1490
|
+
const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null;
|
|
1491
|
+
const isSelectedWithinContainer = firstParentId && selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) && !isPageId(firstParentId);
|
|
1492
|
+
const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(
|
|
1493
|
+
this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId)
|
|
1494
|
+
) : this.getCurrentPageShapesInReadingOrder();
|
|
1481
1495
|
const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
|
|
1482
1496
|
let adjacentShapeId;
|
|
1483
1497
|
if (direction === "next" || direction === "prev") {
|
|
@@ -1491,18 +1505,15 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1491
1505
|
}
|
|
1492
1506
|
const shape = this.getShape(adjacentShapeId);
|
|
1493
1507
|
if (!shape) return;
|
|
1494
|
-
this.
|
|
1495
|
-
this.zoomToSelectionIfOffscreen(256, {
|
|
1496
|
-
animation: {
|
|
1497
|
-
duration: this.options.animationMediumMs
|
|
1498
|
-
},
|
|
1499
|
-
inset: 0
|
|
1500
|
-
});
|
|
1508
|
+
this._selectShapesAndZoom([shape.id]);
|
|
1501
1509
|
}
|
|
1502
1510
|
getCurrentPageShapesInReadingOrder() {
|
|
1511
|
+
const shapes = this.getCurrentPageShapes().filter((shape) => isPageId(shape.parentId));
|
|
1512
|
+
return this._getShapesInReadingOrder(shapes);
|
|
1513
|
+
}
|
|
1514
|
+
_getShapesInReadingOrder(shapes) {
|
|
1503
1515
|
const SHALLOW_ANGLE = 20;
|
|
1504
1516
|
const ROW_THRESHOLD = 100;
|
|
1505
|
-
const shapes = this.getCurrentPageShapes();
|
|
1506
1517
|
const tabbableShapes = shapes.filter((shape) => this.getShapeUtil(shape).canTabTo(shape));
|
|
1507
1518
|
if (tabbableShapes.length <= 1) return tabbableShapes;
|
|
1508
1519
|
const shapesWithCenters = tabbableShapes.map((shape) => ({
|
|
@@ -1600,6 +1611,31 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
|
|
|
1600
1611
|
});
|
|
1601
1612
|
return lowestScoringShape.shape.id;
|
|
1602
1613
|
}
|
|
1614
|
+
selectParentShape() {
|
|
1615
|
+
const selectedShape = this.getOnlySelectedShape();
|
|
1616
|
+
if (!selectedShape) return;
|
|
1617
|
+
const parentShape = this.getShape(selectedShape.parentId);
|
|
1618
|
+
if (!parentShape) return;
|
|
1619
|
+
this._selectShapesAndZoom([parentShape.id]);
|
|
1620
|
+
}
|
|
1621
|
+
selectFirstChildShape() {
|
|
1622
|
+
const selectedShapes = this.getSelectedShapes();
|
|
1623
|
+
if (!selectedShapes.length) return;
|
|
1624
|
+
const selectedShape = selectedShapes[0];
|
|
1625
|
+
const children = this.getSortedChildIdsForParent(selectedShape.id).map((id) => this.getShape(id)).filter((i) => i);
|
|
1626
|
+
const sortedChildren = this._getShapesInReadingOrder(children);
|
|
1627
|
+
if (sortedChildren.length === 0) return;
|
|
1628
|
+
this._selectShapesAndZoom([sortedChildren[0].id]);
|
|
1629
|
+
}
|
|
1630
|
+
_selectShapesAndZoom(ids) {
|
|
1631
|
+
this.setSelectedShapes(ids);
|
|
1632
|
+
this.zoomToSelectionIfOffscreen(256, {
|
|
1633
|
+
animation: {
|
|
1634
|
+
duration: this.options.animationMediumMs
|
|
1635
|
+
},
|
|
1636
|
+
inset: 0
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1603
1639
|
/**
|
|
1604
1640
|
* Clear the selection.
|
|
1605
1641
|
*
|