@tldraw/editor 3.14.0-canary.8ea0ff8489db → 3.14.0-canary.8f303431285f
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 +166 -76
- package/dist-cjs/index.js +11 -10
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/config/TLSessionStateSnapshot.js +1 -12
- package/dist-cjs/lib/config/TLSessionStateSnapshot.js.map +3 -3
- package/dist-cjs/lib/editor/Editor.js +132 -101
- 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 +22 -22
- package/dist-cjs/lib/editor/derivations/bindingsIndex.js.map +2 -2
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js +16 -16
- package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
- package/dist-cjs/lib/editor/managers/{ClickManager.js → ClickManager/ClickManager.js} +1 -1
- package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{EdgeScrollManager.js → EdgeScrollManager/EdgeScrollManager.js} +2 -2
- package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{FontManager.js → FontManager/FontManager.js} +4 -1
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{HistoryManager.js → HistoryManager/HistoryManager.js} +67 -7
- package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{ScribbleManager.js → ScribbleManager/ScribbleManager.js} +1 -1
- package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{TextManager.js → TextManager/TextManager.js} +73 -42
- package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{TickManager.js → TickManager/TickManager.js} +1 -1
- package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/{UserPreferencesManager.js → UserPreferencesManager/UserPreferencesManager.js} +1 -1
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +7 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +0 -10
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +1 -1
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +10 -6
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +3 -3
- package/dist-cjs/lib/editor/tools/StateNode.js +3 -3
- package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
- package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
- package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
- package/dist-cjs/lib/exports/getSvgJsx.js.map +1 -1
- package/dist-cjs/lib/hooks/useCanvasEvents.js +1 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +33 -39
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +6 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Group2d.js +11 -6
- package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
- package/dist-cjs/lib/utils/areShapesContentEqual.js +1 -1
- package/dist-cjs/lib/utils/areShapesContentEqual.js.map +2 -2
- package/dist-cjs/lib/utils/dom.js +1 -1
- package/dist-cjs/lib/utils/dom.js.map +2 -2
- package/dist-cjs/lib/utils/reorderShapes.js +11 -10
- package/dist-cjs/lib/utils/reorderShapes.js.map +2 -2
- package/dist-cjs/lib/utils/reparenting.js +232 -0
- package/dist-cjs/lib/utils/reparenting.js.map +7 -0
- package/dist-cjs/lib/utils/richText.js +7 -2
- package/dist-cjs/lib/utils/richText.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 +166 -76
- package/dist-esm/index.mjs +15 -10
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +1 -1
- package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +132 -101
- 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 +22 -22
- package/dist-esm/lib/editor/derivations/bindingsIndex.mjs.map +2 -2
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +16 -16
- package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/{ClickManager.mjs → ClickManager/ClickManager.mjs} +1 -1
- package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{EdgeScrollManager.mjs → EdgeScrollManager/EdgeScrollManager.mjs} +2 -2
- package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{FontManager.mjs → FontManager/FontManager.mjs} +4 -1
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{HistoryManager.mjs → HistoryManager/HistoryManager.mjs} +63 -3
- package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{ScribbleManager.mjs → ScribbleManager/ScribbleManager.mjs} +1 -1
- package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{TextManager.mjs → TextManager/TextManager.mjs} +73 -42
- package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{TickManager.mjs → TickManager/TickManager.mjs} +1 -1
- package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/{UserPreferencesManager.mjs → UserPreferencesManager/UserPreferencesManager.mjs} +1 -1
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +7 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +0 -10
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +10 -6
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +3 -3
- package/dist-esm/lib/editor/tools/StateNode.mjs +3 -3
- package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +1 -1
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +1 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +33 -39
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +6 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Group2d.mjs +11 -6
- package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
- package/dist-esm/lib/utils/areShapesContentEqual.mjs +1 -1
- package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +2 -2
- package/dist-esm/lib/utils/dom.mjs +1 -1
- package/dist-esm/lib/utils/dom.mjs.map +2 -2
- package/dist-esm/lib/utils/reorderShapes.mjs +11 -10
- package/dist-esm/lib/utils/reorderShapes.mjs.map +2 -2
- package/dist-esm/lib/utils/reparenting.mjs +216 -0
- package/dist-esm/lib/utils/reparenting.mjs.map +7 -0
- package/dist-esm/lib/utils/richText.mjs +8 -3
- package/dist-esm/lib/utils/richText.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +446 -489
- package/package.json +8 -9
- package/src/index.ts +20 -8
- package/src/lib/config/TLSessionStateSnapshot.ts +1 -1
- package/src/lib/editor/Editor.test.ts +252 -3
- package/src/lib/editor/Editor.ts +151 -111
- package/src/lib/editor/bindings/BindingUtil.ts +6 -0
- package/src/lib/editor/derivations/bindingsIndex.ts +27 -26
- package/src/lib/editor/derivations/parentsToChildren.ts +28 -25
- package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +442 -0
- package/src/lib/editor/managers/{ClickManager.ts → ClickManager/ClickManager.ts} +3 -3
- package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +374 -0
- package/src/lib/editor/managers/{EdgeScrollManager.ts → EdgeScrollManager/EdgeScrollManager.ts} +3 -3
- package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +455 -0
- package/src/lib/editor/managers/{FocusManager.ts → FocusManager/FocusManager.ts} +1 -1
- package/src/lib/editor/managers/FontManager/FontManager.test.ts +263 -0
- package/src/lib/editor/managers/{FontManager.ts → FontManager/FontManager.ts} +5 -2
- package/src/lib/editor/managers/{HistoryManager.test.ts → HistoryManager/HistoryManager.test.ts} +388 -1
- package/src/lib/editor/managers/{HistoryManager.ts → HistoryManager/HistoryManager.ts} +76 -3
- package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +624 -0
- package/src/lib/editor/managers/{ScribbleManager.ts → ScribbleManager/ScribbleManager.ts} +2 -2
- package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +485 -0
- package/src/lib/editor/managers/TextManager/TextManager.test.ts +407 -0
- package/src/lib/editor/managers/{TextManager.ts → TextManager/TextManager.ts} +119 -87
- package/src/lib/editor/managers/TickManager/TickManager.test.ts +314 -0
- package/src/lib/editor/managers/{TickManager.ts → TickManager/TickManager.ts} +2 -2
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +591 -0
- package/src/lib/editor/managers/{UserPreferencesManager.ts → UserPreferencesManager/UserPreferencesManager.ts} +2 -2
- package/src/lib/editor/shapes/ShapeUtil.ts +48 -16
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
- package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +22 -17
- package/src/lib/editor/tools/StateNode.ts +3 -3
- package/src/lib/editor/types/emit-types.ts +4 -0
- package/src/lib/editor/types/external-content.ts +11 -2
- package/src/lib/exports/getSvgJsx.tsx +1 -1
- package/src/lib/hooks/useCanvasEvents.ts +0 -1
- package/src/lib/primitives/Box.test.ts +588 -7
- package/src/lib/primitives/Box.ts +33 -41
- package/src/lib/primitives/geometry/Geometry2d.ts +7 -2
- package/src/lib/primitives/geometry/Group2d.ts +11 -5
- package/src/lib/utils/areShapesContentEqual.ts +1 -2
- package/src/lib/utils/dom.ts +1 -1
- package/src/lib/utils/reorderShapes.ts +10 -13
- package/src/lib/utils/reparenting.ts +383 -0
- package/src/lib/utils/richText.ts +10 -4
- package/src/version.ts +3 -3
- package/dist-cjs/lib/editor/managers/ClickManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/EdgeScrollManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/FocusManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/HistoryManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/ScribbleManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/Stack.js +0 -82
- package/dist-cjs/lib/editor/managers/Stack.js.map +0 -7
- package/dist-cjs/lib/editor/managers/TextManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/TickManager.js.map +0 -7
- package/dist-cjs/lib/editor/managers/UserPreferencesManager.js.map +0 -7
- package/dist-esm/lib/editor/managers/ClickManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/EdgeScrollManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/FocusManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/HistoryManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/ScribbleManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/Stack.mjs +0 -62
- package/dist-esm/lib/editor/managers/Stack.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/TextManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/TickManager.mjs.map +0 -7
- package/dist-esm/lib/editor/managers/UserPreferencesManager.mjs.map +0 -7
- package/src/lib/editor/managers/ScribbleManager.test.ts +0 -32
- package/src/lib/editor/managers/Stack.ts +0 -71
- /package/dist-cjs/lib/editor/managers/{FocusManager.js → FocusManager/FocusManager.js} +0 -0
- /package/dist-esm/lib/editor/managers/{FocusManager.mjs → FocusManager/FocusManager.mjs} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/lib/utils/reparenting.ts"],
|
|
4
|
+
"sourcesContent": ["import { EMPTY_ARRAY } from '@tldraw/state'\nimport { TLGroupShape, TLParentId, TLShape, TLShapeId } from '@tldraw/tlschema'\nimport { IndexKey, compact, getIndexAbove, getIndexBetween } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { Vec } from '../primitives/Vec'\nimport { Geometry2d } from '../primitives/geometry/Geometry2d'\nimport { Group2d } from '../primitives/geometry/Group2d'\nimport {\n\tintersectPolygonPolygon,\n\tpolygonIntersectsPolyline,\n\tpolygonsIntersect,\n} from '../primitives/intersect'\nimport { pointInPolygon } from '../primitives/utils'\n\n/**\n * Reparents shapes that are no longer contained within their parent shapes.\n * todo: rename me to something more descriptive, like `reparentOccludedShapes` or `reparentAutoDroppedShapes`\n *\n * @param editor - The editor instance.\n * @param shapeIds - The IDs of the shapes to reparent.\n * @param opts - Optional options, including a callback to filter out certain parents, such as when removing a frame.\n *\n * @public\n */\nexport function kickoutOccludedShapes(\n\teditor: Editor,\n\tshapeIds: TLShapeId[],\n\topts?: { filter?(parent: TLShape): boolean }\n) {\n\tconst parentsToCheck = new Set<TLShape>()\n\n\tfor (const id of shapeIds) {\n\t\tconst shape = editor.getShape(id)\n\n\t\tif (!shape) continue\n\t\tparentsToCheck.add(shape)\n\n\t\tconst parent = editor.getShape(shape.parentId)\n\t\tif (!parent) continue\n\t\tparentsToCheck.add(parent)\n\t}\n\n\t// Check all of the parents and gather up parents who have lost children\n\tconst parentsToLostChildren = new Map<TLShape, TLShapeId[]>()\n\n\tfor (const parent of parentsToCheck) {\n\t\tconst childIds = editor.getSortedChildIdsForParent(parent)\n\t\tif (opts?.filter && !opts.filter(parent)) {\n\t\t\t// If the shape is filtered out, we kick out all of its children\n\t\t\tparentsToLostChildren.set(parent, childIds)\n\t\t} else {\n\t\t\tconst overlappingChildren = getOverlappingShapes(editor, parent.id, childIds)\n\t\t\tif (overlappingChildren.length < childIds.length) {\n\t\t\t\tparentsToLostChildren.set(\n\t\t\t\t\tparent,\n\t\t\t\t\tchildIds.filter((id) => !overlappingChildren.includes(id))\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Get all of the shapes on the current page, sorted by their index\n\tconst sortedShapeIds = editor.getCurrentPageShapesSorted().map((s) => s.id)\n\n\tconst parentsToNewChildren: Record<\n\t\tTLParentId,\n\t\t{ parentId: TLParentId; shapeIds: TLShapeId[]; index?: IndexKey }\n\t> = {}\n\n\tfor (const [prevParent, lostChildrenIds] of parentsToLostChildren) {\n\t\tconst lostChildren = compact(lostChildrenIds.map((id) => editor.getShape(id)))\n\n\t\t// Don't fall \"up\" into frames in front of the shape\n\t\t// if (pageShapes.indexOf(shape) < frameSortPosition) continue shapeCheck\n\n\t\t// Otherwise, we have no next dropping shape under the cursor, so go find\n\t\t// all the frames on the page where the moving shapes will fall into\n\t\tconst { reparenting, remainingShapesToReparent } = getDroppedShapesToNewParents(\n\t\t\teditor,\n\t\t\tlostChildren,\n\t\t\t(shape, maybeNewParent) => {\n\t\t\t\t// If we're filtering out a potential parent, don't reparent shapes to the filtered out shape\n\t\t\t\tif (opts?.filter && !opts.filter(maybeNewParent)) return false\n\t\t\t\treturn (\n\t\t\t\t\tmaybeNewParent.id !== prevParent.id &&\n\t\t\t\t\tsortedShapeIds.indexOf(maybeNewParent.id) < sortedShapeIds.indexOf(shape.id)\n\t\t\t\t)\n\t\t\t}\n\t\t)\n\n\t\treparenting.forEach((childrenToReparent, newParentId) => {\n\t\t\tif (childrenToReparent.length === 0) return\n\t\t\tif (!parentsToNewChildren[newParentId]) {\n\t\t\t\tparentsToNewChildren[newParentId] = {\n\t\t\t\t\tparentId: newParentId,\n\t\t\t\t\tshapeIds: [],\n\t\t\t\t}\n\t\t\t}\n\t\t\tparentsToNewChildren[newParentId].shapeIds.push(...childrenToReparent.map((s) => s.id))\n\t\t})\n\n\t\t// Reparent the rest to the page (or containing group)\n\t\tif (remainingShapesToReparent.size > 0) {\n\t\t\t// The remaining shapes are going to be reparented to the old parent's containing group, if there was one, or else to the page\n\t\t\tconst newParentId =\n\t\t\t\teditor.findShapeAncestor(prevParent, (s) => editor.isShapeOfType<TLGroupShape>(s, 'group'))\n\t\t\t\t\t?.id ?? editor.getCurrentPageId()\n\n\t\t\tremainingShapesToReparent.forEach((shape) => {\n\t\t\t\tif (!parentsToNewChildren[newParentId]) {\n\t\t\t\t\tlet insertIndexKey: IndexKey | undefined\n\n\t\t\t\t\tconst oldParentSiblingIds = editor.getSortedChildIdsForParent(newParentId)\n\t\t\t\t\tconst oldParentIndex = oldParentSiblingIds.indexOf(prevParent.id)\n\t\t\t\t\tif (oldParentIndex > -1) {\n\t\t\t\t\t\t// If the old parent is a direct child of the new parent, then we'll add them above the old parent but below the next sibling.\n\t\t\t\t\t\tconst siblingsIndexAbove = oldParentSiblingIds[oldParentIndex + 1]\n\t\t\t\t\t\tconst indexKeyAbove = siblingsIndexAbove\n\t\t\t\t\t\t\t? editor.getShape(siblingsIndexAbove)!.index\n\t\t\t\t\t\t\t: getIndexAbove(prevParent.index)\n\t\t\t\t\t\tinsertIndexKey = getIndexBetween(prevParent.index, indexKeyAbove)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If the old parent is not a direct child of the new parent, then we'll add them to the \"top\" of the new parent's children.\n\t\t\t\t\t\t// This is done automatically if we leave the index undefined, so let's do that.\n\t\t\t\t\t}\n\n\t\t\t\t\tparentsToNewChildren[newParentId] = {\n\t\t\t\t\t\tparentId: newParentId,\n\t\t\t\t\t\tshapeIds: [],\n\t\t\t\t\t\tindex: insertIndexKey,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparentsToNewChildren[newParentId].shapeIds.push(shape.id)\n\t\t\t})\n\t\t}\n\t}\n\n\teditor.run(() => {\n\t\tObject.values(parentsToNewChildren).forEach(({ parentId, shapeIds, index }) => {\n\t\t\tif (shapeIds.length === 0) return\n\t\t\t// Before we reparent, sort the new shape ids by their place in the original absolute order on the page\n\t\t\tshapeIds.sort((a, b) => (sortedShapeIds.indexOf(a) < sortedShapeIds.indexOf(b) ? -1 : 1))\n\t\t\teditor.reparentShapes(shapeIds, parentId, index)\n\t\t})\n\t})\n}\n\n/**\n * Get the shapes that overlap with a given shape.\n *\n * @param editor - The editor instance.\n * @param shape - The shapes or shape IDs to check against.\n * @param otherShapes - The shapes or shape IDs to check for overlap.\n * @returns An array of shapes or shape IDs that overlap with the given shape.\n */\nfunction getOverlappingShapes<T extends TLShape[] | TLShapeId[]>(\n\teditor: Editor,\n\tshape: T[number],\n\totherShapes: T\n) {\n\tif (otherShapes.length === 0) {\n\t\treturn EMPTY_ARRAY\n\t}\n\n\tconst parentPageBounds = editor.getShapePageBounds(shape)\n\tif (!parentPageBounds) return EMPTY_ARRAY\n\n\tconst parentGeometry = editor.getShapeGeometry(shape)\n\tconst parentPageTransform = editor.getShapePageTransform(shape)\n\tconst parentPageCorners = parentPageTransform.applyToPoints(parentGeometry.vertices)\n\n\tconst parentPageMaskVertices = editor.getShapeMask(shape)\n\tconst parentPagePolygon = parentPageMaskVertices\n\t\t? intersectPolygonPolygon(parentPageMaskVertices, parentPageCorners)\n\t\t: parentPageCorners\n\n\tif (!parentPagePolygon) return EMPTY_ARRAY\n\n\treturn otherShapes.filter((childId) => {\n\t\tconst shapePageBounds = editor.getShapePageBounds(childId)\n\t\tif (!shapePageBounds || !parentPageBounds.includes(shapePageBounds)) return false\n\n\t\tconst parentPolygonInShapeShape = editor\n\t\t\t.getShapePageTransform(childId)\n\t\t\t.clone()\n\t\t\t.invert()\n\t\t\t.applyToPoints(parentPagePolygon)\n\n\t\tconst geometry = editor.getShapeGeometry(childId)\n\n\t\treturn doesGeometryOverlapPolygon(geometry, parentPolygonInShapeShape)\n\t})\n}\n\n/**\n * @public\n */\nexport function doesGeometryOverlapPolygon(\n\tgeometry: Geometry2d,\n\tparentCornersInShapeSpace: Vec[]\n): boolean {\n\t// If the child is a group, check if any of its children overlap the box\n\tif (geometry instanceof Group2d) {\n\t\treturn geometry.children.some((childGeometry) =>\n\t\t\tdoesGeometryOverlapPolygon(childGeometry, parentCornersInShapeSpace)\n\t\t)\n\t}\n\n\t// Otherwise, check if the geometry overlaps the box\n\tconst { vertices, center, isFilled, isEmptyLabel, isClosed } = geometry\n\n\t// We'll do things in order of cheapest to most expensive checks\n\n\t// Skip empty labels\n\tif (isEmptyLabel) return false\n\n\t// If any of the shape's vertices are inside the occluder, it's inside\n\tif (vertices.some((v) => pointInPolygon(v, parentCornersInShapeSpace))) {\n\t\treturn true\n\t}\n\n\t// If the shape is filled and closed and its center is inside the parent, it's inside\n\tif (isClosed) {\n\t\tif (isFilled) {\n\t\t\t// If closed and filled, check if the center is inside the parent\n\t\t\tif (pointInPolygon(center, parentCornersInShapeSpace)) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// ..then, slightly more expensive check, see the shape covers the entire parent but not its center\n\t\t\tif (parentCornersInShapeSpace.every((v) => pointInPolygon(v, vertices))) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\t// If any the shape's vertices intersect the edge of the occluder, it's inside.\n\t\t// for example when a rotated rectangle is moved over the corner of a parent rectangle\n\t\t// If the child shape is closed, intersect as a polygon\n\t\tif (polygonsIntersect(parentCornersInShapeSpace, vertices)) {\n\t\t\treturn true\n\t\t}\n\t} else {\n\t\t// if the child shape is not closed, intersect as a polyline\n\t\tif (polygonIntersectsPolyline(parentCornersInShapeSpace, vertices)) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// If none of the above checks passed, the shape is outside the parent\n\treturn false\n}\n\n/**\n * Get the shapes that will be reparented to new parents when the shapes are dropped.\n *\n * @param editor - The editor instance.\n * @param shapes - The shapes to check.\n * @param cb - A callback to filter out certain shapes.\n * @returns An object with the shapes that will be reparented to new parents and the shapes that will be reparented to the page or their ancestral group.\n *\n * @public\n */\nexport function getDroppedShapesToNewParents(\n\teditor: Editor,\n\tshapes: Set<TLShape> | TLShape[],\n\tcb?: (shape: TLShape, parent: TLShape) => boolean\n) {\n\tconst shapesToActuallyCheck = new Set<TLShape>(shapes)\n\tconst movingGroups = new Set<TLGroupShape>()\n\n\tfor (const shape of shapes) {\n\t\tconst parent = editor.getShapeParent(shape)\n\t\tif (parent && editor.isShapeOfType<TLGroupShape>(parent, 'group')) {\n\t\t\tif (!movingGroups.has(parent)) {\n\t\t\t\tmovingGroups.add(parent)\n\t\t\t}\n\t\t}\n\t}\n\n\t// If all of a group's children are moving, then move the group instead\n\tfor (const movingGroup of movingGroups) {\n\t\tconst children = compact(\n\t\t\teditor.getSortedChildIdsForParent(movingGroup).map((id) => editor.getShape(id))\n\t\t)\n\t\tfor (const child of children) {\n\t\t\tshapesToActuallyCheck.delete(child)\n\t\t}\n\t\tshapesToActuallyCheck.add(movingGroup)\n\t}\n\n\t// this could be cached and passed in\n\tconst shapeGroupIds = new Map<TLShapeId, TLShapeId | undefined>()\n\n\tconst reparenting = new Map<TLShapeId, TLShape[]>()\n\n\tconst remainingShapesToReparent = new Set(shapesToActuallyCheck)\n\n\tconst potentialParentShapes = editor\n\t\t.getCurrentPageShapesSorted()\n\t\t// filter out any shapes that aren't frames or that are included among the provided shapes\n\t\t.filter(\n\t\t\t(s) =>\n\t\t\t\teditor.getShapeUtil(s).canReceiveNewChildrenOfType?.(s, s.type) &&\n\t\t\t\t!remainingShapesToReparent.has(s)\n\t\t)\n\n\tparentCheck: for (let i = potentialParentShapes.length - 1; i >= 0; i--) {\n\t\tconst parentShape = potentialParentShapes[i]\n\t\tconst parentShapeContainingGroupId = editor.findShapeAncestor(parentShape, (s) =>\n\t\t\teditor.isShapeOfType<TLGroupShape>(s, 'group')\n\t\t)?.id\n\n\t\tconst parentGeometry = editor.getShapeGeometry(parentShape)\n\t\tconst parentPageTransform = editor.getShapePageTransform(parentShape)\n\t\tconst parentPageMaskVertices = editor.getShapeMask(parentShape)\n\t\tconst parentPageCorners = parentPageTransform.applyToPoints(parentGeometry.vertices)\n\t\tconst parentPagePolygon = parentPageMaskVertices\n\t\t\t? intersectPolygonPolygon(parentPageMaskVertices, parentPageCorners)\n\t\t\t: parentPageCorners\n\n\t\tif (!parentPagePolygon) continue parentCheck\n\n\t\tconst childrenToReparent = []\n\n\t\t// For each of the dropping shapes...\n\t\tshapeCheck: for (const shape of remainingShapesToReparent) {\n\t\t\t// Don't reparent a frame to itself\n\t\t\tif (parentShape.id === shape.id) continue shapeCheck\n\n\t\t\t// Use the callback to filter out certain shapes\n\t\t\tif (cb && !cb(shape, parentShape)) continue shapeCheck\n\n\t\t\tif (!shapeGroupIds.has(shape.id)) {\n\t\t\t\tshapeGroupIds.set(\n\t\t\t\t\tshape.id,\n\t\t\t\t\teditor.findShapeAncestor(shape, (s) => editor.isShapeOfType<TLGroupShape>(s, 'group'))?.id\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst shapeGroupId = shapeGroupIds.get(shape.id)\n\n\t\t\t// Are the shape and the parent part of different groups?\n\t\t\tif (shapeGroupId !== parentShapeContainingGroupId) continue shapeCheck\n\n\t\t\t// Is the shape is actually the ancestor of the parent?\n\t\t\tif (editor.findShapeAncestor(parentShape, (s) => shape.id === s.id)) continue shapeCheck\n\n\t\t\t// Convert the parent polygon to the shape's space\n\t\t\tconst parentPolygonInShapeSpace = editor\n\t\t\t\t.getShapePageTransform(shape)\n\t\t\t\t.clone()\n\t\t\t\t.invert()\n\t\t\t\t.applyToPoints(parentPagePolygon)\n\n\t\t\t// If the shape overlaps the parent polygon, reparent it to that parent\n\t\t\tif (doesGeometryOverlapPolygon(editor.getShapeGeometry(shape), parentPolygonInShapeSpace)) {\n\t\t\t\t// Use the util to check if the shape can be reparented to the parent\n\t\t\t\tif (\n\t\t\t\t\t!editor.getShapeUtil(parentShape).canReceiveNewChildrenOfType?.(parentShape, shape.type)\n\t\t\t\t)\n\t\t\t\t\tcontinue shapeCheck\n\n\t\t\t\tif (shape.parentId !== parentShape.id) {\n\t\t\t\t\tchildrenToReparent.push(shape)\n\t\t\t\t}\n\t\t\t\tremainingShapesToReparent.delete(shape)\n\t\t\t\tcontinue shapeCheck\n\t\t\t}\n\t\t}\n\n\t\tif (childrenToReparent.length) {\n\t\t\treparenting.set(parentShape.id, childrenToReparent)\n\t\t}\n\t}\n\n\treturn {\n\t\t// these are the shapes that will be reparented to new parents\n\t\treparenting,\n\t\t// these are the shapes that will be reparented to the page or their ancestral group\n\t\tremainingShapesToReparent,\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_utils", "shapeIds"]
|
|
7
|
+
}
|
|
@@ -18,17 +18,22 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var richText_exports = {};
|
|
20
20
|
__export(richText_exports, {
|
|
21
|
-
getFontsFromRichText: () => getFontsFromRichText
|
|
21
|
+
getFontsFromRichText: () => getFontsFromRichText,
|
|
22
|
+
getTipTapSchema: () => getTipTapSchema
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(richText_exports);
|
|
24
25
|
var import_core = require("@tiptap/core");
|
|
25
26
|
var import_model = require("@tiptap/pm/model");
|
|
26
27
|
var import_utils = require("@tldraw/utils");
|
|
28
|
+
const schemaCache = new import_utils.WeakCache();
|
|
29
|
+
function getTipTapSchema(tipTapConfig) {
|
|
30
|
+
return schemaCache.get(tipTapConfig, () => (0, import_core.getSchema)(tipTapConfig.extensions ?? []));
|
|
31
|
+
}
|
|
27
32
|
function getFontsFromRichText(editor, richText, initialState) {
|
|
28
33
|
const { tipTapConfig, addFontsFromNode } = editor.getTextOptions();
|
|
29
34
|
(0, import_utils.assert)(tipTapConfig, "textOptions.tipTapConfig must be set to use rich text");
|
|
30
35
|
(0, import_utils.assert)(addFontsFromNode, "textOptions.addFontsFromNode must be set to use rich text");
|
|
31
|
-
const schema = (
|
|
36
|
+
const schema = getTipTapSchema(tipTapConfig);
|
|
32
37
|
const rootNode = import_model.Node.fromJSON(schema, richText);
|
|
33
38
|
const fonts = /* @__PURE__ */ new Set();
|
|
34
39
|
function addFont(font) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/utils/richText.ts"],
|
|
4
|
-
"sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema =
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2D;AAC3D,
|
|
4
|
+
"sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node, Schema } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert, WeakCache } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\nconst schemaCache = new WeakCache<EditorProviderProps, Schema>()\nexport function getTipTapSchema(tipTapConfig: EditorProviderProps) {\n\treturn schemaCache.get(tipTapConfig, () => getSchema(tipTapConfig.extensions ?? []))\n}\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getTipTapSchema(tipTapConfig)\n\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2D;AAC3D,mBAA6B;AAG7B,mBAAkC;AAqClC,MAAM,cAAc,IAAI,uBAAuC;AACxD,SAAS,gBAAgB,cAAmC;AAClE,SAAO,YAAY,IAAI,cAAc,UAAM,uBAAU,aAAa,cAAc,CAAC,CAAC,CAAC;AACpF;AAGO,SAAS,qBACf,QACA,UACA,cACC;AACD,QAAM,EAAE,cAAc,iBAAiB,IAAI,OAAO,eAAe;AACjE,2BAAO,cAAc,uDAAuD;AAC5E,2BAAO,kBAAkB,2DAA2D;AAEpF,QAAM,SAAS,gBAAgB,YAAY;AAE3C,QAAM,WAAW,kBAAK,SAAS,QAAQ,QAAuB;AAE9D,QAAM,QAAQ,oBAAI,IAAgB;AAElC,WAAS,QAAQ,MAAkB;AAClC,UAAM,IAAI,IAAI;AAAA,EACf;AAEA,WAAS,MAAM,MAAkB,OAAiC;AACjE,YAAQ,iBAAkB,MAAM,OAAO,OAAO;AAE9C,eAAW,SAAS,KAAK,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACnB;AAAA,EACD;AAEA,QAAM,UAAU,YAAY;AAE5B,SAAO,MAAM,KAAK,KAAK;AACxB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/version.js
CHANGED
|
@@ -22,10 +22,10 @@ __export(version_exports, {
|
|
|
22
22
|
version: () => version
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(version_exports);
|
|
25
|
-
const version = "3.14.0-canary.
|
|
25
|
+
const version = "3.14.0-canary.8f303431285f";
|
|
26
26
|
const publishDates = {
|
|
27
27
|
major: "2024-09-13T14:36:29.063Z",
|
|
28
|
-
minor: "2025-
|
|
29
|
-
patch: "2025-
|
|
28
|
+
minor: "2025-07-01T08:16:48.822Z",
|
|
29
|
+
patch: "2025-07-01T08:16:48.822Z"
|
|
30
30
|
};
|
|
31
31
|
//# sourceMappingURL=version.js.map
|
package/dist-cjs/version.js.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.14.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.14.0-canary.8f303431285f'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-07-01T08:16:48.822Z',\n\tpatch: '2025-07-01T08:16:48.822Z',\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,UAAU;AAChB,MAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-esm/index.d.mts
CHANGED
|
@@ -138,9 +138,6 @@ export declare class Arc2d extends Geometry2d {
|
|
|
138
138
|
*/
|
|
139
139
|
export declare function areAnglesCompatible(a: number, b: number): boolean;
|
|
140
140
|
|
|
141
|
-
/** @public */
|
|
142
|
-
export declare const areShapesContentEqual: (a: TLShape, b: TLShape) => boolean;
|
|
143
|
-
|
|
144
141
|
/** @public */
|
|
145
142
|
export declare function average(A: VecLike, B: VecLike): string;
|
|
146
143
|
|
|
@@ -209,6 +206,12 @@ export declare interface BindingOnShapeChangeOptions<Binding extends TLUnknownBi
|
|
|
209
206
|
shapeBefore: TLShape;
|
|
210
207
|
/** The shape record after the change is made. */
|
|
211
208
|
shapeAfter: TLShape;
|
|
209
|
+
/**
|
|
210
|
+
* Why did this shape change?
|
|
211
|
+
* - 'self': the shape itself changed
|
|
212
|
+
* - 'ancestry': the ancestry of the shape changed, but the shape itself may not have done
|
|
213
|
+
*/
|
|
214
|
+
reason: 'ancestry' | 'self';
|
|
212
215
|
}
|
|
213
216
|
|
|
214
217
|
/**
|
|
@@ -517,8 +520,6 @@ export declare class Box {
|
|
|
517
520
|
};
|
|
518
521
|
equals(other: Box | BoxModel): boolean;
|
|
519
522
|
static Equals(a: Box | BoxModel, b: Box | BoxModel): boolean;
|
|
520
|
-
prettyMuchEquals(other: Box | BoxModel): boolean;
|
|
521
|
-
static PrettyMuchEquals(a: Box | BoxModel, b: Box | BoxModel): boolean;
|
|
522
523
|
zeroFix(): this;
|
|
523
524
|
static ZeroFix(other: Box | BoxModel): Box;
|
|
524
525
|
}
|
|
@@ -1630,6 +1631,13 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
1630
1631
|
* @public
|
|
1631
1632
|
*/
|
|
1632
1633
|
getSelectionPageBounds(): Box | null;
|
|
1634
|
+
/**
|
|
1635
|
+
* The bounds of the selection bounding box in the current page space.
|
|
1636
|
+
*
|
|
1637
|
+
* @readonly
|
|
1638
|
+
* @public
|
|
1639
|
+
*/
|
|
1640
|
+
getSelectionScreenBounds(): Box | undefined;
|
|
1633
1641
|
/* Excluded from this release type: getShapesSharedRotation */
|
|
1634
1642
|
/**
|
|
1635
1643
|
* The rotation of the selection bounding box in the current page space.
|
|
@@ -2460,23 +2468,6 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
2460
2468
|
* @public
|
|
2461
2469
|
*/
|
|
2462
2470
|
getShapeGeometry<T extends Geometry2d>(shape: TLShape | TLShapeId, opts?: TLGeometryOpts): T;
|
|
2463
|
-
private _shapePageGeometryCaches;
|
|
2464
|
-
/**
|
|
2465
|
-
* Get the geometry of a shape in page-space.
|
|
2466
|
-
*
|
|
2467
|
-
* @example
|
|
2468
|
-
* ```ts
|
|
2469
|
-
* editor.getShapePageGeometry(myShape)
|
|
2470
|
-
* editor.getShapePageGeometry(myShapeId)
|
|
2471
|
-
* editor.getShapePageGeometry(myShapeId, { context: "arrow" })
|
|
2472
|
-
* ```
|
|
2473
|
-
*
|
|
2474
|
-
* @param shape - The shape (or shape id) to get the geometry for.
|
|
2475
|
-
* @param opts - Additional options about the request for geometry. Passed to {@link ShapeUtil.getGeometry}.
|
|
2476
|
-
*
|
|
2477
|
-
* @public
|
|
2478
|
-
*/
|
|
2479
|
-
getShapePageGeometry<T extends Geometry2d>(shape: TLShape | TLShapeId, opts?: TLGeometryOpts): T;
|
|
2480
2471
|
/* Excluded from this release type: _getShapeHandlesCache */
|
|
2481
2472
|
/**
|
|
2482
2473
|
* Get the handles (if any) for a shape.
|
|
@@ -2654,11 +2645,16 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
2654
2645
|
*
|
|
2655
2646
|
* @public
|
|
2656
2647
|
*/
|
|
2657
|
-
isShapeOrAncestorLocked(shape?: TLShape): boolean;
|
|
2658
|
-
|
|
2648
|
+
isShapeOrAncestorLocked(shape?: TLShape | TLShapeId): boolean;
|
|
2649
|
+
/**
|
|
2650
|
+
* Get shapes that are outside of the viewport.
|
|
2651
|
+
*
|
|
2652
|
+
* @public
|
|
2653
|
+
*/
|
|
2654
|
+
getNotVisibleShapes(): Set<TLShapeId>;
|
|
2659
2655
|
private _notVisibleShapes;
|
|
2660
2656
|
/**
|
|
2661
|
-
* Get culled shapes.
|
|
2657
|
+
* Get culled shapes (those that should not render), taking into account which shapes are selected or editing.
|
|
2662
2658
|
*
|
|
2663
2659
|
* @public
|
|
2664
2660
|
*/
|
|
@@ -2700,12 +2696,14 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
2700
2696
|
* @example
|
|
2701
2697
|
* ```ts
|
|
2702
2698
|
* editor.getShapesAtPoint({ x: 100, y: 100 })
|
|
2703
|
-
* editor.getShapesAtPoint({ x: 100, y: 100 }, { hitInside: true,
|
|
2699
|
+
* editor.getShapesAtPoint({ x: 100, y: 100 }, { hitInside: true, margin: 8 })
|
|
2704
2700
|
* ```
|
|
2705
2701
|
*
|
|
2706
2702
|
* @param point - The page point to test.
|
|
2707
2703
|
* @param opts - The options for the hit point testing.
|
|
2708
2704
|
*
|
|
2705
|
+
* @returns An array of shapes at the given point, sorted in reverse order of their absolute z-index (top-most shape first).
|
|
2706
|
+
*
|
|
2709
2707
|
* @public
|
|
2710
2708
|
*/
|
|
2711
2709
|
getShapesAtPoint(point: VecLike, opts?: {
|
|
@@ -2913,6 +2911,8 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
2913
2911
|
* @public
|
|
2914
2912
|
*/
|
|
2915
2913
|
getShapeAndDescendantIds(ids: TLShapeId[]): Set<TLShapeId>;
|
|
2914
|
+
/** @deprecated Use {@link Editor.getDraggingOverShape} instead */
|
|
2915
|
+
getDroppingOverShape(point: Vec, droppingShapes: TLShape[]): TLShape | undefined;
|
|
2916
2916
|
/**
|
|
2917
2917
|
* Get the shape that some shapes should be dropped on at a given point.
|
|
2918
2918
|
*
|
|
@@ -2923,7 +2923,7 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
2923
2923
|
*
|
|
2924
2924
|
* @public
|
|
2925
2925
|
*/
|
|
2926
|
-
|
|
2926
|
+
getDraggingOverShape(point: Vec, droppingShapes: TLShape[]): TLShape | undefined;
|
|
2927
2927
|
/**
|
|
2928
2928
|
* Get the shape that should be selected when you click on a given shape, assuming there is
|
|
2929
2929
|
* nothing already selected. It will not return anything higher than or including the current
|
|
@@ -3264,6 +3264,22 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
3264
3264
|
* @public
|
|
3265
3265
|
*/
|
|
3266
3266
|
getInitialMetaForShape(_shape: TLShape): JsonObject;
|
|
3267
|
+
/**
|
|
3268
|
+
* Get whether the provided shape can be created.
|
|
3269
|
+
*
|
|
3270
|
+
* @param shape - The shape or shape IDs to check.
|
|
3271
|
+
*
|
|
3272
|
+
* @public
|
|
3273
|
+
*/
|
|
3274
|
+
canCreateShape<T extends TLUnknownShape>(shape: OptionalKeys<TLShapePartial<T>, 'id'> | T['id']): boolean;
|
|
3275
|
+
/**
|
|
3276
|
+
* Get whether the provided shapes can be created.
|
|
3277
|
+
*
|
|
3278
|
+
* @param shapes - The shapes or shape IDs to create.
|
|
3279
|
+
*
|
|
3280
|
+
* @public
|
|
3281
|
+
*/
|
|
3282
|
+
canCreateShapes<T extends TLUnknownShape>(shapes: (OptionalKeys<TLShapePartial<T>, 'id'> | T['id'])[]): boolean;
|
|
3267
3283
|
/**
|
|
3268
3284
|
* Create a single shape.
|
|
3269
3285
|
*
|
|
@@ -3610,6 +3626,12 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
3610
3626
|
* @param info - Info about the external content.
|
|
3611
3627
|
*/
|
|
3612
3628
|
putExternalContent<E>(info: TLExternalContent<E>): Promise<void>;
|
|
3629
|
+
/**
|
|
3630
|
+
* Handle replacing external content.
|
|
3631
|
+
*
|
|
3632
|
+
* @param info - Info about the external content.
|
|
3633
|
+
*/
|
|
3634
|
+
replaceExternalContent<E>(info: TLExternalContent<E>): Promise<void>;
|
|
3613
3635
|
/**
|
|
3614
3636
|
* Get content that can be exported for the given shape ids.
|
|
3615
3637
|
*
|
|
@@ -4076,6 +4098,7 @@ export declare abstract class Geometry2d {
|
|
|
4076
4098
|
isFilled: boolean;
|
|
4077
4099
|
isClosed: boolean;
|
|
4078
4100
|
isLabel: boolean;
|
|
4101
|
+
isEmptyLabel: boolean;
|
|
4079
4102
|
isInternal: boolean;
|
|
4080
4103
|
debugColor?: string;
|
|
4081
4104
|
ignore?: boolean;
|
|
@@ -4167,6 +4190,21 @@ export declare function getCursor(cursor: TLCursorType, rotation?: number, color
|
|
|
4167
4190
|
/** @public */
|
|
4168
4191
|
export declare function getDefaultCdnBaseUrl(): string;
|
|
4169
4192
|
|
|
4193
|
+
/**
|
|
4194
|
+
* Get the shapes that will be reparented to new parents when the shapes are dropped.
|
|
4195
|
+
*
|
|
4196
|
+
* @param editor - The editor instance.
|
|
4197
|
+
* @param shapes - The shapes to check.
|
|
4198
|
+
* @param cb - A callback to filter out certain shapes.
|
|
4199
|
+
* @returns An object with the shapes that will be reparented to new parents and the shapes that will be reparented to the page or their ancestral group.
|
|
4200
|
+
*
|
|
4201
|
+
* @public
|
|
4202
|
+
*/
|
|
4203
|
+
export declare function getDroppedShapesToNewParents(editor: Editor, shapes: Set<TLShape> | TLShape[], cb?: (shape: TLShape, parent: TLShape) => boolean): {
|
|
4204
|
+
remainingShapesToReparent: Set<TLShape>;
|
|
4205
|
+
reparenting: Map<TLShapeId, TLShape[]>;
|
|
4206
|
+
};
|
|
4207
|
+
|
|
4170
4208
|
/** @public */
|
|
4171
4209
|
export declare function getFontsFromRichText(editor: Editor, richText: TLRichText, initialState: RichTextFontVisitorState): TLFontFace[];
|
|
4172
4210
|
|
|
@@ -4520,6 +4558,20 @@ export declare function intersectPolygonPolygon(polygonA: VecLike[], polygonB: V
|
|
|
4520
4558
|
*/
|
|
4521
4559
|
export declare const isSafeFloat: (n: number) => boolean;
|
|
4522
4560
|
|
|
4561
|
+
/**
|
|
4562
|
+
* Reparents shapes that are no longer contained within their parent shapes.
|
|
4563
|
+
* todo: rename me to something more descriptive, like `reparentOccludedShapes` or `reparentAutoDroppedShapes`
|
|
4564
|
+
*
|
|
4565
|
+
* @param editor - The editor instance.
|
|
4566
|
+
* @param shapeIds - The IDs of the shapes to reparent.
|
|
4567
|
+
* @param opts - Optional options, including a callback to filter out certain parents, such as when removing a frame.
|
|
4568
|
+
*
|
|
4569
|
+
* @public
|
|
4570
|
+
*/
|
|
4571
|
+
export declare function kickoutOccludedShapes(editor: Editor, shapeIds: TLShapeId[], opts?: {
|
|
4572
|
+
filter?(parent: TLShape): boolean;
|
|
4573
|
+
}): void;
|
|
4574
|
+
|
|
4523
4575
|
/* Excluded from this release type: LicenseFromKeyResult */
|
|
4524
4576
|
|
|
4525
4577
|
/* Excluded from this release type: LicenseInfo */
|
|
@@ -5199,14 +5251,6 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
|
|
|
5199
5251
|
* @public
|
|
5200
5252
|
*/
|
|
5201
5253
|
canReceiveNewChildrenOfType(_shape: Shape, _type: TLShape['type']): boolean;
|
|
5202
|
-
/**
|
|
5203
|
-
* Get whether the shape can receive children of a given type.
|
|
5204
|
-
*
|
|
5205
|
-
* @param shape - The shape type.
|
|
5206
|
-
* @param shapes - The shapes that are being dropped.
|
|
5207
|
-
* @public
|
|
5208
|
-
*/
|
|
5209
|
-
canDropShapes(_shape: Shape, _shapes: TLShape[]): boolean;
|
|
5210
5254
|
/**
|
|
5211
5255
|
* Get the shape as an SVG object.
|
|
5212
5256
|
*
|
|
@@ -5294,7 +5338,15 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
|
|
|
5294
5338
|
*/
|
|
5295
5339
|
onCrop?(shape: Shape, info: TLCropInfo<Shape>): Omit<TLShapePartial<Shape>, 'id' | 'type'> | undefined | void;
|
|
5296
5340
|
/**
|
|
5297
|
-
* A callback called when some other shapes are dragged
|
|
5341
|
+
* A callback called when some other shapes are dragged into this one. This fires when the shapes are dragged over the shape for the first time.
|
|
5342
|
+
*
|
|
5343
|
+
* @param shape - The shape.
|
|
5344
|
+
* @param shapes - The shapes that are being dragged in.
|
|
5345
|
+
* @public
|
|
5346
|
+
*/
|
|
5347
|
+
onDragShapesIn?(shape: Shape, shapes: TLShape[], info: TLDragShapesInInfo): void;
|
|
5348
|
+
/**
|
|
5349
|
+
* A callback called when some other shapes are dragged over this one. This fires when the shapes are dragged over the shape for the first time (after the onDragShapesIn callback), and again on every update while the shapes are being dragged.
|
|
5298
5350
|
*
|
|
5299
5351
|
* @example
|
|
5300
5352
|
*
|
|
@@ -5308,7 +5360,7 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
|
|
|
5308
5360
|
* @param shapes - The shapes that are being dragged over this one.
|
|
5309
5361
|
* @public
|
|
5310
5362
|
*/
|
|
5311
|
-
onDragShapesOver?(shape: Shape, shapes: TLShape[]): void;
|
|
5363
|
+
onDragShapesOver?(shape: Shape, shapes: TLShape[], info: TLDragShapesOverInfo): void;
|
|
5312
5364
|
/**
|
|
5313
5365
|
* A callback called when some other shapes are dragged out of this one.
|
|
5314
5366
|
*
|
|
@@ -5316,7 +5368,7 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
|
|
|
5316
5368
|
* @param shapes - The shapes that are being dragged out.
|
|
5317
5369
|
* @public
|
|
5318
5370
|
*/
|
|
5319
|
-
onDragShapesOut?(shape: Shape, shapes: TLShape[]): void;
|
|
5371
|
+
onDragShapesOut?(shape: Shape, shapes: TLShape[], info: TLDragShapesOutInfo): void;
|
|
5320
5372
|
/**
|
|
5321
5373
|
* A callback called when some other shapes are dropped over this one.
|
|
5322
5374
|
*
|
|
@@ -5324,7 +5376,7 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
|
|
|
5324
5376
|
* @param shapes - The shapes that are being dropped over this one.
|
|
5325
5377
|
* @public
|
|
5326
5378
|
*/
|
|
5327
|
-
onDropShapesOver?(shape: Shape, shapes: TLShape[]): void;
|
|
5379
|
+
onDropShapesOver?(shape: Shape, shapes: TLShape[], info: TLDropShapesOverInfo): void;
|
|
5328
5380
|
/**
|
|
5329
5381
|
* A callback called when a shape starts being resized.
|
|
5330
5382
|
*
|
|
@@ -5626,7 +5678,7 @@ export declare abstract class StateNode implements Partial<TLEventHandlers> {
|
|
|
5626
5678
|
transition(id: string, info?: any): this;
|
|
5627
5679
|
handleEvent(info: Exclude<TLEventInfo, TLPinchEventInfo>): void;
|
|
5628
5680
|
enter(info: any, from: string): void;
|
|
5629
|
-
exit(info: any,
|
|
5681
|
+
exit(info: any, to: string): void;
|
|
5630
5682
|
/**
|
|
5631
5683
|
* This is a hack / escape hatch that will tell the editor to
|
|
5632
5684
|
* report a different state as active (in `getCurrentToolId()`) when
|
|
@@ -5733,43 +5785,15 @@ export declare const TAB_ID: string;
|
|
|
5733
5785
|
/** @public */
|
|
5734
5786
|
export declare class TextManager {
|
|
5735
5787
|
editor: Editor;
|
|
5736
|
-
private
|
|
5788
|
+
private elm;
|
|
5789
|
+
private defaultStyles;
|
|
5737
5790
|
constructor(editor: Editor);
|
|
5738
|
-
|
|
5739
|
-
|
|
5740
|
-
|
|
5741
|
-
* is null, the text will be measured without wrapping, but explicit line breaks and
|
|
5742
|
-
* space are preserved.
|
|
5743
|
-
*/
|
|
5744
|
-
maxWidth: null | number;
|
|
5745
|
-
disableOverflowWrapBreaking?: boolean;
|
|
5746
|
-
fontFamily: string;
|
|
5747
|
-
fontSize: number;
|
|
5748
|
-
fontStyle: string;
|
|
5749
|
-
fontWeight: string;
|
|
5750
|
-
lineHeight: number;
|
|
5751
|
-
minWidth?: null | number;
|
|
5752
|
-
padding: string;
|
|
5753
|
-
}): BoxModel & {
|
|
5791
|
+
dispose(): void;
|
|
5792
|
+
private resetElmStyles;
|
|
5793
|
+
measureText(textToMeasure: string, opts: TLMeasureTextOpts): BoxModel & {
|
|
5754
5794
|
scrollWidth: number;
|
|
5755
5795
|
};
|
|
5756
|
-
measureHtml(html: string, opts: {
|
|
5757
|
-
/**
|
|
5758
|
-
* When maxWidth is a number, the text will be wrapped to that maxWidth. When maxWidth
|
|
5759
|
-
* is null, the text will be measured without wrapping, but explicit line breaks and
|
|
5760
|
-
* space are preserved.
|
|
5761
|
-
*/
|
|
5762
|
-
maxWidth: null | number;
|
|
5763
|
-
disableOverflowWrapBreaking?: boolean;
|
|
5764
|
-
fontFamily: string;
|
|
5765
|
-
fontSize: number;
|
|
5766
|
-
fontStyle: string;
|
|
5767
|
-
fontWeight: string;
|
|
5768
|
-
lineHeight: number;
|
|
5769
|
-
minWidth?: null | number;
|
|
5770
|
-
otherStyles?: Record<string, string>;
|
|
5771
|
-
padding: string;
|
|
5772
|
-
}): BoxModel & {
|
|
5796
|
+
measureHtml(html: string, opts: TLMeasureTextOpts): BoxModel & {
|
|
5773
5797
|
scrollWidth: number;
|
|
5774
5798
|
};
|
|
5775
5799
|
/**
|
|
@@ -6026,6 +6050,7 @@ export declare interface TLCropInfo<T extends TLShape> {
|
|
|
6026
6050
|
w: number;
|
|
6027
6051
|
};
|
|
6028
6052
|
initialShape: T;
|
|
6053
|
+
aspectRatioLocked?: boolean;
|
|
6029
6054
|
}
|
|
6030
6055
|
|
|
6031
6056
|
/** @public */
|
|
@@ -6084,6 +6109,29 @@ export declare interface TLDeepLinkOptions {
|
|
|
6084
6109
|
onChange?(url: URL, editor: Editor): void;
|
|
6085
6110
|
}
|
|
6086
6111
|
|
|
6112
|
+
/** @public */
|
|
6113
|
+
export declare interface TLDragShapesInInfo {
|
|
6114
|
+
initialDraggingOverShapeId: null | TLShapeId;
|
|
6115
|
+
prevDraggingOverShapeId: null | TLShapeId;
|
|
6116
|
+
initialParentIds: Map<TLShapeId, TLParentId>;
|
|
6117
|
+
initialIndices: Map<TLShapeId, IndexKey>;
|
|
6118
|
+
}
|
|
6119
|
+
|
|
6120
|
+
/** @public */
|
|
6121
|
+
export declare interface TLDragShapesOutInfo {
|
|
6122
|
+
nextDraggingOverShapeId: null | TLShapeId;
|
|
6123
|
+
initialDraggingOverShapeId: null | TLShapeId;
|
|
6124
|
+
initialParentIds: Map<TLShapeId, TLParentId>;
|
|
6125
|
+
initialIndices: Map<TLShapeId, IndexKey>;
|
|
6126
|
+
}
|
|
6127
|
+
|
|
6128
|
+
/** @public */
|
|
6129
|
+
export declare interface TLDragShapesOverInfo {
|
|
6130
|
+
initialDraggingOverShapeId: null | TLShapeId;
|
|
6131
|
+
initialParentIds: Map<TLShapeId, TLParentId>;
|
|
6132
|
+
initialIndices: Map<TLShapeId, IndexKey>;
|
|
6133
|
+
}
|
|
6134
|
+
|
|
6087
6135
|
/** @public @react */
|
|
6088
6136
|
export declare const TldrawEditor: React_2.NamedExoticComponent<TldrawEditorProps>;
|
|
6089
6137
|
|
|
@@ -6331,6 +6379,13 @@ export declare interface TldrawOptions {
|
|
|
6331
6379
|
readonly branding?: string;
|
|
6332
6380
|
}
|
|
6333
6381
|
|
|
6382
|
+
/** @public */
|
|
6383
|
+
export declare interface TLDropShapesOverInfo {
|
|
6384
|
+
initialDraggingOverShapeId: null | TLShapeId;
|
|
6385
|
+
initialParentIds: Map<TLShapeId, TLParentId>;
|
|
6386
|
+
initialIndices: Map<TLShapeId, IndexKey>;
|
|
6387
|
+
}
|
|
6388
|
+
|
|
6334
6389
|
/** @public */
|
|
6335
6390
|
export declare interface TLEditorComponents {
|
|
6336
6391
|
Background?: ComponentType | null;
|
|
@@ -6553,6 +6608,10 @@ export declare interface TLEventMap {
|
|
|
6553
6608
|
};
|
|
6554
6609
|
shapeId: TLShapeId;
|
|
6555
6610
|
}];
|
|
6611
|
+
'created-shapes': [TLRecord[]];
|
|
6612
|
+
'edited-shapes': [TLRecord[]];
|
|
6613
|
+
'deleted-shapes': [TLShapeId[]];
|
|
6614
|
+
edit: [];
|
|
6556
6615
|
}
|
|
6557
6616
|
|
|
6558
6617
|
/** @public */
|
|
@@ -6583,7 +6642,7 @@ export declare type TLExportType = 'jpeg' | 'png' | 'svg' | 'webp';
|
|
|
6583
6642
|
export declare type TLExternalAsset = TLFileExternalAsset | TLUrlExternalAsset;
|
|
6584
6643
|
|
|
6585
6644
|
/** @public */
|
|
6586
|
-
export declare type TLExternalContent<EmbedDefinition> = TLEmbedExternalContent<EmbedDefinition> | TLExcalidrawExternalContent | TLFilesExternalContent | TLSvgTextExternalContent | TLTextExternalContent | TLTldrawExternalContent | TLUrlExternalContent;
|
|
6645
|
+
export declare type TLExternalContent<EmbedDefinition> = TLEmbedExternalContent<EmbedDefinition> | TLExcalidrawExternalContent | TLFileReplaceExternalContent | TLFilesExternalContent | TLSvgTextExternalContent | TLTextExternalContent | TLTldrawExternalContent | TLUrlExternalContent;
|
|
6587
6646
|
|
|
6588
6647
|
/** @public */
|
|
6589
6648
|
export declare type TLExternalContentSource = TLErrorExternalContentSource | TLExcalidrawExternalContentSource | TLTextExternalContentSource | TLTldrawExternalContentSource;
|
|
@@ -6595,11 +6654,19 @@ export declare interface TLFileExternalAsset {
|
|
|
6595
6654
|
assetId?: TLAssetId;
|
|
6596
6655
|
}
|
|
6597
6656
|
|
|
6657
|
+
/** @public */
|
|
6658
|
+
export declare interface TLFileReplaceExternalContent extends TLBaseExternalContent {
|
|
6659
|
+
type: 'file-replace';
|
|
6660
|
+
file: File;
|
|
6661
|
+
shapeId: TLShapeId;
|
|
6662
|
+
isImage: boolean;
|
|
6663
|
+
}
|
|
6664
|
+
|
|
6598
6665
|
/** @public */
|
|
6599
6666
|
export declare interface TLFilesExternalContent extends TLBaseExternalContent {
|
|
6600
6667
|
type: 'files';
|
|
6601
6668
|
files: File[];
|
|
6602
|
-
ignoreParent
|
|
6669
|
+
ignoreParent?: boolean;
|
|
6603
6670
|
}
|
|
6604
6671
|
|
|
6605
6672
|
/**
|
|
@@ -6794,6 +6861,27 @@ export declare interface TLLoadSnapshotOptions {
|
|
|
6794
6861
|
forceOverwriteSessionState?: boolean;
|
|
6795
6862
|
}
|
|
6796
6863
|
|
|
6864
|
+
/** @public */
|
|
6865
|
+
export declare interface TLMeasureTextOpts {
|
|
6866
|
+
fontStyle: string;
|
|
6867
|
+
fontWeight: string;
|
|
6868
|
+
fontFamily: string;
|
|
6869
|
+
fontSize: number;
|
|
6870
|
+
/** This must be a number, e.g. 1.35, not a pixel value. */
|
|
6871
|
+
lineHeight: number;
|
|
6872
|
+
/**
|
|
6873
|
+
* When maxWidth is a number, the text will be wrapped to that maxWidth. When maxWidth
|
|
6874
|
+
* is null, the text will be measured without wrapping, but explicit line breaks and
|
|
6875
|
+
* space are preserved.
|
|
6876
|
+
*/
|
|
6877
|
+
maxWidth: null | number;
|
|
6878
|
+
minWidth?: null | number;
|
|
6879
|
+
padding: string;
|
|
6880
|
+
otherStyles?: Record<string, string>;
|
|
6881
|
+
disableOverflowWrapBreaking?: boolean;
|
|
6882
|
+
measureScrollWidth?: boolean;
|
|
6883
|
+
}
|
|
6884
|
+
|
|
6797
6885
|
/** @public */
|
|
6798
6886
|
export declare interface TLMeasureTextSpanOpts {
|
|
6799
6887
|
overflow: 'truncate-clip' | 'truncate-ellipsis' | 'wrap';
|
|
@@ -6807,6 +6895,7 @@ export declare interface TLMeasureTextSpanOpts {
|
|
|
6807
6895
|
lineHeight: number;
|
|
6808
6896
|
textAlign: TLDefaultHorizontalAlignStyle;
|
|
6809
6897
|
otherStyles?: Record<string, string>;
|
|
6898
|
+
measureScrollWidth?: boolean;
|
|
6810
6899
|
}
|
|
6811
6900
|
|
|
6812
6901
|
/** @public */
|
|
@@ -7468,6 +7557,7 @@ export declare class TransformedGeometry2d extends Geometry2d {
|
|
|
7468
7557
|
/** @public */
|
|
7469
7558
|
export declare interface TransformedGeometry2dOptions {
|
|
7470
7559
|
isLabel?: boolean;
|
|
7560
|
+
isEmptyLabel?: boolean;
|
|
7471
7561
|
isInternal?: boolean;
|
|
7472
7562
|
debugColor?: string;
|
|
7473
7563
|
ignore?: boolean;
|
package/dist-esm/index.mjs
CHANGED
|
@@ -4,7 +4,6 @@ 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
|
-
import { areShapesContentEqual } from "./lib/utils/areShapesContentEqual.mjs";
|
|
8
7
|
export * from "@tldraw/state";
|
|
9
8
|
export * from "@tldraw/state-react";
|
|
10
9
|
export * from "@tldraw/store";
|
|
@@ -97,13 +96,15 @@ import {
|
|
|
97
96
|
import {
|
|
98
97
|
BindingUtil
|
|
99
98
|
} from "./lib/editor/bindings/BindingUtil.mjs";
|
|
100
|
-
import { ClickManager } from "./lib/editor/managers/ClickManager.mjs";
|
|
101
|
-
import { EdgeScrollManager } from "./lib/editor/managers/EdgeScrollManager.mjs";
|
|
99
|
+
import { ClickManager } from "./lib/editor/managers/ClickManager/ClickManager.mjs";
|
|
100
|
+
import { EdgeScrollManager } from "./lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs";
|
|
102
101
|
import {
|
|
103
102
|
FontManager
|
|
104
|
-
} from "./lib/editor/managers/FontManager.mjs";
|
|
105
|
-
import { HistoryManager } from "./lib/editor/managers/HistoryManager.mjs";
|
|
106
|
-
import {
|
|
103
|
+
} from "./lib/editor/managers/FontManager/FontManager.mjs";
|
|
104
|
+
import { HistoryManager } from "./lib/editor/managers/HistoryManager/HistoryManager.mjs";
|
|
105
|
+
import {
|
|
106
|
+
ScribbleManager
|
|
107
|
+
} from "./lib/editor/managers/ScribbleManager/ScribbleManager.mjs";
|
|
107
108
|
import {
|
|
108
109
|
BoundsSnaps
|
|
109
110
|
} from "./lib/editor/managers/SnapManager/BoundsSnaps.mjs";
|
|
@@ -111,8 +112,10 @@ import { HandleSnaps } from "./lib/editor/managers/SnapManager/HandleSnaps.mjs";
|
|
|
111
112
|
import {
|
|
112
113
|
SnapManager
|
|
113
114
|
} from "./lib/editor/managers/SnapManager/SnapManager.mjs";
|
|
114
|
-
import {
|
|
115
|
-
|
|
115
|
+
import {
|
|
116
|
+
TextManager
|
|
117
|
+
} from "./lib/editor/managers/TextManager/TextManager.mjs";
|
|
118
|
+
import { UserPreferencesManager } from "./lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs";
|
|
116
119
|
import { BaseBoxShapeUtil } from "./lib/editor/shapes/BaseBoxShapeUtil.mjs";
|
|
117
120
|
import {
|
|
118
121
|
ShapeUtil
|
|
@@ -272,6 +275,7 @@ import { hardResetEditor } from "./lib/utils/hardResetEditor.mjs";
|
|
|
272
275
|
import { isAccelKey } from "./lib/utils/keyboard.mjs";
|
|
273
276
|
import { normalizeWheel } from "./lib/utils/normalizeWheel.mjs";
|
|
274
277
|
import { refreshPage } from "./lib/utils/refreshPage.mjs";
|
|
278
|
+
import { getDroppedShapesToNewParents, kickoutOccludedShapes } from "./lib/utils/reparenting.mjs";
|
|
275
279
|
import {
|
|
276
280
|
getFontsFromRichText
|
|
277
281
|
} from "./lib/utils/richText.mjs";
|
|
@@ -289,7 +293,7 @@ function debugEnableLicensing() {
|
|
|
289
293
|
}
|
|
290
294
|
registerTldrawLibraryVersion(
|
|
291
295
|
"@tldraw/editor",
|
|
292
|
-
"3.14.0-canary.
|
|
296
|
+
"3.14.0-canary.8f303431285f",
|
|
293
297
|
"esm"
|
|
294
298
|
);
|
|
295
299
|
export {
|
|
@@ -377,7 +381,6 @@ export {
|
|
|
377
381
|
applyRotationToSnapshotShapes,
|
|
378
382
|
approximately,
|
|
379
383
|
areAnglesCompatible,
|
|
380
|
-
areShapesContentEqual,
|
|
381
384
|
average,
|
|
382
385
|
canonicalizeRotation,
|
|
383
386
|
centerOfCircleFromThreePoints,
|
|
@@ -403,6 +406,7 @@ export {
|
|
|
403
406
|
getArcMeasure,
|
|
404
407
|
getCursor,
|
|
405
408
|
getDefaultCdnBaseUrl,
|
|
409
|
+
getDroppedShapesToNewParents,
|
|
406
410
|
getFontsFromRichText,
|
|
407
411
|
getFreshUserPreferences,
|
|
408
412
|
getIncrementedName,
|
|
@@ -431,6 +435,7 @@ export {
|
|
|
431
435
|
intersectPolygonPolygon,
|
|
432
436
|
isAccelKey,
|
|
433
437
|
isSafeFloat,
|
|
438
|
+
kickoutOccludedShapes,
|
|
434
439
|
linesIntersect,
|
|
435
440
|
loadSessionStateSnapshotIntoStore,
|
|
436
441
|
loadSnapshot,
|