@tldraw/editor 3.13.0-canary.712bc0b8b5bc → 3.13.0-canary.7ec2a895a616
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/dist-cjs/index.d.ts +99 -99
- package/dist-cjs/index.js +7 -22
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/components/Shape.js +2 -1
- package/dist-cjs/lib/components/Shape.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +10 -6
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +17 -11
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +112 -23
- package/dist-cjs/lib/editor/Editor.js.map +3 -3
- package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
- package/dist-cjs/lib/editor/managers/TextManager.js +10 -0
- package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +1 -1
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +0 -3
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js +1 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +16 -0
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/Mat.js +1 -1
- package/dist-cjs/lib/primitives/Mat.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +20 -0
- package/dist-cjs/lib/primitives/Vec.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
- package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +91 -20
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Group2d.js +55 -2
- package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
- package/dist-cjs/lib/utils/areShapesContentEqual.js +25 -0
- package/dist-cjs/lib/utils/areShapesContentEqual.js.map +7 -0
- package/dist-cjs/lib/utils/debug-flags.js +5 -2
- package/dist-cjs/lib/utils/debug-flags.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 +99 -99
- package/dist-esm/index.mjs +9 -41
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/components/Shape.mjs +2 -1
- package/dist-esm/lib/components/Shape.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +10 -6
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +17 -11
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +112 -23
- package/dist-esm/lib/editor/Editor.mjs.map +3 -3
- package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/TextManager.mjs +10 -0
- package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +1 -1
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +0 -3
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEditorComponents.mjs +1 -4
- package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +16 -0
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/Mat.mjs +1 -1
- package/dist-esm/lib/primitives/Mat.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +20 -0
- package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +92 -21
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
- package/dist-esm/lib/utils/areShapesContentEqual.mjs +5 -0
- package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +7 -0
- package/dist-esm/lib/utils/debug-flags.mjs +5 -2
- package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +36 -4
- package/package.json +7 -7
- package/src/index.ts +16 -31
- package/src/lib/components/Shape.tsx +2 -4
- package/src/lib/components/default-components/DefaultCanvas.tsx +11 -6
- package/src/lib/components/default-components/DefaultShapeIndicator.tsx +17 -8
- package/src/lib/editor/Editor.test.ts +1 -1
- package/src/lib/editor/Editor.ts +125 -23
- package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +0 -1
- package/src/lib/editor/managers/TextManager.ts +12 -0
- package/src/lib/editor/shapes/ShapeUtil.ts +10 -2
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +0 -4
- package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +9 -9
- package/src/lib/hooks/useEditorComponents.tsx +2 -5
- package/src/lib/primitives/Box.ts +20 -0
- package/src/lib/primitives/Mat.ts +5 -4
- package/src/lib/primitives/Vec.ts +23 -0
- package/src/lib/primitives/geometry/Arc2d.ts +5 -5
- package/src/lib/primitives/geometry/Circle2d.ts +4 -4
- package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -4
- package/src/lib/primitives/geometry/CubicSpline2d.ts +3 -3
- package/src/lib/primitives/geometry/Edge2d.ts +3 -3
- package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
- package/src/lib/primitives/geometry/Geometry2d.test.ts +42 -0
- package/src/lib/primitives/geometry/Geometry2d.ts +123 -35
- package/src/lib/primitives/geometry/Group2d.ts +70 -7
- package/src/lib/primitives/geometry/Point2d.ts +2 -2
- package/src/lib/primitives/geometry/Polyline2d.ts +3 -3
- package/src/lib/primitives/geometry/Stadium2d.ts +3 -3
- package/src/lib/test/currentToolIdMask.test.ts +1 -1
- package/src/lib/test/user.test.ts +1 -1
- package/src/lib/utils/areShapesContentEqual.ts +4 -0
- package/src/lib/utils/debug-flags.ts +7 -2
- package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -1
- package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
- package/src/version.ts +3 -3
package/dist-esm/version.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const version = "3.13.0-canary.
|
|
1
|
+
const version = "3.13.0-canary.7ec2a895a616";
|
|
2
2
|
const publishDates = {
|
|
3
3
|
major: "2024-09-13T14:36:29.063Z",
|
|
4
|
-
minor: "2025-05-
|
|
5
|
-
patch: "2025-05-
|
|
4
|
+
minor: "2025-05-21T10:32:50.789Z",
|
|
5
|
+
patch: "2025-05-21T10:32:50.789Z"
|
|
6
6
|
};
|
|
7
7
|
export {
|
|
8
8
|
publishDates,
|
package/dist-esm/version.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.13.0-canary.
|
|
4
|
+
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.13.0-canary.7ec2a895a616'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-05-21T10:32:50.789Z',\n\tpatch: '2025-05-21T10:32:50.789Z',\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
|
@@ -157,6 +157,7 @@
|
|
|
157
157
|
--color-panel-contrast: hsl(0, 0%, 100%);
|
|
158
158
|
--color-panel-overlay: hsl(0, 0%, 100%, 82%);
|
|
159
159
|
--color-panel: hsl(0, 0%, 99%);
|
|
160
|
+
--color-panel-transparent: hsla(0, 0%, 99%, 0%);
|
|
160
161
|
--color-focus: hsl(219, 65%, 50%);
|
|
161
162
|
--color-selected: hsl(214, 84%, 56%);
|
|
162
163
|
--color-selected-contrast: hsl(0, 0%, 100%);
|
|
@@ -208,6 +209,7 @@
|
|
|
208
209
|
--color-panel-contrast: hsl(245, 12%, 23%);
|
|
209
210
|
--color-panel: hsl(235, 6.8%, 13.5%);
|
|
210
211
|
--color-panel-overlay: hsl(210, 10%, 24%, 82%);
|
|
212
|
+
--color-panel-transparent: hsla(235, 6.8%, 13.5%, 0%);
|
|
211
213
|
--color-focus: hsl(217, 76%, 80%);
|
|
212
214
|
--color-selected: hsl(217, 89%, 61%);
|
|
213
215
|
--color-selected-contrast: hsl(0, 0%, 100%);
|
|
@@ -600,6 +602,36 @@ input,
|
|
|
600
602
|
}
|
|
601
603
|
}
|
|
602
604
|
|
|
605
|
+
.tl-rotate-corner:not(:hover),
|
|
606
|
+
.tl-resize-handle:not(:hover) {
|
|
607
|
+
cursor: none;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/* --------------------- Arrow Hints -------------------- */
|
|
611
|
+
|
|
612
|
+
.tl-arrow-hint-handle {
|
|
613
|
+
fill: var(--color-selected-contrast);
|
|
614
|
+
stroke: var(--color-selection-stroke);
|
|
615
|
+
stroke-width: calc(1.5px * var(--tl-scale));
|
|
616
|
+
r: calc(4px * var(--tl-scale));
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.tl-arrow-hint-snap {
|
|
620
|
+
stroke: transparent;
|
|
621
|
+
fill: var(--color-selection-fill);
|
|
622
|
+
r: calc(12px * var(--tl-scale));
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
.tl-arrow-hint-snap__none,
|
|
626
|
+
.tl-arrow-hint-snap__center,
|
|
627
|
+
.tl-arrow-hint-snap__axis {
|
|
628
|
+
display: none;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.tl-arrow-hint-snap__edge {
|
|
632
|
+
r: calc(8px * var(--tl-scale));
|
|
633
|
+
}
|
|
634
|
+
|
|
603
635
|
/* ------------------ Bounds Detail ----------------- */
|
|
604
636
|
|
|
605
637
|
.tl-image,
|
|
@@ -969,6 +1001,8 @@ input,
|
|
|
969
1001
|
|
|
970
1002
|
.tl-rich-text p {
|
|
971
1003
|
margin: 0;
|
|
1004
|
+
/* Depending on the extensions, <p> tags can be empty, without a <br />. */
|
|
1005
|
+
min-height: 1lh;
|
|
972
1006
|
}
|
|
973
1007
|
|
|
974
1008
|
.tl-rich-text ul,
|
|
@@ -976,6 +1010,8 @@ input,
|
|
|
976
1010
|
text-align: left;
|
|
977
1011
|
margin: 0;
|
|
978
1012
|
padding-left: 3.25ch;
|
|
1013
|
+
/* Some resets, like Tailwind, nix the list styling. */
|
|
1014
|
+
list-style: revert;
|
|
979
1015
|
}
|
|
980
1016
|
|
|
981
1017
|
.tl-rich-text ol:has(> li:nth-child(10)) {
|
|
@@ -1353,10 +1389,6 @@ input,
|
|
|
1353
1389
|
opacity: 0;
|
|
1354
1390
|
}
|
|
1355
1391
|
|
|
1356
|
-
.tl-arrow-label[data-isediting='true'] > .tl-arrow-label__inner {
|
|
1357
|
-
background-color: var(--color-background);
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
1392
|
.tl-arrow-label__inner {
|
|
1361
1393
|
border-radius: var(--radius-1);
|
|
1362
1394
|
box-sizing: content-box;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tldraw/editor",
|
|
3
3
|
"description": "A tiny little drawing app (editor).",
|
|
4
|
-
"version": "3.13.0-canary.
|
|
4
|
+
"version": "3.13.0-canary.7ec2a895a616",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "tldraw Inc.",
|
|
7
7
|
"email": "hello@tldraw.com"
|
|
@@ -48,12 +48,12 @@
|
|
|
48
48
|
"@tiptap/core": "^2.9.1",
|
|
49
49
|
"@tiptap/pm": "^2.9.1",
|
|
50
50
|
"@tiptap/react": "^2.9.1",
|
|
51
|
-
"@tldraw/state": "3.13.0-canary.
|
|
52
|
-
"@tldraw/state-react": "3.13.0-canary.
|
|
53
|
-
"@tldraw/store": "3.13.0-canary.
|
|
54
|
-
"@tldraw/tlschema": "3.13.0-canary.
|
|
55
|
-
"@tldraw/utils": "3.13.0-canary.
|
|
56
|
-
"@tldraw/validate": "3.13.0-canary.
|
|
51
|
+
"@tldraw/state": "3.13.0-canary.7ec2a895a616",
|
|
52
|
+
"@tldraw/state-react": "3.13.0-canary.7ec2a895a616",
|
|
53
|
+
"@tldraw/store": "3.13.0-canary.7ec2a895a616",
|
|
54
|
+
"@tldraw/tlschema": "3.13.0-canary.7ec2a895a616",
|
|
55
|
+
"@tldraw/utils": "3.13.0-canary.7ec2a895a616",
|
|
56
|
+
"@tldraw/validate": "3.13.0-canary.7ec2a895a616",
|
|
57
57
|
"@types/core-js": "^2.5.8",
|
|
58
58
|
"@use-gesture/react": "^10.3.1",
|
|
59
59
|
"classnames": "^2.5.1",
|
package/src/index.ts
CHANGED
|
@@ -4,37 +4,11 @@ import 'core-js/stable/array/flat-map.js'
|
|
|
4
4
|
import 'core-js/stable/array/flat.js'
|
|
5
5
|
import 'core-js/stable/string/at.js'
|
|
6
6
|
import 'core-js/stable/string/replace-all.js'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
react,
|
|
13
|
-
transact,
|
|
14
|
-
transaction,
|
|
15
|
-
whyAmIRunning,
|
|
16
|
-
type Atom,
|
|
17
|
-
type Signal,
|
|
18
|
-
} from '@tldraw/state'
|
|
19
|
-
export {
|
|
20
|
-
track,
|
|
21
|
-
useAtom,
|
|
22
|
-
useComputed,
|
|
23
|
-
useQuickReactor,
|
|
24
|
-
useReactor,
|
|
25
|
-
useStateTracking,
|
|
26
|
-
useValue,
|
|
27
|
-
} from '@tldraw/state-react'
|
|
28
|
-
export { resizeScaled } from './lib/editor/shapes/shared/resizeScaled'
|
|
29
|
-
export {
|
|
30
|
-
getFontsFromRichText,
|
|
31
|
-
type RichTextFontVisitor,
|
|
32
|
-
type RichTextFontVisitorState,
|
|
33
|
-
type TLTextOptions,
|
|
34
|
-
type TiptapEditor,
|
|
35
|
-
type TiptapNode,
|
|
36
|
-
} from './lib/utils/richText'
|
|
37
|
-
export { LocalIndexedDb, Table, type StoreName } from './lib/utils/sync/LocalIndexedDb'
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line local/no-export-star
|
|
9
|
+
export * from '@tldraw/state'
|
|
10
|
+
// eslint-disable-next-line local/no-export-star
|
|
11
|
+
export * from '@tldraw/state-react'
|
|
38
12
|
// eslint-disable-next-line local/no-export-star
|
|
39
13
|
export * from '@tldraw/store'
|
|
40
14
|
// eslint-disable-next-line local/no-export-star
|
|
@@ -43,6 +17,7 @@ export * from '@tldraw/tlschema'
|
|
|
43
17
|
export * from '@tldraw/utils'
|
|
44
18
|
// eslint-disable-next-line local/no-export-star
|
|
45
19
|
export * from '@tldraw/validate'
|
|
20
|
+
|
|
46
21
|
export {
|
|
47
22
|
ErrorScreen,
|
|
48
23
|
LoadingScreen,
|
|
@@ -212,6 +187,7 @@ export {
|
|
|
212
187
|
export { GroupShapeUtil } from './lib/editor/shapes/group/GroupShapeUtil'
|
|
213
188
|
export { getPerfectDashProps } from './lib/editor/shapes/shared/getPerfectDashProps'
|
|
214
189
|
export { resizeBox, type ResizeBoxOptions } from './lib/editor/shapes/shared/resizeBox'
|
|
190
|
+
export { resizeScaled } from './lib/editor/shapes/shared/resizeScaled'
|
|
215
191
|
export { BaseBoxShapeTool } from './lib/editor/tools/BaseBoxShapeTool/BaseBoxShapeTool'
|
|
216
192
|
export { maybeSnapToGrid } from './lib/editor/tools/BaseBoxShapeTool/children/Pointing'
|
|
217
193
|
export { StateNode, type TLStateNodeConstructor } from './lib/editor/tools/StateNode'
|
|
@@ -459,12 +435,21 @@ export { hardResetEditor } from './lib/utils/hardResetEditor'
|
|
|
459
435
|
export { isAccelKey } from './lib/utils/keyboard'
|
|
460
436
|
export { normalizeWheel } from './lib/utils/normalizeWheel'
|
|
461
437
|
export { refreshPage } from './lib/utils/refreshPage'
|
|
438
|
+
export {
|
|
439
|
+
getFontsFromRichText,
|
|
440
|
+
type RichTextFontVisitor,
|
|
441
|
+
type RichTextFontVisitorState,
|
|
442
|
+
type TLTextOptions,
|
|
443
|
+
type TiptapEditor,
|
|
444
|
+
type TiptapNode,
|
|
445
|
+
} from './lib/utils/richText'
|
|
462
446
|
export {
|
|
463
447
|
applyRotationToSnapshotShapes,
|
|
464
448
|
getRotationSnapshot,
|
|
465
449
|
type TLRotationSnapshot,
|
|
466
450
|
} from './lib/utils/rotation'
|
|
467
451
|
export { runtime, setRuntimeOverrides } from './lib/utils/runtime'
|
|
452
|
+
export { LocalIndexedDb, Table, type StoreName } from './lib/utils/sync/LocalIndexedDb'
|
|
468
453
|
export { type TLStoreWithStatus } from './lib/utils/sync/StoreWithStatus'
|
|
469
454
|
export { hardReset } from './lib/utils/sync/hardReset'
|
|
470
455
|
export { uniq } from './lib/utils/uniq'
|
|
@@ -6,6 +6,7 @@ import { ShapeUtil } from '../editor/shapes/ShapeUtil'
|
|
|
6
6
|
import { useEditor } from '../hooks/useEditor'
|
|
7
7
|
import { useEditorComponents } from '../hooks/useEditorComponents'
|
|
8
8
|
import { Mat } from '../primitives/Mat'
|
|
9
|
+
import { areShapesContentEqual } from '../utils/areShapesContentEqual'
|
|
9
10
|
import { setStyleProperty } from '../utils/dom'
|
|
10
11
|
import { OptionalErrorBoundary } from './ErrorBoundary'
|
|
11
12
|
|
|
@@ -190,10 +191,7 @@ export const InnerShape = memo(
|
|
|
190
191
|
[util, shape.id]
|
|
191
192
|
)
|
|
192
193
|
},
|
|
193
|
-
(prev, next) =>
|
|
194
|
-
prev.shape.props === next.shape.props &&
|
|
195
|
-
prev.shape.meta === next.shape.meta &&
|
|
196
|
-
prev.util === next.util
|
|
194
|
+
(prev, next) => areShapesContentEqual(prev.shape, next.shape) && prev.util === next.util
|
|
197
195
|
)
|
|
198
196
|
|
|
199
197
|
export const InnerShapeBackground = memo(
|
|
@@ -37,7 +37,7 @@ export interface TLCanvasComponentProps {
|
|
|
37
37
|
export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
38
38
|
const editor = useEditor()
|
|
39
39
|
|
|
40
|
-
const { Background, SvgDefs, ShapeIndicators } = useEditorComponents()
|
|
40
|
+
const { SelectionBackground, Background, SvgDefs, ShapeIndicators } = useEditorComponents()
|
|
41
41
|
|
|
42
42
|
const rCanvas = useRef<HTMLDivElement>(null)
|
|
43
43
|
const rHtmlLayer = useRef<HTMLDivElement>(null)
|
|
@@ -155,7 +155,7 @@ export function DefaultCanvas({ className }: TLCanvasComponentProps) {
|
|
|
155
155
|
<GridWrapper />
|
|
156
156
|
<div ref={rHtmlLayer} className="tl-html-layer tl-shapes" draggable={false}>
|
|
157
157
|
<OnTheCanvasWrapper />
|
|
158
|
-
<SelectionBackgroundWrapper />
|
|
158
|
+
{SelectionBackground && <SelectionBackgroundWrapper />}
|
|
159
159
|
{hideShapes ? null : debugSvg ? <ShapesWithSVGs /> : <ShapesToDisplay />}
|
|
160
160
|
</div>
|
|
161
161
|
<div className="tl-overlays">
|
|
@@ -365,7 +365,8 @@ function HandleWrapper({
|
|
|
365
365
|
return (
|
|
366
366
|
<g
|
|
367
367
|
role="button"
|
|
368
|
-
|
|
368
|
+
// TODO(mime): handle.label needs to be required in the future.
|
|
369
|
+
aria-label={handle.label || 'handle'}
|
|
369
370
|
transform={`translate(${handle.x}, ${handle.y})`}
|
|
370
371
|
{...events}
|
|
371
372
|
>
|
|
@@ -575,9 +576,13 @@ function DebugSvgCopy({ id, mode }: { id: TLShapeId; mode: 'img' | 'iframe' }) {
|
|
|
575
576
|
|
|
576
577
|
function SelectionForegroundWrapper() {
|
|
577
578
|
const editor = useEditor()
|
|
578
|
-
const selectionRotation = useValue(
|
|
579
|
-
|
|
580
|
-
|
|
579
|
+
const selectionRotation = useValue(
|
|
580
|
+
'selection rotation',
|
|
581
|
+
function getSelectionRotation() {
|
|
582
|
+
return editor.getSelectionRotation()
|
|
583
|
+
},
|
|
584
|
+
[editor]
|
|
585
|
+
)
|
|
581
586
|
const selectionBounds = useValue(
|
|
582
587
|
'selection bounds',
|
|
583
588
|
() => editor.getSelectionRotatedPageBounds(),
|
|
@@ -9,13 +9,21 @@ import { useEditorComponents } from '../../hooks/useEditorComponents'
|
|
|
9
9
|
import { OptionalErrorBoundary } from '../ErrorBoundary'
|
|
10
10
|
|
|
11
11
|
// need an extra layer of indirection here to allow hooks to be used inside the indicator render
|
|
12
|
-
const EvenInnererIndicator = memo(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
const EvenInnererIndicator = memo(
|
|
13
|
+
({ shape, util }: { shape: TLShape; util: ShapeUtil<any> }) => {
|
|
14
|
+
return useStateTracking('Indicator: ' + shape.type, () =>
|
|
15
|
+
// always fetch the latest shape from the store even if the props/meta have not changed, to avoid
|
|
16
|
+
// calling the render method with stale data.
|
|
17
|
+
util.indicator(util.editor.store.unsafeGetWithoutCapture(shape.id) as TLShape)
|
|
18
|
+
)
|
|
19
|
+
},
|
|
20
|
+
(prevProps, nextProps) => {
|
|
21
|
+
return (
|
|
22
|
+
prevProps.shape.props === nextProps.shape.props &&
|
|
23
|
+
prevProps.shape.meta === nextProps.shape.meta
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
)
|
|
19
27
|
|
|
20
28
|
const InnerIndicator = memo(({ editor, id }: { editor: Editor; id: TLShapeId }) => {
|
|
21
29
|
const shape = useValue('shape for indicator', () => editor.store.get(id), [editor, id])
|
|
@@ -61,13 +69,14 @@ export const DefaultShapeIndicator = memo(function DefaultShapeIndicator({
|
|
|
61
69
|
useQuickReactor(
|
|
62
70
|
'indicator transform',
|
|
63
71
|
() => {
|
|
72
|
+
if (hidden) return
|
|
64
73
|
const elm = rIndicator.current
|
|
65
74
|
if (!elm) return
|
|
66
75
|
const pageTransform = editor.getShapePageTransform(shapeId)
|
|
67
76
|
if (!pageTransform) return
|
|
68
77
|
elm.style.setProperty('transform', pageTransform.toCssString())
|
|
69
78
|
},
|
|
70
|
-
[editor, shapeId]
|
|
79
|
+
[editor, shapeId, hidden]
|
|
71
80
|
)
|
|
72
81
|
|
|
73
82
|
useLayoutEffect(() => {
|
|
@@ -52,7 +52,7 @@ beforeEach(() => {
|
|
|
52
52
|
shapeUtils: [CustomShape],
|
|
53
53
|
bindingUtils: [],
|
|
54
54
|
tools: [],
|
|
55
|
-
store: createTLStore({ shapeUtils: [CustomShape] }),
|
|
55
|
+
store: createTLStore({ shapeUtils: [CustomShape], bindingUtils: [] }),
|
|
56
56
|
getContainer: () => document.body,
|
|
57
57
|
})
|
|
58
58
|
editor.setCameraOptions({ isLocked: true })
|
package/src/lib/editor/Editor.ts
CHANGED
|
@@ -129,6 +129,7 @@ import { Group2d } from '../primitives/geometry/Group2d'
|
|
|
129
129
|
import { intersectPolygonPolygon } from '../primitives/intersect'
|
|
130
130
|
import { PI, approximately, areAnglesCompatible, clamp, pointInPolygon } from '../primitives/utils'
|
|
131
131
|
import { ReadonlySharedStyleMap, SharedStyle, SharedStyleMap } from '../utils/SharedStylesMap'
|
|
132
|
+
import { areShapesContentEqual } from '../utils/areShapesContentEqual'
|
|
132
133
|
import { dataUrlToFile } from '../utils/assets'
|
|
133
134
|
import { debugFlags } from '../utils/debug-flags'
|
|
134
135
|
import {
|
|
@@ -325,7 +326,6 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
325
326
|
this.options = { ...defaultTldrawOptions, ...options }
|
|
326
327
|
|
|
327
328
|
this.store = store
|
|
328
|
-
this.disposables.add(this.store.dispose.bind(this.store))
|
|
329
329
|
this.history = new HistoryManager<TLRecord>({
|
|
330
330
|
store,
|
|
331
331
|
annotateError: (error) => {
|
|
@@ -955,6 +955,7 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
955
955
|
dispose() {
|
|
956
956
|
this.disposables.forEach((dispose) => dispose())
|
|
957
957
|
this.disposables.clear()
|
|
958
|
+
this.store.dispose()
|
|
958
959
|
this.isDisposed = true
|
|
959
960
|
}
|
|
960
961
|
|
|
@@ -1814,9 +1815,28 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
1814
1815
|
return this
|
|
1815
1816
|
}
|
|
1816
1817
|
|
|
1818
|
+
/**
|
|
1819
|
+
* Select the next shape in the reading order or in cardinal order.
|
|
1820
|
+
*
|
|
1821
|
+
* @example
|
|
1822
|
+
* ```ts
|
|
1823
|
+
* editor.selectAdjacentShape('next')
|
|
1824
|
+
* ```
|
|
1825
|
+
*
|
|
1826
|
+
* @public
|
|
1827
|
+
*/
|
|
1817
1828
|
selectAdjacentShape(direction: TLAdjacentDirection) {
|
|
1818
|
-
const readingOrderShapes = this.getCurrentPageShapesInReadingOrder()
|
|
1819
1829
|
const selectedShapeIds = this.getSelectedShapeIds()
|
|
1830
|
+
const firstParentId = selectedShapeIds[0] ? this.getShape(selectedShapeIds[0])?.parentId : null
|
|
1831
|
+
const isSelectedWithinContainer =
|
|
1832
|
+
firstParentId &&
|
|
1833
|
+
selectedShapeIds.every((shapeId) => this.getShape(shapeId)?.parentId === firstParentId) &&
|
|
1834
|
+
!isPageId(firstParentId)
|
|
1835
|
+
const readingOrderShapes = isSelectedWithinContainer
|
|
1836
|
+
? this._getShapesInReadingOrder(
|
|
1837
|
+
this.getCurrentPageShapes().filter((shape) => shape.parentId === firstParentId)
|
|
1838
|
+
)
|
|
1839
|
+
: this.getCurrentPageShapesInReadingOrder()
|
|
1820
1840
|
const currentShapeId: TLShapeId | undefined =
|
|
1821
1841
|
selectedShapeIds.length === 1
|
|
1822
1842
|
? selectedShapeIds[0]
|
|
@@ -1838,13 +1858,7 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
1838
1858
|
const shape = this.getShape(adjacentShapeId)
|
|
1839
1859
|
if (!shape) return
|
|
1840
1860
|
|
|
1841
|
-
this.
|
|
1842
|
-
this.zoomToSelectionIfOffscreen(256, {
|
|
1843
|
-
animation: {
|
|
1844
|
-
duration: this.options.animationMediumMs,
|
|
1845
|
-
},
|
|
1846
|
-
inset: 0,
|
|
1847
|
-
})
|
|
1861
|
+
this._selectShapesAndZoom([shape.id])
|
|
1848
1862
|
}
|
|
1849
1863
|
|
|
1850
1864
|
/**
|
|
@@ -1854,10 +1868,14 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
1854
1868
|
* @public
|
|
1855
1869
|
*/
|
|
1856
1870
|
@computed getCurrentPageShapesInReadingOrder(): TLShape[] {
|
|
1871
|
+
const shapes = this.getCurrentPageShapes().filter((shape) => isPageId(shape.parentId))
|
|
1872
|
+
return this._getShapesInReadingOrder(shapes)
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
private _getShapesInReadingOrder(shapes: TLShape[]): TLShape[] {
|
|
1857
1876
|
const SHALLOW_ANGLE = 20
|
|
1858
1877
|
const ROW_THRESHOLD = 100
|
|
1859
1878
|
|
|
1860
|
-
const shapes = this.getCurrentPageShapes()
|
|
1861
1879
|
const tabbableShapes = shapes.filter((shape) => this.getShapeUtil(shape).canTabTo(shape))
|
|
1862
1880
|
|
|
1863
1881
|
if (tabbableShapes.length <= 1) return tabbableShapes
|
|
@@ -2003,6 +2021,36 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
2003
2021
|
return lowestScoringShape!.shape.id
|
|
2004
2022
|
}
|
|
2005
2023
|
|
|
2024
|
+
selectParentShape() {
|
|
2025
|
+
const selectedShape = this.getOnlySelectedShape()
|
|
2026
|
+
if (!selectedShape) return
|
|
2027
|
+
const parentShape = this.getShape(selectedShape.parentId)
|
|
2028
|
+
if (!parentShape) return
|
|
2029
|
+
this._selectShapesAndZoom([parentShape.id])
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
selectFirstChildShape() {
|
|
2033
|
+
const selectedShapes = this.getSelectedShapes()
|
|
2034
|
+
if (!selectedShapes.length) return
|
|
2035
|
+
const selectedShape = selectedShapes[0]
|
|
2036
|
+
const children = this.getSortedChildIdsForParent(selectedShape.id)
|
|
2037
|
+
.map((id) => this.getShape(id))
|
|
2038
|
+
.filter((i) => i) as TLShape[]
|
|
2039
|
+
const sortedChildren = this._getShapesInReadingOrder(children)
|
|
2040
|
+
if (sortedChildren.length === 0) return
|
|
2041
|
+
this._selectShapesAndZoom([sortedChildren[0].id])
|
|
2042
|
+
}
|
|
2043
|
+
|
|
2044
|
+
private _selectShapesAndZoom(ids: TLShapeId[]) {
|
|
2045
|
+
this.setSelectedShapes(ids)
|
|
2046
|
+
this.zoomToSelectionIfOffscreen(256, {
|
|
2047
|
+
animation: {
|
|
2048
|
+
duration: this.options.animationMediumMs,
|
|
2049
|
+
},
|
|
2050
|
+
inset: 0,
|
|
2051
|
+
})
|
|
2052
|
+
}
|
|
2053
|
+
|
|
2006
2054
|
/**
|
|
2007
2055
|
* Clear the selection.
|
|
2008
2056
|
*
|
|
@@ -2275,13 +2323,21 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
2275
2323
|
setEditingShape(shape: TLShapeId | TLShape | null): this {
|
|
2276
2324
|
const id = typeof shape === 'string' ? shape : (shape?.id ?? null)
|
|
2277
2325
|
this.setRichTextEditor(null)
|
|
2278
|
-
|
|
2326
|
+
const prevEditingShapeId = this.getEditingShapeId()
|
|
2327
|
+
if (id !== prevEditingShapeId) {
|
|
2279
2328
|
if (id) {
|
|
2280
2329
|
const shape = this.getShape(id)
|
|
2281
2330
|
if (shape && this.getShapeUtil(shape).canEdit(shape)) {
|
|
2282
2331
|
this.run(
|
|
2283
2332
|
() => {
|
|
2284
2333
|
this._updateCurrentPageState({ editingShapeId: id })
|
|
2334
|
+
if (prevEditingShapeId) {
|
|
2335
|
+
const prevEditingShape = this.getShape(prevEditingShapeId)
|
|
2336
|
+
if (prevEditingShape) {
|
|
2337
|
+
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape)
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
this.getShapeUtil(shape).onEditStart?.(shape)
|
|
2285
2341
|
},
|
|
2286
2342
|
{ history: 'ignore' }
|
|
2287
2343
|
)
|
|
@@ -2294,6 +2350,12 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
2294
2350
|
() => {
|
|
2295
2351
|
this._updateCurrentPageState({ editingShapeId: null })
|
|
2296
2352
|
this._currentRichTextEditor.set(null)
|
|
2353
|
+
if (prevEditingShapeId) {
|
|
2354
|
+
const prevEditingShape = this.getShape(prevEditingShapeId)
|
|
2355
|
+
if (prevEditingShape) {
|
|
2356
|
+
this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape)
|
|
2357
|
+
}
|
|
2358
|
+
}
|
|
2297
2359
|
},
|
|
2298
2360
|
{ history: 'ignore' }
|
|
2299
2361
|
)
|
|
@@ -4574,7 +4636,7 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
4574
4636
|
this.fonts.trackFontsForShape(shape)
|
|
4575
4637
|
return this.getShapeUtil(shape).getGeometry(shape, opts)
|
|
4576
4638
|
},
|
|
4577
|
-
{ areRecordsEqual:
|
|
4639
|
+
{ areRecordsEqual: areShapesContentEqual }
|
|
4578
4640
|
)
|
|
4579
4641
|
}
|
|
4580
4642
|
return this._shapeGeometryCaches[context].get(
|
|
@@ -4622,9 +4684,15 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
4622
4684
|
|
|
4623
4685
|
/** @internal */
|
|
4624
4686
|
@computed private _getShapeHandlesCache(): ComputedCache<TLHandle[] | undefined, TLShape> {
|
|
4625
|
-
return this.store.createComputedCache(
|
|
4626
|
-
|
|
4627
|
-
|
|
4687
|
+
return this.store.createComputedCache(
|
|
4688
|
+
'handles',
|
|
4689
|
+
(shape) => {
|
|
4690
|
+
return this.getShapeUtil(shape).getHandles?.(shape)
|
|
4691
|
+
},
|
|
4692
|
+
{
|
|
4693
|
+
areRecordsEqual: areShapesContentEqual,
|
|
4694
|
+
}
|
|
4695
|
+
)
|
|
4628
4696
|
}
|
|
4629
4697
|
|
|
4630
4698
|
/**
|
|
@@ -5845,9 +5913,15 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
5845
5913
|
@computed
|
|
5846
5914
|
private _getBindingsIndexCache() {
|
|
5847
5915
|
const index = bindingsIndex(this)
|
|
5848
|
-
return this.store.createComputedCache<TLBinding[], TLShape>(
|
|
5849
|
-
|
|
5850
|
-
|
|
5916
|
+
return this.store.createComputedCache<TLBinding[], TLShape>(
|
|
5917
|
+
'bindingsIndex',
|
|
5918
|
+
(shape) => {
|
|
5919
|
+
return index.get().get(shape.id)
|
|
5920
|
+
},
|
|
5921
|
+
// we can ignore the shape equality check here because the index is
|
|
5922
|
+
// computed incrementally based on what bindings are in the store
|
|
5923
|
+
{ areRecordsEqual: () => true }
|
|
5924
|
+
)
|
|
5851
5925
|
}
|
|
5852
5926
|
|
|
5853
5927
|
/**
|
|
@@ -10210,6 +10284,36 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
10210
10284
|
const { x: cx, y: cy, z: cz } = unsafe__withoutCapture(() => this.getCamera())
|
|
10211
10285
|
const { x: dx, y: dy, z: dz = 0 } = info.delta
|
|
10212
10286
|
|
|
10287
|
+
if (this.inputs.keys.has('KeyV')) {
|
|
10288
|
+
const selectedShapeIds = this.getSelectedShapeIds()
|
|
10289
|
+
if (selectedShapeIds.length > 0) {
|
|
10290
|
+
const instanceState = this.getInstanceState()
|
|
10291
|
+
if (!instanceState.isChangingStyle) {
|
|
10292
|
+
this.updateInstanceState({ isChangingStyle: true })
|
|
10293
|
+
}
|
|
10294
|
+
clearTimeout(this._isChangingStyleTimeout)
|
|
10295
|
+
this._isChangingStyleTimeout = this.timers.setTimeout(() => {
|
|
10296
|
+
this._updateInstanceState({ isChangingStyle: false }, { history: 'ignore' })
|
|
10297
|
+
}, 1000)
|
|
10298
|
+
this.updateShapes(
|
|
10299
|
+
compact(
|
|
10300
|
+
selectedShapeIds.map((id) => {
|
|
10301
|
+
const shape = this.getShape(id)
|
|
10302
|
+
if (!shape) return
|
|
10303
|
+
if (hasOwnProperty(shape.props, 'scale')) {
|
|
10304
|
+
const scale = (shape.props as any)['scale'] as number
|
|
10305
|
+
const change = info.delta.y / 100
|
|
10306
|
+
const next = scale + change
|
|
10307
|
+
|
|
10308
|
+
return { ...shape, props: { scale: Math.max(0.01, next) } }
|
|
10309
|
+
}
|
|
10310
|
+
})
|
|
10311
|
+
)
|
|
10312
|
+
)
|
|
10313
|
+
return
|
|
10314
|
+
}
|
|
10315
|
+
}
|
|
10316
|
+
|
|
10213
10317
|
let behavior = wheelBehavior
|
|
10214
10318
|
|
|
10215
10319
|
// If the camera behavior is "zoom" and the ctrl key is pressed, then pan;
|
|
@@ -10330,12 +10434,10 @@ export class Editor extends EventEmitter<TLEventMap> {
|
|
|
10330
10434
|
if (this.inputs.isPanning && this.inputs.isPointing) {
|
|
10331
10435
|
// Handle spacebar / middle mouse button panning
|
|
10332
10436
|
const { currentScreenPoint, previousScreenPoint } = this.inputs
|
|
10333
|
-
const { panSpeed } = cameraOptions
|
|
10334
10437
|
const offset = Vec.Sub(currentScreenPoint, previousScreenPoint)
|
|
10335
|
-
this.setCamera(
|
|
10336
|
-
|
|
10337
|
-
|
|
10338
|
-
)
|
|
10438
|
+
this.setCamera(new Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
|
|
10439
|
+
immediate: true,
|
|
10440
|
+
})
|
|
10339
10441
|
this.maybeTrackPerformance('Panning')
|
|
10340
10442
|
return
|
|
10341
10443
|
}
|
|
@@ -32,6 +32,7 @@ export interface TLMeasureTextSpanOpts {
|
|
|
32
32
|
fontStyle: string
|
|
33
33
|
lineHeight: number
|
|
34
34
|
textAlign: TLDefaultHorizontalAlignStyle
|
|
35
|
+
otherStyles?: Record<string, string>
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
const spaceCharacterRegex = /\s/
|
|
@@ -86,6 +87,7 @@ export class TextManager {
|
|
|
86
87
|
*/
|
|
87
88
|
maxWidth: null | number
|
|
88
89
|
minWidth?: null | number
|
|
90
|
+
otherStyles?: Record<string, string>
|
|
89
91
|
padding: string
|
|
90
92
|
disableOverflowWrapBreaking?: boolean
|
|
91
93
|
}
|
|
@@ -112,6 +114,11 @@ export class TextManager {
|
|
|
112
114
|
'overflow-wrap',
|
|
113
115
|
opts.disableOverflowWrapBreaking ? 'normal' : 'break-word'
|
|
114
116
|
)
|
|
117
|
+
if (opts.otherStyles) {
|
|
118
|
+
for (const [key, value] of Object.entries(opts.otherStyles)) {
|
|
119
|
+
wrapperElm.style.setProperty(key, value)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
115
122
|
|
|
116
123
|
const scrollWidth = wrapperElm.scrollWidth
|
|
117
124
|
const rect = wrapperElm.getBoundingClientRect()
|
|
@@ -256,6 +263,11 @@ export class TextManager {
|
|
|
256
263
|
elm.style.setProperty('line-height', `${opts.lineHeight * opts.fontSize}px`)
|
|
257
264
|
elm.style.setProperty('text-align', textAlignmentsForLtr[opts.textAlign])
|
|
258
265
|
elm.style.setProperty('font-style', opts.fontStyle)
|
|
266
|
+
if (opts.otherStyles) {
|
|
267
|
+
for (const [key, value] of Object.entries(opts.otherStyles)) {
|
|
268
|
+
elm.style.setProperty(key, value)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
259
271
|
|
|
260
272
|
const shouldTruncateToFirstLine =
|
|
261
273
|
opts.overflow === 'truncate-ellipsis' || opts.overflow === 'truncate-clip'
|
|
@@ -245,7 +245,7 @@ export abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknownShape> {
|
|
|
245
245
|
*
|
|
246
246
|
* @public
|
|
247
247
|
*/
|
|
248
|
-
|
|
248
|
+
canEditInReadonly(_shape: Shape): boolean {
|
|
249
249
|
return false
|
|
250
250
|
}
|
|
251
251
|
|
|
@@ -707,7 +707,15 @@ export abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknownShape> {
|
|
|
707
707
|
onClick?(shape: Shape): TLShapePartial<Shape> | void
|
|
708
708
|
|
|
709
709
|
/**
|
|
710
|
-
* A callback called when a shape
|
|
710
|
+
* A callback called when a shape starts being edited.
|
|
711
|
+
*
|
|
712
|
+
* @param shape - The shape.
|
|
713
|
+
* @public
|
|
714
|
+
*/
|
|
715
|
+
onEditStart?(shape: Shape): void
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* A callback called when a shape finishes being edited.
|
|
711
719
|
*
|
|
712
720
|
* @param shape - The shape.
|
|
713
721
|
* @public
|
|
@@ -12,10 +12,6 @@ export class GroupShapeUtil extends ShapeUtil<TLGroupShape> {
|
|
|
12
12
|
static override props = groupShapeProps
|
|
13
13
|
static override migrations = groupShapeMigrations
|
|
14
14
|
|
|
15
|
-
override canTabTo() {
|
|
16
|
-
return false
|
|
17
|
-
}
|
|
18
|
-
|
|
19
15
|
override hideSelectionBoundsFg() {
|
|
20
16
|
return true
|
|
21
17
|
}
|