@tldraw/editor 3.14.0-canary.783e99a41fc5 → 3.14.0-canary.7b5fb115ed17

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 (207) hide show
  1. package/dist-cjs/index.d.ts +70 -67
  2. package/dist-cjs/index.js +10 -8
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/editor/Editor.js +44 -73
  5. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  6. package/dist-cjs/lib/editor/derivations/bindingsIndex.js +22 -22
  7. package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
  8. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -20
  9. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  10. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +16 -16
  11. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  12. package/dist-cjs/lib/editor/managers/{ClickManager.js → ClickManager/ClickManager.js} +1 -1
  13. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +7 -0
  14. package/dist-cjs/lib/editor/managers/{EdgeScrollManager.js → EdgeScrollManager/EdgeScrollManager.js} +2 -2
  15. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +7 -0
  16. package/dist-cjs/lib/editor/managers/{FocusManager.js → FocusManager/FocusManager.js} +2 -0
  17. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +7 -0
  18. package/dist-cjs/lib/editor/managers/{FontManager.js → FontManager/FontManager.js} +5 -1
  19. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +7 -0
  20. package/dist-cjs/lib/editor/managers/{HistoryManager.js → HistoryManager/HistoryManager.js} +64 -6
  21. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +7 -0
  22. package/dist-cjs/lib/editor/managers/{ScribbleManager.js → ScribbleManager/ScribbleManager.js} +1 -1
  23. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +7 -0
  24. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +7 -0
  25. package/dist-cjs/lib/editor/managers/{TickManager.js → TickManager/TickManager.js} +1 -1
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +7 -0
  27. package/dist-cjs/lib/editor/managers/{UserPreferencesManager.js → UserPreferencesManager/UserPreferencesManager.js} +1 -1
  28. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +7 -0
  29. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +8 -0
  30. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  31. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +6 -0
  32. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/exports/getSvgJsx.js.map +1 -1
  34. package/dist-cjs/lib/primitives/Box.js +39 -33
  35. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  36. package/dist-cjs/lib/primitives/Vec.js +13 -8
  37. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  38. package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
  39. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  40. package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
  41. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  42. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
  43. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  44. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
  45. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  46. package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -17
  47. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  48. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
  49. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  50. package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
  51. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  52. package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
  53. package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
  54. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
  55. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  56. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
  57. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
  58. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
  59. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  60. package/dist-cjs/lib/utils/areShapesContentEqual.js +1 -1
  61. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +2 -2
  62. package/dist-cjs/lib/utils/reorderShapes.js +11 -10
  63. package/dist-cjs/lib/utils/reorderShapes.js.map +2 -2
  64. package/dist-cjs/lib/utils/richText.js.map +1 -1
  65. package/dist-cjs/version.js +3 -3
  66. package/dist-cjs/version.js.map +1 -1
  67. package/dist-esm/index.d.mts +70 -67
  68. package/dist-esm/index.mjs +14 -8
  69. package/dist-esm/index.mjs.map +2 -2
  70. package/dist-esm/lib/editor/Editor.mjs +44 -73
  71. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  72. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs +22 -22
  73. package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
  74. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
  75. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  76. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +16 -16
  77. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/{ClickManager.mjs → ClickManager/ClickManager.mjs} +1 -1
  79. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +7 -0
  80. package/dist-esm/lib/editor/managers/{EdgeScrollManager.mjs → EdgeScrollManager/EdgeScrollManager.mjs} +2 -2
  81. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +7 -0
  82. package/dist-esm/lib/editor/managers/{FocusManager.mjs → FocusManager/FocusManager.mjs} +2 -0
  83. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +7 -0
  84. package/dist-esm/lib/editor/managers/{FontManager.mjs → FontManager/FontManager.mjs} +5 -1
  85. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +7 -0
  86. package/dist-esm/lib/editor/managers/{HistoryManager.mjs → HistoryManager/HistoryManager.mjs} +60 -2
  87. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +7 -0
  88. package/dist-esm/lib/editor/managers/{ScribbleManager.mjs → ScribbleManager/ScribbleManager.mjs} +1 -1
  89. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +7 -0
  90. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +7 -0
  91. package/dist-esm/lib/editor/managers/{TickManager.mjs → TickManager/TickManager.mjs} +1 -1
  92. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +7 -0
  93. package/dist-esm/lib/editor/managers/{UserPreferencesManager.mjs → UserPreferencesManager/UserPreferencesManager.mjs} +1 -1
  94. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +7 -0
  95. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +8 -0
  96. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  97. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +6 -0
  98. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  99. package/dist-esm/lib/exports/getSvgJsx.mjs.map +1 -1
  100. package/dist-esm/lib/primitives/Box.mjs +39 -33
  101. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  102. package/dist-esm/lib/primitives/Vec.mjs +13 -8
  103. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  104. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
  105. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  106. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
  107. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  108. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
  109. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  110. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
  111. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  112. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -17
  113. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  114. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
  115. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  116. package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
  117. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  118. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
  119. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
  120. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
  121. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  122. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
  123. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
  124. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
  125. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  126. package/dist-esm/lib/utils/areShapesContentEqual.mjs +1 -1
  127. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +2 -2
  128. package/dist-esm/lib/utils/reorderShapes.mjs +11 -10
  129. package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
  130. package/dist-esm/lib/utils/richText.mjs.map +1 -1
  131. package/dist-esm/version.mjs +3 -3
  132. package/dist-esm/version.mjs.map +1 -1
  133. package/package.json +7 -7
  134. package/src/index.ts +14 -7
  135. package/src/lib/editor/Editor.test.ts +252 -3
  136. package/src/lib/editor/Editor.ts +47 -75
  137. package/src/lib/editor/derivations/bindingsIndex.ts +27 -26
  138. package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
  139. package/src/lib/editor/derivations/parentsToChildren.ts +28 -25
  140. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +442 -0
  141. package/src/lib/editor/managers/{ClickManager.ts → ClickManager/ClickManager.ts} +3 -3
  142. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +374 -0
  143. package/src/lib/editor/managers/{EdgeScrollManager.ts → EdgeScrollManager/EdgeScrollManager.ts} +3 -3
  144. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +455 -0
  145. package/src/lib/editor/managers/{FocusManager.ts → FocusManager/FocusManager.ts} +3 -1
  146. package/src/lib/editor/managers/FontManager/FontManager.test.ts +263 -0
  147. package/src/lib/editor/managers/{FontManager.ts → FontManager/FontManager.ts} +6 -2
  148. package/src/lib/editor/managers/{HistoryManager.test.ts → HistoryManager/HistoryManager.test.ts} +388 -1
  149. package/src/lib/editor/managers/{HistoryManager.ts → HistoryManager/HistoryManager.ts} +73 -2
  150. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +624 -0
  151. package/src/lib/editor/managers/{ScribbleManager.ts → ScribbleManager/ScribbleManager.ts} +2 -2
  152. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +485 -0
  153. package/src/lib/editor/managers/TextManager/TextManager.test.ts +411 -0
  154. package/src/lib/editor/managers/{TextManager.ts → TextManager/TextManager.ts} +1 -1
  155. package/src/lib/editor/managers/TickManager/TickManager.test.ts +314 -0
  156. package/src/lib/editor/managers/{TickManager.ts → TickManager/TickManager.ts} +2 -2
  157. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +591 -0
  158. package/src/lib/editor/managers/{UserPreferencesManager.ts → UserPreferencesManager/UserPreferencesManager.ts} +2 -2
  159. package/src/lib/editor/shapes/ShapeUtil.ts +10 -1
  160. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +8 -0
  161. package/src/lib/exports/getSvgJsx.tsx +1 -1
  162. package/src/lib/primitives/Box.test.ts +588 -7
  163. package/src/lib/primitives/Box.ts +41 -33
  164. package/src/lib/primitives/Vec.test.ts +2 -2
  165. package/src/lib/primitives/Vec.ts +13 -8
  166. package/src/lib/primitives/geometry/Arc2d.ts +42 -23
  167. package/src/lib/primitives/geometry/Circle2d.ts +12 -12
  168. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
  169. package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
  170. package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
  171. package/src/lib/primitives/geometry/Edge2d.ts +14 -18
  172. package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
  173. package/src/lib/primitives/geometry/Point2d.ts +6 -6
  174. package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
  175. package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
  176. package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
  177. package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
  178. package/src/lib/utils/areShapesContentEqual.ts +2 -1
  179. package/src/lib/utils/reorderShapes.ts +10 -13
  180. package/src/lib/utils/richText.ts +1 -1
  181. package/src/version.ts +3 -3
  182. package/dist-cjs/lib/editor/managers/ClickManager.js.map +0 -7
  183. package/dist-cjs/lib/editor/managers/EdgeScrollManager.js.map +0 -7
  184. package/dist-cjs/lib/editor/managers/FocusManager.js.map +0 -7
  185. package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
  186. package/dist-cjs/lib/editor/managers/HistoryManager.js.map +0 -7
  187. package/dist-cjs/lib/editor/managers/ScribbleManager.js.map +0 -7
  188. package/dist-cjs/lib/editor/managers/Stack.js +0 -82
  189. package/dist-cjs/lib/editor/managers/Stack.js.map +0 -7
  190. package/dist-cjs/lib/editor/managers/TextManager.js.map +0 -7
  191. package/dist-cjs/lib/editor/managers/TickManager.js.map +0 -7
  192. package/dist-cjs/lib/editor/managers/UserPreferencesManager.js.map +0 -7
  193. package/dist-esm/lib/editor/managers/ClickManager.mjs.map +0 -7
  194. package/dist-esm/lib/editor/managers/EdgeScrollManager.mjs.map +0 -7
  195. package/dist-esm/lib/editor/managers/FocusManager.mjs.map +0 -7
  196. package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
  197. package/dist-esm/lib/editor/managers/HistoryManager.mjs.map +0 -7
  198. package/dist-esm/lib/editor/managers/ScribbleManager.mjs.map +0 -7
  199. package/dist-esm/lib/editor/managers/Stack.mjs +0 -62
  200. package/dist-esm/lib/editor/managers/Stack.mjs.map +0 -7
  201. package/dist-esm/lib/editor/managers/TextManager.mjs.map +0 -7
  202. package/dist-esm/lib/editor/managers/TickManager.mjs.map +0 -7
  203. package/dist-esm/lib/editor/managers/UserPreferencesManager.mjs.map +0 -7
  204. package/src/lib/editor/managers/ScribbleManager.test.ts +0 -32
  205. package/src/lib/editor/managers/Stack.ts +0 -71
  206. /package/dist-cjs/lib/editor/managers/{TextManager.js → TextManager/TextManager.js} +0 -0
  207. /package/dist-esm/lib/editor/managers/{TextManager.mjs → TextManager/TextManager.mjs} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/areShapesContentEqual.ts"],
4
- "sourcesContent": ["import { TLShape } from '@tldraw/tlschema'\n\nexport const areShapesContentEqual = (a: TLShape, b: TLShape) =>\n\ta.props === b.props && a.meta === b.meta\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,wBAAwB,CAAC,GAAY,MACjD,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE;",
4
+ "sourcesContent": ["import { TLShape } from '@tldraw/tlschema'\n\n/** @public */\nexport const areShapesContentEqual = (a: TLShape, b: TLShape) =>\n\ta.parentId === b.parentId && a.props === b.props && a.meta === b.meta\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,wBAAwB,CAAC,GAAY,MACjD,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE;",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,6 @@ __export(reorderShapes_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(reorderShapes_exports);
24
24
  var import_utils = require("@tldraw/utils");
25
- var import_intersect = require("../primitives/intersect");
26
25
  function getReorderingShapesChanges(editor, operation, ids, opts) {
27
26
  if (ids.length === 0) return [];
28
27
  const parents = /* @__PURE__ */ new Map();
@@ -112,16 +111,18 @@ function reorderToFront(moving, children, changes) {
112
111
  }
113
112
  }
114
113
  function getOverlapChecker(editor, moving) {
115
- const movingVertices = Array.from(moving).map((shape) => {
116
- const vertices = editor.getShapePageGeometry(shape).vertices;
117
- if (!vertices) return null;
118
- return { shape, vertices };
119
- }).filter(Boolean);
114
+ const movingBounds = (0, import_utils.compact)(
115
+ Array.from(moving).map((shape) => {
116
+ const bounds = editor.getShapePageBounds(shape);
117
+ if (!bounds) return null;
118
+ return { shape, bounds };
119
+ })
120
+ );
120
121
  const isOverlapping = (child) => {
121
- const vertices = editor.getShapePageGeometry(child).vertices;
122
- if (!vertices) return false;
123
- return movingVertices.some((other) => {
124
- return (0, import_intersect.polygonsIntersect)(other.vertices, vertices);
122
+ const bounds = editor.getShapePageBounds(child);
123
+ if (!bounds) return false;
124
+ return movingBounds.some((other) => {
125
+ return other.bounds.includes(bounds);
125
126
  });
126
127
  };
127
128
  return isOverlapping;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/reorderShapes.ts"],
4
- "sourcesContent": ["import { TLParentId, TLShape, TLShapeId, TLShapePartial } from '@tldraw/tlschema'\nimport { IndexKey, compact, getIndicesBetween, sortByIndex } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { Vec } from '../primitives/Vec'\nimport { polygonsIntersect } from '../primitives/intersect'\n\nexport function getReorderingShapesChanges(\n\teditor: Editor,\n\toperation: 'toBack' | 'toFront' | 'forward' | 'backward',\n\tids: TLShapeId[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tif (ids.length === 0) return []\n\n\t// From the ids that are moving, collect the parents, their children, and which of those children are moving\n\tconst parents = new Map<TLParentId, { moving: Set<TLShape>; children: TLShape[] }>()\n\n\tfor (const shape of compact(ids.map((id) => editor.getShape(id)))) {\n\t\tconst { parentId } = shape\n\t\tif (!parents.has(parentId)) {\n\t\t\tparents.set(parentId, {\n\t\t\t\tchildren: compact(\n\t\t\t\t\teditor.getSortedChildIdsForParent(parentId).map((id) => editor.getShape(id))\n\t\t\t\t),\n\t\t\t\tmoving: new Set(),\n\t\t\t})\n\t\t}\n\t\tparents.get(parentId)!.moving.add(shape)\n\t}\n\n\tconst changes: TLShapePartial[] = []\n\n\tswitch (operation) {\n\t\tcase 'toBack': {\n\t\t\tparents.forEach(({ moving, children }) => reorderToBack(moving, children, changes))\n\t\t\tbreak\n\t\t}\n\t\tcase 'toFront': {\n\t\t\tparents.forEach(({ moving, children }) => reorderToFront(moving, children, changes))\n\t\t\tbreak\n\t\t}\n\t\tcase 'forward': {\n\t\t\tparents.forEach(({ moving, children }) =>\n\t\t\t\treorderForward(editor, moving, children, changes, opts)\n\t\t\t)\n\t\t\tbreak\n\t\t}\n\t\tcase 'backward': {\n\t\t\tparents.forEach(({ moving, children }) =>\n\t\t\t\treorderBackward(editor, moving, children, changes, opts)\n\t\t\t)\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn changes\n}\n\n/**\n * Reorders the moving shapes to the back of the parent's children.\n *\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n */\nfunction reorderToBack(moving: Set<TLShape>, children: TLShape[], changes: TLShapePartial[]) {\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet below: IndexKey | undefined\n\tlet above: IndexKey | undefined\n\n\t// Starting at the bottom of this parent's children...\n\tfor (let i = 0; i < len; i++) {\n\t\tconst shape = children[i]\n\n\t\tif (moving.has(shape)) {\n\t\t\t// If we've found a moving shape before we've found a non-moving shape,\n\t\t\t// then that shape is already at the back; we can remove it from the\n\t\t\t// moving set and mark it as the shape that will be below the moved shapes.\n\t\t\tbelow = shape.index\n\t\t\tmoving.delete(shape)\n\t\t} else {\n\t\t\t// The first non-moving shape we find will be above our moved shapes; we'll\n\t\t\t// put our moving shapes between it and the shape marked as below (if any).\n\t\t\tabove = shape.index\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (moving.size === 0) {\n\t\t// If our moving set is empty, there's nothing to do; all of our shapes were\n\t\t// already at the back of the parent's children.\n\t\treturn\n\t} else {\n\t\t// Sort the moving shapes by their current index, then apply the new indices\n\t\tconst indices = getIndicesBetween(below, above, moving.size)\n\t\tchanges.push(\n\t\t\t...Array.from(moving.values())\n\t\t\t\t.sort(sortByIndex)\n\t\t\t\t.map((shape, i) => ({ ...shape, index: indices[i] }))\n\t\t)\n\t}\n}\n\n/**\n * Reorders the moving shapes to the front of the parent's children.\n *\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n */\nfunction reorderToFront(moving: Set<TLShape>, children: TLShape[], changes: TLShapePartial[]) {\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet below: IndexKey | undefined\n\tlet above: IndexKey | undefined\n\n\t// Starting at the top of this parent's children...\n\tfor (let i = len - 1; i > -1; i--) {\n\t\tconst shape = children[i]\n\n\t\tif (moving.has(shape)) {\n\t\t\t// If we've found a moving shape before we've found a non-moving shape,\n\t\t\t// then that shape is already at the front; we can remove it from the\n\t\t\t// moving set and mark it as the shape that will be above the moved shapes.\n\t\t\tabove = shape.index\n\t\t\tmoving.delete(shape)\n\t\t} else {\n\t\t\t// The first non-moving shape we find will be below our moved shapes; we'll\n\t\t\t// put our moving shapes between it and the shape marked as above (if any).\n\t\t\tbelow = shape.index\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (moving.size === 0) {\n\t\t// If our moving set is empty, there's nothing to do; all of our shapes were\n\t\t// already at the front of the parent's children.\n\t\treturn\n\t} else {\n\t\t// Sort the moving shapes by their current index, then apply the new indices\n\t\tconst indices = getIndicesBetween(below, above, moving.size)\n\t\tchanges.push(\n\t\t\t...Array.from(moving.values())\n\t\t\t\t.sort(sortByIndex)\n\t\t\t\t.map((shape, i) => ({ ...shape, index: indices[i] }))\n\t\t)\n\t}\n}\n\nfunction getOverlapChecker(editor: Editor, moving: Set<TLShape>) {\n\tconst movingVertices = Array.from(moving)\n\t\t.map((shape) => {\n\t\t\tconst vertices = editor.getShapePageGeometry(shape).vertices\n\t\t\tif (!vertices) return null\n\t\t\treturn { shape, vertices }\n\t\t})\n\t\t.filter(Boolean) as { shape: TLShape; vertices: Vec[] }[]\n\n\tconst isOverlapping = (child: TLShape) => {\n\t\tconst vertices = editor.getShapePageGeometry(child).vertices\n\t\tif (!vertices) return false\n\t\treturn movingVertices.some((other) => {\n\t\t\treturn polygonsIntersect(other.vertices, vertices)\n\t\t})\n\t}\n\n\treturn isOverlapping\n}\n\n/**\n * Reorders the moving shapes forward in the parent's children.\n *\n * @param editor The editor\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n * @param opts The options\n */\nfunction reorderForward(\n\teditor: Editor,\n\tmoving: Set<TLShape>,\n\tchildren: TLShape[],\n\tchanges: TLShapePartial[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tconst isOverlapping = getOverlapChecker(editor, moving)\n\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet state = { name: 'skipping' } as\n\t\t| { name: 'skipping' }\n\t\t| { name: 'selecting'; selectIndex: number }\n\n\t// Starting at the bottom of this parent's children...\n\tfor (let i = 0; i < len; i++) {\n\t\tconst isMoving = moving.has(children[i])\n\n\t\tswitch (state.name) {\n\t\t\tcase 'skipping': {\n\t\t\t\tif (!isMoving) continue\n\t\t\t\t// If we find a moving shape while skipping, start selecting\n\t\t\t\tstate = { name: 'selecting', selectIndex: i }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'selecting': {\n\t\t\t\tif (isMoving) continue\n\t\t\t\tif (!opts?.considerAllShapes && !isOverlapping(children[i])) continue\n\t\t\t\t// if we find a non-moving and overlapping shape while selecting, move all selected\n\t\t\t\t// shapes in front of the not moving shape; and start skipping\n\t\t\t\tconst { selectIndex } = state\n\t\t\t\tgetIndicesBetween(children[i].index, children[i + 1]?.index, i - selectIndex).forEach(\n\t\t\t\t\t(index, k) => {\n\t\t\t\t\t\tconst child = children[selectIndex + k]\n\t\t\t\t\t\t// If the shape is not moving (therefore also not overlapping), skip it\n\t\t\t\t\t\tif (!moving.has(child)) return\n\t\t\t\t\t\tchanges.push({ ...child, index })\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tstate = { name: 'skipping' }\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Reorders the moving shapes backward in the parent's children.\n *\n * @param editor The editor\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n * @param opts The options\n */\nfunction reorderBackward(\n\teditor: Editor,\n\tmoving: Set<TLShape>,\n\tchildren: TLShape[],\n\tchanges: TLShapePartial[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tconst isOverlapping = getOverlapChecker(editor, moving)\n\n\tconst len = children.length\n\n\tif (moving.size === len) return\n\n\tlet state = { name: 'skipping' } as\n\t\t| { name: 'skipping' }\n\t\t| { name: 'selecting'; selectIndex: number }\n\n\t// Starting at the top of this parent's children...\n\tfor (let i = len - 1; i > -1; i--) {\n\t\tconst isMoving = moving.has(children[i])\n\n\t\tswitch (state.name) {\n\t\t\tcase 'skipping': {\n\t\t\t\tif (!isMoving) continue\n\t\t\t\t// If we find a moving shape while skipping, start selecting\n\t\t\t\tstate = { name: 'selecting', selectIndex: i }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'selecting': {\n\t\t\t\tif (isMoving) continue\n\t\t\t\tif (!opts?.considerAllShapes && !isOverlapping(children[i])) continue\n\t\t\t\t// if we find a non-moving and overlapping shape while selecting, move all selected\n\t\t\t\t// shapes in behind of the not moving shape; and start skipping\n\t\t\t\tgetIndicesBetween(children[i - 1]?.index, children[i].index, state.selectIndex - i).forEach(\n\t\t\t\t\t(index, k) => {\n\t\t\t\t\t\tconst child = children[i + k + 1]\n\t\t\t\t\t\t// If the shape is not moving (therefore also not overlapping), skip it\n\t\t\t\t\t\tif (!moving.has(child)) return\n\t\t\t\t\t\tchanges.push({ ...child, index })\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tstate = { name: 'skipping' }\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { TLParentId, TLShape, TLShapeId, TLShapePartial } from '@tldraw/tlschema'\nimport { IndexKey, compact, getIndicesBetween, sortByIndex } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\n\nexport function getReorderingShapesChanges(\n\teditor: Editor,\n\toperation: 'toBack' | 'toFront' | 'forward' | 'backward',\n\tids: TLShapeId[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tif (ids.length === 0) return []\n\n\t// From the ids that are moving, collect the parents, their children, and which of those children are moving\n\tconst parents = new Map<TLParentId, { moving: Set<TLShape>; children: TLShape[] }>()\n\n\tfor (const shape of compact(ids.map((id) => editor.getShape(id)))) {\n\t\tconst { parentId } = shape\n\t\tif (!parents.has(parentId)) {\n\t\t\tparents.set(parentId, {\n\t\t\t\tchildren: compact(\n\t\t\t\t\teditor.getSortedChildIdsForParent(parentId).map((id) => editor.getShape(id))\n\t\t\t\t),\n\t\t\t\tmoving: new Set(),\n\t\t\t})\n\t\t}\n\t\tparents.get(parentId)!.moving.add(shape)\n\t}\n\n\tconst changes: TLShapePartial[] = []\n\n\tswitch (operation) {\n\t\tcase 'toBack': {\n\t\t\tparents.forEach(({ moving, children }) => reorderToBack(moving, children, changes))\n\t\t\tbreak\n\t\t}\n\t\tcase 'toFront': {\n\t\t\tparents.forEach(({ moving, children }) => reorderToFront(moving, children, changes))\n\t\t\tbreak\n\t\t}\n\t\tcase 'forward': {\n\t\t\tparents.forEach(({ moving, children }) =>\n\t\t\t\treorderForward(editor, moving, children, changes, opts)\n\t\t\t)\n\t\t\tbreak\n\t\t}\n\t\tcase 'backward': {\n\t\t\tparents.forEach(({ moving, children }) =>\n\t\t\t\treorderBackward(editor, moving, children, changes, opts)\n\t\t\t)\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn changes\n}\n\n/**\n * Reorders the moving shapes to the back of the parent's children.\n *\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n */\nfunction reorderToBack(moving: Set<TLShape>, children: TLShape[], changes: TLShapePartial[]) {\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet below: IndexKey | undefined\n\tlet above: IndexKey | undefined\n\n\t// Starting at the bottom of this parent's children...\n\tfor (let i = 0; i < len; i++) {\n\t\tconst shape = children[i]\n\n\t\tif (moving.has(shape)) {\n\t\t\t// If we've found a moving shape before we've found a non-moving shape,\n\t\t\t// then that shape is already at the back; we can remove it from the\n\t\t\t// moving set and mark it as the shape that will be below the moved shapes.\n\t\t\tbelow = shape.index\n\t\t\tmoving.delete(shape)\n\t\t} else {\n\t\t\t// The first non-moving shape we find will be above our moved shapes; we'll\n\t\t\t// put our moving shapes between it and the shape marked as below (if any).\n\t\t\tabove = shape.index\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (moving.size === 0) {\n\t\t// If our moving set is empty, there's nothing to do; all of our shapes were\n\t\t// already at the back of the parent's children.\n\t\treturn\n\t} else {\n\t\t// Sort the moving shapes by their current index, then apply the new indices\n\t\tconst indices = getIndicesBetween(below, above, moving.size)\n\t\tchanges.push(\n\t\t\t...Array.from(moving.values())\n\t\t\t\t.sort(sortByIndex)\n\t\t\t\t.map((shape, i) => ({ ...shape, index: indices[i] }))\n\t\t)\n\t}\n}\n\n/**\n * Reorders the moving shapes to the front of the parent's children.\n *\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n */\nfunction reorderToFront(moving: Set<TLShape>, children: TLShape[], changes: TLShapePartial[]) {\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet below: IndexKey | undefined\n\tlet above: IndexKey | undefined\n\n\t// Starting at the top of this parent's children...\n\tfor (let i = len - 1; i > -1; i--) {\n\t\tconst shape = children[i]\n\n\t\tif (moving.has(shape)) {\n\t\t\t// If we've found a moving shape before we've found a non-moving shape,\n\t\t\t// then that shape is already at the front; we can remove it from the\n\t\t\t// moving set and mark it as the shape that will be above the moved shapes.\n\t\t\tabove = shape.index\n\t\t\tmoving.delete(shape)\n\t\t} else {\n\t\t\t// The first non-moving shape we find will be below our moved shapes; we'll\n\t\t\t// put our moving shapes between it and the shape marked as above (if any).\n\t\t\tbelow = shape.index\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (moving.size === 0) {\n\t\t// If our moving set is empty, there's nothing to do; all of our shapes were\n\t\t// already at the front of the parent's children.\n\t\treturn\n\t} else {\n\t\t// Sort the moving shapes by their current index, then apply the new indices\n\t\tconst indices = getIndicesBetween(below, above, moving.size)\n\t\tchanges.push(\n\t\t\t...Array.from(moving.values())\n\t\t\t\t.sort(sortByIndex)\n\t\t\t\t.map((shape, i) => ({ ...shape, index: indices[i] }))\n\t\t)\n\t}\n}\n\nfunction getOverlapChecker(editor: Editor, moving: Set<TLShape>) {\n\tconst movingBounds = compact(\n\t\tArray.from(moving).map((shape) => {\n\t\t\tconst bounds = editor.getShapePageBounds(shape)\n\t\t\tif (!bounds) return null\n\t\t\treturn { shape, bounds }\n\t\t})\n\t)\n\tconst isOverlapping = (child: TLShape) => {\n\t\tconst bounds = editor.getShapePageBounds(child)\n\t\tif (!bounds) return false\n\t\treturn movingBounds.some((other) => {\n\t\t\treturn other.bounds.includes(bounds)\n\t\t})\n\t}\n\n\treturn isOverlapping\n}\n\n/**\n * Reorders the moving shapes forward in the parent's children.\n *\n * @param editor The editor\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n * @param opts The options\n */\nfunction reorderForward(\n\teditor: Editor,\n\tmoving: Set<TLShape>,\n\tchildren: TLShape[],\n\tchanges: TLShapePartial[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tconst isOverlapping = getOverlapChecker(editor, moving)\n\n\tconst len = children.length\n\n\t// If all of the children are moving, there's nothing to do\n\tif (moving.size === len) return\n\n\tlet state = { name: 'skipping' } as\n\t\t| { name: 'skipping' }\n\t\t| { name: 'selecting'; selectIndex: number }\n\n\t// Starting at the bottom of this parent's children...\n\tfor (let i = 0; i < len; i++) {\n\t\tconst isMoving = moving.has(children[i])\n\n\t\tswitch (state.name) {\n\t\t\tcase 'skipping': {\n\t\t\t\tif (!isMoving) continue\n\t\t\t\t// If we find a moving shape while skipping, start selecting\n\t\t\t\tstate = { name: 'selecting', selectIndex: i }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'selecting': {\n\t\t\t\tif (isMoving) continue\n\t\t\t\tif (!opts?.considerAllShapes && !isOverlapping(children[i])) continue\n\t\t\t\t// if we find a non-moving and overlapping shape while selecting, move all selected\n\t\t\t\t// shapes in front of the not moving shape; and start skipping\n\t\t\t\tconst { selectIndex } = state\n\t\t\t\tgetIndicesBetween(children[i].index, children[i + 1]?.index, i - selectIndex).forEach(\n\t\t\t\t\t(index, k) => {\n\t\t\t\t\t\tconst child = children[selectIndex + k]\n\t\t\t\t\t\t// If the shape is not moving (therefore also not overlapping), skip it\n\t\t\t\t\t\tif (!moving.has(child)) return\n\t\t\t\t\t\tchanges.push({ ...child, index })\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tstate = { name: 'skipping' }\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Reorders the moving shapes backward in the parent's children.\n *\n * @param editor The editor\n * @param moving The set of shapes that are moving\n * @param children The parent's children\n * @param changes The changes array to push changes to\n * @param opts The options\n */\nfunction reorderBackward(\n\teditor: Editor,\n\tmoving: Set<TLShape>,\n\tchildren: TLShape[],\n\tchanges: TLShapePartial[],\n\topts?: { considerAllShapes?: boolean }\n) {\n\tconst isOverlapping = getOverlapChecker(editor, moving)\n\n\tconst len = children.length\n\n\tif (moving.size === len) return\n\n\tlet state = { name: 'skipping' } as\n\t\t| { name: 'skipping' }\n\t\t| { name: 'selecting'; selectIndex: number }\n\n\t// Starting at the top of this parent's children...\n\tfor (let i = len - 1; i > -1; i--) {\n\t\tconst isMoving = moving.has(children[i])\n\n\t\tswitch (state.name) {\n\t\t\tcase 'skipping': {\n\t\t\t\tif (!isMoving) continue\n\t\t\t\t// If we find a moving shape while skipping, start selecting\n\t\t\t\tstate = { name: 'selecting', selectIndex: i }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'selecting': {\n\t\t\t\tif (isMoving) continue\n\t\t\t\tif (!opts?.considerAllShapes && !isOverlapping(children[i])) continue\n\t\t\t\t// if we find a non-moving and overlapping shape while selecting, move all selected\n\t\t\t\t// shapes in behind of the not moving shape; and start skipping\n\t\t\t\tgetIndicesBetween(children[i - 1]?.index, children[i].index, state.selectIndex - i).forEach(\n\t\t\t\t\t(index, k) => {\n\t\t\t\t\t\tconst child = children[i + k + 1]\n\t\t\t\t\t\t// If the shape is not moving (therefore also not overlapping), skip it\n\t\t\t\t\t\tif (!moving.has(child)) return\n\t\t\t\t\t\tchanges.push({ ...child, index })\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tstate = { name: 'skipping' }\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/richText.ts"],
4
- "sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getSchema(tipTapConfig.extensions ?? [])\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
4
+ "sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getSchema(tipTapConfig.extensions ?? [])\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2D;AAC3D,mBAAqB;AAGrB,mBAAuB;AAsChB,SAAS,qBACf,QACA,UACA,cACC;AACD,QAAM,EAAE,cAAc,iBAAiB,IAAI,OAAO,eAAe;AACjE,2BAAO,cAAc,uDAAuD;AAC5E,2BAAO,kBAAkB,2DAA2D;AAEpF,QAAM,aAAS,uBAAU,aAAa,cAAc,CAAC,CAAC;AACtD,QAAM,WAAW,kBAAK,SAAS,QAAQ,QAAuB;AAE9D,QAAM,QAAQ,oBAAI,IAAgB;AAElC,WAAS,QAAQ,MAAkB;AAClC,UAAM,IAAI,IAAI;AAAA,EACf;AAEA,WAAS,MAAM,MAAkB,OAAiC;AACjE,YAAQ,iBAAkB,MAAM,OAAO,OAAO;AAE9C,eAAW,SAAS,KAAK,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACnB;AAAA,EACD;AAEA,QAAM,UAAU,YAAY;AAE5B,SAAO,MAAM,KAAK,KAAK;AACxB;",
6
6
  "names": []
7
7
  }
@@ -22,10 +22,10 @@ __export(version_exports, {
22
22
  version: () => version
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- const version = "3.14.0-canary.783e99a41fc5";
25
+ const version = "3.14.0-canary.7b5fb115ed17";
26
26
  const publishDates = {
27
27
  major: "2024-09-13T14:36:29.063Z",
28
- minor: "2025-05-23T15:28:41.705Z",
29
- patch: "2025-05-23T15:28:41.705Z"
28
+ minor: "2025-06-10T07:39:27.416Z",
29
+ patch: "2025-06-10T07:39:27.416Z"
30
30
  };
31
31
  //# sourceMappingURL=version.js.map
@@ -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.14.0-canary.783e99a41fc5'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-05-23T15:28:41.705Z',\n\tpatch: '2025-05-23T15:28:41.705Z',\n}\n"],
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.14.0-canary.7b5fb115ed17'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-06-10T07:39:27.416Z',\n\tpatch: '2025-06-10T07:39:27.416Z',\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
  }
@@ -105,15 +105,15 @@ export declare function approximately(a: number, b: number, precision?: number):
105
105
 
106
106
  /** @public */
107
107
  export declare class Arc2d extends Geometry2d {
108
- _center: Vec;
109
- radius: number;
110
- start: Vec;
111
- end: Vec;
112
- largeArcFlag: number;
113
- sweepFlag: number;
114
- measure: number;
115
- angleStart: number;
116
- angleEnd: number;
108
+ private _center;
109
+ private _radius;
110
+ private _start;
111
+ private _end;
112
+ private _largeArcFlag;
113
+ private _sweepFlag;
114
+ private _measure;
115
+ private _angleStart;
116
+ private _angleEnd;
117
117
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & {
118
118
  center: Vec;
119
119
  end: Vec;
@@ -138,6 +138,9 @@ export declare class Arc2d extends Geometry2d {
138
138
  */
139
139
  export declare function areAnglesCompatible(a: number, b: number): boolean;
140
140
 
141
+ /** @public */
142
+ export declare const areShapesContentEqual: (a: TLShape, b: TLShape) => boolean;
143
+
141
144
  /** @public */
142
145
  export declare function average(A: VecLike, B: VecLike): string;
143
146
 
@@ -514,6 +517,8 @@ export declare class Box {
514
517
  };
515
518
  equals(other: Box | BoxModel): boolean;
516
519
  static Equals(a: Box | BoxModel, b: Box | BoxModel): boolean;
520
+ prettyMuchEquals(other: Box | BoxModel): boolean;
521
+ static PrettyMuchEquals(a: Box | BoxModel, b: Box | BoxModel): boolean;
517
522
  zeroFix(): this;
518
523
  static ZeroFix(other: Box | BoxModel): Box;
519
524
  }
@@ -551,10 +556,10 @@ export declare class Circle2d extends Geometry2d {
551
556
  x?: number;
552
557
  y?: number;
553
558
  };
554
- _center: Vec;
555
- radius: number;
556
- x: number;
557
- y: number;
559
+ private _center;
560
+ private _radius;
561
+ private _x;
562
+ private _y;
558
563
  constructor(config: Omit<Geometry2dOptions, 'isClosed'> & {
559
564
  isFilled: boolean;
560
565
  radius: number;
@@ -716,10 +721,10 @@ export declare function createTLUser(opts?: {
716
721
 
717
722
  /** @public */
718
723
  export declare class CubicBezier2d extends Polyline2d {
719
- a: Vec;
720
- b: Vec;
721
- c: Vec;
722
- d: Vec;
724
+ private _a;
725
+ private _b;
726
+ private _c;
727
+ private _d;
723
728
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & {
724
729
  cp1: Vec;
725
730
  cp2: Vec;
@@ -727,20 +732,19 @@ export declare class CubicBezier2d extends Polyline2d {
727
732
  start: Vec;
728
733
  });
729
734
  getVertices(): Vec[];
730
- midPoint(): Vec;
731
735
  nearestPoint(A: VecLike): Vec;
732
736
  getSvgPathData(first?: boolean): string;
733
737
  static GetAtT(segment: CubicBezier2d, t: number): Vec;
734
- getLength(filters?: Geometry2dFilters, precision?: number): number;
738
+ getLength(_filters?: Geometry2dFilters, precision?: number): number;
735
739
  }
736
740
 
737
741
  /** @public */
738
742
  export declare class CubicSpline2d extends Geometry2d {
739
- points: Vec[];
743
+ private _points;
740
744
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & {
741
745
  points: Vec[];
742
746
  });
743
- _segments?: CubicBezier2d[];
747
+ private _segments?;
744
748
  get segments(): CubicBezier2d[];
745
749
  getLength(): number;
746
750
  getVertices(): Vec[];
@@ -927,17 +931,16 @@ export declare const EASINGS: {
927
931
 
928
932
  /** @public */
929
933
  export declare class Edge2d extends Geometry2d {
930
- start: Vec;
931
- end: Vec;
932
- d: Vec;
933
- u: Vec;
934
- ul: number;
934
+ private _start;
935
+ private _end;
936
+ private _d;
937
+ private _u;
938
+ private _ul;
935
939
  constructor(config: {
936
940
  end: Vec;
937
941
  start: Vec;
938
942
  });
939
943
  getLength(): number;
940
- midPoint(): Vec;
941
944
  getVertices(): Vec[];
942
945
  nearestPoint(point: VecLike): Vec;
943
946
  getSvgPathData(first?: boolean): string;
@@ -2457,23 +2460,6 @@ export declare class Editor extends EventEmitter<TLEventMap> {
2457
2460
  * @public
2458
2461
  */
2459
2462
  getShapeGeometry<T extends Geometry2d>(shape: TLShape | TLShapeId, opts?: TLGeometryOpts): T;
2460
- private _shapePageGeometryCaches;
2461
- /**
2462
- * Get the geometry of a shape in page-space.
2463
- *
2464
- * @example
2465
- * ```ts
2466
- * editor.getShapePageGeometry(myShape)
2467
- * editor.getShapePageGeometry(myShapeId)
2468
- * editor.getShapePageGeometry(myShapeId, { context: "arrow" })
2469
- * ```
2470
- *
2471
- * @param shape - The shape (or shape id) to get the geometry for.
2472
- * @param opts - Additional options about the request for geometry. Passed to {@link ShapeUtil.getGeometry}.
2473
- *
2474
- * @public
2475
- */
2476
- getShapePageGeometry<T extends Geometry2d>(shape: TLShape | TLShapeId, opts?: TLGeometryOpts): T;
2477
2463
  /* Excluded from this release type: _getShapeHandlesCache */
2478
2464
  /**
2479
2465
  * Get the handles (if any) for a shape.
@@ -2651,11 +2637,16 @@ export declare class Editor extends EventEmitter<TLEventMap> {
2651
2637
  *
2652
2638
  * @public
2653
2639
  */
2654
- isShapeOrAncestorLocked(shape?: TLShape): boolean;
2655
- isShapeOrAncestorLocked(id?: TLShapeId): boolean;
2640
+ isShapeOrAncestorLocked(shape?: TLShape | TLShapeId): boolean;
2641
+ /**
2642
+ * Get shapes that are outside of the viewport.
2643
+ *
2644
+ * @public
2645
+ */
2646
+ getNotVisibleShapes(): Set<TLShapeId>;
2656
2647
  private _notVisibleShapes;
2657
2648
  /**
2658
- * Get culled shapes.
2649
+ * Get culled shapes (those that should not render), taking into account which shapes are selected or editing.
2659
2650
  *
2660
2651
  * @public
2661
2652
  */
@@ -2697,12 +2688,14 @@ export declare class Editor extends EventEmitter<TLEventMap> {
2697
2688
  * @example
2698
2689
  * ```ts
2699
2690
  * editor.getShapesAtPoint({ x: 100, y: 100 })
2700
- * editor.getShapesAtPoint({ x: 100, y: 100 }, { hitInside: true, exact: true })
2691
+ * editor.getShapesAtPoint({ x: 100, y: 100 }, { hitInside: true, margin: 8 })
2701
2692
  * ```
2702
2693
  *
2703
2694
  * @param point - The page point to test.
2704
2695
  * @param opts - The options for the hit point testing.
2705
2696
  *
2697
+ * @returns An array of shapes at the given point, sorted in reverse order of their absolute z-index (top-most shape first).
2698
+ *
2706
2699
  * @public
2707
2700
  */
2708
2701
  getShapesAtPoint(point: VecLike, opts?: {
@@ -3996,13 +3989,13 @@ export declare class Ellipse2d extends Geometry2d {
3996
3989
  height: number;
3997
3990
  width: number;
3998
3991
  };
3999
- w: number;
4000
- h: number;
3992
+ private _w;
3993
+ private _h;
3994
+ private _edges?;
4001
3995
  constructor(config: Omit<Geometry2dOptions, 'isClosed'> & {
4002
3996
  height: number;
4003
3997
  width: number;
4004
3998
  });
4005
- _edges?: Edge2d[];
4006
3999
  get edges(): Edge2d[];
4007
4000
  getVertices(): any[];
4008
4001
  nearestPoint(A: VecLike): Vec;
@@ -4300,6 +4293,8 @@ export declare class GroupShapeUtil extends ShapeUtil<TLGroupShape> {
4300
4293
  static migrations: TLPropsMigrations;
4301
4294
  hideSelectionBoundsFg(): boolean;
4302
4295
  canBind(): boolean;
4296
+ canResize(): boolean;
4297
+ canResizeChildren(): boolean;
4303
4298
  getDefaultProps(): TLGroupShape['props'];
4304
4299
  getGeometry(shape: TLGroupShape): Geometry2d;
4305
4300
  component(shape: TLGroupShape): JSX_2.Element | null;
@@ -4685,7 +4680,7 @@ export declare const PI2: number;
4685
4680
 
4686
4681
  /** @public */
4687
4682
  export declare class Point2d extends Geometry2d {
4688
- point: Vec;
4683
+ private _point;
4689
4684
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & {
4690
4685
  margin: number;
4691
4686
  point: Vec;
@@ -4729,12 +4724,12 @@ export declare function polygonsIntersect(a: VecLike[], b: VecLike[]): boolean;
4729
4724
 
4730
4725
  /** @public */
4731
4726
  export declare class Polyline2d extends Geometry2d {
4732
- points: Vec[];
4727
+ private _points;
4728
+ private _segments?;
4733
4729
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & {
4734
4730
  points: Vec[];
4735
4731
  });
4736
- _segments?: Edge2d[];
4737
- get segments(): Edge2d[];
4732
+ protected get segments(): Edge2d[];
4738
4733
  getLength(): number;
4739
4734
  getVertices(): Vec[];
4740
4735
  nearestPoint(A: VecLike): Vec;
@@ -4800,10 +4795,10 @@ export declare class ReadonlySharedStyleMap {
4800
4795
 
4801
4796
  /** @public */
4802
4797
  export declare class Rectangle2d extends Polygon2d {
4803
- x: number;
4804
- y: number;
4805
- w: number;
4806
- h: number;
4798
+ private _x;
4799
+ private _y;
4800
+ private _w;
4801
+ private _h;
4807
4802
  constructor(config: Omit<Geometry2dOptions, 'isClosed'> & {
4808
4803
  height: number;
4809
4804
  width: number;
@@ -4812,6 +4807,7 @@ export declare class Rectangle2d extends Polygon2d {
4812
4807
  });
4813
4808
  getBounds(): Box;
4814
4809
  getSvgPathData(): string;
4810
+ private negativeZeroFix;
4815
4811
  }
4816
4812
 
4817
4813
  /** @public */
@@ -5097,6 +5093,12 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
5097
5093
  * @public
5098
5094
  */
5099
5095
  canResize(_shape: Shape): boolean;
5096
+ /**
5097
+ * When the shape is resized, whether the shape's children should also be resized.
5098
+ *
5099
+ * @public
5100
+ */
5101
+ canResizeChildren(_shape: Shape): boolean;
5100
5102
  /**
5101
5103
  * Whether the shape can be edited in read-only mode.
5102
5104
  *
@@ -5540,12 +5542,12 @@ export declare class Stadium2d extends Geometry2d {
5540
5542
  height: number;
5541
5543
  width: number;
5542
5544
  };
5543
- w: number;
5544
- h: number;
5545
- a: Arc2d;
5546
- b: Edge2d;
5547
- c: Arc2d;
5548
- d: Edge2d;
5545
+ private _w;
5546
+ private _h;
5547
+ private _a;
5548
+ private _b;
5549
+ private _c;
5550
+ private _d;
5549
5551
  constructor(config: Omit<Geometry2dOptions, 'isClosed'> & {
5550
5552
  height: number;
5551
5553
  width: number;
@@ -7678,7 +7680,7 @@ export declare class Vec {
7678
7680
  len(): number;
7679
7681
  pry(V: VecLike): number;
7680
7682
  per(): this;
7681
- uni(): Vec;
7683
+ uni(): this;
7682
7684
  tan(V: VecLike): Vec;
7683
7685
  dist(V: VecLike): number;
7684
7686
  distanceToLineSegment(A: VecLike, B: VecLike): number;
@@ -7689,8 +7691,9 @@ export declare class Vec {
7689
7691
  lrp(B: VecLike, t: number): Vec;
7690
7692
  equals(B: VecLike): boolean;
7691
7693
  equalsXY(x: number, y: number): boolean;
7694
+ /** @deprecated use `uni` instead */
7692
7695
  norm(): this;
7693
- toFixed(): Vec;
7696
+ toFixed(): this;
7694
7697
  toString(): string;
7695
7698
  toJson(): VecModel;
7696
7699
  toArray(): number[];
@@ -4,6 +4,7 @@ import "core-js/stable/array/flat-map.js";
4
4
  import "core-js/stable/array/flat.js";
5
5
  import "core-js/stable/string/at.js";
6
6
  import "core-js/stable/string/replace-all.js";
7
+ import { areShapesContentEqual } from "./lib/utils/areShapesContentEqual.mjs";
7
8
  export * from "@tldraw/state";
8
9
  export * from "@tldraw/state-react";
9
10
  export * from "@tldraw/store";
@@ -96,13 +97,15 @@ import {
96
97
  import {
97
98
  BindingUtil
98
99
  } from "./lib/editor/bindings/BindingUtil.mjs";
99
- import { ClickManager } from "./lib/editor/managers/ClickManager.mjs";
100
- import { EdgeScrollManager } from "./lib/editor/managers/EdgeScrollManager.mjs";
100
+ import { ClickManager } from "./lib/editor/managers/ClickManager/ClickManager.mjs";
101
+ import { EdgeScrollManager } from "./lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs";
101
102
  import {
102
103
  FontManager
103
- } from "./lib/editor/managers/FontManager.mjs";
104
- import { HistoryManager } from "./lib/editor/managers/HistoryManager.mjs";
105
- import { ScribbleManager } from "./lib/editor/managers/ScribbleManager.mjs";
104
+ } from "./lib/editor/managers/FontManager/FontManager.mjs";
105
+ import { HistoryManager } from "./lib/editor/managers/HistoryManager/HistoryManager.mjs";
106
+ import {
107
+ ScribbleManager
108
+ } from "./lib/editor/managers/ScribbleManager/ScribbleManager.mjs";
106
109
  import {
107
110
  BoundsSnaps
108
111
  } from "./lib/editor/managers/SnapManager/BoundsSnaps.mjs";
@@ -110,8 +113,10 @@ import { HandleSnaps } from "./lib/editor/managers/SnapManager/HandleSnaps.mjs";
110
113
  import {
111
114
  SnapManager
112
115
  } from "./lib/editor/managers/SnapManager/SnapManager.mjs";
113
- import { TextManager } from "./lib/editor/managers/TextManager.mjs";
114
- import { UserPreferencesManager } from "./lib/editor/managers/UserPreferencesManager.mjs";
116
+ import {
117
+ TextManager
118
+ } from "./lib/editor/managers/TextManager/TextManager.mjs";
119
+ import { UserPreferencesManager } from "./lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs";
115
120
  import { BaseBoxShapeUtil } from "./lib/editor/shapes/BaseBoxShapeUtil.mjs";
116
121
  import {
117
122
  ShapeUtil
@@ -288,7 +293,7 @@ function debugEnableLicensing() {
288
293
  }
289
294
  registerTldrawLibraryVersion(
290
295
  "@tldraw/editor",
291
- "3.14.0-canary.783e99a41fc5",
296
+ "3.14.0-canary.7b5fb115ed17",
292
297
  "esm"
293
298
  );
294
299
  export {
@@ -376,6 +381,7 @@ export {
376
381
  applyRotationToSnapshotShapes,
377
382
  approximately,
378
383
  areAnglesCompatible,
384
+ areShapesContentEqual,
379
385
  average,
380
386
  canonicalizeRotation,
381
387
  centerOfCircleFromThreePoints,