@tldraw/editor 3.14.0-canary.8d29afff2d04 → 3.14.0-canary.8ea0ff8489db

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 (95) hide show
  1. package/dist-cjs/index.d.ts +51 -46
  2. package/dist-cjs/index.js +3 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/editor/Editor.js +1 -0
  5. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  6. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -20
  7. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  8. package/dist-cjs/lib/primitives/Box.js +6 -0
  9. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  10. package/dist-cjs/lib/primitives/Vec.js +13 -8
  11. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  12. package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
  13. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  14. package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
  15. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  16. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
  17. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  18. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
  19. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  20. package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -17
  21. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  22. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
  23. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  24. package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
  25. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  26. package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
  27. package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
  28. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
  29. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  30. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
  31. package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
  32. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
  33. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  34. package/dist-cjs/lib/utils/areShapesContentEqual.js +1 -1
  35. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +2 -2
  36. package/dist-cjs/version.js +3 -3
  37. package/dist-cjs/version.js.map +1 -1
  38. package/dist-esm/index.d.mts +51 -46
  39. package/dist-esm/index.mjs +3 -1
  40. package/dist-esm/index.mjs.map +2 -2
  41. package/dist-esm/lib/editor/Editor.mjs +1 -0
  42. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  43. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
  44. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  45. package/dist-esm/lib/primitives/Box.mjs +6 -0
  46. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  47. package/dist-esm/lib/primitives/Vec.mjs +13 -8
  48. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  49. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
  50. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  51. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
  52. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  53. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
  54. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  55. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
  56. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  57. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -17
  58. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  59. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
  60. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  61. package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
  62. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  63. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
  64. package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
  65. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
  66. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  67. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
  68. package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
  69. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
  70. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  71. package/dist-esm/lib/utils/areShapesContentEqual.mjs +1 -1
  72. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +2 -2
  73. package/dist-esm/version.mjs +3 -3
  74. package/dist-esm/version.mjs.map +1 -1
  75. package/package.json +7 -7
  76. package/src/index.ts +1 -0
  77. package/src/lib/editor/Editor.ts +2 -0
  78. package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
  79. package/src/lib/primitives/Box.ts +8 -0
  80. package/src/lib/primitives/Vec.test.ts +2 -2
  81. package/src/lib/primitives/Vec.ts +13 -8
  82. package/src/lib/primitives/geometry/Arc2d.ts +42 -23
  83. package/src/lib/primitives/geometry/Circle2d.ts +12 -12
  84. package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
  85. package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
  86. package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
  87. package/src/lib/primitives/geometry/Edge2d.ts +14 -18
  88. package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
  89. package/src/lib/primitives/geometry/Point2d.ts +6 -6
  90. package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
  91. package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
  92. package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
  93. package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
  94. package/src/lib/utils/areShapesContentEqual.ts +2 -1
  95. package/src/version.ts +3 -3
@@ -4,22 +4,22 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
4
4
 
5
5
  /** @public */
6
6
  export class CubicSpline2d extends Geometry2d {
7
- points: Vec[]
7
+ private _points: Vec[]
8
8
 
9
9
  constructor(config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & { points: Vec[] }) {
10
10
  super({ ...config, isClosed: false, isFilled: false })
11
11
  const { points } = config
12
12
 
13
- this.points = points
13
+ this._points = points
14
14
  }
15
15
 
16
- _segments?: CubicBezier2d[]
16
+ private _segments?: CubicBezier2d[]
17
17
 
18
18
  // eslint-disable-next-line no-restricted-syntax
19
19
  get segments() {
20
20
  if (!this._segments) {
21
21
  this._segments = []
22
- const { points } = this
22
+ const { _points: points } = this
23
23
 
24
24
  const len = points.length
25
25
  const last = len - 2
@@ -54,7 +54,7 @@ export class CubicSpline2d extends Geometry2d {
54
54
  const vertices = this.segments.reduce((acc, segment) => {
55
55
  return acc.concat(segment.vertices)
56
56
  }, [] as Vec[])
57
- vertices.push(this.points[this.points.length - 1])
57
+ vertices.push(this._points[this._points.length - 1])
58
58
  return vertices
59
59
  }
60
60
 
@@ -3,38 +3,34 @@ import { Geometry2d } from './Geometry2d'
3
3
 
4
4
  /** @public */
5
5
  export class Edge2d extends Geometry2d {
6
- start: Vec
7
- end: Vec
8
- d: Vec
9
- u: Vec
10
- ul: number
6
+ private _start: Vec
7
+ private _end: Vec
8
+ private _d: Vec
9
+ private _u: Vec
10
+ private _ul: number
11
11
 
12
12
  constructor(config: { start: Vec; end: Vec }) {
13
13
  super({ ...config, isClosed: false, isFilled: false })
14
14
  const { start, end } = config
15
15
 
16
- this.start = start
17
- this.end = end
16
+ this._start = start
17
+ this._end = end
18
18
 
19
- this.d = start.clone().sub(end) // the delta from start to end
20
- this.u = this.d.clone().uni() // the unit vector of the edge
21
- this.ul = this.u.len() // the length of the unit vector
19
+ this._d = start.clone().sub(end) // the delta from start to end
20
+ this._u = this._d.clone().uni() // the unit vector of the edge
21
+ this._ul = this._u.len() // the length of the unit vector
22
22
  }
23
23
 
24
24
  override getLength() {
25
- return this.d.len()
26
- }
27
-
28
- midPoint(): Vec {
29
- return this.start.lrp(this.end, 0.5)
25
+ return this._d.len()
30
26
  }
31
27
 
32
28
  override getVertices(): Vec[] {
33
- return [this.start, this.end]
29
+ return [this._start, this._end]
34
30
  }
35
31
 
36
32
  override nearestPoint(point: VecLike): Vec {
37
- const { start, end, d, u, ul: l } = this
33
+ const { _start: start, _end: end, _d: d, _u: u, _ul: l } = this
38
34
  if (d.len() === 0) return start // start and end are the same
39
35
  if (l === 0) return start // no length in the unit vector
40
36
  const k = Vec.Sub(point, start).dpr(u) / l
@@ -48,7 +44,7 @@ export class Edge2d extends Geometry2d {
48
44
  }
49
45
 
50
46
  getSvgPathData(first = true) {
51
- const { start, end } = this
47
+ const { _start: start, _end: end } = this
52
48
  return `${first ? `M${start.toFixed()}` : ``} L${end.toFixed()}`
53
49
  }
54
50
  }
@@ -1,14 +1,15 @@
1
1
  import { Box } from '../Box'
2
2
  import { Vec, VecLike } from '../Vec'
3
- import { PI, PI2, perimeterOfEllipse } from '../utils'
3
+ import { PI, PI2, clamp, perimeterOfEllipse } from '../utils'
4
4
  import { Edge2d } from './Edge2d'
5
5
  import { Geometry2d, Geometry2dOptions } from './Geometry2d'
6
6
  import { getVerticesCountForLength } from './geometry-constants'
7
7
 
8
8
  /** @public */
9
9
  export class Ellipse2d extends Geometry2d {
10
- w: number
11
- h: number
10
+ private _w: number
11
+ private _h: number
12
+ private _edges?: Edge2d[]
12
13
 
13
14
  constructor(
14
15
  public config: Omit<Geometry2dOptions, 'isClosed'> & {
@@ -18,12 +19,10 @@ export class Ellipse2d extends Geometry2d {
18
19
  ) {
19
20
  super({ ...config, isClosed: true })
20
21
  const { width, height } = config
21
- this.w = width
22
- this.h = height
22
+ this._w = width
23
+ this._h = height
23
24
  }
24
25
 
25
- _edges?: Edge2d[]
26
-
27
26
  // eslint-disable-next-line no-restricted-syntax
28
27
  get edges() {
29
28
  if (!this._edges) {
@@ -41,8 +40,8 @@ export class Ellipse2d extends Geometry2d {
41
40
 
42
41
  getVertices() {
43
42
  // Perimeter of the ellipse
44
- const w = Math.max(1, this.w)
45
- const h = Math.max(1, this.h)
43
+ const w = Math.max(1, this._w)
44
+ const h = Math.max(1, this._h)
46
45
  const cx = w / 2
47
46
  const cy = h / 2
48
47
  const q = Math.pow(cx - cy, 2) / Math.pow(cx + cy, 2)
@@ -63,7 +62,7 @@ export class Ellipse2d extends Geometry2d {
63
62
  const vertices = Array(len)
64
63
 
65
64
  for (let i = 0; i < len; i++) {
66
- vertices[i] = new Vec(cx + cx * cos, cy + cy * sin)
65
+ vertices[i] = new Vec(clamp(cx + cx * cos, 0, w), clamp(cy + cy * sin, 0, h))
67
66
  ts = b * cos + a * sin
68
67
  tc = a * cos - b * sin
69
68
  sin = ts
@@ -95,11 +94,11 @@ export class Ellipse2d extends Geometry2d {
95
94
  }
96
95
 
97
96
  getBounds() {
98
- return new Box(0, 0, this.w, this.h)
97
+ return new Box(0, 0, this._w, this._h)
99
98
  }
100
99
 
101
100
  getLength(): number {
102
- const { w, h } = this
101
+ const { _w: w, _h: h } = this
103
102
  const cx = w / 2
104
103
  const cy = h / 2
105
104
  const rx = Math.max(0, cx)
@@ -108,7 +107,7 @@ export class Ellipse2d extends Geometry2d {
108
107
  }
109
108
 
110
109
  getSvgPathData(first = false) {
111
- const { w, h } = this
110
+ const { _w: w, _h: h } = this
112
111
  const cx = w / 2
113
112
  const cy = h / 2
114
113
  const rx = Math.max(0, cx)
@@ -3,7 +3,7 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
3
3
 
4
4
  /** @public */
5
5
  export class Point2d extends Geometry2d {
6
- point: Vec
6
+ private _point: Vec
7
7
 
8
8
  constructor(
9
9
  config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & { margin: number; point: Vec }
@@ -11,23 +11,23 @@ export class Point2d extends Geometry2d {
11
11
  super({ ...config, isClosed: true, isFilled: true })
12
12
  const { point } = config
13
13
 
14
- this.point = point
14
+ this._point = point
15
15
  }
16
16
 
17
17
  getVertices() {
18
- return [this.point]
18
+ return [this._point]
19
19
  }
20
20
 
21
21
  nearestPoint(): Vec {
22
- return this.point
22
+ return this._point
23
23
  }
24
24
 
25
25
  hitTestLineSegment(A: VecLike, B: VecLike, margin: number): boolean {
26
- return Vec.DistanceToLineSegment(A, B, this.point) < margin
26
+ return Vec.DistanceToLineSegment(A, B, this._point) < margin
27
27
  }
28
28
 
29
29
  getSvgPathData() {
30
- const { point } = this
30
+ const { _point: point } = this
31
31
  return `M${point.toFixed()}`
32
32
  }
33
33
  }
@@ -7,5 +7,9 @@ export class Polygon2d extends Polyline2d {
7
7
  constructor(config: Omit<Geometry2dOptions, 'isClosed'> & { points: Vec[] }) {
8
8
  super({ ...config })
9
9
  this.isClosed = true
10
+
11
+ if (config.points.length < 3) {
12
+ throw new Error('Polygon2d: points must be an array of at least 3 points')
13
+ }
10
14
  }
11
15
  }
@@ -4,18 +4,21 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
4
4
 
5
5
  /** @public */
6
6
  export class Polyline2d extends Geometry2d {
7
- points: Vec[]
7
+ private _points: Vec[]
8
+ private _segments?: Edge2d[]
8
9
 
9
10
  constructor(config: Omit<Geometry2dOptions, 'isFilled' | 'isClosed'> & { points: Vec[] }) {
10
11
  super({ isClosed: false, isFilled: false, ...config })
11
12
  const { points } = config
12
- this.points = points
13
- }
13
+ this._points = points
14
14
 
15
- _segments?: Edge2d[]
15
+ if (points.length < 2) {
16
+ throw new Error('Polyline2d: points must be an array of at least 2 points')
17
+ }
18
+ }
16
19
 
17
20
  // eslint-disable-next-line no-restricted-syntax
18
- get segments() {
21
+ protected get segments() {
19
22
  if (!this._segments) {
20
23
  this._segments = []
21
24
  const { vertices } = this
@@ -38,12 +41,12 @@ export class Polyline2d extends Geometry2d {
38
41
  }
39
42
 
40
43
  getVertices() {
41
- return this.points
44
+ return this._points
42
45
  }
43
46
 
44
47
  nearestPoint(A: VecLike): Vec {
45
48
  const { segments } = this
46
- let nearest = this.points[0]
49
+ let nearest = this._points[0]
47
50
  let dist = Infinity
48
51
  let p: Vec // current point on segment
49
52
  let d: number // distance from A to p
@@ -5,10 +5,10 @@ import { Polygon2d } from './Polygon2d'
5
5
 
6
6
  /** @public */
7
7
  export class Rectangle2d extends Polygon2d {
8
- x: number
9
- y: number
10
- w: number
11
- h: number
8
+ private _x: number
9
+ private _y: number
10
+ private _w: number
11
+ private _h: number
12
12
 
13
13
  constructor(
14
14
  config: Omit<Geometry2dOptions, 'isClosed'> & {
@@ -28,18 +28,31 @@ export class Rectangle2d extends Polygon2d {
28
28
  new Vec(x, y + height),
29
29
  ],
30
30
  })
31
- this.x = x
32
- this.y = y
33
- this.w = width
34
- this.h = height
31
+ this._x = x
32
+ this._y = y
33
+ this._w = width
34
+ this._h = height
35
35
  }
36
36
 
37
37
  getBounds() {
38
- return new Box(this.x, this.y, this.w, this.h)
38
+ return new Box(this._x, this._y, this._w, this._h)
39
39
  }
40
40
 
41
41
  getSvgPathData(): string {
42
- const { x, y, w, h } = this
43
- return `M${x},${y} h${w} v${h} h-${w}z`
42
+ const { _x: x, _y: y, _w: w, _h: h } = this
43
+ this.negativeZeroFix()
44
+ return `M${x},${y} h${w} v${h} h${-w}z`
44
45
  }
46
+
47
+ private negativeZeroFix() {
48
+ this._x = zeroFix(this._x)
49
+ this._y = zeroFix(this._y)
50
+ this._w = zeroFix(this._w)
51
+ this._h = zeroFix(this._h)
52
+ }
53
+ }
54
+
55
+ function zeroFix(value: number) {
56
+ if (Object.is(value, -0)) return 0
57
+ return value
45
58
  }
@@ -7,13 +7,12 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
7
7
 
8
8
  /** @public */
9
9
  export class Stadium2d extends Geometry2d {
10
- w: number
11
- h: number
12
-
13
- a: Arc2d
14
- b: Edge2d
15
- c: Arc2d
16
- d: Edge2d
10
+ private _w: number
11
+ private _h: number
12
+ private _a: Arc2d
13
+ private _b: Edge2d
14
+ private _c: Arc2d
15
+ private _d: Edge2d
17
16
 
18
17
  constructor(
19
18
  public config: Omit<Geometry2dOptions, 'isClosed'> & {
@@ -23,45 +22,45 @@ export class Stadium2d extends Geometry2d {
23
22
  ) {
24
23
  super({ ...config, isClosed: true })
25
24
  const { width: w, height: h } = config
26
- this.w = w
27
- this.h = h
25
+ this._w = w
26
+ this._h = h
28
27
 
29
28
  if (h > w) {
30
29
  const r = w / 2
31
- this.a = new Arc2d({
30
+ this._a = new Arc2d({
32
31
  start: new Vec(0, r),
33
32
  end: new Vec(w, r),
34
33
  center: new Vec(w / 2, r),
35
34
  sweepFlag: 1,
36
35
  largeArcFlag: 1,
37
36
  })
38
- this.b = new Edge2d({ start: new Vec(w, r), end: new Vec(w, h - r) })
39
- this.c = new Arc2d({
37
+ this._b = new Edge2d({ start: new Vec(w, r), end: new Vec(w, h - r) })
38
+ this._c = new Arc2d({
40
39
  start: new Vec(w, h - r),
41
40
  end: new Vec(0, h - r),
42
41
  center: new Vec(w / 2, h - r),
43
42
  sweepFlag: 1,
44
43
  largeArcFlag: 1,
45
44
  })
46
- this.d = new Edge2d({ start: new Vec(0, h - r), end: new Vec(0, r) })
45
+ this._d = new Edge2d({ start: new Vec(0, h - r), end: new Vec(0, r) })
47
46
  } else {
48
47
  const r = h / 2
49
- this.a = new Arc2d({
48
+ this._a = new Arc2d({
50
49
  start: new Vec(r, h),
51
50
  end: new Vec(r, 0),
52
51
  center: new Vec(r, r),
53
52
  sweepFlag: 1,
54
53
  largeArcFlag: 1,
55
54
  })
56
- this.b = new Edge2d({ start: new Vec(r, 0), end: new Vec(w - r, 0) })
57
- this.c = new Arc2d({
55
+ this._b = new Edge2d({ start: new Vec(r, 0), end: new Vec(w - r, 0) })
56
+ this._c = new Arc2d({
58
57
  start: new Vec(w - r, 0),
59
58
  end: new Vec(w - r, h),
60
59
  center: new Vec(w - r, r),
61
60
  sweepFlag: 1,
62
61
  largeArcFlag: 1,
63
62
  })
64
- this.d = new Edge2d({ start: new Vec(w - r, h), end: new Vec(r, h) })
63
+ this._d = new Edge2d({ start: new Vec(w - r, h), end: new Vec(r, h) })
65
64
  }
66
65
  }
67
66
 
@@ -71,7 +70,7 @@ export class Stadium2d extends Geometry2d {
71
70
  let _d: number
72
71
  let p: Vec
73
72
 
74
- const { a, b, c, d } = this
73
+ const { _a: a, _b: b, _c: c, _d: d } = this
75
74
  for (const part of [a, b, c, d]) {
76
75
  p = part.nearestPoint(A)
77
76
  _d = Vec.Dist2(p, A)
@@ -85,12 +84,12 @@ export class Stadium2d extends Geometry2d {
85
84
  }
86
85
 
87
86
  hitTestLineSegment(A: VecLike, B: VecLike): boolean {
88
- const { a, b, c, d } = this
87
+ const { _a: a, _b: b, _c: c, _d: d } = this
89
88
  return [a, b, c, d].some((edge) => edge.hitTestLineSegment(A, B))
90
89
  }
91
90
 
92
91
  getVertices() {
93
- const { a, b, c, d } = this
92
+ const { _a: a, _b: b, _c: c, _d: d } = this
94
93
  return [a, b, c, d].reduce<Vec[]>((a, p) => {
95
94
  a.push(...p.vertices)
96
95
  return a
@@ -98,17 +97,17 @@ export class Stadium2d extends Geometry2d {
98
97
  }
99
98
 
100
99
  getBounds() {
101
- return new Box(0, 0, this.w, this.h)
100
+ return new Box(0, 0, this._w, this._h)
102
101
  }
103
102
 
104
103
  getLength() {
105
- const { h, w } = this
104
+ const { _h: h, _w: w } = this
106
105
  if (h > w) return (PI * (w / 2) + (h - w)) * 2
107
106
  else return (PI * (h / 2) + (w - h)) * 2
108
107
  }
109
108
 
110
109
  getSvgPathData() {
111
- const { a, b, c, d } = this
110
+ const { _a: a, _b: b, _c: c, _d: d } = this
112
111
  return [a, b, c, d].map((p, i) => p.getSvgPathData(i === 0)).join(' ') + ' Z'
113
112
  }
114
113
  }
@@ -1,4 +1,5 @@
1
1
  import { TLShape } from '@tldraw/tlschema'
2
2
 
3
+ /** @public */
3
4
  export const areShapesContentEqual = (a: TLShape, b: TLShape) =>
4
- a.props === b.props && a.meta === b.meta
5
+ a.parentId === b.parentId && a.props === b.props && a.meta === b.meta
package/src/version.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '3.14.0-canary.8d29afff2d04'
4
+ export const version = '3.14.0-canary.8ea0ff8489db'
5
5
  export const publishDates = {
6
6
  major: '2024-09-13T14:36:29.063Z',
7
- minor: '2025-05-27T13:18:08.385Z',
8
- patch: '2025-05-27T13:18:08.385Z',
7
+ minor: '2025-06-04T10:57:28.152Z',
8
+ patch: '2025-06-04T10:57:28.152Z',
9
9
  }