@tldraw/editor 5.2.0-next.e2b8d10bf10e → 5.2.0

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 (172) hide show
  1. package/README.md +7 -1
  2. package/dist-cjs/index.d.ts +112 -53
  3. package/dist-cjs/index.js +7 -8
  4. package/dist-cjs/index.js.map +2 -2
  5. package/dist-cjs/lib/components/MenuClickCapture.js +8 -5
  6. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  7. package/dist-cjs/lib/components/Shape.js +47 -1
  8. package/dist-cjs/lib/components/Shape.js.map +3 -3
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -16
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +97 -45
  12. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  13. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +3 -3
  14. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +2 -2
  15. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +28 -4
  16. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +3 -3
  17. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +24 -2
  18. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +14 -3
  20. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +4 -2
  22. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
  23. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +7 -3
  24. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  25. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +0 -1
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +15 -2
  28. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  29. package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js +79 -0
  30. package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js.map +7 -0
  31. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +4 -0
  33. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  34. package/dist-cjs/lib/{hooks/useTransform.js → editor/tools/cancelShapeCreationOnLongPress.js} +8 -23
  35. package/dist-cjs/lib/editor/tools/cancelShapeCreationOnLongPress.js.map +7 -0
  36. package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
  37. package/dist-cjs/lib/globals/environment.js +6 -1
  38. package/dist-cjs/lib/globals/environment.js.map +2 -2
  39. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  40. package/dist-cjs/lib/hooks/useCanvasEvents.js +17 -8
  41. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  42. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -1
  43. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  44. package/dist-cjs/lib/hooks/usePresence.js.map +2 -2
  45. package/dist-cjs/lib/hooks/useScreenBounds.js +1 -0
  46. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  47. package/dist-cjs/lib/license/LicenseManager.js +5 -1
  48. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  49. package/dist-cjs/lib/primitives/Vec.js +3 -2
  50. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  51. package/dist-cjs/lib/utils/dom.js +12 -0
  52. package/dist-cjs/lib/utils/dom.js.map +2 -2
  53. package/dist-cjs/lib/utils/getPointerInfo.js +2 -1
  54. package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
  55. package/dist-cjs/lib/utils/pointer.js +37 -0
  56. package/dist-cjs/lib/utils/pointer.js.map +7 -0
  57. package/dist-cjs/version.js +3 -3
  58. package/dist-cjs/version.js.map +1 -1
  59. package/dist-esm/index.d.mts +112 -53
  60. package/dist-esm/index.mjs +9 -13
  61. package/dist-esm/index.mjs.map +2 -2
  62. package/dist-esm/lib/components/MenuClickCapture.mjs +8 -5
  63. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  64. package/dist-esm/lib/components/Shape.mjs +48 -2
  65. package/dist-esm/lib/components/Shape.mjs.map +3 -3
  66. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -16
  67. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  68. package/dist-esm/lib/editor/Editor.mjs +97 -45
  69. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  70. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +3 -3
  71. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +2 -2
  72. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +28 -4
  73. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +3 -3
  74. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +24 -2
  75. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +2 -2
  76. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +14 -3
  77. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +4 -2
  79. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
  80. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +7 -3
  81. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  82. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +0 -1
  83. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
  84. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +15 -2
  85. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  86. package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs +59 -0
  87. package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs.map +7 -0
  88. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  89. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +4 -0
  90. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  91. package/dist-esm/lib/editor/tools/cancelShapeCreationOnLongPress.mjs +8 -0
  92. package/dist-esm/lib/editor/tools/cancelShapeCreationOnLongPress.mjs.map +7 -0
  93. package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
  94. package/dist-esm/lib/globals/environment.mjs +6 -1
  95. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  96. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  97. package/dist-esm/lib/hooks/useCanvasEvents.mjs +17 -8
  98. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  99. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -1
  100. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  101. package/dist-esm/lib/hooks/usePresence.mjs.map +2 -2
  102. package/dist-esm/lib/hooks/useScreenBounds.mjs +1 -0
  103. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  104. package/dist-esm/lib/license/LicenseManager.mjs +5 -1
  105. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  106. package/dist-esm/lib/primitives/Vec.mjs +3 -2
  107. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  108. package/dist-esm/lib/utils/dom.mjs +12 -0
  109. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  110. package/dist-esm/lib/utils/getPointerInfo.mjs +2 -1
  111. package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
  112. package/dist-esm/lib/utils/pointer.mjs +17 -0
  113. package/dist-esm/lib/utils/pointer.mjs.map +7 -0
  114. package/dist-esm/version.mjs +3 -3
  115. package/dist-esm/version.mjs.map +1 -1
  116. package/editor.css +15 -3
  117. package/package.json +11 -8
  118. package/src/index.ts +4 -10
  119. package/src/lib/components/MenuClickCapture.tsx +8 -4
  120. package/src/lib/components/Shape.tsx +88 -1
  121. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -17
  122. package/src/lib/editor/Editor.test.ts +36 -0
  123. package/src/lib/editor/Editor.ts +145 -55
  124. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.test.ts +43 -16
  125. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +8 -5
  126. package/src/lib/editor/managers/FontManager/FontManager.test.ts +37 -10
  127. package/src/lib/editor/managers/FontManager/FontManager.ts +46 -1
  128. package/src/lib/editor/managers/HistoryManager/HistoryManager.test.ts +32 -0
  129. package/src/lib/editor/managers/HistoryManager/HistoryManager.ts +34 -4
  130. package/src/lib/editor/managers/InputsManager/InputsManager.test.ts +61 -0
  131. package/src/lib/editor/managers/InputsManager/InputsManager.ts +16 -4
  132. package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +9 -2
  133. package/src/lib/editor/managers/TextManager/TextManager.test.ts +16 -14
  134. package/src/lib/editor/managers/TextManager/TextManager.ts +17 -2
  135. package/src/lib/editor/managers/TickManager/TickManager.test.ts +0 -40
  136. package/src/lib/editor/managers/TickManager/TickManager.ts +0 -1
  137. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +12 -2
  138. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +27 -2
  139. package/src/lib/editor/overlays/strokeShapeIndicators.ts +86 -0
  140. package/src/lib/editor/shapes/ShapeUtil.ts +41 -0
  141. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +5 -0
  142. package/src/lib/editor/tools/cancelShapeCreationOnLongPress.ts +31 -0
  143. package/src/lib/editor/types/event-types.ts +7 -0
  144. package/src/lib/globals/environment.ts +7 -0
  145. package/src/lib/hooks/EditorComponentsContext.tsx +0 -2
  146. package/src/lib/hooks/useCanvasEvents.ts +24 -12
  147. package/src/lib/hooks/useEditorComponents.tsx +0 -1
  148. package/src/lib/hooks/usePresence.ts +2 -2
  149. package/src/lib/hooks/useScreenBounds.ts +3 -0
  150. package/src/lib/license/LicenseManager.test.ts +24 -16
  151. package/src/lib/license/LicenseManager.ts +8 -2
  152. package/src/lib/primitives/Vec.ts +5 -2
  153. package/src/lib/test/ContentElementSlot.test.tsx +201 -0
  154. package/src/lib/utils/dom.ts +34 -0
  155. package/src/lib/utils/getPointerInfo.ts +2 -1
  156. package/src/lib/utils/pointer.test.ts +76 -0
  157. package/src/lib/utils/pointer.ts +42 -0
  158. package/src/version.ts +3 -3
  159. package/dist-cjs/lib/components/default-components/DefaultSelectionBackground.js +0 -49
  160. package/dist-cjs/lib/components/default-components/DefaultSelectionBackground.js.map +0 -7
  161. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +0 -161
  162. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +0 -7
  163. package/dist-cjs/lib/hooks/useTransform.js.map +0 -7
  164. package/dist-esm/lib/components/default-components/DefaultSelectionBackground.mjs +0 -19
  165. package/dist-esm/lib/components/default-components/DefaultSelectionBackground.mjs.map +0 -7
  166. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +0 -141
  167. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +0 -7
  168. package/dist-esm/lib/hooks/useTransform.mjs +0 -23
  169. package/dist-esm/lib/hooks/useTransform.mjs.map +0 -7
  170. package/src/lib/components/default-components/DefaultSelectionBackground.tsx +0 -25
  171. package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +0 -216
  172. package/src/lib/hooks/useTransform.ts +0 -30
@@ -1,4 +1,5 @@
1
1
  import { EASINGS } from "./easings.mjs";
2
+ const { easeInQuad, easeInOutQuad } = EASINGS;
2
3
  function clamp(n, min, max) {
3
4
  return Math.max(min, typeof max !== "undefined" ? Math.min(n, max) : n);
4
5
  }
@@ -497,12 +498,12 @@ class Vec {
497
498
  * @param steps - The number of points to return.
498
499
  * @param ease - The easing to use.
499
500
  */
500
- static PointsBetween(A, B, steps = 6, ease = EASINGS.easeInQuad) {
501
+ static PointsBetween(A, B, steps = 6, ease = easeInQuad) {
501
502
  const results = [];
502
503
  for (let i = 0; i < steps; i++) {
503
504
  const t = ease(i / (steps - 1));
504
505
  const point = Vec.Lrp(A, B, t);
505
- point.z = Math.min(1, 0.5 + Math.abs(0.5 - EASINGS.easeInOutQuad(t)) * 0.65);
506
+ point.z = Math.min(1, 0.5 + Math.abs(0.5 - easeInOutQuad(t)) * 0.65);
506
507
  results.push(point);
507
508
  }
508
509
  return results;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/primitives/Vec.ts"],
4
- "sourcesContent": ["import { VecModel } from '@tldraw/tlschema'\nimport { EASINGS } from './easings'\nfunction clamp(n: number, min: number, max?: number): number {\n\treturn Math.max(min, typeof max !== 'undefined' ? Math.min(n, max) : n)\n}\n\nfunction toFixed(v: number) {\n\treturn Math.round(v * 1e2) / 1e2\n}\n\n/** @public */\nexport type VecLike = Vec | VecModel\n\n/** @public */\nexport class Vec {\n\tconstructor(\n\t\tpublic x = 0,\n\t\tpublic y = 0,\n\t\tpublic z = 1\n\t) {}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget pressure() {\n\t\treturn this.z\n\t}\n\n\tset(x = this.x, y = this.y, z = this.z) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\tsetTo({ x = 0, y = 0, z = 1 }: VecLike) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\trot(r: number) {\n\t\tif (r === 0) return this\n\t\tconst { x, y } = this\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = x * c - y * s\n\t\tthis.y = x * s + y * c\n\t\treturn this\n\t}\n\n\trotWith(C: VecLike, r: number) {\n\t\tif (r === 0) return this\n\t\tconst x = this.x - C.x\n\t\tconst y = this.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = C.x + (x * c - y * s)\n\t\tthis.y = C.y + (x * s + y * c)\n\t\treturn this\n\t}\n\n\tclone(): Vec {\n\t\tconst { x, y, z } = this\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tsub(V: VecLike) {\n\t\tthis.x -= V.x\n\t\tthis.y -= V.y\n\t\treturn this\n\t}\n\n\tsubXY(x: number, y: number) {\n\t\tthis.x -= x\n\t\tthis.y -= y\n\t\treturn this\n\t}\n\n\tsubScalar(n: number) {\n\t\tthis.x -= n\n\t\tthis.y -= n\n\t\t// this.z -= n\n\n\t\treturn this\n\t}\n\n\tadd(V: VecLike) {\n\t\tthis.x += V.x\n\t\tthis.y += V.y\n\t\treturn this\n\t}\n\n\taddXY(x: number, y: number) {\n\t\tthis.x += x\n\t\tthis.y += y\n\t\treturn this\n\t}\n\n\taddScalar(n: number) {\n\t\tthis.x += n\n\t\tthis.y += n\n\t\t// this.z += n\n\n\t\treturn this\n\t}\n\n\tclamp(min: number, max?: number) {\n\t\tthis.x = Math.max(this.x, min)\n\t\tthis.y = Math.max(this.y, min)\n\t\tif (max !== undefined) {\n\t\t\tthis.x = Math.min(this.x, max)\n\t\t\tthis.y = Math.min(this.y, max)\n\t\t}\n\t\treturn this\n\t}\n\n\tdiv(t: number) {\n\t\tthis.x /= t\n\t\tthis.y /= t\n\t\t// this.z /= t\n\t\treturn this\n\t}\n\n\tdivV(V: VecLike) {\n\t\tthis.x /= V.x\n\t\tthis.y /= V.y\n\t\t// this.z /= V.z\n\t\treturn this\n\t}\n\n\tmul(t: number) {\n\t\tthis.x *= t\n\t\tthis.y *= t\n\t\t// this.z *= t\n\t\treturn this\n\t}\n\n\tmulV(V: VecLike) {\n\t\tthis.x *= V.x\n\t\tthis.y *= V.y\n\t\t// this.z *= V.z\n\t\treturn this\n\t}\n\n\tabs() {\n\t\tthis.x = Math.abs(this.x)\n\t\tthis.y = Math.abs(this.y)\n\t\treturn this\n\t}\n\n\tnudge(B: VecLike, distance: number) {\n\t\tconst tan = Vec.Tan(B, this)\n\t\treturn this.add(tan.mul(distance))\n\t}\n\n\tneg() {\n\t\tthis.x *= -1\n\t\tthis.y *= -1\n\t\t// this.z *= -1\n\t\treturn this\n\t}\n\n\tcross(V: VecLike) {\n\t\tthis.x = this.y * V.z! - this.z * V.y\n\t\tthis.y = this.z * V.x - this.x * V.z!\n\t\t// this.z = this.x * V.y - this.y * V.x\n\t\treturn this\n\t}\n\n\tdpr(V: VecLike): number {\n\t\treturn Vec.Dpr(this, V)\n\t}\n\n\tcpr(V: VecLike) {\n\t\treturn Vec.Cpr(this, V)\n\t}\n\n\tlen2(): number {\n\t\treturn Vec.Len2(this)\n\t}\n\n\tlen(): number {\n\t\treturn Vec.Len(this)\n\t}\n\n\tpry(V: VecLike): number {\n\t\treturn Vec.Pry(this, V)\n\t}\n\n\tper() {\n\t\tconst { x, y } = this\n\t\tthis.x = y\n\t\tthis.y = -x\n\t\treturn this\n\t}\n\n\tuni() {\n\t\tconst l = this.len()\n\t\tif (l === 0) return this\n\t\tthis.x /= l\n\t\tthis.y /= l\n\t\treturn this\n\t}\n\n\ttan(V: VecLike): Vec {\n\t\treturn this.sub(V).uni()\n\t}\n\n\tdist(V: VecLike): number {\n\t\treturn Vec.Dist(this, V)\n\t}\n\n\tdistanceToLineSegment(A: VecLike, B: VecLike): number {\n\t\treturn Vec.DistanceToLineSegment(A, B, this)\n\t}\n\n\tslope(B: VecLike): number {\n\t\treturn Vec.Slope(this, B)\n\t}\n\n\tsnapToGrid(gridSize: number) {\n\t\tthis.x = Math.round(this.x / gridSize) * gridSize\n\t\tthis.y = Math.round(this.y / gridSize) * gridSize\n\t\treturn this\n\t}\n\n\tangle(B: VecLike): number {\n\t\treturn Vec.Angle(this, B)\n\t}\n\n\ttoAngle() {\n\t\treturn Vec.ToAngle(this)\n\t}\n\n\tlrp(B: VecLike, t: number): Vec {\n\t\tthis.x = this.x + (B.x - this.x) * t\n\t\tthis.y = this.y + (B.y - this.y) * t\n\t\treturn this\n\t}\n\n\tequals(B: VecLike) {\n\t\treturn Vec.Equals(this, B)\n\t}\n\n\tequalsXY(x: number, y: number) {\n\t\treturn Vec.EqualsXY(this, x, y)\n\t}\n\n\ttoFixed() {\n\t\tthis.x = toFixed(this.x)\n\t\tthis.y = toFixed(this.y)\n\t\treturn this\n\t}\n\n\ttoString() {\n\t\treturn Vec.ToString(Vec.ToFixed(this))\n\t}\n\n\ttoJson(): VecModel {\n\t\treturn Vec.ToJson(this)\n\t}\n\n\ttoArray(): number[] {\n\t\treturn Vec.ToArray(this)\n\t}\n\n\tstatic Add(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x + B.x, A.y + B.y)\n\t}\n\n\tstatic AddXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x + x, A.y + y)\n\t}\n\n\tstatic Sub(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x - B.x, A.y - B.y)\n\t}\n\n\tstatic SubXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x - x, A.y - y)\n\t}\n\n\tstatic AddScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x + n, A.y + n)\n\t}\n\n\tstatic SubScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x - n, A.y - n)\n\t}\n\n\tstatic Div(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x / t, A.y / t)\n\t}\n\n\tstatic Mul(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x * t, A.y * t)\n\t}\n\n\tstatic DivV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x / B.x, A.y / B.y)\n\t}\n\n\tstatic MulV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x * B.x, A.y * B.y)\n\t}\n\n\tstatic Neg(A: VecLike): Vec {\n\t\treturn new Vec(-A.x, -A.y)\n\t}\n\n\t/**\n\t * Get the perpendicular vector to A.\n\t */\n\tstatic Per(A: VecLike): Vec {\n\t\treturn new Vec(A.y, -A.x)\n\t}\n\n\tstatic Abs(A: VecLike): Vec {\n\t\treturn new Vec(Math.abs(A.x), Math.abs(A.y))\n\t}\n\n\t// Get the distance between two points.\n\tstatic Dist(A: VecLike, B: VecLike): number {\n\t\treturn ((A.y - B.y) ** 2 + (A.x - B.x) ** 2) ** 0.5\n\t}\n\n\t// Get the Manhattan distance between two points.\n\tstatic ManhattanDist(A: VecLike, B: VecLike): number {\n\t\treturn Math.abs(A.x - B.x) + Math.abs(A.y - B.y)\n\t}\n\n\t// Get whether a distance between two points is less than a number. This is faster to calulate than using `Vec.Dist(a, b) < n`.\n\tstatic DistMin(A: VecLike, B: VecLike, n: number): boolean {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) < n ** 2\n\t}\n\n\t// Get the squared distance between two points. This is faster to calculate (no square root) so useful for \"minimum distance\" checks where the actual measurement does not matter.\n\tstatic Dist2(A: VecLike, B: VecLike): number {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)\n\t}\n\n\t/**\n\t * Dot product of two vectors which is used to calculate the angle between them.\n\t */\n\tstatic Dpr(A: VecLike, B: VecLike): number {\n\t\treturn A.x * B.x + A.y * B.y\n\t}\n\n\tstatic Cross(A: VecLike, V: VecLike) {\n\t\treturn new Vec(\n\t\t\tA.y * V.z! - A.z! * V.y,\n\t\t\tA.z! * V.x - A.x * V.z!\n\t\t\t// A.z = A.x * V.y - A.y * V.x\n\t\t)\n\t}\n\n\t/**\n\t * Cross product of two vectors which is used to calculate the area of a parallelogram.\n\t */\n\tstatic Cpr(A: VecLike, B: VecLike) {\n\t\treturn A.x * B.y - B.x * A.y\n\t}\n\n\tstatic Len2(A: VecLike): number {\n\t\treturn A.x * A.x + A.y * A.y\n\t}\n\n\tstatic Len(A: VecLike): number {\n\t\treturn (A.x * A.x + A.y * A.y) ** 0.5\n\t}\n\n\t/**\n\t * Get the projection of A onto B.\n\t */\n\tstatic Pry(A: VecLike, B: VecLike): number {\n\t\treturn Vec.Dpr(A, B) / Vec.Len(B)\n\t}\n\n\t/**\n\t * Get the unit vector of A.\n\t */\n\tstatic Uni(A: VecLike) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec(l === 0 ? 0 : A.x / l, l === 0 ? 0 : A.y / l)\n\t}\n\n\tstatic Tan(A: VecLike, B: VecLike): Vec {\n\t\treturn Vec.Uni(Vec.Sub(A, B))\n\t}\n\n\tstatic Min(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.min(A.x, B.x), Math.min(A.y, B.y))\n\t}\n\n\tstatic Max(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.max(A.x, B.x), Math.max(A.y, B.y))\n\t}\n\n\tstatic From({ x, y, z = 1 }: VecModel) {\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tstatic FromArray(v: number[]): Vec {\n\t\treturn new Vec(v[0], v[1])\n\t}\n\n\tstatic Rot(A: VecLike, r = 0): Vec {\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(A.x * c - A.y * s, A.x * s + A.y * c)\n\t}\n\n\tstatic RotWith(A: VecLike, C: VecLike, r: number): Vec {\n\t\tconst x = A.x - C.x\n\t\tconst y = A.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(C.x + (x * c - y * s), C.y + (x * s + y * c))\n\t}\n\n\t/**\n\t * Get the nearest point on a line with a known unit vector that passes through point A\n\t *\n\t * ```ts\n\t * Vec.nearestPointOnLineThroughPoint(A, u, Point)\n\t * ```\n\t *\n\t * @param A - Any point on the line\n\t * @param u - The unit vector for the line.\n\t * @param P - A point not on the line to test.\n\t */\n\tstatic NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec {\n\t\t// Inlined: t = Vec.Sub(P, A).pry(u), return Vec.Mul(u, t).add(A)\n\t\tconst t = (P.x - A.x) * u.x + (P.y - A.y) * u.y\n\t\treturn new Vec(A.x + u.x * t, A.y + u.y * t)\n\t}\n\n\tstatic NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): Vec {\n\t\t// Parametric projection of P onto segment AB.\n\t\t// Inlined: d = Vec.Sub(B, A); t = Vec.Sub(P, A).pry(d) / d.len(); return Vec.Lrp(A, B, t)\n\t\tconst dx = B.x - A.x\n\t\tconst dy = B.y - A.y\n\t\tconst d2 = dx * dx + dy * dy\n\n\t\tif (d2 === 0) return Vec.From(A)\n\n\t\tlet t = ((P.x - A.x) * dx + (P.y - A.y) * dy) / d2\n\n\t\tif (clamp) {\n\t\t\tif (t < 0) t = 0\n\t\t\telse if (t > 1) t = 1\n\t\t}\n\n\t\treturn new Vec(A.x + t * dx, A.y + t * dy)\n\t}\n\n\tstatic DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number {\n\t\t// Inlined: Vec.Dist(P, Vec.NearestPointOnLineThroughPoint(A, u, P))\n\t\t// Uses |cross(P-A, u)| which equals the perpendicular distance when u is a unit vector.\n\t\tconst dx = P.x - A.x\n\t\tconst dy = P.y - A.y\n\t\treturn Math.abs(dx * u.y - dy * u.x)\n\t}\n\n\tstatic DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): number {\n\t\t// Inlined: Vec.Dist(P, Vec.NearestPointOnLineSegment(A, B, P, clamp))\n\t\t// Computes the nearest point via parametric t-projection then returns the scalar distance,\n\t\t// avoiding the intermediate Vec allocation that NearestPointOnLineSegment would create.\n\t\tconst dx = B.x - A.x\n\t\tconst dy = B.y - A.y\n\t\tconst d2 = dx * dx + dy * dy\n\n\t\tif (d2 === 0) return Vec.Dist(A, P)\n\n\t\tlet t = ((P.x - A.x) * dx + (P.y - A.y) * dy) / d2\n\n\t\tif (clamp) {\n\t\t\tif (t < 0) t = 0\n\t\t\telse if (t > 1) t = 1\n\t\t}\n\n\t\tconst nx = A.x + t * dx - P.x\n\t\tconst ny = A.y + t * dy - P.y\n\t\treturn Math.sqrt(nx * nx + ny * ny)\n\t}\n\n\tstatic Snap(A: VecLike, step = 1) {\n\t\treturn new Vec(Math.round(A.x / step) * step, Math.round(A.y / step) * step)\n\t}\n\n\tstatic Cast(A: VecLike): Vec {\n\t\tif (A instanceof Vec) return A\n\t\treturn Vec.From(A)\n\t}\n\n\tstatic Slope(A: VecLike, B: VecLike): number {\n\t\tif (A.x === B.y) return NaN\n\t\treturn (A.y - B.y) / (A.x - B.x)\n\t}\n\n\tstatic IsNaN(A: VecLike): boolean {\n\t\treturn isNaN(A.x) || isNaN(A.y)\n\t}\n\n\tstatic IsFinite(A: VecLike): boolean {\n\t\treturn Number.isFinite(A.x) && Number.isFinite(A.y)\n\t}\n\n\t/**\n\t * Get the angle from position A to position B.\n\t */\n\tstatic Angle(A: VecLike, B: VecLike): number {\n\t\treturn Math.atan2(B.y - A.y, B.x - A.x)\n\t}\n\n\t/**\n\t * Get the angle between vector A and vector B. This will return the smallest angle between the\n\t * two vectors, between -\u03C0 and \u03C0. The sign indicates direction of angle.\n\t */\n\tstatic AngleBetween(A: VecLike, B: VecLike): number {\n\t\t// p = dot(A, B); n = |A| * |B| (uses x*x instead of Math.pow(x, 2))\n\t\tconst p = A.x * B.x + A.y * B.y\n\t\tconst n = Math.sqrt((A.x * A.x + A.y * A.y) * (B.x * B.x + B.y * B.y))\n\t\tconst sign = A.x * B.y - A.y * B.x < 0 ? -1 : 1\n\t\treturn sign * Math.acos(clamp(p / n, -1, 1))\n\t}\n\n\t/**\n\t * Linearly interpolate between two points.\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param t - The interpolation value between 0 and 1.\n\t * @returns The interpolated point.\n\t */\n\tstatic Lrp(A: VecLike, B: VecLike, t: number): Vec {\n\t\t// Inlined: Vec.Sub(B, A).mul(t).add(A) \u2014 note: only interpolates x/y, not z.\n\t\treturn new Vec(A.x + (B.x - A.x) * t, A.y + (B.y - A.y) * t)\n\t}\n\n\tstatic Med(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec((A.x + B.x) / 2, (A.y + B.y) / 2)\n\t}\n\n\tstatic Equals(A: VecLike, B: VecLike): boolean {\n\t\treturn Math.abs(A.x - B.x) < 0.0001 && Math.abs(A.y - B.y) < 0.0001\n\t}\n\n\tstatic EqualsXY(A: VecLike, x: number, y: number): boolean {\n\t\treturn A.x === x && A.y === y\n\t}\n\n\tstatic Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n\t\treturn (C.x - A.x) * (B.y - A.y) - (B.x - A.x) * (C.y - A.y) < 0\n\t}\n\n\tstatic Rescale(A: VecLike, n: number) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec((n * A.x) / l, (n * A.y) / l)\n\t}\n\n\tstatic ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike) {\n\t\treturn Vec.Sub(A, origin).mul(scale).add(origin)\n\t}\n\n\tstatic ToFixed(A: VecLike) {\n\t\treturn new Vec(toFixed(A.x), toFixed(A.y))\n\t}\n\n\tstatic ToInt(A: VecLike) {\n\t\treturn new Vec(\n\t\t\tparseInt(A.x.toFixed(0)),\n\t\t\tparseInt(A.y.toFixed(0)),\n\t\t\tparseInt((A.z ?? 0).toFixed(0))\n\t\t)\n\t}\n\n\tstatic ToCss(A: VecLike) {\n\t\treturn `${A.x},${A.y}`\n\t}\n\n\tstatic Nudge(A: VecLike, B: VecLike, distance: number) {\n\t\treturn Vec.Add(A, Vec.Tan(B, A).mul(distance))\n\t}\n\n\tstatic ToString(A: VecLike) {\n\t\treturn `${A.x}, ${A.y}`\n\t}\n\n\tstatic ToAngle(A: VecLike) {\n\t\tlet r = Math.atan2(A.y, A.x)\n\t\tif (r < 0) r += Math.PI * 2\n\n\t\treturn r\n\t}\n\n\tstatic FromAngle(r: number, length = 1) {\n\t\treturn new Vec(Math.cos(r) * length, Math.sin(r) * length)\n\t}\n\n\tstatic ToArray(A: VecLike) {\n\t\treturn [A.x, A.y, A.z!]\n\t}\n\n\tstatic ToJson(A: VecLike) {\n\t\tconst { x, y, z } = A\n\t\treturn { x, y, z }\n\t}\n\n\tstatic Average(arr: VecLike[]) {\n\t\tconst len = arr.length\n\t\tconst avg = new Vec(0, 0)\n\t\tif (len === 0) {\n\t\t\treturn avg\n\t\t}\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tavg.add(arr[i])\n\t\t}\n\t\treturn avg.div(len)\n\t}\n\n\tstatic Clamp(A: Vec, min: number, max?: number) {\n\t\tif (max === undefined) {\n\t\t\treturn new Vec(Math.min(Math.max(A.x, min)), Math.min(Math.max(A.y, min)))\n\t\t}\n\n\t\treturn new Vec(Math.min(Math.max(A.x, min), max), Math.min(Math.max(A.y, min), max))\n\t}\n\n\t/**\n\t * Get an array of points (with simulated pressure) between two points.\n\t *\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param steps - The number of points to return.\n\t * @param ease - The easing to use.\n\t */\n\tstatic PointsBetween(A: VecModel, B: VecModel, steps = 6, ease = EASINGS.easeInQuad): Vec[] {\n\t\tconst results: Vec[] = []\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = ease(i / (steps - 1))\n\t\t\tconst point = Vec.Lrp(A, B, t)\n\t\t\tpoint.z = Math.min(1, 0.5 + Math.abs(0.5 - EASINGS.easeInOutQuad(t)) * 0.65)\n\t\t\tresults.push(point)\n\t\t}\n\n\t\treturn results\n\t}\n\n\tstatic SnapToGrid(A: VecLike, gridSize = 8) {\n\t\treturn new Vec(Math.round(A.x / gridSize) * gridSize, Math.round(A.y / gridSize) * gridSize)\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { VecModel } from '@tldraw/tlschema'\nimport { EASINGS } from './easings'\n\nconst { easeInQuad, easeInOutQuad } = EASINGS\n\nfunction clamp(n: number, min: number, max?: number): number {\n\treturn Math.max(min, typeof max !== 'undefined' ? Math.min(n, max) : n)\n}\n\nfunction toFixed(v: number) {\n\treturn Math.round(v * 1e2) / 1e2\n}\n\n/** @public */\nexport type VecLike = Vec | VecModel\n\n/** @public */\nexport class Vec {\n\tconstructor(\n\t\tpublic x = 0,\n\t\tpublic y = 0,\n\t\tpublic z = 1\n\t) {}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget pressure() {\n\t\treturn this.z\n\t}\n\n\tset(x = this.x, y = this.y, z = this.z) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\tsetTo({ x = 0, y = 0, z = 1 }: VecLike) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\trot(r: number) {\n\t\tif (r === 0) return this\n\t\tconst { x, y } = this\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = x * c - y * s\n\t\tthis.y = x * s + y * c\n\t\treturn this\n\t}\n\n\trotWith(C: VecLike, r: number) {\n\t\tif (r === 0) return this\n\t\tconst x = this.x - C.x\n\t\tconst y = this.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = C.x + (x * c - y * s)\n\t\tthis.y = C.y + (x * s + y * c)\n\t\treturn this\n\t}\n\n\tclone(): Vec {\n\t\tconst { x, y, z } = this\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tsub(V: VecLike) {\n\t\tthis.x -= V.x\n\t\tthis.y -= V.y\n\t\treturn this\n\t}\n\n\tsubXY(x: number, y: number) {\n\t\tthis.x -= x\n\t\tthis.y -= y\n\t\treturn this\n\t}\n\n\tsubScalar(n: number) {\n\t\tthis.x -= n\n\t\tthis.y -= n\n\t\t// this.z -= n\n\n\t\treturn this\n\t}\n\n\tadd(V: VecLike) {\n\t\tthis.x += V.x\n\t\tthis.y += V.y\n\t\treturn this\n\t}\n\n\taddXY(x: number, y: number) {\n\t\tthis.x += x\n\t\tthis.y += y\n\t\treturn this\n\t}\n\n\taddScalar(n: number) {\n\t\tthis.x += n\n\t\tthis.y += n\n\t\t// this.z += n\n\n\t\treturn this\n\t}\n\n\tclamp(min: number, max?: number) {\n\t\tthis.x = Math.max(this.x, min)\n\t\tthis.y = Math.max(this.y, min)\n\t\tif (max !== undefined) {\n\t\t\tthis.x = Math.min(this.x, max)\n\t\t\tthis.y = Math.min(this.y, max)\n\t\t}\n\t\treturn this\n\t}\n\n\tdiv(t: number) {\n\t\tthis.x /= t\n\t\tthis.y /= t\n\t\t// this.z /= t\n\t\treturn this\n\t}\n\n\tdivV(V: VecLike) {\n\t\tthis.x /= V.x\n\t\tthis.y /= V.y\n\t\t// this.z /= V.z\n\t\treturn this\n\t}\n\n\tmul(t: number) {\n\t\tthis.x *= t\n\t\tthis.y *= t\n\t\t// this.z *= t\n\t\treturn this\n\t}\n\n\tmulV(V: VecLike) {\n\t\tthis.x *= V.x\n\t\tthis.y *= V.y\n\t\t// this.z *= V.z\n\t\treturn this\n\t}\n\n\tabs() {\n\t\tthis.x = Math.abs(this.x)\n\t\tthis.y = Math.abs(this.y)\n\t\treturn this\n\t}\n\n\tnudge(B: VecLike, distance: number) {\n\t\tconst tan = Vec.Tan(B, this)\n\t\treturn this.add(tan.mul(distance))\n\t}\n\n\tneg() {\n\t\tthis.x *= -1\n\t\tthis.y *= -1\n\t\t// this.z *= -1\n\t\treturn this\n\t}\n\n\tcross(V: VecLike) {\n\t\tthis.x = this.y * V.z! - this.z * V.y\n\t\tthis.y = this.z * V.x - this.x * V.z!\n\t\t// this.z = this.x * V.y - this.y * V.x\n\t\treturn this\n\t}\n\n\tdpr(V: VecLike): number {\n\t\treturn Vec.Dpr(this, V)\n\t}\n\n\tcpr(V: VecLike) {\n\t\treturn Vec.Cpr(this, V)\n\t}\n\n\tlen2(): number {\n\t\treturn Vec.Len2(this)\n\t}\n\n\tlen(): number {\n\t\treturn Vec.Len(this)\n\t}\n\n\tpry(V: VecLike): number {\n\t\treturn Vec.Pry(this, V)\n\t}\n\n\tper() {\n\t\tconst { x, y } = this\n\t\tthis.x = y\n\t\tthis.y = -x\n\t\treturn this\n\t}\n\n\tuni() {\n\t\tconst l = this.len()\n\t\tif (l === 0) return this\n\t\tthis.x /= l\n\t\tthis.y /= l\n\t\treturn this\n\t}\n\n\ttan(V: VecLike): Vec {\n\t\treturn this.sub(V).uni()\n\t}\n\n\tdist(V: VecLike): number {\n\t\treturn Vec.Dist(this, V)\n\t}\n\n\tdistanceToLineSegment(A: VecLike, B: VecLike): number {\n\t\treturn Vec.DistanceToLineSegment(A, B, this)\n\t}\n\n\tslope(B: VecLike): number {\n\t\treturn Vec.Slope(this, B)\n\t}\n\n\tsnapToGrid(gridSize: number) {\n\t\tthis.x = Math.round(this.x / gridSize) * gridSize\n\t\tthis.y = Math.round(this.y / gridSize) * gridSize\n\t\treturn this\n\t}\n\n\tangle(B: VecLike): number {\n\t\treturn Vec.Angle(this, B)\n\t}\n\n\ttoAngle() {\n\t\treturn Vec.ToAngle(this)\n\t}\n\n\tlrp(B: VecLike, t: number): Vec {\n\t\tthis.x = this.x + (B.x - this.x) * t\n\t\tthis.y = this.y + (B.y - this.y) * t\n\t\treturn this\n\t}\n\n\tequals(B: VecLike) {\n\t\treturn Vec.Equals(this, B)\n\t}\n\n\tequalsXY(x: number, y: number) {\n\t\treturn Vec.EqualsXY(this, x, y)\n\t}\n\n\ttoFixed() {\n\t\tthis.x = toFixed(this.x)\n\t\tthis.y = toFixed(this.y)\n\t\treturn this\n\t}\n\n\ttoString() {\n\t\treturn Vec.ToString(Vec.ToFixed(this))\n\t}\n\n\ttoJson(): VecModel {\n\t\treturn Vec.ToJson(this)\n\t}\n\n\ttoArray(): number[] {\n\t\treturn Vec.ToArray(this)\n\t}\n\n\tstatic Add(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x + B.x, A.y + B.y)\n\t}\n\n\tstatic AddXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x + x, A.y + y)\n\t}\n\n\tstatic Sub(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x - B.x, A.y - B.y)\n\t}\n\n\tstatic SubXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x - x, A.y - y)\n\t}\n\n\tstatic AddScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x + n, A.y + n)\n\t}\n\n\tstatic SubScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x - n, A.y - n)\n\t}\n\n\tstatic Div(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x / t, A.y / t)\n\t}\n\n\tstatic Mul(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x * t, A.y * t)\n\t}\n\n\tstatic DivV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x / B.x, A.y / B.y)\n\t}\n\n\tstatic MulV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x * B.x, A.y * B.y)\n\t}\n\n\tstatic Neg(A: VecLike): Vec {\n\t\treturn new Vec(-A.x, -A.y)\n\t}\n\n\t/**\n\t * Get the perpendicular vector to A.\n\t */\n\tstatic Per(A: VecLike): Vec {\n\t\treturn new Vec(A.y, -A.x)\n\t}\n\n\tstatic Abs(A: VecLike): Vec {\n\t\treturn new Vec(Math.abs(A.x), Math.abs(A.y))\n\t}\n\n\t// Get the distance between two points.\n\tstatic Dist(A: VecLike, B: VecLike): number {\n\t\treturn ((A.y - B.y) ** 2 + (A.x - B.x) ** 2) ** 0.5\n\t}\n\n\t// Get the Manhattan distance between two points.\n\tstatic ManhattanDist(A: VecLike, B: VecLike): number {\n\t\treturn Math.abs(A.x - B.x) + Math.abs(A.y - B.y)\n\t}\n\n\t// Get whether a distance between two points is less than a number. This is faster to calulate than using `Vec.Dist(a, b) < n`.\n\tstatic DistMin(A: VecLike, B: VecLike, n: number): boolean {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) < n ** 2\n\t}\n\n\t// Get the squared distance between two points. This is faster to calculate (no square root) so useful for \"minimum distance\" checks where the actual measurement does not matter.\n\tstatic Dist2(A: VecLike, B: VecLike): number {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)\n\t}\n\n\t/**\n\t * Dot product of two vectors which is used to calculate the angle between them.\n\t */\n\tstatic Dpr(A: VecLike, B: VecLike): number {\n\t\treturn A.x * B.x + A.y * B.y\n\t}\n\n\tstatic Cross(A: VecLike, V: VecLike) {\n\t\treturn new Vec(\n\t\t\tA.y * V.z! - A.z! * V.y,\n\t\t\tA.z! * V.x - A.x * V.z!\n\t\t\t// A.z = A.x * V.y - A.y * V.x\n\t\t)\n\t}\n\n\t/**\n\t * Cross product of two vectors which is used to calculate the area of a parallelogram.\n\t */\n\tstatic Cpr(A: VecLike, B: VecLike) {\n\t\treturn A.x * B.y - B.x * A.y\n\t}\n\n\tstatic Len2(A: VecLike): number {\n\t\treturn A.x * A.x + A.y * A.y\n\t}\n\n\tstatic Len(A: VecLike): number {\n\t\treturn (A.x * A.x + A.y * A.y) ** 0.5\n\t}\n\n\t/**\n\t * Get the projection of A onto B.\n\t */\n\tstatic Pry(A: VecLike, B: VecLike): number {\n\t\treturn Vec.Dpr(A, B) / Vec.Len(B)\n\t}\n\n\t/**\n\t * Get the unit vector of A.\n\t */\n\tstatic Uni(A: VecLike) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec(l === 0 ? 0 : A.x / l, l === 0 ? 0 : A.y / l)\n\t}\n\n\tstatic Tan(A: VecLike, B: VecLike): Vec {\n\t\treturn Vec.Uni(Vec.Sub(A, B))\n\t}\n\n\tstatic Min(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.min(A.x, B.x), Math.min(A.y, B.y))\n\t}\n\n\tstatic Max(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.max(A.x, B.x), Math.max(A.y, B.y))\n\t}\n\n\tstatic From({ x, y, z = 1 }: VecModel) {\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tstatic FromArray(v: number[]): Vec {\n\t\treturn new Vec(v[0], v[1])\n\t}\n\n\tstatic Rot(A: VecLike, r = 0): Vec {\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(A.x * c - A.y * s, A.x * s + A.y * c)\n\t}\n\n\tstatic RotWith(A: VecLike, C: VecLike, r: number): Vec {\n\t\tconst x = A.x - C.x\n\t\tconst y = A.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(C.x + (x * c - y * s), C.y + (x * s + y * c))\n\t}\n\n\t/**\n\t * Get the nearest point on a line with a known unit vector that passes through point A\n\t *\n\t * ```ts\n\t * Vec.nearestPointOnLineThroughPoint(A, u, Point)\n\t * ```\n\t *\n\t * @param A - Any point on the line\n\t * @param u - The unit vector for the line.\n\t * @param P - A point not on the line to test.\n\t */\n\tstatic NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec {\n\t\t// Inlined: t = Vec.Sub(P, A).pry(u), return Vec.Mul(u, t).add(A)\n\t\tconst t = (P.x - A.x) * u.x + (P.y - A.y) * u.y\n\t\treturn new Vec(A.x + u.x * t, A.y + u.y * t)\n\t}\n\n\tstatic NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): Vec {\n\t\t// Parametric projection of P onto segment AB.\n\t\t// Inlined: d = Vec.Sub(B, A); t = Vec.Sub(P, A).pry(d) / d.len(); return Vec.Lrp(A, B, t)\n\t\tconst dx = B.x - A.x\n\t\tconst dy = B.y - A.y\n\t\tconst d2 = dx * dx + dy * dy\n\n\t\tif (d2 === 0) return Vec.From(A)\n\n\t\tlet t = ((P.x - A.x) * dx + (P.y - A.y) * dy) / d2\n\n\t\tif (clamp) {\n\t\t\tif (t < 0) t = 0\n\t\t\telse if (t > 1) t = 1\n\t\t}\n\n\t\treturn new Vec(A.x + t * dx, A.y + t * dy)\n\t}\n\n\tstatic DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number {\n\t\t// Inlined: Vec.Dist(P, Vec.NearestPointOnLineThroughPoint(A, u, P))\n\t\t// Uses |cross(P-A, u)| which equals the perpendicular distance when u is a unit vector.\n\t\tconst dx = P.x - A.x\n\t\tconst dy = P.y - A.y\n\t\treturn Math.abs(dx * u.y - dy * u.x)\n\t}\n\n\tstatic DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): number {\n\t\t// Inlined: Vec.Dist(P, Vec.NearestPointOnLineSegment(A, B, P, clamp))\n\t\t// Computes the nearest point via parametric t-projection then returns the scalar distance,\n\t\t// avoiding the intermediate Vec allocation that NearestPointOnLineSegment would create.\n\t\tconst dx = B.x - A.x\n\t\tconst dy = B.y - A.y\n\t\tconst d2 = dx * dx + dy * dy\n\n\t\tif (d2 === 0) return Vec.Dist(A, P)\n\n\t\tlet t = ((P.x - A.x) * dx + (P.y - A.y) * dy) / d2\n\n\t\tif (clamp) {\n\t\t\tif (t < 0) t = 0\n\t\t\telse if (t > 1) t = 1\n\t\t}\n\n\t\tconst nx = A.x + t * dx - P.x\n\t\tconst ny = A.y + t * dy - P.y\n\t\treturn Math.sqrt(nx * nx + ny * ny)\n\t}\n\n\tstatic Snap(A: VecLike, step = 1) {\n\t\treturn new Vec(Math.round(A.x / step) * step, Math.round(A.y / step) * step)\n\t}\n\n\tstatic Cast(A: VecLike): Vec {\n\t\tif (A instanceof Vec) return A\n\t\treturn Vec.From(A)\n\t}\n\n\tstatic Slope(A: VecLike, B: VecLike): number {\n\t\tif (A.x === B.y) return NaN\n\t\treturn (A.y - B.y) / (A.x - B.x)\n\t}\n\n\tstatic IsNaN(A: VecLike): boolean {\n\t\treturn isNaN(A.x) || isNaN(A.y)\n\t}\n\n\tstatic IsFinite(A: VecLike): boolean {\n\t\treturn Number.isFinite(A.x) && Number.isFinite(A.y)\n\t}\n\n\t/**\n\t * Get the angle from position A to position B.\n\t */\n\tstatic Angle(A: VecLike, B: VecLike): number {\n\t\treturn Math.atan2(B.y - A.y, B.x - A.x)\n\t}\n\n\t/**\n\t * Get the angle between vector A and vector B. This will return the smallest angle between the\n\t * two vectors, between -\u03C0 and \u03C0. The sign indicates direction of angle.\n\t */\n\tstatic AngleBetween(A: VecLike, B: VecLike): number {\n\t\t// p = dot(A, B); n = |A| * |B| (uses x*x instead of Math.pow(x, 2))\n\t\tconst p = A.x * B.x + A.y * B.y\n\t\tconst n = Math.sqrt((A.x * A.x + A.y * A.y) * (B.x * B.x + B.y * B.y))\n\t\tconst sign = A.x * B.y - A.y * B.x < 0 ? -1 : 1\n\t\treturn sign * Math.acos(clamp(p / n, -1, 1))\n\t}\n\n\t/**\n\t * Linearly interpolate between two points.\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param t - The interpolation value between 0 and 1.\n\t * @returns The interpolated point.\n\t */\n\tstatic Lrp(A: VecLike, B: VecLike, t: number): Vec {\n\t\t// Inlined: Vec.Sub(B, A).mul(t).add(A) \u2014 note: only interpolates x/y, not z.\n\t\treturn new Vec(A.x + (B.x - A.x) * t, A.y + (B.y - A.y) * t)\n\t}\n\n\tstatic Med(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec((A.x + B.x) / 2, (A.y + B.y) / 2)\n\t}\n\n\tstatic Equals(A: VecLike, B: VecLike): boolean {\n\t\treturn Math.abs(A.x - B.x) < 0.0001 && Math.abs(A.y - B.y) < 0.0001\n\t}\n\n\tstatic EqualsXY(A: VecLike, x: number, y: number): boolean {\n\t\treturn A.x === x && A.y === y\n\t}\n\n\tstatic Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n\t\treturn (C.x - A.x) * (B.y - A.y) - (B.x - A.x) * (C.y - A.y) < 0\n\t}\n\n\tstatic Rescale(A: VecLike, n: number) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec((n * A.x) / l, (n * A.y) / l)\n\t}\n\n\tstatic ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike) {\n\t\treturn Vec.Sub(A, origin).mul(scale).add(origin)\n\t}\n\n\tstatic ToFixed(A: VecLike) {\n\t\treturn new Vec(toFixed(A.x), toFixed(A.y))\n\t}\n\n\tstatic ToInt(A: VecLike) {\n\t\treturn new Vec(\n\t\t\tparseInt(A.x.toFixed(0)),\n\t\t\tparseInt(A.y.toFixed(0)),\n\t\t\tparseInt((A.z ?? 0).toFixed(0))\n\t\t)\n\t}\n\n\tstatic ToCss(A: VecLike) {\n\t\treturn `${A.x},${A.y}`\n\t}\n\n\tstatic Nudge(A: VecLike, B: VecLike, distance: number) {\n\t\treturn Vec.Add(A, Vec.Tan(B, A).mul(distance))\n\t}\n\n\tstatic ToString(A: VecLike) {\n\t\treturn `${A.x}, ${A.y}`\n\t}\n\n\tstatic ToAngle(A: VecLike) {\n\t\tlet r = Math.atan2(A.y, A.x)\n\t\tif (r < 0) r += Math.PI * 2\n\n\t\treturn r\n\t}\n\n\tstatic FromAngle(r: number, length = 1) {\n\t\treturn new Vec(Math.cos(r) * length, Math.sin(r) * length)\n\t}\n\n\tstatic ToArray(A: VecLike) {\n\t\treturn [A.x, A.y, A.z!]\n\t}\n\n\tstatic ToJson(A: VecLike) {\n\t\tconst { x, y, z } = A\n\t\treturn { x, y, z }\n\t}\n\n\tstatic Average(arr: VecLike[]) {\n\t\tconst len = arr.length\n\t\tconst avg = new Vec(0, 0)\n\t\tif (len === 0) {\n\t\t\treturn avg\n\t\t}\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tavg.add(arr[i])\n\t\t}\n\t\treturn avg.div(len)\n\t}\n\n\tstatic Clamp(A: Vec, min: number, max?: number) {\n\t\tif (max === undefined) {\n\t\t\treturn new Vec(Math.min(Math.max(A.x, min)), Math.min(Math.max(A.y, min)))\n\t\t}\n\n\t\treturn new Vec(Math.min(Math.max(A.x, min), max), Math.min(Math.max(A.y, min), max))\n\t}\n\n\t/**\n\t * Get an array of points (with simulated pressure) between two points.\n\t *\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param steps - The number of points to return.\n\t * @param ease - The easing to use.\n\t */\n\tstatic PointsBetween(A: VecModel, B: VecModel, steps = 6, ease = easeInQuad): Vec[] {\n\t\tconst results: Vec[] = []\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = ease(i / (steps - 1))\n\t\t\tconst point = Vec.Lrp(A, B, t)\n\t\t\tpoint.z = Math.min(1, 0.5 + Math.abs(0.5 - easeInOutQuad(t)) * 0.65)\n\t\t\tresults.push(point)\n\t\t}\n\n\t\treturn results\n\t}\n\n\tstatic SnapToGrid(A: VecLike, gridSize = 8) {\n\t\treturn new Vec(Math.round(A.x / gridSize) * gridSize, Math.round(A.y / gridSize) * gridSize)\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["clamp"]
7
7
  }
@@ -43,6 +43,17 @@ function setStyleProperty(elm, property, value) {
43
43
  if (!elm) return;
44
44
  elm.style.setProperty(property, String(value));
45
45
  }
46
+ function moveElementInto(parent, element) {
47
+ if (element.isConnected && parent.isConnected && typeof parent.moveBefore === "function" && element.ownerDocument === parent.ownerDocument) {
48
+ try {
49
+ ;
50
+ parent.moveBefore(element, null);
51
+ return;
52
+ } catch {
53
+ }
54
+ }
55
+ parent.appendChild(element);
56
+ }
46
57
  function elementShouldCaptureKeys(el, includeButtonsAndMenus = true) {
47
58
  if (!el) return false;
48
59
  const tagName = el.tagName.toLowerCase();
@@ -68,6 +79,7 @@ export {
68
79
  getGlobalDocument,
69
80
  getGlobalWindow,
70
81
  loopToHtmlElement,
82
+ moveElementInto,
71
83
  preventDefault,
72
84
  releasePointerCapture,
73
85
  setPointerCapture,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/dom.ts"],
4
- "sourcesContent": ["/*\nThis is used to facilitate double clicking and pointer capture on elements.\n\nThe events in this file are possibly set on individual SVG elements, \nsuch as handles or corner handles, rather than on HTML elements or \nSVGSVGElements. Raw SVG elements do not support pointerCapture in\nmost cases, meaning that in order for pointer capture to work, we \nneed to crawl up the DOM tree to find the nearest HTML element. Then,\nin order for that element to also call the `onPointerUp` event from\nthis file, we need to manually set that event on that element and\nlater remove it when the pointerup occurs. This is a potential leak\nif the user clicks on a handle but the pointerup does not fire for\nwhatever reason.\n*/\n\nimport { debugFlags, pointerCaptureTrackingObject } from './debug-flags'\n\n/** @public */\nexport function loopToHtmlElement(elm: Element): HTMLElement {\n\tif (elm.nodeType === Node.ELEMENT_NODE) return elm as HTMLElement\n\tif (elm.parentElement) return loopToHtmlElement(elm.parentElement)\n\telse throw Error('Could not find a parent element of an HTML type!')\n}\n\n/**\n * This function calls `event.preventDefault()` for you. Why is that useful?\n *\n * Because if you enable `window.preventDefaultLogging = true` it'll log out a message when it\n * happens. Because we use console.warn rather than (log) you'll get a stack trace in the inspector\n * telling you exactly where it happened. This is important because `e.preventDefault()` is the\n * source of many bugs, but unfortunately it can't be avoided because it also stops a lot of default\n * behaviour which doesn't make sense in our UI\n *\n * @param event - To prevent default on\n * @public\n */\nexport function preventDefault(event: React.BaseSyntheticEvent | Event) {\n\tif ('cancelable' in event && !event.cancelable) return\n\tevent.preventDefault()\n\tif (debugFlags.logPreventDefaults.get()) {\n\t\tconsole.warn('preventDefault called on event:', event)\n\t}\n}\n\n/** @public */\nexport function setPointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\telement.setPointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\ttrackingObj.set(element, (trackingObj.get(element) ?? 0) + 1)\n\t\tconsole.warn('setPointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport function releasePointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\tif (!element.hasPointerCapture(event.pointerId)) {\n\t\treturn\n\t}\n\n\telement.releasePointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\tif (trackingObj.get(element) === 1) {\n\t\t\ttrackingObj.delete(element)\n\t\t} else if (trackingObj.has(element)) {\n\t\t\ttrackingObj.set(element, trackingObj.get(element)! - 1)\n\t\t} else {\n\t\t\tconsole.warn('Release without capture')\n\t\t}\n\t\tconsole.warn('releasePointerCapture called on element:', element, event)\n\t}\n}\n\n/**\n * Calls `event.stopPropagation()`.\n *\n * @deprecated Use {@link Editor.markEventAsHandled} instead, or manually call `event.stopPropagation()` if\n * that's what you really want.\n *\n * @public\n */\nexport function stopEventPropagation(e: any) {\n\treturn e.stopPropagation()\n}\n\n/** @internal */\nexport function setStyleProperty(\n\telm: HTMLElement | null,\n\tproperty: string,\n\tvalue: string | number\n) {\n\tif (!elm) return\n\telm.style.setProperty(property, String(value))\n}\n\n/** @internal */\nexport function elementShouldCaptureKeys(el: Element | null, includeButtonsAndMenus = true) {\n\tif (!el) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\treturn (\n\t\t(el as HTMLElement).isContentEditable ||\n\t\ttagName === 'input' ||\n\t\ttagName === 'textarea' ||\n\t\t(includeButtonsAndMenus && tagName === 'select') ||\n\t\t(includeButtonsAndMenus && tagName === 'button') ||\n\t\tel.classList.contains('tlui-slider__thumb')\n\t)\n}\n\n/**\n * Returns the global `document`. Use this instead of bare `document` to satisfy lint rules.\n *\n * When you have a DOM node or editor instance, prefer the scoped versions instead:\n * - `getOwnerDocument(node)` \u2013 the document that owns a specific DOM node\n * - `editor.getContainerDocument()` \u2013 the document where the editor is mounted\n *\n * @internal\n */\nexport function getGlobalDocument(): Document {\n\t// eslint-disable-next-line no-restricted-globals\n\tif (typeof document !== 'undefined') return document\n\treturn globalThis.document\n}\n\n/**\n * Returns the global `window`. Use this instead of bare `window` to satisfy lint rules.\n *\n * When you have a DOM node or editor instance, prefer the scoped versions instead:\n * - `getOwnerWindow(node)` \u2013 the window that owns a specific DOM node\n * - `editor.getContainerWindow()` \u2013 the window where the editor is mounted\n *\n * @internal\n */\nexport function getGlobalWindow(): Window & typeof globalThis {\n\tif (typeof window !== 'undefined') return window as Window & typeof globalThis\n\treturn globalThis as Window & typeof globalThis\n}\n\n/** @internal */\nexport function activeElementShouldCaptureKeys(includeButtonsAndMenus = true, doc?: Document) {\n\treturn elementShouldCaptureKeys(\n\t\t(doc ?? getGlobalDocument()).activeElement,\n\t\tincludeButtonsAndMenus\n\t)\n}\n"],
5
- "mappings": "AAeA,SAAS,YAAY,oCAAoC;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,IAAI,aAAa,KAAK,aAAc,QAAO;AAC/C,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,MAAI,gBAAgB,SAAS,CAAC,MAAM,WAAY;AAChD,QAAM,eAAe;AACrB,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,gBAAY,IAAI,UAAU,YAAY,IAAI,OAAO,KAAK,KAAK,CAAC;AAC5D,YAAQ,KAAK,wCAAwC,SAAS,KAAK;AAAA,EACpE;AACD;AAGO,SAAS,sBACf,SACA,OACC;AACD,MAAI,CAAC,QAAQ,kBAAkB,MAAM,SAAS,GAAG;AAChD;AAAA,EACD;AAEA,UAAQ,sBAAsB,MAAM,SAAS;AAC7C,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,QAAI,YAAY,IAAI,OAAO,MAAM,GAAG;AACnC,kBAAY,OAAO,OAAO;AAAA,IAC3B,WAAW,YAAY,IAAI,OAAO,GAAG;AACpC,kBAAY,IAAI,SAAS,YAAY,IAAI,OAAO,IAAK,CAAC;AAAA,IACvD,OAAO;AACN,cAAQ,KAAK,yBAAyB;AAAA,IACvC;AACA,YAAQ,KAAK,4CAA4C,SAAS,KAAK;AAAA,EACxE;AACD;AAUO,SAAS,qBAAqB,GAAQ;AAC5C,SAAO,EAAE,gBAAgB;AAC1B;AAGO,SAAS,iBACf,KACA,UACA,OACC;AACD,MAAI,CAAC,IAAK;AACV,MAAI,MAAM,YAAY,UAAU,OAAO,KAAK,CAAC;AAC9C;AAGO,SAAS,yBAAyB,IAAoB,yBAAyB,MAAM;AAC3F,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,UAAU,GAAG,QAAQ,YAAY;AACvC,SACE,GAAmB,qBACpB,YAAY,WACZ,YAAY,cACX,0BAA0B,YAAY,YACtC,0BAA0B,YAAY,YACvC,GAAG,UAAU,SAAS,oBAAoB;AAE5C;AAWO,SAAS,oBAA8B;AAE7C,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO,WAAW;AACnB;AAWO,SAAS,kBAA8C;AAC7D,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO;AACR;AAGO,SAAS,+BAA+B,yBAAyB,MAAM,KAAgB;AAC7F,SAAO;AAAA,KACL,OAAO,kBAAkB,GAAG;AAAA,IAC7B;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["/*\nThis is used to facilitate double clicking and pointer capture on elements.\n\nThe events in this file are possibly set on individual SVG elements, \nsuch as handles or corner handles, rather than on HTML elements or \nSVGSVGElements. Raw SVG elements do not support pointerCapture in\nmost cases, meaning that in order for pointer capture to work, we \nneed to crawl up the DOM tree to find the nearest HTML element. Then,\nin order for that element to also call the `onPointerUp` event from\nthis file, we need to manually set that event on that element and\nlater remove it when the pointerup occurs. This is a potential leak\nif the user clicks on a handle but the pointerup does not fire for\nwhatever reason.\n*/\n\nimport { debugFlags, pointerCaptureTrackingObject } from './debug-flags'\n\n/** @public */\nexport function loopToHtmlElement(elm: Element): HTMLElement {\n\tif (elm.nodeType === Node.ELEMENT_NODE) return elm as HTMLElement\n\tif (elm.parentElement) return loopToHtmlElement(elm.parentElement)\n\telse throw Error('Could not find a parent element of an HTML type!')\n}\n\n/**\n * This function calls `event.preventDefault()` for you. Why is that useful?\n *\n * Because if you enable `window.preventDefaultLogging = true` it'll log out a message when it\n * happens. Because we use console.warn rather than (log) you'll get a stack trace in the inspector\n * telling you exactly where it happened. This is important because `e.preventDefault()` is the\n * source of many bugs, but unfortunately it can't be avoided because it also stops a lot of default\n * behaviour which doesn't make sense in our UI\n *\n * @param event - To prevent default on\n * @public\n */\nexport function preventDefault(event: React.BaseSyntheticEvent | Event) {\n\tif ('cancelable' in event && !event.cancelable) return\n\tevent.preventDefault()\n\tif (debugFlags.logPreventDefaults.get()) {\n\t\tconsole.warn('preventDefault called on event:', event)\n\t}\n}\n\n/** @public */\nexport function setPointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\telement.setPointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\ttrackingObj.set(element, (trackingObj.get(element) ?? 0) + 1)\n\t\tconsole.warn('setPointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport function releasePointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\tif (!element.hasPointerCapture(event.pointerId)) {\n\t\treturn\n\t}\n\n\telement.releasePointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\tif (trackingObj.get(element) === 1) {\n\t\t\ttrackingObj.delete(element)\n\t\t} else if (trackingObj.has(element)) {\n\t\t\ttrackingObj.set(element, trackingObj.get(element)! - 1)\n\t\t} else {\n\t\t\tconsole.warn('Release without capture')\n\t\t}\n\t\tconsole.warn('releasePointerCapture called on element:', element, event)\n\t}\n}\n\n/**\n * Calls `event.stopPropagation()`.\n *\n * @deprecated Use {@link Editor.markEventAsHandled} instead, or manually call `event.stopPropagation()` if\n * that's what you really want.\n *\n * @public\n */\nexport function stopEventPropagation(e: any) {\n\treturn e.stopPropagation()\n}\n\n/** @internal */\nexport function setStyleProperty(\n\telm: HTMLElement | null,\n\tproperty: string,\n\tvalue: string | number\n) {\n\tif (!elm) return\n\telm.style.setProperty(property, String(value))\n}\n\n/**\n * Move an element into a new parent, preserving its state where the platform allows it.\n *\n * Uses `Node.moveBefore` (Chromium 133+, Firefox 144+) when both the element and parent are\n * connected to the same document \u2014 this moves the element without resetting its state, so\n * iframes don't reload and media keeps playing. Otherwise (older browsers, disconnected nodes,\n * or a cross-document move) it falls back to `appendChild`, which moves the element but resets\n * its state like an iframe reload.\n *\n * This is the primitive tldraw uses to adopt `ShapeUtil.getAppOwnedElement` elements, exposed so\n * apps can perform symmetric state-preserving moves from `ShapeUtil.onReleaseAppOwnedElement` \u2014\n * for example moving an element to an off-canvas parking lot between editor sessions.\n *\n * @param parent - The element to move `element` into, as its last child.\n * @param element - The element to move.\n * @public\n */\nexport function moveElementInto(parent: HTMLElement, element: HTMLElement) {\n\tif (\n\t\telement.isConnected &&\n\t\tparent.isConnected &&\n\t\ttypeof (parent as any).moveBefore === 'function' &&\n\t\telement.ownerDocument === parent.ownerDocument\n\t) {\n\t\ttry {\n\t\t\t;(parent as any).moveBefore(element, null)\n\t\t\treturn\n\t\t} catch {\n\t\t\t// fall through to appendChild\n\t\t}\n\t}\n\tparent.appendChild(element)\n}\n\n/** @internal */\nexport function elementShouldCaptureKeys(el: Element | null, includeButtonsAndMenus = true) {\n\tif (!el) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\treturn (\n\t\t(el as HTMLElement).isContentEditable ||\n\t\ttagName === 'input' ||\n\t\ttagName === 'textarea' ||\n\t\t(includeButtonsAndMenus && tagName === 'select') ||\n\t\t(includeButtonsAndMenus && tagName === 'button') ||\n\t\tel.classList.contains('tlui-slider__thumb')\n\t)\n}\n\n/**\n * Returns the global `document`. Use this instead of bare `document` to satisfy lint rules.\n *\n * When you have a DOM node or editor instance, prefer the scoped versions instead:\n * - `getOwnerDocument(node)` \u2013 the document that owns a specific DOM node\n * - `editor.getContainerDocument()` \u2013 the document where the editor is mounted\n *\n * @internal\n */\nexport function getGlobalDocument(): Document {\n\t// eslint-disable-next-line no-restricted-globals\n\tif (typeof document !== 'undefined') return document\n\treturn globalThis.document\n}\n\n/**\n * Returns the global `window`. Use this instead of bare `window` to satisfy lint rules.\n *\n * When you have a DOM node or editor instance, prefer the scoped versions instead:\n * - `getOwnerWindow(node)` \u2013 the window that owns a specific DOM node\n * - `editor.getContainerWindow()` \u2013 the window where the editor is mounted\n *\n * @internal\n */\nexport function getGlobalWindow(): Window & typeof globalThis {\n\tif (typeof window !== 'undefined') return window as Window & typeof globalThis\n\treturn globalThis as Window & typeof globalThis\n}\n\n/** @internal */\nexport function activeElementShouldCaptureKeys(includeButtonsAndMenus = true, doc?: Document) {\n\treturn elementShouldCaptureKeys(\n\t\t(doc ?? getGlobalDocument()).activeElement,\n\t\tincludeButtonsAndMenus\n\t)\n}\n"],
5
+ "mappings": "AAeA,SAAS,YAAY,oCAAoC;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,IAAI,aAAa,KAAK,aAAc,QAAO;AAC/C,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,MAAI,gBAAgB,SAAS,CAAC,MAAM,WAAY;AAChD,QAAM,eAAe;AACrB,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,gBAAY,IAAI,UAAU,YAAY,IAAI,OAAO,KAAK,KAAK,CAAC;AAC5D,YAAQ,KAAK,wCAAwC,SAAS,KAAK;AAAA,EACpE;AACD;AAGO,SAAS,sBACf,SACA,OACC;AACD,MAAI,CAAC,QAAQ,kBAAkB,MAAM,SAAS,GAAG;AAChD;AAAA,EACD;AAEA,UAAQ,sBAAsB,MAAM,SAAS;AAC7C,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,QAAI,YAAY,IAAI,OAAO,MAAM,GAAG;AACnC,kBAAY,OAAO,OAAO;AAAA,IAC3B,WAAW,YAAY,IAAI,OAAO,GAAG;AACpC,kBAAY,IAAI,SAAS,YAAY,IAAI,OAAO,IAAK,CAAC;AAAA,IACvD,OAAO;AACN,cAAQ,KAAK,yBAAyB;AAAA,IACvC;AACA,YAAQ,KAAK,4CAA4C,SAAS,KAAK;AAAA,EACxE;AACD;AAUO,SAAS,qBAAqB,GAAQ;AAC5C,SAAO,EAAE,gBAAgB;AAC1B;AAGO,SAAS,iBACf,KACA,UACA,OACC;AACD,MAAI,CAAC,IAAK;AACV,MAAI,MAAM,YAAY,UAAU,OAAO,KAAK,CAAC;AAC9C;AAmBO,SAAS,gBAAgB,QAAqB,SAAsB;AAC1E,MACC,QAAQ,eACR,OAAO,eACP,OAAQ,OAAe,eAAe,cACtC,QAAQ,kBAAkB,OAAO,eAChC;AACD,QAAI;AACH;AAAC,MAAC,OAAe,WAAW,SAAS,IAAI;AACzC;AAAA,IACD,QAAQ;AAAA,IAER;AAAA,EACD;AACA,SAAO,YAAY,OAAO;AAC3B;AAGO,SAAS,yBAAyB,IAAoB,yBAAyB,MAAM;AAC3F,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,UAAU,GAAG,QAAQ,YAAY;AACvC,SACE,GAAmB,qBACpB,YAAY,WACZ,YAAY,cACX,0BAA0B,YAAY,YACtC,0BAA0B,YAAY,YACvC,GAAG,UAAU,SAAS,oBAAoB;AAE5C;AAWO,SAAS,oBAA8B;AAE7C,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO,WAAW;AACnB;AAWO,SAAS,kBAA8C;AAC7D,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO;AACR;AAGO,SAAS,+BAA+B,yBAAyB,MAAM,KAAgB;AAC7F,SAAO;AAAA,KACL,OAAO,kBAAkB,GAAG;AAAA,IAC7B;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import { isAccelKey } from "./keyboard.mjs";
2
+ import { getPointerEventButton } from "./pointer.mjs";
2
3
  function getPointerInfo(editor, e) {
3
4
  editor.markEventAsHandled(e);
4
5
  return {
@@ -13,7 +14,7 @@ function getPointerInfo(editor, e) {
13
14
  metaKey: e.metaKey,
14
15
  accelKey: isAccelKey(e),
15
16
  pointerId: e.pointerId,
16
- button: e.button,
17
+ button: getPointerEventButton(e),
17
18
  isPen: e.pointerType === "pen"
18
19
  };
19
20
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/getPointerInfo.ts"],
4
- "sourcesContent": ["import type React from 'react'\nimport { Editor } from '../editor/Editor'\nimport { isAccelKey } from './keyboard'\n\n/** @public */\nexport function getPointerInfo(editor: Editor, e: React.PointerEvent | PointerEvent) {\n\teditor.markEventAsHandled(e)\n\n\treturn {\n\t\tpoint: {\n\t\t\tx: e.clientX,\n\t\t\ty: e.clientY,\n\t\t\tz: e.pressure,\n\t\t},\n\t\tshiftKey: e.shiftKey,\n\t\taltKey: e.altKey,\n\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\tmetaKey: e.metaKey,\n\t\taccelKey: isAccelKey(e),\n\t\tpointerId: e.pointerId,\n\t\tbutton: e.button,\n\t\tisPen: e.pointerType === 'pen',\n\t}\n}\n"],
5
- "mappings": "AAEA,SAAS,kBAAkB;AAGpB,SAAS,eAAe,QAAgB,GAAsC;AACpF,SAAO,mBAAmB,CAAC;AAE3B,SAAO;AAAA,IACN,OAAO;AAAA,MACN,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,IACN;AAAA,IACA,UAAU,EAAE;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE,WAAW,EAAE;AAAA,IACxB,SAAS,EAAE;AAAA,IACX,UAAU,WAAW,CAAC;AAAA,IACtB,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,OAAO,EAAE,gBAAgB;AAAA,EAC1B;AACD;",
4
+ "sourcesContent": ["import type React from 'react'\nimport { Editor } from '../editor/Editor'\nimport { isAccelKey } from './keyboard'\nimport { getPointerEventButton } from './pointer'\n\n/** @public */\nexport function getPointerInfo(editor: Editor, e: React.PointerEvent | PointerEvent) {\n\teditor.markEventAsHandled(e)\n\n\treturn {\n\t\tpoint: {\n\t\t\tx: e.clientX,\n\t\t\ty: e.clientY,\n\t\t\tz: e.pressure,\n\t\t},\n\t\tshiftKey: e.shiftKey,\n\t\taltKey: e.altKey,\n\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\tmetaKey: e.metaKey,\n\t\taccelKey: isAccelKey(e),\n\t\tpointerId: e.pointerId,\n\t\tbutton: getPointerEventButton(e),\n\t\tisPen: e.pointerType === 'pen',\n\t}\n}\n"],
5
+ "mappings": "AAEA,SAAS,kBAAkB;AAC3B,SAAS,6BAA6B;AAG/B,SAAS,eAAe,QAAgB,GAAsC;AACpF,SAAO,mBAAmB,CAAC;AAE3B,SAAO;AAAA,IACN,OAAO;AAAA,MACN,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,IACN;AAAA,IACA,UAAU,EAAE;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE,WAAW,EAAE;AAAA,IACxB,SAAS,EAAE;AAAA,IACX,UAAU,WAAW,CAAC;AAAA,IACtB,WAAW,EAAE;AAAA,IACb,QAAQ,sBAAsB,CAAC;AAAA,IAC/B,OAAO,EAAE,gBAAgB;AAAA,EAC1B;AACD;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,17 @@
1
+ import { tlenv } from "../globals/environment.mjs";
2
+ function isDirectDisplayPen(e) {
3
+ if (e.pointerType !== "pen") return false;
4
+ return tlenv.isTouchDevice;
5
+ }
6
+ function isSecondaryClickEvent(e) {
7
+ return e.button === 2 || tlenv.isDarwin && e.button === 0 && e.ctrlKey && !e.metaKey;
8
+ }
9
+ function getPointerEventButton(e) {
10
+ return isSecondaryClickEvent(e) ? 2 : e.button;
11
+ }
12
+ export {
13
+ getPointerEventButton,
14
+ isDirectDisplayPen,
15
+ isSecondaryClickEvent
16
+ };
17
+ //# sourceMappingURL=pointer.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/utils/pointer.ts"],
4
+ "sourcesContent": ["import type React from 'react'\nimport { tlenv } from '../globals/environment'\n\n/**\n * Decide whether a pen pointer event looks like direct manipulation on the display (e.g. Apple\n * Pencil on an iPad or a Surface Pen on a touchscreen) rather than indirect input from a desktop\n * graphics tablet (e.g. a Wacom Intuos).\n *\n * We can't tell the two apart from the pointer event itself: both report `pointerType: 'pen'`, and\n * implicit pointer capture \u2014 which in theory distinguishes direct-manipulation pointers \u2014 isn't\n * reliably observable across browsers (notably WebKit/iPad). Instead we key off the device: a\n * direct-display pen draws on a touch-capable screen, while an indirect graphics tablet is used on\n * a non-touch desktop alongside a mouse. A device with no touch input therefore can't host a\n * direct-display pen.\n *\n * Note this uses {@link tlenv.isTouchDevice} \u2014 the device's fixed touch capability \u2014 not the\n * editor's dynamic `isCoarsePointer` state, which a pen `pointerdown` flips to coarse regardless\n * of device.\n *\n * @internal\n */\nexport function isDirectDisplayPen(e: React.PointerEvent | PointerEvent): boolean {\n\tif (e.pointerType !== 'pen') return false\n\treturn tlenv.isTouchDevice\n}\n\n/** @internal */\ninterface PointerLike {\n\tbutton: number\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\n\n/** @internal */\nexport function isSecondaryClickEvent(e: PointerLike) {\n\treturn e.button === 2 || (tlenv.isDarwin && e.button === 0 && e.ctrlKey && !e.metaKey)\n}\n\n/** @internal */\nexport function getPointerEventButton(e: PointerLike) {\n\treturn isSecondaryClickEvent(e) ? 2 : e.button\n}\n"],
5
+ "mappings": "AACA,SAAS,aAAa;AAoBf,SAAS,mBAAmB,GAA+C;AACjF,MAAI,EAAE,gBAAgB,MAAO,QAAO;AACpC,SAAO,MAAM;AACd;AAUO,SAAS,sBAAsB,GAAgB;AACrD,SAAO,EAAE,WAAW,KAAM,MAAM,YAAY,EAAE,WAAW,KAAK,EAAE,WAAW,CAAC,EAAE;AAC/E;AAGO,SAAS,sBAAsB,GAAgB;AACrD,SAAO,sBAAsB,CAAC,IAAI,IAAI,EAAE;AACzC;",
6
+ "names": []
7
+ }
@@ -1,8 +1,8 @@
1
- const version = "5.2.0-next.e2b8d10bf10e";
1
+ const version = "5.2.0";
2
2
  const publishDates = {
3
3
  major: "2026-05-06T16:28:18.473Z",
4
- minor: "2026-06-05T16:06:49.927Z",
5
- patch: "2026-06-05T16:06:49.927Z"
4
+ minor: "2026-07-01T09:20:01.735Z",
5
+ patch: "2026-07-01T09:20:01.735Z"
6
6
  };
7
7
  export {
8
8
  publishDates,
@@ -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 = '5.2.0-next.e2b8d10bf10e'\nexport const publishDates = {\n\tmajor: '2026-05-06T16:28:18.473Z',\n\tminor: '2026-06-05T16:06:49.927Z',\n\tpatch: '2026-06-05T16:06:49.927Z',\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 = '5.2.0'\nexport const publishDates = {\n\tmajor: '2026-05-06T16:28:18.473Z',\n\tminor: '2026-07-01T09:20:01.735Z',\n\tpatch: '2026-07-01T09:20:01.735Z',\n}\n"],
5
5
  "mappings": "AAGO,MAAM,UAAU;AAChB,MAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACR;",
6
6
  "names": []
7
7
  }
package/editor.css CHANGED
@@ -182,6 +182,7 @@
182
182
  --tl-color-text-0: hsl(0, 0%, 11%);
183
183
  --tl-color-text-1: hsl(0, 0%, 18%);
184
184
  --tl-color-text-3: hsl(204, 4%, 45%);
185
+ --tl-color-text-disabled: hsl(204, 4%, 55%);
185
186
  --tl-color-text-shadow: hsl(0, 0%, 100%);
186
187
  --tl-color-text-highlight: hsl(52, 100%, 50%);
187
188
  --tl-color-text-highlight-p3: color(display-p3 0.972 0.8205 0.05);
@@ -236,6 +237,7 @@
236
237
  --tl-color-text-0: hsl(0, 9%, 94%);
237
238
  --tl-color-text-1: hsl(0, 0%, 85%);
238
239
  --tl-color-text-3: hsl(204, 4%, 75%);
240
+ --tl-color-text-disabled: hsl(204, 4%, 50%);
239
241
  --tl-color-text-shadow: hsl(210, 13%, 18%);
240
242
  --tl-color-text-highlight: hsl(52, 100%, 41%);
241
243
  --tl-color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
@@ -762,17 +764,17 @@ input,
762
764
  .tl-rich-text ol {
763
765
  text-align: left;
764
766
  margin: 0;
765
- padding-left: 3.25ch;
767
+ padding-left: 1.625ch;
766
768
  /* Some resets, like Tailwind, nix the list styling. */
767
769
  list-style: revert;
768
770
  }
769
771
 
770
772
  .tl-rich-text ol:has(> li:nth-child(10)) {
771
- padding-left: 4.25ch;
773
+ padding-left: 2.625ch;
772
774
  }
773
775
 
774
776
  .tl-rich-text ol:has(> li:nth-child(100)) {
775
- padding-left: 5.25ch;
777
+ padding-left: 3.625ch;
776
778
  }
777
779
 
778
780
  .tl-rich-text h1,
@@ -811,6 +813,7 @@ input,
811
813
  .tl-theme__dark .tl-rich-text mark {
812
814
  background-color: var(--tl-color-text-highlight);
813
815
  color: currentColor;
816
+ text-shadow: none;
814
817
  }
815
818
 
816
819
  @supports (color: color(display-p3 1 1 1)) {
@@ -983,6 +986,15 @@ input,
983
986
  color: var(--tl-color-text-1);
984
987
  }
985
988
 
989
+ .tl-content-slot {
990
+ position: absolute;
991
+ inset: 0px;
992
+ height: 100%;
993
+ width: 100%;
994
+ pointer-events: none;
995
+ transform-origin: top left;
996
+ }
997
+
986
998
  /* -------------------- Group shape ------------------ */
987
999
 
988
1000
  .tl-group {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tldraw/editor",
3
3
  "description": "tldraw infinite canvas SDK (editor).",
4
- "version": "5.2.0-next.e2b8d10bf10e",
4
+ "version": "5.2.0",
5
5
  "author": {
6
6
  "name": "tldraw Inc.",
7
7
  "email": "hello@tldraw.com"
@@ -49,12 +49,12 @@
49
49
  "@tiptap/core": "^3.12.1",
50
50
  "@tiptap/pm": "^3.12.1",
51
51
  "@tiptap/react": "^3.12.1",
52
- "@tldraw/state": "5.2.0-next.e2b8d10bf10e",
53
- "@tldraw/state-react": "5.2.0-next.e2b8d10bf10e",
54
- "@tldraw/store": "5.2.0-next.e2b8d10bf10e",
55
- "@tldraw/tlschema": "5.2.0-next.e2b8d10bf10e",
56
- "@tldraw/utils": "5.2.0-next.e2b8d10bf10e",
57
- "@tldraw/validate": "5.2.0-next.e2b8d10bf10e",
52
+ "@tldraw/state": "5.2.0",
53
+ "@tldraw/state-react": "5.2.0",
54
+ "@tldraw/store": "5.2.0",
55
+ "@tldraw/tlschema": "5.2.0",
56
+ "@tldraw/utils": "5.2.0",
57
+ "@tldraw/validate": "5.2.0",
58
58
  "classnames": "^2.5.1",
59
59
  "eventemitter3": "^4.0.7",
60
60
  "idb": "^7.1.1",
@@ -80,7 +80,10 @@
80
80
  "react": "^19.2.1",
81
81
  "react-dom": "^19.2.1",
82
82
  "resize-observer-polyfill": "^1.5.1",
83
- "vitest": "^3.2.4"
83
+ "vitest": "^4.1.7"
84
+ },
85
+ "engines": {
86
+ "node": ">=22.12.0"
84
87
  },
85
88
  "module": "dist-esm/index.mjs",
86
89
  "source": "src/index.ts",
package/src/index.ts CHANGED
@@ -23,10 +23,6 @@ export {
23
23
  type TLErrorFallbackComponent,
24
24
  } from './lib/components/default-components/DefaultErrorFallback'
25
25
  export { DefaultGrid, type TLGridProps } from './lib/components/default-components/DefaultGrid'
26
- export {
27
- DefaultSelectionBackground,
28
- type TLSelectionBackgroundProps,
29
- } from './lib/components/default-components/DefaultSelectionBackground'
30
26
  export { type TLShapeErrorFallbackComponent } from './lib/components/default-components/DefaultShapeErrorFallback'
31
27
  export {
32
28
  DefaultShapeWrapper,
@@ -128,6 +124,7 @@ export {
128
124
  export { SpatialIndexManager } from './lib/editor/managers/SpatialIndexManager/SpatialIndexManager'
129
125
  export {
130
126
  TextManager,
127
+ resolveLineHeightPx,
131
128
  type BatchMeasurementRequest,
132
129
  type TLMeasuredTextSize,
133
130
  type TLMeasureTextOpts,
@@ -185,11 +182,7 @@ export {
185
182
  type TLOverlay,
186
183
  type TLOverlayUtilConstructor,
187
184
  } from './lib/editor/overlays/OverlayUtil'
188
- export {
189
- ShapeIndicatorOverlayUtil,
190
- strokeShapeIndicators,
191
- type TLShapeIndicatorOverlay,
192
- } from './lib/editor/overlays/ShapeIndicatorOverlayUtil'
185
+ export { strokeShapeIndicators } from './lib/editor/overlays/strokeShapeIndicators'
193
186
  export {
194
187
  getPerfectDashProps,
195
188
  type PerfectDashTerminal,
@@ -198,6 +191,7 @@ export { resizeBox, type ResizeBoxOptions } from './lib/editor/shapes/shared/res
198
191
  export { resizeScaled } from './lib/editor/shapes/shared/resizeScaled'
199
192
  export { BaseBoxShapeTool } from './lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool'
200
193
  export { maybeSnapToGrid } from './lib/editor/tools/BaseBoxShapeTool/children/Pointing'
194
+ export { cancelShapeCreationOnLongPress } from './lib/editor/tools/cancelShapeCreationOnLongPress'
201
195
  export { StateNode, type TLStateNodeConstructor } from './lib/editor/tools/StateNode'
202
196
  export { type TLContent } from './lib/editor/types/clipboard-types'
203
197
  export { type TLEventMap, type TLEventMapHandler } from './lib/editor/types/emit-types'
@@ -325,7 +319,6 @@ export {
325
319
  type SafeId,
326
320
  } from './lib/hooks/useSafeId'
327
321
  export { useTLSchemaFromUtils, useTLStore } from './lib/hooks/useTLStore'
328
- export { useTransform } from './lib/hooks/useTransform'
329
322
  export { useViewportHeight } from './lib/hooks/useViewportHeight'
330
323
  export {
331
324
  LicenseManager,
@@ -458,6 +451,7 @@ export {
458
451
  getGlobalDocument,
459
452
  getGlobalWindow,
460
453
  loopToHtmlElement,
454
+ moveElementInto,
461
455
  preventDefault,
462
456
  releasePointerCapture,
463
457
  setPointerCapture,
@@ -6,6 +6,7 @@ import { useEditor } from '../hooks/useEditor'
6
6
  import { Vec } from '../primitives/Vec'
7
7
  import { releasePointerCapture, setPointerCapture } from '../utils/dom'
8
8
  import { getPointerInfo } from '../utils/getPointerInfo'
9
+ import { getPointerEventButton } from '../utils/pointer'
9
10
 
10
11
  /**
11
12
  * When a menu is open, this component prevents the user from interacting with the canvas.
@@ -68,18 +69,19 @@ export function MenuClickCapture() {
68
69
 
69
70
  const handlePointerDown = useCallback(
70
71
  (e: PointerEvent) => {
71
- if (e.button !== 0 && e.button !== 2) return
72
+ const button = getPointerEventButton(e)
73
+ if (button !== 0 && button !== 2) return
72
74
 
73
75
  flushSync(() => setIsPointing(true))
74
76
  setPointerCapture(e.currentTarget, e)
75
77
  rPointerState.current = {
76
78
  isDown: true,
77
79
  isDragging: false,
78
- button: e.button,
80
+ button,
79
81
  start: new Vec(e.clientX, e.clientY),
80
82
  }
81
83
 
82
- if (e.button === 2) {
84
+ if (button === 2) {
83
85
  if (!editor.options.rightClickPanning) {
84
86
  // Right-click panning off: close the open menu and swallow the native
85
87
  // contextmenu that would otherwise briefly open a new one (causing a flash).
@@ -141,13 +143,15 @@ export function MenuClickCapture() {
141
143
 
142
144
  const handlePointerUp = useCallback(
143
145
  (e: PointerEvent) => {
144
- const isStaticRightClick = e.button === 2 && !rPointerState.current.isDragging
146
+ const isStaticRightClick =
147
+ rPointerState.current.button === 2 && !rPointerState.current.isDragging
145
148
 
146
149
  editor.dispatch({
147
150
  type: 'pointer',
148
151
  target: 'canvas',
149
152
  name: 'pointer_up',
150
153
  ...getPointerInfo(editor, e),
154
+ button: rPointerState.current.button === 2 ? 2 : getPointerEventButton(e),
151
155
  })
152
156
 
153
157
  if (isStaticRightClick && editor.options.rightClickPanning) {