@tldraw/editor 3.15.0-next.39f008bfb627 → 3.15.0-next.82ffd490a4f1

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.
Files changed (110) hide show
  1. package/dist-cjs/index.d.ts +16 -4
  2. package/dist-cjs/index.js +3 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/components/SVGContainer.js +1 -1
  5. package/dist-cjs/lib/components/SVGContainer.js.map +2 -2
  6. package/dist-cjs/lib/components/default-components/DefaultBrush.js +1 -1
  7. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -1
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +1 -1
  11. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultCursor.js +1 -1
  13. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultGrid.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultGrid.js.map +2 -2
  16. package/dist-cjs/lib/components/default-components/DefaultHandles.js +1 -1
  17. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +2 -2
  18. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +1 -1
  19. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  20. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +1 -1
  21. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +2 -2
  22. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +27 -15
  23. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +3 -3
  24. package/dist-cjs/lib/editor/Editor.js +24 -8
  25. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  26. package/dist-cjs/lib/editor/tools/StateNode.js +20 -1
  27. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  28. package/dist-cjs/lib/hooks/useEditorComponents.js.map +1 -1
  29. package/dist-cjs/lib/license/Watermark.js +2 -2
  30. package/dist-cjs/lib/license/Watermark.js.map +2 -2
  31. package/dist-cjs/lib/primitives/geometry/Arc2d.js +1 -1
  32. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  33. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  34. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  35. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +3 -1
  36. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  37. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -1
  38. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  39. package/dist-cjs/lib/primitives/geometry/geometry-constants.js +2 -2
  40. package/dist-cjs/lib/primitives/geometry/geometry-constants.js.map +2 -2
  41. package/dist-cjs/version.js +3 -3
  42. package/dist-cjs/version.js.map +1 -1
  43. package/dist-esm/index.d.mts +16 -4
  44. package/dist-esm/index.mjs +3 -1
  45. package/dist-esm/index.mjs.map +2 -2
  46. package/dist-esm/lib/components/SVGContainer.mjs +1 -1
  47. package/dist-esm/lib/components/SVGContainer.mjs.map +2 -2
  48. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +1 -1
  49. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
  50. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -1
  51. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  52. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +1 -1
  53. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
  54. package/dist-esm/lib/components/default-components/DefaultCursor.mjs +1 -1
  55. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
  56. package/dist-esm/lib/components/default-components/DefaultGrid.mjs +1 -1
  57. package/dist-esm/lib/components/default-components/DefaultGrid.mjs.map +2 -2
  58. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +1 -1
  59. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +2 -2
  60. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -1
  61. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  62. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +1 -1
  63. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +2 -2
  64. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +17 -15
  65. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  66. package/dist-esm/lib/editor/Editor.mjs +24 -8
  67. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  68. package/dist-esm/lib/editor/tools/StateNode.mjs +20 -1
  69. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  70. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +1 -1
  71. package/dist-esm/lib/license/Watermark.mjs +2 -2
  72. package/dist-esm/lib/license/Watermark.mjs.map +2 -2
  73. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  74. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  75. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +2 -2
  76. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  77. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +3 -1
  78. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  79. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +2 -2
  80. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  81. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs +2 -2
  82. package/dist-esm/lib/primitives/geometry/geometry-constants.mjs.map +2 -2
  83. package/dist-esm/version.mjs +3 -3
  84. package/dist-esm/version.mjs.map +1 -1
  85. package/editor.css +17 -4
  86. package/package.json +9 -8
  87. package/src/index.ts +1 -0
  88. package/src/lib/components/SVGContainer.tsx +1 -1
  89. package/src/lib/components/default-components/DefaultBrush.tsx +1 -1
  90. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -1
  91. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -1
  92. package/src/lib/components/default-components/DefaultCursor.tsx +1 -1
  93. package/src/lib/components/default-components/DefaultGrid.tsx +1 -1
  94. package/src/lib/components/default-components/DefaultHandles.tsx +5 -1
  95. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +1 -1
  96. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +1 -1
  97. package/src/lib/components/default-components/DefaultSpinner.tsx +12 -12
  98. package/src/lib/editor/Editor.test.ts +407 -0
  99. package/src/lib/editor/Editor.ts +35 -9
  100. package/src/lib/editor/tools/StateNode.test.ts +285 -0
  101. package/src/lib/editor/tools/StateNode.ts +27 -1
  102. package/src/lib/hooks/useEditorComponents.tsx +1 -1
  103. package/src/lib/license/Watermark.tsx +2 -2
  104. package/src/lib/primitives/geometry/Arc2d.ts +2 -2
  105. package/src/lib/primitives/geometry/Circle2d.ts +2 -2
  106. package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -1
  107. package/src/lib/primitives/geometry/Ellipse2d.ts +2 -2
  108. package/src/lib/primitives/geometry/geometry-constants.ts +2 -1
  109. package/src/version.ts +3 -3
  110. package/src/lib/test/currentToolIdMask.test.ts +0 -49
@@ -1,19 +1,21 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- function DefaultSpinner() {
3
- return /* @__PURE__ */ jsx("svg", { width: 16, height: 16, viewBox: "0 0 16 16", "aria-hidden": "false", children: /* @__PURE__ */ jsxs("g", { strokeWidth: 2, fill: "none", fillRule: "evenodd", children: [
4
- /* @__PURE__ */ jsx("circle", { strokeOpacity: 0.25, cx: 8, cy: 8, r: 7, stroke: "currentColor" }),
5
- /* @__PURE__ */ jsx("path", { strokeLinecap: "round", d: "M15 8c0-4.5-4.5-7-7-7", stroke: "currentColor", children: /* @__PURE__ */ jsx(
6
- "animateTransform",
7
- {
8
- attributeName: "transform",
9
- type: "rotate",
10
- from: "0 8 8",
11
- to: "360 8 8",
12
- dur: "1s",
13
- repeatCount: "indefinite"
14
- }
15
- ) })
16
- ] }) });
2
+ import classNames from "classnames";
3
+ function DefaultSpinner(props) {
4
+ return /* @__PURE__ */ jsx(
5
+ "svg",
6
+ {
7
+ width: 16,
8
+ height: 16,
9
+ viewBox: "0 0 16 16",
10
+ "aria-hidden": "false",
11
+ ...props,
12
+ className: classNames("tl-spinner", props.className),
13
+ children: /* @__PURE__ */ jsxs("g", { strokeWidth: 2, fill: "none", fillRule: "evenodd", children: [
14
+ /* @__PURE__ */ jsx("circle", { strokeOpacity: 0.25, cx: 8, cy: 8, r: 7, stroke: "currentColor" }),
15
+ /* @__PURE__ */ jsx("path", { strokeLinecap: "round", d: "M15 8c0-4.5-4.5-7-7-7", stroke: "currentColor" })
16
+ ] })
17
+ }
18
+ );
17
19
  }
18
20
  export {
19
21
  DefaultSpinner
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/components/default-components/DefaultSpinner.tsx"],
4
- "sourcesContent": ["/** @public @react */\nexport function DefaultSpinner() {\n\treturn (\n\t\t<svg width={16} height={16} viewBox=\"0 0 16 16\" aria-hidden=\"false\">\n\t\t\t<g strokeWidth={2} fill=\"none\" fillRule=\"evenodd\">\n\t\t\t\t<circle strokeOpacity={0.25} cx={8} cy={8} r={7} stroke=\"currentColor\" />\n\t\t\t\t<path strokeLinecap=\"round\" d=\"M15 8c0-4.5-4.5-7-7-7\" stroke=\"currentColor\">\n\t\t\t\t\t<animateTransform\n\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\tfrom=\"0 8 8\"\n\t\t\t\t\t\tto=\"360 8 8\"\n\t\t\t\t\t\tdur=\"1s\"\n\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t/>\n\t\t\t\t</path>\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n"],
5
- "mappings": "AAIG,SACC,KADD;AAHI,SAAS,iBAAiB;AAChC,SACC,oBAAC,SAAI,OAAO,IAAI,QAAQ,IAAI,SAAQ,aAAY,eAAY,SAC3D,+BAAC,OAAE,aAAa,GAAG,MAAK,QAAO,UAAS,WACvC;AAAA,wBAAC,YAAO,eAAe,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,QAAO,gBAAe;AAAA,IACvE,oBAAC,UAAK,eAAc,SAAQ,GAAE,yBAAwB,QAAO,gBAC5D;AAAA,MAAC;AAAA;AAAA,QACA,eAAc;AAAA,QACd,MAAK;AAAA,QACL,MAAK;AAAA,QACL,IAAG;AAAA,QACH,KAAI;AAAA,QACJ,aAAY;AAAA;AAAA,IACb,GACD;AAAA,KACD,GACD;AAEF;",
4
+ "sourcesContent": ["import classNames from 'classnames'\n\n/** @public @react */\nexport function DefaultSpinner(props: React.SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\twidth={16}\n\t\t\theight={16}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\taria-hidden=\"false\"\n\t\t\t{...props}\n\t\t\tclassName={classNames('tl-spinner', props.className)}\n\t\t>\n\t\t\t<g strokeWidth={2} fill=\"none\" fillRule=\"evenodd\">\n\t\t\t\t<circle strokeOpacity={0.25} cx={8} cy={8} r={7} stroke=\"currentColor\" />\n\t\t\t\t<path strokeLinecap=\"round\" d=\"M15 8c0-4.5-4.5-7-7-7\" stroke=\"currentColor\" />\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n"],
5
+ "mappings": "AAaG,SACC,KADD;AAbH,OAAO,gBAAgB;AAGhB,SAAS,eAAe,OAAsC;AACpE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,eAAY;AAAA,MACX,GAAG;AAAA,MACJ,WAAW,WAAW,cAAc,MAAM,SAAS;AAAA,MAEnD,+BAAC,OAAE,aAAa,GAAG,MAAK,QAAO,UAAS,WACvC;AAAA,4BAAC,YAAO,eAAe,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,QAAO,gBAAe;AAAA,QACvE,oBAAC,UAAK,eAAc,SAAQ,GAAE,yBAAwB,QAAO,gBAAe;AAAA,SAC7E;AAAA;AAAA,EACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1466,7 +1466,9 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1466
1466
  return this;
1467
1467
  }
1468
1468
  /**
1469
- * Select all direct children of the current page.
1469
+ * Select all shapes. If the user has selected shapes that share a parent,
1470
+ * select all shapes within that parent. If the user has not selected any shapes,
1471
+ * or if the shapes shapes are only on select all shapes on the current page.
1470
1472
  *
1471
1473
  * @example
1472
1474
  * ```ts
@@ -1476,7 +1478,23 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1476
1478
  * @public
1477
1479
  */
1478
1480
  selectAll() {
1479
- const ids = this.getSortedChildIdsForParent(this.getCurrentPageId());
1481
+ let parentToSelectWithinId = null;
1482
+ const selectedShapeIds = this.getSelectedShapeIds();
1483
+ if (selectedShapeIds.length > 0) {
1484
+ for (const id of selectedShapeIds) {
1485
+ const shape = this.getShape(id);
1486
+ if (!shape) continue;
1487
+ if (parentToSelectWithinId === null) {
1488
+ parentToSelectWithinId = shape.parentId;
1489
+ } else if (parentToSelectWithinId !== shape.parentId) {
1490
+ return this;
1491
+ }
1492
+ }
1493
+ }
1494
+ if (!parentToSelectWithinId) {
1495
+ parentToSelectWithinId = this.getCurrentPageId();
1496
+ }
1497
+ const ids = this.getSortedChildIdsForParent(parentToSelectWithinId);
1480
1498
  if (ids.length <= 0) return this;
1481
1499
  this.setSelectedShapes(this._getUnlockedShapeIds(ids));
1482
1500
  return this;
@@ -1495,9 +1513,8 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1495
1513
  const selectedShapeIds = this.getSelectedShapeIds();
1496
1514
  const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null;
1497
1515
  const isSelectedWithinContainer = firstParentId && selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) && !isPageId(firstParentId);
1498
- const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(
1499
- this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId)
1500
- ) : this.getCurrentPageShapesInReadingOrder();
1516
+ const filteredShapes = isSelectedWithinContainer ? this.getCurrentPageShapes().filter((shape2) => shape2.parentId === firstParentId) : this.getCurrentPageShapes().filter((shape2) => isPageId(shape2.parentId));
1517
+ const readingOrderShapes = isSelectedWithinContainer ? this._getShapesInReadingOrder(filteredShapes) : this.getCurrentPageShapesInReadingOrder();
1501
1518
  const currentShapeId = selectedShapeIds.length === 1 ? selectedShapeIds[0] : readingOrderShapes.find((shape2) => selectedShapeIds.includes(shape2.id))?.id;
1502
1519
  let adjacentShapeId;
1503
1520
  if (direction === "next" || direction === "prev") {
@@ -1507,7 +1524,7 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1507
1524
  adjacentShapeId = shapeIds[adjacentIndex];
1508
1525
  } else {
1509
1526
  if (!currentShapeId) return;
1510
- adjacentShapeId = this.getNearestAdjacentShape(currentShapeId, direction);
1527
+ adjacentShapeId = this.getNearestAdjacentShape(filteredShapes, currentShapeId, direction);
1511
1528
  }
1512
1529
  const shape = this.getShape(adjacentShapeId);
1513
1530
  if (!shape) return;
@@ -1573,11 +1590,10 @@ class Editor extends (_a = EventEmitter, _getIsShapeHiddenCache_dec = [computed]
1573
1590
  *
1574
1591
  * @public
1575
1592
  */
1576
- getNearestAdjacentShape(currentShapeId, direction) {
1593
+ getNearestAdjacentShape(shapes, currentShapeId, direction) {
1577
1594
  const directionToAngle = { right: 0, left: 180, down: 90, up: 270 };
1578
1595
  const currentShape = this.getShape(currentShapeId);
1579
1596
  if (!currentShape) return currentShapeId;
1580
- const shapes = this.getCurrentPageShapes();
1581
1597
  const tabbableShapes = shapes.filter(
1582
1598
  (shape) => this.getShapeUtil(shape).canTabTo(shape) && shape.id !== currentShapeId
1583
1599
  );