@tldraw/editor 4.5.0-canary.fe0a82f04c21 → 4.5.0-internal.b3f4cb985cc3

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 (147) hide show
  1. package/dist-cjs/index.d.ts +24 -2
  2. package/dist-cjs/index.js +5 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +5 -4
  5. package/dist-cjs/lib/TldrawEditor.js.map +3 -3
  6. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +3 -2
  7. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -1
  9. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +5 -3
  11. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  12. package/dist-cjs/lib/config/TLSessionStateSnapshot.js +2 -1
  13. package/dist-cjs/lib/config/TLSessionStateSnapshot.js.map +2 -2
  14. package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
  15. package/dist-cjs/lib/editor/Editor.js +58 -18
  16. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  17. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +62 -6
  18. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +4 -3
  20. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +2 -2
  22. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  23. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  24. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +2 -3
  25. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  26. package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
  27. package/dist-cjs/lib/exports/FontEmbedder.js +9 -8
  28. package/dist-cjs/lib/exports/FontEmbedder.js.map +2 -2
  29. package/dist-cjs/lib/exports/StyleEmbedder.js +27 -15
  30. package/dist-cjs/lib/exports/StyleEmbedder.js.map +3 -3
  31. package/dist-cjs/lib/exports/domUtils.js +15 -0
  32. package/dist-cjs/lib/exports/domUtils.js.map +2 -2
  33. package/dist-cjs/lib/exports/embedMedia.js +15 -12
  34. package/dist-cjs/lib/exports/embedMedia.js.map +2 -2
  35. package/dist-cjs/lib/exports/exportToSvg.js +8 -7
  36. package/dist-cjs/lib/exports/exportToSvg.js.map +2 -2
  37. package/dist-cjs/lib/exports/getSvgAsImage.js +180 -29
  38. package/dist-cjs/lib/exports/getSvgAsImage.js.map +3 -3
  39. package/dist-cjs/lib/exports/getSvgJsx.js +21 -9
  40. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  41. package/dist-cjs/lib/globals/environment.js.map +2 -2
  42. package/dist-cjs/lib/hooks/useCanvasEvents.js +4 -4
  43. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  44. package/dist-cjs/lib/hooks/useDocumentEvents.js +13 -11
  45. package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
  46. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +3 -3
  47. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  48. package/dist-cjs/lib/hooks/useScreenBounds.js +10 -6
  49. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  50. package/dist-cjs/lib/hooks/useViewportHeight.js +13 -11
  51. package/dist-cjs/lib/hooks/useViewportHeight.js.map +3 -3
  52. package/dist-cjs/lib/utils/browserCanvasMaxSize.js.map +2 -2
  53. package/dist-cjs/lib/utils/dom.js +8 -4
  54. package/dist-cjs/lib/utils/dom.js.map +2 -2
  55. package/dist-cjs/version.js +3 -3
  56. package/dist-cjs/version.js.map +1 -1
  57. package/dist-esm/index.d.mts +24 -2
  58. package/dist-esm/index.mjs +6 -1
  59. package/dist-esm/index.mjs.map +2 -2
  60. package/dist-esm/lib/TldrawEditor.mjs +5 -4
  61. package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
  62. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +2 -1
  63. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +2 -2
  64. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -1
  65. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  66. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +5 -3
  67. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  68. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs +2 -1
  69. package/dist-esm/lib/config/TLSessionStateSnapshot.mjs.map +2 -2
  70. package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
  71. package/dist-esm/lib/editor/Editor.mjs +59 -19
  72. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  73. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +64 -6
  74. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +2 -2
  75. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +4 -3
  76. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  77. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +2 -2
  78. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  79. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  80. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +2 -3
  81. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  82. package/dist-esm/lib/exports/FontEmbedder.mjs +9 -8
  83. package/dist-esm/lib/exports/FontEmbedder.mjs.map +2 -2
  84. package/dist-esm/lib/exports/StyleEmbedder.mjs +29 -16
  85. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +3 -3
  86. package/dist-esm/lib/exports/domUtils.mjs +15 -0
  87. package/dist-esm/lib/exports/domUtils.mjs.map +2 -2
  88. package/dist-esm/lib/exports/embedMedia.mjs +16 -13
  89. package/dist-esm/lib/exports/embedMedia.mjs.map +2 -2
  90. package/dist-esm/lib/exports/exportToSvg.mjs +8 -7
  91. package/dist-esm/lib/exports/exportToSvg.mjs.map +2 -2
  92. package/dist-esm/lib/exports/getSvgAsImage.mjs +180 -29
  93. package/dist-esm/lib/exports/getSvgAsImage.mjs.map +3 -3
  94. package/dist-esm/lib/exports/getSvgJsx.mjs +21 -9
  95. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  96. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  97. package/dist-esm/lib/hooks/useCanvasEvents.mjs +10 -5
  98. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  99. package/dist-esm/lib/hooks/useDocumentEvents.mjs +13 -11
  100. package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
  101. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +4 -4
  102. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  103. package/dist-esm/lib/hooks/useScreenBounds.mjs +10 -6
  104. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  105. package/dist-esm/lib/hooks/useViewportHeight.mjs +13 -11
  106. package/dist-esm/lib/hooks/useViewportHeight.mjs.map +3 -3
  107. package/dist-esm/lib/utils/browserCanvasMaxSize.mjs.map +2 -2
  108. package/dist-esm/lib/utils/dom.mjs +8 -4
  109. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  110. package/dist-esm/version.mjs +3 -3
  111. package/dist-esm/version.mjs.map +1 -1
  112. package/package.json +7 -7
  113. package/src/index.ts +2 -0
  114. package/src/lib/TldrawEditor.tsx +6 -4
  115. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +2 -1
  116. package/src/lib/components/default-components/DefaultCanvas.tsx +1 -1
  117. package/src/lib/components/default-components/DefaultErrorFallback.tsx +7 -3
  118. package/src/lib/config/TLSessionStateSnapshot.ts +3 -1
  119. package/src/lib/config/TLUserPreferences.ts +2 -0
  120. package/src/lib/editor/Editor.ts +62 -15
  121. package/src/lib/editor/managers/FocusManager/FocusManager.test.ts +7 -6
  122. package/src/lib/editor/managers/FocusManager/FocusManager.ts +10 -7
  123. package/src/lib/editor/managers/FontManager/FontManager.test.ts +1 -0
  124. package/src/lib/editor/managers/FontManager/FontManager.ts +4 -3
  125. package/src/lib/editor/managers/TextManager/TextManager.test.ts +4 -5
  126. package/src/lib/editor/managers/TextManager/TextManager.ts +2 -2
  127. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +2 -0
  128. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +3 -3
  129. package/src/lib/editor/types/misc-types.ts +8 -2
  130. package/src/lib/exports/FontEmbedder.ts +10 -9
  131. package/src/lib/exports/StyleEmbedder.ts +33 -15
  132. package/src/lib/exports/domUtils.ts +20 -0
  133. package/src/lib/exports/embedMedia.ts +23 -17
  134. package/src/lib/exports/exportToSvg.tsx +8 -7
  135. package/src/lib/exports/getSvgAsImage.ts +292 -31
  136. package/src/lib/exports/getSvgJsx.test.ts +103 -101
  137. package/src/lib/exports/getSvgJsx.tsx +33 -10
  138. package/src/lib/globals/environment.ts +3 -0
  139. package/src/lib/hooks/useCanvasEvents.ts +10 -7
  140. package/src/lib/hooks/useDocumentEvents.ts +16 -11
  141. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +4 -7
  142. package/src/lib/hooks/useScreenBounds.ts +10 -6
  143. package/src/lib/hooks/useViewportHeight.ts +13 -11
  144. package/src/lib/test/TestEditor.ts +1 -0
  145. package/src/lib/utils/browserCanvasMaxSize.ts +2 -0
  146. package/src/lib/utils/dom.ts +17 -8
  147. package/src/version.ts +3 -3
@@ -1,5 +1,6 @@
1
1
  import { throttle } from '@tldraw/utils'
2
2
  import { useLayoutEffect } from 'react'
3
+ import { getOwnerWindow } from '../exports/domUtils'
3
4
  import { useEditor } from './useEditor'
4
5
 
5
6
  export function useScreenBounds(ref: React.RefObject<HTMLElement | null>) {
@@ -21,7 +22,8 @@ export function useScreenBounds(ref: React.RefObject<HTMLElement | null>) {
21
22
  // Rather than running getClientRects on every frame, we'll
22
23
  // run it once a second or when the window resizes.
23
24
  const interval = editor.timers.setInterval(updateBounds, 1000)
24
- window.addEventListener('resize', updateBounds)
25
+ const win = editor.getContainerWindow()
26
+ win.addEventListener('resize', updateBounds)
25
27
 
26
28
  const resizeObserver = new ResizeObserver((entries) => {
27
29
  if (!entries[0].contentRect) return
@@ -42,7 +44,7 @@ export function useScreenBounds(ref: React.RefObject<HTMLElement | null>) {
42
44
 
43
45
  return () => {
44
46
  clearInterval(interval)
45
- window.removeEventListener('resize', updateBounds)
47
+ win.removeEventListener('resize', updateBounds)
46
48
  resizeObserver.disconnect()
47
49
  scrollingParent?.removeEventListener('scroll', updateBounds)
48
50
  updateBounds.cancel()
@@ -56,12 +58,14 @@ export function useScreenBounds(ref: React.RefObject<HTMLElement | null>) {
56
58
  * https://github.com/excalidraw/excalidraw/blob/48c3465b19f10ec755b3eb84e21a01a468e96e43/packages/excalidraw/utils.ts#L600
57
59
  */
58
60
  const getNearestScrollableContainer = (element: HTMLElement): HTMLElement | Document => {
61
+ const doc = element.ownerDocument
62
+ const win = getOwnerWindow(element)
59
63
  let parent = element.parentElement
60
64
  while (parent) {
61
- if (parent === document.body) {
62
- return document
65
+ if (parent === doc.body) {
66
+ return doc
63
67
  }
64
- const { overflowY } = window.getComputedStyle(parent)
68
+ const { overflowY } = win.getComputedStyle(parent)
65
69
  const hasScrollableContent = parent.scrollHeight > parent.clientHeight
66
70
  if (
67
71
  hasScrollableContent &&
@@ -71,5 +75,5 @@ const getNearestScrollableContainer = (element: HTMLElement): HTMLElement | Docu
71
75
  }
72
76
  parent = parent.parentElement
73
77
  }
74
- return document
78
+ return doc
75
79
  }
@@ -1,4 +1,5 @@
1
1
  import { useLayoutEffect, useState } from 'react'
2
+ import { useMaybeEditor } from './useEditor'
2
3
 
3
4
  /*!
4
5
  * BSD License: https://github.com/outline/rich-markdown-editor/blob/main/LICENSE
@@ -12,26 +13,27 @@ import { useLayoutEffect, useState } from 'react'
12
13
  */
13
14
  /** @public */
14
15
  export function useViewportHeight(): number {
15
- const visualViewport = window.visualViewport
16
+ const editor = useMaybeEditor()
17
+ const win = editor?.getContainerWindow() ?? window
18
+ const vv = win.visualViewport
16
19
  const [height, setHeight] = useState<number>(() =>
17
- visualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight
20
+ vv ? vv.height + vv.offsetTop : win.innerHeight
18
21
  )
19
22
 
20
23
  useLayoutEffect(() => {
24
+ const win = editor?.getContainerWindow() ?? window
21
25
  const handleResize = () => {
22
- const visualViewport = window.visualViewport
23
- setHeight(() =>
24
- visualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight
25
- )
26
+ const vv = win.visualViewport
27
+ setHeight(() => (vv ? vv.height + vv.offsetTop : win.innerHeight))
26
28
  }
27
29
 
28
- window.visualViewport?.addEventListener('resize', handleResize)
29
- window.visualViewport?.addEventListener('scroll', handleResize)
30
+ win.visualViewport?.addEventListener('resize', handleResize)
31
+ win.visualViewport?.addEventListener('scroll', handleResize)
30
32
 
31
33
  return () => {
32
- window.visualViewport?.removeEventListener('resize', handleResize)
33
- window.visualViewport?.removeEventListener('scroll', handleResize)
34
+ win.visualViewport?.removeEventListener('resize', handleResize)
35
+ win.visualViewport?.removeEventListener('scroll', handleResize)
34
36
  }
35
- }, [])
37
+ }, [editor])
36
38
  return height
37
39
  }
@@ -8,6 +8,7 @@ class CustomTool extends StateNode {
8
8
 
9
9
  export class TestEditor extends Editor {
10
10
  constructor(options: Partial<Omit<TLEditorOptions, 'store'>> = {}) {
11
+ // eslint-disable-next-line no-restricted-globals
11
12
  const elm = document.createElement('div')
12
13
  elm.tabIndex = 0
13
14
 
@@ -94,6 +94,7 @@ const TEST_SIZES = {
94
94
  * @returns The maximum size of the canvas for the given dimension.
95
95
  */
96
96
  function getCanvasSize(dimension: 'width' | 'height' | 'area'): number {
97
+ // eslint-disable-next-line no-restricted-globals
97
98
  const cropCvs = document.createElement('canvas')
98
99
  cropCvs.width = 1
99
100
  cropCvs.height = 1
@@ -103,6 +104,7 @@ function getCanvasSize(dimension: 'width' | 'height' | 'area'): number {
103
104
  const w = dimension === 'height' ? 1 : size
104
105
  const h = dimension === 'width' ? 1 : size
105
106
 
107
+ // eslint-disable-next-line no-restricted-globals
106
108
  const testCvs = document.createElement('canvas')
107
109
  testCvs.width = w
108
110
  testCvs.height = h
@@ -98,13 +98,22 @@ export const setStyleProperty = (
98
98
  }
99
99
 
100
100
  /** @internal */
101
- export function activeElementShouldCaptureKeys(ignoreButtons = false) {
102
- const { activeElement } = document
103
- const elements = ignoreButtons ? ['input', 'textarea'] : ['input', 'select', 'button', 'textarea']
104
- return !!(
105
- activeElement &&
106
- ((activeElement as HTMLElement).isContentEditable ||
107
- elements.indexOf(activeElement.tagName.toLowerCase()) > -1 ||
108
- activeElement.classList.contains('tlui-slider__thumb'))
101
+ export function elementShouldCaptureKeys(el: Element | null, includeButtonsAndMenus = true) {
102
+ if (!el) return false
103
+
104
+ const tagName = el.tagName.toLowerCase()
105
+ return (
106
+ (el as HTMLElement).isContentEditable ||
107
+ tagName === 'input' ||
108
+ tagName === 'textarea' ||
109
+ (includeButtonsAndMenus && tagName === 'select') ||
110
+ (includeButtonsAndMenus && tagName === 'button') ||
111
+ el.classList.contains('tlui-slider__thumb')
109
112
  )
110
113
  }
114
+
115
+ /** @internal */
116
+ export function activeElementShouldCaptureKeys(includeButtonsAndMenus = true, doc?: Document) {
117
+ // eslint-disable-next-line no-restricted-globals
118
+ return elementShouldCaptureKeys((doc ?? document).activeElement, includeButtonsAndMenus)
119
+ }
package/src/version.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '4.5.0-canary.fe0a82f04c21'
4
+ export const version = '4.5.0-internal.b3f4cb985cc3'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2026-03-09T16:17:44.431Z',
8
- patch: '2026-03-09T16:17:44.431Z',
7
+ minor: '2026-03-11T15:43:43.431Z',
8
+ patch: '2026-03-11T15:43:43.431Z',
9
9
  }