@tldraw/editor 3.13.0-canary.dc099cf30823 → 3.13.0-canary.df8d8c532cee

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 (185) hide show
  1. package/dist-cjs/index.d.ts +128 -113
  2. package/dist-cjs/index.js +7 -22
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +2 -1
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/Shape.js +12 -8
  7. package/dist-cjs/lib/components/Shape.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +37 -8
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +14 -12
  11. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +17 -11
  13. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultSpinner.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +2 -2
  16. package/dist-cjs/lib/editor/Editor.js +85 -24
  17. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  18. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/TextManager.js +10 -0
  20. package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +1 -1
  22. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +0 -3
  24. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  25. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  26. package/dist-cjs/lib/exports/getSvgJsx.js +12 -3
  27. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  28. package/dist-cjs/lib/hooks/useDocumentEvents.js +3 -2
  29. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  30. package/dist-cjs/lib/hooks/useEditorComponents.js +16 -16
  31. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  32. package/dist-cjs/lib/license/LicenseManager.js +8 -1
  33. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  34. package/dist-cjs/lib/options.js.map +2 -2
  35. package/dist-cjs/lib/primitives/Box.js +16 -0
  36. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  37. package/dist-cjs/lib/primitives/Mat.js +1 -1
  38. package/dist-cjs/lib/primitives/Mat.js.map +2 -2
  39. package/dist-cjs/lib/primitives/Vec.js +20 -0
  40. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  41. package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
  42. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  43. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  44. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  45. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
  46. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  47. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  48. package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
  49. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  50. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  51. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +91 -20
  52. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  53. package/dist-cjs/lib/primitives/geometry/Group2d.js +55 -2
  54. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  55. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  56. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  57. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  58. package/dist-cjs/lib/utils/areShapesContentEqual.js +25 -0
  59. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +7 -0
  60. package/dist-cjs/lib/utils/debug-flags.js +5 -2
  61. package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
  62. package/dist-cjs/lib/utils/dom.js +3 -3
  63. package/dist-cjs/lib/utils/dom.js.map +2 -2
  64. package/dist-cjs/lib/utils/nearestMultiple.js +34 -0
  65. package/dist-cjs/lib/utils/nearestMultiple.js.map +7 -0
  66. package/dist-cjs/lib/utils/rotation.js +5 -5
  67. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  68. package/dist-cjs/version.js +3 -3
  69. package/dist-cjs/version.js.map +1 -1
  70. package/dist-esm/index.d.mts +128 -113
  71. package/dist-esm/index.mjs +9 -41
  72. package/dist-esm/index.mjs.map +2 -2
  73. package/dist-esm/lib/TldrawEditor.mjs +2 -1
  74. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  75. package/dist-esm/lib/components/Shape.mjs +12 -8
  76. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  77. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +37 -8
  78. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  79. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +14 -12
  80. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  81. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +17 -11
  82. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  83. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +1 -1
  84. package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
  85. package/dist-esm/lib/editor/Editor.mjs +85 -24
  86. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  87. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  88. package/dist-esm/lib/editor/managers/TextManager.mjs +10 -0
  89. package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
  90. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +1 -1
  91. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  92. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +0 -3
  93. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  94. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  95. package/dist-esm/lib/exports/getSvgJsx.mjs +12 -3
  96. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  97. package/dist-esm/lib/hooks/useDocumentEvents.mjs +3 -2
  98. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  99. package/dist-esm/lib/hooks/useEditorComponents.mjs +16 -18
  100. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  101. package/dist-esm/lib/license/LicenseManager.mjs +8 -1
  102. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  103. package/dist-esm/lib/options.mjs.map +2 -2
  104. package/dist-esm/lib/primitives/Box.mjs +16 -0
  105. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  106. package/dist-esm/lib/primitives/Mat.mjs +1 -1
  107. package/dist-esm/lib/primitives/Mat.mjs.map +2 -2
  108. package/dist-esm/lib/primitives/Vec.mjs +20 -0
  109. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  110. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  111. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  112. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -1
  113. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  114. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
  115. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  116. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  117. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
  118. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  119. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  120. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +92 -21
  121. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  122. package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -2
  123. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  124. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  125. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  126. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  127. package/dist-esm/lib/utils/areShapesContentEqual.mjs +5 -0
  128. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +7 -0
  129. package/dist-esm/lib/utils/debug-flags.mjs +5 -2
  130. package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
  131. package/dist-esm/lib/utils/dom.mjs +3 -3
  132. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  133. package/dist-esm/lib/utils/nearestMultiple.mjs +14 -0
  134. package/dist-esm/lib/utils/nearestMultiple.mjs.map +7 -0
  135. package/dist-esm/lib/utils/rotation.mjs +5 -5
  136. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  137. package/dist-esm/version.mjs +3 -3
  138. package/dist-esm/version.mjs.map +1 -1
  139. package/editor.css +47 -4
  140. package/package.json +7 -7
  141. package/src/index.ts +16 -31
  142. package/src/lib/TldrawEditor.tsx +6 -1
  143. package/src/lib/components/Shape.tsx +14 -10
  144. package/src/lib/components/default-components/DefaultCanvas.tsx +43 -8
  145. package/src/lib/components/default-components/DefaultErrorFallback.tsx +25 -14
  146. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +17 -8
  147. package/src/lib/components/default-components/DefaultSpinner.tsx +1 -1
  148. package/src/lib/editor/Editor.test.ts +1 -1
  149. package/src/lib/editor/Editor.ts +96 -24
  150. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +0 -1
  151. package/src/lib/editor/managers/TextManager.ts +12 -0
  152. package/src/lib/editor/shapes/ShapeUtil.ts +23 -3
  153. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +0 -4
  154. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +9 -9
  155. package/src/lib/exports/getSvgJsx.tsx +16 -7
  156. package/src/lib/hooks/useDocumentEvents.ts +7 -2
  157. package/src/lib/hooks/useEditorComponents.tsx +33 -32
  158. package/src/lib/license/LicenseManager.test.ts +40 -0
  159. package/src/lib/license/LicenseManager.ts +13 -1
  160. package/src/lib/options.ts +4 -0
  161. package/src/lib/primitives/Box.ts +20 -0
  162. package/src/lib/primitives/Mat.ts +5 -4
  163. package/src/lib/primitives/Vec.ts +23 -0
  164. package/src/lib/primitives/geometry/Arc2d.ts +5 -5
  165. package/src/lib/primitives/geometry/Circle2d.ts +4 -4
  166. package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -4
  167. package/src/lib/primitives/geometry/CubicSpline2d.ts +3 -3
  168. package/src/lib/primitives/geometry/Edge2d.ts +3 -3
  169. package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
  170. package/src/lib/primitives/geometry/Geometry2d.test.ts +42 -0
  171. package/src/lib/primitives/geometry/Geometry2d.ts +123 -35
  172. package/src/lib/primitives/geometry/Group2d.ts +70 -7
  173. package/src/lib/primitives/geometry/Point2d.ts +2 -2
  174. package/src/lib/primitives/geometry/Polyline2d.ts +3 -3
  175. package/src/lib/primitives/geometry/Stadium2d.ts +3 -3
  176. package/src/lib/test/currentToolIdMask.test.ts +1 -1
  177. package/src/lib/test/user.test.ts +1 -1
  178. package/src/lib/utils/areShapesContentEqual.ts +4 -0
  179. package/src/lib/utils/debug-flags.ts +7 -2
  180. package/src/lib/utils/dom.ts +4 -4
  181. package/src/lib/utils/nearestMultiple.ts +13 -0
  182. package/src/lib/utils/rotation.ts +8 -6
  183. package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -1
  184. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
  185. package/src/version.ts +3 -3
@@ -1,4 +1,5 @@
1
1
  import { EMPTY_ARRAY } from '@tldraw/state'
2
+ import { assert, invLerp, lerp } from '@tldraw/utils'
2
3
  import { Box } from '../Box'
3
4
  import { Mat } from '../Mat'
4
5
  import { Vec, VecLike } from '../Vec'
@@ -34,7 +35,7 @@ export class Group2d extends Geometry2d {
34
35
  .flatMap((c) => c.getVertices(filters))
35
36
  }
36
37
 
37
- override nearestPoint(point: Vec, filters?: Geometry2dFilters): Vec {
38
+ override nearestPoint(point: VecLike, filters?: Geometry2dFilters): Vec {
38
39
  let dist = Infinity
39
40
  let nearest: Vec | undefined
40
41
 
@@ -59,7 +60,7 @@ export class Group2d extends Geometry2d {
59
60
  return nearest
60
61
  }
61
62
 
62
- override distanceToPoint(point: Vec, hitInside = false, filters?: Geometry2dFilters) {
63
+ override distanceToPoint(point: VecLike, hitInside = false, filters?: Geometry2dFilters) {
63
64
  let smallestDistance = Infinity
64
65
  for (const child of this.children) {
65
66
  if (child.isExcludedByFilter(filters)) continue
@@ -72,7 +73,7 @@ export class Group2d extends Geometry2d {
72
73
  }
73
74
 
74
75
  override hitTestPoint(
75
- point: Vec,
76
+ point: VecLike,
76
77
  margin: number,
77
78
  hitInside: boolean,
78
79
  filters = Geometry2dFilters.EXCLUDE_LABELS
@@ -83,8 +84,8 @@ export class Group2d extends Geometry2d {
83
84
  }
84
85
 
85
86
  override hitTestLineSegment(
86
- A: Vec,
87
- B: Vec,
87
+ A: VecLike,
88
+ B: VecLike,
88
89
  zoom: number,
89
90
  filters = Geometry2dFilters.EXCLUDE_LABELS
90
91
  ): boolean {
@@ -121,6 +122,63 @@ export class Group2d extends Geometry2d {
121
122
  })
122
123
  }
123
124
 
125
+ override interpolateAlongEdge(t: number, filters?: Geometry2dFilters): Vec {
126
+ const totalLength = this.getLength(filters)
127
+
128
+ const distanceToTravel = t * totalLength
129
+ let distanceTraveled = 0
130
+ for (const child of this.children) {
131
+ if (child.isExcludedByFilter(filters)) continue
132
+ const childLength = child.length
133
+ const newDistanceTraveled = distanceTraveled + childLength
134
+ if (newDistanceTraveled >= distanceToTravel) {
135
+ return child.interpolateAlongEdge(
136
+ invLerp(distanceTraveled, newDistanceTraveled, distanceToTravel),
137
+ filters
138
+ )
139
+ }
140
+ distanceTraveled = newDistanceTraveled
141
+ }
142
+
143
+ return this.children[this.children.length - 1].interpolateAlongEdge(1, filters)
144
+ }
145
+
146
+ override uninterpolateAlongEdge(point: VecLike, filters?: Geometry2dFilters): number {
147
+ const totalLength = this.getLength(filters)
148
+
149
+ let closestChild = null
150
+ let closestDistance = Infinity
151
+ let distanceTraveled = 0
152
+
153
+ for (const child of this.children) {
154
+ if (child.isExcludedByFilter(filters)) continue
155
+ const childLength = child.getLength(filters)
156
+ const newDistanceTraveled = distanceTraveled + childLength
157
+
158
+ const distance = child.distanceToPoint(point, false, filters)
159
+ if (distance < closestDistance) {
160
+ closestDistance = distance
161
+ closestChild = {
162
+ startLength: distanceTraveled,
163
+ endLength: newDistanceTraveled,
164
+ child,
165
+ }
166
+ }
167
+
168
+ distanceTraveled = newDistanceTraveled
169
+ }
170
+
171
+ assert(closestChild)
172
+
173
+ const normalizedDistanceInChild = closestChild.child.uninterpolateAlongEdge(point, filters)
174
+ const childTLength = lerp(
175
+ closestChild.startLength,
176
+ closestChild.endLength,
177
+ normalizedDistanceInChild
178
+ )
179
+ return childTLength / totalLength
180
+ }
181
+
124
182
  override transform(transform: Mat): Geometry2d {
125
183
  return new Group2d({
126
184
  children: this.children.map((c) => c.transform(transform)),
@@ -160,8 +218,13 @@ export class Group2d extends Geometry2d {
160
218
  return path
161
219
  }
162
220
 
163
- getLength(): number {
164
- return this.children.reduce((a, c) => (c.isLabel ? a : a + c.length), 0)
221
+ getLength(filters?: Geometry2dFilters): number {
222
+ let length = 0
223
+ for (const child of this.children) {
224
+ if (child.isExcludedByFilter(filters)) continue
225
+ length += child.length
226
+ }
227
+ return length
165
228
  }
166
229
 
167
230
  getSvgPathData(): string {
@@ -1,4 +1,4 @@
1
- import { Vec } from '../Vec'
1
+ import { Vec, VecLike } from '../Vec'
2
2
  import { Geometry2d, Geometry2dOptions } from './Geometry2d'
3
3
 
4
4
  /** @public */
@@ -22,7 +22,7 @@ export class Point2d extends Geometry2d {
22
22
  return this.point
23
23
  }
24
24
 
25
- hitTestLineSegment(A: Vec, B: Vec, margin: number): boolean {
25
+ hitTestLineSegment(A: VecLike, B: VecLike, margin: number): boolean {
26
26
  return Vec.DistanceToLineSegment(A, B, this.point) < margin
27
27
  }
28
28
 
@@ -1,4 +1,4 @@
1
- import { Vec } from '../Vec'
1
+ import { Vec, VecLike } from '../Vec'
2
2
  import { Edge2d } from './Edge2d'
3
3
  import { Geometry2d, Geometry2dOptions } from './Geometry2d'
4
4
 
@@ -41,7 +41,7 @@ export class Polyline2d extends Geometry2d {
41
41
  return this.points
42
42
  }
43
43
 
44
- nearestPoint(A: Vec): Vec {
44
+ nearestPoint(A: VecLike): Vec {
45
45
  const { segments } = this
46
46
  let nearest = this.points[0]
47
47
  let dist = Infinity
@@ -59,7 +59,7 @@ export class Polyline2d extends Geometry2d {
59
59
  return nearest
60
60
  }
61
61
 
62
- hitTestLineSegment(A: Vec, B: Vec, distance = 0): boolean {
62
+ hitTestLineSegment(A: VecLike, B: VecLike, distance = 0): boolean {
63
63
  const { segments } = this
64
64
  for (let i = 0, n = segments.length; i < n; i++) {
65
65
  if (segments[i].hitTestLineSegment(A, B, distance)) {
@@ -1,5 +1,5 @@
1
1
  import { Box } from '../Box'
2
- import { Vec } from '../Vec'
2
+ import { Vec, VecLike } from '../Vec'
3
3
  import { PI } from '../utils'
4
4
  import { Arc2d } from './Arc2d'
5
5
  import { Edge2d } from './Edge2d'
@@ -65,7 +65,7 @@ export class Stadium2d extends Geometry2d {
65
65
  }
66
66
  }
67
67
 
68
- nearestPoint(A: Vec): Vec {
68
+ nearestPoint(A: VecLike): Vec {
69
69
  let nearest: Vec | undefined
70
70
  let dist = Infinity
71
71
  let _d: number
@@ -84,7 +84,7 @@ export class Stadium2d extends Geometry2d {
84
84
  return nearest
85
85
  }
86
86
 
87
- hitTestLineSegment(A: Vec, B: Vec): boolean {
87
+ hitTestLineSegment(A: VecLike, B: VecLike): boolean {
88
88
  const { a, b, c, d } = this
89
89
  return [a, b, c, d].some((edge) => edge.hitTestLineSegment(A, B))
90
90
  }
@@ -27,7 +27,7 @@ beforeEach(() => {
27
27
  shapeUtils: [],
28
28
  bindingUtils: [],
29
29
  tools: [A, B, C],
30
- store: createTLStore({ shapeUtils: [] }),
30
+ store: createTLStore({ shapeUtils: [], bindingUtils: [] }),
31
31
  getContainer: () => document.body,
32
32
  })
33
33
  })
@@ -8,7 +8,7 @@ beforeEach(() => {
8
8
  shapeUtils: [],
9
9
  bindingUtils: [],
10
10
  tools: [],
11
- store: createTLStore({ shapeUtils: [] }),
11
+ store: createTLStore({ shapeUtils: [], bindingUtils: [] }),
12
12
  getContainer: () => document.body,
13
13
  })
14
14
  })
@@ -0,0 +1,4 @@
1
+ import { TLShape } from '@tldraw/tlschema'
2
+
3
+ export const areShapesContentEqual = (a: TLShape, b: TLShape) =>
4
+ a.props === b.props && a.meta === b.meta
@@ -54,6 +54,7 @@ export const debugFlags = {
54
54
  hideShapes: createDebugValue('hideShapes', { defaults: { all: false } }),
55
55
  editOnType: createDebugValue('editOnType', { defaults: { all: false } }),
56
56
  a11y: createDebugValue('a11y', { defaults: { all: false } }),
57
+ debugElbowArrows: createDebugValue('debugElbowArrows', { defaults: { all: false } }),
57
58
  } as const
58
59
 
59
60
  declare global {
@@ -149,7 +150,9 @@ function createDebugValueBase<T>(def: DebugFlagDef<T>): DebugFlag<T> {
149
150
  })
150
151
  }
151
152
 
152
- return Object.assign(valueAtom, def)
153
+ return Object.assign(valueAtom, def, {
154
+ reset: () => valueAtom.set(defaultValue),
155
+ })
153
156
  }
154
157
 
155
158
  function getStoredInitialValue(name: string) {
@@ -206,4 +209,6 @@ export interface DebugFlagDef<T> {
206
209
  }
207
210
 
208
211
  /** @internal */
209
- export type DebugFlag<T> = DebugFlagDef<T> & Atom<T>
212
+ export interface DebugFlag<T> extends DebugFlagDef<T>, Atom<T> {
213
+ reset(): void
214
+ }
@@ -91,14 +91,14 @@ export const setStyleProperty = (
91
91
  elm.style.setProperty(property, value as string)
92
92
  }
93
93
 
94
- const INPUTS = ['input', 'select', 'button', 'textarea']
95
-
96
94
  /** @internal */
97
- export function activeElementShouldCaptureKeys() {
95
+ export function activeElementShouldCaptureKeys(allowButtons = false) {
98
96
  const { activeElement } = document
97
+ const elements = allowButtons ? ['input', 'textarea'] : ['input', 'select', 'button', 'textarea']
99
98
  return !!(
100
99
  activeElement &&
101
100
  ((activeElement as HTMLElement).isContentEditable ||
102
- INPUTS.indexOf(activeElement.tagName.toLowerCase()) > -1)
101
+ elements.indexOf(activeElement.tagName.toLowerCase()) > -1 ||
102
+ activeElement.classList.contains('tlui-slider__thumb'))
103
103
  )
104
104
  }
@@ -0,0 +1,13 @@
1
+ // Euclidean algorithm to find the GCD
2
+ function gcd(a: number, b: number): number {
3
+ return b === 0 ? a : gcd(b, a % b)
4
+ }
5
+
6
+ // Returns the lowest value that the given number can be multiplied by to reach an integer
7
+ export function nearestMultiple(float: number) {
8
+ const decimal = float.toString().split('.')[1]
9
+ if (!decimal) return 1
10
+ const denominator = Math.pow(10, decimal.length)
11
+ const numerator = parseInt(decimal, 10)
12
+ return denominator / gcd(numerator, denominator)
13
+ }
@@ -26,11 +26,13 @@ export function getRotationSnapshot({
26
26
  return null
27
27
  }
28
28
 
29
- const pageCenter = rotatedPageBounds.center.clone().rotWith(rotatedPageBounds.point, rotation)
29
+ const initialPageCenter = rotatedPageBounds.center
30
+ .clone()
31
+ .rotWith(rotatedPageBounds.point, rotation)
30
32
 
31
33
  return {
32
- pageCenter,
33
- initialCursorAngle: pageCenter.angle(editor.inputs.originPagePoint),
34
+ initialPageCenter,
35
+ initialCursorAngle: initialPageCenter.angle(editor.inputs.originPagePoint),
34
36
  initialShapesRotation: rotation,
35
37
  shapeSnapshots: shapes.map((shape) => ({
36
38
  shape,
@@ -43,7 +45,7 @@ export function getRotationSnapshot({
43
45
  * @internal
44
46
  **/
45
47
  export interface TLRotationSnapshot {
46
- pageCenter: Vec
48
+ initialPageCenter: Vec
47
49
  initialCursorAngle: number
48
50
  initialShapesRotation: number
49
51
  shapeSnapshots: {
@@ -66,7 +68,7 @@ export function applyRotationToSnapshotShapes({
66
68
  stage: 'start' | 'update' | 'end' | 'one-off'
67
69
  centerOverride?: VecLike
68
70
  }) {
69
- const { pageCenter, shapeSnapshots } = snapshot
71
+ const { initialPageCenter, shapeSnapshots } = snapshot
70
72
 
71
73
  editor.updateShapes(
72
74
  shapeSnapshots.map(({ shape, initialPagePoint }) => {
@@ -77,7 +79,7 @@ export function applyRotationToSnapshotShapes({
77
79
  ? editor.getShapePageTransform(shape.parentId)!
78
80
  : Mat.Identity()
79
81
 
80
- const newPagePoint = Vec.RotWith(initialPagePoint, centerOverride ?? pageCenter, delta)
82
+ const newPagePoint = Vec.RotWith(initialPagePoint, centerOverride ?? initialPageCenter, delta)
81
83
 
82
84
  const newLocalPoint = Mat.applyToPoint(
83
85
  // use the current parent transform in case it has moved/resized since the start
@@ -3,7 +3,7 @@ import { openDB } from 'idb'
3
3
  import { hardReset } from './hardReset'
4
4
  import { getAllIndexDbNames, LocalIndexedDb } from './LocalIndexedDb'
5
5
 
6
- const schema = createTLSchema({ shapes: {} })
6
+ const schema = createTLSchema({ shapes: {}, bindings: {} })
7
7
  describe('LocalIndexedDb', () => {
8
8
  beforeEach(() => {
9
9
  jest.useRealTimers()
@@ -19,7 +19,7 @@ class BroadcastChannelMock {
19
19
  }
20
20
 
21
21
  function testClient(channel = new BroadcastChannelMock('test')) {
22
- const store = createTLStore({ shapeUtils: [] })
22
+ const store = createTLStore({ shapeUtils: [], bindingUtils: [] })
23
23
  const onLoad = jest.fn(() => {
24
24
  return
25
25
  })
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.13.0-canary.dc099cf30823'
4
+ export const version = '3.13.0-canary.df8d8c532cee'
5
5
  export const publishDates = {
6
6
  major: '2024-09-13T14:36:29.063Z',
7
- minor: '2025-04-17T14:42:12.602Z',
8
- patch: '2025-04-17T14:42:12.602Z',
7
+ minor: '2025-05-20T22:19:39.365Z',
8
+ patch: '2025-05-20T22:19:39.365Z',
9
9
  }