tldraw 4.1.0-canary.e4499a57ef5b → 4.1.0-canary.e653ec63c99b

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 (93) hide show
  1. package/dist-cjs/index.d.ts +19 -0
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +1 -1
  6. package/dist-cjs/lib/defaultEmbedDefinitions.js +24 -6
  7. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +2 -2
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/curved-arrow.js +8 -2
  11. package/dist-cjs/lib/shapes/arrow/curved-arrow.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/straight-arrow.js +4 -1
  13. package/dist-cjs/lib/shapes/arrow/straight-arrow.js.map +2 -2
  14. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  15. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +1 -1
  16. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +1 -1
  17. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +1 -1
  18. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -1
  19. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +2 -2
  20. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  21. package/dist-cjs/lib/shapes/shared/ShapeFill.js +1 -1
  22. package/dist-cjs/lib/shapes/text/PlainTextArea.js +1 -1
  23. package/dist-cjs/lib/shapes/text/RichTextArea.js +1 -1
  24. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  25. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  26. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  27. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +1 -1
  28. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  29. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  30. package/dist-cjs/lib/ui/components/DebugMenu/DefaultDebugMenuContent.js +1 -1
  31. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialog.js +1 -1
  32. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  33. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +1 -1
  34. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +1 -1
  35. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +1 -1
  36. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +1 -1
  37. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js +1 -1
  38. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js +1 -1
  39. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +1 -1
  40. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +1 -1
  41. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +1 -1
  42. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButton.js +2 -2
  43. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  44. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
  45. package/dist-cjs/lib/ui/components/primitives/TldrawUiDropdownMenu.js +1 -1
  46. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +1 -1
  47. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
  48. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +2 -2
  49. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  50. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +2 -2
  51. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +1 -1
  52. package/dist-cjs/lib/ui/components/primitives/layout.js +1 -1
  53. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +1 -1
  54. package/dist-cjs/lib/ui/context/actions.js +1 -1
  55. package/dist-cjs/lib/ui/context/breakpoints.js +1 -1
  56. package/dist-cjs/lib/ui/context/events.js +1 -1
  57. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  58. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +1 -1
  59. package/dist-cjs/lib/ui/hooks/useLocalStorageState.js +1 -1
  60. package/dist-cjs/lib/ui/hooks/useTools.js +1 -1
  61. package/dist-cjs/lib/ui/hooks/useTranslation/useTranslation.js +1 -1
  62. package/dist-cjs/lib/ui/version.js +3 -3
  63. package/dist-cjs/lib/ui/version.js.map +1 -1
  64. package/dist-cjs/lib/utils/text/richText.js +4 -4
  65. package/dist-esm/index.d.mts +19 -0
  66. package/dist-esm/index.mjs +1 -1
  67. package/dist-esm/lib/defaultEmbedDefinitions.mjs +24 -6
  68. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  69. package/dist-esm/lib/defaultExternalContentHandlers.mjs +2 -2
  70. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  71. package/dist-esm/lib/shapes/arrow/curved-arrow.mjs +8 -2
  72. package/dist-esm/lib/shapes/arrow/curved-arrow.mjs.map +2 -2
  73. package/dist-esm/lib/shapes/arrow/straight-arrow.mjs +4 -1
  74. package/dist-esm/lib/shapes/arrow/straight-arrow.mjs.map +2 -2
  75. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +1 -1
  76. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  77. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  78. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  79. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +1 -1
  80. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  81. package/dist-esm/lib/ui/version.mjs +3 -3
  82. package/dist-esm/lib/ui/version.mjs.map +1 -1
  83. package/package.json +11 -11
  84. package/src/lib/defaultEmbedDefinitions.ts +19 -0
  85. package/src/lib/defaultExternalContentHandlers.ts +2 -2
  86. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +211 -1
  87. package/src/lib/shapes/arrow/curved-arrow.ts +8 -2
  88. package/src/lib/shapes/arrow/straight-arrow.ts +5 -1
  89. package/src/lib/shapes/shared/RichTextLabel.tsx +1 -1
  90. package/src/lib/shapes/text/TextShapeTool.test.ts +74 -0
  91. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
  92. package/src/lib/tools/SelectTool/childStates/Idle.ts +1 -1
  93. package/src/lib/ui/version.ts +3 -3
@@ -248,7 +248,11 @@ function updateArrowheadPointWithBoundShape(
248
248
  if (targetInt === undefined) {
249
249
  // No intersection? The arrowhead point will be at the arrow terminal.
250
250
  // if we _almost_ hit the target, just put the arrowhead at the target.
251
- targetInt = targetShapeInfo.geometry.nearestPoint(targetTo)
251
+ targetInt = targetShapeInfo.geometry.nearestPoint(targetTo, {
252
+ includeLabels: false,
253
+ includeInternal: false,
254
+ })
255
+
252
256
  if (!Vec.DistMin(targetInt, targetTo, 1)) {
253
257
  return
254
258
  }
@@ -109,7 +109,7 @@ export const RichTextLabel = React.memo(function RichTextLabel({
109
109
  // We don't get the mouseup event later because we preventDefault
110
110
  // so we have to do it manually.
111
111
  const handlePointerUp = (e: TLEventInfo) => {
112
- if (e.name !== 'pointer_up') return
112
+ if (e.name !== 'pointer_up' || !link) return
113
113
 
114
114
  if (!isDragging.current) {
115
115
  window.open(link, '_blank', 'noopener, noreferrer')
@@ -86,6 +86,80 @@ describe('When in idle state', () => {
86
86
  editor.cancel()
87
87
  editor.expectToBeIn('select.idle')
88
88
  })
89
+
90
+ it('starts editing selected text shape on Enter key', () => {
91
+ // Create a text shape using the same method as other tests
92
+ expect(editor.getCurrentPageShapes().length).toBe(0)
93
+ editor.setCurrentTool('text')
94
+ editor.pointerDown(0, 0)
95
+ editor.pointerUp()
96
+ editor.expectToBeIn('select.editing_shape')
97
+
98
+ // Update the text shape with some content
99
+ editor.updateShapes<TLTextShape>([
100
+ {
101
+ ...editor.getCurrentPageShapes()[0]!,
102
+ type: 'text',
103
+ props: { richText: toRichText('Hello') },
104
+ },
105
+ ])
106
+
107
+ // Exit editing mode
108
+ editor.cancel()
109
+ editor.expectToBeIn('select.idle')
110
+
111
+ // Verify the text shape exists and is selected
112
+ expect(editor.getCurrentPageShapes().length).toBe(1)
113
+ const textShape = editor.getCurrentPageShapes()[0]
114
+ expect(textShape.type).toBe('text')
115
+ editor.setSelectedShapes([textShape])
116
+
117
+ // Switch to text tool and press Enter
118
+ editor.setCurrentTool('text')
119
+ editor.expectToBeIn('text.idle')
120
+ editor.keyDown('Enter')
121
+
122
+ // Should transition to editing the selected text shape
123
+ editor.expectToBeIn('select.editing_shape')
124
+ expect(editor.getEditingShapeId()).toBe(textShape.id)
125
+ })
126
+
127
+ it('starts editing selected text shape on numpad Enter key', () => {
128
+ // Create a text shape using the same method as other tests
129
+ expect(editor.getCurrentPageShapes().length).toBe(0)
130
+ editor.setCurrentTool('text')
131
+ editor.pointerDown(0, 0)
132
+ editor.pointerUp()
133
+ editor.expectToBeIn('select.editing_shape')
134
+
135
+ // Update the text shape with some content
136
+ editor.updateShapes<TLTextShape>([
137
+ {
138
+ ...editor.getCurrentPageShapes()[0]!,
139
+ type: 'text',
140
+ props: { richText: toRichText('Hello') },
141
+ },
142
+ ])
143
+
144
+ // Exit editing mode
145
+ editor.cancel()
146
+ editor.expectToBeIn('select.idle')
147
+
148
+ // Verify the text shape exists and is selected
149
+ expect(editor.getCurrentPageShapes().length).toBe(1)
150
+ const textShape = editor.getCurrentPageShapes()[0]
151
+ expect(textShape.type).toBe('text')
152
+ editor.setSelectedShapes([textShape])
153
+
154
+ // Switch to text tool and press numpad Enter
155
+ editor.setCurrentTool('text')
156
+ editor.expectToBeIn('text.idle')
157
+ editor.keyDown('Enter', { code: 'NumpadEnter' })
158
+
159
+ // Should transition to editing the selected text shape
160
+ editor.expectToBeIn('select.editing_shape')
161
+ expect(editor.getEditingShapeId()).toBe(textShape.id)
162
+ })
89
163
  })
90
164
 
91
165
  describe('When in the pointing state', () => {
@@ -143,7 +143,7 @@ export class Idle extends StateNode {
143
143
  }
144
144
 
145
145
  override onKeyUp(info: TLKeyboardEventInfo) {
146
- switch (info.code) {
146
+ switch (info.key) {
147
147
  case 'Enter': {
148
148
  this.editor.setCroppingShape(null)
149
149
  this.editor.setCurrentTool('select.idle', {})
@@ -516,7 +516,7 @@ export class Idle extends StateNode {
516
516
  }
517
517
 
518
518
  override onKeyUp(info: TLKeyboardEventInfo) {
519
- switch (info.code) {
519
+ switch (info.key) {
520
520
  case 'Enter': {
521
521
  // Because Enter onKeyDown can happen outside the canvas (but then focus the canvas potentially),
522
522
  // we need to check if the canvas was initially selecting something before continuing.
@@ -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.1.0-canary.e4499a57ef5b'
4
+ export const version = '4.1.0-canary.e653ec63c99b'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2025-09-19T11:41:15.460Z',
8
- patch: '2025-09-19T11:41:15.460Z',
7
+ minor: '2025-10-02T09:36:59.846Z',
8
+ patch: '2025-10-02T09:36:59.846Z',
9
9
  }