@tldraw/editor 4.3.0-next.f4772c19540d → 4.4.0-canary.1e3b436e33e4
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.
- package/README.md +1 -1
- package/dist-cjs/index.d.ts +503 -155
- package/dist-cjs/index.js +8 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/components/ErrorBoundary.js.map +1 -1
- package/dist-cjs/lib/components/GeometryDebuggingView.js +1 -17
- package/dist-cjs/lib/components/GeometryDebuggingView.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +4 -5
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/constants.js +1 -3
- package/dist-cjs/lib/constants.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +346 -291
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +2 -2
- package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -23
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js +12 -3
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -1
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +5 -6
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +591 -0
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +1 -1
- package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/RBushIndex.js +144 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/RBushIndex.js.map +7 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +181 -0
- package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -22
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/BaseBoxShapeUtil.js.map +1 -1
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +31 -23
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js +1 -1
- package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.js.map +2 -2
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +3 -3
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
- package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
- package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
- package/dist-cjs/lib/exports/parseCss.js +1 -1
- package/dist-cjs/lib/exports/parseCss.js.map +2 -2
- package/dist-cjs/lib/globals/environment.js +45 -9
- package/dist-cjs/lib/globals/environment.js.map +2 -2
- package/dist-cjs/lib/globals/menus.js +1 -1
- package/dist-cjs/lib/globals/menus.js.map +2 -2
- package/dist-cjs/lib/hooks/useCoarsePointer.js +14 -29
- package/dist-cjs/lib/hooks/useCoarsePointer.js.map +2 -2
- package/dist-cjs/lib/hooks/useEvent.js +1 -1
- package/dist-cjs/lib/hooks/useEvent.js.map +2 -2
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
- package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
- package/dist-cjs/lib/hooks/useStateAttribute.js +4 -1
- package/dist-cjs/lib/hooks/useStateAttribute.js.map +2 -2
- package/dist-cjs/lib/hooks/useTransform.js.map +1 -1
- package/dist-cjs/lib/hooks/useZoomCss.js +4 -8
- package/dist-cjs/lib/hooks/useZoomCss.js.map +2 -2
- package/dist-cjs/lib/options.js +6 -1
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +3 -0
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +1 -0
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/utils/reparenting.js.map +2 -2
- package/dist-cjs/lib/utils/rotation.js +1 -1
- package/dist-cjs/lib/utils/rotation.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +503 -155
- package/dist-esm/index.mjs +9 -2
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/components/ErrorBoundary.mjs.map +1 -1
- package/dist-esm/lib/components/GeometryDebuggingView.mjs +1 -17
- package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +4 -5
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/constants.mjs +1 -3
- package/dist-esm/lib/constants.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +347 -294
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -23
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +13 -4
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -1
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +5 -6
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +573 -0
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +1 -1
- package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SpatialIndexManager/RBushIndex.mjs +114 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/RBushIndex.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +161 -0
- package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -22
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/BaseBoxShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +31 -23
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs +1 -1
- package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +3 -3
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
- package/dist-esm/lib/exports/parseCss.mjs +1 -1
- package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
- package/dist-esm/lib/globals/environment.mjs +45 -9
- package/dist-esm/lib/globals/environment.mjs.map +2 -2
- package/dist-esm/lib/globals/menus.mjs +1 -1
- package/dist-esm/lib/globals/menus.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCoarsePointer.mjs +15 -30
- package/dist-esm/lib/hooks/useCoarsePointer.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEvent.mjs +1 -1
- package/dist-esm/lib/hooks/useEvent.mjs.map +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useGestureEvents.mjs +1 -1
- package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
- package/dist-esm/lib/hooks/useStateAttribute.mjs +4 -1
- package/dist-esm/lib/hooks/useStateAttribute.mjs.map +2 -2
- package/dist-esm/lib/hooks/useTransform.mjs.map +1 -1
- package/dist-esm/lib/hooks/useZoomCss.mjs +4 -8
- package/dist-esm/lib/hooks/useZoomCss.mjs.map +2 -2
- package/dist-esm/lib/options.mjs +6 -1
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +3 -0
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +1 -0
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
- package/dist-esm/lib/utils/rotation.mjs +1 -1
- package/dist-esm/lib/utils/rotation.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +14 -12
- package/package.json +21 -17
- package/src/index.ts +5 -1
- package/src/lib/components/ErrorBoundary.tsx +1 -1
- package/src/lib/components/GeometryDebuggingView.tsx +1 -19
- package/src/lib/components/default-components/DefaultCanvas.tsx +5 -8
- package/src/lib/config/TLUserPreferences.test.ts +40 -0
- package/src/lib/constants.ts +0 -2
- package/src/lib/editor/Editor.test.ts +150 -10
- package/src/lib/editor/Editor.ts +533 -384
- package/src/lib/editor/bindings/BindingUtil.ts +15 -9
- package/src/lib/editor/derivations/bindingsIndex.ts +2 -2
- package/src/lib/editor/derivations/notVisibleShapes.ts +21 -33
- package/src/lib/editor/derivations/parentsToChildren.ts +18 -7
- package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +17 -31
- package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +129 -79
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +10 -6
- package/src/lib/editor/managers/FontManager/FontManager.test.ts +14 -4
- package/src/lib/editor/managers/InputsManager/InputsManager.ts +566 -0
- package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +0 -4
- package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +12 -0
- package/src/lib/editor/managers/SnapManager/SnapManager.ts +4 -4
- package/src/lib/editor/managers/SpatialIndexManager/RBushIndex.ts +144 -0
- package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +215 -0
- package/src/lib/editor/managers/TickManager/TickManager.test.ts +40 -107
- package/src/lib/editor/managers/TickManager/TickManager.ts +2 -32
- package/src/lib/editor/shapes/BaseBoxShapeUtil.tsx +2 -2
- package/src/lib/editor/shapes/ShapeUtil.ts +72 -32
- package/src/lib/editor/shapes/group/DashedOutlineBox.tsx +1 -1
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -3
- package/src/lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool.ts +2 -1
- package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +6 -6
- package/src/lib/editor/types/emit-types.ts +3 -1
- package/src/lib/exports/getSvgJsx.test.ts +10 -19
- package/src/lib/exports/getSvgJsx.tsx +2 -5
- package/src/lib/exports/parseCss.test.ts +1 -0
- package/src/lib/exports/parseCss.ts +1 -1
- package/src/lib/globals/environment.ts +65 -10
- package/src/lib/globals/menus.ts +1 -1
- package/src/lib/hooks/useCoarsePointer.ts +16 -59
- package/src/lib/hooks/useEvent.tsx +1 -1
- package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -1
- package/src/lib/hooks/useGestureEvents.ts +2 -2
- package/src/lib/hooks/usePassThroughMouseOverEvents.ts +1 -1
- package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -1
- package/src/lib/hooks/useScreenBounds.ts +1 -1
- package/src/lib/hooks/useStateAttribute.ts +4 -1
- package/src/lib/hooks/useTransform.ts +1 -1
- package/src/lib/hooks/useZoomCss.ts +3 -8
- package/src/lib/options.ts +32 -0
- package/src/lib/primitives/Box.ts +9 -0
- package/src/lib/primitives/geometry/Geometry2d.ts +1 -0
- package/src/lib/utils/reparenting.ts +5 -5
- package/src/lib/utils/rotation.ts +1 -1
- package/src/version.ts +3 -3
package/src/index.ts
CHANGED
|
@@ -146,6 +146,7 @@ export {
|
|
|
146
146
|
type TLFontFaceSource,
|
|
147
147
|
} from './lib/editor/managers/FontManager/FontManager'
|
|
148
148
|
export { HistoryManager } from './lib/editor/managers/HistoryManager/HistoryManager'
|
|
149
|
+
export { InputsManager } from './lib/editor/managers/InputsManager/InputsManager'
|
|
149
150
|
export {
|
|
150
151
|
ScribbleManager,
|
|
151
152
|
type ScribbleItem,
|
|
@@ -163,11 +164,13 @@ export {
|
|
|
163
164
|
type SnapData,
|
|
164
165
|
type SnapIndicator,
|
|
165
166
|
} from './lib/editor/managers/SnapManager/SnapManager'
|
|
167
|
+
export { SpatialIndexManager } from './lib/editor/managers/SpatialIndexManager/SpatialIndexManager'
|
|
166
168
|
export {
|
|
167
169
|
TextManager,
|
|
168
170
|
type TLMeasureTextOpts,
|
|
169
171
|
type TLMeasureTextSpanOpts,
|
|
170
172
|
} from './lib/editor/managers/TextManager/TextManager'
|
|
173
|
+
export { TickManager } from './lib/editor/managers/TickManager/TickManager'
|
|
171
174
|
export { UserPreferencesManager } from './lib/editor/managers/UserPreferencesManager/UserPreferencesManager'
|
|
172
175
|
export { BaseBoxShapeUtil, type TLBaseBoxShape } from './lib/editor/shapes/BaseBoxShapeUtil'
|
|
173
176
|
export { GroupShapeUtil } from './lib/editor/shapes/group/GroupShapeUtil'
|
|
@@ -178,6 +181,7 @@ export {
|
|
|
178
181
|
type TLDragShapesOutInfo,
|
|
179
182
|
type TLDragShapesOverInfo,
|
|
180
183
|
type TLDropShapesOverInfo,
|
|
184
|
+
type TLEditStartInfo,
|
|
181
185
|
type TLGeometryOpts,
|
|
182
186
|
type TLHandleDragInfo,
|
|
183
187
|
type TLResizeInfo,
|
|
@@ -282,7 +286,7 @@ export {
|
|
|
282
286
|
type SvgExportDef,
|
|
283
287
|
} from './lib/editor/types/SvgExportContext'
|
|
284
288
|
export { getSvgAsImage } from './lib/exports/getSvgAsImage'
|
|
285
|
-
export { tlenv } from './lib/globals/environment'
|
|
289
|
+
export { tlenv, tlenvReactive } from './lib/globals/environment'
|
|
286
290
|
export { tlmenus } from './lib/globals/menus'
|
|
287
291
|
export { tltime } from './lib/globals/time'
|
|
288
292
|
export {
|
|
@@ -12,7 +12,7 @@ const initialState = { error: null }
|
|
|
12
12
|
|
|
13
13
|
/** @public */
|
|
14
14
|
export class ErrorBoundary extends React.Component<
|
|
15
|
-
React.
|
|
15
|
+
React.PropsWithChildren<TLErrorBoundaryProps>,
|
|
16
16
|
{ error: Error | null }
|
|
17
17
|
> {
|
|
18
18
|
static getDerivedStateFromError(error: Error) {
|
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
import { track } from '@tldraw/state-react'
|
|
2
2
|
import { modulate } from '@tldraw/utils'
|
|
3
|
-
import { useEffect, useState } from 'react'
|
|
4
3
|
import { useEditor } from '../hooks/useEditor'
|
|
5
4
|
import { Geometry2d } from '../primitives/geometry/Geometry2d'
|
|
6
5
|
import { Group2d } from '../primitives/geometry/Group2d'
|
|
7
6
|
|
|
8
|
-
function useTick(isEnabled = true) {
|
|
9
|
-
const [_, setTick] = useState(0)
|
|
10
|
-
const editor = useEditor()
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
if (!isEnabled) return
|
|
13
|
-
const update = () => setTick((tick) => tick + 1)
|
|
14
|
-
editor.on('tick', update)
|
|
15
|
-
return () => {
|
|
16
|
-
editor.off('tick', update)
|
|
17
|
-
}
|
|
18
|
-
}, [editor, isEnabled])
|
|
19
|
-
}
|
|
20
|
-
|
|
21
7
|
export const GeometryDebuggingView = track(function GeometryDebuggingView({
|
|
22
8
|
showStroke = true,
|
|
23
9
|
showVertices = true,
|
|
@@ -29,13 +15,9 @@ export const GeometryDebuggingView = track(function GeometryDebuggingView({
|
|
|
29
15
|
}) {
|
|
30
16
|
const editor = useEditor()
|
|
31
17
|
|
|
32
|
-
useTick(showClosestPointOnOutline)
|
|
33
|
-
|
|
34
18
|
const zoomLevel = editor.getZoomLevel()
|
|
35
19
|
const renderingShapes = editor.getRenderingShapes()
|
|
36
|
-
const
|
|
37
|
-
inputs: { currentPagePoint },
|
|
38
|
-
} = editor
|
|
20
|
+
const currentPagePoint = editor.inputs.getCurrentPagePoint()
|
|
39
21
|
|
|
40
22
|
return (
|
|
41
23
|
<svg
|
|
@@ -86,6 +86,7 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
86
86
|
const transform = `scale(${toDomPrecision(z)}) translate(${toDomPrecision(
|
|
87
87
|
x + offset
|
|
88
88
|
)}px,${toDomPrecision(y + offset)}px)`
|
|
89
|
+
|
|
89
90
|
setStyleProperty(rHtmlLayer.current, 'transform', transform)
|
|
90
91
|
setStyleProperty(rHtmlLayer2.current, 'transform', transform)
|
|
91
92
|
},
|
|
@@ -209,7 +210,7 @@ function GridWrapper() {
|
|
|
209
210
|
function ScribbleWrapper() {
|
|
210
211
|
const editor = useEditor()
|
|
211
212
|
const scribbles = useValue('scribbles', () => editor.getInstanceState().scribbles, [editor])
|
|
212
|
-
const zoomLevel = useValue('zoomLevel', () => editor.
|
|
213
|
+
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
213
214
|
const { Scribble } = useEditorComponents()
|
|
214
215
|
|
|
215
216
|
if (!(Scribble && scribbles.length)) return null
|
|
@@ -242,7 +243,7 @@ function ZoomBrushWrapper() {
|
|
|
242
243
|
function SnapIndicatorWrapper() {
|
|
243
244
|
const editor = useEditor()
|
|
244
245
|
const lines = useValue('snapLines', () => editor.snaps.getIndicators(), [editor])
|
|
245
|
-
const zoomLevel = useValue('zoomLevel', () => editor.
|
|
246
|
+
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
246
247
|
const { SnapIndicator } = useEditorComponents()
|
|
247
248
|
|
|
248
249
|
if (!(SnapIndicator && lines.length > 0)) return null
|
|
@@ -283,7 +284,7 @@ function HandlesWrapperInner({ shapeId }: { shapeId: TLShapeId }) {
|
|
|
283
284
|
const editor = useEditor()
|
|
284
285
|
const { Handles } = useEditorComponents()
|
|
285
286
|
|
|
286
|
-
const zoomLevel = useValue('zoomLevel', () => editor.
|
|
287
|
+
const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
|
|
287
288
|
|
|
288
289
|
const isCoarse = useValue('coarse pointer', () => editor.getInstanceState().isCoarsePointer, [
|
|
289
290
|
editor,
|
|
@@ -411,11 +412,7 @@ function ReflowIfNeeded() {
|
|
|
411
412
|
'reflow for culled shapes',
|
|
412
413
|
() => {
|
|
413
414
|
const culledShapes = editor.getCulledShapes()
|
|
414
|
-
if (
|
|
415
|
-
culledShapesRef.current.size === culledShapes.size &&
|
|
416
|
-
[...culledShapes].every((id) => culledShapesRef.current.has(id))
|
|
417
|
-
)
|
|
418
|
-
return
|
|
415
|
+
if (culledShapesRef.current === culledShapes) return
|
|
419
416
|
|
|
420
417
|
culledShapesRef.current = culledShapes
|
|
421
418
|
const canvas = document.getElementsByClassName('tl-canvas')
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { defaultUserPreferences, userTypeValidator } from './TLUserPreferences'
|
|
3
|
+
|
|
4
|
+
describe('TLUserPreferences consistency', () => {
|
|
5
|
+
// When adding a new user preference, add it to this list AND update:
|
|
6
|
+
// 1. TLUserPreferences interface
|
|
7
|
+
// 2. userTypeValidator
|
|
8
|
+
// 3. defaultUserPreferences
|
|
9
|
+
// 4. Versions enum and migrateSnapshot()
|
|
10
|
+
const interfaceKeys = [
|
|
11
|
+
'name',
|
|
12
|
+
'color',
|
|
13
|
+
'locale',
|
|
14
|
+
'animationSpeed',
|
|
15
|
+
'areKeyboardShortcutsEnabled',
|
|
16
|
+
'edgeScrollSpeed',
|
|
17
|
+
'colorScheme',
|
|
18
|
+
'isSnapMode',
|
|
19
|
+
'isWrapMode',
|
|
20
|
+
'isDynamicSizeMode',
|
|
21
|
+
'isPasteAtCursorMode',
|
|
22
|
+
'enhancedA11yMode',
|
|
23
|
+
'inputMode',
|
|
24
|
+
] as const
|
|
25
|
+
|
|
26
|
+
it('defaultUserPreferences contains all TLUserPreferences keys (except id)', () => {
|
|
27
|
+
const defaultKeys = Object.keys(defaultUserPreferences).sort()
|
|
28
|
+
const expected = [...interfaceKeys].sort()
|
|
29
|
+
|
|
30
|
+
expect(defaultKeys).toEqual(expected)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('userTypeValidator validates all TLUserPreferences keys', () => {
|
|
34
|
+
// Access the internal config property to check which keys the validator covers
|
|
35
|
+
const validatorKeys = Object.keys((userTypeValidator as any).config).sort()
|
|
36
|
+
const expected = ['id', ...interfaceKeys].sort()
|
|
37
|
+
|
|
38
|
+
expect(validatorKeys).toEqual(expected)
|
|
39
|
+
})
|
|
40
|
+
})
|
package/src/lib/constants.ts
CHANGED
|
@@ -6,25 +6,25 @@ import {
|
|
|
6
6
|
Rectangle2d,
|
|
7
7
|
ShapeUtil,
|
|
8
8
|
T,
|
|
9
|
-
|
|
9
|
+
TLShape,
|
|
10
10
|
createShapeId,
|
|
11
11
|
createTLStore,
|
|
12
12
|
} from '../..'
|
|
13
13
|
import { Editor } from './Editor'
|
|
14
14
|
import { StateNode } from './tools/StateNode'
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
h: number
|
|
21
|
-
text: string | undefined
|
|
22
|
-
isFilled: boolean
|
|
16
|
+
const MY_CUSTOM_SHAPE_TYPE = 'my-custom-shape'
|
|
17
|
+
|
|
18
|
+
declare module '@tldraw/tlschema' {
|
|
19
|
+
export interface TLGlobalShapePropsMap {
|
|
20
|
+
[MY_CUSTOM_SHAPE_TYPE]: { w: number; h: number; text: string | undefined; isFilled: boolean }
|
|
23
21
|
}
|
|
24
|
-
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type ICustomShape = TLShape<typeof MY_CUSTOM_SHAPE_TYPE>
|
|
25
25
|
|
|
26
26
|
class CustomShape extends ShapeUtil<ICustomShape> {
|
|
27
|
-
static override type =
|
|
27
|
+
static override type = MY_CUSTOM_SHAPE_TYPE
|
|
28
28
|
static override props: RecordProps<ICustomShape> = {
|
|
29
29
|
w: T.number,
|
|
30
30
|
h: T.number,
|
|
@@ -925,6 +925,146 @@ describe('replaceExternalContent', () => {
|
|
|
925
925
|
})
|
|
926
926
|
})
|
|
927
927
|
|
|
928
|
+
describe('dispatch event emission', () => {
|
|
929
|
+
let testEditor: Editor
|
|
930
|
+
|
|
931
|
+
beforeEach(() => {
|
|
932
|
+
testEditor = new Editor({
|
|
933
|
+
shapeUtils: [CustomShape],
|
|
934
|
+
bindingUtils: [],
|
|
935
|
+
tools: [],
|
|
936
|
+
store: createTLStore({ shapeUtils: [CustomShape], bindingUtils: [] }),
|
|
937
|
+
getContainer: () => document.body,
|
|
938
|
+
})
|
|
939
|
+
// Ensure camera is unlocked so events are processed
|
|
940
|
+
testEditor.setCameraOptions({ isLocked: false })
|
|
941
|
+
})
|
|
942
|
+
|
|
943
|
+
it('emits wheel events through the event emitter', () => {
|
|
944
|
+
const eventHandler = vi.fn()
|
|
945
|
+
testEditor.on('event', eventHandler)
|
|
946
|
+
|
|
947
|
+
const wheelEvent = {
|
|
948
|
+
type: 'wheel' as const,
|
|
949
|
+
name: 'wheel' as const,
|
|
950
|
+
delta: { x: 0, y: 10, z: 0 },
|
|
951
|
+
point: { x: 100, y: 100, z: 1 },
|
|
952
|
+
shiftKey: false,
|
|
953
|
+
altKey: false,
|
|
954
|
+
ctrlKey: false,
|
|
955
|
+
metaKey: false,
|
|
956
|
+
accelKey: false,
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
testEditor.dispatch(wheelEvent)
|
|
960
|
+
// Wheel events are batched for the next tick, so emit a tick to flush them
|
|
961
|
+
testEditor.emit('tick', 16)
|
|
962
|
+
|
|
963
|
+
expect(eventHandler).toHaveBeenCalledWith(wheelEvent)
|
|
964
|
+
})
|
|
965
|
+
|
|
966
|
+
it('emits pinch_start events through the event emitter', () => {
|
|
967
|
+
const eventHandler = vi.fn()
|
|
968
|
+
testEditor.on('event', eventHandler)
|
|
969
|
+
|
|
970
|
+
const pinchStartEvent = {
|
|
971
|
+
type: 'pinch' as const,
|
|
972
|
+
name: 'pinch_start' as const,
|
|
973
|
+
point: { x: 100, y: 100, z: 1 },
|
|
974
|
+
delta: { x: 0, y: 0, z: 0 },
|
|
975
|
+
shiftKey: false,
|
|
976
|
+
altKey: false,
|
|
977
|
+
ctrlKey: false,
|
|
978
|
+
metaKey: false,
|
|
979
|
+
accelKey: false,
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
testEditor.dispatch(pinchStartEvent)
|
|
983
|
+
// Pinch events are batched for the next tick, so emit a tick to flush them
|
|
984
|
+
testEditor.emit('tick', 16)
|
|
985
|
+
|
|
986
|
+
expect(eventHandler).toHaveBeenCalledWith(pinchStartEvent)
|
|
987
|
+
})
|
|
988
|
+
|
|
989
|
+
it('emits pinch events through the event emitter', () => {
|
|
990
|
+
const eventHandler = vi.fn()
|
|
991
|
+
testEditor.on('event', eventHandler)
|
|
992
|
+
|
|
993
|
+
// First dispatch pinch_start to set isPinching
|
|
994
|
+
const pinchStartEvent = {
|
|
995
|
+
type: 'pinch' as const,
|
|
996
|
+
name: 'pinch_start' as const,
|
|
997
|
+
point: { x: 100, y: 100, z: 1 },
|
|
998
|
+
delta: { x: 0, y: 0, z: 0 },
|
|
999
|
+
shiftKey: false,
|
|
1000
|
+
altKey: false,
|
|
1001
|
+
ctrlKey: false,
|
|
1002
|
+
metaKey: false,
|
|
1003
|
+
accelKey: false,
|
|
1004
|
+
}
|
|
1005
|
+
testEditor.dispatch(pinchStartEvent)
|
|
1006
|
+
testEditor.emit('tick', 16)
|
|
1007
|
+
|
|
1008
|
+
eventHandler.mockClear()
|
|
1009
|
+
|
|
1010
|
+
const pinchEvent = {
|
|
1011
|
+
type: 'pinch' as const,
|
|
1012
|
+
name: 'pinch' as const,
|
|
1013
|
+
point: { x: 100, y: 100, z: 1.5 },
|
|
1014
|
+
delta: { x: 10, y: 10, z: 0 },
|
|
1015
|
+
shiftKey: false,
|
|
1016
|
+
altKey: false,
|
|
1017
|
+
ctrlKey: false,
|
|
1018
|
+
metaKey: false,
|
|
1019
|
+
accelKey: false,
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
testEditor.dispatch(pinchEvent)
|
|
1023
|
+
testEditor.emit('tick', 16)
|
|
1024
|
+
|
|
1025
|
+
expect(eventHandler).toHaveBeenCalledWith(pinchEvent)
|
|
1026
|
+
})
|
|
1027
|
+
|
|
1028
|
+
it('emits pinch_end events through the event emitter', () => {
|
|
1029
|
+
const eventHandler = vi.fn()
|
|
1030
|
+
testEditor.on('event', eventHandler)
|
|
1031
|
+
|
|
1032
|
+
// First dispatch pinch_start to set isPinching
|
|
1033
|
+
const pinchStartEvent = {
|
|
1034
|
+
type: 'pinch' as const,
|
|
1035
|
+
name: 'pinch_start' as const,
|
|
1036
|
+
point: { x: 100, y: 100, z: 1 },
|
|
1037
|
+
delta: { x: 0, y: 0, z: 0 },
|
|
1038
|
+
shiftKey: false,
|
|
1039
|
+
altKey: false,
|
|
1040
|
+
ctrlKey: false,
|
|
1041
|
+
metaKey: false,
|
|
1042
|
+
accelKey: false,
|
|
1043
|
+
}
|
|
1044
|
+
testEditor.dispatch(pinchStartEvent)
|
|
1045
|
+
testEditor.emit('tick', 16)
|
|
1046
|
+
|
|
1047
|
+
eventHandler.mockClear()
|
|
1048
|
+
|
|
1049
|
+
const pinchEndEvent = {
|
|
1050
|
+
type: 'pinch' as const,
|
|
1051
|
+
name: 'pinch_end' as const,
|
|
1052
|
+
point: { x: 100, y: 100, z: 1.5 },
|
|
1053
|
+
delta: { x: 0, y: 0, z: 0 },
|
|
1054
|
+
shiftKey: false,
|
|
1055
|
+
altKey: false,
|
|
1056
|
+
ctrlKey: false,
|
|
1057
|
+
metaKey: false,
|
|
1058
|
+
accelKey: false,
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
testEditor.dispatch(pinchEndEvent)
|
|
1062
|
+
testEditor.emit('tick', 16)
|
|
1063
|
+
|
|
1064
|
+
expect(eventHandler).toHaveBeenCalledWith(pinchEndEvent)
|
|
1065
|
+
})
|
|
1066
|
+
})
|
|
1067
|
+
|
|
928
1068
|
describe('setTool', () => {
|
|
929
1069
|
class CustomToolA extends StateNode {
|
|
930
1070
|
static override id = 'custom-tool-a'
|