@tldraw/editor 3.13.0-canary.bbec36f93805 → 3.13.0-canary.bd7655d74283

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist-cjs/index.d.ts +109 -111
  2. package/dist-cjs/index.js +7 -22
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/components/Shape.js +12 -8
  5. package/dist-cjs/lib/components/Shape.js.map +2 -2
  6. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +36 -7
  7. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +17 -11
  9. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  10. package/dist-cjs/lib/editor/Editor.js +40 -15
  11. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  12. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  13. package/dist-cjs/lib/editor/managers/TextManager.js +10 -0
  14. package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
  15. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  17. package/dist-cjs/lib/exports/getSvgJsx.js +12 -3
  18. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  19. package/dist-cjs/lib/hooks/useEditorComponents.js +16 -16
  20. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  21. package/dist-cjs/lib/primitives/Box.js +16 -0
  22. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  23. package/dist-cjs/lib/primitives/Mat.js +1 -1
  24. package/dist-cjs/lib/primitives/Mat.js.map +2 -2
  25. package/dist-cjs/lib/primitives/Vec.js +20 -0
  26. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  27. package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
  28. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  29. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
  30. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  31. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -1
  32. package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
  33. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
  34. package/dist-cjs/lib/primitives/geometry/Edge2d.js +1 -1
  35. package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
  36. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  37. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +91 -20
  38. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  39. package/dist-cjs/lib/primitives/geometry/Group2d.js +55 -2
  40. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  41. package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
  42. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  43. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  44. package/dist-cjs/lib/utils/areShapesContentEqual.js +25 -0
  45. package/dist-cjs/lib/utils/areShapesContentEqual.js.map +7 -0
  46. package/dist-cjs/lib/utils/debug-flags.js +5 -2
  47. package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
  48. package/dist-cjs/lib/utils/nearestMultiple.js +34 -0
  49. package/dist-cjs/lib/utils/nearestMultiple.js.map +7 -0
  50. package/dist-cjs/version.js +3 -3
  51. package/dist-cjs/version.js.map +1 -1
  52. package/dist-esm/index.d.mts +109 -111
  53. package/dist-esm/index.mjs +9 -41
  54. package/dist-esm/index.mjs.map +2 -2
  55. package/dist-esm/lib/components/Shape.mjs +12 -8
  56. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  57. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +36 -7
  58. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  59. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +17 -11
  60. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  61. package/dist-esm/lib/editor/Editor.mjs +40 -15
  62. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  63. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  64. package/dist-esm/lib/editor/managers/TextManager.mjs +10 -0
  65. package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
  66. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  67. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  68. package/dist-esm/lib/exports/getSvgJsx.mjs +12 -3
  69. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  70. package/dist-esm/lib/hooks/useEditorComponents.mjs +16 -18
  71. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  72. package/dist-esm/lib/primitives/Box.mjs +16 -0
  73. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  74. package/dist-esm/lib/primitives/Mat.mjs +1 -1
  75. package/dist-esm/lib/primitives/Mat.mjs.map +2 -2
  76. package/dist-esm/lib/primitives/Vec.mjs +20 -0
  77. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  78. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  79. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  80. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -1
  81. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  82. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -1
  83. package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
  84. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
  85. package/dist-esm/lib/primitives/geometry/Edge2d.mjs +1 -1
  86. package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
  87. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  88. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +92 -21
  89. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  90. package/dist-esm/lib/primitives/geometry/Group2d.mjs +55 -2
  91. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  92. package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
  93. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  94. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  95. package/dist-esm/lib/utils/areShapesContentEqual.mjs +5 -0
  96. package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +7 -0
  97. package/dist-esm/lib/utils/debug-flags.mjs +5 -2
  98. package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
  99. package/dist-esm/lib/utils/nearestMultiple.mjs +14 -0
  100. package/dist-esm/lib/utils/nearestMultiple.mjs.map +7 -0
  101. package/dist-esm/version.mjs +3 -3
  102. package/dist-esm/version.mjs.map +1 -1
  103. package/editor.css +34 -4
  104. package/package.json +7 -7
  105. package/src/index.ts +16 -31
  106. package/src/lib/components/Shape.tsx +14 -10
  107. package/src/lib/components/default-components/DefaultCanvas.tsx +41 -7
  108. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +17 -8
  109. package/src/lib/editor/Editor.test.ts +1 -1
  110. package/src/lib/editor/Editor.ts +40 -15
  111. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +0 -1
  112. package/src/lib/editor/managers/TextManager.ts +12 -0
  113. package/src/lib/editor/shapes/ShapeUtil.ts +22 -2
  114. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +9 -9
  115. package/src/lib/exports/getSvgJsx.tsx +16 -7
  116. package/src/lib/hooks/useEditorComponents.tsx +33 -32
  117. package/src/lib/primitives/Box.ts +20 -0
  118. package/src/lib/primitives/Mat.ts +5 -4
  119. package/src/lib/primitives/Vec.ts +23 -0
  120. package/src/lib/primitives/geometry/Arc2d.ts +5 -5
  121. package/src/lib/primitives/geometry/Circle2d.ts +4 -4
  122. package/src/lib/primitives/geometry/CubicBezier2d.ts +4 -4
  123. package/src/lib/primitives/geometry/CubicSpline2d.ts +3 -3
  124. package/src/lib/primitives/geometry/Edge2d.ts +3 -3
  125. package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
  126. package/src/lib/primitives/geometry/Geometry2d.test.ts +42 -0
  127. package/src/lib/primitives/geometry/Geometry2d.ts +123 -35
  128. package/src/lib/primitives/geometry/Group2d.ts +70 -7
  129. package/src/lib/primitives/geometry/Point2d.ts +2 -2
  130. package/src/lib/primitives/geometry/Polyline2d.ts +3 -3
  131. package/src/lib/primitives/geometry/Stadium2d.ts +3 -3
  132. package/src/lib/test/currentToolIdMask.test.ts +1 -1
  133. package/src/lib/test/user.test.ts +1 -1
  134. package/src/lib/utils/areShapesContentEqual.ts +4 -0
  135. package/src/lib/utils/debug-flags.ts +7 -2
  136. package/src/lib/utils/nearestMultiple.ts +13 -0
  137. package/src/lib/utils/sync/LocalIndexedDb.test.ts +1 -1
  138. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
  139. package/src/version.ts +3 -3
@@ -66,7 +66,8 @@ const debugFlags = {
66
66
  debugGeometry: createDebugValue("debugGeometry", { defaults: { all: false } }),
67
67
  hideShapes: createDebugValue("hideShapes", { defaults: { all: false } }),
68
68
  editOnType: createDebugValue("editOnType", { defaults: { all: false } }),
69
- a11y: createDebugValue("a11y", { defaults: { all: false } })
69
+ a11y: createDebugValue("a11y", { defaults: { all: false } }),
70
+ debugElbowArrows: createDebugValue("debugElbowArrows", { defaults: { all: false } })
70
71
  };
71
72
  if (typeof Element !== "undefined") {
72
73
  const nativeElementRemoveChild = Element.prototype.removeChild;
@@ -116,7 +117,9 @@ function createDebugValueBase(def) {
116
117
  configurable: true
117
118
  });
118
119
  }
119
- return Object.assign(valueAtom, def);
120
+ return Object.assign(valueAtom, def, {
121
+ reset: () => valueAtom.set(defaultValue)
122
+ });
120
123
  }
121
124
  function getStoredInitialValue(name) {
122
125
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/utils/debug-flags.ts"],
4
- "sourcesContent": ["import { Atom, atom, react } from '@tldraw/state'\nimport { deleteFromSessionStorage, getFromSessionStorage, setInSessionStorage } from '@tldraw/utils'\n\n// --- 1. DEFINE ---\n//\n// Define your debug values and feature flags here. Use `createDebugValue` to\n// create an arbitrary value with defaults for production, staging, and\n// development. Use `createFeatureFlag` to create a boolean flag which will be\n// `true` by default in development and staging, and `false` in production.\n/** @internal */\nexport const featureFlags: Record<string, DebugFlag<boolean>> = {}\n\n/** @internal */\nexport const pointerCaptureTrackingObject = createDebugValue(\n\t'pointerCaptureTrackingObject',\n\t// ideally we wouldn't store this mutable value in an atom but it's not\n\t// a big deal for debug values\n\t{\n\t\tdefaults: { all: new Map<Element, number>() },\n\t\tshouldStoreForSession: false,\n\t}\n)\n\n/** @internal */\nexport const debugFlags = {\n\t// --- DEBUG VALUES ---\n\tlogPreventDefaults: createDebugValue('logPreventDefaults', {\n\t\tdefaults: { all: false },\n\t}),\n\tlogPointerCaptures: createDebugValue('logPointerCaptures', {\n\t\tdefaults: { all: false },\n\t}),\n\tlogElementRemoves: createDebugValue('logElementRemoves', {\n\t\tdefaults: { all: false },\n\t}),\n\tdebugSvg: createDebugValue('debugSvg', {\n\t\tdefaults: { all: false },\n\t}),\n\tshowFps: createDebugValue('showFps', {\n\t\tdefaults: { all: false },\n\t}),\n\tmeasurePerformance: createDebugValue('measurePerformance', { defaults: { all: false } }),\n\tthrowToBlob: createDebugValue('throwToBlob', {\n\t\tdefaults: { all: false },\n\t}),\n\treconnectOnPing: createDebugValue('reconnectOnPing', {\n\t\tdefaults: { all: false },\n\t}),\n\tdebugCursors: createDebugValue('debugCursors', {\n\t\tdefaults: { all: false },\n\t}),\n\tforceSrgb: createDebugValue('forceSrgbColors', { defaults: { all: false } }),\n\tdebugGeometry: createDebugValue('debugGeometry', { defaults: { all: false } }),\n\thideShapes: createDebugValue('hideShapes', { defaults: { all: false } }),\n\teditOnType: createDebugValue('editOnType', { defaults: { all: false } }),\n\ta11y: createDebugValue('a11y', { defaults: { all: false } }),\n} as const\n\ndeclare global {\n\tinterface Window {\n\t\ttldrawLog(message: any): void\n\t}\n}\n\n// --- 2. USE ---\n// In normal code, read from debug flags directly by calling .value on them:\n// if (debugFlags.preventDefaultLogging.value) { ... }\n//\n// In react, wrap your reads in `useValue` (or your component in `track`)\n// so they react to changes:\n// const shouldLog = useValue(debugFlags.preventDefaultLogging)\n\n// --- 3. GET FUNKY ---\n// If you need to do fun stuff like monkey-patching in response to flag changes,\n// add that here. Make sure you wrap your code in `react` so it runs\n// automatically when values change!\n\nif (typeof Element !== 'undefined') {\n\tconst nativeElementRemoveChild = Element.prototype.removeChild\n\treact('element removal logging', () => {\n\t\tif (debugFlags.logElementRemoves.get()) {\n\t\t\tElement.prototype.removeChild = function <T extends Node>(this: any, child: Node): T {\n\t\t\t\tconsole.warn('[tldraw] removing child:', child)\n\t\t\t\treturn nativeElementRemoveChild.call(this, child) as T\n\t\t\t}\n\t\t} else {\n\t\t\tElement.prototype.removeChild = nativeElementRemoveChild\n\t\t}\n\t})\n}\n\n// --- IMPLEMENTATION ---\n// you probably don't need to read this if you're just using the debug values system\nfunction createDebugValue<T>(\n\tname: string,\n\t{\n\t\tdefaults,\n\t\tshouldStoreForSession = true,\n\t}: { defaults: DebugFlagDefaults<T>; shouldStoreForSession?: boolean }\n) {\n\treturn createDebugValueBase({\n\t\tname,\n\t\tdefaults,\n\t\tshouldStoreForSession,\n\t})\n}\n\n// function createFeatureFlag<T>(\n// \tname: string,\n// \t{\n// \t\tdefaults,\n// \t\tshouldStoreForSession = true,\n// \t}: { defaults: DebugFlagDefaults<T>; shouldStoreForSession?: boolean }\n// ) {\n// \treturn createDebugValueBase({\n// \t\tname,\n// \t\tdefaults,\n// \t\tshouldStoreForSession,\n// \t})\n// }\n\nfunction createDebugValueBase<T>(def: DebugFlagDef<T>): DebugFlag<T> {\n\tconst defaultValue = getDefaultValue(def)\n\tconst storedValue = def.shouldStoreForSession\n\t\t? (getStoredInitialValue(def.name) as T | null)\n\t\t: null\n\tconst valueAtom = atom(`debug:${def.name}`, storedValue ?? defaultValue)\n\n\tif (typeof window !== 'undefined') {\n\t\tif (def.shouldStoreForSession) {\n\t\t\treact(`debug:${def.name}`, () => {\n\t\t\t\tconst currentValue = valueAtom.get()\n\t\t\t\tif (currentValue === defaultValue) {\n\t\t\t\t\tdeleteFromSessionStorage(`tldraw_debug:${def.name}`)\n\t\t\t\t} else {\n\t\t\t\t\tsetInSessionStorage(`tldraw_debug:${def.name}`, JSON.stringify(currentValue))\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tObject.defineProperty(window, `tldraw${def.name.replace(/^[a-z]/, (l) => l.toUpperCase())}`, {\n\t\t\tget() {\n\t\t\t\treturn valueAtom.get()\n\t\t\t},\n\t\t\tset(newValue) {\n\t\t\t\tvalueAtom.set(newValue)\n\t\t\t},\n\t\t\tconfigurable: true,\n\t\t})\n\t}\n\n\treturn Object.assign(valueAtom, def)\n}\n\nfunction getStoredInitialValue(name: string) {\n\ttry {\n\t\treturn JSON.parse(getFromSessionStorage(`tldraw_debug:${name}`) ?? 'null')\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// process.env might not be defined, but we can't access it using optional\n// chaining because some bundlers search for `process.env.SOMETHING` as a string\n// and replace it with its value.\nfunction readEnv(fn: () => string | undefined) {\n\ttry {\n\t\treturn fn()\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction getDefaultValue<T>(def: DebugFlagDef<T>): T {\n\tconst env =\n\t\treadEnv(() => process.env.TLDRAW_ENV) ??\n\t\treadEnv(() => process.env.VERCEL_PUBLIC_TLDRAW_ENV) ??\n\t\treadEnv(() => process.env.NEXT_PUBLIC_TLDRAW_ENV) ??\n\t\t// default to production because if we don't have one of these, this is probably a library use\n\t\t'production'\n\n\tswitch (env) {\n\t\tcase 'production':\n\t\t\treturn def.defaults.production ?? def.defaults.all\n\t\tcase 'preview':\n\t\tcase 'staging':\n\t\t\treturn def.defaults.staging ?? def.defaults.all\n\t\tdefault:\n\t\t\treturn def.defaults.development ?? def.defaults.all\n\t}\n}\n\n/** @internal */\nexport interface DebugFlagDefaults<T> {\n\tdevelopment?: T\n\tstaging?: T\n\tproduction?: T\n\tall: T\n}\n\n/** @internal */\nexport interface DebugFlagDef<T> {\n\tname: string\n\tdefaults: DebugFlagDefaults<T>\n\tshouldStoreForSession: boolean\n}\n\n/** @internal */\nexport type DebugFlag<T> = DebugFlagDef<T> & Atom<T>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Atom, atom, react } from '@tldraw/state'\nimport { deleteFromSessionStorage, getFromSessionStorage, setInSessionStorage } from '@tldraw/utils'\n\n// --- 1. DEFINE ---\n//\n// Define your debug values and feature flags here. Use `createDebugValue` to\n// create an arbitrary value with defaults for production, staging, and\n// development. Use `createFeatureFlag` to create a boolean flag which will be\n// `true` by default in development and staging, and `false` in production.\n/** @internal */\nexport const featureFlags: Record<string, DebugFlag<boolean>> = {}\n\n/** @internal */\nexport const pointerCaptureTrackingObject = createDebugValue(\n\t'pointerCaptureTrackingObject',\n\t// ideally we wouldn't store this mutable value in an atom but it's not\n\t// a big deal for debug values\n\t{\n\t\tdefaults: { all: new Map<Element, number>() },\n\t\tshouldStoreForSession: false,\n\t}\n)\n\n/** @internal */\nexport const debugFlags = {\n\t// --- DEBUG VALUES ---\n\tlogPreventDefaults: createDebugValue('logPreventDefaults', {\n\t\tdefaults: { all: false },\n\t}),\n\tlogPointerCaptures: createDebugValue('logPointerCaptures', {\n\t\tdefaults: { all: false },\n\t}),\n\tlogElementRemoves: createDebugValue('logElementRemoves', {\n\t\tdefaults: { all: false },\n\t}),\n\tdebugSvg: createDebugValue('debugSvg', {\n\t\tdefaults: { all: false },\n\t}),\n\tshowFps: createDebugValue('showFps', {\n\t\tdefaults: { all: false },\n\t}),\n\tmeasurePerformance: createDebugValue('measurePerformance', { defaults: { all: false } }),\n\tthrowToBlob: createDebugValue('throwToBlob', {\n\t\tdefaults: { all: false },\n\t}),\n\treconnectOnPing: createDebugValue('reconnectOnPing', {\n\t\tdefaults: { all: false },\n\t}),\n\tdebugCursors: createDebugValue('debugCursors', {\n\t\tdefaults: { all: false },\n\t}),\n\tforceSrgb: createDebugValue('forceSrgbColors', { defaults: { all: false } }),\n\tdebugGeometry: createDebugValue('debugGeometry', { defaults: { all: false } }),\n\thideShapes: createDebugValue('hideShapes', { defaults: { all: false } }),\n\teditOnType: createDebugValue('editOnType', { defaults: { all: false } }),\n\ta11y: createDebugValue('a11y', { defaults: { all: false } }),\n\tdebugElbowArrows: createDebugValue('debugElbowArrows', { defaults: { all: false } }),\n} as const\n\ndeclare global {\n\tinterface Window {\n\t\ttldrawLog(message: any): void\n\t}\n}\n\n// --- 2. USE ---\n// In normal code, read from debug flags directly by calling .value on them:\n// if (debugFlags.preventDefaultLogging.value) { ... }\n//\n// In react, wrap your reads in `useValue` (or your component in `track`)\n// so they react to changes:\n// const shouldLog = useValue(debugFlags.preventDefaultLogging)\n\n// --- 3. GET FUNKY ---\n// If you need to do fun stuff like monkey-patching in response to flag changes,\n// add that here. Make sure you wrap your code in `react` so it runs\n// automatically when values change!\n\nif (typeof Element !== 'undefined') {\n\tconst nativeElementRemoveChild = Element.prototype.removeChild\n\treact('element removal logging', () => {\n\t\tif (debugFlags.logElementRemoves.get()) {\n\t\t\tElement.prototype.removeChild = function <T extends Node>(this: any, child: Node): T {\n\t\t\t\tconsole.warn('[tldraw] removing child:', child)\n\t\t\t\treturn nativeElementRemoveChild.call(this, child) as T\n\t\t\t}\n\t\t} else {\n\t\t\tElement.prototype.removeChild = nativeElementRemoveChild\n\t\t}\n\t})\n}\n\n// --- IMPLEMENTATION ---\n// you probably don't need to read this if you're just using the debug values system\nfunction createDebugValue<T>(\n\tname: string,\n\t{\n\t\tdefaults,\n\t\tshouldStoreForSession = true,\n\t}: { defaults: DebugFlagDefaults<T>; shouldStoreForSession?: boolean }\n) {\n\treturn createDebugValueBase({\n\t\tname,\n\t\tdefaults,\n\t\tshouldStoreForSession,\n\t})\n}\n\n// function createFeatureFlag<T>(\n// \tname: string,\n// \t{\n// \t\tdefaults,\n// \t\tshouldStoreForSession = true,\n// \t}: { defaults: DebugFlagDefaults<T>; shouldStoreForSession?: boolean }\n// ) {\n// \treturn createDebugValueBase({\n// \t\tname,\n// \t\tdefaults,\n// \t\tshouldStoreForSession,\n// \t})\n// }\n\nfunction createDebugValueBase<T>(def: DebugFlagDef<T>): DebugFlag<T> {\n\tconst defaultValue = getDefaultValue(def)\n\tconst storedValue = def.shouldStoreForSession\n\t\t? (getStoredInitialValue(def.name) as T | null)\n\t\t: null\n\tconst valueAtom = atom(`debug:${def.name}`, storedValue ?? defaultValue)\n\n\tif (typeof window !== 'undefined') {\n\t\tif (def.shouldStoreForSession) {\n\t\t\treact(`debug:${def.name}`, () => {\n\t\t\t\tconst currentValue = valueAtom.get()\n\t\t\t\tif (currentValue === defaultValue) {\n\t\t\t\t\tdeleteFromSessionStorage(`tldraw_debug:${def.name}`)\n\t\t\t\t} else {\n\t\t\t\t\tsetInSessionStorage(`tldraw_debug:${def.name}`, JSON.stringify(currentValue))\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tObject.defineProperty(window, `tldraw${def.name.replace(/^[a-z]/, (l) => l.toUpperCase())}`, {\n\t\t\tget() {\n\t\t\t\treturn valueAtom.get()\n\t\t\t},\n\t\t\tset(newValue) {\n\t\t\t\tvalueAtom.set(newValue)\n\t\t\t},\n\t\t\tconfigurable: true,\n\t\t})\n\t}\n\n\treturn Object.assign(valueAtom, def, {\n\t\treset: () => valueAtom.set(defaultValue),\n\t})\n}\n\nfunction getStoredInitialValue(name: string) {\n\ttry {\n\t\treturn JSON.parse(getFromSessionStorage(`tldraw_debug:${name}`) ?? 'null')\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// process.env might not be defined, but we can't access it using optional\n// chaining because some bundlers search for `process.env.SOMETHING` as a string\n// and replace it with its value.\nfunction readEnv(fn: () => string | undefined) {\n\ttry {\n\t\treturn fn()\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction getDefaultValue<T>(def: DebugFlagDef<T>): T {\n\tconst env =\n\t\treadEnv(() => process.env.TLDRAW_ENV) ??\n\t\treadEnv(() => process.env.VERCEL_PUBLIC_TLDRAW_ENV) ??\n\t\treadEnv(() => process.env.NEXT_PUBLIC_TLDRAW_ENV) ??\n\t\t// default to production because if we don't have one of these, this is probably a library use\n\t\t'production'\n\n\tswitch (env) {\n\t\tcase 'production':\n\t\t\treturn def.defaults.production ?? def.defaults.all\n\t\tcase 'preview':\n\t\tcase 'staging':\n\t\t\treturn def.defaults.staging ?? def.defaults.all\n\t\tdefault:\n\t\t\treturn def.defaults.development ?? def.defaults.all\n\t}\n}\n\n/** @internal */\nexport interface DebugFlagDefaults<T> {\n\tdevelopment?: T\n\tstaging?: T\n\tproduction?: T\n\tall: T\n}\n\n/** @internal */\nexport interface DebugFlagDef<T> {\n\tname: string\n\tdefaults: DebugFlagDefaults<T>\n\tshouldStoreForSession: boolean\n}\n\n/** @internal */\nexport interface DebugFlag<T> extends DebugFlagDef<T>, Atom<T> {\n\treset(): void\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var nearestMultiple_exports = {};
20
+ __export(nearestMultiple_exports, {
21
+ nearestMultiple: () => nearestMultiple
22
+ });
23
+ module.exports = __toCommonJS(nearestMultiple_exports);
24
+ function gcd(a, b) {
25
+ return b === 0 ? a : gcd(b, a % b);
26
+ }
27
+ function nearestMultiple(float) {
28
+ const decimal = float.toString().split(".")[1];
29
+ if (!decimal) return 1;
30
+ const denominator = Math.pow(10, decimal.length);
31
+ const numerator = parseInt(decimal, 10);
32
+ return denominator / gcd(numerator, denominator);
33
+ }
34
+ //# sourceMappingURL=nearestMultiple.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/utils/nearestMultiple.ts"],
4
+ "sourcesContent": ["// Euclidean algorithm to find the GCD\nfunction gcd(a: number, b: number): number {\n\treturn b === 0 ? a : gcd(b, a % b)\n}\n\n// Returns the lowest value that the given number can be multiplied by to reach an integer\nexport function nearestMultiple(float: number) {\n\tconst decimal = float.toString().split('.')[1]\n\tif (!decimal) return 1\n\tconst denominator = Math.pow(10, decimal.length)\n\tconst numerator = parseInt(decimal, 10)\n\treturn denominator / gcd(numerator, denominator)\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAS,IAAI,GAAW,GAAmB;AAC1C,SAAO,MAAM,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAClC;AAGO,SAAS,gBAAgB,OAAe;AAC9C,QAAM,UAAU,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,cAAc,KAAK,IAAI,IAAI,QAAQ,MAAM;AAC/C,QAAM,YAAY,SAAS,SAAS,EAAE;AACtC,SAAO,cAAc,IAAI,WAAW,WAAW;AAChD;",
6
+ "names": []
7
+ }
@@ -22,10 +22,10 @@ __export(version_exports, {
22
22
  version: () => version
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- const version = "3.13.0-canary.bbec36f93805";
25
+ const version = "3.13.0-canary.bd7655d74283";
26
26
  const publishDates = {
27
27
  major: "2024-09-13T14:36:29.063Z",
28
- minor: "2025-04-29T14:04:26.024Z",
29
- patch: "2025-04-29T14:04:26.024Z"
28
+ minor: "2025-05-11T12:31:36.788Z",
29
+ patch: "2025-05-11T12:31:36.788Z"
30
30
  };
31
31
  //# sourceMappingURL=version.js.map
@@ -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.bbec36f93805'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-04-29T14:04:26.024Z',\n\tpatch: '2025-04-29T14:04:26.024Z',\n}\n"],
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.bd7655d74283'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-05-11T12:31:36.788Z',\n\tpatch: '2025-05-11T12:31:36.788Z',\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
  }
@@ -1,16 +1,12 @@
1
1
  /// <reference types="react" />
2
2
 
3
3
  import { Atom } from '@tldraw/state';
4
- import { atom } from '@tldraw/state';
5
4
  import { BoxModel } from '@tldraw/tlschema';
6
5
  import { ComponentType } from 'react';
7
6
  import { Computed } from '@tldraw/state';
8
- import { computed } from '@tldraw/state';
9
7
  import { Dispatch } from 'react';
10
8
  import { Editor as Editor_2 } from '@tiptap/core';
11
9
  import { EditorProviderProps } from '@tiptap/react';
12
- import { EffectScheduler } from '@tldraw/state';
13
- import { EMPTY_ARRAY } from '@tldraw/state';
14
10
  import EventEmitter from 'eventemitter3';
15
11
  import { ExoticComponent } from 'react';
16
12
  import { HistoryEntry } from '@tldraw/store';
@@ -23,7 +19,6 @@ import { NamedExoticComponent } from 'react';
23
19
  import { Node as Node_2 } from '@tiptap/pm/model';
24
20
  import { PerformanceTracker } from '@tldraw/utils';
25
21
  import { PointerEventHandler } from 'react';
26
- import { react } from '@tldraw/state';
27
22
  import { default as React_2 } from 'react';
28
23
  import * as React_3 from 'react';
29
24
  import { ReactElement } from 'react';
@@ -82,18 +77,8 @@ import { TLStoreSnapshot } from '@tldraw/tlschema';
82
77
  import { TLUnknownBinding } from '@tldraw/tlschema';
83
78
  import { TLUnknownShape } from '@tldraw/tlschema';
84
79
  import { TLVideoAsset } from '@tldraw/tlschema';
85
- import { track } from '@tldraw/state-react';
86
- import { transact } from '@tldraw/state';
87
- import { transaction } from '@tldraw/state';
88
80
  import { UnknownRecord } from '@tldraw/store';
89
- import { useAtom } from '@tldraw/state-react';
90
- import { useComputed } from '@tldraw/state-react';
91
- import { useQuickReactor } from '@tldraw/state-react';
92
- import { useReactor } from '@tldraw/state-react';
93
- import { useStateTracking } from '@tldraw/state-react';
94
- import { useValue } from '@tldraw/state-react';
95
81
  import { VecModel } from '@tldraw/tlschema';
96
- import { whyAmIRunning } from '@tldraw/state';
97
82
 
98
83
  /* Excluded from this release type: activeElementShouldCaptureKeys */
99
84
 
@@ -136,8 +121,8 @@ export declare class Arc2d extends Geometry2d {
136
121
  start: Vec;
137
122
  sweepFlag: number;
138
123
  });
139
- nearestPoint(point: Vec): Vec;
140
- hitTestLineSegment(A: Vec, B: Vec): boolean;
124
+ nearestPoint(point: VecLike): Vec;
125
+ hitTestLineSegment(A: VecLike, B: VecLike): boolean;
141
126
  getVertices(): Vec[];
142
127
  getSvgPathData(first?: boolean): string;
143
128
  getLength(): number;
@@ -153,10 +138,6 @@ export declare class Arc2d extends Geometry2d {
153
138
  */
154
139
  export declare function areAnglesCompatible(a: number, b: number): boolean;
155
140
 
156
- export { Atom }
157
-
158
- export { atom }
159
-
160
141
  /** @public */
161
142
  export declare function average(A: VecLike, B: VecLike): string;
162
143
 
@@ -477,12 +458,16 @@ export declare class Box {
477
458
  set point(val: Vec);
478
459
  get minX(): number;
479
460
  set minX(n: number);
461
+ get left(): number;
480
462
  get midX(): number;
481
463
  get maxX(): number;
464
+ get right(): number;
482
465
  get minY(): number;
483
466
  set minY(n: number);
467
+ get top(): number;
484
468
  get midY(): number;
485
469
  get maxY(): number;
470
+ get bottom(): number;
486
471
  get width(): number;
487
472
  set width(n: number);
488
473
  get height(): number;
@@ -578,8 +563,8 @@ export declare class Circle2d extends Geometry2d {
578
563
  });
579
564
  getBounds(): Box;
580
565
  getVertices(): Vec[];
581
- nearestPoint(point: Vec): Vec;
582
- hitTestLineSegment(A: Vec, B: Vec, distance?: number): boolean;
566
+ nearestPoint(point: VecLike): Vec;
567
+ hitTestLineSegment(A: VecLike, B: VecLike, distance?: number): boolean;
583
568
  getSvgPathData(): string;
584
569
  }
585
570
 
@@ -656,8 +641,6 @@ export declare class ClickManager {
656
641
  */
657
642
  export declare function clockwiseAngleDist(a0: number, a1: number): number;
658
643
 
659
- export { computed }
660
-
661
644
  /**
662
645
  * @public
663
646
  * @react
@@ -745,10 +728,10 @@ export declare class CubicBezier2d extends Polyline2d {
745
728
  });
746
729
  getVertices(): Vec[];
747
730
  midPoint(): Vec;
748
- nearestPoint(A: Vec): Vec;
731
+ nearestPoint(A: VecLike): Vec;
749
732
  getSvgPathData(first?: boolean): string;
750
733
  static GetAtT(segment: CubicBezier2d, t: number): Vec;
751
- getLength(precision?: number): number;
734
+ getLength(filters?: Geometry2dFilters, precision?: number): number;
752
735
  }
753
736
 
754
737
  /** @public */
@@ -761,8 +744,8 @@ export declare class CubicSpline2d extends Geometry2d {
761
744
  get segments(): CubicBezier2d[];
762
745
  getLength(): number;
763
746
  getVertices(): Vec[];
764
- nearestPoint(A: Vec): Vec;
765
- hitTestLineSegment(A: Vec, B: Vec): boolean;
747
+ nearestPoint(A: VecLike): Vec;
748
+ hitTestLineSegment(A: VecLike, B: VecLike): boolean;
766
749
  getSvgPathData(): string;
767
750
  }
768
751
 
@@ -956,8 +939,8 @@ export declare class Edge2d extends Geometry2d {
956
939
  getLength(): number;
957
940
  midPoint(): Vec;
958
941
  getVertices(): Vec[];
959
- nearestPoint(point: Vec): Vec;
960
- hitTestLineSegment(A: Vec, B: Vec, distance?: number): boolean;
942
+ nearestPoint(point: VecLike): Vec;
943
+ hitTestLineSegment(A: VecLike, B: VecLike, distance?: number): boolean;
961
944
  getSvgPathData(first?: boolean): string;
962
945
  }
963
946
 
@@ -3994,8 +3977,6 @@ export declare class Editor extends EventEmitter<TLEventMap> {
3994
3977
  /** @public */
3995
3978
  export declare const EditorContext: React_2.Context<Editor | null>;
3996
3979
 
3997
- export { EffectScheduler }
3998
-
3999
3980
  /** @public */
4000
3981
  export declare class Ellipse2d extends Geometry2d {
4001
3982
  config: Omit<Geometry2dOptions, 'isClosed'> & {
@@ -4011,15 +3992,13 @@ export declare class Ellipse2d extends Geometry2d {
4011
3992
  _edges?: Edge2d[];
4012
3993
  get edges(): Edge2d[];
4013
3994
  getVertices(): any[];
4014
- nearestPoint(A: Vec): Vec;
4015
- hitTestLineSegment(A: Vec, B: Vec): boolean;
3995
+ nearestPoint(A: VecLike): Vec;
3996
+ hitTestLineSegment(A: VecLike, B: VecLike): boolean;
4016
3997
  getBounds(): Box;
4017
3998
  getLength(): number;
4018
3999
  getSvgPathData(first?: boolean): string;
4019
4000
  }
4020
4001
 
4021
- export { EMPTY_ARRAY }
4022
-
4023
4002
  /** @public */
4024
4003
  export declare class ErrorBoundary extends React_3.Component<React_3.PropsWithRef<React_3.PropsWithChildren<TLErrorBoundaryProps>>, {
4025
4004
  error: Error | null;
@@ -4087,18 +4066,27 @@ export declare abstract class Geometry2d {
4087
4066
  constructor(opts: Geometry2dOptions);
4088
4067
  isExcludedByFilter(filters?: Geometry2dFilters): boolean;
4089
4068
  abstract getVertices(filters: Geometry2dFilters): Vec[];
4090
- abstract nearestPoint(point: Vec, _filters?: Geometry2dFilters): Vec;
4091
- hitTestPoint(point: Vec, margin?: number, hitInside?: boolean, _filters?: Geometry2dFilters): boolean;
4092
- distanceToPoint(point: Vec, hitInside?: boolean, filters?: Geometry2dFilters): number;
4093
- distanceToLineSegment(A: Vec, B: Vec, filters?: Geometry2dFilters): number;
4094
- hitTestLineSegment(A: Vec, B: Vec, distance?: number, filters?: Geometry2dFilters): boolean;
4069
+ abstract nearestPoint(point: VecLike, _filters?: Geometry2dFilters): Vec;
4070
+ hitTestPoint(point: VecLike, margin?: number, hitInside?: boolean, _filters?: Geometry2dFilters): boolean;
4071
+ distanceToPoint(point: VecLike, hitInside?: boolean, filters?: Geometry2dFilters): number;
4072
+ distanceToLineSegment(A: VecLike, B: VecLike, filters?: Geometry2dFilters): number;
4073
+ hitTestLineSegment(A: VecLike, B: VecLike, distance?: number, filters?: Geometry2dFilters): boolean;
4095
4074
  intersectLineSegment(A: VecLike, B: VecLike, _filters?: Geometry2dFilters): VecLike[];
4096
4075
  intersectCircle(center: VecLike, radius: number, _filters?: Geometry2dFilters): VecLike[];
4097
4076
  intersectPolygon(polygon: VecLike[], _filters?: Geometry2dFilters): VecLike[];
4098
4077
  intersectPolyline(polyline: VecLike[], _filters?: Geometry2dFilters): VecLike[];
4078
+ /**
4079
+ * Find a point along the edge of the geometry that is a fraction `t` along the entire way round.
4080
+ */
4081
+ interpolateAlongEdge(t: number, _filters?: Geometry2dFilters): Vec;
4082
+ /**
4083
+ * Take `point`, find the closest point to it on the edge of the geometry, and return how far
4084
+ * along the edge it is as a fraction of the total length.
4085
+ */
4086
+ uninterpolateAlongEdge(point: VecLike, _filters?: Geometry2dFilters): number;
4099
4087
  /** @deprecated Iterate the vertices instead. */
4100
- nearestPointOnLineSegment(A: Vec, B: Vec): Vec;
4101
- isPointInBounds(point: Vec, margin?: number): boolean;
4088
+ nearestPointOnLineSegment(A: VecLike, B: VecLike): Vec;
4089
+ isPointInBounds(point: VecLike, margin?: number): boolean;
4102
4090
  transform(transform: MatModel, opts?: TransformedGeometry2dOptions): Geometry2d;
4103
4091
  private _vertices;
4104
4092
  get vertices(): Vec[];
@@ -4112,7 +4100,7 @@ export declare abstract class Geometry2d {
4112
4100
  toSimpleSvgPath(): string;
4113
4101
  private _length?;
4114
4102
  get length(): number;
4115
- getLength(): number;
4103
+ getLength(_filters?: Geometry2dFilters): number;
4116
4104
  abstract getSvgPathData(first: boolean): string;
4117
4105
  }
4118
4106
 
@@ -4180,15 +4168,15 @@ export declare function getFreshUserPreferences(): TLUserPreferences;
4180
4168
  export declare function getIncrementedName(name: string, others: string[]): string;
4181
4169
 
4182
4170
  /** @public */
4183
- export declare function getPerfectDashProps(totalLength: number, strokeWidth: number, opts?: Partial<{
4184
- closed: boolean;
4185
- end: 'none' | 'outset' | 'skip';
4186
- forceSolid: boolean;
4187
- lengthRatio: number;
4188
- snap: number;
4189
- start: 'none' | 'outset' | 'skip';
4190
- style: TLDefaultDashStyle;
4191
- }>): {
4171
+ export declare function getPerfectDashProps(totalLength: number, strokeWidth: number, opts?: {
4172
+ closed?: boolean;
4173
+ end?: 'none' | 'outset' | 'skip';
4174
+ forceSolid?: boolean;
4175
+ lengthRatio?: number;
4176
+ snap?: number;
4177
+ start?: 'none' | 'outset' | 'skip';
4178
+ style?: TLDefaultDashStyle;
4179
+ }): {
4192
4180
  strokeDasharray: string;
4193
4181
  strokeDashoffset: string;
4194
4182
  };
@@ -4275,18 +4263,20 @@ export declare class Group2d extends Geometry2d {
4275
4263
  children: Geometry2d[];
4276
4264
  });
4277
4265
  getVertices(filters: Geometry2dFilters): Vec[];
4278
- nearestPoint(point: Vec, filters?: Geometry2dFilters): Vec;
4279
- distanceToPoint(point: Vec, hitInside?: boolean, filters?: Geometry2dFilters): number;
4280
- hitTestPoint(point: Vec, margin: number, hitInside: boolean, filters?: Geometry2dFilters): boolean;
4281
- hitTestLineSegment(A: Vec, B: Vec, zoom: number, filters?: Geometry2dFilters): boolean;
4266
+ nearestPoint(point: VecLike, filters?: Geometry2dFilters): Vec;
4267
+ distanceToPoint(point: VecLike, hitInside?: boolean, filters?: Geometry2dFilters): number;
4268
+ hitTestPoint(point: VecLike, margin: number, hitInside: boolean, filters?: Geometry2dFilters): boolean;
4269
+ hitTestLineSegment(A: VecLike, B: VecLike, zoom: number, filters?: Geometry2dFilters): boolean;
4282
4270
  intersectLineSegment(A: VecLike, B: VecLike, filters?: Geometry2dFilters): VecLike[];
4283
4271
  intersectCircle(center: VecLike, radius: number, filters?: Geometry2dFilters): VecLike[];
4284
4272
  intersectPolygon(polygon: VecLike[], filters?: Geometry2dFilters): VecLike[];
4285
4273
  intersectPolyline(polyline: VecLike[], filters?: Geometry2dFilters): VecLike[];
4274
+ interpolateAlongEdge(t: number, filters?: Geometry2dFilters): Vec;
4275
+ uninterpolateAlongEdge(point: VecLike, filters?: Geometry2dFilters): number;
4286
4276
  transform(transform: Mat): Geometry2d;
4287
4277
  getArea(): number;
4288
4278
  toSimpleSvgPath(): string;
4289
- getLength(): number;
4279
+ getLength(filters?: Geometry2dFilters): number;
4290
4280
  getSvgPathData(): string;
4291
4281
  }
4292
4282
 
@@ -4591,8 +4581,8 @@ export declare class Mat {
4591
4581
  static Identity(): Mat;
4592
4582
  static Translate(x: number, y: number): Mat;
4593
4583
  static Rotate(r: number, cx?: number, cy?: number): Mat;
4594
- static Scale(x: number, y: number): MatModel;
4595
- static Scale(x: number, y: number, cx: number, cy: number): MatModel;
4584
+ static Scale(x: number, y: number): Mat;
4585
+ static Scale(x: number, y: number, cx: number, cy: number): Mat;
4596
4586
  static Multiply(m1: MatModel, m2: MatModel): MatModel;
4597
4587
  static Inverse(m: MatModel): MatModel;
4598
4588
  static Absolute(m: MatLike): MatModel;
@@ -4687,7 +4677,7 @@ export declare class Point2d extends Geometry2d {
4687
4677
  });
4688
4678
  getVertices(): Vec[];
4689
4679
  nearestPoint(): Vec;
4690
- hitTestLineSegment(A: Vec, B: Vec, margin: number): boolean;
4680
+ hitTestLineSegment(A: VecLike, B: VecLike, margin: number): boolean;
4691
4681
  getSvgPathData(): string;
4692
4682
  }
4693
4683
 
@@ -4732,8 +4722,8 @@ export declare class Polyline2d extends Geometry2d {
4732
4722
  get segments(): Edge2d[];
4733
4723
  getLength(): number;
4734
4724
  getVertices(): Vec[];
4735
- nearestPoint(A: Vec): Vec;
4736
- hitTestLineSegment(A: Vec, B: Vec, distance?: number): boolean;
4725
+ nearestPoint(A: VecLike): Vec;
4726
+ hitTestLineSegment(A: VecLike, B: VecLike, distance?: number): boolean;
4737
4727
  getSvgPathData(): string;
4738
4728
  }
4739
4729
 
@@ -4774,8 +4764,6 @@ export declare function radiansToDegrees(r: number): number;
4774
4764
  */
4775
4765
  export declare function rangeIntersection(a0: number, a1: number, b0: number, b1: number): [number, number] | null;
4776
4766
 
4777
- export { react }
4778
-
4779
4767
  /**
4780
4768
  * A map of {@link @tldraw/tlschema#StyleProp | StyleProps} to their {@link SharedStyle} values. See
4781
4769
  * {@link Editor.getSharedStyles}.
@@ -5419,10 +5407,20 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
5419
5407
  * A callback called when a shape's edge is double clicked.
5420
5408
  *
5421
5409
  * @param shape - The shape.
5410
+ * @param info - Info about the edge.
5422
5411
  * @returns A change to apply to the shape, or void.
5423
5412
  * @public
5424
5413
  */
5425
- onDoubleClickEdge?(shape: Shape): TLShapePartial<Shape> | void;
5414
+ onDoubleClickEdge?(shape: Shape, info: TLClickEventInfo): TLShapePartial<Shape> | void;
5415
+ /**
5416
+ * A callback called when a shape's corner is double clicked.
5417
+ *
5418
+ * @param shape - The shape.
5419
+ * @param info - Info about the corner.
5420
+ * @returns A change to apply to the shape, or void.
5421
+ * @public
5422
+ */
5423
+ onDoubleClickCorner?(shape: Shape, info: TLClickEventInfo): TLShapePartial<Shape> | void;
5426
5424
  /**
5427
5425
  * A callback called when a shape is double clicked.
5428
5426
  *
@@ -5440,7 +5438,14 @@ export declare abstract class ShapeUtil<Shape extends TLUnknownShape = TLUnknown
5440
5438
  */
5441
5439
  onClick?(shape: Shape): TLShapePartial<Shape> | void;
5442
5440
  /**
5443
- * A callback called when a shape finishes being editing.
5441
+ * A callback called when a shape starts being edited.
5442
+ *
5443
+ * @param shape - The shape.
5444
+ * @public
5445
+ */
5446
+ onEditStart?(shape: Shape): void;
5447
+ /**
5448
+ * A callback called when a shape finishes being edited.
5444
5449
  *
5445
5450
  * @param shape - The shape.
5446
5451
  * @public
@@ -5479,8 +5484,6 @@ export declare function shortAngleDist(a0: number, a1: number): number;
5479
5484
  /** @public */
5480
5485
  export declare const SIDES: readonly ["top", "right", "bottom", "left"];
5481
5486
 
5482
- export { Signal }
5483
-
5484
5487
  /** @public */
5485
5488
  export declare const SIN: (x: number) => number;
5486
5489
 
@@ -5532,8 +5535,8 @@ export declare class Stadium2d extends Geometry2d {
5532
5535
  height: number;
5533
5536
  width: number;
5534
5537
  });
5535
- nearestPoint(A: Vec): Vec;
5536
- hitTestLineSegment(A: Vec, B: Vec): boolean;
5538
+ nearestPoint(A: VecLike): Vec;
5539
+ hitTestLineSegment(A: VecLike, B: VecLike): boolean;
5537
5540
  getVertices(): Vec[];
5538
5541
  getBounds(): Box;
5539
5542
  getLength(): number;
@@ -5737,6 +5740,7 @@ export declare class TextManager {
5737
5740
  fontWeight: string;
5738
5741
  lineHeight: number;
5739
5742
  minWidth?: null | number;
5743
+ otherStyles?: Record<string, string>;
5740
5744
  padding: string;
5741
5745
  }): BoxModel & {
5742
5746
  scrollWidth: number;
@@ -6303,29 +6307,30 @@ export declare interface TldrawOptions {
6303
6307
  /** @public */
6304
6308
  export declare interface TLEditorComponents {
6305
6309
  Background?: ComponentType | null;
6306
- SvgDefs?: ComponentType | null;
6307
6310
  Brush?: ComponentType<TLBrushProps> | null;
6308
- ZoomBrush?: ComponentType<TLBrushProps> | null;
6309
- ShapeIndicators?: ComponentType | null;
6310
- ShapeIndicator?: ComponentType<TLShapeIndicatorProps> | null;
6311
- Cursor?: ComponentType<TLCursorProps> | null;
6312
6311
  Canvas?: ComponentType<TLCanvasComponentProps> | null;
6313
6312
  CollaboratorBrush?: ComponentType<TLBrushProps> | null;
6314
6313
  CollaboratorCursor?: ComponentType<TLCursorProps> | null;
6315
6314
  CollaboratorHint?: ComponentType<TLCollaboratorHintProps> | null;
6315
+ CollaboratorScribble?: ComponentType<TLScribbleProps> | null;
6316
6316
  CollaboratorShapeIndicator?: ComponentType<TLShapeIndicatorProps> | null;
6317
+ Cursor?: ComponentType<TLCursorProps> | null;
6317
6318
  Grid?: ComponentType<TLGridProps> | null;
6318
- Scribble?: ComponentType<TLScribbleProps> | null;
6319
- CollaboratorScribble?: ComponentType<TLScribbleProps> | null;
6320
- SnapIndicator?: ComponentType<TLSnapIndicatorProps> | null;
6321
- Handles?: ComponentType<TLHandlesProps> | null;
6322
6319
  Handle?: ComponentType<TLHandleProps> | null;
6323
- Spinner?: ComponentType | null;
6324
- SelectionForeground?: ComponentType<TLSelectionForegroundProps> | null;
6325
- SelectionBackground?: ComponentType<TLSelectionBackgroundProps> | null;
6326
- OnTheCanvas?: ComponentType | null;
6320
+ Handles?: ComponentType<TLHandlesProps> | null;
6327
6321
  InFrontOfTheCanvas?: ComponentType | null;
6328
6322
  LoadingScreen?: ComponentType | null;
6323
+ OnTheCanvas?: ComponentType | null;
6324
+ Overlays?: ComponentType | null;
6325
+ Scribble?: ComponentType<TLScribbleProps> | null;
6326
+ SelectionBackground?: ComponentType<TLSelectionBackgroundProps> | null;
6327
+ SelectionForeground?: ComponentType<TLSelectionForegroundProps> | null;
6328
+ ShapeIndicator?: ComponentType<TLShapeIndicatorProps> | null;
6329
+ ShapeIndicators?: ComponentType | null;
6330
+ SnapIndicator?: ComponentType<TLSnapIndicatorProps> | null;
6331
+ Spinner?: ComponentType | null;
6332
+ SvgDefs?: ComponentType | null;
6333
+ ZoomBrush?: ComponentType<TLBrushProps> | null;
6329
6334
  ErrorFallback?: TLErrorFallbackComponent;
6330
6335
  ShapeErrorFallback?: TLShapeErrorFallbackComponent;
6331
6336
  ShapeIndicatorErrorFallback?: TLShapeIndicatorErrorFallbackComponent;
@@ -6774,6 +6779,7 @@ export declare interface TLMeasureTextSpanOpts {
6774
6779
  fontStyle: string;
6775
6780
  lineHeight: number;
6776
6781
  textAlign: TLDefaultHorizontalAlignStyle;
6782
+ otherStyles?: Record<string, string>;
6777
6783
  }
6778
6784
 
6779
6785
  /** @public */
@@ -7411,12 +7417,6 @@ export declare function toFixed(v: number): number;
7411
7417
  */
7412
7418
  export declare function toPrecision(n: number, precision?: number): number;
7413
7419
 
7414
- export { track }
7415
-
7416
- export { transact }
7417
-
7418
- export { transaction }
7419
-
7420
7420
  /** @public */
7421
7421
  export declare class TransformedGeometry2d extends Geometry2d {
7422
7422
  private readonly geometry;
@@ -7425,13 +7425,13 @@ export declare class TransformedGeometry2d extends Geometry2d {
7425
7425
  private readonly decomposed;
7426
7426
  constructor(geometry: Geometry2d, matrix: MatModel, opts?: TransformedGeometry2dOptions);
7427
7427
  getVertices(filters: Geometry2dFilters): Vec[];
7428
- nearestPoint(point: Vec, filters?: Geometry2dFilters): Vec;
7429
- hitTestPoint(point: Vec, margin?: number, hitInside?: boolean, filters?: Geometry2dFilters): boolean;
7430
- distanceToPoint(point: Vec, hitInside?: boolean, filters?: Geometry2dFilters): number;
7431
- distanceToLineSegment(A: Vec, B: Vec, filters?: Geometry2dFilters): number;
7432
- hitTestLineSegment(A: Vec, B: Vec, distance?: number, filters?: Geometry2dFilters): boolean;
7433
- intersectLineSegment(A: VecLike, B: VecLike, filters?: Geometry2dFilters): VecLike[];
7434
- intersectCircle(center: VecLike, radius: number, filters?: Geometry2dFilters): VecLike[];
7428
+ nearestPoint(point: VecLike, filters?: Geometry2dFilters): Vec;
7429
+ hitTestPoint(point: VecLike, margin?: number, hitInside?: boolean, filters?: Geometry2dFilters): boolean;
7430
+ distanceToPoint(point: VecLike, hitInside?: boolean, filters?: Geometry2dFilters): number;
7431
+ distanceToLineSegment(A: VecLike, B: VecLike, filters?: Geometry2dFilters): number;
7432
+ hitTestLineSegment(A: VecLike, B: VecLike, distance?: number, filters?: Geometry2dFilters): boolean;
7433
+ intersectLineSegment(A: VecLike, B: VecLike, filters?: Geometry2dFilters): Vec[];
7434
+ intersectCircle(center: VecLike, radius: number, filters?: Geometry2dFilters): Vec[];
7435
7435
  intersectPolygon(polygon: VecLike[], filters?: Geometry2dFilters): VecLike[];
7436
7436
  intersectPolyline(polyline: VecLike[], filters?: Geometry2dFilters): VecLike[];
7437
7437
  transform(transform: MatModel, opts?: TransformedGeometry2dOptions): Geometry2d;
@@ -7458,10 +7458,6 @@ export declare function uniq<T>(array: {
7458
7458
  readonly length: number;
7459
7459
  } | null | undefined): T[];
7460
7460
 
7461
- export { useAtom }
7462
-
7463
- export { useComputed }
7464
-
7465
7461
  /** @public */
7466
7462
  export declare function useContainer(): HTMLElement;
7467
7463
 
@@ -7531,12 +7527,9 @@ export declare function usePeerIds(): string[];
7531
7527
  */
7532
7528
  export declare function usePresence(userId: string): null | TLInstancePresence;
7533
7529
 
7534
- export { useQuickReactor }
7535
-
7536
7530
  /* Excluded from this release type: USER_COLORS */
7537
7531
 
7538
7532
  /* Excluded from this release type: useReactiveEvent */
7539
- export { useReactor }
7540
7533
 
7541
7534
  /* Excluded from this release type: useRefState */
7542
7535
 
@@ -7599,8 +7592,6 @@ export declare function useSelectionEvents(handle: TLSelectionHandle): {
7599
7592
  */
7600
7593
  export declare function useSharedSafeId(id: string): SafeId;
7601
7594
 
7602
- export { useStateTracking }
7603
-
7604
7595
  /**
7605
7596
  * Returns the current SVG export context. Returns null if the component isn't being rendered for an
7606
7597
  * SVG export.
@@ -7634,8 +7625,6 @@ export declare function useTransform(ref: React.RefObject<HTMLElement | SVGEleme
7634
7625
  */
7635
7626
  export declare function useUniqueSafeId(suffix?: string): SafeId;
7636
7627
 
7637
- export { useValue }
7638
-
7639
7628
  /** @public */
7640
7629
  export declare function useViewportHeight(): number;
7641
7630
 
@@ -7707,6 +7696,7 @@ export declare class Vec {
7707
7696
  static Per(A: VecLike): Vec;
7708
7697
  static Abs(A: VecLike): Vec;
7709
7698
  static Dist(A: VecLike, B: VecLike): number;
7699
+ static ManhattanDist(A: VecLike, B: VecLike): number;
7710
7700
  static DistMin(A: VecLike, B: VecLike, n: number): boolean;
7711
7701
  static Dist2(A: VecLike, B: VecLike): number;
7712
7702
  /**
@@ -7754,7 +7744,15 @@ export declare class Vec {
7754
7744
  static Cast(A: VecLike): Vec;
7755
7745
  static Slope(A: VecLike, B: VecLike): number;
7756
7746
  static IsNaN(A: VecLike): boolean;
7747
+ /**
7748
+ * Get the angle from position A to position B.
7749
+ */
7757
7750
  static Angle(A: VecLike, B: VecLike): number;
7751
+ /**
7752
+ * Get the angle between vector A and vector B. This will return the smallest angle between the
7753
+ * two vectors, between -π and π. The sign indicates direction of angle.
7754
+ */
7755
+ static AngleBetween(A: VecLike, B: VecLike): number;
7758
7756
  /**
7759
7757
  * Linearly interpolate between two points.
7760
7758
  * @param A - The first point.
@@ -7798,9 +7796,9 @@ export declare class Vec {
7798
7796
  /** @public */
7799
7797
  export declare type VecLike = Vec | VecModel;
7800
7798
 
7801
- export { whyAmIRunning }
7802
-
7803
7799
 
7800
+ export * from "@tldraw/state";
7801
+ export * from "@tldraw/state-react";
7804
7802
  export * from "@tldraw/store";
7805
7803
  export * from "@tldraw/tlschema";
7806
7804
  export * from "@tldraw/utils";